Repository: github-linguist/linguist Branch: main Commit: 537297cdae3a Files: 4068 Total size: 29.5 MB Directory structure: gitextract_ncts6nq2/ ├── .devcontainer/ │ ├── Dockerfile │ ├── devcontainer.json │ └── onCreateCommand.sh ├── .dockerignore ├── .editorconfig ├── .github/ │ ├── CODEOWNERS │ ├── ISSUE_TEMPLATE/ │ │ ├── bug_report.md │ │ ├── config.yml │ │ ├── feature_request.md │ │ └── new_language.md │ ├── PULL_REQUEST_TEMPLATE.md │ ├── dependabot.yml │ └── workflows/ │ ├── ci.yml │ └── publish_docker_image.yml ├── .gitignore ├── .gitmodules ├── AGENTS.md ├── Brewfile ├── CONTRIBUTING.md ├── Dockerfile ├── Gemfile ├── LICENSE ├── README.md ├── Rakefile ├── audio.liq ├── bin/ │ ├── git-linguist │ └── github-linguist ├── docs/ │ ├── README.md │ ├── how-linguist-works.md │ ├── overrides.md │ ├── releasing.md │ └── troubleshooting.md ├── ext/ │ └── linguist/ │ ├── extconf.rb │ ├── lex.linguist_yy.c │ ├── lex.linguist_yy.h │ ├── linguist.c │ ├── linguist.h │ └── tokenizer.l ├── github-linguist.gemspec ├── go.work ├── grammars.yml ├── http.liq ├── lib/ │ ├── linguist/ │ │ ├── VERSION │ │ ├── blob.rb │ │ ├── blob_helper.rb │ │ ├── classifier.rb │ │ ├── documentation.yml │ │ ├── file_blob.rb │ │ ├── generated.rb │ │ ├── generic.yml │ │ ├── grammars.rb │ │ ├── heuristics.rb │ │ ├── heuristics.yml │ │ ├── instrumenter.rb │ │ ├── language.rb │ │ ├── languages.yml │ │ ├── lazy_blob.rb │ │ ├── popular.yml │ │ ├── repository.rb │ │ ├── samples.rb │ │ ├── sha256.rb │ │ ├── shebang.rb │ │ ├── source/ │ │ │ ├── diff.rb │ │ │ ├── repository.rb │ │ │ └── rugged.rb │ │ ├── strategy/ │ │ │ ├── extension.rb │ │ │ ├── filename.rb │ │ │ ├── manpage.rb │ │ │ ├── modeline.rb │ │ │ └── xml.rb │ │ ├── tokenizer.rb │ │ ├── vendor.yml │ │ └── version.rb │ └── linguist.rb ├── playlist.liq ├── samples/ │ ├── 1C Enterprise/ │ │ ├── Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl │ │ ├── Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl │ │ ├── CommonModule.ОбменМобильныеОбщее.Module.bsl │ │ ├── Document.РасходТовара.ObjectModule.bsl │ │ ├── ci_before_script.os │ │ └── test_canCompile.os │ ├── 2-Dimensional Array/ │ │ ├── appearance.2da │ │ └── tailmodel.2da │ ├── 4D/ │ │ ├── generate_project.4dm │ │ ├── play_with_classes.4dm │ │ ├── test_webServerStart.4dm │ │ └── webArea.4dm │ ├── ABAP/ │ │ └── cl_csv_parser.abap │ ├── ABAP CDS/ │ │ ├── zcds_monsters_association.ddls.asddls │ │ └── zcds_monsters_parameters.ddls.asddls │ ├── ABNF/ │ │ └── toml.abnf │ ├── AGS Script/ │ │ ├── GlobalScript.asc │ │ ├── GlobalScript.ash │ │ ├── KeyboardMovement_102.asc │ │ └── KeyboardMovement_102.ash │ ├── AIDL/ │ │ ├── ExtendableParcelable.aidl │ │ └── IVoid.aidl │ ├── AL/ │ │ ├── ALIssue.al │ │ ├── ALIssueList.al │ │ └── RefreshALIssuesCode.al │ ├── ALGOL/ │ │ └── example15.alg │ ├── AMPL/ │ │ ├── CT2.mod │ │ └── toy.ampl │ ├── API Blueprint/ │ │ ├── actions.apib │ │ ├── attributes.apib │ │ └── simple.apib │ ├── APL/ │ │ ├── DeepakChopra.apl │ │ ├── UT.dyalog │ │ └── hashbang │ ├── ASL/ │ │ ├── example.asl │ │ └── example.dsl │ ├── ASN.1/ │ │ └── example.asn │ ├── ASP.NET/ │ │ ├── EchoSocket.ashx │ │ ├── Global.asax │ │ ├── Login.aspx │ │ └── OpenAuthProviders.ascx │ ├── ATS/ │ │ ├── CoYonedaLemma.dats │ │ ├── DiningPhil2.dats │ │ ├── DiningPhil2.sats │ │ ├── DiningPhil2_fork.dats │ │ ├── DiningPhil2_thread.dats │ │ ├── YonedaLemma.dats │ │ ├── basis_ssntype.sats │ │ ├── csv_parse.hats │ │ └── intinf_vt.dats │ ├── ActionScript/ │ │ ├── FooBar.as │ │ ├── HelloWorld.as │ │ ├── NumberUtil.as │ │ └── TextFieldUtil.as │ ├── Adblock Filter List/ │ │ ├── Imperial Units Remover.txt │ │ ├── abp-filters-anti-cv.txt │ │ ├── anti-facebook.txt │ │ ├── fake-news.txt │ │ └── test_rules.txt │ ├── Adobe Font Metrics/ │ │ ├── OpenSansCondensed-Bold.afm │ │ ├── SpecialElite.afm │ │ └── lambda.afm │ ├── Agda/ │ │ └── NatCat.agda │ ├── Aiken/ │ │ ├── multi.ak │ │ ├── oneshot.ak │ │ └── tunav2.ak │ ├── Alloy/ │ │ ├── file_system.als │ │ ├── marksweepgc.als │ │ └── views.als │ ├── Alpine Abuild/ │ │ └── filenames/ │ │ └── APKBUILD │ ├── Altium Designer/ │ │ ├── Sample Altium Project.PrjPcb │ │ ├── Sample Board Design.PcbDoc │ │ ├── Sample Output Job.OutJob │ │ └── Sample Schematic Sheet.SchDoc │ ├── AngelScript/ │ │ ├── botmanager.as │ │ └── payload.as │ ├── Answer Set Programming/ │ │ ├── 15puzzle-encoding.lp │ │ ├── apt.lp │ │ ├── onmodel-py.lp │ │ └── tohB.lp │ ├── Ant Build System/ │ │ └── filenames/ │ │ └── ant.xml │ ├── Antlers/ │ │ ├── index.antlers.html │ │ ├── kitchensink.antlers.html │ │ ├── kitchensink.antlers.php │ │ ├── layout.antlers.html │ │ └── sitemap.antlers.xml │ ├── ApacheConf/ │ │ ├── apache.vhost │ │ └── filenames/ │ │ ├── .htaccess │ │ ├── apache2.conf │ │ └── httpd.conf │ ├── Apex/ │ │ ├── AccountTrigger.trigger │ │ ├── AddRelatedRecord.trigger │ │ ├── ArrayUtils.cls │ │ ├── BooleanUtils.cls │ │ ├── EmailUtils.cls │ │ ├── GeoUtils.cls │ │ ├── LanguageUtils.cls │ │ ├── LogTriggerHandler.trigger │ │ ├── SoqlUtils.apex │ │ ├── TwilioAPI.cls │ │ └── UrlUtils.apex │ ├── Apollo Guidance Computer/ │ │ └── BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc │ ├── AppleScript/ │ │ ├── Convert To PDF.applescript │ │ ├── Convert To PostScript.applescript │ │ ├── Count Messages in All Mailboxes.applescript │ │ ├── Crazy Message Text.applescript │ │ ├── Get User Name.applescript │ │ ├── Time Of Day.applescript │ │ └── center.applescript │ ├── AsciiDoc/ │ │ ├── encoding.asciidoc │ │ ├── list.asc │ │ └── sample.adoc │ ├── AspectJ/ │ │ ├── CacheAspect.aj │ │ └── OptimizeRecursionCache.aj │ ├── Assembly/ │ │ ├── 3D_PRG.I │ │ ├── A8514.i │ │ ├── External Interrupt.a51 │ │ ├── FASM.asm │ │ ├── cpu_feat.nas │ │ ├── fftfpu.nas │ │ ├── forth.nasm │ │ ├── fp_sqr32_160_comba.inc │ │ ├── lib.inc │ │ └── sectorc.s │ ├── Astro/ │ │ └── index.astro │ ├── Asymptote/ │ │ ├── figarc4_3D.asy │ │ └── kappa-sawteeth.asy │ ├── AutoHotkey/ │ │ └── hello.ahk │ ├── Avro IDL/ │ │ └── user.avdl │ ├── Awk/ │ │ └── test.awk │ ├── B (Formal Method)/ │ │ ├── Airlock.mch │ │ └── Leftpad.mch │ ├── B4X/ │ │ ├── B4XMainPage.bas │ │ ├── OAuth.bas.bas │ │ └── RequestsManager.bas │ ├── BASIC/ │ │ ├── GPIOGW.BAS │ │ ├── P180.BAS │ │ ├── mandelbrot.bas │ │ └── spacesc.bas │ ├── BQN/ │ │ ├── gameoflife.bqn │ │ └── snake.bqn │ ├── Ballerina/ │ │ ├── hello-world-service.bal │ │ ├── hello-world.bal │ │ ├── json.bal │ │ ├── var.bal │ │ └── xml.bal │ ├── Batchfile/ │ │ └── filenames/ │ │ ├── gradlew.bat │ │ └── mvnw.cmd │ ├── Beef/ │ │ ├── ProfilePanel.bf │ │ ├── Program.bf │ │ └── RandoCode.bf │ ├── Befunge/ │ │ ├── aturley.bf │ │ ├── beer7.bf │ │ ├── befunge3.bf │ │ ├── cascade.bf │ │ └── mycorand.bf │ ├── Berry/ │ │ ├── berry_schema_validator.be │ │ └── lcd_display.be │ ├── BibTeX/ │ │ ├── citations.bib │ │ └── deeplyaggrevated.bibtex │ ├── BibTeX Style/ │ │ └── bibkeys.bst │ ├── Bicep/ │ │ ├── 101-container-registry.bicep │ │ ├── 201-1vm-2nics-2subnets-1vnet.bicep │ │ └── params.bicepparam │ ├── Bikeshed/ │ │ ├── example.bs │ │ └── example2.bs │ ├── BitBake/ │ │ ├── cmake.bbclass │ │ ├── gstreamer-libav.bb │ │ ├── qtbase-native.bb │ │ ├── qtbase_%.bbappend │ │ ├── tclibc-newlib.inc │ │ └── xorg-driver-common.inc │ ├── Blade/ │ │ ├── hello.blade │ │ └── hello.blade.php │ ├── BlitzBasic/ │ │ ├── HalfAndDouble.bb │ │ ├── LList.bb │ │ └── PObj.bb │ ├── BlitzMax/ │ │ └── sample.bmx │ ├── Bluespec/ │ │ ├── TL.bsv │ │ └── TbTL.bsv │ ├── Bluespec BH/ │ │ ├── CGetPut.bs │ │ ├── COBS.bs │ │ ├── TL.bs │ │ └── TbTL.bs │ ├── Boogie/ │ │ ├── Bubble.bpl │ │ ├── TuringFactorial.bpl │ │ └── ticket.bpl │ ├── Brainfuck/ │ │ ├── factor.b │ │ ├── fib100.bf │ │ ├── hello.bf │ │ ├── helloworld.bf │ │ └── rot13.bf │ ├── BrighterScript/ │ │ ├── Main.bs │ │ ├── RowListExample.bs │ │ └── SimpleGrid.bs │ ├── Brightscript/ │ │ └── SimpleGrid.brs │ ├── Browserslist/ │ │ └── filenames/ │ │ ├── .browserslistrc │ │ └── browserslist │ ├── Bru/ │ │ └── example.bru │ ├── BuildStream/ │ │ └── hello.bst │ ├── C/ │ │ ├── 2D.C │ │ ├── 2D.H │ │ ├── Arduino.cats │ │ ├── ArrowLeft.h │ │ ├── Field.h │ │ ├── GLKMatrix4.h │ │ ├── NWMan.h │ │ ├── Nightmare.h │ │ ├── array.c │ │ ├── array.h │ │ ├── asm.h │ │ ├── bitmap.h │ │ ├── blob.c │ │ ├── blob.h │ │ ├── bootstrap.h │ │ ├── color.h │ │ ├── commit.c │ │ ├── commit.h │ │ ├── common.h.in │ │ ├── cpuid.h │ │ ├── custom_extensions.c │ │ ├── driver.h │ │ ├── elf.h │ │ ├── exception.zep.c │ │ ├── exception.zep.h │ │ ├── filter.h │ │ ├── fudge_node.c │ │ ├── git.c │ │ ├── hello.c │ │ ├── hello.h │ │ ├── http_parser.c │ │ ├── http_parser.h │ │ ├── info.h │ │ ├── interface.h │ │ ├── ip4.h │ │ ├── jni_layer.h │ │ ├── markdown.c │ │ ├── multiboot.h │ │ ├── ntru_encrypt.h │ │ ├── portio.h │ │ ├── pqiv.h │ │ ├── process.c │ │ ├── rdiscount.c │ │ ├── readline.cats │ │ ├── redis.c │ │ ├── rf_io.c │ │ ├── rf_io.h │ │ ├── rfc_string.c │ │ ├── rfc_string.h │ │ ├── rpc.h │ │ ├── scheduler.h │ │ ├── script │ │ ├── sgd_fast.c │ │ ├── syscalldefs.h │ │ ├── syscalls.h │ │ ├── vfs.h │ │ ├── vmem.h │ │ ├── wglew.h │ │ └── yajl.c │ ├── C#/ │ │ ├── AssemblyInfo.cs │ │ ├── BsonPropertyValue.cs │ │ ├── FileScopedNamespace.cs │ │ ├── MongoExpressionVisitor.cs │ │ ├── Program.cs │ │ ├── SimpleHttpServer.cs │ │ ├── _CodeSugarIO.DriveInfo.cs.pp │ │ ├── build.cake │ │ └── chart-process-memory.linq │ ├── C++/ │ │ ├── 16F88.h │ │ ├── ClasspathVMSystemProperties.inc │ │ ├── CsvStreamer.h │ │ ├── Entity.h │ │ ├── Math.inl │ │ ├── Memory16F88.h │ │ ├── NoDiscard.h │ │ ├── PackageInfoParser.cpp │ │ ├── ThreadedQueue.h │ │ ├── Types.h │ │ ├── bar.h │ │ ├── bar.hh │ │ ├── bar.hpp │ │ ├── bug1163046.--skeleton.re │ │ ├── cnokw.re │ │ ├── constexpr_header.h │ │ ├── crypter.cpp │ │ ├── cvsignore.re │ │ ├── env.cpp │ │ ├── env.h │ │ ├── epoll_reactor.ipp │ │ ├── gblib.cppm │ │ ├── gdsdbreader.h │ │ ├── graphics.cpp │ │ ├── grpc.pb.cc │ │ ├── hello.cpp │ │ ├── hello.grpc.pb.h │ │ ├── hello.ino │ │ ├── initClasses.inc │ │ ├── instances.inc │ │ ├── json_reader.cpp │ │ ├── json_writer.cpp │ │ ├── key.cpp │ │ ├── key.h │ │ ├── libcanister.h │ │ ├── main.cpp │ │ ├── metrics.h │ │ ├── module.ixx │ │ ├── octave_changer.ino │ │ ├── program.cp │ │ ├── protocol-buffer.pb.cc │ │ ├── protocol-buffer.pb.h │ │ ├── render_adapter.cpp │ │ ├── runtime-compiler.cc │ │ ├── scanner.cc │ │ ├── scanner.h │ │ ├── search.txx │ │ ├── simple.re │ │ ├── srs_app_ingest.cpp │ │ ├── target.txx │ │ ├── utils.h │ │ ├── v8.cc │ │ ├── v8.h │ │ ├── vtkSparseArray.txx │ │ └── wrapper_inner.cpp │ ├── C3/ │ │ └── example.c3 │ ├── CAP CDS/ │ │ ├── admin-service.cds │ │ ├── cat-service.cds │ │ ├── common.cds │ │ ├── schema.cds │ │ └── user-service.cds │ ├── CIL/ │ │ ├── certfile.cil │ │ └── guix-daemon.cil │ ├── CLIPS/ │ │ ├── demo.clp │ │ └── sudoku.clp │ ├── CMake/ │ │ ├── filenames/ │ │ │ └── CMakeLists.txt │ │ ├── sample1.cmake │ │ ├── sample2.cmake │ │ ├── sample3.cmake │ │ ├── sample4.cmake │ │ ├── sample5.cmake │ │ └── uninstall.cmake.in │ ├── COBOL/ │ │ ├── hello_world.cbl │ │ ├── hello_world.ccp │ │ ├── hello_world.cob │ │ └── simple.cpy │ ├── CODEOWNERS/ │ │ └── filenames/ │ │ └── CODEOWNERS │ ├── CQL/ │ │ ├── alter_materialized_view.cql │ │ ├── alter_role.cql │ │ ├── alter_table.cql │ │ ├── alter_type.cql │ │ ├── comments.cql │ │ ├── create_keyspace.cql │ │ └── videodb.cql │ ├── CSON/ │ │ ├── base.cson │ │ ├── config.cson │ │ ├── ff-sfd.cson │ │ └── wercker-status.cson │ ├── CSS/ │ │ └── bootstrap.css │ ├── CSV/ │ │ └── cars.csv │ ├── CUE/ │ │ ├── github-workflow.cue │ │ └── kube.cue │ ├── CWeb/ │ │ ├── mpmathdouble.w │ │ └── sat-life.w │ ├── Cabal Config/ │ │ ├── defaults.cabal │ │ ├── filenames/ │ │ │ ├── cabal.config │ │ │ └── cabal.project │ │ └── line2pdf.cabal │ ├── Caddyfile/ │ │ ├── acmeserver.Caddyfile │ │ └── reverseproxy.caddyfile │ ├── Cadence/ │ │ ├── FlowFees.cdc │ │ ├── FlowToken.cdc │ │ ├── get_balance.cdc │ │ ├── mint_tokens.cdc │ │ ├── read_profile.cdc │ │ └── setup_account.cdc │ ├── Cairo/ │ │ ├── boolean.cairo │ │ ├── cust_struct_vect.cairo │ │ ├── merkle_tree_test.cairo │ │ ├── pizza_factory.cairo │ │ └── rlp.cairo │ ├── Cairo Zero/ │ │ ├── casm.cairo │ │ ├── concat_arr.cairo │ │ ├── contract.cairo │ │ ├── safemath.cairo │ │ └── sha256.cairo │ ├── CameLIGO/ │ │ └── FA1.2.mligo │ ├── Cangjie/ │ │ ├── cube.cj │ │ └── tree.cj │ ├── Carbon/ │ │ ├── Shapes.carbon │ │ └── main.carbon │ ├── CartoCSS/ │ │ └── amenity-points.mss │ ├── Ceylon/ │ │ └── Foo.ceylon │ ├── Chapel/ │ │ ├── distributions.chpl │ │ ├── hello.chpl │ │ ├── lulesh.chpl │ │ ├── nbody.chpl │ │ └── quicksort.chpl │ ├── Charity/ │ │ └── example.ch │ ├── Checksums/ │ │ ├── bsd-style.sha256 │ │ ├── filenames/ │ │ │ ├── SHA256SUMS │ │ │ └── SHA256SUMS.txt │ │ ├── gnu-style-text.sha256 │ │ ├── gnu-style.sha256 │ │ ├── single_hash.crc32 │ │ ├── single_hash.md2 │ │ ├── single_hash.md4 │ │ ├── single_hash.md5 │ │ ├── single_hash.sha1 │ │ ├── single_hash.sha224 │ │ ├── single_hash.sha256 │ │ ├── single_hash.sha384 │ │ ├── single_hash.sha512 │ │ ├── single_hash_dec.crc32 │ │ ├── single_hash_no_trailing_newline.sha256 │ │ ├── zero.sha2 │ │ └── zero.sha3 │ ├── Circom/ │ │ ├── binsum.circom │ │ ├── switcher.circom │ │ └── xor3.circom │ ├── Cirru/ │ │ ├── calcit.cirru │ │ ├── comma.cirru │ │ ├── demo.cirru │ │ ├── folded-beginning.cirru │ │ ├── folding.cirru │ │ ├── html.cirru │ │ ├── indent.cirru │ │ ├── line.cirru │ │ ├── parentheses.cirru │ │ ├── quote.cirru │ │ ├── spaces.cirru │ │ ├── template.cirru │ │ ├── unfolding.cirru │ │ └── webpack.config.cirru │ ├── Clarion/ │ │ ├── CStringClass.clw │ │ ├── ConsoleSupport.clw │ │ ├── HelloWorld.clw │ │ └── hello.clw │ ├── Clarity/ │ │ ├── bns.clar │ │ ├── cost-voting.clar │ │ └── pox.clar │ ├── Classic ASP/ │ │ ├── ASPUnitRunner.asp │ │ └── sendingcontent-xml.asp │ ├── Clean/ │ │ ├── GenHylo.dcl │ │ ├── GenMap.dcl │ │ ├── GenMap.icl │ │ ├── fsieve.icl │ │ ├── sem.icl │ │ ├── stack.dcl │ │ ├── stack.icl │ │ ├── streams.dcl │ │ └── streams.icl │ ├── Click/ │ │ ├── sr2.click │ │ └── thomer-nat.click │ ├── Clojure/ │ │ ├── build.boot │ │ ├── for.clj │ │ ├── hiccup.hic │ │ ├── index.cljs.hl │ │ ├── into-array.cljc │ │ ├── protocol.cljs │ │ ├── rand.cljscm │ │ ├── svg.cljx │ │ ├── unit-test.cl2 │ │ └── validate-and-format.bb │ ├── Closure Templates/ │ │ └── example.soy │ ├── Cloud Firestore Security Rules/ │ │ └── filenames/ │ │ └── firestore.rules │ ├── Clue/ │ │ ├── game.clue │ │ ├── graph.clue │ │ ├── line.clue │ │ ├── main.clue │ │ ├── msgpack.clue │ │ ├── player.clue │ │ └── terminal.clue │ ├── CoNLL-U/ │ │ ├── CF1.conllu │ │ ├── en-ud-test-abridged.conllu │ │ └── ug-ud-test-abridged.conllu │ ├── CodeQL/ │ │ ├── ql-cobol-sample.ql │ │ ├── ql-sample.ql │ │ ├── qll-sample1.qll │ │ ├── qll-sample2.qll │ │ ├── qll-sample3.qll │ │ └── tree-sitter-sample.ql │ ├── CoffeeScript/ │ │ ├── browser.coffee │ │ ├── build.cake │ │ ├── classes.coffee │ │ ├── coffee-script.coffee │ │ ├── example.cjsx │ │ ├── hello.coffee │ │ ├── intro.coffee │ │ ├── lexer.coffee │ │ ├── rack_application.coffee │ │ └── xipd.coffee │ ├── ColdFusion/ │ │ └── example.cfm │ ├── ColdFusion CFC/ │ │ ├── exampleScript.cfc │ │ └── exampleTag.cfc │ ├── Common Lisp/ │ │ ├── array.l │ │ ├── common.l │ │ ├── config.sexp │ │ ├── hello.lisp │ │ ├── macros-advanced.cl │ │ ├── motor-inferencia.cl │ │ ├── rss.sexp │ │ ├── sample.lisp │ │ └── sample.lsp │ ├── Common Workflow Language/ │ │ └── trunk-peak-score.cwl │ ├── Component Pascal/ │ │ ├── Example.cp │ │ └── Example2.cps │ ├── Cooklang/ │ │ ├── advanced_recipe.cook │ │ └── simple_recipe.cook │ ├── Cool/ │ │ ├── list.cl │ │ └── sample.cl │ ├── Creole/ │ │ └── creole.creole │ ├── Crystal/ │ │ ├── const_spec.cr │ │ ├── declare_var_spec.cr │ │ └── transformer.cr │ ├── Csound/ │ │ ├── allglass.orc │ │ ├── interp.orc │ │ └── test.orc │ ├── Csound Document/ │ │ ├── allglass.csd │ │ ├── interp.csd │ │ └── test.csd │ ├── Csound Score/ │ │ ├── allglass.sco │ │ ├── interp.sco │ │ └── test.sco │ ├── Cuda/ │ │ ├── scalarProd_kernel.cuh │ │ └── vectorAdd.cu │ ├── Cue Sheet/ │ │ ├── sample1.cue │ │ └── sample2.cue │ ├── Curry/ │ │ ├── Nat.curry │ │ └── Prelude.curry │ ├── Cycript/ │ │ └── utils.cy │ ├── Cylc/ │ │ ├── cset-include.cylc │ │ ├── cset.cylc │ │ └── model.cylc │ ├── Cypher/ │ │ ├── db_export_res.cypher │ │ ├── graphgems.cyp │ │ ├── graphgems.cypher │ │ └── load_from_json.cypher │ ├── D/ │ │ ├── aa.d │ │ ├── arrayops.d │ │ ├── function.d │ │ ├── hello_world.d │ │ ├── mpq.d │ │ ├── template.d │ │ ├── template_function.d │ │ ├── unittest1.d │ │ └── unittest2.d │ ├── D2/ │ │ ├── anthias-diagram-overview.d2 │ │ └── calc_algo.d2 │ ├── DIGITAL Command Language/ │ │ ├── fis_gtm_kitinstal.com │ │ ├── ghostpdl_zlib_make_vms.com │ │ ├── libxslt_build.com │ │ └── vmsbackup_build.com │ ├── DM/ │ │ └── example.dm │ ├── DNS Zone/ │ │ ├── sample.arpa │ │ └── sneaky.net.zone │ ├── DTrace/ │ │ ├── counts.d │ │ ├── probes.d │ │ └── trace_futexes.d │ ├── Dafny/ │ │ ├── Io.s.dfy │ │ └── Node.i.dfy │ ├── Dart/ │ │ ├── addressbook.pb.dart │ │ ├── addressbook.pbenum.dart │ │ ├── addressbook.pbjson.dart │ │ ├── equals.dart │ │ ├── equals.freezed.dart │ │ └── point.dart │ ├── Daslang/ │ │ ├── ecs.das │ │ └── terrain.das │ ├── DataWeave/ │ │ ├── customInterpolator.dwl │ │ ├── directives.dwl │ │ ├── functions.dwl │ │ ├── literals.dwl │ │ └── match.dwl │ ├── Debian Package Control File/ │ │ ├── example1.dsc │ │ └── example2.dsc │ ├── DenizenScript/ │ │ ├── sample1.dsc │ │ └── sample2.dsc │ ├── Dhall/ │ │ ├── largeExpressionA.dhall │ │ └── remoteSystemsA.dhall │ ├── Diff/ │ │ └── dude-thing-okay--001.patch │ ├── DirectX 3D File/ │ │ └── cube.x │ ├── Dockerfile/ │ │ ├── debian-systemd.Containerfile │ │ └── filenames/ │ │ └── Dockerfile │ ├── Dogescript/ │ │ └── example.djs │ ├── Dotenv/ │ │ └── default.env │ ├── Dune/ │ │ └── filenames/ │ │ └── dune-project │ ├── E/ │ │ ├── Extends.E │ │ ├── Functions.E │ │ ├── Guards.E │ │ ├── IO.E │ │ ├── Promises.E │ │ ├── atomic-updates.E │ │ └── minChat.E │ ├── E-mail/ │ │ └── example.eml │ ├── EBNF/ │ │ ├── grammar.ebnf │ │ ├── material.ebnf │ │ ├── object.ebnf │ │ └── types.ebnf │ ├── ECL/ │ │ └── sample.ecl │ ├── ECLiPSe/ │ │ └── or-constraint.ecl │ ├── EJS/ │ │ ├── admin_index.jst │ │ ├── dash.ejs │ │ ├── email_template.ect │ │ ├── modules.ejs.t │ │ └── page.ejs │ ├── EQ/ │ │ ├── HTTPServerVirtualHostListener.eq │ │ ├── SEButtonEntity.eq │ │ └── String.eq │ ├── Eagle/ │ │ ├── Eagle.brd │ │ └── Eagle.sch │ ├── Earthly/ │ │ └── filenames/ │ │ └── Earthfile │ ├── Easybuild/ │ │ └── bzip2-1.0.6-GCC-4.9.2.eb │ ├── Ecmarkup/ │ │ └── spec.html │ ├── Edge/ │ │ └── pricing.edge │ ├── EdgeQL/ │ │ ├── default.esdl │ │ └── migration.edgeql │ ├── EditorConfig/ │ │ ├── ASP.NET.EditorConfig │ │ ├── IntelliJ.editorconfig │ │ └── filenames/ │ │ └── .editorconfig │ ├── Edje Data Collection/ │ │ └── mild.edc │ ├── Eiffel/ │ │ ├── app_embedded_web_execution.e │ │ ├── app_embedded_web_service.e │ │ ├── application.e │ │ ├── book_collection.e │ │ ├── desktop_app.e │ │ ├── git_checkout_command.e │ │ └── main_window.e │ ├── Elixir/ │ │ ├── atom.ex │ │ ├── float.ex │ │ ├── function.ex │ │ ├── integer.ex │ │ └── regex.ex │ ├── Elm/ │ │ ├── Basic.elm │ │ ├── QuickSort.elm │ │ └── Tree.elm │ ├── Elvish/ │ │ └── epm.elv │ ├── Emacs Lisp/ │ │ ├── .emacs.desktop │ │ ├── dude.el │ │ ├── ess-julia.el │ │ └── filenames/ │ │ ├── .abbrev_defs │ │ ├── .gnus │ │ ├── .spacemacs │ │ ├── .viper │ │ ├── Cask │ │ ├── Eask │ │ ├── Project.ede │ │ ├── _emacs │ │ └── abbrev_defs │ ├── EmberScript/ │ │ └── momentComponent.em │ ├── Erlang/ │ │ ├── 170-os-daemons.es │ │ ├── compiler.app │ │ ├── elixir_parser.yrl │ │ ├── factorial │ │ ├── filenames/ │ │ │ ├── Emakefile │ │ │ └── rebar.config │ │ ├── hello.escript │ │ ├── kernel.app │ │ ├── lfe_scan.xrl │ │ ├── record_helper.erl │ │ ├── record_utils.erl │ │ ├── release │ │ ├── sample.app.src │ │ └── single-context.es │ ├── Euphoria/ │ │ ├── allsorts.ex │ │ ├── animal.ex │ │ ├── csort.ex │ │ ├── debug.e │ │ ├── dll.e │ │ ├── hash.ex │ │ ├── math.e │ │ ├── mydata.ex │ │ ├── regex.e │ │ └── types.e │ ├── F#/ │ │ ├── Combinators.fs │ │ ├── JsonFormat.fs │ │ ├── JsonReader.fs │ │ ├── JsonSerializer.fs │ │ ├── JsonWriter.fs │ │ ├── PerformanceTesters.fs │ │ ├── PerformanceTests.fs │ │ └── sample.fs │ ├── FIGlet Font/ │ │ └── ivrit.flf │ ├── FIRRTL/ │ │ ├── LFSR.fir │ │ └── Memory.fir │ ├── FLUX/ │ │ ├── gameserver.fx │ │ ├── imageserver.fx │ │ ├── mbittorrent.fx │ │ └── test.fx │ ├── Fantom/ │ │ ├── sample1.fan │ │ └── sample2.fan │ ├── Faust/ │ │ ├── FFT.dsp │ │ └── lowCut.dsp │ ├── Fennel/ │ │ ├── repl.fnl │ │ └── utils.fnl │ ├── Filebench WML/ │ │ └── copyfiles.f │ ├── Filterscript/ │ │ ├── colormatrix.fs │ │ └── fs_kernel.fs │ ├── FlatBuffers/ │ │ ├── Message.fbs │ │ └── reflection.fbs │ ├── Flix/ │ │ ├── GameState.flix │ │ ├── Parse.flix │ │ └── TestDisplay.flix │ ├── Fluent/ │ │ ├── call_expressions.ftl │ │ ├── callee_expressions.ftl │ │ ├── gecko_strings.ftl │ │ ├── select_indent.ftl │ │ └── simple.ftl │ ├── Formatted/ │ │ ├── NiAlH_jea.eam.fs │ │ ├── long_seq.for │ │ └── wksst8110.for │ ├── Forth/ │ │ ├── KataDiversion.fth │ │ ├── asm.fr │ │ ├── bitmap.frt │ │ ├── block.fth │ │ ├── core-ext.fth │ │ ├── core.f │ │ ├── core.for │ │ ├── core.fs │ │ ├── core.fth │ │ ├── core1.F │ │ ├── enum.frt │ │ ├── hello-forth.forth │ │ ├── hello-forth.fth │ │ ├── macros.frt │ │ ├── tools.4TH │ │ └── tools.fth │ ├── Fortran/ │ │ ├── bug-185631.f │ │ ├── sample1.f │ │ ├── sample1.for │ │ ├── sample2.f │ │ └── sample3.F │ ├── FreeBASIC/ │ │ ├── WinGUI template.bi │ │ ├── array_clearobj.bas │ │ ├── ir.bas │ │ └── makescript.bas │ ├── FreeMarker/ │ │ ├── blocks-card.ftlh │ │ ├── example.ftl │ │ ├── header.ftlh │ │ └── layout.ftl │ ├── Frege/ │ │ ├── CommandLineClock.fr │ │ ├── Concurrent.fr │ │ ├── Sudoku.fr │ │ └── SwingExamples.fr │ ├── Fstar/ │ │ ├── FStar.DependentMap.fsti │ │ ├── Hacl.HKDF.fst │ │ └── Hacl.Spec.Bignum.Fmul.fst │ ├── Futhark/ │ │ └── gaussian_blur.fut │ ├── G-code/ │ │ ├── duettest.g │ │ ├── ghLogo.cnc │ │ └── square.g │ ├── GAML/ │ │ ├── 3dTutorial.gaml │ │ ├── bdiAgents.gaml │ │ ├── incrementalGIS.gaml │ │ ├── luneraysFlu.gaml │ │ ├── predatorPrey.gaml │ │ └── roadTraffic.gaml │ ├── GAMS/ │ │ └── transport.gms │ ├── GAP/ │ │ ├── Magic.gd │ │ ├── Magic.gi │ │ ├── PackageInfo.g │ │ ├── bugfix.tst │ │ ├── example.gd │ │ ├── example.gi │ │ ├── factor.tst │ │ ├── vspc.gd │ │ └── vspc.gi │ ├── GCC Machine Description/ │ │ └── pdp10.md │ ├── GDB/ │ │ ├── as3.gdbinit │ │ └── gdb_lpc17xx_program.gdb │ ├── GDScript/ │ │ ├── example.gd │ │ ├── grid.gd │ │ ├── player.gd │ │ └── pong.gd │ ├── GDShader/ │ │ ├── dissolve.gdshader │ │ ├── first_shader.gdshader │ │ ├── gaussian_blur.gdshader │ │ ├── include.gdshaderinc │ │ ├── stylized_grass.gdshader │ │ └── toon_water.gdshader │ ├── GEDCOM/ │ │ └── Royal92.ged │ ├── GLSL/ │ │ ├── SimpleLighting.gl2.frag │ │ ├── SyLens.glsl │ │ ├── SyLens.shader │ │ ├── blend_120.glslf │ │ ├── closesthit.rchit │ │ ├── extrude_normals.gs │ │ ├── gbuffers_textured_lit.fsh │ │ ├── gbuffers_textured_lit.vsh │ │ ├── islandScene.glsl │ │ ├── islandScene.shader │ │ ├── main.vs │ │ ├── miss.rmiss │ │ ├── myfragment.frg │ │ ├── myvertex.vrx │ │ ├── pntriangles.tesc │ │ ├── pntriangles.tese │ │ ├── project.vs │ │ ├── recurse1.frag │ │ ├── recurse1.fs │ │ └── shader.fp │ ├── GN/ │ │ ├── BUILD.2.gn │ │ ├── BUILD.3.gn │ │ ├── BUILD.gn │ │ ├── android-rules.gni │ │ ├── clang.gni │ │ ├── filenames/ │ │ │ └── .gn │ │ ├── gcc_toolchain.gni │ │ ├── icu.gn │ │ ├── internal_rules.gni │ │ ├── ios-rules.gni │ │ └── isolate.gni │ ├── GSC/ │ │ ├── _spiderbot_ride.csc │ │ ├── array_override_common.gsc │ │ ├── array_override_common.gsh │ │ ├── math_shared.gsc │ │ ├── struct.gsc │ │ └── zm_init.gsc │ ├── Game Maker Language/ │ │ ├── GMLmenus.gml │ │ ├── _piwikCacheRequest.gml │ │ ├── _piwikSendBasicReq.gml │ │ ├── _piwikSendReq.gml │ │ ├── characterDrawEvent.gml │ │ ├── characterStepEvent.gml │ │ ├── draw_menu.gml │ │ ├── faucet-http.gml │ │ ├── jsonion.gml │ │ ├── jsonion_test.gml │ │ └── scrInitLevel.gml │ ├── Gemini/ │ │ └── instructions.gmi │ ├── Genero 4gl/ │ │ ├── books1.4gl │ │ ├── webserv1.4gl │ │ └── webserv1_api.4gl │ ├── Genero per/ │ │ └── books1.per │ ├── Genie/ │ │ ├── Class.gs │ │ ├── Hello.gs │ │ ├── IDataLoader.gs │ │ └── web.gs │ ├── Gerber Image/ │ │ ├── AGV_GPIO.gml │ │ ├── FelinaePurr-B.Cu.gbl │ │ ├── FelinaePurr-B.Mask.gbs │ │ ├── FelinaePurr-B.SilkS.gbo │ │ ├── FelinaePurr-F.Cu.gtl │ │ ├── FelinaePurr-F.Mask.gts │ │ ├── FelinaePurr-F.Paste.gtp │ │ ├── FelinaePurr-F.SilkS.gto │ │ ├── GOLMain_RevA-B.Paste.gbp │ │ ├── LIDARLite.ncl │ │ ├── nonaprs_contour.gko │ │ ├── simonShield-B.Cu.gbr │ │ ├── simonShield-B.Mask.gbr │ │ ├── simonShield-Edge.Cuts.gbr │ │ ├── simonShield-F.Cu.gbr │ │ ├── simonShield-F.Mask.gbr │ │ ├── simonShield-F.SilkS.gbr │ │ └── simonShield-drl_map.gbr │ ├── Gherkin/ │ │ ├── resources.story │ │ └── tables.feature │ ├── Git Attributes/ │ │ └── filenames/ │ │ └── .gitattributes │ ├── Git Commit/ │ │ └── filenames/ │ │ └── COMMIT_EDITMSG │ ├── Git Config/ │ │ ├── aliases.gitconfig │ │ └── filenames/ │ │ ├── .gitconfig │ │ └── .gitmodules │ ├── Git Revision List/ │ │ └── filenames/ │ │ └── .git-blame-ignore-revs │ ├── Gleam/ │ │ ├── contributor.gleam │ │ └── websocket.gleam │ ├── Glimmer JS/ │ │ ├── class.gjs │ │ └── template-only.gjs │ ├── Glimmer TS/ │ │ ├── class.gts │ │ └── template-only.gts │ ├── Glyph Bitmap Distribution Format/ │ │ └── bitbuntu.bdf │ ├── Gnuplot/ │ │ ├── dashcolor.1.gnu │ │ ├── defense_plotter.p │ │ ├── defense_plotter.plt │ │ ├── histograms.2.gnu │ │ ├── rates.gp │ │ ├── surface1.16.gnu │ │ ├── surface1.17.gnu │ │ └── world2.1.gnu │ ├── Go/ │ │ ├── api.pb.go │ │ ├── embedded.go │ │ ├── gen-go-linguist-thrift.go │ │ └── oapi-codegen.go │ ├── Go Checksums/ │ │ └── filenames/ │ │ ├── go.sum │ │ └── go.work.sum │ ├── Go Module/ │ │ └── filenames/ │ │ └── go.mod │ ├── Go Template/ │ │ ├── _helpers.tpl │ │ ├── _templates.gotmpl │ │ ├── base.tpl │ │ ├── batch.gohtml │ │ ├── crd.tmpl │ │ ├── letter.tmpl │ │ └── prettier.html.tmpl │ ├── Go Workspace/ │ │ └── filenames/ │ │ └── go.work │ ├── Godot Resource/ │ │ ├── Main.tscn │ │ ├── Server.gdns │ │ ├── default.tres │ │ ├── filenames/ │ │ │ └── project.godot │ │ └── signals_library.gdnlib │ ├── Golo/ │ │ ├── adapters.golo │ │ ├── async.golo │ │ ├── augmentations.golo │ │ ├── closures.golo │ │ ├── coin-change.golo │ │ ├── collection-literals.golo │ │ ├── context-decorator.golo │ │ ├── decorators.golo │ │ ├── dynamic-evaluation.golo │ │ ├── dynamic-object-person.golo │ │ ├── echo-args.golo │ │ ├── enums-thread-state.golo │ │ ├── fibonacci.golo │ │ ├── helloworld.golo │ │ ├── http-server.golo │ │ ├── logdeco.golo │ │ ├── matching-operator.golo │ │ ├── max-int.golo │ │ ├── memoize.golo │ │ ├── null-safety.golo │ │ ├── prepost-decorators.golo │ │ ├── structs.golo │ │ ├── swing-actionlistener.golo │ │ ├── swing-helloworld.golo │ │ ├── templates-chat-webapp.golo │ │ ├── util-containers.golo │ │ └── workers.golo │ ├── Gosu/ │ │ ├── Hello.gst │ │ ├── Hello.gsx │ │ ├── Person.gs │ │ ├── Ronin.gs │ │ └── hello.vark │ ├── Grace/ │ │ ├── ackerman_function.grace │ │ └── grace_IDE.grace │ ├── Gradle/ │ │ ├── build.gradle │ │ └── builder.gradle │ ├── Gradle Kotlin DSL/ │ │ └── build.gradle.kts │ ├── Grammatical Framework/ │ │ ├── Foods.gf │ │ ├── FoodsAfr.gf │ │ ├── FoodsAmh.gf │ │ ├── FoodsBul.gf │ │ ├── FoodsCat.gf │ │ ├── FoodsChi.gf │ │ ├── FoodsCze.gf │ │ ├── FoodsDut.gf │ │ ├── FoodsEng.gf │ │ ├── FoodsEpo.gf │ │ ├── FoodsFin.gf │ │ ├── FoodsFre.gf │ │ ├── FoodsGer.gf │ │ ├── FoodsHeb.gf │ │ ├── FoodsHin.gf │ │ ├── FoodsI.gf │ │ ├── FoodsIce.gf │ │ ├── FoodsIta.gf │ │ ├── FoodsJpn.gf │ │ ├── FoodsLav.gf │ │ ├── FoodsMlt.gf │ │ ├── FoodsMon.gf │ │ ├── FoodsNep.gf │ │ ├── FoodsOri.gf │ │ ├── FoodsPes.gf │ │ ├── FoodsPor.gf │ │ ├── FoodsRon.gf │ │ ├── FoodsSpa.gf │ │ ├── FoodsSwe.gf │ │ ├── FoodsTha.gf │ │ ├── FoodsTsn.gf │ │ ├── FoodsTur.gf │ │ ├── FoodsUrd.gf │ │ ├── LexFoods.gf │ │ ├── LexFoodsCat.gf │ │ ├── LexFoodsFin.gf │ │ ├── LexFoodsGer.gf │ │ ├── LexFoodsIta.gf │ │ ├── LexFoodsSwe.gf │ │ ├── ResCze.gf │ │ └── transFoodsHin.gf │ ├── Graph Modeling Language/ │ │ ├── sample.gml │ │ ├── sample2.gml │ │ └── sample3.gml │ ├── GraphQL/ │ │ ├── kitchen-sink.graphql │ │ ├── schema-kitchen-sink.graphql │ │ ├── schema-kitchen-sink.graphqls │ │ └── schema.graphqls │ ├── Graphviz (DOT)/ │ │ ├── annoying.DOT │ │ └── sample.dot │ ├── Groovy/ │ │ ├── build.gvy │ │ ├── filenames/ │ │ │ └── Jenkinsfile │ │ ├── groovy │ │ ├── script.gvy │ │ ├── template.grt │ │ └── template.gtpl │ ├── Groovy Server Pages/ │ │ ├── bar.gsp │ │ ├── hello-pagedirective.gsp │ │ ├── hello-resources.gsp │ │ └── hello-var.gsp │ ├── HAProxy/ │ │ ├── haproxy.cfg │ │ ├── haproxy2.cfg │ │ ├── haproxy3.cfg │ │ └── haproxy4.cfg │ ├── HCL/ │ │ ├── example.hcl │ │ ├── example.nomad │ │ ├── example.tf │ │ ├── example.tofu │ │ ├── main.tf │ │ ├── main.workflow │ │ └── terraform.tfvars │ ├── HIP/ │ │ └── MatrixMultiplication.hip │ ├── HLSL/ │ │ ├── accelerated_surface_win.hlsl │ │ ├── bloom.cginc │ │ ├── corridor.fx │ │ ├── jellyfish.fx │ │ └── noise.fx │ ├── HOCON/ │ │ ├── application.hocon │ │ ├── filenames/ │ │ │ ├── .scalafix.conf │ │ │ └── .scalafmt.conf │ │ └── stream-collector.hocon │ ├── HTML/ │ │ ├── Crear_logo.hta │ │ ├── example.xht │ │ ├── index.html.hl │ │ ├── pages.html │ │ ├── pkgdown.html │ │ ├── rpanel.inc │ │ ├── tailDel.inc │ │ └── wehaveoddjobs.hta │ ├── HTML+ECR/ │ │ └── greeting.ecr │ ├── HTML+EEX/ │ │ ├── index.html.eex │ │ ├── live_component.html.heex │ │ └── live_component.html.leex │ ├── HTML+ERB/ │ │ ├── fishbowl.html.erb.deface │ │ ├── index.html.erb │ │ └── index.rhtml │ ├── HTML+Razor/ │ │ ├── Index.cshtml │ │ └── Index.razor │ ├── HXML/ │ │ ├── checkstyle.hxml │ │ └── vshaxe.hxml │ ├── Hack/ │ │ ├── Assert.hh │ │ ├── AssertRecipe.hh │ │ ├── Controller.hh │ │ ├── DBResultRecipe.hh │ │ ├── Documentation.hh │ │ ├── FakeDB.hh │ │ ├── GetAndPostRecipe.hh │ │ ├── GetController.hh │ │ ├── HomeController.hh │ │ ├── Map.hhi │ │ ├── MySecureRequest.hh │ │ ├── Nav.hh │ │ ├── NonStrictFile.hh │ │ ├── Recipe.hh │ │ ├── RecipeWithDemo.hh │ │ ├── Request.hh │ │ ├── StandardPage.hh │ │ ├── StrictFile.hh │ │ ├── UnescapedString.hh │ │ ├── UnescapedStringRecipe.hh │ │ ├── UserID.hh │ │ ├── UserIDRecipe.hh │ │ ├── UsingUserID.hh │ │ ├── error.hh │ │ ├── first.hack │ │ ├── funs.hh │ │ ├── funs.php │ │ ├── index.hh │ │ ├── phpfile.hh │ │ └── startup.hh │ ├── Haml/ │ │ ├── buttons.html.haml.deface │ │ └── hello.haml │ ├── Handlebars/ │ │ ├── basic.handlebars │ │ └── each.hbs │ ├── Hare/ │ │ ├── contains.ha │ │ ├── iter.ha │ │ └── types.ha │ ├── Haskell/ │ │ ├── Hello.hs │ │ ├── HsColour.hs │ │ ├── Main.hs │ │ ├── Sudoku.hs │ │ └── maze-solving.hs │ ├── HiveQL/ │ │ ├── mi.q │ │ └── query.hql │ ├── HolyC/ │ │ ├── GrAsm.HC │ │ ├── OnceDemo.HC │ │ ├── Prompt.HC │ │ ├── RandDemo.HC │ │ └── Spy.HC │ ├── Hosts File/ │ │ └── filenames/ │ │ ├── hosts │ │ └── hosts.txt │ ├── Hurl/ │ │ ├── assert.hurl │ │ ├── body.hurl │ │ ├── capture-data.hurl │ │ └── request-headers.hurl │ ├── Hy/ │ │ ├── fibonacci.hy │ │ ├── fizzbuzz │ │ └── hello-world.hy │ ├── HyPhy/ │ │ ├── AAModelComparison.bf │ │ ├── CodonModelCompare.bf │ │ ├── MFPositiveSelection.bf │ │ ├── MatrixIndexing.bf │ │ ├── MolecularClock.bf │ │ ├── dNdSDistributionComparison.bf │ │ ├── hyphy_cmds.bf │ │ └── profile_test.bf │ ├── IDL/ │ │ ├── amespahdbidlsuite_spectrum__define.pro │ │ ├── mg_acosh.pro │ │ ├── mg_analysis.dlm │ │ ├── mg_gcd.pro │ │ └── mg_trunc.pro │ ├── IGOR Pro/ │ │ ├── CodeBrowser.ipf │ │ ├── functions.ipf │ │ └── generic.ipf │ ├── INI/ │ │ ├── MouseKeyboard.pro │ │ ├── TOVR.dof │ │ ├── defaults.properties │ │ ├── filenames/ │ │ │ ├── .buckconfig │ │ │ ├── .coveragerc │ │ │ ├── .flake8 │ │ │ ├── .pylintrc │ │ │ ├── buildozer.spec │ │ │ ├── hosts │ │ │ ├── pylintrc │ │ │ └── vlcrc │ │ ├── metrics.frm │ │ ├── ms.cfg │ │ ├── ms.properties │ │ ├── my.cnf │ │ ├── openssl.cnf │ │ ├── spyder_website.lektorproject │ │ └── ultimate-temp-controller.pro │ ├── ISPC/ │ │ ├── VideoFunctions.ispc │ │ ├── program_city.ispc │ │ └── volume.ispc │ ├── Idris/ │ │ └── Chars.idr │ ├── Ignore List/ │ │ ├── Finale.gitignore │ │ └── filenames/ │ │ ├── .atomignore │ │ ├── .babelignore │ │ ├── .bzrignore │ │ ├── .coffeelintignore │ │ ├── .cvsignore │ │ ├── .dockerignore │ │ ├── .easignore │ │ ├── .eleventyignore │ │ ├── .eslintignore │ │ ├── .gitignore │ │ ├── .ignore │ │ ├── .markdownlintignore │ │ ├── .nodemonignore │ │ ├── .npmignore │ │ ├── .prettierignore │ │ ├── .stylelintignore │ │ ├── .vercelignore │ │ ├── .vscodeignore │ │ ├── gitignore-global │ │ └── gitignore_global │ ├── ImageJ Macro/ │ │ ├── batch of ratiometric FRET using IO settings.ijm │ │ └── simple.ijm │ ├── Imba/ │ │ └── main.imba │ ├── Inform 7/ │ │ ├── Trivial Extension.i7x │ │ └── story.ni │ ├── Ink/ │ │ ├── murder_scene.ink │ │ ├── print_number.ink │ │ ├── seen_this_scene.ink │ │ ├── string_to_list.ink │ │ └── thread_in_tunnel.ink │ ├── Inno Setup/ │ │ ├── Default.isl │ │ └── expat.iss │ ├── Ioke/ │ │ └── hello.ik │ ├── Isabelle/ │ │ └── HelloWorld.thy │ ├── Isabelle ROOT/ │ │ └── filenames/ │ │ └── ROOT │ ├── J/ │ │ ├── hashbang │ │ └── stwij.ijs │ ├── JAR Manifest/ │ │ └── filenames/ │ │ └── MANIFEST.MF │ ├── JCL/ │ │ ├── IEBCOPY.jcl │ │ ├── IEFBR14.jcl │ │ └── IKJEFT01.jcl │ ├── JFlex/ │ │ ├── LexScan.flex │ │ └── java.jflex │ ├── JSON/ │ │ ├── 2ea73365-b6f1-4bd1-a454-d57a67e50684.yy │ │ ├── 4DPopGit.4DProject │ │ ├── GMS2_Project.yyp │ │ ├── Git Commit.JSON-tmLanguage │ │ ├── Material_Alpha_01.gltf │ │ ├── VCT.yy │ │ ├── block-sync-counter8.ice │ │ ├── code-scanning.sarif │ │ ├── filenames/ │ │ │ ├── .all-contributorsrc │ │ │ ├── .arcconfig │ │ │ ├── .htmlhintrc │ │ │ ├── .imgbotconfig │ │ │ ├── .tern-config │ │ │ ├── .tern-project │ │ │ ├── .watchmanconfig │ │ │ ├── Package.resolved │ │ │ └── mcmod.info │ │ ├── form.4DForm │ │ ├── geo.geojson │ │ ├── google-services.json.example │ │ ├── http_response.avsc │ │ ├── landing.tact │ │ ├── manifest.webapp │ │ ├── manifest.webmanifest │ │ ├── pack.mcmeta │ │ ├── person.json │ │ ├── product.json │ │ ├── recording.har │ │ ├── schema.json │ │ ├── small.tfstate │ │ ├── switzerland.topojson │ │ └── terraform.tfstate.backup │ ├── JSON with Comments/ │ │ ├── AMPL.sublime-build │ │ ├── CLIPS.sublime-settings │ │ ├── Context.sublime-menu │ │ ├── Dart.sublime-commands │ │ ├── Dart.sublime-project │ │ ├── Default (Linux).sublime-mousemap │ │ ├── Default.sublime-keymap │ │ ├── JavaDoc Add Line.sublime-macro │ │ ├── Mariana.sublime-color-scheme │ │ ├── RunBuild.sublime-macro │ │ ├── SourcePawn.sublime-build │ │ ├── Tubnil.sublime-theme │ │ ├── coc.jsonc │ │ ├── filenames/ │ │ │ ├── .babelrc │ │ │ ├── .eslintrc.json │ │ │ ├── .jscsrc │ │ │ ├── .jshintrc │ │ │ ├── .jslintrc │ │ │ ├── .oxlintrc.json │ │ │ ├── .swcrc │ │ │ ├── devcontainer.json │ │ │ ├── jsconfig.json │ │ │ ├── language-configuration.json │ │ │ ├── tsconfig.json │ │ │ └── tslint.json │ │ ├── jade.sublime-completions │ │ ├── jest.tsconfig.json │ │ ├── plyr.code-workspace │ │ └── vue.code-snippets │ ├── JSON5/ │ │ ├── example.json5 │ │ └── package.json5 │ ├── JSONLD/ │ │ └── sample.jsonld │ ├── JSONiq/ │ │ ├── detail.jq │ │ └── query.jq │ ├── Jac/ │ │ ├── littleX.impl.jac │ │ ├── littleX.jac │ │ ├── littleX.test.jac │ │ ├── smart-learning-companion.cl.jac │ │ └── task_manager.jac │ ├── Jai/ │ │ ├── cte.jai │ │ └── ifx.jai │ ├── Janet/ │ │ ├── lazyseqs.janet │ │ ├── life.janet │ │ └── tarray.janet │ ├── Jasmin/ │ │ ├── if1.j │ │ ├── if2.j │ │ ├── if3.j │ │ ├── if4.j │ │ ├── op1.j │ │ ├── op2.j │ │ ├── op3.j │ │ └── op4.j │ ├── Java/ │ │ ├── FieldGen.jsh │ │ ├── GrammarKit.java │ │ ├── HtmlDomParserContext.java │ │ ├── Hudson.java │ │ ├── JFlexLexer.java │ │ ├── NokogiriService.java │ │ ├── ProtocolBuffer.java │ │ ├── clojure-type.java │ │ ├── clojure-util.java │ │ ├── gen-java-linguist-thrift.java │ │ └── generated-jooq-table.java │ ├── Java Properties/ │ │ ├── libraries.properties │ │ └── sounds.properties │ ├── Java Template Engine/ │ │ └── baseLayout.jte │ ├── JavaScript/ │ │ ├── axios.es │ │ ├── bootstrap-modal.js │ │ ├── ccalc-lex.js │ │ ├── ccalc-parse.js │ │ ├── chart_composers.gs │ │ ├── classes-old.js │ │ ├── classes.js │ │ ├── constant_fold.mjs │ │ ├── dude.js │ │ ├── entry.mjs │ │ ├── gen-js-linguist-thrift.js │ │ ├── hello.js │ │ ├── helloHanaEndpoint.xsjs │ │ ├── helloHanaMath.xsjslib │ │ ├── http.js │ │ ├── index.es │ │ ├── intro-old.js │ │ ├── intro.js │ │ ├── intro.js.frag │ │ ├── itau.gs │ │ ├── jquery-1.6.1.js │ │ ├── jquery-1.7.2.js │ │ ├── js │ │ ├── js2 │ │ ├── jsbuild.jsb │ │ ├── json2_backbone.js │ │ ├── logo.jscad │ │ ├── merge.js │ │ ├── modernizr.js │ │ ├── module.mjs │ │ ├── namespace.js │ │ ├── outro.js.frag │ │ ├── parser.js │ │ ├── proto.js │ │ ├── run │ │ ├── sample.jsx │ │ ├── steelseries-min.js │ │ └── uglify.js │ ├── JavaScript+ERB/ │ │ └── create.js.erb │ ├── Jest Snapshot/ │ │ └── css.test.tsx.snap │ ├── JetBrains MPS/ │ │ ├── baselanguage.mpl │ │ ├── field_table.mps │ │ ├── model.mps │ │ └── sandbox.msd │ ├── Jinja/ │ │ ├── home.j2 │ │ └── worker.jinja2 │ ├── Jison/ │ │ ├── ansic.jison │ │ ├── classy.jison │ │ └── lex.jison │ ├── Jison Lex/ │ │ ├── classy.jisonlex │ │ └── lex_grammar.jisonlex │ ├── Jolie/ │ │ ├── common.iol │ │ ├── exam.ol │ │ ├── examiner.ol │ │ ├── hanoi.ol │ │ └── student.ol │ ├── Jsonnet/ │ │ └── intersection.jsonnet │ ├── Julia/ │ │ ├── julia │ │ └── stockcorr.jl │ ├── Jupyter Notebook/ │ │ └── JupyterNotebook.ipynb │ ├── Just/ │ │ ├── filenames/ │ │ │ └── Justfile │ │ └── kitchen-sink.just │ ├── KCL/ │ │ ├── complex.k │ │ └── simple.k │ ├── KDL/ │ │ ├── Cargo.kdl │ │ ├── ci.kdl │ │ ├── niri.kdl │ │ ├── nuget.kdl │ │ ├── system76-scheduler.kdl │ │ ├── website.kdl │ │ └── zellij.kdl │ ├── KFramework/ │ │ ├── sample1.k │ │ └── sample2.k │ ├── KRL/ │ │ └── helloworld.krl │ ├── Kaitai Struct/ │ │ ├── iso9660.ksy │ │ └── zip.ksy │ ├── KakouneScript/ │ │ ├── c-family.kak │ │ ├── doc.kak │ │ └── filenames/ │ │ └── kakrc │ ├── KerboScript/ │ │ ├── hoverslam.ks │ │ ├── launch.ks │ │ └── lib_pid.ks │ ├── KiCad Layout/ │ │ ├── C_Disc_D3_P2.5.kicad_mod │ │ ├── Conn_Poncho_SinBorde.kicad_mod │ │ ├── Fiducial_1mm.kicad_mod │ │ ├── LED-5MM.kicad_mod │ │ ├── Logo_OSHWA.kicad_mod │ │ ├── Logo_Poncho.kicad_mod │ │ ├── MagneticBuzzer_ProSignal_ABT-410-RC.kicad_mod │ │ ├── Pin_Header_Straight_2x02.kicad_mod │ │ ├── Pin_Header_Straight_2x20.kicad_mod │ │ ├── Resistor_Horizontal_RM7mm.kicad_mod │ │ ├── SW_PUSH_SMALL.kicad_mod │ │ ├── TO-92_Molded_Narrow.kicad_mod │ │ ├── filenames/ │ │ │ └── fp-lib-table │ │ ├── kivicad.kicad_wks │ │ ├── nrf-bga.kicad_pcb │ │ └── simonShield.kicad_pcb │ ├── KiCad Legacy Layout/ │ │ └── tc14badge.brd │ ├── KiCad Schematic/ │ │ ├── Regulator_Current.kicad_sym │ │ ├── Volume.sch │ │ ├── buttons.sch │ │ ├── buzzer.sch │ │ ├── ciaaConector.sch │ │ ├── gedda-junk.sch │ │ ├── rpi-cm4-carrier-template.kicad_sch │ │ └── ultimate-temp-controller.sch │ ├── Kickstart/ │ │ ├── fedora-32-live-jam-xfce-pipewire.ks │ │ ├── mysql.ks │ │ └── sample_end.ks │ ├── Kit/ │ │ └── demo.kit │ ├── KoLmafia ASH/ │ │ ├── newDG.ash │ │ └── tt_kingliberated.ash │ ├── Koka/ │ │ ├── community-docs.kk │ │ ├── official-tutorial1.kk │ │ └── official-tutorial2.kk │ ├── Kotlin/ │ │ └── Foo.kt │ ├── Kusto/ │ │ ├── application_consent_or_assignment.kql │ │ ├── example-create-sflogs-table.csl │ │ ├── examples_traces.csl │ │ └── kusto-example-queries.csl │ ├── LFE/ │ │ ├── church.lfe │ │ ├── gps1.lfe │ │ ├── mnesia_demo.lfe │ │ └── object.lfe │ ├── LOLCODE/ │ │ └── LOLTracer.lol │ ├── LSL/ │ │ ├── LSL.lsl │ │ └── LSL.lslp │ ├── LTspice Symbol/ │ │ └── random-shapes.asy │ ├── LabVIEW/ │ │ ├── Actor Framework Fundamentals.lvproj │ │ ├── Coffee Shop.lvlib │ │ ├── Customer.lvlib │ │ ├── Malleable VIs - Nested Malleable VIs.lvproj │ │ ├── Malleable VIs Basics.lvproj │ │ ├── PL Modbus Client.lvclass │ │ ├── Person.lvlib │ │ ├── Temperature Monitoring.lvproj │ │ ├── Word Finder.lvproj │ │ ├── Work Dispatcher.lvlib │ │ └── Worker.lvlib │ ├── Lambdapi/ │ │ ├── List.lp │ │ └── tutorial.lp │ ├── Langium/ │ │ ├── ox.langium │ │ ├── treemap.langium │ │ └── zmodel.langium │ ├── Lark/ │ │ ├── ebl_atf.lark │ │ ├── ebl_atf_common.lark │ │ └── lark.lark │ ├── Lasso/ │ │ ├── json.lasso │ │ ├── json.lasso9 │ │ └── knop.las │ ├── Latte/ │ │ ├── layout.latte │ │ └── template.latte │ ├── Lean/ │ │ ├── binary.lean │ │ └── set.hlean │ ├── Lean 4/ │ │ └── BirthdayProblem.lean │ ├── Leo/ │ │ ├── fibonacci.leo │ │ ├── groups.leo │ │ ├── twoadicity.leo │ │ └── vote.leo │ ├── Less/ │ │ └── screen.less │ ├── Lex/ │ │ ├── filenames/ │ │ │ └── Lexer.x │ │ └── zend_ini_scanner.l │ ├── LigoLANG/ │ │ └── FA1.2.ligo │ ├── Limbo/ │ │ ├── cat.b │ │ ├── lock.b │ │ └── lock.m │ ├── Linear Programming/ │ │ ├── Multiobj.lp │ │ └── diet.lp │ ├── Linker Script/ │ │ ├── filenames/ │ │ │ └── ld.script │ │ ├── inject.x │ │ ├── link.ld │ │ └── vmlinux.lds │ ├── Linux Kernel Module/ │ │ ├── bcm4334x.mod │ │ ├── mbcache.mod │ │ └── md5.mod │ ├── Liquid/ │ │ ├── layout.liquid │ │ └── template.liquid │ ├── Literate Agda/ │ │ └── NatCat.lagda │ ├── Literate CoffeeScript/ │ │ ├── pixi.coffee.md │ │ └── scope.litcoffee │ ├── LiveCode Script/ │ │ ├── colorToRGB.livecodescript │ │ ├── hideFolder.livecodescript │ │ ├── longIdAllControls.livecodescript │ │ └── minifyScript.livecodescript │ ├── LiveScript/ │ │ └── hello.ls │ ├── Logos/ │ │ ├── NCHax.x │ │ ├── NoCarrier.x │ │ ├── Tweak.x │ │ ├── example.xm │ │ └── string1.x │ ├── Logtalk/ │ │ └── foo.lgt │ ├── LookML/ │ │ ├── comments.view.lookml │ │ ├── example.model.lkml │ │ └── example.view.lkml │ ├── LoomScript/ │ │ ├── HelloWorld.ls │ │ └── SyntaxExercise.ls │ ├── Lua/ │ │ ├── filenames/ │ │ │ └── .luacheckrc │ │ ├── h-counter.pd_lua │ │ ├── luatexts-0.1.2-1.rockspec │ │ ├── treegen.p8 │ │ ├── vidya-file-list-parser.pd_lua │ │ ├── vidya-file-modder.pd_lua │ │ └── wsapi.fcgi │ ├── Luau/ │ │ ├── EnumList.luau │ │ ├── Option.luau │ │ ├── Symbol.luau │ │ ├── Tree.luau │ │ └── ser.luau │ ├── M/ │ │ ├── Comment.m │ │ ├── GMRGPNB0.m │ │ ├── MDB.m │ │ ├── PRCAAPR.m │ │ ├── PXAI.m │ │ ├── WVBRNOT.m │ │ ├── ZDIOUT1.m │ │ ├── _zewdAPI.m │ │ ├── _zewdDemo.m │ │ ├── arrays.m │ │ ├── base64.m │ │ ├── digest.m │ │ ├── dynamicscoping.m │ │ ├── fibonacci.m │ │ ├── forloop.m │ │ ├── functions.m │ │ ├── helloworld.m │ │ ├── ifelse.m │ │ ├── indirectfunctions.m │ │ ├── md5.m │ │ ├── mileage.m │ │ ├── mumtris.m │ │ ├── nesting.m │ │ ├── pcre.m │ │ ├── pcreexamples.m │ │ ├── postconditional.m │ │ ├── primes.m │ │ ├── url.m │ │ └── zmwire.m │ ├── M3U/ │ │ ├── Bolt Thrower - Those Once Loyal.m3u │ │ ├── M+.m3u8 │ │ ├── au.m3u │ │ └── gn.m3u │ ├── M4/ │ │ ├── fibo.m4 │ │ ├── htmlgen.m4 │ │ ├── postscript.m4 │ │ ├── sendmail.mc │ │ └── translit2.m4 │ ├── M4Sugar/ │ │ ├── ax_ruby_devel.m4 │ │ ├── filenames/ │ │ │ └── configure.ac │ │ └── list.m4 │ ├── MATLAB/ │ │ ├── Check_plot.m │ │ ├── FTLEH.m │ │ ├── FTLE_reg.m │ │ ├── Integrate1.m │ │ ├── Integrate2.m │ │ ├── Lagr.m │ │ ├── Lagrangian_points.m │ │ ├── Poincare.m │ │ ├── RK4.m │ │ ├── Traj.m │ │ ├── adapting_structural_model.m │ │ ├── average.m │ │ ├── bicycle_state_space.m │ │ ├── convert_variable.m │ │ ├── create_ieee_paper_plots.m │ │ ├── cross_validation.m │ │ ├── distance.m │ │ ├── double_gyre.m │ │ ├── example.m │ │ ├── fit_adapt.m │ │ ├── fit_adapt_linear.m │ │ ├── gpu_RKF45_FILE.m │ │ ├── ieee.m │ │ ├── lane_change.m │ │ ├── load_bikes.m │ │ ├── load_data.m │ │ ├── make_filter.m │ │ ├── matlab_class.m │ │ ├── matlab_function.m │ │ ├── matlab_script.m │ │ ├── matlab_script2.m │ │ ├── normalize.m │ │ ├── overwrite_settings.m │ │ ├── par_text_to_struct.m │ │ ├── plant.m │ │ ├── test_rk_par.m │ │ ├── test_system_state_space.m │ │ ├── varargin_to_structure.m │ │ └── write_gains.m │ ├── MAXScript/ │ │ ├── macro-1.mcr │ │ ├── macro-2.mcr │ │ ├── rolloutCreator.ms │ │ ├── svg-renderer.ms │ │ └── volume-calc.ms │ ├── MDX/ │ │ └── sample.mdx │ ├── MLIR/ │ │ ├── const-fold.mlir │ │ ├── core-ops.mlir │ │ ├── executor_to_control_dialect.mlir │ │ └── sample.mlir │ ├── MQL4/ │ │ ├── header-sample.mqh │ │ ├── indicator-sample.mq4 │ │ └── script-sample.mq4 │ ├── MQL5/ │ │ ├── Regex.mqh │ │ ├── indicator-sample.mq5 │ │ └── script-sample.mq5 │ ├── MTML/ │ │ └── categories_to_columns.mtml │ ├── MUF/ │ │ ├── 39.m │ │ └── cmd-say.muf │ ├── Macaulay2/ │ │ └── FGLM.m2 │ ├── Makefile/ │ │ ├── file-icons.make │ │ ├── filenames/ │ │ │ ├── BSDmakefile │ │ │ ├── Kbuild │ │ │ ├── Makefile │ │ │ ├── Makefile.boot │ │ │ ├── Makefile.frag │ │ │ ├── Makefile.inc │ │ │ ├── Makefile.wat │ │ │ ├── makefile.sco │ │ │ └── mkfile │ │ ├── foo.o.d │ │ └── makefile │ ├── Markdown/ │ │ ├── README.mdown │ │ ├── bunyan.1.ronn │ │ ├── csharp6.workbook │ │ ├── filenames/ │ │ │ └── contents.lr │ │ ├── livebook.livemd │ │ ├── minimal.md │ │ ├── ronn-format.7.ronn │ │ ├── ronn.1.ronn │ │ ├── sway.5.scd │ │ └── tender.md │ ├── Marko/ │ │ ├── counter.marko │ │ ├── hello.marko │ │ └── rgb-sliders.marko │ ├── Mask/ │ │ └── view.mask │ ├── Mathematical Programming System/ │ │ ├── advanced-problem.mps │ │ └── afiro.mps │ ├── Maven POM/ │ │ └── filenames/ │ │ └── pom.xml │ ├── Max/ │ │ ├── Hello.maxhelp │ │ ├── Hello.maxpat │ │ └── Hello.mxt │ ├── MeTTa/ │ │ ├── a2_opencoggy.metta │ │ ├── baseline_formulation.metta │ │ ├── blocks-i-0.metta │ │ └── schemes.metta │ ├── Mercury/ │ │ ├── code_info.m │ │ ├── expr.moo │ │ ├── hello.m │ │ ├── options.m │ │ ├── polymorphism.m │ │ ├── rot13_concise.m │ │ ├── rot13_ralph.m │ │ ├── rot13_verbose.m │ │ ├── store.m │ │ └── switch_detection_bug.m │ ├── Mermaid/ │ │ ├── c4c-diagram.mermaid │ │ ├── class-diagram.mermaid │ │ ├── er-diagram.mmd │ │ ├── flowchart.mmd │ │ ├── gantt.mmd │ │ ├── gitgraph.mmd │ │ ├── pie-chart.mermaid │ │ ├── requirement-diagram.mermaid │ │ ├── sequence-diagram.mmd │ │ ├── state-diagram.mmd │ │ └── user-journey.mmd │ ├── Meson/ │ │ └── filenames/ │ │ ├── meson.build │ │ └── meson_options.txt │ ├── Metal/ │ │ └── ITMVisualisationEngine.metal │ ├── Microsoft Developer Studio Project/ │ │ └── freeglut.dsp │ ├── Microsoft Visual Studio Solution/ │ │ └── Radiant.sln │ ├── MiniYAML/ │ │ ├── chrome.yaml │ │ ├── cursor.yaml │ │ ├── mainmenu.yaml │ │ ├── metrics.yaml │ │ ├── metrics.yml │ │ ├── mod.yaml │ │ ├── notifications.yaml │ │ ├── rules.yaml │ │ └── tileset.yaml │ ├── MiniZinc/ │ │ ├── carpet_cutting.mzn │ │ └── project_scheduling.mzn │ ├── MiniZinc Data/ │ │ ├── pantry.dzn │ │ └── placement.dzn │ ├── Mint/ │ │ ├── ApplicationStore.mint │ │ ├── Comment.mint │ │ ├── Counter.mint │ │ ├── HeaderTest.mint │ │ ├── InlineJS.mint │ │ └── TodoItem.mint │ ├── Modelica/ │ │ ├── NestedPackages.mo │ │ ├── NewtonCooling.mo │ │ ├── Pendulum.mo │ │ ├── RLC.mo │ │ ├── SecondOrderSystem.mo │ │ ├── System.mo │ │ ├── Translational.mo │ │ ├── modelica.mo │ │ ├── package.mo │ │ ├── package2.mo │ │ ├── package3.mo │ │ └── package4.mo │ ├── Modula-2/ │ │ └── HuffChan.mod │ ├── Modula-3/ │ │ ├── DiGraph.ig │ │ ├── DiGraph.mg │ │ ├── Rd.i3 │ │ ├── Rd.m3 │ │ └── RdClass.i3 │ ├── Module Management System/ │ │ ├── descrip.mms │ │ ├── openvms.mmk │ │ ├── simh_descrip.mms │ │ ├── spline_descrip.mms │ │ └── xv_makefile.mms │ ├── Mojo/ │ │ ├── Bool.mojo │ │ └── Matmul.mojo │ ├── Monkey/ │ │ ├── encodeToPng.monkey2 │ │ ├── example.monkey │ │ ├── example.monkey2 │ │ ├── gui.monkey2 │ │ └── sorting.monkey2 │ ├── Monkey C/ │ │ └── VesselModel.mc │ ├── Moocode/ │ │ ├── hello.moo │ │ ├── moocode_toolkit.moo │ │ └── toy.moo │ ├── MoonBit/ │ │ ├── cfold.mbt │ │ ├── deriv.mbt │ │ ├── fft.mbt │ │ ├── nqueens.mbt │ │ └── rbtree.mbt │ ├── MoonScript/ │ │ └── transform.moon │ ├── Motoko/ │ │ ├── erc20.mo │ │ └── queue.mo │ ├── Motorola 68K Assembly/ │ │ ├── bls_routines.inc │ │ ├── cpu.s │ │ ├── iff_ilbm.i │ │ ├── lz4.X68 │ │ ├── rom_testbench.asm │ │ └── system.s │ ├── Move/ │ │ ├── Main.move │ │ └── Vector.move │ ├── Muse/ │ │ ├── manual.muse │ │ └── usage.muse │ ├── Mustache/ │ │ ├── csvrow.mustache │ │ ├── deleteuser.mustache │ │ ├── pupilinfoblock.mustache │ │ └── showallusers.mustache │ ├── NASL/ │ │ ├── bugbear_b.nasl │ │ ├── cmsimple_guestbook_xss.nasl │ │ ├── cmsimple_search_xss.nasl │ │ ├── cubecart_xss.nasl │ │ ├── data_mail_xss.nasl │ │ ├── hacker_defender.nasl │ │ ├── nmap.nasl │ │ ├── packeteer_web_login.nasl │ │ ├── smtp_func.inc │ │ └── tftp_func.inc │ ├── NCL/ │ │ ├── PrnOscPat_driver.ncl │ │ ├── WRF_static_2.ncl │ │ ├── WRF_track_1.ncl │ │ ├── cosmolib_1.ncl │ │ ├── cru_8.ncl │ │ ├── gsn_csm_xy2_time_series_inputs.ncl │ │ ├── hdf4sds_7.ncl │ │ ├── mask_12.ncl │ │ ├── mcsst_1.ncl │ │ ├── topo_9.ncl │ │ ├── traj_3.ncl │ │ ├── tsdiagram_1.ncl │ │ ├── unique_9.ncl │ │ ├── viewport_4.ncl │ │ ├── weather_sym_6.ncl │ │ └── xy_29.ncl │ ├── NEON/ │ │ ├── config.neon │ │ └── example.neon │ ├── NL/ │ │ ├── assign0.nl │ │ └── balassign0.nl │ ├── NMODL/ │ │ ├── fornetcon.mod │ │ └── k3st.mod │ ├── NPM Config/ │ │ └── filenames/ │ │ └── .npmrc │ ├── NSIS/ │ │ ├── bigtest.nsi │ │ └── x64.nsh │ ├── NWScript/ │ │ ├── act_disarmkobold.nss │ │ ├── act_unlockkobold.nss │ │ ├── crawler_death.nss │ │ ├── e2pc_plaguestack.nss │ │ ├── e3pc_spidersnest.nss │ │ └── illusion_spawn.nss │ ├── Nasal/ │ │ ├── damage.nas │ │ └── kx165tso.nas │ ├── Nearley/ │ │ └── nearley-language-bootstrapped.ne │ ├── Nemerle/ │ │ └── hello.n │ ├── NetLinx/ │ │ ├── projector.axi │ │ └── volume-array.axs │ ├── NetLinx+ERB/ │ │ ├── sample.axi.erb │ │ └── sample.axs.erb │ ├── NetLogo/ │ │ └── Life.nlogo │ ├── NewLisp/ │ │ ├── irc.lsp │ │ ├── log-to-database.lisp │ │ └── queens.nl │ ├── Nextflow/ │ │ ├── blast.nf │ │ ├── callings.nf │ │ ├── filenames/ │ │ │ └── nextflow.config │ │ └── rnaseq.nf │ ├── Nginx/ │ │ ├── example.com.vhost │ │ ├── filenames/ │ │ │ └── nginx.conf │ │ └── sample.nginx │ ├── Nickel/ │ │ ├── arrays.ncl │ │ ├── config-gcc.ncl │ │ └── imports.ncl │ ├── Nim/ │ │ ├── config.nims │ │ ├── filenames/ │ │ │ └── nim.cfg │ │ ├── foo.nim │ │ ├── main.nim │ │ ├── nimfix.nim.cfg │ │ └── zip.nimble │ ├── Nit/ │ │ ├── calculator.nit │ │ ├── callback_chimpanze.nit │ │ ├── callback_monkey.nit │ │ ├── circular_list.nit │ │ ├── clock.nit │ │ ├── clock_more.nit │ │ ├── curl_http.nit │ │ ├── curl_mail.nit │ │ ├── draw_operation.nit │ │ ├── drop_privileges.nit │ │ ├── extern_methods.nit │ │ ├── fibonacci.nit │ │ ├── file.nit │ │ ├── hello_world.nit │ │ ├── html_page.nit │ │ ├── int_stack.nit │ │ ├── meetup.nit │ │ ├── opengles2_hello_triangle.nit │ │ ├── print_arguments.nit │ │ ├── procedural_array.nit │ │ ├── socket_client.nit │ │ ├── socket_server.nit │ │ ├── tmpl_composer.nit │ │ └── websocket_server.nit │ ├── Nix/ │ │ └── nginx.nix │ ├── Noir/ │ │ ├── array.nr │ │ ├── ecrecover_lib.nr │ │ └── voting.nr │ ├── Nu/ │ │ ├── RandomApp.nu │ │ └── nu │ ├── Nunjucks/ │ │ └── norris.njk │ ├── Nushell/ │ │ ├── release-pkg.nu │ │ └── this_week_in_nu.nu │ ├── OASv2-json/ │ │ └── pixi.json │ ├── OASv2-yaml/ │ │ ├── sample.yaml │ │ └── sample.yml │ ├── OASv3-json/ │ │ └── ghes-3.4.json │ ├── OASv3-yaml/ │ │ ├── ghes-3.4.yaml │ │ └── ghes-3.4.yml │ ├── OCaml/ │ │ ├── Foo.ml │ │ ├── cmdliner.ml │ │ ├── common.ml │ │ ├── date.ml │ │ ├── example.eliom │ │ ├── map.ml │ │ ├── mirage.ml │ │ ├── reload.ml │ │ ├── sigset.ml │ │ └── uutf.ml │ ├── OMNeT++ MSG/ │ │ ├── GptpPacket.msg │ │ ├── TcpConnection.msg │ │ └── TcpConnectionState.msg │ ├── OMNeT++ NED/ │ │ ├── IWirelessInterface.ned │ │ ├── Ieee80211Interface.ned │ │ └── TsnNetworkBase.ned │ ├── Oberon/ │ │ └── beNull.ob2 │ ├── Object Data Instance Notation/ │ │ └── openehr_ehr_1.0.3.bmm.odin │ ├── ObjectScript/ │ │ └── Sample.Person.cls │ ├── Objective-C/ │ │ ├── ASIHTTPRequest.h │ │ ├── ASIHTTPRequest.m │ │ ├── Foo.h │ │ ├── Foo.m │ │ ├── FooAppDelegate.h │ │ ├── FooAppDelegate.m │ │ ├── JSONKit.h │ │ ├── JSONKit.m │ │ ├── MainMenuViewController.h │ │ ├── MainMenuViewController.m │ │ ├── PlaygroundViewController.h │ │ ├── PlaygroundViewController.m │ │ ├── SBJsonParser.h │ │ ├── SBJsonParser.m │ │ ├── Siesta.h │ │ ├── StyleViewController.h │ │ ├── StyleViewController.m │ │ ├── TUITableView.h │ │ ├── TUITableView.m │ │ ├── cocoa_monitor.m │ │ ├── gen-cocoa-linguist-thrift.m │ │ └── hello.m │ ├── Objective-C++/ │ │ ├── EventHandlerMac.mm │ │ └── objsql.mm │ ├── Objective-J/ │ │ ├── AppController.j │ │ ├── LightsOff.j │ │ └── iTunesLayout.j │ ├── Odin/ │ │ └── sample.odin │ ├── Omgrofl/ │ │ └── hello.omgrofl │ ├── Opa/ │ │ ├── hello_syntax1.opa │ │ └── hello_syntax2.opa │ ├── Opal/ │ │ └── DeepakChopra.opal │ ├── Open Policy Agent/ │ │ ├── httpapi.rego │ │ ├── kafka.rego │ │ ├── kubernetes_admission.rego │ │ └── ssh.rego │ ├── OpenCL/ │ │ ├── fft.cl │ │ └── sample.cl │ ├── OpenEdge ABL/ │ │ ├── Email.cls │ │ ├── SendEmailAlgorithm.cls │ │ ├── SocketReader.p │ │ ├── Util.cls │ │ ├── run.p │ │ └── test-win.w │ ├── OpenQASM/ │ │ └── half_adder.qasm │ ├── OpenRC runscript/ │ │ └── acpid │ ├── OpenSCAD/ │ │ ├── not_simple.scad │ │ └── simple.scad │ ├── OpenStep Property List/ │ │ ├── TypewriterInfo.plist │ │ └── weathericons-regular.glyphs │ ├── Option List/ │ │ └── filenames/ │ │ ├── .ackrc │ │ ├── .rspec │ │ ├── .yardopts │ │ ├── ackrc │ │ └── mocha.opts │ ├── Org/ │ │ └── org.org │ ├── OverpassQL/ │ │ ├── complex.overpassql │ │ └── simple.overpassql │ ├── Ox/ │ │ ├── IJCEmet2009.oxh │ │ ├── ParallelObjective.ox │ │ └── particle.oxo │ ├── Oxygene/ │ │ └── Loops.oxygene │ ├── Oz/ │ │ └── example.oz │ ├── P4/ │ │ ├── l2.p4 │ │ └── mirror_acl.p4 │ ├── PDDL/ │ │ ├── domain_testproblem.pddl │ │ ├── pathfinding.pddl │ │ └── problem_4d_5p.pddl │ ├── PEG.js/ │ │ ├── abnfp.peggy │ │ └── rfc5988.pegjs │ ├── PHP/ │ │ ├── Application.php │ │ ├── Client.php │ │ ├── Controller.php │ │ ├── Form.php │ │ ├── Model.php │ │ ├── ProtobufGenerated.php │ │ ├── ThriftGenerated.php │ │ ├── drupal.php │ │ ├── exception.zep.php │ │ ├── file_display.inc │ │ ├── filenames/ │ │ │ ├── .php │ │ │ ├── .php_cs │ │ │ └── .php_cs.dist │ │ ├── mail.phps │ │ ├── php │ │ ├── php-script │ │ ├── php2 │ │ ├── prefix.fcgi │ │ └── root.php │ ├── PLSQL/ │ │ ├── myobject.sql │ │ ├── packagebody.pkb │ │ ├── packageheader.pks │ │ ├── plsqlguide.pck │ │ ├── prime#.plsql │ │ ├── print_bool.prc │ │ ├── videodb.ddl │ │ └── who_called_me.sql │ ├── PLpgSQL/ │ │ ├── plpgsql_lint-8.4.sql │ │ ├── plpgsql_lint-9.0.sql │ │ ├── plpgsql_lint-9.1.sql │ │ ├── plpgsql_lint-9.2.sql │ │ ├── plpgsql_lint-9.3.sql │ │ ├── procedures.sql │ │ └── useraccount.pgsql │ ├── POV-Ray SDL/ │ │ ├── balcony.pov │ │ ├── bglass.inc │ │ ├── building.inc │ │ ├── chair.inc │ │ ├── cloth.inc │ │ ├── gamma_showcase.pov │ │ ├── sky.inc │ │ ├── table.inc │ │ ├── table_cloth.inc │ │ ├── table_stuff.inc │ │ ├── terrain.inc │ │ └── water.inc │ ├── Pact/ │ │ ├── coin.pact │ │ └── fungible-v1.pact │ ├── Pan/ │ │ ├── ceph-raid.pan │ │ ├── cluster-A.pan │ │ ├── databases.pan │ │ ├── functions.pan │ │ ├── infernalis.pan │ │ ├── libvirt.pan │ │ ├── link.pan │ │ ├── mysql.pan │ │ ├── nodes_properties.pan │ │ ├── onevm.pan │ │ ├── osd-fetch.pan │ │ ├── pakiti.pan │ │ ├── purge_fqan_accounts.pan │ │ ├── resources.pan │ │ ├── simple.pan │ │ ├── test.pan │ │ ├── types.pan │ │ └── unit.pan │ ├── Papyrus/ │ │ ├── CAMTEST_OverShoulderME.psc │ │ ├── vMFX_FXPlugin.psc │ │ └── vSCM_MetaQuestScript.psc │ ├── Parrot Assembly/ │ │ └── hello.pasm │ ├── Parrot Internal Representation/ │ │ └── hello.pir │ ├── Pascal/ │ │ ├── GraphicConfiguration.inc │ │ ├── bulls-and-cows.pascal │ │ ├── custforms.pp │ │ ├── cwindirs.pp │ │ ├── image_url.inc │ │ ├── large.pp │ │ ├── lazcomlib_1_0_tlb.pas │ │ ├── lazcomunit.pas │ │ ├── libc.inc │ │ ├── program.dpr │ │ ├── read-a-configuration-file.pascal │ │ ├── tw27294.pp │ │ └── vmops_impl.inc │ ├── Pawn/ │ │ ├── Check.inc │ │ ├── fixed.inc │ │ ├── fixes.inc │ │ ├── foo.sma │ │ ├── mfile.inc │ │ ├── timertest.pwn │ │ └── y_testing.inc │ ├── Pep8/ │ │ ├── div.pep │ │ ├── flag.pep │ │ ├── linked.pep │ │ ├── msq.pep │ │ ├── qsort.pep │ │ ├── stri_buf.pep │ │ └── stristack.pep │ ├── Perl/ │ │ ├── Ack.pm │ │ ├── Any.pm │ │ ├── Request.pm │ │ ├── Response.pm │ │ ├── Schema.pm │ │ ├── example.cgi │ │ ├── exception_handler.pl │ │ ├── feedgnuplot │ │ ├── fib.pl │ │ ├── filenames/ │ │ │ ├── .latexmkrc │ │ │ ├── Makefile.PL │ │ │ ├── Rexfile │ │ │ ├── ack │ │ │ ├── cpanfile │ │ │ └── latexmkrc │ │ ├── getchar.al │ │ ├── index.fcgi │ │ ├── oo1.pl │ │ ├── oo2.pl │ │ ├── oo3.pl │ │ ├── perl │ │ ├── perl-test.t │ │ ├── script.pl │ │ ├── strict.t │ │ ├── test-perl.pl │ │ ├── test-perl2.pl │ │ └── use5.pl │ ├── Pic/ │ │ ├── dextroamphetamine.chem │ │ ├── graph.pic │ │ └── ritalin.chem │ ├── Pickle/ │ │ ├── data.pkl │ │ ├── neural-network-ce-l2reg-784-10-30.pkl │ │ ├── random.pkl │ │ └── save.pkl │ ├── PicoLisp/ │ │ └── simul.l │ ├── PigLatin/ │ │ └── example.pig │ ├── Pike/ │ │ ├── Error.pmod │ │ ├── FakeFile.pike │ │ └── shebang.pike │ ├── Pip Requirements/ │ │ └── filenames/ │ │ ├── dev-requirements.txt │ │ ├── requirements-dev.txt │ │ ├── requirements.lock.txt │ │ └── requirements.txt │ ├── Pkl/ │ │ ├── Parser.pkl │ │ ├── SchemaGenerator.pkl │ │ └── rule.pkl │ ├── PlantUML/ │ │ ├── ProtectedMeta.iuml │ │ ├── PublicallyAccessibleReDirect.puml │ │ ├── associations.iuml │ │ ├── casUtilisation.puml │ │ ├── common.iuml │ │ ├── overview.puml │ │ └── sequence-ptasks-workers_success.puml │ ├── Pod/ │ │ ├── Cookbook.pod │ │ ├── PSGI.pod │ │ ├── Sample.pod │ │ └── contents.pod │ ├── Pod 6/ │ │ └── S15-unicode.pod │ ├── PogoScript/ │ │ └── squashy.pogo │ ├── Polar/ │ │ ├── gitcloud.polar │ │ └── gitclub.polar │ ├── Pony/ │ │ ├── circle.pony │ │ ├── counter.pony │ │ ├── gups-opt.pony │ │ ├── hello-world.pony │ │ ├── mandelbrot.pony │ │ └── mixed.pony │ ├── Portugol/ │ │ ├── medias.por │ │ └── potencia_raiz.por │ ├── PostCSS/ │ │ ├── sample.pcss │ │ └── sample.postcss │ ├── PostScript/ │ │ ├── lambda.pfa │ │ ├── sierpinski.ps │ │ └── xlogo.epsi │ ├── PowerBuilder/ │ │ ├── TestPBT.pbt │ │ ├── ginpix7.sra │ │ ├── myproject.pbt │ │ ├── n_cst_buttonlistbar_gradient.sru │ │ ├── part1.srw │ │ └── w_export.srw │ ├── PowerShell/ │ │ ├── ZLocation.psd1 │ │ ├── ZLocation.psm1 │ │ ├── history.ps1 │ │ └── pwsh-shebang.ps1 │ ├── Praat/ │ │ ├── dynamicity.praat │ │ ├── queryTable.praat │ │ └── randomiseArticles.praat │ ├── Prisma/ │ │ ├── blog-minimal-schema.prisma │ │ ├── blog-schema-advanced.prisma │ │ ├── mcu-schema.prisma │ │ ├── now-example-schema.prisma │ │ └── schema.prisma │ ├── Processing/ │ │ └── hello.pde │ ├── Procfile/ │ │ └── filenames/ │ │ └── Procfile │ ├── Proguard/ │ │ ├── proguard-rules.pro │ │ ├── proguard-rules2.pro │ │ └── proguard_annotations.pro │ ├── Prolog/ │ │ ├── admin.pl │ │ ├── dleak-report │ │ ├── ex6.pl │ │ ├── format_spec.pl │ │ ├── func.pl │ │ ├── logic-problem.pro │ │ ├── plunit_test_example.plt │ │ ├── queues.yap │ │ ├── test-prolog.prolog │ │ └── turing.pl │ ├── Promela/ │ │ ├── Session.pml │ │ ├── Supervisor.pml │ │ ├── TCP.pml │ │ ├── Thread.pml │ │ ├── attacker_4_FINITE.pml │ │ ├── bare_signals.pml │ │ └── ex.1.pml │ ├── Propeller Spin/ │ │ ├── 4x4 Keypad Reader.spin │ │ ├── Debug_Lcd.spin │ │ ├── Graphics.spin │ │ ├── Inductor.spin │ │ ├── Keyboard.spin │ │ ├── TV.spin │ │ ├── TV_Terminal.spin │ │ ├── TV_Text.spin │ │ ├── VGA.spin │ │ └── VocalTract.spin │ ├── Protocol Buffer/ │ │ └── addressbook.proto │ ├── Protocol Buffer Text Format/ │ │ ├── ProjectSettings.pbt │ │ ├── Tree.pbt │ │ ├── cudnn_benchmarks.textproto │ │ ├── schema.pbtxt │ │ └── submission.txtpb │ ├── Public Key/ │ │ ├── gpg_key.asc │ │ ├── id.pub │ │ ├── id_dsa.asc │ │ ├── id_rsa.asc │ │ ├── id_rsa.pub │ │ ├── sshkey1.asc │ │ └── sunCert.asc │ ├── Pug/ │ │ ├── hello.jade │ │ └── hello.pug │ ├── Puppet/ │ │ ├── apacheinit.pp │ │ ├── expiringhost.pp │ │ ├── hiera_include.pp │ │ ├── stages-example.pp │ │ └── unmanaged-notify-puppet25.pp │ ├── PureBasic/ │ │ ├── Example_Sine.pb │ │ └── Memory.pbi │ ├── PureScript/ │ │ ├── Control.Arrow.purs │ │ ├── Data.Foreign.purs │ │ ├── Data.Map.purs │ │ └── ReactiveJQueryTest.purs │ ├── Pyret/ │ │ └── pyret.arr │ ├── Python/ │ │ ├── AdditiveWave.pyde │ │ ├── Cinema4DPythonPlugin.pyp │ │ ├── MoveEye.pyde │ │ ├── action.cgi │ │ ├── argparse.pyi │ │ ├── backstage.fcgi │ │ ├── django-models-base.py │ │ ├── filenames/ │ │ │ ├── .gclient │ │ │ └── DEPS │ │ ├── flask-view.py │ │ ├── gen-py-linguist-thrift.py │ │ ├── protocol_buffer_pb2.py │ │ ├── py3.py3 │ │ ├── python │ │ ├── python2 │ │ ├── python3 │ │ ├── simpleclient.rpy │ │ ├── spec.linux.spec │ │ ├── standalone.gypi │ │ ├── toolchain.gypi │ │ ├── tornado-httpserver.py │ │ └── uv-download-countries-info │ ├── Q#/ │ │ ├── CustomModAdd.qs │ │ └── Shor.qs │ ├── QML/ │ │ └── common.qbs │ ├── QMake/ │ │ ├── complex.pro │ │ ├── functions.pri │ │ ├── qmake │ │ └── simple.pro │ ├── Qt Script/ │ │ ├── installscript.qs │ │ └── toolchain_installscript.qs │ ├── Quake/ │ │ └── filenames/ │ │ ├── m3makefile │ │ └── m3overrides │ ├── QuakeC/ │ │ ├── slider.qc │ │ └── spawner.qc │ ├── QuickBASIC/ │ │ ├── FGETRT.BAS │ │ ├── InForm.bi │ │ ├── VGAFont.bas │ │ ├── VLONG.BAS │ │ └── sponge4.bas │ ├── R/ │ │ ├── 2.R │ │ ├── R-qgis-extension.rsx │ │ ├── df.residual.r │ │ ├── filenames/ │ │ │ └── expr-dist │ │ ├── git-punchcard │ │ ├── import.Rd │ │ ├── import.r │ │ └── scholar.Rd │ ├── RAML/ │ │ └── api.raml │ ├── RAScript/ │ │ └── example.rascript │ ├── RBS/ │ │ └── cli.rbs │ ├── RDoc/ │ │ └── rdoc.rdoc │ ├── REXX/ │ │ ├── BatchRemapBrushes.pprx │ │ ├── ShapesInfo.rexx │ │ ├── SkrivShape.rexx │ │ └── ag2xml.rexx │ ├── RMarkdown/ │ │ ├── example.qmd │ │ └── example.rmd │ ├── RON/ │ │ └── config.ron │ ├── ROS Interface/ │ │ ├── AboutROSInterfaces.msg │ │ ├── LoadMap.srv │ │ ├── Marker.msg │ │ ├── Marker_ROS1.msg │ │ ├── NavigateThroughPoses.action │ │ ├── ParameterDescriptor.msg │ │ ├── ParameterEventDescriptors.msg │ │ └── Test.msg │ ├── RPC/ │ │ ├── rpc.x │ │ ├── rusers.x │ │ └── yp.x │ ├── RPGLE/ │ │ ├── anilist.sqlrpgle │ │ ├── bfint.sqlrpgle │ │ ├── dspf.rpgle │ │ ├── fizzbuzz.rpgle │ │ ├── ifsread.rpgle │ │ ├── psds.rpgle │ │ ├── qcmdexc_ex.rpgle │ │ ├── sms.sqlrpgle │ │ └── sms_h.rpgle │ ├── RPM Spec/ │ │ ├── apache.spec │ │ ├── erlang-erlydtl.spec │ │ └── manos.spec │ ├── RUNOFF/ │ │ ├── VMS_ZIP.RNH │ │ ├── contributing.rnh │ │ ├── longlib.rno │ │ └── mcp_help.rnh │ ├── Racket/ │ │ ├── 99-bottles-of-beer.scrbl │ │ └── scribble.scrbl │ ├── Ragel/ │ │ ├── ephemeris_parser.rl │ │ ├── simple_scanner.rl │ │ └── simple_tokenizer.rl │ ├── Raku/ │ │ ├── 01-dash-uppercase-i.t │ │ ├── 01-parse.t │ │ ├── A.pm │ │ ├── ANSIColor.pm │ │ ├── Bailador.pm │ │ ├── ContainsUnicode.pm │ │ ├── Exception.pm │ │ ├── List.pm │ │ ├── Model.pm │ │ ├── RoleQ.pm6 │ │ ├── SIL.rakumod │ │ ├── Simple.pm │ │ ├── Win32.pm │ │ ├── advent2009-day16.t │ │ ├── basic-open.t │ │ ├── calendar.t │ │ ├── dynaver.raku │ │ ├── for.t │ │ ├── grammar-test.p6 │ │ ├── hash.t │ │ ├── htmlify.pl │ │ ├── listquote-whitespace.t │ │ ├── man-or-boy.t │ │ └── test.p6 │ ├── Rascal/ │ │ ├── Analyze.rsc │ │ ├── Compile.rsc │ │ ├── ModuleInfo.rsc │ │ ├── RascalModule.rsc │ │ └── Syntax.rsc │ ├── ReScript/ │ │ ├── RedBlackTree.res │ │ └── RedBlackTree.resi │ ├── Readline Config/ │ │ └── filenames/ │ │ └── .inputrc │ ├── Reason/ │ │ ├── JSX.re │ │ ├── Layout.re │ │ ├── Machine.re │ │ ├── SourceSpec.re │ │ ├── SuperMerlin.re │ │ └── Syntax.re │ ├── ReasonLIGO/ │ │ └── FA1.2.religo │ ├── Rebol/ │ │ ├── GCP-datatypes.r │ │ ├── booters.r │ │ ├── hello-world.r2 │ │ ├── hello-world.r3 │ │ ├── hello-world.reb │ │ └── hello-world.rebol │ ├── Record Jar/ │ │ └── filenames/ │ │ └── language-subtag-registry.txt │ ├── Red/ │ │ ├── example.red │ │ └── example.reds │ ├── Redirect Rules/ │ │ └── filenames/ │ │ └── _redirects │ ├── Regular Expression/ │ │ ├── modeline-emacs.regexp │ │ ├── modeline-vim.regexp │ │ ├── ordinal.regex │ │ └── url.regex │ ├── Ren'Py/ │ │ └── example.rpy │ ├── RenderScript/ │ │ ├── convolve3x3.rs │ │ └── scenegraph_objects.rsh │ ├── Rez/ │ │ ├── Rezilla_DITL.r │ │ ├── dialog.r │ │ └── gui_mac.r │ ├── Rich Text Format/ │ │ ├── DesktopTemplateLicense.rtf │ │ └── LICENSE.rtf │ ├── Ring/ │ │ ├── hello.ring │ │ ├── natural.ring │ │ ├── weblib.ring │ │ └── weighthistory.ring │ ├── Riot/ │ │ ├── live-filtering.riot │ │ └── todo.riot │ ├── RobotFramework/ │ │ ├── data_driven.robot │ │ ├── gherkin.robot │ │ ├── keyword_driven.robot │ │ └── keywords.resource │ ├── Roc/ │ │ ├── ParserString.roc │ │ ├── PgCmd.roc │ │ ├── PgProtocolBackend.roc │ │ └── PgSchema.roc │ ├── Rocq Prover/ │ │ ├── Computation.v │ │ ├── Imp.v │ │ ├── JsCorrectness.v │ │ ├── JsInterpreterExtraction.v │ │ ├── JsNumber.v │ │ ├── JsPrettyInterm.v │ │ ├── Lists.v │ │ ├── Main.v │ │ ├── Poly.v │ │ ├── Rel.v │ │ ├── Smallstep.v │ │ ├── Spec.v │ │ └── Stlc.v │ ├── Roff/ │ │ ├── Tcl.n │ │ ├── an-ext.tmac │ │ ├── create_view.l │ │ ├── crude-hack.man │ │ ├── dsw.1x │ │ ├── foo.3p │ │ ├── foo.3pm │ │ ├── fsinterface.ms │ │ ├── he.mdoc │ │ ├── man.1m │ │ ├── printf.3in │ │ ├── qsort.3qt │ │ ├── refs.rno │ │ ├── roff.1in │ │ ├── roff.nr │ │ ├── switch.3m │ │ ├── trekmanual.nr │ │ └── vt.3x │ ├── Roff Manpage/ │ │ ├── URI.3pm │ │ ├── gather_profile_stats.man │ │ ├── lyxclient.1in │ │ ├── pgrep.3p │ │ ├── sched_get_priority_min.3x │ │ ├── sensor_attach.mdoc │ │ ├── sigwait.3qt │ │ ├── tan.3m │ │ ├── tls_config_ocsp_require_stapling.3in │ │ ├── uname.1m │ │ ├── zforce.1x │ │ └── zip_file_add.mdoc │ ├── RouterOS Script/ │ │ ├── BackupAndUpdate.rsc │ │ ├── config.rsc │ │ ├── console-dump.rsc │ │ └── vlans.rsc │ ├── Ruby/ │ │ ├── actionmailer.rbi │ │ ├── address.pdf.prawn │ │ ├── any.spec │ │ ├── filenames/ │ │ │ ├── .irbrc │ │ │ ├── .pryrc │ │ │ ├── .simplecov │ │ │ ├── Appraisals │ │ │ ├── Brewfile │ │ │ ├── Capfile │ │ │ ├── Dangerfile │ │ │ ├── Deliverfile │ │ │ ├── Fastfile │ │ │ ├── Podfile │ │ │ ├── Rakefile │ │ │ ├── Snapfile │ │ │ └── Steepfile │ │ ├── foo.rb │ │ ├── formula.rb │ │ ├── gem_loader.rbi │ │ ├── gen-rb-linguist-thrift.rb │ │ ├── grit.rb │ │ ├── index.json.jbuilder │ │ ├── inflector.rb │ │ ├── jekyll.rb │ │ ├── jenkinsci.pluginspec │ │ ├── macruby │ │ ├── mdata_server.fcgi │ │ ├── rabl.rabl │ │ ├── racc.rb │ │ ├── rails@7.0.3.1.rbi │ │ ├── rendering.rbi │ │ ├── resque.rb │ │ ├── rexpl │ │ ├── ruby │ │ ├── ruby2 │ │ ├── ruby3 │ │ ├── script.rake │ │ ├── shoes-swt │ │ └── sinatra.rb │ ├── Rust/ │ │ ├── base64url │ │ ├── hashmap.rs │ │ ├── main.rs │ │ └── task.rs │ ├── SAS/ │ │ ├── data.sas │ │ ├── detect_phi.sas │ │ └── proc.sas │ ├── SCSS/ │ │ └── screen.scss │ ├── SELinux Policy/ │ │ ├── filenames/ │ │ │ ├── genfs_contexts │ │ │ ├── initial_sids │ │ │ └── security_classes │ │ └── fsck.te │ ├── SMT/ │ │ ├── as-left.z3 │ │ ├── bignum_lia1.smt2 │ │ ├── list4.smt2 │ │ ├── queen10-1.smt2 │ │ └── shufflevector.smt │ ├── SPARQL/ │ │ ├── foaf.sparql │ │ └── string-matching.sparql │ ├── SQF/ │ │ ├── fn_remoteExecFnc.sqf │ │ └── macros.hqf │ ├── SQL/ │ │ ├── AvailableInSearchSel.prc │ │ ├── create_stuff.sql │ │ ├── db.sql │ │ ├── drop_stuff.sql │ │ ├── dual.sql │ │ ├── filial.tab │ │ ├── hostcache_set_state.inc │ │ ├── mysql-sakila-schema.sql │ │ ├── object-update.udf │ │ ├── sqlite-sakila-schema.sql │ │ ├── suspendedtoday.viw │ │ ├── videodb.ddl │ │ └── zipcodes.uk.mysql │ ├── SQLPL/ │ │ ├── check_reorg.sql │ │ ├── comm_amount.db2 │ │ ├── drop_table.db2 │ │ ├── runstats.sql │ │ ├── sleep.sql │ │ └── trigger.sql │ ├── SRecode Template/ │ │ └── linguist.srt │ ├── SSH Config/ │ │ └── filenames/ │ │ ├── ssh-config │ │ ├── ssh_config │ │ ├── sshconfig │ │ ├── sshconfig.snip │ │ ├── sshd-config │ │ └── sshd_config │ ├── STAR/ │ │ ├── schedule.star │ │ ├── schedule_pipeline.star │ │ └── symop.star │ ├── STON/ │ │ ├── Array.ston │ │ ├── Dictionary.ston │ │ ├── Rectangle.ston │ │ ├── TestDomainObject.ston │ │ ├── ZNResponse.ston │ │ ├── methodProperties.ston │ │ └── properties.ston │ ├── SWIG/ │ │ ├── CGAL_AABB_tree.i │ │ ├── constraint_solver.swig │ │ ├── dictionary.i │ │ ├── gauss.i │ │ └── linear_solver.swg │ ├── Sage/ │ │ └── polinomios.sagews │ ├── Sail/ │ │ ├── basics.sail │ │ ├── bitfields.sail │ │ ├── bitvectors.sail │ │ ├── match.sail │ │ ├── riscv_insts_zbb.sail │ │ └── types.sail │ ├── SaltStack/ │ │ ├── eval.sls │ │ ├── gimp.sls │ │ ├── gpg4win-light.sls │ │ ├── openoffice.sls │ │ ├── top.sls │ │ └── truecrypt.sls │ ├── Sass/ │ │ └── screen.sass │ ├── Scala/ │ │ ├── 99-bottles-of-beer │ │ ├── build.sbt │ │ ├── car-ride.kojo │ │ ├── fib-tree.kojo │ │ ├── node11.sc │ │ ├── scala │ │ └── turtle-controller.kojo │ ├── Scaml/ │ │ └── hello.scaml │ ├── Scenic/ │ │ ├── bypassing.scenic │ │ ├── composition.scenic │ │ ├── driving_model.scenic │ │ └── mars.scenic │ ├── Scheme/ │ │ ├── asteroids.sps │ │ ├── basic.sld │ │ ├── common.scm │ │ ├── lambdastar.sls │ │ ├── r7rs.scm │ │ └── sboyer.sch │ ├── Scilab/ │ │ ├── scilab_function.sci │ │ ├── scilab_script.sce │ │ └── scilab_test.tst │ ├── ShaderLab/ │ │ ├── DepthOfField.shader │ │ ├── Fog.shader │ │ └── Uber.shader │ ├── Shell/ │ │ ├── 99-bottles-of-beer │ │ ├── bash │ │ ├── build.command │ │ ├── busybox.trigger │ │ ├── filenames/ │ │ │ ├── .bash_aliases │ │ │ ├── .bash_functions │ │ │ ├── .bash_logout │ │ │ ├── .bash_profile │ │ │ ├── .bashrc │ │ │ ├── .cshrc │ │ │ ├── .envrc │ │ │ ├── .flaskenv │ │ │ ├── .kshrc │ │ │ ├── .login │ │ │ ├── .profile │ │ │ ├── .tmux.conf │ │ │ ├── .xinitrc │ │ │ ├── .xsession │ │ │ ├── .zlogin │ │ │ ├── .zlogout │ │ │ ├── .zprofile │ │ │ ├── .zshenv │ │ │ ├── .zshrc │ │ │ ├── 9fs │ │ │ ├── PKGBUILD │ │ │ ├── bash_aliases │ │ │ ├── bash_logout │ │ │ ├── bash_profile │ │ │ ├── bashrc │ │ │ ├── cshrc │ │ │ ├── gradlew │ │ │ ├── kshrc │ │ │ ├── login │ │ │ ├── man │ │ │ ├── mvnw │ │ │ ├── profile │ │ │ ├── tmux.conf │ │ │ ├── xinitrc │ │ │ ├── xsession │ │ │ ├── zlogin │ │ │ ├── zlogout │ │ │ ├── zprofile │ │ │ ├── zshenv │ │ │ └── zshrc │ │ ├── invalid-shebang.sh │ │ ├── job_array.slurm │ │ ├── mpi_job.slurm │ │ ├── php.fcgi │ │ ├── plugin │ │ ├── rbenv-sh-shell.sh │ │ ├── robbyrussell.zsh-theme │ │ ├── rvm.bash │ │ ├── sbt │ │ ├── script.bash │ │ ├── script.sh │ │ ├── script.zsh │ │ ├── settime.cgi │ │ ├── sh │ │ ├── string-chopping │ │ ├── udev.trigger │ │ ├── valid-shebang.tool │ │ └── zsh │ ├── ShellCheck Config/ │ │ └── filenames/ │ │ └── .shellcheckrc │ ├── ShellSession/ │ │ ├── dollar.sh-session │ │ ├── gem-install.sh-session │ │ └── simple.sh-session │ ├── Shen/ │ │ ├── graph.shen │ │ ├── html.shen │ │ └── json.shen │ ├── Sieve/ │ │ ├── dovecot-archive.sieve │ │ ├── dovecot-flagging.sieve │ │ ├── dovecot-headers.sieve │ │ ├── dovecot-plus.sieve │ │ ├── dovecot-spam1.sieve │ │ ├── dovecot-spam2.sieve │ │ ├── dovecot-spamtest.sieve │ │ ├── dovecot-subaddress.sieve │ │ ├── dovecot-vacation.sieve │ │ ├── dovecot-virustest.sieve │ │ └── wikipedia-example.sieve │ ├── Simple File Verification/ │ │ ├── linguist.sfv │ │ └── openbsd.sfv │ ├── Singularity/ │ │ └── filenames/ │ │ └── Singularity │ ├── Slang/ │ │ ├── buildmip.slang │ │ ├── convert.slang │ │ ├── draw-quad.slang │ │ ├── learnmip.slang │ │ ├── reconstruct.slang │ │ └── train.slang │ ├── Slash/ │ │ └── brainfuck.sl │ ├── Slice/ │ │ ├── Murmur.ice │ │ ├── Test.ice │ │ └── testSlice01.ice │ ├── Slim/ │ │ └── sample.slim │ ├── Slint/ │ │ ├── iot-dashboard.slint │ │ ├── slide_puzzle.slint │ │ └── todo.slint │ ├── SmPL/ │ │ └── atomic_as_refcounter.cocci │ ├── Smali/ │ │ ├── ActionBarDrawerToggle.smali │ │ ├── DoodleMobileAnaylise.smali │ │ ├── ModernAsyncTask.smali │ │ ├── PenguinSprite.smali │ │ ├── Subject.smali │ │ ├── ViewDragHelper.smali │ │ └── WbxmlSerializer.smali │ ├── Smalltalk/ │ │ ├── Booleans.cs │ │ ├── Collections.cs │ │ ├── Dinner.st │ │ ├── TestBasic.st │ │ ├── baselineDependency.st │ │ ├── categories.st │ │ ├── renderSeasideExampleOn..st │ │ ├── scriptWithPragma.st │ │ ├── smallMethod.st │ │ └── testSimpleChainMatches.st │ ├── Smarty/ │ │ ├── header.tpl │ │ └── index.tpl │ ├── Smithy/ │ │ └── weather.smithy │ ├── Snakemake/ │ │ ├── filenames/ │ │ │ └── Snakefile │ │ ├── snakemake-calling.smk │ │ ├── snakemake-mapping.smk │ │ └── template.snakefile │ ├── Soong/ │ │ └── filenames/ │ │ └── Android.bp │ ├── SourcePawn/ │ │ ├── bhopstats.inc │ │ ├── foo.sp │ │ └── shavit.inc │ ├── Squirrel/ │ │ └── Squirrel.nut │ ├── Stan/ │ │ ├── congress.stan │ │ ├── dogs.stan │ │ └── schools.stan │ ├── Standard ML/ │ │ ├── Foo.ML │ │ ├── Foo.sig │ │ ├── Foo.sml │ │ ├── RedBlackTree.fun │ │ └── main.fun │ ├── Starlark/ │ │ ├── closure_js_binary.bzl │ │ ├── drone.star │ │ ├── filenames/ │ │ │ ├── BUCK │ │ │ ├── BUILD │ │ │ ├── BUILD.bazel │ │ │ ├── MODULE.bazel │ │ │ ├── Tiltfile │ │ │ ├── WORKSPACE │ │ │ ├── WORKSPACE.bazel │ │ │ └── WORKSPACE.bzlmod │ │ └── release.star │ ├── Stata/ │ │ ├── common.doh │ │ ├── hello.ado │ │ ├── include.ihlp │ │ ├── limits.matah │ │ ├── odkmeta.sthlp │ │ ├── regress_example.do │ │ └── tanh.mata │ ├── StringTemplate/ │ │ └── ApiOverviewPage.st │ ├── Stylus/ │ │ └── demo.styl │ ├── SubRip Text/ │ │ └── Adding.NCL.Language.S01E01.1080p.BluRay.x264.srt │ ├── SugarSS/ │ │ └── sample.sss │ ├── SuperCollider/ │ │ ├── WarpPreset.sc │ │ ├── WarpTate.sc │ │ ├── WarpTrack.sc │ │ ├── WarpUtil.sc │ │ └── example.scd │ ├── SurrealQL/ │ │ ├── aggregate-view.surql │ │ ├── expressions.surql │ │ └── schema.surql │ ├── Survex data/ │ │ └── data.svx │ ├── Svelte/ │ │ └── TodoMVC.svelte │ ├── Sway/ │ │ ├── arrays.sw │ │ ├── generic_traits.sw │ │ ├── struct_fns.sw │ │ ├── supertraits.sw │ │ └── wallet.sw │ ├── Sweave/ │ │ ├── knitr-beamer.Rnw │ │ └── knitr-minimal.Rnw │ ├── Swift/ │ │ ├── section-11.swift │ │ ├── section-13.swift │ │ ├── section-15.swift │ │ ├── section-17.swift │ │ ├── section-19.swift │ │ ├── section-21.swift │ │ ├── section-23.swift │ │ ├── section-25.swift │ │ ├── section-27.swift │ │ ├── section-29.swift │ │ ├── section-3.swift │ │ ├── section-31.swift │ │ ├── section-33.swift │ │ ├── section-35.swift │ │ ├── section-37.swift │ │ ├── section-39.swift │ │ ├── section-41.swift │ │ ├── section-43.swift │ │ ├── section-45.swift │ │ ├── section-47.swift │ │ ├── section-49.swift │ │ ├── section-5.swift │ │ ├── section-51.swift │ │ ├── section-53.swift │ │ ├── section-55.swift │ │ ├── section-57.swift │ │ ├── section-59.swift │ │ ├── section-61.swift │ │ ├── section-63.swift │ │ ├── section-65.swift │ │ ├── section-67.swift │ │ ├── section-69.swift │ │ ├── section-7.swift │ │ ├── section-71.swift │ │ ├── section-73.swift │ │ ├── section-75.swift │ │ ├── section-77.swift │ │ ├── section-79.swift │ │ ├── section-81.swift │ │ ├── section-83.swift │ │ ├── section-85.swift │ │ ├── section-87.swift │ │ └── section-9.swift │ ├── SystemVerilog/ │ │ ├── endpoint_phy_wrapper.svh │ │ ├── fifo.sv │ │ ├── priority_encoder.sv │ │ └── util.vh │ ├── TI Program/ │ │ ├── CIRCLES.8xp │ │ ├── CLOCK.8xp │ │ ├── cowsource.8xp │ │ ├── srcalpha.8xp.txt │ │ ├── srcfunc.8xp.txt │ │ ├── srcgui.8xp.txt │ │ └── srcsort.8xp.txt │ ├── TL-Verilog/ │ │ ├── calculator_kernel.tlv │ │ └── warp-v_config.tlv │ ├── TLA/ │ │ ├── AsyncInterface.tla │ │ └── fifo.tla │ ├── TMDL/ │ │ └── Current page.tmdl │ ├── TOML/ │ │ ├── Cargo.toml │ │ ├── audit.toml.example │ │ └── filenames/ │ │ ├── Cargo.toml.orig │ │ └── Pipfile │ ├── TSPLIB data/ │ │ ├── att48.tsp │ │ └── dantzig42.tsp │ ├── TSQL/ │ │ ├── cursor.sql │ │ ├── logical.sql │ │ ├── storedprocedure.sql │ │ └── uniqueidentifier.sql │ ├── TSV/ │ │ ├── input.tsv │ │ ├── merged1.vcf │ │ └── z.vcf │ ├── TSX/ │ │ ├── import.tsx │ │ ├── react-native.tsx │ │ ├── require.tsx │ │ └── triple-slash-reference.tsx │ ├── TXL/ │ │ └── Cal.txl │ ├── Tact/ │ │ ├── deployable_counter.tact │ │ └── jetton.tact │ ├── Talon/ │ │ ├── find_and_replace.talon │ │ └── line_commands.talon │ ├── Tcl/ │ │ ├── constraints.sdc │ │ ├── constraints.xdc │ │ ├── filenames/ │ │ │ ├── owh │ │ │ └── starfield │ │ ├── init.tcl.in │ │ ├── stream-0.1.tm │ │ └── xdgbasedir-0.3.tm │ ├── Tcsh/ │ │ └── regtest_nmmnest.csh │ ├── TeX/ │ │ ├── authortitle.cbx │ │ ├── beispiel.toc │ │ ├── english.lbx │ │ ├── perl.toc │ │ ├── problemset.cls │ │ ├── reedthesis.cls │ │ └── verbose.bbx │ ├── Tea/ │ │ └── foo.tea │ ├── Teal/ │ │ ├── Emitter.tl │ │ └── teal-cyan-example.tl │ ├── Terra/ │ │ ├── arith.t │ │ ├── arrayt.t │ │ └── benchmark_nbody.t │ ├── Terraform Template/ │ │ ├── donors.tftpl │ │ └── policy.tftpl │ ├── Texinfo/ │ │ └── protocol-spec.texi │ ├── Text/ │ │ ├── aptitude-defaults.nb │ │ ├── filenames/ │ │ │ ├── COPYING.regex │ │ │ ├── LICENSE.mysql │ │ │ ├── README.me │ │ │ ├── README.mysql │ │ │ ├── README.nss │ │ │ ├── click.me │ │ │ ├── delete.me │ │ │ ├── keep.me │ │ │ ├── package.mask │ │ │ ├── package.use.mask │ │ │ ├── package.use.stable.mask │ │ │ ├── read.me │ │ │ ├── readme.1st │ │ │ ├── test.me │ │ │ ├── use.mask │ │ │ └── use.stable.mask │ │ ├── foo.txt │ │ ├── mac.txt │ │ ├── messages.fr │ │ ├── min-help.ncl │ │ ├── readme.txt │ │ ├── rmMonAnnCycLLT-help.ncl │ │ ├── tutor.nb │ │ ├── tutor.no │ │ └── zonalAve-help.ncl │ ├── TextGrid/ │ │ ├── part_of_speech.TextGrid │ │ ├── three_tiers.TextGrid │ │ └── words.TextGrid │ ├── TextMate Properties/ │ │ └── filenames/ │ │ └── .tm_properties │ ├── Thrift/ │ │ └── linguist.thrift │ ├── Toit/ │ │ ├── chatbot.toit │ │ ├── logger.toit │ │ └── one_wire.toit │ ├── Tor Config/ │ │ └── filenames/ │ │ └── torrc │ ├── Tree-sitter Query/ │ │ ├── asm_highlights.scm │ │ ├── asm_injections.scm │ │ ├── basic.scm │ │ ├── func_highlights.scm │ │ ├── highlights.scm │ │ ├── injections.scm │ │ ├── tags.scm │ │ └── tlaplus_highlights.scm │ ├── Turing/ │ │ ├── BlockTower.t │ │ ├── simplegame.t │ │ ├── start.t │ │ └── turing.t │ ├── Turtle/ │ │ ├── gnd-record.ttl │ │ └── rdf-syntax-grammar.ttl │ ├── Type Language/ │ │ ├── builtin.tl │ │ └── scheme.tl │ ├── TypeScript/ │ │ ├── cache.ts │ │ ├── classes.ts │ │ ├── conditionParser.mts │ │ ├── hello.ts │ │ ├── promisified_cp.cts │ │ └── proto.ts │ ├── TypeSpec/ │ │ ├── json-schema.tsp │ │ └── petstore.tsp │ ├── Typst/ │ │ ├── fiction.typ │ │ └── letter.typ │ ├── Unity3D Asset/ │ │ ├── GapTile.mat │ │ ├── Hover.anim │ │ ├── Tiles.meta │ │ ├── TimeManager.asset │ │ ├── canvas_Fullscreen_Fader.prefab │ │ └── handFingers.mask │ ├── Unix Assembly/ │ │ ├── asm.S │ │ ├── boot.S │ │ ├── gemm_kernel_1x4.S │ │ ├── hello.ms │ │ ├── hello.s │ │ └── support.S │ ├── Uno/ │ │ ├── PlayerPads.uno │ │ ├── Pong.uno │ │ └── TowerBlock.uno │ ├── UnrealScript/ │ │ ├── MutU2Weapons.uc │ │ └── US3HelloWorld.uc │ ├── Untyped Plutus Core/ │ │ ├── add_numbers.uplc │ │ └── always_true.uplc │ ├── UrWeb/ │ │ ├── iso8601.ur │ │ └── parse.urs │ ├── V/ │ │ ├── json.v │ │ ├── links_scraper.v │ │ ├── log.v │ │ ├── loop.v │ │ ├── nbody.v │ │ ├── news_fetcher.v │ │ ├── rune.v │ │ ├── spectral.v │ │ └── terminal_control.v │ ├── VBA/ │ │ ├── ErrorHandling.bas │ │ ├── QuickCards.bas │ │ ├── WorkbookReporter.cls │ │ ├── WorksheetView.cls │ │ ├── d_WordCmds.bas │ │ ├── dictionary.cls │ │ ├── frmConvert.frm │ │ ├── procedures.vba │ │ ├── specs.bas │ │ └── stdSaveHandler.frm │ ├── VBScript/ │ │ └── v_Data_ArrayList.vbs │ ├── VCL/ │ │ ├── varnish2_default.vcl │ │ └── varnish3_default.vcl │ ├── VHDL/ │ │ └── foo.vhd │ ├── Valve Data Format/ │ │ └── gameinfo.vdf │ ├── Velocity Template Language/ │ │ ├── Mutation.updatePic.req.vtl │ │ ├── gateway-dynamo.vtl │ │ └── index.vtl │ ├── Vento/ │ │ └── index.vto │ ├── Verilog/ │ │ ├── button_debounce.v │ │ ├── control.v │ │ ├── encrypted_module.v │ │ ├── hex_display.v │ │ ├── module_stub.v │ │ ├── mux.v │ │ ├── pipeline_registers.v │ │ ├── ps2_mouse.v │ │ ├── ram.v │ │ ├── sha-256-functions.v │ │ ├── sign_extender.v │ │ ├── sqrt_pipelined.v │ │ ├── t_button_debounce.v │ │ ├── t_div_pipelined.v │ │ ├── t_sqrt_pipelined.v │ │ └── vga.v │ ├── Vim Help File/ │ │ └── modeline.txt │ ├── Vim Script/ │ │ ├── filenames/ │ │ │ ├── .exrc │ │ │ ├── .gvimrc │ │ │ ├── .nvimrc │ │ │ ├── .vimrc │ │ │ └── _vimrc │ │ ├── settings.vimrc │ │ ├── solarized.vim │ │ ├── textobj-rubyblock.vba │ │ └── todo.vmb │ ├── Vim Snippet/ │ │ ├── vim.snip │ │ └── vim.snippets │ ├── Visual Basic .NET/ │ │ ├── Index.vbhtml │ │ ├── Module1.vb │ │ └── VBAllInOne.vb │ ├── Visual Basic 6.0/ │ │ ├── Adjustments_BlackAndWhite.frm │ │ ├── DataReport1.Dsr │ │ ├── Module1.bas │ │ ├── Module2.bas │ │ ├── UIListBox.ctl │ │ ├── Wizard.Dsr │ │ ├── cApplication.cls │ │ ├── clsDataPack.cls │ │ ├── clsMenuImage.cls │ │ ├── frmProcMan.frm │ │ └── modFrm.bas │ ├── Volt/ │ │ └── tesla.volt │ ├── Vue/ │ │ ├── basic.vue │ │ └── pre-processors.vue │ ├── Vyper/ │ │ ├── ERC20.vy │ │ ├── ERC721.vy │ │ ├── ballot.vy │ │ ├── crowdfund.vy │ │ └── name_registry.vy │ ├── WDL/ │ │ ├── fq.wdl │ │ ├── hello.wdl │ │ ├── ifs_in_scatters.wdl │ │ └── passingfiles.wdl │ ├── WGSL/ │ │ └── animate_shader.wgsl │ ├── Wavefront Material/ │ │ ├── dice.mtl │ │ ├── ripple.mtl │ │ ├── shapes.mtl │ │ └── spline.mtl │ ├── Wavefront Object/ │ │ ├── dice.obj │ │ ├── random.obj │ │ ├── ripple.obj │ │ ├── shapes.obj │ │ └── spline.obj │ ├── Web Ontology Language/ │ │ └── sample.owl │ ├── WebAssembly/ │ │ ├── add.wat │ │ ├── fibonacci.wat │ │ ├── imported-min.wast │ │ ├── local-cse.wast │ │ ├── print.wat │ │ └── remove-unused-brs_shrink-level=1_ignore-implicit-traps.wast │ ├── WebAssembly Interface Type/ │ │ └── wasi-io.wit │ ├── WebIDL/ │ │ ├── AnimationEvent.webidl │ │ └── Fetch.webidl │ ├── WebVTT/ │ │ ├── Godfather-Restaurant-Scene.vtt │ │ ├── Russian-Sleep-Experiment.vtt │ │ └── example.vtt │ ├── Wget Config/ │ │ └── filenames/ │ │ └── .wgetrc │ ├── Whiley/ │ │ ├── conway.whiley │ │ ├── minesweeper.whiley │ │ └── option.whiley │ ├── Wikitext/ │ │ ├── README.wiki │ │ └── mediawiki.mediawiki │ ├── Win32 Message File/ │ │ └── logmess.mc │ ├── Windows Registry Entries/ │ │ └── sample.reg │ ├── Witcher Script/ │ │ ├── achievement_stats.ws │ │ └── npc_interaction.ws │ ├── Wolfram Language/ │ │ ├── HeyexImport.m │ │ ├── Init.m │ │ ├── MiscCalculations.nb │ │ ├── MiscCalculations2.nb │ │ ├── PacletInfo.m │ │ ├── Predicates.m │ │ ├── Predicates.wl │ │ ├── Problem12.m │ │ ├── TestArithmetic.mt │ │ ├── TestString.mt │ │ ├── TestSuite.mt │ │ ├── UnitTest.wlt │ │ ├── configure-jupyter.wls │ │ └── install_dependencies.wls │ ├── Wollok/ │ │ ├── pepita.wlk │ │ └── piratas.wlk │ ├── World of Warcraft Addon Data/ │ │ ├── addon.toc │ │ ├── lingua.toc │ │ └── linguist.toc │ ├── Wren/ │ │ └── main.wren │ ├── X BitMap/ │ │ └── image.xbm │ ├── X Font Directory Index/ │ │ └── filenames/ │ │ ├── encodings.dir │ │ ├── fonts.alias │ │ ├── fonts.dir │ │ └── fonts.scale │ ├── X PixMap/ │ │ ├── cc-public_domain_mark_white.pm │ │ └── stick-unfocus.xpm │ ├── X10/ │ │ ├── ArraySum.x10 │ │ ├── Cancellation.x10 │ │ ├── Fibonacci.x10 │ │ ├── HeatTransfer_v0.x10 │ │ ├── HeatTransfer_v1.x10 │ │ ├── HelloWholeWorld.x10 │ │ ├── HelloWorld.x10 │ │ ├── Histogram.x10 │ │ ├── Integrate.x10 │ │ ├── KMeans.x10 │ │ ├── KMeansDist.x10 │ │ ├── KMeansDistPlh.x10 │ │ ├── KMeansSPMD.x10 │ │ ├── MontyPi.x10 │ │ ├── NQueensDist.x10 │ │ ├── NQueensPar.x10 │ │ ├── QSort.x10 │ │ └── StructSpheres.x10 │ ├── XC/ │ │ └── main.xc │ ├── XCompose/ │ │ └── filenames/ │ │ └── XCompose │ ├── XML/ │ │ ├── 01_top.ncl │ │ ├── Application.xib │ │ ├── CSharpVSPackage.vstemplate │ │ ├── Case.workflow │ │ ├── Deep_Ocean.icls │ │ ├── Default.props │ │ ├── Demo.sfproj │ │ ├── Example.mdpolicy │ │ ├── Example.mojo │ │ ├── FXMLSample.fxml │ │ ├── GMOculus.project.gmx │ │ ├── HITSP_C32.sch │ │ ├── JSBrowser.jsproj │ │ ├── MDM.adml │ │ ├── MDM.admx │ │ ├── MainView.axaml │ │ ├── MainView.ux │ │ ├── MyApp.ux │ │ ├── NDepends_Example.ndproj │ │ ├── Robots.slnx │ │ ├── Storyboard.storyboard │ │ ├── Strings.resx │ │ ├── System.Buffers.pkgproj │ │ ├── WebElement.rs │ │ ├── Win64.pubxml │ │ ├── XmlIO.pluginspec │ │ ├── battlescribe.gst │ │ ├── chrome.natvis │ │ ├── cloudconfig.cscfg │ │ ├── clouddef.csdef │ │ ├── configdef.cscfg │ │ ├── csproj-sample.csproj │ │ ├── demo.hzp │ │ ├── dependency-example.depproj │ │ ├── example-sharedproj.shproj │ │ ├── example.ccproj │ │ ├── example.typ │ │ ├── filenames/ │ │ │ └── .cproject │ │ ├── fsproj-sample.fsproj │ │ ├── holobloc-sample.res │ │ ├── intellij.iml │ │ ├── libsomething.dll.config │ │ ├── main.ncl │ │ ├── module.ant │ │ ├── module.ivy │ │ ├── msbuild-example.proj │ │ ├── namespace-strict.sch │ │ ├── net_docfile.xml │ │ ├── nproj-sample.nproj │ │ ├── oasis-table.sch │ │ ├── obj_control.object.gmx │ │ ├── phpunit.xml.dist │ │ ├── point-3.1.gml │ │ ├── point-3.2.gml │ │ ├── psd-data.xmp │ │ ├── pt_BR.ts │ │ ├── pt_BR.xml │ │ ├── racoon.mjml │ │ ├── real-estate.mjml │ │ ├── receiver.ncl │ │ ├── route-gas-works-lake-union-loop.gpx │ │ ├── sample.csl │ │ ├── sample.nuspec │ │ ├── sample.targets │ │ ├── some-ideas.mm │ │ ├── source.extension.vsixmanifest │ │ ├── src.builds │ │ ├── switch-configuration-example.sw │ │ ├── tei-odd-sample.odd │ │ ├── translation_en3.ts │ │ ├── vbproj-sample.vbproj │ │ ├── vcxproj-sample.vcxproj │ │ ├── vcxproj-sample.vcxproj.filters │ │ ├── water.tsx │ │ ├── wixdemo.wixproj │ │ ├── xhtml-struct-1.mod │ │ └── xquery-tutorial.xspec │ ├── XML Property List/ │ │ ├── And.tmSnippet │ │ ├── Completion.tmCommand │ │ ├── Folding.tmPreferences │ │ ├── Man.tmLanguage │ │ ├── SpaceCadet.tmTheme │ │ ├── ff-man.plist │ │ ├── info.min.plist │ │ ├── info.plist │ │ ├── man.plist │ │ └── widget.stTheme │ ├── XPages/ │ │ ├── navbar.xsp-config │ │ └── navbar.xsp.metadata │ ├── XProc/ │ │ └── xproc.xpl │ ├── XQuery/ │ │ └── xproc.xqm │ ├── XS/ │ │ └── CommonMark.xs │ ├── XSLT/ │ │ └── test.xslt │ ├── Xmake/ │ │ └── filenames/ │ │ └── xmake.lua │ ├── Xojo/ │ │ ├── App.xojo_code │ │ ├── BillingReport.xojo_report │ │ ├── MainMenuBar.xojo_menu │ │ ├── MyToolbar.xojo_toolbar │ │ ├── Window1.xojo_window │ │ └── database.xojo_script │ ├── Xonsh/ │ │ └── rever.xsh │ ├── Xtend/ │ │ ├── BasicExpressions.xtend │ │ └── Movies.xtend │ ├── YAML/ │ │ ├── 229Q.yaml │ │ ├── Ansible.YAML-tmLanguage │ │ ├── HexInspect.sublime-syntax │ │ ├── coredns.yaml.sed │ │ ├── database.yml.mysql │ │ ├── expected-floating-point-literal.mir │ │ ├── filenames/ │ │ │ ├── .clang-format │ │ │ ├── .clang-tidy │ │ │ ├── .clangd │ │ │ ├── .gemrc │ │ │ └── CITATION.cff │ │ ├── source.r-console.syntax │ │ └── vcr_cassette.yml │ ├── YANG/ │ │ └── sfc-lisp-impl.yang │ ├── YARA/ │ │ ├── OfExample.yar │ │ ├── example.yara │ │ └── true.yar │ ├── YASnippet/ │ │ ├── font-face.yasnippet │ │ └── stdin.yasnippet │ ├── Yacc/ │ │ └── calc.yy │ ├── Yul/ │ │ ├── contract.yul │ │ └── erc20.yul │ ├── ZAP/ │ │ └── planetfall.zap │ ├── ZIL/ │ │ └── misc.zil │ ├── Zeek/ │ │ ├── example.zeek │ │ ├── main.bro │ │ └── main.zeek │ ├── ZenScript/ │ │ └── sample.zs │ ├── Zephir/ │ │ ├── Cblock.zep │ │ └── Router.zep │ ├── Zig/ │ │ ├── build.zig.zon │ │ ├── cat.zig │ │ ├── guess_number.zig │ │ └── hello.zig │ ├── Zimpl/ │ │ └── sample.zmpl │ ├── Zmodel/ │ │ ├── blog.zmodel │ │ ├── saas.zmodel │ │ └── todo.zmodel │ ├── cURL Config/ │ │ └── filenames/ │ │ └── .curlrc │ ├── crontab/ │ │ └── filenames/ │ │ └── crontab │ ├── desktop/ │ │ ├── example.desktop │ │ └── nebula.service │ ├── dircolors/ │ │ └── sample.dircolors │ ├── eC/ │ │ └── Designer.ec │ ├── edn/ │ │ └── bigger-than-pluto.edn │ ├── fish/ │ │ ├── config.fish │ │ ├── eval.fish │ │ └── funced.fish │ ├── hoon/ │ │ ├── canvas.hoon │ │ └── eyre.hoon │ ├── iCalendar/ │ │ ├── 2024.ics │ │ └── todo-2.ical │ ├── jq/ │ │ ├── builtin.jq │ │ └── sample.jq │ ├── kvlang/ │ │ └── showcase.kv │ ├── mIRC Script/ │ │ ├── AutoHostmeBot.mrc │ │ ├── torncity-apiprofile.mrc │ │ ├── torncity-tcbot.mrc │ │ └── torncity-tsspy.mrc │ ├── mcfunction/ │ │ └── showcase.mcfunction │ ├── mdsvex/ │ │ └── Stores.svx │ ├── nanorc/ │ │ ├── filenames/ │ │ │ ├── .nanorc │ │ │ └── nanorc │ │ └── nanorc.nanorc │ ├── q/ │ │ ├── ml.q │ │ └── tq.q │ ├── reStructuredText/ │ │ └── HACKING.rst.txt │ ├── robots.txt/ │ │ └── filenames/ │ │ └── robots.txt │ ├── sed/ │ │ └── hanoi.sed │ ├── templ/ │ │ └── posts.templ │ ├── vCard/ │ │ ├── forrest-gump.vcf │ │ └── vcard.vcf │ ├── wisp/ │ │ └── intro.wisp │ └── xBase/ │ ├── sample.ch │ ├── sample.prg │ └── sample.prw ├── script/ │ ├── add-grammar │ ├── bootstrap │ ├── build-grammars-tarball │ ├── cibuild │ ├── cross-validation │ ├── fast-submodule-update │ ├── grammar-compiler │ ├── list-grammars │ ├── normalise-url │ ├── sort-submodules │ └── update-ids ├── test/ │ ├── fixtures/ │ │ ├── ActionScript/ │ │ │ ├── Functional.as │ │ │ ├── GlobalVariables.as │ │ │ ├── ImportAll.as │ │ │ ├── Intrinsic.as │ │ │ ├── Minimal.as │ │ │ └── Versioning.as │ │ ├── Binary/ │ │ │ ├── cube.stl │ │ │ ├── dog.o │ │ │ ├── foo bar.jar │ │ │ ├── git.deb │ │ │ ├── github.po │ │ │ ├── hello.pbc │ │ │ ├── octocat.ai │ │ │ ├── octocat.psd │ │ │ └── zip │ │ ├── C/ │ │ │ ├── image.c │ │ │ └── image.h │ │ ├── CMake/ │ │ │ └── CMakeLists.txt │ │ ├── CoffeeScript/ │ │ │ └── Cakefile │ │ ├── Data/ │ │ │ ├── Manpages/ │ │ │ │ ├── bsdmalloc.3malloc │ │ │ │ ├── dirent.h.0p │ │ │ │ ├── linguist.1gh │ │ │ │ ├── test.1.in │ │ │ │ ├── test.2.in │ │ │ │ ├── test.3.in │ │ │ │ ├── test.4.in │ │ │ │ ├── test.5.in │ │ │ │ ├── test.6.in │ │ │ │ ├── test.7.in │ │ │ │ ├── test.8.in │ │ │ │ ├── test.9.in │ │ │ │ ├── test.man.in │ │ │ │ └── test.mdoc.in │ │ │ ├── Modelines/ │ │ │ │ ├── example_smalltalk.md │ │ │ │ ├── fundamentalEmacs.c │ │ │ │ ├── iamjs.pl │ │ │ │ ├── iamjs2.pl │ │ │ │ ├── iamphp.inc │ │ │ │ ├── not_perl.pl │ │ │ │ ├── ruby │ │ │ │ ├── ruby10 │ │ │ │ ├── ruby11 │ │ │ │ ├── ruby12 │ │ │ │ ├── ruby2 │ │ │ │ ├── ruby3 │ │ │ │ ├── ruby4 │ │ │ │ ├── ruby5 │ │ │ │ ├── ruby6 │ │ │ │ ├── ruby7 │ │ │ │ ├── ruby8 │ │ │ │ ├── ruby9 │ │ │ │ ├── seeplusplus │ │ │ │ ├── seeplusplusEmacs1 │ │ │ │ ├── seeplusplusEmacs10 │ │ │ │ ├── seeplusplusEmacs11 │ │ │ │ ├── seeplusplusEmacs12 │ │ │ │ ├── seeplusplusEmacs2 │ │ │ │ ├── seeplusplusEmacs3 │ │ │ │ ├── seeplusplusEmacs4 │ │ │ │ ├── seeplusplusEmacs5 │ │ │ │ ├── seeplusplusEmacs6 │ │ │ │ ├── seeplusplusEmacs7 │ │ │ │ ├── seeplusplusEmacs8 │ │ │ │ └── seeplusplusEmacs9 │ │ │ ├── README │ │ │ ├── blank │ │ │ ├── defu.nkt │ │ │ ├── iso8859-8-i │ │ │ ├── md │ │ │ ├── txt │ │ │ ├── utf16le │ │ │ └── utf16le-windows │ │ ├── Dockerfile/ │ │ │ └── Dockerfile │ │ ├── Generated/ │ │ │ ├── ABM8G.mod │ │ │ ├── Haxe/ │ │ │ │ ├── Main.cpp │ │ │ │ ├── Main.cs │ │ │ │ ├── Main.h │ │ │ │ ├── Main.java │ │ │ │ ├── Main.php │ │ │ │ ├── main.js │ │ │ │ ├── main.lua │ │ │ │ └── main.py │ │ │ ├── inline.css │ │ │ ├── inline.js │ │ │ ├── linked.css │ │ │ ├── ms2.mod │ │ │ ├── options_main.inherited.yy │ │ │ └── ppport.h │ │ ├── Generic/ │ │ │ ├── 1/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── as.1 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── npm.1 │ │ │ │ └── Text/ │ │ │ │ └── ellipses.1 │ │ │ ├── 2/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── fstat.2 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── sched_yield.2 │ │ │ │ └── Text/ │ │ │ │ └── foo.2 │ │ │ ├── 3/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── pow.3 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── wcsftime.3 │ │ │ │ └── Text/ │ │ │ │ └── wise-men.3 │ │ │ ├── 4/ │ │ │ │ ├── Roff/ │ │ │ │ │ ├── cat.4 │ │ │ │ │ └── sample.4 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── vio.4 │ │ │ │ └── Text/ │ │ │ │ └── fantastic.4 │ │ │ ├── 5/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── core.5 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── wsconsctl.conf.5 │ │ │ │ └── Text/ │ │ │ │ └── fingers.5 │ │ │ ├── 6/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── moo.6 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── wump.6 │ │ │ │ └── Text/ │ │ │ │ └── 66.6 │ │ │ ├── 7/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── greek.7 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── jg-coding-style.7 │ │ │ │ └── Text/ │ │ │ │ └── samurai.7 │ │ │ ├── 8/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── ino.8 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── wsconsctl.8 │ │ │ │ └── Text/ │ │ │ │ └── the-hateful.8 │ │ │ ├── 9/ │ │ │ │ ├── Roff/ │ │ │ │ │ └── vs.9 │ │ │ │ ├── Roff Manpage/ │ │ │ │ │ └── vwakeup.9 │ │ │ │ └── Text/ │ │ │ │ └── muses.9 │ │ │ ├── app/ │ │ │ │ ├── Erlang/ │ │ │ │ │ └── regular.app │ │ │ │ └── nil/ │ │ │ │ └── ignored.app │ │ │ ├── cmp/ │ │ │ │ ├── Gerber Image/ │ │ │ │ │ └── gerber1.cmp │ │ │ │ └── nil/ │ │ │ │ └── ignored1.cmp │ │ │ ├── msg/ │ │ │ │ ├── OMNeT++ MSG/ │ │ │ │ │ └── GptpPacket.msg │ │ │ │ └── ROS Interface/ │ │ │ │ └── Marker.msg │ │ │ ├── sol/ │ │ │ │ ├── Gerber Image/ │ │ │ │ │ ├── gerber1.sol │ │ │ │ │ └── gerber2.sol │ │ │ │ ├── Solidity/ │ │ │ │ │ ├── legacy1.sol │ │ │ │ │ ├── legacy2.sol │ │ │ │ │ └── modern.sol │ │ │ │ └── nil/ │ │ │ │ ├── ignored1.sol │ │ │ │ └── ignored2.sol │ │ │ ├── stl/ │ │ │ │ ├── STL/ │ │ │ │ │ ├── cube1.stl │ │ │ │ │ ├── cube2.stl │ │ │ │ │ └── cube3.stl │ │ │ │ └── nil/ │ │ │ │ ├── coords.stl │ │ │ │ ├── invalid1.stl │ │ │ │ ├── invalid2.stl │ │ │ │ └── unrelated.stl │ │ │ ├── tag/ │ │ │ │ ├── Java Server Pages/ │ │ │ │ │ └── skeleton_page.tag │ │ │ │ └── nil/ │ │ │ │ └── ignored.tag │ │ │ └── url/ │ │ │ ├── INI/ │ │ │ │ ├── extended.url │ │ │ │ ├── frameset.url │ │ │ │ ├── minimal.http.url │ │ │ │ ├── minimal.mailto.url │ │ │ │ ├── other-fields.url │ │ │ │ └── 绿盟.url │ │ │ └── nil/ │ │ │ ├── broken-assignment.url │ │ │ ├── broken-header.url │ │ │ ├── broken-section.url │ │ │ └── literal.url │ │ ├── HTML/ │ │ │ ├── attr-swapped.html │ │ │ ├── extra-attr.html │ │ │ ├── extra-spaces.html │ │ │ ├── extra-tags.html │ │ │ ├── grohtml.html │ │ │ ├── grohtml.xhtml │ │ │ ├── makeinfo.html │ │ │ ├── mandoc.html │ │ │ ├── no-content.html │ │ │ ├── node78.html │ │ │ ├── org-mode.html │ │ │ ├── quotes-double.html │ │ │ ├── quotes-none.html │ │ │ ├── quotes-single.html │ │ │ ├── ronn.html │ │ │ ├── unknown.html │ │ │ └── uppercase.html │ │ ├── MATLAB/ │ │ │ └── colorspace.m │ │ ├── Makefile/ │ │ │ └── Makefile │ │ ├── Maven POM/ │ │ │ └── pom.xml │ │ ├── Perl/ │ │ │ ├── 01-methods.pl │ │ │ └── Module.pm │ │ ├── Python/ │ │ │ └── run_tests.module │ │ ├── Raku/ │ │ │ └── chromosome.pl │ │ ├── Ruby/ │ │ │ └── foo.rb │ │ ├── Rust/ │ │ │ └── .sqlx/ │ │ │ └── query-2b8b1aae3740a05cb7179be9c7d5af30e8362c3cba0b07bc18fa32ff1a2232cc.json │ │ ├── SQL/ │ │ │ ├── set_at_at.sql │ │ │ └── sysdate.sql │ │ ├── Shell/ │ │ │ ├── _bashrc │ │ │ ├── ash-env │ │ │ ├── crossbuild_liblua5.1 │ │ │ ├── dash-env │ │ │ ├── graylog2-server.init.d │ │ │ ├── ksh-env │ │ │ ├── mintleaf.module │ │ │ ├── mksh │ │ │ ├── pdksh-env │ │ │ └── sh │ │ ├── Text/ │ │ │ ├── 2.1.3 │ │ │ ├── ISO-2022-KR.txt │ │ │ └── output.2 │ │ ├── TypeScript/ │ │ │ └── main │ │ ├── VBA/ │ │ │ └── sample.bas │ │ ├── XML/ │ │ │ ├── AssertionIDRequestOptionalAttributes.xml.svn-base │ │ │ └── app.config │ │ └── go/ │ │ └── food_vendor/ │ │ └── candy.go │ ├── helper.rb │ ├── test_basic_instrumenter.rb │ ├── test_blob.rb │ ├── test_classifier.rb │ ├── test_cli_integration.rb │ ├── test_file_blob.rb │ ├── test_generated.rb │ ├── test_grammars.rb │ ├── test_heuristics.rb │ ├── test_instrumentation.rb │ ├── test_language.rb │ ├── test_pedantic.rb │ ├── test_repository.rb │ ├── test_samples.rb │ ├── test_sha256.rb │ ├── test_strategies.rb │ └── test_tokenizer.rb ├── tools/ │ └── grammars/ │ ├── .gitignore │ ├── Dockerfile │ ├── cmd/ │ │ └── grammar-compiler/ │ │ └── main.go │ ├── compiler/ │ │ ├── converter.go │ │ ├── cson.go │ │ ├── data.go │ │ ├── errors.go │ │ ├── loader.go │ │ ├── loader_fs.go │ │ ├── loader_url.go │ │ ├── pcre.go │ │ ├── pcre_test.go │ │ ├── proto.go │ │ └── walker.go │ ├── docker/ │ │ └── build │ ├── go.mod │ ├── go.sum │ ├── pcre/ │ │ └── pcre.go │ └── proto/ │ └── grammar.pb.go ├── utils.liq └── vendor/ ├── README.md └── licenses/ ├── config.yml ├── git_submodule/ │ ├── AL.dep.yml │ ├── Alloy.tmbundle.dep.yml │ ├── Assembly-Syntax-Definition.dep.yml │ ├── Atom-PostScript.dep.yml │ ├── AtomLanguageVelocity.dep.yml │ ├── AutoHotkey.dep.yml │ ├── CUE-Sheet_sublime.dep.yml │ ├── Clue-for-VSCode.dep.yml │ ├── CoDT7-Sublime.dep.yml │ ├── CodeMirror.dep.yml │ ├── ColdFusion.dep.yml │ ├── CookVSCode.dep.yml │ ├── Cylc.tmbundle.dep.yml │ ├── Dafny-VSCode.dep.yml │ ├── Docker.tmbundle.dep.yml │ ├── Elm.dep.yml │ ├── FreeMarker.tmbundle.dep.yml │ ├── GeneroFgl.tmbundle.dep.yml │ ├── Handlebars.dep.yml │ ├── IDL-Syntax.dep.yml │ ├── Isabelle.tmbundle.dep.yml │ ├── JSyntax.dep.yml │ ├── Jails.dep.yml │ ├── K-VSCode.dep.yml │ ├── LOLCODE-grammar-vscode.dep.yml │ ├── Ligo-grammar.dep.yml │ ├── Linker.tmLanguage.dep.yml │ ├── Luau.tmLanguage.dep.yml │ ├── MATLAB-Language-grammar.dep.yml │ ├── MQL5-sublime.dep.yml │ ├── MagicPython.dep.yml │ ├── Modelica.dep.yml │ ├── NSIS.dep.yml │ ├── Nasal.tmbundle.dep.yml │ ├── NimLime.dep.yml │ ├── NovaGrammars.dep.yml │ ├── ObjectScript.tmBundle.dep.yml │ ├── PHP-Twig.tmbundle.dep.yml │ ├── PogoScript.tmbundle.dep.yml │ ├── PowerBuilder.tmbundle.dep.yml │ ├── RDoc.tmbundle.dep.yml │ ├── Racket.dep.yml │ ├── SMT.tmbundle.dep.yml │ ├── Scalate.tmbundle.dep.yml │ ├── Scenic-tmLanguage.dep.yml │ ├── Slash.tmbundle.dep.yml │ ├── Stata.tmbundle.dep.yml │ ├── Stylus.dep.yml │ ├── Sublime-Coq.dep.yml │ ├── Sublime-HTTP.dep.yml │ ├── Sublime-Lasso.dep.yml │ ├── Sublime-Loom.dep.yml │ ├── Sublime-Modula-2.dep.yml │ ├── Sublime-Nit.dep.yml │ ├── Sublime-Pep8.dep.yml │ ├── Sublime-QML.dep.yml │ ├── Sublime-REBOL.dep.yml │ ├── Sublime-Red.dep.yml │ ├── Sublime-SQF-Language.dep.yml │ ├── SublimeBrainfuck.dep.yml │ ├── SublimeClarion.dep.yml │ ├── SublimeEthereum.dep.yml │ ├── SublimeGDB.dep.yml │ ├── SublimePapyrus.dep.yml │ ├── SublimePuppet.dep.yml │ ├── SublimeXtend.dep.yml │ ├── Syntax-highlighting-for-PostCSS.dep.yml │ ├── SystemVerilog.dep.yml │ ├── TLA.dep.yml │ ├── TXL.dep.yml │ ├── Textmate-Gosu-Bundle.dep.yml │ ├── TypeScript-TmLanguage.dep.yml │ ├── UrWeb-Language-Definition.dep.yml │ ├── VBDotNetSyntax.dep.yml │ ├── Vala-TMBundle.dep.yml │ ├── VscodeAdblockSyntax.dep.yml │ ├── WhileySyntaxBundle.dep.yml │ ├── X10.dep.yml │ ├── XojoSyntaxTM.dep.yml │ ├── ZenScript-tmLanguage.dep.yml │ ├── abap-cds-grammar.dep.yml │ ├── abap.tmbundle.dep.yml │ ├── abl-tmlanguage.dep.yml │ ├── actionscript3-tmbundle.dep.yml │ ├── ada.tmbundle.dep.yml │ ├── agda-github-syntax-highlighting.dep.yml │ ├── aidl-language.dep.yml │ ├── ampl.dep.yml │ ├── android-system-tools.dep.yml │ ├── ant.tmbundle.dep.yml │ ├── antlr.tmbundle.dep.yml │ ├── apex-tmLanguage.dep.yml │ ├── api-blueprint-sublime-plugin.dep.yml │ ├── applescript.tmbundle.dep.yml │ ├── asciidoc.tmbundle.dep.yml │ ├── asp-syntax-highlight.dep.yml │ ├── asp.tmbundle.dep.yml │ ├── assembly.dep.yml │ ├── astro.dep.yml │ ├── atom-editorconfig.dep.yml │ ├── atom-firestore-grammar.dep.yml │ ├── atom-fstar.dep.yml │ ├── atom-language-clean.dep.yml │ ├── atom-language-haproxy.dep.yml │ ├── atom-language-innosetup.dep.yml │ ├── atom-language-julia.dep.yml │ ├── atom-language-nextflow.dep.yml │ ├── atom-language-p4.dep.yml │ ├── atom-language-perl6.dep.yml │ ├── atom-language-purescript.dep.yml │ ├── atom-language-stan.dep.yml │ ├── atom-miniyaml.dep.yml │ ├── atom-salt.dep.yml │ ├── ats.dep.yml │ ├── avro.tmLanguage.dep.yml │ ├── awk-sublime.dep.yml │ ├── b-vscode.dep.yml │ ├── ballerina-grammar.dep.yml │ ├── berry-grammar.dep.yml │ ├── bicep.dep.yml │ ├── bikeshed.dep.yml │ ├── blitzmax.dep.yml │ ├── boogie-vscode.dep.yml │ ├── bqn-vscode.dep.yml │ ├── browserslist-vscode.dep.yml │ ├── bruno-ide-extensions.dep.yml │ ├── bst.tmLanguage.dep.yml │ ├── c.tmbundle.dep.yml │ ├── cairo-tm-grammar.dep.yml │ ├── capnproto.tmbundle.dep.yml │ ├── carto-atom.dep.yml │ ├── cds-textmate-grammar.dep.yml │ ├── ceylon-sublimetext.dep.yml │ ├── chapel-tmbundle.dep.yml │ ├── circom-highlighting-vscode.dep.yml │ ├── clarity.tmbundle.dep.yml │ ├── code-peggy-language.dep.yml │ ├── common-lisp-tmlanguage.dep.yml │ ├── conllu-linguist-grammar.dep.yml │ ├── cool-tmbundle.dep.yml │ ├── cpp-qt.tmbundle.dep.yml │ ├── cqlTextMate.dep.yml │ ├── creole.dep.yml │ ├── cron.tmbundle.dep.yml │ ├── csharp-tmLanguage.dep.yml │ ├── cucumber-tmbundle.dep.yml │ ├── cython.dep.yml │ ├── d.tmbundle.dep.yml │ ├── d2-vscode.dep.yml │ ├── dart-syntax-highlight.dep.yml │ ├── daslang-grammar.dep.yml │ ├── data-weave-tmLanguage.dep.yml │ ├── denizenscript-grammar.dep.yml │ ├── desktop.tmbundle.dep.yml │ ├── diff.tmbundle.dep.yml │ ├── dm-syntax.dep.yml │ ├── dylan.tmbundle.dep.yml │ ├── earthfile-grammar.dep.yml │ ├── ec.tmbundle.dep.yml │ ├── ecl-tmLanguage.dep.yml │ ├── edge-vscode.dep.yml │ ├── edgedb-editor-plugin.dep.yml │ ├── eiffel.tmbundle.dep.yml │ ├── ejs-tmbundle.dep.yml │ ├── elixir-tmbundle.dep.yml │ ├── elvish.dep.yml │ ├── factor.dep.yml │ ├── fancy-tmbundle.dep.yml │ ├── firrtl-syntax.dep.yml │ ├── fish-tmbundle.dep.yml │ ├── forth.dep.yml │ ├── fortran.tmbundle.dep.yml │ ├── gap-tmbundle.dep.yml │ ├── gemfile-lock-tmlanguage.dep.yml │ ├── gemini-vscode.dep.yml │ ├── gettext.tmbundle.dep.yml │ ├── gnuplot-tmbundle.dep.yml │ ├── go-tmbundle.dep.yml │ ├── godot-vscode-plugin.dep.yml │ ├── grace.dep.yml │ ├── gradle.tmbundle.dep.yml │ ├── grammar.dep.yml │ ├── graphiql.dep.yml │ ├── graphviz.tmbundle.dep.yml │ ├── groovy.tmbundle.dep.yml │ ├── haxe-TmLanguage.dep.yml │ ├── holyc.tmbundle.dep.yml │ ├── hoon-grammar.dep.yml │ ├── iCalendar-sublime.dep.yml │ ├── ide-tools.dep.yml │ ├── idl.tmbundle.dep.yml │ ├── idris.dep.yml │ ├── imba-linguist-grammar.dep.yml │ ├── ini.tmbundle.dep.yml │ ├── ink-tmlanguage.dep.yml │ ├── io.tmbundle.dep.yml │ ├── ioke-outdated.dep.yml │ ├── ionide-fsgrammar.dep.yml │ ├── ispc.syntax.dep.yml │ ├── jac-vscode.dep.yml │ ├── jade-tmbundle.dep.yml │ ├── jasmin-sublime.dep.yml │ ├── java.tmbundle.dep.yml │ ├── javadoc.tmbundle.dep.yml │ ├── javascript-objective-j.tmbundle.dep.yml │ ├── jflex.tmbundle.dep.yml │ ├── jte-template-syntax-highlight.dep.yml │ ├── kivy-language-grammer.dep.yml │ ├── koka-textmate-grammar.dep.yml │ ├── kusto-sublime.dep.yml │ ├── language-4d.dep.yml │ ├── language-agc.dep.yml │ ├── language-algol60.dep.yml │ ├── language-apl.dep.yml │ ├── language-asl.dep.yml │ ├── language-asn1.dep.yml │ ├── language-basic.dep.yml │ ├── language-batchfile.dep.yml │ ├── language-bh.dep.yml │ ├── language-blade.dep.yml │ ├── language-click.dep.yml │ ├── language-clojure.dep.yml │ ├── language-closure-templates.dep.yml │ ├── language-coffee-script.dep.yml │ ├── language-crystal.dep.yml │ ├── language-csound.dep.yml │ ├── language-css.dep.yml │ ├── language-cwl.dep.yml │ ├── language-debian.dep.yml │ ├── language-dircolors.dep.yml │ ├── language-dsv.dep.yml │ ├── language-emacs-lisp.dep.yml │ ├── language-eml.dep.yml │ ├── language-etc.dep.yml │ ├── language-faust.dep.yml │ ├── language-fontforge.dep.yml │ ├── language-gf.dep.yml │ ├── language-gn.dep.yml │ ├── language-grammars.dep.yml │ ├── language-haml.dep.yml │ ├── language-haskell.dep.yml │ ├── language-hocon.dep.yml │ ├── language-hql.dep.yml │ ├── language-html.dep.yml │ ├── language-hurl.dep.yml │ ├── language-igor.dep.yml │ ├── language-inform7.dep.yml │ ├── language-javascript.dep.yml │ ├── language-jison.dep.yml │ ├── language-jolie.dep.yml │ ├── language-jq.dep.yml │ ├── language-jsoniq.dep.yml │ ├── language-jsonnet.dep.yml │ ├── language-kak.dep.yml │ ├── language-kerboscript.dep.yml │ ├── language-kickstart.dep.yml │ ├── language-kotlin.dep.yml │ ├── language-langium.dep.yml │ ├── language-less.dep.yml │ ├── language-m68k.dep.yml │ ├── language-macaulay2.dep.yml │ ├── language-maxscript.dep.yml │ ├── language-mermaid.dep.yml │ ├── language-meson.dep.yml │ ├── language-msl.dep.yml │ ├── language-ncl.dep.yml │ ├── language-ninja.dep.yml │ ├── language-nunjucks.dep.yml │ ├── language-pan.dep.yml │ ├── language-pcb.dep.yml │ ├── language-povray.dep.yml │ ├── language-property-list.dep.yml │ ├── language-pyret.dep.yml │ ├── language-qasm.dep.yml │ ├── language-reason.dep.yml │ ├── language-reg.dep.yml │ ├── language-regexp.dep.yml │ ├── language-renpy.dep.yml │ ├── language-restructuredtext.dep.yml │ ├── language-ring.dep.yml │ ├── language-roff.dep.yml │ ├── language-rpm-spec.dep.yml │ ├── language-rtf.dep.yml │ ├── language-ruby.dep.yml │ ├── language-sass.dep.yml │ ├── language-sed.dep.yml │ ├── language-shellscript.dep.yml │ ├── language-subtitles.dep.yml │ ├── language-supercollider.dep.yml │ ├── language-texinfo.dep.yml │ ├── language-ti-basic.dep.yml │ ├── language-toc-wow.dep.yml │ ├── language-tools.dep.yml │ ├── language-tsql.dep.yml │ ├── language-turing.dep.yml │ ├── language-typelanguage.dep.yml │ ├── language-viml.dep.yml │ ├── language-wavefront.dep.yml │ ├── language-webassembly.dep.yml │ ├── language-xbase.dep.yml │ ├── language-xcompose.dep.yml │ ├── language-yaml.dep.yml │ ├── language-yang.dep.yml │ ├── latex.tmbundle.dep.yml │ ├── leo-linguist.dep.yml │ ├── linter-lilypond.dep.yml │ ├── liquid-tm-grammar.dep.yml │ ├── lisp.tmbundle.dep.yml │ ├── livescript-vscode.dep.yml │ ├── llvm.tmbundle.dep.yml │ ├── logos.dep.yml │ ├── logtalk.tmbundle.dep.yml │ ├── lua.tmbundle.dep.yml │ ├── m3.dep.yml │ ├── make.tmbundle.dep.yml │ ├── mako-tmbundle.dep.yml │ ├── markdown-tm-language.dep.yml │ ├── marko-tmbundle.dep.yml │ ├── mathematica-tmbundle.dep.yml │ ├── maven.tmbundle.dep.yml │ ├── mediawiki.tmbundle.dep.yml │ ├── mercury-tmlanguage.dep.yml │ ├── metta-textmate-linguist.dep.yml │ ├── mint-vscode.dep.yml │ ├── mlir-grammar.dep.yml │ ├── mojo-syntax.dep.yml │ ├── monkey.dep.yml │ ├── moonbit-tmLanguage.dep.yml │ ├── moonscript-tmbundle.dep.yml │ ├── mps-vscode.dep.yml │ ├── nemerle.tmbundle.dep.yml │ ├── nesC.dep.yml │ ├── nickel.dep.yml │ ├── nix-linguist.dep.yml │ ├── nu-grammar.dep.yml │ ├── nu.tmbundle.dep.yml │ ├── objective-c.tmbundle.dep.yml │ ├── ocaml.tmbundle.dep.yml │ ├── omnetpp-textmate-msg.dep.yml │ ├── omnetpp-textmate-ned.dep.yml │ ├── ooc.tmbundle.dep.yml │ ├── opa.tmbundle.dep.yml │ ├── openscad.tmbundle.dep.yml │ ├── overpassql-tmlanguage.dep.yml │ ├── oz-tmbundle.dep.yml │ ├── pact-atom.dep.yml │ ├── parrot.dep.yml │ ├── pascal.tmbundle.dep.yml │ ├── pawn-sublime-language.dep.yml │ ├── perl.tmbundle.dep.yml │ ├── php-smarty.tmbundle.dep.yml │ ├── php.tmbundle.dep.yml │ ├── pig-latin.dep.yml │ ├── pike-textmate.dep.yml │ ├── pkl.tmbundle.dep.yml │ ├── playground-cj.dep.yml │ ├── polar-grammar.dep.yml │ ├── portugol-grammar.dep.yml │ ├── powershell.dep.yml │ ├── praatvscode.dep.yml │ ├── processing.tmbundle.dep.yml │ ├── python-django.tmbundle.dep.yml │ ├── qsharp.dep.yml │ ├── quake.dep.yml │ ├── quakec-syntax.dep.yml │ ├── r.tmbundle.dep.yml │ ├── rascal-syntax-highlighting.dep.yml │ ├── rascript-syntax.dep.yml │ ├── razor-plus.dep.yml │ ├── rescript-vscode.dep.yml │ ├── rez.tmbundle.dep.yml │ ├── riot-syntax-highlight.dep.yml │ ├── roc-vscode-unofficial.dep.yml │ ├── ros-tmlanguage.dep.yml │ ├── rust-syntax.dep.yml │ ├── rust_hdl_vscode.dep.yml │ ├── sail_vscode.dep.yml │ ├── sas.tmbundle.dep.yml │ ├── scheme.tmbundle.dep.yml │ ├── scilab.tmbundle.dep.yml │ ├── secondlife-lsl.dep.yml │ ├── selinux-policy-languages.dep.yml │ ├── shaders-tmLanguage.dep.yml │ ├── slang-vscode-extension.dep.yml │ ├── slint-tmLanguage.dep.yml │ ├── smali-sublime.dep.yml │ ├── smalltalk-tmbundle.dep.yml │ ├── smithy-vscode.dep.yml │ ├── sourcepawn-vscode.dep.yml │ ├── sprocket-vscode.dep.yml │ ├── sql.tmbundle.dep.yml │ ├── squirrel-language.dep.yml │ ├── st2-zonefile.dep.yml │ ├── standard-ml.tmbundle.dep.yml │ ├── sublime-MuPAD.dep.yml │ ├── sublime-angelscript.dep.yml │ ├── sublime-aspectj.dep.yml │ ├── sublime-autoit.dep.yml │ ├── sublime-befunge.dep.yml │ ├── sublime-boo.dep.yml │ ├── sublime-bsv.dep.yml │ ├── sublime-cirru.dep.yml │ ├── sublime-clips.dep.yml │ ├── sublime-cypher.dep.yml │ ├── sublime-fantom.dep.yml │ ├── sublime-glsl.dep.yml │ ├── sublime-golo.dep.yml │ ├── sublime-lambdapi.dep.yml │ ├── sublime-mask.dep.yml │ ├── sublime-nearley.dep.yml │ ├── sublime-netlinx.dep.yml │ ├── sublime-odin.dep.yml │ ├── sublime-opal.dep.yml │ ├── sublime-pony.dep.yml │ ├── sublime-promela-spin.dep.yml │ ├── sublime-q.dep.yml │ ├── sublime-rexx.dep.yml │ ├── sublime-robot-plugin.dep.yml │ ├── sublime-shen.dep.yml │ ├── sublime-spintools.dep.yml │ ├── sublime-tea.dep.yml │ ├── sublime-terra.dep.yml │ ├── sublime-text-ox.dep.yml │ ├── sublime-zig-language.dep.yml │ ├── sublimeassembly.dep.yml │ ├── sublimeprolog.dep.yml │ ├── sublimetext-cuda-cpp.dep.yml │ ├── sublimetext-nasl.dep.yml │ ├── surrealql-grammar.dep.yml │ ├── svelte-atom.dep.yml │ ├── sway-vscode-plugin.dep.yml │ ├── sweave.tmbundle.dep.yml │ ├── swift-tmlanguage.dep.yml │ ├── syntax-mcfunction.dep.yml │ ├── syntax.dep.yml │ ├── tact-sublime.dep.yml │ ├── tcl.tmbundle.dep.yml │ ├── templ-vscode.dep.yml │ ├── textmate.dep.yml │ ├── textmate.tmbundle.dep.yml │ ├── textproto-grammar.dep.yml │ ├── thrift.tmbundle.dep.yml │ ├── tlv-vscode.dep.yml │ ├── toml.tmbundle.dep.yml │ ├── turtle.tmbundle.dep.yml │ ├── typespec.dep.yml │ ├── typst-grammar.dep.yml │ ├── verilog.tmbundle.dep.yml │ ├── vsc-ember-syntax.dep.yml │ ├── vsc-fennel.dep.yml │ ├── vsc-language-1c-bsl.dep.yml │ ├── vscode-TalonScript.dep.yml │ ├── vscode-aiken.dep.yml │ ├── vscode-antlers-language-server.dep.yml │ ├── vscode-apache.dep.yml │ ├── vscode-bitbake.dep.yml │ ├── vscode-brightscript-language.dep.yml │ ├── vscode-c3.dep.yml │ ├── vscode-caddyfile.dep.yml │ ├── vscode-cadence.dep.yml │ ├── vscode-cmake-tools.dep.yml │ ├── vscode-codeql.dep.yml │ ├── vscode-cue.dep.yml │ ├── vscode-curry.dep.yml │ ├── vscode-dune.dep.yml │ ├── vscode-euphoria.dep.yml │ ├── vscode-fastly-vcl.dep.yml │ ├── vscode-flatbuffers.dep.yml │ ├── vscode-fluent.dep.yml │ ├── vscode-gcode-syntax.dep.yml │ ├── vscode-gedcom.dep.yml │ ├── vscode-gleam.dep.yml │ ├── vscode-go-template.dep.yml │ ├── vscode-go.dep.yml │ ├── vscode-hack.dep.yml │ ├── vscode-hy.dep.yml │ ├── vscode-ibmi-languages.dep.yml │ ├── vscode-janet.dep.yml │ ├── vscode-jest.dep.yml │ ├── vscode-jsonc-syntax-highlighting.dep.yml │ ├── vscode-just.dep.yml │ ├── vscode-kcl.dep.yml │ ├── vscode-kdl.dep.yml │ ├── vscode-kolmafia-ash.dep.yml │ ├── vscode-lean.dep.yml │ ├── vscode-lean4.dep.yml │ ├── vscode-liquidsoap.dep.yml │ ├── vscode-livecodescript.dep.yml │ ├── vscode-minizinc.dep.yml │ ├── vscode-monkey-c.dep.yml │ ├── vscode-motoko.dep.yml │ ├── vscode-move-syntax.dep.yml │ ├── vscode-nginx.dep.yml │ ├── vscode-noir.dep.yml │ ├── vscode-opa.dep.yml │ ├── vscode-pddl.dep.yml │ ├── vscode-plantuml.dep.yml │ ├── vscode-prisma.dep.yml │ ├── vscode-procfile.dep.yml │ ├── vscode-proto3.dep.yml │ ├── vscode-python.dep.yml │ ├── vscode-rbs-syntax.dep.yml │ ├── vscode-ron.dep.yml │ ├── vscode-ruby-slim.dep.yml │ ├── vscode-scala-syntax.dep.yml │ ├── vscode-singularity.dep.yml │ ├── vscode-slice.dep.yml │ ├── vscode-teal.dep.yml │ ├── vscode-tmdl.dep.yml │ ├── vscode-tree-sitter-query.dep.yml │ ├── vscode-vba.dep.yml │ ├── vscode-vcard.dep.yml │ ├── vscode-vento.dep.yml │ ├── vscode-vlang.dep.yml │ ├── vscode-wit.dep.yml │ ├── vscode-wren.dep.yml │ ├── vscode-yara.dep.yml │ ├── vscode-zil-language.dep.yml │ ├── vscode.dep.yml │ ├── vscode_cobol.dep.yml │ ├── vscode_mikrotik_routeros_script.dep.yml │ ├── wgsl-analyzer.dep.yml │ ├── witcherscript-grammar.dep.yml │ ├── wollok-sublime.dep.yml │ ├── xc.tmbundle.dep.yml │ ├── xmake-lua.tmbundle.dep.yml │ ├── xml.tmbundle.dep.yml │ ├── zeek-sublime.dep.yml │ ├── zenstack.dep.yml │ └── zephir-sublime.dep.yml └── grammar/ └── abap-cds-grammar.txt ================================================ FILE CONTENTS ================================================ ================================================ FILE: .devcontainer/Dockerfile ================================================ # Available versions: https://github.com/devcontainers/images/tree/main/src/ruby FROM mcr.microsoft.com/devcontainers/ruby:3.4 RUN apt update && apt install -y cmake ================================================ FILE: .devcontainer/devcontainer.json ================================================ { "name": "Ruby", "build": { "dockerfile": "Dockerfile" }, "features": { "ghcr.io/devcontainers/features/docker-in-docker:2": { "moby": false }, "ghcr.io/devcontainers/features/go:1": {}, "ghcr.io/devcontainers/features/git-lfs:1": {} }, "customizations": { "codespaces": { "openFiles": [ "CONTRIBUTING.md", "lib/linguist/languages.yml" ] }, "vscode": { "extensions": [ "EditorConfig.EditorConfig", "redhat.vscode-yaml", "Shopify.ruby-lsp" ] } }, "onCreateCommand": ".devcontainer/onCreateCommand.sh", "remoteUser": "vscode" } ================================================ FILE: .devcontainer/onCreateCommand.sh ================================================ #!/bin/sh ./script/bootstrap git remote add linguist https://github.com/github-linguist/linguist git fetch linguist v2.0.0:v2.0.0 test/attributes:test/attributes test/master:test/master ================================================ FILE: .dockerignore ================================================ .git/ test/ ================================================ FILE: .editorconfig ================================================ root = true [*] charset = utf-8 end_of_line = lf indent_size = 2 indent_style = space insert_final_newline = true trim_trailing_whitespace = true [*.md] trim_trailing_whitespace = false [*.{h,c}] indent_style = tab indent_size = 8 [{Dockerfile,Makefile,*.go,script/add-grammar}] indent_style = tab indent_size = 4 # Ignore fixtures and vendored files [{grammars,test/fixtures,samples,vendor}/**] charset = unset end_of_line = unset indent_size = unset indent_style = unset insert_final_newline = unset trim_trailing_whitespace = unset ================================================ FILE: .github/CODEOWNERS ================================================ # All pull requests need to be reviewed by someone from GitHub. # * @github-linguist/github ================================================ FILE: .github/ISSUE_TEMPLATE/bug_report.md ================================================ --- name: Bug report about: Found a bug? Let us know. Please start with **Discussions** if your issue is regarding unexpected language analysis or statistics. title: '' labels: Bug assignees: '' --- ## Describe the bug ### Expected behaviour ### Related discussion ### Additional notes ================================================ FILE: .github/ISSUE_TEMPLATE/config.yml ================================================ blank_issues_enabled: false contact_links: - name: Get help in GitHub Discussions url: https://github.com/github/linguist/discussions about: Have a question? Surprised by your repository language analysis? The quickest way to get help is on Linguist's GitHub Discussions! ================================================ FILE: .github/ISSUE_TEMPLATE/feature_request.md ================================================ --- name: Feature request about: Suggest an enhancement title: '' labels: Improvement assignees: '' --- ## Describe the enhancement ================================================ FILE: .github/ISSUE_TEMPLATE/new_language.md ================================================ --- name: New language about: Request support for a new language title: '' labels: Add Language, Good First Issue assignees: '' --- ## Language name ## URL of example repository ## URL of syntax highlighting grammar ## Most popular extensions ## Detected language ================================================ FILE: .github/PULL_REQUEST_TEMPLATE.md ================================================ ## Description ## Checklist: - [ ] **I am adding a new extension to a language.** - [ ] The new extension is used in hundreds of repositories on GitHub.com - Search results for each extension: - https://github.com/search?type=code&q=NOT+is%3Afork+path%3A*.FOOBAR+KEYWORDS - [ ] I have included a real-world usage sample for all extensions added in this PR: - Sample source(s): - [URL to each sample source, if applicable] - Sample license(s): - [ ] I have included a change to the heuristics to distinguish my language from others using the same extension. - [ ] **I am adding a new language.** - [ ] The extension of the new language is used in hundreds of repositories on GitHub.com. - Search results for each extension: - https://github.com/search?type=code&q=NOT+is%3Afork+path%3A*.FOOBAR+KEYWORDS - [ ] I have included a real-world usage sample for all extensions added in this PR: - Sample source(s): - [URL to each sample source, if applicable] - Sample license(s): - [ ] I have included a syntax highlighting grammar: [URL to grammar repo] - [ ] I have added a color - Hex value: `#RRGGBB` - Rationale: - [ ] I have updated the heuristics to distinguish my language from others using the same extension. - [ ] **I am fixing a misclassified language** - [ ] I have included a new sample for the misclassified language: - Sample source(s): - [URL to each sample source, if applicable] - Sample license(s): - [ ] I have included a change to the heuristics to distinguish my language from others using the same extension. - [ ] **I am changing the source of a syntax highlighting grammar** - Old: [URL to grammar repo] - New: [URL to grammar repo] - [ ] **I am updating a grammar submodule** - [ ] **I am adding new or changing current functionality** - [ ] I have added or updated the tests for the new or changed functionality. - [ ] **I am changing the color associated with a language** - [ ] I have obtained agreement from the wider language community on this color change. - [URL to public discussion] - [Optional: URL to official branding guidelines for the language] ================================================ FILE: .github/dependabot.yml ================================================ version: 2 updates: # Only check for Ruby gem updates - package-ecosystem: "bundler" directory: "/" schedule: interval: "daily" ================================================ FILE: .github/workflows/ci.yml ================================================ name: Run Tests on: # Trigger the workflow on push or pull request, but only for the main branch push: branches: - main pull_request: branches: - main merge_group: permissions: contents: read jobs: run: name: Ruby ${{ matrix.ruby }} runs-on: ubuntu-latest strategy: matrix: ruby: [ '3.3', '3.2', '3.1' ] steps: - uses: actions/checkout@v1 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: ${{ matrix.ruby }} bundler-cache: true - name: Fetch grammar submodules run: | git fetch origin main:main v2.0.0:v2.0.0 test/attributes:test/attributes test/master:test/master sed -i 's|git@github.com:|https://github.com/|' .gitmodules git submodule init git submodule sync --quiet script/fast-submodule-update - name: Run tests run: bundle exec rake - name: Check Licenses run: bundle exec licensed status -c vendor/licenses/config.yml dockerfile: name: Test Dockerfile runs-on: ubuntu-latest steps: - uses: actions/checkout@v1 - name: Build container run: docker build -t linguist . - name: Analyse current directory run: docker run --rm -v $(pwd):$(pwd) -w $(pwd) --user $(id -u) -t linguist | tee output - name: Confirm analysis run: grep Ruby output classifier: name: Classifier cross-validation runs-on: ubuntu-latest steps: - uses: actions/checkout@v2 - name: Set up Ruby uses: ruby/setup-ruby@v1 with: ruby-version: '3.3' bundler-cache: true - name: Build run: bundle exec rake samples - name: Run cross-validation run: bundle exec script/cross-validation --test 2>&1 ================================================ FILE: .github/workflows/publish_docker_image.yml ================================================ name: Publish Docker image on: release: types: [published] defaults: run: shell: bash jobs: build-and-release: runs-on: ubuntu-latest permissions: packages: write contents: read attestations: write id-token: write steps: - name: Checkout repository uses: actions/checkout@v4 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v3 - name: Extract metadata (tags, labels) for Docker id: meta uses: docker/metadata-action@v5 with: images: ghcr.io/${{ github.repository }} - name: Log in to GitHub Container Registry uses: docker/login-action@v3 with: registry: ghcr.io username: ${{ github.actor }} password: ${{ secrets.GITHUB_TOKEN }} - name: Build and push id: push uses: docker/build-push-action@v6 with: push: true cache-from: type=registry,ref=ghcr.io/${{ github.repository }}:buildcache cache-to: type=registry,ref=ghcr.io/${{ github.repository }}:buildcache,mode=max tags: ${{ steps.meta.outputs.tags }} labels: ${{ steps.meta.outputs.labels }} - name: Generate artifact attestation uses: actions/attest-build-provenance@v2 with: subject-name: ghcr.io/${{ github.repository }} subject-digest: ${{ steps.push.outputs.digest }} push-to-registry: true ================================================ FILE: .gitignore ================================================ *.gem /Gemfile.lock .bundle/ .idea benchmark/ lib/linguist/samples.json /grammars /node_modules test/fixtures/ace_modes.json /vendor/gems/ /tmp *.bundle *.so linguist-grammars* .venv Brewfile.lock.json ================================================ FILE: .gitmodules ================================================ [submodule "vendor/CodeMirror"] path = vendor/CodeMirror url = https://github.com/codemirror/CodeMirror [submodule "vendor/grammars/AL"] path = vendor/grammars/AL url = https://github.com/microsoft/AL [submodule "vendor/grammars/Alloy.tmbundle"] path = vendor/grammars/Alloy.tmbundle url = https://github.com/macekond/Alloy.tmbundle [submodule "vendor/grammars/Assembly-Syntax-Definition"] path = vendor/grammars/Assembly-Syntax-Definition url = https://github.com/calculuswhiz/Assembly-Syntax-Definition [submodule "vendor/grammars/Atom-PostScript"] path = vendor/grammars/Atom-PostScript url = https://github.com/Alhadis/Atom-PostScript [submodule "vendor/grammars/AtomLanguageVelocity"] path = vendor/grammars/AtomLanguageVelocity url = https://github.com/animecyc/AtomLanguageVelocity [submodule "vendor/grammars/AutoHotkey"] path = vendor/grammars/AutoHotkey url = https://github.com/ahkscript/SublimeAutoHotkey [submodule "vendor/grammars/CUE-Sheet_sublime"] path = vendor/grammars/CUE-Sheet_sublime url = https://github.com/relikd/CUE-Sheet_sublime [submodule "vendor/grammars/Clue-for-VSCode"] path = vendor/grammars/Clue-for-VSCode url = https://github.com/ClueLang/Clue-for-VSCode.git [submodule "vendor/grammars/CoDT7-Sublime"] path = vendor/grammars/CoDT7-Sublime url = https://github.com/Jake-NotTheMuss/CoDT7-Sublime.git [submodule "vendor/grammars/ColdFusion"] path = vendor/grammars/ColdFusion url = https://github.com/SublimeText/ColdFusion [submodule "vendor/grammars/CookVSCode"] path = vendor/grammars/CookVSCode url = https://github.com/cooklang/CookVSCode.git [submodule "vendor/grammars/Cylc.tmbundle"] path = vendor/grammars/Cylc.tmbundle url = https://github.com/cylc/Cylc.tmbundle.git [submodule "vendor/grammars/Dafny-VSCode"] path = vendor/grammars/Dafny-VSCode url = https://github.com/DafnyVSCode/Dafny-VSCode [submodule "vendor/grammars/Docker.tmbundle"] path = vendor/grammars/Docker.tmbundle url = https://github.com/asbjornenge/Docker.tmbundle [submodule "vendor/grammars/Elm"] path = vendor/grammars/Elm url = https://github.com/elm-community/Elm.tmLanguage [submodule "vendor/grammars/FreeMarker.tmbundle"] path = vendor/grammars/FreeMarker.tmbundle url = https://github.com/freemarker/FreeMarker.tmbundle [submodule "vendor/grammars/GeneroFgl.tmbundle"] path = vendor/grammars/GeneroFgl.tmbundle url = https://github.com/FourjsGenero/GeneroFgl.tmbundle.git [submodule "vendor/grammars/Handlebars"] path = vendor/grammars/Handlebars url = https://github.com/daaain/Handlebars [submodule "vendor/grammars/IDL-Syntax"] path = vendor/grammars/IDL-Syntax url = https://github.com/andik/IDL-Syntax [submodule "vendor/grammars/Isabelle.tmbundle"] path = vendor/grammars/Isabelle.tmbundle url = https://github.com/lsf37/Isabelle.tmbundle [submodule "vendor/grammars/JSyntax"] path = vendor/grammars/JSyntax url = https://github.com/tikkanz/JSyntax [submodule "vendor/grammars/Jails"] path = vendor/grammars/Jails url = https://github.com/SogoCZE/Jails.git [submodule "vendor/grammars/K-VSCode"] path = vendor/grammars/K-VSCode url = https://github.com/LucianCumpata/K-VSCode.git [submodule "vendor/grammars/LOLCODE-grammar-vscode"] path = vendor/grammars/LOLCODE-grammar-vscode url = https://github.com/KrazIvan/LOLCODE-grammar-vscode.git [submodule "vendor/grammars/Ligo-grammar"] path = vendor/grammars/Ligo-grammar url = https://github.com/pewulfman/Ligo-grammar.git [submodule "vendor/grammars/Linker.tmLanguage"] path = vendor/grammars/Linker.tmLanguage url = https://github.com/donno2048/Linker.tmLanguage [submodule "vendor/grammars/Luau.tmLanguage"] path = vendor/grammars/Luau.tmLanguage url = https://github.com/JohnnyMorganz/Luau.tmLanguage.git [submodule "vendor/grammars/MATLAB-Language-grammar"] path = vendor/grammars/MATLAB-Language-grammar url = https://github.com/mathworks/MATLAB-Language-grammar [submodule "vendor/grammars/MQL5-sublime"] path = vendor/grammars/MQL5-sublime url = https://github.com/mqsoft/MQL5-sublime [submodule "vendor/grammars/MagicPython"] path = vendor/grammars/MagicPython url = https://github.com/MagicStack/MagicPython [submodule "vendor/grammars/Modelica"] path = vendor/grammars/Modelica url = https://github.com/BorisChumichev/modelicaSublimeTextPackage [submodule "vendor/grammars/NSIS"] path = vendor/grammars/NSIS url = https://github.com/github-linguist/NSIS [submodule "vendor/grammars/Nasal.tmbundle"] path = vendor/grammars/Nasal.tmbundle url = https://github.com/BobDotCom/Nasal.tmbundle.git [submodule "vendor/grammars/NimLime"] path = vendor/grammars/NimLime url = https://github.com/nim-lang/NimLime [submodule "vendor/grammars/NovaGrammars"] path = vendor/grammars/NovaGrammars url = https://github.com/Nixinova/NovaGrammars [submodule "vendor/grammars/ObjectScript.tmBundle"] path = vendor/grammars/ObjectScript.tmBundle url = https://github.com/intersystems-community/ObjectScript.tmBundle [submodule "vendor/grammars/PHP-Twig.tmbundle"] path = vendor/grammars/PHP-Twig.tmbundle url = https://github.com/Anomareh/PHP-Twig.tmbundle [submodule "vendor/grammars/PogoScript.tmbundle"] path = vendor/grammars/PogoScript.tmbundle url = https://github.com/featurist/PogoScript.tmbundle [submodule "vendor/grammars/PowerBuilder.tmbundle"] path = vendor/grammars/PowerBuilder.tmbundle url = https://github.com/informaticon/PowerBuilder.tmbundle.git [submodule "vendor/grammars/RDoc.tmbundle"] path = vendor/grammars/RDoc.tmbundle url = https://github.com/joshaven/RDoc.tmbundle [submodule "vendor/grammars/Racket"] path = vendor/grammars/Racket url = https://github.com/soegaard/racket-highlight-for-github [submodule "vendor/grammars/SMT.tmbundle"] path = vendor/grammars/SMT.tmbundle url = https://github.com/SRI-CSL/SMT.tmbundle.git [submodule "vendor/grammars/Scalate.tmbundle"] path = vendor/grammars/Scalate.tmbundle url = https://github.com/scalate/Scalate.tmbundle [submodule "vendor/grammars/Scenic-tmLanguage"] path = vendor/grammars/Scenic-tmLanguage url = https://github.com/UCSCFormalMethods/Scenic-tmLanguage.git [submodule "vendor/grammars/Slash.tmbundle"] path = vendor/grammars/Slash.tmbundle url = https://github.com/slash-lang/Slash.tmbundle [submodule "vendor/grammars/Stata.tmbundle"] path = vendor/grammars/Stata.tmbundle url = https://github.com/pschumm/Stata.tmbundle [submodule "vendor/grammars/Stylus"] path = vendor/grammars/Stylus url = https://github.com/billymoon/Stylus [submodule "vendor/grammars/Sublime-Coq"] path = vendor/grammars/Sublime-Coq url = https://github.com/mkolosick/Sublime-Coq [submodule "vendor/grammars/Sublime-HTTP"] path = vendor/grammars/Sublime-HTTP url = https://github.com/samsalisbury/Sublime-HTTP [submodule "vendor/grammars/Sublime-Lasso"] path = vendor/grammars/Sublime-Lasso url = https://github.com/bfad/Sublime-Lasso [submodule "vendor/grammars/Sublime-Loom"] path = vendor/grammars/Sublime-Loom url = https://github.com/ambethia/Sublime-Loom [submodule "vendor/grammars/Sublime-Modula-2"] path = vendor/grammars/Sublime-Modula-2 url = https://github.com/harogaston/Sublime-Modula-2 [submodule "vendor/grammars/Sublime-Nit"] path = vendor/grammars/Sublime-Nit url = https://github.com/R4PaSs/Sublime-Nit [submodule "vendor/grammars/Sublime-Pep8"] path = vendor/grammars/Sublime-Pep8 url = https://github.com/R4PaSs/Sublime-Pep8 [submodule "vendor/grammars/Sublime-QML"] path = vendor/grammars/Sublime-QML url = https://github.com/skozlovf/Sublime-QML [submodule "vendor/grammars/Sublime-REBOL"] path = vendor/grammars/Sublime-REBOL url = https://github.com/Oldes/Sublime-REBOL [submodule "vendor/grammars/Sublime-Red"] path = vendor/grammars/Sublime-Red url = https://github.com/Oldes/Sublime-Red [submodule "vendor/grammars/Sublime-SQF-Language"] path = vendor/grammars/Sublime-SQF-Language url = https://github.com/JonBons/Sublime-SQF-Language [submodule "vendor/grammars/SublimeBrainfuck"] path = vendor/grammars/SublimeBrainfuck url = https://github.com/Drako/SublimeBrainfuck [submodule "vendor/grammars/SublimeClarion"] path = vendor/grammars/SublimeClarion url = https://github.com/fushnisoft/SublimeClarion [submodule "vendor/grammars/SublimeEthereum"] path = vendor/grammars/SublimeEthereum url = https://github.com/davidhq/SublimeEthereum.git branch = linguist [submodule "vendor/grammars/SublimeGDB"] path = vendor/grammars/SublimeGDB url = https://github.com/quarnster/SublimeGDB [submodule "vendor/grammars/SublimePapyrus"] path = vendor/grammars/SublimePapyrus url = https://github.com/Kapiainen/SublimePapyrus [submodule "vendor/grammars/SublimePuppet"] path = vendor/grammars/SublimePuppet url = https://github.com/russCloak/SublimePuppet [submodule "vendor/grammars/SublimeXtend"] path = vendor/grammars/SublimeXtend url = https://github.com/staltz/SublimeXtend [submodule "vendor/grammars/Syntax-highlighting-for-PostCSS"] path = vendor/grammars/Syntax-highlighting-for-PostCSS url = https://github.com/hudochenkov/Syntax-highlighting-for-PostCSS [submodule "vendor/grammars/SystemVerilog"] path = vendor/grammars/SystemVerilog url = https://github.com/TheClams/SystemVerilog [submodule "vendor/grammars/TLA"] path = vendor/grammars/TLA url = https://github.com/agentultra/TLAGrammar [submodule "vendor/grammars/TXL"] path = vendor/grammars/TXL url = https://github.com/MikeHoffert/Sublime-Text-TXL-syntax [submodule "vendor/grammars/Textmate-Gosu-Bundle"] path = vendor/grammars/Textmate-Gosu-Bundle url = https://github.com/jpcamara/Textmate-Gosu-Bundle [submodule "vendor/grammars/TypeScript-TmLanguage"] path = vendor/grammars/TypeScript-TmLanguage url = https://github.com/Microsoft/TypeScript-TmLanguage [submodule "vendor/grammars/UrWeb-Language-Definition"] path = vendor/grammars/UrWeb-Language-Definition url = https://github.com/gwalborn/UrWeb-Language-Definition.git [submodule "vendor/grammars/VBDotNetSyntax"] path = vendor/grammars/VBDotNetSyntax url = https://github.com/peters-ben-0007/VBDotNetSyntax.git [submodule "vendor/grammars/Vala-TMBundle"] path = vendor/grammars/Vala-TMBundle url = https://github.com/technosophos/Vala-TMBundle [submodule "vendor/grammars/VscodeAdblockSyntax"] path = vendor/grammars/VscodeAdblockSyntax url = https://github.com/AdguardTeam/VscodeAdblockSyntax.git [submodule "vendor/grammars/WhileySyntaxBundle"] path = vendor/grammars/WhileySyntaxBundle url = https://github.com/Whiley/WhileySyntaxBundle.git [submodule "vendor/grammars/X10"] path = vendor/grammars/X10 url = https://github.com/x10-lang/x10-highlighting [submodule "vendor/grammars/XojoSyntaxTM"] path = vendor/grammars/XojoSyntaxTM url = https://github.com/jimmckay/XojoSyntaxTM [submodule "vendor/grammars/ZenScript-tmLanguage"] path = vendor/grammars/ZenScript-tmLanguage url = https://github.com/CraftTweaker/ZenScript-tmLanguage [submodule "vendor/grammars/abap-cds-grammar"] path = vendor/grammars/abap-cds-grammar url = https://github.com/FreHu/abap-cds-grammar [submodule "vendor/grammars/abap.tmbundle"] path = vendor/grammars/abap.tmbundle url = https://github.com/pvl/abap.tmbundle [submodule "vendor/grammars/abl-tmlanguage"] path = vendor/grammars/abl-tmlanguage url = https://github.com/chriscamicas/abl-tmlanguage [submodule "vendor/grammars/actionscript3-tmbundle"] path = vendor/grammars/actionscript3-tmbundle url = https://github.com/simongregory/actionscript3-tmbundle [submodule "vendor/grammars/ada.tmbundle"] path = vendor/grammars/ada.tmbundle url = https://github.com/textmate/ada.tmbundle [submodule "vendor/grammars/agda-github-syntax-highlighting"] path = vendor/grammars/agda-github-syntax-highlighting url = https://github.com/agda/agda-github-syntax-highlighting [submodule "vendor/grammars/aidl-language"] path = vendor/grammars/aidl-language url = https://github.com/google/aidl-language [submodule "vendor/grammars/ampl"] path = vendor/grammars/ampl url = https://github.com/ampl/sublime-ampl [submodule "vendor/grammars/android-system-tools"] path = vendor/grammars/android-system-tools url = https://github.com/flimberger/android-system-tools [submodule "vendor/grammars/ant.tmbundle"] path = vendor/grammars/ant.tmbundle url = https://github.com/textmate/ant.tmbundle [submodule "vendor/grammars/antlr.tmbundle"] path = vendor/grammars/antlr.tmbundle url = https://github.com/textmate/antlr.tmbundle [submodule "vendor/grammars/apex-tmLanguage"] path = vendor/grammars/apex-tmLanguage url = https://github.com/forcedotcom/apex-tmLanguage.git [submodule "vendor/grammars/api-blueprint-sublime-plugin"] path = vendor/grammars/api-blueprint-sublime-plugin url = https://github.com/apiaryio/api-blueprint-sublime-plugin [submodule "vendor/grammars/applescript.tmbundle"] path = vendor/grammars/applescript.tmbundle url = https://github.com/textmate/applescript.tmbundle [submodule "vendor/grammars/asciidoc.tmbundle"] path = vendor/grammars/asciidoc.tmbundle url = https://github.com/zuckschwerdt/asciidoc.tmbundle [submodule "vendor/grammars/asp-syntax-highlight"] path = vendor/grammars/asp-syntax-highlight url = https://github.com/nickswalker/asp-syntax-highlight.git [submodule "vendor/grammars/asp.tmbundle"] path = vendor/grammars/asp.tmbundle url = https://github.com/textmate/asp.tmbundle [submodule "vendor/grammars/assembly"] path = vendor/grammars/assembly url = https://github.com/nanoant/assembly.tmbundle [submodule "vendor/grammars/astro"] path = vendor/grammars/astro url = https://github.com/withastro/astro.git [submodule "vendor/grammars/atom-editorconfig"] path = vendor/grammars/atom-editorconfig url = https://github.com/sindresorhus/atom-editorconfig [submodule "vendor/grammars/atom-firestore-grammar"] path = vendor/grammars/atom-firestore-grammar url = https://github.com/jaysquared/atom-firestore-grammar [submodule "vendor/grammars/atom-fstar"] path = vendor/grammars/atom-fstar url = https://github.com/FStarLang/atom-fstar [submodule "vendor/grammars/atom-language-clean"] path = vendor/grammars/atom-language-clean url = https://github.com/timjs/atom-language-clean.git [submodule "vendor/grammars/atom-language-haproxy"] path = vendor/grammars/atom-language-haproxy url = https://github.com/abulimov/atom-language-haproxy [submodule "vendor/grammars/atom-language-innosetup"] path = vendor/grammars/atom-language-innosetup url = https://github.com/idleberg/atom-language-innosetup [submodule "vendor/grammars/atom-language-julia"] path = vendor/grammars/atom-language-julia url = https://github.com/JuliaEditorSupport/atom-language-julia [submodule "vendor/grammars/atom-language-nextflow"] path = vendor/grammars/atom-language-nextflow url = https://github.com/nextflow-io/atom-language-nextflow [submodule "vendor/grammars/atom-language-p4"] path = vendor/grammars/atom-language-p4 url = https://github.com/TakeshiTseng/atom-language-p4 [submodule "vendor/grammars/atom-language-perl6"] path = vendor/grammars/atom-language-perl6 url = https://github.com/perl6/atom-language-perl6 [submodule "vendor/grammars/atom-language-purescript"] path = vendor/grammars/atom-language-purescript url = https://github.com/purescript-contrib/atom-language-purescript [submodule "vendor/grammars/atom-language-stan"] path = vendor/grammars/atom-language-stan url = https://github.com/stan-dev/atom-language-stan.git [submodule "vendor/grammars/atom-miniyaml"] path = vendor/grammars/atom-miniyaml url = https://github.com/OpenRA/atom-miniyaml.git [submodule "vendor/grammars/atom-salt"] path = vendor/grammars/atom-salt url = https://github.com/saltstack/atom-salt [submodule "vendor/grammars/ats"] path = vendor/grammars/ats url = https://github.com/steinwaywhw/ats-mode-sublimetext [submodule "vendor/grammars/avro.tmLanguage"] path = vendor/grammars/avro.tmLanguage url = https://github.com/Jason3S/avro.tmLanguage [submodule "vendor/grammars/awk-sublime"] path = vendor/grammars/awk-sublime url = https://github.com/github-linguist/awk-sublime [submodule "vendor/grammars/b-vscode"] path = vendor/grammars/b-vscode url = https://github.com/JJWRoeloffs/b-vscode.git [submodule "vendor/grammars/ballerina-grammar"] path = vendor/grammars/ballerina-grammar url = https://github.com/ballerina-platform/ballerina-grammar [submodule "vendor/grammars/berry-grammar"] path = vendor/grammars/berry-grammar url = https://github.com/berry-lang/berry-grammar.git [submodule "vendor/grammars/bicep"] path = vendor/grammars/bicep url = https://github.com/azure/bicep [submodule "vendor/grammars/bikeshed"] path = vendor/grammars/bikeshed url = https://github.com/tabatkins/bikeshed.git [submodule "vendor/grammars/blitzmax"] path = vendor/grammars/blitzmax url = https://github.com/textmate/blitzmax.tmbundle [submodule "vendor/grammars/boogie-vscode"] path = vendor/grammars/boogie-vscode url = https://github.com/boogie-org/boogie-vscode [submodule "vendor/grammars/bqn-vscode"] path = vendor/grammars/bqn-vscode url = https://github.com/razetime/bqn-vscode.git [submodule "vendor/grammars/browserslist-vscode"] path = vendor/grammars/browserslist-vscode url = https://github.com/browserslist/browserslist-vscode [submodule "vendor/grammars/bruno-ide-extensions"] path = vendor/grammars/bruno-ide-extensions url = https://github.com/usebruno/bruno-ide-extensions.git [submodule "vendor/grammars/bst.tmLanguage"] path = vendor/grammars/bst.tmLanguage url = https://github.com/zyoshoka/bst.tmLanguage.git [submodule "vendor/grammars/c.tmbundle"] path = vendor/grammars/c.tmbundle url = https://github.com/mikomikotaishi/c.tmbundle.git [submodule "vendor/grammars/cairo-tm-grammar"] path = vendor/grammars/cairo-tm-grammar url = https://github.com/software-mansion-labs/cairo-tm-grammar.git [submodule "vendor/grammars/capnproto.tmbundle"] path = vendor/grammars/capnproto.tmbundle url = https://github.com/textmate/capnproto.tmbundle [submodule "vendor/grammars/carto-atom"] path = vendor/grammars/carto-atom url = https://github.com/yohanboniface/carto-atom [submodule "vendor/grammars/cds-textmate-grammar"] path = vendor/grammars/cds-textmate-grammar url = https://github.com/SAP/cds-textmate-grammar.git [submodule "vendor/grammars/ceylon-sublimetext"] path = vendor/grammars/ceylon-sublimetext url = https://github.com/jeancharles-roger/ceylon-sublimetext [submodule "vendor/grammars/chapel-tmbundle"] path = vendor/grammars/chapel-tmbundle url = https://github.com/chapel-lang/chapel-tmbundle [submodule "vendor/grammars/circom-highlighting-vscode"] path = vendor/grammars/circom-highlighting-vscode url = https://github.com/iden3/circom-highlighting-vscode.git [submodule "vendor/grammars/clarity.tmbundle"] path = vendor/grammars/clarity.tmbundle url = https://github.com/hirosystems/clarity.tmbundle.git [submodule "vendor/grammars/code-peggy-language"] path = vendor/grammars/code-peggy-language url = https://github.com/peggyjs/code-peggy-language.git [submodule "vendor/grammars/common-lisp-tmlanguage"] path = vendor/grammars/common-lisp-tmlanguage url = https://github.com/qingpeng9802/common-lisp-tmlanguage.git [submodule "vendor/grammars/conllu-linguist-grammar"] path = vendor/grammars/conllu-linguist-grammar url = https://github.com/odanoburu/conllu-linguist-grammar [submodule "vendor/grammars/cool-tmbundle"] path = vendor/grammars/cool-tmbundle url = https://github.com/anunayk/cool-tmbundle [submodule "vendor/grammars/cpp-qt.tmbundle"] path = vendor/grammars/cpp-qt.tmbundle url = https://github.com/textmate/cpp-qt.tmbundle [submodule "vendor/grammars/cqlTextMate"] path = vendor/grammars/cqlTextMate url = https://github.com/Akzestia/cqlTextMate.git [submodule "vendor/grammars/creole"] path = vendor/grammars/creole url = https://github.com/Siddley/Creole [submodule "vendor/grammars/cron.tmbundle"] path = vendor/grammars/cron.tmbundle url = https://github.com/textmate/cron.tmbundle [submodule "vendor/grammars/csharp-tmLanguage"] path = vendor/grammars/csharp-tmLanguage url = https://github.com/dotnet/csharp-tmLanguage [submodule "vendor/grammars/cucumber-tmbundle"] path = vendor/grammars/cucumber-tmbundle url = https://github.com/cucumber/cucumber-tmbundle [submodule "vendor/grammars/cython"] path = vendor/grammars/cython url = https://github.com/textmate/cython.tmbundle [submodule "vendor/grammars/d.tmbundle"] path = vendor/grammars/d.tmbundle url = https://github.com/textmate/d.tmbundle [submodule "vendor/grammars/d2-vscode"] path = vendor/grammars/d2-vscode url = https://github.com/terrastruct/d2-vscode.git [submodule "vendor/grammars/dart-syntax-highlight"] path = vendor/grammars/dart-syntax-highlight url = https://github.com/dart-lang/dart-syntax-highlight [submodule "vendor/grammars/daslang-grammar"] path = vendor/grammars/daslang-grammar url = https://github.com/moleium/daslang-grammar.git [submodule "vendor/grammars/data-weave-tmLanguage"] path = vendor/grammars/data-weave-tmLanguage url = https://github.com/mulesoft-labs/data-weave-tmLanguage [submodule "vendor/grammars/denizenscript-grammar"] path = vendor/grammars/denizenscript-grammar url = https://github.com/DenizenScript/denizenscript-grammar.git [submodule "vendor/grammars/desktop.tmbundle"] path = vendor/grammars/desktop.tmbundle url = https://github.com/Mailaender/desktop.tmbundle.git [submodule "vendor/grammars/diff.tmbundle"] path = vendor/grammars/diff.tmbundle url = https://github.com/textmate/diff.tmbundle [submodule "vendor/grammars/dm-syntax"] path = vendor/grammars/dm-syntax url = https://github.com/spacestation13/dm-syntax.git [submodule "vendor/grammars/dylan.tmbundle"] path = vendor/grammars/dylan.tmbundle url = https://github.com/textmate/dylan.tmbundle [submodule "vendor/grammars/earthfile-grammar"] path = vendor/grammars/earthfile-grammar url = https://github.com/earthly/earthfile-grammar.git [submodule "vendor/grammars/ec.tmbundle"] path = vendor/grammars/ec.tmbundle url = https://github.com/ecere/ec.tmbundle [submodule "vendor/grammars/ecl-tmLanguage"] path = vendor/grammars/ecl-tmLanguage url = https://github.com/hpcc-systems/ecl-tmLanguage [submodule "vendor/grammars/edge-vscode"] path = vendor/grammars/edge-vscode url = https://github.com/edge-js/edge-vscode.git [submodule "vendor/grammars/edgedb-editor-plugin"] path = vendor/grammars/edgedb-editor-plugin url = https://github.com/edgedb/edgedb-editor-plugin.git [submodule "vendor/grammars/eiffel.tmbundle"] path = vendor/grammars/eiffel.tmbundle url = https://github.com/textmate/eiffel.tmbundle [submodule "vendor/grammars/ejs-tmbundle"] path = vendor/grammars/ejs-tmbundle url = https://github.com/gregory-m/ejs-tmbundle [submodule "vendor/grammars/elixir-tmbundle"] path = vendor/grammars/elixir-tmbundle url = https://github.com/elixir-lang/elixir-tmbundle [submodule "vendor/grammars/elvish"] path = vendor/grammars/elvish url = https://github.com/elves/elvish.git [submodule "vendor/grammars/factor"] path = vendor/grammars/factor url = https://github.com/slavapestov/factor [submodule "vendor/grammars/fancy-tmbundle"] path = vendor/grammars/fancy-tmbundle url = https://github.com/fancy-lang/fancy-tmbundle [submodule "vendor/grammars/firrtl-syntax"] path = vendor/grammars/firrtl-syntax url = https://github.com/chipsalliance/firrtl-syntax.git [submodule "vendor/grammars/fish-tmbundle"] path = vendor/grammars/fish-tmbundle url = https://github.com/l15n/fish-tmbundle [submodule "vendor/grammars/forth"] path = vendor/grammars/forth url = https://github.com/textmate/forth.tmbundle [submodule "vendor/grammars/fortran.tmbundle"] path = vendor/grammars/fortran.tmbundle url = https://github.com/textmate/fortran.tmbundle [submodule "vendor/grammars/gap-tmbundle"] path = vendor/grammars/gap-tmbundle url = https://github.com/dhowden/gap-tmbundle [submodule "vendor/grammars/gemfile-lock-tmlanguage"] path = vendor/grammars/gemfile-lock-tmlanguage url = https://github.com/hmarr/gemfile-lock-tmlanguage [submodule "vendor/grammars/gemini-vscode"] path = vendor/grammars/gemini-vscode url = https://github.com/printfn/gemini-vscode.git [submodule "vendor/grammars/gettext.tmbundle"] path = vendor/grammars/gettext.tmbundle url = https://github.com/textmate/gettext.tmbundle [submodule "vendor/grammars/gnuplot-tmbundle"] path = vendor/grammars/gnuplot-tmbundle url = https://github.com/mattfoster/gnuplot-tmbundle [submodule "vendor/grammars/go-tmbundle"] path = vendor/grammars/go-tmbundle url = https://github.com/AlanQuatermain/go-tmbundle [submodule "vendor/grammars/godot-vscode-plugin"] path = vendor/grammars/godot-vscode-plugin url = https://github.com/godotengine/godot-vscode-plugin [submodule "vendor/grammars/grace"] path = vendor/grammars/grace url = https://github.com/zmthy/grace-tmbundle [submodule "vendor/grammars/gradle.tmbundle"] path = vendor/grammars/gradle.tmbundle url = https://github.com/alkemist/gradle.tmbundle [submodule "vendor/grammars/grammar"] path = vendor/grammars/grammar url = https://github.com/erlang-ls/grammar.git [submodule "vendor/grammars/graphiql"] path = vendor/grammars/graphiql url = https://github.com/graphql/graphiql.git [submodule "vendor/grammars/graphviz.tmbundle"] path = vendor/grammars/graphviz.tmbundle url = https://github.com/textmate/graphviz.tmbundle [submodule "vendor/grammars/groovy.tmbundle"] path = vendor/grammars/groovy.tmbundle url = https://github.com/textmate/groovy.tmbundle [submodule "vendor/grammars/haxe-TmLanguage"] path = vendor/grammars/haxe-TmLanguage url = https://github.com/vshaxe/haxe-TmLanguage [submodule "vendor/grammars/holyc.tmbundle"] path = vendor/grammars/holyc.tmbundle url = https://github.com/codingdandy/holyc.tmbundle [submodule "vendor/grammars/hoon-grammar"] path = vendor/grammars/hoon-grammar url = https://github.com/pkova/hoon-grammar.git [submodule "vendor/grammars/iCalendar-sublime"] path = vendor/grammars/iCalendar-sublime url = https://github.com/kimsey0/iCalendar-sublime.git [submodule "vendor/grammars/ide-tools"] path = vendor/grammars/ide-tools url = https://github.com/toitware/ide-tools.git [submodule "vendor/grammars/idl.tmbundle"] path = vendor/grammars/idl.tmbundle url = https://github.com/mgalloy/idl.tmbundle [submodule "vendor/grammars/idris"] path = vendor/grammars/idris url = https://github.com/idris-hackers/idris-sublime.git [submodule "vendor/grammars/imba-linguist-grammar"] path = vendor/grammars/imba-linguist-grammar url = https://github.com/imba/imba-linguist-grammar.git [submodule "vendor/grammars/ini.tmbundle"] path = vendor/grammars/ini.tmbundle url = https://github.com/textmate/ini.tmbundle [submodule "vendor/grammars/ink-tmlanguage"] path = vendor/grammars/ink-tmlanguage url = https://github.com/inkle/ink-tmlanguage.git [submodule "vendor/grammars/io.tmbundle"] path = vendor/grammars/io.tmbundle url = https://github.com/textmate/io.tmbundle [submodule "vendor/grammars/ioke-outdated"] path = vendor/grammars/ioke-outdated url = https://github.com/vic/ioke-outdated [submodule "vendor/grammars/ionide-fsgrammar"] path = vendor/grammars/ionide-fsgrammar url = https://github.com/ionide/ionide-fsgrammar [submodule "vendor/grammars/ispc.syntax"] path = vendor/grammars/ispc.syntax url = https://github.com/ispc/ispc.syntax.git [submodule "vendor/grammars/jac-vscode"] path = vendor/grammars/jac-vscode url = https://github.com/jaseci-labs/jac-vscode.git [submodule "vendor/grammars/jade-tmbundle"] path = vendor/grammars/jade-tmbundle url = https://github.com/davidrios/jade-tmbundle [submodule "vendor/grammars/jasmin-sublime"] path = vendor/grammars/jasmin-sublime url = https://github.com/atmarksharp/jasmin-sublime [submodule "vendor/grammars/java.tmbundle"] path = vendor/grammars/java.tmbundle url = https://github.com/textmate/java.tmbundle [submodule "vendor/grammars/javadoc.tmbundle"] path = vendor/grammars/javadoc.tmbundle url = https://github.com/textmate/javadoc.tmbundle [submodule "vendor/grammars/javascript-objective-j.tmbundle"] path = vendor/grammars/javascript-objective-j.tmbundle url = https://github.com/textmate/javascript-objective-j.tmbundle [submodule "vendor/grammars/jflex.tmbundle"] path = vendor/grammars/jflex.tmbundle url = https://github.com/jflex-de/jflex.tmbundle.git [submodule "vendor/grammars/jte-template-syntax-highlight"] path = vendor/grammars/jte-template-syntax-highlight url = https://github.com/maj2c/jte-template-syntax-highlight.git [submodule "vendor/grammars/kivy-language-grammer"] path = vendor/grammars/kivy-language-grammer url = https://github.com/p0lygun/kivy-language-grammer.git [submodule "vendor/grammars/koka-textmate-grammar"] path = vendor/grammars/koka-textmate-grammar url = https://github.com/koka-community/koka-textmate-grammar.git [submodule "vendor/grammars/kusto-sublime"] path = vendor/grammars/kusto-sublime url = https://github.com/mmanela/kusto-sublime.git [submodule "vendor/grammars/language-4d"] path = vendor/grammars/language-4d url = https://github.com/4d/language-4d.git [submodule "vendor/grammars/language-agc"] path = vendor/grammars/language-agc url = https://github.com/Alhadis/language-agc [submodule "vendor/grammars/language-algol60"] path = vendor/grammars/language-algol60 url = https://github.com/PolariTOON/language-algol60.git [submodule "vendor/grammars/language-apl"] path = vendor/grammars/language-apl url = https://github.com/Alhadis/language-apl.git [submodule "vendor/grammars/language-asl"] path = vendor/grammars/language-asl url = https://github.com/sebadur/language-asl [submodule "vendor/grammars/language-asn1"] path = vendor/grammars/language-asn1 url = https://github.com/ajlangley/language-asn1 [submodule "vendor/grammars/language-basic"] path = vendor/grammars/language-basic url = https://github.com/telnet23/language-basic [submodule "vendor/grammars/language-batchfile"] path = vendor/grammars/language-batchfile url = https://github.com/mmims/language-batchfile [submodule "vendor/grammars/language-bh"] path = vendor/grammars/language-bh url = https://github.com/B-Lang-org/language-bh.git [submodule "vendor/grammars/language-blade"] path = vendor/grammars/language-blade url = https://github.com/jawee/language-blade [submodule "vendor/grammars/language-click"] path = vendor/grammars/language-click url = https://github.com/stenverbois/language-click.git [submodule "vendor/grammars/language-clojure"] path = vendor/grammars/language-clojure url = https://github.com/atom/language-clojure [submodule "vendor/grammars/language-closure-templates"] path = vendor/grammars/language-closure-templates url = https://github.com/mthadley/language-closure-templates [submodule "vendor/grammars/language-coffee-script"] path = vendor/grammars/language-coffee-script url = https://github.com/atom/language-coffee-script [submodule "vendor/grammars/language-crystal"] path = vendor/grammars/language-crystal url = https://github.com/atom-crystal/language-crystal [submodule "vendor/grammars/language-csound"] path = vendor/grammars/language-csound url = https://github.com/nwhetsell/language-csound [submodule "vendor/grammars/language-css"] path = vendor/grammars/language-css url = https://github.com/atom/language-css [submodule "vendor/grammars/language-cwl"] path = vendor/grammars/language-cwl url = https://github.com/manabuishii/language-cwl [submodule "vendor/grammars/language-debian"] path = vendor/grammars/language-debian url = https://github.com/tsbarnes/language-debian.git [submodule "vendor/grammars/language-dircolors"] path = vendor/grammars/language-dircolors url = https://github.com/jolkdarr/language-dircolors [submodule "vendor/grammars/language-dsv"] path = vendor/grammars/language-dsv url = https://github.com/Alhadis/language-dsv.git [submodule "vendor/grammars/language-emacs-lisp"] path = vendor/grammars/language-emacs-lisp url = https://github.com/Alhadis/language-emacs-lisp [submodule "vendor/grammars/language-eml"] path = vendor/grammars/language-eml url = https://github.com/mariozaizar/language-eml [submodule "vendor/grammars/language-etc"] path = vendor/grammars/language-etc url = https://github.com/Alhadis/language-etc [submodule "vendor/grammars/language-faust"] path = vendor/grammars/language-faust url = https://github.com/jpcima/language-faust [submodule "vendor/grammars/language-fontforge"] path = vendor/grammars/language-fontforge url = https://github.com/Alhadis/language-fontforge [submodule "vendor/grammars/language-gf"] path = vendor/grammars/language-gf url = https://github.com/johnjcamilleri/language-gf [submodule "vendor/grammars/language-gn"] path = vendor/grammars/language-gn url = https://github.com/devoncarew/language-gn [submodule "vendor/grammars/language-grammars"] path = vendor/grammars/language-grammars url = https://github.com/Alhadis/language-grammars [submodule "vendor/grammars/language-haml"] path = vendor/grammars/language-haml url = https://github.com/ezekg/language-haml [submodule "vendor/grammars/language-haskell"] path = vendor/grammars/language-haskell url = https://github.com/atom-haskell/language-haskell [submodule "vendor/grammars/language-hocon"] path = vendor/grammars/language-hocon url = https://github.com/jacobwgillespie/language-hocon.git [submodule "vendor/grammars/language-hql"] path = vendor/grammars/language-hql url = https://github.com/adidonato/language-hql [submodule "vendor/grammars/language-html"] path = vendor/grammars/language-html url = https://github.com/atom/language-html [submodule "vendor/grammars/language-hurl"] path = vendor/grammars/language-hurl url = https://github.com/nikeee/language-hurl.git [submodule "vendor/grammars/language-igor"] path = vendor/grammars/language-igor url = https://github.com/byte-physics/language-igor [submodule "vendor/grammars/language-inform7"] path = vendor/grammars/language-inform7 url = https://github.com/iftechfoundation/language-inform7.git [submodule "vendor/grammars/language-javascript"] path = vendor/grammars/language-javascript url = https://github.com/atom/language-javascript [submodule "vendor/grammars/language-jison"] path = vendor/grammars/language-jison url = https://github.com/cdibbs/language-jison [submodule "vendor/grammars/language-jolie"] path = vendor/grammars/language-jolie url = https://github.com/fmontesi/language-jolie [submodule "vendor/grammars/language-jq"] path = vendor/grammars/language-jq url = https://github.com/wader/language-jq [submodule "vendor/grammars/language-jsoniq"] path = vendor/grammars/language-jsoniq url = https://github.com/wcandillon/language-jsoniq [submodule "vendor/grammars/language-jsonnet"] path = vendor/grammars/language-jsonnet url = https://github.com/google/language-jsonnet [submodule "vendor/grammars/language-kak"] path = vendor/grammars/language-kak url = https://github.com/kakoune-editor/language-kak [submodule "vendor/grammars/language-kerboscript"] path = vendor/grammars/language-kerboscript url = https://github.com/KSP-KOS/language-kerboscript.git [submodule "vendor/grammars/language-kickstart"] path = vendor/grammars/language-kickstart url = https://github.com/wgwoods/language-kickstart.git [submodule "vendor/grammars/language-kotlin"] path = vendor/grammars/language-kotlin url = https://github.com/nishtahir/language-kotlin [submodule "vendor/grammars/language-langium"] path = vendor/grammars/language-langium url = https://github.com/eclipse-langium/language-langium.git [submodule "vendor/grammars/language-less"] path = vendor/grammars/language-less url = https://github.com/atom/language-less.git [submodule "vendor/grammars/language-m68k"] path = vendor/grammars/language-m68k url = https://github.com/zerkman/language-m68k [submodule "vendor/grammars/language-macaulay2"] path = vendor/grammars/language-macaulay2 url = https://github.com/Macaulay2/language-macaulay2 [submodule "vendor/grammars/language-maxscript"] path = vendor/grammars/language-maxscript url = https://github.com/Alhadis/language-maxscript [submodule "vendor/grammars/language-mermaid"] path = vendor/grammars/language-mermaid url = https://github.com/Alhadis/language-mermaid.git [submodule "vendor/grammars/language-meson"] path = vendor/grammars/language-meson url = https://github.com/TingPing/language-meson [submodule "vendor/grammars/language-msl"] path = vendor/grammars/language-msl url = https://github.com/gen-angry/language-msl [submodule "vendor/grammars/language-ncl"] path = vendor/grammars/language-ncl url = https://github.com/rpavlick/language-ncl.git [submodule "vendor/grammars/language-ninja"] path = vendor/grammars/language-ninja url = https://github.com/khyo/language-ninja [submodule "vendor/grammars/language-nunjucks"] path = vendor/grammars/language-nunjucks url = https://github.com/alohaas/language-nunjucks [submodule "vendor/grammars/language-pan"] path = vendor/grammars/language-pan url = https://github.com/quattor/language-pan [submodule "vendor/grammars/language-pcb"] path = vendor/grammars/language-pcb url = https://github.com/Alhadis/language-pcb [submodule "vendor/grammars/language-povray"] path = vendor/grammars/language-povray url = https://github.com/c-lipka/language-povray [submodule "vendor/grammars/language-property-list"] path = vendor/grammars/language-property-list url = https://github.com/atom/language-property-list [submodule "vendor/grammars/language-pyret"] path = vendor/grammars/language-pyret url = https://github.com/samuela/language-pyret [submodule "vendor/grammars/language-qasm"] path = vendor/grammars/language-qasm url = https://github.com/tareqdandachi/language-qasm [submodule "vendor/grammars/language-reason"] path = vendor/grammars/language-reason url = https://github.com/reasonml-editor/language-reason [submodule "vendor/grammars/language-reg"] path = vendor/grammars/language-reg url = https://github.com/bsara/language-reg [submodule "vendor/grammars/language-regexp"] path = vendor/grammars/language-regexp url = https://github.com/Alhadis/language-regexp [submodule "vendor/grammars/language-renpy"] path = vendor/grammars/language-renpy url = https://github.com/williamd1k0/language-renpy.git [submodule "vendor/grammars/language-restructuredtext"] path = vendor/grammars/language-restructuredtext url = https://github.com/Lukasa/language-restructuredtext [submodule "vendor/grammars/language-ring"] path = vendor/grammars/language-ring url = https://github.com/MahmoudFayed/atom-language-ring [submodule "vendor/grammars/language-roff"] path = vendor/grammars/language-roff url = https://github.com/Alhadis/language-roff [submodule "vendor/grammars/language-rpm-spec"] path = vendor/grammars/language-rpm-spec url = https://github.com/waveclaw/language-rpm-spec [submodule "vendor/grammars/language-rtf"] path = vendor/grammars/language-rtf url = https://github.com/nwhetsell/language-rtf [submodule "vendor/grammars/language-ruby"] path = vendor/grammars/language-ruby url = https://github.com/atom/language-ruby [submodule "vendor/grammars/language-sass"] path = vendor/grammars/language-sass url = https://github.com/atom/language-sass [submodule "vendor/grammars/language-sed"] path = vendor/grammars/language-sed url = https://github.com/Alhadis/language-sed [submodule "vendor/grammars/language-shellscript"] path = vendor/grammars/language-shellscript url = https://github.com/atom/language-shellscript [submodule "vendor/grammars/language-subtitles"] path = vendor/grammars/language-subtitles url = https://github.com/Alhadis/language-subtitles.git [submodule "vendor/grammars/language-supercollider"] path = vendor/grammars/language-supercollider url = https://github.com/supercollider/language-supercollider [submodule "vendor/grammars/language-texinfo"] path = vendor/grammars/language-texinfo url = https://github.com/Alhadis/language-texinfo [submodule "vendor/grammars/language-ti-basic"] path = vendor/grammars/language-ti-basic url = https://github.com/TIny-Hacker/language-ti-basic.git [submodule "vendor/grammars/language-toc-wow"] path = vendor/grammars/language-toc-wow url = https://github.com/nebularg/language-toc-wow [submodule "vendor/grammars/language-tools"] path = vendor/grammars/language-tools url = https://github.com/vuejs/language-tools.git [submodule "vendor/grammars/language-tsql"] path = vendor/grammars/language-tsql url = https://github.com/beau-witter/language-tsql [submodule "vendor/grammars/language-turing"] path = vendor/grammars/language-turing url = https://github.com/Alhadis/language-turing [submodule "vendor/grammars/language-typelanguage"] path = vendor/grammars/language-typelanguage url = https://github.com/goodmind/language-typelanguage [submodule "vendor/grammars/language-viml"] path = vendor/grammars/language-viml url = https://github.com/Alhadis/language-viml [submodule "vendor/grammars/language-wavefront"] path = vendor/grammars/language-wavefront url = https://github.com/Alhadis/language-wavefront [submodule "vendor/grammars/language-webassembly"] path = vendor/grammars/language-webassembly url = https://github.com/Alhadis/language-webassembly [submodule "vendor/grammars/language-xbase"] path = vendor/grammars/language-xbase url = https://github.com/hernad/atom-language-harbour [submodule "vendor/grammars/language-xcompose"] path = vendor/grammars/language-xcompose url = https://github.com/samcv/language-xcompose [submodule "vendor/grammars/language-yaml"] path = vendor/grammars/language-yaml url = https://github.com/atom/language-yaml [submodule "vendor/grammars/language-yang"] path = vendor/grammars/language-yang url = https://github.com/DzonyKalafut/language-yang.git [submodule "vendor/grammars/latex.tmbundle"] path = vendor/grammars/latex.tmbundle url = https://github.com/textmate/latex.tmbundle [submodule "vendor/grammars/leo-linguist"] path = vendor/grammars/leo-linguist url = https://github.com/ProvableHQ/leo-linguist.git [submodule "vendor/grammars/linter-lilypond"] path = vendor/grammars/linter-lilypond url = https://github.com/nwhetsell/linter-lilypond [submodule "vendor/grammars/liquid-tm-grammar"] path = vendor/grammars/liquid-tm-grammar url = https://github.com/Shopify/liquid-tm-grammar.git [submodule "vendor/grammars/lisp.tmbundle"] path = vendor/grammars/lisp.tmbundle url = https://github.com/textmate/lisp.tmbundle [submodule "vendor/grammars/livescript-vscode"] path = vendor/grammars/livescript-vscode url = https://github.com/sharktide/livescript-vscode.git [submodule "vendor/grammars/llvm.tmbundle"] path = vendor/grammars/llvm.tmbundle url = https://github.com/whitequark/llvm.tmbundle [submodule "vendor/grammars/logos"] path = vendor/grammars/logos url = https://github.com/Cykey/Sublime-Logos [submodule "vendor/grammars/logtalk.tmbundle"] path = vendor/grammars/logtalk.tmbundle url = https://github.com/textmate/logtalk.tmbundle [submodule "vendor/grammars/lua.tmbundle"] path = vendor/grammars/lua.tmbundle url = https://github.com/LuaLS/lua.tmbundle.git [submodule "vendor/grammars/m3"] path = vendor/grammars/m3 url = https://github.com/newgrammars/m3 [submodule "vendor/grammars/make.tmbundle"] path = vendor/grammars/make.tmbundle url = https://github.com/textmate/make.tmbundle [submodule "vendor/grammars/mako-tmbundle"] path = vendor/grammars/mako-tmbundle url = https://github.com/marconi/mako-tmbundle [submodule "vendor/grammars/markdown-tm-language"] path = vendor/grammars/markdown-tm-language url = https://github.com/wooorm/markdown-tm-language.git [submodule "vendor/grammars/marko-tmbundle"] path = vendor/grammars/marko-tmbundle url = https://github.com/marko-js/marko-tmbundle [submodule "vendor/grammars/mathematica-tmbundle"] path = vendor/grammars/mathematica-tmbundle url = https://github.com/shadanan/mathematica-tmbundle [submodule "vendor/grammars/maven.tmbundle"] path = vendor/grammars/maven.tmbundle url = https://github.com/textmate/maven.tmbundle [submodule "vendor/grammars/mediawiki.tmbundle"] path = vendor/grammars/mediawiki.tmbundle url = https://github.com/textmate/mediawiki.tmbundle [submodule "vendor/grammars/mercury-tmlanguage"] path = vendor/grammars/mercury-tmlanguage url = https://github.com/sebgod/mercury-tmlanguage [submodule "vendor/grammars/metta-textmate-linguist"] path = vendor/grammars/metta-textmate-linguist url = https://github.com/Abigiya-M/metta-textmate-linguist.git [submodule "vendor/grammars/mint-vscode"] path = vendor/grammars/mint-vscode url = https://github.com/mint-lang/mint-vscode [submodule "vendor/grammars/mlir-grammar"] path = vendor/grammars/mlir-grammar url = https://github.com/jpienaar/mlir-grammar [submodule "vendor/grammars/mojo-syntax"] path = vendor/grammars/mojo-syntax url = https://github.com/modularml/mojo-syntax.git [submodule "vendor/grammars/monkey"] path = vendor/grammars/monkey url = https://github.com/gingerbeardman/monkey.tmbundle [submodule "vendor/grammars/moonbit-tmLanguage"] path = vendor/grammars/moonbit-tmLanguage url = https://github.com/moonbitlang/moonbit-tmLanguage.git [submodule "vendor/grammars/moonscript-tmbundle"] path = vendor/grammars/moonscript-tmbundle url = https://github.com/leafo/moonscript-tmbundle [submodule "vendor/grammars/mps-vscode"] path = vendor/grammars/mps-vscode url = https://github.com/sharktide/mps-vscode.git [submodule "vendor/grammars/nemerle.tmbundle"] path = vendor/grammars/nemerle.tmbundle url = https://github.com/textmate/nemerle.tmbundle [submodule "vendor/grammars/nesC"] path = vendor/grammars/nesC url = https://github.com/cdwilson/nesC.tmbundle [submodule "vendor/grammars/nickel"] path = vendor/grammars/nickel url = https://github.com/tweag/nickel.git [submodule "vendor/grammars/nix-linguist"] path = vendor/grammars/nix-linguist url = https://github.com/sambacha/nix-linguist.git [submodule "vendor/grammars/nu-grammar"] path = vendor/grammars/nu-grammar url = https://github.com/hustcer/nu-grammar.git [submodule "vendor/grammars/nu.tmbundle"] path = vendor/grammars/nu.tmbundle url = https://github.com/jsallis/nu.tmbundle [submodule "vendor/grammars/objective-c.tmbundle"] path = vendor/grammars/objective-c.tmbundle url = https://github.com/textmate/objective-c.tmbundle [submodule "vendor/grammars/ocaml.tmbundle"] path = vendor/grammars/ocaml.tmbundle url = https://github.com/textmate/ocaml.tmbundle [submodule "vendor/grammars/omnetpp-textmate-msg"] path = vendor/grammars/omnetpp-textmate-msg url = https://github.com/omnetpp/omnetpp-textmate-msg.git [submodule "vendor/grammars/omnetpp-textmate-ned"] path = vendor/grammars/omnetpp-textmate-ned url = https://github.com/omnetpp/omnetpp-textmate-ned.git [submodule "vendor/grammars/ooc.tmbundle"] path = vendor/grammars/ooc.tmbundle url = https://github.com/nilium/ooc.tmbundle [submodule "vendor/grammars/opa.tmbundle"] path = vendor/grammars/opa.tmbundle url = https://github.com/mads379/opa.tmbundle [submodule "vendor/grammars/openscad.tmbundle"] path = vendor/grammars/openscad.tmbundle url = https://github.com/tbuser/openscad.tmbundle [submodule "vendor/grammars/overpassql-tmlanguage"] path = vendor/grammars/overpassql-tmlanguage url = https://github.com/nickswalker/overpassql-tmlanguage.git [submodule "vendor/grammars/oz-tmbundle"] path = vendor/grammars/oz-tmbundle url = https://github.com/eregon/oz-tmbundle [submodule "vendor/grammars/pact-atom"] path = vendor/grammars/pact-atom url = https://github.com/kadena-io/pact-atom.git [submodule "vendor/grammars/parrot"] path = vendor/grammars/parrot url = https://github.com/textmate/parrot.tmbundle [submodule "vendor/grammars/pascal.tmbundle"] path = vendor/grammars/pascal.tmbundle url = https://github.com/textmate/pascal.tmbundle [submodule "vendor/grammars/pawn-sublime-language"] path = vendor/grammars/pawn-sublime-language url = https://github.com/Southclaw/pawn-sublime-language.git [submodule "vendor/grammars/perl.tmbundle"] path = vendor/grammars/perl.tmbundle url = https://github.com/textmate/perl.tmbundle [submodule "vendor/grammars/php-smarty.tmbundle"] path = vendor/grammars/php-smarty.tmbundle url = https://github.com/textmate/php-smarty.tmbundle [submodule "vendor/grammars/php.tmbundle"] path = vendor/grammars/php.tmbundle url = https://github.com/ondrejmirtes/php.tmbundle.git [submodule "vendor/grammars/pig-latin"] path = vendor/grammars/pig-latin url = https://github.com/goblindegook/sublime-text-pig-latin [submodule "vendor/grammars/pike-textmate"] path = vendor/grammars/pike-textmate url = https://github.com/hww3/pike-textmate [submodule "vendor/grammars/pkl.tmbundle"] path = vendor/grammars/pkl.tmbundle url = https://github.com/apple/pkl.tmbundle.git [submodule "vendor/grammars/playground-cj"] path = vendor/grammars/playground-cj url = https://github.com/Zxilly/playground-cj.git [submodule "vendor/grammars/polar-grammar"] path = vendor/grammars/polar-grammar url = https://github.com/osohq/polar-grammar.git [submodule "vendor/grammars/portugol-grammar"] path = vendor/grammars/portugol-grammar url = https://github.com/luisgbr1el/portugol-grammar.git [submodule "vendor/grammars/powershell"] path = vendor/grammars/powershell url = https://github.com/PowerShell/EditorSyntax [submodule "vendor/grammars/praatvscode"] path = vendor/grammars/praatvscode url = https://github.com/orhunulusahin/praatvscode.git [submodule "vendor/grammars/processing.tmbundle"] path = vendor/grammars/processing.tmbundle url = https://github.com/textmate/processing.tmbundle [submodule "vendor/grammars/python-django.tmbundle"] path = vendor/grammars/python-django.tmbundle url = https://github.com/textmate/python-django.tmbundle [submodule "vendor/grammars/qsharp"] path = vendor/grammars/qsharp url = https://github.com/microsoft/qsharp.git [submodule "vendor/grammars/quake"] path = vendor/grammars/quake url = https://github.com/newgrammars/quake [submodule "vendor/grammars/quakec-syntax"] path = vendor/grammars/quakec-syntax url = https://github.com/4LT/quakec-syntax.git [submodule "vendor/grammars/r.tmbundle"] path = vendor/grammars/r.tmbundle url = https://github.com/textmate/r.tmbundle [submodule "vendor/grammars/rascal-syntax-highlighting"] path = vendor/grammars/rascal-syntax-highlighting url = https://github.com/usethesource/rascal-syntax-highlighting [submodule "vendor/grammars/rascript-syntax"] path = vendor/grammars/rascript-syntax url = https://github.com/joshraphael/rascript-syntax.git [submodule "vendor/grammars/razor-plus"] path = vendor/grammars/razor-plus url = https://github.com/github-linguist/razor-plus [submodule "vendor/grammars/rescript-vscode"] path = vendor/grammars/rescript-vscode url = https://github.com/rescript-lang/rescript-vscode [submodule "vendor/grammars/rez.tmbundle"] path = vendor/grammars/rez.tmbundle url = https://github.com/textmate/rez.tmbundle.git [submodule "vendor/grammars/riot-syntax-highlight"] path = vendor/grammars/riot-syntax-highlight url = https://github.com/riot/syntax-highlight [submodule "vendor/grammars/roc-vscode-unofficial"] path = vendor/grammars/roc-vscode-unofficial url = https://github.com/ivan-demchenko/roc-vscode-unofficial.git [submodule "vendor/grammars/ros-tmlanguage"] path = vendor/grammars/ros-tmlanguage url = https://github.com/jtbandes/ros-tmlanguage.git [submodule "vendor/grammars/rust-syntax"] path = vendor/grammars/rust-syntax url = https://github.com/dustypomerleau/rust-syntax.git [submodule "vendor/grammars/rust_hdl_vscode"] path = vendor/grammars/rust_hdl_vscode url = https://github.com/VHDL-LS/rust_hdl_vscode.git [submodule "vendor/grammars/sail_vscode"] path = vendor/grammars/sail_vscode url = https://github.com/Timmmm/sail_vscode.git [submodule "vendor/grammars/sas.tmbundle"] path = vendor/grammars/sas.tmbundle url = https://github.com/rpardee/sas.tmbundle [submodule "vendor/grammars/scheme.tmbundle"] path = vendor/grammars/scheme.tmbundle url = https://github.com/sicp-lang/scheme.tmbundle [submodule "vendor/grammars/scilab.tmbundle"] path = vendor/grammars/scilab.tmbundle url = https://github.com/textmate/scilab.tmbundle [submodule "vendor/grammars/secondlife-lsl"] path = vendor/grammars/secondlife-lsl url = https://github.com/textmate/secondlife-lsl.tmbundle [submodule "vendor/grammars/selinux-policy-languages"] path = vendor/grammars/selinux-policy-languages url = https://github.com/google/selinux-policy-languages [submodule "vendor/grammars/shaders-tmLanguage"] path = vendor/grammars/shaders-tmLanguage url = https://github.com/tgjones/shaders-tmLanguage [submodule "vendor/grammars/slang-vscode-extension"] path = vendor/grammars/slang-vscode-extension url = https://github.com/shader-slang/slang-vscode-extension.git [submodule "vendor/grammars/slint-tmLanguage"] path = vendor/grammars/slint-tmLanguage url = https://github.com/slint-ui/slint-tmLanguage.git [submodule "vendor/grammars/smali-sublime"] path = vendor/grammars/smali-sublime url = https://github.com/ShaneWilton/sublime-smali [submodule "vendor/grammars/smalltalk-tmbundle"] path = vendor/grammars/smalltalk-tmbundle url = https://github.com/tomas-stefano/smalltalk-tmbundle [submodule "vendor/grammars/smithy-vscode"] path = vendor/grammars/smithy-vscode url = https://github.com/awslabs/smithy-vscode.git [submodule "vendor/grammars/sourcepawn-vscode"] path = vendor/grammars/sourcepawn-vscode url = https://github.com/Sarrus1/sourcepawn-vscode.git [submodule "vendor/grammars/sprocket-vscode"] path = vendor/grammars/sprocket-vscode url = https://github.com/stjude-rust-labs/sprocket-vscode.git [submodule "vendor/grammars/sql.tmbundle"] path = vendor/grammars/sql.tmbundle url = https://github.com/textmate/sql.tmbundle [submodule "vendor/grammars/squirrel-language"] path = vendor/grammars/squirrel-language url = https://github.com/mathewmariani/squirrel-language [submodule "vendor/grammars/st2-zonefile"] path = vendor/grammars/st2-zonefile url = https://github.com/sixty4k/st2-zonefile [submodule "vendor/grammars/standard-ml.tmbundle"] path = vendor/grammars/standard-ml.tmbundle url = https://github.com/textmate/standard-ml.tmbundle [submodule "vendor/grammars/sublime-MuPAD"] path = vendor/grammars/sublime-MuPAD url = https://github.com/ccreutzig/sublime-MuPAD [submodule "vendor/grammars/sublime-angelscript"] path = vendor/grammars/sublime-angelscript url = https://github.com/wronex/sublime-angelscript [submodule "vendor/grammars/sublime-aspectj"] path = vendor/grammars/sublime-aspectj url = https://github.com/pchaigno/sublime-aspectj [submodule "vendor/grammars/sublime-autoit"] path = vendor/grammars/sublime-autoit url = https://github.com/AutoIt/SublimeAutoItScript [submodule "vendor/grammars/sublime-befunge"] path = vendor/grammars/sublime-befunge url = https://github.com/johanasplund/sublime-befunge [submodule "vendor/grammars/sublime-boo"] path = vendor/grammars/sublime-boo url = https://github.com/drslump/sublime-boo [submodule "vendor/grammars/sublime-bsv"] path = vendor/grammars/sublime-bsv url = https://github.com/thotypous/sublime-bsv [submodule "vendor/grammars/sublime-cirru"] path = vendor/grammars/sublime-cirru url = https://github.com/Cirru/sublime-cirru [submodule "vendor/grammars/sublime-clips"] path = vendor/grammars/sublime-clips url = https://github.com/psicomante/CLIPS-sublime [submodule "vendor/grammars/sublime-cypher"] path = vendor/grammars/sublime-cypher url = https://github.com/fredbenenson/sublime-cypher.git [submodule "vendor/grammars/sublime-fantom"] path = vendor/grammars/sublime-fantom url = https://github.com/rkoeninger/sublime-fantom [submodule "vendor/grammars/sublime-glsl"] path = vendor/grammars/sublime-glsl url = https://github.com/euler0/sublime-glsl [submodule "vendor/grammars/sublime-golo"] path = vendor/grammars/sublime-golo url = https://github.com/TypeUnsafe/sublime-golo [submodule "vendor/grammars/sublime-lambdapi"] path = vendor/grammars/sublime-lambdapi url = https://github.com/Deducteam/sublime-lambdapi.git [submodule "vendor/grammars/sublime-mask"] path = vendor/grammars/sublime-mask url = https://github.com/tenbits/sublime-mask [submodule "vendor/grammars/sublime-nearley"] path = vendor/grammars/sublime-nearley url = https://github.com/Hardmath123/sublime-nearley [submodule "vendor/grammars/sublime-netlinx"] path = vendor/grammars/sublime-netlinx url = https://github.com/amclain/sublime-netlinx [submodule "vendor/grammars/sublime-odin"] path = vendor/grammars/sublime-odin url = https://github.com/odin-lang/sublime-odin [submodule "vendor/grammars/sublime-opal"] path = vendor/grammars/sublime-opal url = https://github.com/artifactz/sublime-opal [submodule "vendor/grammars/sublime-pony"] path = vendor/grammars/sublime-pony url = https://github.com/CausalityLtd/sublime-pony [submodule "vendor/grammars/sublime-promela-spin"] path = vendor/grammars/sublime-promela-spin url = https://github.com/corbanmailloux/sublime-promela-spin.git [submodule "vendor/grammars/sublime-q"] path = vendor/grammars/sublime-q url = https://github.com/komsit37/sublime-q [submodule "vendor/grammars/sublime-rexx"] path = vendor/grammars/sublime-rexx url = https://github.com/mblocker/rexx-sublime [submodule "vendor/grammars/sublime-robot-plugin"] path = vendor/grammars/sublime-robot-plugin url = https://github.com/shellderp/sublime-robot-plugin [submodule "vendor/grammars/sublime-shen"] path = vendor/grammars/sublime-shen url = https://github.com/rkoeninger/sublime-shen [submodule "vendor/grammars/sublime-spintools"] path = vendor/grammars/sublime-spintools url = https://github.com/bitbased/sublime-spintools [submodule "vendor/grammars/sublime-tea"] path = vendor/grammars/sublime-tea url = https://github.com/pferruggiaro/sublime-tea [submodule "vendor/grammars/sublime-terra"] path = vendor/grammars/sublime-terra url = https://github.com/pyk/sublime-terra [submodule "vendor/grammars/sublime-text-ox"] path = vendor/grammars/sublime-text-ox url = https://github.com/andreashetland/sublime-text-ox [submodule "vendor/grammars/sublime-zig-language"] path = vendor/grammars/sublime-zig-language url = https://github.com/ziglang/sublime-zig-language [submodule "vendor/grammars/sublimeassembly"] path = vendor/grammars/sublimeassembly url = https://github.com/Nessphoro/sublimeassembly [submodule "vendor/grammars/sublimeprolog"] path = vendor/grammars/sublimeprolog url = https://github.com/alnkpa/sublimeprolog [submodule "vendor/grammars/sublimetext-cuda-cpp"] path = vendor/grammars/sublimetext-cuda-cpp url = https://github.com/harrism/sublimetext-cuda-cpp [submodule "vendor/grammars/sublimetext-nasl"] path = vendor/grammars/sublimetext-nasl url = https://github.com/tenable/sublimetext-nasl [submodule "vendor/grammars/surrealql-grammar"] path = vendor/grammars/surrealql-grammar url = https://github.com/surrealdb/surrealql-grammar.git [submodule "vendor/grammars/svelte-atom"] path = vendor/grammars/svelte-atom url = https://github.com/sebastinez/svelte-atom.git [submodule "vendor/grammars/sway-vscode-plugin"] path = vendor/grammars/sway-vscode-plugin url = https://github.com/FuelLabs/sway-vscode-plugin.git [submodule "vendor/grammars/sweave.tmbundle"] path = vendor/grammars/sweave.tmbundle url = https://github.com/textmate/sweave.tmbundle.git [submodule "vendor/grammars/swift-tmlanguage"] path = vendor/grammars/swift-tmlanguage url = https://github.com/jtbandes/swift-tmlanguage.git [submodule "vendor/grammars/syntax"] path = vendor/grammars/syntax url = https://github.com/hashicorp/syntax.git [submodule "vendor/grammars/syntax-mcfunction"] path = vendor/grammars/syntax-mcfunction url = https://github.com/MinecraftCommands/syntax-mcfunction.git [submodule "vendor/grammars/tact-sublime"] path = vendor/grammars/tact-sublime url = https://github.com/tact-lang/tact-sublime.git [submodule "vendor/grammars/tcl.tmbundle"] path = vendor/grammars/tcl.tmbundle url = https://github.com/textmate/tcl.tmbundle [submodule "vendor/grammars/templ-vscode"] path = vendor/grammars/templ-vscode url = https://github.com/templ-go/templ-vscode.git [submodule "vendor/grammars/textmate"] path = vendor/grammars/textmate url = https://github.com/flix/textmate.git [submodule "vendor/grammars/textmate.tmbundle"] path = vendor/grammars/textmate.tmbundle url = https://github.com/textmate/textmate.tmbundle [submodule "vendor/grammars/textproto-grammar"] path = vendor/grammars/textproto-grammar url = https://github.com/thejustinwalsh/textproto-grammar.git [submodule "vendor/grammars/thrift.tmbundle"] path = vendor/grammars/thrift.tmbundle url = https://github.com/textmate/thrift.tmbundle [submodule "vendor/grammars/tlv-vscode"] path = vendor/grammars/tlv-vscode url = https://github.com/adamint/tlv-vscode [submodule "vendor/grammars/toml.tmbundle"] path = vendor/grammars/toml.tmbundle url = https://github.com/textmate/toml.tmbundle [submodule "vendor/grammars/turtle.tmbundle"] path = vendor/grammars/turtle.tmbundle url = https://github.com/peta/turtle.tmbundle [submodule "vendor/grammars/typespec"] path = vendor/grammars/typespec url = https://github.com/microsoft/typespec.git [submodule "vendor/grammars/typst-grammar"] path = vendor/grammars/typst-grammar url = https://github.com/michidk/typst-grammar.git [submodule "vendor/grammars/verilog.tmbundle"] path = vendor/grammars/verilog.tmbundle url = https://github.com/textmate/verilog.tmbundle [submodule "vendor/grammars/vsc-ember-syntax"] path = vendor/grammars/vsc-ember-syntax url = https://github.com/lifeart/vsc-ember-syntax.git [submodule "vendor/grammars/vsc-fennel"] path = vendor/grammars/vsc-fennel url = https://github.com/kongeor/vsc-fennel [submodule "vendor/grammars/vsc-language-1c-bsl"] path = vendor/grammars/vsc-language-1c-bsl url = https://github.com/1c-syntax/vsc-language-1c-bsl.git [submodule "vendor/grammars/vscode"] path = vendor/grammars/vscode url = https://github.com/QB64Official/vscode.git [submodule "vendor/grammars/vscode-TalonScript"] path = vendor/grammars/vscode-TalonScript url = https://github.com/mrob95/vscode-TalonScript.git [submodule "vendor/grammars/vscode-aiken"] path = vendor/grammars/vscode-aiken url = https://github.com/aiken-lang/vscode-aiken.git [submodule "vendor/grammars/vscode-antlers-language-server"] path = vendor/grammars/vscode-antlers-language-server url = https://github.com/Stillat/vscode-antlers-language-server.git [submodule "vendor/grammars/vscode-apache"] path = vendor/grammars/vscode-apache url = https://github.com/mrmlnc/vscode-apache.git [submodule "vendor/grammars/vscode-bitbake"] path = vendor/grammars/vscode-bitbake url = https://github.com/yoctoproject/vscode-bitbake.git [submodule "vendor/grammars/vscode-brightscript-language"] path = vendor/grammars/vscode-brightscript-language url = https://github.com/rokucommunity/vscode-brightscript-language.git [submodule "vendor/grammars/vscode-c3"] path = vendor/grammars/vscode-c3 url = https://github.com/c3lang/vscode-c3.git [submodule "vendor/grammars/vscode-caddyfile"] path = vendor/grammars/vscode-caddyfile url = https://github.com/caddyserver/vscode-caddyfile.git [submodule "vendor/grammars/vscode-cadence"] path = vendor/grammars/vscode-cadence url = https://github.com/onflow/vscode-cadence.git [submodule "vendor/grammars/vscode-cmake-tools"] path = vendor/grammars/vscode-cmake-tools url = https://github.com/microsoft/vscode-cmake-tools.git [submodule "vendor/grammars/vscode-codeql"] path = vendor/grammars/vscode-codeql url = https://github.com/github/vscode-codeql branch = main [submodule "vendor/grammars/vscode-cue"] path = vendor/grammars/vscode-cue url = https://github.com/cue-sh/vscode-cue [submodule "vendor/grammars/vscode-curry"] path = vendor/grammars/vscode-curry url = https://github.com/fwcd/vscode-curry [submodule "vendor/grammars/vscode-dune"] path = vendor/grammars/vscode-dune url = https://github.com/maelvls/vscode-dune.git [submodule "vendor/grammars/vscode-euphoria"] path = vendor/grammars/vscode-euphoria url = https://github.com/OpenEuphoria/vscode-euphoria [submodule "vendor/grammars/vscode-fastly-vcl"] path = vendor/grammars/vscode-fastly-vcl url = https://github.com/fastly/vscode-fastly-vcl.git [submodule "vendor/grammars/vscode-flatbuffers"] path = vendor/grammars/vscode-flatbuffers url = https://github.com/floxay/vscode-flatbuffers.git [submodule "vendor/grammars/vscode-fluent"] path = vendor/grammars/vscode-fluent url = https://github.com/macabeus/vscode-fluent [submodule "vendor/grammars/vscode-gcode-syntax"] path = vendor/grammars/vscode-gcode-syntax url = https://github.com/appliedengdesign/vscode-gcode-syntax [submodule "vendor/grammars/vscode-gedcom"] path = vendor/grammars/vscode-gedcom url = https://github.com/fguitton/vscode-gedcom [submodule "vendor/grammars/vscode-gleam"] path = vendor/grammars/vscode-gleam url = https://github.com/gleam-lang/vscode-gleam.git [submodule "vendor/grammars/vscode-go"] path = vendor/grammars/vscode-go url = https://github.com/golang/vscode-go [submodule "vendor/grammars/vscode-go-template"] path = vendor/grammars/vscode-go-template url = https://github.com/jinliming2/vscode-go-template.git [submodule "vendor/grammars/vscode-hack"] path = vendor/grammars/vscode-hack url = https://github.com/slackhq/vscode-hack [submodule "vendor/grammars/vscode-hy"] path = vendor/grammars/vscode-hy url = https://github.com/tshakalekholoane/vscode-hy [submodule "vendor/grammars/vscode-ibmi-languages"] path = vendor/grammars/vscode-ibmi-languages url = https://github.com/barrettotte/vscode-ibmi-languages [submodule "vendor/grammars/vscode-janet"] path = vendor/grammars/vscode-janet url = https://github.com/janet-lang/vscode-janet.git [submodule "vendor/grammars/vscode-jest"] path = vendor/grammars/vscode-jest url = https://github.com/jest-community/vscode-jest [submodule "vendor/grammars/vscode-jsonc-syntax-highlighting"] path = vendor/grammars/vscode-jsonc-syntax-highlighting url = https://github.com/DecimalTurn/vscode-jsonc-syntax-highlighting.git [submodule "vendor/grammars/vscode-just"] path = vendor/grammars/vscode-just url = https://github.com/nefrob/vscode-just.git [submodule "vendor/grammars/vscode-kcl"] path = vendor/grammars/vscode-kcl url = https://github.com/kcl-lang/vscode-kcl.git [submodule "vendor/grammars/vscode-kdl"] path = vendor/grammars/vscode-kdl url = https://github.com/kdl-org/vscode-kdl.git [submodule "vendor/grammars/vscode-kolmafia-ash"] path = vendor/grammars/vscode-kolmafia-ash url = https://github.com/midgleyc/vscode-kolmafia-ash [submodule "vendor/grammars/vscode-lean"] path = vendor/grammars/vscode-lean url = https://github.com/leanprover/vscode-lean [submodule "vendor/grammars/vscode-lean4"] path = vendor/grammars/vscode-lean4 url = https://github.com/leanprover/vscode-lean4.git [submodule "vendor/grammars/vscode-liquidsoap"] path = vendor/grammars/vscode-liquidsoap url = https://github.com/savonet/vscode-liquidsoap [submodule "vendor/grammars/vscode-livecodescript"] path = vendor/grammars/vscode-livecodescript url = https://github.com/Ferruslogic/vscode-livecodescript.git [submodule "vendor/grammars/vscode-minizinc"] path = vendor/grammars/vscode-minizinc url = https://github.com/Dekker1/vscode-minizinc.git [submodule "vendor/grammars/vscode-monkey-c"] path = vendor/grammars/vscode-monkey-c url = https://github.com/ghisguth/vscode-monkey-c [submodule "vendor/grammars/vscode-motoko"] path = vendor/grammars/vscode-motoko url = https://github.com/caffeinelabs/vscode-motoko.git [submodule "vendor/grammars/vscode-move-syntax"] path = vendor/grammars/vscode-move-syntax url = https://github.com/damirka/vscode-move-syntax.git [submodule "vendor/grammars/vscode-nginx"] path = vendor/grammars/vscode-nginx url = https://github.com/william-voyek/vscode-nginx.git [submodule "vendor/grammars/vscode-noir"] path = vendor/grammars/vscode-noir url = https://github.com/noir-lang/vscode-noir.git [submodule "vendor/grammars/vscode-opa"] path = vendor/grammars/vscode-opa url = https://github.com/open-policy-agent/vscode-opa.git [submodule "vendor/grammars/vscode-pddl"] path = vendor/grammars/vscode-pddl url = https://github.com/jan-dolejsi/vscode-pddl.git [submodule "vendor/grammars/vscode-plantuml"] path = vendor/grammars/vscode-plantuml url = https://github.com/qjebbs/vscode-plantuml [submodule "vendor/grammars/vscode-prisma"] path = vendor/grammars/vscode-prisma url = https://github.com/prisma/vscode-prisma [submodule "vendor/grammars/vscode-procfile"] path = vendor/grammars/vscode-procfile url = https://github.com/benspaulding/vscode-procfile [submodule "vendor/grammars/vscode-proto3"] path = vendor/grammars/vscode-proto3 url = https://github.com/zxh0/vscode-proto3 [submodule "vendor/grammars/vscode-python"] path = vendor/grammars/vscode-python url = https://github.com/microsoft/vscode-python.git [submodule "vendor/grammars/vscode-rbs-syntax"] path = vendor/grammars/vscode-rbs-syntax url = https://github.com/soutaro/vscode-rbs-syntax.git [submodule "vendor/grammars/vscode-ron"] path = vendor/grammars/vscode-ron url = https://github.com/a5huynh/vscode-ron.git [submodule "vendor/grammars/vscode-ruby-slim"] path = vendor/grammars/vscode-ruby-slim url = https://github.com/borama/vscode-ruby-slim.git [submodule "vendor/grammars/vscode-scala-syntax"] path = vendor/grammars/vscode-scala-syntax url = https://github.com/scala/vscode-scala-syntax [submodule "vendor/grammars/vscode-singularity"] path = vendor/grammars/vscode-singularity url = https://github.com/onnovalkering/vscode-singularity [submodule "vendor/grammars/vscode-slice"] path = vendor/grammars/vscode-slice url = https://github.com/zeroc-ice/vscode-slice [submodule "vendor/grammars/vscode-teal"] path = vendor/grammars/vscode-teal url = https://github.com/teal-language/vscode-teal.git [submodule "vendor/grammars/vscode-tmdl"] path = vendor/grammars/vscode-tmdl url = https://github.com/microsoft/vscode-tmdl.git [submodule "vendor/grammars/vscode-tree-sitter-query"] path = vendor/grammars/vscode-tree-sitter-query url = https://github.com/jrieken/vscode-tree-sitter-query.git [submodule "vendor/grammars/vscode-vba"] path = vendor/grammars/vscode-vba url = https://github.com/serkonda7/vscode-vba.git [submodule "vendor/grammars/vscode-vcard"] path = vendor/grammars/vscode-vcard url = https://github.com/cstrachan88/vscode-vcard.git [submodule "vendor/grammars/vscode-vento"] path = vendor/grammars/vscode-vento url = https://github.com/ventojs/vscode-vento.git [submodule "vendor/grammars/vscode-vlang"] path = vendor/grammars/vscode-vlang url = https://github.com/0x9ef/vscode-vlang [submodule "vendor/grammars/vscode-wit"] path = vendor/grammars/vscode-wit url = https://github.com/bytecodealliance/vscode-wit.git [submodule "vendor/grammars/vscode-wren"] path = vendor/grammars/vscode-wren url = https://github.com/Nelarius/vscode-wren.git [submodule "vendor/grammars/vscode-yara"] path = vendor/grammars/vscode-yara url = https://github.com/infosec-intern/vscode-yara.git [submodule "vendor/grammars/vscode-zil-language"] path = vendor/grammars/vscode-zil-language url = https://github.com/tclem/vscode-zil-language [submodule "vendor/grammars/vscode_cobol"] path = vendor/grammars/vscode_cobol url = https://github.com/spgennard/vscode_cobol.git [submodule "vendor/grammars/vscode_mikrotik_routeros_script"] path = vendor/grammars/vscode_mikrotik_routeros_script url = https://github.com/devMikeUA/vscode_mikrotik_routeros_script.git [submodule "vendor/grammars/wgsl-analyzer"] path = vendor/grammars/wgsl-analyzer url = https://github.com/wgsl-analyzer/wgsl-analyzer.git [submodule "vendor/grammars/witcherscript-grammar"] path = vendor/grammars/witcherscript-grammar url = https://github.com/ADawesomeguy/witcherscript-grammar.git [submodule "vendor/grammars/wollok-sublime"] path = vendor/grammars/wollok-sublime url = https://github.com/uqbar-project/wollok-sublime [submodule "vendor/grammars/xc.tmbundle"] path = vendor/grammars/xc.tmbundle url = https://github.com/graymalkin/xc.tmbundle [submodule "vendor/grammars/xmake-lua.tmbundle"] path = vendor/grammars/xmake-lua.tmbundle url = https://github.com/xmake-io/xmake-lua.tmbundle [submodule "vendor/grammars/xml.tmbundle"] path = vendor/grammars/xml.tmbundle url = https://github.com/textmate/xml.tmbundle [submodule "vendor/grammars/zeek-sublime"] path = vendor/grammars/zeek-sublime url = https://github.com/zeek/zeek-sublime [submodule "vendor/grammars/zenstack"] path = vendor/grammars/zenstack url = https://github.com/zenstackhq/zenstack.git [submodule "vendor/grammars/zephir-sublime"] path = vendor/grammars/zephir-sublime url = https://github.com/phalcon/zephir-sublime ================================================ FILE: AGENTS.md ================================================ # AGENTS.md This file provides guidance for AI agents working with the Linguist repository. ## Project Overview Linguist is a Ruby library used on GitHub.com to: - Detect blob languages - Ignore binary and vendored files - Suppress generated files in diffs - Generate language breakdown graphs It's packaged as the `github-linguist` gem and includes CLI tools: `github-linguist` and `git-linguist`. ## Key Files and Directories | Path | Purpose | |------|---------| | `lib/linguist/languages.yml` | Master list of all languages, extensions, filenames, and their properties | | `lib/linguist/heuristics.yml` | Rules for disambiguating files with shared extensions | | `lib/linguist/heuristics.rb` | Ruby code implementing heuristic logic | | `lib/linguist/classifier.rb` | Centroid-based classifier for language detection | | `samples/` | Sample code files for each language (used by classifier) | | `grammars.yml` | Lists all TextMate grammars used for syntax highlighting | | `vendor/` | Contains grammar submodules and cached license files for the grammars | | `script/` | Utility scripts for maintenance tasks | ## Development Environment Use GitHub Codespaces or the dev container for the easiest setup. The environment includes Ruby, Node.js, Docker, and all required dependencies. To bootstrap locally: ```bash script/bootstrap ``` To run Linguist from the repo: ```bash bundle exec bin/github-linguist --breakdown ``` ## Common Tasks ### Adding a Language Extension 1. Add extension to the language entry in `lib/linguist/languages.yml` (alphabetical order, case-sensitive; primary extension first) 2. Add sample files to `samples//` 3. If extension is shared with another language, ensure there are at least two samples and add a heuristic in `lib/linguist/heuristics.yml` ### Adding a New Language 1. Add entry to `lib/linguist/languages.yml` (omit `language_id` initially) 2. Add grammar: `script/add-grammar ` 3. Add samples to `samples//` 4. Generate ID: `script/update-ids` 5. If an extension is shared with another language, ensure there are at least two samples and add a heuristic in `lib/linguist/heuristics.yml` ### Replacing a Grammar ```bash script/add-grammar --replace ``` ### Important Scripts - `script/bootstrap` - Install dependencies - `script/add-grammar` - Add or replace TextMate grammars - `script/update-ids` - Generate unique language IDs - `script/cross-validation` - Test the classifier - `script/cibuild` - CI build script ## Testing Run tests with: ```bash bundle exec rake test ``` Test the classifier: ```bash bundle exec script/cross-validation --test ``` Always ensure tests pass before submitting changes. GitHub Actions runs tests on all PRs. ## Coding Conventions - **Ruby style**: Follow existing code patterns in the repository - **languages.yml**: Keep alphabetically sorted (case-sensitive, uppercase before lowercase) with the comment at the top. Use the comment at the top to determine the fields to add for a language. - **Extensions in languages.yml**: Keep alphabetically sorted (case-sensitive, uppercase before lowercase); primary extension first - **Samples**: Use real-world code examples, not "Hello World" and other common examples used in tutorials - **Heuristics**: Write patterns to minimize false positives. Patterns must be linear, safe from ReDoS attacks, and RE2 compatible. All heuristics must have tests. - **Don't refactor unrelated code.** Keep changes scoped to the task at hand. ## Generated and script maintained files — do not edit by hand - `.gitmodules` - `grammars.yml` - all files in `vendor/` These are all maintained by the `script/add-grammars` script. ## PR Requirements All PRs must: 1. Use the provided PR template. Irrelevant sections may be removed. 2. Link to GitHub search results showing in-the-wild usage, excluding forks, for each extension being added (minimum 2000 files for common extensions, 200 for once-per-repo files or extensions). 3. Link to the original source of any samples added. This must not be a link to the fork of Linguist used for the contribution. 4. State the license of any sample code added individually. 5. Pass all CI tests. Do not open a PR if any of the above conditions are not met and notify the user why the PR has not been created. ## Usage Requirements for New Languages/Extensions - At least 2000 files indexed on GitHub (or 200 for once-per-repo files like Makefile), excluding forks - Reasonable distribution across unique `user/repo` combinations - High-proportion users may be filtered out during assessment ## Grammar Requirements Only add grammars with approved licenses (see `vendor/licenses/config.yml` for the list). TextMate-compatible grammars are used for syntax highlighting. ## Key Dependencies - `charlock_holmes` - Character encoding detection (requires ICU) - `rugged` - libgit2 bindings for Ruby - Docker - Required for grammar operations ================================================ FILE: Brewfile ================================================ brew "cmake" brew "pkg-config" brew "icu4c" cask "docker" ================================================ FILE: CONTRIBUTING.md ================================================ # Contributing Hi there! We're thrilled that you'd like to contribute to this project. Your help is essential for keeping it great. Contributions to this project are [released](https://docs.github.com/github/site-policy/github-terms-of-service#6-contributions-under-repository-license) to the public under the [project's open source license](LICENSE). This project adheres to the [Contributor Covenant Code of Conduct](http://contributor-covenant.org/). By participating, you are expected to uphold this code. The majority of contributions won't need to touch any Ruby code at all. ## Table of Contents - [Setting up a working environment](#setting-up-a-working-environment) - [Using GitHub Codespaces](#using-github-codespaces) - [Using the dev container locally](#using-the-dev-container-locally) - [Using your local system without the dev container](#using-your-local-system-without-the-dev-container) - [Dependencies](#dependencies) - [Getting started](#getting-started) - [Adding an extension to a language](#adding-an-extension-to-a-language) - [Adding a language](#adding-a-language) - [Fixing a misclassified language](#fixing-a-misclassified-language) - [Fixing syntax highlighting](#fixing-syntax-highlighting) - [Changing the source of a syntax highlighting grammar](#changing-the-source-of-a-syntax-highlighting-grammar) - [Changing the color associated with a language](#changing-the-color-associated-with-a-language) - [Language extension and filename usage requirements](#language-extension-and-filename-usage-requirements) - [Testing](#testing) ## Setting up a working environment In order to start contributing to Linguist, you will need to setup your working environment. We detail three methods below and recommend using GitHub Codespaces as it is the easiest and quickest method that will provide you with a consistent pre-configured environment ready for you to start contributing. ### Using GitHub Codespaces Using GitHub Codespaces is the easiest and quickest method to start contributing. The Free and Pro plans for personal accounts include free use of GitHub Codespaces up to a fixed amount of usage every month. For more info on GitHub Codespaces billing, see [this help page](https://docs.github.com/en/billing/managing-billing-for-github-codespaces/about-billing-for-github-codespaces). To get started, click this button: [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/github-linguist/linguist) ### Using the dev container locally To open locally in VS Code using a dev container, follow the [Visual Studio Code Dev Containers installation instructions](https://code.visualstudio.com/docs/remote/containers#_installation) to configure dev container support. Close the repo and open it in VS Code. VS Code will automatically offer to run this project in a dev container when the project is opened. No additional setup will be required. ### Using your local system without the dev container This is the longest and most involved and error-prone approach and is documented for those who can't use one of the methods above or prefer to do everything within the native operating system environment. #### Dependencies Linguist is a Ruby library so you will need a recent version of Ruby installed. There are known problems with the macOS/XCode supplied version of Ruby that causes problems installing some of the dependencies. Accordingly, we highly recommend you install a version of Ruby using Homebrew, `rbenv`, `rvm`, `ruby-build`, `asdf` or other packaging system, before attempting to install Linguist and the dependencies. Linguist uses the [`charlock_holmes`](https://github.com/brianmario/charlock_holmes) character encoding detection library which in turn uses [ICU](http://site.icu-project.org/), and the libgit2 bindings for Ruby provided by [`rugged`](https://github.com/libgit2/rugged). [Bundler](https://bundler.io/) v1.10.0 or newer is required for installing the Ruby gem dependencies. [Docker](https://www.docker.com/) is also required when adding or updating grammars. These components have their own dependencies - `icu4c`, and `cmake` and `pkg-config` respectively - which you may need to install before you can install Linguist. On macOS with [Homebrew](http://brew.sh/) the instructions below under Getting started will install these dependencies for you. On Ubuntu: ```bash apt-get install cmake pkg-config libicu-dev docker.io ruby ruby-dev zlib1g-dev build-essential libssl-dev ``` The latest version of Bundler can be installed with `gem install bundler`. #### Getting started Before you can start contributing to Linguist, you'll need to set up your environment first. Clone the repo and run `script/bootstrap` to install its dependencies. ```bash git clone https://github.com/github/linguist.git cd linguist/ script/bootstrap ``` To run Linguist from the cloned repository: ```bash bundle exec bin/github-linguist --breakdown ``` ## Adding an extension to a language We will only add new extensions once they have sufficient usage on GitHub. We detail our usage requirements and assessment method later at [Language extension and filename usage requirements](#language-extension-and-filename-usage-requirements). To add support for a new extension: 1. Add your extension to the language entry in [`languages.yml`][languages]. Keep the extensions in alphabetical order, sorted case-sensitively (uppercase before lowercase). The exception is the primary extension: it should always be first. 2. Add at least one sample for your extension to the [samples directory][samples] in the correct subdirectory. We prefer examples of real-world code showing common usage. The more representative of the structure of the language, the better. > [!IMPORTANT] > "Hello world" and other examples found in tutorials will not be accepted. 3. Open a pull request, linking to a [GitHub search result][search-example] showing in-the-wild usage. If you are adding a sample, please state clearly the license covering the code. If possible, link to the original source of the sample. If you wrote the sample specifically for the PR and are happy for it to be included under the MIT license that covers Linguist, you can state this instead. > [!IMPORTANT] > Pull requests will not be reviewed if the template is not used or not filled in. Additionally, if this extension is already listed in [`languages.yml`][languages] and associated with another language, then a few more steps will need to be taken: 1. Make sure that at least two example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`. 2. If the two languages look vaguely similar, or one of the languages has uniquely identifiable characteristics, consider writing a [heuristic][] to help with the classification. Remember, the goal here is to try and avoid false positives! See [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when your changes will appear on GitHub after your PR has been merged. ## Adding a language We will only add new extensions once they have sufficient usage on GitHub. We detail our usage requirements and assessment method later at [Language extension and filename usage requirements](#language-extension-and-filename-usage-requirements). To add support for a new language: 1. Add an entry for your language to [`languages.yml`][languages]. Omit the `language_id` field for now. 2. Add a syntax-highlighting grammar for your language using: ```bash script/add-grammar https://github.com/JaneSmith/MyGrammar ``` This command will analyze the grammar and, if no problems are found, add it to the repository. If problems are found, please report them to the grammar maintainer as you will otherwise be unable to add it. > [!IMPORTANT] > Please only add grammars that have [one of these licenses][licenses]. 3. Add samples for your language to the [samples directory][samples] in the correct subdirectory. We prefer examples of real-world code showing common usage. The more representative of the structure of the language, the better. > [!IMPORTANT] > "Hello world" and other examples found in tutorials will not be accepted. 4. Generate a unique ID for your language by running `script/update-ids`. 5. Open a pull request, linking to [GitHub search results][search-example] showing in-the-wild usage. Please state clearly the license covering the code in the samples. Link directly to the original source if possible. If you wrote the sample specifically for the PR and are happy for it to be included under the MIT license that covers Linguist, you can state this instead. > [!IMPORTANT] > Pull requests will not be reviewed if the template is not used or not filled in. In addition, if your new language defines an extension that is already listed in [`languages.yml`][languages] and associated with another language, then a few more steps will need to be taken: 1. Make sure that at least two example `.yourextension` files are present in the [samples directory][samples] for each language that uses `.yourextension`. 2. If the two languages look vaguely similar, or one of the languages has uniquely identifiable characteristics, consider writing a [heuristic][] to help with the classification. Remember, the goal here is to try and avoid false positives! See [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when your changes will appear on GitHub after your PR has been merged. ## Fixing a misclassified language Most languages are detected by their file extension defined in [`languages.yml`][languages]. For disambiguating between files with common extensions, Linguist applies some [heuristics](/lib/linguist/heuristics.rb) and a [statistical classifier](lib/linguist/classifier.rb). This process can help differentiate between, for example, `.h` files which could be either C, C++, or Obj-C. Misclassifications can often be solved by either adding a new filename or extension for the language or adding more [samples][] to make the classifier smarter. ## Fixing syntax highlighting Syntax highlighting in GitHub is performed using TextMate-compatible grammars. These are the same grammars used by TextMate, Sublime Text, and Atom. Every language in [`languages.yml`][languages] is mapped to its corresponding TextMate `scopeName`. This scope name will be used when picking up a grammar for highlighting. Assuming your code is being detected as the right language, in most cases syntax highlighting problems are due to a bug in the language grammar rather than a bug in Linguist. [`vendor/README.md`][grammars] lists all the grammars we use for syntax highlighting on GitHub.com. Find the one corresponding to your code's programming language and submit a bug report upstream. If you can, try to reproduce the highlighting problem in the text editor that the grammar is designed for (TextMate, Sublime Text, or Atom) and include that information in your bug report. You can also try to fix the bug yourself and submit a pull-request. [TextMate's documentation](https://manual.macromates.com/en/language_grammars) offers a good introduction on how to work with TextMate-compatible grammars. Note that Linguist uses [PCRE](https://www.pcre.org/) regular expressions, while TextMate uses [Oniguruma](https://github.com/kkos/oniguruma). Although they are mostly compatible, there may be occasional differences in syntax and semantics between the two. Linguist's grammar compiler will highlight any problems when the grammar is updated. Once the bug has been fixed upstream, we'll pick it up for GitHub in the next release of Linguist. See [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when the upstream changes will appear on GitHub. ## Changing the source of a syntax highlighting grammar We'd like to ensure Linguist and GitHub.com are using the latest and greatest grammars that are consistent with the current usage but understand that sometimes a grammar can lag behind the evolution of a language or even stop being developed. This often results in someone grasping the opportunity to create a newer and better and more actively maintained grammar, and we'd love to use it and pass on its functionality to our users. Switching the source of a grammar is really easy: ```bash script/add-grammar --replace MyGrammar https://github.com/PeterPan/MyGrammar ``` This command will analyze the grammar and, if no problems are found, add it to the repository. If problems are found, please report these problems to the grammar maintainer as you will not be able to add the grammar if problems are found. > [!IMPORTANT] > Please only add grammars that have [one of these licenses][licenses]. Please then open a pull request for the updated grammar. See [My Linguist PR has been merged but GitHub doesn't reflect my changes][merged-pr] for details on when your changes will appear on GitHub after your PR has been merged. ## Changing the color associated with a language Many of the colors associated with the languages within Linguist have been in place for a very long time. The colors were often chosen based on the colors used by the language at the time and since then users will have become familiar with those colors as they appear on GitHub.com. If you would like to change the color of a language, we ask that you propose your suggested color change to the wider community for your language to gain consensus before submitting a pull request. Please do this in a community forum or repository used and known by the wider community of that language, not the Linguist repository. Once you've received consensus that the community is happy with your proposed color change, please feel free to open a PR making the change and link to the public discussion where this was agreed by the community. If there are official branding guidelines to support the colour choice, please link to those too. ## Language extension and filename usage requirements In order to a new language extension or filename to be accepted in Linguist, we require that there is sufficient wide-spread usage on public GitHub repositories. This means we do not accept PRs for very new or hobby languages, and will close any such PRs that attempt to add them. We use GitHub's Search to assess popularity. The search query we ask you to provide in the PR template is required to support evidence of your language's usage in the wild. Note that there are [limitations][search-limitations] imposed on what results are indexed by GitHub Search. The usage requirements are: - at least 2000 files per extension or filename indexed in the last year (the number you see at the top of the search results), excluding forks, for extensions or filenames expected to occur more than once per repo, like Ruby's `.rb` extension. - at least 200 files per extension or filename indexed in the last year, excluding forks, for extensions or filenames expected to only occur once per repo, like a `Makefile`. - the results should show a reasonable distribution across unique `:user/:repo` combinations assessed by manually and randomly clicking through the results. If particular users are showing a high proportion of the results, for example the primary language owner, we will filter out those users using `-user:` to reduce their impact on the assessment. This method of assessment is reviewed periodically to see if a better method becomes available. If you have a better approach, please open a new [discussion][]. ## Testing You can run the tests locally with: ```bash bundle exec rake test ``` You can test the classifier locally with: ```bash bundle exec script/cross-validation --test ``` Sometimes getting the tests running can be too much work, especially if you don't have much Ruby experience. It's okay: be lazy and let [GitHub Actions](https://github.com/features/actions) run the tests for you. Just open a pull request and the bot will start cranking away. Here's our current build status: [![Actions Status](https://github.com/github/linguist/workflows/Run%20Tests/badge.svg)](https://github.com/github/linguist/actions) ## Maintainers Linguist is maintained with :heart: by: - **@Alhadis** - **@lildude** (GitHub staff) As Linguist is a production dependency for GitHub we have a couple of workflow restrictions: - Anyone with commit rights can merge Pull Requests provided that there is a :+1: from a GitHub staff member. - Releases are performed by GitHub staff so we can ensure GitHub.com always stays up to date with the latest release of Linguist and there are no regressions in production. [discussion]: https://github.com/github-linguist/linguist/discussions [grammars]: /vendor/README.md [heuristic]: https://github.com/github/linguist/blob/master/lib/linguist/heuristics.yml [languages]: /lib/linguist/languages.yml [licenses]: https://github.com/github/linguist/blob/9b1023ed5d308cb3363a882531dea1e272b59977/vendor/licenses/config.yml#L4-L15 [samples]: /samples [search-example]: https://github.com/search?type=code&q=NOT+is%3Afork+path%3A*.boot [search-limitations]: https://docs.github.com/en/search-github/github-code-search/about-github-code-search [#5756]: https://github.com/github/linguist/issues/5756 [merged-pr]: /docs/troubleshooting.md#my-linguist-pr-has-been-merged-but-gitHub-doesnt-reflect-my-changes ================================================ FILE: Dockerfile ================================================ FROM ruby:2-alpine3.13 RUN apk --update add --virtual build_deps \ build-base \ libc-dev \ cmake \ && apk add icu-dev openssl-dev \ && gem install github-linguist \ && apk del build_deps \ && rm /var/cache/apk/* CMD ["github-linguist"] ================================================ FILE: Gemfile ================================================ source 'https://rubygems.org' gemspec :name => "github-linguist" group :debug do gem 'byebug' if RUBY_VERSION >= '2.2' end ================================================ FILE: LICENSE ================================================ Copyright (c) 2017 GitHub, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. ================================================ FILE: README.md ================================================ # Linguist [![Actions Status](https://github.com/github/linguist/workflows/Run%20Tests/badge.svg)](https://github.com/github/linguist/actions) [![Open in GitHub Codespaces](https://github.com/codespaces/badge.svg)](https://codespaces.new/github-linguist/linguist) This library is used on GitHub.com to detect blob languages, ignore binary or vendored files, suppress generated files in diffs, and generate language breakdown graphs. ## Documentation - [How Linguist works](/docs/how-linguist-works.md) - [Change Linguist's behaviour with overrides](/docs/overrides.md) - [Troubleshooting](/docs/troubleshooting.md) - [Contributing guidelines](CONTRIBUTING.md) ## Installation Install the gem: ```bash gem install github-linguist ``` ### Dependencies Linguist is a Ruby library so you will need a recent version of Ruby installed. There are known problems with the macOS/Xcode supplied version of Ruby that causes problems installing some of the dependencies. Accordingly, we highly recommend you install a version of Ruby using Homebrew, `rbenv`, `rvm`, `ruby-build`, `asdf` or other packaging system, before attempting to install Linguist and the dependencies. Linguist uses [`charlock_holmes`](https://github.com/brianmario/charlock_holmes) for character encoding and [`rugged`](https://github.com/libgit2/rugged) for libgit2 bindings for Ruby. These components have their own dependencies. 1. charlock_holmes * cmake * pkg-config * [ICU](http://site.icu-project.org/) * [zlib](https://zlib.net/) 2. rugged * [libcurl](https://curl.haxx.se/libcurl/) * [OpenSSL](https://www.openssl.org) You may need to install missing dependencies before you can install Linguist. For example, on macOS with [Homebrew](http://brew.sh/): ```bash brew install cmake pkg-config icu4c ``` On Ubuntu: ```bash sudo apt-get install build-essential cmake pkg-config libicu-dev zlib1g-dev libcurl4-openssl-dev libssl-dev ruby-dev ``` ## Usage ### Application usage Linguist can be used in your application as follows: ```ruby require 'rugged' require 'linguist' repo = Rugged::Repository.new('.') project = Linguist::Repository.new(repo, repo.head.target_id) project.language #=> "Ruby" project.languages #=> { "Ruby" => 119387 } ``` ### Command line usage The `github-linguist` executable operates in two distinct modes: 1. **[Git Repository mode](#git-repository)** - Analyzes an entire Git repository (when given a directory path or no path) 2. **[Single file mode](#single-file)** - Analyzes a specific file (when given a file path) #### Git Repository A repository's languages stats can be assessed from the command line using the `github-linguist` executable. Without any options, `github-linguist` will output the language breakdown by percentage and file size. ```bash cd /path-to-repository github-linguist ``` You can try running `github-linguist` on the root directory in this repository itself: ```console $ github-linguist 66.84% 264519 Ruby 24.68% 97685 C 6.57% 25999 Go 1.29% 5098 Lex 0.32% 1257 Shell 0.31% 1212 Dockerfile ``` #### Additional options ##### `--rev REV` The `--rev REV` flag will change the git revision being analyzed to any [gitrevisions(1)](https://git-scm.com/docs/gitrevisions#_specifying_revisions) compatible revision you specify. This is useful to analyze the makeup of a repo as of a certain tag, or in a certain branch. For example, here is the popular [Jekyll open source project](https://github.com/jekyll/jekyll). ```console $ github-linguist jekyll 70.64% 709959 Ruby 23.04% 231555 Gherkin 3.80% 38178 JavaScript 1.19% 11943 HTML 0.79% 7900 Shell 0.23% 2279 Dockerfile 0.13% 1344 Earthly 0.10% 1019 CSS 0.06% 606 SCSS 0.02% 234 CoffeeScript 0.01% 90 Hack ``` And here is Jekyll's published website, from the gh-pages branch inside their repository. ```console $ github-linguist jekyll --rev origin/gh-pages 100.00% 2568354 HTML ``` ##### `--breakdown` The `--breakdown` or `-b` flag will additionally show the breakdown of files by language. You can try running `github-linguist` on the root directory in this repository itself: ```console $ github-linguist --breakdown 66.84% 264519 Ruby 24.68% 97685 C 6.57% 25999 Go 1.29% 5098 Lex 0.32% 1257 Shell 0.31% 1212 Dockerfile Ruby: Gemfile Rakefile bin/git-linguist bin/github-linguist ext/linguist/extconf.rb github-linguist.gemspec lib/linguist.rb … ``` ##### `--strategies` The `--strategies` or `-s` flag will show the language detection strategy used for each file. This is useful for understanding how Linguist determined the language of specific files. Note that unless the `--json` flag is specified, this flag will set the `--breakdown` flag implicitly. You can try running `github-linguist` on the root directory in this repository itself with the strategies flag: ```console $ github-linguist --breakdown --strategies 66.84% 264519 Ruby 24.68% 97685 C 6.57% 25999 Go 1.29% 5098 Lex 0.32% 1257 Shell 0.31% 1212 Dockerfile Ruby: Gemfile [Filename] Rakefile [Filename] bin/git-linguist [Extension] bin/github-linguist [Extension] lib/linguist.rb [Extension] … ``` If a file's language is affected by `.gitattributes`, the strategy will show the original detection method along with a note indicating whether the gitattributes setting changed the result or confirmed it. For instance, if you had the following .gitattributes overrides in your repo: ```gitattributes *.ts linguist-language=JavaScript *.js linguist-language=JavaScript ``` the output of Linguist would be something like this: ```console 100.00% 217 JavaScript JavaScript: demo.ts [Heuristics (overridden by .gitattributes)] demo.js [Extension (confirmed by .gitattributes)] ``` ##### `--json` The `--json` or `-j` flag output the data into JSON format. ```console $ github-linguist --json {"Dockerfile":{"size":1212,"percentage":"0.31"},"Ruby":{"size":264519,"percentage":"66.84"},"C":{"size":97685,"percentage":"24.68"},"Lex":{"size":5098,"percentage":"1.29"},"Shell":{"size":1257,"percentage":"0.32"},"Go":{"size":25999,"percentage":"6.57"}} ``` This option can be used in conjunction with `--breakdown` to get a full list of files along with the size and percentage data. ```console $ github-linguist --breakdown --json {"Dockerfile":{"size":1212,"percentage":"0.31","files":["Dockerfile","tools/grammars/Dockerfile"]},"Ruby":{"size":264519,"percentage":"66.84","files":["Gemfile","Rakefile","bin/git-linguist","bin/github-linguist","ext/linguist/extconf.rb","github-linguist.gemspec","lib/linguist.rb",...]}} ``` NB. The `--strategies` flag has no effect, when the `--json` flag is present. #### Single file Alternatively you can find stats for a single file using the `github-linguist` executable. You can try running `github-linguist` on files in this repository itself: ```console $ github-linguist grammars.yml grammars.yml: 884 lines (884 sloc) type: Text mime type: text/x-yaml language: YAML ``` #### Additional options ##### `--breakdown` This flag has no effect in *Single file* mode. ##### `--strategies` When using the `--strategies` or `-s` flag with a single file, you can see which detection method was used: ```console $ github-linguist --strategies lib/linguist.rb lib/linguist.rb: 105 lines (96 sloc) type: Text mime type: application/x-ruby language: Ruby strategy: Extension ``` If a file's language is affected by `.gitattributes`, the strategy will show whether the gitattributes setting changed the result or confirmed it: In this fictitious example, it says "confirmed by .gitattributes" since the detection process (using the Filename strategy) would have given the same output as the override: ```console .devcontainer/devcontainer.json: 27 lines (27 sloc) type: Text mime type: application/json language: JSON with Comments strategy: Filename (confirmed by .gitattributes) ``` In this other fictitious example, it says "overridden by .gitattributes" since the gitattributes setting changes the detected language to something different: ```console test.rb: 13 lines (11 sloc) type: Text mime type: application/x-ruby language: Java strategy: Extension (overridden by .gitattributes) ``` Here, the `.rb` file would normally be detected as Ruby by the Extension strategy, but `.gitattributes` overrides it to be detected as Java instead. ##### `--json` Using the `--json` flag will give you the output for a single file in JSON format: ```console $ github-linguist --strategies --json lib/linguist.rb {"lib/linguist.rb":{"lines":105,"sloc":96,"type":"Text","mime_type":"application/x-ruby","language":"Ruby","large":false,"generated":false,"vendored":false}} ``` NB. The `--strategies` has no effect, when the `--json` flag is present. #### Docker If you have Docker installed you can either build or use our pre-built images and run Linguist within a container: ```console $ docker run --rm -v $(pwd):$(pwd):Z -w $(pwd) -t ghcr.io/github-linguist/linguist:latest 66.84% 264519 Ruby 24.68% 97685 C 6.57% 25999 Go 1.29% 5098 Lex 0.32% 1257 Shell 0.31% 1212 Dockerfile ``` ##### Building the image ```console $ docker build -t linguist . $ docker run --rm -v $(pwd):$(pwd):Z -w $(pwd) -t linguist 66.84% 264519 Ruby 24.68% 97685 C 6.57% 25999 Go 1.29% 5098 Lex 0.32% 1257 Shell 0.31% 1212 Dockerfile $ docker run --rm -v $(pwd):$(pwd) -w $(pwd) -t linguist github-linguist --breakdown 66.84% 264519 Ruby 24.68% 97685 C 6.57% 25999 Go 1.29% 5098 Lex 0.32% 1257 Shell 0.31% 1212 Dockerfile Ruby: Gemfile Rakefile bin/git-linguist bin/github-linguist ext/linguist/extconf.rb github-linguist.gemspec lib/linguist.rb … ``` ## Contributing Please check out our [contributing guidelines](CONTRIBUTING.md). ## License The language grammars included in this gem are covered by their repositories' respective licenses. [`vendor/README.md`](/vendor/README.md) lists the repository for each grammar. All other files are covered by the MIT license, see [`LICENSE`](./LICENSE). ================================================ FILE: Rakefile ================================================ require 'bundler/setup' require 'rake/clean' require 'rake/testtask' require 'rake/extensiontask' require 'yaml' require 'yajl' require 'open-uri' require 'json' require 'open3' task :default => :test Rake::TestTask.new gem_spec = Gem::Specification.load('github-linguist.gemspec') Rake::ExtensionTask.new('linguist', gem_spec) do |ext| ext.lib_dir = File.join('lib', 'linguist') end # Extend test task to check for samples and fetch latest Ace modes task :test => [:compile, :check_samples, :fetch_ace_modes] desc "Check that we have samples.json generated" task :check_samples do unless File.exist?('lib/linguist/samples.json') Rake::Task[:samples].invoke end end desc "Fetch the latest Ace modes from its GitHub repository" task :fetch_ace_modes do ACE_FIXTURE_PATH = File.join('test', 'fixtures', 'ace_modes.json') File.delete(ACE_FIXTURE_PATH) if File.exist?(ACE_FIXTURE_PATH) begin ace_github_modes_lib = URI.open("https://api.github.com/repos/ajaxorg/ace/contents/lib/ace/mode").read ace_github_modes_src = URI.open("https://api.github.com/repos/ajaxorg/ace/contents/src/mode").read File.write(ACE_FIXTURE_PATH, "[#{ace_github_modes_lib},#{ace_github_modes_src}]") rescue OpenURI::HTTPError, SocketError # no internet? no problem. end end task :samples => :compile do require 'linguist/samples' json = Yajl.dump(Linguist::Samples.data, :pretty => false) File.write 'lib/linguist/samples.json', json end task :flex do if `flex -V` !~ /^flex \d+\.\d+\.\d+/ fail "flex not detected" end system "cd ext/linguist && flex tokenizer.l" end # The error count will need to be adjusted here until such time as all grammars are 100% error free. desc "Check that compiling the grammars doesn't introduce any new unexpected errors" task :check_grammars do expected_error_count = 54 # This count should only ever go down. If it goes up, there's a new issue that needs to be addressed before updating the grammar. rm_rf "linguist-grammars" output, status = Open3.capture2e("script/grammar-compiler", "compile", "-o", "linguist-grammars") errors_found = output[/The grammar library contains ([0-9]+) errors/, 1].to_i missing_grammars = output.scan(/Missing scope in repository: `([^`].+)` is listed in grammars.yml but cannot be found/) unless missing_grammars.empty? fail <<~MISSING #{output} ERROR: Could not find the following grammars: #{missing_grammars.join("\n")} Please review the output above. MISSING end unless errors_found == expected_error_count fail <<~ERRORS #{output} ERROR: An unexpected number of errors have been found. Expected: #{expected_error_count}, Found: #{errors_found}. Please review the output and adjust the rake task expected error count if needed. ERRORS end end task :build_gem => :samples do rm_rf "grammars" sh "script/grammar-compiler compile -o grammars || true" languages = YAML.load_file("lib/linguist/languages.yml") File.write("lib/linguist/languages.json", Yajl.dump(languages)) `gem build github-linguist.gemspec` File.delete("lib/linguist/languages.json") end namespace :benchmark do benchmark_path = "benchmark/results" # $ bundle exec rake benchmark:generate CORPUS=path/to/samples desc "Generate results for" task :generate do ref = `git rev-parse HEAD`.strip[0,8] corpus = File.expand_path(ENV["CORPUS"] || "samples") require 'linguist' results = Hash.new Dir.glob("#{corpus}/**/*").each do |file| next unless File.file?(file) filename = file.gsub("#{corpus}/", "") results[filename] = Linguist::FileBlob.new(file).language end # Ensure results directory exists FileUtils.mkdir_p("benchmark/results") # Write results if `git status`.include?('working directory clean') result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}.json" else result_filename = "benchmark/results/#{File.basename(corpus)}-#{ref}-unstaged.json" end File.write(result_filename, results.to_json) puts "wrote #{result_filename}" end # $ bundle exec rake benchmark:compare REFERENCE=path/to/reference.json CANDIDATE=path/to/candidate.json desc "Compare results" task :compare do reference_file = ENV["REFERENCE"] candidate_file = ENV["CANDIDATE"] reference = Yajl.load(File.read(reference_file)) reference_counts = Hash.new(0) reference.each { |filename, language| reference_counts[language] += 1 } candidate = Yajl.load(File.read(candidate_file)) candidate_counts = Hash.new(0) candidate.each { |filename, language| candidate_counts[language] += 1 } changes = diff(reference_counts, candidate_counts) if changes.any? changes.each do |language, (before, after)| before_percent = 100 * before / reference.size.to_f after_percent = 100 * after / candidate.size.to_f puts "%s changed from %.1f%% to %.1f%%" % [language || 'unknown', before_percent, after_percent] end else puts "No changes" end end end namespace :classifier do LIMIT = 1_000 desc "Run classifier against #{LIMIT} public gists" task :test do require 'linguist/classifier' require 'linguist/samples' total, correct, incorrect = 0, 0, 0 $stdout.sync = true each_public_gist do |gist_url, file_url, file_language| next if file_language.nil? || file_language == 'Text' begin data = open(file_url).read guessed_language, score = Linguist::Classifier.classify(Linguist::Samples.cache, data).first total += 1 guessed_language == file_language ? correct += 1 : incorrect += 1 print "\r\e[0K%d:%d %g%%" % [correct, incorrect, (correct.to_f/total.to_f)*100] $stdout.flush rescue URI::InvalidURIError else break if total >= LIMIT end end puts "" end def each_public_gist require 'open-uri' url = "https://api.github.com/gists/public" loop do resp = open(url) url = resp.meta['link'][/<([^>]+)>; rel="next"/, 1] gists = Yajl.load(resp.read) for gist in gists for filename, attrs in gist['files'] yield gist['url'], attrs['raw_url'], attrs['language'] end end end end end def diff(a, b) (a.keys | b.keys).each_with_object({}) do |key, diff| diff[key] = [a[key], b[key]] unless a[key] == b[key] end end ================================================ FILE: audio.liq ================================================ # Multiband compression. The list in argument specifies # - the `frequency` below which we should apply compression (it is above previous band) # - the `attack` time (ms) # - the `release` time (ms) # - the compression `ratio` # - the `threshold` for compression # - the `gain` for the band # @category Source / Audio processing # @param ~limit Also apply limiting to bands. # @param l Parameters for compression bands. # @param s Source on which multiband compression should be applied. # @flag extra def compress.multiband(~limit=true, ~wet=getter(1.), s, l) = # Check that the bands are with increasing frequencies. for i = 0 to list.length(l) - 2 do if getter.get(list.nth(l, i + 1).frequency) < getter.get(list.nth(l, i).frequency) then failwith("Bands should be sorted.") end end # Process a band def band(low, band) = high = if getter.is_constant(band.frequency) and getter.get(band.frequency) >= float_of_int(audio.samplerate()) / 2. then infinity else band.frequency end s = filter.iir.eq.low_high(low=low, high=high, s) s = compress( attack=band.attack, release=band.release, threshold=band.threshold, ratio=band.ratio, gain=band.gain, s ) if limit then limiter(s) else s end end ls = list.mapi( fun (i, b) -> band(if i == 0 then 0. else list.nth(l, i - 1).frequency end, b), l ) c = add(normalize=false, ls) s = if not getter.is_constant(wet) or getter.get(wet) != 1. then add( normalize=false, [amplify({1. - getter.get(wet)}, s), amplify(wet, c)] ) else c end # Seal l element type if false then () else list.hd(l) end # Limit to avoid bad surprises limiter(s) end # Compress and normalize, producing a more uniform and "full" sound. # @category Source / Audio processing # @flag extra # @param s The input source. def nrj(s) = compress(threshold=-15., ratio=3., gain=3., normalize(s)) end # Multiband-compression. # @category Source / Audio processing # @flag extra # @param s The input source. def sky(s) = # 3-band crossover low = fun (s) -> filter.iir.eq.low(frequency=168., s) mh = fun (s) -> filter.iir.eq.high(frequency=100., s) mid = fun (s) -> filter.iir.eq.low(frequency=1800., s) high = fun (s) -> filter.iir.eq.high(frequency=1366., s) # Add back add( normalize=false, [ compress( attack=100., release=200., threshold=-20., ratio=6., gain=6.7, knee=0.3, low(s) ), compress( attack=100., release=200., threshold=-20., ratio=6., gain=6.7, knee=0.3, mid(mh(s)) ), compress( attack=100., release=200., threshold=-20., ratio=6., gain=6.7, knee=0.3, high(s) ) ] ) end # Generate DTMF tones. # @flag extra # @category Source / Sound synthesis # @param ~duration Duration of a tone (in seconds). # @param ~delay Dealy between two successive tones (in seconds). # @param dtmf String describing DTMF tones to generates: it should contains characters 0 to 9, A to D, or * or #. def replaces dtmf(~duration=0.1, ~delay=0.05, dtmf) = l = ref([]) for i = 0 to string.length(dtmf) - 1 do c = string.sub(dtmf, start=i, length=1) let (row, col) = if c == "1" then (697., 1209.) elsif c == "2" then (697., 1336.) elsif c == "3" then (697., 1477.) elsif c == "A" then (697., 1633.) elsif c == "4" then (770., 1209.) elsif c == "5" then (770., 1336.) elsif c == "6" then (770., 1477.) elsif c == "B" then (770., 1633.) elsif c == "7" then (852., 1209.) elsif c == "8" then (852., 1336.) elsif c == "9" then (852., 1477.) elsif c == "C" then (852., 1633.) elsif c == "*" then (941., 1209.) elsif c == "0" then (941., 1336.) elsif c == "#" then (941., 1477.) elsif c == "D" then (941., 1633.) else (0., 0.) end s = add([sine(row, duration=duration), sine(col, duration=duration)]) l := blank(duration=delay)::l() l := s::l() end l = list.rev(l()) sequence(l) end # Mixing table controllable via source methods and optional # server/telnet commands. # @flag extra # @category Source / Audio processing # @param ~id Force the value of the source ID. # @param ~register_server_commands Register corresponding server commands def mix(~id=null(), ~register_server_commands=true, sources) = id = string.id.default(default="mixer", id) inputs = list.map( fun (s) -> begin volume = ref(1.) is_selected = ref(false) is_single = ref(false) {volume=volume, selected=is_selected, single=is_single, source=s} end, sources ) insert_metadata_fn = ref(fun (_) -> ()) sources = list.map( fun (input) -> begin s = amplify(input.volume, input.source) s = source.on_track( s, fun (_) -> if input.single() then input.selected := false end ) s = source.on_metadata( s, fun (m) -> begin fn = insert_metadata_fn() fn(m) end ) switch([(input.selected, s)]) end, inputs ) s = add(sources) let {metadata = _, ...tracks} = source.tracks(s) s = source(tracks) s = insert_metadata(s) insert_metadata_fn := s.insert_metadata let {track_marks = _, ...tracks} = source.tracks(s) s = source(id=id, tracks) if register_server_commands then def status(input) = "ready=#{source.is_ready( input.source )} selected=#{input.selected()} single=#{input.single()} volume=#{int_of_float( input.volume() * 100. )}% remaining=#{source.remaining(input.source)}" end server.register( namespace=source.id(s), description="Skip current track on all enabled sources.", "skip", fun (_) -> begin list.iter( fun (input) -> if input.selected() then source.skip(input.source) end, inputs ) "OK" end ) server.register( namespace=source.id(s), description="Set volume for a given source.", usage="volume ", "volume", fun (v) -> begin try let [i, v] = r/\s/.split(v) input = list.nth(inputs, int_of_string(i)) input.volume := float_of_string(v) status(input) catch _ do "Usage: volume " end end ) server.register( namespace=source.id(s), description="Enable/disable a source.", usage="select ", "select", fun (arg) -> begin try let [i, b] = r/\s/.split(arg) input = list.nth(inputs, int_of_string(i)) input.selected := (b == "true") status(input) catch _ do "Usage: select " end end ) server.register( namespace=source.id(s), description="Enable/disable automatic stop at the end of track.", usage="single ", "single", fun (arg) -> begin try let [i, b] = r/\s/.split(arg) input = list.nth(inputs, int_of_string(i)) input.single := (b == "true") status(input) catch _ do "Usage: single " end end ) server.register( namespace=source.id(s), description="Display current status.", "status", fun (i) -> begin try status(list.nth(inputs, int_of_string(i))) catch _ do "Usage: status " end end ) server.register( namespace=source.id(s), description="Print the list of input sources.", "inputs", fun (_) -> string.concat( separator=" ", list.map(fun (input) -> source.id(input.source), inputs) ) ) end s.{inputs=inputs} end ================================================ FILE: bin/git-linguist ================================================ #!/usr/bin/env ruby $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib') require 'linguist' require 'rugged' require 'optparse' require 'json' require 'tempfile' require 'zlib' class GitLinguist def initialize(path, commit_oid, incremental = true, tree_size = Linguist::Repository.MAX_TREE_SIZE) @repo_path = path @commit_oid = commit_oid @incremental = incremental @tree_size = tree_size end def linguist if @commit_oid.nil? raise "git-linguist must be called with a specific commit OID to perform language computation" end repo = Linguist::Repository.new(rugged, @commit_oid, @tree_size) if @incremental && stats = load_language_stats old_commit_oid, old_stats = stats # A cache with NULL oid means that we want to freeze # these language stats in place and stop computing # them (for performance reasons) return old_stats if old_commit_oid == NULL_OID repo.load_existing_stats(old_commit_oid, old_stats) end result = yield repo save_language_stats(@commit_oid, repo.cache) result end def load_language_stats version, oid, stats = load_cache if version == LANGUAGE_STATS_CACHE_VERSION && oid && stats [oid, stats] end end def save_language_stats(oid, stats) cache = [LANGUAGE_STATS_CACHE_VERSION, oid, stats] write_cache(cache) end def clear_language_stats File.unlink(cache_file) rescue Errno::ENOENT end def disable_language_stats save_language_stats(NULL_OID, {}) end protected NULL_OID = ("0" * 40).freeze LANGUAGE_STATS_CACHE = 'language-stats.cache' LANGUAGE_STATS_CACHE_VERSION = "v3:#{Linguist::VERSION}" def rugged @rugged ||= Rugged::Repository.bare(@repo_path) end def cache_file File.join(@repo_path, LANGUAGE_STATS_CACHE) end def write_cache(object) return unless File.directory? @repo_path Tempfile.open('cache_file', @repo_path) do |f| marshal = Marshal.dump(object) f.write(Zlib::Deflate.deflate(marshal)) f.close File.rename(f.path, cache_file) end FileUtils.chmod 0644, cache_file end def load_cache marshal = File.open(cache_file, "rb") { |f| Zlib::Inflate.inflate(f.read) } Marshal.load(marshal) rescue SystemCallError, ::Zlib::DataError, ::Zlib::BufError, TypeError nil end end def git_linguist(args) incremental = true commit = nil tree_size = Linguist::Repository::MAX_TREE_SIZE parser = OptionParser.new do |opts| opts.banner = <<~HELP Linguist v#{Linguist::VERSION} Detect language type and determine language breakdown for a given Git repository. Usage: git-linguist [OPTIONS] stats|breakdown|dump-cache|clear|disable HELP opts.on("-f", "--force", "Force a full rescan") { incremental = false } opts.on("-c", "--commit=COMMIT", "Commit to index") { |v| commit = v} opts.on("-t", "--tree-size=NUMBER", Integer, "Maximum number of files scanned to detect languages (default: #{Linguist::Repository::MAX_TREE_SIZE})" ) { |t| tree_size = t } end parser.parse!(args) git_dir = `git rev-parse --git-dir`.strip raise "git-linguist must be run in a Git repository" unless $?.success? wrapper = GitLinguist.new(git_dir, commit, incremental, tree_size) case args.pop when "stats" wrapper.linguist do |linguist| puts JSON.dump(linguist.languages) end when "breakdown" wrapper.linguist do |linguist| puts JSON.dump(linguist.breakdown_by_file) end when "dump-cache" puts JSON.dump(wrapper.load_language_stats) when "clear" wrapper.clear_language_stats when "disable" wrapper.disable_language_stats else $stderr.print(parser.help) exit 1 end rescue SystemExit exit 1 rescue Exception => e $stderr.puts e.message $stderr.puts e.backtrace exit 1 end git_linguist(ARGV) ================================================ FILE: bin/github-linguist ================================================ #!/usr/bin/env ruby $LOAD_PATH[0, 0] = File.join(File.dirname(__FILE__), '..', 'lib') require 'linguist' require 'rugged' require 'json' require 'optparse' require 'pathname' HELP_TEXT = <<~HELP Linguist v#{Linguist::VERSION} Detect language type and determine language breakdown for a given Git repository. Usage: github-linguist github-linguist [--rev REV] [--tree-size] [--breakdown] [--strategies] [--json] github-linguist [--rev REV] [--tree-size] [--breakdown] [--strategies] [--json] HELP def github_linguist(args) breakdown = false json_output = false show_strategies = false tree_size = Linguist::Repository::MAX_TREE_SIZE rev = 'HEAD' path = Dir.pwd parser = OptionParser.new do |opts| opts.banner = HELP_TEXT opts.version = Linguist::VERSION opts.on("-b", "--breakdown", "Analyze entire repository and display detailed usage statistics") { breakdown = true } opts.on("-s", "--strategies", "Show language detection strategy used for each file") { show_strategies = true } opts.on("-j", "--json", "Output results as JSON") { json_output = true } opts.on("-r", "--rev REV", String, "Analyze specific git revision", "defaults to HEAD, see gitrevisions(1) for alternatives") { |r| rev = r } opts.on("-t", "--tree-size=NUMBER", Integer, "Maximum number of files scanned to detect languages (default: #{Linguist::Repository::MAX_TREE_SIZE})") { |t| tree_size = t } opts.on("-h", "--help", "Display a short usage summary, then exit") do puts opts exit end end parser.parse!(args) if !args.empty? if File.directory?(args[0]) || File.file?(args[0]) path = args[0] else abort HELP_TEXT end end if File.directory?(path) rugged = Rugged::Repository.new(path) begin target_oid = rugged.rev_parse_oid(rev) rescue puts "invalid revision '#{rev}' for repo '#{path}'" exit 1 end # Set up instrumentation to track detection strategies if requested instrumenter = show_strategies ? Linguist::BasicInstrumenter.new : nil Linguist.instrumenter = instrumenter repo = Linguist::Repository.new(rugged, target_oid, tree_size) full_results = {} repo.languages.each do |language, size| percentage = ((size / repo.size.to_f) * 100) percentage = sprintf '%.2f' % percentage full_results.merge!({"#{language}": { size: size, percentage: percentage } }) end if !json_output full_results.sort_by { |_, v| v[:size] }.reverse.each do |language, details| puts "%-7s %-10s %s" % ["#{details[:percentage]}%", details[:size], language] end if breakdown || show_strategies puts file_breakdown = repo.breakdown_by_file file_breakdown.each do |lang, files| puts "#{lang}:" files.each do |file| strategy_info = instrumenter&.detected_info&.[](file) if show_strategies && strategy_info puts " #{file} [#{strategy_info[:strategy]}]" else puts " #{file}" end end puts end end else if !breakdown puts JSON.dump(full_results) else combined_results = full_results.merge({}) repo.breakdown_by_file.each do |language, files| combined_results[language.to_sym].update({"files": files}) end puts JSON.dump(combined_results) end end elsif File.file?(path) # Set up instrumentation to track detection strategies if requested instrumenter = show_strategies ? Linguist::BasicInstrumenter.new : nil Linguist.instrumenter = instrumenter begin # Check if this file is inside a git repository so we have things like # `.gitattributes` applied. file_full_path = File.realpath(path) rugged = Rugged::Repository.discover(file_full_path) file_rel_path = file_full_path.sub(rugged.workdir, '') oid = -> { rugged.head.target.tree.walk_blobs { |r, b| return b[:oid] if r + b[:name] == file_rel_path } } blob = Linguist::LazyBlob.new(rugged, oid.call, file_rel_path) rescue Rugged::RepositoryError blob = Linguist::FileBlob.new(path, Dir.pwd) end type = if blob.text? 'Text' elsif blob.image? 'Image' else 'Binary' end if json_output puts JSON.generate( { path => { :lines => blob.loc, :sloc => blob.sloc, :type => type, :mime_type => blob.mime_type, :language => blob.language, :large => blob.large?, :generated => blob.generated?, :vendored => blob.vendored?, } } ) else puts "#{path}: #{blob.loc} lines (#{blob.sloc} sloc)" puts " type: #{type}" puts " mime type: #{blob.mime_type}" puts " language: #{blob.language}" if show_strategies && blob.language strategy_info = instrumenter.detected_info[blob.name] puts " strategy: #{strategy_info[:strategy]}" if strategy_info end if blob.large? puts " blob is too large to be shown" end if blob.generated? puts " appears to be generated source code" end if blob.vendored? puts " appears to be a vendored file" end end else abort HELP_TEXT end end github_linguist(ARGV) ================================================ FILE: docs/README.md ================================================ # Linguist Documentation - [How Linguist works](how-linguist-works.md) - [Change Linguist's behaviour with overrides](overrides.md) - [Troubleshooting](troubleshooting.md) - [Contributing guidelines](/CONTRIBUTING.md) - [Releasing Linguist](releasing.md) (Only applicable to GitHub staff) ================================================ FILE: docs/how-linguist-works.md ================================================ # How Linguist works Linguist takes the list of languages it knows from [`languages.yml`](/lib/linguist/languages.yml) and uses a number of methods to try and determine the language used by each file, and the overall repository breakdown. Linguist starts by going through all the files in a repository and excludes all files that it determines to be binary data, [vendored code](/docs/overrides.md#vendored-code), [generated code](/docs/overrides.md#generated-code), [documentation](/docs/overrides.md#documentation), or are defined as `data` (e.g. SQL) or `prose` (e.g. Markdown) languages, whilst taking into account any [overrides](/docs/overrides.md). If an [explicit language override](/docs/overrides.md#using-gitattributes) has been used, that language is used for the matching files. The language of each remaining file is then determined using the following strategies, in order, with each step either identifying the precise language or reducing the number of likely languages passed down to the next strategy: - Vim or Emacs modeline, - commonly used filename, - shell shebang, - file extension, - XML header, - man page section, - heuristics, - naïve Bayesian classification The result of this analysis is used to produce the language stats bar which displays the languages percentages for the files in the repository. The percentages are calculated based on the bytes of code for each language as reported by the [List Languages](https://docs.github.com/rest/reference/repos#list-repository-languages) API. ![language stats bar](https://user-images.githubusercontent.com/2346707/91533656-9768b300-e953-11ea-808d-994cd50e6273.png) ## How Linguist works on GitHub.com When you push changes to a repository on GitHub.com, a low priority background job is enqueued to analyze the [default branch](https://docs.github.com/en/pull-requests/collaborating-with-pull-requests/proposing-changes-to-your-work-with-pull-requests/about-branches#about-the-default-branch) of your repository as explained above. The results of this analysis are cached for the lifetime of your repository and are only updated when the repository is updated. As this analysis is performed by a low priority background job, it can take a while, particularly during busy periods, for your language statistics bar to reflect your changes. ================================================ FILE: docs/overrides.md ================================================ # Overrides Linguist supports a number of different custom override strategies for language definitions and file paths. ## Using gitattributes Add [a `.gitattributes` file](https://git-scm.com/docs/gitattributes) to your project and use standard git-style path matchers for the files you want to override using the `linguist-documentation`, `linguist-language`, `linguist-vendored`, `linguist-generated` and `linguist-detectable` attributes. `.gitattributes` will be used to determine language statistics and will be used to syntax highlight files. You can also manually set syntax highlighting using [Vim or Emacs modelines](#using-emacs-or-vim-modelines). When testing with a local installation of Linguist, **take note that the added attributes will _not_ take effect until the `.gitattributes` file is committed to your repository.** File and folder paths inside `.gitattributes` are calculated relative to the position of the `.gitattributes` file. ```gitattributes # Example of a `.gitattributes` file which reclassifies `.rb` files as Java: *.rb linguist-language=Java # Replace any whitespace in the language name with hyphens: *.glyphs linguist-language=OpenStep-Property-List # Language names are case-insensitive and may be specified using an alias. # So, the following three lines are all functionally equivalent: *.es linguist-language=js *.es linguist-language=JS *.es linguist-language=JAVASCRIPT ``` ### Summary | Git attribute | Defined in | Effect on file | |:-----------------------------------------------|:----------------------|:----------------------------------------------------------------| | `linguist-detectable` | [`languages.yml`] | Included in stats, even if language's type is `data` or `prose` | | `linguist-documentation` | [`documentation.yml`] | Excluded from stats | | `linguist-generated` | [`generated.rb`] | Excluded from stats, hidden in diffs | | `linguist-language`=name | [`languages.yml`] | Highlighted and classified as name | | `linguist-vendored` | [`vendor.yml`] | Excluded from stats | ### Detectable By default only languages of type `programming` or `markup` in [`languages.yml`] are included in the language statistics. Languages of a different type in [`languages.yml`] are not "detectable" by default, causing them not to be included in the language statistics, but can be made detectable as shown below. Languages that are not yet mentioned in [`languages.yml`] will not be included in the language statistics, even if you specify something like `*.mycola linguist-language=MyCoolLang linguist-detectable` in the `.gitattributes` file. Use the `linguist-detectable` attribute to mark or unmark paths as detectable: ```gitattributes *.kicad_pcb linguist-detectable *.sch linguist-detectable tools/export_bom.py -linguist-detectable ``` ### Documentation Just like vendored files, Linguist excludes documentation files from your project's language stats. [`documentation.yml`] lists common documentation paths and excludes them from the language statistics for your repository. Use the `linguist-documentation` attribute to mark or unmark paths as documentation: ```gitattributes # Apply override to all files in the directory project-docs/* linguist-documentation # Apply override to a specific file docs/formatter.rb -linguist-documentation # Apply override to all files and directories in the directory ano-dir/** linguist-documentation ``` ### Generated code Not all plain text files are true source files. Generated files like minified JavaScript and compiled CoffeeScript can be detected and excluded from language stats. As an added bonus, unlike vendored and documentation files, these files are suppressed in diffs. [`generated.rb`] lists common generated paths and excludes them from the language statistics of your repository. Use the `linguist-generated` attribute to mark or unmark paths as generated. ```gitattributes Api.elm linguist-generated ``` ### Vendored code Checking code you didn't write, such as JavaScript libraries, into your git repo is a common practice, but this often inflates your project's language stats and may even cause your project to be labeled as another language. By default, Linguist treats all of the paths defined in [`vendor.yml`] as vendored and therefore doesn't include them in the language statistics for a repository. Use the `linguist-vendored` attribute to vendor or un-vendor paths: ```gitattributes # Apply override to all files in the directory special-vendored-path/* linguist-vendored # Apply override to a specific file jquery.js -linguist-vendored # Apply override to all files and directories in the directory ano-dir/** linguist-vendored ``` ## Using Emacs or Vim modelines If you do not want to use `.gitattributes` to override the syntax highlighting used on GitHub.com, you can use Vim or Emacs style modelines to set the language for a single file. Modelines can be placed anywhere within a file and are respected when determining how to syntax-highlight a file on GitHub.com ### Vim ``` # Some examples of various styles: vim: syntax=java vim: set syntax=ruby: vim: set filetype=prolog: vim: set ft=cpp: ``` ### Emacs ``` -*- mode: php; -*- -*- c++ -*- ``` [`documentation.yml`]: /lib/linguist/documentation.yml [`languages.yml`]: /lib/linguist/languages.yml [`generated.rb`]: /lib/linguist/generated.rb [`vendor.yml`]: /lib/linguist/vendor.yml ================================================ FILE: docs/releasing.md ================================================ # Releasing This is the procedure for making a new release of Linguist. The entire process needs to be performed by a member of GitHub staff. 1. Create a branch for the release: `git checkout -b release-vxx.xx.xx` 2. Make sure your local dependencies are up to date: `rm Gemfile.lock && script/bootstrap` 3. If the grammar submodules have not been updated recently, update them: `git submodule update --remote`. If any submodules are updated: 1. update the `grammars.yml`: `script/grammar-compiler update -f` 2. confirm the updated grammars still compile and no new errors have been introduced and none have gone missing: `bundle exec rake check_grammars` 3. verify and fix any problems identified above 4. commit all changes: `git commit -a` 5. update the license cache: `bundle exec licensed cache -c vendor/licenses/config.yml` 6. double check no license problems found: `bundle exec licensed status -c vendor/licenses/config.yml` 7. verify and fix any problems identified above 8. commit all changes: `git commit -a` 4. Ensure that samples are updated: `bundle exec rake samples` 5. Ensure that tests are green: `bundle exec rake test` 6. Build a test gem `GEM_VERSION=$(git describe --tags 2>/dev/null | sed 's/-/./g' | sed 's/v//') bundle exec rake build_gem` 7. Test the test gem: 1. Bump the Gemfile and Gemfile.lock versions for an app which relies on this gem 2. Install the new gem locally 3. Test behavior locally, branch deploy, whatever needs to happen 8. Bump gem version in `lib/linguist/VERSION`, [like this](https://github.com/github/linguist/commit/3212355400974ce5f7873a71eb8b85b1c5f4a6d2). 9. Make a PR to `github/linguist`, [like this](https://github.com/github/linguist/pull/5084). 10. Build a local gem: `bundle exec rake build_gem` 11. Merge the `github/linguist` PR 12. Tag and push: `git tag vx.xx.xx; git push --tags` 13. Create a GitHub release with the pushed tag (https://github.com/github/linguist/releases/new) and populate it using the "Generate release notes" button. 14. Build a grammars tarball (`./script/build-grammars-tarball`) and attach it to the GitHub release 15. Push to rubygems.pkg.github.com -- `gem push --key github --host https://rubygems.pkg.github.com/github github-linguist-3.0.0.gem`. See [Working with the RubyGems registry][gpr] for more details. 16. Push to rubygems.org -- `gem push github-linguist-3.0.0.gem` 17. Update and deploy the following repositories to use the new gem in production: - `github/github` - if backporting, label for backporting to the latest version of GitHub Enterprise Server only. - `github/treelights` - this only needs the Linguist version updated to pull the compiled grammars from the Linguist release. If backporting, label for backporting to the latest version of GitHub Enterprise Server only. Note: syntax highlighting changes won't take effect until the updated `github/treelights` repo has been deployed. [gpr]: https://docs.github.com/en/packages/working-with-a-github-packages-registry/working-with-the-rubygems-registry ================================================ FILE: docs/troubleshooting.md ================================================ # Troubleshooting ## My repository is detected as the wrong language If the language stats bar is reporting a language that you don't expect: 1. Click on the name of the language in the stats bar to see a list of the files that are identified as that language. Keep in mind this performs a search so the [code search restrictions][search-limits] may result in files identified in the language statistics not appearing in the search results. [Installing Linguist locally](/README.md/#installation) and running it from the [command line](/README.md#command-line-usage) will give you accurate results. 2. If you see files that you didn't write in the search results, consider moving the files into one of the [paths for vendored code](/lib/linguist/vendor.yml), or use the [manual overrides](/docs/overrides.md) feature to ignore them. 3. If the files are misclassified, search for [open issues](https://github.com/github/linguist/issues) to see if anyone else has already reported the issue. Any information you can add, especially links to public repositories, is helpful. You can also use the [manual overrides](/docs/overrides.md) feature to correctly classify them in your repository. 4. If there are no reported issues of this misclassification, [open an issue](https://github.com/github/linguist/issues/new) and include a link to the repository or a sample of the code that is being misclassified. [search-limits]: https://docs.github.com/github/searching-for-information-on-github/searching-code#considerations-for-code-search Keep in mind that the repository language stats are only [updated when you push changes](how-linguist-works.md#how-linguist-works-on-githubcom), and the results are cached for the lifetime of your repository. If you have not made any changes to your repository in a while, you may find pushing another change will correct the stats. ## When I click on a language present in the language stats bar, I get a message saying "Your search did not match any code" There are a few reasons that could lead to this outcome: 1. If the repository implements an override via the `linguist-language` attribute, it won't be taken into account in GitHub's search results since GitHub search relies on an internal library which doesn't support overrides at the moment. 2. GitHub's search internal library might not be using the latest version of Linguist which means that files could be detected differently in search compared to Linguist (see also the note at the end of [this section](#my-linguist-pr-has-been-merged-but-github-doesnt-reflect-my-changes)). 3. It could be that files are associated to a language that is part of a group. This means that they are counted as the parent language in the language stats bar, but as the actual language in search. For instance, a file ending with `.f90` is considered to be "Fortran" in the stats bar, but "Fortran Free Form" in search. 4. Finally, this can be caused by [code search limitations](https://docs.github.com/en/search-github/github-code-search/about-github-code-search#limitations) that are unrelated to Linguist. ## My C/C++/Objective-C `.h` header file is detected as the wrong language Correctly detecting the language for the C-family `.h` header files is tough because Linguist detects the languages of files in isolation when analysing repositories and these header files, especially the smaller ones, can be used across all three languages without using any language-specific content. To try and reduce the number of false positives and keep some degree of predictability for users, Linguist will assume all `.h` header files are C by default and will only identify a file as C++ or Objective-C if the content matches the specific heuristic for that language. This will mean you will need to implement an [override](/docs/overrides.md) for some of your header files if you wish for them to be classified as C++ or Objective-C if they do not contain language-specific content. ## My repository isn't showing my language Linguist does not consider [vendored code](/docs/overrides.md#vendored-code), [generated code](/docs/overrides.md#generated-code), [documentation](/docs/overrides.md#documentation), or `data` (e.g. SQL) or `prose` (e.g. Markdown) languages (as defined by the `type` attribute in [`languages.yml`](/lib/linguist/languages.yml)) when calculating the repository language statistics. If the language statistics bar is not showing your language at all, it could be for a few reasons: 1. Linguist doesn't know about your language. 2. The extension you have chosen is not associated with your language in [`languages.yml`](/lib/linguist/languages.yml). 3. All the files in your repository fall into one of the categories listed above that Linguist excludes by default. If Linguist doesn't know about the language or the extension you're using, consider [contributing](/CONTRIBUTING.md) to Linguist by opening a pull request to add support for your language or extension. For everything else, you can use the [manual overrides](/docs/overrides.md) feature to tell Linguist to include your files in the language statistics. ## There's a problem with the syntax highlighting of a file Linguist detects the language of a file but the actual syntax-highlighting is powered by a set of language grammars which are included in this project as a set of submodules [as listed here](/vendor/README.md). If you experience an issue with the syntax-highlighting on GitHub, **please report the issue to the upstream grammar repository, not here.** Grammars are updated every time we build the Linguist gem so upstream bug fixes are automatically incorporated as they are fixed. ## I get an error when using Linguist on a directory that is not a Git repository Linguist only works on Git repositories and individual files. Its primary use is on GitHub.com which uses bare repositories and thus changes need to be committed as individual files don't show on the filesystem. As a work around you could initialise a temporary Git repository in your directory as demonstrated in this [script](https://gist.github.com/PuZZleDucK/a45fd1fac3758235ffed9fe0e8aab643). Alternatively you can run Linguist on individual files, see [here](/README.md#single-file). ## I am unable to install Linguist on macOS There are several known issues with the version of Ruby shipped with macOS that cause problems when it comes to installing the charlock-holmes gem which is a Linguist dependency. As this is a problem with the Ruby shipped by Apple and not Linguist or charlock-holmes, we recommend you install a version of Ruby using Homebrew, `rbenv`, `rvm`, `ruby-build`, `asdf` or other packaging system, before attempting to install Linguist. ## My Linguist PR has been merged but GitHub doesn't reflect my changes Changes to Linguist will only appear on GitHub when a new Linguist release is made and this is deployed to GitHub.com. There is no set release timeframe, but the intention is at least once every three-to-four months so the latest version ships with each new major version of GitHub Enterprise Server. A PR like [this](https://github.com/github/linguist/pull/6051) will be created for the release with checkmarks for each stage of the release process. All syntax highlighting grammars will also be updated in all major and minor releases. Grammars will only be updated in patch releases if the patch release is specifically for that language and it requires a grammar update to address the issue. Note: New languages will not appear in GitHub's search results for some time after the pull request has been merged and the new Linguist release deployed to GitHub.com. This is because GitHub's search uses a separate internal library for language detection which tends to lag behind Linguist by a few weeks to months. ================================================ FILE: ext/linguist/extconf.rb ================================================ require 'mkmf' dir_config('linguist') create_makefile('linguist/linguist') ================================================ FILE: ext/linguist/lex.linguist_yy.c ================================================ #line 3 "lex.linguist_yy.c" #define YY_INT_ALIGNED short int /* A lexical scanner generated by flex */ #define FLEX_SCANNER #define YY_FLEX_MAJOR_VERSION 2 #define YY_FLEX_MINOR_VERSION 6 #define YY_FLEX_SUBMINOR_VERSION 4 #if YY_FLEX_SUBMINOR_VERSION > 0 #define FLEX_BETA #endif #ifdef yy_create_buffer #define linguist_yy_create_buffer_ALREADY_DEFINED #else #define yy_create_buffer linguist_yy_create_buffer #endif #ifdef yy_delete_buffer #define linguist_yy_delete_buffer_ALREADY_DEFINED #else #define yy_delete_buffer linguist_yy_delete_buffer #endif #ifdef yy_scan_buffer #define linguist_yy_scan_buffer_ALREADY_DEFINED #else #define yy_scan_buffer linguist_yy_scan_buffer #endif #ifdef yy_scan_string #define linguist_yy_scan_string_ALREADY_DEFINED #else #define yy_scan_string linguist_yy_scan_string #endif #ifdef yy_scan_bytes #define linguist_yy_scan_bytes_ALREADY_DEFINED #else #define yy_scan_bytes linguist_yy_scan_bytes #endif #ifdef yy_init_buffer #define linguist_yy_init_buffer_ALREADY_DEFINED #else #define yy_init_buffer linguist_yy_init_buffer #endif #ifdef yy_flush_buffer #define linguist_yy_flush_buffer_ALREADY_DEFINED #else #define yy_flush_buffer linguist_yy_flush_buffer #endif #ifdef yy_load_buffer_state #define linguist_yy_load_buffer_state_ALREADY_DEFINED #else #define yy_load_buffer_state linguist_yy_load_buffer_state #endif #ifdef yy_switch_to_buffer #define linguist_yy_switch_to_buffer_ALREADY_DEFINED #else #define yy_switch_to_buffer linguist_yy_switch_to_buffer #endif #ifdef yypush_buffer_state #define linguist_yypush_buffer_state_ALREADY_DEFINED #else #define yypush_buffer_state linguist_yypush_buffer_state #endif #ifdef yypop_buffer_state #define linguist_yypop_buffer_state_ALREADY_DEFINED #else #define yypop_buffer_state linguist_yypop_buffer_state #endif #ifdef yyensure_buffer_stack #define linguist_yyensure_buffer_stack_ALREADY_DEFINED #else #define yyensure_buffer_stack linguist_yyensure_buffer_stack #endif #ifdef yylex #define linguist_yylex_ALREADY_DEFINED #else #define yylex linguist_yylex #endif #ifdef yyrestart #define linguist_yyrestart_ALREADY_DEFINED #else #define yyrestart linguist_yyrestart #endif #ifdef yylex_init #define linguist_yylex_init_ALREADY_DEFINED #else #define yylex_init linguist_yylex_init #endif #ifdef yylex_init_extra #define linguist_yylex_init_extra_ALREADY_DEFINED #else #define yylex_init_extra linguist_yylex_init_extra #endif #ifdef yylex_destroy #define linguist_yylex_destroy_ALREADY_DEFINED #else #define yylex_destroy linguist_yylex_destroy #endif #ifdef yyget_debug #define linguist_yyget_debug_ALREADY_DEFINED #else #define yyget_debug linguist_yyget_debug #endif #ifdef yyset_debug #define linguist_yyset_debug_ALREADY_DEFINED #else #define yyset_debug linguist_yyset_debug #endif #ifdef yyget_extra #define linguist_yyget_extra_ALREADY_DEFINED #else #define yyget_extra linguist_yyget_extra #endif #ifdef yyset_extra #define linguist_yyset_extra_ALREADY_DEFINED #else #define yyset_extra linguist_yyset_extra #endif #ifdef yyget_in #define linguist_yyget_in_ALREADY_DEFINED #else #define yyget_in linguist_yyget_in #endif #ifdef yyset_in #define linguist_yyset_in_ALREADY_DEFINED #else #define yyset_in linguist_yyset_in #endif #ifdef yyget_out #define linguist_yyget_out_ALREADY_DEFINED #else #define yyget_out linguist_yyget_out #endif #ifdef yyset_out #define linguist_yyset_out_ALREADY_DEFINED #else #define yyset_out linguist_yyset_out #endif #ifdef yyget_leng #define linguist_yyget_leng_ALREADY_DEFINED #else #define yyget_leng linguist_yyget_leng #endif #ifdef yyget_text #define linguist_yyget_text_ALREADY_DEFINED #else #define yyget_text linguist_yyget_text #endif #ifdef yyget_lineno #define linguist_yyget_lineno_ALREADY_DEFINED #else #define yyget_lineno linguist_yyget_lineno #endif #ifdef yyset_lineno #define linguist_yyset_lineno_ALREADY_DEFINED #else #define yyset_lineno linguist_yyset_lineno #endif #ifdef yyget_column #define linguist_yyget_column_ALREADY_DEFINED #else #define yyget_column linguist_yyget_column #endif #ifdef yyset_column #define linguist_yyset_column_ALREADY_DEFINED #else #define yyset_column linguist_yyset_column #endif #ifdef yywrap #define linguist_yywrap_ALREADY_DEFINED #else #define yywrap linguist_yywrap #endif #ifdef yyalloc #define linguist_yyalloc_ALREADY_DEFINED #else #define yyalloc linguist_yyalloc #endif #ifdef yyrealloc #define linguist_yyrealloc_ALREADY_DEFINED #else #define yyrealloc linguist_yyrealloc #endif #ifdef yyfree #define linguist_yyfree_ALREADY_DEFINED #else #define yyfree linguist_yyfree #endif /* First, we deal with platform-specific or compiler-specific issues. */ /* begin standard C headers. */ #include #include #include #include /* end standard C headers. */ /* flex integer type definitions */ #ifndef FLEXINT_H #define FLEXINT_H /* C99 systems have . Non-C99 systems may or may not. */ #if defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L /* C99 says to define __STDC_LIMIT_MACROS before including stdint.h, * if you want the limit (max/min) macros for int types. */ #ifndef __STDC_LIMIT_MACROS #define __STDC_LIMIT_MACROS 1 #endif #include typedef int8_t flex_int8_t; typedef uint8_t flex_uint8_t; typedef int16_t flex_int16_t; typedef uint16_t flex_uint16_t; typedef int32_t flex_int32_t; typedef uint32_t flex_uint32_t; #else typedef signed char flex_int8_t; typedef short int flex_int16_t; typedef int flex_int32_t; typedef unsigned char flex_uint8_t; typedef unsigned short int flex_uint16_t; typedef unsigned int flex_uint32_t; /* Limits of integral types. */ #ifndef INT8_MIN #define INT8_MIN (-128) #endif #ifndef INT16_MIN #define INT16_MIN (-32767-1) #endif #ifndef INT32_MIN #define INT32_MIN (-2147483647-1) #endif #ifndef INT8_MAX #define INT8_MAX (127) #endif #ifndef INT16_MAX #define INT16_MAX (32767) #endif #ifndef INT32_MAX #define INT32_MAX (2147483647) #endif #ifndef UINT8_MAX #define UINT8_MAX (255U) #endif #ifndef UINT16_MAX #define UINT16_MAX (65535U) #endif #ifndef UINT32_MAX #define UINT32_MAX (4294967295U) #endif #ifndef SIZE_MAX #define SIZE_MAX (~(size_t)0) #endif #endif /* ! C99 */ #endif /* ! FLEXINT_H */ /* begin standard C++ headers. */ /* TODO: this is always defined, so inline it */ #define yyconst const #if defined(__GNUC__) && __GNUC__ >= 3 #define yynoreturn __attribute__((__noreturn__)) #else #define yynoreturn #endif /* Returned upon end-of-file. */ #define YY_NULL 0 /* Promotes a possibly negative, possibly signed char to an * integer in range [0..255] for use as an array index. */ #define YY_SC_TO_UI(c) ((YY_CHAR) (c)) /* An opaque pointer. */ #ifndef YY_TYPEDEF_YY_SCANNER_T #define YY_TYPEDEF_YY_SCANNER_T typedef void* yyscan_t; #endif /* For convenience, these vars (plus the bison vars far below) are macros in the reentrant scanner. */ #define yyin yyg->yyin_r #define yyout yyg->yyout_r #define yyextra yyg->yyextra_r #define yyleng yyg->yyleng_r #define yytext yyg->yytext_r #define yylineno (YY_CURRENT_BUFFER_LVALUE->yy_bs_lineno) #define yycolumn (YY_CURRENT_BUFFER_LVALUE->yy_bs_column) #define yy_flex_debug yyg->yy_flex_debug_r /* Enter a start condition. This macro really ought to take a parameter, * but we do it the disgusting crufty way forced on us by the ()-less * definition of BEGIN. */ #define BEGIN yyg->yy_start = 1 + 2 * /* Translate the current start state into a value that can be later handed * to BEGIN to return to the state. The YYSTATE alias is for lex * compatibility. */ #define YY_START ((yyg->yy_start - 1) / 2) #define YYSTATE YY_START /* Action number for EOF rule of a given start state. */ #define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) /* Special action meaning "start processing a new file". */ #define YY_NEW_FILE yyrestart( yyin , yyscanner ) #define YY_END_OF_BUFFER_CHAR 0 /* Size of default input buffer. */ #ifndef YY_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k. * Moreover, YY_BUF_SIZE is 2*YY_READ_BUF_SIZE in the general case. * Ditto for the __ia64__ case accordingly. */ #define YY_BUF_SIZE 32768 #else #define YY_BUF_SIZE 16384 #endif /* __ia64__ */ #endif /* The state buf must be large enough to hold one state per character in the main buffer. */ #define YY_STATE_BUF_SIZE ((YY_BUF_SIZE + 2) * sizeof(yy_state_type)) #ifndef YY_TYPEDEF_YY_BUFFER_STATE #define YY_TYPEDEF_YY_BUFFER_STATE typedef struct yy_buffer_state *YY_BUFFER_STATE; #endif #ifndef YY_TYPEDEF_YY_SIZE_T #define YY_TYPEDEF_YY_SIZE_T typedef size_t yy_size_t; #endif #define EOB_ACT_CONTINUE_SCAN 0 #define EOB_ACT_END_OF_FILE 1 #define EOB_ACT_LAST_MATCH 2 #define YY_LESS_LINENO(n) #define YY_LINENO_REWIND_TO(ptr) /* Return all but the first "n" matched characters back to the input stream. */ #define yyless(n) \ do \ { \ /* Undo effects of setting up yytext. */ \ int yyless_macro_arg = (n); \ YY_LESS_LINENO(yyless_macro_arg);\ *yy_cp = yyg->yy_hold_char; \ YY_RESTORE_YY_MORE_OFFSET \ yyg->yy_c_buf_p = yy_cp = yy_bp + yyless_macro_arg - YY_MORE_ADJ; \ YY_DO_BEFORE_ACTION; /* set up yytext again */ \ } \ while ( 0 ) #define unput(c) yyunput( c, yyg->yytext_ptr , yyscanner ) #ifndef YY_STRUCT_YY_BUFFER_STATE #define YY_STRUCT_YY_BUFFER_STATE struct yy_buffer_state { FILE *yy_input_file; char *yy_ch_buf; /* input buffer */ char *yy_buf_pos; /* current position in input buffer */ /* Size of input buffer in bytes, not including room for EOB * characters. */ int yy_buf_size; /* Number of characters read into yy_ch_buf, not including EOB * characters. */ int yy_n_chars; /* Whether we "own" the buffer - i.e., we know we created it, * and can realloc() it to grow it, and should free() it to * delete it. */ int yy_is_our_buffer; /* Whether this is an "interactive" input source; if so, and * if we're using stdio for input, then we want to use getc() * instead of fread(), to make sure we stop fetching input after * each newline. */ int yy_is_interactive; /* Whether we're considered to be at the beginning of a line. * If so, '^' rules will be active on the next match, otherwise * not. */ int yy_at_bol; int yy_bs_lineno; /**< The line count. */ int yy_bs_column; /**< The column count. */ /* Whether to try to fill the input buffer when we reach the * end of it. */ int yy_fill_buffer; int yy_buffer_status; #define YY_BUFFER_NEW 0 #define YY_BUFFER_NORMAL 1 /* When an EOF's been seen but there's still some text to process * then we mark the buffer as YY_EOF_PENDING, to indicate that we * shouldn't try reading from the input source any more. We might * still have a bunch of tokens to match, though, because of * possible backing-up. * * When we actually see the EOF, we change the status to "new" * (via yyrestart()), so that the user can continue scanning by * just pointing yyin at a new input file. */ #define YY_BUFFER_EOF_PENDING 2 }; #endif /* !YY_STRUCT_YY_BUFFER_STATE */ /* We provide macros for accessing buffer states in case in the * future we want to put the buffer states in a more general * "scanner state". * * Returns the top of the stack, or NULL. */ #define YY_CURRENT_BUFFER ( yyg->yy_buffer_stack \ ? yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] \ : NULL) /* Same as previous macro, but useful when we know that the buffer stack is not * NULL or when we need an lvalue. For internal use only. */ #define YY_CURRENT_BUFFER_LVALUE yyg->yy_buffer_stack[yyg->yy_buffer_stack_top] void yyrestart ( FILE *input_file , yyscan_t yyscanner ); void yy_switch_to_buffer ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); YY_BUFFER_STATE yy_create_buffer ( FILE *file, int size , yyscan_t yyscanner ); void yy_delete_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yy_flush_buffer ( YY_BUFFER_STATE b , yyscan_t yyscanner ); void yypush_buffer_state ( YY_BUFFER_STATE new_buffer , yyscan_t yyscanner ); void yypop_buffer_state ( yyscan_t yyscanner ); static void yyensure_buffer_stack ( yyscan_t yyscanner ); static void yy_load_buffer_state ( yyscan_t yyscanner ); static void yy_init_buffer ( YY_BUFFER_STATE b, FILE *file , yyscan_t yyscanner ); #define YY_FLUSH_BUFFER yy_flush_buffer( YY_CURRENT_BUFFER , yyscanner) YY_BUFFER_STATE yy_scan_buffer ( char *base, yy_size_t size , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_string ( const char *yy_str , yyscan_t yyscanner ); YY_BUFFER_STATE yy_scan_bytes ( const char *bytes, int len , yyscan_t yyscanner ); void *yyalloc ( yy_size_t , yyscan_t yyscanner ); void *yyrealloc ( void *, yy_size_t , yyscan_t yyscanner ); void yyfree ( void * , yyscan_t yyscanner ); #define yy_new_buffer yy_create_buffer #define yy_set_interactive(is_interactive) \ { \ if ( ! YY_CURRENT_BUFFER ){ \ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_is_interactive = is_interactive; \ } #define yy_set_bol(at_bol) \ { \ if ( ! YY_CURRENT_BUFFER ){\ yyensure_buffer_stack (yyscanner); \ YY_CURRENT_BUFFER_LVALUE = \ yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); \ } \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = at_bol; \ } #define YY_AT_BOL() (YY_CURRENT_BUFFER_LVALUE->yy_at_bol) /* Begin user sect3 */ typedef flex_uint8_t YY_CHAR; typedef int yy_state_type; #define yytext_ptr yytext_r static yy_state_type yy_get_previous_state ( yyscan_t yyscanner ); static yy_state_type yy_try_NUL_trans ( yy_state_type current_state , yyscan_t yyscanner); static int yy_get_next_buffer ( yyscan_t yyscanner ); static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner ); /* Done after the current pattern has been matched and before the * corresponding action - sets up yytext. */ #define YY_DO_BEFORE_ACTION \ yyg->yytext_ptr = yy_bp; \ yyleng = (int) (yy_cp - yy_bp); \ yyg->yy_hold_char = *yy_cp; \ *yy_cp = '\0'; \ yyg->yy_c_buf_p = yy_cp; #define YY_NUM_RULES 82 #define YY_END_OF_BUFFER 83 /* This struct is not used in this scanner, but its presence is necessary. */ struct yy_trans_info { flex_int32_t yy_verify; flex_int32_t yy_nxt; }; static const flex_int16_t yy_accept[261] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 81, 63, 35, 64, 65, 66, 67, 36, 42, 42, 68, 69, 70, 62, 71, 55, 37, 37, 72, 73, 55, 52, 55, 74, 75, 38, 44, 76, 44, 77, 78, 43, 79, 43, 80, 81, 35, 64, 65, 66, 36, 62, 71, 55, 73, 25, 25, 25, 25, 25, 25, 25, 25, 25, 63, 51, 54, 57, 34, 64, 38, 65, 45, 0, 45, 66, 56, 67, 47, 48, 34, 42, 39, 19, 0, 0, 42, 68, 69, 70, 62, 49, 59, 60, 71, 16, 24, 55, 37, 37, 38, 37, 37, 38, 58, 72, 73, 53, 53, 47, 50, 55, 55, 52, 55, 52, 47, 74, 75, 0, 44, 41, 76, 44, 77, 78, 18, 0, 43, 40, 79, 43, 80, 0, 0, 0, 0, 0, 0, 0, 8, 8, 3, 3, 0, 64, 0, 7, 7, 66, 0, 0, 62, 0, 0, 38, 5, 9, 9, 73, 26, 0, 28, 29, 0, 0, 0, 33, 20, 45, 21, 0, 61, 59, 60, 15, 14, 23, 0, 37, 37, 37, 37, 37, 0, 0, 0, 0, 5, 8, 3, 0, 2, 0, 2, 2, 12, 7, 11, 6, 6, 10, 38, 5, 5, 5, 5, 9, 27, 30, 31, 32, 0, 13, 37, 37, 37, 37, 37, 37, 37, 17, 0, 0, 0, 2, 12, 12, 11, 11, 6, 10, 10, 22, 4, 4, 46, 37, 37, 37, 0, 2, 4, 0, 0, 0, 0, 0, 1, 0, 0 } ; static const YY_CHAR yy_ec[256] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 22, 23, 24, 25, 26, 27, 28, 29, 29, 29, 29, 30, 31, 32, 32, 32, 32, 32, 33, 32, 32, 32, 32, 32, 32, 32, 32, 34, 32, 32, 32, 32, 32, 35, 36, 37, 38, 32, 39, 29, 29, 29, 29, 40, 31, 41, 32, 42, 32, 32, 33, 32, 43, 32, 32, 32, 32, 32, 32, 34, 44, 32, 45, 32, 32, 46, 47, 48, 49, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1 } ; static const YY_CHAR yy_meta[50] = { 0, 1, 2, 3, 2, 4, 1, 5, 1, 4, 1, 1, 1, 1, 1, 1, 1, 1, 1, 6, 7, 7, 1, 1, 4, 1, 4, 4, 4, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 1, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1 } ; static const flex_int16_t yy_base[278] = { 0, 0, 48, 604, 603, 599, 598, 597, 596, 598, 597, 604, 603, 597, 596, 588, 587, 587, 586, 602, 619, 48, 595, 593, 56, 51, 59, 588, 68, 585, 37, 63, 581, 73, 86, 91, 100, 551, 97, 572, 141, 87, 128, 97, 51, 587, 52, 557, 555, 58, 552, 109, 139, 510, 110, 185, 167, 171, 530, 181, 177, 184, 178, 198, 193, 619, 502, 499, 467, 501, 502, 490, 476, 460, 67, 453, 619, 619, 471, 469, 468, 460, 455, 429, 418, 454, 437, 451, 434, 619, 448, 149, 445, 619, 439, 434, 442, 440, 438, 436, 77, 425, 184, 110, 432, 158, 432, 202, 211, 403, 188, 223, 186, 218, 619, 425, 423, 428, 619, 426, 418, 231, 242, 209, 245, 83, 619, 407, 405, 414, 225, 394, 388, 386, 384, 381, 619, 401, 217, 370, 370, 368, 366, 0, 196, 233, 269, 397, 394, 271, 619, 0, 619, 0, 277, 273, 408, 619, 0, 279, 282, 405, 286, 283, 404, 211, 290, 619, 0, 288, 619, 383, 619, 619, 402, 396, 403, 619, 619, 368, 619, 386, 619, 619, 619, 619, 383, 619, 284, 269, 368, 300, 220, 316, 382, 377, 375, 301, 303, 0, 0, 322, 311, 370, 323, 341, 370, 0, 362, 619, 0, 352, 325, 341, 619, 319, 348, 0, 619, 619, 619, 619, 326, 619, 297, 333, 322, 357, 0, 323, 0, 619, 270, 198, 137, 199, 180, 619, 136, 619, 0, 125, 619, 619, 619, 72, 619, 619, 353, 0, 333, 367, 58, 291, 396, 377, 378, 381, 440, 390, 619, 485, 488, 492, 498, 505, 511, 518, 525, 532, 534, 541, 548, 555, 562, 569, 576, 583 } ; static const flex_int16_t yy_def[278] = { 0, 260, 1, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 260, 260, 260, 260, 262, 262, 260, 260, 260, 260, 260, 260, 260, 260, 260, 262, 260, 260, 36, 260, 260, 260, 260, 260, 260, 262, 262, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 262, 24, 260, 260, 260, 34, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 262, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 36, 262, 262, 262, 262, 260, 260, 260, 260, 260, 260, 260, 263, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 55, 260, 260, 260, 260, 260, 260, 260, 264, 260, 265, 266, 260, 260, 260, 267, 260, 260, 260, 260, 260, 260, 262, 268, 260, 269, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 262, 260, 260, 260, 260, 260, 268, 264, 265, 266, 201, 270, 201, 204, 271, 267, 272, 260, 273, 274, 262, 268, 260, 268, 268, 269, 260, 260, 260, 260, 260, 260, 260, 260, 262, 260, 193, 193, 193, 260, 260, 260, 270, 204, 271, 260, 272, 260, 273, 274, 260, 260, 260, 275, 260, 260, 227, 227, 270, 204, 275, 270, 276, 270, 276, 277, 276, 277, 0, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260 } ; static const flex_int16_t yy_nxt[669] = { 0, 20, 20, 20, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 45, 45, 45, 45, 45, 46, 47, 48, 49, 50, 45, 45, 45, 45, 45, 45, 51, 52, 53, 54, 55, 97, 55, 74, 56, 57, 58, 59, 260, 60, 85, 214, 86, 260, 81, 61, 62, 63, 82, 87, 129, 64, 74, 75, 76, 214, 86, 76, 98, 128, 91, 92, 93, 86, 86, 88, 94, 130, 86, 131, 100, 83, 75, 260, 100, 95, 134, 77, 86, 101, 102, 103, 84, 101, 104, 105, 89, 125, 106, 125, 107, 125, 123, 125, 114, 107, 86, 107, 108, 115, 109, 109, 86, 76, 127, 103, 136, 137, 260, 80, 110, 111, 80, 111, 112, 86, 77, 184, 126, 260, 110, 80, 80, 80, 80, 113, 117, 107, 118, 89, 118, 119, 124, 123, 124, 138, 234, 139, 120, 142, 121, 91, 92, 185, 86, 122, 123, 124, 118, 118, 150, 151, 186, 78, 152, 153, 154, 250, 155, 160, 163, 160, 163, 260, 157, 158, 140, 143, 90, 143, 159, 144, 145, 260, 146, 260, 167, 168, 102, 150, 151, 162, 147, 191, 148, 191, 86, 76, 149, 86, 101, 183, 105, 161, 164, 106, 169, 166, 260, 192, 165, 107, 107, 86, 107, 260, 107, 260, 107, 108, 260, 108, 108, 125, 123, 125, 152, 153, 193, 193, 145, 188, 189, 251, 189, 190, 246, 193, 193, 193, 107, 188, 212, 226, 111, 107, 111, 107, 193, 120, 130, 107, 131, 138, 107, 139, 122, 123, 124, 124, 123, 124, 157, 158, 167, 168, 152, 153, 146, 201, 155, 201, 157, 158, 160, 163, 160, 163, 159, 209, 210, 167, 168, 214, 149, 215, 202, 203, 203, 191, 189, 191, 189, 100, 209, 210, 214, 246, 215, 216, 234, 169, 101, 260, 216, 260, 216, 205, 161, 164, 225, 225, 244, 245, 201, 260, 201, 260, 243, 260, 247, 189, 260, 189, 227, 255, 228, 228, 191, 246, 191, 202, 203, 203, 214, 228, 229, 230, 80, 111, 112, 214, 234, 225, 225, 242, 229, 80, 80, 80, 80, 80, 205, 204, 189, 239, 189, 216, 191, 254, 191, 254, 216, 237, 216, 227, 253, 227, 227, 254, 260, 254, 260, 254, 235, 254, 227, 248, 249, 234, 189, 190, 254, 233, 254, 232, 234, 248, 254, 231, 254, 224, 223, 257, 222, 179, 221, 220, 219, 218, 211, 208, 206, 198, 197, 142, 141, 140, 139, 196, 135, 257, 134, 133, 132, 258, 258, 258, 258, 258, 258, 131, 195, 128, 127, 120, 258, 258, 258, 258, 258, 258, 260, 126, 260, 194, 116, 115, 80, 187, 104, 101, 99, 98, 97, 96, 182, 181, 92, 180, 126, 87, 86, 85, 84, 257, 179, 82, 81, 258, 258, 258, 258, 258, 258, 260, 79, 178, 75, 177, 258, 258, 258, 258, 258, 258, 65, 65, 65, 65, 65, 65, 65, 80, 176, 80, 118, 118, 118, 199, 199, 175, 199, 199, 199, 199, 200, 200, 174, 200, 200, 200, 200, 204, 173, 172, 171, 204, 204, 207, 207, 170, 207, 207, 207, 207, 213, 213, 213, 213, 213, 213, 213, 217, 217, 156, 217, 217, 217, 217, 203, 203, 236, 236, 236, 236, 236, 236, 236, 238, 238, 238, 238, 238, 238, 238, 240, 240, 141, 240, 240, 240, 240, 241, 241, 241, 241, 241, 241, 241, 252, 252, 252, 252, 252, 252, 252, 256, 256, 256, 256, 256, 256, 256, 259, 259, 259, 259, 259, 259, 259, 135, 133, 132, 260, 116, 80, 99, 96, 90, 79, 78, 260, 73, 73, 72, 72, 71, 71, 70, 70, 69, 69, 68, 68, 67, 67, 66, 66, 19, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260 } ; static const flex_int16_t yy_chk[669] = { 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 30, 2, 21, 2, 2, 2, 2, 44, 2, 25, 252, 30, 24, 24, 2, 2, 2, 24, 26, 46, 2, 74, 21, 21, 245, 25, 25, 31, 44, 28, 28, 28, 49, 26, 26, 28, 46, 31, 46, 33, 24, 74, 34, 100, 28, 49, 21, 33, 33, 34, 34, 24, 100, 34, 35, 26, 125, 35, 125, 35, 41, 41, 41, 38, 35, 35, 35, 36, 38, 36, 36, 38, 43, 43, 103, 51, 51, 241, 36, 36, 36, 36, 36, 36, 54, 41, 103, 42, 238, 36, 36, 36, 36, 36, 36, 40, 42, 40, 52, 40, 40, 42, 42, 42, 51, 234, 51, 40, 54, 40, 91, 91, 105, 52, 40, 40, 40, 40, 40, 56, 56, 105, 56, 57, 57, 57, 234, 57, 60, 62, 60, 62, 236, 59, 59, 52, 55, 60, 55, 59, 55, 55, 112, 55, 110, 64, 64, 102, 144, 144, 61, 55, 110, 55, 110, 59, 59, 55, 61, 61, 102, 63, 60, 62, 63, 64, 63, 165, 112, 62, 107, 63, 63, 63, 113, 107, 192, 107, 108, 111, 108, 108, 123, 123, 123, 145, 145, 113, 113, 145, 108, 108, 235, 108, 108, 233, 113, 113, 113, 121, 108, 165, 192, 111, 121, 111, 121, 113, 122, 130, 122, 130, 138, 124, 138, 122, 122, 122, 124, 124, 124, 146, 146, 149, 149, 155, 155, 146, 154, 155, 154, 159, 159, 160, 163, 160, 163, 159, 162, 162, 169, 169, 166, 149, 166, 154, 154, 154, 188, 189, 188, 189, 162, 197, 197, 198, 232, 198, 166, 253, 169, 162, 202, 166, 202, 166, 154, 160, 163, 191, 191, 215, 215, 201, 204, 201, 204, 212, 226, 224, 191, 212, 191, 193, 253, 193, 193, 229, 222, 229, 201, 201, 201, 213, 193, 193, 193, 193, 193, 193, 216, 250, 225, 225, 211, 193, 193, 193, 193, 193, 193, 201, 204, 225, 208, 225, 216, 248, 251, 248, 251, 216, 206, 216, 227, 250, 227, 227, 255, 256, 255, 256, 257, 205, 257, 227, 227, 227, 203, 227, 227, 259, 196, 259, 195, 255, 227, 254, 194, 254, 190, 186, 256, 181, 179, 176, 175, 174, 171, 164, 161, 156, 148, 147, 142, 141, 140, 139, 137, 135, 254, 134, 133, 132, 254, 254, 254, 254, 254, 254, 131, 129, 128, 127, 120, 254, 254, 254, 254, 254, 254, 258, 119, 258, 117, 116, 115, 109, 106, 104, 101, 99, 98, 97, 96, 95, 94, 92, 90, 88, 87, 86, 85, 84, 258, 83, 82, 81, 258, 258, 258, 258, 258, 258, 80, 79, 78, 75, 73, 258, 258, 258, 258, 258, 258, 261, 261, 261, 261, 261, 261, 261, 262, 72, 262, 263, 263, 263, 264, 264, 71, 264, 264, 264, 264, 265, 265, 70, 265, 265, 265, 265, 266, 69, 68, 67, 266, 266, 267, 267, 66, 267, 267, 267, 267, 268, 268, 268, 268, 268, 268, 268, 269, 269, 58, 269, 269, 269, 269, 270, 270, 271, 271, 271, 271, 271, 271, 271, 272, 272, 272, 272, 272, 272, 272, 273, 273, 53, 273, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 275, 275, 275, 275, 275, 275, 275, 276, 276, 276, 276, 276, 276, 276, 277, 277, 277, 277, 277, 277, 277, 50, 48, 47, 45, 39, 37, 32, 29, 27, 23, 22, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 6, 5, 4, 3, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260, 260 } ; /* The intent behind this definition is that it'll catch * any uses of REJECT which flex missed. */ #define REJECT reject_used_but_not_detected #define yymore() yymore_used_but_not_detected #define YY_MORE_ADJ 0 #define YY_RESTORE_YY_MORE_OFFSET #line 1 "tokenizer.l" #line 2 "tokenizer.l" #include "ruby.h" // Anything longer is unlikely to be useful. #define MAX_TOKEN_LEN 16 #define FEED2(s, l) do { \ const char* __s = (s); \ const size_t __l = (l); \ const size_t __cl = __l > MAX_TOKEN_LEN? MAX_TOKEN_LEN : __l; \ *yyextra = rb_str_new(__s, __cl); \ } while(0) #define FEED1(s) FEED2(s, strlen(s)) #define FEED() FEED2(yytext, yyleng) #define FEED_STATIC(s) FEED2(s, sizeof(s) - 1) #define FEED_SHEBANG(s) do { \ const size_t __l = strlen(s); \ const size_t __cl = __l > MAX_TOKEN_LEN? MAX_TOKEN_LEN : __l; \ *yyextra = rb_str_new("SHEBANG#!", sizeof("SHEBANG#!") - 1); \ rb_str_cat(*yyextra, s, __cl); \ } while(0) #define eat_until_eol() do { \ int c; \ while ((c = input(yyscanner)) != '\n' && c != EOF && c); \ if (c == EOF || !c) \ return 0; \ } while (0) #define eat_until_unescaped(q) do { \ int c; \ while ((c = input(yyscanner)) != EOF && c) { \ if (c == '\n') \ break; \ if (c == '\\') { \ c = input(yyscanner); \ if (c == EOF || !c) \ return 0; \ } else if (c == q) \ break; \ } \ if (c == EOF || !c) \ return 0; \ } while (0) #line 911 "lex.linguist_yy.c" #line 913 "lex.linguist_yy.c" #define INITIAL 0 #define c_comment 1 #define xml_comment 2 #define haskell_comment 3 #define ocaml_comment 4 #define python_dcomment 5 #define python_scomment 6 #define roff_comment 7 #define lean_comment 8 #ifndef YY_NO_UNISTD_H /* Special case for "unistd.h", since it is non-ANSI. We include it way * down here because we want the user's section 1 to have been scanned first. * The user has a chance to override it with an option. */ #include #endif #define YY_EXTRA_TYPE VALUE* /* Holds the entire state of the reentrant scanner. */ struct yyguts_t { /* User-defined. Not touched by flex. */ YY_EXTRA_TYPE yyextra_r; /* The rest are the same as the globals declared in the non-reentrant scanner. */ FILE *yyin_r, *yyout_r; size_t yy_buffer_stack_top; /**< index of top of stack. */ size_t yy_buffer_stack_max; /**< capacity of stack. */ YY_BUFFER_STATE * yy_buffer_stack; /**< Stack as an array. */ char yy_hold_char; int yy_n_chars; int yyleng_r; char *yy_c_buf_p; int yy_init; int yy_start; int yy_did_buffer_switch_on_eof; int yy_start_stack_ptr; int yy_start_stack_depth; int *yy_start_stack; yy_state_type yy_last_accepting_state; char* yy_last_accepting_cpos; int yylineno_r; int yy_flex_debug_r; char *yytext_r; int yy_more_flag; int yy_more_len; }; /* end struct yyguts_t */ static int yy_init_globals ( yyscan_t yyscanner ); int yylex_init (yyscan_t* scanner); int yylex_init_extra ( YY_EXTRA_TYPE user_defined, yyscan_t* scanner); /* Accessor methods to globals. These are made visible to non-reentrant scanners for convenience. */ int yylex_destroy ( yyscan_t yyscanner ); int yyget_debug ( yyscan_t yyscanner ); void yyset_debug ( int debug_flag , yyscan_t yyscanner ); YY_EXTRA_TYPE yyget_extra ( yyscan_t yyscanner ); void yyset_extra ( YY_EXTRA_TYPE user_defined , yyscan_t yyscanner ); FILE *yyget_in ( yyscan_t yyscanner ); void yyset_in ( FILE * _in_str , yyscan_t yyscanner ); FILE *yyget_out ( yyscan_t yyscanner ); void yyset_out ( FILE * _out_str , yyscan_t yyscanner ); int yyget_leng ( yyscan_t yyscanner ); char *yyget_text ( yyscan_t yyscanner ); int yyget_lineno ( yyscan_t yyscanner ); void yyset_lineno ( int _line_number , yyscan_t yyscanner ); int yyget_column ( yyscan_t yyscanner ); void yyset_column ( int _column_no , yyscan_t yyscanner ); /* Macros after this point can all be overridden by user definitions in * section 1. */ #ifndef YY_SKIP_YYWRAP #ifdef __cplusplus extern "C" int yywrap ( yyscan_t yyscanner ); #else extern int yywrap ( yyscan_t yyscanner ); #endif #endif #ifndef YY_NO_UNPUT #endif #ifndef yytext_ptr static void yy_flex_strncpy ( char *, const char *, int , yyscan_t yyscanner); #endif #ifdef YY_NEED_STRLEN static int yy_flex_strlen ( const char * , yyscan_t yyscanner); #endif #ifndef YY_NO_INPUT #ifdef __cplusplus static int yyinput ( yyscan_t yyscanner ); #else static int input ( yyscan_t yyscanner ); #endif #endif /* Amount of stuff to slurp up with each read. */ #ifndef YY_READ_BUF_SIZE #ifdef __ia64__ /* On IA-64, the buffer size is 16k, not 8k */ #define YY_READ_BUF_SIZE 16384 #else #define YY_READ_BUF_SIZE 8192 #endif /* __ia64__ */ #endif /* Copy whatever the last rule matched to the standard output. */ #ifndef ECHO /* This used to be an fputs(), but since the string might contain NUL's, * we now use fwrite(). */ #define ECHO do { if (fwrite( yytext, (size_t) yyleng, 1, yyout )) {} } while (0) #endif /* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, * is returned in "result". */ #ifndef YY_INPUT #define YY_INPUT(buf,result,max_size) \ if ( YY_CURRENT_BUFFER_LVALUE->yy_is_interactive ) \ { \ int c = '*'; \ int n; \ for ( n = 0; n < max_size && \ (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ buf[n] = (char) c; \ if ( c == '\n' ) \ buf[n++] = (char) c; \ if ( c == EOF && ferror( yyin ) ) \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ result = n; \ } \ else \ { \ errno=0; \ while ( (result = (int) fread(buf, 1, (yy_size_t) max_size, yyin)) == 0 && ferror(yyin)) \ { \ if( errno != EINTR) \ { \ YY_FATAL_ERROR( "input in flex scanner failed" ); \ break; \ } \ errno=0; \ clearerr(yyin); \ } \ }\ \ #endif /* No semi-colon after return; correct usage is to write "yyterminate();" - * we don't want an extra ';' after the "return" because that will cause * some compilers to complain about unreachable statements. */ #ifndef yyterminate #define yyterminate() return YY_NULL #endif /* Number of entries by which start-condition stack grows. */ #ifndef YY_START_STACK_INCR #define YY_START_STACK_INCR 25 #endif /* Report a fatal error. */ #ifndef YY_FATAL_ERROR #define YY_FATAL_ERROR(msg) yy_fatal_error( msg , yyscanner) #endif /* end tables serialization structures and prototypes */ /* Default declaration of generated scanner - a define so the user can * easily add parameters. */ #ifndef YY_DECL #define YY_DECL_IS_OURS 1 extern int yylex (yyscan_t yyscanner); #define YY_DECL int yylex (yyscan_t yyscanner) #endif /* !YY_DECL */ /* Code executed at the beginning of each rule, after yytext and yyleng * have been set up. */ #ifndef YY_USER_ACTION #define YY_USER_ACTION #endif /* Code executed at the end of each rule. */ #ifndef YY_BREAK #define YY_BREAK /*LINTED*/break; #endif #define YY_RULE_SETUP \ if ( yyleng > 0 ) \ YY_CURRENT_BUFFER_LVALUE->yy_at_bol = \ (yytext[yyleng - 1] == '\n'); \ YY_USER_ACTION /** The main scanner function which does all the work. */ YY_DECL { yy_state_type yy_current_state; char *yy_cp, *yy_bp; int yy_act; struct yyguts_t * yyg = (struct yyguts_t*)yyscanner; if ( !yyg->yy_init ) { yyg->yy_init = 1; #ifdef YY_USER_INIT YY_USER_INIT; #endif if ( ! yyg->yy_start ) yyg->yy_start = 1; /* first start state */ if ( ! yyin ) yyin = stdin; if ( ! yyout ) yyout = stdout; if ( ! YY_CURRENT_BUFFER ) { yyensure_buffer_stack (yyscanner); YY_CURRENT_BUFFER_LVALUE = yy_create_buffer( yyin, YY_BUF_SIZE , yyscanner); } yy_load_buffer_state( yyscanner ); } { #line 56 "tokenizer.l" #line 1183 "lex.linguist_yy.c" while ( /*CONSTCOND*/1 ) /* loops until end-of-file is reached */ { yy_cp = yyg->yy_c_buf_p; /* Support of yytext. */ *yy_cp = yyg->yy_hold_char; /* yy_bp points to the position in yy_ch_buf of the start of * the current run. */ yy_bp = yy_cp; yy_current_state = yyg->yy_start; yy_current_state += YY_AT_BOL(); yy_match: do { YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)] ; if ( yy_accept[yy_current_state] ) { yyg->yy_last_accepting_state = yy_current_state; yyg->yy_last_accepting_cpos = yy_cp; } while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state ) { yy_current_state = (int) yy_def[yy_current_state]; if ( yy_current_state >= 261 ) yy_c = yy_meta[yy_c]; } yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c]; ++yy_cp; } while ( yy_current_state != 260 ); yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; yy_find_action: yy_act = yy_accept[yy_current_state]; YY_DO_BEFORE_ACTION; do_action: /* This label is used only to access EOF actions. */ switch ( yy_act ) { /* beginning of action switch */ case 0: /* must back up */ /* undo the effects of YY_DO_BEFORE_ACTION */ *yy_cp = yyg->yy_hold_char; yy_cp = yyg->yy_last_accepting_cpos; yy_current_state = yyg->yy_last_accepting_state; goto yy_find_action; case 1: /* rule 1 can match eol */ YY_RULE_SETUP #line 58 "tokenizer.l" { const char *off = strrchr(yytext, ' '); if (!off) off = yytext; else ++off; FEED_SHEBANG(off); eat_until_eol(); return 1; } YY_BREAK case 2: YY_RULE_SETUP #line 69 "tokenizer.l" { const char *off = strrchr(yytext, '/'); if (!off) off = yytext; else ++off; if (strcmp(off, "env") == 0) { eat_until_eol(); } else { FEED_SHEBANG(off); eat_until_eol(); return 1; } } YY_BREAK case 3: /* rule 3 can match eol */ YY_RULE_SETUP #line 84 "tokenizer.l" { FEED_STATIC("COMMENT#"); return 1; } YY_BREAK case 4: /* rule 4 can match eol */ YY_RULE_SETUP #line 85 "tokenizer.l" { FEED_STATIC("COMMENT//!"); return 1; } YY_BREAK case 5: /* rule 5 can match eol */ YY_RULE_SETUP #line 86 "tokenizer.l" { FEED_STATIC("COMMENT//"); return 1; } YY_BREAK case 6: /* rule 6 can match eol */ YY_RULE_SETUP #line 87 "tokenizer.l" { FEED_STATIC("COMMENT--"); return 1; } YY_BREAK case 7: /* rule 7 can match eol */ YY_RULE_SETUP #line 88 "tokenizer.l" { FEED_STATIC("COMMENT%"); return 1; } YY_BREAK case 8: /* rule 8 can match eol */ YY_RULE_SETUP #line 89 "tokenizer.l" { FEED_STATIC("COMMENT\""); return 1; } YY_BREAK case 9: /* rule 9 can match eol */ YY_RULE_SETUP #line 90 "tokenizer.l" { FEED_STATIC("COMMENT;"); return 1; } YY_BREAK case 10: /* rule 10 can match eol */ YY_RULE_SETUP #line 91 "tokenizer.l" { FEED_STATIC("COMMENT.\\\""); return 1; } YY_BREAK case 11: /* rule 11 can match eol */ YY_RULE_SETUP #line 92 "tokenizer.l" { FEED_STATIC("COMMENT'\\\""); return 1; } YY_BREAK case 12: /* rule 12 can match eol */ YY_RULE_SETUP #line 93 "tokenizer.l" { FEED_STATIC("COMMENT$!"); return 1; } YY_BREAK case 13: YY_RULE_SETUP #line 95 "tokenizer.l" { FEED_STATIC("COMMENT/*"); return 1; } YY_BREAK case 14: YY_RULE_SETUP #line 96 "tokenizer.l" { FEED_STATIC("COMMENT/**"); BEGIN(c_comment); return 1; } YY_BREAK case 15: YY_RULE_SETUP #line 97 "tokenizer.l" { FEED_STATIC("COMMENT/*!"); BEGIN(c_comment); return 1; } YY_BREAK case 16: YY_RULE_SETUP #line 98 "tokenizer.l" { FEED_STATIC("COMMENT/*"); BEGIN(c_comment); return 1; } YY_BREAK case 17: YY_RULE_SETUP #line 99 "tokenizer.l" { FEED_STATIC("COMMENT" { BEGIN(INITIAL); } "-}" { BEGIN(INITIAL); } "*)" { BEGIN(INITIAL); } "\"\"\"" { BEGIN(INITIAL); } "'''" { BEGIN(INITIAL); } ".."\n { BEGIN(INITIAL); } "-/" { BEGIN(INITIAL); } \"\"|'' { /* nothing */ } \" { eat_until_unescaped('"'); } ' { eat_until_unescaped('\''); } (0x[0-9a-fA-F]([0-9a-fA-F]|\.)*|[0-9]([0-9]|\.)*)([uU][lL]{0,2}|([eE][-+][0-9]*)?[fFlL]*) { /* nothing */ } [.@#$]?[[:alnum:]_]+ { FEED(); return 1; } [(]+[)]+ { FEED(); return 1; } [{]+[}]+ { FEED(); return 1; } [\[]+[\]]+ { FEED(); return 1; } [(]+|[)]+ { FEED(); return 1; } [{]+|[}]+ { FEED(); return 1; } [\[]+|[\]]+ { FEED(); return 1; } [$]([(]+|[{]+|[\[]]+) { FEED(); return 1; } "(...)"|"{...}"|"[...]" { FEED(); return 1; } "&>"|"<&"|"<&-"|"&>>"|">&" { FEED(); return 1; } "|&"|"&|" { FEED(); return 1; } [-]+[>]+ { FEED(); return 1; } [<]+[-]+ { FEED(); return 1; } [!]+[=]+ { FEED(); return 1; } [<>]*[=]+[<>]* { FEED(); return 1; } [<][/]?[?%!#@] { FEED(); return 1; } [?%!][>] { FEED(); return 1; } [<>/]+ { FEED(); return 1; } [-+*/%&|^~:][=]+ { FEED(); return 1; } [!=][~] { FEED(); return 1; } ":-" { FEED(); return 1; } [.][*]+[?]? { FEED(); return 1; } [.][+]+[?]? { FEED(); return 1; } "(?:" { FEED(); return 1; } [-]+ { FEED(); return 1; } [!]+ { FEED(); return 1; } [#]+ { FEED(); return 1; } [$]+ { FEED(); return 1; } [%]+ { FEED(); return 1; } [&]+ { FEED(); return 1; } [*]+ { FEED(); return 1; } [+]+ { FEED(); return 1; } [,]+ { FEED(); return 1; } [.]+ { FEED(); return 1; } [:]+ { FEED(); return 1; } [;]+ { FEED(); return 1; } [?]+ { FEED(); return 1; } [@]+ { FEED(); return 1; } [\\]+ { FEED(); return 1; } [\^]+ { FEED(); return 1; } [`]+ { FEED(); return 1; } [|]+ { FEED(); return 1; } [~]+ { FEED(); return 1; } .|\n { /* nothing */ } %% ================================================ FILE: github-linguist.gemspec ================================================ require File.expand_path('../lib/linguist/version', __FILE__) Gem::Specification.new do |s| s.name = 'github-linguist' s.version = ENV['GEM_VERSION'] || Linguist::VERSION s.summary = "GitHub Language detection" s.description = 'We use this library at GitHub to detect blob languages, highlight code, ignore binary files, suppress generated files in diffs, and generate language breakdown graphs.' s.authors = "GitHub" s.homepage = "https://github.com/github-linguist/linguist" s.license = "MIT" s.metadata = { "github_repo" => "ssh://github.com/github-linguist/linguist" } s.files = Dir['{lib,ext}/**/*', 'grammars/*', 'LICENSE'] - Dir['lib/linguist/linguist.{so,bundle}'] s.platform = Gem::Platform::RUBY s.executables = ['github-linguist', 'git-linguist'] s.extensions = ['ext/linguist/extconf.rb'] s.require_paths = ['lib', 'ext'] s.add_dependency 'cgi', '>= 0' s.add_dependency 'charlock_holmes', '~> 0.7.7' s.add_dependency 'mini_mime', '~> 1.0' s.add_dependency 'rugged', '~> 1.0' s.add_development_dependency 'minitest', '~> 5.15' s.add_development_dependency 'rake-compiler', '~> 0.9' s.add_development_dependency 'mocha', '~> 2.1' s.add_development_dependency 'plist', '~>3.1' s.add_development_dependency 'pry', '~> 0.14' s.add_development_dependency 'rake', '~> 13.0' s.add_development_dependency 'yajl-ruby', '~> 1.4' s.add_development_dependency 'licensed', '~> 5.0' s.add_development_dependency 'licensee', '~> 9.15' s.add_development_dependency 'bundler', '~> 2.0' end ================================================ FILE: go.work ================================================ go 1.20 use ./tools/grammars ================================================ FILE: grammars.yml ================================================ https://svn.edgewall.org/repos/genshi/contrib/textmate/Genshi.tmbundle/Syntaxes/Markup%20Template%20%28XML%29.tmLanguage: - text.xml.genshi vendor/grammars/AL: - source.al vendor/grammars/Alloy.tmbundle: - source.alloy vendor/grammars/Assembly-Syntax-Definition: - source.x86 vendor/grammars/Atom-PostScript: - source.postscript vendor/grammars/AtomLanguageVelocity: - source.velocity - source.velocity.html vendor/grammars/AutoHotkey: - source.ahk vendor/grammars/CUE-Sheet_sublime: - source.cuesheet vendor/grammars/Clue-for-VSCode: - source.clue vendor/grammars/CoDT7-Sublime: - source.gsc vendor/grammars/ColdFusion: - source.cfscript - source.cfscript.cfc - text.cfml.basic - text.html.cfm vendor/grammars/CookVSCode: - source.cooklang vendor/grammars/Cylc.tmbundle: - source.cylc vendor/grammars/Dafny-VSCode: - text.dfy.dafny vendor/grammars/Docker.tmbundle: - source.dockerfile vendor/grammars/Elm/Syntaxes: - source.elm - text.html.mediawiki.elm-build-output - text.html.mediawiki.elm-documentation vendor/grammars/FreeMarker.tmbundle: - text.html.ftl vendor/grammars/GeneroFgl.tmbundle: - source.genero-4gl - source.genero-per vendor/grammars/Handlebars: - text.html.handlebars vendor/grammars/IDL-Syntax: - source.webidl vendor/grammars/Isabelle.tmbundle: - source.isabelle.root - source.isabelle.theory vendor/grammars/JSyntax: - source.j vendor/grammars/Jails: - source.jai vendor/grammars/K-VSCode: - text.k vendor/grammars/LOLCODE-grammar-vscode: - source.lolcode vendor/grammars/Ligo-grammar: - source.jsligo - source.ligo - source.mligo - source.religo vendor/grammars/Linker.tmLanguage: - source.c.linker vendor/grammars/Luau.tmLanguage: - source.luau vendor/grammars/MATLAB-Language-grammar: - source.matlab vendor/grammars/MQL5-sublime: - source.mql5 vendor/grammars/MagicPython: - source.python - source.regexp.python - text.python.console - text.python.traceback vendor/grammars/Modelica: - source.modelica vendor/grammars/NSIS: - source.nsis vendor/grammars/Nasal.tmbundle: - source.nasal vendor/grammars/NimLime: - source.nim vendor/grammars/NovaGrammars: - source.git-revlist - source.json - source.keyvalues - source.redirects - source.solution - source.win32-messages - source.ws - text.git-commit - text.hash-commented - text.robots-txt vendor/grammars/ObjectScript.tmBundle: - source.objectscript - source.objectscript_class - source.objectscript_csp - source.objectscript_macros vendor/grammars/PHP-Twig.tmbundle: - text.html.twig vendor/grammars/PogoScript.tmbundle: - source.pogoscript vendor/grammars/PowerBuilder.tmbundle: - source.powerbuilder vendor/grammars/RDoc.tmbundle: - text.rdoc vendor/grammars/Racket: - source.racket vendor/grammars/SMT.tmbundle: - source.smt vendor/grammars/Scalate.tmbundle: - source.scaml - text.html.ssp vendor/grammars/Scenic-tmLanguage: - source.scenic vendor/grammars/Slash.tmbundle: - text.html.slash vendor/grammars/Stata.tmbundle: - source.mata - source.stata vendor/grammars/Stylus: - source.stylus vendor/grammars/Sublime-Coq: - source.coq vendor/grammars/Sublime-HTTP: - source.httpspec vendor/grammars/Sublime-Lasso: - file.lasso vendor/grammars/Sublime-Loom: - source.loomscript vendor/grammars/Sublime-Modula-2: - source.modula2 vendor/grammars/Sublime-Nit: - source.nit vendor/grammars/Sublime-Pep8/: - source.pep8 vendor/grammars/Sublime-QML: - source.qml vendor/grammars/Sublime-REBOL: - source.rebol vendor/grammars/Sublime-Red: - source.red vendor/grammars/Sublime-SQF-Language: - source.sqf vendor/grammars/SublimeBrainfuck: - source.bf vendor/grammars/SublimeClarion: - source.clarion vendor/grammars/SublimeEthereum: - source.solidity - source.vyper - source.yul vendor/grammars/SublimeGDB/: - source.disasm - source.gdb - source.gdb.session - source.gdbregs vendor/grammars/SublimePapyrus: - source.papyrus.skyrim vendor/grammars/SublimePuppet: - source.puppet vendor/grammars/SublimeXtend: - source.xtend vendor/grammars/Syntax-highlighting-for-PostCSS: - source.css.postcss.sugarss - source.postcss vendor/grammars/SystemVerilog: - source.systemverilog - source.ucfconstraints vendor/grammars/TLA: - source.tla vendor/grammars/TXL: - source.txl vendor/grammars/Textmate-Gosu-Bundle: - source.gosu.2 vendor/grammars/TypeScript-TmLanguage: - source.ts - source.tsx - text.error-list - text.find-refs vendor/grammars/UrWeb-Language-Definition: - source.ur vendor/grammars/VBDotNetSyntax: - source.vbnet vendor/grammars/Vala-TMBundle: - source.vala vendor/grammars/VscodeAdblockSyntax: - text.adblock vendor/grammars/WhileySyntaxBundle: - source.whiley vendor/grammars/X10: - source.x10 vendor/grammars/XojoSyntaxTM: - source.xojo vendor/grammars/ZenScript-tmLanguage: - source.zenscript vendor/grammars/abap-cds-grammar: - source.abapcds vendor/grammars/abap.tmbundle: - source.abap vendor/grammars/abl-tmlanguage: - source.abl vendor/grammars/actionscript3-tmbundle/: - source.actionscript.3 - text.html.asdoc - text.xml.flex-config vendor/grammars/ada.tmbundle: - source.ada vendor/grammars/agda-github-syntax-highlighting: - source.agda vendor/grammars/aidl-language: - source.aidl vendor/grammars/ampl: - source.ampl vendor/grammars/android-system-tools: - source.bp vendor/grammars/ant.tmbundle: - text.xml.ant vendor/grammars/antlr.tmbundle: - source.antlr vendor/grammars/apex-tmLanguage: - source.apex - source.soql vendor/grammars/api-blueprint-sublime-plugin: - text.html.markdown.source.gfm.apib - text.html.markdown.source.gfm.mson vendor/grammars/applescript.tmbundle: - source.applescript vendor/grammars/asciidoc.tmbundle: - text.html.asciidoc vendor/grammars/asp-syntax-highlight: - source.answersetprogramming vendor/grammars/asp.tmbundle: - source.asp - text.html.asp vendor/grammars/assembly: - objdump.x86asm - source.x86asm vendor/grammars/astro: - source.astro - source.mdx.astro - text.html.markdown.astro vendor/grammars/atom-editorconfig: - source.editorconfig - text.plain vendor/grammars/atom-firestore-grammar: - source.firestore vendor/grammars/atom-fstar: - source.fstar vendor/grammars/atom-language-clean: - source.clean - text.restructuredtext.clean vendor/grammars/atom-language-haproxy: - source.haproxy-config vendor/grammars/atom-language-innosetup: - source.inno vendor/grammars/atom-language-julia: - source.julia - source.julia.console vendor/grammars/atom-language-nextflow: - source.nextflow - source.nextflow-groovy vendor/grammars/atom-language-p4: - source.p4 vendor/grammars/atom-language-perl6: - source.meta-info - source.quoting.raku - source.raku - source.regexp.raku vendor/grammars/atom-language-purescript: - source.purescript vendor/grammars/atom-language-stan: - source.stan vendor/grammars/atom-miniyaml: - source.miniyaml vendor/grammars/atom-salt: - source.python.salt - source.yaml.salt vendor/grammars/ats: - source.ats vendor/grammars/avro.tmLanguage: - source.avro vendor/grammars/awk-sublime: - source.awk vendor/grammars/b-vscode: - source.b vendor/grammars/ballerina-grammar: - source.ballerina vendor/grammars/berry-grammar: - source.berry - source.berry.bytecode vendor/grammars/bicep: - markdown.bicep.codeblock - source.bicep vendor/grammars/bikeshed: - source.csswg vendor/grammars/blitzmax: - source.blitzmax vendor/grammars/boogie-vscode: - source.boogie vendor/grammars/bqn-vscode: - source.bqn vendor/grammars/browserslist-vscode: - text.browserslist vendor/grammars/bruno-ide-extensions: - source.bru vendor/grammars/bst.tmLanguage: - source.bst vendor/grammars/c.tmbundle: - source.c - source.c++ vendor/grammars/cairo-tm-grammar: - source.cairo - source.cairo0 vendor/grammars/capnproto.tmbundle: - source.capnp vendor/grammars/carto-atom: - source.css.mss vendor/grammars/cds-textmate-grammar: - source.cds vendor/grammars/ceylon-sublimetext: - source.ceylon vendor/grammars/chapel-tmbundle: - source.chapel vendor/grammars/circom-highlighting-vscode: - source.circom vendor/grammars/clarity.tmbundle: - source.clar vendor/grammars/code-peggy-language: - inline.peggy - source.peggy vendor/grammars/common-lisp-tmlanguage: - markdown.commonlisp.codeblock - source.commonlisp vendor/grammars/conllu-linguist-grammar: - text.conllu vendor/grammars/cool-tmbundle: - source.cool vendor/grammars/cpp-qt.tmbundle: - source.c++.qt - source.qmake vendor/grammars/cqlTextMate: - source.cql vendor/grammars/creole: - text.html.creole vendor/grammars/cron.tmbundle: - text.crontab vendor/grammars/csharp-tmLanguage: - source.cs vendor/grammars/cucumber-tmbundle: - source.ruby.rspec.cucumber.steps - text.gherkin.feature vendor/grammars/cython: - source.cython vendor/grammars/d.tmbundle: - source.d vendor/grammars/d2-vscode: - markdown.d2.codeblock - source.d2 - text.html.markdown.d2 vendor/grammars/dart-syntax-highlight: - source.dart vendor/grammars/daslang-grammar: - source.daslang vendor/grammars/data-weave-tmLanguage: - source.data-weave vendor/grammars/denizenscript-grammar: - source.denizenscript vendor/grammars/desktop.tmbundle: - source.desktop vendor/grammars/diff.tmbundle: - source.diff vendor/grammars/dm-syntax: - source.dm vendor/grammars/dylan.tmbundle: - source.dylan - source.lid - source.makegen vendor/grammars/earthfile-grammar: - source.earthfile vendor/grammars/ec.tmbundle: - source.c.ec vendor/grammars/ecl-tmLanguage: - source.ecl vendor/grammars/edge-vscode: - text.html.edge vendor/grammars/edgedb-editor-plugin: - dart.inline.edgeql - go.inline.edgeql - js.inline.edgeql - res.inline.edgeql - source.edgeql vendor/grammars/eiffel.tmbundle: - source.eiffel vendor/grammars/ejs-tmbundle: - text.html.js vendor/grammars/elixir-tmbundle: - source.elixir - text.elixir - text.html.elixir vendor/grammars/elvish: - source.elvish - source.elvish-transcript - source.elvish.in.markdown vendor/grammars/factor: - source.factor - text.html.factor vendor/grammars/fancy-tmbundle: - source.fancy vendor/grammars/firrtl-syntax: - source.firrtl vendor/grammars/fish-tmbundle: - source.fish vendor/grammars/forth: - source.forth vendor/grammars/fortran.tmbundle: - source.fortran - source.fortran.modern vendor/grammars/gap-tmbundle: - source.gap vendor/grammars/gemfile-lock-tmlanguage: - source.gemfile-lock vendor/grammars/gemini-vscode: - source.gemini vendor/grammars/gettext.tmbundle: - source.po vendor/grammars/gnuplot-tmbundle: - source.gnuplot vendor/grammars/go-tmbundle: - source.go vendor/grammars/godot-vscode-plugin: - source.gdresource - source.gdscript - source.gdshader vendor/grammars/grace: - source.grace vendor/grammars/gradle.tmbundle: - source.groovy.gradle vendor/grammars/grammar: - source.erlang vendor/grammars/graphiql: - inline.graphql - inline.graphql.markdown.codeblock - inline.graphql.php - inline.graphql.python - inline.graphql.re - inline.graphql.res - inline.graphql.scala - source.graphql vendor/grammars/graphviz.tmbundle: - source.dot vendor/grammars/groovy.tmbundle: - source.groovy vendor/grammars/haxe-TmLanguage: - documentation.markdown.injection.haxe - markdown.haxe.codeblock - markdown.hxml.codeblock - source.hlcode - source.hx - source.hx.argument - source.hx.type - source.hxml vendor/grammars/holyc.tmbundle: - source.hc vendor/grammars/hoon-grammar: - source.hoon vendor/grammars/iCalendar-sublime: - source.iCalendar vendor/grammars/ide-tools: - source.toit vendor/grammars/idl.tmbundle: - source.idl - source.idl-dlm - text.idl-idldoc vendor/grammars/idris: - source.idris vendor/grammars/imba-linguist-grammar: - source.imba vendor/grammars/ini.tmbundle: - source.ini vendor/grammars/ink-tmlanguage: - source.ink vendor/grammars/io.tmbundle: - source.io vendor/grammars/ioke-outdated: - source.ioke vendor/grammars/ionide-fsgrammar: - source.fsharp - source.fsharp.fsi - source.fsharp.fsl - source.fsharp.fsx - source.paket.dependencies - source.paket.lock vendor/grammars/ispc.syntax: - source.ispc vendor/grammars/jac-vscode: - source.jac vendor/grammars/jade-tmbundle: - source.pyjade - text.jade vendor/grammars/jasmin-sublime: - source.jasmin vendor/grammars/java.tmbundle: - source.java - source.java-properties - text.html.jsp - text.junit-test-report vendor/grammars/javadoc.tmbundle: - text.html.javadoc vendor/grammars/javascript-objective-j.tmbundle: - source.js.objj vendor/grammars/jflex.tmbundle: - source.jflex vendor/grammars/jte-template-syntax-highlight: - text.html.jte vendor/grammars/kivy-language-grammer: - source.python.kivy vendor/grammars/koka-textmate-grammar: - source.koka vendor/grammars/kusto-sublime: - source.kusto vendor/grammars/language-4d: - source.4dm vendor/grammars/language-agc: - source.agc vendor/grammars/language-algol60: - source.algol60 vendor/grammars/language-apl: - source.apl vendor/grammars/language-asl: - source.asl vendor/grammars/language-asn1: - source.asn vendor/grammars/language-basic: - source.basic vendor/grammars/language-batchfile: - source.batchfile vendor/grammars/language-bh: - source.bh vendor/grammars/language-blade: - source.gfm.blade - text.html.php.blade vendor/grammars/language-click: - source.click vendor/grammars/language-clojure: - source.clojure vendor/grammars/language-closure-templates: - text.html.soy vendor/grammars/language-coffee-script: - source.coffee - source.litcoffee vendor/grammars/language-crystal: - source.crystal - text.html.ecr vendor/grammars/language-csound: - source.csound - source.csound-document - source.csound-score vendor/grammars/language-css: - source.css vendor/grammars/language-cwl: - source.cwl vendor/grammars/language-debian: - source.deb-control - source.debian.makefile vendor/grammars/language-dircolors: - source.dircolors vendor/grammars/language-dsv: - source.csv - source.dsv - source.tsv vendor/grammars/language-emacs-lisp: - source.emacs.lisp - source.yasnippet - text.muse vendor/grammars/language-eml: - text.eml.basic vendor/grammars/language-etc: - etc - injections.etc - source.2da - source.bc - source.c.calendar - source.c.nwscript - source.cpan-mirror - source.cpan-skiplist - source.curlrc - source.dc - source.direct-x - source.dosbox-conf - source.dotenv - source.futhark - source.generic-config - source.generic-db - source.gitattributes - source.gitconfig - source.gitignore - source.hgignore - source.hosts - source.ini.npmrc - source.inputrc - source.lcov - source.m3u - source.m4 - source.mailmap - source.man-conf - source.nanorc - source.neon - source.odin-ehr - source.openbsd-pkg.contents - source.opts - source.psl - source.record-jar - source.sexp - source.sfv - source.shellcheckrc - source.sieve - source.smpl - source.ssh-config - source.star - source.stl - source.string-template - source.tags - source.torrc - source.ucd.nameslist - source.ucd.unidata - source.wgetrc - text.checksums - text.codeowners - text.html.ecmarkup - text.jira - text.lesshst - text.openbsd-pkg.desc - text.savane - text.xml.svg - text.youtube vendor/grammars/language-faust: - source.faust vendor/grammars/language-fontforge: - source.afm - source.bdf - source.figctrl - source.figfont - source.fontdir - source.fontforge - source.fontinfo - source.opentype - source.stdbez - source.xlfd - text.sfd vendor/grammars/language-gf: - source.gf vendor/grammars/language-gn: - source.gn vendor/grammars/language-grammars: - source.abnf - source.bnf - source.ebnf - source.goldgrm - source.lark - source.lbnf - source.lex - source.lex.regexp - source.pegjs - source.yacc - text.grammarkdown vendor/grammars/language-haml: - text.haml - text.hamlc vendor/grammars/language-haskell: - annotation.liquidhaskell.haskell - hint.haskell - hint.message.haskell - hint.type.haskell - source.c2hs - source.cabal - source.haskell - source.hsc2hs - source.hsig - text.tex.latex.haskell vendor/grammars/language-hocon: - source.hocon vendor/grammars/language-hql: - source.hql vendor/grammars/language-html: - text.html.basic vendor/grammars/language-hurl: - source.hurl vendor/grammars/language-igor: - source.igor vendor/grammars/language-inform7: - source.inform7 vendor/grammars/language-javascript: - source.js - source.js.regexp - source.js.regexp.replacement - source.jsdoc vendor/grammars/language-jison: - source.jison - source.jisonlex - source.jisonlex-injection vendor/grammars/language-jolie: - source.jolie vendor/grammars/language-jq: - source.jq vendor/grammars/language-jsoniq: - source.jsoniq - source.xq vendor/grammars/language-jsonnet: - source.jsonnet vendor/grammars/language-kak: - source.kakscript vendor/grammars/language-kerboscript: - source.kerboscript vendor/grammars/language-kickstart: - source.kickstart vendor/grammars/language-kotlin: - source.kotlin vendor/grammars/language-langium: - source.langium vendor/grammars/language-less: - source.css.less vendor/grammars/language-m68k: - source.m68k vendor/grammars/language-macaulay2: - source.m2 vendor/grammars/language-maxscript: - source.maxscript vendor/grammars/language-mermaid: - source.mermaid - source.mermaid.c4c-diagram - source.mermaid.class-diagram - source.mermaid.er-diagram - source.mermaid.flowchart - source.mermaid.gantt - source.mermaid.gitgraph - source.mermaid.mindmap - source.mermaid.pie-chart - source.mermaid.quad-chart - source.mermaid.requirement-diagram - source.mermaid.sankey - source.mermaid.sequence-diagram - source.mermaid.state-diagram - source.mermaid.timeline - source.mermaid.user-journey - source.mermaid.zenuml vendor/grammars/language-meson: - source.meson vendor/grammars/language-msl: - source.msl vendor/grammars/language-ncl: - source.ncl vendor/grammars/language-ninja: - source.ninja vendor/grammars/language-nunjucks: - source.nunjucks - text.html.nunjucks vendor/grammars/language-pan: - source.pan vendor/grammars/language-pcb: - source.gerber - source.ltspice.symbol - source.pcb.board - source.pcb.schematic - source.pcb.sexp vendor/grammars/language-povray: - source.pov-ray sdl vendor/grammars/language-property-list: - source.plist - text.xml.plist vendor/grammars/language-pyret: - source.arr vendor/grammars/language-qasm: - source.qasm vendor/grammars/language-reason: - source.reason - source.reason.hover.type vendor/grammars/language-reg: - source.reg vendor/grammars/language-regexp: - hidden.regexp.injection-shell - source.regexp - source.regexp.extended - source.regexp.posix - source.sy vendor/grammars/language-renpy: - source.renpy vendor/grammars/language-restructuredtext: - text.pseudoxml - text.restructuredtext vendor/grammars/language-ring: - source.ring vendor/grammars/language-roff: - hidden.manref - source.context - source.ditroff - source.ditroff.desc - source.gremlin - source.ideal - source.pic - text.roff - text.runoff vendor/grammars/language-rpm-spec: - source.changelogs.rpm-spec - source.rpm-spec vendor/grammars/language-rtf: - text.rtf vendor/grammars/language-ruby: - source.ruby - source.ruby.gemfile - text.html.erb vendor/grammars/language-sass: - source.css.scss - source.sass - source.sassdoc vendor/grammars/language-sed: - source.ed - source.sed vendor/grammars/language-shellscript: - source.shell - text.shell-session vendor/grammars/language-subtitles: - text.srt - text.vtt vendor/grammars/language-supercollider: - source.supercollider vendor/grammars/language-texinfo: - text.info - text.texinfo vendor/grammars/language-ti-basic: - source.8xp vendor/grammars/language-toc-wow: - source.toc vendor/grammars/language-tools: - markdown.vue.codeblock - mdx.vue.codeblock - text.html.vue - vue.directives - vue.interpolations - vue.sfc.script.leading-operator-fix - vue.sfc.style.variable.injection vendor/grammars/language-tsql: - source.tsql vendor/grammars/language-turing: - source.turing vendor/grammars/language-typelanguage: - source.tl vendor/grammars/language-viml: - source.vim-snippet - source.viml - text.vim-help vendor/grammars/language-wavefront: - source.wavefront.mtl - source.wavefront.obj vendor/grammars/language-webassembly: - source.webassembly vendor/grammars/language-xbase: - source.harbour vendor/grammars/language-xcompose: - config.xcompose vendor/grammars/language-yaml: - source.yaml vendor/grammars/language-yang: - source.yang vendor/grammars/latex.tmbundle: - text.bibtex - text.log.latex - text.tex - text.tex.latex - text.tex.latex.beamer - text.tex.latex.memoir vendor/grammars/leo-linguist: - source.leo vendor/grammars/linter-lilypond: - source.lilypond vendor/grammars/liquid-tm-grammar: - liquid.injection - text.html.liquid vendor/grammars/lisp.tmbundle: - source.lisp vendor/grammars/livescript-vscode: - source.livescript vendor/grammars/llvm.tmbundle: - source.llvm vendor/grammars/logos: - source.logos vendor/grammars/logtalk.tmbundle: - source.logtalk vendor/grammars/lua.tmbundle: - source.lua vendor/grammars/m3: - source.modula-3 vendor/grammars/make.tmbundle: - source.makefile vendor/grammars/mako-tmbundle: - text.html.mako vendor/grammars/markdown-tm-language: - source.mdx - text.md vendor/grammars/marko-tmbundle: - text.marko vendor/grammars/mathematica-tmbundle: - source.mathematica vendor/grammars/maven.tmbundle: - text.xml.pom vendor/grammars/mediawiki.tmbundle: - text.html.mediawiki vendor/grammars/mercury-tmlanguage: - source.mercury vendor/grammars/metta-textmate-linguist: - source.metta vendor/grammars/mint-vscode: - source.mint vendor/grammars/mlir-grammar: - source.mlir vendor/grammars/mojo-syntax: - source.mojo vendor/grammars/monkey: - source.monkey vendor/grammars/moonbit-tmLanguage: - source.moonbit vendor/grammars/moonscript-tmbundle: - source.moonscript vendor/grammars/mps-vscode: - text.source.mps vendor/grammars/nemerle.tmbundle: - source.nemerle vendor/grammars/nesC: - source.nesc vendor/grammars/nickel: - source.nickel vendor/grammars/nix-linguist: - source.nix vendor/grammars/nu-grammar: - source.nushell vendor/grammars/nu.tmbundle: - source.nu vendor/grammars/objective-c.tmbundle: - source.objc - source.objc++ - source.objc.platform - source.strings vendor/grammars/ocaml.tmbundle: - source.camlp4.ocaml - source.ocaml - source.ocamllex - source.ocamlyacc vendor/grammars/omnetpp-textmate-msg: - source.msg vendor/grammars/omnetpp-textmate-ned: - source.ned vendor/grammars/ooc.tmbundle: - source.ooc vendor/grammars/opa.tmbundle: - source.opa vendor/grammars/openscad.tmbundle: - source.scad vendor/grammars/overpassql-tmlanguage: - source.overpassql vendor/grammars/oz-tmbundle: - source.oz vendor/grammars/pact-atom: - source.pact vendor/grammars/parrot: - source.parrot.pir vendor/grammars/pascal.tmbundle: - source.pascal vendor/grammars/pawn-sublime-language: - source.pawn vendor/grammars/perl.tmbundle: - source.perl - source.perl.6 vendor/grammars/php-smarty.tmbundle: - text.html.smarty vendor/grammars/php.tmbundle: - text.html.php vendor/grammars/pig-latin: - source.pig_latin vendor/grammars/pike-textmate: - source.pike vendor/grammars/pkl.tmbundle: - source.pkl vendor/grammars/playground-cj: - source.cj vendor/grammars/polar-grammar: - source.polar vendor/grammars/portugol-grammar: - source.portugol vendor/grammars/powershell: - source.powershell vendor/grammars/praatvscode: - source.praat - source.textgrid vendor/grammars/processing.tmbundle: - source.processing vendor/grammars/python-django.tmbundle: - source.python.django - text.html.django vendor/grammars/qsharp: - source.openqasm - source.qsharp vendor/grammars/quake: - source.quake vendor/grammars/quakec-syntax: - source.quakec vendor/grammars/r.tmbundle: - source.r - text.tex.latex.rd vendor/grammars/rascal-syntax-highlighting: - source.rascal vendor/grammars/rascript-syntax: - source.rascript vendor/grammars/razor-plus: - text.html.cshtml vendor/grammars/rescript-vscode: - markdown.rescript.codeblock - source.rescript vendor/grammars/rez.tmbundle: - source.rez vendor/grammars/riot-syntax-highlight: - text.html.riot vendor/grammars/roc-vscode-unofficial: - source.roc vendor/grammars/ros-tmlanguage: - source.rosmsg vendor/grammars/rust-syntax: - source.rust vendor/grammars/rust_hdl_vscode: - source.vhdl vendor/grammars/sail_vscode: - source.sail vendor/grammars/sas.tmbundle: - source.sas vendor/grammars/scheme.tmbundle: - source.scheme vendor/grammars/scilab.tmbundle: - source.scilab vendor/grammars/secondlife-lsl: - source.lsl vendor/grammars/selinux-policy-languages: - source.cil - source.sepolicy vendor/grammars/shaders-tmLanguage: - source.hlsl - source.shaderlab vendor/grammars/slang-vscode-extension: - source.slang vendor/grammars/slint-tmLanguage: - source.slint vendor/grammars/smali-sublime: - source.smali vendor/grammars/smalltalk-tmbundle: - source.smalltalk vendor/grammars/smithy-vscode: - source.smithy vendor/grammars/sourcepawn-vscode: - source.amxxpawn - source.sourcepawn - sp-jsdoc.injection - text.valve-cfg - text.valve-kv vendor/grammars/sprocket-vscode: - source.wdl vendor/grammars/sql.tmbundle: - source.sql vendor/grammars/squirrel-language: - source.nut vendor/grammars/st2-zonefile: - text.zone_file vendor/grammars/standard-ml.tmbundle: - source.cm - source.ml vendor/grammars/sublime-MuPAD: - source.mupad vendor/grammars/sublime-angelscript: - source.angelscript vendor/grammars/sublime-aspectj: - source.aspectj vendor/grammars/sublime-autoit: - source.autoit vendor/grammars/sublime-befunge: - source.befunge vendor/grammars/sublime-boo: - source.boo vendor/grammars/sublime-bsv: - source.bsv vendor/grammars/sublime-cirru: - source.cirru vendor/grammars/sublime-clips: - source.clips vendor/grammars/sublime-cypher: - source.cypher vendor/grammars/sublime-fantom: - source.fan vendor/grammars/sublime-glsl: - source.essl - source.glsl vendor/grammars/sublime-golo: - source.golo vendor/grammars/sublime-lambdapi: - source.lp vendor/grammars/sublime-mask: - source.mask vendor/grammars/sublime-nearley: - source.ne vendor/grammars/sublime-netlinx: - source.netlinx - source.netlinx.erb vendor/grammars/sublime-odin: - source.odin vendor/grammars/sublime-opal: - source.opal - source.opalsysdefs vendor/grammars/sublime-pony: - source.pony vendor/grammars/sublime-promela-spin: - source.promela vendor/grammars/sublime-q: - source.q - source.q_output vendor/grammars/sublime-rexx: - source.rexx vendor/grammars/sublime-robot-plugin: - text.robot vendor/grammars/sublime-shen: - source.shen vendor/grammars/sublime-spintools: - source.regexp.spin - source.spin vendor/grammars/sublime-tea: - source.tea vendor/grammars/sublime-terra: - source.terra vendor/grammars/sublime-text-ox: - source.ox vendor/grammars/sublime-zig-language: - source.zig vendor/grammars/sublimeassembly: - source.assembly vendor/grammars/sublimeprolog: - source.prolog - source.prolog.eclipse vendor/grammars/sublimetext-cuda-cpp: - source.cuda-c++ vendor/grammars/sublimetext-nasl: - source.nasl - source.tnsaudit vendor/grammars/surrealql-grammar: - inline.surrealql-js-literal - markdown.surrealql.codeblock - source.surrealql vendor/grammars/svelte-atom: - source.svelte vendor/grammars/sway-vscode-plugin: - source.sway vendor/grammars/sweave.tmbundle: - text.tex.latex.sweave vendor/grammars/swift-tmlanguage: - source.swift vendor/grammars/syntax: - source.hcl - source.hcl.terraform - source.sentinel vendor/grammars/syntax-mcfunction: - source.mcfunction vendor/grammars/tact-sublime: - source.tact vendor/grammars/tcl.tmbundle: - source.tcl - text.html.tcl vendor/grammars/templ-vscode: - source.templ vendor/grammars/textmate: - source.flix vendor/grammars/textmate.tmbundle: - source.regexp.oniguruma - source.tm-properties - textmate.format-string vendor/grammars/textproto-grammar: - markdown.textproto.codeblock - source.textproto vendor/grammars/thrift.tmbundle: - source.thrift vendor/grammars/tlv-vscode: - source.tlverilog vendor/grammars/toml.tmbundle: - source.toml vendor/grammars/turtle.tmbundle: - source.sparql - source.turtle vendor/grammars/typespec: - source.tsp vendor/grammars/typst-grammar: - source.typst vendor/grammars/verilog.tmbundle: - source.verilog vendor/grammars/vsc-ember-syntax: - inline.hbs - inline.template - markdown.glimmer.codeblock - source.gjs - source.gts - text.html.ember-handlebars vendor/grammars/vsc-fennel: - source.fnl vendor/grammars/vsc-language-1c-bsl: - source.bsl - source.sdbl vendor/grammars/vscode: - source.QB64 vendor/grammars/vscode-TalonScript: - markdown.talon.codeblock - source.talon vendor/grammars/vscode-aiken: - source.aiken - source.uplc vendor/grammars/vscode-antlers-language-server: - text.html.statamic vendor/grammars/vscode-apache: - source.apacheconf vendor/grammars/vscode-bitbake: - source.bb vendor/grammars/vscode-brightscript-language: - source.brs vendor/grammars/vscode-c3: - source.c3 vendor/grammars/vscode-caddyfile: - source.Caddyfile - source.Caddyfile-test - source.markdown.caddy.codeblock vendor/grammars/vscode-cadence: - markdown.cadence.codeblock - source.cadence vendor/grammars/vscode-cmake-tools: - source.cmake - source.cmakecache vendor/grammars/vscode-codeql: - source.ql vendor/grammars/vscode-cue: - source.cue vendor/grammars/vscode-curry: - markdown.curry.codeblock - source.curry - source.icurry vendor/grammars/vscode-dune: - source.dune vendor/grammars/vscode-euphoria: - source.euphoria vendor/grammars/vscode-fastly-vcl: - source.vcl vendor/grammars/vscode-flatbuffers: - source.flatbuffers vendor/grammars/vscode-fluent: - source.ftl vendor/grammars/vscode-gcode-syntax: - source.gcode vendor/grammars/vscode-gedcom: - source.gedcom vendor/grammars/vscode-gleam: - markdown.gleam.codeblock - source.gleam vendor/grammars/vscode-go: - go.mod - go.sum vendor/grammars/vscode-go-template: - source.go-template - source.go.injection.double.go-template - source.go.injection.raw.go-template - text.injection.go-template - text.markdown.go-template.codeblock vendor/grammars/vscode-hack: - markdown.hack.codeblock - source.hack vendor/grammars/vscode-hy: - source.hy vendor/grammars/vscode-ibmi-languages: - source.bnd - source.cl - source.cmd - source.dds.dspf - source.dds.icff - source.dds.lf - source.dds.pf - source.dds.prtf - source.mi - source.pnlgrp - source.rpg - source.rpgle vendor/grammars/vscode-janet: - source.janet vendor/grammars/vscode-jest: - source.jest.snap vendor/grammars/vscode-jsonc-syntax-highlighting: - source.json.comments vendor/grammars/vscode-just: - source.just vendor/grammars/vscode-kcl: - source.kcl vendor/grammars/vscode-kdl: - source.kdl vendor/grammars/vscode-kolmafia-ash: - source.ash vendor/grammars/vscode-lean: - markdown.lean.codeblock - source.lean - source.lean.markdown vendor/grammars/vscode-lean4: - markdown.lean4.codeblock - source.lean4 - source.lean4.markdown vendor/grammars/vscode-liquidsoap: - source.liquidsoap vendor/grammars/vscode-livecodescript: - source.lcb - source.livecodescript vendor/grammars/vscode-minizinc: - source.mzn vendor/grammars/vscode-monkey-c: - source.mc vendor/grammars/vscode-motoko: - source.did - source.mo vendor/grammars/vscode-move-syntax: - markdown.move.codeblock - mdx.move.codeblock - source.move vendor/grammars/vscode-nginx: - source.nginx vendor/grammars/vscode-noir: - source.nr vendor/grammars/vscode-opa: - markdown.rego.codeblock - source.rego vendor/grammars/vscode-pddl: - source.pddl - source.pddl.happenings - source.pddl.plan vendor/grammars/vscode-plantuml: - markdown.plantuml.codeblock - source.wsd vendor/grammars/vscode-prisma: - inline.prisma - markdown.prisma.codeblock - source.prisma - source.ts.prismaClientRawSQL vendor/grammars/vscode-procfile: - source.procfile vendor/grammars/vscode-proto3: - markdown.codeblock.proto - source.proto vendor/grammars/vscode-python: - source.pip-requirements vendor/grammars/vscode-rbs-syntax: - source.rbs vendor/grammars/vscode-ron: - source.ron vendor/grammars/vscode-ruby-slim: - injection.interpolated-ruby - text.slim vendor/grammars/vscode-scala-syntax: - source.scala vendor/grammars/vscode-singularity: - source.singularity vendor/grammars/vscode-slice: - source.ice - source.slice vendor/grammars/vscode-teal: - source.teal vendor/grammars/vscode-tmdl: - source.tmdl vendor/grammars/vscode-tree-sitter-query: - source.scm vendor/grammars/vscode-vba: - source.vb6 - source.vba - source.wwb vendor/grammars/vscode-vcard: - source.vcard vendor/grammars/vscode-vento: - source.vento vendor/grammars/vscode-vlang: - source.v - v.mod vendor/grammars/vscode-wit: - source.wit vendor/grammars/vscode-wren: - source.wren vendor/grammars/vscode-yara: - source.yara vendor/grammars/vscode-zil-language: - source.zap - source.zil vendor/grammars/vscode_cobol: - source.acucobol - source.bms - source.bmsmap - source.cobol - source.cobol_acu_listfile - source.cobol_mf_listfile - source.cobol_mfprep - source.cobol_pcob_listfile - source.cobolit - source.cobsql_dir - source.dir - source.directivesmf - source.hlasm - source.ilecobol - source.jcl - source.mfu - source.mfupp_dir - source.openesql - source.pli - source.rmcobol - source.utreport vendor/grammars/vscode_mikrotik_routeros_script: - source.rsc vendor/grammars/wgsl-analyzer: - markdown.wesl.codeblock - markdown.wgsl.codeblock - source.comment-string.wesl - source.comment-string.wgsl - source.wesl - source.wgsl vendor/grammars/witcherscript-grammar: - source.witcherscript vendor/grammars/wollok-sublime: - source.wollok vendor/grammars/xc.tmbundle: - source.xc vendor/grammars/xmake-lua.tmbundle: - source.xmake vendor/grammars/xml.tmbundle: - text.xml - text.xml.xsl vendor/grammars/zeek-sublime: - source.zeek vendor/grammars/zenstack: - source.zmodel vendor/grammars/zephir-sublime: - source.php.zephir ================================================ FILE: http.liq ================================================ # Prepare a list of data to be sent as multipart form data. # @category Internet # @param ~boundary Specify boundary to use for multipart/form-data. # @param data data to insert def http.multipart_form_data(~boundary=null(), data) = def default_boundary() = range = [...string.char.ascii.alphabet, ...string.char.ascii.number] l = list.init(12, fun (_) -> string.char.ascii.random(range)) string.concat(l) end boundary = null.default(boundary, default_boundary) def mk_content(contents, entry) = data = entry.contents attributes = [("name", entry.name), ...entry.attributes] attributes = list.map( fun (v) -> "#{string(fst(v))}=#{string.quote(snd(v))}", attributes ) attributes = string.concat(separator="; ", attributes) headers = list.map(fun (v) -> "#{string(fst(v))}: #{string(snd(v))}", entry.headers) headers = string.concat(separator="\r\n", headers) headers = headers == "" ? "" : "#{headers}\r\n" # This is for typing purposes (entry : unit) [ ...contents, getter("--#{boundary}\r\n"), getter("Content-Disposition: form-data; #{attributes}\r\n"), getter(headers), getter("\r\n"), data, getter("\r\n") ] end contents = [...list.fold(mk_content, [], data), getter("--#{boundary}--\r\n")] contents = string.getter.concat(contents) contents = if list.for_all(fun (entry) -> getter.is_constant(entry.contents), data) then getter(string.getter.flush(contents)) else contents end {contents=contents, boundary=boundary} end # Initiate a response handler with pre-filled values. # @category Internet # @method content_type Set `"Content-Type"` header # @method data Set response data. # @method headers Replace response headers. # @method header Set a single header on the response # @method json Set content-type to json and data to `json.stringify` of the argument # @method redirect Set `status_code` and `Location:` header for a HTTP redirect response # @method html Set content-type to html and data to argument value # @method http_version Set http protocol version # @method status_code Set response status code # @method status_message Set response status message def http.response( ~http_version="1.1", ~status_code=null(), ~status_message=null(), ~headers=[], ~content_type=null(), ~data=getter("") ) = status_code = status_code ?? if http_version == "1.1" and headers["expect"] == "100-continue" and getter.get(data) == "" then 100 else 200 end http_version = ref(http_version) status_code = ref(status_code) status_message = ref(status_message) headers = ref(headers) content_type = ref(content_type) data = ref(data) status_sent = ref(false) headers_sent = ref(false) data_sent = ref(false) response_ended = ref(false) def mk_status() = status_sent := true http_version = http_version() status_code = status_code() status_code = if status_code == 100 and getter.get(data()) != "" then 200 else status_code end status_message = status_message() ?? http.codes[status_code] "HTTP/#{http_version} #{status_code} #{status_message}\r\n" end def mk_headers() = headers_sent := true headers = headers() content_type = content_type() data = data() headers = if getter.is_constant(data) then data = getter.get(data) if data != "" then ("Content-Length", "#{string.length(data)}")::headers else headers end else ("Transfer-Encoding", "chunked")::headers end headers = if null.defined(content_type) and null.get(content_type) != "" then ("Content-type", null.get(content_type))::headers else headers end headers = list.map(fun (v) -> "#{fst(v)}: #{snd(v)}", headers) headers = string.concat(separator="\r\n", headers) headers = if headers != "" then "#{headers}\r\n" else "" end "#{headers}\r\n" end def mk_data() = data_sent := true data = data() if getter.is_constant(data) then response_ended := true getter.get(data) else data = getter.get(data) response_ended := data == "" "#{string.hex_of_int(string.length(data))}\r\n#{data}\r\n" end end def response() = if response_ended() then "" elsif not status_sent() then mk_status() elsif not headers_sent() then mk_headers() else mk_data() end end def attr_method(sent, attr) = def set(v) = if sent() then error.raise( error.invalid, "HTTP response has already been sent for this value!" ) end attr := v end def get() = attr() end set.{current=get} end def header(k, v) = headers := (k, v)::headers() end code = status_code def redirect(~status_code=301, location) = if status_sent() then error.raise( error.invalid, "HTTP response has already been sent for this value!" ) end code := status_code header("Location", location) end def json(~compact=true, v) = if headers_sent() then error.raise( error.invalid, "HTTP response has already been sent for this value!" ) end content_type := "application/json; charset=utf-8" data := json.stringify(v, compact=compact) ^ "\n" end def html(d) = if headers_sent() then error.raise( error.invalid, "HTTP response has already been sent for this value!" ) end content_type := "text/html" data := d end def send_status(socket) = if not status_sent() then socket.write(mk_status()) end end def multipart_form(~boundary=null(), contents) = if headers_sent() then error.raise( error.invalid, "HTTP response has already been sent for this value!" ) end form_data = http.multipart_form_data(boundary=boundary, contents) content_type := "multipart/form-data; boundary=#{form_data.boundary}" data := form_data.contents end response.{ http_version=attr_method(status_sent, http_version), status_code=attr_method(status_sent, status_code), status_message=attr_method(status_sent, status_message), headers=attr_method(headers_sent, headers), header=header, redirect=redirect, json=json, html=html, content_type=attr_method(headers_sent, content_type), multipart_form=multipart_form, data=attr_method(data_sent, data), send_status=send_status, status_sent={status_sent()} } end ================================================ FILE: lib/linguist/VERSION ================================================ 9.5.0 ================================================ FILE: lib/linguist/blob.rb ================================================ require 'linguist/blob_helper' module Linguist # A Blob is a wrapper around the content of a file to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. class Blob include BlobHelper # Public: Initialize a new Blob. # # path - A path String (does not necessarily exists on the file system). # content - Content of the file. # symlink - Whether the file is a symlink. # # Returns a Blob. def initialize(path, content, symlink: false) @path = path @content = content @symlink = symlink end # Public: Filename # # Examples # # Blob.new("/path/to/linguist/lib/linguist.rb", "").path # # => "/path/to/linguist/lib/linguist.rb" # # Returns a String attr_reader :path # Public: File name # # Returns a String def name File.basename(@path) end # Public: File contents. # # Returns a String. def data @content end # Public: Get byte size # # Returns an Integer. def size @content.bytesize end # Public: Get file extension. # # Returns a String. def extension extensions.last || "" end # Public: Return an array of the file extensions # # >> Linguist::Blob.new("app/views/things/index.html.erb").extensions # => [".html.erb", ".erb"] # # Returns an Array def extensions _, *segments = name.downcase.split(".", -1) segments.map.with_index do |segment, index| "." + segments[index..-1].join(".") end end # Public: Is this a symlink? # # Returns true or false. def symlink? @symlink end end end ================================================ FILE: lib/linguist/blob_helper.rb ================================================ require 'linguist/generated' require 'cgi' require 'charlock_holmes' require 'mini_mime' require 'yaml' module Linguist # DEPRECATED Avoid mixing into Blob classes. Prefer functional interfaces # like `Linguist.detect` over `Blob#language`. Functions are much easier to # cache and compose. # # Avoid adding additional bloat to this module. # # BlobHelper is a mixin for Blobish classes that respond to "name", # "data" and "size" such as Grit::Blob. module BlobHelper # Public: Get the extname of the path # # Examples # # blob(name='foo.rb').extname # # => '.rb' # # Returns a String def extname File.extname(name.to_s) end # Internal: Lookup mime type for filename. # # Returns a MIME::Type def _mime_type if defined? @_mime_type @_mime_type else @_mime_type = MiniMime.lookup_by_filename(name.to_s) end end # Public: Get the actual blob mime type # # Examples # # # => 'text/plain' # # => 'text/html' # # Returns a mime type String. def mime_type _mime_type ? _mime_type.content_type : 'text/plain' end # Internal: Is the blob binary according to its mime type # # Return true or false def binary_mime_type? _mime_type ? _mime_type.binary? : false end # Internal: Is the blob binary according to its mime type, # overriding it if we have better data from the languages.yml # database. # # Return true or false def likely_binary? binary_mime_type? && !Language.find_by_filename(name) end # Public: Get the Content-Type header value # # This value is used when serving raw blobs. # # Examples # # # => 'text/plain; charset=utf-8' # # => 'application/octet-stream' # # Returns a content type String. def content_type @content_type ||= (binary_mime_type? || binary?) ? mime_type : (encoding ? "text/plain; charset=#{encoding.downcase}" : "text/plain") end # Public: Get the Content-Disposition header value # # This value is used when serving raw blobs. # # # => "attachment; filename=file.tar" # # => "inline" # # Returns a content disposition String. def disposition if text? || image? 'inline' elsif name.nil? "attachment" else "attachment; filename=#{CGI.escape(name)}" end end def encoding if hash = detect_encoding hash[:encoding] end end def ruby_encoding if hash = detect_encoding hash[:ruby_encoding] end end # Try to guess the encoding # # Returns: a Hash, with :encoding, :confidence, :type # this will return nil if an error occurred during detection or # no valid encoding could be found def detect_encoding @detect_encoding ||= CharlockHolmes::EncodingDetector.new.detect(data) if data end # Public: Is the blob binary? # # Return true or false def binary? # Large blobs aren't even loaded into memory if data.nil? true # Treat blank files as text elsif data == "" false # Charlock doesn't know what to think elsif encoding.nil? true # If Charlock says its binary else detect_encoding[:type] == :binary end end # Public: Is the blob empty? # # Return true or false def empty? data.nil? || data == "" end # Public: Is the blob text? # # Return true or false def text? !binary? end # Public: Is the blob a supported image format? # # Return true or false def image? ['.png', '.jpg', '.jpeg', '.gif'].include?(extname.downcase) end # Public: Is the blob a supported 3D model format? # # Return true or false def solid? extname.downcase == '.stl' end # Public: Is this blob a CSV file? # # Return true or false def csv? text? && extname.downcase == '.csv' end # Public: Is the blob a PDF? # # Return true or false def pdf? extname.downcase == '.pdf' end MEGABYTE = 1024 * 1024 # Public: Is the blob too big to load? # # Return true or false def large? size.to_i > MEGABYTE end # Public: Is the blob safe to colorize? # # Return true or false def safe_to_colorize? !large? && text? && !high_ratio_of_long_lines? end # Internal: Does the blob have a ratio of long lines? # # Return true or false def high_ratio_of_long_lines? return false if loc == 0 size / loc > 5000 end # Public: Is the blob viewable? # # Non-viewable blobs will just show a "View Raw" link # # Return true or false def viewable? !large? && text? end vendored_paths = YAML.load_file(File.expand_path("../vendor.yml", __FILE__)) VendoredRegexp = Regexp.new(vendored_paths.join('|')) # Public: Is the blob in a vendored directory? # # Vendored files are ignored by language statistics. # # See "vendor.yml" for a list of vendored conventions that match # this pattern. # # Return true or false def vendored? path =~ VendoredRegexp ? true : false end documentation_paths = YAML.load_file(File.expand_path("../documentation.yml", __FILE__)) DocumentationRegexp = Regexp.new(documentation_paths.join('|')) # Public: Is the blob in a documentation directory? # # Documentation files are ignored by language statistics. # # See "documentation.yml" for a list of documentation conventions that match # this pattern. # # Return true or false def documentation? path =~ DocumentationRegexp ? true : false end # Public: Get each line of data # # Requires Blob#data # # Returns an Array of lines def lines @lines ||= if viewable? && data # `data` is usually encoded as ASCII-8BIT even when the content has # been detected as a different encoding. However, we are not allowed # to change the encoding of `data` because we've made the implicit # guarantee that each entry in `lines` is encoded the same way as # `data`. # # Instead, we re-encode each possible newline sequence as the # detected encoding, then force them back to the encoding of `data` # (usually a binary encoding like ASCII-8BIT). This means that the # byte sequence will match how newlines are likely encoded in the # file, but we don't have to change the encoding of `data` as far as # Ruby is concerned. This allows us to correctly parse out each line # without changing the encoding of `data`, and # also--importantly--without having to duplicate many (potentially # large) strings. begin # `data` is split after having its last `\n` removed by # chomp (if any). This prevents the creation of an empty # element after the final `\n` character on POSIX files. data.chomp.split(encoded_newlines_re, -1) rescue Encoding::ConverterNotFoundError # The data is not splittable in the detected encoding. Assume it's # one big line. [data] end else [] end end def encoded_newlines_re @encoded_newlines_re ||= Regexp.union(["\r\n", "\r", "\n"]. map { |nl| nl.encode(ruby_encoding, "ASCII-8BIT").force_encoding(data.encoding) }) end def first_lines(n) return lines[0...n] if defined? @lines return [] unless viewable? && data i, c = 0, 0 while c < n && j = data.index(encoded_newlines_re, i) i = j + $&.length c += 1 end data[0...i].split(encoded_newlines_re, -1) end def last_lines(n) if defined? @lines if n >= @lines.length @lines else lines[-n..-1] end end return [] unless viewable? && data no_eol = true i, c = data.length, 0 k = i while c < n && j = data.rindex(encoded_newlines_re, i - 1) if c == 0 && j + $&.length == i no_eol = false n += 1 end i = j k = j + $&.length c += 1 end r = data[k..-1].split(encoded_newlines_re, -1) r.pop if !no_eol r end # Public: Get number of lines of code # # Requires Blob#data # # Returns Integer def loc lines.size end # Public: Get number of source lines of code # # Requires Blob#data # # Returns Integer def sloc lines.grep(/\S/).size end # Public: Is the blob a generated file? # # Generated source code is suppressed in diffs and is ignored by # language statistics. # # May load Blob#data # # Return true or false def generated? @_generated ||= Generated.generated?(path, lambda { data }) end # Public: Detects the Language of the blob. # # May load Blob#data # # Returns a Language or nil if none is detected def language @language ||= Linguist.detect(self) end # Internal: Get the TextMate compatible scope for the blob def tm_scope language && language.tm_scope end DETECTABLE_TYPES = [:programming, :markup].freeze # Internal: Should this blob be included in repository language statistics? def include_in_language_stats? !vendored? && !documentation? && !generated? && language && ( defined?(detectable?) && !detectable?.nil? ? detectable? : DETECTABLE_TYPES.include?(language.type) ) end end end ================================================ FILE: lib/linguist/classifier.rb ================================================ require 'linguist/tokenizer' require 'set' module Linguist # Language content classifier. class Classifier # Maximum number of bytes to consider for classification. # This is only used at evaluation time. During training, full content of # samples is used. CLASSIFIER_CONSIDER_BYTES = 50 * 1024 # Public: Use the classifier to detect language of the blob. # # blob - An object that quacks like a blob. # possible_languages - Array of Language objects # # Examples # # Classifier.call(FileBlob.new("path/to/file"), [ # Language["Ruby"], Language["Python"] # ]) # # Returns an Array of Language objects, most probable first. def self.call(blob, possible_languages) language_names = possible_languages.map(&:name) classify(Samples.cache, blob.data[0...CLASSIFIER_CONSIDER_BYTES], language_names).map do |name, _| Language[name] # Return the actual Language objects end end # Public: Train classifier that data is a certain language. # # db - Hash classifier database object # language - String language of data # data - String contents of file or array of tokens. # # Examples # # Classifier.train!(db, 'Ruby', "def hello; end") # # Returns nil. # # Set LINGUIST_DEBUG=1, =2 or =3 to print internal statistics. def self.train!(db, language, data) tokens = data tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String) db['vocabulary'] ||= {} # Set hash to autoincremented index value if db['vocabulary'].default_proc.nil? db['vocabulary'].default_proc = proc do |hash, key| hash[key] = hash.length end end db['samples'] ||= {} db['samples'][language] ||= [] termfreq = to_vocabulary_index_termfreq(db['vocabulary'], tokens) db['samples'][language] << termfreq nil end # Public: Finalize training. # # db - Hash classifier database object # # Examples: # Classifier.finalize_train!(db) # # Returns nil. # # This method must be called after the last #train! call. def self.finalize_train!(db) db['vocabulary'] ||= {} # Unset hash autoincrement db['vocabulary'].default_proc = nil db['samples'] ||= [] filter_vocab_by_freq! db, MIN_DOCUMENT_FREQUENCY sort_vocab! db db['icf'] = inverse_class_freqs db normalize_samples! db db['centroids'] = get_centroids db db.delete 'samples' nil end # Public: Guess language of data. # # db - Hash of classifier tokens database. # data - Array of tokens or String data to analyze. # languages - Array of language name Strings to restrict to. # # Examples # # Classifier.classify(db, "def hello; end") # # => [ 'Ruby', 0.90], ['Python', 0.2], ... ] # # Returns sorted Array of result pairs. Each pair contains the # String language name and a Float score between 0.0 and 1.0. def self.classify(db, tokens, languages = nil) languages ||= db['centroids'].keys new(db).classify(tokens, languages) end # Internal: Initialize a Classifier. def initialize(db = {}) @vocabulary = db['vocabulary'] @centroids = db['centroids'] @icf = db['icf'] end # Internal: Guess language of data # # data - Array of tokens or String data to analyze. # languages - Array of language name Strings to restrict to. # # Returns sorted Array of result pairs. Each pair contains the # String language name and a Float score between 0.0 and 1.0. def classify(tokens, languages) return [] if tokens.nil? || languages.empty? tokens = Tokenizer.tokenize(tokens) if tokens.is_a?(String) debug_dump_tokens(tokens) if verbosity >= 3 vec = Classifier.to_vocabulary_index_termfreq_gaps(@vocabulary, tokens) vec.each do |idx, freq| tf = 1.0 + Math.log(freq) vec[idx] = tf * @icf[idx] end return [] if vec.empty? Classifier.l2_normalize!(vec) scores = {} languages.each do |language| centroid = @centroids[language] score = Classifier.similarity(vec, centroid) if score > 0.0 scores[language] = score end end scores = scores.sort_by { |x| -x[1] } debug_dump_all_tokens(tokens, scores) if verbosity >= 2 debug_dump_scores(scores) if verbosity >= 1 scores end private MIN_DOCUMENT_FREQUENCY = 2 def verbosity @verbosity ||= (ENV['LINGUIST_DEBUG'] || 0).to_i end def debug_dump_scores(scores) headers = ["Language", "Score"] rows = scores.map { |l, s| [l, "%.3f" % s] } dump_table(headers, rows) end def debug_dump_tokens(tokens) counts = Hash.new(0) tokens.each do |tok| idx = @vocabulary[tok] if not idx.nil? counts[tok] += 1 end end norm = Classifier.l2_norm(counts) rows = counts.map do |tok, tf| idx = @vocabulary[tok] log_tf = 1.0 + Math.log(tf) with_icf = log_tf * @icf[idx] normalized = with_icf / norm row = [tok, tf, "%.3f" % log_tf, "%.3f" % with_icf, "%.3f" % normalized] [normalized, row] end headers = ["Token", "TF", "log", "*ICF", "L2"] rows = rows.sort_by { |x| -x[0] }.map { |_, row| row } dump_table(headers, rows) end # Internal: show a table of probabilities for each pair. # # The number in each table entry is the number of "points" that each # token contributes toward the belief that the file under test is a # particular language. Points are additive. def debug_dump_all_tokens(tokens, scores) languages = scores.map { |l, _| l } counts = Hash.new(0) tokens.each do |tok| idx = @vocabulary[tok] if not idx.nil? counts[tok] += 1 end end data = {} norm = Classifier.l2_norm(counts) languages.each do |language| data[language] = {} counts.each do |tok, tf| idx = @vocabulary[tok] log_tf = 1.0 + Math.log(tf) with_icf = log_tf * @icf[idx] normalized = with_icf / norm data[language][tok] = normalized * @centroids[language][idx].to_f end end norm = Classifier.l2_norm(counts) rows = counts.map do |tok, tf| idx = @vocabulary[tok] log_tf = 1.0 + Math.log(tf) with_icf = log_tf * @icf[idx] normalized = with_icf / norm scores = languages.map do |l, _| [l, data[l][tok].to_f] end max_score = scores.to_h.values.max row = [tok] + scores.map do |l, s| if s == max_score "%.4f*" % s elsif s > 0.0 "%.4f" % s else "-" end end [normalized, row] end headers = ["Token"] + (0..languages.length-1).map { |lidx| "[#{lidx}]" } rows = rows.sort_by { |x| -x[0] }.map { |_, row| row } legend = languages.each_with_index.map { |l, lidx| "[#{lidx}] = #{l}" } dump_table(headers, rows, legend) end def dump_table(header, rows, legend = nil) n_cols = header.length rows = rows.map { |r| r.map { |c| c.to_s } } col_widths = (0..n_cols - 1).map do |j| ([header[j].length] + rows.map { |row| row[j].length }).max end sep_line = "| #{(0..n_cols-1).map { |j| "-" * col_widths[j] }.join(" | ")} |" content_width = sep_line.length - 4 top_line = "| #{"-" * content_width} |" format_row = Proc.new do |row| cells = row.zip(col_widths).map do |cell, width| "%-#{width}s" % cell end "| %s |" % cells.join(" | ") end puts top_line puts format_row.call(header) puts sep_line rows.each do |row| puts format_row.call(row) end puts top_line if legend legend.each do |line| puts "| %-#{content_width}s |" % line end puts top_line end end def self.to_vocabulary_index_termfreq(vocab, tokens) counts = Hash.new(0) tokens.each do |key| idx = vocab[key] counts[idx] += 1 end counts end def self.to_vocabulary_index_termfreq_gaps(vocab, tokens) counts = Hash.new(0) tokens.each do |key| if vocab.key? key idx = vocab[key] counts[idx] += 1 end end counts end def self.l2_norm(vec) norm = vec.values.inject(0.0) { |sum, x| sum + x**2 } Math.sqrt(norm) end def self.l2_normalize!(vec) norm = l2_norm(vec) vec.transform_values! do |value| value.to_f / norm end nil end def self.similarity(a, b) sum = 0.0 a.each_key do |idx| if b.key? idx sum += a[idx] * b[idx] end end sum end # Filter vocabulary by minimum document frequency. def self.filter_vocab_by_freq!(db, min_freq) vocabulary = db['vocabulary'] # Get document frequencies docfreq = Array.new(vocabulary.size, 0) db['samples'].each_value do |samples| samples.each do |sample| sample.each_key do |idx| docfreq[idx] += 1 end end end vocabulary.select! do |_, idx| docfreq[idx] >= min_freq end nil end # Sort vocabulary lexicographically. def self.sort_vocab!(db) new_indices = Hash.new { |h,k| h[k] = h.length } db['vocabulary'].sort_by { |x| x[0] }.each do |term, idx| db['vocabulary'][term] = new_indices[idx] end new_indices.default_proc = nil db['samples'].transform_values! do |samples| samples.map do |sample| new_sample = {} sample.each do |idx, freq| new_idx = new_indices[idx] if not new_idx.nil? new_sample[new_idx] = freq end end new_sample end end end # Compute inverse class frequency (ICF) for every term. def self.inverse_class_freqs(db) icf = Array.new(db['vocabulary'].size, 0) db['samples'].each_value do |samples| terms = Set.new samples.each do |sample| terms |= sample.keys end terms.each do |idx| icf[idx] += 1 end end icf.map! do |val| Math.log(db['samples'].size.to_f / val.to_f) + 1 end icf end def self.normalize_samples!(db) icf = db['icf'] db['samples'].each_value do |samples| samples.each do |sample| sample.each do |idx, freq| tf = 1.0 + Math.log(freq) sample[idx] = tf * icf[idx] end l2_normalize! sample end end end def self.get_centroids(db) centroids = {} db['samples'].each do |language, samples| centroid = Hash.new(0.0) samples.each do |sample| sample.each do |idx, val| centroid[idx] += val end end centroid.each_key do |idx| centroid[idx] = centroid[idx] / samples.length end l2_normalize! centroid centroids[language] = centroid end centroids end end end ================================================ FILE: lib/linguist/documentation.yml ================================================ # Documentation files and directories are excluded from language # statistics. # # Lines in this file are Regexps that are matched against the file # pathname. # # Please add additional test coverage to # `test/test_blob.rb#test_documentation` if you make any changes. ## Documentation directories ## - ^[Dd]ocs?/ - (^|/)[Dd]ocumentation/ - (^|/)[Gg]roovydoc/ - (^|/)[Jj]avadoc/ - ^[Mm]an/ - ^[Ee]xamples/ - ^[Dd]emos?/ - (^|/)inst/doc/ ## Documentation files ## - (^|/)CITATION(\.cff|(S)?(\.(bib|md))?)$ - (^|/)CHANGE(S|LOG)?(\.|$) - (^|/)CONTRIBUTING(\.|$) - (^|/)COPYING(\.|$) - (^|/)INSTALL(\.|$) - (^|/)LICEN[CS]E(\.|$) - (^|/)[Ll]icen[cs]e(\.|$) - (^|/)README(\.|$) - (^|/)[Rr]eadme(\.|$) # Samples folders - ^[Ss]amples?/ ================================================ FILE: lib/linguist/file_blob.rb ================================================ require 'linguist/blob_helper' require 'linguist/blob' module Linguist # A FileBlob is a wrapper around a File object to make it quack # like a Grit::Blob. It provides the basic interface: `name`, # `data`, `path` and `size`. class FileBlob < Blob include BlobHelper # Public: Initialize a new FileBlob from a path # # path - A path String that exists on the file system. # base_path - Optional base to relativize the path # # Returns a FileBlob. def initialize(path, base_path = nil) @fullpath = path @path = base_path ? path.sub("#{base_path}/", '') : path end # Public: Read file permissions # # Returns a String like '100644' def mode @mode ||= File.stat(@fullpath).mode.to_s(8) end def symlink? return @symlink if defined? @symlink @symlink = (File.symlink?(@fullpath) rescue false) end # Public: Read file contents. # # Returns a String. def data @data ||= File.read(@fullpath, :encoding => "ASCII-8BIT") end # Public: Get byte size # # Returns an Integer. def size @size ||= File.size(@fullpath) end end end ================================================ FILE: lib/linguist/generated.rb ================================================ module Linguist class Generated # Public: Is the blob a generated file? # # name - String filename # data - String blob data. A block also may be passed in for lazy # loading. This behavior is deprecated and you should always # pass in a String. # # Return true or false def self.generated?(name, data) new(name, data).generated? end # Internal: Initialize Generated instance # # name - String filename # data - String blob data def initialize(name, data) @name = name @extname = File.extname(name) @_data = data end attr_reader :name, :extname # Lazy load blob data if block was passed in. # # Awful, awful stuff happening here. # # Returns String data. def data @data ||= @_data.respond_to?(:call) ? @_data.call() : @_data end # Public: Get each line of data # # Returns an Array of lines def lines # TODO: data should be required to be a String, no nils @lines ||= data ? data.split("\n", -1) : [] end # Internal: Is the blob a generated file? # # Generated source code is suppressed in diffs and is ignored by # language statistics. # # Please add additional test coverage to # `test/test_blob.rb#test_generated` if you make any changes. # # Return true or false def generated? xcode_file? || intellij_file? || cocoapods? || carthage_build? || generated_graphql_relay? || generated_net_designer_file? || generated_net_specflow_feature_file? || composer_lock? || cargo_lock? || cargo_orig? || deno_lock? || flake_lock? || bazel_lock? || node_modules? || go_vendor? || go_lock? || package_resolved? || poetry_lock? || pdm_lock? || uv_lock? || pixi_lock? || esy_lock? || npm_shrinkwrap_or_package_lock? || pnpm_lock? || bun_lock? || terraform_lock? || generated_yarn_plugnplay? || godeps? || generated_by_zephir? || htmlcov? || minified_files? || has_source_map? || source_map? || compiled_coffeescript? || generated_parser? || generated_net_docfile? || generated_postscript? || compiled_cython_file? || pipenv_lock? || gradle_wrapper? || maven_wrapper? || generated_go? || generated_protocol_buffer_from_go? || generated_protocol_buffer? || generated_javascript_protocol_buffer? || generated_typescript_protocol_buffer? || generated_apache_thrift? || generated_jni_header? || vcr_cassette? || generated_antlr? || generated_module? || generated_unity3d_meta? || generated_racc? || generated_jflex? || generated_grammarkit? || generated_roxygen2? || generated_html? || generated_jison? || generated_grpc_cpp? || generated_dart? || generated_perl_ppport_header? || generated_gamemakerstudio? || generated_gimp? || generated_visualstudio6? || generated_haxe? || generated_jooq? || generated_pascal_tlb? || generated_sorbet_rbi? || generated_mysql_view_definition_format? || generated_sqlx_query? end # Internal: Is the blob an Xcode file? # # Generated if the file extension is an Xcode # file extension. # # Returns true or false. def xcode_file? ['.nib', '.xcworkspacedata', '.xcuserstate'].include?(extname) end # Internal: Is the blob an IntelliJ IDEA project file? # # JetBrains IDEs generate project files under an `.idea` directory # that are sometimes checked into version control. # # Returns true or false. def intellij_file? !!name.match(/(?:^|\/)\.idea\//) end # Internal: Is the blob part of Pods/, which contains dependencies not meant for humans in pull requests. # # Returns true or false. def cocoapods? !!name.match(/(^Pods|\/Pods)\//) end # Internal: Is the blob part of Carthage/Build/, which contains dependencies not meant for humans in pull requests. # # Returns true or false. def carthage_build? !!name.match(/(^|\/)Carthage\/Build\//) end # Internal: Does extname indicate a filetype which is commonly minified? # # Returns true or false. def maybe_minified? ['.js', '.css'].include? extname.downcase end # Internal: Is the blob a minified file? # # Consider a file minified if the average line length is # greater then 110c. # # Currently, only JS and CSS files are detected by this method. # # Returns true or false. def minified_files? if maybe_minified? and lines.any? (lines.inject(0) { |n, l| n += l.length } / lines.length) > 110 else false end end # Internal: Does the blob contain a source-map reference? # # We assume that if one of the last 2 lines starts with a source-map # reference, then the current file was generated from other files. # # We use the last 2 lines because the last line might be empty. # # Returns true or false. def has_source_map? return false unless maybe_minified? lines.last(2).any? { |l| l.match(/^\/[*\/][\#@] source(?:Mapping)?URL|sourceURL=/) } end # Internal: Is the blob a generated source-map? # # Source-maps usually have .css.map or .js.map extensions. In case they # are not following the name convention, detect them based on the content. # # Returns true or false. def source_map? return false unless extname.downcase == '.map' return true if name =~ /(\.css|\.js)\.map$/i || # Name convention lines[0] =~ /^{"version":\d+,/ || # Revision 2 and later begin with the version number lines[0] =~ /^\/\*\* Begin line maps\. \*\*\/{/ # Revision 1 begins with a magic comment false end # Internal: Is the blob of JS generated by CoffeeScript? # # CoffeeScript is meant to output JS that would be difficult to # tell if it was generated or not. Look for a number of patterns # output by the CS compiler. # # Return true or false def compiled_coffeescript? return false unless extname == '.js' # CoffeeScript generated by > 1.2 include a comment on the first line if lines[0] =~ /^\/\/ Generated by / return true end if lines[0] == '(function() {' && # First line is module closure opening lines[-2] == '}).call(this);' && # Second to last line closes module closure lines[-1] == '' # Last line is blank score = 0 lines.each do |line| if line =~ /var / # Underscored temp vars are likely to be Coffee score += 1 * line.gsub(/(_fn|_i|_len|_ref|_results)/).count # bind and extend functions are very Coffee specific score += 3 * line.gsub(/(__bind|__extends|__hasProp|__indexOf|__slice)/).count end end # Require a score of 3. This is fairly arbitrary. Consider # tweaking later. score >= 3 else false end end # Internal: Is this a generated documentation file for a .NET assembly? # # .NET developers often check in the XML Intellisense file along with an # assembly - however, these don't have a special extension, so we have to # dig into the contents to determine if it's a docfile. Luckily, these files # are extremely structured, so recognizing them is easy. # # Returns true or false def generated_net_docfile? return false unless extname.downcase == ".xml" return false unless lines.count > 3 # .NET Docfiles always open with and their first tag is an # tag return lines[1].include?("") && lines[2].include?("") && lines[-2].include?("") end # Internal: Is this a codegen file for a .NET project? # # Visual Studio often uses code generation to generate partial classes, and # these files can be quite unwieldy. Let's hide them. # # Returns true or false def generated_net_designer_file? !!name.match(/\.designer\.(cs|vb)$/i) end # Internal: Is this a codegen file for Specflow feature file? # # Visual Studio's SpecFlow extension generates *.feature.cs files # from *.feature files, they are not meant to be consumed by humans. # Let's hide them. # # Returns true or false def generated_net_specflow_feature_file? !!name.match(/\.feature\.cs$/i) end # Internal: Is the blob of JS a parser generated by PEG.js? # # PEG.js-generated parsers are not meant to be consumed by humans. # # Return true or false def generated_parser? return false unless extname == '.js' # PEG.js-generated parsers include a comment near the top of the file # that marks them as such. if lines[0..4].join('') =~ /^(?:[^\/]|\/[^\*])*\/\*(?:[^\*]|\*[^\/])*Generated by PEG.js/ return true end false end # Internal: Is the blob of PostScript generated? # # PostScript files are often generated by other programs. If they tell us so, # we can detect them. # # Returns true or false. def generated_postscript? return false unless ['.ps', '.eps', '.pfa'].include? extname # Type 1 and Type 42 fonts converted to PostScript are stored as hex-encoded byte streams; these # streams are always preceded the `eexec` operator (if Type 1), or the `/sfnts` key (if Type 42). return true if data =~ /^\s*(?:currentfile eexec\s+|\/sfnts\s+\[\s<)/ # We analyze the "%%Creator:" comment, which contains the author/generator # of the file. If there is one, it should be in one of the first few lines. creator = lines[0..9].find {|line| line =~ /^%%Creator: /} return false if creator.nil? # Most generators write their version number, while human authors' or companies' # names don't contain numbers. So look if the line contains digits. Also # look for some special cases without version numbers. return true if creator =~ /[0-9]|draw|mpage|ImageMagick|inkscape|MATLAB/ || creator =~ /PCBNEW|pnmtops|\(Unknown\)|Serif Affinity|Filterimage -tops/ # EAGLE doesn't include a version number when it generates PostScript. # However, it does prepend its name to the document's "%%Title" field. !!creator.include?("EAGLE") and lines[0..4].find {|line| line =~ /^%%Title: EAGLE Drawing /} end def generated_go? return false unless extname == '.go' return false unless lines.count > 1 return lines.first(40).any? { |l| l =~ %r{^// Code generated .*} } end # Internal: Is the blob a protocol buffer file generated by the # go-to-protobuf tool? # # Returns true or false def generated_protocol_buffer_from_go? return false unless extname == '.proto' return false unless lines.count > 1 return lines.first(20).any? { |l| l.include? "This file was autogenerated by go-to-protobuf" } end PROTOBUF_EXTENSIONS = ['.py', '.java', '.h', '.cc', '.cpp', '.m', '.rb', '.php'] # Internal: Is the blob a C++, Java or Python source file generated by the # Protocol Buffer compiler? # # Returns true or false. def generated_protocol_buffer? return false unless PROTOBUF_EXTENSIONS.include?(extname) return false unless lines.count > 1 return lines.first(3).any? { |l| l.include?("Generated by the protocol buffer compiler. DO NOT EDIT!") } end # Internal: Is the blob a Javascript source file generated by the # Protocol Buffer compiler? # # Returns true or false. def generated_javascript_protocol_buffer? return false unless extname == ".js" return false unless lines.count > 6 return lines[5].include?("GENERATED CODE -- DO NOT EDIT!") end # Internal: Is the blob a TypeScript source file generated by the # Protocol Buffer compiler? # # Files generated by ts-proto typically start with something like this # (though the versions lines are optional): # # // Code generated by protoc-gen-ts_proto. DO NOT EDIT. # // versions: # // protoc-gen-ts_proto v1.181.2 # // protoc v5.28.2 # // source: hello.proto # # /* eslint-disable */ # # Returns true or false. def generated_typescript_protocol_buffer? return false unless extname == ".ts" return false unless lines.count > 4 return lines[0].include?("Code generated by protoc-gen-ts_proto. DO NOT EDIT.") end APACHE_THRIFT_EXTENSIONS = ['.rb', '.py', '.go', '.js', '.m', '.java', '.h', '.cc', '.cpp', '.php'] # Internal: Is the blob generated by Apache Thrift compiler? # # Returns true or false def generated_apache_thrift? return false unless APACHE_THRIFT_EXTENSIONS.include?(extname) return lines.first(6).any? { |l| l.include?("Autogenerated by Thrift Compiler") } end # Internal: Is the blob a C/C++ header generated by the Java JNI tool javah? # # Returns true or false. def generated_jni_header? return false unless extname == '.h' return false unless lines.count > 2 return lines[0].include?("/* DO NOT EDIT THIS FILE - it is machine generated */") && lines[1].include?("#include ") end # Internal: Is the blob part of node_modules/, which are not meant for humans in pull requests. # # Returns true or false. def node_modules? !!name.match(/node_modules\//) end # Internal: Is the blob part of the Go vendor/ tree, # not meant for humans in pull requests. # # Returns true or false. def go_vendor? !!name.match(/vendor\/((?!-)[-0-9A-Za-z]+(? 2 # VCR Cassettes have "recorded_with: VCR" in the second last line. return lines[-2].include?("recorded_with: VCR") end # Is this a generated ANTLR file? # # Returns true or false def generated_antlr? return false unless extname == '.g' return false unless lines.count > 2 return lines[1].include?("generated by Xtest") end # Internal: Is this a compiled C/C++ file from Cython? # # Cython-compiled C/C++ files typically contain: # /* Generated by Cython x.x.x on ... */ # on the first line. # # Return true or false def compiled_cython_file? return false unless ['.c', '.cpp'].include? extname return false unless lines.count > 1 return lines[0].include?("Generated by Cython") end # Internal: Is this a Pipenv lock file? # # Returns true or false. def pipenv_lock? !!name.match(/Pipfile\.lock/) end # Internal: Is this a Terraform lock file? # # Returns true or false. def terraform_lock? !!name.match(/(?:^|\/)\.terraform\.lock\.hcl$/) end # Internal: Is it a KiCAD or GFortran module file? # # KiCAD module files contain: # PCBNEW-LibModule-V1 yyyy-mm-dd h:mm:ss XM # on the first line. # # GFortran module files contain: # GFORTRAN module version 'x' created from # on the first line. # # Return true or false def generated_module? return false unless extname == '.mod' return false unless lines.count > 1 return lines[0].include?("PCBNEW-LibModule-V") || lines[0].include?("GFORTRAN module version '") end # Internal: Is this a metadata file from Unity3D? # # Unity3D Meta files start with: # fileFormatVersion: X # guid: XXXXXXXXXXXXXXX # # Return true or false def generated_unity3d_meta? return false unless extname == '.meta' return false unless lines.count > 1 return lines[0].include?("fileFormatVersion: ") end # Internal: Is this a Racc-generated file? # # A Racc-generated file contains: # # This file is automatically generated by Racc x.y.z # on the third line. # # Return true or false def generated_racc? return false unless extname == '.rb' return false unless lines.count > 2 return lines[2].start_with?("# This file is automatically generated by Racc") end # Internal: Is this a JFlex-generated file? # # A JFlex-generated file contains: # /* The following code was generated by JFlex x.y.z on d/at/e ti:me */ # on the first line. # # Return true or false def generated_jflex? return false unless extname == '.java' return false unless lines.count > 1 return lines[0].start_with?("/* The following code was generated by JFlex ") end # Internal: Is this a GrammarKit-generated file? # # A GrammarKit-generated file typically contain: # // This is a generated file. Not intended for manual editing. # on the first line. This is not always the case, as it's possible to # customize the class header. # # Return true or false def generated_grammarkit? return false unless extname == '.java' return false unless lines.count > 1 return lines[0].start_with?("// This is a generated file. Not intended for manual editing.") end # Internal: Is this a roxygen2-generated file? # # A roxygen2-generated file typically contain: # % Generated by roxygen2: do not edit by hand # on the first line. # # Return true or false def generated_roxygen2? return false unless extname == '.Rd' return false unless lines.count > 1 return lines[0].include?("% Generated by roxygen2: do not edit by hand") end # Internal: Is this a Jison-generated file? # # Jison-generated parsers typically contain: # /* parser generated by jison # on the first line. # # Jison-generated lexers typically contain: # /* generated by jison-lex # on the first line. # # Return true or false def generated_jison? return false unless extname == '.js' return false unless lines.count > 1 return lines[0].start_with?("/* parser generated by jison ") || lines[0].start_with?("/* generated by jison-lex ") end # Internal: Is this a protobuf/grpc-generated C++ file? # # A generated file contains: # // Generated by the gRPC C++ plugin. # on the first line. # # Return true or false def generated_grpc_cpp? return false unless %w{.cpp .hpp .h .cc}.include? extname return false unless lines.count > 1 return lines[0].start_with?("// Generated by the gRPC") end # Internal: Is this a generated Dart file? # # A google/protoc-plugin generated file contains: # // Generated code. Do not modify. # on the second line. # # A source_gen generated file may contain: # // GENERATED CODE - DO NOT MODIFY # on the first, second, or third line. # # Return true or false def generated_dart? return false unless extname == '.dart' return false unless lines.count > 1 return lines.first(3).any? { |l| l.downcase.match(/generated code\W{2,3}do not modify/) } end # Internal: Is the file a generated Perl/Pollution/Portability header file? # # Returns true or false. def generated_perl_ppport_header? return false unless name.match(/ppport\.h$/) return false unless lines.count > 10 return lines[8].include?("Automatically created by Devel::PPPort") end # Internal: Is this a relay-compiler generated graphql file? # # Return true or false def generated_graphql_relay? !!name.match(/__generated__\//) end # Internal: Is this a generated Game Maker Studio (2) metadata file? # # Return true or false def generated_gamemakerstudio? return false unless ['.yy', '.yyp'].include? extname return false unless lines.count > 3 return lines.first(3).join('').match?(/^\s*[\{\[]/) || lines[0] =~ /^\d\.\d\.\d.+\|\{/ end # Internal: Is this a generated GIMP C image file? # # GIMP saves C sources with one of two comment forms: # * `/* GIMP RGB C-Source image dump (.c) */` (C source export) # * `/* GIMP header image file format (RGB): .h */` (Header export) # # Return true or false def generated_gimp? return false unless ['.c', '.h'].include? extname return false unless lines.count > 0 return lines[0].match(/^\/\* GIMP [a-zA-Z0-9\- ]+ C\-Source image dump \(.+?\.c\) \*\//) || lines[0].match(/^\/\* GIMP header image file format \([a-zA-Z0-9\- ]+\)\: .+?\.h \*\//) end # Internal: Is this a generated Microsoft Visual Studio 6.0 build file? # # Return true or false def generated_visualstudio6? return false unless extname.downcase == '.dsp' lines.first(3).any? { |l| l.include? '# Microsoft Developer Studio Generated Build File' } end HAXE_EXTENSIONS = ['.js', '.py', '.lua', '.cpp', '.h', '.java', '.cs', '.php'] # Internal: Is this a generated Haxe-generated source file? # # Return true or false def generated_haxe? return false unless HAXE_EXTENSIONS.include?(extname) return lines.first(3).any? { |l| l.include?("Generated by Haxe") } end # Internal: Is this a generated HTML file? # # HTML documents generated by authoring tools often include a # a tag in the header of the form: # # # # Return true or false def generated_html? return false unless ['.html', '.htm', '.xhtml'].include? extname.downcase return false unless lines.count > 1 # Pkgdown return true if lines[0..1].any? do |line| line.match(//) end # Mandoc return true if lines.count > 2 && lines[2].start_with?('/i) end # HTML tag: matches = lines[0..30].join(' ').scan(/]++)>/i) return false if matches.empty? return matches.map {|x| extract_html_meta(x) }.any? do |attr| attr["name"].to_s.downcase == 'generator' && [attr["content"], attr["value"]].any? do |cv| !cv.nil? && cv.match(/^ ( org \s+ mode | j?latex2html | groff | makeinfo | texi2html | ronn ) \b /ix) end end end # Internal: Is this a generated jOOQ file? # # Return true or false def generated_jooq? return false unless extname.downcase == '.java' lines.first(2).any? { |l| l.include? 'This file is generated by jOOQ.' } end # Internal: Is this a generated Delphi Interface file for a type library? # # Delphi Type Library Import tool generates *_TLB.pas files based on .ridl files. # They are not meant to be altered by humans. # # Returns true or false def generated_pascal_tlb? !!name.match(/_tlb\.pas$/i) end # Internal: Is this a Sorbet RBI file generated by Tapioca? # # Tapioca generates non-human-editable .rbi files in several different # ways: # # 1. `tapioca gem` uses reflection to generate generic .rbi for gems. # 2. `tapioca dsl` uses DSL compilers to generate .rbi for modules/classes. # 3. `tapioca annotations` pulls .rbi from remote sources. # # All are marked with similar wording. # # Returns true or false def generated_sorbet_rbi? return false unless extname.downcase == '.rbi' return false unless lines.count >= 5 lines[0].match?(/^# typed:/) && lines[2].include?("DO NOT EDIT MANUALLY") && lines[4].match?(/^# Please (run|instead update this file by running) `bin\/tapioca/) end # Internal: Is it MySQL View Definition Format? # # MySQL View Definition Format (INI) files are generated by MySQL 5.7 and earlier. # They are not meant to be altered by humans. # # Returns true or false def generated_mysql_view_definition_format? return false unless extname.downcase == '.frm' return lines[0].include?("TYPE=VIEW") end # Internal: Is this an HTML coverage report? # # Tools like coverage.py generate HTML reports under an `htmlcov` directory. # # Returns true or false. def htmlcov? !!name.match(/(?:^|\/)htmlcov\//) end # Internal: Extract a Hash of name/content pairs from an HTML tag def extract_html_meta(match) (match.last.sub(/\/\Z/, "").strip.scan(/ (?<=^|\s) # Check for preceding whitespace (name|content|value) # Attribute names we're interested in \s* = \s* # Key-value separator # Attribute value ( "[^"]+" # name="value" | '[^']+' # name='value' | [^\s"']+ # name=value ) /ix)).map do |match| key = match[0].downcase val = match[1].gsub(/\A["']|["']\Z/, '') [key, val] end.select { |x| x.length == 2 }.to_h end # Internal: Is this a generated SQLx query file? # # SQLx is a Rust SQL library which generates `**/.sqlx/query-*.json` files # in offline mode (enabled by default). # # These are used to be able to compile a project without requiring # the development database to be online. # # Returns true or false. def generated_sqlx_query? !!name.match(/(?:^|\/)\.sqlx\/query-[a-f\d]{64}\.json$/) end end end ================================================ FILE: lib/linguist/generic.yml ================================================ # This is a list of file extensions considered too common to safely associate # with only the formats Linguist recognises. In addition to the stipulated # extension requirement, candidate matches must also satisfy a heuristic # (or some other strategy) in order to be identified as any one language. --- extensions: - ".1" - ".2" - ".3" - ".4" - ".5" - ".6" - ".7" - ".8" - ".9" - ".action" - ".alg" - ".app" - ".cmp" - ".msg" - ".resource" - ".sol" - ".srv" - ".stl" - ".tag" - ".url" ================================================ FILE: lib/linguist/grammars.rb ================================================ module Linguist module Grammars # Get the path to the directory containing the language grammar JSON files. # # Returns a String. def self.path File.expand_path("../../../grammars", __FILE__) end end end ================================================ FILE: lib/linguist/heuristics.rb ================================================ require 'yaml' module Linguist # A collection of simple heuristics that can be used to better analyze languages. class Heuristics HEURISTICS_CONSIDER_BYTES = 50 * 1024 # Public: Use heuristics to detect language of the blob. # # blob - An object that quacks like a blob. # possible_languages - Array of Language objects # # Examples # # Heuristics.call(FileBlob.new("path/to/file"), [ # Language["Ruby"], Language["Python"] # ]) # # Returns an Array of languages, or empty if none matched or were inconclusive. def self.call(blob, candidates) return [] if blob.symlink? self.load() data = blob.data[0...HEURISTICS_CONSIDER_BYTES] @heuristics.each do |heuristic| if heuristic.matches?(blob.name, candidates) return Array(heuristic.call(data)) end end [] # No heuristics matched rescue Regexp::TimeoutError [] # Return nothing if we have a bad regexp which leads to a timeout enforced by Regexp.timeout in Ruby 3.2 or later end # Public: Get all heuristic definitions # # Returns an Array of heuristic objects. def self.all self.load() @heuristics end # Internal: Load heuristics from 'heuristics.yml'. def self.load() if @heuristics.any? return end data = self.load_config named_patterns = data['named_patterns'].map { |k,v| [k, self.to_regex(v)] }.to_h data['disambiguations'].each do |disambiguation| exts = disambiguation['extensions'] rules = disambiguation['rules'] rules.map! do |rule| rule['pattern'] = self.parse_rule(named_patterns, rule) rule end @heuristics << new(exts, rules) end end def self.load_config YAML.load_file(File.expand_path("../heuristics.yml", __FILE__)) end def self.parse_rule(named_patterns, rule) if !rule['and'].nil? rules = rule['and'].map { |block| self.parse_rule(named_patterns, block) } return And.new(rules) elsif !rule['pattern'].nil? return self.to_regex(rule['pattern']) elsif !rule['negative_pattern'].nil? pat = self.to_regex(rule['negative_pattern']) return NegativePattern.new(pat) elsif !rule['named_pattern'].nil? return named_patterns[rule['named_pattern']] else return AlwaysMatch.new() end end # Internal: Converts a string or array of strings to regexp # # str: string or array of strings. If it is an array of strings, # Regexp.union will be used. def self.to_regex(str) if str.kind_of?(Array) Regexp.union(str.map { |s| Regexp.new(s) }) else Regexp.new(str) end end # Internal: Array of defined heuristics @heuristics = [] # Internal def initialize(exts, rules) @exts = exts @rules = rules end # Internal: Return the heuristic's target extensions def extensions @exts end # Internal: Return the heuristic's candidate languages def languages @rules.map do |rule| [rule['language']].flatten(2).map { |name| Language[name] } end.flatten.uniq end # Internal: Check if this heuristic matches the candidate filenames or # languages. def matches?(filename, candidates) filename = filename.downcase candidates = candidates.compact.map(&:name) @exts.any? { |ext| filename.end_with?(ext) } end # Internal: Perform the heuristic def call(data) matched = @rules.find do |rule| rule['pattern'].match?(data) end if !matched.nil? languages = matched['language'] if languages.is_a?(Array) languages.map{ |l| Language[l] } else Language[languages] end end end end class And def initialize(pats) @pats = pats end def match?(input) return @pats.all? { |pat| pat.match?(input) } end end class AlwaysMatch def match?(input) return true end end class NegativePattern def initialize(pat) @pat = pat end def match?(input) return !@pat.match?(input) end end end ================================================ FILE: lib/linguist/heuristics.yml ================================================ # A collection of simple regexp-based rules that can be applied to content # to disambiguate languages with the same file extension. # # There are two top-level keys: disambiguations and named_patterns. # # disambiguations - a list of disambiguation rules, one for each # extension or group of extensions. # extensions - an array of file extensions that this block applies to. # rules - list of rules that are applied in order to the content # of a file with a matching extension. Rules are evaluated # until one of them matches. If none matches, no language # is returned. # language - Language to be returned if the rule matches. # pattern - Ruby-compatible regular expression that makes the rule # match. If no pattern is specified, the rule always matches. # Pattern can be a string with a single regular expression # or an array of strings that will be merged in a single # regular expression (with union). # and - An and block merges multiple rules and checks that all of # them must match. # negative_pattern - Same as pattern, but checks for absence of matches. # named_pattern - A pattern can be reused by specifying it in the # named_patterns section and referencing it here by its # key. # named_patterns - Key-value map of reusable named patterns. # # Please keep this list alphabetized. # --- disambiguations: - extensions: ['.1', '.2', '.3', '.4', '.5', '.6', '.7', '.8', '.9'] rules: - language: Roff Manpage and: - named_pattern: mdoc-date - named_pattern: mdoc-title - named_pattern: mdoc-heading - language: Roff Manpage and: - named_pattern: man-title - named_pattern: man-heading - language: Roff pattern: '^\.(?:[A-Za-z]{2}(?:\s|$)|\\")' - language: Text - extensions: ['.1in', '.1m', '.1x', '.3in', '.3m', '.3p', '.3pm', '.3qt', '.3x', '.man', '.mdoc'] rules: - language: Roff Manpage and: - named_pattern: mdoc-date - named_pattern: mdoc-title - named_pattern: mdoc-heading - language: Roff Manpage and: - named_pattern: man-title - named_pattern: man-heading - language: Roff - extensions: ['.action'] rules: - language: ROS Interface and: - pattern: '(?i)^[a-z]\w*(?:\/[a-z]\w*)?(?:<=\d+)?(?:\[(?:<=\d+)?\])?\s+\w+\b' - pattern: '^---\s*$' - negative_pattern: '^\s*[^\s@#\w-]' - extensions: ['.al'] rules: # AL pattern source from https://github.com/microsoft/AL/blob/master/grammar/alsyntax.tmlanguage - keyword.other.applicationobject.al - language: AL and: - pattern: '\b(?i:(CODEUNIT|PAGE|PAGEEXTENSION|PAGECUSTOMIZATION|DOTNET|ENUM|ENUMEXTENSION|VALUE|QUERY|REPORT|TABLE|TABLEEXTENSION|XMLPORT|PROFILE|CONTROLADDIN|REPORTEXTENSION|INTERFACE|PERMISSIONSET|PERMISSIONSETEXTENSION|ENTITLEMENT))\b' # Open-ended fallback to Perl AutoLoader - language: Perl - extensions: ['.alg'] rules: - language: ALGOL pattern: # ALGOL 60 comments - '(?i)^comment\b.*(;|comment)' # ALGOL 68 comments - '^#[^#\r\n]+#$' # ALGOL 60/68 keywords - '(?i)\b(integer|real|boolean|string)\b\s+\w+\s*:=\s*' - '(?i)^begin[\s\S]*^end' - extensions: ['.app'] rules: - language: Erlang pattern: '^\{\s*(?:application|''application'')\s*,\s*(?:[a-z]+[\w@]*|''[^'']+'')\s*,\s*\[(?:.|[\r\n])*\]\s*\}\.[ \t]*$' - extensions: ['.as'] rules: - language: ActionScript pattern: '^\s*(?:package(?:\s+[\w.]+)?\s+(?:\{|$)|import\s+[\w.*]+\s*;|(?:intrinsic\s+)class\s+[\w<>.]+|\s+class\s+extends\s+[\w<>.]+|(?:(?:public|protected|private|static)\s+)*(?:(?:var|const|local)\s+\w+\s*:\s*[\w<>.]+(?:\s*=.*)?\s*;|function\s+\w+\s*\((?:\s*\w+\s*:\s*[\w<>.]+\s*(,\s*\w+\s*:\s*[\w<>.]+\s*)*)?\)))' - extensions: ['.asc'] rules: - language: Public Key pattern: '^(----[- ]BEGIN|ssh-(rsa|dss)) ' - language: AsciiDoc pattern: '^[=-]+\s|\{\{[A-Za-z]' - language: AGS Script pattern: '^(\/\/.+|((import|export)\s+)?(function|int|float|char)\s+((room|repeatedly|on|game)_)?([A-Za-z]+[A-Za-z_0-9]+)\s*[;\(])' - extensions: ['.asm'] rules: - language: Assembly pattern: '(?i)mov\s+[^\s]{2,},' - language: Motorola 68K Assembly named_pattern: m68k - extensions: ['.asy'] rules: - language: LTspice Symbol pattern: '^SymbolType[ \t]' - language: Asymptote - extensions: ['.bas'] rules: - language: B4X pattern: '\A\W{0,3}(?:.*(?:\r?\n|\r)){0,9}B4(?:J|A|R|i)=true' - language: FreeBASIC named_pattern: freebasic - language: FreeBASIC and: - pattern: '(?i)^[ \t]*return ' - negative_pattern: '(?i)[ \t]*gosub ' - language: BASIC pattern: '\A\s*\d' - language: QuickBASIC named_pattern: quickbasic - language: VBA named_pattern: vba - language: Visual Basic 6.0 named_pattern: vb-module - extensions: ['.bb'] rules: - language: BlitzBasic pattern: '(<^\s*; |End Function)' - language: BitBake pattern: '^(# |include|require|inherit)\b' - language: Clojure pattern: '\((def|defn|defmacro|let)\s' - extensions: ['.bf'] rules: - language: Beef pattern: '(?-m)^\s*using\s+(System|Beefy)(\.(.*))?;\s*$' - language: HyPhy pattern: - '(?-m)^\s*#include\s+".*";\s*$' - '\sfprintf\s*\(' - language: Brainfuck pattern: '(>\+>|>\+<)' - extensions: ['.bi'] rules: - language: FreeBASIC named_pattern: freebasic - language: FreeBASIC and: - pattern: '(?i)^[ \t]*return ' - negative_pattern: '(?i)[ \t]*gosub ' - language: QuickBASIC named_pattern: quickbasic - extensions: ['.bs'] rules: - language: Bikeshed pattern: '^(?i:\r\n]*>' - language: BrighterScript pattern: - (?i:^\s*(?:sub\s*\w+\(.*?\))|(?::\s*sub\(.*?\))$) - (?i:^\s*(end\ssub)$) - (?i:^\s*(?:function\s*\w+\(.*?\)\s*as\s*\w*)|(?::\s*function\(.*?\)\s*as\s*\w*)$) - (?i:^\s*(end\sfunction)$) - language: Bluespec BH pattern: '^package\s+[A-Za-z_][A-Za-z0-9_'']*(?:\s*\(|\s+where)' - extensions: ['.bst'] rules: - language: BibTeX Style pattern: 'ENTRY\s*\{' - language: BuildStream - extensions: ['.builds'] rules: - language: XML pattern: '^(\s*)(?i:\s+\{' - language: Eiffel pattern: - '^\s*\w+\s*(?:,\s*\w+)*[:]\s*\w+\s' - '^\s*\w+\s*(?:\(\s*\w+[:][^)]+\))?(?:[:]\s*\w+)?(?:--.+\s+)*\s+(?:do|local)\s' - '^\s*(?:across|deferred|elseif|ensure|feature|from|inherit|inspect|invariant|note|once|require|undefine|variant|when)\s*$' - language: Euphoria named_pattern: euphoria - extensions: ['.ecl'] rules: - language: ECLiPSe pattern: '^[^#]+:-' - language: ECL pattern: ':=' - extensions: ['.es'] rules: - language: Erlang pattern: '^\s*(?:%%|main\s*\(.*?\)\s*->)' - language: JavaScript pattern: '\/\/|["'']use strict["'']|export\s+default\s|\/\*(?:.|[\r\n])*?\*\/' - extensions: ['.ex'] rules: - language: Elixir pattern: - '^\s*@moduledoc\s' - '^\s*(?:cond|import|quote|unless)\s' - '^\s*def(?:exception|impl|macro|module|protocol)[(\s]' - language: Euphoria named_pattern: euphoria - extensions: ['.f'] rules: - language: Forth pattern: '^: ' - language: Filebench WML pattern: 'flowop' - language: Fortran named_pattern: fortran - extensions: ['.for'] rules: - language: Forth pattern: '^: ' - language: Fortran named_pattern: fortran - extensions: ['.fr'] rules: - language: Forth pattern: '^(: |also |new-device|previous )' - language: Frege pattern: '^\s*(import|module|package|data|type) ' - language: Text - extensions: ['.frm'] rules: - language: VBA and: - named_pattern: vb-form - pattern: '^\s*Begin\s+\{[0-9A-Z\-]*\}\s?' - language: Visual Basic 6.0 and: - named_pattern: vb-form - pattern: '^\s*Begin\s+VB\.Form\s+' - language: INI pattern: '\ATYPE=VIEW' - extensions: ['.fs'] rules: - language: Forth pattern: '^(: |new-device)' - language: 'F#' pattern: '^\s*(#light|import|let|module|namespace|open|type)' - language: GLSL pattern: '^\s*(#version|precision|uniform|varying|vec[234])' - language: Filterscript pattern: '#include|#pragma\s+(rs|version)|__attribute__' - extensions: ['.ftl'] rules: - language: FreeMarker pattern: '^(?:<|[a-zA-Z-][a-zA-Z0-9_-]+[ \t]+\w)|\$\{\w+[^\r\n]*?\}|^[ \t]*(?:<#--.*?-->|<#(?:[a-z]+)\s[^>]*>.*?|\[#--.*?--\]|\[#(?:[a-z]+)\s[^\]]*\].*?\[#(?:[a-z]+)\])' - language: Fluent pattern: '^-?[a-zA-Z][a-zA-Z0-9_-]* *=|\{\$-?[a-zA-Z][-\w]*(?:\.[a-zA-Z][-\w]*)?\}' - extensions: ['.g'] rules: - language: GAP pattern: '\s*(Declare|BindGlobal|KeyDependentOperation|Install(Method|GlobalFunction)|SetPackageInfo)' - language: G-code pattern: '^[MG][0-9]+(?:\r?\n|\r)' - extensions: ['.gd'] rules: - language: GAP pattern: '\s*(Declare|BindGlobal|KeyDependentOperation)' - language: GDScript pattern: '\s*(extends|var|const|enum|func|class|signal|tool|yield|assert|onready)' - extensions: ['.gml'] rules: - language: XML pattern: '(?i:^\s*(<\?xml|xmlns))' - language: Graph Modeling Language pattern: '(?i:^\s*(graph|node)\s+\[$)' - language: Gerber Image pattern: '^[DGMT][0-9]{2}\*$' - language: Game Maker Language - extensions: ['.gs'] rules: - language: GLSL pattern: '^#version\s+[0-9]+\b' - language: Gosu pattern: '^uses (java|gw)\.' - language: Genie pattern: '^\[indent=[0-9]+\]' - extensions: ['.gsc'] rules: - language: GSC named_pattern: gsc - extensions: ['.gsh'] rules: - language: GSC named_pattern: gsc - extensions: ['.gts'] rules: - language: Gerber Image pattern: '^G0.' - language: Glimmer TS negative_pattern: '^G0.' - extensions: ['.h'] rules: - language: Objective-C named_pattern: objectivec - language: C++ named_pattern: cpp - language: C - extensions: ['.hh'] rules: - language: Hack pattern: '<\?hh' - extensions: ['.html'] rules: - language: Ecmarkup pattern: ')' - language: HTML - extensions: ['.i'] rules: - language: Motorola 68K Assembly named_pattern: m68k - language: SWIG pattern: '^[ \t]*%[a-z_]+\b|^%[{}]$' - language: Assembly pattern: - '(?i)mov\s+[^\s]+,' - '^\s+(i?)db\s+[a-z\d]' - extensions: ['.ice'] rules: - language: JSON named_pattern: json - language: Slice - extensions: ['.inc'] rules: - language: Motorola 68K Assembly named_pattern: m68k - language: PHP pattern: '^<\?(?:php)?' - language: SourcePawn pattern: - '^public\s+(?:SharedPlugin(?:\s+|:)__pl_\w+\s*=(?:\s*\{)?|(?:void\s+)?__pl_\w+_SetNTVOptional\(\)(?:\s*\{)?)' - '^methodmap\s+\w+\s+<\s+\w+' - '^\s*MarkNativeAsOptional\s*\(' - language: NASL pattern: - '^\s*include\s*\(\s*(?:"|'')[\\/\w\-\.:\s]+\.(?:nasl|inc)\s*(?:"|'')\s*\)\s*;' - '^\s*(?:global|local)_var\s+(?:\w+(?:\s*=\s*[\w\-"'']+)?\s*)(?:,\s*\w+(?:\s*=\s*[\w\-"'']+)?\s*)*\s*;' - '^\s*namespace\s+\w+\s*\{' - '^\s*object\s+\w+\s*(?:extends\s+\w+(?:::\w+)?)?\s*\{' - '^\s*(?:public\s+|private\s+|\s*)function\s+\w+\s*\([\w\s,]*\)\s*\{' - language: POV-Ray SDL pattern: '^\s*#(declare|local|macro|while)\s' - language: Pascal pattern: - '(?i:^\s*\{\$(?:mode|ifdef|undef|define)[ ]+[a-z0-9_]+\})' - '^\s*end[.;]\s*$' - language: BitBake pattern: '^inherit(\s+[\w.-]+)+\s*$' - language: Assembly pattern: - '^(?i)[^"m]*mov\s+[^\s]+,' - '^\s+(?i)db\s+[a-z\d]' - extensions: ['.json'] rules: - language: OASv2-json pattern: '"swagger":\s?"2.[0-9.]+"' - language: OASv3-json pattern: '"openapi":\s?"3.[0-9.]+"' - language: JSON - extensions: ['.k'] rules: - language: KCL pattern: - '^schema [A-Za-z0-9_-]+' - '^\}$' - '\s*\}\s*' - language: KFramework pattern: - '^requires\s+"[^"]+"$' - '^syntax\s+\w+\s+::=.*' - '^endmodule$' - extensions: ['.l'] rules: - language: Common Lisp pattern: '\(def(un|macro)\s' - language: Lex pattern: '^(%[%{}]xs|<.*>)' - language: Roff pattern: '^\.[A-Za-z]{2}(\s|$)' - language: PicoLisp pattern: '^\((de|class|rel|code|data|must)\s' - extensions: ['.lean'] rules: - language: Lean pattern: '^import [a-z]' - language: Lean 4 pattern: '^import [A-Z]' - extensions: ['.lp'] rules: - language: Lambdapi pattern: '(?:^|\s)symbol(?:$|\s)|(?:^|\s)rule(?:$|\s)' - language: Linear Programming pattern: '(?i)^\s*(?:minimize|minimum|min|maximize|maximum|max)(?:\s+multi-objectives)?\s*$' - language: Answer Set Programming pattern: - '^\s*#(?:include|const|program|script|show|minimize|maximize|heuristic|project|edge|theory|defined)\b' - '^\s*(?:[A-Za-z_]\w*(?:\([^)]*\))?\s*:-|:-)\s[^.]*\.' - '^\s*[a-z_][a-zA-Z0-9_]*(?:\([^)]*\))?\s*\.\s*$' - extensions: ['.ls'] rules: - language: LoomScript pattern: '^\s*package\s*[\w\.\/\*\s]*\s*\{' - language: LiveScript - extensions: ['.lsp', '.lisp'] rules: - language: Common Lisp pattern: '^\s*\((?i:defun|in-package|defpackage) ' - language: NewLisp pattern: '^\s*\(define ' - extensions: ['.m'] rules: - language: Objective-C named_pattern: objectivec - language: Mercury pattern: ':- module' - language: MUF pattern: '^: ' - language: M pattern: '^\s*;' - language: Wolfram Language and: - pattern: '\(\*' - pattern: '\*\)$' - language: MATLAB pattern: '^\s*%' - language: Limbo pattern: '^\w+\s*:\s*module\s*\{' - extensions: ['.m4'] rules: - language: M4Sugar pattern: - 'AC_DEFUN|AC_PREREQ|AC_INIT' - '^_?m4_' - language: 'M4' - extensions: ['.mask'] rules: - language: Unity3D Asset pattern: 'tag:unity3d.com' - extensions: ['.mc'] rules: - language: Win32 Message File pattern: '(?i)^[ \t]*(\/\*\s*)?MessageId=|^\.$' - language: M4 pattern: '^dnl|^divert\((?:-?\d+)?\)|^\w+\(`[^\r\n]*?''[),]' - language: Monkey C pattern: '\b(?:using|module|function|class|var)\s+\w' - extensions: ['.md'] rules: - language: Markdown pattern: - '(^[-A-Za-z0-9=#!\*\[|>])|<\/' - '\A\z' - language: GCC Machine Description pattern: '^(;;|\(define_)' - language: Markdown - extensions: ['.ml'] rules: - language: OCaml pattern: '(^\s*module)|let rec |match\s+(\S+\s)+with' - language: Standard ML pattern: '=> |case\s+(\S+\s)+of' - extensions: ['.mod'] rules: - language: XML pattern: '\s*$)' - language: OpenStep Property List - extensions: ['.plt'] rules: - language: Prolog pattern: '^\s*:-' - extensions: ['.pm'] rules: - language: Perl and: - negative_pattern: '^\s*use\s+v6\b' - named_pattern: perl - language: Raku named_pattern: raku - language: X PixMap pattern: '^\s*\/\* XPM \*\/' - extensions: ['.pod'] rules: - language: Pod 6 pattern: '^[\s&&[^\r\n]]*=(comment|begin pod|begin para|item\d+)' - language: Pod - extensions: ['.pp'] rules: - language: Pascal pattern: '^\s*end[.;]' - language: Puppet pattern: '^\s+\w+\s+=>\s' - extensions: ['.pro'] rules: - language: Proguard pattern: '^-(include\b.*\.pro$|keep\b|keepclassmembers\b|keepattributes\b)' - language: Prolog pattern: '^[^\[#]+:-' - language: INI pattern: 'last_client=' - language: QMake and: - pattern: HEADERS - pattern: SOURCES - language: IDL pattern: '^\s*(?i:function|pro|compile_opt) \w[ \w,:]*$' - extensions: ['.properties'] rules: - language: INI and: - named_pattern: key_equals_value - pattern: '^[;\[]' - language: Java Properties and: - named_pattern: key_equals_value - pattern: '^[#!]' - language: INI named_pattern: key_equals_value - language: Java Properties pattern: '^[^#!][^:]*:' - extensions: ['.q'] rules: - language: q pattern: '((?i:[A-Z.][\w.]*:\{)|^\\(cd?|d|l|p|ts?) )' - language: HiveQL pattern: '(?i:SELECT\s+[\w*,]+\s+FROM|(CREATE|ALTER|DROP)\s(DATABASE|SCHEMA|TABLE))' - extensions: ['.qs'] rules: - language: Q# pattern: '^((\/{2,3})?\s*(namespace|operation)\b)' - language: Qt Script pattern: '(\w+\.prototype\.\w+|===|\bvar\b)' - extensions: ['.r'] rules: - language: Rebol pattern: '(?i:\bRebol\b)' - language: Rez pattern: '(#include\s+["<](Types\.r|Carbon\/Carbon\.r)[">])|((resource|data|type)\s+''[A-Za-z0-9]{4}''\s+((\(.*\)\s+){0,1}){)' - language: R pattern: '<-|^\s*#' - extensions: ['.re'] rules: - language: Reason pattern: - '^\s*module\s+type\s' - '^\s*(?:include|open)\s+\w+\s*;\s*$' - '^\s*let\s+(?:module\s\w+\s*=\s*\{|\w+:\s+.*=.*;\s*$)' - language: C++ pattern: - '^\s*#(?:(?:if|ifdef|define|pragma)\s+\w|\s*include\s+<[^>]+>)' - '^\s*template\s*<' - extensions: ['.res'] rules: - language: ReScript pattern: - '^\s*(let|module|type)\s+\w*\s+=\s+' - '^\s*(?:include|open)\s+\w+\s*$' - extensions: ['.resource'] rules: - language: RobotFramework pattern: - '^\*{3} (Settings|Variables|Keywords) \*{3}$' - extensions: ['.rno'] rules: - language: RUNOFF pattern: '(?i:^\.!|^\f|\f$|^\.end lit(?:eral)?\b|^\.[a-zA-Z].*?;\.[a-zA-Z](?:[; \t])|\^\*[^\s*][^*]*\\\*(?:$|\s)|^\.c;[ \t]*\w+)' - language: Roff pattern: '^\.\\" ' - extensions: ['.rpy'] rules: - language: Python pattern: '^(import|from|class|def)\s' - language: "Ren'Py" - extensions: ['.rs'] rules: - language: Rust pattern: '^(use |fn |mod |pub |macro_rules|impl|#!?\[)' - language: RenderScript pattern: '#include|#pragma\s+(rs|version)|__attribute__' - language: XML pattern: '^\s*<\?xml' - extensions: ['.s'] rules: - language: Unix Assembly pattern: '(?i:mov[lq]?)\s+[%\$]' - language: Assembly pattern: '(?i:mov)\s+[^\s%]{2,},' - language: Motorola 68K Assembly named_pattern: m68k - extensions: ['.sc'] rules: - language: SuperCollider pattern: '(?i:\^(this|super)\.|^\s*~\w+\s*=\.)' - language: Scala pattern: '(^\s*import (scala|java)\.|^\s*class\b)' - extensions: ['.scd'] rules: - language: SuperCollider pattern: '(?i:\^(this|super)\.|^\s*(~\w+\s*=\.|SynthDef\b))' - language: Markdown # Markdown syntax for scdoc pattern: '^#+\s+(NAME|SYNOPSIS|DESCRIPTION)' - extensions: ['.scm'] rules: - language: Tree-sitter Query pattern: - '\(#[\w-]+[!\?]' - '(?:[\)\]]\s*[\*\+\?](?:\s|$))' - '(?:^\s*\w+:\s*[\(\[\"])' - '\(#(?:set!|(?:not-)?(?:any-of|match)\?)' - '@[\w.-]+(?:\)\s|$)' negative_pattern: - '\([+\-:<>\/=~\)]' - language: Scheme pattern: - '(?:''[\(\*#]|\w->\w|\.\.\.[\s\)]|\([+\-:<>\/=~\)]|~>|[#`]\(|#:\w)' - '^\s*\((?:define\*?|import|library|lambda)' negative_pattern: - '\(#[\w-]+[!\?]' - '(?:[\)\]]\s*[\*\+\?](?:\s|$))' - '@[\w.-]+(?:\)\s|$)' - extensions: ['.sol'] rules: - language: Solidity pattern: '\bpragma\s+solidity\b|\b(?:abstract\s+)?contract\s+[a-zA-Z$_][a-zA-Z0-9$_]*(?:\s+is\s+(?:[a-zA-Z0-9$_][^\{]*?)?)?\s*\{' - language: Gerber Image pattern: '^[DGMT][0-9]{2}\*(?:\r?\n|\r)' - extensions: ['.sql'] rules: # Postgres - language: PLpgSQL pattern: '(?i:^\\i\b|AS\s+\$\$|LANGUAGE\s+''?plpgsql''?|BEGIN(\s+WORK)?\s*;)' # IBM db2 - language: SQLPL pattern: '(?i:ALTER\s+MODULE|MODE\s+DB2SQL|\bSYS(CAT|PROC)\.|ASSOCIATE\s+RESULT\s+SET|\bEND!\s*$)' # Oracle - language: PLSQL pattern: '(?i:\$\$PLSQL_|XMLTYPE|systimestamp|\.nextval|CONNECT\s+BY|AUTHID\s+(DEFINER|CURRENT_USER)|constructor\W+function)' # T-SQL - language: TSQL pattern: '(?i:^\s*GO\b|BEGIN(\s+TRY|\s+CATCH)|OUTPUT\s+INSERTED|DECLARE\s+@|\[dbo\])' - language: SQL - extensions: ['.srt'] rules: - language: SubRip Text pattern: '^(\d{2}:\d{2}:\d{2},\d{3})\s*(-->)\s*(\d{2}:\d{2}:\d{2},\d{3})$' - extensions: ['.srv'] rules: - language: ROS Interface and: - pattern: '(?i)^[a-z]\w*(?:\/[a-z]\w*)?(?:<=\d+)?(?:\[(?:<=\d+)?\])?\s+\w+\b' - pattern: '^---\s*$' - negative_pattern: '^\s*[^\s@#\w-]' - extensions: ['.st'] rules: - language: StringTemplate pattern: '\$\w+[($]|.!\s*.+?\s*!.||\[!\s*.+?\s*!\]|\{!\s*.+?\s*!\}' - language: Smalltalk pattern: '\A\s*[\[{(^"''\w#]|[a-zA-Z_]\w*\s*:=\s*[a-zA-Z_]\w*|class\s*>>\s*[a-zA-Z_]\w*|^[a-zA-Z_]\w*\s+[a-zA-Z_]\w*:|^Class\s*\{|if(?:True|False):\s*\[' - extensions: ['.star'] rules: - language: STAR pattern: '^loop_\s*$' - language: Starlark - extensions: ['.stl'] rules: - language: STL pattern: '\A\s*solid(?:$|\s)[\s\S]*^endsolid(?:$|\s)' - extensions: ['.svx'] rules: - language: Survex data pattern: '\A(;|\*[^*]+$)' - language: mdsvex - extensions: ['.sw'] rules: - language: Sway pattern: '^\s*(?:(?:abi|dep|fn|impl|mod|pub|trait)\s|#\[)' - language: XML pattern: '^\s*<\?xml\s+version' - extensions: ['.t'] rules: - language: Perl and: - negative_pattern: '^\s*use\s+v6\b' - named_pattern: perl - language: Raku pattern: '^\s*(?:use\s+v6\b|\bmodule\b|\bmy\s+class\b)' - language: Turing pattern: '^\s*%[ \t]+|^\s*var\s+\w+(\s*:\s*\w+)?\s*:=\s*\w+' - extensions: ['.tact'] rules: - language: JSON pattern: '\A\s*\{\"' - language: Tact - extensions: ['.tag'] rules: - language: Java Server Pages pattern: '<%[@!=\s]?\s*(taglib|tag|include|attribute|variable)\s' - extensions: ['.tl'] rules: - language: Teal and: - pattern: '--.*' - pattern: '\b(local|function|end|record|interface|enum)\b' - language: Type Language - extensions: ['.tlv'] rules: - language: TL-Verilog pattern: '^\\.{0,10}TLV_version' - extensions: ['.toc'] rules: - language: World of Warcraft Addon Data pattern: '^## |@no-lib-strip@' - language: TeX pattern: '^\\(contentsline|defcounter|beamer|boolfalse)' - extensions: ['.tpl'] rules: - language: Go Template pattern: '\{\{-?\s*(\`?\"\\?\"?|\/\*\s|\w*)\b' - language: Smarty pattern: '(? ' # Heads up - we don't usually write heuristics like this (with no regex match) - language: Scilab - extensions: ['.tsx'] rules: - language: XML pattern: '(?i:^\s*<\?xml\s+version)' - language: TSX - extensions: ['.txt'] rules: # The following RegExp is simply a collapsed and simplified form of the # VIM_MODELINE pattern in `./lib/linguist/strategy/modeline.rb`. - language: Vim Help File pattern: '(?:(?:^|[ \t])(?:vi|Vi(?=m))(?:m[<=>]?[0-9]+|m)?|[ \t]ex)(?=:(?=[ \t]*set?[ \t][^\r\n:]+:)|:(?![ \t]*set?[ \t]))(?:(?:[ \t]*:[ \t]*|[ \t])\w*(?:[ \t]*=(?:[^\\\s]|\\.)*)?)*[ \t:](?:filetype|ft|syntax)[ \t]*=(help)(?=$|\s|:)' - language: Hosts File pattern: |- (?xi) ^ # IPv4 address (? (?!\.) (?:\.? (?: 25[0-5] # 250-255 | 2[0-4]\d # 200-249 | 1\d\d # 100-199 | [1-9]?\d # 0-99 )\b ){4}) # CIDR notation: /[0-32] (?/(3[0-2]|[12]?\d)\b)? # Domains list (? [ \t]+ \w[-\w]* (?:\.\w[-\w]*)* (? (?: [Aa]d[Bb]lock (?:[ \t][Pp]lus)? | u[Bb]lock (?:[ \t][Oo]rigin)? | [Aa]d[Gg]uard ) (?:[ \t] \d+(?:\.\d+)*+)? ) (?: [ \t]?;[ \t]? \g )*+ \] # HACK: This is a contrived use of heuristics needed to address # an unusual edge-case. See https://git.io/JULye for discussion. - language: Text - extensions: ['.typ'] rules: - language: Typst pattern: '^#(import|show|let|set)' - language: XML - extensions: ['.url'] rules: - language: INI pattern: '^\[InternetShortcut\](?:\r?\n|\r)([^\s\[][^\r\n]*(?:\r?\n|\r)){0,20}URL=' - extensions: ['.v'] rules: - language: Rocq Prover pattern: '(?:^|\s)(?:Proof|Qed)\.(?:$|\s)|(?:^|\s)Require[ \t]+(Import|Export)\s' - language: Verilog pattern: '^[ \t]*module\s+[^\s()]+\s*\#?\(|^[ \t]*`(?:define|ifdef|ifndef|include|timescale|pragma)|^[ \t]*always[ \t]*@|^[ \t]*initial[ \t]*(begin|@)' - language: V pattern: '\$(?:if|else)[ \t]|^[ \t]*fn\s+[^\s()]+\(.*?\).*?\{|^[ \t]*for\s*\{' - extensions: ['.vba'] rules: - language: Vim Script pattern: '^UseVimball' - language: VBA - extensions: ['.vcf'] rules: - language: TSV pattern: '\A##fileformat=VCF' - language: vCard pattern: '\ABEGIN:VCARD' - extensions: ['.w'] rules: - language: OpenEdge ABL pattern: '&ANALYZE-SUSPEND _UIB-CODE-BLOCK _CUSTOM _DEFINITIONS' - language: CWeb pattern: '^@(<|\w+\.)' - extensions: ['.x'] rules: - language: DirectX 3D File pattern: '^xof 030(2|3)(?:txt|bin|tzip|bzip)\b' - language: RPC pattern: '\b(program|version)\s+\w+\s*\{|\bunion\s+\w+\s+switch\s*\(' - language: Logos pattern: '^%(end|ctor|hook|group)\b' - language: Linker Script pattern: 'OUTPUT_ARCH\(|OUTPUT_FORMAT\(|SECTIONS' - extensions: ['.yaml', '.yml'] rules: - language: MiniYAML pattern: '^\t+.*?[^\s:].*?:' negative_pattern: '---' - language: OASv2-yaml pattern: 'swagger:\s?''?"?2.[0-9.]+''?"?' - language: OASv3-yaml pattern: 'openapi:\s?''?"?3.[0-9.]+''?"?' - language: YAML - extensions: ['.yy'] rules: - language: JSON named_pattern: json - language: Yacc named_patterns: cpp: - '^\s*#\s*include <(cstdint|string|vector|map|list|array|bitset|queue|stack|forward_list|unordered_map|unordered_set|(i|o|io)stream)>' - '^\s*template\s*<' - '^[ \t]*(try|constexpr)' - '^[ \t]*catch\s*\(' - '^[ \t]*(class|(using[ \t]+)?namespace)\s+\w+' - '^[ \t]*(private|public|protected):$' - '__has_cpp_attribute|__cplusplus >' - 'std::\w+' euphoria: - '^\s*namespace\s' - '^\s*(?:public\s+)?include\s' - '^\s*(?:(?:public|export|global)\s+)?(?:atom|constant|enum|function|integer|object|procedure|sequence|type)\s' fortran: '^(?i:[c*][^abd-z]| (subroutine|program|end|data)\s|\s*!)' freebasic: - '(?i)^[ \t]*#(?:define|endif|endmacro|ifn?def|include|lang|macro|pragma)(?:$|\s)' - '(?i)^[ \t]*dim( shared)? [a-z_][a-z0-9_]* as [a-z_][a-z0-9_]* ptr' gsc: - '^\s*#\s*(?:using|insert|include|define|namespace)[ \t]+\w' - '^\s*((?:autoexec|private)\s+){0,2}function\s+((?:autoexec|private)\s+){0,2}\w+\s*\(' - '\b(?:level|self)[ \t]+thread[ \t]+(?:\[\[[ \t]*(\w+\.)+[ \t]*\]\]|\w+)[ \t]*\([^\r\n\)]*\)[ \t]*;' - '^[ \t]*#[ \t]*(?:precache|using_animtree)[ \t]*\(' json: '\A\s*[{\[]' key_equals_value: '^[^#!;][^=]*=' m68k: - '(?im)\bmoveq(?:\.l)?\s+#(?:\$-?[0-9a-f]{1,3}|%[0-1]{1,8}|-?[0-9]{1,3}),\s*d[0-7]\b' - '(?im)^\s*move(?:\.[bwl])?\s+(?:sr|usp),\s*[^\s]+' - '(?im)^\s*move\.[bwl]\s+.*\b[ad]\d' - '(?im)^\s*movem\.[bwl]\b' - '(?im)^\s*move[mp](?:\.[wl])?\b' - '(?im)^\s*btst\b' - '(?im)^\s*dbra\b' man-heading: '^[.''][ \t]*SH +(?:[^"\s]+|"[^"\s]+)' man-title: '^[.''][ \t]*TH +(?:[^"\s]+|"[^"]+") +"?(?:[1-9]|@[^\s@]+@)' mdoc-date: '^[.''][ \t]*Dd +(?:[^"\s]+|"[^"]+")' mdoc-heading: '^[.''][ \t]*Sh +(?:[^"\s]|"[^"]+")' mdoc-title: '^[.''][ \t]*Dt +(?:[^"\s]+|"[^"]+") +"?(?:[1-9]|@[^\s@]+@)' objectivec: '^\s*(@(interface|class|protocol|property|end|synchronised|selector|implementation)\b|#import\s+.+\.h[">])' perl: - '\buse\s+(?:strict\b|v?5\b)' - '^\s*use\s+(?:constant|overload)\b' - '^\s*(?:\*|(?:our\s*)?@)EXPORT\s*=' - '^\s*package\s+[^\W\d]\w*(?:::\w+)*\s*(?:[;{]|\sv?\d)' - '[\s$][^\W\d]\w*(?::\w+)*->[a-zA-Z_\[({]' quickbasic: # Uppercase keywords are a good indicator of QuickBASIC (if no FreeBASIC syntax is detected) - '^[ ]*(CONST|DIM|REDIM|DEFINT|PRINT|DECLARE (SUB|FUNCTION)|FUNCTION|SUB) ' # Preprocessor statement to set the compiler dialect in QuickBASIC ($lang) and FreeBASIC (#lang) - '(#|$)lang:?\s*"?qb"?' # Other QuickBASIC-specific patterns - '(?i)''\$INCLUDE:' - '(?i)^[ ]*CLS[ ]*(''|:|\r|\n)' - '(?i)^[ ]*OPTION _EXPLICIT' - '(?i)^[ ]*DIM SHARED ' - '(?i)^[ ]*PRINT "' - '(?i) As _(Byte|Offset|MEM)' - '(?i)^[ ]*_(DISPLAY|DEST|CONSOLE|SOURCE|FREEIMAGE|PALETTECOLOR|PRINTSTRING|LOADFONT|PUTIMAGE)' - '(?i)^[ ]*_(TITLE|PLAYMOD) "' - '(?i)^[ ]*_(LIMIT|SCREEN|DELAY) \.?\d+' - '(?i)\b_(MOUSEBUTTON|NEWIMAGE|KEYDOWN|WIDTH|HEIGHT)\(' - '(?i)^[ ]*\$(CONSOLE|CHECKING):' - '(?i)^[ ]*\$(FULLSCREEN|RESIZE|STATIC|DYNAMIC|NOPREFIX|SCREENSHOW|SCREENHIDE|EXEICON)\b' raku: '^\s*(?:use\s+v6\b|\bmodule\b|\b(?:my\s+)?class\b)' vb-class: '^[ ]*VERSION [0-9]\.[0-9] CLASS' vb-form: '^[ ]*VERSION [0-9]\.[0-9]{2}' vb-module: '^[ ]*Attribute VB_Name = ' vba: - '\b(?:VBA|[vV]ba)(?:\b|[0-9A-Z_])' # VBA7 new 64-bit features - '^[ ]*(?:Public|Private)? Declare PtrSafe (?:Sub|Function)\b' - '^[ ]*#If Win64\b' - '^[ ]*(?:Dim|Const) [0-9a-zA-Z_]*[ ]*As Long(?:Ptr|Long)\b' # Top module declarations unique to VBA - '^[ ]*Option (?:Private Module|Compare Database)\b' # General VBA libraries and objects - '(?: |\()(?:Access|Excel|Outlook|PowerPoint|Visio|Word|VBIDE)\.\w' - '\b(?:(?:Active)?VBProjects?|VBComponents?|Application\.(?:VBE|ScreenUpdating))\b' # AutoCAD, Outlook, PowerPoint and Word objects - '\b(?:ThisDrawing|AcadObject|Active(?:Explorer|Inspector|Window\.Presentation|Presentation|Document)|Selection\.(?:Document|Find|Paragraphs|Range))\b' # Excel objects - '\b(?:(?:This|Active)?Workbooks?|Worksheets?|Active(?:Sheet|Chart|Cell)|WorksheetFunction)\b' - '\b(?:Range\(".*|Cells\([0-9a-zA-Z_]*, (?:[0-9a-zA-Z_]*|"[a-zA-Z]{1,3}"))\)' ================================================ FILE: lib/linguist/instrumenter.rb ================================================ module Linguist class BasicInstrumenter attr_reader :detected_info def initialize @detected_info = {} end def instrument(name, payload = {}) if name == "linguist.detected" && payload[:blob] @detected_info[payload[:blob].name] = { strategy: payload[:strategy].name.split("::").last, language: payload[:language]&.name } end yield if block_given? end end end ================================================ FILE: lib/linguist/language.rb ================================================ require 'cgi' require 'yaml' begin require 'yajl' rescue LoadError require 'json' end require 'linguist/classifier' require 'linguist/heuristics' require 'linguist/samples' require 'linguist/file_blob' require 'linguist/blob_helper' require 'linguist/strategy/filename' require 'linguist/strategy/extension' require 'linguist/strategy/modeline' require 'linguist/shebang' module Linguist # Language names that are recognizable by GitHub. Defined languages # can be highlighted, searched and listed under the Top Languages page. # # Languages are defined in `lib/linguist/languages.yml`. class Language @languages = [] @index = {} @name_index = {} @alias_index = {} @language_id_index = {} @extension_index = Hash.new { |h,k| h[k] = [] } @interpreter_index = Hash.new { |h,k| h[k] = [] } @filename_index = Hash.new { |h,k| h[k] = [] } # Detect languages by a specific type # # type - A symbol that exists within TYPES # # Returns an array def self.by_type(type) all.select { |h| h.type == type } end # Internal: Create a new Language object # # attributes - A hash of attributes # # Returns a Language object def self.create(attributes = {}) language = new(attributes) @languages << language # All Language names should be unique. Raise if there is a duplicate. if @name_index.key?(language.name) raise ArgumentError, "Duplicate language name: #{language.name}" end # Language name index @index[language.name.downcase] = @name_index[language.name.downcase] = language language.aliases.each do |name| # All Language aliases should be unique. Raise if there is a duplicate. if @alias_index.key?(name) raise ArgumentError, "Duplicate alias: #{name}" end @index[name.downcase] = @alias_index[name.downcase] = language end language.extensions.each do |extension| if extension !~ /^\./ raise ArgumentError, "Extension is missing a '.': #{extension.inspect}" end @extension_index[extension.downcase] << language end language.interpreters.each do |interpreter| @interpreter_index[interpreter] << language end language.filenames.each do |filename| @filename_index[filename] << language end @language_id_index[language.language_id] = language language end # Public: Get all Languages # # Returns an Array of Languages def self.all @languages end # Public: Look up Language by its proper name. # # name - The String name of the Language # # Examples # # Language.find_by_name('Ruby') # # => # # # Returns the Language or nil if none was found. def self.find_by_name(name) return nil if !name.is_a?(String) || name.to_s.empty? name && (@name_index[name.downcase] || @name_index[name.split(',', 2).first.downcase]) end # Public: Look up Language by one of its aliases. # # name - A String alias of the Language # # Examples # # Language.find_by_alias('cpp') # # => # # # Returns the Language or nil if none was found. def self.find_by_alias(name) return nil if !name.is_a?(String) || name.to_s.empty? name && (@alias_index[name.downcase] || @alias_index[name.split(',', 2).first.downcase]) end # Public: Look up Languages by filename. # # The behaviour of this method recently changed. # See the second example below. # # filename - The path String. # # Examples # # Language.find_by_filename('Cakefile') # # => [#] # Language.find_by_filename('foo.rb') # # => [] # # Returns all matching Languages or [] if none were found. def self.find_by_filename(filename) basename = File.basename(filename) @filename_index[basename] end # Public: Look up Languages by file extension. # # The behaviour of this method recently changed. # See the second example below. # # filename - The path String. # # Examples # # Language.find_by_extension('dummy.rb') # # => [#] # Language.find_by_extension('rb') # # => [] # # Returns all matching Languages or [] if none were found. def self.find_by_extension(filename) # find the first extension with language definitions extname = FileBlob.new(filename.downcase).extensions.detect do |e| !@extension_index[e].empty? end @extension_index[extname] end # Public: Look up Languages by interpreter. # # interpreter - String of interpreter name # # Examples # # Language.find_by_interpreter("bash") # # => [#] # # Returns the matching Language def self.find_by_interpreter(interpreter) @interpreter_index[interpreter] end # Public: Look up Languages by its language_id. # # language_id - Integer of language_id # # Examples # # Language.find_by_id(100) # # => [#] # # Returns the matching Language def self.find_by_id(language_id) @language_id_index[language_id.to_i] end # Public: Look up Language by its name. # # name - The String name of the Language # # Examples # # Language['Ruby'] # # => # # # Language['ruby'] # # => # # # Returns the Language or nil if none was found. def self.[](name) return nil if !name.is_a?(String) || name.to_s.empty? lang = @index[name.downcase] return lang if lang @index[name.split(',', 2).first.downcase] end # Public: A List of popular languages # # Popular languages are sorted to the top of language chooser # dropdowns. # # This list is configured in "popular.yml". # # Returns an Array of Languages. def self.popular @popular ||= all.select(&:popular?).sort_by { |lang| lang.name.downcase } end # Public: A List of non-popular languages # # Unpopular languages appear below popular ones in language # chooser dropdowns. # # This list is created from all the languages not listed in "popular.yml". # # Returns an Array of Languages. def self.unpopular @unpopular ||= all.select(&:unpopular?).sort_by { |lang| lang.name.downcase } end # Public: A List of languages with assigned colors. # # Returns an Array of Languages. def self.colors @colors ||= all.select(&:color).sort_by { |lang| lang.name.downcase } end # Internal: Initialize a new Language # # attributes - A hash of attributes def initialize(attributes = {}) # @name is required @name = attributes[:name] || raise(ArgumentError, "missing name") @fs_name = attributes[:fs_name] # Set type @type = attributes[:type] ? attributes[:type].to_sym : nil if @type && !get_types.include?(@type) raise ArgumentError, "invalid type: #{@type}" end @color = attributes[:color] # Set aliases @aliases = [default_alias] + (attributes[:aliases] || []) @tm_scope = attributes[:tm_scope] || 'none' @ace_mode = attributes[:ace_mode] @codemirror_mode = attributes[:codemirror_mode] @codemirror_mime_type = attributes[:codemirror_mime_type] @wrap = attributes[:wrap] || false # Set the language_id @language_id = attributes[:language_id] # Set extensions or default to []. @extensions = attributes[:extensions] || [] @interpreters = attributes[:interpreters] || [] @filenames = attributes[:filenames] || [] # Set popular flag @popular = attributes.key?(:popular) ? attributes[:popular] : false # If group name is set, save the name so we can lazy load it later if attributes[:group_name] @group_name = attributes[:group_name] # Otherwise we can set it to self now else @group_name = self.name end end def get_types # Valid Languages types @types = [:data, :markup, :programming, :prose] end # Public: Get proper name # # Examples # # # => "Ruby" # # => "Python" # # => "Perl" # # Returns the name String attr_reader :name # Public: # attr_reader :fs_name # Public: Get type. # # Returns a type Symbol or nil. attr_reader :type # Public: Get color. # # Returns a hex color String. attr_reader :color # Public: Get aliases # # Examples # # Language['C++'].aliases # # => ["cpp"] # # Returns an Array of String names attr_reader :aliases # Public: Get language_id (used in GitHub search) # # Examples # # # => "1" # # => "2" # # => "3" # # Returns the integer language_id attr_reader :language_id # Public: Get the name of a TextMate-compatible scope # # Returns the scope attr_reader :tm_scope # Public: Get Ace mode # # Examples # # # => "text" # # => "javascript" # # => "c_cpp" # # Returns a String name or nil attr_reader :ace_mode # Public: Get CodeMirror mode # # Maps to a directory in the `mode/` source code. # https://github.com/codemirror/CodeMirror/tree/master/mode # # Examples # # # => "nil" # # => "javascript" # # => "clike" # # Returns a String name or nil attr_reader :codemirror_mode # Public: Get CodeMirror MIME type mode # # Examples # # # => "nil" # # => "text/x-javascript" # # => "text/x-csrc" # # Returns a String name or nil attr_reader :codemirror_mime_type # Public: Should language lines be wrapped # # Returns true or false attr_reader :wrap # Public: Get extensions # # Examples # # # => ['.rb', '.rake', ...] # # Returns the extensions Array attr_reader :extensions # Public: Get interpreters # # Examples # # # => ['awk', 'gawk', 'mawk' ...] # # Returns the interpreters Array attr_reader :interpreters # Public: Get filenames # # Examples # # # => ['Rakefile', ...] # # Returns the extensions Array attr_reader :filenames # Public: Get URL escaped name. # # Examples # # "C%23" # "C%2B%2B" # "Common%20Lisp" # # Returns the escaped String. def escaped_name CGI.escape(name).gsub('+', '%20') end # Public: Get default alias name # # Returns the alias name String def default_alias name.downcase.gsub(/\s/, '-') end alias_method :default_alias_name, :default_alias # Public: Get Language group # # Returns a Language def group @group ||= Language.find_by_name(@group_name) end # Public: Is it popular? # # Returns true or false def popular? @popular end # Public: Is it not popular? # # Returns true or false def unpopular? !popular? end # Public: Return name as String representation def to_s name end def ==(other) eql?(other) end def eql?(other) equal?(other) end def hash name.hash end def inspect "#<#{self.class} name=#{name}>" end end samples = Samples.load_samples extensions = samples['extnames'] interpreters = samples['interpreters'] popular = YAML.load_file(File.expand_path("../popular.yml", __FILE__)) languages_yml = File.expand_path("../languages.yml", __FILE__) languages_json = File.expand_path("../languages.json", __FILE__) if File.exist?(languages_json) serializer = defined?(Yajl) ? Yajl : JSON languages = serializer.load(File.read(languages_json)) else languages = YAML.load_file(languages_yml) end languages.each do |name, options| options['extensions'] ||= [] options['interpreters'] ||= [] options['filenames'] ||= [] if extnames = extensions[name] extnames.each do |extname| if !options['extensions'].index { |x| x.downcase.end_with? extname.downcase } warn "#{name} has a sample with extension (#{extname.downcase}) that isn't explicitly defined in languages.yml" options['extensions'] << extname end end end interpreters ||= {} if interpreter_names = interpreters[name] interpreter_names.each do |interpreter| if !options['interpreters'].include?(interpreter) options['interpreters'] << interpreter end end end Language.create( :name => name, :fs_name => options['fs_name'], :color => options['color'], :type => options['type'], :aliases => options['aliases'], :tm_scope => options['tm_scope'], :ace_mode => options['ace_mode'], :codemirror_mode => options['codemirror_mode'], :codemirror_mime_type => options['codemirror_mime_type'], :wrap => options['wrap'], :group_name => options['group'], :language_id => options['language_id'], :extensions => Array(options['extensions']), :interpreters => options['interpreters'].sort, :filenames => options['filenames'], :popular => popular.include?(name) ) end end ================================================ FILE: lib/linguist/languages.yml ================================================ # Defines all languages known to GitHub. # # Required fields: # type - Either "data", "programming", "markup" or "prose". # ace_mode - Ace mode used when editing files which use the language. This must match # one of the names in https://gh.io/acemodes. Use "text" if no mode exists. # extensions - List of associated file extensions, sorted in ascending ASCII order, # except for the language's primary extension, which is always listed first. # filenames - List of associated filenames, sorted in ascending ASCII order. # May be omitted if the extensions field is present (and vice versa). # language_id - Unique identifier used internally by GitHub, generated by running # `script/update-ids`. Do not fill out this field manually. # tm_scope - The TextMate scope that represents this programming language. # This should match one of the scopes listed in grammars.yml. # Use "none" if there is no TextMate grammar for this language. # # Optional fields: # aliases - List of additional aliases (implicitly includes lowercased forms of language's name). # These are used in fenced code-blocks, code searches by language, and in overrides. # codemirror_mode - CodeMirror 5 mode used when editing files that use the language. # This must match one of the names listed here: https://git.io/vi9Fx # codemirror_mime_type - MIME media-type used by CodeMirror 5 for selecting a mode for editing the language. # The `mime` types supported by the named mode are listed here: https://git.io/f4SoQ # color - CSS colour code used to represent the language (format: "#RRGGBB"). # fs_name - Filesystem name used when creating directories for the language. Only necessary for # languages whose names contain symbols that are invalid or unsafe on certain systems. # group - Name of the parent language. Languages in a group contribute to the usage statistics # of their parent language. # interpreters - List of programs that execute the language (by running and/or compiling it). # These are consulted when scrutinising a file's hashbang to determine its language. # wrap - Enable soft line-wrapping (default: false) # # Any additions or modifications (even trivial) should have corresponding # test changes in `test/test_blob.rb`. # # Please keep this list alphabetized. Capitalization comes before lowercase. --- 1C Enterprise: type: programming color: "#814CCC" extensions: - ".bsl" - ".os" tm_scope: source.bsl ace_mode: text language_id: 0 2-Dimensional Array: type: data color: "#38761D" extensions: - ".2da" tm_scope: source.2da ace_mode: text language_id: 387204628 4D: type: programming color: "#004289" extensions: - ".4dm" tm_scope: source.4dm ace_mode: text language_id: 577529595 ABAP: type: programming color: "#E8274B" extensions: - ".abap" tm_scope: source.abap ace_mode: abap language_id: 1 ABAP CDS: type: programming color: "#555e25" extensions: - ".asddls" tm_scope: source.abapcds language_id: 452681853 ace_mode: text ABNF: type: data ace_mode: text extensions: - ".abnf" tm_scope: source.abnf language_id: 429 AGS Script: type: programming color: "#B9D9FF" aliases: - ags extensions: - ".asc" - ".ash" tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 2 AIDL: type: programming color: "#34EB6B" tm_scope: source.aidl extensions: - ".aidl" ace_mode: text interpreters: - aidl language_id: 451700185 AL: type: programming color: "#3AA2B5" extensions: - ".al" tm_scope: source.al ace_mode: text language_id: 658971832 ALGOL: type: programming color: "#D1E0DB" extensions: - ".alg" tm_scope: source.algol60 ace_mode: pascal codemirror_mode: pascal codemirror_mime_type: text/x-pascal language_id: 79217948 AMPL: type: programming color: "#E6EFBB" extensions: - ".ampl" - ".mod" tm_scope: source.ampl ace_mode: text language_id: 3 ANTLR: type: programming color: "#9DC3FF" extensions: - ".g4" tm_scope: source.antlr ace_mode: text language_id: 4 API Blueprint: type: markup color: "#2ACCA8" ace_mode: markdown extensions: - ".apib" tm_scope: text.html.markdown.source.gfm.apib language_id: 5 APL: type: programming color: "#5A8164" extensions: - ".apl" - ".dyalog" interpreters: - apl - aplx - dyalog tm_scope: source.apl ace_mode: text codemirror_mode: apl codemirror_mime_type: text/apl language_id: 6 ASL: type: programming ace_mode: asl extensions: - ".asl" - ".dsl" tm_scope: source.asl language_id: 124996147 ASN.1: type: data extensions: - ".asn" - ".asn1" tm_scope: source.asn ace_mode: text codemirror_mode: asn.1 codemirror_mime_type: text/x-ttcn-asn language_id: 7 ASP.NET: type: programming tm_scope: text.html.asp color: "#9400ff" aliases: - aspx - aspx-vb extensions: - ".asax" - ".ascx" - ".ashx" - ".asmx" - ".aspx" - ".axd" ace_mode: text codemirror_mode: htmlembedded codemirror_mime_type: application/x-aspx language_id: 564186416 ATS: type: programming color: "#1ac620" aliases: - ats2 extensions: - ".dats" - ".hats" - ".sats" tm_scope: source.ats ace_mode: ocaml language_id: 9 ActionScript: type: programming tm_scope: source.actionscript.3 color: "#882B0F" aliases: - actionscript 3 - actionscript3 - as3 extensions: - ".as" ace_mode: actionscript language_id: 10 Ada: type: programming color: "#02f88c" extensions: - ".adb" - ".ada" - ".ads" aliases: - ada95 - ada2005 tm_scope: source.ada ace_mode: ada language_id: 11 Adblock Filter List: type: data color: "#800000" ace_mode: text extensions: - ".txt" aliases: - ad block filters - ad block - adb - adblock tm_scope: text.adblock language_id: 884614762 Adobe Font Metrics: type: data color: "#fa0f00" tm_scope: source.afm extensions: - ".afm" aliases: - acfm - adobe composite font metrics - adobe multiple font metrics - amfm ace_mode: text language_id: 147198098 Agda: type: programming color: "#315665" extensions: - ".agda" tm_scope: source.agda ace_mode: text language_id: 12 Aiken: type: programming color: "#640ff8" ace_mode: text extensions: - ".ak" tm_scope: source.aiken language_id: 899409497 Alloy: type: programming color: "#64C800" extensions: - ".als" tm_scope: source.alloy ace_mode: text language_id: 13 Alpine Abuild: type: programming color: "#0D597F" group: Shell aliases: - abuild - apkbuild filenames: - APKBUILD tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 14 Altium Designer: type: data color: "#A89663" aliases: - altium extensions: - ".OutJob" - ".PcbDoc" - ".PrjPCB" - ".SchDoc" tm_scope: source.ini ace_mode: ini language_id: 187772328 AngelScript: type: programming color: "#C7D7DC" extensions: - ".as" - ".angelscript" tm_scope: source.angelscript ace_mode: text codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 389477596 Answer Set Programming: type: programming color: "#A9CC29" extensions: - ".lp" interpreters: - clingo tm_scope: source.answersetprogramming ace_mode: prolog language_id: 433009171 Ant Build System: type: data color: "#A9157E" tm_scope: text.xml.ant filenames: - ant.xml - build.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: application/xml language_id: 15 Antlers: type: markup color: "#ff269e" extensions: - ".antlers.html" - ".antlers.php" - ".antlers.xml" tm_scope: text.html.statamic ace_mode: text language_id: 1067292663 ApacheConf: type: data color: "#d12127" aliases: - aconf - apache extensions: - ".apacheconf" - ".vhost" filenames: - ".htaccess" - apache2.conf - httpd.conf tm_scope: source.apacheconf ace_mode: apache_conf language_id: 16 Apex: type: programming color: "#1797c0" extensions: - ".cls" - ".apex" - ".trigger" tm_scope: source.apex ace_mode: apex codemirror_mode: clike codemirror_mime_type: text/x-java language_id: 17 Apollo Guidance Computer: type: programming color: "#0B3D91" group: Assembly extensions: - ".agc" tm_scope: source.agc ace_mode: assembly_x86 language_id: 18 AppleScript: type: programming aliases: - apples - osascript extensions: - ".applescript" - ".scpt" interpreters: - osascript tm_scope: source.applescript ace_mode: applescript color: "#101F1F" language_id: 19 Arc: type: programming color: "#aa2afe" extensions: - ".arc" tm_scope: none ace_mode: text language_id: 20 AsciiDoc: type: prose color: "#73a0c5" ace_mode: asciidoc wrap: true extensions: - ".asciidoc" - ".adoc" - ".asc" tm_scope: text.html.asciidoc language_id: 22 AspectJ: type: programming color: "#a957b0" extensions: - ".aj" tm_scope: source.aspectj ace_mode: text language_id: 23 Assembly: type: programming color: "#6E4C13" aliases: - asm - nasm extensions: - ".asm" - ".a51" - ".i" - ".inc" - ".nas" - ".nasm" - ".s" tm_scope: source.assembly ace_mode: assembly_x86 language_id: 24 Astro: type: markup color: "#ff5a03" extensions: - ".astro" tm_scope: source.astro ace_mode: astro codemirror_mode: jsx codemirror_mime_type: text/jsx language_id: 578209015 Asymptote: type: programming color: "#ff0000" extensions: - ".asy" interpreters: - asy tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-kotlin language_id: 591605007 Augeas: type: programming color: "#9CC134" extensions: - ".aug" tm_scope: none ace_mode: text language_id: 25 AutoHotkey: type: programming color: "#6594b9" aliases: - ahk extensions: - ".ahk" - ".ahkl" tm_scope: source.ahk ace_mode: autohotkey language_id: 26 AutoIt: type: programming color: "#1C3552" aliases: - au3 - AutoIt3 - AutoItScript extensions: - ".au3" tm_scope: source.autoit ace_mode: autohotkey language_id: 27 Avro IDL: type: data color: "#0040FF" extensions: - ".avdl" tm_scope: source.avro ace_mode: text language_id: 785497837 Awk: type: programming color: "#c30e9b" extensions: - ".awk" - ".auk" - ".gawk" - ".mawk" - ".nawk" interpreters: - awk - gawk - mawk - nawk tm_scope: source.awk ace_mode: text language_id: 28 B (Formal Method): type: programming color: "#8aa8c5" extensions: - ".mch" tm_scope: source.b ace_mode: text language_id: 700792152 B4X: type: programming color: "#00e4ff" extensions: - ".bas" tm_scope: source.vba aliases: - basic for android ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb language_id: 96642275 BASIC: type: programming extensions: - ".bas" tm_scope: source.basic ace_mode: basic color: "#ff0000" language_id: 28923963 BQN: type: programming color: "#2b7067" extensions: - ".bqn" tm_scope: source.bqn ace_mode: text language_id: 330386870 Ballerina: type: programming extensions: - ".bal" tm_scope: source.ballerina ace_mode: text color: "#FF5000" language_id: 720859680 Batchfile: type: programming aliases: - bat - batch - dosbatch - winbatch extensions: - ".bat" - ".cmd" filenames: - gradlew.bat - mvnw.cmd tm_scope: source.batchfile ace_mode: batchfile color: "#C1F12E" language_id: 29 Beef: type: programming color: "#a52f4e" extensions: - ".bf" tm_scope: source.cs ace_mode: csharp codemirror_mode: clike codemirror_mime_type: text/x-csharp language_id: 545626333 Befunge: type: programming extensions: - ".befunge" - ".bf" tm_scope: source.befunge ace_mode: text language_id: 30 Berry: type: programming extensions: - ".be" tm_scope: source.berry ace_mode: text color: "#15A13C" aliases: - be language_id: 121855308 BibTeX: type: markup color: "#778899" group: TeX extensions: - ".bib" - ".bibtex" tm_scope: text.bibtex ace_mode: bibtex codemirror_mode: stex codemirror_mime_type: text/x-stex language_id: 982188347 BibTeX Style: type: programming extensions: - ".bst" tm_scope: source.bst ace_mode: text language_id: 909569041 Bicep: type: programming color: "#519aba" extensions: - ".bicep" - ".bicepparam" tm_scope: source.bicep ace_mode: text language_id: 321200902 Bikeshed: type: markup color: "#5562ac" extensions: - ".bs" tm_scope: source.csswg ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 1055528081 Bison: type: programming color: "#6A463F" group: Yacc tm_scope: source.yacc extensions: - ".bison" ace_mode: text language_id: 31 BitBake: type: programming color: "#00bce4" tm_scope: source.bb extensions: - ".bb" - ".bbappend" - ".bbclass" - ".inc" ace_mode: text language_id: 32 Blade: type: markup color: "#f7523f" extensions: - ".blade" - ".blade.php" tm_scope: text.html.php.blade ace_mode: php_laravel_blade language_id: 33 BlitzBasic: type: programming color: "#00FFAE" aliases: - b3d - blitz3d - blitzplus - bplus extensions: - ".bb" - ".decls" tm_scope: source.blitzmax ace_mode: text language_id: 34 BlitzMax: type: programming color: "#cd6400" extensions: - ".bmx" aliases: - bmax tm_scope: source.blitzmax ace_mode: text language_id: 35 Bluespec: type: programming color: "#12223c" extensions: - ".bsv" aliases: - bluespec bsv - bsv tm_scope: source.bsv ace_mode: verilog codemirror_mode: verilog codemirror_mime_type: text/x-systemverilog language_id: 36 Bluespec BH: type: programming group: Bluespec color: "#12223c" extensions: - ".bs" aliases: - bh - bluespec classic tm_scope: source.bh ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell language_id: 641580358 Boo: type: programming color: "#d4bec1" extensions: - ".boo" ace_mode: text tm_scope: source.boo language_id: 37 Boogie: type: programming color: "#c80fa0" extensions: - ".bpl" interpreters: - boogie tm_scope: source.boogie ace_mode: text language_id: 955017407 Brainfuck: type: programming color: "#2F2530" extensions: - ".b" - ".bf" tm_scope: source.bf ace_mode: text codemirror_mode: brainfuck codemirror_mime_type: text/x-brainfuck language_id: 38 BrighterScript: type: programming color: "#66AABB" extensions: - ".bs" tm_scope: source.brs ace_mode: text language_id: 943571030 Brightscript: type: programming color: "#662D91" extensions: - ".brs" tm_scope: source.brs ace_mode: text language_id: 39 Browserslist: type: data color: "#ffd539" filenames: - ".browserslistrc" - browserslist tm_scope: text.browserslist ace_mode: text language_id: 153503348 Bru: type: markup color: "#F4AA41" extensions: - ".bru" tm_scope: source.bru ace_mode: text language_id: 906627898 BuildStream: type: data color: "#006bff" extensions: - ".bst" tm_scope: source.yaml ace_mode: yaml language_id: 84359046 C: type: programming color: "#555555" extensions: - ".c" - ".cats" - ".h" - ".h.in" - ".idc" interpreters: - tcc tm_scope: source.c ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 41 C#: type: programming ace_mode: csharp codemirror_mode: clike codemirror_mime_type: text/x-csharp tm_scope: source.cs color: "#178600" aliases: - csharp - cake - cakescript extensions: - ".cs" - ".cake" - ".cs.pp" - ".csx" - ".linq" language_id: 42 C++: type: programming tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src color: "#f34b7d" aliases: - cpp extensions: - ".cpp" - ".c++" - ".cc" - ".cp" - ".cppm" - ".cxx" - ".h" - ".h++" - ".hh" - ".hpp" - ".hxx" - ".inc" - ".inl" - ".ino" - ".ipp" - ".ixx" - ".re" - ".tcc" - ".tpp" - ".txx" language_id: 43 C-ObjDump: type: data extensions: - ".c-objdump" tm_scope: objdump.x86asm ace_mode: assembly_x86 language_id: 44 C2hs Haskell: type: programming group: Haskell aliases: - c2hs extensions: - ".chs" tm_scope: source.haskell ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell language_id: 45 C3: type: programming color: "#2563eb" extensions: - ".c3" tm_scope: source.c3 ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 769248603 CAP CDS: type: programming tm_scope: source.cds color: "#0092d1" aliases: - cds extensions: - ".cds" ace_mode: text language_id: 390788699 CIL: type: data tm_scope: source.cil extensions: - ".cil" ace_mode: text language_id: 29176339 CLIPS: type: programming color: "#00A300" extensions: - ".clp" tm_scope: source.clips ace_mode: text language_id: 46 CMake: type: programming color: "#DA3434" extensions: - ".cmake" - ".cmake.in" filenames: - CMakeLists.txt tm_scope: source.cmake ace_mode: text codemirror_mode: cmake codemirror_mime_type: text/x-cmake language_id: 47 COBOL: type: programming extensions: - ".cob" - ".cbl" - ".ccp" - ".cobol" - ".cpy" tm_scope: source.cobol ace_mode: cobol codemirror_mode: cobol codemirror_mime_type: text/x-cobol language_id: 48 CODEOWNERS: type: data filenames: - CODEOWNERS tm_scope: text.codeowners ace_mode: gitignore language_id: 321684729 COLLADA: type: data color: "#F1A42B" extensions: - ".dae" tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 49 CQL: type: programming color: "#006091" extensions: - ".cql" tm_scope: source.cql ace_mode: text language_id: 71155397 CSON: type: data color: "#244776" tm_scope: source.coffee ace_mode: coffee codemirror_mode: coffeescript codemirror_mime_type: text/x-coffeescript extensions: - ".cson" language_id: 424 CSS: type: markup tm_scope: source.css ace_mode: css codemirror_mode: css codemirror_mime_type: text/css color: "#663399" extensions: - ".css" language_id: 50 CSV: type: data color: "#237346" ace_mode: csv tm_scope: source.csv extensions: - ".csv" language_id: 51 CUE: type: programming extensions: - ".cue" tm_scope: source.cue ace_mode: text color: "#5886E1" language_id: 356063509 CWeb: type: programming color: "#00007a" extensions: - ".w" tm_scope: none ace_mode: text language_id: 657332628 Cabal Config: type: data color: "#483465" aliases: - Cabal extensions: - ".cabal" filenames: - cabal.config - cabal.project ace_mode: haskell_cabal codemirror_mode: haskell codemirror_mime_type: text/x-haskell tm_scope: source.cabal language_id: 677095381 Caddyfile: type: data color: "#22b638" aliases: - Caddy extensions: - ".caddyfile" filenames: - Caddyfile ace_mode: text tm_scope: source.Caddyfile language_id: 615465151 Cadence: type: programming color: "#00ef8b" ace_mode: text tm_scope: source.cadence extensions: - ".cdc" language_id: 270184138 Cairo: type: programming color: "#ff4a48" ace_mode: text tm_scope: source.cairo extensions: - ".cairo" group: Cairo language_id: 620599567 Cairo Zero: type: programming color: "#ff4a48" ace_mode: text tm_scope: source.cairo0 extensions: - ".cairo" group: Cairo language_id: 891399890 CameLIGO: type: programming color: "#3be133" extensions: - ".mligo" tm_scope: source.mligo ace_mode: ocaml codemirror_mode: mllike codemirror_mime_type: text/x-ocaml group: LigoLANG language_id: 829207807 Cangjie: type: programming tm_scope: source.cj extensions: - ".cj" color: "#00868B" ace_mode: swift codemirror_mode: swift codemirror_mime_type: text/x-swift language_id: 581895317 Cap'n Proto: type: programming color: "#c42727" tm_scope: source.capnp extensions: - ".capnp" ace_mode: text language_id: 52 Carbon: type: programming color: "#222222" extensions: - ".carbon" ace_mode: golang codemirror_mode: go codemirror_mime_type: text/x-go tm_scope: source.v language_id: 55627273 CartoCSS: type: programming aliases: - Carto extensions: - ".mss" ace_mode: text tm_scope: source.css.mss language_id: 53 Ceylon: type: programming color: "#dfa535" extensions: - ".ceylon" tm_scope: source.ceylon ace_mode: text language_id: 54 Chapel: type: programming color: "#8dc63f" aliases: - chpl extensions: - ".chpl" tm_scope: source.chapel ace_mode: text language_id: 55 Charity: type: programming extensions: - ".ch" tm_scope: none ace_mode: text language_id: 56 Checksums: type: data tm_scope: text.checksums aliases: - checksum - hash - hashes - sum - sums filenames: - MD5SUMS - SHA1SUMS - SHA256SUMS - SHA256SUMS.txt - SHA512SUMS - checksums.txt - cksums - md5sum.txt extensions: - ".crc32" - ".md2" - ".md4" - ".md5" - ".sha1" - ".sha2" - ".sha224" - ".sha256" - ".sha256sum" - ".sha3" - ".sha384" - ".sha512" ace_mode: text language_id: 372063053 ChucK: type: programming color: "#3f8000" extensions: - ".ck" tm_scope: source.java ace_mode: java codemirror_mode: clike codemirror_mime_type: text/x-java language_id: 57 Circom: type: programming ace_mode: text extensions: - ".circom" color: "#707575" tm_scope: source.circom language_id: 1042332086 Cirru: type: programming color: "#ccccff" tm_scope: source.cirru ace_mode: cirru extensions: - ".cirru" language_id: 58 Clarion: type: programming color: "#db901e" ace_mode: text extensions: - ".clw" tm_scope: source.clarion language_id: 59 Clarity: type: programming color: "#5546ff" ace_mode: lisp extensions: - ".clar" tm_scope: source.clar language_id: 91493841 Classic ASP: type: programming color: "#6a40fd" tm_scope: text.html.asp aliases: - asp extensions: - ".asp" ace_mode: text language_id: 8 Clean: type: programming color: "#3F85AF" extensions: - ".icl" - ".dcl" tm_scope: source.clean ace_mode: text language_id: 60 Click: type: programming color: "#E4E6F3" extensions: - ".click" tm_scope: source.click ace_mode: text language_id: 61 Clojure: type: programming tm_scope: source.clojure ace_mode: clojure codemirror_mode: clojure codemirror_mime_type: text/x-clojure color: "#db5855" extensions: - ".clj" - ".bb" - ".boot" - ".cl2" - ".cljc" - ".cljs" - ".cljs.hl" - ".cljscm" - ".cljx" - ".hic" filenames: - riemann.config interpreters: - bb language_id: 62 Closure Templates: type: markup color: "#0d948f" ace_mode: soy_template codemirror_mode: soy codemirror_mime_type: text/x-soy aliases: - soy extensions: - ".soy" tm_scope: text.html.soy language_id: 357046146 Cloud Firestore Security Rules: type: data color: "#FFA000" ace_mode: less codemirror_mode: css codemirror_mime_type: text/css tm_scope: source.firestore filenames: - firestore.rules language_id: 407996372 Clue: type: programming color: "#0009b5" extensions: - ".clue" tm_scope: source.clue ace_mode: text language_id: 163763508 CoNLL-U: type: data extensions: - ".conllu" - ".conll" tm_scope: text.conllu ace_mode: text aliases: - CoNLL - CoNLL-X language_id: 421026389 CodeQL: type: programming color: "#140f46" extensions: - ".ql" - ".qll" tm_scope: source.ql ace_mode: text language_id: 424259634 aliases: - ql CoffeeScript: type: programming tm_scope: source.coffee ace_mode: coffee codemirror_mode: coffeescript codemirror_mime_type: text/x-coffeescript color: "#244776" aliases: - coffee - coffee-script extensions: - ".coffee" - "._coffee" - ".cake" - ".cjsx" - ".iced" filenames: - Cakefile interpreters: - coffee language_id: 63 ColdFusion: type: programming ace_mode: coldfusion color: "#ed2cd6" aliases: - cfm - cfml - coldfusion html extensions: - ".cfm" - ".cfml" tm_scope: text.html.cfm language_id: 64 ColdFusion CFC: type: programming color: "#ed2cd6" group: ColdFusion ace_mode: coldfusion aliases: - cfc extensions: - ".cfc" tm_scope: source.cfscript language_id: 65 Common Lisp: type: programming tm_scope: source.commonlisp color: "#3fb68b" aliases: - lisp extensions: - ".lisp" - ".asd" - ".cl" - ".l" - ".lsp" - ".ny" - ".podsl" - ".sexp" interpreters: - lisp - sbcl - ccl - clisp - ecl ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 66 Common Workflow Language: aliases: - cwl type: programming ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml extensions: - ".cwl" interpreters: - cwl-runner color: "#B5314C" tm_scope: source.cwl language_id: 988547172 Component Pascal: type: programming color: "#B0CE4E" extensions: - ".cp" - ".cps" tm_scope: source.pascal ace_mode: pascal codemirror_mode: pascal codemirror_mime_type: text/x-pascal language_id: 67 Cooklang: type: markup color: "#E15A29" wrap: true extensions: - ".cook" ace_mode: text tm_scope: source.cooklang language_id: 788037493 Cool: type: programming extensions: - ".cl" tm_scope: source.cool ace_mode: text language_id: 68 Cpp-ObjDump: type: data extensions: - ".cppobjdump" - ".c++-objdump" - ".c++objdump" - ".cpp-objdump" - ".cxx-objdump" tm_scope: objdump.x86asm aliases: - c++-objdump ace_mode: assembly_x86 language_id: 70 Creole: type: prose wrap: true extensions: - ".creole" tm_scope: text.html.creole ace_mode: text language_id: 71 Crystal: type: programming color: "#000100" extensions: - ".cr" ace_mode: crystal codemirror_mode: crystal codemirror_mime_type: text/x-crystal tm_scope: source.crystal interpreters: - crystal language_id: 72 Csound: type: programming color: "#1a1a1a" aliases: - csound-orc extensions: - ".orc" - ".udo" tm_scope: source.csound ace_mode: csound_orchestra language_id: 73 Csound Document: type: programming color: "#1a1a1a" aliases: - csound-csd extensions: - ".csd" tm_scope: source.csound-document ace_mode: csound_document language_id: 74 Csound Score: type: programming color: "#1a1a1a" aliases: - csound-sco extensions: - ".sco" tm_scope: source.csound-score ace_mode: csound_score language_id: 75 Cuda: type: programming extensions: - ".cu" - ".cuh" tm_scope: source.cuda-c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src color: "#3A4E3A" language_id: 77 Cue Sheet: type: data extensions: - ".cue" tm_scope: source.cuesheet ace_mode: text language_id: 942714150 Curry: type: programming color: "#531242" extensions: - ".curry" tm_scope: source.curry ace_mode: haskell language_id: 439829048 Cycript: type: programming extensions: - ".cy" tm_scope: source.js ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: text/javascript language_id: 78 Cylc: type: data color: "#00b3fd" extensions: - ".cylc" filenames: - suite.rc tm_scope: source.cylc ace_mode: ini group: INI language_id: 476447814 Cypher: type: programming color: "#34c0eb" extensions: - ".cyp" - ".cypher" tm_scope: source.cypher codemirror_mode: cypher codemirror_mime_type: application/x-cypher-query ace_mode: text language_id: 850806976 Cython: type: programming color: "#fedf5b" extensions: - ".pyx" - ".pxd" - ".pxi" aliases: - pyrex tm_scope: source.cython ace_mode: text codemirror_mode: python codemirror_mime_type: text/x-cython language_id: 79 D: type: programming color: "#ba595e" aliases: - Dlang extensions: - ".d" - ".di" tm_scope: source.d ace_mode: d codemirror_mode: d codemirror_mime_type: text/x-d language_id: 80 D-ObjDump: type: data extensions: - ".d-objdump" tm_scope: objdump.x86asm ace_mode: assembly_x86 language_id: 81 D2: type: markup color: "#526ee8" extensions: - ".d2" aliases: - d2lang tm_scope: source.d2 ace_mode: text language_id: 37531557 DIGITAL Command Language: type: programming aliases: - dcl extensions: - ".com" tm_scope: none ace_mode: text language_id: 82 DM: type: programming color: "#447265" extensions: - ".dm" aliases: - byond tm_scope: source.dm ace_mode: c_cpp language_id: 83 DNS Zone: type: data extensions: - ".zone" - ".arpa" tm_scope: text.zone_file ace_mode: text language_id: 84 DTrace: type: programming aliases: - dtrace-script extensions: - ".d" interpreters: - dtrace tm_scope: source.c ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 85 Dafny: type: programming color: "#FFEC25" extensions: - ".dfy" interpreters: - dafny tm_scope: text.dfy.dafny ace_mode: text language_id: 969323346 Darcs Patch: type: data color: "#8eff23" aliases: - dpatch extensions: - ".darcspatch" - ".dpatch" tm_scope: none ace_mode: text language_id: 86 Dart: type: programming color: "#00B4AB" extensions: - ".dart" interpreters: - dart tm_scope: source.dart ace_mode: dart codemirror_mode: dart codemirror_mime_type: application/dart language_id: 87 Daslang: type: programming color: "#d3d3d3" extensions: - ".das" tm_scope: source.daslang ace_mode: text language_id: 648759486 DataWeave: type: programming color: "#003a52" extensions: - ".dwl" ace_mode: text tm_scope: source.data-weave language_id: 974514097 Debian Package Control File: type: data color: "#D70751" extensions: - ".dsc" tm_scope: source.deb-control ace_mode: text language_id: 527438264 DenizenScript: type: programming color: "#FBEE96" ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml extensions: - ".dsc" tm_scope: source.denizenscript language_id: 435000929 Dhall: type: programming color: "#dfafff" extensions: - ".dhall" tm_scope: source.haskell ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell language_id: 793969321 Diff: type: data extensions: - ".diff" - ".patch" aliases: - udiff tm_scope: source.diff ace_mode: diff codemirror_mode: diff codemirror_mime_type: text/x-diff language_id: 88 DirectX 3D File: type: data color: "#aace60" extensions: - ".x" ace_mode: text tm_scope: none language_id: 201049282 Dockerfile: type: programming aliases: - Containerfile color: "#384d54" tm_scope: source.dockerfile extensions: - ".dockerfile" - ".containerfile" filenames: - Containerfile - Dockerfile ace_mode: dockerfile codemirror_mode: dockerfile codemirror_mime_type: text/x-dockerfile language_id: 89 Dogescript: type: programming color: "#cca760" extensions: - ".djs" tm_scope: none ace_mode: text language_id: 90 Dotenv: type: data color: "#e5d559" extensions: - ".env" filenames: - ".env" - ".env.ci" - ".env.dev" - ".env.development" - ".env.development.local" - ".env.example" - ".env.local" - ".env.prod" - ".env.production" - ".env.sample" - ".env.staging" - ".env.template" - ".env.test" - ".env.testing" tm_scope: source.dotenv ace_mode: text language_id: 111148035 Dune: type: programming ace_mode: lisp filenames: - dune-project tm_scope: source.dune color: "#89421e" language_id: 754574151 Dylan: type: programming color: "#6c616e" extensions: - ".dylan" - ".dyl" - ".intr" - ".lid" tm_scope: source.dylan ace_mode: text codemirror_mode: dylan codemirror_mime_type: text/x-dylan language_id: 91 E: type: programming color: "#ccce35" extensions: - ".e" interpreters: - rune tm_scope: none ace_mode: text language_id: 92 E-mail: type: data aliases: - email - eml - mail - mbox extensions: - ".eml" - ".mbox" tm_scope: text.eml.basic ace_mode: text codemirror_mode: mbox codemirror_mime_type: application/mbox language_id: 529653389 EBNF: type: data extensions: - ".ebnf" tm_scope: source.ebnf ace_mode: text codemirror_mode: ebnf codemirror_mime_type: text/x-ebnf language_id: 430 ECL: type: programming color: "#8a1267" extensions: - ".ecl" - ".eclxml" tm_scope: source.ecl ace_mode: text codemirror_mode: ecl codemirror_mime_type: text/x-ecl language_id: 93 ECLiPSe: type: programming color: "#001d9d" group: Prolog extensions: - ".ecl" tm_scope: source.prolog.eclipse ace_mode: prolog language_id: 94 EJS: type: markup color: "#a91e50" extensions: - ".ejs" - ".ect" - ".ejs.t" - ".jst" tm_scope: text.html.js codemirror_mode: htmlembedded codemirror_mime_type: application/x-ejs ace_mode: ejs language_id: 95 EQ: type: programming color: "#a78649" extensions: - ".eq" tm_scope: source.cs ace_mode: csharp codemirror_mode: clike codemirror_mime_type: text/x-csharp language_id: 96 Eagle: type: data extensions: - ".sch" - ".brd" tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 97 Earthly: type: programming aliases: - Earthfile color: "#2af0ff" tm_scope: source.earthfile ace_mode: text filenames: - Earthfile language_id: 963512632 Easybuild: type: data color: "#069406" group: Python ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python tm_scope: source.python extensions: - ".eb" language_id: 342840477 Ecere Projects: type: data color: "#913960" group: JavaScript extensions: - ".epj" tm_scope: source.json ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json language_id: 98 Ecmarkup: type: markup color: "#eb8131" group: HTML extensions: - ".html" tm_scope: text.html.ecmarkup ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html aliases: - ecmarkdown language_id: 844766630 Edge: type: markup color: "#0dffe0" extensions: - ".edge" tm_scope: text.html.edge ace_mode: html language_id: 460509620 EdgeQL: type: programming color: "#31A7FF" aliases: - esdl extensions: - ".edgeql" - ".esdl" ace_mode: text tm_scope: source.edgeql language_id: 925235833 EditorConfig: type: data color: "#fff1f2" group: INI extensions: - ".editorconfig" filenames: - ".editorconfig" aliases: - editor-config ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties tm_scope: source.editorconfig language_id: 96139566 Edje Data Collection: type: data extensions: - ".edc" tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 342840478 Eiffel: type: programming color: "#4d6977" extensions: - ".e" tm_scope: source.eiffel ace_mode: eiffel codemirror_mode: eiffel codemirror_mime_type: text/x-eiffel language_id: 99 Elixir: type: programming color: "#6e4a7e" extensions: - ".ex" - ".exs" tm_scope: source.elixir ace_mode: elixir filenames: - mix.lock interpreters: - elixir language_id: 100 Elm: type: programming color: "#60B5CC" extensions: - ".elm" tm_scope: source.elm ace_mode: elm codemirror_mode: elm codemirror_mime_type: text/x-elm language_id: 101 Elvish: type: programming ace_mode: text extensions: - ".elv" interpreters: - elvish tm_scope: source.elvish color: "#55BB55" language_id: 570996448 Elvish Transcript: type: programming group: Elvish ace_mode: text tm_scope: source.elvish-transcript color: "#55BB55" language_id: 452025714 Emacs Lisp: type: programming tm_scope: source.emacs.lisp color: "#c065db" aliases: - cask - eask - elisp - emacs filenames: - ".abbrev_defs" - ".emacs" - ".emacs.desktop" - ".gnus" - ".spacemacs" - ".viper" - Cask - Eask - Project.ede - _emacs - abbrev_defs extensions: - ".el" - ".emacs" - ".emacs.desktop" ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 102 EmberScript: type: programming color: "#FFF4F3" extensions: - ".em" - ".emberscript" tm_scope: source.coffee ace_mode: coffee codemirror_mode: coffeescript codemirror_mime_type: text/x-coffeescript language_id: 103 Erlang: type: programming color: "#B83998" extensions: - ".erl" - ".app" - ".app.src" - ".es" - ".escript" - ".hrl" - ".xrl" - ".yrl" filenames: - Emakefile - rebar.config - rebar.config.lock - rebar.lock tm_scope: source.erlang ace_mode: erlang codemirror_mode: erlang codemirror_mime_type: text/x-erlang interpreters: - escript language_id: 104 Euphoria: type: programming color: "#FF790B" extensions: - ".e" - ".ex" interpreters: - eui - euiw ace_mode: text tm_scope: source.euphoria language_id: 880693982 F#: type: programming color: "#b845fc" aliases: - fsharp extensions: - ".fs" - ".fsi" - ".fsx" tm_scope: source.fsharp ace_mode: fsharp codemirror_mode: mllike codemirror_mime_type: text/x-fsharp language_id: 105 F*: fs_name: Fstar type: programming color: "#572e30" aliases: - fstar extensions: - ".fst" - ".fsti" tm_scope: source.fstar ace_mode: text language_id: 336943375 FIGlet Font: type: data color: "#FFDDBB" aliases: - FIGfont extensions: - ".flf" tm_scope: source.figfont ace_mode: text language_id: 686129783 FIRRTL: type: programming color: "#2f632f" extensions: - ".fir" tm_scope: source.firrtl ace_mode: text language_id: 906694254 FLUX: type: programming color: "#88ccff" extensions: - ".fx" - ".flux" tm_scope: none ace_mode: text language_id: 106 Factor: type: programming color: "#636746" extensions: - ".factor" filenames: - ".factor-boot-rc" - ".factor-rc" tm_scope: source.factor ace_mode: text codemirror_mode: factor codemirror_mime_type: text/x-factor language_id: 108 Fancy: type: programming color: "#7b9db4" extensions: - ".fy" - ".fancypack" filenames: - Fakefile tm_scope: source.fancy ace_mode: text language_id: 109 Fantom: type: programming color: "#14253c" extensions: - ".fan" tm_scope: source.fan ace_mode: text language_id: 110 Faust: type: programming color: "#c37240" extensions: - ".dsp" tm_scope: source.faust ace_mode: text language_id: 622529198 Fennel: type: programming tm_scope: source.fnl ace_mode: text color: "#fff3d7" interpreters: - fennel extensions: - ".fnl" language_id: 239946126 Filebench WML: type: programming color: "#F6B900" extensions: - ".f" tm_scope: none ace_mode: text language_id: 111 Filterscript: type: programming group: RenderScript extensions: - ".fs" tm_scope: none ace_mode: text language_id: 112 FlatBuffers: type: data color: "#ed284a" extensions: - ".fbs" tm_scope: source.flatbuffers ace_mode: text language_id: 577640576 Flix: type: programming color: "#d44a45" extensions: - ".flix" tm_scope: source.flix ace_mode: flix language_id: 800935960 Fluent: type: programming color: "#ffcc33" extensions: - ".ftl" tm_scope: source.ftl ace_mode: text language_id: 206353404 Formatted: type: data extensions: - ".for" - ".eam.fs" tm_scope: none ace_mode: text language_id: 113 Forth: type: programming color: "#341708" extensions: - ".fth" - ".4th" - ".f" - ".for" - ".forth" - ".fr" - ".frt" - ".fs" tm_scope: source.forth ace_mode: forth codemirror_mode: forth codemirror_mime_type: text/x-forth language_id: 114 Fortran: group: Fortran type: programming color: "#4d41b1" extensions: - ".f" - ".f77" - ".for" - ".fpp" tm_scope: source.fortran ace_mode: fortran codemirror_mode: fortran codemirror_mime_type: text/x-fortran language_id: 107 Fortran Free Form: group: Fortran color: "#4d41b1" type: programming extensions: - ".f90" - ".f03" - ".f08" - ".f95" tm_scope: source.fortran.modern ace_mode: fortran codemirror_mode: fortran codemirror_mime_type: text/x-fortran language_id: 761352333 FreeBASIC: type: programming color: "#141AC9" extensions: - ".bi" - ".bas" tm_scope: source.vbnet aliases: - fb ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb language_id: 472896659 FreeMarker: type: programming color: "#0050b2" aliases: - ftl extensions: - ".ftl" - ".ftlh" tm_scope: text.html.ftl ace_mode: ftl language_id: 115 Frege: type: programming color: "#00cafe" extensions: - ".fr" tm_scope: source.haskell ace_mode: haskell language_id: 116 Futhark: type: programming color: "#5f021f" extensions: - ".fut" tm_scope: source.futhark ace_mode: text language_id: 97358117 G-code: type: programming color: "#D08CF2" extensions: - ".g" - ".cnc" - ".gco" - ".gcode" tm_scope: source.gcode ace_mode: gcode language_id: 117 GAML: type: programming color: "#FFC766" extensions: - ".gaml" tm_scope: none ace_mode: text language_id: 290345951 GAMS: type: programming color: "#f49a22" extensions: - ".gms" tm_scope: none ace_mode: text language_id: 118 GAP: type: programming color: "#0000cc" extensions: - ".g" - ".gap" - ".gd" - ".gi" - ".tst" tm_scope: source.gap ace_mode: text language_id: 119 GCC Machine Description: type: programming color: "#FFCFAB" extensions: - ".md" tm_scope: source.lisp ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 121 GDB: type: programming extensions: - ".gdb" - ".gdbinit" tm_scope: source.gdb ace_mode: text language_id: 122 GDScript: type: programming color: "#355570" extensions: - ".gd" tm_scope: source.gdscript ace_mode: text language_id: 123 GDShader: type: programming color: "#478CBF" extensions: - ".gdshader" - ".gdshaderinc" tm_scope: source.gdshader ace_mode: glsl language_id: 694638086 GEDCOM: type: data color: "#003058" ace_mode: text extensions: - ".ged" tm_scope: source.gedcom language_id: 459577965 GLSL: type: programming color: "#5686a5" extensions: - ".glsl" - ".fp" - ".frag" - ".frg" - ".fs" - ".fsh" - ".fshader" - ".geo" - ".geom" - ".glslf" - ".glslv" - ".gs" - ".gshader" - ".rchit" - ".rmiss" - ".shader" - ".tesc" - ".tese" - ".vert" - ".vrx" - ".vs" - ".vsh" - ".vshader" tm_scope: source.glsl ace_mode: glsl language_id: 124 GN: type: data extensions: - ".gn" - ".gni" interpreters: - gn filenames: - ".gn" tm_scope: source.gn ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python language_id: 302957008 GSC: type: programming color: "#FF6800" extensions: - ".gsc" - ".csc" - ".gsh" tm_scope: source.gsc ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 257856279 Game Maker Language: type: programming color: "#71b417" extensions: - ".gml" tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 125 Gemfile.lock: type: data color: "#701516" searchable: false tm_scope: source.gemfile-lock ace_mode: text filenames: - Gemfile.lock language_id: 907065713 Gemini: type: prose color: "#ff6900" ace_mode: text extensions: - ".gmi" aliases: - gemtext wrap: true tm_scope: source.gemini language_id: 310828396 Genero 4gl: type: programming color: "#63408e" extensions: - ".4gl" tm_scope: source.genero-4gl ace_mode: text language_id: 986054050 Genero per: type: markup color: "#d8df39" extensions: - ".per" tm_scope: source.genero-per ace_mode: text language_id: 902995658 Genie: type: programming ace_mode: text extensions: - ".gs" color: "#fb855d" tm_scope: none language_id: 792408528 Genshi: type: programming color: "#951531" extensions: - ".kid" tm_scope: text.xml.genshi aliases: - xml+genshi - xml+kid ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 126 Gentoo Ebuild: type: programming color: "#9400ff" group: Shell extensions: - ".ebuild" tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 127 Gentoo Eclass: type: programming color: "#9400ff" group: Shell extensions: - ".eclass" tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 128 Gerber Image: type: data color: "#d20b00" aliases: - rs-274x extensions: - ".gbr" - ".cmp" - ".gbl" - ".gbo" - ".gbp" - ".gbs" - ".gko" - ".gml" - ".gpb" - ".gpt" - ".gtl" - ".gto" - ".gtp" - ".gts" - ".ncl" - ".sol" interpreters: - gerbv - gerbview tm_scope: source.gerber ace_mode: text language_id: 404627610 Gettext Catalog: type: prose aliases: - pot extensions: - ".po" - ".pot" tm_scope: source.po ace_mode: text language_id: 129 Gherkin: type: programming extensions: - ".feature" - ".story" tm_scope: text.gherkin.feature codemirror_mode: gherkin codemirror_mime_type: text/x-feature aliases: - cucumber ace_mode: gherkin color: "#5B2063" language_id: 76 Git Attributes: type: data color: "#F44D27" aliases: - gitattributes filenames: - ".gitattributes" tm_scope: source.gitattributes ace_mode: gitignore codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 956324166 Git Commit: type: data color: "#F44D27" aliases: - commit filenames: - COMMIT_EDITMSG ace_mode: text tm_scope: text.git-commit wrap: true language_id: 131750475 Git Config: type: data color: "#F44D27" group: INI aliases: - gitconfig - gitmodules extensions: - ".gitconfig" filenames: - ".gitconfig" - ".gitmodules" ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties tm_scope: source.gitconfig language_id: 807968997 Git Revision List: type: data color: "#F44D27" aliases: - Git Blame Ignore Revs filenames: - ".git-blame-ignore-revs" tm_scope: source.git-revlist ace_mode: text language_id: 461881235 Gleam: type: programming color: "#ffaff3" ace_mode: text extensions: - ".gleam" tm_scope: source.gleam language_id: 1054258749 Glimmer JS: type: programming aliases: - gjs extensions: - ".gjs" ace_mode: javascript color: "#F5835F" tm_scope: source.gjs group: JavaScript language_id: 5523150 Glimmer TS: type: programming aliases: - gts extensions: - ".gts" ace_mode: typescript color: "#3178c6" tm_scope: source.gts group: TypeScript language_id: 95110458 Glyph: type: programming color: "#c1ac7f" extensions: - ".glf" tm_scope: source.tcl ace_mode: tcl codemirror_mode: tcl codemirror_mime_type: text/x-tcl language_id: 130 Glyph Bitmap Distribution Format: type: data extensions: - ".bdf" tm_scope: source.bdf ace_mode: text language_id: 997665271 Gnuplot: type: programming color: "#f0a9f0" extensions: - ".gp" - ".gnu" - ".gnuplot" - ".p" - ".plot" - ".plt" interpreters: - gnuplot tm_scope: source.gnuplot ace_mode: text language_id: 131 Go: type: programming color: "#00ADD8" aliases: - golang extensions: - ".go" tm_scope: source.go ace_mode: golang codemirror_mode: go codemirror_mime_type: text/x-go language_id: 132 Go Checksums: type: data color: "#00ADD8" aliases: - go.sum - go sum - go.work.sum - go work sum filenames: - go.sum - go.work.sum tm_scope: go.sum ace_mode: text language_id: 1054391671 Go Module: type: data color: "#00ADD8" aliases: - go.mod - go mod filenames: - go.mod tm_scope: go.mod ace_mode: text language_id: 947461016 Go Template: type: markup color: "#00ADD8" aliases: - gotmpl extensions: - ".gohtml" - ".gotmpl" - ".html.tmpl" - ".tmpl" - ".tpl" filenames: - _helpers.tpl tm_scope: source.go-template ace_mode: text language_id: 247918769 Go Workspace: type: data color: "#00ADD8" aliases: - go.work - go work filenames: - go.work tm_scope: go.mod ace_mode: text language_id: 934546256 Godot Resource: type: data color: "#355570" extensions: - ".gdnlib" - ".gdns" - ".tres" - ".tscn" filenames: - project.godot tm_scope: source.gdresource ace_mode: text language_id: 738107771 Golo: type: programming color: "#88562A" extensions: - ".golo" tm_scope: source.golo ace_mode: text language_id: 133 Gosu: type: programming color: "#82937f" extensions: - ".gs" - ".gst" - ".gsx" - ".vark" tm_scope: source.gosu.2 ace_mode: text language_id: 134 Grace: type: programming color: "#615f8b" extensions: - ".grace" tm_scope: source.grace ace_mode: text language_id: 135 Gradle: type: data color: "#02303a" extensions: - ".gradle" tm_scope: source.groovy.gradle ace_mode: text language_id: 136 Gradle Kotlin DSL: group: Gradle type: data color: "#02303a" extensions: - ".gradle.kts" ace_mode: text tm_scope: source.kotlin language_id: 432600901 Grammatical Framework: type: programming aliases: - gf extensions: - ".gf" color: "#ff0000" tm_scope: source.gf ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell language_id: 137 Graph Modeling Language: type: data extensions: - ".gml" tm_scope: none ace_mode: text language_id: 138 GraphQL: type: data color: "#e10098" extensions: - ".graphql" - ".gql" - ".graphqls" tm_scope: source.graphql ace_mode: graphqlschema language_id: 139 Graphviz (DOT): type: data color: "#2596be" tm_scope: source.dot extensions: - ".dot" - ".gv" ace_mode: dot language_id: 140 Groovy: type: programming tm_scope: source.groovy ace_mode: groovy codemirror_mode: groovy codemirror_mime_type: text/x-groovy color: "#4298b8" extensions: - ".groovy" - ".grt" - ".gtpl" - ".gvy" interpreters: - groovy filenames: - Jenkinsfile language_id: 142 Groovy Server Pages: type: programming color: "#4298b8" group: Groovy aliases: - gsp - java server page extensions: - ".gsp" tm_scope: text.html.jsp ace_mode: jsp codemirror_mode: htmlembedded codemirror_mime_type: application/x-jsp language_id: 143 HAProxy: type: data color: "#106da9" extensions: - ".cfg" filenames: - haproxy.cfg tm_scope: source.haproxy-config ace_mode: text language_id: 366607477 HCL: type: programming color: "#844FBA" extensions: - ".hcl" - ".nomad" - ".tf" - ".tfvars" - ".tofu" - ".workflow" aliases: - HashiCorp Configuration Language - opentofu - terraform ace_mode: terraform codemirror_mode: ruby codemirror_mime_type: text/x-ruby tm_scope: source.hcl language_id: 144 HIP: type: programming color: "#4F3A4F" extensions: - ".hip" tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 674379998 HLSL: type: programming color: "#aace60" extensions: - ".hlsl" - ".cginc" - ".fx" - ".fxh" - ".hlsli" ace_mode: text tm_scope: source.hlsl language_id: 145 HOCON: type: data color: "#9ff8ee" extensions: - ".hocon" filenames: - ".scalafix.conf" - ".scalafmt.conf" tm_scope: source.hocon ace_mode: text language_id: 679725279 HTML: type: markup tm_scope: text.html.basic ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html color: "#e34c26" aliases: - xhtml extensions: - ".html" - ".hta" - ".htm" - ".html.hl" - ".inc" - ".xht" - ".xhtml" language_id: 146 HTML+ECR: type: markup color: "#2e1052" tm_scope: text.html.ecr group: HTML aliases: - ecr extensions: - ".ecr" ace_mode: html_ruby codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 148 HTML+EEX: type: markup color: "#6e4a7e" tm_scope: text.html.elixir group: HTML aliases: - eex - heex - leex extensions: - ".html.eex" - ".heex" - ".leex" ace_mode: html_elixir codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 149 HTML+ERB: type: markup color: "#701516" tm_scope: text.html.erb group: HTML aliases: - erb - rhtml - html+ruby extensions: - ".erb" - ".erb.deface" - ".rhtml" ace_mode: html_ruby codemirror_mode: htmlembedded codemirror_mime_type: application/x-erb language_id: 150 HTML+PHP: type: markup color: "#4f5d95" tm_scope: text.html.php group: HTML extensions: - ".phtml" ace_mode: php codemirror_mode: php codemirror_mime_type: application/x-httpd-php language_id: 151 HTML+Razor: type: markup color: "#512be4" tm_scope: text.html.cshtml group: HTML aliases: - razor extensions: - ".cshtml" - ".razor" ace_mode: razor codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 479039817 HTTP: type: data color: "#005C9C" extensions: - ".http" tm_scope: source.httpspec ace_mode: text codemirror_mode: http codemirror_mime_type: message/http language_id: 152 HXML: type: data color: "#f68712" ace_mode: text extensions: - ".hxml" tm_scope: source.hxml codemirror_mode: haxe codemirror_mime_type: text/x-hxml language_id: 786683730 Hack: type: programming ace_mode: php codemirror_mode: php codemirror_mime_type: application/x-httpd-php extensions: - ".hack" - ".hh" - ".hhi" - ".php" tm_scope: source.hack color: "#878787" language_id: 153 Haml: type: markup color: "#ece2a9" extensions: - ".haml" - ".haml.deface" tm_scope: text.haml ace_mode: haml codemirror_mode: haml codemirror_mime_type: text/x-haml language_id: 154 Handlebars: type: markup color: "#f7931e" aliases: - hbs - htmlbars extensions: - ".handlebars" - ".hbs" tm_scope: text.html.handlebars ace_mode: handlebars language_id: 155 Harbour: type: programming color: "#0e60e3" extensions: - ".hb" tm_scope: source.harbour ace_mode: text language_id: 156 Hare: type: programming color: "#9d7424" extensions: - ".ha" ace_mode: text language_id: 463518941 tm_scope: none Haskell: type: programming color: "#5e5086" extensions: - ".hs" - ".hs-boot" - ".hsc" interpreters: - runghc - runhaskell - runhugs tm_scope: source.haskell ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell language_id: 157 Haxe: type: programming ace_mode: haxe codemirror_mode: haxe codemirror_mime_type: text/x-haxe color: "#df7900" extensions: - ".hx" - ".hxsl" tm_scope: source.hx language_id: 158 HiveQL: type: programming extensions: - ".q" - ".hql" color: "#dce200" tm_scope: source.hql ace_mode: sql language_id: 931814087 HolyC: type: programming color: "#ffefaf" extensions: - ".hc" tm_scope: source.hc ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 928121743 Hosts File: type: data color: "#308888" filenames: - HOSTS - hosts - hosts.txt aliases: - hosts tm_scope: source.hosts ace_mode: text language_id: 231021894 Hurl: type: programming color: "#FF0288" extensions: - ".hurl" tm_scope: source.hurl ace_mode: text language_id: 959040217 Hy: type: programming ace_mode: text color: "#7790B2" extensions: - ".hy" interpreters: - hy aliases: - hylang tm_scope: source.hy language_id: 159 HyPhy: type: programming ace_mode: text extensions: - ".bf" tm_scope: none language_id: 160 IDL: type: programming color: "#a3522f" extensions: - ".pro" - ".dlm" tm_scope: source.idl ace_mode: text codemirror_mode: idl codemirror_mime_type: text/x-idl language_id: 161 IGOR Pro: type: programming color: "#0000cc" extensions: - ".ipf" aliases: - igor - igorpro tm_scope: source.igor ace_mode: text language_id: 162 INI: type: data color: "#d1dbe0" extensions: - ".ini" - ".cfg" - ".cnf" - ".dof" - ".frm" - ".lektorproject" - ".prefs" - ".pro" - ".properties" - ".url" filenames: - ".buckconfig" - ".coveragerc" - ".flake8" - ".pylintrc" - HOSTS - buildozer.spec - hosts - pylintrc - vlcrc tm_scope: source.ini aliases: - dosini ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 163 IRC log: type: data aliases: - irc - irc logs extensions: - ".irclog" - ".weechatlog" tm_scope: none ace_mode: text codemirror_mode: mirc codemirror_mime_type: text/mirc language_id: 164 ISPC: type: programming color: "#2D68B1" extensions: - ".ispc" tm_scope: source.ispc ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 327071 Idris: type: programming color: "#b30000" extensions: - ".idr" - ".lidr" ace_mode: text tm_scope: source.idris language_id: 165 Ignore List: type: data color: "#000000" aliases: - ignore - gitignore - git-ignore extensions: - ".gitignore" filenames: - ".atomignore" - ".babelignore" - ".bzrignore" - ".coffeelintignore" - ".cvsignore" - ".dockerignore" - ".easignore" - ".eleventyignore" - ".eslintignore" - ".gitignore" - ".ignore" - ".markdownlintignore" - ".nodemonignore" - ".npmignore" - ".prettierignore" - ".stylelintignore" - ".vercelignore" - ".vscodeignore" - gitignore-global - gitignore_global ace_mode: gitignore tm_scope: source.gitignore codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 74444240 ImageJ Macro: type: programming color: "#99AAFF" aliases: - ijm extensions: - ".ijm" ace_mode: text tm_scope: none language_id: 575143428 Imba: type: programming color: "#16cec6" extensions: - ".imba" ace_mode: text tm_scope: source.imba language_id: 1057618448 Inform 7: type: programming wrap: true extensions: - ".ni" - ".i7x" tm_scope: source.inform7 aliases: - i7 - inform7 ace_mode: text language_id: 166 Ink: type: programming wrap: true extensions: - ".ink" tm_scope: source.ink ace_mode: text language_id: 838252715 Inno Setup: type: programming color: "#264b99" extensions: - ".iss" - ".isl" tm_scope: source.inno ace_mode: text language_id: 167 Io: type: programming color: "#a9188d" extensions: - ".io" interpreters: - io tm_scope: source.io ace_mode: io language_id: 168 Ioke: type: programming color: "#078193" extensions: - ".ik" interpreters: - ioke tm_scope: source.ioke ace_mode: text language_id: 169 Isabelle: type: programming color: "#FEFE00" extensions: - ".thy" tm_scope: source.isabelle.theory ace_mode: text language_id: 170 Isabelle ROOT: type: programming color: "#FEFE00" group: Isabelle filenames: - ROOT tm_scope: source.isabelle.root ace_mode: text language_id: 171 J: type: programming color: "#9EEDFF" extensions: - ".ijs" interpreters: - jconsole tm_scope: source.j ace_mode: text language_id: 172 JAR Manifest: type: data color: "#b07219" filenames: - MANIFEST.MF tm_scope: source.yaml ace_mode: text language_id: 447261135 JCL: type: programming color: "#d90e09" extensions: - ".jcl" tm_scope: source.jcl ace_mode: text language_id: 316620079 JFlex: type: programming color: "#DBCA00" group: Lex extensions: - ".flex" - ".jflex" tm_scope: source.jflex ace_mode: text language_id: 173 JSON: type: data color: "#292929" tm_scope: source.json ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json aliases: - geojson - jsonl - sarif - topojson extensions: - ".json" - ".4DForm" - ".4DProject" - ".avsc" - ".geojson" - ".gltf" - ".har" - ".ice" - ".JSON-tmLanguage" - ".json.example" - ".jsonl" - ".mcmeta" - ".sarif" - ".tact" - ".tfstate" - ".tfstate.backup" - ".topojson" - ".webapp" - ".webmanifest" - ".yy" - ".yyp" filenames: - ".all-contributorsrc" - ".arcconfig" - ".auto-changelog" - ".c8rc" - ".htmlhintrc" - ".imgbotconfig" - ".nycrc" - ".tern-config" - ".tern-project" - ".watchmanconfig" - MODULE.bazel.lock - Package.resolved - Pipfile.lock - bun.lock - composer.lock - deno.lock - flake.lock - mcmod.info language_id: 174 JSON with Comments: type: data color: "#292929" group: JSON tm_scope: source.json.comments ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: text/javascript aliases: - jsonc extensions: - ".jsonc" - ".code-snippets" - ".code-workspace" - ".sublime-build" - ".sublime-color-scheme" - ".sublime-commands" - ".sublime-completions" - ".sublime-keymap" - ".sublime-macro" - ".sublime-menu" - ".sublime-mousemap" - ".sublime-project" - ".sublime-settings" - ".sublime-theme" - ".sublime-workspace" - ".sublime_metrics" - ".sublime_session" - ".tsconfig.json" filenames: - ".babelrc" - ".devcontainer.json" - ".eslintrc.json" - ".jscsrc" - ".jshintrc" - ".jslintrc" - ".oxlintrc.json" - ".swcrc" - api-extractor.json - devcontainer.json - jsconfig.json - language-configuration.json - tsconfig.json - tslint.json language_id: 423 JSON5: type: data color: "#267CB9" extensions: - ".json5" tm_scope: source.js ace_mode: json5 codemirror_mode: javascript codemirror_mime_type: application/json language_id: 175 JSONLD: type: data color: "#0c479c" extensions: - ".jsonld" tm_scope: source.js ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: application/ld+json language_id: 176 JSONiq: color: "#40d47e" type: programming ace_mode: jsoniq codemirror_mode: javascript codemirror_mime_type: application/json extensions: - ".jq" tm_scope: source.jsoniq language_id: 177 Jac: type: programming color: "#FC792D" extensions: - ".jac" tm_scope: source.jac ace_mode: text language_id: 235277043 Jai: type: programming color: "#ab8b4b" ace_mode: text tm_scope: source.jai extensions: - ".jai" language_id: 70127133 Janet: type: programming color: "#0886a5" extensions: - ".janet" tm_scope: source.janet ace_mode: scheme codemirror_mode: scheme codemirror_mime_type: text/x-scheme interpreters: - janet language_id: 1028705371 Jasmin: type: programming color: "#d03600" ace_mode: java extensions: - ".j" tm_scope: source.jasmin language_id: 180 Java: type: programming tm_scope: source.java ace_mode: java codemirror_mode: clike codemirror_mime_type: text/x-java color: "#b07219" extensions: - ".java" - ".jav" - ".jsh" language_id: 181 Java Properties: type: data color: "#2A6277" extensions: - ".properties" tm_scope: source.java-properties ace_mode: properties codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 519377561 Java Server Pages: type: programming color: "#2A6277" group: Java aliases: - jsp extensions: - ".jsp" - ".tag" tm_scope: text.html.jsp ace_mode: jsp codemirror_mode: htmlembedded codemirror_mime_type: application/x-jsp language_id: 182 Java Template Engine: type: programming color: "#2A6277" group: Java aliases: - jte extensions: - ".jte" ace_mode: text tm_scope: text.html.jte language_id: 599494012 JavaScript: type: programming tm_scope: source.js ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: text/javascript color: "#f1e05a" aliases: - js - node extensions: - ".js" - "._js" - ".bones" - ".cjs" - ".es" - ".es6" - ".frag" - ".gs" - ".jake" - ".javascript" - ".jsb" - ".jscad" - ".jsfl" - ".jslib" - ".jsm" - ".jspre" - ".jss" - ".jsx" - ".mjs" - ".njs" - ".pac" - ".sjs" - ".ssjs" - ".xsjs" - ".xsjslib" filenames: - Jakefile interpreters: - chakra - d8 - gjs - js - node - nodejs - qjs - rhino - v8 - v8-shell language_id: 183 JavaScript+ERB: type: programming color: "#f1e05a" tm_scope: source.js group: JavaScript extensions: - ".js.erb" ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: application/javascript language_id: 914318960 Jest Snapshot: type: data color: "#15c213" tm_scope: source.jest.snap extensions: - ".snap" ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: application/javascript language_id: 774635084 JetBrains MPS: type: programming aliases: - mps color: "#21D789" extensions: - ".mps" - ".mpl" - ".msd" ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml tm_scope: none language_id: 465165328 Jinja: type: markup color: "#a52a22" aliases: - django - html+django - html+jinja - htmldjango extensions: - ".jinja" - ".j2" - ".jinja2" tm_scope: text.html.django ace_mode: django codemirror_mode: jinja2 codemirror_mime_type: text/jinja2 language_id: 147 Jison: type: programming color: "#56b3cb" group: Yacc extensions: - ".jison" tm_scope: source.jison ace_mode: text language_id: 284531423 Jison Lex: type: programming color: "#56b3cb" group: Lex extensions: - ".jisonlex" tm_scope: source.jisonlex ace_mode: text language_id: 406395330 Jolie: type: programming extensions: - ".ol" - ".iol" interpreters: - jolie color: "#843179" ace_mode: text tm_scope: source.jolie language_id: 998078858 Jsonnet: color: "#0064bd" type: programming ace_mode: text extensions: - ".jsonnet" - ".libsonnet" tm_scope: source.jsonnet language_id: 664885656 Julia: type: programming extensions: - ".jl" interpreters: - julia color: "#a270ba" tm_scope: source.julia ace_mode: julia codemirror_mode: julia codemirror_mime_type: text/x-julia language_id: 184 Julia REPL: type: programming color: "#a270ba" tm_scope: source.julia.console group: Julia ace_mode: text language_id: 220689142 Jupyter Notebook: type: markup ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json tm_scope: source.json color: "#DA5B0B" extensions: - ".ipynb" filenames: - Notebook aliases: - IPython Notebook language_id: 185 Just: type: programming aliases: - Justfile color: "#384d54" tm_scope: source.just filenames: - ".JUSTFILE" - ".Justfile" - ".justfile" - JUSTFILE - Justfile - justfile extensions: - ".just" ace_mode: text language_id: 128447695 KCL: type: programming color: "#7ABABF" tm_scope: source.kcl extensions: - ".k" filenames: - kcl.mod - kcl.mod.lock ace_mode: text language_id: 1052003890 KDL: type: data color: "#ffb3b3" extensions: - ".kdl" tm_scope: source.kdl ace_mode: tcl codemirror_mode: yacas codemirror_mime_type: text/x-yacas language_id: 931123626 KFramework: type: programming color: "#4195c5" tm_scope: text.k extensions: - ".k" ace_mode: text language_id: 9479532 KRL: type: programming color: "#28430A" extensions: - ".krl" tm_scope: none ace_mode: text language_id: 186 Kaitai Struct: type: programming aliases: - ksy ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml color: "#773b37" extensions: - ".ksy" tm_scope: source.yaml language_id: 818804755 KakouneScript: type: programming color: "#6f8042" tm_scope: source.kakscript aliases: - kak - kakscript extensions: - ".kak" filenames: - kakrc ace_mode: text language_id: 603336474 KerboScript: type: programming ace_mode: text extensions: - ".ks" color: "#41adf0" tm_scope: source.kerboscript language_id: 59716426 KiCad Layout: type: data color: "#2f4aab" aliases: - pcbnew extensions: - ".kicad_pcb" - ".kicad_mod" - ".kicad_wks" filenames: - fp-lib-table tm_scope: source.pcb.sexp ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 187 KiCad Legacy Layout: type: data color: "#2f4aab" extensions: - ".brd" tm_scope: source.pcb.board ace_mode: text language_id: 140848857 KiCad Schematic: type: data color: "#2f4aab" aliases: - eeschema schematic extensions: - ".kicad_sch" - ".kicad_sym" - ".sch" tm_scope: source.pcb.schematic ace_mode: text language_id: 622447435 Kickstart: type: data ace_mode: text extensions: - ".ks" tm_scope: source.kickstart language_id: 692635484 Kit: type: markup ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html extensions: - ".kit" tm_scope: text.html.basic language_id: 188 KoLmafia ASH: type: programming color: "#B9D9B9" extensions: - ".ash" tm_scope: source.ash ace_mode: text language_id: 852099832 Koka: type: programming ace_mode: text extensions: - ".kk" interpreters: - koka color: "#215166" tm_scope: source.koka language_id: 597930447 Kotlin: type: programming color: "#A97BFF" extensions: - ".kt" - ".ktm" - ".kts" tm_scope: source.kotlin ace_mode: kotlin codemirror_mode: clike codemirror_mime_type: text/x-kotlin language_id: 189 Kusto: type: data extensions: - ".csl" - ".kql" tm_scope: source.kusto ace_mode: text language_id: 225697190 LFE: type: programming color: "#4C3023" extensions: - ".lfe" tm_scope: source.lisp ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 190 LLVM: type: programming extensions: - ".ll" tm_scope: source.llvm ace_mode: text color: "#185619" language_id: 191 LOLCODE: type: programming extensions: - ".lol" color: "#cc9900" tm_scope: source.lolcode ace_mode: text language_id: 192 LSL: type: programming tm_scope: source.lsl ace_mode: lsl extensions: - ".lsl" - ".lslp" interpreters: - lsl color: "#3d9970" language_id: 193 LTspice Symbol: type: data extensions: - ".asy" tm_scope: source.ltspice.symbol ace_mode: text codemirror_mode: spreadsheet codemirror_mime_type: text/x-spreadsheet language_id: 1013566805 LabVIEW: type: programming color: "#fede06" extensions: - ".lvproj" - ".lvclass" - ".lvlib" tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 194 Lambdapi: type: programming color: "#8027a3" extensions: - ".lp" tm_scope: source.lp ace_mode: text language_id: 759240513 Langium: type: programming color: "#2c8c87" extensions: - ".langium" tm_scope: source.langium ace_mode: text language_id: 548603830 Lark: type: data color: "#2980B9" extensions: - ".lark" tm_scope: source.lark ace_mode: text codemirror_mode: ebnf codemirror_mime_type: text/x-ebnf language_id: 758480799 Lasso: type: programming color: "#999999" extensions: - ".lasso" - ".las" - ".lasso8" - ".lasso9" tm_scope: file.lasso aliases: - lassoscript ace_mode: text language_id: 195 Latte: type: markup color: "#f2a542" extensions: - ".latte" tm_scope: text.html.smarty ace_mode: latte codemirror_mode: smarty codemirror_mime_type: text/x-smarty language_id: 196 Lean: type: programming extensions: - ".lean" - ".hlean" tm_scope: source.lean ace_mode: text language_id: 197 Lean 4: type: programming group: Lean aliases: - lean4 extensions: - ".lean" tm_scope: source.lean4 ace_mode: text language_id: 455147478 Leo: type: programming color: "#C4FFC2" extensions: - ".leo" tm_scope: source.leo ace_mode: text wrap: true language_id: 916034822 Less: type: markup color: "#1d365d" aliases: - less-css extensions: - ".less" tm_scope: source.css.less ace_mode: less codemirror_mode: css codemirror_mime_type: text/x-less language_id: 198 Lex: type: programming color: "#DBCA00" aliases: - flex extensions: - ".l" - ".lex" filenames: - Lexer.x - lexer.x tm_scope: source.lex ace_mode: text language_id: 199 LigoLANG: type: programming color: "#0e74ff" extensions: - ".ligo" tm_scope: source.ligo ace_mode: pascal codemirror_mode: pascal codemirror_mime_type: text/x-pascal group: LigoLANG language_id: 1040646257 LilyPond: type: programming color: "#9ccc7c" extensions: - ".ly" - ".ily" tm_scope: source.lilypond ace_mode: text language_id: 200 Limbo: type: programming extensions: - ".b" - ".m" tm_scope: none ace_mode: text language_id: 201 Linear Programming: type: programming extensions: - ".lp" tm_scope: none ace_mode: text language_id: 377204539 Linker Script: type: programming extensions: - ".ld" - ".lds" - ".x" filenames: - ld.script tm_scope: source.c.linker ace_mode: text language_id: 202 Linux Kernel Module: type: data extensions: - ".mod" tm_scope: none ace_mode: text language_id: 203 Liquid: type: markup color: "#67b8de" extensions: - ".liquid" tm_scope: text.html.liquid ace_mode: liquid language_id: 204 Liquidsoap: type: programming color: "#990066" extensions: - ".liq" tm_scope: source.liquidsoap ace_mode: text language_id: 614641732 Literate Agda: type: programming color: "#315665" group: Agda extensions: - ".lagda" tm_scope: none ace_mode: text language_id: 205 Literate CoffeeScript: type: programming color: "#244776" tm_scope: source.litcoffee group: CoffeeScript ace_mode: text wrap: true aliases: - litcoffee extensions: - ".litcoffee" - ".coffee.md" language_id: 206 Literate Haskell: type: programming color: "#5e5086" group: Haskell aliases: - lhaskell - lhs extensions: - ".lhs" tm_scope: text.tex.latex.haskell ace_mode: text codemirror_mode: haskell-literate codemirror_mime_type: text/x-literate-haskell language_id: 207 LiveCode Script: type: programming color: "#0c5ba5" extensions: - ".livecodescript" tm_scope: source.livecodescript ace_mode: text language_id: 891017 LiveScript: type: programming color: "#499886" aliases: - live-script - ls extensions: - ".ls" - "._ls" filenames: - Slakefile tm_scope: source.livescript ace_mode: livescript codemirror_mode: livescript codemirror_mime_type: text/x-livescript language_id: 208 Logos: type: programming extensions: - ".xm" - ".x" - ".xi" ace_mode: text tm_scope: source.logos language_id: 209 Logtalk: type: programming color: "#295b9a" extensions: - ".lgt" - ".logtalk" tm_scope: source.logtalk ace_mode: logtalk language_id: 210 LookML: type: programming ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml color: "#652B81" extensions: - ".lkml" - ".lookml" tm_scope: source.yaml language_id: 211 LoomScript: type: programming extensions: - ".ls" tm_scope: source.loomscript ace_mode: text language_id: 212 Lua: type: programming tm_scope: source.lua ace_mode: lua codemirror_mode: lua codemirror_mime_type: text/x-lua color: "#000080" extensions: - ".lua" - ".fcgi" - ".nse" - ".p8" - ".pd_lua" - ".rbxs" - ".rockspec" - ".wlua" filenames: - ".luacheckrc" interpreters: - lua - luajit language_id: 213 Luau: type: programming tm_scope: source.luau ace_mode: lua codemirror_mode: lua codemirror_mime_type: text/x-lua color: "#00A2FF" extensions: - ".luau" interpreters: - luau language_id: 365050359 M: type: programming aliases: - mumps extensions: - ".mumps" - ".m" ace_mode: text codemirror_mode: mumps codemirror_mime_type: text/x-mumps language_id: 214 tm_scope: none M3U: type: data aliases: - hls playlist - m3u playlist extensions: - ".m3u" - ".m3u8" color: "#179C7D" tm_scope: source.m3u ace_mode: text language_id: 89638692 M4: type: programming extensions: - ".m4" - ".mc" tm_scope: source.m4 ace_mode: text language_id: 215 M4Sugar: type: programming group: M4 aliases: - autoconf extensions: - ".m4" filenames: - configure.ac tm_scope: source.m4 ace_mode: text language_id: 216 MATLAB: type: programming color: "#e16737" aliases: - octave extensions: - ".matlab" - ".m" tm_scope: source.matlab ace_mode: matlab codemirror_mode: octave codemirror_mime_type: text/x-octave language_id: 225 MAXScript: type: programming color: "#00a6a6" extensions: - ".ms" - ".mcr" tm_scope: source.maxscript ace_mode: text language_id: 217 MDX: type: markup color: "#fcb32c" ace_mode: markdown codemirror_mode: gfm codemirror_mime_type: text/x-gfm wrap: true extensions: - ".mdx" tm_scope: source.mdx language_id: 512838272 MLIR: type: programming color: "#5EC8DB" extensions: - ".mlir" tm_scope: source.mlir ace_mode: text language_id: 448253929 MQL4: type: programming color: "#62A8D6" extensions: - ".mq4" - ".mqh" tm_scope: source.mql5 ace_mode: c_cpp language_id: 426 MQL5: type: programming color: "#4A76B8" extensions: - ".mq5" - ".mqh" tm_scope: source.mql5 ace_mode: c_cpp language_id: 427 MTML: type: markup color: "#b7e1f4" extensions: - ".mtml" tm_scope: text.html.basic ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 218 MUF: type: programming group: Forth extensions: - ".muf" - ".m" tm_scope: none ace_mode: forth codemirror_mode: forth codemirror_mime_type: text/x-forth language_id: 219 Macaulay2: type: programming extensions: - ".m2" aliases: - m2 interpreters: - M2 ace_mode: text tm_scope: source.m2 color: "#d8ffff" language_id: 34167825 Makefile: type: programming color: "#427819" aliases: - bsdmake - make - mf extensions: - ".mak" - ".d" - ".make" - ".makefile" - ".mk" - ".mkfile" filenames: - BSDmakefile - GNUmakefile - Kbuild - Makefile - Makefile.am - Makefile.boot - Makefile.frag - Makefile.in - Makefile.inc - Makefile.wat - makefile - makefile.sco - mkfile interpreters: - make tm_scope: source.makefile ace_mode: makefile codemirror_mode: cmake codemirror_mime_type: text/x-cmake language_id: 220 Mako: type: programming color: "#7e858d" extensions: - ".mako" - ".mao" tm_scope: text.html.mako ace_mode: text language_id: 221 Markdown: type: prose color: "#083fa1" aliases: - md - pandoc ace_mode: markdown codemirror_mode: gfm codemirror_mime_type: text/x-gfm wrap: true extensions: - ".md" - ".livemd" - ".markdown" - ".mdown" - ".mdwn" - ".mkd" - ".mkdn" - ".mkdown" - ".ronn" - ".scd" - ".workbook" filenames: - contents.lr tm_scope: text.md language_id: 222 Marko: type: markup color: "#42bff2" tm_scope: text.marko extensions: - ".marko" aliases: - markojs ace_mode: text codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 932782397 Mask: type: markup color: "#f97732" ace_mode: mask extensions: - ".mask" tm_scope: source.mask language_id: 223 Mathematical Programming System: type: programming color: "#0530ad" extensions: - ".mps" tm_scope: text.source.mps ace_mode: text language_id: 429002699 Maven POM: type: data group: XML tm_scope: text.xml.pom filenames: - pom.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 226 Max: type: programming color: "#c4a79c" aliases: - max/msp - maxmsp extensions: - ".maxpat" - ".maxhelp" - ".maxproj" - ".mxt" - ".pat" tm_scope: source.json ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json language_id: 227 MeTTa: type: programming color: "#6a5acd" extensions: - ".metta" tm_scope: source.metta ace_mode: text language_id: 1037612668 Mercury: type: programming color: "#ff2b2b" ace_mode: prolog interpreters: - mmi extensions: - ".m" - ".moo" tm_scope: source.mercury language_id: 229 Mermaid: type: markup color: "#ff3670" aliases: - mermaid example extensions: - ".mmd" - ".mermaid" tm_scope: source.mermaid ace_mode: text language_id: 385992043 Meson: type: programming color: "#007800" filenames: - meson.build - meson_options.txt tm_scope: source.meson ace_mode: text language_id: 799141244 Metal: type: programming color: "#8f14e9" extensions: - ".metal" tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 230 Microsoft Developer Studio Project: type: data extensions: - ".dsp" tm_scope: none ace_mode: text language_id: 800983837 Microsoft Visual Studio Solution: type: data extensions: - ".sln" tm_scope: source.solution ace_mode: text language_id: 849523096 MiniD: type: programming extensions: - ".minid" tm_scope: none ace_mode: text language_id: 231 MiniYAML: type: data color: "#ff1111" tm_scope: source.miniyaml extensions: - ".yaml" - ".yml" ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml language_id: 4896465 MiniZinc: type: programming color: "#06a9e6" extensions: - ".mzn" tm_scope: source.mzn ace_mode: text language_id: 238874535 MiniZinc Data: type: data extensions: - ".dzn" tm_scope: source.mzn ace_mode: text language_id: 938193433 Mint: type: programming extensions: - ".mint" ace_mode: text color: "#02b046" tm_scope: source.mint language_id: 968740319 Mirah: type: programming color: "#c7a938" extensions: - ".druby" - ".duby" - ".mirah" tm_scope: source.ruby ace_mode: ruby codemirror_mode: ruby codemirror_mime_type: text/x-ruby language_id: 232 Modelica: type: programming color: "#de1d31" extensions: - ".mo" tm_scope: source.modelica ace_mode: text codemirror_mode: modelica codemirror_mime_type: text/x-modelica language_id: 233 Modula-2: type: programming color: "#10253f" extensions: - ".mod" tm_scope: source.modula2 ace_mode: text language_id: 234 Modula-3: type: programming extensions: - ".i3" - ".ig" - ".m3" - ".mg" color: "#223388" ace_mode: text tm_scope: source.modula-3 language_id: 564743864 Module Management System: type: programming extensions: - ".mms" - ".mmk" filenames: - descrip.mmk - descrip.mms tm_scope: none ace_mode: text language_id: 235 Mojo: type: programming color: "#ff4c1f" extensions: - ".mojo" ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python tm_scope: source.mojo language_id: 1045019587 Monkey: type: programming extensions: - ".monkey" - ".monkey2" ace_mode: text tm_scope: source.monkey language_id: 236 Monkey C: type: programming color: "#8D6747" extensions: - ".mc" tm_scope: source.mc ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 231751931 Moocode: type: programming extensions: - ".moo" tm_scope: none ace_mode: text language_id: 237 MoonBit: type: programming color: "#b92381" extensions: - ".mbt" tm_scope: source.moonbit ace_mode: text language_id: 181453007 MoonScript: type: programming color: "#ff4585" extensions: - ".moon" interpreters: - moon tm_scope: source.moonscript ace_mode: text language_id: 238 Motoko: type: programming color: "#fbb03b" extensions: - ".mo" tm_scope: source.mo ace_mode: text language_id: 202937027 Motorola 68K Assembly: type: programming color: "#005daa" group: Assembly aliases: - m68k extensions: - ".asm" - ".i" - ".inc" - ".s" - ".x68" tm_scope: source.m68k ace_mode: assembly_x86 language_id: 477582706 Move: type: programming color: "#4a137a" extensions: - ".move" tm_scope: source.move ace_mode: text language_id: 638334599 Muse: type: prose extensions: - ".muse" tm_scope: text.muse ace_mode: text wrap: true language_id: 474864066 aliases: - amusewiki - emacs muse Mustache: type: markup color: "#724b3b" extensions: - ".mustache" tm_scope: text.html.smarty ace_mode: smarty codemirror_mode: smarty codemirror_mime_type: text/x-smarty language_id: 638334590 Myghty: type: programming extensions: - ".myt" tm_scope: none ace_mode: text language_id: 239 NASL: type: programming extensions: - ".nasl" - ".inc" tm_scope: source.nasl ace_mode: text language_id: 171666519 NCL: type: programming color: "#28431f" extensions: - ".ncl" tm_scope: source.ncl ace_mode: text language_id: 240 NEON: type: data extensions: - ".neon" tm_scope: source.neon ace_mode: text aliases: - nette object notation - ne-on language_id: 481192983 NL: type: data extensions: - ".nl" tm_scope: none ace_mode: text language_id: 241 NMODL: type: programming color: "#00356B" extensions: - ".mod" tm_scope: none ace_mode: text language_id: 136456478 NPM Config: type: data color: "#cb3837" group: INI aliases: - npmrc filenames: - ".npmrc" tm_scope: source.ini.npmrc ace_mode: text language_id: 685022663 NSIS: type: programming extensions: - ".nsi" - ".nsh" tm_scope: source.nsis ace_mode: nsis codemirror_mode: nsis codemirror_mime_type: text/x-nsis language_id: 242 NWScript: type: programming color: "#111522" extensions: - ".nss" tm_scope: source.c.nwscript ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 731233819 Nasal: type: programming color: "#1d2c4e" extensions: - ".nas" tm_scope: source.nasal ace_mode: nasal language_id: 178322513 Nearley: type: programming ace_mode: text color: "#990000" extensions: - ".ne" - ".nearley" tm_scope: source.ne language_id: 521429430 Nemerle: type: programming color: "#3d3c6e" extensions: - ".n" tm_scope: source.nemerle ace_mode: text language_id: 243 NetLinx: type: programming color: "#0aa0ff" extensions: - ".axs" - ".axi" tm_scope: source.netlinx ace_mode: text language_id: 244 NetLinx+ERB: type: programming color: "#747faa" extensions: - ".axs.erb" - ".axi.erb" tm_scope: source.netlinx.erb ace_mode: text language_id: 245 NetLogo: type: programming color: "#ff6375" extensions: - ".nlogo" tm_scope: source.lisp ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 246 NewLisp: type: programming color: "#87AED7" extensions: - ".nl" - ".lisp" - ".lsp" interpreters: - newlisp tm_scope: source.lisp ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp language_id: 247 Nextflow: type: programming ace_mode: groovy tm_scope: source.nextflow color: "#3ac486" extensions: - ".nf" filenames: - nextflow.config interpreters: - nextflow language_id: 506780613 Nginx: type: data color: "#009639" extensions: - ".nginx" - ".nginxconf" - ".vhost" filenames: - nginx.conf tm_scope: source.nginx aliases: - nginx configuration file ace_mode: nginx codemirror_mode: nginx codemirror_mime_type: text/x-nginx-conf language_id: 248 Nickel: type: programming color: "#E0C3FC" extensions: - ".ncl" tm_scope: source.nickel ace_mode: text language_id: 1067292664 Nim: type: programming color: "#ffc200" extensions: - ".nim" - ".nim.cfg" - ".nimble" - ".nimrod" - ".nims" filenames: - nim.cfg ace_mode: nim tm_scope: source.nim language_id: 249 Ninja: type: data tm_scope: source.ninja extensions: - ".ninja" ace_mode: text language_id: 250 Nit: type: programming color: "#009917" extensions: - ".nit" tm_scope: source.nit ace_mode: text language_id: 251 Nix: type: programming color: "#7e7eff" extensions: - ".nix" aliases: - nixos tm_scope: source.nix ace_mode: nix language_id: 252 Noir: type: programming aliases: - nargo ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc extensions: - ".nr" color: "#2f1f49" tm_scope: source.nr language_id: 813068465 Nu: type: programming color: "#c9df40" aliases: - nush extensions: - ".nu" filenames: - Nukefile tm_scope: source.nu ace_mode: scheme codemirror_mode: scheme codemirror_mime_type: text/x-scheme interpreters: - nush language_id: 253 NumPy: type: programming color: "#9C8AF9" group: Python extensions: - ".numpy" - ".numpyw" - ".numsc" tm_scope: none ace_mode: text codemirror_mode: python codemirror_mime_type: text/x-python language_id: 254 Nunjucks: type: markup color: "#3d8137" extensions: - ".njk" aliases: - njk tm_scope: text.html.nunjucks ace_mode: nunjucks language_id: 461856962 Nushell: type: programming color: "#4E9906" extensions: - ".nu" interpreters: - nu aliases: - nu-script - nushell-script tm_scope: source.nushell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 446573572 OASv2-json: type: data color: "#85ea2d" extensions: - ".json" group: OpenAPI Specification v2 tm_scope: source.json ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json language_id: 834374816 OASv2-yaml: type: data color: "#85ea2d" extensions: - ".yaml" - ".yml" group: OpenAPI Specification v2 tm_scope: source.yaml ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml language_id: 105187618 OASv3-json: type: data color: "#85ea2d" extensions: - ".json" group: OpenAPI Specification v3 tm_scope: source.json ace_mode: json codemirror_mode: javascript codemirror_mime_type: application/json language_id: 980062566 OASv3-yaml: type: data color: "#85ea2d" extensions: - ".yaml" - ".yml" group: OpenAPI Specification v3 tm_scope: source.yaml ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml language_id: 51239111 OCaml: type: programming ace_mode: ocaml codemirror_mode: mllike codemirror_mime_type: text/x-ocaml color: "#ef7a08" extensions: - ".ml" - ".eliom" - ".eliomi" - ".ml4" - ".mli" - ".mll" - ".mly" interpreters: - ocaml - ocamlrun - ocamlscript tm_scope: source.ocaml language_id: 255 OMNeT++ MSG: type: programming extensions: - ".msg" color: "#a0e0a0" tm_scope: source.msg ace_mode: text aliases: - omnetpp-msg language_id: 664100008 OMNeT++ NED: type: programming extensions: - ".ned" color: "#08607c" tm_scope: source.ned ace_mode: text aliases: - omnetpp-ned language_id: 924868392 Oberon: type: programming extensions: - ".ob2" tm_scope: source.modula2 ace_mode: text language_id: 677210597 ObjDump: type: data extensions: - ".objdump" tm_scope: objdump.x86asm ace_mode: assembly_x86 language_id: 256 Object Data Instance Notation: type: data extensions: - ".odin" tm_scope: source.odin-ehr ace_mode: text language_id: 985227236 ObjectScript: type: programming extensions: - ".cls" language_id: 202735509 tm_scope: source.objectscript color: "#424893" ace_mode: text Objective-C: type: programming tm_scope: source.objc color: "#438eff" aliases: - obj-c - objc - objectivec extensions: - ".m" - ".h" ace_mode: objectivec codemirror_mode: clike codemirror_mime_type: text/x-objectivec language_id: 257 Objective-C++: type: programming tm_scope: source.objc++ color: "#6866fb" aliases: - obj-c++ - objc++ - objectivec++ extensions: - ".mm" ace_mode: objectivec codemirror_mode: clike codemirror_mime_type: text/x-objectivec++ language_id: 258 Objective-J: type: programming color: "#ff0c5a" aliases: - obj-j - objectivej - objj extensions: - ".j" - ".sj" tm_scope: source.js.objj ace_mode: text language_id: 259 Odin: type: programming color: "#60AFFE" aliases: - odinlang - odin-lang extensions: - ".odin" tm_scope: source.odin ace_mode: odin language_id: 889244082 Omgrofl: type: programming extensions: - ".omgrofl" color: "#cabbff" tm_scope: none ace_mode: text language_id: 260 Opa: type: programming extensions: - ".opa" tm_scope: source.opa ace_mode: text language_id: 261 Opal: type: programming color: "#f7ede0" extensions: - ".opal" tm_scope: source.opal ace_mode: text language_id: 262 Open Policy Agent: type: programming color: "#7d9199" ace_mode: text extensions: - ".rego" language_id: 840483232 tm_scope: source.rego OpenAPI Specification v2: aliases: - oasv2 type: data color: "#85ea2d" tm_scope: none ace_mode: text language_id: 848295328 OpenAPI Specification v3: aliases: - oasv3 type: data color: "#85ea2d" tm_scope: none ace_mode: text language_id: 557959099 OpenCL: type: programming color: "#ed2e2d" group: C extensions: - ".cl" - ".opencl" tm_scope: source.c ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 263 OpenEdge ABL: type: programming color: "#5ce600" aliases: - progress - openedge - abl extensions: - ".p" - ".cls" - ".w" tm_scope: source.abl ace_mode: text language_id: 264 OpenQASM: type: programming extensions: - ".qasm" color: "#AA70FF" tm_scope: source.qasm ace_mode: text language_id: 153739399 OpenRC runscript: type: programming group: Shell aliases: - openrc interpreters: - openrc-run tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 265 OpenSCAD: type: programming color: "#e5cd45" extensions: - ".scad" tm_scope: source.scad ace_mode: scad language_id: 266 OpenStep Property List: type: data extensions: - ".plist" - ".glyphs" tm_scope: source.plist ace_mode: text language_id: 598917541 OpenType Feature File: type: data aliases: - AFDKO extensions: - ".fea" tm_scope: source.opentype ace_mode: text language_id: 374317347 Option List: type: data color: "#476732" aliases: - opts - ackrc filenames: - ".ackrc" - ".rspec" - ".yardopts" - ackrc - mocha.opts tm_scope: source.opts ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 723589315 Org: type: prose color: "#77aa99" wrap: true extensions: - ".org" tm_scope: none ace_mode: text language_id: 267 OverpassQL: type: programming color: "#cce2aa" wrap: true extensions: - ".overpassql" tm_scope: source.overpassql ace_mode: text language_id: 689079655 Ox: type: programming extensions: - ".ox" - ".oxh" - ".oxo" tm_scope: source.ox ace_mode: text language_id: 268 Oxygene: type: programming color: "#cdd0e3" extensions: - ".oxygene" tm_scope: none ace_mode: text language_id: 269 Oz: type: programming color: "#fab738" extensions: - ".oz" tm_scope: source.oz ace_mode: text codemirror_mode: oz codemirror_mime_type: text/x-oz language_id: 270 P4: type: programming color: "#7055b5" extensions: - ".p4" tm_scope: source.p4 ace_mode: text language_id: 348895984 PDDL: type: programming color: "#0d00ff" extensions: - ".pddl" tm_scope: source.pddl ace_mode: text language_id: 736235603 PEG.js: type: programming color: "#234d6b" extensions: - ".pegjs" - ".peggy" tm_scope: source.peggy ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: text/javascript language_id: 81442128 PHP: type: programming tm_scope: text.html.php ace_mode: php codemirror_mode: php codemirror_mime_type: application/x-httpd-php color: "#4F5D95" extensions: - ".php" - ".aw" - ".ctp" - ".fcgi" - ".inc" - ".php3" - ".php4" - ".php5" - ".phps" - ".phpt" filenames: - ".php" - ".php_cs" - ".php_cs.dist" - Phakefile interpreters: - php aliases: - inc language_id: 272 PLSQL: type: programming ace_mode: plsql codemirror_mode: sql codemirror_mime_type: text/x-plsql tm_scope: none color: "#dad8d8" extensions: - ".pls" - ".bdy" - ".ddl" - ".fnc" - ".pck" - ".pkb" - ".pks" - ".plb" - ".plsql" - ".prc" - ".spc" - ".sql" - ".tpb" - ".tps" - ".trg" - ".vw" language_id: 273 PLpgSQL: type: programming color: "#336790" ace_mode: pgsql codemirror_mode: sql codemirror_mime_type: text/x-sql tm_scope: source.sql extensions: - ".pgsql" - ".sql" language_id: 274 POV-Ray SDL: type: programming color: "#6bac65" aliases: - pov-ray - povray extensions: - ".pov" - ".inc" tm_scope: source.pov-ray sdl ace_mode: text language_id: 275 Pact: type: programming color: "#F7A8B8" ace_mode: text tm_scope: source.pact extensions: - ".pact" language_id: 756774415 Pan: type: programming color: "#cc0000" extensions: - ".pan" tm_scope: source.pan ace_mode: text language_id: 276 Papyrus: type: programming color: "#6600cc" extensions: - ".psc" tm_scope: source.papyrus.skyrim ace_mode: text language_id: 277 Parrot: type: programming color: "#f3ca0a" extensions: - ".parrot" tm_scope: none ace_mode: text language_id: 278 Parrot Assembly: group: Parrot type: programming aliases: - pasm extensions: - ".pasm" interpreters: - parrot tm_scope: none ace_mode: text language_id: 279 Parrot Internal Representation: group: Parrot tm_scope: source.parrot.pir type: programming aliases: - pir extensions: - ".pir" interpreters: - parrot ace_mode: text language_id: 280 Pascal: type: programming color: "#E3F171" aliases: - delphi - objectpascal extensions: - ".pas" - ".dfm" - ".dpr" - ".inc" - ".lpr" - ".pascal" - ".pp" interpreters: - instantfpc tm_scope: source.pascal ace_mode: pascal codemirror_mode: pascal codemirror_mime_type: text/x-pascal language_id: 281 Pawn: type: programming color: "#dbb284" extensions: - ".pwn" - ".inc" - ".sma" tm_scope: source.pawn ace_mode: text language_id: 271 Pep8: type: programming color: "#C76F5B" extensions: - ".pep" ace_mode: text tm_scope: source.pep8 language_id: 840372442 Perl: type: programming tm_scope: source.perl ace_mode: perl codemirror_mode: perl codemirror_mime_type: text/x-perl color: "#0298c3" extensions: - ".pl" - ".al" - ".cgi" - ".fcgi" - ".perl" - ".ph" - ".plx" - ".pm" - ".psgi" - ".t" filenames: - ".latexmkrc" - Makefile.PL - Rexfile - ack - cpanfile - latexmkrc interpreters: - cperl - perl aliases: - cperl language_id: 282 Pic: type: markup group: Roff tm_scope: source.pic extensions: - ".pic" - ".chem" aliases: - pikchr ace_mode: text codemirror_mode: troff codemirror_mime_type: text/troff language_id: 425 Pickle: type: data extensions: - ".pkl" tm_scope: none ace_mode: text language_id: 284 PicoLisp: type: programming color: "#6067af" extensions: - ".l" interpreters: - picolisp - pil tm_scope: source.lisp ace_mode: lisp language_id: 285 PigLatin: type: programming color: "#fcd7de" extensions: - ".pig" tm_scope: source.pig_latin ace_mode: pig codemirror_mode: pig codemirror_mime_type: text/x-pig language_id: 286 Pike: type: programming color: "#005390" extensions: - ".pike" - ".pmod" interpreters: - pike tm_scope: source.pike ace_mode: text language_id: 287 Pip Requirements: type: data color: "#FFD343" filenames: - dev-requirements.txt - requirements-dev.txt - requirements.lock.txt - requirements.txt ace_mode: text tm_scope: source.pip-requirements language_id: 684385621 Pkl: type: programming color: "#6b9543" extensions: - ".pkl" interpreters: - pkl tm_scope: source.pkl ace_mode: text language_id: 288822799 PlantUML: type: data color: "#fbbd16" extensions: - ".puml" - ".iuml" - ".plantuml" tm_scope: source.wsd ace_mode: text language_id: 833504686 Pod: type: prose ace_mode: perl codemirror_mode: perl codemirror_mime_type: text/x-perl wrap: true extensions: - ".pod" interpreters: - perl tm_scope: none language_id: 288 Pod 6: type: prose ace_mode: perl tm_scope: source.raku wrap: true extensions: - ".pod" - ".pod6" interpreters: - perl6 language_id: 155357471 PogoScript: type: programming color: "#d80074" extensions: - ".pogo" tm_scope: source.pogoscript ace_mode: text language_id: 289 Polar: type: programming color: "#ae81ff" extensions: - ".polar" tm_scope: source.polar ace_mode: text language_id: 839112914 Pony: type: programming extensions: - ".pony" tm_scope: source.pony ace_mode: text language_id: 290 Portugol: type: programming color: "#f8bd00" extensions: - ".por" tm_scope: source.portugol ace_mode: text language_id: 832391833 PostCSS: type: markup color: "#dc3a0c" tm_scope: source.postcss group: CSS extensions: - ".pcss" - ".postcss" ace_mode: text language_id: 262764437 PostScript: type: markup color: "#da291c" extensions: - ".ps" - ".eps" - ".epsi" - ".pfa" tm_scope: source.postscript aliases: - postscr ace_mode: text language_id: 291 PowerBuilder: type: programming color: "#8f0f8d" extensions: - ".pbt" - ".sra" - ".sru" - ".srw" tm_scope: source.powerbuilder ace_mode: text language_id: 292 PowerShell: type: programming color: "#012456" tm_scope: source.powershell ace_mode: powershell codemirror_mode: powershell codemirror_mime_type: application/x-powershell aliases: - posh - pwsh extensions: - ".ps1" - ".psd1" - ".psm1" interpreters: - pwsh language_id: 293 Praat: type: programming color: "#c8506d" tm_scope: source.praat ace_mode: praat extensions: - ".praat" language_id: 106029007 Prisma: type: data color: "#0c344b" extensions: - ".prisma" tm_scope: source.prisma ace_mode: prisma language_id: 499933428 Processing: type: programming color: "#0096D8" extensions: - ".pde" tm_scope: source.processing ace_mode: text language_id: 294 Procfile: type: programming color: "#3B2F63" filenames: - Procfile tm_scope: source.procfile ace_mode: batchfile language_id: 305313959 Proguard: type: data extensions: - ".pro" tm_scope: none ace_mode: text language_id: 716513858 Prolog: type: programming color: "#74283c" extensions: - ".pl" - ".plt" - ".pro" - ".prolog" - ".yap" interpreters: - swipl - yap tm_scope: source.prolog ace_mode: prolog language_id: 295 Promela: type: programming color: "#de0000" tm_scope: source.promela ace_mode: text extensions: - ".pml" language_id: 441858312 Propeller Spin: type: programming color: "#7fa2a7" extensions: - ".spin" tm_scope: source.spin ace_mode: text language_id: 296 Protocol Buffer: type: data aliases: - proto - protobuf - Protocol Buffers extensions: - ".proto" tm_scope: source.proto ace_mode: protobuf codemirror_mode: protobuf codemirror_mime_type: text/x-protobuf language_id: 297 Protocol Buffer Text Format: type: data aliases: - text proto - protobuf text format extensions: - ".textproto" - ".pbt" - ".pbtxt" - ".txtpb" tm_scope: source.textproto ace_mode: text language_id: 436568854 Public Key: type: data extensions: - ".asc" - ".pub" tm_scope: none ace_mode: text codemirror_mode: asciiarmor codemirror_mime_type: application/pgp language_id: 298 Pug: type: markup color: "#a86454" extensions: - ".jade" - ".pug" tm_scope: text.jade ace_mode: jade codemirror_mode: pug codemirror_mime_type: text/x-pug language_id: 179 Puppet: type: programming color: "#302B6D" extensions: - ".pp" filenames: - Modulefile ace_mode: puppet codemirror_mode: puppet codemirror_mime_type: text/x-puppet tm_scope: source.puppet language_id: 299 Pure Data: type: data extensions: - ".pd" tm_scope: none ace_mode: text language_id: 300 PureBasic: type: programming color: "#5a6986" extensions: - ".pb" - ".pbi" tm_scope: none ace_mode: text language_id: 301 PureScript: type: programming color: "#1D222D" extensions: - ".purs" tm_scope: source.purescript ace_mode: haskell codemirror_mode: haskell codemirror_mime_type: text/x-haskell language_id: 302 Pyret: type: programming color: "#ee1e10" extensions: - ".arr" ace_mode: python tm_scope: source.arr language_id: 252961827 Python: type: programming tm_scope: source.python ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python color: "#3572A5" extensions: - ".py" - ".cgi" - ".fcgi" - ".gyp" - ".gypi" - ".lmi" - ".py3" - ".pyde" - ".pyi" - ".pyp" - ".pyt" - ".pyw" - ".rpy" - ".spec" - ".tac" - ".wsgi" - ".xpy" filenames: - ".gclient" - DEPS - SConscript - SConstruct - wscript interpreters: - python - python2 - python3 - py - pypy - pypy3 - uv aliases: - py - py3 - python3 - rusthon language_id: 303 Python console: type: programming color: "#3572A5" group: Python aliases: - pycon tm_scope: text.python.console ace_mode: text language_id: 428 Python traceback: type: data color: "#3572A5" group: Python extensions: - ".pytb" tm_scope: text.python.traceback ace_mode: text language_id: 304 Q#: type: programming extensions: - ".qs" aliases: - qsharp color: "#fed659" ace_mode: text tm_scope: source.qsharp language_id: 697448245 QML: type: programming color: "#44a51c" extensions: - ".qml" - ".qbs" tm_scope: source.qml ace_mode: qml language_id: 305 QMake: type: programming extensions: - ".pro" - ".pri" interpreters: - qmake tm_scope: source.qmake ace_mode: text language_id: 306 Qt Script: type: programming ace_mode: javascript codemirror_mode: javascript codemirror_mime_type: text/javascript extensions: - ".qs" filenames: - installscript.qs - toolchain_installscript.qs color: "#00b841" tm_scope: source.js language_id: 558193693 Quake: type: programming filenames: - m3makefile - m3overrides color: "#882233" ace_mode: text tm_scope: source.quake language_id: 375265331 QuakeC: type: programming extensions: - ".qc" color: "#975777" ace_mode: text tm_scope: source.quakec language_id: 472308069 QuickBASIC: type: programming color: "#008080" extensions: - ".bas" - ".bi" tm_scope: source.QB64 aliases: - qb - qbasic - qb64 - classic qbasic - classic quickbasic ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb language_id: 593107205 R: type: programming color: "#198CE7" aliases: - Rscript - splus extensions: - ".r" - ".rd" - ".rsx" filenames: - ".Rprofile" - expr-dist interpreters: - Rscript tm_scope: source.r ace_mode: r codemirror_mode: r codemirror_mime_type: text/x-rsrc language_id: 307 RAML: type: markup ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml tm_scope: source.yaml color: "#77d9fb" extensions: - ".raml" language_id: 308 RAScript: type: programming ace_mode: text extensions: - ".rascript" tm_scope: source.rascript color: "#2C97FA" language_id: 601118790 RBS: type: data ace_mode: ruby codemirror_mode: ruby codemirror_mime_type: text/x-ruby extensions: - ".rbs" color: "#701516" tm_scope: source.rbs group: Ruby language_id: 899227493 RDoc: type: prose color: "#701516" ace_mode: rdoc wrap: true extensions: - ".rdoc" tm_scope: text.rdoc language_id: 309 REALbasic: type: programming extensions: - ".rbbas" - ".rbfrm" - ".rbmnu" - ".rbres" - ".rbtbar" - ".rbuistate" tm_scope: source.vbnet ace_mode: text language_id: 310 REXX: type: programming color: "#d90e09" aliases: - arexx extensions: - ".rexx" - ".pprx" - ".rex" interpreters: - regina - rexx tm_scope: source.rexx ace_mode: text language_id: 311 RMarkdown: type: prose color: "#198ce7" wrap: true ace_mode: markdown codemirror_mode: gfm codemirror_mime_type: text/x-gfm extensions: - ".qmd" - ".rmd" tm_scope: text.md language_id: 313 RON: type: data color: "#a62c00" extensions: - ".ron" ace_mode: rust tm_scope: source.ron language_id: 587855233 ROS Interface: type: data color: "#22314e" aliases: - rosmsg ace_mode: text extensions: - ".msg" - ".action" - ".srv" tm_scope: source.rosmsg language_id: 809230569 RPC: type: programming aliases: - rpcgen - oncrpc - xdr ace_mode: c_cpp extensions: - ".x" tm_scope: source.c language_id: 1031374237 RPGLE: type: programming ace_mode: text color: "#2BDE21" aliases: - ile rpg - sqlrpgle extensions: - ".rpgle" - ".sqlrpgle" tm_scope: source.rpgle language_id: 609977990 RPM Spec: type: data tm_scope: source.rpm-spec extensions: - ".spec" aliases: - specfile ace_mode: text codemirror_mode: rpm codemirror_mime_type: text/x-rpm-spec language_id: 314 RUNOFF: type: markup color: "#665a4e" extensions: - ".rnh" - ".rno" wrap: true tm_scope: text.runoff ace_mode: text language_id: 315 Racket: type: programming color: "#3c5caa" extensions: - ".rkt" - ".rktd" - ".rktl" - ".scrbl" interpreters: - racket tm_scope: source.racket ace_mode: lisp language_id: 316 Ragel: type: programming color: "#9d5200" extensions: - ".rl" aliases: - ragel-rb - ragel-ruby tm_scope: none ace_mode: text language_id: 317 Raku: type: programming color: "#0000fb" extensions: - ".6pl" - ".6pm" - ".nqp" - ".p6" - ".p6l" - ".p6m" - ".pl" - ".pl6" - ".pm" - ".pm6" - ".raku" - ".rakumod" - ".t" interpreters: - perl6 - raku - rakudo aliases: - perl6 - perl-6 tm_scope: source.raku ace_mode: raku codemirror_mode: perl codemirror_mime_type: text/x-perl language_id: 283 Rascal: type: programming color: "#fffaa0" extensions: - ".rsc" tm_scope: source.rascal ace_mode: text language_id: 173616037 Raw token data: type: data aliases: - raw extensions: - ".raw" tm_scope: none ace_mode: text language_id: 318 ReScript: type: programming color: "#ed5051" ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc extensions: - ".res" - ".resi" interpreters: - ocaml tm_scope: source.rescript language_id: 501875647 Readline Config: type: data group: INI aliases: - inputrc - readline filenames: - ".inputrc" - inputrc tm_scope: source.inputrc ace_mode: text language_id: 538732839 Reason: type: programming color: "#ff5847" ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc extensions: - ".re" - ".rei" tm_scope: source.reason language_id: 869538413 ReasonLIGO: type: programming color: "#ff5847" ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc group: LigoLANG extensions: - ".religo" tm_scope: source.religo language_id: 319002153 Rebol: type: programming color: "#358a5b" extensions: - ".reb" - ".r" - ".r2" - ".r3" - ".rebol" ace_mode: text tm_scope: source.rebol language_id: 319 Record Jar: type: data filenames: - language-subtag-registry.txt tm_scope: source.record-jar codemirror_mode: properties codemirror_mime_type: text/x-properties ace_mode: text color: "#0673ba" language_id: 865765202 Red: type: programming color: "#f50000" extensions: - ".red" - ".reds" aliases: - red/system tm_scope: source.red ace_mode: red language_id: 320 Redcode: type: programming extensions: - ".cw" tm_scope: none ace_mode: text language_id: 321 Redirect Rules: type: data aliases: - redirects filenames: - _redirects tm_scope: source.redirects ace_mode: text language_id: 1020148948 Regular Expression: type: data color: "#009a00" extensions: - ".regexp" - ".regex" aliases: - regexp - regex ace_mode: text tm_scope: source.regexp language_id: 363378884 Ren'Py: type: programming aliases: - renpy color: "#ff7f7f" extensions: - ".rpy" tm_scope: source.renpy ace_mode: python language_id: 322 RenderScript: type: programming extensions: - ".rs" - ".rsh" tm_scope: none ace_mode: text language_id: 323 Rez: type: programming extensions: - ".r" tm_scope: source.rez ace_mode: text color: "#FFDAB3" language_id: 498022874 Rich Text Format: type: markup extensions: - ".rtf" tm_scope: text.rtf ace_mode: text language_id: 51601661 Ring: type: programming color: "#2D54CB" extensions: - ".ring" tm_scope: source.ring ace_mode: text language_id: 431 Riot: type: markup color: "#A71E49" ace_mode: html extensions: - ".riot" tm_scope: text.html.riot language_id: 878396783 RobotFramework: type: programming color: "#00c0b5" extensions: - ".robot" - ".resource" tm_scope: text.robot ace_mode: robot language_id: 324 Roc: type: programming color: "#7c38f5" extensions: - ".roc" tm_scope: source.roc ace_mode: text language_id: 440182480 Rocq Prover: type: programming color: "#d0b68c" extensions: - ".v" - ".coq" aliases: - coq - rocq tm_scope: source.coq ace_mode: text language_id: 69 Roff: type: markup color: "#ecdebe" extensions: - ".roff" - ".1" - ".1in" - ".1m" - ".1x" - ".2" - ".3" - ".3in" - ".3m" - ".3p" - ".3pm" - ".3qt" - ".3x" - ".4" - ".5" - ".6" - ".7" - ".8" - ".9" - ".l" - ".man" - ".mdoc" - ".me" - ".ms" - ".n" - ".nr" - ".rno" - ".tmac" filenames: - eqnrc - mmn - mmt - troffrc - troffrc-end tm_scope: text.roff aliases: - groff - man - manpage - man page - man-page - mdoc - nroff - troff wrap: true ace_mode: text codemirror_mode: troff codemirror_mime_type: text/troff language_id: 141 Roff Manpage: type: markup color: "#ecdebe" group: Roff extensions: - ".1" - ".1in" - ".1m" - ".1x" - ".2" - ".3" - ".3in" - ".3m" - ".3p" - ".3pm" - ".3qt" - ".3x" - ".4" - ".5" - ".6" - ".7" - ".8" - ".9" - ".man" - ".mdoc" wrap: true tm_scope: text.roff ace_mode: text codemirror_mode: troff codemirror_mime_type: text/troff language_id: 612669833 Rouge: type: programming ace_mode: clojure codemirror_mode: clojure codemirror_mime_type: text/x-clojure color: "#cc0088" extensions: - ".rg" tm_scope: source.clojure language_id: 325 RouterOS Script: type: programming ace_mode: text extensions: - ".rsc" interpreters: - RouterOS color: "#DE3941" tm_scope: none language_id: 592853203 Ruby: type: programming tm_scope: source.ruby ace_mode: ruby codemirror_mode: ruby codemirror_mime_type: text/x-ruby color: "#701516" aliases: - jruby - macruby - rake - rb - rbx extensions: - ".rb" - ".builder" - ".eye" - ".fcgi" - ".gemspec" - ".god" - ".jbuilder" - ".mspec" - ".pluginspec" - ".podspec" - ".prawn" - ".rabl" - ".rake" - ".rbi" - ".rbuild" - ".rbw" - ".rbx" - ".ru" - ".ruby" - ".spec" - ".thor" - ".watchr" interpreters: - ruby - macruby - rake - jruby - rbx filenames: - ".irbrc" - ".pryrc" - ".simplecov" - Appraisals - Berksfile - Brewfile - Buildfile - Capfile - Dangerfile - Deliverfile - Fastfile - Gemfile - Guardfile - Jarfile - Mavenfile - Podfile - Puppetfile - Rakefile - Snapfile - Steepfile - Thorfile - Vagrantfile - buildfile language_id: 326 Rust: type: programming aliases: - rs color: "#dea584" extensions: - ".rs" - ".rs.in" tm_scope: source.rust ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc interpreters: - rust-script language_id: 327 SAS: type: programming color: "#B34936" extensions: - ".sas" tm_scope: source.sas ace_mode: text codemirror_mode: sas codemirror_mime_type: text/x-sas language_id: 328 SCSS: type: markup color: "#c6538c" tm_scope: source.css.scss ace_mode: scss codemirror_mode: css codemirror_mime_type: text/x-scss extensions: - ".scss" language_id: 329 SELinux Policy: aliases: - SELinux Kernel Policy Language - sepolicy type: data tm_scope: source.sepolicy extensions: - ".te" filenames: - file_contexts - genfs_contexts - initial_sids - port_contexts - security_classes ace_mode: text language_id: 880010326 SMT: type: programming extensions: - ".smt2" - ".smt" - ".z3" interpreters: - boolector - cvc4 - mathsat5 - opensmt - smtinterpol - smt-rat - stp - verit - yices2 - z3 tm_scope: source.smt ace_mode: text language_id: 330 SPARQL: type: data color: "#0C4597" tm_scope: source.sparql ace_mode: sparql codemirror_mode: sparql codemirror_mime_type: application/sparql-query extensions: - ".sparql" - ".rq" language_id: 331 SQF: type: programming color: "#3F3F3F" extensions: - ".sqf" - ".hqf" tm_scope: source.sqf ace_mode: text language_id: 332 SQL: type: data color: "#e38c00" tm_scope: source.sql ace_mode: sql codemirror_mode: sql codemirror_mime_type: text/x-sql extensions: - ".sql" - ".ddl" - ".inc" - ".mysql" - ".prc" - ".tab" - ".udf" - ".viw" language_id: 333 SQLPL: type: programming color: "#e38c00" ace_mode: sql codemirror_mode: sql codemirror_mime_type: text/x-sql tm_scope: source.sql extensions: - ".sql" - ".db2" language_id: 334 SRecode Template: type: markup color: "#348a34" tm_scope: source.lisp ace_mode: lisp codemirror_mode: commonlisp codemirror_mime_type: text/x-common-lisp extensions: - ".srt" language_id: 335 SSH Config: type: data group: INI aliases: - sshconfig - sshdconfig - ssh_config - sshd_config filenames: - ssh-config - ssh_config - sshconfig - sshconfig.snip - sshd-config - sshd_config ace_mode: text tm_scope: source.ssh-config language_id: 554920715 STAR: type: data extensions: - ".star" tm_scope: source.star ace_mode: text language_id: 424510560 STL: type: data color: "#373b5e" aliases: - ascii stl - stla extensions: - ".stl" tm_scope: source.stl ace_mode: text language_id: 455361735 STON: type: data group: Smalltalk extensions: - ".ston" tm_scope: source.smalltalk ace_mode: text language_id: 336 SVG: type: data color: "#ff9900" extensions: - ".svg" tm_scope: text.xml.svg ace_mode: svg codemirror_mode: xml codemirror_mime_type: text/xml language_id: 337 SWIG: type: programming extensions: - ".i" - ".swg" - ".swig" tm_scope: source.c++ ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-c++src language_id: 1066250075 Sage: type: programming extensions: - ".sage" - ".sagews" tm_scope: source.python ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python language_id: 338 Sail: type: programming color: "#259dd5" ace_mode: text extensions: - ".sail" tm_scope: source.sail language_id: 1029438153 SaltStack: type: programming color: "#646464" aliases: - saltstate - salt extensions: - ".sls" tm_scope: source.yaml.salt ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml language_id: 339 Sass: type: markup color: "#a53b70" tm_scope: source.sass extensions: - ".sass" ace_mode: sass codemirror_mode: sass codemirror_mime_type: text/x-sass language_id: 340 Scala: type: programming tm_scope: source.scala ace_mode: scala codemirror_mode: clike codemirror_mime_type: text/x-scala color: "#c22d40" extensions: - ".scala" - ".kojo" - ".sbt" - ".sc" interpreters: - scala language_id: 341 Scaml: type: markup color: "#bd181a" extensions: - ".scaml" tm_scope: source.scaml ace_mode: text language_id: 342 Scenic: type: programming color: "#fdc700" extensions: - ".scenic" tm_scope: source.scenic ace_mode: text interpreters: - scenic language_id: 619814037 Scheme: type: programming color: "#1e4aec" extensions: - ".scm" - ".sch" - ".sld" - ".sls" - ".sps" - ".ss" interpreters: - scheme - guile - bigloo - chicken - csi - gosh - r6rs tm_scope: source.scheme ace_mode: scheme codemirror_mode: scheme codemirror_mime_type: text/x-scheme language_id: 343 Scilab: type: programming color: "#ca0f21" extensions: - ".sci" - ".sce" - ".tst" tm_scope: source.scilab ace_mode: text language_id: 344 Self: type: programming color: "#0579aa" extensions: - ".self" tm_scope: none ace_mode: text language_id: 345 ShaderLab: type: programming color: "#222c37" extensions: - ".shader" ace_mode: text tm_scope: source.shaderlab language_id: 664257356 Shell: type: programming color: "#89e051" aliases: - sh - shell-script - bash - zsh - envrc extensions: - ".sh" - ".bash" - ".bats" - ".cgi" - ".command" - ".fcgi" - ".ksh" - ".sbatch" - ".sh.in" - ".slurm" - ".tmux" - ".tool" - ".trigger" - ".zsh" - ".zsh-theme" filenames: - ".bash_aliases" - ".bash_functions" - ".bash_history" - ".bash_logout" - ".bash_profile" - ".bashrc" - ".cshrc" - ".envrc" - ".flaskenv" - ".kshrc" - ".login" - ".profile" - ".tmux.conf" - ".xinitrc" - ".xsession" - ".zlogin" - ".zlogout" - ".zprofile" - ".zshenv" - ".zshrc" - 9fs - PKGBUILD - bash_aliases - bash_logout - bash_profile - bashrc - cshrc - gradlew - kshrc - login - man - mvnw - profile - tmux.conf - xinitrc - xsession - zlogin - zlogout - zprofile - zshenv - zshrc interpreters: - ash - bash - dash - ksh - mksh - pdksh - rc - sh - zsh tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 346 ShellCheck Config: type: data color: "#cecfcb" filenames: - ".shellcheckrc" aliases: - shellcheckrc tm_scope: source.shellcheckrc ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 687511714 ShellSession: type: programming extensions: - ".sh-session" aliases: - bash session - console tm_scope: text.shell-session ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 347 Shen: type: programming color: "#120F14" extensions: - ".shen" tm_scope: source.shen ace_mode: text language_id: 348 Sieve: type: programming tm_scope: source.sieve ace_mode: text extensions: - ".sieve" codemirror_mode: sieve codemirror_mime_type: application/sieve language_id: 208976687 Simple File Verification: type: data group: Checksums color: "#C9BFED" extensions: - ".sfv" aliases: - sfv tm_scope: source.sfv ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 735623761 Singularity: type: programming color: "#64E6AD" tm_scope: source.singularity filenames: - Singularity ace_mode: text language_id: 987024632 Slang: type: programming color: "#1fbec9" extensions: - ".slang" tm_scope: source.slang ace_mode: text language_id: 239357863 Slash: type: programming color: "#007eff" extensions: - ".sl" tm_scope: text.html.slash ace_mode: text language_id: 349 Slice: type: programming color: "#003fa2" tm_scope: source.ice ace_mode: text extensions: - ".ice" language_id: 894641667 Slim: type: markup color: "#2b2b2b" extensions: - ".slim" tm_scope: text.slim ace_mode: slim codemirror_mode: slim codemirror_mime_type: text/x-slim language_id: 350 Slint: type: markup color: "#2379F4" extensions: - ".slint" tm_scope: source.slint ace_mode: text language_id: 119900149 SmPL: type: programming extensions: - ".cocci" aliases: - coccinelle ace_mode: text tm_scope: source.smpl color: "#c94949" language_id: 164123055 Smali: type: programming extensions: - ".smali" ace_mode: text tm_scope: source.smali language_id: 351 Smalltalk: type: programming color: "#596706" extensions: - ".st" - ".cs" aliases: - squeak tm_scope: source.smalltalk ace_mode: text codemirror_mode: smalltalk codemirror_mime_type: text/x-stsrc language_id: 352 Smarty: type: programming color: "#f0c040" extensions: - ".tpl" ace_mode: smarty codemirror_mode: smarty codemirror_mime_type: text/x-smarty tm_scope: text.html.smarty language_id: 353 Smithy: type: programming ace_mode: smithy codemirror_mode: clike codemirror_mime_type: text/x-csrc tm_scope: source.smithy color: "#c44536" extensions: - ".smithy" language_id: 1027892786 Snakemake: type: programming group: Python tm_scope: source.python ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python color: "#419179" extensions: - ".smk" - ".snakefile" filenames: - Snakefile aliases: - snakefile language_id: 151241392 Solidity: type: programming color: "#AA6746" ace_mode: text tm_scope: source.solidity extensions: - ".sol" language_id: 237469032 Soong: type: data tm_scope: source.bp ace_mode: text filenames: - Android.bp language_id: 222900098 SourcePawn: type: programming color: "#f69e1d" aliases: - sourcemod extensions: - ".sp" - ".inc" tm_scope: source.sourcepawn ace_mode: text language_id: 354 Spline Font Database: type: data extensions: - ".sfd" tm_scope: text.sfd ace_mode: yaml language_id: 767169629 Squirrel: type: programming color: "#800000" extensions: - ".nut" tm_scope: source.nut ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-squirrel language_id: 355 Stan: type: programming color: "#b2011d" extensions: - ".stan" ace_mode: text tm_scope: source.stan language_id: 356 Standard ML: type: programming color: "#dc566d" aliases: - sml extensions: - ".ml" - ".fun" - ".sig" - ".sml" tm_scope: source.ml ace_mode: text codemirror_mode: mllike codemirror_mime_type: text/x-sml language_id: 357 Starlark: type: programming tm_scope: source.python ace_mode: python codemirror_mode: python codemirror_mime_type: text/x-python color: "#76d275" extensions: - ".bzl" - ".star" filenames: - BUCK - BUILD - BUILD.bazel - MODULE.bazel - Tiltfile - WORKSPACE - WORKSPACE.bazel - WORKSPACE.bzlmod aliases: - bazel - bzl language_id: 960266174 Stata: type: programming color: "#1a5f91" extensions: - ".do" - ".ado" - ".doh" - ".ihlp" - ".mata" - ".matah" - ".sthlp" tm_scope: source.stata ace_mode: text language_id: 358 StringTemplate: type: markup color: "#3fb34f" extensions: - ".st" tm_scope: source.string-template ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html language_id: 89855901 Stylus: type: markup color: "#ff6347" extensions: - ".styl" tm_scope: source.stylus ace_mode: stylus codemirror_mode: stylus codemirror_mime_type: text/x-styl language_id: 359 SubRip Text: type: data color: "#9e0101" extensions: - ".srt" ace_mode: text tm_scope: text.srt language_id: 360 SugarSS: type: markup color: "#2fcc9f" tm_scope: source.css.postcss.sugarss extensions: - ".sss" ace_mode: text language_id: 826404698 SuperCollider: type: programming color: "#46390b" extensions: - ".sc" - ".scd" interpreters: - sclang - scsynth tm_scope: source.supercollider ace_mode: text language_id: 361 SurrealQL: type: programming color: "#ff00a0" aliases: - surql extensions: - ".surql" ace_mode: text tm_scope: source.surrealql language_id: 735141027 Survex data: type: data color: "#ffcc99" tm_scope: none ace_mode: text extensions: - ".svx" language_id: 24470517 Svelte: type: markup color: "#ff3e00" tm_scope: source.svelte ace_mode: html codemirror_mode: htmlmixed codemirror_mime_type: text/html extensions: - ".svelte" language_id: 928734530 Sway: type: programming color: "#00F58C" extensions: - ".sw" tm_scope: source.sway ace_mode: rust codemirror_mode: rust codemirror_mime_type: text/x-rustsrc language_id: 271471144 Sweave: type: prose color: "#198ce7" extensions: - ".rnw" tm_scope: text.tex.latex.sweave ace_mode: tex language_id: 558779190 Swift: type: programming color: "#F05138" extensions: - ".swift" tm_scope: source.swift ace_mode: swift codemirror_mode: swift codemirror_mime_type: text/x-swift language_id: 362 SystemVerilog: type: programming color: "#DAE1C2" extensions: - ".sv" - ".svh" - ".vh" tm_scope: source.systemverilog ace_mode: verilog codemirror_mode: verilog codemirror_mime_type: text/x-systemverilog language_id: 363 TI Program: type: programming ace_mode: text color: "#A0AA87" extensions: - ".8xp" - ".8xp.txt" language_id: 422 tm_scope: source.8xp TL-Verilog: type: programming extensions: - ".tlv" tm_scope: source.tlverilog ace_mode: verilog color: "#C40023" language_id: 118656070 TLA: type: programming color: "#4b0079" extensions: - ".tla" tm_scope: source.tla ace_mode: text language_id: 364 TMDL: type: data color: "#f0c913" extensions: - ".tmdl" aliases: - "Tabular Model Definition Language" tm_scope: source.tmdl ace_mode: text language_id: 769162295 TOML: type: data color: "#9c4221" extensions: - ".toml" - ".toml.example" filenames: - Cargo.lock - Cargo.toml.orig - Gopkg.lock - Pipfile - pdm.lock - poetry.lock - uv.lock tm_scope: source.toml ace_mode: toml codemirror_mode: toml codemirror_mime_type: text/x-toml language_id: 365 TSPLIB data: aliases: - travelling salesman problem - traveling salesman problem type: data extensions: - ".tsp" tm_scope: none ace_mode: text language_id: 89289301 TSQL: type: programming color: "#e38c00" extensions: - ".sql" ace_mode: sql tm_scope: source.tsql language_id: 918334941 TSV: type: data color: "#237346" ace_mode: tsv tm_scope: source.tsv extensions: - ".tsv" - ".vcf" aliases: - tab-seperated values language_id: 1035892117 TSX: type: programming color: "#3178c6" group: TypeScript aliases: - typescriptreact extensions: - ".tsx" tm_scope: source.tsx ace_mode: tsx codemirror_mode: jsx codemirror_mime_type: text/typescript-jsx language_id: 94901924 TXL: type: programming color: "#0178b8" extensions: - ".txl" tm_scope: source.txl ace_mode: text language_id: 366 Tact: type: programming color: "#48b5ff" extensions: - ".tact" ace_mode: text tm_scope: source.tact language_id: 606708469 Talon: type: programming ace_mode: text color: "#333333" extensions: - ".talon" tm_scope: source.talon language_id: 959889508 Tcl: type: programming color: "#e4cc98" extensions: - ".tcl" - ".adp" - ".sdc" - ".tcl.in" - ".tm" - ".xdc" aliases: - sdc - xdc filenames: - owh - starfield interpreters: - tclsh - wish tm_scope: source.tcl ace_mode: tcl codemirror_mode: tcl codemirror_mime_type: text/x-tcl language_id: 367 Tcsh: type: programming group: Shell extensions: - ".tcsh" - ".csh" interpreters: - tcsh - csh tm_scope: source.shell ace_mode: sh codemirror_mode: shell codemirror_mime_type: text/x-sh language_id: 368 TeX: type: markup color: "#3D6117" ace_mode: tex codemirror_mode: stex codemirror_mime_type: text/x-stex tm_scope: text.tex.latex wrap: true aliases: - latex extensions: - ".tex" - ".aux" - ".bbx" - ".cbx" - ".cls" - ".dtx" - ".ins" - ".lbx" - ".ltx" - ".mkii" - ".mkiv" - ".mkvi" - ".sty" - ".toc" language_id: 369 Tea: type: markup extensions: - ".tea" tm_scope: source.tea ace_mode: text language_id: 370 Teal: type: programming extensions: - ".tl" color: "#00B1BC" tm_scope: source.teal ace_mode: lua codemirror_mode: lua codemirror_mime_type: text/x-lua interpreters: - tl language_id: 719038619 Terra: type: programming extensions: - ".t" color: "#00004c" tm_scope: source.terra ace_mode: lua codemirror_mode: lua codemirror_mime_type: text/x-lua interpreters: - lua language_id: 371 Terraform Template: type: markup extensions: - ".tftpl" color: "#7b42bb" tm_scope: source.hcl.terraform ace_mode: ruby codemirror_mode: ruby codemirror_mime_type: text/x-ruby group: HCL language_id: 856832701 Texinfo: type: prose wrap: true extensions: - ".texinfo" - ".texi" - ".txi" ace_mode: text tm_scope: text.texinfo interpreters: - makeinfo language_id: 988020015 Text: type: prose wrap: true aliases: - fundamental - plain text extensions: - ".txt" - ".fr" - ".nb" - ".ncl" - ".no" filenames: - CITATION - CITATIONS - COPYING - COPYING.regex - COPYRIGHT.regex - FONTLOG - INSTALL - INSTALL.mysql - LICENSE - LICENSE.mysql - NEWS - README.me - README.mysql - README.nss - click.me - delete.me - keep.me - package.mask - package.use.mask - package.use.stable.mask - read.me - readme.1st - test.me - use.mask - use.stable.mask tm_scope: none ace_mode: text language_id: 372 TextGrid: type: data color: "#c8506d" tm_scope: source.textgrid ace_mode: text extensions: - ".TextGrid" language_id: 965696054 TextMate Properties: type: data color: "#df66e4" aliases: - tm-properties filenames: - ".tm_properties" ace_mode: properties codemirror_mode: properties codemirror_mime_type: text/x-properties tm_scope: source.tm-properties language_id: 981795023 Textile: type: prose color: "#ffe7ac" ace_mode: textile codemirror_mode: textile codemirror_mime_type: text/x-textile wrap: true extensions: - ".textile" tm_scope: none language_id: 373 Thrift: type: programming color: "#D12127" tm_scope: source.thrift extensions: - ".thrift" ace_mode: text language_id: 374 Toit: type: programming color: "#c2c9fb" extensions: - ".toit" tm_scope: source.toit ace_mode: text language_id: 356554395 Tor Config: type: data color: "#59316b" filenames: - torrc tm_scope: source.torrc ace_mode: apache_conf aliases: - torrc language_id: 1016912802 Tree-sitter Query: type: programming color: "#8ea64c" aliases: - tsq extensions: - ".scm" tm_scope: source.scm ace_mode: text language_id: 436081647 Turing: type: programming color: "#cf142b" extensions: - ".t" - ".tu" tm_scope: source.turing ace_mode: text language_id: 375 Turtle: type: data extensions: - ".ttl" tm_scope: source.turtle ace_mode: turtle codemirror_mode: turtle codemirror_mime_type: text/turtle language_id: 376 Twig: type: markup color: "#c1d026" extensions: - ".twig" tm_scope: text.html.twig ace_mode: twig codemirror_mode: twig codemirror_mime_type: text/x-twig language_id: 377 Type Language: type: data aliases: - tl extensions: - ".tl" tm_scope: source.tl ace_mode: text language_id: 632765617 TypeScript: type: programming color: "#3178c6" aliases: - ts interpreters: - bun - deno - ts-node - tsx extensions: - ".ts" - ".cts" - ".mts" tm_scope: source.ts ace_mode: typescript codemirror_mode: javascript codemirror_mime_type: application/typescript language_id: 378 TypeSpec: type: programming color: "#4A3665" aliases: - tsp extensions: - ".tsp" tm_scope: source.tsp ace_mode: text language_id: 952272597 Typst: type: programming color: "#239dad" aliases: - typ extensions: - ".typ" tm_scope: source.typst ace_mode: text language_id: 704730682 Unified Parallel C: type: programming color: "#4e3617" group: C ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc extensions: - ".upc" tm_scope: source.c language_id: 379 Unity3D Asset: type: data color: "#222c37" ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml extensions: - ".anim" - ".asset" - ".mask" - ".mat" - ".meta" - ".prefab" - ".unity" tm_scope: source.yaml language_id: 380 Unix Assembly: type: programming group: Assembly extensions: - ".s" - ".ms" aliases: - gas - gnu asm - unix asm tm_scope: source.x86 ace_mode: assembly_x86 language_id: 120 Uno: type: programming color: "#9933cc" extensions: - ".uno" ace_mode: csharp codemirror_mode: clike codemirror_mime_type: text/x-csharp tm_scope: source.cs language_id: 381 UnrealScript: type: programming color: "#a54c4d" extensions: - ".uc" tm_scope: source.java ace_mode: java codemirror_mode: clike codemirror_mime_type: text/x-java language_id: 382 Untyped Plutus Core: type: programming color: "#36adbd" ace_mode: text extensions: - ".uplc" tm_scope: source.uplc language_id: 1061635506 UrWeb: type: programming color: "#ccccee" aliases: - Ur/Web - Ur extensions: - ".ur" - ".urs" tm_scope: source.ur ace_mode: text language_id: 383 V: type: programming color: "#4f87c4" aliases: - vlang extensions: - ".v" tm_scope: source.v ace_mode: golang codemirror_mode: go codemirror_mime_type: text/x-go language_id: 603371597 VBA: type: programming color: "#867db1" extensions: - ".bas" - ".cls" - ".frm" - ".vba" tm_scope: source.vba aliases: - visual basic for applications ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb language_id: 399230729 VBScript: type: programming color: "#15dcdc" extensions: - ".vbs" tm_scope: source.vbnet ace_mode: vbscript codemirror_mode: vbscript codemirror_mime_type: text/vbscript language_id: 408016005 VCL: type: programming color: "#148AA8" extensions: - ".vcl" tm_scope: source.vcl ace_mode: text language_id: 384 VHDL: type: programming color: "#adb2cb" extensions: - ".vhdl" - ".vhd" - ".vhf" - ".vhi" - ".vho" - ".vhs" - ".vht" - ".vhw" tm_scope: source.vhdl ace_mode: vhdl codemirror_mode: vhdl codemirror_mime_type: text/x-vhdl language_id: 385 Vala: type: programming color: "#a56de2" extensions: - ".vala" - ".vapi" tm_scope: source.vala ace_mode: vala language_id: 386 Valve Data Format: type: data color: "#f26025" aliases: - keyvalues - vdf extensions: - ".vdf" ace_mode: text tm_scope: source.keyvalues language_id: 544060961 Velocity Template Language: type: markup color: "#507cff" aliases: - vtl - velocity extensions: - ".vtl" ace_mode: velocity tm_scope: source.velocity codemirror_mode: velocity codemirror_mime_type: text/velocity language_id: 292377326 Vento: type: markup color: "#ff0080" extensions: - ".vto" tm_scope: source.vento ace_mode: text language_id: 757053899 Verilog: type: programming color: "#b2b7f8" extensions: - ".v" - ".veo" tm_scope: source.verilog ace_mode: verilog codemirror_mode: verilog codemirror_mime_type: text/x-verilog language_id: 387 Vim Help File: type: prose color: "#199f4b" aliases: - help - vimhelp extensions: - ".txt" tm_scope: text.vim-help ace_mode: text language_id: 508563686 Vim Script: type: programming color: "#199f4b" tm_scope: source.viml aliases: - vim - viml - nvim - vimscript extensions: - ".vim" - ".vba" - ".vimrc" - ".vmb" filenames: - ".exrc" - ".gvimrc" - ".nvimrc" - ".vimrc" - _vimrc - gvimrc - nvimrc - vimrc ace_mode: text language_id: 388 Vim Snippet: type: markup color: "#199f4b" aliases: - SnipMate - UltiSnip - UltiSnips - NeoSnippet extensions: - ".snip" - ".snippet" - ".snippets" tm_scope: source.vim-snippet ace_mode: text language_id: 81265970 Visual Basic .NET: type: programming color: "#945db7" extensions: - ".vb" - ".vbhtml" aliases: - visual basic - vbnet - vb .net - vb.net tm_scope: source.vbnet ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb language_id: 389 Visual Basic 6.0: type: programming color: "#2c6353" extensions: - ".bas" - ".cls" - ".ctl" - ".Dsr" - ".frm" tm_scope: source.vba aliases: - vb6 - vb 6 - visual basic 6 - visual basic classic - classic visual basic ace_mode: text codemirror_mode: vb codemirror_mime_type: text/x-vb language_id: 679594952 Volt: type: programming color: "#1F1F1F" extensions: - ".volt" tm_scope: source.d ace_mode: d codemirror_mode: d codemirror_mime_type: text/x-d language_id: 390 Vue: type: markup color: "#41b883" extensions: - ".vue" tm_scope: text.html.vue ace_mode: vue codemirror_mode: vue codemirror_mime_type: text/x-vue language_id: 391 Vyper: type: programming extensions: - ".vy" color: "#9F4CF2" ace_mode: text tm_scope: source.vyper language_id: 1055641948 WDL: aliases: - Workflow Description Language type: programming color: "#42f1f4" extensions: - ".wdl" tm_scope: source.wdl ace_mode: text language_id: 374521672 WGSL: type: programming color: "#1a5e9a" extensions: - ".wgsl" tm_scope: source.wgsl ace_mode: text language_id: 836605993 Wavefront Material: type: data extensions: - ".mtl" tm_scope: source.wavefront.mtl ace_mode: text language_id: 392 Wavefront Object: type: data extensions: - ".obj" tm_scope: source.wavefront.obj ace_mode: text language_id: 393 Web Ontology Language: type: data color: "#5b70bd" extensions: - ".owl" tm_scope: text.xml ace_mode: xml language_id: 394 WebAssembly: type: programming color: "#04133b" extensions: - ".wast" - ".wat" aliases: - wast - wasm tm_scope: source.webassembly ace_mode: lisp codemirror_mode: wast codemirror_mime_type: text/webassembly language_id: 956556503 WebAssembly Interface Type: type: data color: "#6250e7" extensions: - ".wit" aliases: - wit ace_mode: text tm_scope: source.wit codemirror_mode: webidl codemirror_mime_type: text/x-webidl language_id: 134534086 WebIDL: type: programming extensions: - ".webidl" tm_scope: source.webidl ace_mode: text codemirror_mode: webidl codemirror_mime_type: text/x-webidl language_id: 395 WebVTT: type: data wrap: true aliases: - vtt extensions: - ".vtt" tm_scope: text.vtt ace_mode: text language_id: 658679714 Wget Config: type: data group: INI aliases: - wgetrc filenames: - ".wgetrc" tm_scope: source.wgetrc ace_mode: text language_id: 668457123 Whiley: type: programming color: "#d5c397" extensions: - ".whiley" tm_scope: source.whiley ace_mode: text language_id: 888779559 Wikitext: type: prose color: "#fc5757" wrap: true aliases: - mediawiki - wiki extensions: - ".mediawiki" - ".wiki" - ".wikitext" tm_scope: text.html.mediawiki ace_mode: mediawiki language_id: 228 Win32 Message File: type: data extensions: - ".mc" tm_scope: source.win32-messages ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 950967261 Windows Registry Entries: type: data color: "#52d5ff" extensions: - ".reg" tm_scope: source.reg ace_mode: ini codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 969674868 Witcher Script: type: programming color: "#ff0000" extensions: - ".ws" ace_mode: text tm_scope: source.witcherscript language_id: 686821385 Wolfram Language: type: programming color: "#dd1100" extensions: - ".mathematica" - ".cdf" - ".m" - ".ma" - ".mt" - ".nb" - ".nbp" - ".wl" - ".wls" - ".wlt" aliases: - mathematica - mma - wolfram - wolfram lang - wl interpreters: - wolfram - WolframKernel - wolframscript - math - MathKernel - MathematicaScript - WolframNB - Mathematica tm_scope: source.mathematica ace_mode: text codemirror_mode: mathematica codemirror_mime_type: text/x-mathematica language_id: 224 Wollok: type: programming color: "#a23738" extensions: - ".wlk" ace_mode: wollok tm_scope: source.wollok language_id: 632745969 World of Warcraft Addon Data: type: data color: "#f7e43f" extensions: - ".toc" tm_scope: source.toc ace_mode: text language_id: 396 Wren: type: programming color: "#383838" aliases: - wrenlang extensions: - ".wren" tm_scope: source.wren ace_mode: text language_id: 713580619 X BitMap: type: data group: C aliases: - xbm extensions: - ".xbm" ace_mode: c_cpp tm_scope: source.c codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 782911107 X Font Directory Index: type: data filenames: - encodings.dir - fonts.alias - fonts.dir - fonts.scale tm_scope: source.fontdir ace_mode: text language_id: 208700028 X PixMap: type: data group: C aliases: - xpm extensions: - ".xpm" - ".pm" ace_mode: c_cpp tm_scope: source.c codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 781846279 X10: type: programming aliases: - xten ace_mode: text extensions: - ".x10" color: "#4B6BEF" tm_scope: source.x10 language_id: 397 XC: type: programming color: "#99DA07" extensions: - ".xc" tm_scope: source.xc ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 398 XCompose: type: data filenames: - ".XCompose" - XCompose - xcompose tm_scope: config.xcompose ace_mode: text language_id: 225167241 XML: type: data color: "#0060ac" tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml aliases: - rss - xsd - wsdl extensions: - ".xml" - ".adml" - ".admx" - ".ant" - ".axaml" - ".axml" - ".builds" - ".ccproj" - ".ccxml" - ".clixml" - ".cproject" - ".cscfg" - ".csdef" - ".csl" - ".csproj" - ".ct" - ".depproj" - ".dita" - ".ditamap" - ".ditaval" - ".dll.config" - ".dotsettings" - ".filters" - ".fsproj" - ".fxml" - ".glade" - ".gml" - ".gmx" - ".gpx" - ".grxml" - ".gst" - ".hzp" - ".icls" - ".iml" - ".ivy" - ".jelly" - ".jsproj" - ".kml" - ".launch" - ".mdpolicy" - ".mjml" - ".mm" - ".mod" - ".mojo" - ".mxml" - ".natvis" - ".ncl" - ".ndproj" - ".nproj" - ".nuspec" - ".odd" - ".osm" - ".pkgproj" - ".pluginspec" - ".proj" - ".props" - ".ps1xml" - ".psc1" - ".pt" - ".pubxml" - ".qhelp" - ".rdf" - ".res" - ".resx" - ".rs" - ".rss" - ".sch" - ".scxml" - ".sfproj" - ".shproj" - ".slnx" - ".srdf" - ".storyboard" - ".sublime-snippet" - ".sw" - ".targets" - ".tml" - ".ts" - ".tsx" - ".typ" - ".ui" - ".urdf" - ".ux" - ".vbproj" - ".vcxproj" - ".vsixmanifest" - ".vssettings" - ".vstemplate" - ".vxml" - ".wixproj" - ".workflow" - ".wsdl" - ".wsf" - ".wxi" - ".wxl" - ".wxs" - ".x3d" - ".xacro" - ".xaml" - ".xib" - ".xlf" - ".xliff" - ".xmi" - ".xml.dist" - ".xmp" - ".xproj" - ".xsd" - ".xspec" - ".xul" - ".zcml" filenames: - ".classpath" - ".cproject" - ".project" - App.config - NuGet.config - Settings.StyleCop - Web.Debug.config - Web.Release.config - Web.config - packages.config language_id: 399 XML Property List: type: data color: "#0060ac" group: XML extensions: - ".plist" - ".stTheme" - ".tmCommand" - ".tmLanguage" - ".tmPreferences" - ".tmSnippet" - ".tmTheme" tm_scope: text.xml.plist ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 75622871 XPages: type: data extensions: - ".xsp-config" - ".xsp.metadata" tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 400 XProc: type: programming extensions: - ".xpl" - ".xproc" tm_scope: text.xml ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml language_id: 401 XQuery: type: programming color: "#5232e7" extensions: - ".xquery" - ".xq" - ".xql" - ".xqm" - ".xqy" ace_mode: xquery codemirror_mode: xquery codemirror_mime_type: application/xquery tm_scope: source.xq language_id: 402 XS: type: programming extensions: - ".xs" tm_scope: source.c ace_mode: c_cpp codemirror_mode: clike codemirror_mime_type: text/x-csrc language_id: 403 XSLT: type: programming aliases: - xsl extensions: - ".xslt" - ".xsl" tm_scope: text.xml.xsl ace_mode: xml codemirror_mode: xml codemirror_mime_type: text/xml color: "#EB8CEB" language_id: 404 Xmake: type: programming color: "#22a079" filenames: - xmake.lua tm_scope: source.xmake ace_mode: text language_id: 225223071 Xojo: type: programming color: "#81bd41" extensions: - ".xojo_code" - ".xojo_menu" - ".xojo_report" - ".xojo_script" - ".xojo_toolbar" - ".xojo_window" tm_scope: source.xojo ace_mode: text language_id: 405 Xonsh: type: programming color: "#285EEF" extensions: - ".xsh" tm_scope: source.python ace_mode: text codemirror_mode: python codemirror_mime_type: text/x-python language_id: 614078284 Xtend: type: programming color: "#24255d" extensions: - ".xtend" tm_scope: source.xtend ace_mode: text language_id: 406 YAML: type: data color: "#cb171e" tm_scope: source.yaml aliases: - yml extensions: - ".yml" - ".mir" - ".reek" - ".rviz" - ".sublime-syntax" - ".syntax" - ".yaml" - ".yaml-tmlanguage" - ".yaml.sed" - ".yml.mysql" filenames: - ".clang-format" - ".clang-tidy" - ".clangd" - ".gemrc" - CITATION.cff - glide.lock - pixi.lock - yarn.lock ace_mode: yaml codemirror_mode: yaml codemirror_mime_type: text/x-yaml language_id: 407 YANG: type: data extensions: - ".yang" tm_scope: source.yang ace_mode: text language_id: 408 YARA: type: programming color: "#220000" ace_mode: text extensions: - ".yar" - ".yara" tm_scope: source.yara language_id: 805122868 YASnippet: type: markup aliases: - snippet - yas color: "#32AB90" extensions: - ".yasnippet" tm_scope: source.yasnippet ace_mode: text language_id: 378760102 Yacc: type: programming extensions: - ".y" - ".yacc" - ".yy" tm_scope: source.yacc ace_mode: text color: "#4B6C4B" language_id: 409 Yul: type: programming color: "#794932" ace_mode: text tm_scope: source.yul extensions: - ".yul" language_id: 237469033 ZAP: type: programming color: "#0d665e" extensions: - ".zap" - ".xzap" tm_scope: source.zap ace_mode: text language_id: 952972794 ZIL: type: programming color: "#dc75e5" extensions: - ".zil" - ".mud" tm_scope: source.zil ace_mode: text language_id: 973483626 Zeek: type: programming aliases: - bro extensions: - ".zeek" - ".bro" tm_scope: source.zeek ace_mode: zeek language_id: 40 ZenScript: type: programming color: "#00BCD1" extensions: - ".zs" tm_scope: source.zenscript ace_mode: text language_id: 494938890 Zephir: type: programming color: "#118f9e" extensions: - ".zep" tm_scope: source.php.zephir ace_mode: php language_id: 410 Zig: type: programming color: "#ec915c" extensions: - ".zig" - ".zig.zon" tm_scope: source.zig ace_mode: zig language_id: 646424281 Zimpl: type: programming color: "#d67711" extensions: - ".zimpl" - ".zmpl" - ".zpl" tm_scope: none ace_mode: text language_id: 411 Zmodel: type: data color: "#ff7100" extensions: - ".zmodel" tm_scope: source.zmodel ace_mode: text language_id: 803760908 cURL Config: type: data group: INI aliases: - curlrc filenames: - ".curlrc" - _curlrc tm_scope: source.curlrc ace_mode: text language_id: 992375436 crontab: type: data color: "#ead7ac" aliases: - cron - cron table filenames: - crontab tm_scope: text.crontab ace_mode: tcl language_id: 705203557 desktop: type: data extensions: - ".desktop" - ".desktop.in" - ".service" tm_scope: source.desktop ace_mode: text language_id: 412 dircolors: type: data extensions: - ".dircolors" filenames: - ".dir_colors" - ".dircolors" - DIR_COLORS - _dir_colors - _dircolors - dir_colors tm_scope: source.dircolors ace_mode: text language_id: 691605112 eC: type: programming color: "#913960" extensions: - ".ec" - ".eh" tm_scope: source.c.ec ace_mode: text language_id: 413 edn: type: data ace_mode: clojure codemirror_mode: clojure codemirror_mime_type: application/edn extensions: - ".edn" tm_scope: source.clojure language_id: 414 fish: type: programming color: "#4aae47" group: Shell interpreters: - fish extensions: - ".fish" tm_scope: source.fish ace_mode: text language_id: 415 hoon: type: programming color: "#00b171" tm_scope: source.hoon ace_mode: text extensions: - ".hoon" language_id: 560883276 iCalendar: type: data color: "#ec564c" extensions: - ".ics" - ".ical" tm_scope: source.iCalendar aliases: - iCal ace_mode: properties codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 98384424 jq: color: "#c7254e" ace_mode: text type: programming extensions: - ".jq" interpreters: - gojq - jaq - jq - jqjq - jqq - query-json tm_scope: source.jq language_id: 905371884 kvlang: type: markup ace_mode: text extensions: - ".kv" color: "#1da6e0" tm_scope: source.python.kivy language_id: 970675279 mIRC Script: type: programming color: "#3d57c3" extensions: - ".mrc" tm_scope: source.msl ace_mode: text language_id: 517654727 mcfunction: type: programming color: "#E22837" extensions: - ".mcfunction" tm_scope: source.mcfunction ace_mode: text language_id: 462488745 mdsvex: type: markup color: "#5f9ea0" tm_scope: none ace_mode: markdown codemirror_mode: gfm codemirror_mime_type: text/x-gfm wrap: true extensions: - ".svx" language_id: 566198445 mupad: type: programming color: "#244963" extensions: - ".mu" tm_scope: source.mupad ace_mode: text language_id: 416 nanorc: type: data color: "#2d004d" group: INI extensions: - ".nanorc" filenames: - ".nanorc" - nanorc tm_scope: source.nanorc ace_mode: text language_id: 775996197 nesC: type: programming color: "#94B0C7" extensions: - ".nc" ace_mode: text tm_scope: source.nesc language_id: 417 ooc: type: programming color: "#b0b77e" extensions: - ".ooc" tm_scope: source.ooc ace_mode: text language_id: 418 q: type: programming extensions: - ".q" tm_scope: source.q ace_mode: text codemirror_mode: q codemirror_mime_type: text/x-q color: "#0040cd" language_id: 970539067 reStructuredText: type: prose color: "#141414" wrap: true aliases: - rst extensions: - ".rst" - ".rest" - ".rest.txt" - ".rst.txt" tm_scope: text.restructuredtext ace_mode: rst codemirror_mode: rst codemirror_mime_type: text/x-rst language_id: 419 robots.txt: type: data aliases: - robots - robots txt filenames: - robots.txt ace_mode: text tm_scope: text.robots-txt language_id: 674736065 sed: type: programming color: "#64b970" extensions: - ".sed" interpreters: - gsed - minised - sed - ssed ace_mode: text tm_scope: source.sed language_id: 847830017 templ: type: markup color: "#66D0DD" extensions: - ".templ" ace_mode: text tm_scope: source.templ language_id: 795579337 vCard: type: data color: "#ee2647" extensions: - ".vcf" tm_scope: source.vcard aliases: - virtual contact file - electronic business card ace_mode: properties codemirror_mode: properties codemirror_mime_type: text/x-properties language_id: 851476558 wisp: type: programming ace_mode: clojure codemirror_mode: clojure codemirror_mime_type: text/x-clojure color: "#7582D1" extensions: - ".wisp" tm_scope: source.clojure language_id: 420 xBase: type: programming color: "#403a40" aliases: - advpl - clipper - foxpro extensions: - ".prg" - ".ch" - ".prw" tm_scope: source.harbour ace_mode: text language_id: 421 ================================================ FILE: lib/linguist/lazy_blob.rb ================================================ require 'linguist/blob_helper' require 'linguist/language' require 'linguist/source/repository' require 'linguist/source/rugged' module Linguist class LazyBlob GIT_ATTR = ['linguist-documentation', 'linguist-language', 'linguist-vendored', 'linguist-generated', 'linguist-detectable'] # DEPRECATED: use Linguist::Source::RuggedRepository::GIT_ATTR_OPTS instead GIT_ATTR_OPTS = Linguist::Source::RuggedRepository::GIT_ATTR_OPTS # DEPRECATED: use Linguist::Source::RuggedRepository::GIT_ATTR_FLAGS instead GIT_ATTR_FLAGS = Linguist::Source::RuggedRepository::GIT_ATTR_FLAGS include BlobHelper MAX_SIZE = 128 * 1024 attr_reader :repository attr_reader :oid attr_reader :path attr_reader :mode alias :name :path def initialize(repo, oid, path, mode = nil) @repository = if repo.is_a? Linguist::Source::Repository repo else # Allow this for backward-compatibility purposes Linguist::Source::RuggedRepository.new(repo) end @oid = oid @path = path @mode = mode @data = nil end def git_attributes @git_attributes ||= repository.load_attributes_for_path(name, GIT_ATTR) end def documentation? if not git_attributes['linguist-documentation'].nil? boolean_attribute(git_attributes['linguist-documentation']) else super end end def generated? if not git_attributes['linguist-generated'].nil? boolean_attribute(git_attributes['linguist-generated']) else super end end def vendored? if not git_attributes['linguist-vendored'].nil? boolean_attribute(git_attributes['linguist-vendored']) else super end end def language return @language if defined?(@language) @language = if lang = git_attributes['linguist-language'] detected_language = Language.find_by_alias(lang) # If strategies are being tracked, get the original strategy that would have been used if detected_language && Linguist.instrumenter # Get the original strategy by calling super (which calls Linguist.detect) original_language = super original_strategy_info = Linguist.instrumenter.detected_info[self.name] original_strategy = original_strategy_info ? original_strategy_info[:strategy] : "Unknown" if original_language == detected_language strategy_name = "#{original_strategy} (confirmed by .gitattributes)" else strategy_name = "#{original_strategy} (overridden by .gitattributes)" end strategy = Struct.new(:name).new(strategy_name) Linguist.instrument("linguist.detected", blob: self, strategy: strategy, language: detected_language) end detected_language else super end end def detectable? if not git_attributes['linguist-detectable'].nil? boolean_attribute(git_attributes['linguist-detectable']) else nil end end def data load_blob! @data end def size load_blob! @size end def symlink? # We don't create LazyBlobs for symlinks. false end def cleanup! @data.clear if @data end protected # Returns true if the attribute is present and not the string "false" and not the false boolean. def boolean_attribute(attribute) attribute != "false" && attribute != false end def load_blob! @data, @size = repository.load_blob(oid, MAX_SIZE) if @data.nil? end end end ================================================ FILE: lib/linguist/popular.yml ================================================ # Popular languages appear at the top of language dropdowns # # This file should only be edited by GitHub staff - C - C# - C++ - CoffeeScript - CSS - Dart - DM - Elixir - Go - Groovy - HTML - Java - JavaScript - Kotlin - Objective-C - Perl - PHP - PowerShell - Python - Ruby - Rust - Scala - Shell - Swift - TypeScript ================================================ FILE: lib/linguist/repository.rb ================================================ require 'linguist/lazy_blob' require 'linguist/source/repository' require 'linguist/source/rugged' module Linguist # A Repository is an abstraction of a Grit::Repo or a basic file # system tree. It holds a list of paths pointing to Blobish objects. # # Its primary purpose is for gathering language statistics across # the entire project. class Repository attr_reader :repository MAX_TREE_SIZE = 100_000 # Public: Create a new Repository based on the stats of # an existing one def self.incremental(repo, commit_oid, old_commit_oid, old_stats, max_tree_size = MAX_TREE_SIZE) repo = self.new(repo, commit_oid, max_tree_size) repo.load_existing_stats(old_commit_oid, old_stats) repo end # Public: Initialize a new Repository to be analyzed for language # data # # repo - a Linguist::Source::Repository object # commit_oid - the sha1 of the commit that will be analyzed; # this is usually the master branch # max_tree_size - the maximum tree size to consider for analysis (default: MAX_TREE_SIZE) # # Returns a Repository def initialize(repo, commit_oid, max_tree_size = MAX_TREE_SIZE) @repository = if repo.is_a? Linguist::Source::Repository repo else # Allow this for backward-compatibility purposes Linguist::Source::RuggedRepository.new(repo) end @commit_oid = commit_oid @max_tree_size = max_tree_size @old_commit_oid = nil @old_stats = nil raise TypeError, 'commit_oid must be a commit SHA1' unless commit_oid.is_a?(String) end # Public: Load the results of a previous analysis on this repository # to speed up the new scan. # # The new analysis will be performed incrementally as to only take # into account the file changes since the last time the repository # was scanned # # old_commit_oid - the sha1 of the commit that was previously analyzed # old_stats - the result of the previous analysis, obtained by calling # Repository#cache on the old repository # # Returns nothing def load_existing_stats(old_commit_oid, old_stats) @old_commit_oid = old_commit_oid @old_stats = old_stats nil end # Public: Returns a breakdown of language stats. # # Examples # # # => { 'Ruby' => 46319, # 'JavaScript' => 258 } # # Returns a Hash of language names and Integer size values. def languages @sizes ||= begin sizes = Hash.new { 0 } cache.each do |_, (language, size)| sizes[language] += size end sizes end end # Public: Get primary Language of repository. # # Returns a language name def language @language ||= begin primary = languages.max_by { |(_, size)| size } primary && primary[0] end end # Public: Get the total size of the repository. # # Returns a byte size Integer def size @size ||= languages.inject(0) { |s,(_,v)| s + v } end # Public: Return the language breakdown of this repository by file # # Returns a map of language names => [filenames...] def breakdown_by_file @file_breakdown ||= begin breakdown = Hash.new { |h,k| h[k] = Array.new } cache.each do |filename, (language, _)| breakdown[language] << filename.dup.force_encoding("UTF-8").scrub end breakdown end end # Public: Return the cached results of the analysis # # This is a per-file breakdown that can be passed to other instances # of Linguist::Repository to perform incremental scans # # Returns a map of filename => [language, size] def cache @cache ||= begin if @old_commit_oid == @commit_oid @old_stats else compute_stats(@old_commit_oid, @old_stats) end end end def read_index raise NotImplementedError, "read_index is deprecated" unless repository.is_a? Linguist::Source::RuggedRepository repository.set_attribute_source(@commit_oid) end def current_tree raise NotImplementedError, "current_tree is deprecated" unless repository.is_a? Linguist::Source::RuggedRepository repository.get_tree(@commit_oid) end protected def compute_stats(old_commit_oid, cache = nil) return {} if repository.get_tree_size(@commit_oid, @max_tree_size) >= @max_tree_size repository.set_attribute_source(@commit_oid) diff = repository.diff(old_commit_oid, @commit_oid) # Clear file map and fetch full diff if any .gitattributes files are changed if cache && diff.each_delta.any? { |delta| File.basename(delta.new_file[:path]) == ".gitattributes" } diff = repository.diff(nil, @commit_oid) file_map = {} else file_map = cache ? cache.dup : {} end diff.each_delta do |delta| old = delta.old_file[:path] new = delta.new_file[:path] file_map.delete(old) next if delta.binary? if [:added, :modified].include? delta.status # Skip submodules and symlinks mode = delta.new_file[:mode] mode_format = (mode & 0170000) next if mode_format == 0120000 || mode_format == 040000 || mode_format == 0160000 blob = Linguist::LazyBlob.new(repository, delta.new_file[:oid], new, mode.to_s(8)) update_file_map(blob, file_map, new) blob.cleanup! end end file_map end def update_file_map(blob, file_map, key) if blob.include_in_language_stats? file_map[key] = [blob.language.group.name, blob.size] end end end end ================================================ FILE: lib/linguist/samples.rb ================================================ begin require 'yajl' rescue LoadError require 'json' end require 'linguist/sha256' require 'linguist/classifier' require 'linguist/shebang' module Linguist # Model for accessing classifier training data. module Samples # Path to samples root directory ROOT = File.expand_path("../../../samples", __FILE__) # Path for serialized samples db PATH = File.expand_path('../samples.json', __FILE__) # Hash of serialized samples object, cached in memory def self.cache @cache ||= load_samples end # Hash of serialized samples object, uncached def self.load_samples serializer = defined?(Yajl) ? Yajl : JSON data = serializer.load(File.read(PATH, encoding: 'utf-8')) # JSON serialization does not allow integer keys, we fix them here for lang in data['centroids'].keys fixed = data['centroids'][lang].to_a.map { |k,v| [k.to_i, v] } data['centroids'][lang] = Hash[fixed] end data end # Public: Iterate over each sample. # # &block - Yields Sample to block # # Returns nothing. def self.each(&block) Dir.entries(ROOT).sort!.each do |category| next if category == '.' || category == '..' dirname = File.join(ROOT, category) Dir.entries(dirname).each do |filename| next if filename == '.' || filename == '..' if filename == 'filenames' Dir.entries(File.join(dirname, filename)).each do |subfilename| next if subfilename == '.' || subfilename == '..' yield({ :path => File.join(dirname, filename, subfilename), :language => category, :filename => subfilename }) end else path = File.join(dirname, filename) extname = File.extname(filename) yield({ :path => path, :language => category, :interpreter => Shebang.interpreter(File.read(path)), :extname => extname.empty? ? nil : extname }) end end end nil end # Public: Build Classifier from all samples. # # Returns trained Classifier. def self.data db = {} db['extnames'] = {} db['interpreters'] = {} db['filenames'] = {} each do |sample| language_name = sample[:language] if sample[:extname] db['extnames'][language_name] ||= [] if !db['extnames'][language_name].include?(sample[:extname]) db['extnames'][language_name] << sample[:extname] db['extnames'][language_name].sort! end end if sample[:interpreter] db['interpreters'][language_name] ||= [] if !db['interpreters'][language_name].include?(sample[:interpreter]) db['interpreters'][language_name] << sample[:interpreter] db['interpreters'][language_name].sort! end end if sample[:filename] db['filenames'][language_name] ||= [] db['filenames'][language_name] << sample[:filename] db['filenames'][language_name].sort! end data = File.read(sample[:path]) Classifier.train!(db, language_name, data) end Classifier.finalize_train! db db['sha256'] = Linguist::SHA256.hexdigest(db) db end end end ================================================ FILE: lib/linguist/sha256.rb ================================================ require 'digest/sha2' module Linguist module SHA256 # Public: Create deep nested digest of value object. # # Useful for object comparison. # # obj - Object to digest. # # Returns String hex digest def self.hexdigest(obj) digest = Digest::SHA256.new case obj when String, Symbol, Integer, Float digest.update "#{obj.class}" digest.update "#{obj}" when TrueClass, FalseClass, NilClass digest.update "#{obj.class}" when Array digest.update "#{obj.class}" for e in obj digest.update(hexdigest(e)) end when Hash digest.update "#{obj.class}" for e in obj.map { |(k, v)| hexdigest([k, v]) }.sort digest.update(e) end else raise TypeError, "can't convert #{obj.inspect} into String" end digest.hexdigest end end end ================================================ FILE: lib/linguist/shebang.rb ================================================ # frozen_string_literal: true module Linguist class Shebang # Public: Use shebang to detect language of the blob. # # blob - An object that quacks like a blob. # candidates - A list of candidate languages. # # Examples # # Shebang.call(FileBlob.new("path/to/file")) # # Returns an array of languages from the candidate list for which the # blob's shebang is valid. Returns an empty list if there is no shebang. # If the candidate list is empty, any language is a valid candidate. def self.call(blob, candidates) return [] if blob.symlink? languages = Language.find_by_interpreter interpreter(blob.data) candidates.any? ? candidates & languages : languages end # Public: Get the interpreter from the shebang # # Returns a String or nil def self.interpreter(data) # First line must start with #! return unless data.start_with?("#!") shebang = data[0, data.index($/) || data.length] s = StringScanner.new(shebang) # There was nothing after the #! return unless path = s.scan(/^#!\s*\S+/) # Keep going script = path.split('/').last # if /usr/bin/env type shebang then walk the string if script == 'env' s.scan(/\s+/) while s.scan(/((-[i0uCSv]*|--\S+)\s+)+/) || # skip over optional arguments e.g. -vS s.scan(/(\S+=\S+\s+)+/) # skip over variable arguments e.g. foo=bar # do nothing end script = s.scan(/\S+/) end # Interpreter was /usr/bin/env with no arguments return unless script # "python2.6" -> "python2" script.sub!(/(\.\d+)$/, '') # #! perl -> perl script.sub!(/^#!\s*/, '') # Check for multiline shebang hacks that call `exec` if script == 'sh' && data.lines.first(5).any? { |l| l.match(/exec (\w+)[\s"']+\$0[\s"']+\$@/) } script = $1 end # osascript can be called with an optional `-l ` argument, which may not be a language with an interpreter. # In this case, return and rely on the subsequent strategies to determine the language. if script == 'osascript' return if s.scan_until(/\-l\s?/) end File.basename(script) end end end ================================================ FILE: lib/linguist/source/diff.rb ================================================ require 'linguist/generated' require 'cgi' require 'charlock_holmes' require 'mini_mime' require 'yaml' module Linguist module Source # Diff is an interface representing a diff between two trees. It is composed # of a collection of iterable deltas between before/after states of files. class Diff # A Delta represents a single file's before/after state in a diff. class Delta # Public: get the status of the file's "after" state as compared to # "before". Valid status values include: # # - :added # - :deleted # - :modified # - :renamed # - :copied # - :ignored # - :untracked # - :typechange # # Returns the status. def status raise NotImplementedError end # Public: determine whether the file delta is binary. # # Returns true if the delta is binary, false otherwise. def binary? raise NotImplementedError end # Public: get the metadata of the "before" file in the delta. The # metadata is represented as a Hash with the keys: # # - :path (string) # - :oid (string) # - :mode (integer) # # Returns the entry metadata hash. def old_file raise NotImplementedError end # Public: get the metadata of the "after" file in the delta. The # metadata is represented as a Hash with the keys: # # - :path (string) # - :oid (string) # - :mode (integer) # # Returns the entry metadata hash. def new_file raise NotImplementedError end end # Public: iterate through each delta of the given diff. Yields a single # delta to the given block. # # Returns nothing. def each_delta raise NotImplementedError end end end end ================================================ FILE: lib/linguist/source/repository.rb ================================================ module Linguist module Source # Repository is an interface for providing direct access to functionality in # a repository of files whose contents can be scanned for language # information. class Repository # Public: get the number of entries in the root tree of the given commit, # with an optional maximum value. # # commit_id - the string unique identifier of the commit to analyze. # limit - (Optional) the integer maximum number of tree entries to # count. # # Returns the number of entries in the tree or 'limit', whichever is # smaller. def get_tree_size(commit_id, limit = nil) raise NotImplementedError end # Public: set the commit whose .gitattributes file(s) should be used as # the source of attribute information in 'load_attributes_for_path'. # # commit_id - the string unique identifier of the attribute source commit. # # Returns nothing. def set_attribute_source(commit_id) raise NotImplementedError end # Public: read the data and size information for the specified file blob. # # blob_id - the string unique identifier of the blob to read. # max_size - the integer maximum size in bytes to read from the blob. # # Returns the (possibly truncated) byte string of blob content and # the full, untruncated size of the blob. def load_blob(blob_id, max_size) raise NotImplementedError end # Public: look up the attribute values for a given path. # # path - the path for which we want attribute values. # attr_names - the attributes to read for the given path. # # Returns a Hash mapping attribute names to their corresponding values. def load_attributes_for_path(path, attr_names) raise NotImplementedError end # Public: compute the diff between the given old and new commits. # # old_commit - the string unique identifier of the "before" state of the # diff, or nil (representing an empty tree). # new_commit - the string unique identifier of the "after" state of the # diff, or nil (representing an empty tree). # # Returns a Source::Diff. def diff(old_commit, new_commit) raise NotImplementedError end end end end ================================================ FILE: lib/linguist/source/rugged.rb ================================================ require 'rugged' require 'linguist/source/diff' module Linguist module Source # RuggedRepository is an implementation of the Source::Repository abstract # class. It represents a Git repository that is accessed using the libgit2 # wrapper Rugged. class RuggedRepository < Linguist::Source::Repository class Diff < Linguist::Source::Diff class Delta < Linguist::Source::Diff::Delta def initialize(rugged_delta) @delta = rugged_delta end def status; @delta.status; end def binary?; @delta.binary; end def old_file; @delta.old_file; end def new_file; @delta.new_file; end end def initialize(rugged_diff) @diff = rugged_diff end def each_delta(&block) @diff.each_delta.map do |delta| Delta.new(delta) end.each(&block) end end GIT_ATTR_OPTS = { :priority => [:index], :skip_system => true } GIT_ATTR_FLAGS = Rugged::Repository::Attributes.parse_opts(GIT_ATTR_OPTS) def initialize(rugged) @rugged = rugged @tree_map = {} @attr_source = nil end def get_tree_size(commit_id, limit) tree_count = 0 count = 0 get_tree(commit_id).walk(:preorder) do |root, entry| case entry[:type] when :blob count += 1 return limit if count >= limit when :tree tree_count += 1 return limit if tree_count >= limit end true end count end def set_attribute_source(commit_id) tree = get_tree(commit_id) return if @attr_source == tree @attr_source = tree attr_index = Rugged::Index.new attr_index.read_tree(@attr_source) @rugged.index = attr_index end def load_attributes_for_path(path, attr_names) @rugged.fetch_attributes(path, attr_names, GIT_ATTR_FLAGS) end def load_blob(blob_id, max_size) Rugged::Blob.to_buffer(@rugged, blob_id, max_size) end def diff(old_commit, new_commit) old_tree = old_commit.nil? ? nil : get_tree(old_commit) new_tree = new_commit.nil? ? nil : get_tree(new_commit) Diff.new(Rugged::Tree.diff(@rugged, old_tree, new_tree)) end # Internal: get the Rugged::Tree associated with a given commit ID. This # method should not be used outside of Linguist itself and is subject to # change or be removed. # # commit_id - the object ID of the commit whose tree instance we want. # # Returns the Rugged::Tree of the specified commit. def get_tree(commit_id) tree = @tree_map[commit_id] return tree if tree @tree_map[commit_id] = Rugged::Commit.lookup(@rugged, commit_id).tree @tree_map[commit_id] end def method_missing(method_name, *args, &block) @rugged.send(method_name, *args, &block) end end end end ================================================ FILE: lib/linguist/strategy/extension.rb ================================================ require 'yaml' module Linguist module Strategy # Detects language based on extension class Extension # Public: Use the file extension to detect the blob's language. # # blob - An object that quacks like a blob. # candidates - A list of candidate languages. # # Examples # # Extension.call(FileBlob.new("path/to/file")) # # Returns an array of languages associated with a blob's file extension. # Selected languages must be in the candidate list, except if it's empty, # in which case any language is a valid candidate. def self.call(blob, candidates) return candidates if generic? blob.name.to_s languages = Language.find_by_extension(blob.name.to_s) candidates.any? ? candidates & languages : languages end # Public: Return true if filename uses a generic extension. def self.generic?(filename) self.load @generic.any? { |ext| filename.downcase.end_with? ext } end @generic = [] # Internal: Load the contents of `generic.yml` def self.load() return if @generic.any? data = YAML.load_file(File.expand_path("../../generic.yml", __FILE__)) @generic = data['extensions'] end end end end ================================================ FILE: lib/linguist/strategy/filename.rb ================================================ module Linguist module Strategy # Detects language based on filename class Filename # Public: Use the filename to detect the blob's language. # # blob - An object that quacks like a blob. # candidates - A list of candidate languages. # # Examples # # Filename.call(FileBlob.new("path/to/file")) # # Returns an array of languages with a associated blob's filename. # Selected languages must be in the candidate list, except if it's empty, # in which case any language is a valid candidate. def self.call(blob, candidates) name = blob.name.to_s languages = Language.find_by_filename(name) candidates.any? ? candidates & languages : languages end end end end ================================================ FILE: lib/linguist/strategy/manpage.rb ================================================ module Linguist module Strategy # Detects man pages based on numeric file extensions with group suffixes. class Manpage # Public: RegExp for matching conventional manpage extensions # # This is the same expression as that used by `github/markup` MANPAGE_EXTS = /\.(?:[1-9](?![0-9])[a-z_0-9]*|0p|n|man|mdoc)(?:\.in)?$/i # Public: Use the file extension to match a possible man page, # only if no other candidates were previously identified. # # blob - An object that quacks like a blob. # candidates - A list of candidate languages. # # Examples # # Manpage.call(FileBlob.new("path/to/file")) # # Returns: # 1. The list of candidates if it wasn't empty # 2. An array of ["Roff", "Roff Manpage"] if the file's # extension matches a valid-looking man(1) section # 3. An empty Array for anything else # def self.call(blob, candidates = []) return candidates if candidates.any? if blob.name =~ MANPAGE_EXTS return [ Language["Roff Manpage"], Language["Roff"], # Language["Text"] TODO: Uncomment once #4258 gets merged ]; end [] end end end end ================================================ FILE: lib/linguist/strategy/modeline.rb ================================================ module Linguist module Strategy class Modeline EMACS_MODELINE = %r[ (?-m) # Opening delimiter -\*- (?: # Short form: `-*- ruby -*-` [ \t]* (?= [^:;\s]+ # Name of mode [ \t]* # Optional whitespace -\*- # Closing delimiter ) | # Longer form: `-*- foo:bar; mode: ruby; -*-` (?: .*?[ \t;] # Preceding variables: `-*- foo:bar bar:baz;` | (?<=-\*-) # Not preceded by anything: `-*-mode:ruby-*-` ) # Explicitly-named variable: `mode: ruby` or `mode : ruby` [ \t]* mode [ \t]* : [ \t]* ) # Name of major-mode, which corresponds to syntax or filetype ([^:;\s]+) # Ensure the name is terminated correctly (?= # Followed by semicolon or whitespace [ \t;] | # Touching the ending sequence: `ruby-*-` (?]? # If comparison operator is omitted, *only* this version is targeted [0-9]+ # Version argument = (MINOR_VERSION_NUMBER * 100) + MINOR_VERSION_NUMBER | # Unversioned modeline. `vim:` targets any version of Vim. m )? | # `ex:`, which requires leading whitespace to avoid matching stuff like "lex:" [ \t] ex ) # If the option-list begins with `set ` or `se `, it indicates an alternative # modeline syntax partly-compatible with older versions of Vi. Here, the colon # serves as a terminator for an option sequence, delimited by whitespace. (?= # So we have to ensure the modeline ends with a colon : (?=[ \t]* set? [ \t] [^\r\n:]+ :) | # Otherwise, it isn't valid syntax and should be ignored : (?![ \t]* set? [ \t]) ) # Possible (unrelated) `option=value` pairs to skip past (?: # Option separator, either (?: # 1. A colon (possibly surrounded by whitespace) [ \t]* : [ \t]* # vim: noai : ft=sh:noexpandtab | # 2. At least one (horizontal) whitespace character [ \t] # vim: noai ft=sh noexpandtab ) # Option's name. All recognised Vim options have an alphanumeric form. \w* # Possible value. Not every option takes an argument. (?: # Whitespace between name and value is allowed: `vim: ft =sh` [ \t]*= # Option's value. Might be blank; `vim: ft= ` means "use no filetype". (?: [^\\\s] # Beware of escaped characters: titlestring=\ ft=sh | # will be read by Vim as { titlestring: " ft=sh" }. \\. )* )? )* # The actual filetype declaration [ \t:] (?:filetype|ft|syntax) [ \t]*= # Language's name (\w+) # Ensure it's followed by a legal separator (including EOL) (?=$|\s|:) ]x MODELINES = [EMACS_MODELINE, VIM_MODELINE] # Scope of the search for modelines # Number of lines to check at the beginning and at the end of the file SEARCH_SCOPE = 5 # Public: Detects language based on Vim and Emacs modelines # # blob - An object that quacks like a blob. # # Examples # # Modeline.call(FileBlob.new("path/to/file")) # # Returns an Array with one Language if the blob has a Vim or Emacs modeline # that matches a Language name or alias. Returns an empty array if no match. def self.call(blob, _ = nil) return [] if blob.symlink? header = blob.first_lines(SEARCH_SCOPE).join("\n") # Return early for Vimball files as their modeline will not reflect their filetype. return [] if header.include?("UseVimball") footer = blob.last_lines(SEARCH_SCOPE).join("\n") Array(Language.find_by_alias(modeline(header + footer))) end # Public: Get the modeline from the first n-lines of the file # # Returns a String or nil def self.modeline(data) match = MODELINES.map { |regex| data.match(regex) }.reject(&:nil?).first match[1] if match end end end end ================================================ FILE: lib/linguist/strategy/xml.rb ================================================ module Linguist module Strategy # Detects XML files based on root tag. class XML # Scope of the search for the root tag # Number of lines to check at the beginning of the file SEARCH_SCOPE = 2 # Public: Use the root tag to detect the XML blobs, only if no other # candidates were previously identified. # # blob - An object that quacks like a blob. # candidates - A list of candidate languages. # # Examples # # XML.call(FileBlob.new("path/to/file")) # # Returns the list of candidates if it wasn't empty, an array with the # XML language as sole item if the root tag is detected, and an empty # Array otherwise. def self.call(blob, candidates = []) return candidates if candidates.any? header = blob.first_lines(SEARCH_SCOPE).join("\n") / blob) do # Call each strategy until one candidate is returned. languages = [] returning_strategy = nil STRATEGIES.each do |strategy| returning_strategy = strategy candidates = Linguist.instrument("linguist.strategy", :blob => blob, :strategy => strategy, :candidates => languages) do strategy.call(blob, languages) end if candidates.size == 1 languages = candidates break elsif candidates.size > 1 # More than one candidate was found, pass them to the next strategy. languages = candidates else # No candidates, try the next strategy end end Linguist.instrument("linguist.detected", :blob => blob, :strategy => returning_strategy, :language => languages.first) languages.first end end # Internal: The strategies used to detect the language of a file. # # A strategy is an object that has a `.call` method that takes two arguments: # # blob - An object that quacks like a blob. # languages - An Array of candidate Language objects that were returned by the # previous strategy. # # A strategy should return an Array of Language candidates. # # Strategies are called in turn until a single Language is returned. STRATEGIES = [ Linguist::Strategy::Modeline, Linguist::Strategy::Filename, Linguist::Shebang, Linguist::Strategy::Extension, Linguist::Strategy::XML, Linguist::Strategy::Manpage, Linguist::Heuristics, Linguist::Classifier ] # Public: Set an instrumenter. # # class CustomInstrumenter # def instrument(name, payload = {}) # warn "Instrumenting #{name}: #{payload[:blob]}" # end # end # # Linguist.instrumenter = CustomInstrumenter.new # # The instrumenter must conform to the `ActiveSupport::Notifications` # interface, which defines `#instrument` and accepts: # # name - the String name of the event (e.g. "linguist.detected") # payload - a Hash of the exception context. attr_accessor :instrumenter # Internal: Perform instrumentation on a block # # Linguist.instrument("linguist.dosomething", :blob => blob) do # # logic to instrument here. # end # def instrument(*args, &bk) if instrumenter instrumenter.instrument(*args, &bk) elsif block_given? yield end end end ================================================ FILE: playlist.liq ================================================ # Play a list of files. # @category Source / Input # @param ~id Force the value of the source ID. # @param ~check_next Function used to filter next tracks. A candidate track is \ # only validated if the function returns true on it. The function is called \ # before resolution, hence metadata will only be available for requests \ # corresponding to local files. This is typically used to avoid repetitions, \ # but be careful: if the function rejects all attempts, the playlist will \ # enter into a consuming loop and stop playing anything. # @param ~prefetch How many requests should be queued in advance. # @param ~loop Loop on the playlist. # @param ~mode Play the files in the playlist either in the order ("normal" mode), \ # or shuffle the playlist each time it is loaded, and play it in this order for a \ # whole round ("randomize" mode), or pick a random file in the playlist each time \ # ("random" mode). # @param ~native Use native implementation, when available. # @param ~on_loop Function executed when the playlist is about to loop. # @param ~on_done Function executed when the playlist is finished. # @param ~max_fail When this number of requests fail to resolve, the whole playlists is considered as failed and `on_fail` is called. # @param ~on_fail Function executed when too many requests failed and returning the contents of a fixed playlist. # @param ~timeout Timeout (in sec.) for a single download. # @param playlist Playlist. # @method reload Reload the playlist with given list of songs. # @method remaining_files Songs remaining to be played. def playlist.list( ~id=null(), ~check_next=null(), ~prefetch=1, ~loop=true, ~mode="normal", ~native=false, ~on_loop={()}, ~on_done={()}, ~max_fail=10, ~on_fail=null(), ~timeout=20., playlist ) = ignore(native) id = string.id.default(default="playlist.list", id) mode = if not list.mem(mode, ["normal", "random", "randomize"]) then log.severe(label=id, "Invalid mode: #{mode}") "randomize" else mode end check_next = check_next ?? fun (_) -> true should_stop = ref(false) on_shutdown({should_stop.set(true)}) on_fail = null.map( fun (on_fail) -> {if not should_stop() then on_fail() else [] end}, on_fail ) # Original playlist when loaded playlist_orig = ref(playlist) # Randomize the playlist if necessary def randomize(p) = if mode == "randomize" then list.shuffle(p) else p end end # Current remaining playlist playlist = ref(randomize(playlist)) # A reference to know if the source has been stopped has_stopped = ref(false) # Delay the creation of next after the source because we need it to resolve # requests at the right content type. next_fun = ref(fun () -> null()) def next() = f = next_fun() f() end # Instantiate the source default = request.dynamic( id=id, prefetch=prefetch, timeout=timeout, retry_delay=1., available={not has_stopped()}, next ) s = %ifdef native if native then stdlib_native.request.dynamic(id=id, next) else default end %else default %endif source.set_name(s, "playlist.list.reloadable") # The reload function def reload(~empty_queue=true, p) = log.debug(label=id, "Reloading playlist.") playlist_orig := p playlist := randomize(playlist_orig()) has_stopped := false if empty_queue then q = s.queue() s.set_queue([]) list.iter(request.destroy, q) ignore(s.fetch()) end end # When we have more than max_fail failures in a row, we wait for 1 second # before trying again in order to avoid infinite loops. failed_count = ref(0) failed_time = ref(0.) # The (real) next function def rec next() = if loop and list.is_empty(playlist()) then on_loop() # The above function might have reloaded the playlist if list.is_empty(playlist()) then playlist := randomize(playlist_orig()) end end file = if list.length(playlist()) > 0 then if mode == "random" then n = random.int(min=0, max=list.length(playlist())) list.nth(default="", playlist(), n) else ret = list.hd(default="", playlist()) playlist := list.tl(playlist()) ret end else # Playlist finished if not has_stopped() then has_stopped := true log.info(label=id, "Playlist stopped.") on_done() end "" end if file == "" or (failed_count() >= max_fail and time() < failed_time() + 1.) then # Playlist failed too many times recently, don't try next for now. null() else log.debug(label=id, "Next song will be \"#{file}\".") r = request.create(file) if not request.resolve(content_type=s, r) then log.info(label=id, "Could not resolve request: #{request.uri(r)}.") request.destroy(r) ref.incr(failed_count) # Playlist failed, call handler. if failed_count() < max_fail then log.info(label=id, "Playlist failed.") if null.defined(on_fail) then f = null.get(on_fail) reload(f()) end end failed_time := time() (next() : request?) else failed_count := 0 if check_next(r) then r else log.info( label=id, "Request #{request.uri(r)} rejected by check_next." ) request.destroy(r) next() end end end end next_fun := next # List of songs remaining to be played def remaining_files() = playlist() end # Return s.{reload=reload, remaining_files=remaining_files} end ================================================ FILE: samples/1C Enterprise/Catalog.ИсходящиеПисьма.Form.ФормаЭлемента.Form.Module.bsl ================================================ &НаСервереБезКонтекста Функция ПолучитьКонтактноеЛицоПоЭлектроннойПочте(ЭлектроннаяПочта) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ ЭлектроннаяПочта = &ЭлектроннаяПочта"; Запрос.Параметры.Вставить("ЭлектроннаяПочта", СокрЛП(ЭлектроннаяПочта)); Выборка = Запрос.Выполнить().Выбрать(); КонтактноеЛицо = ""; Если Выборка.Следующий() Тогда КонтактноеЛицо = Выборка.КонтактноеЛицо; КонецЕсли; Возврат КонтактноеЛицо; КонецФункции &НаСервереБезКонтекста Функция ПолучитьКонтактноеЛицоПоПолучателю(Получатель) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ КонтактноеЛицо ИЗ Справочник.Контрагенты ГДЕ Ссылка = &Получатель"; Запрос.Параметры.Вставить("Получатель", Получатель); Выборка = Запрос.Выполнить().Выбрать(); КонтактноеЛицо = ""; Если Выборка.Следующий() Тогда КонтактноеЛицо = Выборка.КонтактноеЛицо; КонецЕсли; Возврат КонтактноеЛицо; КонецФункции &НаСервереБезКонтекста Процедура ДобавитьПолучателей(Получатель, Получатели) Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ ЭлектроннаяПочта ИЗ Справочник.Контрагенты ГДЕ Ссылка "; Если ТипЗнч(Получатели) = Тип("Массив") Тогда Запрос.Текст = Запрос.Текст + "В (&Получатели)"; Иначе Запрос.Текст = Запрос.Текст + "= &Получатели"; КонецЕсли; Запрос.Параметры.Вставить("Получатели", Получатели); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Получатель <> "" Тогда Получатель = Получатель + "; "; КонецЕсли; Получатель = Получатель + Выборка.ЭлектроннаяПочта; КонецЦикла; КонецПроцедуры &НаСервере Процедура ПриСозданииНаСервере(Отказ, СтандартнаяОбработка) Если Параметры.Ключ.Пустая() Тогда Заголовок = "Исходящее письмо (Создание)"; Объект.Дата = ТекущаяДата(); ПоШаблону = Параметры.Свойство("ПоШаблону"); ВходящееПисьмо = Параметры.ВходящееПисьмо; Если ПоШаблону = Истина Тогда Элементы.ЗаполнитьПоШаблону.Видимость = Истина; РаботаСПочтой.ЗаполнитьПисьмоПоШаблону(Объект, Содержимое); ИначеЕсли Не ВходящееПисьмо.Пустая() Тогда РаботаСПочтой.ЗаполнитьОтветНаПисьмо(ВходящееПисьмо, Объект, Содержимое); КонецЕсли; Адресаты = Параметры.Адресаты; Если Адресаты <> Неопределено Тогда Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Контрагенты.ЭлектроннаяПочта |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Ссылка В(&Адресаты) | И Контрагенты.ЭлектроннаяПочта <> """""; Запрос.УстановитьПараметр("Адресаты", Адресаты); Получатель = ""; Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл Если Получатель <> "" Тогда Получатель = Получатель + "; "; КонецЕсли; Получатель = Получатель + Выборка.ЭлектроннаяПочта; КонецЦикла; Объект.Получатель = Получатель; КонецЕсли; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПриЧтенииНаСервере(ТекущийОбъект) Содержимое = ТекущийОбъект.Содержимое.Получить(); Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)"; Если РаботаСПочтой.ПисьмоОтправлено(ТекущийОбъект.Ссылка) Тогда Заголовок = Заголовок + " - Отправлено"; КонецЕсли; КонецПроцедуры &НаСервере Процедура ПередЗаписьюНаСервере(Отказ, ТекущийОбъект, ПараметрыЗаписи) ТекущийОбъект.Содержимое = Новый ХранилищеЗначения(Содержимое, Новый СжатиеДанных()); ТекущийОбъект.Текст = Содержимое.ПолучитьТекст(); КонецПроцедуры &НаСервере Функция ОтправитьПисьмо(Ошибка) Если Не Записать() Тогда Ошибка = "ОшибкаЗаписи"; Возврат Ложь; КонецЕсли; Если Не РаботаСПочтой.ОтправитьПисьмо(Объект.Ссылка) Тогда Ошибка = "ОшибкаОтправки"; Возврат Ложь; КонецЕсли; Заголовок = Заголовок + " - Отправлено"; Возврат Истина; КонецФункции &НаКлиенте Функция ОтправитьПисьмоКлиент() Ошибка = ""; Если Не ОтправитьПисьмо(Ошибка) Тогда Если Ошибка = "ОшибкаОтправки" Тогда Кнопки = Новый СписокЗначений; Кнопки.Добавить(1, "Настроить почту"); Кнопки.Добавить(2, "Закрыть"); Оп = Новый ОписаниеОповещения( "ОтправитьПисьмоКлиентВопросЗавершение", ЭтотОбъект); ПоказатьВопрос(Оп, "Не указаны настройки интернет почты!", Кнопки, , 1); КонецЕсли; Возврат Ложь; КонецЕсли; НавигационнаяСсылка = ПолучитьНавигационнуюСсылку(Объект.Ссылка); ПоказатьОповещениеПользователя("Письмо отправлено", НавигационнаяСсылка, Объект.Наименование); ОповеститьОбИзменении(Объект.Ссылка); Возврат Истина; КонецФункции &НаКлиенте Процедура ОтправитьПисьмоКлиентВопросЗавершение(Результат, Параметры) Экспорт Если Результат = 1 Тогда ОткрытьФорму("ОбщаяФорма.НастройкаПочты"); КонецЕсли; КонецПроцедуры &НаКлиенте Процедура Отправить(Команда) ОтправитьПисьмоКлиент(); КонецПроцедуры &НаКлиенте Процедура ОтправитьИЗакрыть(Команда) Если Не ОтправитьПисьмоКлиент() Тогда Возврат; КонецЕсли; Закрыть(); КонецПроцедуры &НаКлиенте Процедура ВставитьСтрокуВТекущуюПозицию(Поле, Документ, Строка) Перем Начало, Конец; Поле.ПолучитьГраницыВыделения(Начало, Конец); Позиция = Документ.ПолучитьПозициюПоЗакладке(Начало); Документ.Удалить(Начало, Конец); Начало = Документ.ПолучитьЗакладкуПоПозиции(Позиция); Документ.Вставить(Начало, Строка); Позиция = Позиция + СтрДлина(Строка); Закладка = Документ.ПолучитьЗакладкуПоПозиции(Позиция); Поле.УстановитьГраницыВыделения(Закладка, Закладка); КонецПроцедуры &НаКлиенте Процедура ВставитьКонтактноеЛицо(Команда) Если Объект.Контрагент.Пустая() Тогда Сообщить("Выберите контрагента"); Иначе КонтактноеЛицо = ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент); ВставитьСтрокуВТекущуюПозицию(Элементы.Содержимое, Содержимое, КонтактноеЛицо + " "); КонецЕсли; КонецПроцедуры &НаСервере Процедура ПослеЗаписиНаСервере(ТекущийОбъект, ПараметрыЗаписи) Заголовок = ТекущийОбъект.Наименование + " (Исходящее письмо)"; КонецПроцедуры &НаКлиенте Процедура КонтрагентПриИзменении(Элемент) ДобавитьПолучателей(Объект.Получатель, Объект.Контрагент); КонецПроцедуры &НаКлиенте Процедура ВыделитьВажное(Команда) Перем Начало, Конец; ВсеВажное = Истина; Элементы.Содержимое.ПолучитьГраницыВыделения(Начало, Конец); Если Начало = Конец Тогда Возврат; КонецЕсли; НаборТекстовыхЭлементов = Новый Массив(); Для Каждого ТекстовыйЭлемент Из Содержимое.СформироватьЭлементы(Начало, Конец) Цикл Если Тип(ТекстовыйЭлемент) = Тип("ТекстФорматированногоДокумента") Тогда НаборТекстовыхЭлементов.Добавить(ТекстовыйЭлемент); КонецЕсли; КонецЦикла; Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл Если ТекстовыйЭлемент.Шрифт.Жирный <> Истина И ТекстовыйЭлемент.ЦветТекста <> Новый Цвет(255, 0, 0) Тогда ВсеВажное = Ложь; Прервать; КонецЕсли; КонецЦикла; Для Каждого ТекстовыйЭлемент Из НаборТекстовыхЭлементов Цикл ТекстовыйЭлемент.Шрифт = Новый Шрифт(ТекстовыйЭлемент.Шрифт, , , Не ВсеВажное); ТекстовыйЭлемент.ЦветТекста = Новый Цвет(?(ВсеВажное, 0, 255), 0, 0); КонецЦикла; КонецПроцедуры &НаКлиенте Процедура ЗаполнитьПоШаблону(Команда) Если Объект.Контрагент.Пустая() Тогда Сообщить("Выберите контрагента"); Иначе НайтиИЗаменить("[Контрагент]", Объект.Контрагент); НайтиИЗаменить("[КонтактноеЛицо]", ПолучитьКонтактноеЛицоПоПолучателю(Объект.Контрагент)); КонецЕсли; НайтиИЗаменить("[ДатаПисьма]", Объект.Дата); КонецПроцедуры &НаКлиенте Процедура НайтиИЗаменить(СтрокаДляПоиска, СтрокаДляЗамены) Перем ВставленныйТекст, ШрифтОформления, ЦветТекстаОформления, ЦветФонаОформления, НавигационнаяСсылкаОформления; РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска); Пока ((РезультатПоиска <> Неопределено) И (РезультатПоиска.ЗакладкаНачала <> Неопределено) И (РезультатПоиска.ЗакладкаКонца <> Неопределено)) Цикл ПозицияНачалаСледующегоЦиклаПоиска = Содержимое.ПолучитьПозициюПоЗакладке(РезультатПоиска.ЗакладкаНачала) + СтрДлина(СтрокаДляЗамены); МассивЭлементовДляОформления = Содержимое.ПолучитьЭлементы(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца); Для Каждого ЭлементДляОформления Из МассивЭлементовДляОформления Цикл Если Тип(ЭлементДляОформления) = Тип("ТекстФорматированногоДокумента") Тогда ШрифтОформления = ЭлементДляОформления.Шрифт; ЦветТекстаОформления = ЭлементДляОформления.ЦветТекста; ЦветФонаОформления = ЭлементДляОформления.ЦветФона; НавигационнаяСсылкаОформления = ЭлементДляОформления.НавигационнаяССылка; Прервать; КонецЕсли; КонецЦикла; Содержимое.Удалить(РезультатПоиска.ЗакладкаНачала, РезультатПоиска.ЗакладкаКонца); ВставленныйТекст = Содержимое.Вставить(РезультатПоиска.ЗакладкаНачала, СтрокаДляЗамены); Если ВставленныйТекст <> Неопределено И ШрифтОформления <> Неопределено Тогда ВставленныйТекст.Шрифт = ШрифтОформления; КонецЕсли; Если ВставленныйТекст <> Неопределено И ЦветТекстаОформления <> Неопределено Тогда ВставленныйТекст.ЦветТекста = ЦветТекстаОформления; КонецЕсли; Если ВставленныйТекст <> Неопределено И ЦветФонаОформления <> Неопределено Тогда ВставленныйТекст.ЦветФона = ЦветФонаОформления; КонецЕсли; Если ВставленныйТекст <> Неопределено И НавигационнаяСсылкаОформления <> Неопределено Тогда ВставленныйТекст.НавигационнаяССылка = НавигационнаяСсылкаОформления; КонецЕсли; РезультатПоиска = Содержимое.НайтиТекст(СтрокаДляПоиска, Содержимое.ПолучитьЗакладкуПоПозиции(ПозицияНачалаСледующегоЦиклаПоиска)); КонецЦикла; КонецПроцедуры ================================================ FILE: samples/1C Enterprise/Catalog.Товары.Command.ПечатьПрайсЛиста.CommandModule.bsl ================================================ &НаСервере Функция ПечатнаяФорма(ПараметрКоманды) ТабличныйДокумент = Новый ТабличныйДокумент; ТабличныйДокумент.ОтображатьСетку = Истина; ТабличныйДокумент.ОтображатьЗаголовки = Истина; Сформирован = Ложь; ТабМакет = Справочники.Товары.ПолучитьМакет("МакетПрайсЛиста"); Шапка = ТабМакет.ПолучитьОбласть("Шапка"); ТабличныйДокумент.Вывести(Шапка); ОбластьНоменклатура = ТабМакет.ПолучитьОбласть("ОбластьНоменклатура"); Запрос = Новый Запрос; Запрос.Текст = "ВЫБРАТЬ | Товары.Код КАК Код, | Товары.Наименование КАК Наименование, | Товары.Артикул КАК Артикул, | Товары.ФайлКартинки КАК Картинка, | Товары.Описание КАК Описание, | Товары.Вид КАК Вид, | ЦеныТоваров.Цена КАК Цена |ИЗ | РегистрСведений.ЦеныТоваров КАК ЦеныТоваров | ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Товары КАК Товары | ПО ЦеныТоваров.Товар = Товары.Ссылка |ГДЕ | Товары.ЭтоГруппа = ЛОЖЬ | И ЦеныТоваров.ВидЦен = &ВидЦен | |УПОРЯДОЧИТЬ ПО | Вид, | Товары.Родитель.Код, | Код"; Запрос.УстановитьПараметр("ВидЦен", Справочники.ВидыЦен.НайтиПоНаименованию("Розничная")); Выборка = Запрос.Выполнить().Выбрать(); Пока Выборка.Следующий() Цикл ОбластьНоменклатура.Параметры.Заполнить(Выборка); Описание = ""; Чтение = Новый ЧтениеHTML(); Чтение.УстановитьСтроку(Выборка.Описание); ДокDOM = Новый ПостроительDOM(); HTML = ДокDOM.Прочитать(Чтение); Если Не HTML.ЭлементДокумента = Неопределено Тогда Для Каждого Узел из HTML.ЭлементДокумента.ДочерниеУзлы Цикл Если Узел.ИмяУзла = "body" Тогда Для Каждого ЭлементОписания из Узел.ДочерниеУзлы Цикл Описание = Описание + ЭлементОписания.ТекстовоеСодержимое; КонецЦикла; КонецЕсли; КонецЦикла; КонецЕсли; ОбластьНоменклатура.Параметры.Описание = Описание; Если (Выборка.Картинка <> Null) Тогда ОбластьНоменклатура.Параметры.ПараметрКартинки = Новый Картинка(Выборка.Картинка.ДанныеФайла.Получить()); КонецЕсли; ТабличныйДокумент.Вывести(ОбластьНоменклатура, Выборка.Уровень()); Сформирован = Истина; КонецЦикла; Если Сформирован Тогда Возврат ТабличныйДокумент; Иначе Возврат Неопределено; КонецЕсли; КонецФункции &НаКлиенте Процедура ОбработкаКоманды(ПараметрКоманды, ПараметрыВыполненияКоманды) ТабличныйДокумент = ПечатнаяФорма(ПараметрКоманды); Если ТабличныйДокумент <> Неопределено Тогда ТабличныйДокумент.Показать(); КонецЕсли; КонецПроцедуры ================================================ FILE: samples/1C Enterprise/CommonModule.ОбменМобильныеОбщее.Module.bsl ================================================ // Процедура на основании анализа типа данных заменяет их на данные, удаляющие // информацию из узла в котором их не должно быть // // Параметры: // Данные – Объект, набор записей,... который нужно преобразовать // Процедура УдалениеДанных(Данные) // Получаем объект описания метаданного, соответствующий данным ОбъектМетаданных = ?(ТипЗнч(Данные) = Тип("УдалениеОбъекта"), Данные.Ссылка.Метаданные(), Данные.Метаданные()); // Проверяем тип, интересуют только те типы, которые реализованы на мобильной платформе Если Метаданные.Справочники.Содержит(ОбъектМетаданных) ИЛИ Метаданные.Документы.Содержит(ОбъектМетаданных) Тогда // Перенос удаления объекта для объектных Данные = Новый УдалениеОбъекта(Данные.Ссылка); ИначеЕсли Метаданные.РегистрыСведений.Содержит(ОбъектМетаданных) ИЛИ Метаданные.РегистрыНакопления.Содержит(ОбъектМетаданных) ИЛИ Метаданные.Последовательности.Содержит(ОбъектМетаданных) Тогда // Очищаем данные Данные.Очистить(); КонецЕсли; КонецПроцедуры // Функция формирует пакет обмена, который будет отправлен узлу "УзелОбмена" // // Параметры: // УзелОбмена – узел плана обмена "мобильные", с которым осуществляется обмен // // Возвращаемое значение: // сформированный пакет, помещенный в хранилище значения Функция СформироватьПакетОбмена(УзелОбмена) Экспорт ЗаписьXML = Новый ЗаписьXML; ЗаписьXML.УстановитьСтроку("UTF-8"); ЗаписьXML.ЗаписатьОбъявлениеXML(); ЗаписьСообщения = ПланыОбмена.СоздатьЗаписьСообщения(); ЗаписьСообщения.НачатьЗапись(ЗаписьXML, УзелОбмена); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("xsi", "http://www.w3.org/2001/XMLSchema-instance"); ЗаписьXML.ЗаписатьСоответствиеПространстваИмен("v8", "http://v8.1c.ru/data"); ТипДанныхУдаления = Тип("УдалениеОбъекта"); ВыборкаИзменений = ПланыОбмена.ВыбратьИзменения(УзелОбмена, ЗаписьСообщения.НомерСообщения); Пока ВыборкаИзменений.Следующий() Цикл Данные = ВыборкаИзменений.Получить(); // Если перенос данных не нужен, то, возможно, необходимо записать удаление данных Если Не ОбменМобильныеПереопределяемый.НуженПереносДанных(Данные, УзелОбмена) Тогда // Получаем значение с возможным удалением данных УдалениеДанных(Данные); КонецЕсли; // Записываем данные в сообщение ОбменМобильныеПереопределяемый.ЗаписатьДанные(ЗаписьXML, Данные); КонецЦикла; ЗаписьСообщения.ЗакончитьЗапись(); Возврат Новый ХранилищеЗначения(ЗаписьXML.Закрыть(), Новый СжатиеДанных(9)); КонецФункции // Процедура вносит в информационную базу данные, которые присланы из узла "УзелОбмена" // // Параметры: // УзелОбмена – узел плана обмена "мобильные", с которым осуществляется обмен // ДанныеОбмена - пакет обмена полученный из узла УзелОбмена, помещен в ХранилищеЗначения // Процедура ПринятьПакетОбмена(УзелОбмена, ДанныеОбмена) Экспорт ЧтениеXML = Новый ЧтениеXML; ЧтениеXML.УстановитьСтроку(ДанныеОбмена.Получить()); ЧтениеСообщения = ПланыОбмена.СоздатьЧтениеСообщения(); ЧтениеСообщения.НачатьЧтение(ЧтениеXML); ПланыОбмена.УдалитьРегистрациюИзменений(ЧтениеСообщения.Отправитель,ЧтениеСообщения.НомерПринятого); НачатьТранзакцию(); Пока ВозможностьЧтенияXML(ЧтениеXML) Цикл Данные = ОбменМобильныеПереопределяемый.ПрочитатьДанные(ЧтениеXML); Если Не Данные = Неопределено Тогда Данные.ОбменДанными.Отправитель = ЧтениеСообщения.Отправитель; Данные.ОбменДанными.Загрузка = Истина; Данные.Записать(); КонецЕсли; КонецЦикла; ЗафиксироватьТранзакцию(); ЧтениеСообщения.ЗакончитьЧтение(); ЧтениеXML.Закрыть(); КонецПроцедуры ================================================ FILE: samples/1C Enterprise/Document.РасходТовара.ObjectModule.bsl ================================================ //////////////////////////////////////////////////////////////////////////////// // ПРОЦЕДУРЫ И ФУНКЦИИ // // Формирование печатной формы документа // // Параметры: // Нет. // // Возвращаемое значение: // ТабличныйДокумент - Сформированный табличный документ. Процедура ПечатнаяФорма(ТабличныйДокумент) Экспорт Макет = Документы.РасходТовара.ПолучитьМакет("МакетПечати"); // Заголовок Область = Макет.ПолучитьОбласть("Заголовок"); ТабличныйДокумент.Вывести(Область); // Шапка Шапка = Макет.ПолучитьОбласть("Шапка"); Шапка.Параметры.Заполнить(ЭтотОбъект); ТабличныйДокумент.Вывести(Шапка); // Товары Область = Макет.ПолучитьОбласть("ТоварыШапка"); ТабличныйДокумент.Вывести(Область); ОбластьТовары = Макет.ПолучитьОбласть("Товары"); Для каждого ТекСтрокаТовары Из Товары Цикл ОбластьТовары.Параметры.Заполнить(ТекСтрокаТовары); ТабличныйДокумент.Вывести(ОбластьТовары); КонецЦикла; КонецПроцедуры // Формирование печатной формы документа // // Параметры: // Нет. // // Возвращаемое значение: // ТабличныйДокумент - Сформированный табличный документ. Процедура Пересчитать() Экспорт Для каждого ТекСтрокаТовары Из Товары Цикл ТекСтрокаТовары.Сумма = ТекСтрокаТовары.Количество * ТекСтрокаТовары.Цена; КонецЦикла; КонецПроцедуры //////////////////////////////////////////////////////////////////////////////// // ОБРАБОТЧИКИ СОБЫТИЙ ОБЪЕКТА Процедура ОбработкаПроведения(Отказ, Режим) // Формирование движений регистров накопления ТоварныеЗапасы и Продажи. Движения.ТоварныеЗапасы.Записывать = Истина; Движения.Продажи.Записывать = Истина; Если Режим = РежимПроведенияДокумента.Оперативный Тогда Движения.ТоварныеЗапасы.БлокироватьДляИзменения = Истина; КонецЕсли; // Создадим запрос, чтобы получать информацию об услугах Запрос = Новый Запрос("ВЫБРАТЬ | ТоварыВДокументе.НомерСтроки КАК НомерСтроки |ИЗ | Документ.РасходТовара.Товары КАК ТоварыВДокументе |ГДЕ | ТоварыВДокументе.Ссылка = &Ссылка | И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Услуга)"); Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатУслуги = Запрос.Выполнить().Выгрузить(); РезультатУслуги.Индексы.Добавить("НомерСтроки"); Для каждого ТекСтрокаТовары Из Товары Цикл Строка = РезультатУслуги.Найти(ТекСтрокаТовары.НомерСтроки, "НомерСтроки"); Если Строка = Неопределено Тогда // Не услуга Движение = Движения.ТоварныеЗапасы.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Товар = ТекСтрокаТовары.Товар; Движение.Склад = Склад; Движение.Количество = ТекСтрокаТовары.Количество; КонецЕсли; Движение = Движения.Продажи.Добавить(); Движение.Период = Дата; Движение.Товар = ТекСтрокаТовары.Товар; Движение.Покупатель = Покупатель; Движение.Количество = ТекСтрокаТовары.Количество; Движение.Сумма = ТекСтрокаТовары.Сумма; КонецЦикла; // Формирование движения регистра накопления Взаиморасчеты. Движения.Взаиморасчеты.Записывать = Истина; Движение = Движения.Взаиморасчеты.Добавить(); Движение.ВидДвижения = ВидДвиженияНакопления.Расход; Движение.Период = Дата; Движение.Контрагент = Покупатель; Движение.Валюта = Валюта; Если Валюта.Пустая() Тогда Движение.Сумма = Товары.Итог("Сумма"); Иначе Курс = РегистрыСведений.КурсыВалют.ПолучитьПоследнее(Дата, Новый Структура("Валюта", Валюта)).Курс; Если Курс = 0 Тогда Движение.Сумма = Товары.Итог("Сумма"); Иначе Движение.Сумма = Товары.Итог("Сумма") / Курс; КонецЕсли; КонецЕсли; //Запишем движения Движения.Записать(); //Контроль остатков при оперативном проведении Если Режим = РежимПроведенияДокумента.Оперативный Тогда // Создадим запрос, чтобы контролировать остатки по товарам Запрос = Новый Запрос("ВЫБРАТЬ | ТоварыВДокументе.Товар КАК Товар, | СУММА(ТоварыВДокументе.Количество) КАК Количество, | МАКСИМУМ(ТоварыВДокументе.НомерСтроки) КАК НомерСтроки | |ПОМЕСТИТЬ ТребуетсяТовара | |ИЗ | Документ.РасходТовара.Товары КАК ТоварыВДокументе | |ГДЕ | ТоварыВДокументе.Ссылка = &Ссылка | И ТоварыВДокументе.Товар.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар) | |СГРУППИРОВАТЬ ПО | ТоварыВДокументе.Товар | |ИНДЕКСИРОВАТЬ ПО | Товар |; | |//////////////////////////////////////////////////////////////////////////////// |ВЫБРАТЬ | ПРЕДСТАВЛЕНИЕ(ТребуетсяТовара.Товар) КАК ТоварПредставление, | ВЫБОР | КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество | ТОГДА ТоварыВДокументе.Количество | ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) | КОНЕЦ КАК Нехватка, | ТоварыВДокументе.Количество - ВЫБОР | КОГДА - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) > ТоварыВДокументе.Количество | ТОГДА ТоварыВДокументе.Количество | ИНАЧЕ - ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) | КОНЕЦ КАК МаксимальноеКоличество, | ТребуетсяТовара.НомерСтроки КАК НомерСтроки | |ИЗ | ТребуетсяТовара КАК ТребуетсяТовара | ЛЕВОЕ СОЕДИНЕНИЕ РегистрНакопления.ТоварныеЗапасы.Остатки( | , | Товар В | (ВЫБРАТЬ | ТребуетсяТовара.Товар | ИЗ | ТребуетсяТовара) | И Склад = &Склад) КАК ТоварныеЗапасыОстатки | ПО ТребуетсяТовара.Товар = ТоварныеЗапасыОстатки.Товар | ЛЕВОЕ СОЕДИНЕНИЕ Документ.РасходТовара.Товары КАК ТоварыВДокументе | ПО ТребуетсяТовара.Товар = ТоварыВДокументе.Товар | И ТребуетсяТовара.НомерСтроки = ТоварыВДокументе.НомерСтроки | |ГДЕ | ТоварыВДокументе.Ссылка = &Ссылка И | 0 > ЕСТЬNULL(ТоварныеЗапасыОстатки.КоличествоОстаток, 0) | |УПОРЯДОЧИТЬ ПО | НомерСтроки"); Запрос.УстановитьПараметр("Склад", Склад); Запрос.УстановитьПараметр("Ссылка", Ссылка); РезультатСНехваткой = Запрос.Выполнить(); ВыборкаРезультатаСНехваткой = РезультатСНехваткой.Выбрать(); // Выдадим ошибки для строк, в которых не хватает остатка Пока ВыборкаРезультатаСНехваткой.Следующий() Цикл Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = НСтр("ru = 'Не хватает '", "ru") + ВыборкаРезультатаСНехваткой.Нехватка + НСтр("ru = ' единиц товара'", "ru") + """" + ВыборкаРезультатаСНехваткой.ТоварПредставление + """" + НСтр("ru = ' на складе'", "ru") + """" + Склад + """." + НСтр("ru = 'Максимальное количество: '", "ru") + ВыборкаРезультатаСНехваткой.МаксимальноеКоличество + "."; Сообщение.Поле = НСтр("ru = 'Товары'", "ru") + "[" + (ВыборкаРезультатаСНехваткой.НомерСтроки - 1) + "]." + НСтр("ru = 'Количество'", "ru"); Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); Отказ = Истина; КонецЦикла; КонецЕсли; КонецПроцедуры Процедура ОбработкаПроверкиЗаполнения(Отказ, ПроверяемыеРеквизиты) // Проверим заполненность поля "Покупатель" Если Покупатель.Пустая() Тогда // Если поле Покупатель не заполнено, сообщим об этом пользователю Сообщение = Новый СообщениеПользователю(); Сообщение.Текст = НСтр("ru = 'Не указан Покупатель, для которого выписывается накладная!'", "ru"); Сообщение.Поле = НСтр("ru = 'Покупатель'", "ru"); Сообщение.УстановитьДанные(ЭтотОбъект); Сообщение.Сообщить(); // Сообщим платформе, что мы сами обработали проверку заполнения поля "Покупатель" ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Покупатель")); // Так как информация в документе не консистентна, то продолжать работу дальше смысла нет Отказ = Истина; КонецЕсли; //Если склад не заполнен, то проверим есть ли в документе что-то кроме услуг Если Склад.Пустая() И Товары.Количество() > 0 Тогда // Создадим запрос, чтобы получать информацию об товарах Запрос = Новый Запрос("ВЫБРАТЬ | Количество(*) КАК Количество |ИЗ | Справочник.Товары КАК Товары |ГДЕ | Товары.Ссылка В (&ТоварыВДокументе) | И Товары.Вид = ЗНАЧЕНИЕ(Перечисление.ВидыТоваров.Товар)"); Запрос.УстановитьПараметр("ТоварыВДокументе", Товары.ВыгрузитьКолонку("Товар")); Выборка = Запрос.Выполнить().Выбрать(); Выборка.Следующий(); Если Выборка.Количество = 0 Тогда // Сообщим платформе, что мы сами обработали проверку заполнения поля "Склад" ПроверяемыеРеквизиты.Удалить(ПроверяемыеРеквизиты.Найти("Склад")); КонецЕсли; КонецЕсли; КонецПроцедуры Процедура ОбработкаЗаполнения(ДанныеЗаполнения, СтандартнаяОбработка) Если ТипЗнч(ДанныеЗаполнения) = Тип("СправочникСсылка.Контрагенты") Тогда ЗапросПоКонтрагенту = Новый Запрос("ВЫБРАТЬ | Контрагенты.ЭтоГруппа, | Контрагенты.ВидЦен |ИЗ | Справочник.Контрагенты КАК Контрагенты |ГДЕ | Контрагенты.Ссылка = &КонтрагентСсылка"); ЗапросПоКонтрагенту.УстановитьПараметр("КонтрагентСсылка", ДанныеЗаполнения); Выборка = ЗапросПоКонтрагенту.Выполнить().Выбрать(); Если Выборка.Следующий() И Выборка.ЭтоГруппа Тогда Возврат; КонецЕсли; ВидЦен = Выборка.ВидЦен; Покупатель = ДанныеЗаполнения.Ссылка; ИначеЕсли ТипЗнч(ДанныеЗаполнения) = Тип("Структура") Тогда Значение = Неопределено; Если ДанныеЗаполнения.Свойство("Покупатель", Значение) Тогда ВидЦен = Значение.ВидЦен; КонецЕсли; КонецЕсли; КонецПроцедуры ================================================ FILE: samples/1C Enterprise/ci_before_script.os ================================================ Каталог = ОбъединитьПути(ТекущийКаталог(), "libs\oscript-library\src"); Загрузчик_Оригинал_ИмяФайла = ОбъединитьПути(Каталог, "package-loader.os"); Файлы = НайтиФайлы(Каталог, , Ложь); Для Каждого ВыбФайл Из Файлы Цикл Если ВыбФайл.ЭтоФайл() Тогда Продолжить; КонецЕсли; Загрузчик_ИмяФайла = ОбъединитьПути(ВыбФайл.ПолноеИмя, "package-loader.os"); Загрузчик_Файл = Новый Файл(Загрузчик_ИмяФайла); Если Загрузчик_Файл.Существует() Тогда Продолжить; КонецЕсли; КопироватьФайл(Загрузчик_Оригинал_ИмяФайла, Загрузчик_ИмяФайла); КонецЦикла; ================================================ FILE: samples/1C Enterprise/test_canCompile.os ================================================ #Использовать "../libs/oscript-library/src/v8runner" #Использовать "../libs/oscript-library/src/tempfiles" Перем Лог; Перем КодВозврата; Процедура Инициализация() Лог = Логирование.ПолучитьЛог("oscript.app.gitlab-test_CanCompile"); КодВозврата = 0; КонецПроцедуры Процедура ВыполнитьТест() Конфигуратор = Новый УправлениеКонфигуратором(); ПараметрыЗапуска = Конфигуратор.ПолучитьПараметрыЗапуска(); КомандаЗапуска = "/LoadConfigFromFiles ""%1"""; КомандаЗапуска = СтрШаблон(КомандаЗапуска, ТекущийКаталог() + "\source\cf"); Лог.Информация("Команда обновления конфигурации: " + КомандаЗапуска); ПараметрыЗапуска.Добавить(КомандаЗапуска); Попытка Конфигуратор.ВыполнитьКоманду(ПараметрыЗапуска); Исключение Лог.Ошибка(Конфигуратор.ВыводКоманды()); КодВозврата = 1; КонецПопытки; УдалитьФайлы(Конфигуратор.ПутьКВременнойБазе()); КонецПроцедуры Инициализация(); ВыполнитьТест(); ЗавершитьРаботу(КодВозврата); ================================================ FILE: samples/2-Dimensional Array/appearance.2da ================================================ 2DA V2.0 LABEL STRING_REF NAME RACE ENVMAP BLOODCOLR MODELTYPE WEAPONSCALE WING_TAIL_SCALE HELMET_SCALE_M HELMET_SCALE_F MOVERATE WALKDIST RUNDIST PERSPACE CREPERSPACE HEIGHT HITDIST PREFATCKDIST TARGETHEIGHT ABORTONPARRY RACIALTYPE HASLEGS HASARMS PORTRAIT SIZECATEGORY PERCEPTIONDIST FOOTSTEPTYPE SOUNDAPPTYPE HEADTRACK HEAD_ARC_H HEAD_ARC_V HEAD_NAME BODY_BAG TARGETABLE 0 "(Dynamic Dwarf)" **** Character_model D default R P 1 1 1.15 0.95 NORM 1.06 2.12 0.3 0.5 1.5 0.3 1.4 H 1 6 1 1 **** 3 9 0 0 1 60 30 head_g 6 1 1 "(Dynamic Elf)" **** Character_model E default R P 1 1 0.85 0.8 NORM 1.43 2.86 0.3 0.4 1.75 0.3 1.5 H 1 7 1 1 **** 3 9 0 0 1 60 30 head_g 6 1 2 "(Dynamic Gnome)" **** Character_model G default R P 1 1 0.9 0.82 NORM 1 1.94 0.3 0.4 1.5 0.3 1.3 H 1 8 1 1 **** 2 9 0 0 1 60 30 head_g 6 1 3 "(Dynamic Halfing)" **** Character_model A default R P 0.8 1 0.7 0.65 NORM 1.04 2.08 0.25 0.3 1.5 0.25 1.1 H 1 10 1 1 **** 2 9 0 0 1 60 30 head_g 6 1 4 "(Dynamic Half-Elf)" **** Character_model H default R P 1 1 1 0.9 NORM 1.6 3.2 0.3 0.5 2 0.3 1.7 H 1 7 1 1 **** 3 9 0 0 1 60 30 head_g 6 1 5 "(Dynamic Half-Orc)" **** Character_model O default R P 1.3 1 1.2 1.2 NORM 1.6 3.2 0.3 0.7 2.25 0.3 2.1 H 1 13 1 1 **** 3 9 0 0 1 60 30 head_g 6 1 6 "(Dynamic Human)" **** Character_model H default R P 1 1 1.05 0.85 NORM 1.6 3.2 0.3 0.5 2 0.3 1.7 H 1 11 1 1 **** 3 9 0 0 1 60 30 head_g 6 1 7 "Bird: Parrot" **** Parrot c_a_parrot **** R S **** 1 1 1 FAST 1 3.5 0.13 0.13 0.3 0.13 1.8 L 0 2 1 1 po_poly 1 9 -1 5 0 60 30 Parrot_head 0 1 8 Badger **** BASE c_badger **** R S **** 1 1 1 FAST 0.77 1.2 0.3 0.3 1 0.3 2 L 0 2 1 1 po_Badger 1 9 3 2 1 60 30 Badger_head 0 1 9 "Badger: Dire" **** Badger c_direbadg **** R S **** 1 1 1 FAST 1 1.42 0.5 0.5 1 0.5 2.6 L 0 2 1 1 po_DireBadger 2 9 3 2 1 60 30 Badger_head 0 1 10 Bat **** BASE c_a_bat **** R S **** 1 1 1 VFAST 2.75 5.5 0.2 0.2 1 0.2 1.7 H 1 2 1 1 po_Bat 1 9 9 5 1 60 30 Bat_head 0 1 11 "Horror: Battle" **** Battle_Horror c_bathorror **** W F 1.3 1 1 1 VFAST 2.75 5.5 0.3 0.9 1 0.3 2.1 H 1 4 0 1 po_BatHorror 3 9 -1 25 1 60 30 head_g 0 1 12 "Bear: Black" **** Bear c_bearblck **** R S **** 1 1 1 FAST 1.23 1.63 0.6 1.2 1 1.2 1.9 H 1 2 1 1 po_BearBlck 3 9 3 2 1 60 30 Bear_head 0 1 13 "Bear: Brown" **** BASE c_bearbrwn **** R S **** 1 1 1 FAST 1.23 1.63 0.6 1.2 1 1.2 1.9 H 1 2 1 1 po_BearBrwn 4 9 3 2 1 60 30 Bear_head 0 1 14 "Bear: Polar" **** Bear c_bearpolar **** R S **** 1 1 1 FAST 1.46 1.94 0.6 1.5 1 1.5 2.2 H 1 2 1 1 po_BearPolar 4 9 3 2 1 60 30 Bear_head 0 1 15 "Bear: Dire" **** Bear c_beardire **** R S **** 1 1 1 FAST 1.75 2.33 0.6 1.5 1 1.5 2.7 H 1 2 1 1 po_BearDire 4 9 3 2 1 60 30 Bear_head 0 1 16 "Curst Swordsman" **** Curst_Swordsman c_curst **** R S 1 1 1.05 0.85 NORM 1.6 2.7 0.3 0.5 1 0.3 1.7 H 1 11 1 1 po_vampire_m 3 9 3 0 1 60 30 head_g 6 1 17 "Beetle: Slicer: Medium" **** Beetle c_btlslicer **** G S **** 1 1 1 NORM 0.7 3.6 0.6 1 1 1 2.3 H 0 24 1 1 po_Btlslicer 3 9 6 6 1 60 30 Beetle_head 0 1 18 "Beetle: Fire: Medium" **** Beetle c_btlfire **** G S **** 1 1 1 NORM 0.7 3.6 0.6 0.9 1 0.9 2.2 H 0 24 1 1 po_BtlFire 3 9 6 6 1 60 30 Beetle_head 0 1 19 "Beetle: Stag: Medium" **** BASE c_btlstag evmap_irrid G S **** 1 1 1 NORM 0.7 3.6 0.6 1 1 1 2.3 H 0 24 1 1 po_BtlStag 3 9 6 6 1 60 30 Beetle_head 0 1 20 "Beetle: Stink: Medium" **** Beetle c_btlstink **** G S **** 1 1 1 NORM 0.7 3.6 0.6 1 1 1 2.3 H 0 24 1 1 po_BtlStink 3 9 6 6 1 60 30 Beetle_head 0 1 21 "Swine: Boar" **** BASE c_boar **** R S **** 1 1 1 FAST 0.9 2.1 0.4 0.4 1 0.4 1.5 L 0 2 1 1 po_Boar 3 9 0 2 1 60 30 Wildboar_head 0 1 22 "Swine: Boar: Dire" **** Boar qc_direhog **** R S **** 1 1 1 FAST 1.46 2.1 0.6 0.6 1 0.6 2.2 L 0 2 1 1 po_DireBoar 3 9 0 2 1 60 30 Wildboar_head 0 1 23 Bodak **** Bodak_(CM) c_bodak **** R F 1 1 1 1 FAST 1.81 2.7 0.3 0.5 1 0.3 1.8 H 1 23 1 1 po_Bodak 3 9 0 0 1 60 30 head_g 0 1 24 "Golem: Bone" **** Golem_Bone_(CM) c_golbone default W S **** 1 1 1 SLOW 2 3.2 0.4 1.4 1 0.4 2.7 H 1 4 1 1 po_GolBone 4 9 0 4 0 60 30 Ettin_Largehead 5 1 25 "Bugbear: Chieftain 1" **** Bugbear c_bugchiefA default R F 1.55 1 1 1 NORM 1.81 2.33 0.3 0.8 1 0.3 2.2 H 1 9 1 1 po_BugChiefA 3 9 0 0 1 60 30 head_g 0 1 26 "Bugbear: Chieftain 2" **** Bugbear c_bugchiefB default R F 1.55 1 1 1 NORM 1.81 2.33 0.3 0.8 1 0.3 2.2 H 1 9 1 1 po_BugChiefB 3 9 0 0 1 60 30 head_g 0 1 27 "Bugbear: Shaman 1" **** Bugbear c_bugwizA default R F 1.55 1 1 1 NORM 1.81 2.33 0.3 0.8 1 0.3 2.2 H 1 9 1 1 po_BugWizA 3 9 0 0 1 60 30 head_g 0 1 28 "Bugbear: Shaman 2" **** Bugbear c_bugwizB default R F 1.55 1 1 1 NORM 1.81 2.33 0.3 0.8 1 0.3 2.2 H 1 9 1 1 po_BugWizB 3 9 0 0 1 60 30 head_g 0 1 29 "Bugbear 01" **** BASE c_bugbearA default R F 1.55 1 1 1 NORM 1.81 2.33 0.3 0.8 1 0.3 2.2 H 1 9 1 1 po_BugbearA 3 9 0 0 1 60 30 head_g 0 1 30 "Bugbear 02" **** Bugbear c_bugbearB default R F 1.55 1 1 1 NORM 1.81 2.33 0.3 0.8 1 0.3 2.2 H 1 9 1 1 po_BugbearB 3 9 0 0 1 60 30 head_g 0 1 31 "Bird: Chicken" **** Chicken c_a_chicken **** R S **** 1 1 1 FAST 1 3.5 0.13 0.13 0.3 0.13 1.8 L 0 2 1 1 po_Chicken 1 9 -1 5 0 60 30 Chicken_head 0 1 32 "Satyr: Archer" **** Satyr_archer c_satyrarcher default R F 1.3 1 1 1 NORM 2.7 3.5 0.3 0.7 1 0.3 1.8 H 1 14 1 1 po_Satyr 3 9 4 0 1 60 30 head_g 6 1 33 "Satyr: Warrior" **** Satyr_warrior c_satyrwarrior default R F 1.3 1 1 1 NORM 2.7 3.5 0.3 0.7 1 0.3 1.8 H 1 14 1 1 po_Satyr 3 9 4 0 1 60 30 head_g 6 1 34 "Cattle: Cow 1" **** Cow c_a_cow **** R S **** 1 1 1 SLOW 1.52 1.92 0.6 1.3 1 1.3 2.9 H 1 2 1 1 po_Cow 3 9 4 2 0 60 30 Ox_head 0 1 35 "Deer: Stag" **** Deer_Stag c_a_deer **** R S **** 1 1 1 FAST 1.82 2.4 0.6 0.9 1 0.9 2.6 H 0 2 1 1 po_Deer 3 9 4 2 1 60 30 Deer_head 0 1 36 "Intellect Devourer: Skeletal" **** Intellect_Devourer c_devo_02 default W S **** 1 1 1 NORM 1.02 3.6 0.4 0.4 1 0.4 1.9 L 0 1 1 1 po_devo_02 2 9 3 2 1 60 30 indev_head 5 1 37 "Deer: Stag: White" **** Deer_Stag c_a_deerwhite **** R S **** 1 1 1 FAST 1.82 2.4 0.6 0.9 1 0.9 2.7 H 0 2 1 1 po_DeerWhite 3 9 4 2 1 60 30 Deer_head 0 1 38 "Demon: Balor" **** Demon c_demon default R L 2.3 1 1 1 FAST 3.2 5.1 0.6 2 1 1.5 2.4 H 1 19 1 1 po_Demon 4 9 5 1 0 60 30 **** 3 1 39 Lich **** Lich c_Lich **** W F 1 1 1 1 NORM 1.6 2.7 0.3 0.5 1 0.3 1.7 H 1 23 1 1 po_Lich 3 9 0 0 1 60 30 head_g 3 1 40 "Doom Knight" **** Doom_Knight c_doomkght default G F 1 1 1 1 NORM 1.65 2.78 0.3 0.7 1 0.3 2.1 H 1 23 1 1 po_DoomKght 3 9 0 0 1 60 30 head_g 5 1 41 "Dragon Chr: Black" **** Dragon_Black c_DrgBlack **** G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.3 H 1 5 1 1 po_DrgBlack 5 10 2 22 0 60 30 Dragon_head 3 1 42 "Dragon Met: Brass" **** Dragon_Copper c_DrgBrass default G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.2 H 1 5 1 1 po_DrgBrass 5 10 2 22 0 60 30 Dragon_head 3 1 43 "Dragon Met: Copper" **** BASE c_DrgCopp default G S **** 1 1 1 FAST 3.33 6 1 1.9 1 1 3.1 H 1 5 1 1 po_DrgCopp 5 10 2 22 0 60 30 Dragon_head 3 1 44 "Dragon Met: Silver" **** Dragon_Copper c_DrgSilv default G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.3 H 1 5 1 1 po_DrgSilv 5 10 2 22 0 60 30 Dragon_head 3 1 45 "Dragon Met: Bronze" **** Dragon_Gold c_DrgBrnz default G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.2 H 1 5 1 1 po_DrgBrnz 5 10 2 22 0 60 30 Dragon_head 3 1 46 "Dragon Met: Gold" **** Dragon_Gold c_DrgGold default G S **** 1 1 1 FAST 2.88 5.2 1 1.9 1 1 3.1 H 1 5 1 1 po_DrgGold 5 10 2 22 0 60 30 Dragon_head 3 1 47 "Dragon Chr: Blue" **** Dragon_White c_DrgBlue **** G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.2 H 1 5 1 1 po_DrgBlue 5 10 2 22 0 60 30 Dragon_head 3 1 48 "Dragon Chr: Green" **** Dragon_Green c_DrgGreen **** G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.2 H 1 5 1 1 po_DrgGreen 5 10 2 22 0 60 30 Dragon_head 3 1 49 "Dragon Chr: Red" **** Dragon_Red c_DrgRed **** G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.3 H 1 5 1 1 po_DrgRed 5 10 2 22 0 60 30 Dragon_head 3 1 50 "Dragon Chr: White" **** Dragon_Green c_DrgWhite **** G S **** 1 1 1 FAST 3.33 6 1.1 2 1 1.1 3.1 H 1 5 1 1 po_DrgWhite 5 10 2 22 0 60 30 Dragon_head 3 1 51 "Fey: Dryad" **** Dryad_(CM) c_dryad **** R F 1 1 1 1 NORM 1.6 2.7 0.25 0.4 1 0.25 1.5 H 1 16 1 1 po_Dryad 3 9 0 0 1 60 30 head_g 6 1 52 "Elemental Base: Air" **** Elemental_Air c_air **** N S **** 1 1 1 VFAST 2.75 5.5 0.25 0.5 1 0.25 1.9 H 1 15 1 1 po_Air 3 9 0 20 1 60 30 head_g 3 1 53 "Elemental Base: Air: Elder" **** Elemental_Air c_aireld **** N S **** 1 1 1 VFAST 2.75 5.5 0.3 0.6 1 0.3 1.9 H 1 15 1 1 po_AirElder 5 9 0 20 1 60 30 head_g 3 1 54 "Intellect Devourer: War" **** Intellect_Devourer c_devo_01 **** R S **** 1 1 1 NORM 1.02 3.6 0.4 0.4 1 0.4 1.9 L 0 1 1 1 po_devo_01 2 9 3 2 1 60 30 indev_head 3 1 55 "Fey: Pixie: Green" **** Fairy c_Fairy **** R S **** 1 1 1 VFAST 2.75 4 0.1 0.1 1 0.1 1.7 H 1 2 1 1 po_pixie 2 9 -1 23 0 60 30 fairy_head 6 1 56 "Elemental Base: Earth" **** Elemental_Earth c_earth **** N S **** 1 1 1 SLOW 1.82 2.5 0.7 1.7 1 0.7 2.6 H 1 15 1 1 po_Earth 4 9 1 18 1 60 30 stone__head 3 1 57 "Elemental Base: Earth: Elder" **** Elemental_Earth c_eartheld **** N S **** 1 1 1 SLOW 1.82 2.5 0.7 1.7 1 0.7 2.6 H 1 15 1 1 po_Earth_eld 4 9 1 18 1 60 30 stone__head 3 1 58 "Mummy: Common" **** Mummy c_mum_com **** W F 1 1 1 1 VSLOW 1.25 1.75 0.3 0.5 1 0.3 1.8 H 1 23 1 1 po_mum_com01 3 9 3 13 1 60 30 head_g 5 1 59 "Mummy: Warrior 2" **** Mummy c_mum_fight02 **** W F 1 1 1 1 VSLOW 1.25 1.75 0.3 0.5 1 0.3 1.8 H 1 23 1 1 po_mum_war02 3 9 3 13 1 60 30 head_g 5 1 60 "Elemental Base: Fire" **** Elemental_Fire c_fire **** N S **** 1 1 1 NORM 1.32 3.5 0.5 0.7 1 0.5 1.9 H 1 15 1 1 po_Fire 3 9 0 19 1 60 30 FiEl_Head 3 1 61 "Elemental Base: Fire: Elder" **** Elemental_Fire c_fireeld **** N S **** 1 1 1 NORM 1.58 4.16 0.6 0.8 1 0.6 2.4 H 1 15 1 1 po_Fire_eld 3 9 0 19 1 60 30 FiEl_Head 3 1 62 "Skeleton: Priest" **** Skeleton c_skel_priest01 **** W F 1 1 1 1 NORM 1.6 2.7 0.2 0.4 1 0.2 1.8 H 1 23 1 1 po_sk_pre01 3 9 8 13 1 60 30 head_g 5 1 63 "Skeleton: Common" **** Skeleton c_skel_com01 **** W F 1 1 1 1 NORM 1.6 2.7 0.2 0.4 1 0.2 1.8 H 1 23 1 1 po_sk_com01 3 9 8 13 1 60 30 head_g 5 1 64 "Invisible Stalker" **** Elemental_Mist c_invstalk **** R F **** 1 1 1 NORM 1.6 2.7 0.2 0.6 1 0.2 2.2 H 1 15 1 1 po_InvStalk 4 9 3 1 1 60 30 head_g 0 1 65 Sahuagin **** Sahuagin c_sahuagin default G F 1 1 1 1 NORM 1.6 2.7 0.3 0.5 1 0.3 1.7 H 1 2 1 1 po_Sahuagin 3 9 0 0 1 60 30 head_g 0 1 66 "Sahuagin Leader" **** Sahuagin_Leader c_sahuagin_l default G F 1 1 1 1 NORM 1.6 2.7 0.3 0.5 1 0.3 1.7 H 1 2 1 1 po_Sahuagin 3 9 0 0 1 60 30 head_g 0 1 67 "Sahuagin Cleric" **** Sahuagin_Cleric c_sahuagin_c default G F 1 1 1 1 NORM 1.6 2.7 0.3 0.5 1 0.3 1.7 H 1 2 1 1 po_Sahuagin 3 9 0 0 1 60 30 head_g 0 1 68 "Elemental Base: Water: Elder" **** Elemental_Water c_waterEld **** N S **** 1 1 1 SLOW 1.25 2 0.2 0.6 1 0.2 1.9 H 0 15 1 1 po_Water_eld 3 9 0 21 1 60 30 Welemental_head 3 1 69 "Elemental Base: Water" **** Elemental_Water c_water **** N S **** 1 1 1 SLOW 1.25 2 0.2 0.5 1 0.2 1.8 H 0 15 1 1 po_Water 3 9 0 21 1 60 30 Welemental_head 3 1 70 "Skeleton: Warrior 1" **** Skeleton c_skel_war02 **** W F 1 1 1 1 NORM 1.6 2.7 0.3 0.5 1 0.3 1.8 H 1 23 1 1 po_sk_war01 3 9 8 13 1 60 30 head_g 5 1 71 "Skeleton: Warrior 2" **** Skeleton c_skel_war03 **** W F 1 1 1 1 NORM 1.6 2.7 0.3 0.5 1 0.3 1.8 H 1 23 1 1 po_sk_war02 3 9 8 13 1 60 30 head_g 5 1 72 Ettin **** Ettin c_ettin **** R L 2.1 1 1 1 FAST 2.66 6 0.5 1.5 1 0.5 2.2 H 1 17 1 1 po_Ettin 4 9 1 3 0 60 30 Ettin_Largehead 0 1 73 Gargoyle **** Gargoyle c_gargoyle **** G S **** 1 1 1 FAST 2.7 2.7 0.6 1.6 1 0.6 2.1 H 1 18 1 1 po_Gargoyle 3 9 0 2 1 60 30 Gargoyle_head 3 1 74 Ghast **** Ghast c_Ghast **** Y F 1 1 1 1 NORM 1.6 2.7 0.2 0.4 1 0.2 1.8 H 1 23 1 1 po_Ghast 3 9 0 0 1 60 30 head_g 5 1 75 "Ogre: Elite" **** Ogre_elite c_Ogre35 **** R L 1.8 1 1 1 NORM 3.5 3.5 0.6 1.5 1 0.4 2.2 H 1 17 1 1 po_Ogre35 4 9 1 1 1 45 5 Ogre_head 0 1 76 Ghoul **** Ghoul c_ghoul **** Y F 1 1 1 1 NORM 1.6 2.7 0.2 0.4 1 0.2 1.8 H 1 23 1 1 po_Ghoul 3 9 0 0 1 60 30 head_g 5 1 77 "Ghoul Lord" **** Ghoul_Lord c_GhoulLord **** Y F 1 1 1 1 NORM 1.6 2.7 0.2 0.4 1 0.2 1.8 H 1 23 1 1 po_GhoulLord 3 9 0 0 1 60 30 head_g 5 1 78 "Giant: Hill 1" **** Giant_Common c_gnthill **** R L 2.4 1 1 1 FAST 2.43 4.95 0.7 1.5 1 0.7 1.8 H 1 17 1 1 po_GntHill 4 9 1 3 1 60 30 gnthill_head_g 0 1 79 "Giant: Mountain 1" **** Giant_Common c_gntmount **** R L 2.4 1 1 1 FAST 2.43 4.95 0.7 1.5 1 0.7 1.8 H 1 17 1 1 po_GntMount 4 9 1 3 1 60 30 gnthill_head_g 0 1 80 "Giant: Fire: Male 1" **** Giant_Noble c_gntfire default R L 2.5 1 1 1 FAST 3.28 4.5 0.7 1.5 1 0.7 2 H 1 17 1 1 po_GntFire 5 10 1 1 1 60 30 frostgiant_head 3 1 81 "Giant: Frost: Male 1" **** Giant_Noble c_gntfrost default R L 2.5 1 1 1 FAST 3.28 4.5 0.7 1.5 5 0.7 2 H 1 17 1 1 po_GntFrost 5 10 1 1 1 60 30 frostgiant_head 3 1 82 "Goblin: Chieftain A" **** Goblin c_gobchiefA **** R F 0.8 1 1 1 NORM 1 2 0.3 0.4 1 0.3 1.2 H 1 9 1 1 po_GobChiefA 2 9 0 0 1 60 30 head_g 0 1 83 "Goblin: Chieftain B" **** Goblin c_gobchiefB **** R F 0.8 1 1 1 NORM 1 2 0.3 0.4 1 0.3 1.2 H 1 9 1 1 po_GobChiefB 2 9 0 0 1 60 30 head_g 0 1 84 "Goblin: Shaman A" **** Goblin c_gobwizA **** R F 0.8 1 1 1 NORM 1 2 0.3 0.4 1 0.3 1.2 H 1 9 1 1 po_GobWizA 2 9 0 0 1 60 30 head_g 0 1 85 "Goblin: Shaman B" **** Goblin c_gobwizB **** R F 0.8 1 1 1 NORM 1 2 0.3 0.4 1 0.3 1.2 H 1 9 1 1 po_GobWizB 2 9 0 0 1 60 30 head_g 0 1 86 "Goblin A" **** Goblin c_goblinA **** R F 0.8 1 1 1 NORM 1 2 0.3 0.4 1 0.3 1.2 H 1 9 1 1 po_GoblinA 2 9 0 0 1 60 30 head_g 0 1 87 "Goblin B" **** Goblin c_goblinB **** R F 0.8 1 1 1 NORM 1 2 0.3 0.4 1 0.3 1.2 H 1 9 1 1 po_GoblinB 2 9 0 0 1 60 30 head_g 0 1 88 "Golem: Flesh" **** Golem_Flesh c_golflesh **** R S **** 1 1 1 NORM 2.33 3.2 0.3 0.5 1 0.3 1.9 H 1 4 1 1 po_GolFlesh 4 9 0 2 1 60 30 GolFlesh_head 5 1 89 "Golem: Iron" **** Golem_Iron c_goliron **** W L 2.1 1 1 1 SLOW 2.58 3.66 0.6 1.6 1 1 1.9 H 1 4 1 1 po_GolIron 4 9 1 9 1 60 30 IroGolem_head 3 1 90 "Shield Guardian" **** Golem_Iron c_shguard **** W S 2.1 1 1 1 SLOW 2.58 3.66 0.6 1.5 1 0.9 2 H 1 4 1 1 po_ShGuard 4 9 1 11 1 60 30 IroGolem_head 3 1 91 "Golem: Clay 1" **** Golem_Stone c_GolClay **** W S **** 1 1 1 SLOW 1.82 2.25 0.6 1.8 1 0.8 2.7 H 1 4 1 1 po_GolClay 4 9 1 11 1 60 30 stone__head 3 1 92 "Golem: Stone" **** Golem_Stone c_GolStone **** W S **** 1 1 1 SLOW 1.82 2.25 0.6 1.8 1 0.8 2.7 H 1 4 1 1 po_GolStone 4 9 1 11 1 60 30 stone__head 3 1 93 "Cat: Leopard" **** Great_Cat c_cat_lep **** R S **** 1 1 1 FAST 2.45 2.25 0.6 1 1 1 2.3 L 0 2 1 1 po_Leopard 3 9 3 2 1 60 30 Cat_head 0 1 94 "Cat: Crag Cat" **** Great_Cat c_cat_crag **** R S **** 1 1 1 FAST 3.06 2.81 0.6 1.3 1 1.3 3 L 0 2 1 1 po_cat_crag 3 9 3 2 1 60 30 Cat_head 0 1 95 "Cat: Tiger: Dire" **** Great_Cat c_cat_dire **** R S **** 1 1 1 FAST 2.1 3.75 0.6 1.4 1 1.4 2.7 H 0 2 1 1 po_DireTiger 3 9 3 2 1 60 30 Cat_head 0 1 96 "Cat: Krenshar" **** Great_Cat c_cat_kren **** R S **** 1 1 1 FAST 2.45 2.25 0.6 1.1 1 1.1 2.4 L 0 2 1 1 po_Krenshar 3 9 3 2 1 60 30 Cat_head 0 1 ================================================ FILE: samples/2-Dimensional Array/tailmodel.2da ================================================ 2DA V2.0 LABEL MODEL ENVMAP 0 None **** **** 1 Lizard c_tailliz default 2 Bone c_tailbone **** 3 Devil c_taildevil default 4 "Dragon, Brass" c_tail_brs default 5 "Dragon, Bronze" c_tail_brz default 6 "Dragon, Copper" c_tail_cop default 7 "Dragon, Silver" c_tail_sil default 8 "Dragon, Gold" c_tail_gol default 9 "Dragon, Black" c_tail_blk **** 10 "Dragon, Blue" c_tail_blu **** 11 "Dragon, Green" c_tail_grn **** 12 "Dragon, Red" c_tail_red **** 13 "Dragon, White" c_tail_whi **** 14 NullTail c_nulltail default 15 "Horse, Walnut" c_horse1 default 16 "Horse, Walnut, saddle" c_horse1a default 17 "Horse, Walnut, saddle, packs" c_horse1b default 18 "Horse, Walnut, leather barding" c_horse1c1 default 19 "Horse, Walnut, scale mail barding" c_horse1c2 default 20 "Horse, Walnut, chain barding" c_horse1c3 default 21 "Horse, Walnut, purple barding" c_horse1c4 default 22 "Horse, Walnut, red barding" c_horse1c5 default 23 "Horse, Walnut, leather barding, packs" c_horse1d1 default 24 "Horse, Walnut, scale mail barding, packs" c_horse1d2 default 25 "Horse, Walnut, chain barding, packs" c_horse1d3 default 26 "Horse, Walnut, purple barding, packs" c_horse1d4 default 27 "Horse, Walnut, red barding, packs" c_horse1d5 default 28 "Horse, Gunpowder" c_horse2 default 29 "Horse, Gunpowder, saddle" c_horse2a default 30 "Horse, Gunpowder, saddle, packs" c_horse2b default 31 "Horse, Gunpowder, leather barding" c_horse2c1 default 32 "Horse, Gunpowder, scale mail barding" c_horse2c2 default 33 "Horse, Gunpowder, chain barding" c_horse2c3 default 34 "Horse, Gunpowder, purple barding" c_horse2c4 default 35 "Horse, Gunpowder, red barding" c_horse2c5 default 36 "Horse, Gunpowder, leather barding, packs" c_horse2d1 default 37 "Horse, Gunpowder, scale mail barding, packs" c_horse2d2 default 38 "Horse, Gunpowder, chain barding, packs" c_horse2d3 default 39 "Horse, Gunpowder, purple barding, packs" c_horse2d4 default 40 "Horse, Gunpowder, red barding, packs" c_horse2d5 default 41 "Horse, Spotted" c_horse3 default 42 "Horse, Spotted, saddle" c_horse3a default 43 "Horse, Spotted, saddle, packs" c_horse3b default 44 "Horse, Spotted, leather barding" c_horse3c1 default 45 "Horse, Spotted, scale mail barding" c_horse3c2 default 46 "Horse, Spotted, chain barding" c_horse3c3 default 47 "Horse, Spotted, purple barding" c_horse3c4 default 48 "Horse, Spotted, red barding" c_horse3c5 default 49 "Horse, Spotted, leather barding, packs" c_horse3d1 default 50 "Horse, Spotted, scale mail barding, packs" c_horse3d2 default 51 "Horse, Spotted, chain barding, packs" c_horse3d3 default 52 "Horse, Spotted, purple barding, packs" c_horse3d4 default 53 "Horse, Spotted, red barding, packs" c_horse3d5 default 54 "Horse, Black" c_horse4 default 55 "Horse, Black, saddle" c_horse4a default 56 "Horse, Black, saddle, packs" c_horse4b default 57 "Horse, Black, leather barding" c_horse4c1 default 58 "Horse, Black, scale mail barding" c_horse4c2 default 59 "Horse, Black, chain barding" c_horse4c3 default 60 "Horse, Black, purple barding" c_horse4c4 default 61 "Horse, Black, red barding" c_horse4c5 default 62 "Horse, Black, leather barding, packs" c_horse4d1 default 63 "Horse, Black, scale mail barding, packs" c_horse4d2 default 64 "Horse, Black, chain barding, packs" c_horse4d3 default 65 "Horse, Black, purple barding, packs" c_horse4d4 default 66 "Horse, Black, red barding, packs" c_horse4d5 default 67 "Nightmare, barding" c_horse5 default 68 "Nightmare, saddle" c_horse5a default 69 Nightmare c_horse5b default 70 "Horse, Jousting, Purple cloth" c_horse_j1 default 71 "Horse, Jousting, Blue and gold cloth" c_horse_j2 default 72 "Horse, Jousting, Black and white cloth" c_horse_j3 default 73 "Horse, Jousting, Red and yellow cloth" c_horse_j4 default 74 "Horse, Jousting, Red and black Striped cloth" c_horse_j5 default 75 "Horse, Jousting, Green cloth" c_horse_j6 default 76 "Horse, Jousting, Blue and pink cloth" c_horse_j7 default 77 "Horse, Jousting, Red and gold brick cloth" c_horse_j8 default 78 "Horse, Jousting, Black cloth" c_horse_j9 default 79 "Horse, Jousting, Cyan and white cloth" c_horse_j10 default 80 "Horse, Jousting, White cloth" c_horse_j11 default 81 "Halfling, NPC, Female" c_yNPC_a_f01 default 82 "Halfling, NPC, Male" c_yNPC_a_m01 default 83 "Azer, Female" c_azergirl evmap_azer 84 "Azer, Male" c_azerman evmap_azer 85 "Druegar, Cleric" c_yDurgCleric default 86 "Druegar, Fighter" c_yDurgFight default 87 "Duergar, Chief" c_yduechf default 88 "Duergar, Slave" c_ydueslv default 89 "Dwarf, NPC, Female" c_yNPC_d_f01 default 90 "Dwarf, NPC, Male" c_yNPC_d_m01 default 91 "Svirf, Female" c_ysvirfgirl default 92 "Svirf, Male" c_ysvirfman default 93 "Drow, Matron" c_drowmat default 94 "Drow, Cleric" c_yDroCleric default 95 "Drow, Female, 1" c_ydrofem1 default 96 "Drow, Female, 2" c_ydrofem2 default ================================================ FILE: samples/4D/generate_project.4dm ================================================ //%attributes = {} $params:=New object:C1471 $params.PRODUCT_NAME:="strophe" $params.PRODUCT_VERSION:="1.0" $params.AUTHOR:="miyako" $params.CREATE_DATE:=Current date:C33 $params.COPYRIGHT_YEAR:=Year of:C25(Current date:C33) generate_project_source ($params) generate_project_vs ($params) generate_project_xcode ($params) generate_project_plugin_stub ($params) ================================================ FILE: samples/4D/play_with_classes.4dm ================================================ //%attributes = {} // ---------------------------------------------------- // Project method : object // ID[5543995AC5E24988A39E024B39541A8F] // Created 13-9-2019 by Vincent de Lachaux // ---------------------------------------------------- // Description: // // ---------------------------------------------------- // Declarations C_OBJECT:C1216($0) C_TEXT:C284($1) C_TEXT:C284($2) C_TEXT:C284($t) C_OBJECT:C1216($o) C_COLLECTION:C1488($c) If (False:C215) C_OBJECT:C1216(class ;$0) C_TEXT:C284(class ;$1) C_TEXT:C284(class ;$2) End if // ---------------------------------------------------- If (This:C1470[""]=Null:C1517) // Constructor If (Count parameters:C259>=1) $t:=String:C10($1) If (Count parameters:C259>=2) // With parameter $o:=Formula from string:C1601($t+"(\""+String:C10($2)+"\")").call() Else $o:=Formula from string:C1601($t).call() End if $o.constructor:=Formula:C1597(class ("constructor")) End if Else Case of //______________________________________________________ : ($1="constructor") // Returns collection of properties and functions $o:=New object:C1471(\ "properties";New collection:C1472;\ "functions";New collection:C1472;\ "fomulas";New collection:C1472) $c:=New collection:C1472 For each ($t;This:C1470) $c.push($t) End for each $c:=$c.orderBy(ck ascending:K85:9) For each ($t;$c) Case of //______________________________________________________ : ($t=$1) //______________________________________________________ : (Value type:C1509(This:C1470[$t])=Is object:K8:27) //If (JSON Stringify(This[$t])="\"[object Formula]\"") If (This:C1470[$t].source#Null:C1517) $o.functions.push($t) $o.fomulas.push(This:C1470[$t].source) Else $o.properties.push($t) End if //______________________________________________________ Else $o.properties.push($t) //______________________________________________________ End case End for each $o.functions:=$o.functions.orderBy(ck ascending:K85:9) $o.properties:=$o.properties.orderBy(ck ascending:K85:9) //________________________________________ : (This:C1470=Null:C1517) ASSERT:C1129(False:C215;"OOPS, this method must be called from a member method") //______________________________________________________ Else $o:=This:C1470[$1].call() //______________________________________________________ End case End if // ---------------------------------------------------- // Return $0:=$o // ---------------------------------------------------- // End ================================================ FILE: samples/4D/test_webServerStart.4dm ================================================ //%attributes = {"preemptive":"capable"} C_OBJECT:C1216($webObject) $webObject:=WEB server:C1674(2) //host db webServer //some initiatialisation clear_files C_OBJECT:C1216($settings) C_OBJECT:C1216($result) C_OBJECT:C1216($path;$newIndex) C_TEXT:C284($response) $settings:=New object:C1471 $settings.rootFolder:=Folder:C1567(fk web root folder:K87:15).parent.folder("WebFolder2").platformPath $settings.certificateFolder:=Folder:C1567(fk database folder:K87:14).folder("certificate").platformPath $settings.HTTPEnabled:=True:C214 $settings.HTTPPort:=8888 $settings.HTTPSEnabled:=True:C214 $settings.HTTPSPort:=4443 $settings.defaultHomepage:="index2.html" $result:=$webObject.start($settings) ASSERT:C1129($result#Null:C1517;"result should not be null") ASSERT:C1129($result.success=True:C214;"result must contain a 'success' attribute and must be true") ASSERT:C1129($webObject.isRunning=True:C214;"web server 'isRunning' should be true") //test HTTP $statusCode:=HTTP Get:C1157("http://localhost:8888";$response) ASSERT:C1129($statusCode=200;"Web Server not started") $path:=Folder:C1567($settings.rootFolder;fk platform path:K87:2).file("index2.html") $newIndex:=File:C1566($path.platformPath;fk platform path:K87:2) ASSERT:C1129($response=$newIndex.getText();"unexpected index page content") $statusCode:=HTTP Get:C1157("https://localhost:4443";$response) ASSERT:C1129($statusCode=200;"Web Server not started") $webObject.stop() ================================================ FILE: samples/4D/webArea.4dm ================================================ //%attributes = {"invisible":true} // ---------------------------------------------------- // Project method : webArea // ID[400C94A87A6E4C049664710A5F9E71F9] // Created 10-1-2020 by Vincent de Lachaux // ---------------------------------------------------- // Description: // // ---------------------------------------------------- // Declarations C_OBJECT:C1216($0) C_TEXT:C284($1) C_OBJECT:C1216($2) C_TEXT:C284($t) C_OBJECT:C1216($o) If (False:C215) C_OBJECT:C1216(webArea ;$0) C_TEXT:C284(webArea ;$1) C_OBJECT:C1216(webArea ;$2) End if // ---------------------------------------------------- If (This:C1470[""]=Null:C1517) // Constructor If (Count parameters:C259>=1) $t:=String:C10($1) End if $o:=New object:C1471(\ "";"webArea";\ "name";$t;\ "url";"";\ "coordinates";Null:C1517;\ "windowCoordinates";Null:C1517;\ "getCoordinates";Formula:C1597(widget ("getCoordinates"));\ "hide";Formula:C1597(OBJECT SET VISIBLE:C603(*;This:C1470.name;False:C215));\ "moveHorizontally";Formula:C1597(widget ("setCoordinates";New object:C1471("left";$1)));\ "moveVertically";Formula:C1597(widget ("setCoordinates";New object:C1471("top";$1)));\ "resizeHorizontally";Formula:C1597(widget ("setCoordinates";New object:C1471("right";$1)));\ "resizeVertically";Formula:C1597(widget ("setCoordinates";New object:C1471("bottom";$1)));\ "setVisible";Formula:C1597(OBJECT SET VISIBLE:C603(*;This:C1470.name;Bool:C1537($1)));\ "show";Formula:C1597(OBJECT SET VISIBLE:C603(*;This:C1470.name;True:C214));\ "visible";Formula:C1597(OBJECT Get visible:C1075(*;This:C1470.name));\ "back";Formula:C1597(WA OPEN BACK URL:C1021(*;This:C1470.name));\ "content";Formula:C1597(WA Get page content:C1038(*;This:C1470.name));\ "forward";Formula:C1597(WA OPEN FORWARD URL:C1022(*;This:C1470.name));\ "init";Formula:C1597(webArea ("init"));\ "isLoaded";Formula:C1597(WA Get current URL:C1025(*;This:C1470.name)=This:C1470.url);\ "lastFiltered";Formula:C1597(WA Get last filtered URL:C1035(*;This:C1470.name));\ "openURL";Formula:C1597(webArea ("openURL";New object:C1471("url";$1)));\ "refresh";Formula:C1597(webArea ("openURL";New object:C1471("url";$1)));\ "setContent";Formula:C1597(webArea ("setContent";New object:C1471("content";String:C10($1);"base";$2)));\ "title";Formula:C1597(WA Get page title:C1036(*;This:C1470.name))\ ) If (Is Windows:C1573) $o.openURL() // previously load about:blank End if Else $o:=This:C1470 Case of //______________________________________________________ : ($o=Null:C1517) ASSERT:C1129(False:C215;"OOPS, this method must be called from a member method") //______________________________________________________ : ($1="init") ARRAY TEXT:C222($tTxt_filters;0x0000) ARRAY BOOLEAN:C223($tBoo_allow;0x0000) // All are forbidden APPEND TO ARRAY:C911($tTxt_filters;"*") // All APPEND TO ARRAY:C911($tBoo_allow;False:C215) // Forbidden // Allow WA SET PAGE CONTENT APPEND TO ARRAY:C911($tTxt_filters;"file*") APPEND TO ARRAY:C911($tBoo_allow;True:C214) // to allow including HTML files WA SET URL FILTERS:C1030(*;$o.name;$tTxt_filters;$tBoo_allow) WA SET PREFERENCE:C1041(*;$o.name;WA enable Java applets:K62:3;False:C215) WA SET PREFERENCE:C1041(*;$o.name;WA enable JavaScript:K62:4;True:C214) WA SET PREFERENCE:C1041(*;$o.name;WA enable plugins:K62:5;False:C215) // // Active the contextual menu in debug mode WA SET PREFERENCE:C1041(*;$o.name;WA enable contextual menu:K62:6;Not:C34(Is compiled mode:C492) | (Structure file:C489=Structure file:C489(*))) WA SET PREFERENCE:C1041(*;$o.name;WA enable Web inspector:K62:7;True:C214) //______________________________________________________ : ($1="openURL") If (Value type:C1509($2.url)=Is object:K8:27) // File $t:="file:///"+$2.url.path Else $t:=String:C10($2.url) End if Case of //…………………………………………………………………………………………………… : (Length:C16($t)=0) $t:="about:blank" //…………………………………………………………………………………………………… : ($t="internal") // Current database server $t:="127.0.0.1:"+String:C10(WEB Get server info:C1531.options.webPortID) //…………………………………………………………………………………………………… : ($t="localhost")\ & Is macOS:C1572 //#TURN_AROUND - In some cases, using "localhost" we get the error -30 "Server unreachable" $t:="127.0.0.1" //…………………………………………………………………………………………………… End case $o.url:=$t WA OPEN URL:C1020(*;$o.name;$o.url) //______________________________________________________ : ($1="setContent") WA SET PAGE CONTENT:C1037(*;$o.name;$2.content;Choose:C955($2.base=Null:C1517;"/";String:C10($2.base))) //______________________________________________________ Else ASSERT:C1129(False:C215;"Unknown entry point: \""+$1+"\"") //______________________________________________________ End case End if // ---------------------------------------------------- // Return $0:=$o // ---------------------------------------------------- // End ================================================ FILE: samples/ABAP/cl_csv_parser.abap ================================================ */** * The MIT License (MIT) * Copyright (c) 2012 René van Mil * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ *----------------------------------------------------------------------* * CLASS CL_CSV_PARSER DEFINITION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* class cl_csv_parser definition public inheriting from cl_object final create public . public section. *"* public components of class CL_CSV_PARSER *"* do not include other source files here!!! type-pools abap . methods constructor importing !delegate type ref to if_csv_parser_delegate !csvstring type string !separator type c !skip_first_line type abap_bool . methods parse raising cx_csv_parse_error . protected section. *"* protected components of class CL_CSV_PARSER *"* do not include other source files here!!! private section. *"* private components of class CL_CSV_PARSER *"* do not include other source files here!!! constants _textindicator type c value '"'. "#EC NOTEXT data _delegate type ref to if_csv_parser_delegate . data _csvstring type string . data _separator type c . type-pools abap . data _skip_first_line type abap_bool . methods _lines returning value(returning) type stringtab . methods _parse_line importing !line type string returning value(returning) type stringtab raising cx_csv_parse_error . endclass. "CL_CSV_PARSER DEFINITION *----------------------------------------------------------------------* * CLASS CL_CSV_PARSER IMPLEMENTATION *----------------------------------------------------------------------* * *----------------------------------------------------------------------* class cl_csv_parser implementation. * ---------------------------------------------------------------------------------------+ * | Instance Public Method CL_CSV_PARSER->CONSTRUCTOR * +-------------------------------------------------------------------------------------------------+ * | [--->] DELEGATE TYPE REF TO IF_CSV_PARSER_DELEGATE * | [--->] CSVSTRING TYPE STRING * | [--->] SEPARATOR TYPE C * | [--->] SKIP_FIRST_LINE TYPE ABAP_BOOL * +-------------------------------------------------------------------------------------- method constructor. super->constructor( ). _delegate = delegate. _csvstring = csvstring. _separator = separator. _skip_first_line = skip_first_line. endmethod. "constructor * ---------------------------------------------------------------------------------------+ * | Instance Public Method CL_CSV_PARSER->PARSE * +-------------------------------------------------------------------------------------------------+ * | [!CX!] CX_CSV_PARSE_ERROR * +-------------------------------------------------------------------------------------- method parse. data msg type string. if _csvstring is initial. message e002(csv) into msg. raise exception type cx_csv_parse_error exporting message = msg. endif. " Get the lines data is_first_line type abap_bool value abap_true. data lines type standard table of string. lines = _lines( ). field-symbols type string. loop at lines assigning . " Should we skip the first line? if _skip_first_line = abap_true and is_first_line = abap_true. is_first_line = abap_false. continue. endif. " Parse the line data values type standard table of string. values = _parse_line( ). " Send values to delegate _delegate->values_found( values ). endloop. endmethod. "parse * ---------------------------------------------------------------------------------------+ * | Instance Private Method CL_CSV_PARSER->_LINES * +-------------------------------------------------------------------------------------------------+ * | [<-()] RETURNING TYPE STRINGTAB * +-------------------------------------------------------------------------------------- method _lines. split _csvstring at cl_abap_char_utilities=>cr_lf into table returning. endmethod. "_lines * ---------------------------------------------------------------------------------------+ * | Instance Private Method CL_CSV_PARSER->_PARSE_LINE * +-------------------------------------------------------------------------------------------------+ * | [--->] LINE TYPE STRING * | [<-()] RETURNING TYPE STRINGTAB * | [!CX!] CX_CSV_PARSE_ERROR * +-------------------------------------------------------------------------------------- method _parse_line. data msg type string. data csvvalue type string. data csvvalues type standard table of string. data char type c. data pos type i value 0. data len type i. len = strlen( line ). while pos < len. char = line+pos(1). if char <> _separator. if char = _textindicator. data text_ended type abap_bool. text_ended = abap_false. while text_ended = abap_false. pos = pos + 1. if pos < len. char = line+pos(1). if char = _textindicator. text_ended = abap_true. else. if char is initial. " Space concatenate csvvalue ` ` into csvvalue. else. concatenate csvvalue char into csvvalue. endif. endif. else. " Reached the end of the line while inside a text value " This indicates an error in the CSV formatting text_ended = abap_true. message e003(csv) into msg. raise exception type cx_csv_parse_error exporting message = msg. endif. endwhile. " Check if next character is a separator, otherwise the CSV formatting is incorrect data nextpos type i. nextpos = pos + 1. if nextpos < len and line+nextpos(1) <> _separator. message e003(csv) into msg. raise exception type cx_csv_parse_error exporting message = msg. endif. else. if char is initial. " Space concatenate csvvalue ` ` into csvvalue. else. concatenate csvvalue char into csvvalue. endif. endif. else. append csvvalue to csvvalues. clear csvvalue. endif. pos = pos + 1. endwhile. append csvvalue to csvvalues. " Don't forget the last value returning = csvvalues. endmethod. "_parse_line endclass. "CL_CSV_PARSER IMPLEMENTATION ================================================ FILE: samples/ABAP CDS/zcds_monsters_association.ddls.asddls ================================================ @AbapCatalog.sqlViewName: 'ZV_MONSTERS_ASS' @AbapCatalog.compiler.compareFilter: true @AbapCatalog.preserveKey: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'Monster CDS View with Association' // Listing 07.30 : Coding CDS Views using Association define view Zcds_Monsters_Association as select from ztmonster_header as monster association [0..*] to ztmonster_pets as _Pet on monster.monster_number = _Pet.owner { key monster.monster_number as MonsterNumber, key _Pet.pet_number as PetNumber, _Pet.owner as Owner, monster.name as OwnerName, _Pet.pet_name as Name, _Pet.pet_type as Type, _Pet.pet_species as Species, _Pet // Make association public } ================================================ FILE: samples/ABAP CDS/zcds_monsters_parameters.ddls.asddls ================================================ @AbapCatalog.sqlViewName: 'ZV_MONSTERS_PARS' @AbapCatalog.compiler.compareFilter: true @AccessControl.authorizationCheck: #CHECK @EndUserText.label: 'Monster CDS View with Parameters' // Listing 07.32 : Defining CDS View with Parameters define view Zcds_Monsters_Parameters with parameters p_sanity_low : zde_monster_sanity, p_sanity_high : zde_monster_sanity, p_color : zde_monster_color as select from ztmonster_header as monster { key monster.monster_number as MonsterNumber, monster.name as name, monster.color as color, monster.sanity_percentage as sanity, monster.strength as strength } where monster.color = :p_color and sanity_percentage between :p_sanity_low and :p_sanity_high ================================================ FILE: samples/ABNF/toml.abnf ================================================ ; Source: https://github.com/toml-lang/toml ; License: MIT ;; This is an attempt to define TOML in ABNF according to the grammar defined ;; in RFC 4234 (http://www.ietf.org/rfc/rfc4234.txt). ;; TOML toml = expression *( newline expression ) expression = ( ws / ws comment / ws keyval ws [ comment ] / ws table ws [ comment ] ) ;; Newline newline = ( %x0A / ; LF %x0D.0A ; CRLF ) newlines = 1*newline ;; Whitespace ws = *( %x20 / ; Space %x09 ; Horizontal tab ) ;; Comment comment-start-symbol = %x23 ; # non-eol = %x09 / %x20-10FFFF comment = comment-start-symbol *non-eol ;; Key-Value pairs keyval-sep = ws %x3D ws ; = keyval = key keyval-sep val key = unquoted-key / quoted-key unquoted-key = 1*( ALPHA / DIGIT / %x2D / %x5F ) ; A-Z / a-z / 0-9 / - / _ quoted-key = quotation-mark 1*basic-char quotation-mark ; See Basic Strings val = integer / float / string / boolean / date-time / array / inline-table ;; Table table = std-table / array-table ;; Standard Table std-table-open = %x5B ws ; [ Left square bracket std-table-close = ws %x5D ; ] Right square bracket table-key-sep = ws %x2E ws ; . Period std-table = std-table-open key *( table-key-sep key) std-table-close ;; Array Table array-table-open = %x5B.5B ws ; [[ Double left square bracket array-table-close = ws %x5D.5D ; ]] Double right square bracket array-table = array-table-open key *( table-key-sep key) array-table-close ;; Integer integer = [ minus / plus ] int minus = %x2D ; - plus = %x2B ; + digit1-9 = %x31-39 ; 1-9 underscore = %x5F ; _ int = DIGIT / digit1-9 1*( DIGIT / underscore DIGIT ) ;; Float float = integer ( frac / frac exp / exp ) zero-prefixable-int = DIGIT *( DIGIT / underscore DIGIT ) frac = decimal-point zero-prefixable-int decimal-point = %x2E ; . exp = e integer e = %x65 / %x45 ; e E ;; String string = basic-string / ml-basic-string / literal-string / ml-literal-string ;; Basic String basic-string = quotation-mark *basic-char quotation-mark quotation-mark = %x22 ; " basic-char = basic-unescaped / escaped escaped = escape ( %x22 / ; " quotation mark U+0022 %x5C / ; \ reverse solidus U+005C %x2F / ; / solidus U+002F %x62 / ; b backspace U+0008 %x66 / ; f form feed U+000C %x6E / ; n line feed U+000A %x72 / ; r carriage return U+000D %x74 / ; t tab U+0009 %x75 4HEXDIG / ; uXXXX U+XXXX %x55 8HEXDIG ) ; UXXXXXXXX U+XXXXXXXX basic-unescaped = %x20-21 / %x23-5B / %x5D-10FFFF escape = %x5C ; \ ;; Multiline Basic String ml-basic-string-delim = quotation-mark quotation-mark quotation-mark ml-basic-string = ml-basic-string-delim ml-basic-body ml-basic-string-delim ml-basic-body = *( ml-basic-char / newline / ( escape newline )) ml-basic-char = ml-basic-unescaped / escaped ml-basic-unescaped = %x20-5B / %x5D-10FFFF ;; Literal String literal-string = apostraphe *literal-char apostraphe apostraphe = %x27 ; ' Apostrophe literal-char = %x09 / %x20-26 / %x28-10FFFF ;; Multiline Literal String ml-literal-string-delim = apostraphe apostraphe apostraphe ml-literal-string = ml-literal-string-delim ml-literal-body ml-literal-string-delim ml-literal-body = *( ml-literal-char / newline ) ml-literal-char = %x09 / %x20-10FFFF ;; Boolean boolean = true / false true = %x74.72.75.65 ; true false = %x66.61.6C.73.65 ; false ;; Datetime (as defined in RFC 3339) date-fullyear = 4DIGIT date-month = 2DIGIT ; 01-12 date-mday = 2DIGIT ; 01-28, 01-29, 01-30, 01-31 based on month/year time-hour = 2DIGIT ; 00-23 time-minute = 2DIGIT ; 00-59 time-second = 2DIGIT ; 00-58, 00-59, 00-60 based on leap second rules time-secfrac = "." 1*DIGIT time-numoffset = ( "+" / "-" ) time-hour ":" time-minute time-offset = "Z" / time-numoffset partial-time = time-hour ":" time-minute ":" time-second [time-secfrac] full-date = date-fullyear "-" date-month "-" date-mday full-time = partial-time time-offset date-time = full-date "T" full-time ;; Array array-open = %x5B ws ; [ array-close = ws %x5D ; ] array = array-open array-values array-close array-values = [ val [ array-sep ] [ ( comment newlines) / newlines ] / val array-sep [ ( comment newlines) / newlines ] array-values ] array-sep = ws %x2C ws ; , Comma ;; Inline Table inline-table-open = %x7B ws ; { inline-table-close = ws %x7D ; } inline-table-sep = ws %x2C ws ; , Comma inline-table = inline-table-open inline-table-keyvals inline-table-close inline-table-keyvals = [ inline-table-keyvals-non-empty ] inline-table-keyvals-non-empty = key keyval-sep val / key keyval-sep val inline-table-sep inline-table-keyvals-non-empty ;; Built-in ABNF terms, reproduced here for clarity ; ALPHA = %x41-5A / %x61-7A ; A-Z / a-z ; DIGIT = %x30-39 ; 0-9 ; HEXDIG = DIGIT / "A" / "B" / "C" / "D" / "E" / "F" ================================================ FILE: samples/AGS Script/GlobalScript.asc ================================================ // main global script file // A function that initializes a bunch of stuff. function initialize_control_panel() { // Centre the control panel gPanel.Centre(); // Centre the Restart dialog as well gRestartYN.Centre(); if (!IsSpeechVoxAvailable()) { // If there is no speech-vox file, and therefore no speech, // disable all the controls related with speech. lblVoice.Visible = false; btnVoice.Visible = false; sldVoice.Visible = false; } else { // If there *is*, then set it to voice and text. It's best to use // both whenever possible, for the player's sake. SetVoiceMode(eSpeechVoiceAndText); // And reflect this in the control panel. btnVoice.Text = "Voice and Text"; } if (!System.SupportsGammaControl) { // If we can't change the gamma settings, disable the relevant options. sldGamma.Visible = false; lblGamma.Visible = false; } //And now, set all the defaults System.Volume = 100; sldAudio.Value = System.Volume; SetGameSpeed(40); sldSpeed.Value = 40; if (IsSpeechVoxAvailable()) { SetVoiceMode(eSpeechVoiceAndText); btnVoice.Text = "Voice and Text"; sldVoice.Value = 255; SetSpeechVolume(255); } if (System.SupportsGammaControl) { System.Gamma = 100; sldGamma.Value = 100; } } // Called when the game starts, before the first room is loaded function game_start() { // Put the code all in a function and then just call the function. // It saves cluttering up places like game_start. initialize_control_panel(); // Use the KeyboardMovement module to, per default, replicate the standard // keyboard movement of most Sierra games. See KeyboardMovement.txt for more info KeyboardMovement.SetMode(eKeyboardMovement_Tapping); } function repeatedly_execute() { // Put here anything you want to happen every game cycle, even when // the game is paused. This will not run when the game is blocked // inside a command like a blocking Walk() if (IsGamePaused() == 1) return; // Put here anything you want to happen every game cycle, but not // when the game is paused. } function repeatedly_execute_always() { // Put anything you want to happen every game cycle, even // when the game is blocked inside a command like a // blocking Walk(). // You cannot run blocking commands from this function. } function show_inventory_window () { gInventory.Visible = true; // switch to the Use cursor (to select items with) mouse.Mode = eModeInteract; // But, override the appearance to look like the arrow mouse.UseModeGraphic(eModePointer); } function show_save_game_dialog() { gSaveGame.Visible = true; // Get the list of save games lstSaveGamesList.FillSaveGameList(); if (lstSaveGamesList.ItemCount > 0) { // If there is at least one, set the default text // to be the first game's name txtNewSaveName.Text = lstSaveGamesList.Items[0]; } else { // No save games yet, default empty text. txtNewSaveName.Text = ""; } mouse.UseModeGraphic(eModePointer); gIconbar.Visible = false; } function show_restore_game_dialog() { gRestoreGame.Visible = true; lstRestoreGamesList.FillSaveGameList(); mouse.UseModeGraphic(eModePointer); gIconbar.Visible = false; } function close_save_game_dialog() { gSaveGame.Visible = false; mouse.UseDefaultGraphic(); gIconbar.Visible = true; } function close_restore_game_dialog() { gRestoreGame.Visible = false; mouse.UseDefaultGraphic(); gIconbar.Visible = true; } // Called when a key is pressed. keycode holds the key's ASCII code function on_key_press(eKeyCode keycode) { // The following is called before "if game is paused keycode=0", so // it'll happen even when the game is paused. if ((keycode == eKeyEscape) && gRestartYN.Visible) { //Use ESC to cancel restart. gRestartYN.Visible = false; gIconbar.Visible = true; // If the panel's not ON, then the player must have gotten here by tapping F9, // therefore his cursor needs restoring. If the panel IS on, then it doesn't, // because it's already a pointer. Get used to thinking like this!! if (!gPanel.Visible) mouse.UseDefaultGraphic(); return; } if ((keycode == eKeyEscape) && gPanel.Visible) { // Use ESC to turn the panel off. gPanel.Visible = false; mouse.UseDefaultGraphic(); gIconbar.Visible = true; return; } if ((keycode == eKeyEscape) && (gSaveGame.Visible)) { // Use ESC to close the save game dialog close_save_game_dialog(); return; } if ((keycode == eKeyEscape) && (gRestoreGame.Visible)) { // Use ESC to close the restore game dialog close_restore_game_dialog(); return; } if (keycode == eKeyReturn) { // ENTER, in this case merely confirms restart if (gRestartYN.Visible) RestartGame(); } if (IsGamePaused() || (IsInterfaceEnabled() == 0)) { // If the game is paused with a modal GUI on the // screen, or the player interface is disabled in // a cut scene, ignore any keypresses. return; } // FUNCTION KEYS AND SYSTEM SHORTCUTS if (keycode == eKeyEscape) { // ESC gPanel.Visible = true; gIconbar.Visible = false; mouse.UseModeGraphic(eModePointer); } if (keycode == eKeyCtrlQ) QuitGame(1); // Ctrl-Q if (keycode == eKeyF5) show_save_game_dialog(); // F5 if (keycode == eKeyF7) show_restore_game_dialog(); // F7 if (keycode == eKeyF9) { // F9, asks the player to confirm restarting (so much better to always confirm first) gRestartYN.Visible = true; gIconbar.Visible = false; mouse.UseModeGraphic(eModePointer); } if (keycode == eKeyF12) SaveScreenShot("scrnshot.bmp"); // F12 if (keycode == eKeyTab) show_inventory_window(); // Tab, show inventory // GAME COMMAND SHORTCUTS if (keycode == 'W') mouse.Mode=eModeWalkto; //Notice this alternate way to indicate keycodes. if (keycode == 'L') mouse.Mode=eModeLookat; //Note that all we do here is set modes. if (keycode == 'U') mouse.Mode=eModeInteract; //If you want something else to happen, such as GUI buttons highlighting, if (keycode == 'T') mouse.Mode=eModeTalkto; //you'll need some more scripting done. if (keycode == 'I') mouse.Mode=eModeUseinv; //But this will, as-is, give you some standard keyboard shortcuts your players will very much appreciate. // For extra cursor modes, such as pick up, feel free to add as you will. // Uncomment the line below if you use the "Pick Up" mode. //if (keycode == 'P' || keycode == 'G') mouse.Mode=eModePickup; // DEBUG FUNCTIONS if (keycode == eKeyCtrlS) Debug(0,0); // Ctrl-S, give all inventory if (keycode == eKeyCtrlV) Debug(1,0); // Ctrl-V, version if (keycode == eKeyCtrlA) Debug(2,0); // Ctrl-A, show walkable areas if (keycode == eKeyCtrlX) Debug(3,0); // Ctrl-X, teleport to room if (keycode == eKeyCtrlW && game.debug_mode) player.PlaceOnWalkableArea(); //Ctrl-W, move to walkable area } function on_mouse_click(MouseButton button) { // called when a mouse button is clicked. button is either LEFT or RIGHT if (IsGamePaused() == 1) { // Game is paused, so do nothing (ie. don't allow mouse click) } else if (button == eMouseLeft) { ProcessClick(mouse.x, mouse.y, mouse.Mode ); } else if (button == eMouseRight || button == eMouseWheelSouth){ // right-click our mouse-wheel down, so cycle cursor mouse.SelectNextMode(); } else if (button == eMouseMiddle) { // Middle-button-click, default make character walk to clicked area (a little shortcut) // Could have been just "player.Walk(mouse.x,mouse.y)", but it's best to // leave our options open - what if you have a special script triggered // on "walking" mode? ProcessClick(mouse.x, mouse.y, eModeWalkto); } else if (button == eMouseWheelNorth) { // Mouse-wheel up, cycle cursors // If mode isn't WALK, set the previous mode (notice usage of numbers instead // of eNums, when it suits us)... if (mouse.Mode>0) mouse.Mode=mouse.Mode-1; else { // ...but if it is WALK mode... if (player.ActiveInventory!=null) { //...and the player has a selected inventory item, set mouse mode to UseInv. mouse.Mode=eModeUseinv; } else { // If they don't, however, just set it to mode TALK (change this line if you add more cursor modes) mouse.Mode=eModeTalkto; } } } } function interface_click(int interface, int button) { // This function is obsolete, from 2.62 and earlier versions. } function btnInvUp_Click(GUIControl *control, MouseButton button) { invCustomInv.ScrollUp(); } function btnInvDown_Click(GUIControl *control, MouseButton button) { invCustomInv.ScrollDown(); } function btnInvOK_Click(GUIControl *control, MouseButton button) { // They pressed the OK button, close the GUI gInventory.Visible = false; mouse.UseDefaultGraphic(); } function btnInvSelect_Click(GUIControl *control, MouseButton button) { // They pressed SELECT, so switch to the Get cursor mouse.Mode = eModeInteract; // But, override the appearance to look like the arrow mouse.UseModeGraphic(eModePointer); } function btnIconInv_Click(GUIControl *control, MouseButton button) { show_inventory_window(); } function btnIconCurInv_Click(GUIControl *control, MouseButton button) { if (player.ActiveInventory != null) mouse.Mode = eModeUseinv; } function btnIconSave_Click(GUIControl *control, MouseButton button) { show_save_game_dialog(); } function btnIconLoad_Click(GUIControl *control, MouseButton button) { show_restore_game_dialog(); } function btnIconExit_Click(GUIControl *control, MouseButton button) { QuitGame(1); } function btnIconAbout_Click(GUIControl *control, MouseButton button) { gPanel.Visible=true; gIconbar.Visible=false; mouse.UseModeGraphic(eModePointer); } function cEgo_Look() { Display("Damn, I'm looking good!"); } function cEgo_Interact() { Display("You rub your hands up and down your clothes."); } function cEgo_Talk() { Display("Talking to yourself is a sign of madness!"); } //START OF CONTROL PANEL FUNCTIONS function btnSave_OnClick(GUIControl *control, MouseButton button) { gPanel.Visible = false; mouse.UseDefaultGraphic(); gIconbar.Visible = true; Wait(1); btnIconSave_Click(btnIconSave, eMouseLeft); } function gControl_OnClick(GUI *theGui, MouseButton button) { } function btnAbout_OnClick(GUIControl *control, MouseButton button) { Display("Adventure Game Studio run-time engine default game."); } function btnQuit_OnClick(GUIControl *control, MouseButton button) { gPanel.Visible = false; Wait(1); QuitGame(1); gPanel.Visible = true; gIconbar.Visible = false; mouse.UseModeGraphic(eModePointer); } function btnLoad_OnClick(GUIControl *control, MouseButton button) { gPanel.Visible = false; mouse.UseDefaultGraphic(); gIconbar.Visible = true; Wait(1); btnIconLoad_Click(btnIconLoad, eMouseLeft); } function btnResume_OnClick(GUIControl *control, MouseButton button) { gPanel.Visible = false; mouse.UseDefaultGraphic(); gIconbar.Visible = true; } function sldAudio_OnChange(GUIControl *control) { System.Volume = sldAudio.Value; } function sldVoice_OnChange(GUIControl *control) { // Sets voice volume. Note that we don't check for the existence of speech.vox - // we did that in game_start, so if it's not there the slider won't even be available. SetSpeechVolume(sldVoice.Value); } function btnVoice_OnClick(GUIControl *control, MouseButton button) { // Note that we don't check for the existence of speech.vox - we did that in game_start, // so if it's not there the button won't even be available. if (btnVoice.Text == "Voice and Text") { SetVoiceMode(eSpeechVoiceOnly); btnVoice.Text = "Voice only"; } else if (btnVoice.Text == "Voice only") { SetVoiceMode(eSpeechTextOnly); btnVoice.Text = "Text only"; } else if (btnVoice.Text == "Text only") { SetVoiceMode(eSpeechVoiceAndText); btnVoice.Text = "Voice and Text"; } } function sldGamma_OnChange(GUIControl *control) { // Set the gamma. Note there's no need to check for anything else, as we ensured, // in game_start, that the slider won't even appear if it's not possible to do this. System.Gamma = sldGamma.Value; } function btnDefault_OnClick(GUIControl *control, MouseButton button) { // Reset everything to default. You'll have to edit these as well as the sliders // if you'd rather have different default parameters. System.Volume = 100; sldAudio.Value = System.Volume; sldSpeed.Value = 40; SetGameSpeed(40); if (IsSpeechVoxAvailable()) { SetVoiceMode(eSpeechVoiceAndText); btnVoice.Text = "Voice and Text"; sldVoice.Value = 255; SetSpeechVolume(255); } if (System.SupportsGammaControl) { System.Gamma = 100; sldGamma.Value = 100; } } //END OF CONTROL PANEL FUNCTIONS function dialog_request(int param) { // This is used by the dialog text parser if you need to process // text that the player types in to the parser. // It is not used by default. } function sldSpeed_OnChange(GUIControl *control) { SetGameSpeed(sldSpeed.Value); } function btnRestart_OnClick(GUIControl *control, MouseButton button) { gRestartYN.Visible=true; gIconbar.Visible=false; } function btnRestartYes_OnClick(GUIControl *control, MouseButton button) { RestartGame(); } function btnRestartNo_OnClick(GUIControl *control, MouseButton button) { gRestartYN.Visible = false; gIconbar.Visible = true; // If the panel's not ON, then the player must have gotten here by tapping F9, // therefore his cursor needs restoring. If the panel IS on, then it doesn't, // because it's already a pointer. Get used to thinking like this!! if (!gPanel.Visible) mouse.UseDefaultGraphic(); } function btnCancelSave_OnClick(GUIControl *control, MouseButton button) { close_save_game_dialog(); } function btnSaveGame_OnClick(GUIControl *control, MouseButton button) { int gameSlotToSaveInto = lstSaveGamesList.ItemCount + 1; int i = 0; while (i < lstSaveGamesList.ItemCount) { if (lstSaveGamesList.Items[i] == txtNewSaveName.Text) { gameSlotToSaveInto = lstSaveGamesList.SaveGameSlots[i]; } i++; } SaveGameSlot(gameSlotToSaveInto, txtNewSaveName.Text); close_save_game_dialog(); } function btnCancelRestore_OnClick(GUIControl *control, MouseButton button) { close_restore_game_dialog(); } function btnRestoreGame_OnClick(GUIControl *control, MouseButton button) { if (lstRestoreGamesList.SelectedIndex >= 0) { RestoreGameSlot(lstRestoreGamesList.SaveGameSlots[lstRestoreGamesList.SelectedIndex]); } close_restore_game_dialog(); } function lstSaveGamesList_OnSelectionCh(GUIControl *control) { txtNewSaveName.Text = lstSaveGamesList.Items[lstSaveGamesList.SelectedIndex]; } function txtNewSaveName_OnActivate(GUIControl *control) { // Pressing return in the text box simulates clicking the Save button btnSaveGame_OnClick(control, eMouseLeft); } function btnDeleteSave_OnClick(GUIControl *control, MouseButton button) { if (lstSaveGamesList.SelectedIndex >= 0) { DeleteSaveSlot(lstSaveGamesList.SaveGameSlots[lstSaveGamesList.SelectedIndex]); lstSaveGamesList.FillSaveGameList(); } } ================================================ FILE: samples/AGS Script/GlobalScript.ash ================================================ // Main header script - this will be included into every script in // the game (local and global). Do not place functions here; rather, // place import definitions and #define names here to be used by all // scripts. ================================================ FILE: samples/AGS Script/KeyboardMovement_102.asc ================================================ // Main script for module 'KeyboardMovement' //**************************************************************************************************** // DEFINITIONS //**************************************************************************************************** #define DISTANCE 10000// distance player walks in Tapping mode before he stops enum KeyboardMovement_Directions { eKeyboardMovement_Stop, eKeyboardMovement_DownLeft, eKeyboardMovement_Down, eKeyboardMovement_DownRight, eKeyboardMovement_Left, eKeyboardMovement_Right, eKeyboardMovement_UpLeft, eKeyboardMovement_Up, eKeyboardMovement_UpRight }; //**************************************************************************************************** // VARIABLES //**************************************************************************************************** // keycodes as variables for future key customization functions (static variables?): int KeyboardMovement_KeyDown = 380; // down arrow int KeyboardMovement_KeyLeft = 375; // left arrow int KeyboardMovement_KeyRight = 377; // right arrow int KeyboardMovement_KeyUp = 372; // up arrow int KeyboardMovement_KeyDownRight = 381; // PgDn (numpad) int KeyboardMovement_KeyUpRight = 373; // PgUp (numpad) int KeyboardMovement_KeyDownLeft = 379; // End (numpad) int KeyboardMovement_KeyUpLeft = 371; // Home (numpad) int KeyboardMovement_KeyStop = 376; // 5 (numpad) KeyboardMovement_Modes KeyboardMovement_Mode = eKeyboardMovement_None; // stores current keyboard control mode (disabled by default) KeyboardMovement_Directions KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // stores current walking direction of player character //**************************************************************************************************** // USER FUNCTIONS //**************************************************************************************************** //==================================================================================================== static function KeyboardMovement::SetMode(KeyboardMovement_Modes mode) { KeyboardMovement_Mode = mode; } //==================================================================================================== // key customization functions here //==================================================================================================== //**************************************************************************************************** // EVENT HANDLER FUNCTIONS //**************************************************************************************************** //==================================================================================================== function repeatedly_execute() { //-------------------------------------------------- // Pressing mode //-------------------------------------------------- if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Pressing) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function KeyboardMovement_Directions newdirection; // declare variable storing new direction // get new direction: if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyDownRight)) ) newdirection = eKeyboardMovement_DownRight; // if down&right arrows or PgDn (numeric pad) held down, set new direction to Down-Right else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyRight))) || (IsKeyPressed(KeyboardMovement_KeyUpRight)) ) newdirection = eKeyboardMovement_UpRight; // up&right arrows or PgUp (numpad) else if ( ((IsKeyPressed(KeyboardMovement_KeyDown)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyDownLeft)) ) newdirection = eKeyboardMovement_DownLeft; // down&left arrows or End (numpad) else if ( ((IsKeyPressed(KeyboardMovement_KeyUp)) && (IsKeyPressed(KeyboardMovement_KeyLeft))) || (IsKeyPressed(KeyboardMovement_KeyUpLeft)) ) newdirection = eKeyboardMovement_UpLeft; // up&left arrows or Home (numpad) else if (IsKeyPressed(KeyboardMovement_KeyDown)) newdirection = eKeyboardMovement_Down; // down arrow else if (IsKeyPressed(KeyboardMovement_KeyLeft)) newdirection = eKeyboardMovement_Left; // left arrow else if (IsKeyPressed(KeyboardMovement_KeyRight)) newdirection = eKeyboardMovement_Right; // right arrow else if (IsKeyPressed(KeyboardMovement_KeyUp)) newdirection = eKeyboardMovement_Up; // up arrow else newdirection = eKeyboardMovement_Stop; // if none of the above held down, set it to stop player character if (IsKeyPressed(KeyboardMovement_KeyStop)) newdirection = eKeyboardMovement_Stop; // if 5 (numeric pad) held down, stop player character, regardless of whether some of the above are held down if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character else { // if new direction is NOT the Stop command int dx, dy; // declare variables storing new walk coordinates if (newdirection == eKeyboardMovement_DownRight) { dx = DISTANCE; dy = DISTANCE; } else if (newdirection == eKeyboardMovement_UpRight) { dx = DISTANCE; dy = -DISTANCE; } else if (newdirection == eKeyboardMovement_DownLeft) { dx = -DISTANCE; dy = DISTANCE; } else if (newdirection == eKeyboardMovement_UpLeft) { dx = -DISTANCE; dy = -DISTANCE; } else if (newdirection == eKeyboardMovement_Down) { dx = 0; dy = DISTANCE; } else if (newdirection == eKeyboardMovement_Left) { dx = -DISTANCE; dy = 0; } else if (newdirection == eKeyboardMovement_Right) { dx = DISTANCE; dy = 0; } else if (newdirection == eKeyboardMovement_Up) { dx = 0; dy = -DISTANCE; } player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates } KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction } } //==================================================================================================== function on_key_press(int keycode) { //-------------------------------------------------- // Tapping mode //-------------------------------------------------- if ((IsGamePaused() == true) || (KeyboardMovement_Mode != eKeyboardMovement_Tapping) || (IsInterfaceEnabled() == false) || (player.on == false)) return 0; // if game is paused, module or mode disabled, interface disabled or player character hidden, quit function KeyboardMovement_Directions newdirection; // declare variable storing new direction // get new direction: if (keycode == KeyboardMovement_KeyDownRight) newdirection = eKeyboardMovement_DownRight; // if down-right key pressed, set new direction to Down-Right else if (keycode == KeyboardMovement_KeyUpRight) newdirection = eKeyboardMovement_UpRight; else if (keycode == KeyboardMovement_KeyDownLeft) newdirection = eKeyboardMovement_DownLeft; else if (keycode == KeyboardMovement_KeyUpLeft) newdirection = eKeyboardMovement_UpLeft; else if (keycode == KeyboardMovement_KeyDown) newdirection = eKeyboardMovement_Down; else if (keycode == KeyboardMovement_KeyLeft) newdirection = eKeyboardMovement_Left; else if (keycode == KeyboardMovement_KeyRight) newdirection = eKeyboardMovement_Right; else if (keycode == KeyboardMovement_KeyUp) newdirection = eKeyboardMovement_Up; else if (keycode == KeyboardMovement_KeyStop) newdirection = eKeyboardMovement_Stop; // if stop key pressed, set to stop player character if (newdirection != KeyboardMovement_CurrentDirection) { // if new direction is different from current direction if (newdirection == eKeyboardMovement_Stop) player.StopMoving(); // if new direction is the Stop command, stop movement of player character else { // if new direction is NOT the Stop command int dx, dy; // declare variables storing new walk coordinates if (newdirection == eKeyboardMovement_DownRight) { dx = DISTANCE; dy = DISTANCE; } else if (newdirection == eKeyboardMovement_UpRight) { dx = DISTANCE; dy = -DISTANCE; } else if (newdirection == eKeyboardMovement_DownLeft) { dx = -DISTANCE; dy = DISTANCE; } else if (newdirection == eKeyboardMovement_UpLeft) { dx = -DISTANCE; dy = -DISTANCE; } else if (newdirection == eKeyboardMovement_Down) { dx = 0; dy = DISTANCE; } else if (newdirection == eKeyboardMovement_Left) { dx = -DISTANCE; dy = 0; } else if (newdirection == eKeyboardMovement_Right) { dx = DISTANCE; dy = 0; } else if (newdirection == eKeyboardMovement_Up) { dx = 0; dy = -DISTANCE; } player.WalkStraight(player.x + dx, player.y + dy, eNoBlock); // walk player character to the new coordinates } KeyboardMovement_CurrentDirection = newdirection; // update current direction to new direction } else { // if new direction is same as current direction player.StopMoving(); // stop player character KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; // update current direction } } //==================================================================================================== function on_event(EventType event, int data) { if (event == eEventLeaveRoom) KeyboardMovement_CurrentDirection = eKeyboardMovement_Stop; } //==================================================================================================== ================================================ FILE: samples/AGS Script/KeyboardMovement_102.ash ================================================ // Script header for module 'KeyboardMovement' #define KeyboardMovement_VERSION 101 enum KeyboardMovement_Modes { eKeyboardMovement_None, eKeyboardMovement_Tapping, eKeyboardMovement_Pressing }; struct KeyboardMovement { import static function SetMode(KeyboardMovement_Modes mode); }; ================================================ FILE: samples/AIDL/ExtendableParcelable.aidl ================================================ /* * Copyright (C) 2020 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package test_package; parcelable ExtendableParcelable { int a; @nullable @utf8InCpp String b; ParcelableHolder ext; long c; ParcelableHolder ext2; } ================================================ FILE: samples/AIDL/IVoid.aidl ================================================ /* * Copyright (C) 2017 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package android.os; import android.os.incremental.IncrementalFileSystemControlParcel; import android.os.IVoldListener; import android.os.IVoldMountCallback; import android.os.IVoldTaskListener; /** {@hide} */ interface IVold { void setListener(IVoldListener listener); void abortFuse(); void monitor(); void reset(); void shutdown(); void onUserAdded(int userId, int userSerial); void onUserRemoved(int userId); void onUserStarted(int userId); void onUserStopped(int userId); void addAppIds(in @utf8InCpp String[] packageNames, in int[] appIds); void addSandboxIds(in int[] appIds, in @utf8InCpp String[] sandboxIds); void onSecureKeyguardStateChanged(boolean isShowing); void partition(@utf8InCpp String diskId, int partitionType, int ratio); void forgetPartition(@utf8InCpp String partGuid, @utf8InCpp String fsUuid); void mount(@utf8InCpp String volId, int mountFlags, int mountUserId, @nullable IVoldMountCallback callback); void unmount(@utf8InCpp String volId); void format(@utf8InCpp String volId, @utf8InCpp String fsType); void benchmark(@utf8InCpp String volId, IVoldTaskListener listener); void moveStorage(@utf8InCpp String fromVolId, @utf8InCpp String toVolId, IVoldTaskListener listener); void remountUid(int uid, int remountMode); void remountAppStorageDirs(int uid, int pid, in @utf8InCpp String[] packageNames); void unmountAppStorageDirs(int uid, int pid, in @utf8InCpp String[] packageNames); void setupAppDir(@utf8InCpp String path, int appUid); void fixupAppDir(@utf8InCpp String path, int appUid); void ensureAppDirsCreated(in @utf8InCpp String[] paths, int appUid); @utf8InCpp String createObb(@utf8InCpp String sourcePath, @utf8InCpp String sourceKey, int ownerGid); void destroyObb(@utf8InCpp String volId); void fstrim(int fstrimFlags, IVoldTaskListener listener); void runIdleMaint(IVoldTaskListener listener); void abortIdleMaint(IVoldTaskListener listener); FileDescriptor mountAppFuse(int uid, int mountId); void unmountAppFuse(int uid, int mountId); void fdeCheckPassword(@utf8InCpp String password); void fdeRestart(); int fdeComplete(); void fdeEnable(int passwordType, @utf8InCpp String password, int encryptionFlags); void fdeChangePassword(int passwordType, @utf8InCpp String password); void fdeVerifyPassword(@utf8InCpp String password); @utf8InCpp String fdeGetField(@utf8InCpp String key); void fdeSetField(@utf8InCpp String key, @utf8InCpp String value); int fdeGetPasswordType(); @utf8InCpp String fdeGetPassword(); void fdeClearPassword(); void fbeEnable(); void mountDefaultEncrypted(); void initUser0(); boolean isConvertibleToFbe(); void mountFstab(@utf8InCpp String blkDevice, @utf8InCpp String mountPoint); void encryptFstab(@utf8InCpp String blkDevice, @utf8InCpp String mountPoint, boolean shouldFormat, @utf8InCpp String fsType); void setStorageBindingSeed(in byte[] seed); void createUserKey(int userId, int userSerial, boolean ephemeral); void destroyUserKey(int userId); void addUserKeyAuth(int userId, int userSerial, @utf8InCpp String token, @utf8InCpp String secret); void clearUserKeyAuth(int userId, int userSerial, @utf8InCpp String token, @utf8InCpp String secret); void fixateNewestUserKeyAuth(int userId); int[] getUnlockedUsers(); void unlockUserKey(int userId, int userSerial, @utf8InCpp String token, @utf8InCpp String secret); void lockUserKey(int userId); void prepareUserStorage(@nullable @utf8InCpp String uuid, int userId, int userSerial, int storageFlags); void destroyUserStorage(@nullable @utf8InCpp String uuid, int userId, int storageFlags); void prepareSandboxForApp(in @utf8InCpp String packageName, int appId, in @utf8InCpp String sandboxId, int userId); void destroySandboxForApp(in @utf8InCpp String packageName, in @utf8InCpp String sandboxId, int userId); void startCheckpoint(int retry); boolean needsCheckpoint(); boolean needsRollback(); boolean isCheckpointing(); void abortChanges(in @utf8InCpp String device, boolean retry); void commitChanges(); void prepareCheckpoint(); void restoreCheckpoint(@utf8InCpp String device); void restoreCheckpointPart(@utf8InCpp String device, int count); void markBootAttempt(); boolean supportsCheckpoint(); boolean supportsBlockCheckpoint(); boolean supportsFileCheckpoint(); void resetCheckpoint(); void earlyBootEnded(); @utf8InCpp String createStubVolume(@utf8InCpp String sourcePath, @utf8InCpp String mountPath, @utf8InCpp String fsType, @utf8InCpp String fsUuid, @utf8InCpp String fsLabel, int flags); void destroyStubVolume(@utf8InCpp String volId); FileDescriptor openAppFuseFile(int uid, int mountId, int fileId, int flags); boolean incFsEnabled(); IncrementalFileSystemControlParcel mountIncFs(@utf8InCpp String backingPath, @utf8InCpp String targetDir, int flags); void unmountIncFs(@utf8InCpp String dir); void setIncFsMountOptions(in IncrementalFileSystemControlParcel control, boolean enableReadLogs); void bindMount(@utf8InCpp String sourceDir, @utf8InCpp String targetDir); void destroyDsuMetadataKey(@utf8InCpp String dsuSlot); const int ENCRYPTION_FLAG_NO_UI = 4; const int ENCRYPTION_STATE_NONE = 1; const int ENCRYPTION_STATE_OK = 0; const int ENCRYPTION_STATE_ERROR_UNKNOWN = -1; const int ENCRYPTION_STATE_ERROR_INCOMPLETE = -2; const int ENCRYPTION_STATE_ERROR_INCONSISTENT = -3; const int ENCRYPTION_STATE_ERROR_CORRUPT = -4; const int FSTRIM_FLAG_DEEP_TRIM = 1; const int MOUNT_FLAG_PRIMARY = 1; const int MOUNT_FLAG_VISIBLE = 2; const int PARTITION_TYPE_PUBLIC = 0; const int PARTITION_TYPE_PRIVATE = 1; const int PARTITION_TYPE_MIXED = 2; const int PASSWORD_TYPE_PASSWORD = 0; const int PASSWORD_TYPE_DEFAULT = 1; const int PASSWORD_TYPE_PATTERN = 2; const int PASSWORD_TYPE_PIN = 3; const int STORAGE_FLAG_DE = 1; const int STORAGE_FLAG_CE = 2; const int REMOUNT_MODE_NONE = 0; const int REMOUNT_MODE_DEFAULT = 1; const int REMOUNT_MODE_INSTALLER = 2; const int REMOUNT_MODE_PASS_THROUGH = 3; const int REMOUNT_MODE_ANDROID_WRITABLE = 4; const int VOLUME_STATE_UNMOUNTED = 0; const int VOLUME_STATE_CHECKING = 1; const int VOLUME_STATE_MOUNTED = 2; const int VOLUME_STATE_MOUNTED_READ_ONLY = 3; const int VOLUME_STATE_FORMATTING = 4; const int VOLUME_STATE_EJECTING = 5; const int VOLUME_STATE_UNMOUNTABLE = 6; const int VOLUME_STATE_REMOVED = 7; const int VOLUME_STATE_BAD_REMOVAL = 8; const int VOLUME_TYPE_PUBLIC = 0; const int VOLUME_TYPE_PRIVATE = 1; const int VOLUME_TYPE_EMULATED = 2; const int VOLUME_TYPE_ASEC = 3; const int VOLUME_TYPE_OBB = 4; const int VOLUME_TYPE_STUB = 5; } ================================================ FILE: samples/AL/ALIssue.al ================================================ table 70990099 ALIssue { //Sample code from Arend-Jan Kauffmann's AL Samples repo: https://github.com/ajkauffmann/ALCodeSamples fields { field(1;id;Integer) { CaptionML=ENU='ID'; } field(2;number;Integer) { CaptionML=ENU='Number'; } field(3;title;text[250]) { CaptionML=ENU='Title'; } field(5;created_at;DateTime) { CaptionML=ENU='Created at'; } field(6;user;text[50]) { CaptionML=ENU='User'; } field(7;state;text[30]) { CaptionML=ENU='State'; } field(8;html_url;text[250]) { CaptionML=ENU='URL'; } } keys { key(PK;id) { Clustered = true; } } procedure RefreshIssues(); var RefreshALIssues :Codeunit RefreshALIssueCode; begin RefreshALIssues.Refresh(); end; } ================================================ FILE: samples/AL/ALIssueList.al ================================================ page 70990099 ALIssueList { //Sample code from Arend-Jan Kauffmann's AL Samples repo: https://github.com/ajkauffmann/ALCodeSamples PageType = List; SourceTable = ALIssue; CaptionML=ENU='AL Issues'; Editable = false; SourceTableView=order(descending); layout { area(content) { repeater(General) { field(Number;number) {} field(Title;title) {} field(CreatedAt;created_at) {} field(User;user) {} field(State;state) {} field(URL;html_url) { ExtendedDatatype=URL; } } } } actions { area(processing) { action(RefreshALIssueList) { CaptionML=ENU='Refresh Issues'; Promoted=true; PromotedCategory=Process; Image=RefreshLines; trigger OnAction(); begin RefreshIssues(); CurrPage.Update; if FindFirst then; end; } } } trigger OnOpenPage(); begin //RefreshIssues(); //if FindFirst then; end; } ================================================ FILE: samples/AL/RefreshALIssuesCode.al ================================================ codeunit 70990099 RefreshALIssueCode { //Sample code from Arend-Jan Kauffmann's AL Samples repo: https://github.com/ajkauffmann/ALCodeSamples procedure Refresh(); var ALIssue : Record ALIssue; HttpClient : HttpClient; ResponseMessage : HttpResponseMessage; JsonToken : JsonToken; JsonValue : JsonValue; JsonObject : JsonObject; JsonArray : JsonArray; JsonText : text; i : Integer; begin ALIssue.DeleteAll; // Simple web service call HttpClient.DefaultRequestHeaders.Add('User-Agent','Dynamics 365'); if not HttpClient.Get('https://api.github.com/repos/Microsoft/AL/issues', ResponseMessage) then Error('The call to the web service failed.'); if not ResponseMessage.IsSuccessStatusCode then error('The web service returned an error message:\\' + 'Status code: %1\' + 'Description: %2', ResponseMessage.HttpStatusCode, ResponseMessage.ReasonPhrase); ResponseMessage.Content.ReadAs(JsonText); // Process JSON response if not JsonArray.ReadFrom(JsonText) then Error('Invalid response, expected an JSON array as root object'); for i := 0 to JsonArray.Count - 1 do begin JsonArray.Get(i,JsonToken); JsonObject := JsonToken.AsObject; ALIssue.init; if not JsonObject.Get('id',JsonToken) then error('Could not find a token with key %1'); ALIssue.id := JsonToken.AsValue.AsInteger; ALIssue.number := GetJsonToken(JsonObject,'number').AsValue.AsInteger; ALIssue.title := GetJsonToken(JsonObject,'title').AsValue.AsText; //ALIssue.created_at := GetJsonToken(JsonObject,'created_at').AsValue.AsDateTime; ALIssue.user := SelectJsonToken(JsonObject,'$.user.login').AsValue.AsText; ALIssue.state := GetJsonToken(JsonObject,'state').AsValue.AsText; ALIssue.html_url := GetJsonToken(JsonObject,'html_url').AsValue.AsText; ALIssue.Insert; end; end; procedure GetJsonToken(JsonObject:JsonObject;TokenKey:text)JsonToken:JsonToken; begin if not JsonObject.Get(TokenKey,JsonToken) then Error('Could not find a token with key %1',TokenKey); end; procedure SelectJsonToken(JsonObject:JsonObject;Path:text)JsonToken:JsonToken; begin if not JsonObject.SelectToken(Path,JsonToken) then Error('Could not find a token with path %1',Path); end; } ================================================ FILE: samples/ALGOL/example15.alg ================================================ begin integer i; procedure do_it (n, L); value n; integer n; label L; begin integer array A [1 : n]; integer i; for i := 1 step 1 until n do A [i] := i * i; if n < 10 then goto L else do_it (n - 1, L); end; outstring (1, "Example 5: arrays with non constant bounds\n"); for i := 1 step 1 until 2000 do begin do_it (2000, L_end); L_end:; end; end; ================================================ FILE: samples/AMPL/CT2.mod ================================================ param num_beams; # number of beams param num_rows >= 1, integer; # number of rows param num_cols >= 1, integer; # number of columns set BEAMS := 1 .. num_beams; # set of beams set ROWS := 1 .. num_rows; # set of rows set COLUMNS := 1 .. num_cols; # set of columns # values for entries of each beam param beam_values {BEAMS, ROWS, COLUMNS} >= 0; # values of tumor param tumor_values {ROWS, COLUMNS} >= 0; # values of critical area param critical_values {ROWS, COLUMNS} >= 0; # critical maximum dosage requirement param critical_max; # tumor minimum dosage requirement param tumor_min; # dosage scalar of each beam var X {i in BEAMS} >= 0; # define the tumor area which includes the locations where tumor exists set tumor_area := {k in ROWS, h in COLUMNS: tumor_values[k,h] > 0}; # define critical area set critical_area := {k in ROWS, h in COLUMNS: critical_values[k,h] > 0}; var S {(k,h) in tumor_area} >= 0; var T {(k,h) in critical_area} >= 0; # maximize total dosage in tumor area maximize total_tumor_dosage: sum {i in BEAMS} sum {(k,h) in tumor_area} X[i] * beam_values[i,k,h]; # minimize total dosage in critical area minimize total_critical_dosage: sum {i in BEAMS} sum {(k,h) in critical_area} X[i] * beam_values[i,k,h]; # minimize total tumor slack minimize total_tumor_slack: sum {(k,h) in tumor_area} S[k,h]; # minimize total critical area slack minimize total_critical_slack: sum {(k,h) in critical_area} T[k,h]; # total dosage at each tumor location [k,h] should be >= min tumor dosage with slack variable subject to tumor_limit {(k,h) in tumor_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == tumor_min - S[k,h]; # total dosage at each critical location [k,h] should be = max critical dosage with slack variable subject to critical_limit {(k,h) in critical_area} : sum {i in BEAMS} X[i] * beam_values[i,k,h] == critical_max + T[k,h]; ================================================ FILE: samples/AMPL/toy.ampl ================================================ # A toy knapsack problem from the LocalSolver docs written in AMPL. set I; param Value{I}; param Weight{I}; param KnapsackBound; var Take{I} binary; maximize TotalValue: sum{i in I} Take[i] * Value[i]; s.t. WeightLimit: sum{i in I} Take[i] * Weight[i] <= KnapsackBound; data; param: I: Weight Value := 0 10 1 1 60 10 2 30 15 3 40 40 4 30 60 5 20 90 6 20 100 7 2 15; param KnapsackBound := 102; ================================================ FILE: samples/API Blueprint/actions.apib ================================================ FORMAT: 1A # Advanced Action API A resource action is – in fact – a state transition. This API example demonstrates an action - state transition - to another resource. ## API Blueprint + [Previous: Resource Model](11.%20Resource%20Model.md) + [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/11.%20Advanced%20Action.md) # Tasks [/tasks/tasks{?status,priority}] + Parameters + status (string) + priority (number) ## List All Tasks [GET] + Response 200 (application/json) [ { "id": 123, "name": "Exercise in gym", "done": false, "type": "task" }, { "id": 124, "name": "Shop for groceries", "done": true, "type": "task" } ] ## Retrieve Task [GET /task/{id}] This is a state transition to another resource + Parameters + id (string) + Response 200 (application/json) { "id": 123, "name": "Go to gym", "done": false, "type": "task" } ## Delete Task [DELETE /task/{id}] + Parameters + id (string) + Response 204 ================================================ FILE: samples/API Blueprint/attributes.apib ================================================ FORMAT: 1A # Attributes API This API example demonstrates how to describe body attributes of a request or response message. In this case, the description is complementary (and duplicate!) to the provided JSON example in the body section. The [Advanced Attributes](09.%20Advanced%20Attributes.md) API example will demonstrate how to avoid duplicates and how to reuse attributes descriptions. ## API Blueprint + [Previous: Parameters](07.%20Parameters.md) + [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/08.%20Attributes.md) + [Next: Advanced Attributes](09.%20Advanced%20Attributes.md) # Group Coupons ## Coupon [/coupons/{id}] A coupon contains information about a percent-off or amount-off discount you might want to apply to a customer. ### Retrieve a Coupon [GET] Retrieves the coupon with the given ID. + Response 200 (application/json) + Attributes (object) + id: 250FF (string) + created: 1415203908 (number) - Time stamp + percent_off: 25 (number) A positive integer between 1 and 100 that represents the discount the coupon will apply. + redeem_by (number) - Date after which the coupon can no longer be redeemed + Body { "id": "250FF", "created": 1415203908, "percent_off": 25, "redeem_by:" null } ================================================ FILE: samples/API Blueprint/simple.apib ================================================ FORMAT: 1A # The Simplest API This is one of the simplest APIs written in the **API Blueprint**. One plain resource combined with a method and that's it! We will explain what is going on in the next installment - [Resource and Actions](02.%20Resource%20and%20Actions.md). **Note:** As we progress through the examples, do not also forget to view the [Raw](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md) code to see what is really going on in the API Blueprint, as opposed to just seeing the output of the Github Markdown parser. Also please keep in mind that every single example in this course is a **real API Blueprint** and as such you can **parse** it with the [API Blueprint parser](https://github.com/apiaryio/drafter) or one of its [bindings](https://github.com/apiaryio/drafter#bindings). ## API Blueprint + [This: Raw API Blueprint](https://raw.github.com/apiaryio/api-blueprint/master/examples/01.%20Simplest%20API.md) + [Next: Resource and Actions](02.%20Resource%20and%20Actions.md) # GET /message + Response 200 (text/plain) Hello World! ================================================ FILE: samples/APL/DeepakChopra.apl ================================================ ⍝ You can try this at http://tryapl.org/ ⍝ I can not explain how much I suddenly love this crypto-language Starts ← 'Experiential truth ' 'The physical world ' 'Non-judgment ' 'Quantum physics ' Middles ← 'nurtures an ' 'projects onto ' 'imparts reality to ' 'constructs with ' Qualifiers ← 'abundance of ' 'the barrier of ' 'self-righteous ' 'potential ' Finishes ← 'marvel.' 'choices.' 'creativity.' 'actions.' rf ← {(?⍴⍵)⊃⍵} erf ← {rf ¨ ⍵} deepak ← {erf Starts Middles Qualifiers Finishes} deepak ⍬ ================================================ FILE: samples/APL/UT.dyalog ================================================ :NameSpace UT sac ← 0 expect_orig ← expect ← ⎕NS⍬ exception ← ⍬ nexpect_orig ← nexpect ← ⎕NS⍬ ∇ {Z}←{Conf}run Argument;PRE_test;POST_test;TEST_step;COVER_step;FromSpace load_display_if_not_already_loaded load_salt_scripts_into_current_namespace_if_configured FromSpace←1⊃⎕RSI PRE_test←{} POST_test←{} COVER_step←{} :If 0≠⎕NC'Conf' :If Conf has'cover_target' PRE_test←{{}⎕PROFILE'start'} POST_test←{{}⎕PROFILE'stop'} :EndIf :EndIf :If is_function Argument TEST_step←single_function_test_function COVER_file←Argument,'_coverage.html' :ElseIf is_list_of_functions Argument TEST_step←list_of_functions_test_function COVER_file←'list_coverage.html' :ElseIf is_file Argument TEST_step←file_test_function COVER_file←(get_file_name Argument),'_coverage.html' :ElseIf is_dir Argument test_files←test_files_in_dir Argument TEST_step←test_dir_function Argument←test_files :EndIf :If 0≠⎕NC'Conf' :If Conf has'cover_target' COVER_step←{Conf,←⊂('cover_file'COVER_file) generate_coverage_page Conf} :EndIf :EndIf PRE_test ⍬ Z←FromSpace TEST_step Argument POST_test ⍬ COVER_step ⍬ ∇ ∇ load_display_if_not_already_loaded :If 0=⎕NC'#.DISPLAY' 'DISPLAY'#.⎕CY'display' :EndIf ∇ ∇ load_salt_scripts_into_current_namespace_if_configured :If 0≠⎕NC'#.UT.appdir' :If ⍬≢#.UT.appdir ⎕SE.SALT.Load #.UT.appdir,'src/*.dyalog -target=#' ⎕SE.SALT.Load #.UT.appdir,'test/*.dyalog -target=#' :EndIf :EndIf ∇ ∇ Z←FromSpace single_function_test_function TestName Z←run_ut FromSpace TestName ∇ ∇ Z←FromSpace list_of_functions_test_function ListOfNames;t t←⎕TS Z←run_ut¨{FromSpace ⍵}¨ListOfNames t←⎕TS-t ('Test execution report')print_passed_crashed_failed Z t ∇ ∇ Z←FromSpace file_test_function FilePath;FileNS;Functions;TestFunctions;t FileNS←⎕SE.SALT.Load FilePath,' -target=#' Functions←↓FileNS.⎕NL 3 TestFunctions←(is_test¨Functions)/Functions :If (0/⍬,⊂0/'')≡TestFunctions ⎕←'No test functions found' Z←⍬ :Else t←⎕TS Z←run_ut¨{FileNS ⍵}¨TestFunctions t←⎕TS-t (FilePath,' tests')print_passed_crashed_failed Z t :EndIf ∇ ∇ Z←FromSpace test_dir_function Test_files :If Test_files≡⍬/⍬,⊂'' ⎕←'No test files found' Z←⍬ :Else Z←#.UT.run¨Test_files :EndIf ∇ ∇ Z←get_file_name Argument;separator separator←⊃⌽(Argument∊'/\')/⍳⍴Argument Z←¯7↓separator↓Argument ∇ ∇ generate_coverage_page Conf;ProfileData;CoverResults;HTML ProfileData←⎕PROFILE'data' ToCover←retrieve_coverables¨(⊃'cover_target'in Conf) :If (⍴ToCover)≡(⍴⊂1) ToCover←⊃ToCover :EndIf Representations←get_representation¨ToCover CoverResults←ProfileData∘generate_cover_result¨↓ToCover,[1.5]Representations HTML←generate_html CoverResults Conf write_html_to_page HTML ⎕PROFILE'clear' ∇ ∇ Z←retrieve_coverables Something;nc;functions nc←⎕NC Something :If nc=3 Z←Something :ElseIf nc=9 functions←strip¨↓⍎Something,'.⎕NL 3' Z←{(Something,'.',⍵)}¨functions :EndIf ∇ ∇ Z←strip input Z←(input≠' ')/input ∇ ∇ Z←get_representation Function;nc;rep nc←⎕NC⊂Function :If nc=3.1 rep←↓⎕CR Function rep[1]←⊂'∇',⊃rep[1] rep,←⊂'∇' rep←↑rep :Else rep←⎕CR Function :EndIf Z←rep ∇ ∇ Z←ProfileData generate_cover_result(name representation);Indices;lines;functionlines;covered_lines Indices←({name≡⍵}¨ProfileData[;1])/⍳⍴ProfileData[;1] lines←ProfileData[Indices;2] nc←⎕NC⊂name :If 3.1=nc functionlines←¯2+⍴↓representation :Else functionlines←⊃⍴↓representation :EndIf covered_lines←(⍬∘≢¨lines)/lines Z←(nc lines functionlines covered_lines representation) ∇ ∇ Z←generate_html CoverResults;Covered;Total;Percentage;CoverageText;ColorizedCode;Timestamp;Page Covered←⊃⊃+/{⍴4⊃⍵}¨CoverResults Total←⊃⊃+/{3⊃⍵}¨CoverResults Percentage←100×Covered÷Total CoverageText←'Coverage: ',Percentage,'% (',Covered,'/',Total,')' ColorizedCode←⊃,/{colorize_code_by_coverage ⍵}¨CoverResults Timestamp←generate_timestamp_text Page←⍬ Page,←⊂⍬,'' Page,←⊂⍬,'' Page,←⊂⍬,'' Page,←⊂⍬,CoverageText Page,←⊂⍬,'
'
      Page,←ColorizedCode
      Page,←⊂⍬,'
' Page,←Timestamp Page,←⊂⍬,'' Z←Page ∇ ∇ Z←colorize_code_by_coverage CoverResult;Colors;Ends;Code :If 3.1=⊃CoverResult Colors←(2+3⊃CoverResult)⍴⊂'' Colors[1]←⊂'' Colors[⍴Colors]←⊂'' Ends←(2+3⊃CoverResult)⍴⊂'' Ends[1]←⊂'' Ends[⍴Ends]←⊂'' :Else Colors←(3⊃CoverResult)⍴⊂'' Ends←(3⊃CoverResult)⍴⊂'' :EndIf Colors[1+4⊃CoverResult]←⊂'' Ends[1+4⊃CoverResult]←⊂'' Code←↓5⊃CoverResult Z←Colors,[1.5]Code Z←{⍺,(⎕UCS 13),⍵}/Z,Ends ∇ ∇ Z←generate_timestamp_text;TS;YYMMDD;HHMMSS TS←⎕TS YYMMDD←⊃{⍺,'-',⍵}/3↑TS HHMMSS←⊃{⍺,':',⍵}/3↑3↓TS Z←'Page generated: ',YYMMDD,'|',HHMMSS ∇ ∇ Conf write_html_to_page Page;tie;filename filename←(⊃'cover_out'in Conf),(⊃'cover_file'in Conf) :Trap 22 tie←filename ⎕NTIE 0 filename ⎕NERASE tie filename ⎕NCREATE tie :Else tie←filename ⎕NCREATE 0 :EndTrap Simple_array←⍕⊃,/Page (⎕UCS'UTF-8'⎕UCS Simple_array)⎕NAPPEND tie ∇ ∇ Z←is_function Argument Z←'_TEST'≡¯5↑Argument ∇ ∇ Z←is_list_of_functions Argument Z←2=≡Argument ∇ ∇ Z←is_file Argument Z←'.dyalog'≡¯7↑Argument ∇ ∇ Z←is_dir Argument;attr :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion' Z←'yes'≡⊃⎕CMD'test -d ',Argument,' && echo yes || echo no' :Else 'gfa'⎕NA'I kernel32|GetFileAttributes* <0t' :If Z←¯1≠attr←gfa⊂Argument ⍝ If file exists Z←⊃2 16⊤attr ⍝ Return bit 4 :EndIf :EndIf ∇ ∇ Z←test_files_in_dir Argument :If 'Linux'≡5↑⊃'.'⎕WG'APLVersion' Z←⎕SH'find ',Argument,' -name \*_tests.dyalog' :Else #.⎕CY'files' Z←#.Files.Dir Argument,'\*_tests.dyalog' Z←(Argument,'\')∘,¨Z :EndIf ∇ ∇ Z←run_ut ut_data;returned;crashed;pass;crash;fail;message (returned crashed time)←execute_function ut_data (pass crash fail)←determine_pass_crash_or_fail returned crashed message←determine_message pass fail crashed(2⊃ut_data)returned time print_message_to_screen message Z←(pass crash fail) ∇ ∇ Z←execute_function ut_data;function;t reset_UT_globals function←(⍕(⊃ut_data[1])),'.',⊃ut_data[2] :Trap sac :If 3.2≡⎕NC⊂function t←⎕TS Z←(⍎function,' ⍬')0 t←⎕TS-t :Else t←⎕TS Z←(⍎function)0 t←⎕TS-t :EndIf :Else Z←(↑⎕DM)1 :If exception≢⍬ expect←exception Z[2]←0 t←⎕TS-t :EndIf :EndTrap Z,←⊂t ∇ ∇ reset_UT_globals expect_orig ← expect← ⎕NS⍬ exception←⍬ nexpect_orig ← nexpect← ⎕NS⍬ ∇ ∇ Z←is_test FunctionName;wsIndex wsIndex←FunctionName⍳' ' FunctionName←(wsIndex-1)↑FunctionName Z←'_TEST'≡¯5↑FunctionName ∇ ∇ Heading print_passed_crashed_failed(ArrayRes time) ⎕←'-----------------------------------------' ⎕←Heading ⎕←' ⍋ Passed: ',+/{1⊃⍵}¨ArrayRes ⎕←' ⍟ Crashed: ',+/{2⊃⍵}¨ArrayRes ⎕←' ⍒ Failed: ',+/{3⊃⍵}¨ArrayRes ⎕←' ○ Runtime: ',time[5],'m',time[6],'s',time[7],'ms' ∇ determine_pass_crash_or_fail←{ r c←⍵ ⋄ 0≠c:0 1 0 ⋄ z←(0 0 1)(1 0 0) expect_orig≢expect:(⎕IO+expect≡r)⊃z ⋄ (⎕IO+nexpect≢r)⊃z } ∇ Z←determine_message(pass fail crashed name returned time) :If crashed Z←'CRASHED: 'failure_message name returned :ElseIf pass Z←'Passed ',time[5],'m',time[6],'s',time[7],'ms' :Else Z←'FAILED: 'failure_message name returned :EndIf ∇ ∇ print_message_to_screen message ⎕←message ∇ ∇ Z←term_to_text Term;Text;Rows Text←#.DISPLAY Term Rows←1⊃⍴Text Z←(Rows 4⍴''),Text ∇ ∇ Z←Cause failure_message(name returned);hdr;exp;expterm;got;gotterm hdr←Cause,name exp←'Expected' expterm←term_to_text #.UT.expect got←'Got' gotterm←term_to_text returned Z←align_and_join_message_parts hdr exp expterm got gotterm ∇ ∇ Z←align_and_join_message_parts Parts;hdr;exp;expterm;got;gotterm;R1;C1;R2;C2;W (hdr exp expterm got gotterm)←Parts (R1 C1)←⍴expterm (R2 C2)←⍴gotterm W←⊃⊃⌈/C1 C2(⍴hdr)(⍴exp)(⍴got) Z←(W↑hdr),[0.5](W↑exp) Z←Z⍪(R1 W↑expterm) Z←Z⍪(W↑got) Z←Z⍪(R2 W↑gotterm) ∇ ∇ Z←confparam in config Z←1↓⊃({confparam≡⊃⍵}¨config)/config ∇ ∇ Z←config has confparam Z←∨/{confparam≡⊃⍵}¨config ∇ :EndNameSpace ================================================ FILE: samples/APL/hashbang ================================================ #!/usr/local/bin/apl --script NEWLINE ← ⎕UCS 10 HEADERS ← 'Content-Type: text/plain', NEWLINE HEADERS ⍝ ⎕←HEADERS ⍝ ⍕⎕TS )OFF ================================================ FILE: samples/ASL/example.asl ================================================ /* * This file is part of the coreboot project. * * Copyright (C) 2007-2009 coresystems GmbH * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; version 2 of * the License. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. */ Name(_HID,EISAID("PNP0A08")) // PCIe Name(_CID,EISAID("PNP0A03")) // PCI Name(_ADR, 0) Name(_BBN, 0) Device (MCHC) { Name(_ADR, 0x00000000) // 0:0.0 OperationRegion(MCHP, PCI_Config, 0x00, 0x100) Field (MCHP, DWordAcc, NoLock, Preserve) { Offset (0x40), // EPBAR EPEN, 1, // Enable , 11, // EPBR, 24, // EPBAR Offset (0x48), // MCHBAR MHEN, 1, // Enable , 13, // MHBR, 22, // MCHBAR Offset (0x60), // PCIe BAR PXEN, 1, // Enable PXSZ, 2, // BAR size , 23, // PXBR, 10, // PCIe BAR Offset (0x68), // DMIBAR DMEN, 1, // Enable , 11, // DMBR, 24, // DMIBAR Offset (0x70), // ME Base Address MEBA, 64, // ... Offset (0x80), // PAM0 , 4, PM0H, 2, , 2, Offset (0x81), // PAM1 PM1L, 2, , 2, PM1H, 2, , 2, Offset (0x82), // PAM2 PM2L, 2, , 2, PM2H, 2, , 2, Offset (0x83), // PAM3 PM3L, 2, , 2, PM3H, 2, , 2, Offset (0x84), // PAM4 PM4L, 2, , 2, PM4H, 2, , 2, Offset (0x85), // PAM5 PM5L, 2, , 2, PM5H, 2, , 2, Offset (0x86), // PAM6 PM6L, 2, , 2, PM6H, 2, , 2, Offset (0xa0), // Top of Used Memory TOM, 64, Offset (0xbc), // Top of Low Used Memory TLUD, 32, } Mutex (CTCM, 1) /* CTDP Switch Mutex (sync level 1) */ Name (CTCC, 0) /* CTDP Current Selection */ Name (CTCN, 0) /* CTDP Nominal Select */ Name (CTCD, 1) /* CTDP Down Select */ Name (CTCU, 2) /* CTDP Up Select */ OperationRegion (MCHB, SystemMemory, DEFAULT_MCHBAR, 0x8000) Field (MCHB, DWordAcc, Lock, Preserve) { Offset (0x5930), CTDN, 15, /* CTDP Nominal PL1 */ Offset (0x59a0), PL1V, 15, /* Power Limit 1 Value */ PL1E, 1, /* Power Limit 1 Enable */ PL1C, 1, /* Power Limit 1 Clamp */ PL1T, 7, /* Power Limit 1 Time */ Offset (0x59a4), PL2V, 15, /* Power Limit 2 Value */ PL2E, 1, /* Power Limit 2 Enable */ PL2C, 1, /* Power Limit 2 Clamp */ PL2T, 7, /* Power Limit 2 Time */ Offset (0x5f3c), TARN, 8, /* CTDP Nominal Turbo Activation Ratio */ Offset (0x5f40), CTDD, 15, /* CTDP Down PL1 */ , 1, TARD, 8, /* CTDP Down Turbo Activation Ratio */ Offset (0x5f48), CTDU, 15, /* CTDP Up PL1 */ , 1, TARU, 8, /* CTDP Up Turbo Activation Ratio */ Offset (0x5f50), CTCS, 2, /* CTDP Select */ Offset (0x5f54), TARS, 8, /* Turbo Activation Ratio Select */ } /* * Search CPU0 _PSS looking for control=arg0 and then * return previous P-state entry number for new _PPC * * Format of _PSS: * Name (_PSS, Package () { * Package (6) { freq, power, tlat, blat, control, status } * } */ External (\_PR.CP00._PSS) Method (PSSS, 1, NotSerialized) { Store (One, Local0) /* Start at P1 */ Store (SizeOf (\_PR.CP00._PSS), Local1) While (LLess (Local0, Local1)) { /* Store _PSS entry Control value to Local2 */ ShiftRight (DeRefOf (Index (DeRefOf (Index (\_PR.CP00._PSS, Local0)), 4)), 8, Local2) If (LEqual (Local2, Arg0)) { Return (Subtract (Local0, 1)) } Increment (Local0) } Return (0) } /* Set TDP Down */ Method (STND, 0, Serialized) { If (Acquire (CTCM, 100)) { Return (0) } If (LEqual (CTCD, CTCC)) { Release (CTCM) Return (0) } Store ("Set TDP Down", Debug) /* Set CTC */ Store (CTCD, CTCS) /* Set TAR */ Store (TARD, TARS) /* Set PPC limit and notify OS */ Store (PSSS (TARD), PPCM) PPCN () /* Set PL2 to 1.25 * PL1 */ Divide (Multiply (CTDD, 125), 100, , PL2V) /* Set PL1 */ Store (CTDD, PL1V) /* Store the new TDP Down setting */ Store (CTCD, CTCC) Release (CTCM) Return (1) } /* Set TDP Nominal from Down */ Method (STDN, 0, Serialized) { If (Acquire (CTCM, 100)) { Return (0) } If (LEqual (CTCN, CTCC)) { Release (CTCM) Return (0) } Store ("Set TDP Nominal", Debug) /* Set PL1 */ Store (CTDN, PL1V) /* Set PL2 to 1.25 * PL1 */ Divide (Multiply (CTDN, 125), 100, , PL2V) /* Set PPC limit and notify OS */ Store (PSSS (TARN), PPCM) PPCN () /* Set TAR */ Store (TARN, TARS) /* Set CTC */ Store (CTCN, CTCS) /* Store the new TDP Nominal setting */ Store (CTCN, CTCC) Release (CTCM) Return (1) } } // Current Resource Settings Name (MCRS, ResourceTemplate() { // Bus Numbers WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode, 0x0000, 0x0000, 0x00ff, 0x0000, 0x0100,,, PB00) // IO Region 0 DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 0x0000, 0x0000, 0x0cf7, 0x0000, 0x0cf8,,, PI00) // PCI Config Space Io (Decode16, 0x0cf8, 0x0cf8, 0x0001, 0x0008) // IO Region 1 DWordIO (ResourceProducer, MinFixed, MaxFixed, PosDecode, EntireRange, 0x0000, 0x0d00, 0xffff, 0x0000, 0xf300,,, PI01) // VGA memory (0xa0000-0xbffff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000a0000, 0x000bffff, 0x00000000, 0x00020000,,, ASEG) // OPROM reserved (0xc0000-0xc3fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000c0000, 0x000c3fff, 0x00000000, 0x00004000,,, OPR0) // OPROM reserved (0xc4000-0xc7fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000c4000, 0x000c7fff, 0x00000000, 0x00004000,,, OPR1) // OPROM reserved (0xc8000-0xcbfff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000c8000, 0x000cbfff, 0x00000000, 0x00004000,,, OPR2) // OPROM reserved (0xcc000-0xcffff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000cc000, 0x000cffff, 0x00000000, 0x00004000,,, OPR3) // OPROM reserved (0xd0000-0xd3fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000d0000, 0x000d3fff, 0x00000000, 0x00004000,,, OPR4) // OPROM reserved (0xd4000-0xd7fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000d4000, 0x000d7fff, 0x00000000, 0x00004000,,, OPR5) // OPROM reserved (0xd8000-0xdbfff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000d8000, 0x000dbfff, 0x00000000, 0x00004000,,, OPR6) // OPROM reserved (0xdc000-0xdffff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000dc000, 0x000dffff, 0x00000000, 0x00004000,,, OPR7) // BIOS Extension (0xe0000-0xe3fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000e0000, 0x000e3fff, 0x00000000, 0x00004000,,, ESG0) // BIOS Extension (0xe4000-0xe7fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000e4000, 0x000e7fff, 0x00000000, 0x00004000,,, ESG1) // BIOS Extension (0xe8000-0xebfff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000e8000, 0x000ebfff, 0x00000000, 0x00004000,,, ESG2) // BIOS Extension (0xec000-0xeffff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000ec000, 0x000effff, 0x00000000, 0x00004000,,, ESG3) // System BIOS (0xf0000-0xfffff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x000f0000, 0x000fffff, 0x00000000, 0x00010000,,, FSEG) // PCI Memory Region (Top of memory-CONFIG_MMCONF_BASE_ADDRESS) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000,,, PM01) // TPM Area (0xfed40000-0xfed44fff) DWordMemory (ResourceProducer, PosDecode, MinFixed, MaxFixed, Cacheable, ReadWrite, 0x00000000, 0xfed40000, 0xfed44fff, 0x00000000, 0x00005000,,, TPMR) }) Method (_CRS, 0, Serialized) { // Find PCI resource area in MCRS CreateDwordField(MCRS, ^PM01._MIN, PMIN) CreateDwordField(MCRS, ^PM01._MAX, PMAX) CreateDwordField(MCRS, ^PM01._LEN, PLEN) // Fix up PCI memory region // Start with Top of Lower Usable DRAM Store (^MCHC.TLUD, Local0) Store (^MCHC.MEBA, Local1) // Check if ME base is equal If (LEqual (Local0, Local1)) { // Use Top Of Memory instead Store (^MCHC.TOM, Local0) } Store (Local0, PMIN) Store (Subtract(CONFIG_MMCONF_BASE_ADDRESS, 1), PMAX) Add(Subtract(PMAX, PMIN), 1, PLEN) Return (MCRS) } ================================================ FILE: samples/ASL/example.dsl ================================================ ACPI_EXTRACT_ALL_CODE ssdp_misc_aml DefinitionBlock ("ssdt-misc.aml", "SSDT", 0x01, "BXPC", "BXSSDTSUSP", 0x1) { /**************************************************************** * PCI memory ranges ****************************************************************/ Scope(\) { ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_start Name(P0S, 0x12345678) ACPI_EXTRACT_NAME_DWORD_CONST acpi_pci32_end Name(P0E, 0x12345678) ACPI_EXTRACT_NAME_BYTE_CONST acpi_pci64_valid Name(P1V, 0x12) ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_start Name(P1S, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }) ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_end Name(P1E, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }) ACPI_EXTRACT_NAME_BUFFER8 acpi_pci64_length Name(P1L, Buffer() { 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }) } /**************************************************************** * Suspend ****************************************************************/ Scope(\) { /* * S3 (suspend-to-ram), S4 (suspend-to-disk) and S5 (power-off) type codes: * must match piix4 emulation. */ ACPI_EXTRACT_NAME_STRING acpi_s3_name Name(_S3, Package(0x04) { One, /* PM1a_CNT.SLP_TYP */ One, /* PM1b_CNT.SLP_TYP */ Zero, /* reserved */ Zero /* reserved */ }) ACPI_EXTRACT_NAME_STRING acpi_s4_name ACPI_EXTRACT_PKG_START acpi_s4_pkg Name(_S4, Package(0x04) { 0x2, /* PM1a_CNT.SLP_TYP */ 0x2, /* PM1b_CNT.SLP_TYP */ Zero, /* reserved */ Zero /* reserved */ }) Name(_S5, Package(0x04) { Zero, /* PM1a_CNT.SLP_TYP */ Zero, /* PM1b_CNT.SLP_TYP */ Zero, /* reserved */ Zero /* reserved */ }) } External(\_SB.PCI0, DeviceObj) External(\_SB.PCI0.ISA, DeviceObj) Scope(\_SB.PCI0.ISA) { Device(PEVT) { Name(_HID, "QEMU0001") /* PEST will be patched to be Zero if no such device */ ACPI_EXTRACT_NAME_WORD_CONST ssdt_isa_pest Name(PEST, 0xFFFF) OperationRegion(PEOR, SystemIO, PEST, 0x01) Field(PEOR, ByteAcc, NoLock, Preserve) { PEPT, 8, } Method(_STA, 0, NotSerialized) { Store(PEST, Local0) If (LEqual(Local0, Zero)) { Return (0x00) } Else { Return (0x0F) } } Method(RDPT, 0, NotSerialized) { Store(PEPT, Local0) Return (Local0) } Method(WRPT, 1, NotSerialized) { Store(Arg0, PEPT) } Name(_CRS, ResourceTemplate() { IO(Decode16, 0x00, 0x00, 0x01, 0x01, IO) }) CreateWordField(_CRS, IO._MIN, IOMN) CreateWordField(_CRS, IO._MAX, IOMX) Method(_INI, 0, NotSerialized) { Store(PEST, IOMN) Store(PEST, IOMX) } } } } ================================================ FILE: samples/ASN.1/example.asn ================================================ MyShopPurchaseOrders DEFINITIONS AUTOMATIC TAGS ::= BEGIN PurchaseOrder ::= SEQUENCE { dateOfOrder DATE, customer CustomerInfo, items ListOfItems } CustomerInfo ::= SEQUENCE { companyName VisibleString (SIZE (3..50)), billingAddress Address, contactPhone NumericString (SIZE (7..12)) } Address::= SEQUENCE { street VisibleString (SIZE (5 .. 50)) OPTIONAL, city VisibleString (SIZE (2..30)), state VisibleString (SIZE(2) ^ FROM ("A".."Z")), zipCode NumericString (SIZE(5 | 9)) } ListOfItems ::= SEQUENCE (SIZE (1..100)) OF Item Item ::= SEQUENCE { itemCode INTEGER (1..99999), color VisibleString ("Black" | "Blue" | "Brown"), power INTEGER (110 | 220), deliveryTime INTEGER (8..12 | 14..19), quantity INTEGER (1..1000), unitPrice REAL (1.00 .. 9999.00), isTaxable BOOLEAN } END ================================================ FILE: samples/ASP.NET/EchoSocket.ashx ================================================ <%@ WebHandler Language="C#" CodeBehind="EchoSocket.ashx.cs" Class="AutobahnTestAppAspNet4.EchoSocket" %> ================================================ FILE: samples/ASP.NET/Global.asax ================================================ <%@ Application Codebehind="Global.asax.cs" Inherits="SQLMembership_Identity_OWIN.Global" Language="C#" %> ================================================ FILE: samples/ASP.NET/Login.aspx ================================================ <%@ Page Title="Log in" Language="C#" MasterPageFile="~/Site.Master" AutoEventWireup="true" CodeBehind="Login.aspx.cs" Inherits="PrimaryKeysConfigTest.Account.Login" Async="true" %> <%@ Register Src="~/Account/OpenAuthProviders.ascx" TagPrefix="uc" TagName="OpenAuthProviders" %>

<%: Title %>.

Use a local account to log in.


Email
Password
Remember me?

Register a new user?

Forgot your password?

================================================ FILE: samples/ASP.NET/OpenAuthProviders.ascx ================================================ <%@ Control Language="C#" AutoEventWireup="true" CodeBehind="OpenAuthProviders.ascx.cs" Inherits="PrimaryKeysConfigTest.Account.OpenAuthProviders" %>

Use another service to log in.


There are no external authentication services configured. See this article for details on setting up this ASP.NET application to support logging in via external services.

================================================ FILE: samples/ATS/CoYonedaLemma.dats ================================================ (* ****** ****** *) // // HX-2014-01 // CoYoneda Lemma: // (* ****** ****** *) // #include "share/atspre_staload.hats" // (* ****** ****** *) staload "libats/ML/SATS/basis.sats" staload "libats/ML/SATS/list0.sats" (* ****** ****** *) staload _ = "libats/ML/DATS/list0.dats" (* ****** ****** *) sortdef ftype = type -> type (* ****** ****** *) infixr (->) ->> typedef ->> (a:type, b:type) = a - b (* ****** ****** *) typedef functor(F:ftype) = {a,b:type} (a ->> b) ->> F(a) ->> F(b) (* ****** ****** *) typedef list0 (a:type) = list0 (a) extern val functor_list0 : functor (list0) (* ****** ****** *) implement functor_list0{a,b} (f) = lam xs => list0_map (xs, f) (* ****** ****** *) datatype CoYoneda (F:ftype, r:type) = {a:type} CoYoneda of (a ->> r, F(a)) // end of [CoYoneda] (* ****** ****** *) // extern fun CoYoneda_phi : {F:ftype}functor(F) -> {r:type} (F (r) ->> CoYoneda (F, r)) extern fun CoYoneda_psi : {F:ftype}functor(F) -> {r:type} (CoYoneda (F, r) ->> F (r)) // (* ****** ****** *) implement CoYoneda_phi(ftor) = lam (fx) => CoYoneda (lam x => x, fx) implement CoYoneda_psi(ftor) = lam (CoYoneda(f, fx)) => ftor (f) (fx) (* ****** ****** *) datatype int0 = I of (int) datatype bool = True | False // boxed boolean (* ****** ****** *) // fun bool2string (x:bool): string = ( case+ x of True() => "True" | False() => "False" ) // implement fprint_val (out, x) = fprint (out, bool2string(x)) // (* ****** ****** *) fun int2bool (i: int0): bool = let val+I(i) = i in if i > 0 then True else False end (* ****** ****** *) val myintlist0 = g0ofg1($list{int0}((I)1, (I)0, (I)1, (I)0, (I)0)) val myboolist0 = CoYoneda{list0,bool}{int0}(lam (i) => int2bool(i), myintlist0) val myboolist0 = CoYoneda_psi{list0}(functor_list0){bool}(myboolist0) (* ****** ****** *) val ((*void*)) = fprintln! (stdout_ref, "myboolist0 = ", myboolist0) (* ****** ****** *) implement main0 () = () (* ****** ****** *) (* end of [CoYonedaLemma.dats] *) ================================================ FILE: samples/ATS/DiningPhil2.dats ================================================ (* ****** ****** *) // // HX-2013-11 // // Implementing a variant of // the problem of Dining Philosophers // (* ****** ****** *) // #include "share/atspre_define.hats" #include "share/atspre_staload.hats" // (* ****** ****** *) staload UN = "prelude/SATS/unsafe.sats" (* ****** ****** *) staload "libc/SATS/stdlib.sats" staload "libc/SATS/unistd.sats" (* ****** ****** *) staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats" (* ****** ****** *) staload _ = "libats/DATS/deqarray.dats" staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats" (* ****** ****** *) staload "./DiningPhil2.sats" (* ****** ****** *) implement phil_left (n) = n implement phil_right (n) = (n+1) \nmod NPHIL (* ****** ****** *) // extern fun randsleep (n: intGte(1)): void // implement randsleep (n) = ignoret (sleep($UN.cast{uInt}(rand() mod n + 1))) // end of [randsleep] // (* ****** ****** *) implement phil_think (n) = { val () = println! ("phil_think(", n, ") starts") val () = randsleep (6) val () = println! ("phil_think(", n, ") finishes") } (* ****** ****** *) implement phil_dine (n, lf, rf) = { val () = println! ("phil_dine(", n, ") starts") val () = randsleep (3) val () = println! ("phil_dine(", n, ") finishes") } (* ****** ****** *) implement phil_loop (n) = let // val () = phil_think (n) // val nl = phil_left (n) val nr = phil_right (n) // val ch_lfork = fork_changet (nl) val ch_rfork = fork_changet (nr) // val lf = channel_takeout (ch_lfork) val () = println! ("phil_loop(", n, ") picks left fork") // val () = randsleep (2) // HX: try to actively induce deadlock // val rf = channel_takeout (ch_rfork) val () = println! ("phil_loop(", n, ") picks right fork") // val () = phil_dine (n, lf, rf) // val ch_forktray = forktray_changet () val () = channel_insert (ch_forktray, lf) val () = channel_insert (ch_forktray, rf) // in phil_loop (n) end // end of [phil_loop] (* ****** ****** *) implement cleaner_wash (f) = { val f = fork_get_num (f) val () = println! ("cleaner_wash(", f, ") starts") val () = randsleep (1) val () = println! ("cleaner_wash(", f, ") finishes") } (* ****** ****** *) implement cleaner_return (f) = { val n = fork_get_num (f) val ch = fork_changet (n) val () = channel_insert (ch, f) } (* ****** ****** *) implement cleaner_loop () = let // val ch = forktray_changet () val f0 = channel_takeout (ch) // val () = cleaner_wash (f0) val () = cleaner_return (f0) // in cleaner_loop () end // end of [cleaner_loop] (* ****** ****** *) dynload "DiningPhil2.sats" dynload "DiningPhil2_fork.dats" dynload "DiningPhil2_thread.dats" (* ****** ****** *) local // staload "{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats" // in (* in of [local] *) // val () = mythread_create_cloptr (llam () => phil_loop (0)) val () = mythread_create_cloptr (llam () => phil_loop (1)) val () = mythread_create_cloptr (llam () => phil_loop (2)) val () = mythread_create_cloptr (llam () => phil_loop (3)) val () = mythread_create_cloptr (llam () => phil_loop (4)) // val () = mythread_create_cloptr (llam () => cleaner_loop ()) // end // end of [local] (* ****** ****** *) implement main0 () = { // val () = println! ("DiningPhil2: starting") val ((*void*)) = while (true) ignoret (sleep(1)) // } (* end of [main0] *) (* ****** ****** *) (* end of [DiningPhil2.dats] *) ================================================ FILE: samples/ATS/DiningPhil2.sats ================================================ (* ****** ****** *) // // HX-2013-11 // // Implementing a variant of // the problem of Dining Philosophers // (* ****** ****** *) #include "share/atspre_define.hats" (* ****** ****** *) staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats" (* ****** ****** *) %{# #define NPHIL 5 %} // end of [%{#] #define NPHIL 5 (* ****** ****** *) typedef nphil = natLt(NPHIL) (* ****** ****** *) fun phil_left (n: nphil): nphil fun phil_right (n: nphil): nphil (* ****** ****** *) // fun phil_loop (n: nphil): void // (* ****** ****** *) fun cleaner_loop ((*void*)): void (* ****** ****** *) absvtype fork_vtype = ptr vtypedef fork = fork_vtype (* ****** ****** *) fun fork_get_num (!fork): nphil (* ****** ****** *) fun phil_dine (n: nphil, lf: !fork, rf: !fork): void // end of [phil_dine] fun phil_think (n: nphil): void (* ****** ****** *) fun cleaner_wash (f: !fork): void fun cleaner_return (f: fork): void (* ****** ****** *) // fun fork_changet (n: nphil): channel(fork) // fun forktray_changet ((*void*)): channel(fork) // (* ****** ****** *) (* end of [DiningPhil2.sats] *) ================================================ FILE: samples/ATS/DiningPhil2_fork.dats ================================================ (* ****** ****** *) // // HX-2013-11 // // Implementing a variant of // the problem of Dining Philosophers // (* ****** ****** *) // #include "share/atspre_define.hats" #include "share/atspre_staload.hats" // (* ****** ****** *) staload UN = "prelude/SATS/unsafe.sats" (* ****** ****** *) staload "{$LIBATSHWXI}/teaching/mythread/SATS/channel.sats" (* ****** ****** *) staload _ = "libats/DATS/deqarray.dats" staload _ = "{$LIBATSHWXI}/teaching/mythread/DATS/channel.dats" (* ****** ****** *) staload "./DiningPhil2.sats" (* ****** ****** *) datavtype fork = FORK of (nphil) (* ****** ****** *) assume fork_vtype = fork (* ****** ****** *) implement fork_get_num (f) = let val FORK(n) = f in n end (* ****** ****** *) local val the_forkarray = let // typedef t = channel(fork) // implement array_tabulate$fopr (n) = ch where { val n = $UN.cast{nphil}(n) val ch = channel_create_exn (i2sz(2)) val () = channel_insert (ch, FORK (n)) } // in arrayref_tabulate (i2sz(NPHIL)) end // end of [val] in (* in of [local] *) implement fork_changet (n) = the_forkarray[n] end // end of [local] (* ****** ****** *) local val the_forktray = channel_create_exn (i2sz(NPHIL+1)) in (* in of [local] *) implement forktray_changet () = the_forktray end // end of [local] (* ****** ****** *) (* end of [DiningPhil2_fork.dats] *) ================================================ FILE: samples/ATS/DiningPhil2_thread.dats ================================================ (* ****** ****** *) // // HX-2013-11 // // Implementing a variant of // the problem of Dining Philosophers // (* ****** ****** *) // #include "share/atspre_define.hats" #include "share/atspre_staload.hats" // (* ****** ****** *) staload "{$LIBATSHWXI}/teaching/mythread/SATS/mythread.sats" (* ****** ****** *) local // #include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread.dats" // in (* in of [local] *) // // HX: it is intentionally left to be empty // end // end of [local] (* ****** ****** *) local // #include "{$LIBATSHWXI}/teaching/mythread/DATS/mythread_posix.dats" // in (* in of [local] *) // // HX: it is intentionally left to be empty // end // end of [local] (* ****** ****** *) (* end of [DiningPhil2_thread.dats] *) ================================================ FILE: samples/ATS/YonedaLemma.dats ================================================ (* ****** ****** *) // // HX-2014-01 // Yoneda Lemma: // The hardest "trivial" theorem :) // (* ****** ****** *) // #include "share/atspre_staload.hats" // (* ****** ****** *) staload "libats/ML/SATS/basis.sats" staload "libats/ML/SATS/list0.sats" staload "libats/ML/SATS/option0.sats" (* ****** ****** *) staload _ = "libats/ML/DATS/list0.dats" staload _ = "libats/ML/DATS/option0.dats" (* ****** ****** *) sortdef ftype = type -> type (* ****** ****** *) infixr (->) ->> typedef ->> (a:type, b:type) = a - b (* ****** ****** *) typedef functor(F:ftype) = {a,b:type} (a ->> b) ->> F(a) ->> F(b) (* ****** ****** *) typedef list0 (a:type) = list0 (a) extern val functor_list0 : functor (list0) (* ****** ****** *) implement functor_list0{a,b} (f) = lam xs => list0_map (xs, f) (* ****** ****** *) typedef option0 (a:type) = option0 (a) extern val functor_option0 : functor (option0) (* ****** ****** *) implement functor_option0{a,b} (f) = lam opt => option0_map (opt, f) (* ****** ****** *) extern val functor_homres : {c:type} functor (lam(r:type) => c ->> r) (* ****** ****** *) implement functor_homres{c}{a,b} (f) = lam (r) => lam (x) => f (r(x)) (* ****** ****** *) // extern fun Yoneda_phi : {F:ftype}functor(F) -> {a:type}F(a) ->> ({r:type}(a ->> r) ->> F(r)) extern fun Yoneda_psi : {F:ftype}functor(F) -> {a:type}({r:type}(a ->> r) ->> F(r)) ->> F(a) // (* ****** ****** *) // implement Yoneda_phi (ftor) = lam(fx) => lam (m) => ftor(m)(fx) // implement Yoneda_psi (ftor) = lam(mf) => mf(lam x => x) // (* ****** ****** *) (* (* ****** ****** *) // // HX-2014-01-05: // Another version based on Natural Transformation // (* ****** ****** *) typedef natrans(F:ftype, G:ftype) = {x:type} (F(x) ->> G(x)) (* ****** ****** *) // extern fun Yoneda_phi_nat : {F:ftype}functor(F) -> {a:type} F(a) ->> natrans(lam (r:type) => (a ->> r), F) extern fun Yoneda_psi_nat : {F:ftype}functor(F) -> {a:type} natrans(lam (r:type) => (a ->> r), F) ->> F(a) // (* ****** ****** *) // implement Yoneda_phi_nat (ftor) = lam(fx) => lam (m) => ftor(m)(fx) // implement Yoneda_psi_nat (ftor) = lam(mf) => mf(lam x => x) // (* ****** ****** *) *) (* ****** ****** *) datatype bool = True | False // boxed boolean (* ****** ****** *) // fun bool2string (x:bool): string = ( case+ x of True() => "True" | False() => "False" ) // implement fprint_val (out, x) = fprint (out, bool2string(x)) // (* ****** ****** *) // val myboolist0 = $list_t{bool}(True, False, True, False, False) val myboolist0 = g0ofg1_list (myboolist0) // (* ****** ****** *) // extern val Yoneda_bool_list0 : {r:type} (bool ->> r) ->> list0(r) // implement Yoneda_bool_list0 = Yoneda_phi(functor_list0){bool}(myboolist0) // (* ****** ****** *) // val myboolist1 = Yoneda_psi(functor_list0){bool}(Yoneda_bool_list0) // (* ****** ****** *) val () = fprintln! (stdout_ref, "myboolist0 = ", myboolist0) val () = fprintln! (stdout_ref, "myboolist1 = ", myboolist1) (* ****** ****** *) implement main0 () = () (* ****** ****** *) (* end of [YonedaLemma.dats] *) ================================================ FILE: samples/ATS/basis_ssntype.sats ================================================ (* * The MIT License (MIT) * * Copyright (c) 2014 Hongwei Xi * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE.) *) // Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/201d635062d0ea64ff5ba5457a4ea0bb4d5ae202/contrib/libats-/hwxi/teaching/mysession-g/SATS/basis_ssntype.sats (* ** Basis for g-session types *) (* ****** ****** *) // staload "./basis_intset.sats" // (* ****** ****** *) // fun{} channel_cap(): intGte(1) // (* ****** ****** *) // abstype session_msg (i:int, j:int, a:vt@ype) // (* ****** ****** *) abstype ssession_nil abstype ssession_cons(a:type, ssn:type) (* ****** ****** *) // stadef msg = session_msg // stadef nil = ssession_nil // stadef :: = ssession_cons stadef cons = ssession_cons // (* ****** ****** *) // abstype session_append (ssn1: type, ssn2: type) // stadef append = session_append // (* ****** ****** *) // abstype session_choose ( i:int, ssn1:type, ssn2:type ) (* session_choose *) // stadef choose = session_choose // (* ****** ****** *) // abstype session_repeat ( i:int, ssn:type(*body*) ) (* session_repeat *) // stadef repeat = session_repeat // (* ****** ****** *) // typedef session_sing ( i: int , j: int , a:vt@ype ) = cons(msg(i, j, a), nil) // (* ****** ****** *) // absvtype channel1_vtype (G:iset, n:int, ssn:type) = ptr // vtypedef channel1 (G:iset, n:int, ssn:type) = channel1_vtype(G, n, ssn) // vtypedef cchannel1 (G:iset, n:int, ssn:type) = channel1_vtype(ncomp(n, G), n, ssn) // (* ****** ****** *) // fun{} channel1_get_nrole {n:int}{ssn:type}{G:iset} (chan: !channel1(G, n, ssn)): int(n) // fun{} channel1_get_group {n:int}{ssn:type}{G:iset} (chan: !channel1(G, n, ssn)): intset(n,G) // (* ****** ****** *) // fun {a:vt0p} channel1_close {n:int}{ssn:type}{G:iset}(chan: channel1(G, n, nil)): void // (* ****** ****** *) // fun{} channel1_skipin {a:vt0p} {n:int}{ssn:type}{G:iset} {i,j:nat | ismbr(G, i); ismbr(G, j)} ( !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn) ) : void // end-of-function praxi lemma_channel1_skipin {a:vt0p} {n:int}{ssn:type}{G:iset} {i,j:nat | ismbr(G, i); ismbr(G, j)} ( !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn) ) : void // lemma_channel1_skipin // fun{} channel1_skipex {a:vt0p} {n:int}{ssn:type}{G:iset} {i,j:nat | ~ismbr(G, i); ~ismbr(G, j)} ( !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn) ) : void // end-of-function praxi lemma_channel1_skipex {a:vt0p} {n:int}{ssn:type}{G:iset} {i,j:nat | ~ismbr(G, i); ~ismbr(G, j)} ( !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn) ) : void // lemma_channel1_skipex // (* ****** ****** *) // fun {a:vt0p} channel1_send {n:int}{ssn:type}{G:iset} {i,j:nat | i < n; j < n; ismbr(G, i); ~ismbr(G, j)} ( !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), a ) : void // end of [channel1_send] // fun {a:vt0p} channel1_recv {n:int}{ssn:type}{G:iset} {i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)} ( !channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j), &a? >> a ) : void // end of [channel1_recv] // fun {a:vt0p} channel1_recv_val {n:int}{ssn:type}{G:iset} {i,j:nat | i < n; j < n; ~ismbr(G, i); ismbr(G, j)} (!channel1(G, n, msg(i, j, a)::ssn) >> channel1(G, n, ssn), int(i), int(j)): (a) // (* ****** ****** *) fun{} channel1_append {n:int} {ssn1,ssn2:type} {G:iset} ( chan: !channel1(G, n, append(ssn1, ssn2)) >> channel1(G, n, ssn2) , fserv: (!channel1(G, n, ssn1) >> channel1(G, n, nil)) - void ) : void // end of [channel1_append] (* ****** ****** *) // datatype choosetag ( a:type, b:type, c:type ) = | choosetag_l(a, b, a) of () | choosetag_r(a, b, b) of () // (* ****** ****** *) // fun{} channel1_choose_l {n:int} {ssn1,ssn2:type} {G:iset} {i:nat | i < n; ismbr(G, i)} ( !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn1), i: int(i) ) : void // end of [channel1_choose_l] // fun{} channel1_choose_r {n:int} {ssn1,ssn2:type} {G:iset} {i:nat | i < n; ismbr(G, i)} ( !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn2), i: int(i) ) : void // end of [channel1_choose_r] // fun{} channel1_choose_tag {n:int} {ssn1,ssn2:type} {G:iset} {i:nat | i < n; ~isnil(G); ~ismbr(G, i)} ( !channel1(G, n, choose(i,ssn1,ssn2)) >> channel1(G, n, ssn_chosen), i: int(i) ) : #[ssn_chosen:type] choosetag(ssn1, ssn2, ssn_chosen) // (* ****** ****** *) // fun{} channel1_repeat_0 {n:int} {ssn:type} {G:iset} {i:nat | i < n; ismbr(G, i)} ( !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, nil), i: int(i) ) : void // end of [channel1_repeat_nil] // fun{} channel1_repeat_1 {n:int} {ssn:type} {G:iset} {i:nat | i < n; ismbr(G, i)} ( !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, append(ssn,repeat(i,ssn))), i: int(i) ) : void // end of [channel1_repeat_more] // fun{} channel1_repeat_tag {n:int} {ssn:type} {G:iset} {i:nat | i < n; ~isnil(G); ~ismbr(G, i)} ( !channel1(G, n, repeat(i,ssn)) >> channel1(G, n, ssn_chosen), i: int(i) ) : #[ssn_chosen:type] choosetag(nil, append(ssn,repeat(i,ssn)), ssn_chosen) // (* ****** ****** *) // (* // // HX-2015-03-06: // This one does not work with sschoose!!! // fun{} channel1_link {n:int}{ssn:type} {G1,G2:iset | isnil(G1*G2)} (channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1+G2, n, ssn) *) // fun{} channel1_link {n:int}{ssn:type} {G1,G2:iset | isful(G1+G2,n)} (channel1(G1, n, ssn), channel1(G2, n, ssn)): channel1(G1*G2, n, ssn) // (* ****** ****** *) // fun{} channel1_link_elim {n:int}{ssn:type}{G:iset}(channel1(G, n, ssn), cchannel1(G, n, ssn)): void // (* ****** ****** *) // fun{} cchannel1_create_exn {n:nat}{ssn:type}{G:iset} ( nrole: int(n), G: intset(n), fserv: channel1(G, n, ssn) - void ) : cchannel1(G, n, ssn) // end of [cchannel1_create_exn] // (* ****** ****** *) (* end of [basis_ssntype.sats] *) ================================================ FILE: samples/ATS/csv_parse.hats ================================================ (* * The MIT License (MIT) * * Copyright (c) 2014 Hongwei Xi * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE.) *) // Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/0f26aa0df8542d2ae21df9be1e13208f66f571d6/contrib/libats-/hwxi/teaching/mygrading/HATS/csv_parse.hats (* ****** ****** *) // // Author: Hongwei Xi // Authoremail: gmhwxiATgmailDOTcom // Start time: the first of July, 2016 // (* ****** ****** *) // #ifdef MYGRADING_HATS #then #else // extern fun csv_parse_line ( line: string ) : List0_vt(Strptr1) // #endif // #ifdef // (* ****** ****** *) local // staload UN = "prelude/SATS/unsafe.sats" // extern fun{} getpos(): int // extern fun{} is_end(): bool // extern fun{} char_at(): int // extern fun{} Strptr1_at(i0: int): Strptr1 // extern fun{} rmove(): void extern fun{} rmove_while(test: char - bool): void // in (* in-of-local *) // implement {}(*tmp*) rmove_while (test) = let // val c0 = char_at() // in // if c0 >= 0 then if test(int2char0(c0)) then (rmove(); rmove_while(test)) else () // end of [if] // end // end of [rmove_while] (* ****** ****** *) implement csv_parse_line (line) = let // val line = g1ofg0(line) // var i: int = 0 val p_i = addr@i // val n0 = sz2i(length(line)) // macdef get_i() = $UN.ptr0_get(p_i) macdef inc_i() = $UN.ptr0_addby(p_i, 1) macdef set_i(i0) = $UN.ptr0_set(p_i, ,(i0)) // implement getpos<>() = get_i() // implement is_end<>() = get_i() >= n0 // implement char_at<>() = let val i = get_i() val i = ckastloc_gintGte(i, 0) // in if i < n0 then char2u2int0(line[i]) else ~1 end // end of [char_at] // implement Strptr1_at<>(i0) = let // val i1 = get_i() val i0 = ckastloc_gintGte(i0, 0) val i1 = ckastloc_gintBtwe(i1, i0, n0) // in $UN.castvwtp0( string_make_substring(line, i2sz(i0), i2sz(i1-i0)) ) (* $UN.castvwtp0 *) end // end of [Strptr1_at] // implement rmove<>() = if get_i() < n0 then inc_i() // vtypedef res_vt = List0_vt(Strptr1) // fun loop ( i: int, res: res_vt ) : res_vt = if is_end() then res else let val () = ( if i > 0 then rmove() ) val i0 = getpos() var f0 = ( lam@(c: char) = c != ',' ) val () = rmove_while($UN.cast(addr@f0)) val s0 = Strptr1_at(i0) in loop(i+1, list_vt_cons(s0, res)) end // end of [else] // in list_vt_reverse(loop(0(*i*), list_vt_nil((*void*)))) end // end of [csv_parse_line] end // end of [local] (* ****** ****** *) (* end of [csv_parse.hats] *) ================================================ FILE: samples/ATS/intinf_vt.dats ================================================ (***********************************************************************) (* *) (* ATS/contrib/atshwxi *) (* *) (***********************************************************************) (* ** Copyright (C) 2013 Hongwei Xi, ATS Trustful Software, Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and associated documentation files (the "Software"), ** to deal in the Software without restriction, including without limitation ** the rights to use, copy, modify, merge, publish, distribute, sublicense, ** and/or sell copies of the Software, and to permit persons to whom the ** Software is furnished to do so, subject to the following stated conditions: ** ** The above copyright notice and this permission notice shall be included in ** all copies or substantial portions of the Software. ** ** THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS ** OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, ** FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL ** THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER ** LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING ** FROM OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS ** IN THE SOFTWARE. *) // Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/04a984d9c08c1831f7dda8a05ce356db01f81850/contrib/libats-/hwxi/intinf/DATS/intinf_vt.dats (* ****** ****** *) // // Author: Hongwei Xi // Authoremail: hwxi AT gmail DOT com // Start Time: April, 2013 // (* ****** ****** *) #include "share/atspre_define.hats" (* ****** ****** *) staload UN = "prelude/SATS/unsafe.sats" (* ****** ****** *) staload GMP = "{$LIBGMP}/SATS/gmp.sats" (* ****** ****** *) vtypedef mpz = $GMP.mpz_vt0ype (* ****** ****** *) // staload "./../SATS/intinf.sats" staload "./../SATS/intinf_vt.sats" // (* ****** ****** *) macdef i2u (x) = g1int2uint_int_uint (,(x)) (* ****** ****** *) local assume intinf_vtype (i: int) = // HX: [i] is a fake [l:addr] (mpz @ l, mfree_gc_v (l) | ptr l) // end of [intinf_vtype] in (* in of [local] *) implement{} intinf_make_int (i) = (x) where { // val x = ptr_alloc () val () = $GMP.mpz_init_set_int (!(x.2), i) // } (* end of [intinf_make_int] *) implement{} intinf_make_uint (i) = (x) where { // val x = ptr_alloc () val () = $GMP.mpz_init_set_uint (!(x.2), i) // } (* end of [intinf_make_uint] *) implement{} intinf_make_lint (i) = (x) where { // val x = ptr_alloc () val () = $GMP.mpz_init_set_lint (!(x.2), i) // } (* end of [intinf_make_lint] *) implement{} intinf_make_ulint (i) = (x) where { // val x = ptr_alloc () val () = $GMP.mpz_init_set_ulint (!(x.2), i) // } (* end of [intinf_make_ulint] *) (* ****** ****** *) implement{} intinf_free (x) = let val (pfat, pfgc | p) = x val () = $GMP.mpz_clear (!p) in ptr_free (pfgc, pfat | p) end (* end of [intinf_free] *) (* ****** ****** *) implement{} intinf_get_int (x) = $GMP.mpz_get_int (!(x.2)) implement{} intinf_get_lint (x) = $GMP.mpz_get_lint (!(x.2)) (* ****** ****** *) implement{} intinf_get_strptr (x, base) = $GMP.mpz_get_str_null (base, !(x.2)) // end of [intinf_get_strptr] (* ****** ****** *) implement{} fprint_intinf_base (out, x, base) = let val nsz = $GMP.mpz_out_str (out, base, !(x.2)) in // if (nsz = 0) then exit_errmsg (1, "libgmp/gmp: fprint_intinf_base") // end of [if] // end (* fprint_intinf_base *) (* ****** ****** *) implement{ } neg_intinf0 (x) = (x) where { // val () = $GMP.mpz_neg (!(x.2)) // } (* end of [neg_intinf0] *) implement{ } neg_intinf1 (x) = (y) where { // val y = ptr_alloc () val () = $GMP.mpz_init (!(y.2)) val () = $GMP.mpz_neg (!(y.2), !(x.2)) // } (* end of [neg_intinf1] *) (* ****** ****** *) implement{ } abs_intinf0 (x) = (x) where { // val () = $GMP.mpz_abs (!(x.2)) // } (* end of [abs_intinf0] *) implement{ } abs_intinf1 (x) = (y) where { // val y = ptr_alloc () val () = $GMP.mpz_init (!(y.2)) val () = $GMP.mpz_abs (!(y.2), !(x.2)) // } (* end of [abs_intinf1] *) (* ****** ****** *) implement{} succ_intinf0 (x) = add_intinf0_int (x, 1) implement{} succ_intinf1 (x) = add_intinf1_int (x, 1) (* ****** ****** *) implement{} pred_intinf0 (x) = sub_intinf0_int (x, 1) implement{} pred_intinf1 (x) = sub_intinf1_int (x, 1) (* ****** ****** *) implement{} add_intinf0_int (x, y) = (x) where { // val () = $GMP.mpz_add2_int (!(x.2), y) // } (* end of [add_intinf0_int] *) implement{} add_intinf1_int (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_add3_int (!(z.2), !(x.2), y) // } (* end of [add_intinf1_int] *) (* ****** ****** *) implement{} add_int_intinf0 (x, y) = add_intinf0_int (y, x) implement{} add_int_intinf1 (x, y) = add_intinf1_int (y, x) (* ****** ****** *) implement{} add_intinf0_intinf1 (x, y) = (x) where { // val () = $GMP.mpz_add2_mpz (!(x.2), !(y.2)) // } (* end of [add_intinf0_intinf1] *) implement{} add_intinf1_intinf0 (x, y) = (y) where { // val () = $GMP.mpz_add2_mpz (!(y.2), !(x.2)) // } (* end of [add_intinf1_intinf0] *) (* ****** ****** *) implement{} add_intinf1_intinf1 (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_add3_mpz (!(z.2), !(x.2), !(y.2)) // } (* end of [add_intinf1_intinf1] *) (* ****** ****** *) implement{} sub_intinf0_int (x, y) = (x) where { // val () = $GMP.mpz_sub2_int (!(x.2), y) // } (* end of [sub_intinf0_int] *) implement{} sub_intinf1_int (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_sub3_int (!(z.2), !(x.2), y) // } (* end of [sub_intinf1_int] *) (* ****** ****** *) implement{} sub_int_intinf0 (x, y) = let val z = sub_intinf0_int (y, x) in neg_intinf0 (z) end (* end of [sub_int_intinf0] *) implement{} sub_int_intinf1 (x, y) = let val z = sub_intinf1_int (y, x) in neg_intinf0 (z) end (* end of [sub_int_intinf1] *) (* ****** ****** *) implement{} sub_intinf0_intinf1 (x, y) = (x) where { // val () = $GMP.mpz_sub2_mpz (!(x.2), !(y.2)) // } (* end of [sub_intinf0_intinf1] *) implement{} sub_intinf1_intinf0 (x, y) = neg_intinf0 (sub_intinf0_intinf1 (y, x)) // end of [sub_intinf1_intinf0] implement{} sub_intinf1_intinf1 (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_sub3_mpz (!(z.2), !(x.2), !(y.2)) // } (* end of [sub_intinf1_intinf1] *) (* ****** ****** *) implement{} mul_intinf0_int (x, y) = (x) where { // val () = $GMP.mpz_mul2_int (!(x.2), y) // } (* end of [mul_intinf0_int] *) implement{} mul_intinf1_int (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_mul3_int (!(z.2), !(x.2), y) // } (* end of [mul_intinf1_int] *) (* ****** ****** *) implement{} mul_int_intinf0 (x, y) = mul_intinf0_int (y, x) implement{} mul_int_intinf1 (x, y) = mul_intinf1_int (y, x) (* ****** ****** *) implement{} mul_intinf0_intinf1 (x, y) = (x) where { // val () = $GMP.mpz_mul2_mpz (!(x.2), !(y.2)) // } (* end of [mul_intinf0_intinf1] *) implement{} mul_intinf1_intinf0 (x, y) = (y) where { // val () = $GMP.mpz_mul2_mpz (!(y.2), !(x.2)) // } (* end of [mul_intinf0_intinf1] *) (* ****** ****** *) implement{} mul_intinf1_intinf1 (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_mul3_mpz (!(z.2), !(x.2), !(y.2)) // } (* end of [mul_intinf1_intinf1] *) (* ****** ****** *) implement{} div_intinf0_int {i,j} (x, y) = let in // if y >= 0 then let val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(y)) in x end else let val () = $GMP.mpz_tdiv2_q_uint (!(x.2), i2u(~y)) in neg_intinf0 (x) end // end of [if] // end (* end of [div_intinf0_int] *) implement{} div_intinf1_int {i,j} (x, y) = let // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) // in // if y >= 0 then let val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(y)) in z end else let val () = $GMP.mpz_tdiv3_q_uint (!(z.2), !(x.2), i2u(~y)) in neg_intinf0 (z) end // end of [if] // end (* end of [div_intinf1_int] *) (* ****** ****** *) implement{} div_intinf0_intinf1 (x, y) = (x) where { // val () = $GMP.mpz_tdiv2_q_mpz (!(x.2), !(y.2)) // } (* end of [div_intinf0_intinf1] *) (* ****** ****** *) implement{} div_intinf1_intinf1 (x, y) = (z) where { // val z = ptr_alloc () val () = $GMP.mpz_init (!(z.2)) val () = $GMP.mpz_tdiv3_q_mpz (!(z.2), !(x.2), !(y.2)) // } (* end of [div_intinf1_intinf1] *) (* ****** ****** *) implement{} ndiv_intinf0_int (x, y) = div_intinf0_int (x, y) implement{} ndiv_intinf1_int (x, y) = div_intinf1_int (x, y) (* ****** ****** *) implement{} nmod_intinf0_int {i,j} (x, y) = let // val r = $GMP.mpz_fdiv_uint (!(x.2), i2u(y)) val () = intinf_free (x) // in $UN.cast{intBtw(0,j)}(r) end (* end of [nmod_intinf0_int] *) implement{} nmod_intinf1_int {i,j} (x, y) = let // val r = $GMP.mpz_fdiv_uint (!(x.2), i2u(y)) // in $UN.cast{intBtw(0,j)}(r) end (* end of [nmod_intinf1_int] *) (* ****** ****** *) // // comparison-functions // (* ****** ****** *) implement{} lt_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val ans = (if sgn < 0 then true else false): bool // in $UN.cast{bool(i < j)}(sgn) end // end of [lt_intinf_int] implement{} lt_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val ans = (if sgn < 0 then true else false): bool // in $UN.cast{bool(i < j)}(sgn) end // end of [lt_intinf_intinf] (* ****** ****** *) implement{} lte_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val ans = (if sgn <= 0 then true else false): bool // in $UN.cast{bool(i <= j)}(sgn) end // end of [lte_intinf_int] implement{} lte_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val ans = (if sgn <= 0 then true else false): bool // in $UN.cast{bool(i <= j)}(sgn) end // end of [lte_intinf_intinf] (* ****** ****** *) implement{} gt_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val ans = (if sgn > 0 then true else false): bool // in $UN.cast{bool(i > j)}(sgn) end // end of [gt_intinf_int] implement{} gt_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val ans = (if sgn > 0 then true else false): bool // in $UN.cast{bool(i > j)}(sgn) end // end of [gt_intinf_intinf] (* ****** ****** *) implement{} gte_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val ans = (if sgn >= 0 then true else false): bool // in $UN.cast{bool(i >= j)}(sgn) end // end of [gte_intinf_int] implement{} gte_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val ans = (if sgn >= 0 then true else false): bool // in $UN.cast{bool(i >= j)}(sgn) end // end of [gte_intinf_intinf] (* ****** ****** *) implement{} eq_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val ans = (if sgn = 0 then true else false): bool // in $UN.cast{bool(i == j)}(sgn) end // end of [eq_intinf_int] implement{} eq_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val ans = (if sgn = 0 then true else false): bool // in $UN.cast{bool(i == j)}(sgn) end // end of [eq_intinf_intinf] (* ****** ****** *) implement{} neq_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val ans = (if sgn != 0 then true else false): bool // in $UN.cast{bool(i != j)}(sgn) end // end of [neq_intinf_int] implement{} neq_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val ans = (if sgn != 0 then true else false): bool // in $UN.cast{bool(i != j)}(sgn) end // end of [neq_intinf_intinf] (* ****** ****** *) implement{} compare_intinf_int {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(x.2), y) val sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int // in $UN.cast{int(sgn(i-j))}(sgn) end // end of [compare_intinf_int] implement{} compare_int_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_int (!(y.2), x) val sgn = (if sgn > 0 then ~1 else (if sgn < 0 then 1 else 0)): int // in $UN.cast{int(sgn(i-j))}(sgn) end // end of [compare_int_intinf] implement{} compare_intinf_intinf {i,j} (x, y) = let // val sgn = $GMP.mpz_cmp_mpz (!(x.2), !(y.2)) val sgn = (if sgn < 0 then ~1 else (if sgn > 0 then 1 else 0)): int // in $UN.cast{int(sgn(i-j))}(sgn) end // end of [compare_intinf_intinf] (* ****** ****** *) implement{} pow_intinf_int (base, exp) = r where { // val r = ptr_alloc () val () = $GMP.mpz_init (!(r.2)) val () = $GMP.mpz_pow_uint (!(r.2), !(base.2), i2u(exp)) // } (* end of [pow_intinf_int] *) (* ****** ****** *) end // end of [local] (* ****** ****** *) implement{} print_intinf (x) = fprint_intinf (stdout_ref, x) implement{} prerr_intinf (x) = fprint_intinf (stderr_ref, x) implement{} fprint_intinf (out, x) = fprint_intinf_base (out, x, 10(*base*)) (* ****** ****** *) (* end of [intinf_vt.dats] *) ================================================ FILE: samples/ActionScript/FooBar.as ================================================ // A sample for Actionscript. package foobar { import flash.display.MovieClip; class Bar { public function getNumber():Number { return 10; } } class Foo extends Bar { private var ourNumber:Number = 25; override public function getNumber():Number { return ourNumber; } } class Main extends MovieClip { public function Main() { var x:Bar = new Bar(); var y:Foo = new Foo(); trace(x.getNumber()); trace(y.getNumber()); } } } ================================================ FILE: samples/ActionScript/HelloWorld.as ================================================ package mypackage { public class Hello { /* Let's say hello! * This is just a test script for Linguist's Actionscript detection. */ public function sayHello():void { trace("Hello, world"); } } } ================================================ FILE: samples/ActionScript/NumberUtil.as ================================================ // https://github.com/aaronclinger/casalib/blob/a948190f3c9f781dfb1420fb24d36e7c1deeacf8/AS2/code/org/casalib/util/NumberUtil.as /* CASA Lib for ActionScript 2.0 Copyright (c) 2008, Aaron Clinger & Contributors of CASA Lib All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the CASA Lib nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @author Aaron Clinger @author David Nelson @version 08/24/07 */ class org.casalib.util.NumberUtil { /** Evaluates val1 and val2 and returns the smaller value. Unlike Math.min this method will return the defined value if the other value is undefined. @param val1: A number or expression to compare. @param val2: A number or expression to compare. @return Returns the smallest value, or the value out of the two that is defined. */ public static function min(val1:Number, val2:Number):Number { if (val1 == undefined || val2 == undefined) return (val2 == undefined) ? val1 : val2; return Math.min(val1, val2); } /** Evaluates val1 and val2 and returns the larger value. Unlike Math.max this method will return the defined value if the other value is undefined. @param val1: A number or expression to compare. @param val2: A number or expression to compare. @return Returns the largest value, or the value out of the two that is defined. */ public static function max(val1:Number, val2:Number):Number { if (val1 == undefined || val2 == undefined) return (val2 == undefined) ? val1 : val2; return Math.max(val1, val2); } /** Creates a random integer within the defined range. @param min: The minimum number the random integer can be. @param min: The maximum number the random integer can be. @return Returns a random integer within the range. */ public static function randomInteger(min:Number, max:Number):Number { return min + Math.floor(Math.random() * (max + 1 - min)); } /** Determines if the number is even. @param num: A number to determine if it is divisible by 2. @return Returns true if the number is even; otherwise false. */ public static function isEven(num:Number):Boolean { return (num & 1) == 0; } /** Determines if the number is odd. @param num: A number to determine if it is not divisible by 2. @return Returns true if the number is odd; otherwise false. */ public static function isOdd(num:Number):Boolean { return !NumberUtil.isEven(num); } /** Determines if the number is an integer. @param num: A number to determine if it contains no decimal values. @return Returns true if the number is an integer; otherwise false. */ public static function isInteger(num:Number):Boolean { return (num % 1) == 0; } /** Determines if the number is prime. @param num: A number to determine if it is only divisible by 1 and itself. @return Returns true if the number is prime; otherwise false. */ public static function isPrime(num:Number):Boolean { if (num == 1 || num == 2) return true; if (NumberUtil.isEven(num)) return false; var s:Number = Math.sqrt(num); for (var i:Number = 3; i <= s; i++) if (num % i == 0) return false; return true; } /** Rounds a number's decimal value to a specific place. @param num: The number to round. @param place: The decimal place to round. @return Returns the value rounded to the defined place. @example trace(NumberUtil.roundToPlace(3.14159, 2)); // Traces 3.14 trace(NumberUtil.roundToPlace(3.14159, 3)); // Traces 3.142 */ public static function roundDecimalToPlace(num:Number, place:Number):Number { var p:Number = Math.pow(10, Math.round(place)); return Math.round(num * p) / p; } /** Determines if the value is included within a range. @param num: Number to determine if it's included in the range. @param startValue: First value of the range. @param endValue: Second value of the range. @return Returns true if the number falls within the range; otherwise false. */ public static function isBetween(num:Number, startValue:Number, endValue:Number):Boolean { return !(num < Math.min(startValue, endValue) || num > Math.max(startValue, endValue)); } /** Determines if value falls within a range; if not it is snapped to the nearest range value. @param num: Number to determine if it's included in the range. @param startValue: First value of the range. @param endValue: Second value of the range. @return Returns either the number as passed, or its value once snapped to nearest range value. */ public static function makeBetween(num:Number, startValue:Number, endValue:Number):Number { return Math.min(Math.max(num, Math.min(startValue, endValue)), Math.max(startValue, endValue)); } /** Creates evenly spaced numerical increments between two numbers. @param begin: The starting value. @param end: The ending value. @param steps: The number of increments between the starting and ending values. @return Returns an Array comprised of the increments between the two values. @example trace(NumberUtil.createStepsBetween(0, 5, 4)); // Traces 1,2,3,4 trace(NumberUtil.createStepsBetween(1, 3, 3)); // Traces 1.5,2,2.5 */ public static function createStepsBetween(begin:Number, end:Number, steps:Number): /*Number*/ Array { steps++; var i:Number = 0; var stepsBetween: /*Number*/ Array = new Array(); var increment:Number = (end - begin) / steps; while (++i < steps) stepsBetween.push((i * increment) + begin); return stepsBetween; } /** Formats a number. @param numberToFormat: The number you wish to format. @param minLength: The minimum length of the number. @param thouDelim: [optional] The character used to seperate thousands; defaults to none. @param fillChar: [optional] The leading character used to make the number the minimum length; defaults to 0. @return Returns the formated number as a String. @example trace(NumberUtil.format(1234567, 8, ",")); // Traces 01,234,567 */ public static function format(numberToFormat:Number, minLength:Number, thouDelim:String, fillChar:String):String { var num:String = numberToFormat.toString(); var len:Number = num.length; if (thouDelim != undefined) { var numSplit:Array = num.split(''); var counter:Number = 3; var i:Number = numSplit.length; while (--i > 0) { counter--; if (counter == 0) { counter = 3; numSplit.splice(i, 0, thouDelim); } } num = numSplit.join(''); } if (minLength != undefined) { if (len < minLength) { minLength -= len; var addChar:String = (fillChar == undefined) ? '0' : fillChar; while (minLength--) num = addChar + num; } } return num; } /** Finds the English ordinal suffix for the number given. @param num: Number to find the ordinal suffix of. @return Returns the suffix for the number, 2 characters. @example trace(32 + NumberUtil.getOrdinalSuffix(32)); // Traces 32nd */ public static function getOrdinalSuffix(num:Number):String { if (num >= 10 && num <= 20) return 'th'; switch (num % 10) { case 0 : case 4 : case 5 : case 6 : case 7 : case 8 : case 9 : return 'th'; case 3 : return 'rd'; case 2 : return 'nd'; case 1 : return 'st'; } } /** Adds a leading zero for numbers less than ten. @param num: Number to add leading zero. @return Number as a String; if the number was less than ten the number will have a leading zero. */ public static function addLeadingZero(num:Number):String { return (num < 10) ? '0' + num : num.toString(); } private function NumberUtil() {} // Prevents instance creation } ================================================ FILE: samples/ActionScript/TextFieldUtil.as ================================================ // https://github.com/aaronclinger/casalib/blob/a948190f3c9f781dfb1420fb24d36e7c1deeacf8/AS2/code/org/casalib/util/TextFieldUtil.as /* CASA Lib for ActionScript 2.0 Copyright (c) 2008, Aaron Clinger & Contributors of CASA Lib All rights reserved. Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: - Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. - Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. - Neither the name of the CASA Lib nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ /** @author Aaron Clinger @author Mike Creighton @version 08/02/07 */ class org.casalib.util.TextFieldUtil { /** Determines if textfield has more text than can be displayed at once. @param target_txt: Textfield or {@link CoreTextField} to check for text overflow. @return Returns true if textfield has overflow text; otherwise false. */ public static function hasOverFlow(target_txt:Object):Boolean { return target_txt.maxscroll > 1; } /** Removes text overflow on a plain text textfield with the option of an ommission indicator. @param target_txt: Textfield or {@link CoreTextField} to remove overflow. @param omissionIndicator: [optional] Text indication that an omission has occured; normally "..."; defaults to no indication. @return Returns the omitted text; if there was no text ommitted function returns a empty String (""). */ public static function removeOverFlow(target_txt:Object, omissionIndicator:String):String { if (!TextFieldUtil.hasOverFlow(target_txt)) return ''; if (omissionIndicator == undefined) omissionIndicator = ''; var originalCopy:String = target_txt.text; var lines:Array = target_txt.text.split('. '); var isStillOverflowing:Boolean = false; var words:Array; var lastSentence:String; var sentences:String; var overFlow:String; while (TextFieldUtil.hasOverFlow(target_txt)) { lastSentence = String(lines.pop()); target_txt.text = (lines.length == 0) ? '' : lines.join('. ') + '. '; } sentences = (lines.length == 0) ? '' : lines.join('. ') + '. '; words = lastSentence.split(' '); target_txt.text += lastSentence; while (TextFieldUtil.hasOverFlow(target_txt)) { if (words.length == 0) { isStillOverflowing = true; break; } else { words.pop(); if (words.length == 0) target_txt.text = sentences.substr(0, -1) + omissionIndicator; else target_txt.text = sentences + words.join(' ') + omissionIndicator; } } if (isStillOverflowing) { words = target_txt.text.split(' '); while (TextFieldUtil.hasOverFlow(target_txt)) { words.pop(); target_txt.text = words.join(' ') + omissionIndicator; } } overFlow = originalCopy.substring(target_txt.text.length); return (overFlow.charAt(0) == ' ') ? overFlow.substring(1) : overFlow; } private function TextFieldUtil() {} // Prevents instance creation } ================================================ FILE: samples/Adblock Filter List/Imperial Units Remover.txt ================================================ [Adblock Plus 3.13] ! Title: 📏 Imperial Units Remover ! Version: 23May2022v1-Alpha ! Expires: 10 days ! Description: Are you pro-metric and are tired of seeing imperial unites all over the English-language parts of the internet? If so, then here's a list for you. ! Homepage: https://github.com/DandelionSprout/adfilt/blob/master/Wiki/General-info.md#english ! Removing miles from dual-unit distance measurements in Google Maps (uBO and AdGuard only) google.*##html[lang$=US] #ruler span:first-of-type google.*##html[lang=en] #ruler span:first-of-type google.*##html:not([lang$=US], [lang=en]) #ruler span:nth-of-type(2) ! Removes imperial measurements from multi-unit displays weather.gov###myfcst-tempf weather.gov#?#p[class^=myforecast-current-]:has-text(°F) holiday-weather.com#?#.temperature_data_container > :has-text(°F) holiday-weather.com#?#.distance_data_container > :has-text(miles) lematin.ma##.meteo-bloc span sveip.no##.wmsb_f gismeteo.de##.ifnoie ================================================ FILE: samples/Adblock Filter List/abp-filters-anti-cv.txt ================================================ [Adblock Plus 3.1] ! Checksum: i7lcTV9/kkiE8g3aav4y/g ! Version: 202208071141 ! Title: ABP filters ! Last modified: 07 Aug 2022 11:41 UTC ! Expires: 1 hours (update frequency) ! Homepage: https://github.com/abp-filters/abp-filters-anti-cv ! ! Filter list designed to fight circumvention ads (including, in some cases, their tracking) and fix critical issues for Adblock Plus users ! ! Please report any issues ! on GitHub https://github.com/abp-filters/abp-filters-anti-cv/issues ! or via filters+cv@adblockplus.org ! ! *** abp-filters-anti-cv:arabic.txt *** ! MISC 3sk.io,3sk.co,33sk.tv,esheeq.co#$#abort-on-property-read atob; abort-on-property-write Fingerprint2; abort-on-property-read decodeURIComponent; abort-on-property-read RegExp 3oloum.com,7olm.org,ahladalil.com,syriaforums.net,ahlamontada.com,alamontada.com,arabepro.com,banouta.net,gid3an.com,jordanforum.net,yoo7.com,forumalgerie.net,own0.com##a[onclick^="this.href=atob"] 3oloum.com,7olm.org,ahladalil.com,syriaforums.net,ahlamontada.com,alamontada.com,arabepro.com,banouta.net,gid3an.com,jordanforum.net,yoo7.com,forumalgerie.net,own0.com#$#abort-on-property-read atob ! #CV-685 arabseed.co,arabseed.com,arabseed.me,arabseed.net,arabseed.tv#$#abort-on-property-read atob; abort-on-property-read decodeURI; abort-on-property-read decodeURIComponent hawak.net,hawak.tv,rotana.video#$#abort-on-property-read atob ! #CV-667 beinconnect.us,coroot.blogspot.com,ktarab.com,shofnow.com,actionz.tv,brstej.com,jaewinter.co,movs4u.live,mvs4u.tv,kora-online.tv,filmey.tv,animetak.net,arabseed.tv,arabseed.co,arabseed.com,arabseed.me,arabseed.net,shahid4u.com,shahid4u.net#$#abort-current-inline-script Math zfgloaded ! Popup/Popunder/Clickunder egyanime.com,egydead.com,egydead.live#$#abort-on-property-write _pop actionz.tv,cimaclub.com,cimaclub.in,elmstba.com,hawak.net,hawak.tv,lodynet.co,lodynet.dev,lodynet.ink,lodynet.tv,rotana.video#$#abort-on-property-read decodeURIComponent egy.best,egybest.asia,egybest.bid,egybest.biz,egybest.cheap,egybest.co,egybest.com,egybest.cool,egybest.fail,egybest.life,egybest.ltd,egybest.ist,egybest.name,egybest.net,egybest.network,egybest.ninja,egybest.nl,egybest.online,egybest.org,egybest.pw,egybest.rocks,egybest.site,egybest.xyz,egybest.zone,egybest2.com,iegy.best#$#abort-on-property-read open akhbara24.news,anime4up.art,anime4up.com,arabseed.me,asia2tv.cn,asia2tv.com,baramjak.com,cima-club.cc,cima-club.in,cima-club.io,cima-club.lol,cima-club.vip,cima4u.cloud,cima4u.film,cima4u.ink,cima4u.tv,cima4u.ws,cimalina.me,cimalina.net,egy-live.online,egynow.cam,egynow.live,hawak.net,iegybest.co,lodynet.co,lodynet.dev,lodynet.ink,lodynet.tv,manga.ae,moshahda.net,movizland.com,movizland.cyou,movizland.online,egyanime.com,egydead.com,egydead.live,shahed4u.cafe,shahed4u.casa,shahed4u.cloud,shahed4u.mba,shahed4u.red,shahed4u.tips,shahed4u.ws,tuktukcinema.co,tuktukcinema.net,witanime.com,yalla-shoot.today#$#abort-current-inline-script Math /atob|break/; abort-current-inline-script String.fromCharCode /atob|break/; abort-current-inline-script document.documentElement /atob|break|JSON.parse/; abort-on-property-write JSON.parse arabxd.com#$#abort-current-inline-script document.querySelectorAll popMagic ! #CV-754 akwam.cc,akoam.com,akoam.net,akwam.co,akwam.cx,akwam.net,akwam.org,gateanime.com,gocoo.co#$#abort-on-property-read String.fromCharCode ! *** abp-filters-anti-cv:bulgarian.txt *** ! #CV-667 gledaiseriali.net#$#abort-current-inline-script Math zfgloaded ! *** abp-filters-anti-cv:chinese.txt *** ! #CV-767 ipv6.baidu.com,xueshu.baidu.com,www.baidu.com,www1.baidu.com#$#hide-if-contains 广告 .c-container '.f13 > .m'; hide-if-contains 广告 #content_right>[class] span[data-tuiguang] 1111.baidu.com,bdimg.com,tieba.baidu.com,tieba.com,xingqu.baidu.com#$#abort-on-property-read Object.prototype.loadImage baidu.com#$#hide-if-contains 广告 #content_right>div .ec-tuiguang baidu.com#$#hide-if-contains 广告 #content_left>div .ec-tuiguang ! MISC torrentkitty.tv#$#abort-on-property-read _fupfgk;abort-on-property-read _nyjdy 178.com,nga.cn#$#abort-on-property-write __LOAD_BBS_ADS_12 cn.bing.com#$#hide-if-contains 360 #b_results>li .b_adProvider 2345.com#$#abort-current-inline-script setDefaultTheme ahri8.top#$#abort-current-inline-script document.querySelectorAll popMagic ifenpaidy.com#$#abort-on-property-read localStorage ! Popups & Popunders cocomanga.com#$#abort-on-property-read __cad.cpm_popunder; abort-on-property-read __ad madouqu.com,madouqu.tk#$#abort-current-inline-script document.querySelectorAll popMagic editcode.net#$#abort-current-inline-script setTimeout openAd theporn.cc#$#abort-on-property-read is_show_alert_window ! Video ads iyingshi9.tv#$#override-property-read YZM.ads.state false ! #CV-667 hdzone.org#$#abort-current-inline-script Math zfgloaded ! *** abp-filters-anti-cv:czech.txt *** ! #CV-655 iprima.cz,www.seznam.cz,novinky.cz,super.cz,ahaonline.cz,expres.cz,kinobox.cz,horoskopy.cz#$#json-override ads '' kinobox.cz,novinky.cz,expres.cz,fights.cz,tiscali.cz,hudebniskupiny.cz,osobnosti.cz,ahaonline.cz,super.cz#$#prevent-listener beforeunload (); cookie-remover /^_?adb/; sauto.cz#$#override-property-read sssp undefined super.cz#$#override-property-read sspPositions null iprima.cz##.sas_center, .px-ad, .sas_mone, .mone_box, .ifr-passback, [data-sas_status], div[id^="sas_"], div[class^="mas_mone_"], [data-alter_area="leaderboardpremium-1"], [data-alter_area="boardbottom-1"], .ifr-masshack, .px-zone, .sas_megaboard, .ifr-classflak, [data-sas-creative], #cnn_reklama, div[class^="mas_"], ._sasia_fcid, [class^="mas"][class$="_clue"] iprima.cz#?#div:-abp-has(>.mone_header) iprima.cz##.px-type-banner iprima.cz##[class$="_value"], [id^="px-id-"] iprima.cz##[class$="_fcid"], [data-mashiatus] iprima.cz##div[data-d-area] iprima.cz##[class*="sas"] iprima.cz##a[href*="/area=branding"] iprima.cz##[id*="-ad-"], .ifr-claassflak, a[href*="/posid=sas_"] iprima.cz##.dekes_reblika /area=*/posid=*$subdocument,xmlhttprequest,script,domain=iprima.cz /keyword*/area=$xmlhttprequest,domain=iprima.cz /section=adblock_desktop^$domain=iprima.cz ?format=js|$script,domain=iprima.cz ?guci=$subdocument,domain=iprima.cz ?v127|$script,domain=iprima.cz /area=halfpagead$xmlhttprequest,domain=iprima.cz /area=branding$xmlhttprequest,domain=iprima.cz auto.cz,autorevue.cz,maminka.cz,reflex.cz,ahaonline.cz,blesk.cz,dama.cz,e15.cz,info.cz,mojezdravi.cz,onetv.cz,zeny.cz,zive.cz##.inserted_rtb ================================================ FILE: samples/Adblock Filter List/anti-facebook.txt ================================================ [Adblock Plus 2.0] ! Checksum: Ea7JI8rmiGKaIOR604if2A ! Title: Anti-Facebook List ! Updated: 2021-09-19 08:57 UTC ! Expires: 9 days ! License: http://creativecommons.org/licenses/by/3.0/ ! Homepage: http://www.fanboy.co.nz/ ! Reporting Issues: https://github.com/ryanbr/fanboy-adblock/issues ! ! Legal stuff (T&C's) . ! In no event shall Fanboy List, or the list author be liable for any indirect, direct, punitive, special, incidental, or consequential damages whatsoever. ! By downloading or viewing, or using this list, you are accepting these terms and the license. ! ! ! Warning, will break on facebook-based comment sites and may also break on some facebook apps or games. ! ! Thirdparty Filters ! ||api-read.facebook.com/restserver.php?api_key=$third-party ||api.facebook.com^$third-party ||badge.facebook.com^$third-party ||connect.facebook.com^$third-party,domain=~facebook.net|~fb.com ||connect.facebook.net^$third-party,domain=~facebook.com|~fb.com ||facebook.com/connect/$third-party ||facebook.com/dialog/oauth?display=popup$popup,domain=humorhub.org ||facebook.com/plugins/activity.php?$third-party ||facebook.com/plugins/comments.php?$third-party ||facebook.com/plugins/facepile.php?$third-party ||facebook.com/plugins/fan.php?$third-party ||facebook.com/plugins/follow.php$third-party ||facebook.com/plugins/like.php?$third-party ||facebook.com/plugins/like_box.php$third-party ||facebook.com/plugins/likebox.php?$third-party ||facebook.com/plugins/post.php?$third-party ||facebook.com/plugins/recommendations.php?$third-party ||facebook.com/plugins/recommendations_bar.php?$third-party ||facebook.com/plugins/send.php?$third-party ||facebook.com/plugins/share_button.php?$third-party ||facebook.com/plugins/subscribe.php$third-party ||facebook.com/plugins/subscribe?$third-party ||facebook.com/restserver.php?*.getStats&$third-party ||facebook.com/whitepages/wpminiprofile.php$third-party ||facebook.com/widgets/activity.php?$third-party ||facebook.com/widgets/fan.php?$third-party ||facebook.com/widgets/like.php?$third-party ||facebook.com/widgets/recommendations.php?$third-party ||fbcdn-profile-a.akamaihd.net^$third-party,domain=~facebook.com ||google.com/js/client:plusone.js$third-party ||google.com/js/plusone.js$third-party ||graph.facebook.com/?id=$third-party ||graph.facebook.com^$third-party,xmlhttprequest ||profile.ak.fbcdn.net^$third-party,domain=~facebook.com ||scontent-a.*.fbcdn.net^$third-party,domain=~facebook.com ||spot.im/embed/scripts/launcher.js$third-party ||static.ak.fbcdn.net^$third-party,domain=~facebook.com ! ! Test Filters (For Gannett sites, which don't work anyways with Facebook blocked) ! ##.util-bar-module-firefly-visible ! ! Whitelist Filters ! @@/cdn-cgi/pe/bag2?*connect.facebook.net$domain=forwardprogressives.com|onhax.net|opensubtitles.org|viralthread.com|youngcons.com @@||akamaihd.net/rsrc.php/$domain=facebook.com @@||channel.facebook.com^$domain=facebook.com @@||connect.facebook.com^*/AudienceNetworkPrebid.js$domain=vice.com @@||facebook.com/ajax/browse/$domain=facebook.com @@||facebook.com/ajax/bz$domain=facebook.com @@||facebook.com/ajax/chat/buddy_list.php$domain=facebook.com @@||facebook.com/ajax/chat/hovercard/$domain=facebook.com @@||facebook.com/ajax/hovercard/$domain=facebook.com @@||facebook.com/ajax/litestand/$domain=facebook.com @@||facebook.com/ajax/notifications/$domain=facebook.com @@||facebook.com/ajax/pagelet/$domain=facebook.com @@||facebook.com/ajax/photos/$domain=facebook.com @@||facebook.com/ajax/presence/$domain=facebook.com @@||facebook.com/ajax/typeahead/$domain=facebook.com @@||facebook.com/ajax/webstorage/$domain=facebook.com @@||facebook.com/chat/$domain=facebook.com @@||facebook.com/images/$domain=facebook.com @@||fbcdn-photos-*.akamaihd.net^$domain=facebook.com @@||fbcdn-profile-*.akamaihd.net^$domain=facebook.com @@||fbcdn-sphotos-*.akamaihd.net^$domain=facebook.com @@||fbexternal-*.akamaihd.net^$domain=facebook.com @@||scontent-*.fbcdn.net^$domain=facebook.com ! ! Problematic sites ! @@||cloudfront.net^$font,domain=magicseaweed.com @@||connect.facebook.com^*/audiencenetworkprebid.js$script,domain=screenrant.com @@||connect.facebook.net^$script,domain=id.logi.com|tinder.com|abc.go.com|adultswim.com|contv.com|damnyouautocorrect.com|embedly.com|fitbit.com|instagram.com|interviewmagazine.com|noovo.ca|pogo.com|reddit.com|salon.com|sci2.tv|southpark.cc.com|southpark.de|upi.com @@||google.com/js/plusone.js$domain=abcnews.go.com|watch.nba.com @@||graph.facebook.com^$xmlhttprequest,domain=theguardian.com @@||staticxx.facebook.com/connect/$domain=embedly.com ! ! Cloudflare CDN ! /cdn-cgi/pe/bag2?*connect.facebook.com /cdn-cgi/pe/bag2?*connect.facebook.net ================================================ FILE: samples/Adblock Filter List/fake-news.txt ================================================ [Adblock Plus 2.0] ! Title: Fake-News List ! Updated: 10 Mar 2018 ! License: http://creativecommons.org/licenses/by/3.0/ ! Homepage: http://www.fanboy.co.nz/ ! Reporting Issues: https://github.com/ryanbr/fanboy-adblock/issues ! ! Legal stuff (T&C's) . ! In no event shall Fanboy List, or the list author be liable for any indirect, direct, punitive, special, incidental, or consequential damages whatsoever. ! By downloading or viewing, or using this list, you are accepting these terms and the license. ! ! (Truncated from original list, which is ~30 KBs) ! infowarsstore.com ##a[href^="http://infowarsstore.com"] ##a[href^="http://www.infowarsstore.com"] ##a[href^="https://www.infowarsstore.com"] infowarsstore.com#@#a[href^="http://infowarsstore.com"] infowarsstore.com#@#a[href^="http://www.infowarsstore.com"] infowarsstore.com#@#a[href^="https://www.infowarsstore.com"] ||infowarsstore.com^$popup,third-party ! infowars.com ##a[href^="http://infowars.com"] ##a[href^="http://www.infowars.com"] infowars.com#@#a[href^="http://www.infowars.com"] ||infowars.com^$popup,third-party ! abcnews.com.co ##a[href^="http://abcnews.com.co"] ##a[href^="http://www.abcnews.com.co"] abcnews.com.co#@#a[href^="http://abcnews.com.co"] abcnews.com.co#@#a[href^="http://www.abcnews.com.co"] ||abcnews.com.co^$popup,third-party ! 82.221.129.208 ##a[href^="http://82.221.129.208"] 82.221.129.208#@#a[href^="http://82.221.129.208"] ! angrypatriotmovement.com ##a[href^="http://angrypatriotmovement.com"] ##a[href^="http://www.angrypatriotmovement.com"] angrypatriotmovement.com#@#a[href^="http://angrypatriotmovement.com"] angrypatriotmovement.com#@#a[href^="http://www.angrypatriotmovement.com"] ||angrypatriotmovement.com^$popup,third-party ================================================ FILE: samples/Adblock Filter List/test_rules.txt ================================================ [AdGuard] ! Title: Test rules for the syntax highlighter ! License: MIT (see https://github.com/ameshkov/VscodeAdblockSyntax/blob/master/LICENSE.md) ! Homepage: https://github.com/ameshkov/VscodeAdblockSyntax/blob/master/test_rules.txt ! Author: Andrey Meshkov (Adguard Software Ltd.) ! # Some comments (should be all green) ! # ! ! Pre-processor directives and hints ! !#if (adguard && !adguard_ext_safari) !#include https://example.org/ !#endif !+ NOT_OPTIMIZED PLATFORM(android) ||example.org^ !#invalidpreprocessor !#if (invalid_platform) !#safari_cb_affinity(general,privacy) !#safari_cb_affinity !#safari_cb_affinity(invalid) ! ! Basic rules (valid) ! example.org @@||example.org^ ||example.org^ |https://www.example.org/| /banner ||example.org^$third-party ||example.org^$~object-subrequest ! Domain ||example.org$domain=~example.org|~test.org *.domain.com$domain=example.org|test.org,third-party,subdocument ||example.org$domain=j.gs ||example.org$domain=google.* *$3p,script,denyallow=hello.com|service.me,domain=example.*|test.org ! Domain invalid: https://github.com/ameshkov/VscodeAdblockSyntax/issues/26 ||parajumpersnettbutikk.com^$document,domain=~ Advarselen vises grunnet: En grovt falsk nettbutikksvindel som er svartelistet av Forbrukertilsynet. ! No URL $websocket,domain=example.org ! App ||testwinapp.org^$app=Skype.exe ||testapp.org^$app=com.adguard.android|~com.example ||testws.org^$websocket,xmlhttprequest ||testws.org^$~websocket,~xmlhttprequest ! ------------------------- ! Modifiers ! ------------------------- ! Csp ||example.org^$csp=frame-src 'none' @@||example.org^$csp ! Badfilter @@||example.org^$badfilter ! Redirect ||example.org^$redirect=google-analytics.com/ga.js ||example.org/$script,redirect-rule=noop.txt ! Rewrite ||example.org^$rewrite=abp-resource:blank-html ! Helper modifiers: #23 ||example.org^$first-party ||example.org^$xhr ||example.org^$inline-script ||example.org^$inline-font ||example.org^$popunder ! extension modifier: #31 @@||taxes.hrblock.com^$extension ! more modifiers aliases: #34 ||example.org^$all ||example.org^$3p ||example.org^$1p ||example.org^$css ||example.org^$frame ||example.org^$ghide ||example.org^$ehide ||example.org^$shide ||example.org^$specifichide ! ! Basic rules (invalid) ! ||example.org$domain=~example.org,~test.org ||example.org$domain=~example.org.~test.org ||testwinapp.org^$app=Skype.exe,~test.com ||testwinapp.org^$app=Skype.exe.~com.adguard ! ! Basic rules (regex) ! /banner/ @@/banner\d+/$third-party ! ! Basic rules ($replace) ! ||example.org^$replace=/()[\s\S]*<\/VAST>\/\$1<\/VAST>/gi,third-party ||example.org^$important,replace=/()[\s\S]*<\/VAST>\/\$1<\/VAST>/gi,third-party ||example.net^$replace=/[\s\S]+//,important,domain=example.org|example.com @@||example.org^$replace ! ! Elemhide rules (valid) ! ##.valid_selector j.gs,46.166.167.16,example.org##banner example.org##valid_selector ~example.org##valid_selector example.org,~hello.com##valid_selector example.org#@#valid_selector example.org#@#valid_selector example.org,example.com##valid_selector example.org,example.com,test.com##valid_selector business-service.me#@##banner_ad q.gs#@##bottom j.gs#@##bottom berlin.de##.teaser[-ext-has='>.inner>h3>a.trakkking,>.inner>h3:not(:has(>))'] xn--fgelsng-exae.se##banner xn--80aneaaefcxzcih6g1e.xn--p1ai##banner 4pda.ru##body > * > * > div > * > :not(div) > :not(div) > :not(div) > div:has(> h2:contains(/[APprmoАрРо]{8}/)) ! TLD google.*###center_col > #main > .dfrd > .mnr-c > .c._oc._zs google.*###center_col > #res > #topstuff + #search > div > #ires > #rso > #flun ! ! Elemhide rules (invalid) ! ! TODO: Make it invalid ##invalid_selector { invalid part of it } example.org,example.com|test.com##valid_selector example.org,123,test.com##valid_selector пример.рф##banner |example.org##banner ! ! ExtCss rules (valid) ! example.org#?#banner example.org,example.com#@?#banner example.org#$?#banner { display: none!important; } example.org#@$?#banner { display: none!important; } ! ! ExtCss rules (invalid) ! example.org#?#banner { invalid part of it } example.org,example.com|test.com#@?#banner |example.org#?#banner ! ! CSS rules (valid) ! #$#valid_style { position: absolute!important; } example.org#$#some_style { visibitility: hidden; } example.org,example.com,test.com#@$#valid_selector { visibitility: hidden; } aternos.org#$##detect { height: 1px!important; } ! ! CSS rules (invalid) ! #$#invalid_style dayt.se#$##synpit { height:1px!important; } example.org,example.com,test.com#$@#wrong_syntax { visibitility: hidden; } |example.org#$#banner { } ! ! Content-filtering rules (valid) ! $$script[id="hello"] example.org$$script[id="hello"][tag-content="hello"][max-length="hi"] example.org,example.com$@$script[id="hello"][tag-content="something"] example.org$$script ! ! Content-filtering rules (invalid) ! exam$$script[id="hello"] $$tag-name[id=value] $$tag-name[id=value $$div[id="value"]["val"="val"] ! ! JS rules rules (valid) ! #%#window.adblock = 1; example.org#@%#window.adblock = 1; example.org,hello.com#%#window.adblock = 1; nj.com#%#window.hello = 1; southwalesargus.co.uk#%#window.hello = 1; ! ! Scriptlets (AdGuard) ! example.org#%#//scriptlet('name') example.org#%#//scriptlet('name', '') example.org#%#//scriptlet('name', "") example.org#%#//scriptlet('name', 'param') example.org#%#//scriptlet("abort-on-property-read", "alert") example.com#%#//scriptlet('abort-current-inline-script', 'document.addEventListener', '/example|test/') example.com#%#//scriptlet("remove-class", 'branding', "div[class^=\"inner\"]") ! ! Scriptlets (uBO) ! example.org##+js(goyavelab-defuser.js) ze.tt##+js(addEventListener-defuser.js, /^(?:DOMContentLoaded|load)$/, =!0) lablue.*##+js(setTimeout-defuser.js, r(), 500) ! ! ABP snippets ! reuters.com#$#abort-current-inline-script String.fromCharCode 69bfbfdbe821fab7200e9613cab94c8b yandex.com#$#hide-if-contains ad li.serp-item 'li.serp-item div.label' zhlednito.cz#$#abort-on-property-read Aloader; abort-on-property-read ExoLoader; abort-on-property-read ExoLoader.serve facebook.com#$#hide-if-has-and-matches-style 'abbr .timestampContent' 'div[id^="hyperfeed_story_id_"]' 'div[id*="feed_subtitle_"] > span, div[id*="feed_subtitle_"] > s' '' 'display: none'; hide-if-contains /.*/ .ego_section 'a[href^="/ad__campaign/landing.php?"]'; hide-if-contains /.*/ .ego_section 'a[href^="/ad_campaign/landing.php?"]'; hide-if-contains /.*/ .ego_section 'a[href^="/ad___campaign/landing.php?"]' ! ! HTML filtering (uBO) ! express.de,giga.de,kicker.de##^script:has-text((window);) wetteronline.de##^script:has-text(runCount) finanzen.*##^script:has-text(Inject=!) ! ! $cookie rules ! $cookie=__cfduid $cookie=test,domain=example.org ||example.org^$cookie ||facebook.com^$third-party,cookie=c_user @@||example.org^$cookie=/regular_expression/ ||example.org^$cookie=NAME;maxAge=3600;sameSite=lax @@||example.org^$cookie ! ! $removeparam and $queryprune rules ! ||example.org^$removeparam ||example.org^$removeparam=test ||example.org^$removeparam=~test ||example.org^$removeparam=/^(test|test2)=/i ||example.org^$queryprune ||example.org^$queryprune=test ||example.org^$queryprune=~test ||example.org^$queryprune=/^(test|test2)=/i ! ! $removeheader rules ! ||destyy.com^$removeheader=request:user-agent ||utarget.ru/ranging/*/click/$removeheader=location $removeheader=location,domain=zannn.top|innal.top /games-pc.top\/forum\/(?!login.php)/$removeheader=location ! ! $stealth rules ! @@||example.org^$stealth @@||example.org^$stealth,domain=example.org ! ! DNS filtering modifiers ! ! $client @@||*^$client=127.0.0.1 ||example.org^$client=192.168.0.0/24 ||example.org^$client=~'Mary\'s\, John\'s\, and Boris\'s laptops',denyallow=example.org ||example.org^$client=~Mom|~Dad|Kids ! $ctag ||example.org^$ctag=device_pc|device_phone ||example.org^$ctag=~device_phone ! $dnstype ||example.org^$dnstype=AAAA ||example.org^$dnstype=~A|~CNAME ! $dnsrewrite ||example.com^$dnsrewrite=example.net ||example.com^$dnsrewrite=NOERROR;CNAME;example.net ||example.com^$dnsrewrite=NOERROR;A;1.2.3.4 ||example.com^$dnsrewrite=NOERROR;SVCB;32 example.com alpn=h3 ||example.com^$dnsrewrite=NXDOMAIN;; ! ! Cosmetic rules modifiers ! [$path=/test]##banner [$path=/test]#@#banner [$path=/test]#?#.banner [$path=/test]#@?#.banner [$path=/test]#$#banner { style: display: none!important; } [$path=/test]#@$#banner { style: display: none!important; } [$path=/test,app=com.google.search]##banner [$path=/test,domain=example.org]##banner [$path=/test]$$banner [$path=/test]example.org#%#//scriptlet('name', '') ! ! Cosmetic rules modifiers, invalid modifiers ! [$randommodifier=test]##banner ================================================ FILE: samples/Adobe Font Metrics/OpenSansCondensed-Bold.afm ================================================ StartFontMetrics 2.0 Comment Generated by FontForge 20170719 Comment Creation Date: Sun Jul 23 19:47:25 2017 FontName OpenSansCondensed-Bold FullName Open Sans Condensed Bold FamilyName Open Sans Condensed Weight Bold Notice (Digitized data copyright (c) 2010-2011, Google Corporation.) ItalicAngle 0 IsFixedPitch false UnderlinePosition -205 UnderlineThickness 102 Version 1.11 EncodingScheme ISO10646-1 FontBBox -667 -290 1046 1062 CapHeight 714 XHeight 544 Ascender 760 Descender -240 StartCharMetrics 939 C 32 ; WX 247 ; N space ; B 0 0 0 0 ; C 33 ; WX 270 ; N exclam ; B 54 -14 216 714 ; C 34 ; WX 445 ; N quotedbl ; B 59 456 388 714 ; C 35 ; WX 543 ; N numbersign ; B 20 0 525 714 ; C 36 ; WX 462 ; N dollar ; B 36 -59 427 760 ; C 37 ; WX 758 ; N percent ; B 30 -9 729 725 ; C 38 ; WX 581 ; N ampersand ; B 28 -10 572 725 ; C 39 ; WX 246 ; N quotesingle ; B 59 456 188 714 ; C -1 ; WX 462 ; N six.os ; B 36 -10 427 724 ; C -1 ; WX 420 ; N seven.os ; B 19 -170 402 544 ; C -1 ; WX 462 ; N eight.os ; B 35 -10 429 724 ; C -1 ; WX 461 ; N nine.os ; B 33 -182 424 564 ; C -1 ; WX 496 ; N g.alt ; B 36 -241 442 555 ; C -1 ; WX 496 ; N gcircumflex.alt ; B 36 -241 442 767 ; C -1 ; WX 496 ; N gbreve.alt ; B 36 -241 442 766 ; C -1 ; WX 496 ; N gdot.alt ; B 36 -241 442 756 ; C -1 ; WX 496 ; N gcommaaccent.alt ; B 36 -241 442 767 ; C -1 ; WX 0 ; N cyrotmarkcomb ; B -203 591 203 714 ; EndCharMetrics StartKernData StartKernPairs 15878 KPX quotedbl uni1ECA 20 KPX quotedbl uni1EC8 20 KPX quotedbl Idotaccent 20 KPX quotedbl Iogonek 20 KPX quotedbl Imacron 20 KPX quotedbl Idieresis 20 KPX quotedbl Icircumflex 20 KPX quotedbl Iacute 20 KPX quotedbl Igrave 20 KPX quotedbl I 20 KPX quotedbl uni1EF9 20 KPX quoteleft q -20 KPX quoteleft o -20 KPX quoteleft g -9 KPX quoteleft e -20 KPX quoteleft d -20 KPX quoteleft c -20 KPX quoteleft Z 20 KPX Delta C -9 KPX Delta A -20 KPX Delta question 20 KPX Delta period -41 KPX Delta comma -41 KPX Delta quotesingle 41 KPX Delta quotedbl 41 EndKernPairs EndKernData EndFontMetrics ================================================ FILE: samples/Adobe Font Metrics/SpecialElite.afm ================================================ StartFontMetrics 2.0 Comment Generated by FontForge 20170719 Comment Creation Date: Sun Jul 23 19:52:19 2017 FontName SpecialElite-Regular FullName Special Elite FamilyName Special Elite Weight Book Notice (Copyright (c) 2010 by Brian J. Bonislawsky DBA Astigmatic (AOETI). All rights reserved. Available under the Apache 2.0 licence.http://www.apache.org/licenses/LICENSE-2.0.html) ItalicAngle 0 IsFixedPitch false UnderlinePosition -133 UnderlineThickness 20 Version 1.000 EncodingScheme ISO10646-1 FontBBox -33 -322 1052 959 CapHeight 714 XHeight 487 Ascender 688 Descender -225 StartCharMetrics 371 C 32 ; WX 292 ; N space ; B 0 0 0 0 ; C 33 ; WX 276 ; N exclam ; B 73 0 207 702 ; C 34 ; WX 352 ; N quotedbl ; B 48 449 295 704 ; C 35 ; WX 554 ; N numbersign ; B 31 -2 524 713 ; C 36 ; WX 526 ; N dollar ; B 31 -201 498 919 ; C 37 ; WX 666 ; N percent ; B 32 -186 642 872 ; C 38 ; WX 676 ; N ampersand ; B 31 -5 645 705 ; C 39 ; WX 196 ; N quotesingle ; B 48 449 143 703 ; C 40 ; WX 279 ; N parenleft ; B 55 -71 243 757 ; C 41 ; WX 281 ; N parenright ; B 37 -59 229 770 ; C 42 ; WX 522 ; N asterisk ; B 32 276 493 707 ; C 43 ; WX 496 ; N plus ; B 29 131 465 560 ; C 44 ; WX 336 ; N comma ; B 39 -197 290 251 ; C 45 ; WX 636 ; N hyphen ; B 63 273 573 397 ; C 46 ; WX 349 ; N period ; B 52 -3 298 245 ; C 47 ; WX 557 ; N slash ; B 23 -41 536 760 ; C 48 ; WX 610 ; N zero ; B 55 0 560 720 ; C 49 ; WX 569 ; N one ; B 27 -12 572 712 ; C 50 ; WX 573 ; N two ; B 50 -25 541 680 ; C 51 ; WX 557 ; N three ; B 44 -25 514 694 ; C 52 ; WX 612 ; N four ; B 15 4 584 708 ; C 53 ; WX 537 ; N five ; B 47 0 505 690 ; C 54 ; WX 588 ; N six ; B 48 -10 548 707 ; C 55 ; WX 555 ; N seven ; B 15 -34 549 734 ; C 56 ; WX 598 ; N eight ; B 51 1 551 720 ; C 57 ; WX 584 ; N nine ; B 48 -2 539 715 ; C 58 ; WX 343 ; N colon ; B 51 -3 297 518 ; C 59 ; WX 328 ; N semicolon ; B 45 -197 297 518 ; C 60 ; WX 463 ; N less ; B 31 120 401 565 ; C 61 ; WX 636 ; N equal ; B 63 186 573 513 ; C 62 ; WX 463 ; N greater ; B 62 120 433 565 ; C 63 ; WX 470 ; N question ; B 34 2 442 729 ; C 64 ; WX 665 ; N at ; B 46 -4 618 680 ; C 65 ; WX 549 ; N A ; B -1 -16 550 703 ; C 66 ; WX 604 ; N B ; B 29 -6 557 704 ; C 67 ; WX 579 ; N C ; B 46 -13 531 700 ; C 68 ; WX 622 ; N D ; B 36 -17 579 713 ; C 69 ; WX 638 ; N E ; B 38 -16 587 691 ; C 70 ; WX 605 ; N F ; B 29 -9 595 709 ; C 71 ; WX 615 ; N G ; B 45 -3 586 710 ; C 72 ; WX 652 ; N H ; B 40 -20 622 690 ; C 73 ; WX 495 ; N I ; B 26 -24 469 710 ; C 74 ; WX 541 ; N J ; B 16 -3 539 703 ; C 75 ; WX 582 ; N K ; B 28 -5 584 711 ; C 76 ; WX 602 ; N L ; B 23 -14 583 718 ; C 77 ; WX 697 ; N M ; B 46 -10 655 704 ; C 78 ; WX 627 ; N N ; B 41 -15 595 700 ; C 79 ; WX 616 ; N O ; B 42 -30 574 702 ; C 80 ; WX 553 ; N P ; B 30 -12 527 689 ; C 81 ; WX 602 ; N Q ; B 42 -98 571 711 ; C 82 ; WX 636 ; N R ; B 14 -9 624 706 ; C 83 ; WX 588 ; N S ; B 51 -13 547 690 ; C 84 ; WX 594 ; N T ; B 25 1 564 707 ; C 85 ; WX 621 ; N U ; B 24 -6 611 710 ; C 86 ; WX 611 ; N V ; B -1 -15 614 726 ; C 87 ; WX 643 ; N W ; B 8 0 614 689 ; C 88 ; WX 582 ; N X ; B 3 -1 580 697 ; C 89 ; WX 561 ; N Y ; B -21 -2 562 719 ; C 90 ; WX 592 ; N Z ; B 49 -1 551 709 ; C 91 ; WX 312 ; N bracketleft ; B 85 -72 297 754 ; C 92 ; WX 557 ; N backslash ; B 21 -41 534 760 ; C 249 ; WX 639 ; N ugrave ; B 5 -28 624 679 ; C 250 ; WX 639 ; N uacute ; B 5 -28 624 682 ; C 251 ; WX 639 ; N ucircumflex ; B 5 -28 624 691 ; C 252 ; WX 639 ; N udieresis ; B 5 -28 624 649 ; C 253 ; WX 592 ; N yacute ; B 0 -232 596 666 ; C 254 ; WX 552 ; N thorn ; B -33 -221 512 699 ; C 255 ; WX 592 ; N ydieresis ; B 0 -232 596 643 ; C -1 ; WX 549 ; N Amacron ; B -1 -16 550 809 ; C -1 ; WX 565 ; N amacron ; B 38 -6 561 619 ; C -1 ; WX 549 ; N Abreve ; B -1 -16 550 890 ; C -1 ; WX 565 ; N abreve ; B 38 -6 561 686 ; C -1 ; WX 549 ; N Aogonek ; B -1 -138 589 703 ; C -1 ; WX 565 ; N aogonek ; B 38 -118 624 502 ; C -1 ; WX 579 ; N Cacute ; B 46 -13 531 900 ; C -1 ; WX 547 ; N cacute ; B 39 -22 506 693 ; C -1 ; WX 579 ; N Ccircumflex ; B 46 -13 531 890 ; C -1 ; WX 547 ; N ccircumflex ; B 39 -22 506 689 ; C -1 ; WX 579 ; N Cdotaccent ; B 46 -13 531 859 ; C -1 ; WX 547 ; N cdotaccent ; B 39 -22 506 657 ; C -1 ; WX 579 ; N Ccaron ; B 46 -13 531 918 ; C -1 ; WX 547 ; N ccaron ; B 39 -22 506 710 ; C -1 ; WX 622 ; N Dcaron ; B 36 -17 579 924 ; C -1 ; WX 750 ; N dcaron ; B 40 -26 716 704 ; C -1 ; WX 623 ; N Dcroat ; B 36 -17 580 713 ; C -1 ; WX 603 ; N dcroat ; B 40 -26 597 714 ; C -1 ; WX 638 ; N Emacron ; B 38 -16 587 798 ; C -1 ; WX 543 ; N emacron ; B 40 -23 501 616 ; C -1 ; WX 638 ; N Ebreve ; B 38 -16 587 876 ; C -1 ; WX 543 ; N ebreve ; B 40 -23 501 683 ; C -1 ; WX 638 ; N Edotaccent ; B 38 -16 587 848 ; C -1 ; WX 543 ; N edotaccent ; B 40 -23 501 659 ; C -1 ; WX 638 ; N Eogonek ; B 38 -113 610 691 ; C -1 ; WX 543 ; N eogonek ; B 40 -145 501 499 ; C -1 ; WX 638 ; N Ecaron ; B 38 -16 587 913 ; C -1 ; WX 543 ; N ecaron ; B 40 -23 501 714 ; C -1 ; WX 615 ; N Gcircumflex ; B 45 -3 586 906 ; C -1 ; WX 583 ; N gcircumflex ; B 42 -224 562 676 ; C -1 ; WX 615 ; N Gbreve ; B 45 -3 586 899 ; C -1 ; WX 583 ; N gbreve ; B 42 -224 562 667 ; C -1 ; WX 615 ; N Gdotaccent ; B 45 -3 586 871 ; C -1 ; WX 583 ; N gdotaccent ; B 42 -224 562 637 ; C -1 ; WX 615 ; N Gcommaaccent ; B 45 -253 586 710 ; C -1 ; WX 583 ; N gcommaaccent ; B 42 -224 562 734 ; C -1 ; WX 652 ; N Hcircumflex ; B 40 -20 622 897 ; C -1 ; WX 616 ; N hcircumflex ; B 5 -29 601 688 ; C -1 ; WX 652 ; N Hbar ; B 40 -20 622 690 ; C -1 ; WX 616 ; N hbar ; B 5 -29 601 683 ; C -1 ; WX 495 ; N Itilde ; B 26 -24 469 859 ; C -1 ; WX 568 ; N itilde ; B 36 -42 568 615 ; C -1 ; WX 495 ; N Imacron ; B 26 -24 469 819 ; C -1 ; WX 568 ; N imacron ; B 36 -42 568 585 ; C -1 ; WX 495 ; N Ibreve ; B 26 -24 469 901 ; C -1 ; WX 568 ; N ibreve ; B 36 -42 568 661 ; C -1 ; WX 495 ; N Iogonek ; B 26 -154 469 710 ; C -1 ; WX 568 ; N iogonek ; B 36 -149 568 674 ; C -1 ; WX 495 ; N Idotaccent ; B 26 -24 469 873 ; C -1 ; WX 568 ; N dotlessi ; B 36 -42 568 468 ; C -1 ; WX 1036 ; N IJ ; B 26 -24 1034 710 ; C -1 ; WX 983 ; N ij ; B 36 -236 913 683 ; C -1 ; WX 541 ; N Jcircumflex ; B 16 -3 539 913 ; C -1 ; WX 415 ; N jcircumflex ; B -12 -236 405 699 ; C -1 ; WX 582 ; N Kcommaaccent ; B 28 -253 584 711 ; C -1 ; WX 620 ; N kcommaaccent ; B 11 -253 600 683 ; C -1 ; WX 620 ; N kgreenlandic ; B 11 -28 600 482 ; C -1 ; WX 602 ; N Lacute ; B 23 -14 583 923 ; C -1 ; WX 540 ; N lacute ; B 4 -28 538 902 ; C -1 ; WX 602 ; N Lcommaaccent ; B 23 -267 583 718 ; C -1 ; WX 540 ; N lcommaaccent ; B 4 -267 538 682 ; C -1 ; WX 602 ; N Lcaron ; B 23 -14 583 794 ; C -1 ; WX 582 ; N lcaron ; B 4 -28 549 704 ; C -1 ; WX 781 ; N Ldot ; B 23 -14 748 718 ; C -1 ; WX 571 ; N ldotaccent ; B 4 -28 538 682 ; C -1 ; WX 603 ; N Lslash ; B 24 -14 584 718 ; C -1 ; WX 541 ; N lslash ; B 4 -28 538 682 ; C -1 ; WX 627 ; N Nacute ; B 41 -15 595 894 ; C -1 ; WX 632 ; N nacute ; B 32 -23 612 696 ; C -1 ; WX 627 ; N Ncommaaccent ; B 41 -268 595 700 ; C -1 ; WX 632 ; N ncommaaccent ; B 32 -268 612 491 ; C -1 ; WX 627 ; N Ncaron ; B 41 -15 595 900 ; C -1 ; WX 632 ; N ncaron ; B 32 -23 612 712 ; C -1 ; WX 815 ; N napostrophe ; B 34 -23 795 704 ; C -1 ; WX 627 ; N Eng ; B 41 -320 595 700 ; C -1 ; WX 605 ; N eng ; B 32 -322 534 491 ; C -1 ; WX 616 ; N Omacron ; B 42 -30 574 815 ; C -1 ; WX 583 ; N omacron ; B 40 -34 543 598 ; C -1 ; WX 616 ; N Obreve ; B 42 -30 574 891 ; C -1 ; WX 583 ; N obreve ; B 40 -34 543 675 ; C -1 ; WX 616 ; N Ohungarumlaut ; B 42 -30 574 907 ; C -1 ; WX 583 ; N ohungarumlaut ; B 40 -34 545 693 ; C -1 ; WX 1018 ; N OE ; B 42 -30 967 702 ; C -1 ; WX 958 ; N oe ; B 40 -34 916 499 ; C -1 ; WX 636 ; N Racute ; B 14 -9 624 910 ; C -1 ; WX 579 ; N racute ; B 28 -16 566 693 ; C -1 ; WX 636 ; N Rcommaaccent ; B 14 -268 624 706 ; C -1 ; WX 579 ; N rcommaaccent ; B 28 -272 566 495 ; C -1 ; WX 636 ; N Rcaron ; B 14 -9 624 927 ; C -1 ; WX 579 ; N rcaron ; B 28 -16 566 698 ; C -1 ; WX 588 ; N Sacute ; B 51 -13 547 900 ; C -1 ; WX 519 ; N sacute ; B 48 -31 481 713 ; C -1 ; WX 588 ; N Scircumflex ; B 51 -13 547 904 ; C -1 ; WX 519 ; N scircumflex ; B 48 -31 481 710 ; C -1 ; WX 588 ; N Scedilla ; B 51 -145 547 690 ; C -1 ; WX 519 ; N scedilla ; B 48 -145 481 496 ; C -1 ; WX 588 ; N Scaron ; B 51 -13 547 904 ; C -1 ; WX 519 ; N scaron ; B 48 -31 481 710 ; C -1 ; WX 594 ; N Tcommaaccent ; B 25 -263 564 707 ; C -1 ; WX 510 ; N tcommaaccent ; B 0 -282 488 694 ; C -1 ; WX 594 ; N Tcaron ; B 25 1 564 920 ; C -1 ; WX 713 ; N tcaron ; B 0 -34 680 704 ; C -1 ; WX 594 ; N Tbar ; B 25 1 564 707 ; C -1 ; WX 510 ; N tbar ; B 0 -34 488 694 ; C -1 ; WX 621 ; N Utilde ; B 24 -6 611 850 ; C -1 ; WX 638 ; N utilde ; B 5 -28 624 636 ; C -1 ; WX 621 ; N Umacron ; B 24 -6 611 811 ; C -1 ; WX 638 ; N umacron ; B 5 -28 624 587 ; C -1 ; WX 621 ; N Ubreve ; B 24 -6 611 888 ; C -1 ; WX 638 ; N ubreve ; B 5 -28 624 665 ; C -1 ; WX 621 ; N Uring ; B 24 -6 611 959 ; C -1 ; WX 638 ; N uring ; B 5 -28 624 738 ; C -1 ; WX 621 ; N Uhungarumlaut ; B 24 -6 611 918 ; C -1 ; WX 638 ; N uhungarumlaut ; B 5 -28 624 691 ; C -1 ; WX 621 ; N Uogonek ; B 24 -136 611 710 ; C -1 ; WX 638 ; N uogonek ; B 5 -147 671 487 ; C -1 ; WX 643 ; N Wcircumflex ; B 8 0 614 901 ; C -1 ; WX 678 ; N wcircumflex ; B 5 -10 674 685 ; C -1 ; WX 561 ; N Ycircumflex ; B -21 -2 562 934 ; C -1 ; WX 592 ; N ycircumflex ; B 0 -232 596 691 ; C -1 ; WX 561 ; N Ydieresis ; B -21 -2 562 885 ; C -1 ; WX 592 ; N Zacute ; B 49 -1 551 905 ; C -1 ; WX 528 ; N zacute ; B 45 -22 487 684 ; C -1 ; WX 592 ; N Zdotaccent ; B 49 -1 551 866 ; C -1 ; WX 528 ; N zdotaccent ; B 45 -22 487 632 ; C -1 ; WX 592 ; N Zcaron ; B 49 -1 551 917 ; C -1 ; WX 528 ; N zcaron ; B 45 -22 487 688 ; C -1 ; WX 915 ; N AEacute ; B -11 -16 864 904 ; C -1 ; WX 888 ; N aeacute ; B 38 -23 846 670 ; C -1 ; WX 617 ; N Oslashacute ; B 43 -41 574 912 ; C -1 ; WX 583 ; N oslashacute ; B 40 -73 543 697 ; C -1 ; WX 415 ; N dotlessj ; B -12 -236 344 478 ; C -1 ; WX 281 ; N circumflex ; B 0 558 282 746 ; C -1 ; WX 281 ; N caron ; B 0 558 282 746 ; C -1 ; WX 281 ; N breve ; B 0 585 282 746 ; C -1 ; WX 132 ; N dotaccent ; B 0 600 133 729 ; C -1 ; WX 214 ; N ring ; B 0 547 215 780 ; C -1 ; WX 211 ; N ogonek ; B 0 -145 212 13 ; C -1 ; WX 283 ; N tilde ; B 0 583 284 701 ; C -1 ; WX 352 ; N hungarumlaut ; B 0 591 353 763 ; C -1 ; WX 185 ; N uni0312 ; B 28 474 152 694 ; C -1 ; WX 185 ; N uni0315 ; B 38 470 162 690 ; C -1 ; WX 192 ; N uni0326 ; B 32 -253 156 -33 ; C -1 ; WX 666 ; N mu ; B 24 -219 643 487 ; C -1 ; WX 643 ; N Wgrave ; B 8 0 614 895 ; C -1 ; WX 678 ; N wgrave ; B 5 -10 674 688 ; C -1 ; WX 643 ; N Wacute ; B 8 0 614 898 ; C -1 ; WX 678 ; N wacute ; B 5 -10 674 682 ; C -1 ; WX 643 ; N Wdieresis ; B 8 0 614 868 ; C -1 ; WX 678 ; N wdieresis ; B 5 -10 674 649 ; C -1 ; WX 561 ; N Ygrave ; B -21 -2 562 900 ; C -1 ; WX 592 ; N ygrave ; B 0 -232 596 666 ; C -1 ; WX 611 ; N endash ; B 50 270 551 391 ; C -1 ; WX 1113 ; N emdash ; B 51 270 1052 391 ; C -1 ; WX 265 ; N quoteleft ; B 41 390 217 704 ; C -1 ; WX 264 ; N quoteright ; B 54 390 230 704 ; C -1 ; WX 274 ; N quotesinglbase ; B 46 -138 223 176 ; C -1 ; WX 470 ; N quotedblleft ; B 41 390 422 704 ; C -1 ; WX 469 ; N quotedblright ; B 54 390 436 704 ; C -1 ; WX 479 ; N quotedblbase ; B 46 -138 428 176 ; C -1 ; WX 389 ; N dagger ; B 30 -16 359 724 ; C -1 ; WX 396 ; N daggerdbl ; B 35 -16 364 728 ; C -1 ; WX 316 ; N bullet ; B 50 246 266 479 ; C -1 ; WX 1063 ; N ellipsis ; B 52 -3 1016 245 ; C -1 ; WX 897 ; N perthousand ; B 33 -230 873 828 ; C -1 ; WX 296 ; N guilsinglleft ; B 44 149 232 434 ; C -1 ; WX 295 ; N guilsinglright ; B 63 149 251 434 ; C -1 ; WX 486 ; N fraction ; B -11 -53 501 748 ; C -1 ; WX 732 ; N Euro ; B 31 71 683 590 ; C -1 ; WX 757 ; N trademark ; B 60 303 703 693 ; C -1 ; WX 585 ; N partialdiff ; B 36 -47 553 772 ; C -1 ; WX 564 ; N product ; B 26 -17 534 707 ; C -1 ; WX 577 ; N minus ; B 63 282 514 395 ; C -1 ; WX 565 ; N approxequal ; B 59 137 513 522 ; C -1 ; WX 593 ; N notequal ; B 44 71 554 644 ; C -1 ; WX 1041 ; N fi ; B 20 -42 1041 702 ; C -1 ; WX 1013 ; N fl ; B 20 -29 1011 702 ; C -1 ; WX 292 ; N .notdef ; B 0 0 0 0 ; C -1 ; WX 0 ; N .null ; B 0 0 0 0 ; C -1 ; WX 292 ; N nonmarkingreturn ; B 0 0 0 0 ; EndCharMetrics StartKernData StartKernPairs 6408 KPX quotedbl period -104 KPX quotedbl comma -103 KPX quotedbl Jcircumflex -34 KPX quotedbl Aogonek -31 KPX quotedbl Abreve -31 KPX quotedbl Amacron -31 KPX quotedbl AEacute -31 KPX quotedbl Aacute -31 KPX quotedbl Acircumflex -31 KPX quotedbl Atilde -31 KPX quotedbl Agrave -31 KPX quotedbl Aring -31 KPX quotedbl Adieresis -31 KPX quotedbl AE -31 KPX quotedbl J -34 KPX quotedbl A -31 KPX quotedbl quotedblbase -117 KPX quotedbl quotesinglbase -117 KPX quotedbl ellipsis -104 KPX quotedbl slash -73 KPX quotedbl ampersand -22 KPX quotedbl four -27 KPX ampersand Ycircumflex -40 KPX ampersand Ygrave -40 KPX ampersand Ydieresis -40 KPX ampersand Yacute -40 KPX ampersand Y -40 KPX ampersand V -36 KPX quotesingle period -97 KPX quotesingle comma -97 KPX quotesingle Jcircumflex -34 KPX quotesingle Aogonek -31 KPX quotesingle Abreve -31 KPX quotesingle Amacron -31 KPX hyphen T -28 KPX hyphen one -68 KPX hyphen B -25 KPX hyphen seven -56 KPX slash rcommaaccent -27 KPX slash ncommaaccent -29 KPX slash gcommaaccent -61 KPX slash Jcircumflex -29 KPX slash iogonek -26 KPX slash ibreve -26 KPX slash imacron -26 KPX slash itilde -26 KPX slash oslashacute -54 KPX slash nacute -29 KPX slash eng -29 KPX slash ncaron -29 KPX slash racute -27 KPX slash scedilla -43 KPX slash scircumflex -43 KPX slash sacute -43 KPX slash rcaron -27 KPX slash ohungarumlaut -54 KPX slash obreve -54 KPX slash omacron -54 KPX slash wgrave -23 KPX slash wcircumflex -23 KPX slash wdieresis -23 KPX slash wacute -23 KPX slash zdotaccent -41 KPX J ebreve -32 KPX J emacron -32 KPX J edieresis -32 KPX J ecircumflex -32 KPX J egrave -32 KPX J eacute -32 KPX J e -32 KPX J Aogonek -34 KPX J Abreve -34 KPX J Amacron -34 KPX J AEacute -34 KPX J Aacute -34 KPX J Acircumflex -34 KPX J Atilde -34 KPX J Agrave -34 KPX J Aring -34 KPX J Adieresis -34 KPX J AE -34 KPX J A -34 KPX J comma -29 KPX J period -30 KPX J v -29 KPX J hyphen -30 KPX J quotedblbase -34 KPX J quotesinglbase -34 KPX J guilsinglright -25 KPX J guilsinglleft -25 KPX J emdash -30 KPX J endash -30 KPX J guillemotright -25 KPX J guillemotleft -25 KPX J germandbls -36 KPX J ellipsis -30 KPX J slash -34 KPX J p -28 KPX J m -35 KPX J b 54 KPX K ycircumflex -60 KPX K ygrave -60 KPX K ydieresis -60 KPX K yacute -60 KPX K y -60 KPX K wgrave -36 KPX K wcircumflex -36 KPX K wdieresis -36 KPX K wacute -36 KPX K w -36 KPX K uogonek -25 KPX K uhungarumlaut -25 KPX K uring -25 KPX K ubreve -25 KPX K umacron -25 KPX K utilde -25 KPX K udieresis -25 KPX K ucircumflex -25 KPX K ugrave -25 KPX K uacute -25 KPX K u -25 KPX K q -23 KPX K oslashacute -28 KPX K ohungarumlaut -28 KPX K obreve -28 KPX K omacron -28 KPX K otilde -28 KPX K odieresis -28 KPX K ocircumflex -28 KPX K ograve -28 KPX K oacute -28 KPX K eth -28 KPX K oe -28 KPX K oslash -28 KPX K o -28 KPX K dcaron -24 KPX K d -24 KPX K ccaron -27 KPX K cdotaccent -27 KPX K ccircumflex -27 KPX K cacute -27 KPX K ccedilla -27 KPX K c -27 KPX K ecaron -27 KPX K eogonek -27 KPX K edotaccent -27 KPX K ebreve -27 KPX K emacron -27 KPX K edieresis -27 KPX K ecircumflex -27 KPX K egrave -27 KPX K eacute -27 KPX K e -27 KPX K v -49 KPX K hyphen -38 KPX K guilsinglleft -24 KPX K emdash -38 KPX K endash -38 KPX K guillemotleft -24 KPX K b 49 KPX L ycircumflex -36 KPX L ygrave -36 KPX L ydieresis -36 KPX L yacute -36 KPX L y -36 KPX L wgrave -23 KPX L wcircumflex -23 KPX L wdieresis -23 KPX L wacute -23 KPX L w -23 KPX L V -43 KPX L Tcommaaccent -36 KPX L Tbar -36 KPX L Tcaron -36 KPX L T -36 KPX L quoteright -49 KPX L v -32 KPX L quoteleft -54 KPX L quotedblright -49 KPX L quotedblleft -54 KPX L trademark -29 KPX L backslash -50 KPX L asterisk -30 KPX trademark Aring -24 KPX trademark Adieresis -24 KPX trademark Yacute 29 KPX trademark AE -24 KPX trademark Y 29 KPX trademark A -24 KPX trademark b 31 EndKernPairs EndKernData EndFontMetrics ================================================ FILE: samples/Adobe Font Metrics/lambda.afm ================================================ StartFontMetrics 2.0 Comment Generated by FontForge 20170719 Comment Creation Date: Sun Jul 23 23:14:02 2017 FontName Greek_Lambda_Character-Regular FullName Greek_Lambda_Character Regular FamilyName Greek_Lambda_Character Weight Regular Notice (NONE. NADA. PUBLIC DOMAIN, BOI) ItalicAngle 0 IsFixedPitch false UnderlinePosition -175 UnderlineThickness 90 Version 020.017 EncodingScheme ISO10646-1 FontBBox 33 -177 566 760 StartCharMetrics 5 C 13 ; WX 602 ; N uni000D ; B 0 0 0 0 ; C 32 ; WX 602 ; N space ; B 0 0 0 0 ; C -1 ; WX 602 ; N lambda ; B 33 0 566 760 ; C -1 ; WX 602 ; N .notdef ; B 50 -177 551 706 ; C -1 ; WX 0 ; N NULL ; B 0 0 0 0 ; EndCharMetrics EndFontMetrics ================================================ FILE: samples/Agda/NatCat.agda ================================================ module NatCat where open import Relation.Binary.PropositionalEquality -- If you can show that a relation only ever has one inhabitant -- you get the category laws for free module EasyCategory (obj : Set) (_⟶_ : obj → obj → Set) (_∘_ : ∀ {x y z} → x ⟶ y → y ⟶ z → x ⟶ z) (id : ∀ x → x ⟶ x) (single-inhabitant : (x y : obj) (r s : x ⟶ y) → r ≡ s) where idʳ : ∀ x y (r : x ⟶ y) → r ∘ id y ≡ r idʳ x y r = single-inhabitant x y (r ∘ id y) r idˡ : ∀ x y (r : x ⟶ y) → id x ∘ r ≡ r idˡ x y r = single-inhabitant x y (id x ∘ r) r ∘-assoc : ∀ w x y z (r : w ⟶ x) (s : x ⟶ y) (t : y ⟶ z) → (r ∘ s) ∘ t ≡ r ∘ (s ∘ t) ∘-assoc w x y z r s t = single-inhabitant w z ((r ∘ s) ∘ t) (r ∘ (s ∘ t)) open import Data.Nat same : (x y : ℕ) (r s : x ≤ y) → r ≡ s same .0 y z≤n z≤n = refl same .(suc m) .(suc n) (s≤s {m} {n} r) (s≤s s) = cong s≤s (same m n r s) ≤-trans : ∀ x y z → x ≤ y → y ≤ z → x ≤ z ≤-trans .0 y z z≤n s = z≤n ≤-trans .(suc m) .(suc n) .(suc n₁) (s≤s {m} {n} r) (s≤s {.n} {n₁} s) = s≤s (≤-trans m n n₁ r s) ≤-refl : ∀ x → x ≤ x ≤-refl zero = z≤n ≤-refl (suc x) = s≤s (≤-refl x) module Nat-EasyCategory = EasyCategory ℕ _≤_ (λ {x}{y}{z} → ≤-trans x y z) ≤-refl same ================================================ FILE: samples/Aiken/multi.ak ================================================ use aiken/builtin use aiken/bytearray use aiken/dict use aiken/hash.{blake2b_256} use aiken/list use aiken/transaction.{ InlineDatum, Input, Output, ScriptContext, Spend, Transaction, } as tx use aiken/transaction/credential.{Address, PaymentCredential, ScriptCredential} use aiken/transaction/value type Action { Mint(Int) Burn } type SpendTokenName = ByteArray validator(creator: ByteArray) { fn redeem( // Each spend input checks for a token name matching the datum being burned datum: SpendTokenName, _r: Data, ctx: ScriptContext, ) { let ScriptContext { transaction, purpose } = ctx let Transaction { inputs, mint, .. } = transaction expect Spend(own_ref) = purpose expect Some(own_input) = list.find(inputs, fn(input) { input.output_reference == own_ref }) let Input { output: Output { address: Address { payment_credential, .. }, .. }, .. } = own_input expect ScriptCredential(own_validator_hash) = payment_credential ( mint |> value.from_minted_value |> value.quantity_of(own_validator_hash, datum) ) == -1 } fn gift_card(rdmr: Action, ctx: ScriptContext) -> Bool { // get values from transaction and purpose let ScriptContext { transaction, purpose } = ctx expect tx.Mint(policy_id) = purpose let Transaction { inputs, mint, extra_signatories, outputs, .. } = transaction let minted_assets = mint |> value.from_minted_value |> value.tokens(policy_id) |> dict.to_pairs() when rdmr is { Mint(total) -> { expect [input, ..] = inputs // Base is created from serializing a utxo ref being spent. Thus this guarantees a unique base let base = builtin.serialise_data(input.output_reference) // Create a list of expected token names let expected_minted_token_names = create_expected_minted_nfts(base, total, []) // Check contract creator is a signer of this tx let signature_check = list.any(extra_signatories, fn(n) { creator == n }) // Support multiple gift card creation by allowing a // 'number of tokens minted' == 'outputs with datum being token name' signature_check && check_mint_and_outputs( minted_assets, outputs, expected_minted_token_names, ScriptCredential(policy_id), ) } Burn -> list.all( minted_assets, fn(asset) { let Pair(_, amount) = asset amount == -1 }, ) } } } fn insert(self: List, e: a, compare: fn(a, a) -> Ordering) -> List { when self is { [] -> [e] [x, ..xs] -> if compare(e, x) == Less { [e, ..self] } else { [x, ..insert(xs, e, compare)] } } } // Check each minted token name is in the expected list, has quantity of 1, // and has a corresponding ouput with datum containing token name. // Otherwise fail fn check_mint_and_outputs( minted_assets: Pairs, outputs: List, expected_assets: List, validator_cred: PaymentCredential, ) -> Bool { when minted_assets is { [] -> True [Pair(minted_asset_name, quantity), ..rest_assets] -> { expect list.any( expected_assets, fn(expected_asset) { expected_asset == minted_asset_name }, ) expect list.any( outputs, fn(output) { let Output { address, datum, .. } = output datum == InlineDatum(minted_asset_name) && address.payment_credential == validator_cred }, ) quantity == 1 && check_mint_and_outputs( rest_assets, outputs, expected_assets, validator_cred, ) } } } fn create_expected_minted_nfts( base: ByteArray, counter: Int, accum: List, ) -> List { if counter == 0 { accum } else { let token_name = blake2b_256(bytearray.push(base, counter)) let accum = [token_name, ..accum] create_expected_minted_nfts(base, counter - 1, accum) } } ================================================ FILE: samples/Aiken/oneshot.ak ================================================ use aiken/dict use aiken/list use aiken/transaction.{OutputReference, ScriptContext, Transaction} as tx use aiken/transaction/value type Action { Mint Burn } validator(token_name: ByteArray, utxo_ref: OutputReference) { fn gift_card(rdmr: Action, ctx: ScriptContext) -> Bool { let ScriptContext { transaction, purpose } = ctx expect tx.Mint(policy_id) = purpose let Transaction { inputs, mint, .. } = transaction expect [Pair(asset_name, amount)] = mint |> value.from_minted_value |> value.tokens(policy_id) |> dict.to_pairs() when rdmr is { Mint -> { expect Some(_input) = list.find(inputs, fn(input) { input.output_reference == utxo_ref }) amount == 1 && asset_name == token_name } Burn -> amount == -1 && asset_name == token_name } } } validator(token_name: ByteArray, policy_id: ByteArray) { fn redeem(_d: Data, _r: Data, ctx: ScriptContext) -> Bool { let ScriptContext { transaction, .. } = ctx let Transaction { mint, .. } = transaction expect [Pair(asset_name, amount)] = mint |> value.from_minted_value |> value.tokens(policy_id) |> dict.to_pairs() amount == -1 && asset_name == token_name } } ================================================ FILE: samples/Aiken/tunav2.ak ================================================ use aiken/builtin use aiken/bytearray use aiken/dict use aiken/hash.{blake2b_256, sha2_256} use aiken/interval.{Finite, Interval, IntervalBound} use aiken/list use aiken/math.{pow2} use aiken/merkle_patricia_forestry.{Proof, from_root, insert} use aiken/transaction.{ InlineDatum, Mint, Output, ScriptContext, Spend, Transaction, } as tx use aiken/transaction/credential.{Address, Inline, ScriptCredential} use aiken/transaction/value.{from_minted_value} use fortuna use fortuna/parameters.{ epoch_number, halving_number, initial_payout, miner_threshold, miner_voting_period, supply_threshold, vote_threshold, } use fortuna/types.{ BurnToken, FinalizeNomination, Genesis, MineTuna, Mining, NominateUpgrade, Nominated, Redeem, Statev2, TunaAction, TunaUpgradeProcess, VotingToken, } use fortuna/utils.{get_inline_datum, integer_to_bytes, resolve_output_reference} use fortunav2.{ big_tuna_length, counter_length, expect_first, flip_hash, genesis_v2, quantity_of, tokens, vote, voting_period, } use hardfork.{calculate_emission} use hardfork/hftypes.{Lock, NftForkAction} type TunaSpendAction { TokenVoteFor TokenVoteAgainst MinerVoteFor { output_index: Int, block_number: Int } TransitionState { block_number: Int } } type Miner { Pkh(ByteArray, Data) Nft { policy: ByteArray, name: ByteArray, output_index: Int, extra: Data } } type MineAction { MinePow(ByteArray, Miner, Proof) Upgrade } type TargetState { nonce: ByteArray, miner: ByteArray, block_number: Int, current_hash: ByteArray, leading_zeros: Int, target_number: Int, epoch_time: Int, } validator(tunav2_minting_policy: ByteArray) { fn mine(datum: Statev2, redeemer: MineAction, ctx: ScriptContext) -> Bool { when redeemer is { MinePow(nonce, miner, merkle_proof_list) -> { let Statev2 { block_number, current_hash, leading_zeros, target_number, epoch_time, current_posix_time, merkle_root, } = datum let ScriptContext { transaction, purpose } = ctx expect Spend(own_reference) = purpose let Transaction { inputs, outputs, validity_range, .. } = transaction let Output { address: in_address, value: in_value, .. } = resolve_output_reference(inputs, own_reference) expect ScriptCredential(own_script_hash) = in_address.payment_credential // Spend(0) requirement: Contract has only one output with the master token going back to itself expect Some(own_output) = list.find( outputs, fn(output: Output) { output.address == in_address }, ) let Output { datum: out_datum, value: out_value, .. } = own_output // Time Range Span is 3 minutes or less // We have a constant expectation of the transaction time range expect Interval { upper_bound: IntervalBound { bound_type: Finite(upper_range), is_inclusive: upper_is_inclusive, }, lower_bound: IntervalBound { bound_type: Finite(lower_range), is_inclusive: lower_is_inclusive, }, } = validity_range let averaged_current_time = ( upper_range - lower_range ) / 2 + lower_range let serialized_miner = builtin.serialise_data(miner) // Target state now includes a miner credential let target = TargetState { nonce, block_number, epoch_time, current_hash, leading_zeros, target_number, miner: blake2b_256(serialized_miner), } let found_bytearray = target |> builtin.serialise_data() |> sha2_256() |> sha2_256() let (found_target_number, found_leading_zeros) = fortuna.format_found_bytearray(found_bytearray) // Check output datum contains correct epoch time, block number, hash, and leading zeros // Check for every divisible by 2016 block: // - Epoch time resets // - leading zeros is adjusted based on percent of hardcoded target time for 2016 blocks vs epoch time // Spend(8) requirement: Expect Output Datum to be of type Statev2 expect Statev2 { epoch_time: out_epoch_time, block_number: out_block_number, current_hash: out_current_hash, leading_zeros: out_leading_zeros, target_number: out_target_number, current_posix_time: out_current_posix_time, merkle_root: out_merkle, }: Statev2 = get_inline_datum(out_datum) let block_number_as_bytes = integer_to_bytes(out_block_number, "") let expected_output_value = value.from_asset( tunav2_minting_policy, bytearray.concat(fortunav2.big_tuna_prefix, own_script_hash), 1, ) |> value.add( tunav2_minting_policy, bytearray.concat( fortunav2.counter_prefix, block_number_as_bytes, ), 1, ) and { // Posix time is in milliseconds // Spend(1) requirement: Time range span is 3 minutes or less and inclusive !upper_is_inclusive, lower_is_inclusive, upper_range - lower_range <= 180000, // In case you are wondering here is what enables pools // A miner can be a pkh or an nft // Nfts can come from any input, even validators // So any validator logic can be enforced to run along with fortuna // Spend(2) requirement: Validate miner is made the tx when miner is { Pkh(signer, _) -> list.has(transaction.extra_signatories, signer) Nft { policy: nft_policy, name: nft_name, output_index, .. } -> { let quantity = utils.list_at(outputs, output_index).value |> value.to_dict |> dict.to_pairs |> quantity_of(nft_policy, nft_name) quantity == 1 } }, // Mining Difficulty Met // Spend(3) requirement: Found difficulty is less than or equal to the current difficulty // We do this by checking the leading zeros and the difficulty number or { found_leading_zeros > leading_zeros, and { found_leading_zeros == leading_zeros, found_target_number < target_number, }, }, // Spend(4) requirement: Input has master token quantity_of( in_value |> value.to_dict |> dict.to_pairs, tunav2_minting_policy, bytearray.concat(fortunav2.big_tuna_prefix, own_script_hash), ) == 1, // Spend(7) requirement: Output has same tokens as input expected_output_value == value.without_lovelace(out_value), // Spend(9) requirement: Check output has correct difficulty number, leading zeros, and epoch time if block_number % epoch_number == 0 && block_number > 0 { // use total epoch time with target epoch time to get difficulty adjustment ratio // ratio maxes out at 4/1 and mins to 1/4 let total_epoch_time = epoch_time + averaged_current_time - current_posix_time let (adjustment_numerator, adjustment_denominator) = fortuna.get_difficulty_adjustment(total_epoch_time) // Now use ratio to find new leading zeros difficulty let (new_difficulty, new_leading_zeroes) = fortuna.get_new_difficulty( target_number, leading_zeros, adjustment_numerator, adjustment_denominator, ) and { new_leading_zeroes == out_leading_zeros, new_difficulty == out_target_number, 0 == out_epoch_time, } } else { let new_epoch_time = epoch_time + averaged_current_time - current_posix_time and { leading_zeros == out_leading_zeros, target_number == out_target_number, new_epoch_time == out_epoch_time, } }, // Spend(10) requirement: Output posix time is the averaged current time out_current_posix_time == averaged_current_time, // Spend(11) requirement: Output block number is the input block number + 1 block_number + 1 == out_block_number, // Spend(12) requirement: Output current hash is the found hash out_current_hash == found_bytearray, // Spend(13) requirement: Check output merkle is correct insert( merkle_root |> from_root, found_bytearray |> blake2b_256, found_bytearray, merkle_proof_list, ) == from_root(out_merkle), // Spend(14) requirement: Data size doesn't exceed 1/4 tx size serialized_miner |> builtin.length_of_bytearray() |> builtin.less_than_equals_integer(4096), builtin.length_of_bytearray(nonce) <= 32, } } Upgrade -> { let ScriptContext { transaction, purpose } = ctx expect Spend(own_reference) = purpose let Transaction { redeemers, inputs, .. } = transaction let Output { address, value, .. } = resolve_output_reference(inputs, own_reference) let upgrade_rdmr = expect_first(redeemers, Mint(tunav2_minting_policy)) expect FinalizeNomination { .. }: TunaAction = upgrade_rdmr expect ScriptCredential(spend_hash) = address.payment_credential let name = bytearray.concat(fortunav2.big_tuna_prefix, spend_hash) value.quantity_of(value, tunav2_minting_policy, name) == 1 } } } } ================================================ FILE: samples/Alloy/file_system.als ================================================ module examples/systems/file_system /* * Model of a generic file system. */ abstract sig Object {} sig Name {} sig File extends Object {} { some d: Dir | this in d.entries.contents } sig Dir extends Object { entries: set DirEntry, parent: lone Dir } { parent = this.~@contents.~@entries all e1, e2 : entries | e1.name = e2.name => e1 = e2 this !in this.^@parent this != Root => Root in this.^@parent } one sig Root extends Dir {} { no parent } lone sig Cur extends Dir {} sig DirEntry { name: Name, contents: Object } { one this.~entries } /** * all directories besides root have one parent */ pred OneParent_buggyVersion { all d: Dir - Root | one d.parent } /** * all directories besides root have one parent */ pred OneParent_correctVersion { all d: Dir - Root | (one d.parent && one contents.d) } /** * Only files may be linked (that is, have more than one entry) * That is, all directories are the contents of at most one directory entry */ pred NoDirAliases { all o: Dir | lone o.~contents } check { OneParent_buggyVersion => NoDirAliases } for 5 expect 1 check { OneParent_correctVersion => NoDirAliases } for 5 expect 0 ================================================ FILE: samples/Alloy/marksweepgc.als ================================================ module examples/systems/marksweepgc /* * Model of mark and sweep garbage collection. */ // a node in the heap sig Node {} sig HeapState { left, right : Node -> lone Node, marked : set Node, freeList : lone Node } pred clearMarks[hs, hs' : HeapState] { // clear marked set no hs'.marked // left and right fields are unchanged hs'.left = hs.left hs'.right = hs.right } /** * simulate the recursion of the mark() function using transitive closure */ fun reachable[hs: HeapState, n: Node] : set Node { n + n.^(hs.left + hs.right) } pred mark[hs: HeapState, from : Node, hs': HeapState] { hs'.marked = hs.reachable[from] hs'.left = hs.left hs'.right = hs.right } /** * complete hack to simulate behavior of code to set freeList */ pred setFreeList[hs, hs': HeapState] { // especially hackish hs'.freeList.*(hs'.left) in (Node - hs.marked) all n: Node | (n !in hs.marked) => { no hs'.right[n] hs'.left[n] in (hs'.freeList.*(hs'.left)) n in hs'.freeList.*(hs'.left) } else { hs'.left[n] = hs.left[n] hs'.right[n] = hs.right[n] } hs'.marked = hs.marked } pred GC[hs: HeapState, root : Node, hs': HeapState] { some hs1, hs2: HeapState | hs.clearMarks[hs1] && hs1.mark[root, hs2] && hs2.setFreeList[hs'] } assert Soundness1 { all h, h' : HeapState, root : Node | h.GC[root, h'] => (all live : h.reachable[root] | { h'.left[live] = h.left[live] h'.right[live] = h.right[live] }) } assert Soundness2 { all h, h' : HeapState, root : Node | h.GC[root, h'] => no h'.reachable[root] & h'.reachable[h'.freeList] } assert Completeness { all h, h' : HeapState, root : Node | h.GC[root, h'] => (Node - h'.reachable[root]) in h'.reachable[h'.freeList] } check Soundness1 for 3 expect 0 check Soundness2 for 3 expect 0 check Completeness for 3 expect 0 ================================================ FILE: samples/Alloy/views.als ================================================ module examples/systems/views /* * Model of views in object-oriented programming. * * Two object references, called the view and the backing, * are related by a view mechanism when changes to the * backing are automatically propagated to the view. Note * that the state of a view need not be a projection of the * state of the backing; the keySet method of Map, for * example, produces two view relationships, and for the * one in which the map is modified by changes to the key * set, the value of the new map cannot be determined from * the key set. Note that in the iterator view mechanism, * the iterator is by this definition the backing object, * since changes are propagated from iterator to collection * and not vice versa. Oddly, a reference may be a view of * more than one backing: there can be two iterators on the * same collection, eg. A reference cannot be a view under * more than one view type. * * A reference is made dirty when it is a backing for a view * with which it is no longer related by the view invariant. * This usually happens when a view is modified, either * directly or via another backing. For example, changing a * collection directly when it has an iterator invalidates * it, as does changing the collection through one iterator * when there are others. * * More work is needed if we want to model more closely the * failure of an iterator when its collection is invalidated. * * As a terminological convention, when there are two * complementary view relationships, we will give them types * t and t'. For example, KeySetView propagates from map to * set, and KeySetView' propagates from set to map. * * author: Daniel Jackson */ open util/ordering[State] as so open util/relation as rel sig Ref {} sig Object {} -- t->b->v in views when v is view of type t of backing b -- dirty contains refs that have been invalidated sig State { refs: set Ref, obj: refs -> one Object, views: ViewType -> refs -> refs, dirty: set refs -- , anyviews: Ref -> Ref -- for visualization } -- {anyviews = ViewType.views} sig Map extends Object { keys: set Ref, map: keys -> one Ref }{all s: State | keys + Ref.map in s.refs} sig MapRef extends Ref {} fact {State.obj[MapRef] in Map} sig Iterator extends Object { left, done: set Ref, lastRef: lone done }{all s: State | done + left + lastRef in s.refs} sig IteratorRef extends Ref {} fact {State.obj[IteratorRef] in Iterator} sig Set extends Object { elts: set Ref }{all s: State | elts in s.refs} sig SetRef extends Ref {} fact {State.obj[SetRef] in Set} abstract sig ViewType {} one sig KeySetView, KeySetView', IteratorView extends ViewType {} fact ViewTypes { State.views[KeySetView] in MapRef -> SetRef State.views[KeySetView'] in SetRef -> MapRef State.views[IteratorView] in IteratorRef -> SetRef all s: State | s.views[KeySetView] = ~(s.views[KeySetView']) } /** * mods is refs modified directly or by view mechanism * doesn't handle possibility of modifying an object and its view at once? * should we limit frame conds to non-dirty refs? */ pred modifies [pre, post: State, rs: set Ref] { let vr = pre.views[ViewType], mods = rs.*vr { all r: pre.refs - mods | pre.obj[r] = post.obj[r] all b: mods, v: pre.refs, t: ViewType | b->v in pre.views[t] => viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]] post.dirty = pre.dirty + {b: pre.refs | some v: Ref, t: ViewType | b->v in pre.views[t] && !viewFrame [t, pre.obj[v], post.obj[v], post.obj[b]] } } } pred allocates [pre, post: State, rs: set Ref] { no rs & pre.refs post.refs = pre.refs + rs } /** * models frame condition that limits change to view object from v to v' when backing object changes to b' */ pred viewFrame [t: ViewType, v, v', b': Object] { t in KeySetView => v'.elts = dom [b'.map] t in KeySetView' => b'.elts = dom [v'.map] t in KeySetView' => (b'.elts) <: (v.map) = (b'.elts) <: (v'.map) t in IteratorView => v'.elts = b'.left + b'.done } pred MapRef.keySet [pre, post: State, setRefs: SetRef] { post.obj[setRefs].elts = dom [pre.obj[this].map] modifies [pre, post, none] allocates [pre, post, setRefs] post.views = pre.views + KeySetView->this->setRefs + KeySetView'->setRefs->this } pred MapRef.put [pre, post: State, k, v: Ref] { post.obj[this].map = pre.obj[this].map ++ k->v modifies [pre, post, this] allocates [pre, post, none] post.views = pre.views } pred SetRef.iterator [pre, post: State, iterRef: IteratorRef] { let i = post.obj[iterRef] { i.left = pre.obj[this].elts no i.done + i.lastRef } modifies [pre,post,none] allocates [pre, post, iterRef] post.views = pre.views + IteratorView->iterRef->this } pred IteratorRef.remove [pre, post: State] { let i = pre.obj[this], i' = post.obj[this] { i'.left = i.left i'.done = i.done - i.lastRef no i'.lastRef } modifies [pre,post,this] allocates [pre, post, none] pre.views = post.views } pred IteratorRef.next [pre, post: State, ref: Ref] { let i = pre.obj[this], i' = post.obj[this] { ref in i.left i'.left = i.left - ref i'.done = i.done + ref i'.lastRef = ref } modifies [pre, post, this] allocates [pre, post, none] pre.views = post.views } pred IteratorRef.hasNext [s: State] { some s.obj[this].left } assert zippishOK { all ks, vs: SetRef, m: MapRef, ki, vi: IteratorRef, k, v: Ref | let s0=so/first, s1=so/next[s0], s2=so/next[s1], s3=so/next[s2], s4=so/next[s3], s5=so/next[s4], s6=so/next[s5], s7=so/next[s6] | ({ precondition [s0, ks, vs, m] no s0.dirty ks.iterator [s0, s1, ki] vs.iterator [s1, s2, vi] ki.hasNext [s2] vi.hasNext [s2] ki.this/next [s2, s3, k] vi.this/next [s3, s4, v] m.put [s4, s5, k, v] ki.remove [s5, s6] vi.remove [s6, s7] } => no State.dirty) } pred precondition [pre: State, ks, vs, m: Ref] { // all these conditions and other errors discovered in scope of 6 but 8,3 // in initial state, must have view invariants hold (all t: ViewType, b, v: pre.refs | b->v in pre.views[t] => viewFrame [t, pre.obj[v], pre.obj[v], pre.obj[b]]) // sets are not aliases -- ks != vs // sets are not views of map -- no (ks+vs)->m & ViewType.pre.views // no iterator currently on either set -- no Ref->(ks+vs) & ViewType.pre.views } check zippishOK for 6 but 8 State, 3 ViewType expect 1 /** * experiment with controlling heap size */ fact {all s: State | #s.obj < 5} ================================================ FILE: samples/Alpine Abuild/filenames/APKBUILD ================================================ # Contributor: Natanael Copa # Maintainer: Natanael Copa pkgname=abuild pkgver=2.27.0 _ver=${pkgver%_git*} pkgrel=0 pkgdesc="Script to build Alpine Packages" url="http://git.alpinelinux.org/cgit/abuild/" arch="all" license="GPL2" depends="fakeroot sudo pax-utils openssl apk-tools>=2.0.7-r1 libc-utils attr tar pkgconf patch" if [ "$CBUILD" = "$CHOST" ]; then depends="$depends curl" fi makedepends_build="pkgconfig" makedepends_host="openssl-dev" makedepends="$makedepends_host $makedepends_build" install="$pkgname.pre-install $pkgname.pre-upgrade" subpackages="apkbuild-cpan:cpan apkbuild-gem-resolver:gems" options="suid" pkggroups="abuild" source="http://dev.alpinelinux.org/archive/abuild/abuild-$_ver.tar.xz " _builddir="$srcdir/$pkgname-$_ver" prepare() { cd "$_builddir" for i in $source; do case $i in *.patch) msg "Applying $i" patch -p1 -i "$srcdir"/$i || return 1 ;; esac done sed -i -e "/^CHOST=/s/=.*/=$CHOST/" abuild.conf } build() { cd "$_builddir" make || return 1 } package() { cd "$_builddir" make install DESTDIR="$pkgdir" || return 1 install -m 644 abuild.conf "$pkgdir"/etc/abuild.conf || return 1 install -d -m 775 -g abuild "$pkgdir"/var/cache/distfiles || return 1 } cpan() { pkgdesc="Script to generate perl APKBUILD from CPAN" depends="perl perl-libwww perl-json" arch="noarch" mkdir -p "$subpkgdir"/usr/bin mv "$pkgdir"/usr/bin/apkbuild-cpan "$subpkgdir"/usr/bin/ } gems() { pkgdesc="APKBUILD dependency resolver for RubyGems" depends="ruby ruby-augeas" arch="noarch" mkdir -p "$subpkgdir"/usr/bin mv "$pkgdir"/usr/bin/apkbuild-gem-resolver "$subpkgdir"/usr/bin/ } md5sums="c67e4c971c54b4d550e16db3ba331f96 abuild-2.27.0.tar.xz" sha256sums="c8db017e3dd168edb20ceeb91971535cf66b8c95f29d3288f88ac755bffc60e5 abuild-2.27.0.tar.xz" sha512sums="98e1da4e47f3ab68700b3bc992c83e103f770f3196e433788ee74145f57cd33e5239c87f0a7a15f7266840d5bad893fc8c0d4c826d663df53deaee2678c56984 abuild-2.27.0.tar.xz" ================================================ FILE: samples/Altium Designer/Sample Altium Project.PrjPcb ================================================ [Design] Version=1.0 HierarchyMode=0 ChannelRoomNamingStyle=0 ReleasesFolder= ChannelDesignatorFormatString=$Component_$RoomName ChannelRoomLevelSeperator=_ OpenOutputs=1 ArchiveProject=0 TimestampOutput=0 SeparateFolders=0 TemplateLocationPath= PinSwapBy_Netlabel=1 PinSwapBy_Pin=1 AllowPortNetNames=0 AllowSheetEntryNetNames=1 AppendSheetNumberToLocalNets=0 NetlistSinglePinNets=0 DefaultConfiguration=Sources UserID=0xFFFFFFFF DefaultPcbProtel=1 DefaultPcbPcad=0 ReorderDocumentsOnCompile=1 NameNetsHierarchically=0 PowerPortNamesTakePriority=0 PushECOToAnnotationFile=1 DItemRevisionGUID= ReportSuppressedErrorsInMessages=0 FSMCodingStyle=eFMSDropDownList_OneProcess FSMEncodingStyle=eFMSDropDownList_OneHot OutputPath= LogFolderPath= ManagedProjectGUID= IncludeDesignInRelease=0 [Preferences] PrefsVaultGUID= PrefsRevisionGUID= [Document1] DocumentPath=Sample Schematic Sheet.SchDoc AnnotationEnabled=1 AnnotateStartValue=1 AnnotationIndexControlEnabled=0 AnnotateSuffix= AnnotateScope=All AnnotateOrder=0 DoLibraryUpdate=1 DoDatabaseUpdate=1 ClassGenCCAutoEnabled=1 ClassGenCCAutoRoomEnabled=1 ClassGenNCAutoScope=None DItemRevisionGUID= GenerateClassCluster=0 DocumentUniqueId=VUNWLVBI [Document2] DocumentPath=Sample Board Design.PcbDoc AnnotationEnabled=1 AnnotateStartValue=1 AnnotationIndexControlEnabled=0 AnnotateSuffix= AnnotateScope=All AnnotateOrder=-1 DoLibraryUpdate=1 DoDatabaseUpdate=1 ClassGenCCAutoEnabled=1 ClassGenCCAutoRoomEnabled=1 ClassGenNCAutoScope=None DItemRevisionGUID= GenerateClassCluster=0 DocumentUniqueId=NAXMKXNP [Document3] DocumentPath=Sample Output Job.OutJob AnnotationEnabled=1 AnnotateStartValue=1 AnnotationIndexControlEnabled=0 AnnotateSuffix= AnnotateScope=All AnnotateOrder=-1 DoLibraryUpdate=1 DoDatabaseUpdate=1 ClassGenCCAutoEnabled=1 ClassGenCCAutoRoomEnabled=1 ClassGenNCAutoScope=None DItemRevisionGUID= GenerateClassCluster=0 DocumentUniqueId= [Configuration1] Name=Sources ParameterCount=0 ConstraintFileCount=0 ReleaseItemId= Variant=[No Variations] OutputJobsCount=0 ContentTypeGUID=CB6F2064-E317-11DF-B822-12313F0024A2 ConfigurationType=Source [OutputGroup1] Name=Netlist Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=CadnetixNetlist OutputName1=Cadnetix Netlist OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 OutputType2=CalayNetlist OutputName2=Calay Netlist OutputDocumentPath2= OutputVariantName2= OutputDefault2=0 OutputType3=EDIF OutputName3=EDIF for PCB OutputDocumentPath3= OutputVariantName3= OutputDefault3=0 OutputType4=EESofNetlist OutputName4=EESof Netlist OutputDocumentPath4= OutputVariantName4= OutputDefault4=0 OutputType5=IntergraphNetlist OutputName5=Intergraph Netlist OutputDocumentPath5= OutputVariantName5= OutputDefault5=0 OutputType6=MentorBoardStationNetlist OutputName6=Mentor BoardStation Netlist OutputDocumentPath6= OutputVariantName6= OutputDefault6=0 OutputType7=MultiWire OutputName7=MultiWire OutputDocumentPath7= OutputVariantName7= OutputDefault7=0 OutputType8=OrCadPCB2Netlist OutputName8=Orcad/PCB2 Netlist OutputDocumentPath8= OutputVariantName8= OutputDefault8=0 OutputType9=PADSNetlist OutputName9=PADS ASCII Netlist OutputDocumentPath9= OutputVariantName9= OutputDefault9=0 OutputType10=Pcad OutputName10=Pcad for PCB OutputDocumentPath10= OutputVariantName10= OutputDefault10=0 OutputType11=PCADNetlist OutputName11=PCAD Netlist OutputDocumentPath11= OutputVariantName11= OutputDefault11=0 OutputType12=PCADnltNetlist OutputName12=PCADnlt Netlist OutputDocumentPath12= OutputVariantName12= OutputDefault12=0 OutputType13=Protel2Netlist OutputName13=Protel2 Netlist OutputDocumentPath13= OutputVariantName13= OutputDefault13=0 OutputType14=ProtelNetlist OutputName14=Protel OutputDocumentPath14= OutputVariantName14= OutputDefault14=0 OutputType15=RacalNetlist OutputName15=Racal Netlist OutputDocumentPath15= OutputVariantName15= OutputDefault15=0 OutputType16=RINFNetlist OutputName16=RINF Netlist OutputDocumentPath16= OutputVariantName16= OutputDefault16=0 OutputType17=SciCardsNetlist OutputName17=SciCards Netlist OutputDocumentPath17= OutputVariantName17= OutputDefault17=0 OutputType18=TangoNetlist OutputName18=Tango Netlist OutputDocumentPath18= OutputVariantName18= OutputDefault18=0 OutputType19=TelesisNetlist OutputName19=Telesis Netlist OutputDocumentPath19= OutputVariantName19= OutputDefault19=0 OutputType20=WireListNetlist OutputName20=WireList Netlist OutputDocumentPath20= OutputVariantName20= OutputDefault20=0 [OutputGroup2] Name=Simulator Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 [OutputGroup3] Name=Documentation Outputs Description= TargetPrinter=Virtual Printer PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=Composite OutputName1=Composite Drawing OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType2=PCB 3D Print OutputName2=PCB 3D Print OutputDocumentPath2= OutputVariantName2=[No Variations] OutputDefault2=0 PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType3=PCB 3D Video OutputName3=PCB 3D Video OutputDocumentPath3= OutputVariantName3=[No Variations] OutputDefault3=0 PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType4=PCB Print OutputName4=PCB Prints OutputDocumentPath4= OutputVariantName4= OutputDefault4=0 PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType5=PCBDrawing OutputName5=Draftsman OutputDocumentPath5= OutputVariantName5=[No Variations] OutputDefault5=0 PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType6=PCBLIB Print OutputName6=PCBLIB Prints OutputDocumentPath6= OutputVariantName6= OutputDefault6=0 PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType7=PDF3D OutputName7=PDF3D OutputDocumentPath7= OutputVariantName7=[No Variations] OutputDefault7=0 PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType8=Report Print OutputName8=Report Prints OutputDocumentPath8= OutputVariantName8= OutputDefault8=0 PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType9=Schematic Print OutputName9=Schematic Prints OutputDocumentPath9= OutputVariantName9= OutputDefault9=0 PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType10=SimView Print OutputName10=SimView Prints OutputDocumentPath10= OutputVariantName10= OutputDefault10=0 PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 [OutputGroup4] Name=Assembly Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=Assembly OutputName1=Assembly Drawings OutputDocumentPath1= OutputVariantName1=[No Variations] OutputDefault1=0 PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType2=Pick Place OutputName2=Generates pick and place files OutputDocumentPath2= OutputVariantName2=[No Variations] OutputDefault2=0 OutputType3=Test Points For Assembly OutputName3=Test Point Report OutputDocumentPath3= OutputVariantName3=[No Variations] OutputDefault3=0 [OutputGroup5] Name=Fabrication Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=Board Stack Report OutputName1=Report Board Stack OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType2=CompositeDrill OutputName2=Composite Drill Drawing OutputDocumentPath2= OutputVariantName2= OutputDefault2=0 PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType3=Drill OutputName3=Drill Drawing/Guides OutputDocumentPath3= OutputVariantName3= OutputDefault3=0 PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType4=Final OutputName4=Final Artwork Prints OutputDocumentPath4= OutputVariantName4=[No Variations] OutputDefault4=0 PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType5=Gerber OutputName5=Gerber Files OutputDocumentPath5= OutputVariantName5=[No Variations] OutputDefault5=0 OutputType6=Gerber X2 OutputName6=Gerber X2 Files OutputDocumentPath6= OutputVariantName6= OutputDefault6=0 OutputType7=IPC2581 OutputName7=IPC-2581 Files OutputDocumentPath7= OutputVariantName7= OutputDefault7=0 OutputType8=Mask OutputName8=Solder/Paste Mask Prints OutputDocumentPath8= OutputVariantName8= OutputDefault8=0 PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType9=NC Drill OutputName9=NC Drill Files OutputDocumentPath9= OutputVariantName9= OutputDefault9=0 OutputType10=ODB OutputName10=ODB++ Files OutputDocumentPath10= OutputVariantName10=[No Variations] OutputDefault10=0 OutputType11=Plane OutputName11=Power-Plane Prints OutputDocumentPath11= OutputVariantName11= OutputDefault11=0 PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType12=Test Points OutputName12=Test Point Report OutputDocumentPath12= OutputVariantName12= OutputDefault12=0 [OutputGroup6] Name=Report Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=BOM_PartType OutputName1=Bill of Materials OutputDocumentPath1= OutputVariantName1=[No Variations] OutputDefault1=0 PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType2=ComponentCrossReference OutputName2=Component Cross Reference Report OutputDocumentPath2= OutputVariantName2=[No Variations] OutputDefault2=0 OutputType3=ReportHierarchy OutputName3=Report Project Hierarchy OutputDocumentPath3= OutputVariantName3=[No Variations] OutputDefault3=0 OutputType4=Script OutputName4=Script Output OutputDocumentPath4= OutputVariantName4=[No Variations] OutputDefault4=0 OutputType5=SimpleBOM OutputName5=Simple BOM OutputDocumentPath5= OutputVariantName5=[No Variations] OutputDefault5=0 OutputType6=SinglePinNetReporter OutputName6=Report Single Pin Nets OutputDocumentPath6= OutputVariantName6=[No Variations] OutputDefault6=0 [OutputGroup7] Name=Other Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=Text Print OutputName1=Text Print OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType2=Text Print OutputName2=Text Print OutputDocumentPath2= OutputVariantName2= OutputDefault2=0 PageOptions2=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType3=Text Print OutputName3=Text Print OutputDocumentPath3= OutputVariantName3= OutputDefault3=0 PageOptions3=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType4=Text Print OutputName4=Text Print OutputDocumentPath4= OutputVariantName4= OutputDefault4=0 PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType5=Text Print OutputName5=Text Print OutputDocumentPath5= OutputVariantName5= OutputDefault5=0 PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType6=Text Print OutputName6=Text Print OutputDocumentPath6= OutputVariantName6= OutputDefault6=0 PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType7=Text Print OutputName7=Text Print OutputDocumentPath7= OutputVariantName7= OutputDefault7=0 PageOptions7=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType8=Text Print OutputName8=Text Print OutputDocumentPath8= OutputVariantName8= OutputDefault8=0 PageOptions8=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType9=Text Print OutputName9=Text Print OutputDocumentPath9= OutputVariantName9= OutputDefault9=0 PageOptions9=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType10=Text Print OutputName10=Text Print OutputDocumentPath10= OutputVariantName10= OutputDefault10=0 PageOptions10=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType11=Text Print OutputName11=Text Print OutputDocumentPath11= OutputVariantName11= OutputDefault11=0 PageOptions11=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType12=Text Print OutputName12=Text Print OutputDocumentPath12= OutputVariantName12= OutputDefault12=0 PageOptions12=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType13=Text Print OutputName13=Text Print OutputDocumentPath13= OutputVariantName13= OutputDefault13=0 PageOptions13=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType14=Text Print OutputName14=Text Print OutputDocumentPath14= OutputVariantName14= OutputDefault14=0 PageOptions14=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType15=Text Print OutputName15=Text Print OutputDocumentPath15= OutputVariantName15= OutputDefault15=0 PageOptions15=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType16=Text Print OutputName16=Text Print OutputDocumentPath16= OutputVariantName16= OutputDefault16=0 PageOptions16=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType17=Text Print OutputName17=Text Print OutputDocumentPath17= OutputVariantName17= OutputDefault17=0 PageOptions17=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType18=Text Print OutputName18=Text Print OutputDocumentPath18= OutputVariantName18= OutputDefault18=0 PageOptions18=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType19=Text Print OutputName19=Text Print OutputDocumentPath19= OutputVariantName19= OutputDefault19=0 PageOptions19=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType20=Text Print OutputName20=Text Print OutputDocumentPath20= OutputVariantName20= OutputDefault20=0 PageOptions20=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType21=Text Print OutputName21=Text Print OutputDocumentPath21= OutputVariantName21= OutputDefault21=0 PageOptions21=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType22=Text Print OutputName22=Text Print OutputDocumentPath22= OutputVariantName22= OutputDefault22=0 PageOptions22=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType23=Text Print OutputName23=Text Print OutputDocumentPath23= OutputVariantName23= OutputDefault23=0 PageOptions23=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType24=Text Print OutputName24=Text Print OutputDocumentPath24= OutputVariantName24= OutputDefault24=0 PageOptions24=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType25=Text Print OutputName25=Text Print OutputDocumentPath25= OutputVariantName25= OutputDefault25=0 PageOptions25=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType26=Text Print OutputName26=Text Print OutputDocumentPath26= OutputVariantName26= OutputDefault26=0 PageOptions26=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType27=Text Print OutputName27=Text Print OutputDocumentPath27= OutputVariantName27= OutputDefault27=0 PageOptions27=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType28=Text Print OutputName28=Text Print OutputDocumentPath28= OutputVariantName28= OutputDefault28=0 PageOptions28=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType29=Text Print OutputName29=Text Print OutputDocumentPath29= OutputVariantName29= OutputDefault29=0 PageOptions29=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 [OutputGroup8] Name=Validation Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=BOM_Violations OutputName1=BOM Checks Report OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 OutputType2=Component states check OutputName2=Server's components states check OutputDocumentPath2= OutputVariantName2= OutputDefault2=0 OutputType3=Configuration compliance OutputName3=Environment configuration compliance check OutputDocumentPath3= OutputVariantName3= OutputDefault3=0 OutputType4=Design Rules Check OutputName4=Design Rules Check OutputDocumentPath4= OutputVariantName4= OutputDefault4=0 PageOptions4=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType5=Differences Report OutputName5=Differences Report OutputDocumentPath5= OutputVariantName5= OutputDefault5=0 PageOptions5=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType6=Electrical Rules Check OutputName6=Electrical Rules Check OutputDocumentPath6= OutputVariantName6= OutputDefault6=0 PageOptions6=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 OutputType7=Footprint Comparison Report OutputName7=Footprint Comparison Report OutputDocumentPath7= OutputVariantName7= OutputDefault7=0 [OutputGroup9] Name=Export Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=AutoCAD dwg/dxf PCB OutputName1=AutoCAD dwg/dxf File PCB OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 OutputType2=AutoCAD dwg/dxf Schematic OutputName2=AutoCAD dwg/dxf File Schematic OutputDocumentPath2= OutputVariantName2= OutputDefault2=0 OutputType3=ExportIDF OutputName3=Export IDF OutputDocumentPath3= OutputVariantName3= OutputDefault3=0 OutputType4=ExportPARASOLID OutputName4=Export PARASOLID OutputDocumentPath4= OutputVariantName4=[No Variations] OutputDefault4=0 OutputType5=ExportSTEP OutputName5=Export STEP OutputDocumentPath5= OutputVariantName5=[No Variations] OutputDefault5=0 OutputType6=ExportVRML OutputName6=Export VRML OutputDocumentPath6= OutputVariantName6=[No Variations] OutputDefault6=0 OutputType7=MBAExportPARASOLID OutputName7=Export PARASOLID OutputDocumentPath7= OutputVariantName7= OutputDefault7=0 OutputType8=MBAExportSTEP OutputName8=Export STEP OutputDocumentPath8= OutputVariantName8= OutputDefault8=0 OutputType9=Save As/Export PCB OutputName9=Save As/Export PCB OutputDocumentPath9= OutputVariantName9= OutputDefault9=0 OutputType10=Save As/Export Schematic OutputName10=Save As/Export Schematic OutputDocumentPath10= OutputVariantName10= OutputDefault10=0 OutputType11=Specctra Design PCB OutputName11=Specctra Design PCB OutputDocumentPath11= OutputVariantName11= OutputDefault11=0 [OutputGroup10] Name=PostProcess Outputs Description= TargetPrinter=Adobe PDF PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputType1=Copy Files OutputName1=Copy Files OutputDocumentPath1= OutputVariantName1= OutputDefault1=0 [Modification Levels] Type1=1 Type2=1 Type3=1 Type4=1 Type5=1 Type6=1 Type7=1 Type8=1 Type9=1 Type10=1 Type11=1 Type12=1 Type13=1 Type14=1 Type15=1 Type16=1 Type17=1 Type18=1 Type19=1 Type20=1 Type21=1 Type22=1 Type23=1 Type24=1 Type25=1 Type26=1 Type27=1 Type28=1 Type29=1 Type30=1 Type31=1 Type32=1 Type33=1 Type34=1 Type35=1 Type36=1 Type37=1 Type38=1 Type39=1 Type40=1 Type41=1 Type42=1 Type43=1 Type44=1 Type45=1 Type46=1 Type47=1 Type48=1 Type49=1 Type50=1 Type51=1 Type52=1 Type53=1 Type54=1 Type55=1 Type56=1 Type57=1 Type58=1 Type59=1 Type60=1 Type61=1 Type62=1 Type63=1 Type64=1 Type65=1 Type66=1 Type67=1 Type68=1 Type69=1 Type70=1 Type71=1 Type72=1 Type73=1 Type74=1 Type75=1 Type76=1 Type77=1 Type78=1 Type79=1 Type80=1 Type81=1 Type82=1 Type83=1 Type84=1 Type85=1 Type86=1 Type87=1 Type88=1 Type89=1 Type90=1 Type91=1 Type92=1 Type93=1 Type94=1 Type95=1 Type96=1 Type97=1 Type98=1 Type99=1 Type100=1 Type101=1 Type102=1 Type103=1 Type104=1 Type105=1 Type106=1 Type107=1 Type108=1 Type109=1 Type110=1 Type111=1 Type112=1 Type113=1 Type114=1 Type115=1 Type116=1 Type117=1 [Difference Levels] Type1=1 Type2=1 Type3=1 Type4=1 Type5=1 Type6=1 Type7=1 Type8=1 Type9=1 Type10=1 Type11=1 Type12=1 Type13=1 Type14=1 Type15=1 Type16=1 Type17=1 Type18=1 Type19=1 Type20=1 Type21=1 Type22=1 Type23=1 Type24=1 Type25=1 Type26=1 Type27=1 Type28=1 Type29=1 Type30=1 Type31=1 Type32=1 Type33=1 Type34=1 Type35=1 Type36=1 Type37=1 Type38=1 Type39=1 Type40=1 Type41=1 Type42=1 Type43=1 Type44=1 Type45=1 Type46=1 Type47=1 Type48=1 Type49=1 Type50=1 Type51=1 Type52=1 Type53=1 Type54=1 Type55=1 Type56=1 Type57=1 Type58=1 Type59=1 Type60=1 Type61=1 Type62=1 Type63=1 Type64=1 Type65=1 Type66=1 [Electrical Rules Check] Type1=1 Type2=1 Type3=2 Type4=1 Type5=2 Type6=2 Type7=1 Type8=1 Type9=1 Type10=1 Type11=2 Type12=2 Type13=2 Type14=1 Type15=1 Type16=1 Type17=1 Type18=1 Type19=1 Type20=1 Type21=1 Type22=1 Type23=1 Type24=1 Type25=2 Type26=2 Type27=2 Type28=1 Type29=1 Type30=1 Type31=1 Type32=2 Type33=2 Type34=2 Type35=1 Type36=2 Type37=1 Type38=2 Type39=2 Type40=2 Type41=0 Type42=2 Type43=1 Type44=1 Type45=2 Type46=1 Type47=2 Type48=2 Type49=1 Type50=2 Type51=1 Type52=1 Type53=1 Type54=1 Type55=1 Type56=2 Type57=1 Type58=1 Type59=2 Type60=1 Type61=2 Type62=2 Type63=1 Type64=0 Type65=2 Type66=3 Type67=2 Type68=2 Type69=2 Type70=2 Type71=2 Type72=2 Type73=2 Type74=1 Type75=2 Type76=1 Type77=1 Type78=1 Type79=1 Type80=2 Type81=3 Type82=3 Type83=3 Type84=3 Type85=3 Type86=2 Type87=2 Type88=2 Type89=1 Type90=1 Type91=3 Type92=3 Type93=2 Type94=2 Type95=2 Type96=2 Type97=2 Type98=0 Type99=1 Type100=2 Type101=1 Type102=2 Type103=2 Type104=1 Type105=2 Type106=2 Type107=2 Type108=2 Type109=1 Type110=1 Type111=1 Type112=1 Type113=1 Type114=2 Type115=2 Type116=2 Type117=3 Type118=3 Type119=3 MultiChannelAlternate=2 AlternateItemFail=3 Type122=2 [ERC Connection Matrix] L1=NNNNNNNNNNNWNNNWW L2=NNWNNNNWWWNWNWNWN L3=NWEENEEEENEWNEEWN L4=NNENNNWEENNWNENWN L5=NNNNNNNNNNNNNNNNN L6=NNENNNNEENNWNENWN L7=NNEWNNWEENNWNENWN L8=NWEENEENEEENNEENN L9=NWEENEEEENEWNEEWW L10=NWNNNNNENNEWNNEWN L11=NNENNNNEEENWNENWN L12=WWWWNWWNWWWNWWWNN L13=NNNNNNNNNNNWNNNWW L14=NWEENEEEENEWNEEWW L15=NNENNNNEEENWNENWW L16=WWWWNWWNWWWNWWWNW L17=WNNNNNNNWNNNWWWWN [Annotate] SortOrder=3 SortLocation=0 MatchParameter1=Comment MatchStrictly1=1 MatchParameter2=Library Reference MatchStrictly2=1 PhysicalNamingFormat=$Component_$RoomName GlobalIndexSortOrder=3 GlobalIndexSortLocation=0 [PrjClassGen] CompClassManualEnabled=0 CompClassManualRoomEnabled=0 NetClassAutoBusEnabled=1 NetClassAutoCompEnabled=0 NetClassAutoNamedHarnessEnabled=0 NetClassManualEnabled=1 NetClassSeparateForBusSections=0 [LibraryUpdateOptions] SelectedOnly=0 UpdateVariants=1 PartTypes=0 FullReplace=1 UpdateDesignatorLock=1 UpdatePartIDLock=1 PreserveParameterLocations=1 PreserveParameterVisibility=1 DoGraphics=1 DoParameters=1 DoModels=1 AddParameters=0 RemoveParameters=0 AddModels=1 RemoveModels=1 UpdateCurrentModels=1 [DatabaseUpdateOptions] SelectedOnly=0 UpdateVariants=1 PartTypes=0 [Comparison Options] ComparisonOptions0=Kind=Net|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 ComparisonOptions1=Kind=Net Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 ComparisonOptions2=Kind=Component Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 ComparisonOptions3=Kind=Rule|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 ComparisonOptions4=Kind=Differential Pair|MinPercent=50|MinMatch=1|ShowMatch=0|Confirm=0|UseName=0|InclAllRules=0 ComparisonOptions5=Kind=Structure Class|MinPercent=75|MinMatch=3|ShowMatch=-1|Confirm=-1|UseName=-1|InclAllRules=0 [SmartPDF] PageOptions=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 ================================================ FILE: samples/Altium Designer/Sample Board Design.PcbDoc ================================================ |RECORD=Board|SELECTION=FALSE|LAYER=UNKNOWN|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|FILENAME=D:\Desktop\Linguist Sample\Sample Board Design.$$$|KIND=Protel_Advanced_PCB|VERSION=5.01|DATE=5/27/2019|TIME=10:46:59 PM|ORIGINX=0mil|ORIGINY=0mil|BIGVISIBLEGRIDSIZE=0.000|VISIBLEGRIDSIZE=0.000|ELECTRICALGRIDRANGE=8mil|ELECTRICALGRIDENABLED=TRUE|SNAPGRIDSIZE=98425.196850|SNAPGRIDSIZEX=98425.196850|SNAPGRIDSIZEY=98425.196850|TRACKGRIDSIZE=200000.000000|VIAGRIDSIZE=200000.000000|COMPONENTGRIDSIZE=98425.196850|COMPONENTGRIDSIZEX=98425.196850|COMPONENTGRIDSIZEY=98425.196850|DOTGRID=TRUE|DISPLAYUNIT=0|DESIGNATORDISPLAYMODE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|PRIMITIVELOCK=TRUE|POLYGONTYPE=Polygon|POUROVER=FALSE|REMOVEDEAD=FALSE|GRIDSIZE=10mil|TRACKWIDTH=10mil|HATCHSTYLE=None|USEOCTAGONS=FALSE|MINPRIMLENGTH=3mil|KIND0=0|VX0=0mil|VY0=0mil|CX0=0mil|CY0=0mil|SA0= 0.00000000000000E+0000|EA0= 0.00000000000000E+0000|R0=0mil|KIND1=0|VX1=330.7087mil|VY1=0mil|CX1=0mil|CY1=0mil|SA1= 0.00000000000000E+0000|EA1= 0.00000000000000E+0000|R1=0mil|KIND2=0|VX2=330.7087mil|VY2=389.7638mil|CX2=0mil|CY2=0mil|SA2= 0.00000000000000E+0000|EA2= 0.00000000000000E+0000|R2=0mil|KIND3=0|VX3=0mil|VY3=389.7638mil|CX3=0mil|CY3=0mil|SA3= 0.00000000000000E+0000|EA3= 0.00000000000000E+0000|R3=0mil|KIND4=0|VX4=0mil|VY4=0mil|CX4=0mil|CY4=0mil|SA4= 0.00000000000000E+0000|EA4= 0.00000000000000E+0000|R4=0mil|SHELVED=FALSE|RESTORELAYER=UNKNOWN|RESTORENET=|REMOVEISLANDSBYAREA=TRUE|REMOVENECKS=TRUE|AREATHRESHOLD=250000000000.000000|ARCRESOLUTION=0.5mil|NECKWIDTHTHRESHOLD=5mil|POUROVERSTYLE=2|NAME=|POURINDEX=-1|IGNOREVIOLATIONS=FALSE|SPLITLINECOUNT=0|SHEETX=1000mil|SHEETY=1000mil|SHEETWIDTH=10000mil|SHEETHEIGHT=8000mil|SHOWSHEET=FALSE|LOCKSHEET=TRUE|PLANE1NETNAME=(No Net)|PLANE2NETNAME=(No Net)|PLANE3NETNAME=(No Net)|PLANE4NETNAME=(No Net)|PLANE5NETNAME=(No Net)|PLANE6NETNAME=(No Net)|PLANE7NETNAME=(No Net)|PLANE8NETNAME=(No Net)|PLANE9NETNAME=(No Net)|PLANE10NETNAME=(No Net)|PLANE11NETNAME=(No Net)|PLANE12NETNAME=(No Net)|PLANE13NETNAME=(No Net)|PLANE14NETNAME=(No Net)|PLANE15NETNAME=(No Net)|PLANE16NETNAME=(No Net) |RECORD=Board|V9_MASTERSTACK_STYLE=0|V9_MASTERSTACK_ID={6C6A7AEE-860E-42B8-A7B0-5A4F746E66B0}|V9_MASTERSTACK_NAME=Master layer stack|V9_MASTERSTACK_SHOWTOPDIELECTRIC=FALSE|V9_MASTERSTACK_SHOWBOTTOMDIELECTRIC=FALSE|V9_MASTERSTACK_ISFLEX=FALSE|V9_SUBSTACK0_ID={133D6234-F010-46C7-B390-43FBDD454A88}|V9_SUBSTACK0_NAME=Board Layer Stack|V9_SUBSTACK0_SHOWTOPDIELECTRIC=FALSE|V9_SUBSTACK0_SHOWBOTTOMDIELECTRIC=FALSE|V9_SUBSTACK0_ISFLEX=FALSE|V9_SUBSTACK0_SERVICE=FALSE|V9_SUBSTACK0_USEDBYPRIMS=FALSE|V9_SUBSTACK0_TYPE=1|V9_STACK_LAYER0_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER0_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER0_ID={30045540-1B4B-4001-AB64-318F70B47D5C}|V9_STACK_LAYER0_NAME=Top Paste|V9_STACK_LAYER0_LAYERID=16973832|V9_STACK_LAYER0_USEDBYPRIMS=FALSE|V9_STACK_LAYER1_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER1_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER1_ID={F22BABF4-3864-4478-9E30-F3A5F449D148}|V9_STACK_LAYER1_NAME=Top Overlay|V9_STACK_LAYER1_LAYERID=16973830|V9_STACK_LAYER1_USEDBYPRIMS=TRUE|V9_STACK_LAYER2_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER2_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER2_ID={5A303FD1-9A68-46E1-8805-901769ECECC7}|V9_STACK_LAYER2_NAME=Top Solder|V9_STACK_LAYER2_LAYERID=16973834|V9_STACK_LAYER2_USEDBYPRIMS=FALSE|V9_STACK_LAYER2_DIELTYPE=3|V9_STACK_LAYER2_DIELCONST=3.500|V9_STACK_LAYER2_DIELHEIGHT=0.4mil|V9_STACK_LAYER2_DIELMATERIAL=Solder Resist|V9_STACK_LAYER2_COVERLAY_EXPANSION=0mil|V9_STACK_LAYER3_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER3_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER3_ID={999DF18F-9048-469A-90BE-9E37DD83557B}|V9_STACK_LAYER3_NAME=Top Layer|V9_STACK_LAYER3_LAYERID=16777217|V9_STACK_LAYER3_USEDBYPRIMS=TRUE|V9_STACK_LAYER3_COPTHICK=1.4mil|V9_STACK_LAYER3_COMPONENTPLACEMENT=1|V9_STACK_LAYER4_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER4_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER4_ID={02BF3CDA-3C8F-4FAD-9742-9D994AE02F07}|V9_STACK_LAYER4_NAME=Dielectric 1|V9_STACK_LAYER4_LAYERID=17039361|V9_STACK_LAYER4_USEDBYPRIMS=FALSE|V9_STACK_LAYER4_DIELTYPE=0|V9_STACK_LAYER4_DIELCONST=4.800|V9_STACK_LAYER4_DIELHEIGHT=12.6mil|V9_STACK_LAYER4_DIELMATERIAL=FR-4|V9_STACK_LAYER5_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER5_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER5_ID={9A0521B6-9E50-4E7C-A183-D2BA2C61636A}|V9_STACK_LAYER5_NAME=Bottom Layer|V9_STACK_LAYER5_LAYERID=16842751|V9_STACK_LAYER5_USEDBYPRIMS=TRUE|V9_STACK_LAYER5_COPTHICK=1.4mil|V9_STACK_LAYER5_COMPONENTPLACEMENT=2|V9_STACK_LAYER6_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER6_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER6_ID={6089F658-C6F8-45EF-ADE9-00844D259BA3}|V9_STACK_LAYER6_NAME=Bottom Solder|V9_STACK_LAYER6_LAYERID=16973835|V9_STACK_LAYER6_USEDBYPRIMS=FALSE|V9_STACK_LAYER6_DIELTYPE=3|V9_STACK_LAYER6_DIELCONST=3.500|V9_STACK_LAYER6_DIELHEIGHT=0.4mil|V9_STACK_LAYER6_DIELMATERIAL=Solder Resist|V9_STACK_LAYER6_COVERLAY_EXPANSION=0mil|V9_STACK_LAYER7_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER7_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER7_ID={F336B23E-1435-4733-9ED3-34BDF2531FBF}|V9_STACK_LAYER7_NAME=Bottom Overlay|V9_STACK_LAYER7_LAYERID=16973831|V9_STACK_LAYER7_USEDBYPRIMS=FALSE|V9_STACK_LAYER8_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_STACK_LAYER8_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_STACK_LAYER8_ID={70A911C0-2DEF-47D0-84F8-E68892450F49}|V9_STACK_LAYER8_NAME=Bottom Paste|V9_STACK_LAYER8_LAYERID=16973833|V9_STACK_LAYER8_USEDBYPRIMS=FALSE|V9_CACHE_LAYER0_ID={5BD60229-8864-48D1-A8EB-95399348CB16}|V9_CACHE_LAYER0_NAME=Multi-Layer|V9_CACHE_LAYER0_LAYERID=16973839|V9_CACHE_LAYER0_USEDBYPRIMS=TRUE|V9_CACHE_LAYER1_ID={8070A95E-9307-4315-AEB7-3279CE2E13B1}|V9_CACHE_LAYER1_NAME=Connections|V9_CACHE_LAYER1_LAYERID=16973840|V9_CACHE_LAYER1_USEDBYPRIMS=FALSE|V9_CACHE_LAYER2_ID={7EB5AEF4-1A76-41D4-9E03-30A4837CD13B}|V9_CACHE_LAYER2_NAME=Background|V9_CACHE_LAYER2_LAYERID=16973841|V9_CACHE_LAYER2_USEDBYPRIMS=FALSE|V9_CACHE_LAYER3_ID={8102A625-DB52-4B32-89F5-EBC69CA6A514}|V9_CACHE_LAYER3_NAME=DRC Error Markers|V9_CACHE_LAYER3_LAYERID=16973842|V9_CACHE_LAYER3_USEDBYPRIMS=TRUE|V9_CACHE_LAYER4_ID={206DC379-9404-4C98-9A1A-8266C349DD4D}|V9_CACHE_LAYER4_NAME=DRC Detail Markers|V9_CACHE_LAYER4_LAYERID=16973850|V9_CACHE_LAYER4_USEDBYPRIMS=FALSE|V9_CACHE_LAYER5_ID={AA18D623-7F09-4267-BB86-AB16641CF2C7}|V9_CACHE_LAYER5_NAME=Selections|V9_CACHE_LAYER5_LAYERID=16973843|V9_CACHE_LAYER5_USEDBYPRIMS=FALSE|V9_CACHE_LAYER6_ID={C29197C8-F94E-4FA2-9DF0-092BF0692FD2}|V9_CACHE_LAYER6_NAME=Visible Grid 1|V9_CACHE_LAYER6_LAYERID=16973844|V9_CACHE_LAYER6_USEDBYPRIMS=FALSE|V9_CACHE_LAYER7_ID={CBB6B9C8-7C09-4943-BDF2-93A59B98F4D9}|V9_CACHE_LAYER7_NAME=Visible Grid 2|V9_CACHE_LAYER7_LAYERID=16973845|V9_CACHE_LAYER7_USEDBYPRIMS=FALSE|V9_CACHE_LAYER8_ID={DA4EDDDD-E049-49D0-BC05-78F97F6745B8}|V9_CACHE_LAYER8_NAME=Pad Holes|V9_CACHE_LAYER8_LAYERID=16973846|V9_CACHE_LAYER8_USEDBYPRIMS=FALSE|V9_CACHE_LAYER9_ID={A1D1422F-3445-48C1-AC9E-19016BB49E01}|V9_CACHE_LAYER9_NAME=Via Holes|V9_CACHE_LAYER9_LAYERID=16973847|V9_CACHE_LAYER9_USEDBYPRIMS=FALSE|V9_CACHE_LAYER10_ID={BD19B618-ECCD-4B7D-9162-6DD6573F7C3A}|V9_CACHE_LAYER10_NAME=Top Pad Master|V9_CACHE_LAYER10_LAYERID=16973848|V9_CACHE_LAYER10_USEDBYPRIMS=FALSE|V9_CACHE_LAYER11_ID={8FDE5189-A9FB-4D7C-9FC7-48B4DD5C87EE}|V9_CACHE_LAYER11_NAME=Bottom Pad Master|V9_CACHE_LAYER11_LAYERID=16973849|V9_CACHE_LAYER11_USEDBYPRIMS=FALSE|V9_CACHE_LAYER12_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER12_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER12_ID={30045540-1B4B-4001-AB64-318F70B47D5C}|V9_CACHE_LAYER12_NAME=Top Paste|V9_CACHE_LAYER12_LAYERID=16973832|V9_CACHE_LAYER12_USEDBYPRIMS=FALSE|V9_CACHE_LAYER13_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER13_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER13_ID={F22BABF4-3864-4478-9E30-F3A5F449D148}|V9_CACHE_LAYER13_NAME=Top Overlay|V9_CACHE_LAYER13_LAYERID=16973830|V9_CACHE_LAYER13_USEDBYPRIMS=TRUE|V9_CACHE_LAYER14_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER14_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER14_ID={5A303FD1-9A68-46E1-8805-901769ECECC7}|V9_CACHE_LAYER14_NAME=Top Solder|V9_CACHE_LAYER14_LAYERID=16973834|V9_CACHE_LAYER14_USEDBYPRIMS=FALSE|V9_CACHE_LAYER14_DIELTYPE=3|V9_CACHE_LAYER14_DIELCONST=3.500|V9_CACHE_LAYER14_DIELHEIGHT=0.4mil|V9_CACHE_LAYER14_DIELMATERIAL=Solder Resist|V9_CACHE_LAYER14_COVERLAY_EXPANSION=0mil|V9_CACHE_LAYER15_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER15_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER15_ID={999DF18F-9048-469A-90BE-9E37DD83557B}|V9_CACHE_LAYER15_NAME=Top Layer|V9_CACHE_LAYER15_LAYERID=16777217|V9_CACHE_LAYER15_USEDBYPRIMS=TRUE|V9_CACHE_LAYER15_COPTHICK=1.4mil|V9_CACHE_LAYER15_COMPONENTPLACEMENT=1|V9_CACHE_LAYER16_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER16_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER16_ID={02BF3CDA-3C8F-4FAD-9742-9D994AE02F07}|V9_CACHE_LAYER16_NAME=Dielectric 1|V9_CACHE_LAYER16_LAYERID=17039361|V9_CACHE_LAYER16_USEDBYPRIMS=FALSE|V9_CACHE_LAYER16_DIELTYPE=0|V9_CACHE_LAYER16_DIELCONST=4.800|V9_CACHE_LAYER16_DIELHEIGHT=12.6mil|V9_CACHE_LAYER16_DIELMATERIAL=FR-4|V9_CACHE_LAYER17_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER17_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER17_ID={9A0521B6-9E50-4E7C-A183-D2BA2C61636A}|V9_CACHE_LAYER17_NAME=Bottom Layer|V9_CACHE_LAYER17_LAYERID=16842751|V9_CACHE_LAYER17_USEDBYPRIMS=TRUE|V9_CACHE_LAYER17_COPTHICK=1.4mil|V9_CACHE_LAYER17_COMPONENTPLACEMENT=2|V9_CACHE_LAYER18_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER18_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER18_ID={6089F658-C6F8-45EF-ADE9-00844D259BA3}|V9_CACHE_LAYER18_NAME=Bottom Solder|V9_CACHE_LAYER18_LAYERID=16973835|V9_CACHE_LAYER18_USEDBYPRIMS=FALSE|V9_CACHE_LAYER18_DIELTYPE=3|V9_CACHE_LAYER18_DIELCONST=3.500|V9_CACHE_LAYER18_DIELHEIGHT=0.4mil|V9_CACHE_LAYER18_DIELMATERIAL=Solder Resist|V9_CACHE_LAYER18_COVERLAY_EXPANSION=0mil|V9_CACHE_LAYER19_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER19_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER19_ID={F336B23E-1435-4733-9ED3-34BDF2531FBF}|V9_CACHE_LAYER19_NAME=Bottom Overlay|V9_CACHE_LAYER19_LAYERID=16973831|V9_CACHE_LAYER19_USEDBYPRIMS=FALSE|V9_CACHE_LAYER20_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|V9_CACHE_LAYER20_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|V9_CACHE_LAYER20_ID={70A911C0-2DEF-47D0-84F8-E68892450F49}|V9_CACHE_LAYER20_NAME=Bottom Paste|V9_CACHE_LAYER20_LAYERID=16973833|V9_CACHE_LAYER20_USEDBYPRIMS=FALSE|V9_CACHE_LAYER21_ID={FE59785D-26D8-4FD6-B923-E760F7F077E3}|V9_CACHE_LAYER21_NAME=Mid-Layer 1|V9_CACHE_LAYER21_LAYERID=16777218|V9_CACHE_LAYER21_USEDBYPRIMS=FALSE|V9_CACHE_LAYER21_COPTHICK=1.4mil|V9_CACHE_LAYER21_COMPONENTPLACEMENT=0|V9_CACHE_LAYER22_ID={B0C8A7B9-8B54-4389-A841-FCF491AD93FD}|V9_CACHE_LAYER22_NAME=Mid-Layer 2|V9_CACHE_LAYER22_LAYERID=16777219|V9_CACHE_LAYER22_USEDBYPRIMS=FALSE|V9_CACHE_LAYER22_COPTHICK=1.4mil|V9_CACHE_LAYER22_COMPONENTPLACEMENT=0|V9_CACHE_LAYER23_ID={425D6245-4319-4AB4-8614-AA98CB532EFA}|V9_CACHE_LAYER23_NAME=Mid-Layer 3|V9_CACHE_LAYER23_LAYERID=16777220|V9_CACHE_LAYER23_USEDBYPRIMS=FALSE|V9_CACHE_LAYER23_COPTHICK=1.4mil|V9_CACHE_LAYER23_COMPONENTPLACEMENT=0|V9_CACHE_LAYER24_ID={0AD325F0-8A84-4540-A49A-ADFC2AE92297}|V9_CACHE_LAYER24_NAME=Mid-Layer 4|V9_CACHE_LAYER24_LAYERID=16777221|V9_CACHE_LAYER24_USEDBYPRIMS=FALSE|V9_CACHE_LAYER24_COPTHICK=1.4mil|V9_CACHE_LAYER24_COMPONENTPLACEMENT=0|V9_CACHE_LAYER25_ID={C0E851CA-CB15-4CAF-BAF8-31735E1371C2}|V9_CACHE_LAYER25_NAME=Mid-Layer 5|V9_CACHE_LAYER25_LAYERID=16777222|V9_CACHE_LAYER25_USEDBYPRIMS=FALSE|V9_CACHE_LAYER25_COPTHICK=1.4mil|V9_CACHE_LAYER25_COMPONENTPLACEMENT=0|V9_CACHE_LAYER26_ID={7BA573E3-F861-4805-B48E-6D01299949CD}|V9_CACHE_LAYER26_NAME=Mid-Layer 6|V9_CACHE_LAYER26_LAYERID=16777223|V9_CACHE_LAYER26_USEDBYPRIMS=FALSE|V9_CACHE_LAYER26_COPTHICK=1.4mil|V9_CACHE_LAYER26_COMPONENTPLACEMENT=0|V9_CACHE_LAYER27_ID={9872A474-005C-4AF4-9195-DF6C1E9663CF}|V9_CACHE_LAYER27_NAME=Mid-Layer 7|V9_CACHE_LAYER27_LAYERID=16777224|V9_CACHE_LAYER27_USEDBYPRIMS=FALSE|V9_CACHE_LAYER27_COPTHICK=1.4mil|V9_CACHE_LAYER27_COMPONENTPLACEMENT=0|V9_CACHE_LAYER28_ID={D6FE3646-74C7-4732-BEFC-A1A71FFD6EFB}|V9_CACHE_LAYER28_NAME=Mid-Layer 8|V9_CACHE_LAYER28_LAYERID=16777225|V9_CACHE_LAYER28_USEDBYPRIMS=FALSE|V9_CACHE_LAYER28_COPTHICK=1.4mil|V9_CACHE_LAYER28_COMPONENTPLACEMENT=0|V9_CACHE_LAYER29_ID={0C288C20-EE2F-482D-98BD-2981EAB84ADE}|V9_CACHE_LAYER29_NAME=Mid-Layer 9|V9_CACHE_LAYER29_LAYERID=16777226|V9_CACHE_LAYER29_USEDBYPRIMS=FALSE|V9_CACHE_LAYER29_COPTHICK=1.4mil|V9_CACHE_LAYER29_COMPONENTPLACEMENT=0|V9_CACHE_LAYER30_ID={6E1DA2A7-C5C0-4C15-8F1F-5492BA456154}|V9_CACHE_LAYER30_NAME=Mid-Layer 10|V9_CACHE_LAYER30_LAYERID=16777227|V9_CACHE_LAYER30_USEDBYPRIMS=FALSE|V9_CACHE_LAYER30_COPTHICK=1.4mil|V9_CACHE_LAYER30_COMPONENTPLACEMENT=0|V9_CACHE_LAYER31_ID={7557039F-9350-46D3-85B3-328DD54F3010}|V9_CACHE_LAYER31_NAME=Mid-Layer 11|V9_CACHE_LAYER31_LAYERID=16777228|V9_CACHE_LAYER31_USEDBYPRIMS=FALSE|V9_CACHE_LAYER31_COPTHICK=1.4mil|V9_CACHE_LAYER31_COMPONENTPLACEMENT=0|V9_CACHE_LAYER32_ID={2FA3D2A7-96C4-4CA5-B4C6-4835F532132F}|V9_CACHE_LAYER32_NAME=Mid-Layer 12|V9_CACHE_LAYER32_LAYERID=16777229|V9_CACHE_LAYER32_USEDBYPRIMS=FALSE|V9_CACHE_LAYER32_COPTHICK=1.4mil|V9_CACHE_LAYER32_COMPONENTPLACEMENT=0|V9_CACHE_LAYER33_ID={4F3AAE13-5C33-4962-A4BD-410E06716A9B}|V9_CACHE_LAYER33_NAME=Mid-Layer 13|V9_CACHE_LAYER33_LAYERID=16777230|V9_CACHE_LAYER33_USEDBYPRIMS=FALSE|V9_CACHE_LAYER33_COPTHICK=1.4mil|V9_CACHE_LAYER33_COMPONENTPLACEMENT=0|V9_CACHE_LAYER34_ID={DF005CB7-AEB9-40B7-88B5-7C47D5421206}|V9_CACHE_LAYER34_NAME=Mid-Layer 14|V9_CACHE_LAYER34_LAYERID=16777231|V9_CACHE_LAYER34_USEDBYPRIMS=FALSE|V9_CACHE_LAYER34_COPTHICK=1.4mil|V9_CACHE_LAYER34_COMPONENTPLACEMENT=0|V9_CACHE_LAYER35_ID={BA6246ED-D159-436E-9961-C289601CCAEB}|V9_CACHE_LAYER35_NAME=Mid-Layer 15|V9_CACHE_LAYER35_LAYERID=16777232|V9_CACHE_LAYER35_USEDBYPRIMS=FALSE|V9_CACHE_LAYER35_COPTHICK=1.4mil|V9_CACHE_LAYER35_COMPONENTPLACEMENT=0|V9_CACHE_LAYER36_ID={884F51EC-C10B-4E0E-9F10-7178C5BEA158}|V9_CACHE_LAYER36_NAME=Mid-Layer 16|V9_CACHE_LAYER36_LAYERID=16777233|V9_CACHE_LAYER36_USEDBYPRIMS=FALSE|V9_CACHE_LAYER36_COPTHICK=1.4mil|V9_CACHE_LAYER36_COMPONENTPLACEMENT=0|V9_CACHE_LAYER37_ID={C97B070E-3AC3-43EC-BBED-D1C9E10CF01A}|V9_CACHE_LAYER37_NAME=Mid-Layer 17|V9_CACHE_LAYER37_LAYERID=16777234|V9_CACHE_LAYER37_USEDBYPRIMS=FALSE|V9_CACHE_LAYER37_COPTHICK=1.4mil|V9_CACHE_LAYER37_COMPONENTPLACEMENT=0|V9_CACHE_LAYER38_ID={8F233F1D-30DA-4370-AF8E-AFA361677EBC}|V9_CACHE_LAYER38_NAME=Mid-Layer 18|V9_CACHE_LAYER38_LAYERID=16777235|V9_CACHE_LAYER38_USEDBYPRIMS=FALSE|V9_CACHE_LAYER38_COPTHICK=1.4mil|V9_CACHE_LAYER38_COMPONENTPLACEMENT=0|V9_CACHE_LAYER39_ID={A98C67CA-F66D-48B8-BEAA-12A947FFC829}|V9_CACHE_LAYER39_NAME=Mid-Layer 19|V9_CACHE_LAYER39_LAYERID=16777236|V9_CACHE_LAYER39_USEDBYPRIMS=FALSE|V9_CACHE_LAYER39_COPTHICK=1.4mil|V9_CACHE_LAYER39_COMPONENTPLACEMENT=0|V9_CACHE_LAYER40_ID={C86B41A1-A82B-4A64-81A8-F1BEBDF19185}|V9_CACHE_LAYER40_NAME=Mid-Layer 20|V9_CACHE_LAYER40_LAYERID=16777237|V9_CACHE_LAYER40_USEDBYPRIMS=FALSE|V9_CACHE_LAYER40_COPTHICK=1.4mil|V9_CACHE_LAYER40_COMPONENTPLACEMENT=0|V9_CACHE_LAYER41_ID={073E8AA8-51D1-4FA5-A4F6-07C834C5BD68}|V9_CACHE_LAYER41_NAME=Mid-Layer 21|V9_CACHE_LAYER41_LAYERID=16777238|V9_CACHE_LAYER41_USEDBYPRIMS=FALSE|V9_CACHE_LAYER41_COPTHICK=1.4mil|V9_CACHE_LAYER41_COMPONENTPLACEMENT=0|V9_CACHE_LAYER42_ID={3469A2DB-6E8A-41D8-BBE4-1941439DD254}|V9_CACHE_LAYER42_NAME=Mid-Layer 22|V9_CACHE_LAYER42_LAYERID=16777239|V9_CACHE_LAYER42_USEDBYPRIMS=FALSE|V9_CACHE_LAYER42_COPTHICK=1.4mil|V9_CACHE_LAYER42_COMPONENTPLACEMENT=0|V9_CACHE_LAYER43_ID={E620026E-8B05-4425-BAFB-A63ADD97EA66}|V9_CACHE_LAYER43_NAME=Mid-Layer 23|V9_CACHE_LAYER43_LAYERID=16777240|V9_CACHE_LAYER43_USEDBYPRIMS=FALSE|V9_CACHE_LAYER43_COPTHICK=1.4mil|V9_CACHE_LAYER43_COMPONENTPLACEMENT=0|V9_CACHE_LAYER44_ID={610DCC7E-6579-4EDF-BA03-A21F0A7F978F}|V9_CACHE_LAYER44_NAME=Mid-Layer 24|V9_CACHE_LAYER44_LAYERID=16777241|V9_CACHE_LAYER44_USEDBYPRIMS=FALSE|V9_CACHE_LAYER44_COPTHICK=1.4mil|V9_CACHE_LAYER44_COMPONENTPLACEMENT=0|V9_CACHE_LAYER45_ID={25AE0E36-F60E-45BF-B68F-00153072BC51}|V9_CACHE_LAYER45_NAME=Mid-Layer 25|V9_CACHE_LAYER45_LAYERID=16777242|V9_CACHE_LAYER45_USEDBYPRIMS=FALSE|V9_CACHE_LAYER45_COPTHICK=1.4mil|V9_CACHE_LAYER45_COMPONENTPLACEMENT=0|V9_CACHE_LAYER46_ID={552282B8-6B39-4316-926F-5BBCC34132E3}|V9_CACHE_LAYER46_NAME=Mid-Layer 26|V9_CACHE_LAYER46_LAYERID=16777243|V9_CACHE_LAYER46_USEDBYPRIMS=FALSE|V9_CACHE_LAYER46_COPTHICK=1.4mil|V9_CACHE_LAYER46_COMPONENTPLACEMENT=0|V9_CACHE_LAYER47_ID={E6E5285E-3B16-45CE-B153-3BE844CAA0CD}|V9_CACHE_LAYER47_NAME=Mid-Layer 27|V9_CACHE_LAYER47_LAYERID=16777244|V9_CACHE_LAYER47_USEDBYPRIMS=FALSE|V9_CACHE_LAYER47_COPTHICK=1.4mil|V9_CACHE_LAYER47_COMPONENTPLACEMENT=0|V9_CACHE_LAYER48_ID={BD313898-8ED6-41BA-B16B-564E39EB40BF}|V9_CACHE_LAYER48_NAME=Mid-Layer 28|V9_CACHE_LAYER48_LAYERID=16777245|V9_CACHE_LAYER48_USEDBYPRIMS=FALSE|V9_CACHE_LAYER48_COPTHICK=1.4mil|V9_CACHE_LAYER48_COMPONENTPLACEMENT=0|V9_CACHE_LAYER49_ID={6DFF7FA6-2FDC-4AC2-A086-57F923E84159}|V9_CACHE_LAYER49_NAME=Mid-Layer 29|V9_CACHE_LAYER49_LAYERID=16777246|V9_CACHE_LAYER49_USEDBYPRIMS=FALSE|V9_CACHE_LAYER49_COPTHICK=1.4mil|V9_CACHE_LAYER49_COMPONENTPLACEMENT=0|V9_CACHE_LAYER50_ID={39A14A3A-0E9C-4356-8840-5CD267F22BBD}|V9_CACHE_LAYER50_NAME=Mid-Layer 30|V9_CACHE_LAYER50_LAYERID=16777247|V9_CACHE_LAYER50_USEDBYPRIMS=FALSE|V9_CACHE_LAYER50_COPTHICK=1.4mil|V9_CACHE_LAYER50_COMPONENTPLACEMENT=0|V9_CACHE_LAYER51_ID={5FCADAC4-66B2-4043-8237-11DFFACEA9C5}|V9_CACHE_LAYER51_NAME=Internal Plane 1|V9_CACHE_LAYER51_LAYERID=16842753|V9_CACHE_LAYER51_USEDBYPRIMS=FALSE|V9_CACHE_LAYER51_COPTHICK=1.4mil|V9_CACHE_LAYER51_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER52_ID={C5D6A258-CC56-40F5-855F-B8D977F4CE56}|V9_CACHE_LAYER52_NAME=Internal Plane 2|V9_CACHE_LAYER52_LAYERID=16842754|V9_CACHE_LAYER52_USEDBYPRIMS=FALSE|V9_CACHE_LAYER52_COPTHICK=1.4mil|V9_CACHE_LAYER52_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER53_ID={5843A3E0-08E3-409E-A8B4-BF5B9280E3BF}|V9_CACHE_LAYER53_NAME=Internal Plane 3|V9_CACHE_LAYER53_LAYERID=16842755|V9_CACHE_LAYER53_USEDBYPRIMS=FALSE|V9_CACHE_LAYER53_COPTHICK=1.4mil|V9_CACHE_LAYER53_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER54_ID={EC40BCFF-0074-4238-A520-B4A20F24C61C}|V9_CACHE_LAYER54_NAME=Internal Plane 4|V9_CACHE_LAYER54_LAYERID=16842756|V9_CACHE_LAYER54_USEDBYPRIMS=FALSE|V9_CACHE_LAYER54_COPTHICK=1.4mil|V9_CACHE_LAYER54_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER55_ID={E459C708-A0D7-427B-8EA8-B6E89DC0FC19}|V9_CACHE_LAYER55_NAME=Internal Plane 5|V9_CACHE_LAYER55_LAYERID=16842757|V9_CACHE_LAYER55_USEDBYPRIMS=FALSE|V9_CACHE_LAYER55_COPTHICK=1.4mil|V9_CACHE_LAYER55_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER56_ID={BD09DE05-957A-41A1-817A-CB43318F9765}|V9_CACHE_LAYER56_NAME=Internal Plane 6|V9_CACHE_LAYER56_LAYERID=16842758|V9_CACHE_LAYER56_USEDBYPRIMS=FALSE|V9_CACHE_LAYER56_COPTHICK=1.4mil|V9_CACHE_LAYER56_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER57_ID={F387BFFE-83B1-4E53-BCA5-141D68E2F0EE}|V9_CACHE_LAYER57_NAME=Internal Plane 7|V9_CACHE_LAYER57_LAYERID=16842759|V9_CACHE_LAYER57_USEDBYPRIMS=FALSE|V9_CACHE_LAYER57_COPTHICK=1.4mil|V9_CACHE_LAYER57_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER58_ID={4523E0CB-C833-4771-818B-7B45BADF8040}|V9_CACHE_LAYER58_NAME=Internal Plane 8|V9_CACHE_LAYER58_LAYERID=16842760|V9_CACHE_LAYER58_USEDBYPRIMS=FALSE|V9_CACHE_LAYER58_COPTHICK=1.4mil|V9_CACHE_LAYER58_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER59_ID={6726A93D-9BFE-44EB-BE27-B13D312A28D1}|V9_CACHE_LAYER59_NAME=Internal Plane 9|V9_CACHE_LAYER59_LAYERID=16842761|V9_CACHE_LAYER59_USEDBYPRIMS=FALSE|V9_CACHE_LAYER59_COPTHICK=1.4mil|V9_CACHE_LAYER59_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER60_ID={FA091E45-95AC-43BD-9D9E-DD2CFB83A3B5}|V9_CACHE_LAYER60_NAME=Internal Plane 10|V9_CACHE_LAYER60_LAYERID=16842762|V9_CACHE_LAYER60_USEDBYPRIMS=FALSE|V9_CACHE_LAYER60_COPTHICK=1.4mil|V9_CACHE_LAYER60_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER61_ID={EA8C4DCA-7FB8-4BFC-9D7B-CF6BA960FCD1}|V9_CACHE_LAYER61_NAME=Internal Plane 11|V9_CACHE_LAYER61_LAYERID=16842763|V9_CACHE_LAYER61_USEDBYPRIMS=FALSE|V9_CACHE_LAYER61_COPTHICK=1.4mil|V9_CACHE_LAYER61_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER62_ID={F17233E1-D632-494D-B28A-9474875AC851}|V9_CACHE_LAYER62_NAME=Internal Plane 12|V9_CACHE_LAYER62_LAYERID=16842764|V9_CACHE_LAYER62_USEDBYPRIMS=FALSE|V9_CACHE_LAYER62_COPTHICK=1.4mil|V9_CACHE_LAYER62_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER63_ID={7643C5B0-152C-4FEA-9D6A-02F130ECFD18}|V9_CACHE_LAYER63_NAME=Internal Plane 13|V9_CACHE_LAYER63_LAYERID=16842765|V9_CACHE_LAYER63_USEDBYPRIMS=FALSE|V9_CACHE_LAYER63_COPTHICK=1.4mil|V9_CACHE_LAYER63_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER64_ID={3B0614FF-8DF1-4F0B-910F-A821ECDECD61}|V9_CACHE_LAYER64_NAME=Internal Plane 14|V9_CACHE_LAYER64_LAYERID=16842766|V9_CACHE_LAYER64_USEDBYPRIMS=FALSE|V9_CACHE_LAYER64_COPTHICK=1.4mil|V9_CACHE_LAYER64_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER65_ID={62680A32-F342-4F76-9DE4-F7FDE9280883}|V9_CACHE_LAYER65_NAME=Internal Plane 15|V9_CACHE_LAYER65_LAYERID=16842767|V9_CACHE_LAYER65_USEDBYPRIMS=FALSE|V9_CACHE_LAYER65_COPTHICK=1.4mil|V9_CACHE_LAYER65_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER66_ID={58CCA1F0-CD98-4DFC-A1C4-4C2AB3406D70}|V9_CACHE_LAYER66_NAME=Internal Plane 16|V9_CACHE_LAYER66_LAYERID=16842768|V9_CACHE_LAYER66_USEDBYPRIMS=FALSE|V9_CACHE_LAYER66_COPTHICK=1.4mil|V9_CACHE_LAYER66_PULLBACKDISTANCE=20mil|V9_CACHE_LAYER67_ID={E8290CA5-BEA0-4E83-96B1-23D20EA02F85}|V9_CACHE_LAYER67_NAME=Drill Guide|V9_CACHE_LAYER67_LAYERID=16973836|V9_CACHE_LAYER67_USEDBYPRIMS=FALSE|V9_CACHE_LAYER68_ID={08621FAB-15B4-4F84-BEAC-BA151C1F4B72}|V9_CACHE_LAYER68_NAME=Keep-Out Layer|V9_CACHE_LAYER68_LAYERID=16973837|V9_CACHE_LAYER68_USEDBYPRIMS=FALSE|V9_CACHE_LAYER69_ID={3864CBAF-735C-4B7A-BAE9-487907FA8A74}|V9_CACHE_LAYER69_NAME=Mechanical 1|V9_CACHE_LAYER69_LAYERID=16908289|V9_CACHE_LAYER69_USEDBYPRIMS=TRUE|V9_CACHE_LAYER69_MECHENABLED=TRUE|V9_CACHE_LAYER70_ID={EB226783-9634-4E34-AC70-BAC099967C4F}|V9_CACHE_LAYER70_NAME=Mechanical 2|V9_CACHE_LAYER70_LAYERID=16908290|V9_CACHE_LAYER70_USEDBYPRIMS=FALSE|V9_CACHE_LAYER70_MECHENABLED=FALSE|V9_CACHE_LAYER71_ID={CBEE9FFA-3088-4BDC-A77F-7B88E5C3E621}|V9_CACHE_LAYER71_NAME=Mechanical 3|V9_CACHE_LAYER71_LAYERID=16908291|V9_CACHE_LAYER71_USEDBYPRIMS=FALSE|V9_CACHE_LAYER71_MECHENABLED=FALSE|V9_CACHE_LAYER72_ID={B104DC7E-B5C6-49F4-A7E6-CF3DDD388A50}|V9_CACHE_LAYER72_NAME=Mechanical 4|V9_CACHE_LAYER72_LAYERID=16908292|V9_CACHE_LAYER72_USEDBYPRIMS=FALSE|V9_CACHE_LAYER72_MECHENABLED=FALSE|V9_CACHE_LAYER73_ID={DA40F3B6-1EDC-43A1-B63B-AF6F4DF3BBA6}|V9_CACHE_LAYER73_NAME=Mechanical 5|V9_CACHE_LAYER73_LAYERID=16908293|V9_CACHE_LAYER73_USEDBYPRIMS=FALSE|V9_CACHE_LAYER73_MECHENABLED=FALSE|V9_CACHE_LAYER74_ID={FAE5DF52-1C9B-429C-BB7E-87A7DCA71801}|V9_CACHE_LAYER74_NAME=Mechanical 6|V9_CACHE_LAYER74_LAYERID=16908294|V9_CACHE_LAYER74_USEDBYPRIMS=FALSE|V9_CACHE_LAYER74_MECHENABLED=FALSE|V9_CACHE_LAYER75_ID={697553D7-17A5-49BD-8D18-D2B57BB66E97}|V9_CACHE_LAYER75_NAME=Mechanical 7|V9_CACHE_LAYER75_LAYERID=16908295|V9_CACHE_LAYER75_USEDBYPRIMS=FALSE|V9_CACHE_LAYER75_MECHENABLED=FALSE|V9_CACHE_LAYER76_ID={4E6BD0D0-D9F9-4353-A728-FF9E229BEFAC}|V9_CACHE_LAYER76_NAME=Mechanical 8|V9_CACHE_LAYER76_LAYERID=16908296|V9_CACHE_LAYER76_USEDBYPRIMS=FALSE|V9_CACHE_LAYER76_MECHENABLED=FALSE|V9_CACHE_LAYER77_ID={0E025A02-9809-459D-B658-102C695DC543}|V9_CACHE_LAYER77_NAME=Mechanical 9|V9_CACHE_LAYER77_LAYERID=16908297|V9_CACHE_LAYER77_USEDBYPRIMS=FALSE|V9_CACHE_LAYER77_MECHENABLED=FALSE|V9_CACHE_LAYER78_ID={883646CA-70D8-49E7-AF54-51157F0FE954}|V9_CACHE_LAYER78_NAME=Mechanical 10|V9_CACHE_LAYER78_LAYERID=16908298|V9_CACHE_LAYER78_USEDBYPRIMS=FALSE|V9_CACHE_LAYER78_MECHENABLED=FALSE|V9_CACHE_LAYER79_ID={CBE638A4-2687-4B18-8847-B98D06CDCC62}|V9_CACHE_LAYER79_NAME=Mechanical 11|V9_CACHE_LAYER79_LAYERID=16908299|V9_CACHE_LAYER79_USEDBYPRIMS=FALSE|V9_CACHE_LAYER79_MECHENABLED=FALSE|V9_CACHE_LAYER80_ID={6DAFEEC7-8500-40F6-B6E3-02516FE2CAAE}|V9_CACHE_LAYER80_NAME=Mechanical 12|V9_CACHE_LAYER80_LAYERID=16908300|V9_CACHE_LAYER80_USEDBYPRIMS=FALSE|V9_CACHE_LAYER80_MECHENABLED=FALSE|V9_CACHE_LAYER81_ID={EB37C7B0-0986-4DF6-9870-6AA3F7163DA3}|V9_CACHE_LAYER81_NAME=Mechanical 13|V9_CACHE_LAYER81_LAYERID=16908301|V9_CACHE_LAYER81_USEDBYPRIMS=FALSE|V9_CACHE_LAYER81_MECHENABLED=FALSE|V9_CACHE_LAYER82_ID={05571D47-8A5D-432F-A1A8-CFE9C0ACE74D}|V9_CACHE_LAYER82_NAME=Mechanical 14|V9_CACHE_LAYER82_LAYERID=16908302|V9_CACHE_LAYER82_USEDBYPRIMS=FALSE|V9_CACHE_LAYER82_MECHENABLED=FALSE|V9_CACHE_LAYER83_ID={2485AD6A-6A77-417C-BFDE-596431B32B66}|V9_CACHE_LAYER83_NAME=Mechanical 15|V9_CACHE_LAYER83_LAYERID=16908303|V9_CACHE_LAYER83_USEDBYPRIMS=TRUE|V9_CACHE_LAYER83_MECHENABLED=TRUE|V9_CACHE_LAYER84_ID={292A3AEC-A458-4AEF-8B19-445BA925A512}|V9_CACHE_LAYER84_NAME=Mechanical 16|V9_CACHE_LAYER84_LAYERID=16908304|V9_CACHE_LAYER84_USEDBYPRIMS=FALSE|V9_CACHE_LAYER84_MECHENABLED=FALSE|V9_CACHE_LAYER85_ID={FEC438AE-3685-4F17-ABF2-1D3E72C4D493}|V9_CACHE_LAYER85_NAME=Drill Drawing|V9_CACHE_LAYER85_LAYERID=16973838|V9_CACHE_LAYER85_USEDBYPRIMS=FALSE|V9_CACHE_LAYER86_ID={A259A2C4-CFE6-4916-B6BF-86782F7FBF0D}|V9_CACHE_LAYER86_NAME=Mechanical 17|V9_CACHE_LAYER86_LAYERID=16908305|V9_CACHE_LAYER86_USEDBYPRIMS=FALSE|V9_CACHE_LAYER86_MECHENABLED=FALSE|V9_CACHE_LAYER87_ID={E2B36080-7BF6-43BD-B981-3003010A9609}|V9_CACHE_LAYER87_NAME=Mechanical 18|V9_CACHE_LAYER87_LAYERID=16908306|V9_CACHE_LAYER87_USEDBYPRIMS=FALSE|V9_CACHE_LAYER87_MECHENABLED=FALSE|V9_CACHE_LAYER88_ID={81316F7E-F321-47C1-8971-42E883E9CB0E}|V9_CACHE_LAYER88_NAME=Mechanical 19|V9_CACHE_LAYER88_LAYERID=16908307|V9_CACHE_LAYER88_USEDBYPRIMS=FALSE|V9_CACHE_LAYER88_MECHENABLED=FALSE|V9_CACHE_LAYER89_ID={14AAB5F6-7C80-4362-A21F-B9C1FDFDDB22}|V9_CACHE_LAYER89_NAME=Mechanical 20|V9_CACHE_LAYER89_LAYERID=16908308|V9_CACHE_LAYER89_USEDBYPRIMS=FALSE|V9_CACHE_LAYER89_MECHENABLED=FALSE|V9_CACHE_LAYER90_ID={CBCFC311-5586-4364-A18D-90F11394123B}|V9_CACHE_LAYER90_NAME=Mechanical 21|V9_CACHE_LAYER90_LAYERID=16908309|V9_CACHE_LAYER90_USEDBYPRIMS=FALSE|V9_CACHE_LAYER90_MECHENABLED=FALSE|V9_CACHE_LAYER91_ID={3AB1D3B0-DB36-4BB9-A00A-5F67A876CFE3}|V9_CACHE_LAYER91_NAME=Mechanical 22|V9_CACHE_LAYER91_LAYERID=16908310|V9_CACHE_LAYER91_USEDBYPRIMS=FALSE|V9_CACHE_LAYER91_MECHENABLED=FALSE|V9_CACHE_LAYER92_ID={B81DDB01-F6EB-4079-B0E5-DAD27690619B}|V9_CACHE_LAYER92_NAME=Mechanical 23|V9_CACHE_LAYER92_LAYERID=16908311|V9_CACHE_LAYER92_USEDBYPRIMS=FALSE|V9_CACHE_LAYER92_MECHENABLED=FALSE|V9_CACHE_LAYER93_ID={FCA2D964-A0F8-46D8-8124-E558605ABA9E}|V9_CACHE_LAYER93_NAME=Mechanical 24|V9_CACHE_LAYER93_LAYERID=16908312|V9_CACHE_LAYER93_USEDBYPRIMS=FALSE|V9_CACHE_LAYER93_MECHENABLED=FALSE|V9_CACHE_LAYER94_ID={5E506687-FC3C-4DE6-B88B-A3AD6F4A7C70}|V9_CACHE_LAYER94_NAME=Mechanical 25|V9_CACHE_LAYER94_LAYERID=16908313|V9_CACHE_LAYER94_USEDBYPRIMS=FALSE|V9_CACHE_LAYER94_MECHENABLED=FALSE|V9_CACHE_LAYER95_ID={7A2D3E4C-73EC-4B78-B93C-3A82F6444428}|V9_CACHE_LAYER95_NAME=Mechanical 26|V9_CACHE_LAYER95_LAYERID=16908314|V9_CACHE_LAYER95_USEDBYPRIMS=FALSE|V9_CACHE_LAYER95_MECHENABLED=FALSE|V9_CACHE_LAYER96_ID={A8684D33-2E09-4325-A74B-B3C7708452A2}|V9_CACHE_LAYER96_NAME=Mechanical 27|V9_CACHE_LAYER96_LAYERID=16908315|V9_CACHE_LAYER96_USEDBYPRIMS=FALSE|V9_CACHE_LAYER96_MECHENABLED=FALSE|V9_CACHE_LAYER97_ID={AEFE1341-A326-4186-AF5A-79C7FC4802D2}|V9_CACHE_LAYER97_NAME=Mechanical 28|V9_CACHE_LAYER97_LAYERID=16908316|V9_CACHE_LAYER97_USEDBYPRIMS=FALSE|V9_CACHE_LAYER97_MECHENABLED=FALSE|V9_CACHE_LAYER98_ID={B3553CDF-2E18-443D-AE48-05FAB1548F17}|V9_CACHE_LAYER98_NAME=Mechanical 29|V9_CACHE_LAYER98_LAYERID=16908317|V9_CACHE_LAYER98_USEDBYPRIMS=FALSE|V9_CACHE_LAYER98_MECHENABLED=FALSE|V9_CACHE_LAYER99_ID={FC5D7C46-5B81-44F2-8E7D-AE60AB3C000C}|V9_CACHE_LAYER99_NAME=Mechanical 30|V9_CACHE_LAYER99_LAYERID=16908318|V9_CACHE_LAYER99_USEDBYPRIMS=FALSE|V9_CACHE_LAYER99_MECHENABLED=FALSE|V9_CACHE_LAYER100_ID={2BC814E1-7C2A-433B-9B66-3D6C1B322A8B}|V9_CACHE_LAYER100_NAME=Mechanical 31|V9_CACHE_LAYER100_LAYERID=16908319|V9_CACHE_LAYER100_USEDBYPRIMS=FALSE|V9_CACHE_LAYER100_MECHENABLED=FALSE|V9_CACHE_LAYER101_ID={CE42239C-12F1-42E8-96E1-4549C21CFF9B}|V9_CACHE_LAYER101_NAME=Mechanical 32|V9_CACHE_LAYER101_LAYERID=16908320|V9_CACHE_LAYER101_USEDBYPRIMS=FALSE|V9_CACHE_LAYER101_MECHENABLED=FALSE|LAYERMASTERSTACK_V8STYLE=0|LAYERMASTERSTACK_V8ID={6C6A7AEE-860E-42B8-A7B0-5A4F746E66B0}|LAYERMASTERSTACK_V8NAME=Master layer stack|LAYERMASTERSTACK_V8SHOWTOPDIELECTRIC=FALSE|LAYERMASTERSTACK_V8SHOWBOTTOMDIELECTRIC=FALSE|LAYERMASTERSTACK_V8ISFLEX=FALSE|LAYERSUBSTACK_V8_0ID={133D6234-F010-46C7-B390-43FBDD454A88}|LAYERSUBSTACK_V8_0NAME=Board Layer Stack|LAYERSUBSTACK_V8_0SHOWTOPDIELECTRIC=FALSE|LAYERSUBSTACK_V8_0SHOWBOTTOMDIELECTRIC=FALSE|LAYERSUBSTACK_V8_0ISFLEX=FALSE|LAYERSUBSTACK_V8_0SERVICE=FALSE|LAYERSUBSTACK_V8_0USEDBYPRIMS=FALSE|LAYERSUBSTACK_V8_0TYPE=1|LAYER_V8_0_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_0_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_0ID={30045540-1B4B-4001-AB64-318F70B47D5C}|LAYER_V8_0NAME=Top Paste|LAYER_V8_0LAYERID=16973832|LAYER_V8_0USEDBYPRIMS=FALSE|LAYER_V8_1_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_1_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_1ID={F22BABF4-3864-4478-9E30-F3A5F449D148}|LAYER_V8_1NAME=Top Overlay|LAYER_V8_1LAYERID=16973830|LAYER_V8_1USEDBYPRIMS=TRUE|LAYER_V8_2_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_2_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_2ID={5A303FD1-9A68-46E1-8805-901769ECECC7}|LAYER_V8_2NAME=Top Solder|LAYER_V8_2LAYERID=16973834|LAYER_V8_2USEDBYPRIMS=FALSE|LAYER_V8_2DIELTYPE=3|LAYER_V8_2DIELCONST=3.500|LAYER_V8_2DIELHEIGHT=0.4mil|LAYER_V8_2DIELMATERIAL=Solder Resist|LAYER_V8_2COVERLAY_EXPANSION=0mil|LAYER_V8_3_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_3_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_3ID={999DF18F-9048-469A-90BE-9E37DD83557B}|LAYER_V8_3NAME=Top Layer|LAYER_V8_3LAYERID=16777217|LAYER_V8_3USEDBYPRIMS=TRUE|LAYER_V8_3COPTHICK=1.4mil|LAYER_V8_3COMPONENTPLACEMENT=1|LAYER_V8_4_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_4_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_4ID={02BF3CDA-3C8F-4FAD-9742-9D994AE02F07}|LAYER_V8_4NAME=Dielectric 1|LAYER_V8_4LAYERID=17039361|LAYER_V8_4USEDBYPRIMS=FALSE|LAYER_V8_4DIELTYPE=0|LAYER_V8_4DIELCONST=4.800|LAYER_V8_4DIELHEIGHT=12.6mil|LAYER_V8_4DIELMATERIAL=FR-4|LAYER_V8_5_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_5_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_5ID={9A0521B6-9E50-4E7C-A183-D2BA2C61636A}|LAYER_V8_5NAME=Bottom Layer|LAYER_V8_5LAYERID=16842751|LAYER_V8_5USEDBYPRIMS=TRUE|LAYER_V8_5COPTHICK=1.4mil|LAYER_V8_5COMPONENTPLACEMENT=2|LAYER_V8_6_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_6_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_6ID={6089F658-C6F8-45EF-ADE9-00844D259BA3}|LAYER_V8_6NAME=Bottom Solder|LAYER_V8_6LAYERID=16973835|LAYER_V8_6USEDBYPRIMS=FALSE|LAYER_V8_6DIELTYPE=3|LAYER_V8_6DIELCONST=3.500|LAYER_V8_6DIELHEIGHT=0.4mil|LAYER_V8_6DIELMATERIAL=Solder Resist|LAYER_V8_6COVERLAY_EXPANSION=0mil|LAYER_V8_7_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_7_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_7ID={F336B23E-1435-4733-9ED3-34BDF2531FBF}|LAYER_V8_7NAME=Bottom Overlay|LAYER_V8_7LAYERID=16973831|LAYER_V8_7USEDBYPRIMS=FALSE|LAYER_V8_8_{133D6234-F010-46C7-B390-43FBDD454A88}CONTEXT=0|LAYER_V8_8_{133D6234-F010-46C7-B390-43FBDD454A88}USEDBYPRIMS=FALSE|LAYER_V8_8ID={70A911C0-2DEF-47D0-84F8-E68892450F49}|LAYER_V8_8NAME=Bottom Paste|LAYER_V8_8LAYERID=16973833|LAYER_V8_8USEDBYPRIMS=FALSE|LAYER_V8_9ID={E8290CA5-BEA0-4E83-96B1-23D20EA02F85}|LAYER_V8_9NAME=Drill Guide|LAYER_V8_9LAYERID=16973836|LAYER_V8_9USEDBYPRIMS=FALSE|LAYER_V8_10ID={08621FAB-15B4-4F84-BEAC-BA151C1F4B72}|LAYER_V8_10NAME=Keep-Out Layer|LAYER_V8_10LAYERID=16973837|LAYER_V8_10USEDBYPRIMS=FALSE|LAYER_V8_11ID={3864CBAF-735C-4B7A-BAE9-487907FA8A74}|LAYER_V8_11NAME=Mechanical 1|LAYER_V8_11LAYERID=16908289|LAYER_V8_11USEDBYPRIMS=TRUE|LAYER_V8_11MECHENABLED=TRUE|LAYER_V8_12ID={EB226783-9634-4E34-AC70-BAC099967C4F}|LAYER_V8_12NAME=Mechanical 2|LAYER_V8_12LAYERID=16908290|LAYER_V8_12USEDBYPRIMS=FALSE|LAYER_V8_12MECHENABLED=FALSE|LAYER_V8_13ID={CBEE9FFA-3088-4BDC-A77F-7B88E5C3E621}|LAYER_V8_13NAME=Mechanical 3|LAYER_V8_13LAYERID=16908291|LAYER_V8_13USEDBYPRIMS=FALSE|LAYER_V8_13MECHENABLED=FALSE|LAYER_V8_14ID={B104DC7E-B5C6-49F4-A7E6-CF3DDD388A50}|LAYER_V8_14NAME=Mechanical 4|LAYER_V8_14LAYERID=16908292|LAYER_V8_14USEDBYPRIMS=FALSE|LAYER_V8_14MECHENABLED=FALSE|LAYER_V8_15ID={DA40F3B6-1EDC-43A1-B63B-AF6F4DF3BBA6}|LAYER_V8_15NAME=Mechanical 5|LAYER_V8_15LAYERID=16908293|LAYER_V8_15USEDBYPRIMS=FALSE|LAYER_V8_15MECHENABLED=FALSE|LAYER_V8_16ID={FAE5DF52-1C9B-429C-BB7E-87A7DCA71801}|LAYER_V8_16NAME=Mechanical 6|LAYER_V8_16LAYERID=16908294|LAYER_V8_16USEDBYPRIMS=FALSE|LAYER_V8_16MECHENABLED=FALSE|LAYER_V8_17ID={697553D7-17A5-49BD-8D18-D2B57BB66E97}|LAYER_V8_17NAME=Mechanical 7|LAYER_V8_17LAYERID=16908295|LAYER_V8_17USEDBYPRIMS=FALSE|LAYER_V8_17MECHENABLED=FALSE|LAYER_V8_18ID={4E6BD0D0-D9F9-4353-A728-FF9E229BEFAC}|LAYER_V8_18NAME=Mechanical 8|LAYER_V8_18LAYERID=16908296|LAYER_V8_18USEDBYPRIMS=FALSE|LAYER_V8_18MECHENABLED=FALSE|LAYER_V8_19ID={0E025A02-9809-459D-B658-102C695DC543}|LAYER_V8_19NAME=Mechanical 9|LAYER_V8_19LAYERID=16908297|LAYER_V8_19USEDBYPRIMS=FALSE|LAYER_V8_19MECHENABLED=FALSE|LAYER_V8_20ID={883646CA-70D8-49E7-AF54-51157F0FE954}|LAYER_V8_20NAME=Mechanical 10|LAYER_V8_20LAYERID=16908298|LAYER_V8_20USEDBYPRIMS=FALSE|LAYER_V8_20MECHENABLED=FALSE|LAYER_V8_21ID={CBE638A4-2687-4B18-8847-B98D06CDCC62}|LAYER_V8_21NAME=Mechanical 11|LAYER_V8_21LAYERID=16908299|LAYER_V8_21USEDBYPRIMS=FALSE|LAYER_V8_21MECHENABLED=FALSE|LAYER_V8_22ID={6DAFEEC7-8500-40F6-B6E3-02516FE2CAAE}|LAYER_V8_22NAME=Mechanical 12|LAYER_V8_22LAYERID=16908300|LAYER_V8_22USEDBYPRIMS=FALSE|LAYER_V8_22MECHENABLED=FALSE|LAYER_V8_23ID={EB37C7B0-0986-4DF6-9870-6AA3F7163DA3}|LAYER_V8_23NAME=Mechanical 13|LAYER_V8_23LAYERID=16908301|LAYER_V8_23USEDBYPRIMS=FALSE|LAYER_V8_23MECHENABLED=FALSE|LAYER_V8_24ID={05571D47-8A5D-432F-A1A8-CFE9C0ACE74D}|LAYER_V8_24NAME=Mechanical 14|LAYER_V8_24LAYERID=16908302|LAYER_V8_24USEDBYPRIMS=FALSE|LAYER_V8_24MECHENABLED=FALSE|LAYER_V8_25ID={2485AD6A-6A77-417C-BFDE-596431B32B66}|LAYER_V8_25NAME=Mechanical 15|LAYER_V8_25LAYERID=16908303|LAYER_V8_25USEDBYPRIMS=TRUE|LAYER_V8_25MECHENABLED=TRUE|LAYER_V8_26ID={292A3AEC-A458-4AEF-8B19-445BA925A512}|LAYER_V8_26NAME=Mechanical 16|LAYER_V8_26LAYERID=16908304|LAYER_V8_26USEDBYPRIMS=FALSE|LAYER_V8_26MECHENABLED=FALSE|LAYER_V8_27ID={FEC438AE-3685-4F17-ABF2-1D3E72C4D493}|LAYER_V8_27NAME=Drill Drawing|LAYER_V8_27LAYERID=16973838|LAYER_V8_27USEDBYPRIMS=FALSE|LAYER_V8_28ID={5BD60229-8864-48D1-A8EB-95399348CB16}|LAYER_V8_28NAME=Multi-Layer|LAYER_V8_28LAYERID=16973839|LAYER_V8_28USEDBYPRIMS=TRUE|LAYER_V8_29ID={8070A95E-9307-4315-AEB7-3279CE2E13B1}|LAYER_V8_29NAME=Connections|LAYER_V8_29LAYERID=16973840|LAYER_V8_29USEDBYPRIMS=FALSE|LAYER_V8_30ID={7EB5AEF4-1A76-41D4-9E03-30A4837CD13B}|LAYER_V8_30NAME=Background|LAYER_V8_30LAYERID=16973841|LAYER_V8_30USEDBYPRIMS=FALSE|LAYER_V8_31ID={8102A625-DB52-4B32-89F5-EBC69CA6A514}|LAYER_V8_31NAME=DRC Error Markers|LAYER_V8_31LAYERID=16973842|LAYER_V8_31USEDBYPRIMS=TRUE|LAYER_V8_32ID={AA18D623-7F09-4267-BB86-AB16641CF2C7}|LAYER_V8_32NAME=Selections|LAYER_V8_32LAYERID=16973843|LAYER_V8_32USEDBYPRIMS=FALSE|LAYER_V8_33ID={C29197C8-F94E-4FA2-9DF0-092BF0692FD2}|LAYER_V8_33NAME=Visible Grid 1|LAYER_V8_33LAYERID=16973844|LAYER_V8_33USEDBYPRIMS=FALSE|LAYER_V8_34ID={CBB6B9C8-7C09-4943-BDF2-93A59B98F4D9}|LAYER_V8_34NAME=Visible Grid 2|LAYER_V8_34LAYERID=16973845|LAYER_V8_34USEDBYPRIMS=FALSE|LAYER_V8_35ID={DA4EDDDD-E049-49D0-BC05-78F97F6745B8}|LAYER_V8_35NAME=Pad Holes|LAYER_V8_35LAYERID=16973846|LAYER_V8_35USEDBYPRIMS=FALSE|LAYER_V8_36ID={A1D1422F-3445-48C1-AC9E-19016BB49E01}|LAYER_V8_36NAME=Via Holes|LAYER_V8_36LAYERID=16973847|LAYER_V8_36USEDBYPRIMS=FALSE|LAYER_V8_37ID={BD19B618-ECCD-4B7D-9162-6DD6573F7C3A}|LAYER_V8_37NAME=Top Pad Master|LAYER_V8_37LAYERID=16973848|LAYER_V8_37USEDBYPRIMS=FALSE|LAYER_V8_38ID={8FDE5189-A9FB-4D7C-9FC7-48B4DD5C87EE}|LAYER_V8_38NAME=Bottom Pad Master|LAYER_V8_38LAYERID=16973849|LAYER_V8_38USEDBYPRIMS=FALSE|LAYER_V8_39ID={206DC379-9404-4C98-9A1A-8266C349DD4D}|LAYER_V8_39NAME=DRC Detail Markers|LAYER_V8_39LAYERID=16973850|LAYER_V8_39USEDBYPRIMS=FALSE|LAYER_V8_40ID={A259A2C4-CFE6-4916-B6BF-86782F7FBF0D}|LAYER_V8_40NAME=Mechanical 17|LAYER_V8_40LAYERID=16908305|LAYER_V8_40USEDBYPRIMS=FALSE|LAYER_V8_40MECHENABLED=FALSE|LAYER_V8_41ID={E2B36080-7BF6-43BD-B981-3003010A9609}|LAYER_V8_41NAME=Mechanical 18|LAYER_V8_41LAYERID=16908306|LAYER_V8_41USEDBYPRIMS=FALSE|LAYER_V8_41MECHENABLED=FALSE|LAYER_V8_42ID={81316F7E-F321-47C1-8971-42E883E9CB0E}|LAYER_V8_42NAME=Mechanical 19|LAYER_V8_42LAYERID=16908307|LAYER_V8_42USEDBYPRIMS=FALSE|LAYER_V8_42MECHENABLED=FALSE|LAYER_V8_43ID={14AAB5F6-7C80-4362-A21F-B9C1FDFDDB22}|LAYER_V8_43NAME=Mechanical 20|LAYER_V8_43LAYERID=16908308|LAYER_V8_43USEDBYPRIMS=FALSE|LAYER_V8_43MECHENABLED=FALSE|LAYER_V8_44ID={CBCFC311-5586-4364-A18D-90F11394123B}|LAYER_V8_44NAME=Mechanical 21|LAYER_V8_44LAYERID=16908309|LAYER_V8_44USEDBYPRIMS=FALSE|LAYER_V8_44MECHENABLED=FALSE|LAYER_V8_45ID={3AB1D3B0-DB36-4BB9-A00A-5F67A876CFE3}|LAYER_V8_45NAME=Mechanical 22|LAYER_V8_45LAYERID=16908310|LAYER_V8_45USEDBYPRIMS=FALSE|LAYER_V8_45MECHENABLED=FALSE|LAYER_V8_46ID={B81DDB01-F6EB-4079-B0E5-DAD27690619B}|LAYER_V8_46NAME=Mechanical 23|LAYER_V8_46LAYERID=16908311|LAYER_V8_46USEDBYPRIMS=FALSE|LAYER_V8_46MECHENABLED=FALSE|LAYER_V8_47ID={FCA2D964-A0F8-46D8-8124-E558605ABA9E}|LAYER_V8_47NAME=Mechanical 24|LAYER_V8_47LAYERID=16908312|LAYER_V8_47USEDBYPRIMS=FALSE|LAYER_V8_47MECHENABLED=FALSE|LAYER_V8_48ID={5E506687-FC3C-4DE6-B88B-A3AD6F4A7C70}|LAYER_V8_48NAME=Mechanical 25|LAYER_V8_48LAYERID=16908313|LAYER_V8_48USEDBYPRIMS=FALSE|LAYER_V8_48MECHENABLED=FALSE|LAYER_V8_49ID={7A2D3E4C-73EC-4B78-B93C-3A82F6444428}|LAYER_V8_49NAME=Mechanical 26|LAYER_V8_49LAYERID=16908314|LAYER_V8_49USEDBYPRIMS=FALSE|LAYER_V8_49MECHENABLED=FALSE|LAYER_V8_50ID={A8684D33-2E09-4325-A74B-B3C7708452A2}|LAYER_V8_50NAME=Mechanical 27|LAYER_V8_50LAYERID=16908315|LAYER_V8_50USEDBYPRIMS=FALSE|LAYER_V8_50MECHENABLED=FALSE|LAYER_V8_51ID={AEFE1341-A326-4186-AF5A-79C7FC4802D2}|LAYER_V8_51NAME=Mechanical 28|LAYER_V8_51LAYERID=16908316|LAYER_V8_51USEDBYPRIMS=FALSE|LAYER_V8_51MECHENABLED=FALSE|LAYER_V8_52ID={B3553CDF-2E18-443D-AE48-05FAB1548F17}|LAYER_V8_52NAME=Mechanical 29|LAYER_V8_52LAYERID=16908317|LAYER_V8_52USEDBYPRIMS=FALSE|LAYER_V8_52MECHENABLED=FALSE|LAYER_V8_53ID={FC5D7C46-5B81-44F2-8E7D-AE60AB3C000C}|LAYER_V8_53NAME=Mechanical 30|LAYER_V8_53LAYERID=16908318|LAYER_V8_53USEDBYPRIMS=FALSE|LAYER_V8_53MECHENABLED=FALSE|LAYER_V8_54ID={2BC814E1-7C2A-433B-9B66-3D6C1B322A8B}|LAYER_V8_54NAME=Mechanical 31|LAYER_V8_54LAYERID=16908319|LAYER_V8_54USEDBYPRIMS=FALSE|LAYER_V8_54MECHENABLED=FALSE|LAYER_V8_55ID={CE42239C-12F1-42E8-96E1-4549C21CFF9B}|LAYER_V8_55NAME=Mechanical 32|LAYER_V8_55LAYERID=16908320|LAYER_V8_55USEDBYPRIMS=FALSE|LAYER_V8_55MECHENABLED=FALSE|TOPTYPE=3|TOPCONST=3.500|TOPHEIGHT=0.4mil|TOPMATERIAL=Solder Resist|BOTTOMTYPE=3|BOTTOMCONST=3.500|BOTTOMHEIGHT=0.4mil|BOTTOMMATERIAL=Solder Resist|LAYERSTACKSTYLE=0|SHOWTOPDIELECTRIC=FALSE|SHOWBOTTOMDIELECTRIC=FALSE|LAYER1NAME=Top Layer|LAYER1PREV=0|LAYER1NEXT=32|LAYER1MECHENABLED=FALSE|LAYER1COPTHICK=1.4mil|LAYER1DIELTYPE=0|LAYER1DIELCONST=4.800|LAYER1DIELHEIGHT=12.6mil|LAYER1DIELMATERIAL=FR-4|LAYER2NAME=Mid-Layer 1|LAYER2PREV=0|LAYER2NEXT=0|LAYER2MECHENABLED=FALSE|LAYER2COPTHICK=1.4mil|LAYER2DIELTYPE=0|LAYER2DIELCONST=4.800|LAYER2DIELHEIGHT=12.6mil|LAYER2DIELMATERIAL=FR-4|LAYER3NAME=Mid-Layer 2|LAYER3PREV=0|LAYER3NEXT=0|LAYER3MECHENABLED=FALSE|LAYER3COPTHICK=1.4mil|LAYER3DIELTYPE=0|LAYER3DIELCONST=4.800|LAYER3DIELHEIGHT=12.6mil|LAYER3DIELMATERIAL=FR-4|LAYER4NAME=Mid-Layer 3|LAYER4PREV=0|LAYER4NEXT=0|LAYER4MECHENABLED=FALSE|LAYER4COPTHICK=1.4mil|LAYER4DIELTYPE=0|LAYER4DIELCONST=4.800|LAYER4DIELHEIGHT=12.6mil|LAYER4DIELMATERIAL=FR-4|LAYER5NAME=Mid-Layer 4|LAYER5PREV=0|LAYER5NEXT=0|LAYER5MECHENABLED=FALSE|LAYER5COPTHICK=1.4mil|LAYER5DIELTYPE=0|LAYER5DIELCONST=4.800|LAYER5DIELHEIGHT=12.6mil|LAYER5DIELMATERIAL=FR-4 |RECORD=Board|LAYER6NAME=Mid-Layer 5|LAYER6PREV=0|LAYER6NEXT=0|LAYER6MECHENABLED=FALSE|LAYER6COPTHICK=1.4mil|LAYER6DIELTYPE=0|LAYER6DIELCONST=4.800|LAYER6DIELHEIGHT=12.6mil|LAYER6DIELMATERIAL=FR-4|LAYER7NAME=Mid-Layer 6|LAYER7PREV=0|LAYER7NEXT=0|LAYER7MECHENABLED=FALSE|LAYER7COPTHICK=1.4mil|LAYER7DIELTYPE=0|LAYER7DIELCONST=4.800|LAYER7DIELHEIGHT=12.6mil|LAYER7DIELMATERIAL=FR-4|LAYER8NAME=Mid-Layer 7|LAYER8PREV=0|LAYER8NEXT=0|LAYER8MECHENABLED=FALSE|LAYER8COPTHICK=1.4mil|LAYER8DIELTYPE=0|LAYER8DIELCONST=4.800|LAYER8DIELHEIGHT=12.6mil|LAYER8DIELMATERIAL=FR-4|LAYER9NAME=Mid-Layer 8|LAYER9PREV=0|LAYER9NEXT=0|LAYER9MECHENABLED=FALSE|LAYER9COPTHICK=1.4mil|LAYER9DIELTYPE=0|LAYER9DIELCONST=4.800|LAYER9DIELHEIGHT=12.6mil|LAYER9DIELMATERIAL=FR-4|LAYER10NAME=Mid-Layer 9|LAYER10PREV=0|LAYER10NEXT=0|LAYER10MECHENABLED=FALSE|LAYER10COPTHICK=1.4mil|LAYER10DIELTYPE=0|LAYER10DIELCONST=4.800|LAYER10DIELHEIGHT=12.6mil|LAYER10DIELMATERIAL=FR-4 |RECORD=Board|LAYER11NAME=Mid-Layer 10|LAYER11PREV=0|LAYER11NEXT=0|LAYER11MECHENABLED=FALSE|LAYER11COPTHICK=1.4mil|LAYER11DIELTYPE=0|LAYER11DIELCONST=4.800|LAYER11DIELHEIGHT=12.6mil|LAYER11DIELMATERIAL=FR-4|LAYER12NAME=Mid-Layer 11|LAYER12PREV=0|LAYER12NEXT=0|LAYER12MECHENABLED=FALSE|LAYER12COPTHICK=1.4mil|LAYER12DIELTYPE=0|LAYER12DIELCONST=4.800|LAYER12DIELHEIGHT=12.6mil|LAYER12DIELMATERIAL=FR-4|LAYER13NAME=Mid-Layer 12|LAYER13PREV=0|LAYER13NEXT=0|LAYER13MECHENABLED=FALSE|LAYER13COPTHICK=1.4mil|LAYER13DIELTYPE=0|LAYER13DIELCONST=4.800|LAYER13DIELHEIGHT=12.6mil|LAYER13DIELMATERIAL=FR-4|LAYER14NAME=Mid-Layer 13|LAYER14PREV=0|LAYER14NEXT=0|LAYER14MECHENABLED=FALSE|LAYER14COPTHICK=1.4mil|LAYER14DIELTYPE=0|LAYER14DIELCONST=4.800|LAYER14DIELHEIGHT=12.6mil|LAYER14DIELMATERIAL=FR-4|LAYER15NAME=Mid-Layer 14|LAYER15PREV=0|LAYER15NEXT=0|LAYER15MECHENABLED=FALSE|LAYER15COPTHICK=1.4mil|LAYER15DIELTYPE=0|LAYER15DIELCONST=4.800|LAYER15DIELHEIGHT=12.6mil|LAYER15DIELMATERIAL=FR-4 |RECORD=Board|LAYER16NAME=Mid-Layer 15|LAYER16PREV=0|LAYER16NEXT=0|LAYER16MECHENABLED=FALSE|LAYER16COPTHICK=1.4mil|LAYER16DIELTYPE=0|LAYER16DIELCONST=4.800|LAYER16DIELHEIGHT=12.6mil|LAYER16DIELMATERIAL=FR-4|LAYER17NAME=Mid-Layer 16|LAYER17PREV=0|LAYER17NEXT=0|LAYER17MECHENABLED=FALSE|LAYER17COPTHICK=1.4mil|LAYER17DIELTYPE=0|LAYER17DIELCONST=4.800|LAYER17DIELHEIGHT=12.6mil|LAYER17DIELMATERIAL=FR-4|LAYER18NAME=Mid-Layer 17|LAYER18PREV=0|LAYER18NEXT=0|LAYER18MECHENABLED=FALSE|LAYER18COPTHICK=1.4mil|LAYER18DIELTYPE=0|LAYER18DIELCONST=4.800|LAYER18DIELHEIGHT=12.6mil|LAYER18DIELMATERIAL=FR-4|LAYER19NAME=Mid-Layer 18|LAYER19PREV=0|LAYER19NEXT=0|LAYER19MECHENABLED=FALSE|LAYER19COPTHICK=1.4mil|LAYER19DIELTYPE=0|LAYER19DIELCONST=4.800|LAYER19DIELHEIGHT=12.6mil|LAYER19DIELMATERIAL=FR-4|LAYER20NAME=Mid-Layer 19|LAYER20PREV=0|LAYER20NEXT=0|LAYER20MECHENABLED=FALSE|LAYER20COPTHICK=1.4mil|LAYER20DIELTYPE=0|LAYER20DIELCONST=4.800|LAYER20DIELHEIGHT=12.6mil|LAYER20DIELMATERIAL=FR-4 |RECORD=Board|LAYER21NAME=Mid-Layer 20|LAYER21PREV=0|LAYER21NEXT=0|LAYER21MECHENABLED=FALSE|LAYER21COPTHICK=1.4mil|LAYER21DIELTYPE=0|LAYER21DIELCONST=4.800|LAYER21DIELHEIGHT=12.6mil|LAYER21DIELMATERIAL=FR-4|LAYER22NAME=Mid-Layer 21|LAYER22PREV=0|LAYER22NEXT=0|LAYER22MECHENABLED=FALSE|LAYER22COPTHICK=1.4mil|LAYER22DIELTYPE=0|LAYER22DIELCONST=4.800|LAYER22DIELHEIGHT=12.6mil|LAYER22DIELMATERIAL=FR-4|LAYER23NAME=Mid-Layer 22|LAYER23PREV=0|LAYER23NEXT=0|LAYER23MECHENABLED=FALSE|LAYER23COPTHICK=1.4mil|LAYER23DIELTYPE=0|LAYER23DIELCONST=4.800|LAYER23DIELHEIGHT=12.6mil|LAYER23DIELMATERIAL=FR-4|LAYER24NAME=Mid-Layer 23|LAYER24PREV=0|LAYER24NEXT=0|LAYER24MECHENABLED=FALSE|LAYER24COPTHICK=1.4mil|LAYER24DIELTYPE=0|LAYER24DIELCONST=4.800|LAYER24DIELHEIGHT=12.6mil|LAYER24DIELMATERIAL=FR-4|LAYER25NAME=Mid-Layer 24|LAYER25PREV=0|LAYER25NEXT=0|LAYER25MECHENABLED=FALSE|LAYER25COPTHICK=1.4mil|LAYER25DIELTYPE=0|LAYER25DIELCONST=4.800|LAYER25DIELHEIGHT=12.6mil|LAYER25DIELMATERIAL=FR-4 |RECORD=Board|LAYER26NAME=Mid-Layer 25|LAYER26PREV=0|LAYER26NEXT=0|LAYER26MECHENABLED=FALSE|LAYER26COPTHICK=1.4mil|LAYER26DIELTYPE=0|LAYER26DIELCONST=4.800|LAYER26DIELHEIGHT=12.6mil|LAYER26DIELMATERIAL=FR-4|LAYER27NAME=Mid-Layer 26|LAYER27PREV=0|LAYER27NEXT=0|LAYER27MECHENABLED=FALSE|LAYER27COPTHICK=1.4mil|LAYER27DIELTYPE=0|LAYER27DIELCONST=4.800|LAYER27DIELHEIGHT=12.6mil|LAYER27DIELMATERIAL=FR-4|LAYER28NAME=Mid-Layer 27|LAYER28PREV=0|LAYER28NEXT=0|LAYER28MECHENABLED=FALSE|LAYER28COPTHICK=1.4mil|LAYER28DIELTYPE=0|LAYER28DIELCONST=4.800|LAYER28DIELHEIGHT=12.6mil|LAYER28DIELMATERIAL=FR-4|LAYER29NAME=Mid-Layer 28|LAYER29PREV=0|LAYER29NEXT=0|LAYER29MECHENABLED=FALSE|LAYER29COPTHICK=1.4mil|LAYER29DIELTYPE=0|LAYER29DIELCONST=4.800|LAYER29DIELHEIGHT=12.6mil|LAYER29DIELMATERIAL=FR-4|LAYER30NAME=Mid-Layer 29|LAYER30PREV=0|LAYER30NEXT=0|LAYER30MECHENABLED=FALSE|LAYER30COPTHICK=1.4mil|LAYER30DIELTYPE=0|LAYER30DIELCONST=4.800|LAYER30DIELHEIGHT=12.6mil|LAYER30DIELMATERIAL=FR-4 |RECORD=Board|LAYER31NAME=Mid-Layer 30|LAYER31PREV=0|LAYER31NEXT=0|LAYER31MECHENABLED=FALSE|LAYER31COPTHICK=1.4mil|LAYER31DIELTYPE=0|LAYER31DIELCONST=4.800|LAYER31DIELHEIGHT=12.6mil|LAYER31DIELMATERIAL=FR-4|LAYER32NAME=Bottom Layer|LAYER32PREV=1|LAYER32NEXT=0|LAYER32MECHENABLED=FALSE|LAYER32COPTHICK=1.4mil|LAYER32DIELTYPE=0|LAYER32DIELCONST=4.800|LAYER32DIELHEIGHT=12.6mil|LAYER32DIELMATERIAL=FR-4|LAYER33NAME=Top Overlay|LAYER33PREV=0|LAYER33NEXT=1|LAYER33MECHENABLED=FALSE|LAYER33COPTHICK=1.4mil|LAYER33DIELTYPE=0|LAYER33DIELCONST=4.800|LAYER33DIELHEIGHT=12.6mil|LAYER33DIELMATERIAL=FR-4|LAYER34NAME=Bottom Overlay|LAYER34PREV=32|LAYER34NEXT=0|LAYER34MECHENABLED=FALSE|LAYER34COPTHICK=1.4mil|LAYER34DIELTYPE=0|LAYER34DIELCONST=4.800|LAYER34DIELHEIGHT=12.6mil|LAYER34DIELMATERIAL=FR-4|LAYER35NAME=Top Paste|LAYER35PREV=0|LAYER35NEXT=1|LAYER35MECHENABLED=FALSE|LAYER35COPTHICK=1.4mil|LAYER35DIELTYPE=0|LAYER35DIELCONST=4.800|LAYER35DIELHEIGHT=12.6mil|LAYER35DIELMATERIAL=FR-4 |RECORD=Board|LAYER36NAME=Bottom Paste|LAYER36PREV=32|LAYER36NEXT=0|LAYER36MECHENABLED=FALSE|LAYER36COPTHICK=1.4mil|LAYER36DIELTYPE=0|LAYER36DIELCONST=4.800|LAYER36DIELHEIGHT=12.6mil|LAYER36DIELMATERIAL=FR-4|LAYER37NAME=Top Solder|LAYER37PREV=0|LAYER37NEXT=1|LAYER37MECHENABLED=FALSE|LAYER37COPTHICK=1.4mil|LAYER37DIELTYPE=0|LAYER37DIELCONST=4.800|LAYER37DIELHEIGHT=12.6mil|LAYER37DIELMATERIAL=FR-4|LAYER38NAME=Bottom Solder|LAYER38PREV=32|LAYER38NEXT=0|LAYER38MECHENABLED=FALSE|LAYER38COPTHICK=1.4mil|LAYER38DIELTYPE=0|LAYER38DIELCONST=4.800|LAYER38DIELHEIGHT=12.6mil|LAYER38DIELMATERIAL=FR-4|LAYER39NAME=Internal Plane 1|LAYER39PREV=0|LAYER39NEXT=0|LAYER39MECHENABLED=FALSE|LAYER39COPTHICK=1.4mil|LAYER39DIELTYPE=0|LAYER39DIELCONST=4.800|LAYER39DIELHEIGHT=12.6mil|LAYER39DIELMATERIAL=FR-4|LAYER40NAME=Internal Plane 2|LAYER40PREV=0|LAYER40NEXT=0|LAYER40MECHENABLED=FALSE|LAYER40COPTHICK=1.4mil|LAYER40DIELTYPE=0|LAYER40DIELCONST=4.800|LAYER40DIELHEIGHT=12.6mil|LAYER40DIELMATERIAL=FR-4 |RECORD=Board|LAYER41NAME=Internal Plane 3|LAYER41PREV=0|LAYER41NEXT=0|LAYER41MECHENABLED=FALSE|LAYER41COPTHICK=1.4mil|LAYER41DIELTYPE=0|LAYER41DIELCONST=4.800|LAYER41DIELHEIGHT=12.6mil|LAYER41DIELMATERIAL=FR-4|LAYER42NAME=Internal Plane 4|LAYER42PREV=0|LAYER42NEXT=0|LAYER42MECHENABLED=FALSE|LAYER42COPTHICK=1.4mil|LAYER42DIELTYPE=0|LAYER42DIELCONST=4.800|LAYER42DIELHEIGHT=12.6mil|LAYER42DIELMATERIAL=FR-4|LAYER43NAME=Internal Plane 5|LAYER43PREV=0|LAYER43NEXT=0|LAYER43MECHENABLED=FALSE|LAYER43COPTHICK=1.4mil|LAYER43DIELTYPE=0|LAYER43DIELCONST=4.800|LAYER43DIELHEIGHT=12.6mil|LAYER43DIELMATERIAL=FR-4|LAYER44NAME=Internal Plane 6|LAYER44PREV=0|LAYER44NEXT=0|LAYER44MECHENABLED=FALSE|LAYER44COPTHICK=1.4mil|LAYER44DIELTYPE=0|LAYER44DIELCONST=4.800|LAYER44DIELHEIGHT=12.6mil|LAYER44DIELMATERIAL=FR-4|LAYER45NAME=Internal Plane 7|LAYER45PREV=0|LAYER45NEXT=0|LAYER45MECHENABLED=FALSE|LAYER45COPTHICK=1.4mil|LAYER45DIELTYPE=0|LAYER45DIELCONST=4.800|LAYER45DIELHEIGHT=12.6mil|LAYER45DIELMATERIAL=FR-4 |RECORD=Board|LAYER46NAME=Internal Plane 8|LAYER46PREV=0|LAYER46NEXT=0|LAYER46MECHENABLED=FALSE|LAYER46COPTHICK=1.4mil|LAYER46DIELTYPE=0|LAYER46DIELCONST=4.800|LAYER46DIELHEIGHT=12.6mil|LAYER46DIELMATERIAL=FR-4|LAYER47NAME=Internal Plane 9|LAYER47PREV=0|LAYER47NEXT=0|LAYER47MECHENABLED=FALSE|LAYER47COPTHICK=1.4mil|LAYER47DIELTYPE=0|LAYER47DIELCONST=4.800|LAYER47DIELHEIGHT=12.6mil|LAYER47DIELMATERIAL=FR-4|LAYER48NAME=Internal Plane 10|LAYER48PREV=0|LAYER48NEXT=0|LAYER48MECHENABLED=FALSE|LAYER48COPTHICK=1.4mil|LAYER48DIELTYPE=0|LAYER48DIELCONST=4.800|LAYER48DIELHEIGHT=12.6mil|LAYER48DIELMATERIAL=FR-4|LAYER49NAME=Internal Plane 11|LAYER49PREV=0|LAYER49NEXT=0|LAYER49MECHENABLED=FALSE|LAYER49COPTHICK=1.4mil|LAYER49DIELTYPE=0|LAYER49DIELCONST=4.800|LAYER49DIELHEIGHT=12.6mil|LAYER49DIELMATERIAL=FR-4|LAYER50NAME=Internal Plane 12|LAYER50PREV=0|LAYER50NEXT=0|LAYER50MECHENABLED=FALSE|LAYER50COPTHICK=1.4mil|LAYER50DIELTYPE=0|LAYER50DIELCONST=4.800|LAYER50DIELHEIGHT=12.6mil|LAYER50DIELMATERIAL=FR-4 |RECORD=Board|LAYER51NAME=Internal Plane 13|LAYER51PREV=0|LAYER51NEXT=0|LAYER51MECHENABLED=FALSE|LAYER51COPTHICK=1.4mil|LAYER51DIELTYPE=0|LAYER51DIELCONST=4.800|LAYER51DIELHEIGHT=12.6mil|LAYER51DIELMATERIAL=FR-4|LAYER52NAME=Internal Plane 14|LAYER52PREV=0|LAYER52NEXT=0|LAYER52MECHENABLED=FALSE|LAYER52COPTHICK=1.4mil|LAYER52DIELTYPE=0|LAYER52DIELCONST=4.800|LAYER52DIELHEIGHT=12.6mil|LAYER52DIELMATERIAL=FR-4|LAYER53NAME=Internal Plane 15|LAYER53PREV=0|LAYER53NEXT=0|LAYER53MECHENABLED=FALSE|LAYER53COPTHICK=1.4mil|LAYER53DIELTYPE=0|LAYER53DIELCONST=4.800|LAYER53DIELHEIGHT=12.6mil|LAYER53DIELMATERIAL=FR-4|LAYER54NAME=Internal Plane 16|LAYER54PREV=0|LAYER54NEXT=0|LAYER54MECHENABLED=FALSE|LAYER54COPTHICK=1.4mil|LAYER54DIELTYPE=0|LAYER54DIELCONST=4.800|LAYER54DIELHEIGHT=12.6mil|LAYER54DIELMATERIAL=FR-4|LAYER55NAME=Drill Guide|LAYER55PREV=0|LAYER55NEXT=0|LAYER55MECHENABLED=FALSE|LAYER55COPTHICK=1.4mil|LAYER55DIELTYPE=0|LAYER55DIELCONST=4.800|LAYER55DIELHEIGHT=12.6mil|LAYER55DIELMATERIAL=FR-4 |RECORD=Board|LAYER56NAME=Keep-Out Layer|LAYER56PREV=0|LAYER56NEXT=0|LAYER56MECHENABLED=FALSE|LAYER56COPTHICK=1.4mil|LAYER56DIELTYPE=0|LAYER56DIELCONST=4.800|LAYER56DIELHEIGHT=12.6mil|LAYER56DIELMATERIAL=FR-4|LAYER57NAME=Mechanical 1|LAYER57PREV=0|LAYER57NEXT=0|LAYER57MECHENABLED=TRUE|LAYER57COPTHICK=1.4mil|LAYER57DIELTYPE=0|LAYER57DIELCONST=4.800|LAYER57DIELHEIGHT=12.6mil|LAYER57DIELMATERIAL=FR-4|LAYER58NAME=Mechanical 2|LAYER58PREV=0|LAYER58NEXT=0|LAYER58MECHENABLED=FALSE|LAYER58COPTHICK=1.4mil|LAYER58DIELTYPE=0|LAYER58DIELCONST=4.800|LAYER58DIELHEIGHT=12.6mil|LAYER58DIELMATERIAL=FR-4|LAYER59NAME=Mechanical 3|LAYER59PREV=0|LAYER59NEXT=0|LAYER59MECHENABLED=FALSE|LAYER59COPTHICK=1.4mil|LAYER59DIELTYPE=0|LAYER59DIELCONST=4.800|LAYER59DIELHEIGHT=12.6mil|LAYER59DIELMATERIAL=FR-4|LAYER60NAME=Mechanical 4|LAYER60PREV=0|LAYER60NEXT=0|LAYER60MECHENABLED=FALSE|LAYER60COPTHICK=1.4mil|LAYER60DIELTYPE=0|LAYER60DIELCONST=4.800|LAYER60DIELHEIGHT=12.6mil|LAYER60DIELMATERIAL=FR-4 |RECORD=Board|LAYER61NAME=Mechanical 5|LAYER61PREV=0|LAYER61NEXT=0|LAYER61MECHENABLED=FALSE|LAYER61COPTHICK=1.4mil|LAYER61DIELTYPE=0|LAYER61DIELCONST=4.800|LAYER61DIELHEIGHT=12.6mil|LAYER61DIELMATERIAL=FR-4|LAYER62NAME=Mechanical 6|LAYER62PREV=0|LAYER62NEXT=0|LAYER62MECHENABLED=FALSE|LAYER62COPTHICK=1.4mil|LAYER62DIELTYPE=0|LAYER62DIELCONST=4.800|LAYER62DIELHEIGHT=12.6mil|LAYER62DIELMATERIAL=FR-4|LAYER63NAME=Mechanical 7|LAYER63PREV=0|LAYER63NEXT=0|LAYER63MECHENABLED=FALSE|LAYER63COPTHICK=1.4mil|LAYER63DIELTYPE=0|LAYER63DIELCONST=4.800|LAYER63DIELHEIGHT=12.6mil|LAYER63DIELMATERIAL=FR-4|LAYER64NAME=Mechanical 8|LAYER64PREV=0|LAYER64NEXT=0|LAYER64MECHENABLED=FALSE|LAYER64COPTHICK=1.4mil|LAYER64DIELTYPE=0|LAYER64DIELCONST=4.800|LAYER64DIELHEIGHT=12.6mil|LAYER64DIELMATERIAL=FR-4|LAYER65NAME=Mechanical 9|LAYER65PREV=0|LAYER65NEXT=0|LAYER65MECHENABLED=FALSE|LAYER65COPTHICK=1.4mil|LAYER65DIELTYPE=0|LAYER65DIELCONST=4.800|LAYER65DIELHEIGHT=12.6mil|LAYER65DIELMATERIAL=FR-4 |RECORD=Board|LAYER66NAME=Mechanical 10|LAYER66PREV=0|LAYER66NEXT=0|LAYER66MECHENABLED=FALSE|LAYER66COPTHICK=1.4mil|LAYER66DIELTYPE=0|LAYER66DIELCONST=4.800|LAYER66DIELHEIGHT=12.6mil|LAYER66DIELMATERIAL=FR-4|LAYER67NAME=Mechanical 11|LAYER67PREV=0|LAYER67NEXT=0|LAYER67MECHENABLED=FALSE|LAYER67COPTHICK=1.4mil|LAYER67DIELTYPE=0|LAYER67DIELCONST=4.800|LAYER67DIELHEIGHT=12.6mil|LAYER67DIELMATERIAL=FR-4|LAYER68NAME=Mechanical 12|LAYER68PREV=0|LAYER68NEXT=0|LAYER68MECHENABLED=FALSE|LAYER68COPTHICK=1.4mil|LAYER68DIELTYPE=0|LAYER68DIELCONST=4.800|LAYER68DIELHEIGHT=12.6mil|LAYER68DIELMATERIAL=FR-4|LAYER69NAME=Mechanical 13|LAYER69PREV=0|LAYER69NEXT=0|LAYER69MECHENABLED=FALSE|LAYER69COPTHICK=1.4mil|LAYER69DIELTYPE=0|LAYER69DIELCONST=4.800|LAYER69DIELHEIGHT=12.6mil|LAYER69DIELMATERIAL=FR-4|LAYER70NAME=Mechanical 14|LAYER70PREV=0|LAYER70NEXT=0|LAYER70MECHENABLED=FALSE|LAYER70COPTHICK=1.4mil|LAYER70DIELTYPE=0|LAYER70DIELCONST=4.800|LAYER70DIELHEIGHT=12.6mil|LAYER70DIELMATERIAL=FR-4 |RECORD=Board|LAYER71NAME=Mechanical 15|LAYER71PREV=0|LAYER71NEXT=0|LAYER71MECHENABLED=TRUE|LAYER71COPTHICK=1.4mil|LAYER71DIELTYPE=0|LAYER71DIELCONST=4.800|LAYER71DIELHEIGHT=12.6mil|LAYER71DIELMATERIAL=FR-4|LAYER72NAME=Mechanical 16|LAYER72PREV=0|LAYER72NEXT=0|LAYER72MECHENABLED=FALSE|LAYER72COPTHICK=1.4mil|LAYER72DIELTYPE=0|LAYER72DIELCONST=4.800|LAYER72DIELHEIGHT=12.6mil|LAYER72DIELMATERIAL=FR-4|LAYER73NAME=Drill Drawing|LAYER73PREV=0|LAYER73NEXT=0|LAYER73MECHENABLED=FALSE|LAYER73COPTHICK=1.4mil|LAYER73DIELTYPE=0|LAYER73DIELCONST=4.800|LAYER73DIELHEIGHT=12.6mil|LAYER73DIELMATERIAL=FR-4|LAYER74NAME=Multi-Layer|LAYER74PREV=0|LAYER74NEXT=0|LAYER74MECHENABLED=FALSE|LAYER74COPTHICK=1.4mil|LAYER74DIELTYPE=0|LAYER74DIELCONST=4.800|LAYER74DIELHEIGHT=12.6mil|LAYER74DIELMATERIAL=FR-4|LAYER75NAME=Connections|LAYER75PREV=0|LAYER75NEXT=0|LAYER75MECHENABLED=FALSE|LAYER75COPTHICK=1.4mil|LAYER75DIELTYPE=0|LAYER75DIELCONST=4.800|LAYER75DIELHEIGHT=12.6mil|LAYER75DIELMATERIAL=FR-4 |RECORD=Board|LAYER76NAME=Background|LAYER76PREV=0|LAYER76NEXT=0|LAYER76MECHENABLED=FALSE|LAYER76COPTHICK=1.4mil|LAYER76DIELTYPE=0|LAYER76DIELCONST=4.800|LAYER76DIELHEIGHT=12.6mil|LAYER76DIELMATERIAL=FR-4|LAYER77NAME=DRC Error Markers|LAYER77PREV=0|LAYER77NEXT=0|LAYER77MECHENABLED=FALSE|LAYER77COPTHICK=1.4mil|LAYER77DIELTYPE=0|LAYER77DIELCONST=4.800|LAYER77DIELHEIGHT=12.6mil|LAYER77DIELMATERIAL=FR-4|LAYER78NAME=Selections|LAYER78PREV=0|LAYER78NEXT=0|LAYER78MECHENABLED=FALSE|LAYER78COPTHICK=1.4mil|LAYER78DIELTYPE=0|LAYER78DIELCONST=4.800|LAYER78DIELHEIGHT=12.6mil|LAYER78DIELMATERIAL=FR-4|LAYER79NAME=Visible Grid 1|LAYER79PREV=0|LAYER79NEXT=0|LAYER79MECHENABLED=FALSE|LAYER79COPTHICK=1.4mil|LAYER79DIELTYPE=0|LAYER79DIELCONST=4.800|LAYER79DIELHEIGHT=12.6mil|LAYER79DIELMATERIAL=FR-4|LAYER80NAME=Visible Grid 2|LAYER80PREV=0|LAYER80NEXT=0|LAYER80MECHENABLED=FALSE|LAYER80COPTHICK=1.4mil|LAYER80DIELTYPE=0|LAYER80DIELCONST=4.800|LAYER80DIELHEIGHT=12.6mil|LAYER80DIELMATERIAL=FR-4 |RECORD=Board|LAYER81NAME=Pad Holes|LAYER81PREV=0|LAYER81NEXT=0|LAYER81MECHENABLED=FALSE|LAYER81COPTHICK=1.4mil|LAYER81DIELTYPE=0|LAYER81DIELCONST=4.800|LAYER81DIELHEIGHT=12.6mil|LAYER81DIELMATERIAL=FR-4|LAYER82NAME=Via Holes|LAYER82PREV=0|LAYER82NEXT=0|LAYER82MECHENABLED=FALSE|LAYER82COPTHICK=1.4mil|LAYER82DIELTYPE=0|LAYER82DIELCONST=4.800|LAYER82DIELHEIGHT=12.6mil|LAYER82DIELMATERIAL=FR-4|LAYERV7_0LAYERID=16908305|LAYERV7_0NAME=Mechanical 17|LAYERV7_0PREV=16973824|LAYERV7_0NEXT=16973824|LAYERV7_0MECHENABLED=FALSE|LAYERV7_0COPTHICK=1.4mil|LAYERV7_0DIELTYPE=0|LAYERV7_0DIELCONST=4.800|LAYERV7_0DIELHEIGHT=12.6mil|LAYERV7_0DIELMATERIAL=FR-4|LAYERV7_1LAYERID=16908306|LAYERV7_1NAME=Mechanical 18|LAYERV7_1PREV=16973824|LAYERV7_1NEXT=16973824|LAYERV7_1MECHENABLED=FALSE|LAYERV7_1COPTHICK=1.4mil|LAYERV7_1DIELTYPE=0|LAYERV7_1DIELCONST=4.800|LAYERV7_1DIELHEIGHT=12.6mil|LAYERV7_1DIELMATERIAL=FR-4|LAYERV7_2LAYERID=16908307|LAYERV7_2NAME=Mechanical 19|LAYERV7_2PREV=16973824|LAYERV7_2NEXT=16973824|LAYERV7_2MECHENABLED=FALSE|LAYERV7_2COPTHICK=1.4mil|LAYERV7_2DIELTYPE=0|LAYERV7_2DIELCONST=4.800|LAYERV7_2DIELHEIGHT=12.6mil|LAYERV7_2DIELMATERIAL=FR-4|LAYERV7_3LAYERID=16908308|LAYERV7_3NAME=Mechanical 20|LAYERV7_3PREV=16973824|LAYERV7_3NEXT=16973824|LAYERV7_3MECHENABLED=FALSE|LAYERV7_3COPTHICK=1.4mil|LAYERV7_3DIELTYPE=0|LAYERV7_3DIELCONST=4.800|LAYERV7_3DIELHEIGHT=12.6mil|LAYERV7_3DIELMATERIAL=FR-4|LAYERV7_4LAYERID=16908309|LAYERV7_4NAME=Mechanical 21|LAYERV7_4PREV=16973824|LAYERV7_4NEXT=16973824|LAYERV7_4MECHENABLED=FALSE|LAYERV7_4COPTHICK=1.4mil|LAYERV7_4DIELTYPE=0|LAYERV7_4DIELCONST=4.800|LAYERV7_4DIELHEIGHT=12.6mil|LAYERV7_4DIELMATERIAL=FR-4|LAYERV7_5LAYERID=16908310|LAYERV7_5NAME=Mechanical 22|LAYERV7_5PREV=16973824|LAYERV7_5NEXT=16973824|LAYERV7_5MECHENABLED=FALSE|LAYERV7_5COPTHICK=1.4mil|LAYERV7_5DIELTYPE=0|LAYERV7_5DIELCONST=4.800|LAYERV7_5DIELHEIGHT=12.6mil|LAYERV7_5DIELMATERIAL=FR-4|LAYERV7_6LAYERID=16908311|LAYERV7_6NAME=Mechanical 23|LAYERV7_6PREV=16973824|LAYERV7_6NEXT=16973824|LAYERV7_6MECHENABLED=FALSE|LAYERV7_6COPTHICK=1.4mil|LAYERV7_6DIELTYPE=0|LAYERV7_6DIELCONST=4.800|LAYERV7_6DIELHEIGHT=12.6mil|LAYERV7_6DIELMATERIAL=FR-4|LAYERV7_7LAYERID=16908312|LAYERV7_7NAME=Mechanical 24|LAYERV7_7PREV=16973824|LAYERV7_7NEXT=16973824|LAYERV7_7MECHENABLED=FALSE|LAYERV7_7COPTHICK=1.4mil|LAYERV7_7DIELTYPE=0|LAYERV7_7DIELCONST=4.800|LAYERV7_7DIELHEIGHT=12.6mil|LAYERV7_7DIELMATERIAL=FR-4|LAYERV7_8LAYERID=16908313|LAYERV7_8NAME=Mechanical 25|LAYERV7_8PREV=16973824|LAYERV7_8NEXT=16973824|LAYERV7_8MECHENABLED=FALSE|LAYERV7_8COPTHICK=1.4mil|LAYERV7_8DIELTYPE=0|LAYERV7_8DIELCONST=4.800|LAYERV7_8DIELHEIGHT=12.6mil|LAYERV7_8DIELMATERIAL=FR-4|LAYERV7_9LAYERID=16908314|LAYERV7_9NAME=Mechanical 26|LAYERV7_9PREV=16973824|LAYERV7_9NEXT=16973824|LAYERV7_9MECHENABLED=FALSE|LAYERV7_9COPTHICK=1.4mil|LAYERV7_9DIELTYPE=0|LAYERV7_9DIELCONST=4.800|LAYERV7_9DIELHEIGHT=12.6mil|LAYERV7_9DIELMATERIAL=FR-4|LAYERV7_10LAYERID=16908315|LAYERV7_10NAME=Mechanical 27|LAYERV7_10PREV=16973824|LAYERV7_10NEXT=16973824|LAYERV7_10MECHENABLED=FALSE|LAYERV7_10COPTHICK=1.4mil|LAYERV7_10DIELTYPE=0|LAYERV7_10DIELCONST=4.800|LAYERV7_10DIELHEIGHT=12.6mil|LAYERV7_10DIELMATERIAL=FR-4|LAYERV7_11LAYERID=16908316|LAYERV7_11NAME=Mechanical 28|LAYERV7_11PREV=16973824|LAYERV7_11NEXT=16973824|LAYERV7_11MECHENABLED=FALSE|LAYERV7_11COPTHICK=1.4mil|LAYERV7_11DIELTYPE=0|LAYERV7_11DIELCONST=4.800|LAYERV7_11DIELHEIGHT=12.6mil|LAYERV7_11DIELMATERIAL=FR-4|LAYERV7_12LAYERID=16908317|LAYERV7_12NAME=Mechanical 29|LAYERV7_12PREV=16973824|LAYERV7_12NEXT=16973824|LAYERV7_12MECHENABLED=FALSE|LAYERV7_12COPTHICK=1.4mil|LAYERV7_12DIELTYPE=0|LAYERV7_12DIELCONST=4.800|LAYERV7_12DIELHEIGHT=12.6mil|LAYERV7_12DIELMATERIAL=FR-4|LAYERV7_13LAYERID=16908318|LAYERV7_13NAME=Mechanical 30|LAYERV7_13PREV=16973824|LAYERV7_13NEXT=16973824|LAYERV7_13MECHENABLED=FALSE|LAYERV7_13COPTHICK=1.4mil|LAYERV7_13DIELTYPE=0|LAYERV7_13DIELCONST=4.800|LAYERV7_13DIELHEIGHT=12.6mil|LAYERV7_13DIELMATERIAL=FR-4|LAYERV7_14LAYERID=16908319|LAYERV7_14NAME=Mechanical 31|LAYERV7_14PREV=16973824|LAYERV7_14NEXT=16973824|LAYERV7_14MECHENABLED=FALSE|LAYERV7_14COPTHICK=1.4mil|LAYERV7_14DIELTYPE=0|LAYERV7_14DIELCONST=4.800|LAYERV7_14DIELHEIGHT=12.6mil|LAYERV7_14DIELMATERIAL=FR-4|LAYERV7_15LAYERID=16908320|LAYERV7_15NAME=Mechanical 32|LAYERV7_15PREV=16973824|LAYERV7_15NEXT=16973824|LAYERV7_15MECHENABLED=FALSE|LAYERV7_15COPTHICK=1.4mil|LAYERV7_15DIELTYPE=0|LAYERV7_15DIELCONST=4.800|LAYERV7_15DIELHEIGHT=12.6mil|LAYERV7_15DIELMATERIAL=FR-4|LAYERPAIR0LOW=TOP|LAYERPAIR0HIGH=BOTTOM|LAYERPAIR0DRILLGUIDE=FALSE|LAYERPAIR0DRILLDRAWING=FALSE|LAYERPAIR0SUBSTACK_0={133D6234-F010-46C7-B390-43FBDD454A88} |RECORD=Board|TOGGLELAYERS=1111111111111111111111111111111111111111111111111111111111111111111111111111111111|PLACEMARKERX1=-0.0001mil|PLACEMARKERY1=-0.0001mil|PLACEMARKERX2=-0.0001mil|PLACEMARKERY2=-0.0001mil|PLACEMARKERX3=-0.0001mil|PLACEMARKERY3=-0.0001mil|PLACEMARKERX4=-0.0001mil|PLACEMARKERY4=-0.0001mil|PLACEMARKERX5=-0.0001mil|PLACEMARKERY5=-0.0001mil|PLACEMARKERX6=-0.0001mil|PLACEMARKERY6=-0.0001mil|PLACEMARKERX7=-0.0001mil|PLACEMARKERY7=-0.0001mil|PLACEMARKERX8=-0.0001mil|PLACEMARKERY8=-0.0001mil|PLACEMARKERX9=-0.0001mil|PLACEMARKERY9=-0.0001mil|PLACEMARKERX10=-0.0001mil|PLACEMARKERY10=-0.0001mil|SELECTIONMEMORYLOCK1=FALSE|SELECTIONMEMORYLOCK2=FALSE|SELECTIONMEMORYLOCK3=FALSE|SELECTIONMEMORYLOCK4=FALSE|SELECTIONMEMORYLOCK5=FALSE|SELECTIONMEMORYLOCK6=FALSE|SELECTIONMEMORYLOCK7=FALSE|SELECTIONMEMORYLOCK8=FALSE|SURFACEMICROSTRIP_I=(60/SQRT(Er*(1-EXP(-1.55*(0.00002+TraceToPlaneDistance)/TraceToPlaneDistance))))*LN(5.98*TraceToPlaneDistance/(0.8*TraceWidth+TraceHeight))|SURFACEMICROSTRIP_W=((5.98*TraceToPlaneDistance)/EXP(CharacteristicImpedance/(60/SQRT(Er*(1-EXP(-1.55*(0.00002+TraceToPlaneDistance)/TraceToPlaneDistance)))))-TraceHeight)/0.8|SYMMETRICSTRIPLINE_I=(80/SQRT(Er))*LN((1.9*(2*TraceToPlaneDistance+TraceHeight)/(0.8*TraceWidth+TraceHeight)))*(1-(TraceToPlaneDistance/(4*(PlaneToPlaneDistance-TraceHeight-TraceToPlaneDistance))))|SYMMETRICSTRIPLINE_W=((1.9*(2*TraceToPlaneDistance+TraceHeight))/(EXP((CharacteristicImpedance/(80/SQRT(Er)))/(1-(TraceToPlaneDistance/(4*(PlaneToPlaneDistance-TraceHeight-TraceToPlaneDistance))))))-TraceHeight)/0.8|ELECTRICALGRIDSNAPTOBO=FALSE|ELECTRICALGRIDUSEALLLAYERS=FALSE|ROUTINGDIRECTIONTOP LAYER=Automatic|ROUTINGDIRECTIONMID LAYER 1=Automatic|ROUTINGDIRECTIONMID LAYER 2=Automatic|ROUTINGDIRECTIONMID LAYER 3=Automatic|ROUTINGDIRECTIONMID LAYER 4=Automatic|ROUTINGDIRECTIONMID LAYER 5=Automatic|ROUTINGDIRECTIONMID LAYER 6=Automatic|ROUTINGDIRECTIONMID LAYER 7=Automatic|ROUTINGDIRECTIONMID LAYER 8=Automatic|ROUTINGDIRECTIONMID LAYER 9=Automatic|ROUTINGDIRECTIONMID LAYER 10=Automatic|ROUTINGDIRECTIONMID LAYER 11=Automatic|ROUTINGDIRECTIONMID LAYER 12=Automatic|ROUTINGDIRECTIONMID LAYER 13=Automatic|ROUTINGDIRECTIONMID LAYER 14=Automatic|ROUTINGDIRECTIONMID LAYER 15=Automatic|ROUTINGDIRECTIONMID LAYER 16=Automatic|ROUTINGDIRECTIONMID LAYER 17=Automatic|ROUTINGDIRECTIONMID LAYER 18=Automatic|ROUTINGDIRECTIONMID LAYER 19=Automatic|ROUTINGDIRECTIONMID LAYER 20=Automatic|ROUTINGDIRECTIONMID LAYER 21=Automatic|ROUTINGDIRECTIONMID LAYER 22=Automatic|ROUTINGDIRECTIONMID LAYER 23=Automatic|ROUTINGDIRECTIONMID LAYER 24=Automatic|ROUTINGDIRECTIONMID LAYER 25=Automatic|ROUTINGDIRECTIONMID LAYER 26=Automatic|ROUTINGDIRECTIONMID LAYER 27=Automatic|ROUTINGDIRECTIONMID LAYER 28=Automatic|ROUTINGDIRECTIONMID LAYER 29=Automatic|ROUTINGDIRECTIONMID LAYER 30=Automatic|ROUTINGDIRECTIONBOTTOM LAYER=Automatic|TOPLAYER_MRLASTWIDTH=15mil|MIDLAYER1_MRLASTWIDTH=15mil|MIDLAYER2_MRLASTWIDTH=15mil|MIDLAYER3_MRLASTWIDTH=15mil|MIDLAYER4_MRLASTWIDTH=15mil|MIDLAYER5_MRLASTWIDTH=15mil|MIDLAYER6_MRLASTWIDTH=15mil|MIDLAYER7_MRLASTWIDTH=15mil|MIDLAYER8_MRLASTWIDTH=15mil|MIDLAYER9_MRLASTWIDTH=15mil|MIDLAYER10_MRLASTWIDTH=15mil|MIDLAYER11_MRLASTWIDTH=15mil|MIDLAYER12_MRLASTWIDTH=15mil|MIDLAYER13_MRLASTWIDTH=15mil|MIDLAYER14_MRLASTWIDTH=15mil|MIDLAYER15_MRLASTWIDTH=15mil|MIDLAYER16_MRLASTWIDTH=15mil|MIDLAYER17_MRLASTWIDTH=15mil|MIDLAYER18_MRLASTWIDTH=15mil|MIDLAYER19_MRLASTWIDTH=15mil|MIDLAYER20_MRLASTWIDTH=15mil|MIDLAYER21_MRLASTWIDTH=15mil|MIDLAYER22_MRLASTWIDTH=15mil|MIDLAYER23_MRLASTWIDTH=15mil|MIDLAYER24_MRLASTWIDTH=15mil|MIDLAYER25_MRLASTWIDTH=15mil|MIDLAYER26_MRLASTWIDTH=15mil|MIDLAYER27_MRLASTWIDTH=15mil|MIDLAYER28_MRLASTWIDTH=15mil|MIDLAYER29_MRLASTWIDTH=15mil|MIDLAYER30_MRLASTWIDTH=15mil|BOTTOMLAYER_MRLASTWIDTH=15mil|MRLASTVIASIZE=50mil|MRLASTVIAHOLE=28mil|LASTTARGETLENGTH=99999mil|SHOWDEFAULTSETS=TRUE|LAYERSETSCOUNT=5|LAYERSET1NAME=&All Layers|LAYERSET1LAYERS=MultiLayer,TopPaste,TopOverlay,TopSolder,TopLayer,BottomLayer,BottomSolder,BottomOverlay,BottomPaste,DrillGuide,KeepOutLayer,Mechanical1,Mechanical15,DrillDrawing|LAYERSET1ACTIVELAYER.7=TOP|LAYERSET1ISCURRENT=FALSE|LAYERSET1ISLOCKED=TRUE|LAYERSET1FLIPBOARD=FALSE|LAYERSET2NAME=&Signal Layers|LAYERSET2LAYERS=MultiLayer,TopLayer,BottomLayer|LAYERSET2ACTIVELAYER.7=TOP|LAYERSET2ISCURRENT=FALSE|LAYERSET2ISLOCKED=TRUE|LAYERSET2FLIPBOARD=FALSE|LAYERSET3NAME=&Plane Layers|LAYERSET3LAYERS=|LAYERSET3ACTIVELAYER.7=UNKNOWN|LAYERSET3ISCURRENT=FALSE|LAYERSET3ISLOCKED=TRUE|LAYERSET3FLIPBOARD=FALSE|LAYERSET4NAME=&NonSignal Layers|LAYERSET4LAYERS=MultiLayer,TopPaste,TopOverlay,TopSolder,BottomSolder,BottomOverlay,BottomPaste,DrillGuide,KeepOutLayer,DrillDrawing|LAYERSET4ACTIVELAYER.7=MULTILAYER|LAYERSET4ISCURRENT=FALSE|LAYERSET4ISLOCKED=TRUE|LAYERSET4FLIPBOARD=FALSE|LAYERSET5NAME=&Mechanical Layers|LAYERSET5LAYERS=Mechanical1,Mechanical15|LAYERSET5ACTIVELAYER.7=MECHANICAL1|LAYERSET5ISCURRENT=FALSE|LAYERSET5ISLOCKED=TRUE|LAYERSET5FLIPBOARD=FALSE|BOARDINSIGHTVIEWCONFIGURATIONNAME= |RECORD=Board|VISIBLEGRIDMULTFACTOR=1.000|BIGVISIBLEGRIDMULTFACTOR=5.000|ELECTRICALGRIDMULTFACT=0.000|OUTLINEMODELCRC=0|OUTLINEMODELNAME= |RECORD=Board|CURRENT2D3DVIEWSTATE=2D |RECORD=Board|VP.LX=0|VP.HX=5684260|VP.LY=0|VP.HY=3947638 |RECORD=Board|2DCONFIGTYPE=.config_2dsimple|2DCONFIGURATION=`RECORD=Board`CFGALL.CONFIGURATIONKIND=1`CFGALL.CONFIGURATIONDESC=Altium%20Standard%202D`CFGALL.COMPONENTBODYREFPOINTCOLOR=16777215`CFGALL.COMPONENTBODYSNAPPOINTCOLOR=16777215`CFGALL.SHOWCOMPONENTSNAPMARKERS=FALSE`CFG2D.PRIMDRAWMODE=00000000000000000000000`CFG2D.LAYEROPACITY.TOPLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER2=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER3=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER4=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER5=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER6=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER7=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER8=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER9=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER11=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER12=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER13=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER14=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER15=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER16=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER17=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER18=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER19=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER20=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER21=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER22=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER23=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER24=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER25=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER26=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER27=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER28=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER29=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MIDLAYER30=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.TOPOVERLAY=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMOVERLAY=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.TOPPASTE=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMPASTE=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.TOPSOLDER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BOTTOMSOLDER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE2=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE3=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE4=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE5=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE6=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE7=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE8=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE9=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE11=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE12=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE13=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE14=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE15=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.INTERNALPLANE16=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.DRILLGUIDE=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.KEEPOUTLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL2=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL3=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL4=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL5=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL6=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL7=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL8=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL9=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL11=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL12=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL13=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL14=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL15=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL16=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.DRILLDRAWING=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MULTILAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.CONNECTLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.BACKGROUNDLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.DRCERRORLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.HIGHLIGHTLAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.GRIDCOLOR1=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.GRIDCOLOR10=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.PADHOLELAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.VIAHOLELAYER=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL17=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL18=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL19=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL20=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL21=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL22=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL23=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL24=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL25=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL26=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL27=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL28=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL29=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL30=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL31=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.LAYEROPACITY.MECHANICAL32=1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?1.00?0.40?1.00?1.00?1.00?1.00?1.00?1.00?`CFG2D.TOGGLELAYERS=11111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111111`CFG2D.TOGGLELAYERS.SET=Signal.All~-1_Mechanical.All~-1_Internal.All~-1_Standard.All~-1_Dielectric.All~0`CFG2D.WORKSPACECOLALPHA0=1.0`CFG2D.WORKSPACECOLALPHA1=1.0`CFG2D.WORKSPACECOLALPHA2=1.0`CFG2D.WORKSPACECOLALPHA3=1.0`CFG2D.WORKSPACECOLALPHA4=1.0`CFG2D.WORKSPACECOLALPHA5=1.0`CFG2D.WORKSPACECOLALPHA6=1.0`CFG2D.WORKSPACECOLALPHA7=1.0`CFG2D.WORKSPACECOLALPHA8=1.0`CFG2D.WORKSPACECOLALPHA9=1.0`CFG2D.WORKSPACECOLALPHA10=1.0`CFG2D.WORKSPACECOLALPHA11=1.0`CFG2D.WORKSPACECOLALPHA13=1.0`CFG2D.WORKSPACECOLALPHA14=1.0`CFG2D.MECHLAYERINSINGLELAYERMODE=00000000000000000000000000000000`CFG2D.MECHLAYERINSINGLELAYERMODE.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean,25165826~0`CFG2D.MECHLAYERLINKEDTOSHEET=00000000000000000000000000000000`CFG2D.MECHLAYERLINKEDTOSHEET.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean,25165826~0`CFG2D.CURRENTLAYER=MECHANICAL1`CFG2D.DISPLAYSPECIALSTRINGS=FALSE`CFG2D.SHOWTESTPOINTS=FALSE`CFG2D.SHOWORIGINMARKER=TRUE`CFG2D.EYEDIST=2000`CFG2D.SHOWSTATUSINFO=TRUE`CFG2D.SHOWPADNETS=TRUE`CFG2D.SHOWPADNUMBERS=TRUE`CFG2D.SHOWVIANETS=TRUE`CFG2D.SHOWVIASPAN=TRUE`CFG2D.USETRANSPARENTLAYERS=FALSE`CFG2D.PLANEDRAWMODE=2`CFG2D.DISPLAYNETNAMESONTRACKS=1`CFG2D.FROMTOSDISPLAYMODE=0`CFG2D.PADTYPESDISPLAYMODE=0`CFG2D.SINGLELAYERMODESTATE=3`CFG2D.ORIGINMARKERCOLOR=16777215`CFG2D.SHOWCOMPONENTREFPOINT=FALSE`CFG2D.COMPONENTREFPOINTCOLOR=16777215`CFG2D.POSITIVETOPSOLDERMASK=FALSE`CFG2D.POSITIVEBOTTOMSOLDERMASK=FALSE`CFG2D.TOPPOSITIVESOLDERMASKALPHA=0.500000`CFG2D.BOTTOMPOSITIVESOLDERMASKALPHA=0.500000`CFG2D.ALLCONNECTIONSINSINGLELAYERMODE=TRUE`CFG2D.MULTICOLOREDCONNECTIONS=FALSE`CFG2D.SHOWSPECIALSTRINGSHANDLES=FALSE |RECORD=Board|2DCONFIGFULLFILENAME=C:\Users\Jeremy Blum\AppData\Roaming\Altium\Altium Designer {1EB032F1-E719-4057-9342-D6BAF9C1E861}\ViewConfigurations\Altium Standard 2D.config_2dsimple |RECORD=Board|3DCONFIGTYPE=.config_3d|3DCONFIGURATION=`RECORD=Board`CFGALL.CONFIGURATIONKIND=3`CFGALL.CONFIGURATIONDESC=Enter%20description%20of%20new%20view%20configuration`CFGALL.COMPONENTBODYREFPOINTCOLOR=16777215`CFGALL.COMPONENTBODYSNAPPOINTCOLOR=16777215`CFGALL.SHOWCOMPONENTSNAPMARKERS=FALSE`CFG3D.POSITIVETOPSOLDERMASK=TRUE`CFG3D.POSITIVEBOTTOMSOLDERMASK=TRUE`CFG3D.SHOWCOMPONENTBODIES=TRUE`CFG3D.SHOWCOMPONENTSTEPMODELS=TRUE`CFG3D.COMPONENTMODELPREFERENCE=0`CFG3D.SHOWCOMPONENTAXES=TRUE`CFG3D.SHOWBOARDCORE=TRUE`CFG3D.SHOWBOARDPREPREG=TRUE`CFG3D.SHOWTOPSILKSCREEN=TRUE`CFG3D.SHOWBOTSILKSCREEN=TRUE`CFG3D.SHOWORIGINMARKER=TRUE`CFG3D.EYEDIST=2000`CFG3D.SHOWCUTOUTS=TRUE`CFG3D.SHOWROUTETOOLPATH=TRUE`CFG3D.SHOWROOMS3D=FALSE`CFG3D.USESYSCOLORSFOR3D=FALSE`CFG3D.WORKSPACECOLOR=16777215`CFG3D.BOARDCORECOLOR=0`CFG3D.BOARDPREPREGCOLOR=0`CFG3D.TOPSOLDERMASKCOLOR=3307556`CFG3D.BOTSOLDERMASKCOLOR=3307556`CFG3D.COPPERCOLOR=2402753`CFG3D.TOPSILKSCREENCOLOR=16448250`CFG3D.BOTSILKSCREENCOLOR=16448250`CFG3D.WORKSPACELUMINANCEVARIATION=30`CFG3D.WORKSPACEBEGINCOLOR=16777215`CFG3D.WORKSPACEENDCOLOR=14671839`CFG3D.WORKSPACECOLOROPACITY=1.000000`CFG3D.BOARDCORECOLOROPACITY=0.500000`CFG3D.BOARDPREPREGCOLOROPACITY=0.500000`CFG3D.TOPSOLDERMASKCOLOROPACITY=0.600000`CFG3D.BOTSOLDERMASKCOLOROPACITY=0.600000`CFG3D.COPPERCOLOROPACITY=1.000000`CFG3D.TOPSILKSCREENCOLOROPACITY=1.000000`CFG3D.BOTSILKSCREENCOLOROPACITY=1.000000`CFG3D.BOARDTHICKNESSSCALING=1.000000`CFG3D.SHOWMECHANICALLAYERS=FALSE`CFG3D.MECHANICALLAYERSOPACITY=1.000000 |RECORD=Board|3DCONFIGFULLFILENAME=(Not Saved) |RECORD=Board|LOOKAT.X=0.000000|LOOKAT.Y=0.000000|LOOKAT.Z=0.000000|EYEROTATION.X=0.000000|EYEROTATION.Y=0.000000|EYEROTATION.Z=0.000000|ZOOMMULT=0.000001|VIEWSIZE.X=902|VIEWSIZE.Y=830|GR0_TYPE=CartesianGrid|GR0_NAME=Global Board Snap Grid|GR0_COLOR=6049101|GR0_COLORLGE=9473425|GR0_PRIO=50|GR0_OX=0mil|GR0_OY=0mil|GR0_DRAWMODE=1|GR0_DRAWMODELARGE=1|GR0_ENABLED=TRUE|GR0_MULT=1|GR0_MULTLARGE=5|GR0_DISPLAYUNIT=0|GR0_COMP=TRUE|GR0_GSX=98425.196850|GR0_GSY=98425.196850|GR0_QSX=99999mil|GR0_QSY=99999mil|GR0_ROT=0.000000|GR0_FLAGS=15|EGRANGE=8mil|EGMULT=0.000000|EGENABLED=TRUE|EGSNAPTOBOARDOUTLINE=FALSE|EGSNAPTOARCCENTERS=TRUE|EGUSEALLLAYERS=FALSE|OGSNAPENABLED=TRUE|MGSNAPENABLED=FALSE|POINTGUIDEENABLED=FALSE|GRIDSNAPENABLED=TRUE|NEAROBJECTSENABLED=FALSE|FAROBJECTSENABLED=TRUE|NEAROBJECTSET=011110100011000000000000001|FAROBJECTSET=001100000000000000000000000|NEARDISTANCE=200mil|DRILLSYMBOLASENUM=0|DRILLSYMBOLSIZE=200000|HOLESHAPEHASHSIZE=1|HASHKEY#0=[314960][0][0][1][2147483647 2147483647]|HASHVALUE#0=0|VIEWPORTSAREVISIBLE=TRUE|UNIQUEID=NAXMKXNP|PINPAIRCOUNT=0|SHOWSIGNALLAYERSONLY=TRUE|LAYERCOUNT=0|VALUECOUNT=13|FN#0=MEANDERCONTROLPERCENT|FV#0=100|FN#1=DIFFPAIRMAXAMPLITUDE|FV#1=1000000|FN#2=ISPINSWAPENABLED|FV#2=F|FN#3=DIFFPAIRMINSPACE|FV#3=200000|FN#4=ISGLOSSENABLED|FV#4=T|FN#5=SINGLEENDEDCORNERSTYLE|FV#5=0|FN#6=SINGLEENDEDMINSPACE|FV#6=200000|FN#7=DIFFPAIRCORNERSTYLE|FV#7=0|FN#8=SELECTEDPINSWAPS|FV#8=|FN#9=SELECTEDLENGTHRULES|FV#9=|FN#10=INCREASESPACING|FV#10=0|FN#11=ISTUNINGENABLED|FV#11=F|FN#12=SINGLEENDEDMAXAMPLITUDE|FV#12=1000000 |RECORD=EngineeringChangeOrderOptions|ECOISACTIVE=FALSE|ECOFILENAME=PCB.ECO |RECORD=OutputOptions|DRILLGUIDEHOLESIZE=30mil|DRILLDRAWSYMBOLSIZE=50mil|DRILLSYMBOLKIND=0|MULTILAYERONPADMASTER=TRUE|TOPLAYERONPADMASTER=TRUE|BOTTOMLAYERONPADMASTER=TRUE|INCLUDEVIASINSOLDERMASK=TRUE|INCLUDEUNCONNECTEDPADS=TRUE|INCLUDEMECH1WITHALLPLOTS=FALSE|INCLUDEMECH2WITHALLPLOTS=FALSE|INCLUDEMECH3WITHALLPLOTS=FALSE|INCLUDEMECH4WITHALLPLOTS=FALSE|INCLUDEMECH5WITHALLPLOTS=FALSE|INCLUDEMECH6WITHALLPLOTS=FALSE|INCLUDEMECH7WITHALLPLOTS=FALSE|INCLUDEMECH8WITHALLPLOTS=FALSE|INCLUDEMECH9WITHALLPLOTS=FALSE|INCLUDEMECH10WITHALLPLOTS=FALSE|INCLUDEMECH11WITHALLPLOTS=FALSE|INCLUDEMECH12WITHALLPLOTS=FALSE|INCLUDEMECH13WITHALLPLOTS=FALSE|INCLUDEMECH14WITHALLPLOTS=FALSE|INCLUDEMECH15WITHALLPLOTS=FALSE|INCLUDEMECH16WITHALLPLOTS=FALSE |RECORD=OutputOptions|PLOTLAYERS.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|FLIPLAYERS.SET=SerializeLayerHash.Version~2,ClassName~TLayerToBoolean|PLOTLAYERS=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000|FLIPLAYERS=0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000 |RECORD=PrinterOptions|DEVICE=|DRIVER=|OUTPUT=|SHOWHOLES=FALSE|SCALETOFITPAGE=FALSE|USEPRINTERFONTS=FALSE|USESOFTWAREARCS=FALSE|BATCHTYPE=0|COMPOSITETYPE=0|CBORDERSIZE=1000mil|SCALE=0.0001mil|XCORRECT=0.0001mil|YCORRECT=0.0001mil |RECORD=PrinterOptions|PLOTPADNETS=TRUE|PLOTPADNUMBERS=TRUE|PLOTTERSCALE=0.0001mil|PLOTTERXCORRECT=0.0001mil|PLOTTERYCORRECT=0.0001mil|PLOTTERXOFFSET=0mil|PLOTTERYOFFSET=0mil|PLOTTERSHOWHOLES=FALSE|PLOTTERUSESOFTWAREARCS=FALSE|PLOTTERWAITBETWEENSHEETS=FALSE|PLOTTEROUTPUTPORT=0|PLOTTERLANGUAGE=0 |RECORD=PrinterOptions|SPD1=3|THK1=13mil|SPD2=3|THK2=13mil|SPD3=3|THK3=13mil|SPD4=3|THK4=13mil|SPD5=3|THK5=13mil|SPD6=3|THK6=13mil|SPD7=3|THK7=13mil|SPD8=3|THK8=13mil |RECORD=PrinterOptions|PLOTMODE=0000000000000000000000|DRIVERTYPE=0 |RECORD=PrinterOptions|PLOTLAYERS=1111111111111111111111111111111111111111111111111111111111111111111111111111111111 |RECORD=PrinterOptions|PP1=1|PP2=1|PP3=1|PP4=1|PP5=1|PP6=1|PP7=1|PP8=1|PP9=1|PP10=1|PP11=1|PP12=1|PP13=1|PP14=1|PP15=1|PP16=1|PP17=1|PP18=1|PP19=1|PP20=1|PP21=1|PP22=1|PP23=1|PP24=1|PP25=1|PP26=1|PP27=1|PP28=1|PP29=1|PP30=1|PP31=1|PP32=1|PP33=1|PP34=1|PP35=1|PP36=1|PP37=1|PP38=1|PP39=1|PP40=1|PP41=1|PP42=1|PP43=1|PP44=1|PP45=1|PP46=1|PP47=1|PP48=1|PP49=1|PP50=1|PP51=1|PP52=1|PP53=1|PP54=1|PP55=1|PP56=1|PP57=1|PP58=1|PP59=1|PP60=1|PP61=1|PP62=1|PP63=1|PP64=1|PP65=1|PP66=1|PP67=1|PP68=1|PP69=1|PP70=1|PP71=1|PP72=1|PP73=1|PP74=1|PP75=1|PP76=1|PP77=1|PP78=1|PP79=1|PP80=1|PP81=1|PP82=1 |RECORD=PrinterOptions|PM1=2105376|PM2=197379|PM3=394758|PM4=592137|PM5=789516|PM6=986895|PM7=1184274|PM8=1381653|PM9=1579032|PM10=1776411 |RECORD=PrinterOptions|PM11=1973790|PM12=2171169|PM13=2368548|PM14=2565927|PM15=2763306|PM16=2960685|PM17=3158064|PM18=3355443|PM19=3552822|PM20=3750201 |RECORD=PrinterOptions|PM21=3947580|PM22=4144959|PM23=4342338|PM24=4539717|PM25=4737096|PM26=4934475|PM27=5131854|PM28=5329233|PM29=5526612|PM30=5723991 |RECORD=PrinterOptions|PM31=5921370|PM32=4210752|PM33=12632256|PM34=6513507|PM35=6710886|PM36=6908265|PM37=7105644|PM38=7303023|PM39=7500402|PM40=7697781 |RECORD=PrinterOptions|PM41=7895160|PM42=8092539|PM43=8289918|PM44=8487297|PM45=8684676|PM46=8882055|PM47=9079434|PM48=9276813|PM49=9474192|PM50=9671571 |RECORD=PrinterOptions|PM51=9868950|PM52=10066329|PM53=10263708|PM54=10461087|PM55=10658466|PM56=10855845|PM57=11053224|PM58=11250603|PM59=11447982|PM60=11645361 |RECORD=PrinterOptions|PM61=11842740|PM62=12040119|PM63=12237498|PM64=12434877|PM65=12632256|PM66=12829635|PM67=13027014|PM68=13224393|PM69=13421772|PM70=13619151 |RECORD=PrinterOptions|PM71=13816530|PM72=14013909|PM73=14211288|PM74=0|PM75=14606046|PM76=16777215|PM77=15000804|PM78=15198183|PM79=15395562|PM80=15592941 |RECORD=PrinterOptions|PM81=15790320|PM82=15987699 |RECORD=PrinterOptions|PC1=255|PC2=36540|PC3=16440176|PC4=6736896|PC5=16737945|PC6=16776960|PC7=8388736|PC8=16711935|PC9=32896|PC10=65535 |RECORD=PrinterOptions|PC11=8421504|PC12=16777215|PC13=8388736|PC14=8421376|PC15=12632256|PC16=128|PC17=32768|PC18=65280|PC19=8388608|PC20=16776960 |RECORD=PrinterOptions|PC21=8388736|PC22=16711935|PC23=32896|PC24=65535|PC25=8421504|PC26=16777215|PC27=8388736|PC28=8421376|PC29=12632256|PC30=128 |RECORD=PrinterOptions|PC31=32768|PC32=16711680|PC33=65535|PC34=32896|PC35=8421504|PC36=128|PC37=8388736|PC38=16711935|PC39=32768|PC40=128 |RECORD=PrinterOptions|PC41=8388736|PC42=8421376|PC43=32768|PC44=128|PC45=8388736|PC46=8421376|PC47=32768|PC48=128|PC49=8388736|PC50=8421376 |RECORD=PrinterOptions|PC51=32768|PC52=128|PC53=8388736|PC54=8421376|PC55=128|PC56=16711935|PC57=16711935|PC58=8388736|PC59=32768|PC60=32896 |RECORD=PrinterOptions|PC61=16711935|PC62=8388736|PC63=32768|PC64=32896|PC65=16711935|PC66=8388736|PC67=32768|PC68=32896|PC69=16711935|PC70=8388736 |RECORD=PrinterOptions|PC71=32768|PC72=0|PC73=2752767|PC74=12632256|PC75=7709086|PC76=0|PC77=65280|PC78=16777215|PC79=6049101|PC80=9473425 |RECORD=PrinterOptions|PC81=9474304|PC82=25217 |RECORD=GerberOptions|SORTOUTPUT=FALSE|USESOFTWAREARCS=TRUE|CENTERPHOTOPLOTS=TRUE|EMBEDAPERTURES=FALSE|PANELIZE=FALSE|G54=FALSE|PLUSTOL=0.005mil|MINUSTOL=0.005mil|FILMSIZEX=20000mil|FILMSIZEY=16000mil|BORDERSIZE=1000mil|APTTABLE=|MAXAPERSIZE=250mil|RELIEFSHAPESALLOWED=TRUE|PADSFLASHONLY=TRUE|GERBERUNITS=3|GERBERDECS=1|FLASHALLFILLS=FALSE |RECORD=AdvancedPlacerOptions|PLACELARGECLEAR=50mil|PLACESMALLCLEAR=20mil|PLACEUSEROTATION=TRUE|PLACEUSELAYERSWAP=FALSE|PLACEBYPASSNET1=|PLACEBYPASSNET2=|PLACEUSEADVANCEDPLACE=TRUE|PLACEUSEGROUPING=TRUE |RECORD=DesignRuleCheckerOptions|DOMAKEDRCFILE=TRUE|DOMAKEDRCERRORLIST=TRUE|DOSUBNETDETAILS=TRUE|REPORTFILENAME=|EXTERNALNETLISTFILENAME=|CHECKEXTERNALNETLIST=FALSE|MAXVIOLATIONCOUNT=500|REPORTDRILLEDSMTPADS=TRUE|REPORTINVALIDMULTILAYERPADS=TRUE|RULESETTOCHECK=0,1,2,3,4,5,15,16,18,19,21,22,23,26,42,45,46,47,50,52,53,54,55,56,60,62,63,64|ONLINERULESETTOCHECK=0,1,2,3,4,5,9,11,15,17,18,22,23,24,45,46,47,50,51,55,60,62|INTERNALPLANEWARNINGS=TRUE|VERIFYSHORTINGCOPPER=TRUE|REPORTBROKENPLANES=TRUE|REPORTDEADCOPPER=TRUE|DEADCOPPERMINAREA=10000000000.000000|REPORTSTARVEDTHERMALS=TRUE|MINSTARVEDCOPPERPERCENT=50|REPORTSTRADLINGHOLES=FALSE|REPORTHOLESINVOIDS=FALSE |RECORD=PinSwapOptions|QUIET=FALSE|APPROXIMATEPINPOSITIONS=FALSE|ALLOWPARTIALLYROUTEDCONNECTIONS=TRUE|VIAPENALTYSTATE=TRUE|CROSSOVERRATIO=50|VIAPENALTYVALUE=0|IGNORENETS=|IGNORENETCLASSES=|IGNORECOMPONENTS=|IGNOREDIFFERENTIALPAIRS=|HEURISTICNAME=|HEURISTICONOFFSTATE=|HEURISTICWEIGHTVALUE= |RECORD=TestpointOptions|TESTPOINTSEARCHORDERSMDPADSBTM=0|TESTPOINTSEARCHORDERSMDPADSTOP=1|TESTPOINTSEARCHORDERVIASBTM=2|TESTPOINTSEARCHORDERVIASTOP=3|TESTPOINTSEARCHORDERTHRUPADSBTM=4|TESTPOINTSEARCHORDERTHRUPADSTOP=5 |RECORD=Class|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Sample Schematic Sheet|KIND=1|SUPERCLASS=FALSE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=EKSDBKYV |RECORD=Class|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Component Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=CRCMRELH |RECORD=Class|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Signal Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=COKJIJVY |RECORD=Class|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Electrical Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=FXNWACPC |RECORD=Class|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Layers|KIND=4|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=XLKPEYNS |RECORD=Class|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Outside Board Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=PRUNPEPU|AUTOGENERATEDCLASSKIND=3 |RECORD=Class|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Inside Board Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|M0=Q1|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=FDSKNMHP|AUTOGENERATEDCLASSKIND=2 |RECORD=Class|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Bottom Side Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=QQPTCXTG|AUTOGENERATEDCLASSKIND=1 |RECORD=Class|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=Top Side Components|KIND=1|SUPERCLASS=FALSE|AUTOGENERATEDCLASS=TRUE|M0=Q1|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=VVVWKBMT|AUTOGENERATEDCLASSKIND=0 |RECORD=Class|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Components|KIND=1|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=TJKHJMJH |RECORD=Class|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Pads|KIND=3|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=WTYKRXPU |RECORD=Class|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All Nets|KIND=0|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=HHKGBWSV |RECORD=Class|INDEXFORSAVE=12|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|NAME=All From-Tos|KIND=2|SUPERCLASS=TRUE|SELECTED=FALSE|SCHAUTOGENERATEDCLUSTER=FALSE|UNIQUEID=QXPVYICP |RECORD=Component|ID=0|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|PRIMITIVELOCK=TRUE|X=157.4803mil|Y=157.4803mil|PATTERN=E3|NAMEON=TRUE|COMMENTON=FALSE|GROUPNUM=0|COUNT=0|ROTATION= 0.00000000000000E+0000|NAMEAUTOPOSITION=1|COMMENTAUTOPOSITION=3|UNIONINDEX=0|CHANNELOFFSET=0|SOURCEDESIGNATOR=Q1|SOURCEUNIQUEID=\PFBWQACS|SOURCEHIERARCHICALPATH=Sample Schematic Sheet|SOURCEFOOTPRINTLIBRARY=Sample Integrated Library.IntLib|SOURCECOMPONENTLIBRARY=Sample Integrated Library.IntLib|SOURCELIBREFERENCE=MOSFET-N|SOURCEDESCRIPTION=N-Channel MOSFET|SOURCECOMPLIBIDENTIFIERKIND=2|SOURCECOMPLIBRARYIDENTIFIER=Sample Integrated Library.IntLib|UNIQUEID=WTBWAHIL|JUMPERSVISIBLE=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=LatestRevisionDate|VALUE=17-Jul-2002|ISIMPORTED=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=LatestRevisionNote|VALUE=Re-released for DXP Platform.|ISIMPORTED=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=PackageDescription|VALUE=TO, Flat Index; 3 In-Line, Axial Leads; Body Dia. 4.6mm; Lead Dia. 0.5 mm (max)|ISIMPORTED=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=PackageReference|VALUE=E3|ISIMPORTED=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=PackageVersion|VALUE=1995/1996|ISIMPORTED=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=Published|VALUE=8-Jun-2000|ISIMPORTED=TRUE |RECORD=ParamItem|PRIMITIVEINDEX=Component#0|NAME=Publisher|VALUE=Altium Limited|ISIMPORTED=TRUE |RECORD=DXPRule|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=UnpouredPolygon|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=UnpouredPolygon|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=QFKDVCPG|DEFINEDBYLOGICALDOCUMENT=FALSE |RECORD=Rule|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=UnpouredPolygon|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=UnpouredPolygon|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=NetAntennae|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=NetAntennae|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=KMUHVMEL|DEFINEDBYLOGICALDOCUMENT=FALSE|NETANTENNAETOLERANCE=0mil |RECORD=Rule|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=NetAntennae|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=NetAntennae|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SilkToBoardRegionClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=SilkToBoardRegionClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=WXITUWUQ|DEFINEDBYLOGICALDOCUMENT=FALSE |RECORD=Rule|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SilkToBoardRegionClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SilkToBoardRegionClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SilkToSilkClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=SilkToSilkClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=NSHRSGNV|DEFINEDBYLOGICALDOCUMENT=FALSE|SILKTOSILKCLEARANCE=10mil |RECORD=Rule|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SilkToSilkClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SilkToSilkClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SilkToSolderMaskClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsPad|SCOPE2EXPRESSION=All|NAME=SilkToSolderMaskClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=VNFMPLKI|DEFINEDBYLOGICALDOCUMENT=FALSE|MINSILKSCREENTOMASKGAP=10mil|CLEARANCETOEXPOSEDCOPPER=TRUE |RECORD=Rule|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SilkToSolderMaskClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SilkToSolderMaskClearance|ENABLED=FALSE|COMMENTLENGTH=44|COMMENT=Protel DXP Scope 1 Expression Was: IsPad |RECORD=DXPRule|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=MinimumSolderMaskSliver|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=MinimumSolderMaskSliver|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=IVVIETYE|DEFINEDBYLOGICALDOCUMENT=FALSE|MINSOLDERMASKWIDTH=10mil |RECORD=Rule|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=MinimumSolderMaskSliver|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=MinimumSolderMaskSliver|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=HoleToHoleClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=HoleToHoleClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=KCBNJFRC|DEFINEDBYLOGICALDOCUMENT=FALSE|GAP=10mil|ALLOWSTACKEDMICROVIAS=TRUE |RECORD=Rule|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=HoleToHoleClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=HoleToHoleClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=DiffPairsRouting|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=DiffPairsRouting|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=MPYOJDST|DEFINEDBYLOGICALDOCUMENT=FALSE|MAXLIMIT=10mil|MINLIMIT=10mil|MOSTFREQGAP=10mil|TOPLAYER_MINWIDTH=15mil|TOPLAYER_MAXWIDTH=15mil|TOPLAYER_PREFWIDTH=15mil|MIDLAYER1_MINWIDTH=15mil|MIDLAYER1_MAXWIDTH=15mil|MIDLAYER1_PREFWIDTH=15mil|MIDLAYER2_MINWIDTH=15mil|MIDLAYER2_MAXWIDTH=15mil|MIDLAYER2_PREFWIDTH=15mil|MIDLAYER3_MINWIDTH=15mil|MIDLAYER3_MAXWIDTH=15mil|MIDLAYER3_PREFWIDTH=15mil|MIDLAYER4_MINWIDTH=15mil|MIDLAYER4_MAXWIDTH=15mil|MIDLAYER4_PREFWIDTH=15mil|MIDLAYER5_MINWIDTH=15mil|MIDLAYER5_MAXWIDTH=15mil|MIDLAYER5_PREFWIDTH=15mil|MIDLAYER6_MINWIDTH=15mil|MIDLAYER6_MAXWIDTH=15mil|MIDLAYER6_PREFWIDTH=15mil|MIDLAYER7_MINWIDTH=15mil|MIDLAYER7_MAXWIDTH=15mil|MIDLAYER7_PREFWIDTH=15mil|MIDLAYER8_MINWIDTH=15mil|MIDLAYER8_MAXWIDTH=15mil|MIDLAYER8_PREFWIDTH=15mil|MIDLAYER9_MINWIDTH=15mil|MIDLAYER9_MAXWIDTH=15mil|MIDLAYER9_PREFWIDTH=15mil|MIDLAYER10_MINWIDTH=15mil|MIDLAYER10_MAXWIDTH=15mil|MIDLAYER10_PREFWIDTH=15mil|MIDLAYER11_MINWIDTH=15mil|MIDLAYER11_MAXWIDTH=15mil|MIDLAYER11_PREFWIDTH=15mil|MIDLAYER12_MINWIDTH=15mil|MIDLAYER12_MAXWIDTH=15mil|MIDLAYER12_PREFWIDTH=15mil|MIDLAYER13_MINWIDTH=15mil|MIDLAYER13_MAXWIDTH=15mil|MIDLAYER13_PREFWIDTH=15mil|MIDLAYER14_MINWIDTH=15mil|MIDLAYER14_MAXWIDTH=15mil|MIDLAYER14_PREFWIDTH=15mil|MIDLAYER15_MINWIDTH=15mil|MIDLAYER15_MAXWIDTH=15mil|MIDLAYER15_PREFWIDTH=15mil|MIDLAYER16_MINWIDTH=15mil|MIDLAYER16_MAXWIDTH=15mil|MIDLAYER16_PREFWIDTH=15mil|MIDLAYER17_MINWIDTH=15mil|MIDLAYER17_MAXWIDTH=15mil|MIDLAYER17_PREFWIDTH=15mil|MIDLAYER18_MINWIDTH=15mil|MIDLAYER18_MAXWIDTH=15mil|MIDLAYER18_PREFWIDTH=15mil|MIDLAYER19_MINWIDTH=15mil|MIDLAYER19_MAXWIDTH=15mil|MIDLAYER19_PREFWIDTH=15mil|MIDLAYER20_MINWIDTH=15mil|MIDLAYER20_MAXWIDTH=15mil|MIDLAYER20_PREFWIDTH=15mil|MIDLAYER21_MINWIDTH=15mil|MIDLAYER21_MAXWIDTH=15mil|MIDLAYER21_PREFWIDTH=15mil|MIDLAYER22_MINWIDTH=15mil|MIDLAYER22_MAXWIDTH=15mil|MIDLAYER22_PREFWIDTH=15mil|MIDLAYER23_MINWIDTH=15mil|MIDLAYER23_MAXWIDTH=15mil|MIDLAYER23_PREFWIDTH=15mil|MIDLAYER24_MINWIDTH=15mil|MIDLAYER24_MAXWIDTH=15mil|MIDLAYER24_PREFWIDTH=15mil|MIDLAYER25_MINWIDTH=15mil|MIDLAYER25_MAXWIDTH=15mil|MIDLAYER25_PREFWIDTH=15mil|MIDLAYER26_MINWIDTH=15mil|MIDLAYER26_MAXWIDTH=15mil|MIDLAYER26_PREFWIDTH=15mil|MIDLAYER27_MINWIDTH=15mil|MIDLAYER27_MAXWIDTH=15mil|MIDLAYER27_PREFWIDTH=15mil|MIDLAYER28_MINWIDTH=15mil|MIDLAYER28_MAXWIDTH=15mil|MIDLAYER28_PREFWIDTH=15mil|MIDLAYER29_MINWIDTH=15mil|MIDLAYER29_MAXWIDTH=15mil|MIDLAYER29_PREFWIDTH=15mil|MIDLAYER30_MINWIDTH=15mil|MIDLAYER30_MAXWIDTH=15mil|MIDLAYER30_PREFWIDTH=15mil|BOTTOMLAYER_MINWIDTH=15mil|BOTTOMLAYER_MAXWIDTH=15mil|BOTTOMLAYER_PREFWIDTH=15mil|MAXUNCOUPLEDLENGTH=500mil |RECORD=Rule|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=DiffPairsRouting|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=DiffPairsRouting|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsBGA|SCOPE2EXPRESSION=All|NAME=Fanout_BGA|ENABLED=TRUE|PRIORITY=1|COMMENT=Fanout_BGA (Default Rule)|UNIQUEID=BEFGCMFL|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil |RECORD=Rule|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_BGA|ENABLED=FALSE|COMMENTLENGTH=69|COMMENT=Protel DXP Scope 1 Expression Was: IsBGA Fanout_BGA (Default Rule) |RECORD=DXPRule|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsLCC|SCOPE2EXPRESSION=All|NAME=Fanout_LCC|ENABLED=TRUE|PRIORITY=2|COMMENT=Fanout_LCC (Default Rule)|UNIQUEID=TTWIGGER|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil |RECORD=Rule|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_LCC|ENABLED=FALSE|COMMENTLENGTH=69|COMMENT=Protel DXP Scope 1 Expression Was: IsLCC Fanout_LCC (Default Rule) |RECORD=DXPRule|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=IsSOIC|SCOPE2EXPRESSION=All|NAME=Fanout_SOIC|ENABLED=TRUE|PRIORITY=3|COMMENT=Fanout_SOIC (Default Rule)|UNIQUEID=XTCCKVDR|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil |RECORD=Rule|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_SOIC|ENABLED=FALSE|COMMENTLENGTH=71|COMMENT=Protel DXP Scope 1 Expression Was: IsSOIC Fanout_SOIC (Default Rule) |RECORD=DXPRule|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=(CompPinCount < 5)|SCOPE2EXPRESSION=All|NAME=Fanout_Small|ENABLED=TRUE|PRIORITY=4|COMMENT=Fanout_Small (Default Rule)|UNIQUEID=JGBUQKCO|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=OutThenIn|VIAGRID=1mil |RECORD=Rule|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_Small|ENABLED=FALSE|COMMENTLENGTH=84|COMMENT=Protel DXP Scope 1 Expression Was: (CompPinCount < 5) Fanout_Small (Default Rule) |RECORD=DXPRule|INDEXFORSAVE=12|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Fanout_Default|ENABLED=TRUE|PRIORITY=5|COMMENT=Fanout_Default (Default Rule)|UNIQUEID=CWRCADAM|DEFINEDBYLOGICALDOCUMENT=FALSE|BGADIR=Out|BGAVIAMODE=Centered|FANOUTSTYLE=Auto|FANOUTDIRECTION=Alternating|VIAGRID=1mil |RECORD=Rule|INDEXFORSAVE=12|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FanoutControl|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Fanout_Default|ENABLED=TRUE|COMMENTLENGTH=30|COMMENT=Fanout_Default (Default Rule) |RECORD=DXPRule|INDEXFORSAVE=13|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=HoleSize|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=HoleSize|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=PRUOHPHJ|DEFINEDBYLOGICALDOCUMENT=FALSE|ABSOLUTEVALUES=TRUE|MAXLIMIT=100mil|MINLIMIT=1mil|MAXPERCENT=80.000|MINPERCENT=20.000 |RECORD=Rule|INDEXFORSAVE=13|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=HoleSize|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=HoleSize|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|ABSOLUTEVALUES=TRUE|MAXLIMIT=100mil|MINLIMIT=1mil|MAXPERCENT=80.000|MINPERCENT=20.000 |RECORD=DXPRule|INDEXFORSAVE=14|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=LayerPairs|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=LayerPairs|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=JRYAMCFT|DEFINEDBYLOGICALDOCUMENT=FALSE|ENFORCE=TRUE |RECORD=Rule|INDEXFORSAVE=14|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=LayerPairs|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=LayerPairs|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|ENFORCE=TRUE |RECORD=DXPRule|INDEXFORSAVE=15|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=Height|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Height|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=ILUYVPIE|DEFINEDBYLOGICALDOCUMENT=FALSE|MINHEIGHT=0mil|MAXHEIGHT=1000mil|PREFHEIGHT=500mil |RECORD=Rule|INDEXFORSAVE=15|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=Height|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Height|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=16|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=ComponentClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=ComponentClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=MYUBKMLN|DEFINEDBYLOGICALDOCUMENT=FALSE|GAP=10mil|COLLISIONCHECKMODE=3|VERTICALGAP=10mil|SHOWDISTANCES=FALSE |RECORD=Rule|INDEXFORSAVE=16|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=ComponentClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=ComponentClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|GAP=10mil|COLLISIONCHECKMODE=3 |RECORD=DXPRule|INDEXFORSAVE=17|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=AssemblyTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=AssemblyTestpoint|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=RDUIDLVC|DEFINEDBYLOGICALDOCUMENT=FALSE|TESTPOINTUNDERCOMPONENT=TRUE|MINSIZE=40mil|MAXSIZE=100mil|PREFEREDSIZE=60mil|MINHOLESIZE=0mil|MAXHOLESIZE=40mil|PREFEREDHOLESIZE=32mil|TESTPOINTGRID=1mil|USEGRID=TRUE|GRIDTOLERANCE=0.01mil|ALLOWSIDETOP=TRUE|ALLOWSIDEBOTTOM=TRUE |RECORD=Rule|INDEXFORSAVE=17|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=AssemblyTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=AssemblyTestpoint|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=18|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=AssemblyTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=AssemblyTestPointUsage|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=EGCLMOMR|DEFINEDBYLOGICALDOCUMENT=FALSE |RECORD=Rule|INDEXFORSAVE=18|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=AssemblyTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=AssemblyTestPointUsage|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=19|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FabricationTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=FabricationTestpoint|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=LXXMAVJC|DEFINEDBYLOGICALDOCUMENT=FALSE|SIDE=3|TESTPOINTUNDERCOMPONENT=TRUE|MINSIZE=40mil|MAXSIZE=100mil|PREFEREDSIZE=60mil|MINHOLESIZE=0mil|MAXHOLESIZE=40mil|PREFEREDHOLESIZE=32mil|TESTPOINTGRID=1mil|ALLOWSIDETOP=TRUE|ALLOWSIDEBOTTOM=TRUE|USEGRID=TRUE|GRIDTOLERANCE=0.01mil |RECORD=Rule|INDEXFORSAVE=19|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FabricationTestpoint|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=FabricationTestpoint|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|SIDE=3|TESTPOINTUNDERCOMPONENT=TRUE|MINSIZE=40mil|MAXSIZE=100mil|PREFEREDSIZE=60mil|MINHOLESIZE=0mil|MAXHOLESIZE=40mil|PREFEREDHOLESIZE=32mil|TESTPOINTGRID=1mil |RECORD=DXPRule|INDEXFORSAVE=20|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=FabricationTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=FabricationTestPointUsage|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=EIRQOERV|DEFINEDBYLOGICALDOCUMENT=FALSE|VALID=0|ALLOWMULTIPLE=FALSE |RECORD=Rule|INDEXFORSAVE=20|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=FabricationTestPointUsage|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=FabricationTestPointUsage|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|VALID=0|ALLOWMULTIPLE=FALSE |RECORD=DXPRule|INDEXFORSAVE=21|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingTopology|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingTopology|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=XSNTLGPO|DEFINEDBYLOGICALDOCUMENT=FALSE|TOPOLOGY=Shortest |RECORD=Rule|INDEXFORSAVE=21|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingTopology|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingTopology|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|TOPOLOGY=Shortest |RECORD=DXPRule|INDEXFORSAVE=22|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=SolderMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=SolderMaskExpansion|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=HKSUQFJD|DEFINEDBYLOGICALDOCUMENT=FALSE|EXPANSION=4mil |RECORD=Rule|INDEXFORSAVE=22|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=SolderMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=SolderMaskExpansion|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|EXPANSION=4mil |RECORD=DXPRule|INDEXFORSAVE=23|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PasteMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PasteMaskExpansion|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YQLUVIFO|DEFINEDBYLOGICALDOCUMENT=FALSE|EXPANSION=0mil |RECORD=Rule|INDEXFORSAVE=23|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PasteMaskExpansion|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PasteMaskExpansion|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|EXPANSION=0mil |RECORD=DXPRule|INDEXFORSAVE=24|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingVias|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingVias|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=OLHWBYQY|DEFINEDBYLOGICALDOCUMENT=FALSE|HOLEWIDTH=28mil|WIDTH=50mil|VIASTYLE=Through Hole|MINHOLEWIDTH=28mil|MINWIDTH=50mil|MAXHOLEWIDTH=28mil|MAXWIDTH=50mil |RECORD=Rule|INDEXFORSAVE=24|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingVias|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingVias|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|HOLEWIDTH=28mil|WIDTH=50mil|VIASTYLE=Through Hole|MINHOLEWIDTH=28mil|MINWIDTH=50mil|MAXHOLEWIDTH=28mil|MAXWIDTH=50mil |RECORD=DXPRule|INDEXFORSAVE=25|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingCorners|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingCorners|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=EEXDRFJE|DEFINEDBYLOGICALDOCUMENT=FALSE|CORNERSTYLE=45-Degree|MINSETBACK=100mil|MAXSETBACK=100mil |RECORD=Rule|INDEXFORSAVE=25|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingCorners|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingCorners|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|CORNERSTYLE=45-Degree|MINSETBACK=100mil|MAXSETBACK=100mil |RECORD=DXPRule|INDEXFORSAVE=26|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingLayers|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingLayers|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=GPADJHTY|DEFINEDBYLOGICALDOCUMENT=FALSE|TOP LAYER_V5=TRUE|MID LAYER 1_V5=TRUE|MID LAYER 2_V5=TRUE|MID LAYER 3_V5=TRUE|MID LAYER 4_V5=TRUE|MID LAYER 5_V5=TRUE|MID LAYER 6_V5=TRUE|MID LAYER 7_V5=TRUE|MID LAYER 8_V5=TRUE|MID LAYER 9_V5=TRUE|MID LAYER 10_V5=TRUE|MID LAYER 11_V5=TRUE|MID LAYER 12_V5=TRUE|MID LAYER 13_V5=TRUE|MID LAYER 14_V5=TRUE|MID LAYER 15_V5=TRUE|MID LAYER 16_V5=TRUE|MID LAYER 17_V5=TRUE|MID LAYER 18_V5=TRUE|MID LAYER 19_V5=TRUE|MID LAYER 20_V5=TRUE|MID LAYER 21_V5=TRUE|MID LAYER 22_V5=TRUE|MID LAYER 23_V5=TRUE|MID LAYER 24_V5=TRUE|MID LAYER 25_V5=TRUE|MID LAYER 26_V5=TRUE|MID LAYER 27_V5=TRUE|MID LAYER 28_V5=TRUE|MID LAYER 29_V5=TRUE|MID LAYER 30_V5=TRUE|BOTTOM LAYER_V5=TRUE |RECORD=Rule|INDEXFORSAVE=26|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingLayers|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingLayers|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|TOP LAYER=Automatic|MID LAYER 1=Automatic|MID LAYER 2=Automatic|MID LAYER 3=Automatic|MID LAYER 4=Automatic|MID LAYER 5=Automatic|MID LAYER 6=Automatic|MID LAYER 7=Automatic|MID LAYER 8=Automatic|MID LAYER 9=Automatic|MID LAYER 10=Automatic|MID LAYER 11=Automatic|MID LAYER 12=Automatic|MID LAYER 13=Automatic|MID LAYER 14=Automatic|MID LAYER 15=Automatic|MID LAYER 16=Automatic|MID LAYER 17=Automatic|MID LAYER 18=Automatic|MID LAYER 19=Automatic|MID LAYER 20=Automatic|MID LAYER 21=Automatic|MID LAYER 22=Automatic|MID LAYER 23=Automatic|MID LAYER 24=Automatic|MID LAYER 25=Automatic|MID LAYER 26=Automatic|MID LAYER 27=Automatic|MID LAYER 28=Automatic|MID LAYER 29=Automatic|MID LAYER 30=Automatic|BOTTOM LAYER=Automatic |RECORD=DXPRule|INDEXFORSAVE=27|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=RoutingPriority|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=RoutingPriority|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YNVHYVCP|DEFINEDBYLOGICALDOCUMENT=FALSE|ROUTINGPRIORITY=0 |RECORD=Rule|INDEXFORSAVE=27|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=RoutingPriority|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=RoutingPriority|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|PRIORITY=0 |RECORD=DXPRule|INDEXFORSAVE=28|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=Width|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Width|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=SJMEQBVQ|DEFINEDBYLOGICALDOCUMENT=FALSE|MAXLIMIT=10mil|MINLIMIT=10mil|PREFEREDWIDTH=10mil |RECORD=Rule|INDEXFORSAVE=28|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=Width|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Width|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|MAXLIMIT=10mil|MINLIMIT=10mil|PREFEREDWIDTH=10mil |RECORD=DXPRule|INDEXFORSAVE=29|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PolygonConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PolygonConnect|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=LDMLAJCX|DEFINEDBYLOGICALDOCUMENT=FALSE|CONNECTSTYLE=Relief|RELIEFCONDUCTORWIDTH=10mil|RELIEFENTRIES=4|POLYGONRELIEFANGLE=90 Angle|AIRGAPWIDTH=10mil |RECORD=Rule|INDEXFORSAVE=29|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PolygonConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PolygonConnect|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|CONNECTSTYLE=Relief|RELIEFCONDUCTORWIDTH=10mil|RELIEFENTRIES=4|POLYGONRELIEFANGLE=90 Angle |RECORD=DXPRule|INDEXFORSAVE=30|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PlaneClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PlaneClearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YYATIKGH|DEFINEDBYLOGICALDOCUMENT=FALSE|CLEARANCE=20mil |RECORD=Rule|INDEXFORSAVE=30|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PlaneClearance|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PlaneClearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|CLEARANCE=20mil |RECORD=DXPRule|INDEXFORSAVE=31|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=PlaneConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=PlaneConnect|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=RQYIRGGW|DEFINEDBYLOGICALDOCUMENT=FALSE|PLANECONNECTSTYLE=Relief|RELIEFEXPANSION=20mil|RELIEFENTRIES=4|RELIEFCONDUCTORWIDTH=10mil|RELIEFAIRGAP=10mil |RECORD=Rule|INDEXFORSAVE=31|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=PlaneConnect|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=PlaneConnect|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|PLANECONNECTSTYLE=Relief|RELIEFEXPANSION=20mil|RELIEFENTRIES=4|RELIEFCONDUCTORWIDTH=10mil|RELIEFAIRGAP=10mil |RECORD=DXPRule|INDEXFORSAVE=32|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=Clearance|NETSCOPE=DifferentNets|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=Clearance|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=DRALLYKS|DEFINEDBYLOGICALDOCUMENT=FALSE|GAP=10mil|GENERICCLEARANCE=10mil|IGNOREPADTOPADCLEARANCEINFOOTPRINT=FALSE|OBJECTCLEARANCES=ClearanceObj_Arc-ClearanceObj_Hole:0;ClearanceObj_Track-ClearanceObj_Hole:0;ClearanceObj_SMDPad-ClearanceObj_Hole:0;ClearanceObj_THPad-ClearanceObj_Hole:0;ClearanceObj_Via-ClearanceObj_Hole:0;ClearanceObj_Fill-ClearanceObj_Hole:0;ClearanceObj_Poly-ClearanceObj_Hole:0;ClearanceObj_Region-ClearanceObj_Hole:0;ClearanceObj_Text-ClearanceObj_Hole:0 |RECORD=Rule|INDEXFORSAVE=32|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=Clearance|NETSCOPE=DifferentNets|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=Clearance|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|GAP=10mil |RECORD=DXPRule|INDEXFORSAVE=33|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=UnRoutedNet|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=UnRoutedNet|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=PMXVKRAQ|DEFINEDBYLOGICALDOCUMENT=FALSE |RECORD=Rule|INDEXFORSAVE=33|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=UnRoutedNet|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=UnRoutedNet|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT= |RECORD=DXPRule|INDEXFORSAVE=34|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|RULEKIND=ShortCircuit|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1EXPRESSION=All|SCOPE2EXPRESSION=All|NAME=ShortCircuit|ENABLED=TRUE|PRIORITY=1|COMMENT=|UNIQUEID=YDRPMLCH|DEFINEDBYLOGICALDOCUMENT=FALSE|ALLOWED=FALSE |RECORD=Rule|INDEXFORSAVE=34|SELECTION=FALSE|LAYER=TOP|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|RULEKIND=ShortCircuit|NETSCOPE=AnyNet|LAYERKIND=SameLayer|SCOPE1COUNT=1|SCOPE1_0_KIND=Board|SCOPE1_0_VALUE=Board|SCOPE2COUNT=1|SCOPE2_0_KIND=Board|SCOPE2_0_VALUE=Board|NAME=ShortCircuit|ENABLED=TRUE|COMMENTLENGTH=0|COMMENT=|ALLOWED=FALSE |RECORD=Pad|COMPONENT=0|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=Rule|PASTEMASKEXPANSIONMODE=Rule|NAME=3|X=157.4803mil|Y=107.4803mil|XSIZE=78.74mil|YSIZE=39.37mil|SHAPE=ROUND|HOLESIZE=31.496mil|ROTATION= 0.00000000000000E+0000|PLATED=TRUE|DAISYCHAIN=Load|CCSV=0|CPLV=0|CCWV=1|CENV=1|CAGV=1|CPEV=1|CSEV=1|CPCV=1|CPRV=1|CCW=10mil|CEN=4|CAG=10mil|CPE=0mil|CSE=4mil|CPC=20mil|CPR=20mil|PADMODE=0|SWAPID_PAD=|SWAPID_GATE=|&|0|SWAPPEDPADNAME=|GATEID=0|OVERRIDEWITHV6_6SHAPES=FALSE|DRILLTYPE=0|HOLETYPE=0|HOLEWIDTH=0mil|HOLEROTATION= 0.00000000000000E+0000|PADXOFFSET0=0mil|PADYOFFSET0=0mil|PADXOFFSET1=0mil|PADYOFFSET1=0mil|PADXOFFSET2=0mil|PADYOFFSET2=0mil|PADXOFFSET3=0mil|PADYOFFSET3=0mil|PADXOFFSET4=0mil|PADYOFFSET4=0mil|PADXOFFSET5=0mil|PADYOFFSET5=0mil|PADXOFFSET6=0mil|PADYOFFSET6=0mil|PADXOFFSET7=0mil|PADYOFFSET7=0mil|PADXOFFSET8=0mil|PADYOFFSET8=0mil|PADXOFFSET9=0mil|PADYOFFSET9=0mil|PADXOFFSET10=0mil|PADYOFFSET10=0mil|PADXOFFSET11=0mil|PADYOFFSET11=0mil|PADXOFFSET12=0mil|PADYOFFSET12=0mil|PADXOFFSET13=0mil|PADYOFFSET13=0mil|PADXOFFSET14=0mil|PADYOFFSET14=0mil|PADXOFFSET15=0mil|PADYOFFSET15=0mil|PADXOFFSET16=0mil|PADYOFFSET16=0mil|PADXOFFSET17=0mil|PADYOFFSET17=0mil|PADXOFFSET18=0mil|PADYOFFSET18=0mil|PADXOFFSET19=0mil|PADYOFFSET19=0mil|PADXOFFSET20=0mil|PADYOFFSET20=0mil|PADXOFFSET21=0mil|PADYOFFSET21=0mil|PADXOFFSET22=0mil|PADYOFFSET22=0mil|PADXOFFSET23=0mil|PADYOFFSET23=0mil|PADXOFFSET24=0mil|PADYOFFSET24=0mil|PADXOFFSET25=0mil|PADYOFFSET25=0mil|PADXOFFSET26=0mil|PADYOFFSET26=0mil|PADXOFFSET27=0mil|PADYOFFSET27=0mil|PADXOFFSET28=0mil|PADYOFFSET28=0mil|PADXOFFSET29=0mil|PADYOFFSET29=0mil|PADXOFFSET30=0mil|PADYOFFSET30=0mil|PADXOFFSET31=0mil|PADYOFFSET31=0mil|PADJUMPERID=0|UNIQUEID=FTDXMXAD |RECORD=Pad|COMPONENT=0|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=Rule|PASTEMASKEXPANSIONMODE=Rule|NAME=2|X=157.4803mil|Y=157.4803mil|XSIZE=78.74mil|YSIZE=39.37mil|SHAPE=ROUND|HOLESIZE=31.496mil|ROTATION= 0.00000000000000E+0000|PLATED=TRUE|DAISYCHAIN=Load|CCSV=0|CPLV=0|CCWV=1|CENV=1|CAGV=1|CPEV=1|CSEV=1|CPCV=1|CPRV=1|CCW=10mil|CEN=4|CAG=10mil|CPE=0mil|CSE=4mil|CPC=20mil|CPR=20mil|PADMODE=0|SWAPID_PAD=|SWAPID_GATE=|&|0|SWAPPEDPADNAME=|GATEID=0|OVERRIDEWITHV6_6SHAPES=FALSE|DRILLTYPE=0|HOLETYPE=0|HOLEWIDTH=0mil|HOLEROTATION= 0.00000000000000E+0000|PADXOFFSET0=0mil|PADYOFFSET0=0mil|PADXOFFSET1=0mil|PADYOFFSET1=0mil|PADXOFFSET2=0mil|PADYOFFSET2=0mil|PADXOFFSET3=0mil|PADYOFFSET3=0mil|PADXOFFSET4=0mil|PADYOFFSET4=0mil|PADXOFFSET5=0mil|PADYOFFSET5=0mil|PADXOFFSET6=0mil|PADYOFFSET6=0mil|PADXOFFSET7=0mil|PADYOFFSET7=0mil|PADXOFFSET8=0mil|PADYOFFSET8=0mil|PADXOFFSET9=0mil|PADYOFFSET9=0mil|PADXOFFSET10=0mil|PADYOFFSET10=0mil|PADXOFFSET11=0mil|PADYOFFSET11=0mil|PADXOFFSET12=0mil|PADYOFFSET12=0mil|PADXOFFSET13=0mil|PADYOFFSET13=0mil|PADXOFFSET14=0mil|PADYOFFSET14=0mil|PADXOFFSET15=0mil|PADYOFFSET15=0mil|PADXOFFSET16=0mil|PADYOFFSET16=0mil|PADXOFFSET17=0mil|PADYOFFSET17=0mil|PADXOFFSET18=0mil|PADYOFFSET18=0mil|PADXOFFSET19=0mil|PADYOFFSET19=0mil|PADXOFFSET20=0mil|PADYOFFSET20=0mil|PADXOFFSET21=0mil|PADYOFFSET21=0mil|PADXOFFSET22=0mil|PADYOFFSET22=0mil|PADXOFFSET23=0mil|PADYOFFSET23=0mil|PADXOFFSET24=0mil|PADYOFFSET24=0mil|PADXOFFSET25=0mil|PADYOFFSET25=0mil|PADXOFFSET26=0mil|PADYOFFSET26=0mil|PADXOFFSET27=0mil|PADYOFFSET27=0mil|PADXOFFSET28=0mil|PADYOFFSET28=0mil|PADXOFFSET29=0mil|PADYOFFSET29=0mil|PADXOFFSET30=0mil|PADYOFFSET30=0mil|PADXOFFSET31=0mil|PADYOFFSET31=0mil|PADJUMPERID=0|UNIQUEID=QXVTVCTY |RECORD=Pad|COMPONENT=0|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=MULTILAYER|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=Rule|PASTEMASKEXPANSIONMODE=Rule|NAME=1|X=157.4803mil|Y=207.4803mil|XSIZE=78.7402mil|YSIZE=39.3701mil|SHAPE=ROUND|HOLESIZE=31.4961mil|ROTATION= 0.00000000000000E+0000|PLATED=TRUE|DAISYCHAIN=Load|CCSV=0|CPLV=0|CCWV=1|CENV=1|CAGV=1|CPEV=1|CSEV=1|CPCV=1|CPRV=1|CCW=10mil|CEN=4|CAG=10mil|CPE=0mil|CSE=4mil|CPC=20mil|CPR=20mil|PADMODE=0|SWAPID_PAD=|SWAPID_GATE=|&|0|SWAPPEDPADNAME=|GATEID=0|OVERRIDEWITHV6_6SHAPES=FALSE|DRILLTYPE=0|HOLETYPE=0|HOLEWIDTH=0mil|HOLEROTATION= 0.00000000000000E+0000|PADXOFFSET0=0mil|PADYOFFSET0=0mil|PADXOFFSET1=0mil|PADYOFFSET1=0mil|PADXOFFSET2=0mil|PADYOFFSET2=0mil|PADXOFFSET3=0mil|PADYOFFSET3=0mil|PADXOFFSET4=0mil|PADYOFFSET4=0mil|PADXOFFSET5=0mil|PADYOFFSET5=0mil|PADXOFFSET6=0mil|PADYOFFSET6=0mil|PADXOFFSET7=0mil|PADYOFFSET7=0mil|PADXOFFSET8=0mil|PADYOFFSET8=0mil|PADXOFFSET9=0mil|PADYOFFSET9=0mil|PADXOFFSET10=0mil|PADYOFFSET10=0mil|PADXOFFSET11=0mil|PADYOFFSET11=0mil|PADXOFFSET12=0mil|PADYOFFSET12=0mil|PADXOFFSET13=0mil|PADYOFFSET13=0mil|PADXOFFSET14=0mil|PADYOFFSET14=0mil|PADXOFFSET15=0mil|PADYOFFSET15=0mil|PADXOFFSET16=0mil|PADYOFFSET16=0mil|PADXOFFSET17=0mil|PADYOFFSET17=0mil|PADXOFFSET18=0mil|PADYOFFSET18=0mil|PADXOFFSET19=0mil|PADYOFFSET19=0mil|PADXOFFSET20=0mil|PADYOFFSET20=0mil|PADXOFFSET21=0mil|PADYOFFSET21=0mil|PADXOFFSET22=0mil|PADYOFFSET22=0mil|PADXOFFSET23=0mil|PADYOFFSET23=0mil|PADXOFFSET24=0mil|PADYOFFSET24=0mil|PADXOFFSET25=0mil|PADYOFFSET25=0mil|PADXOFFSET26=0mil|PADYOFFSET26=0mil|PADXOFFSET27=0mil|PADYOFFSET27=0mil|PADXOFFSET28=0mil|PADYOFFSET28=0mil|PADXOFFSET29=0mil|PADYOFFSET29=0mil|PADXOFFSET30=0mil|PADYOFFSET30=0mil|PADXOFFSET31=0mil|PADYOFFSET31=0mil|PADJUMPERID=0|UNIQUEID=MNBNLVGK |RECORD=Track|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=0mil|Y1=0mil|X2=330.7087mil|Y2=0mil|WIDTH=10mil|SUBPOLYINDEX=0 |RECORD=Track|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=330.7087mil|Y1=0mil|X2=330.7087mil|Y2=389.7638mil|WIDTH=10mil|SUBPOLYINDEX=0 |RECORD=Track|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=0mil|Y1=389.7638mil|X2=330.7087mil|Y2=389.7638mil|WIDTH=10mil|SUBPOLYINDEX=0 |RECORD=Track|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=MECHANICAL1|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=0mil|Y1=0mil|X2=0mil|Y2=389.7638mil|WIDTH=10mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=4|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=212.9923mil|Y1=62.9923mil|X2=212.9923mil|Y2=251.9683mil|WIDTH=7.874mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=5|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=101.9683mil|Y1=79.9213mil|X2=101.9683mil|Y2=235.0393mil|WIDTH=7.874mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=6|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=119.2913mil|Y1=62.9923mil|X2=212.9923mil|Y2=62.9923mil|WIDTH=7.874mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=7|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=119.2913mil|Y1=251.9683mil|X2=212.9923mil|Y2=251.9683mil|WIDTH=7.874mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=8|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=101.9683mil|Y1=235.0393mil|X2=119.2913mil|Y2=252.3623mil|WIDTH=7.874mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=9|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=101.9683mil|Y1=79.9213mil|X2=119.2913mil|Y2=62.5983mil|WIDTH=7.874mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=10|SELECTION=FALSE|LAYER=MECHANICAL15|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=157.4803mil|Y1=137.7953mil|X2=157.4803mil|Y2=177.1654mil|WIDTH=3.937mil|SUBPOLYINDEX=0 |RECORD=Track|COMPONENT=0|INDEXFORSAVE=11|SELECTION=FALSE|LAYER=MECHANICAL15|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|SOLDERMASKEXPANSIONMODE=None|PASTEMASKEXPANSIONMODE=None|X1=137.7953mil|Y1=157.4803mil|X2=177.1653mil|Y2=157.4803mil|WIDTH=3.937mil|SUBPOLYINDEX=0 |RECORD=Text|COMPONENT=0|INDEXFORSAVE=0|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=241.1419mil|Y1=74.2909mil|X2=292.31mil|Y2=145.1376mil|ROTATION= 0.00000000000000E+0000|X=247.0473mil|Y=80.1963mil|HEIGHT=59.055mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=3|WIDTH=5.9055mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=51|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=5|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=0mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=0mil|BARCODEYMARGIN=0mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=FALSE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE |RECORD=Text|COMPONENT=0|INDEXFORSAVE=1|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=241.1419mil|Y1=173.4249mil|X2=272.6313mil|Y2=244.2716mil|ROTATION= 0.00000000000000E+0000|X=247.0473mil|Y=179.3303mil|HEIGHT=59.055mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=1|WIDTH=5.9055mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=49|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=5|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=0mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=0mil|BARCODEYMARGIN=0mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=FALSE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE |RECORD=Text|COMPONENT=0|INDEXFORSAVE=2|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=97.9803mil|Y1=275.9803mil|X2=197.9544mil|Y2=355.9609mil|ROTATION= 0.00000000000000E+0000|X=107.9803mil|Y=285.9803mil|HEIGHT=60mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=Q1|WIDTH=10mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=81,49|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=3|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=1050mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=20mil|BARCODEYMARGIN=20mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=TRUE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE|DESIGNATOR=True |RECORD=Text|COMPONENT=0|INDEXFORSAVE=3|SELECTION=FALSE|LAYER=TOPOVERLAY|LOCKED=FALSE|POLYGONOUTLINE=FALSE|USERROUTED=TRUE|UNIONINDEX=0|X1=97.9803mil|Y1=-41.0197mil|X2=577.8316mil|Y2=38.9609mil|ROTATION= 0.00000000000000E+0000|X=107.9803mil|Y=-31.0197mil|HEIGHT=60mil|FONT=DEFAULT|ROTATION= 0.00000000000000E+0000|MIRROR=FALSE|TEXT=MOSFET-N|WIDTH=10mil|USETTFONTS=FALSE|BOLD=FALSE|ITALIC=FALSE|INVERTED=FALSE|FONTNAME=Arial|INVERTEDTTTEXTBORDER=0mil|WIDESTRING=77,79,83,70,69,84,45,78|USEINVERTEDRECTANGLE=FALSE|INVRECTWIDTH=0mil|INVRECTHEIGHT=0mil|TTFINVERTEDTEXTJUSTIFY=3|TTFOFFSETFROMINVERTEDRECT=0mil|TEXTKIND=0|BARCODEFULLWIDTH=1050mil|BARCODEFULLHEIGHT=210mil|BARCODEXMARGIN=20mil|BARCODEYMARGIN=20mil|BARCODEMINWIDTH=0mil|BARCODEKIND=0|BARCODERENDERMODE=1|BARCODEINVERTED=TRUE|BARCODEFONTNAME=Arial|BARCODESHOWTEXT=TRUE|ADVANCEMODE=FALSE|COMMENT=True RECORD=Region|INDEXFORSAVE=0|V7_LAYER=MULTILAYER|NAME=Layer Stack Region 1|LAYER=KEEPOUT|KEEPOUT=TRUE|ISBOARDCUTOUT=TRUE|KIND=0|SUBPOLYINDEX=-1|UNIONINDEX=0|ARCRESOLUTION=0.5mil|ISSHAPEBASED=FALSE|CAVITYHEIGHT=0mil|OBJECTKIND=BoardRegion|BENDINGLINECOUNT=0|LOCKED3D=FALSE|LAYERSTACKID={133D6234-F010-46C7-B390-43FBDD454A88} ================================================ FILE: samples/Altium Designer/Sample Output Job.OutJob ================================================ [OutputJobFile] Version=1.0 Caption= Description= VaultGUID= ItemGUID= ItemHRID= RevisionGUID= RevisionId= VaultHRID= AutoItemHRID= NextRevId= FolderGUID= LifeCycleDefinitionGUID= RevisionNamingSchemeGUID= [OutputGroup1] Name=Job Group Description= TargetOutputMedium=PDF VariantName=[No Variations] VariantScope=1 CurrentConfigurationName= TargetPrinter=Virtual Printer PrinterOptions=Record=PrinterOptions|Copies=1|Duplex=1|TrueTypeOptions=3|Collate=1|PrintJobKind=1|PrintWhat=1 OutputMedium1=PDF OutputMedium1_Type=Publish OutputType1=PDF3D OutputName1=PDF3D OutputCategory1=Documentation OutputDocumentPath1= OutputVariantName1= OutputEnabled1=1 OutputEnabled1_OutputMedium1=1 OutputDefault1=0 PageOptions1=Record=PageOptions|CenterHorizontal=True|CenterVertical=True|PrintScale=1.00|XCorrection=1.00|YCorrection=1.00|PrintKind=1|BorderSize=5000000|LeftOffset=0|BottomOffset=0|Orientation=2|PaperLength=1000|PaperWidth=1000|Scale=100|PaperSource=7|PrintQuality=-3|MediaType=1|DitherType=10|PrintScaleMode=1|PaperKind=Letter|PaperIndex=1 [PublishSettings] OutputFilePath1=.\Job1.PDF ReleaseManaged1=0 OutputBasePath1=.\ OutputPathMedia1= OutputPathMediaValue1= OutputPathOutputer1=[Output Type] OutputPathOutputerPrefix1= OutputPathOutputerValue1= OutputFileName1=Job1.PDF OutputFileNameMulti1= UseOutputNameForMulti1=1 OutputFileNameSpecial1= OpenOutput1=1 PromptOverwrite1=1 PublishMethod1=0 ZoomLevel1=50 FitSCHPrintSizeToDoc1=1 FitPCBPrintSizeToDoc1=1 GenerateNetsInfo1=1 MarkPins1=1 MarkNetLabels1=1 MarkPortsId1=1 GenerateTOC1=1 ShowComponentParameters1=1 GlobalBookmarks1=0 PDFACompliance1=Disabled PDFVersion1=Default [GeneratedFilesSettings] RelativeOutputPath1=.\Job1.PDF OpenOutputs1=1 ================================================ FILE: samples/Altium Designer/Sample Schematic Sheet.SchDoc ================================================ |HEADER=Protel for Windows - Schematic Capture Ascii File Version 5.0|WEIGHT=120|MINORVERSION=2|UNIQUEID=VUNWLVBI |RECORD=31|FONTIDCOUNT=4|SIZE1=10|FONTNAME1=Times New Roman|SIZE2=12|FONTNAME2=Times New Roman|SIZE3=10|ITALIC3=T|FONTNAME3=Times New Roman|SIZE4=15|ITALIC4=T|BOLD4=T|FONTNAME4=Times New Roman|USEMBCS=T|ISBOC=T|HOTSPOTGRIDON=T|HOTSPOTGRIDSIZE=4|SHEETSTYLE=10|SYSTEMFONT=1|BORDERON=T|SHEETNUMBERSPACESIZE=12|AREACOLOR=16317695|SNAPGRIDON=T|SNAPGRIDSIZE=10|VISIBLEGRIDON=T|VISIBLEGRIDSIZE=10|CUSTOMX=1000|CUSTOMY=800|SHOWTEMPLATEGRAPHICS=T|TEMPLATEFILENAME=C:\Users\Public\Documents\Altium\AD19\Templates\Letter.SchDot|DISPLAY_UNIT=0 |RECORD=39|ISNOTACCESIBLE=T|OWNERPARTID=-1|FILENAME=C:\Users\Public\Documents\Altium\AD19\Templates\Letter.SchDot |RECORD=4|OWNERINDEX=1|OWNERPARTID=-1|LOCATION.X=806|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==sheetnumber |RECORD=4|OWNERINDEX=1|INDEXINSHEET=1|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=70|COLOR=8388608|FONTID=3|TEXT==organization |RECORD=4|OWNERINDEX=1|INDEXINSHEET=2|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=60|COLOR=8388608|FONTID=3|TEXT==address1 |RECORD=4|OWNERINDEX=1|INDEXINSHEET=3|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=50|COLOR=8388608|FONTID=3|TEXT==address2 |RECORD=4|OWNERINDEX=1|INDEXINSHEET=4|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=40|COLOR=8388608|FONTID=3|TEXT==address3 |RECORD=4|OWNERINDEX=1|INDEXINSHEET=5|OWNERPARTID=-1|LOCATION.X=875|LOCATION.Y=30|COLOR=8388608|FONTID=3|TEXT==address4 |RECORD=4|OWNERINDEX=1|INDEXINSHEET=6|OWNERPARTID=-1|LOCATION.X=832|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==sheettotal |RECORD=4|OWNERINDEX=1|INDEXINSHEET=7|OWNERPARTID=-1|LOCATION.X=648|LOCATION.Y=64|COLOR=128|FONTID=4|TEXT==title |RECORD=4|OWNERINDEX=1|INDEXINSHEET=8|OWNERPARTID=-1|LOCATION.X=727|LOCATION.Y=44|COLOR=8388608|FONTID=2|TEXT==documentnumber |RECORD=4|OWNERINDEX=1|INDEXINSHEET=9|OWNERPARTID=-1|LOCATION.X=819|LOCATION.Y=44|COLOR=8388608|FONTID=2|TEXT==revision |RECORD=4|OWNERINDEX=1|INDEXINSHEET=10|OWNERPARTID=-1|LOCATION.X=650|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==CurrentDate |RECORD=4|OWNERINDEX=1|INDEXINSHEET=11|OWNERPARTID=-1|LOCATION.X=735|LOCATION.Y=30|COLOR=8388608|FONTID=1|TEXT==CurrentTime |RECORD=4|OWNERINDEX=1|INDEXINSHEET=12|OWNERPARTID=-1|LOCATION.X=650|LOCATION.Y=20|COLOR=8388608|FONTID=1|TEXT==DocumentFullPathAndName |RECORD=6|OWNERINDEX=1|INDEXINSHEET=13|OWNERPARTID=-1|LOCATIONCOUNT=3|X1=980|Y1=80|X2=620|Y2=80|X3=620|Y3=20 |RECORD=6|OWNERINDEX=1|INDEXINSHEET=14|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=620|Y1=60|X2=870|Y2=60 |RECORD=6|OWNERINDEX=1|INDEXINSHEET=15|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=690|Y1=60|X2=690|Y2=40 |RECORD=6|OWNERINDEX=1|INDEXINSHEET=16|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=980|Y1=30|X2=620|Y2=30 |RECORD=6|OWNERINDEX=1|INDEXINSHEET=17|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=780|Y1=60|X2=780|Y2=30 |RECORD=6|OWNERINDEX=1|INDEXINSHEET=18|OWNERPARTID=-1|LOCATIONCOUNT=3|X1=1080|Y1=80|X2=980|Y2=80|X3=980|Y3=30 |RECORD=4|OWNERINDEX=1|INDEXINSHEET=19|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=65|FONTID=1|TEXT=Title |RECORD=4|OWNERINDEX=1|INDEXINSHEET=20|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=45|FONTID=1|TEXT=Size: |RECORD=4|OWNERINDEX=1|INDEXINSHEET=21|OWNERPARTID=-1|LOCATION.X=695|LOCATION.Y=45|FONTID=1|TEXT=Number: |RECORD=4|OWNERINDEX=1|INDEXINSHEET=22|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=30|FONTID=1|TEXT=Date: |RECORD=4|OWNERINDEX=1|INDEXINSHEET=23|OWNERPARTID=-1|LOCATION.X=625|LOCATION.Y=20|FONTID=1|TEXT=File: |RECORD=4|OWNERINDEX=1|INDEXINSHEET=24|OWNERPARTID=-1|LOCATION.X=785|LOCATION.Y=45|FONTID=1|TEXT=Revision: |RECORD=4|OWNERINDEX=1|INDEXINSHEET=25|OWNERPARTID=-1|LOCATION.X=785|LOCATION.Y=30|FONTID=1|TEXT=Sheet |RECORD=4|OWNERINDEX=1|INDEXINSHEET=26|OWNERPARTID=-1|LOCATION.X=819|LOCATION.Y=30|FONTID=1|TEXT=of |RECORD=6|OWNERINDEX=1|INDEXINSHEET=27|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=870|Y1=80|X2=870|Y2=30 |RECORD=4|OWNERINDEX=1|INDEXINSHEET=28|OWNERPARTID=-1|LOCATION.X=710|LOCATION.Y=30|FONTID=1|TEXT=Time: |RECORD=4|OWNERINDEX=1|INDEXINSHEET=29|OWNERPARTID=-1|LOCATION.X=650|LOCATION.Y=44|COLOR=8388608|FONTID=2|TEXT=Letter |RECORD=6|OWNERINDEX=1|INDEXINSHEET=30|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=620|Y1=40|X2=870|Y2=40 |RECORD=6|OWNERINDEX=1|INDEXINSHEET=31|OWNERPARTID=-1|LOCATIONCOUNT=2|X1=980|Y1=30|X2=1080|Y2=30 |RECORD=30|OWNERINDEX=1|INDEXINSHEET=32|OWNERPARTID=-1|LOCATION.X=985|LOCATION.Y=35|CORNER.X=1075|CORNER.Y=75|EMBEDIMAGE=T|FILENAME=newAltmLogo.bmp |RECORD=41|INDEXINSHEET=1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=CurrentTime|READONLYSTATE=1|UNIQUEID=TFKFYYBZ |RECORD=41|INDEXINSHEET=2|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=CurrentDate|READONLYSTATE=1|UNIQUEID=CQMMQRIW |RECORD=41|INDEXINSHEET=3|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Time|READONLYSTATE=1|UNIQUEID=ORMXQSXJ |RECORD=41|INDEXINSHEET=4|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Date|READONLYSTATE=1|UNIQUEID=HZWWYOPY |RECORD=41|INDEXINSHEET=5|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=DocumentFullPathAndName|READONLYSTATE=1|UNIQUEID=NOAYSZIV |RECORD=41|INDEXINSHEET=6|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=DocumentName|READONLYSTATE=1|UNIQUEID=HEPZZOBD |RECORD=41|INDEXINSHEET=7|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=ModifiedDate|READONLYSTATE=1|UNIQUEID=LQITJDRB |RECORD=41|INDEXINSHEET=8|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=ApprovedBy|READONLYSTATE=1|UNIQUEID=HAXYCFAN |RECORD=41|INDEXINSHEET=9|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=CheckedBy|READONLYSTATE=1|UNIQUEID=BOYBRKEO |RECORD=41|INDEXINSHEET=10|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=Author|READONLYSTATE=1|UNIQUEID=JQQMCYKT |RECORD=41|INDEXINSHEET=11|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Blum Idea Labs, LLC.|NAME=CompanyName|READONLYSTATE=1|UNIQUEID=XSKIFVPJ |RECORD=41|INDEXINSHEET=12|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=DrawnBy|READONLYSTATE=1|UNIQUEID=WZQRCJTC |RECORD=41|INDEXINSHEET=13|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Jeremy Blum|NAME=Engineer|READONLYSTATE=1|UNIQUEID=EBYLPZMA |RECORD=41|INDEXINSHEET=14|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Blum Idea Labs, LLC.|NAME=Organization|READONLYSTATE=1|UNIQUEID=MTKSNFYI |RECORD=41|INDEXINSHEET=15|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=P. Sherman|NAME=Address1|READONLYSTATE=1|UNIQUEID=QEBJURHF |RECORD=41|INDEXINSHEET=16|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=42 Wallaby Way|NAME=Address2|READONLYSTATE=1|UNIQUEID=YOFSTNMZ |RECORD=41|INDEXINSHEET=17|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Sydney, NSW|NAME=Address3|READONLYSTATE=1|UNIQUEID=XOHAZYDX |RECORD=41|INDEXINSHEET=18|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Australia|NAME=Address4|READONLYSTATE=1|UNIQUEID=GJWLKXWR |RECORD=41|INDEXINSHEET=19|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Sample Project|NAME=Title|READONLYSTATE=1|UNIQUEID=AHBYIKHM |RECORD=41|INDEXINSHEET=20|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1|NAME=DocumentNumber|READONLYSTATE=1|UNIQUEID=TSMBUTGZ |RECORD=41|INDEXINSHEET=21|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=A|NAME=Revision|READONLYSTATE=1|UNIQUEID=HLUYXYJR |RECORD=41|INDEXINSHEET=22|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1|NAME=SheetNumber|READONLYSTATE=1|UNIQUEID=ADCKVWVB |RECORD=41|INDEXINSHEET=23|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1|NAME=SheetTotal|READONLYSTATE=1|UNIQUEID=SNRLLNQN |RECORD=41|INDEXINSHEET=24|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Rule|READONLYSTATE=1|UNIQUEID=GVGHLCDM |RECORD=41|INDEXINSHEET=25|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=ImagePath|READONLYSTATE=1|UNIQUEID=DWEYCXTC |RECORD=41|INDEXINSHEET=26|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=ProjectName|READONLYSTATE=1|UNIQUEID=YJXFHWQX |RECORD=41|INDEXINSHEET=27|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=*|NAME=Application_BuildNumber|READONLYSTATE=1|UNIQUEID=XLIGBUNT |RECORD=41|INDEXINSHEET=28|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=ConfigurationParameters|READONLYSTATE=1|UNIQUEID=VHSBRBFY |RECORD=41|INDEXINSHEET=29|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=ConfiguratorName|READONLYSTATE=1|UNIQUEID=ZQHYRWYU |RECORD=41|INDEXINSHEET=30|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=VersionControl_RevNumber|READONLYSTATE=1|UNIQUEID=UPNBQKFJ |RECORD=41|INDEXINSHEET=31|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=IsUserConfigurable|READONLYSTATE=1|UNIQUEID=FJKATWKI |RECORD=41|INDEXINSHEET=32|OWNERPARTID=-1|COLOR=8388608|FONTID=1|ISHIDDEN=T|NAME=VersionControl_ProjFolderRevNumber|READONLYSTATE=1|UNIQUEID=JKDUFRLW |RECORD=1|LIBREFERENCE=MOSFET-N|COMPONENTDESCRIPTION=N-Channel MOSFET|PARTCOUNT=2|DISPLAYMODECOUNT=1|INDEXINSHEET=33|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|CURRENTPARTID=1|SOURCELIBRARYNAME=Sample Integrated Library.IntLib|TARGETFILENAME=*|UNIQUEID=PFBWQACS|AREACOLOR=11599871|COLOR=128|PARTIDLOCKED=F|DESIGNITEMID=MOSFET-N|ALLPINCOUNT=3 |RECORD=41|OWNERINDEX=67|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=8-Jun-2000|NAME=Published|UNIQUEID=ZOVXKNZF |RECORD=41|OWNERINDEX=67|INDEXINSHEET=1|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=17-Jul-2002|NAME=LatestRevisionDate|UNIQUEID=TVRTETJR |RECORD=41|OWNERINDEX=67|INDEXINSHEET=2|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Re-released for DXP Platform.|NAME=LatestRevisionNote|UNIQUEID=EKKGXTXI |RECORD=41|OWNERINDEX=67|INDEXINSHEET=3|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=1995/1996|NAME=PackageVersion|UNIQUEID=YNBMVHFY |RECORD=41|OWNERINDEX=67|INDEXINSHEET=4|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=E3|NAME=PackageReference|UNIQUEID=SQMUAXHU |RECORD=41|OWNERINDEX=67|INDEXINSHEET=5|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=Altium Limited|NAME=Publisher|UNIQUEID=MSIBBBCW |RECORD=41|OWNERINDEX=67|INDEXINSHEET=6|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=TO, Flat Index; 3 In-Line, Axial Leads; Body Dia. 4.6mm; Lead Dia. 0.5 mm (max)|NAME=PackageDescription|UNIQUEID=WKRGPWUF |RECORD=2|OWNERINDEX=67|OWNERPARTID=1|FORMALTYPE=1|ELECTRICAL=4|PINCONGLOMERATE=33|PINLENGTH=20|LOCATION.X=500|LOCATION.Y=510|NAME=D|DESIGNATOR=1 |RECORD=41|OWNERINDEX=75|OWNERPARTID=-1|LOCATION.X=500|LOCATION.Y=510|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=RMYWLMKL|NAME=PinUniqueId|UNIQUEID=TFDWJEER |RECORD=2|OWNERINDEX=67|OWNERPARTID=1|FORMALTYPE=1|ELECTRICAL=4|PINCONGLOMERATE=34|PINLENGTH=20|LOCATION.X=480|LOCATION.Y=500|NAME=G|DESIGNATOR=2 |RECORD=41|OWNERINDEX=77|OWNERPARTID=-1|LOCATION.X=480|LOCATION.Y=500|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=PTBOGPQG|NAME=PinUniqueId|UNIQUEID=DFXMFIVI |RECORD=2|OWNERINDEX=67|OWNERPARTID=1|FORMALTYPE=1|ELECTRICAL=4|PINCONGLOMERATE=35|PINLENGTH=20|LOCATION.X=500|LOCATION.Y=490|NAME=S|DESIGNATOR=3 |RECORD=41|OWNERINDEX=79|OWNERPARTID=-1|LOCATION.X=500|LOCATION.Y=490|COLOR=8388608|FONTID=1|ISHIDDEN=T|TEXT=CQTFLVHW|NAME=PinUniqueId|UNIQUEID=ZQFVUDKT |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=10|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=507|X2=490|Y2=507 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=11|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=500|X2=490|Y2=500 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=12|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=493|X2=490|Y2=493 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=13|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=500|X2=500|Y2=490 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=14|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=488|Y1=509|X2=488|Y2=491 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=15|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=490|Y1=509|X2=490|Y2=505 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=16|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=490|Y1=498|X2=490|Y2=502 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=17|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=490|Y1=491|X2=490|Y2=495 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=18|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=480|Y1=500|X2=488|Y2=500 |RECORD=7|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=19|OWNERPARTID=1|COLOR=16711680|AREACOLOR=16711680|ISSOLID=T|LOCATIONCOUNT=3|X1=490|Y1=500|X2=496|Y2=498|X3=496|Y3=502 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=20|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=507|X2=500|Y2=510 |RECORD=6|OWNERINDEX=67|ISNOTACCESIBLE=T|INDEXINSHEET=21|OWNERPARTID=1|LINEWIDTH=1|COLOR=16711680|LOCATIONCOUNT=2|X1=500|Y1=507|X2=500|Y2=510 |RECORD=34|OWNERINDEX=67|INDEXINSHEET=-1|OWNERPARTID=-1|LOCATION.X=503|LOCATION.Y=501|COLOR=8388608|FONTID=1|TEXT=Q1|NAME=Designator|READONLYSTATE=1|UNIQUEID=XHJQVISW |RECORD=41|OWNERINDEX=67|INDEXINSHEET=-1|OWNERPARTID=-1|LOCATION.X=503|LOCATION.Y=491|COLOR=8388608|FONTID=1|TEXT=MOSFET-N|NAME=Comment|UNIQUEID=NCMFURXY |RECORD=44|OWNERINDEX=67 |RECORD=45|OWNERINDEX=95|INDEXINSHEET=-1|DESCRIPTION=TO, Flat Index; 3 In-Line, Axial Leads; Body Dia. 4.6mm; Lead Dia. 0.5 mm (max)|USECOMPONENTLIBRARY=T|MODELNAME=E3|MODELTYPE=PCBLIB|DATAFILECOUNT=1|MODELDATAFILEENTITY0=E3|MODELDATAFILEKIND0=PCBLib|ISCURRENT=T|DATALINKSLOCKED=T|DATABASEDATALINKSLOCKED=T|INTEGRATEDMODEL=T|DATABASEMODEL=T|UNIQUEID=LFQKQZIV |RECORD=46|OWNERINDEX=96 |RECORD=48|OWNERINDEX=96 |RECORD=45|OWNERINDEX=95|INDEXINSHEET=-1|DESCRIPTION=MOSFET-N|USECOMPONENTLIBRARY=T|MODELNAME=NMOS|MODELTYPE=SIM|ISCURRENT=T|DATALINKSLOCKED=T|DATABASEDATALINKSLOCKED=T|INTEGRATEDMODEL=T|DATABASEMODEL=T|UNIQUEID=VGDOZKJA |RECORD=46|OWNERINDEX=99 |RECORD=48|OWNERINDEX=99 |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|TEXT=M|NAME=Spice Prefix|UNIQUEID=IWLHANPG |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|%UTF8%TEXT=@DESIGNATOR %1 %2 %3 %3 @MODEL ?LENGTH¦L=@LENGTH¦ ?WIDTH¦W=@WIDTH¦ ?"DRAIN AREA"¦AD=@"DRAIN AREA"¦ ?"SOURCE AREA"¦AS=@"SOURCE AREA"¦ ?"DRAIN PERIMETER"¦PD=@"DRAIN PERIMETER"¦ ?"SOURCE PERIMETER"¦PS=@"SOURCE PERIMETER"¦ ?NRD¦NRD=@NRD¦ ?NRS¦NRS=@NRS¦ &"STARTING CONDITION" ?"INITIAL D-S VOLTAGE"¦IC=@"INITIAL D-S VOLTAGE", @"INITIAL G-S VOLTAGE", @"INITIAL B-S VOLTAGE"¦ ?TEMPERATURE¦TEMP=@TEMPERATURE¦|||TEXT=@DESIGNATOR %1 %2 %3 %3 @MODEL ?LENGTHL=@LENGTH ?WIDTHW=@WIDTH ?"DRAIN AREA"AD=@"DRAIN AREA" ?"SOURCE AREA"AS=@"SOURCE AREA" ?"DRAIN PERIMETER"PD=@"DRAIN PERIMETER" ?"SOURCE PERIMETER"PS=@"SOURCE PERIMETER" ?NRDNRD=@NRD ?NRSNRS=@NRS &"STARTING CONDITION" ?"INITIAL D-S VOLTAGE"IC=@"INITIAL D-S VOLTAGE", @"INITIAL G-S VOLTAGE", @"INITIAL B-S VOLTAGE" ?TEMPERATURETEMP=@TEMPERATURE||NAME=Netlist|UNIQUEID=UKDZDPUV |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|TEXT=Transistor|NAME=Kind|UNIQUEID=FCLGVZVQ |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|TEXT=MOSFET|NAME=SubKind|UNIQUEID=KFSAMCHS |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Length|UNIQUEID=HTWOJZWX |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Width|UNIQUEID=PJQFWJSG |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Drain Area|UNIQUEID=MHIWZCEI |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Source Area|UNIQUEID=AVXUVPUR |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Drain Perimeter|UNIQUEID=CLSJSGLF |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Source Perimeter|UNIQUEID=GORMIQTA |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Nrd|UNIQUEID=NLNETLTE |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Nrs|UNIQUEID=PNNOBBBZ |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Starting Condition|UNIQUEID=OYCLRIOG |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Initial D-S Voltage|UNIQUEID=VDPKLSAK |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Initial G-S Voltage|UNIQUEID=BWHKCPYR |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Initial B-S Voltage|UNIQUEID=SOUESXDF |RECORD=41|OWNERINDEX=101|INDEXINSHEET=-1|OWNERPARTID=-1|COLOR=8388608|FONTID=1|NAME=Temperature|UNIQUEID=MRXJNIJE |RECORD=209|INDEXINSHEET=34|OWNERPARTID=-1|LOCATION.X=30|LOCATION.Y=700|CORNER.X=300|CORNER.Y=820|AREACOLOR=9895935|FONTID=1|ISSOLID=T|SHOWBORDER=T|ALIGNMENT=1|WORDWRAP=T|CLIPTORECT=T|TEXT=This is a sample Altium project made by Jeremy Blum (@sciguy14 on GitHub). It is meant to serve as a representative example of the formatting of key Altium Designer filetypes, for use by the GitHub Linguist Project: https://github.com/github/linguist|TEXTMARGIN=5|AUTHOR=Author |HEADER=Icon storage|WEIGHT=1 |BINARY=208|NAME=newAltmLogo.bmp|DATA_LEN=10260|DATA=789CED9D09601445D6C71FB96632C924E42009218424403843B8C34DC2210A222887B7DC7880088A8810119588A2728A1CA21015345|> E882222872CC8421691430C8B1A360B88024B30BB64D7307BF43793B3ABAABBFF3DC98440BEFAA19CF5BAAABB5F57BF7EF5DEAB3E8337DCE8452E3AFB103577FE3AC4F9C77F3B7FAD43D6E2BF9FDACF8|> B4203A8F87FE75F9653A74E1DF2F2F2226F6F6FF2F1F1215F5F5FF2F3F3238BC54256AB95FCFDFDC966B35140400005060692DD6EA7A0A0200A0E0EA6BA75EB524848088586865258581885878753BD7|> AF528222282222323292A2A8AEAD7AF4FD1D1D1D4A041038A8989A1860D1B526C6C2C356AD488E2E2E2283E3E9E121212A871E3C6D4A449136ADAB42925262652B366CDA879F3E6D4A2450B6AD9B225B|> 56AD58A5AB76E4D494949D4A64D1B4A4E4EA6B66DDB52BB76EDA87DFBF6D4A14307EAD8B12375EAD4893A77EE4C292929D4A54B17EADAB52B75EBD68DBA77EF4E3D7AF4A09E3D7B52AF5EBDA877EFDE9|> 49A9A4A696969D4A74F1FEADBB72FF5EBD78FFAF7EF4F37DC70030D1830806EBCF146BAE9A69B68E0C0813468D020BAF9E69B69F0E0C174CB2DB7D090214368E8D0A174EBADB7D26DB7DD46C3860DA3E|> 1C387D388112368E4C89174FBEDB7D31D77DC4177DE7927DD75D75D74F7DD77D33DF7DC43F7DE7B2FDD77DF7D346AD4281A3D7A348D193386C68E1D4BE3C68DA3F1E3C7D384091368E2C48974FFFDF7D|> 3030F3C400F3EF8203DF4D0433469D2249A3C79323DFCF0C33465CA147AE4914768EAD4A9346DDA347AF4D147E9B1C71EA3E9D3A7D3E38F3F4E3366CCA0279E788266CE9C494F3EF924CD9A358B66CF9|> E4DE9E9E9F4D4534FD19C3973E8E9A79FA6B973E7D233CF3C43CF3EFB2C3DF7DC73346FDE3CCAC8C8A0E79F7F9EE6CF9F4F2FBCF002BDF8E28BB460C1027AE9A597E8E5975FA6575E7985162E5C488B1|> 62DA2C58B17D392254B68E9D2A5B46CD9327AF5D55769F9F2E5F4DA6BAFD18A152B68E5CA95B46AD52A5ABD7A35BDFEFAEBB466CD1A7AE38D37E8CD37DFA4B56BD7D2BA75EB28333393DE7AEB2D7AFBE|> DB7E99D77DEA1F5EBD7D3860D1BE8DD77DFA5F7DE7B8FB2B2B2E8FDF7DFA70F3EF8803EFCF043FAE8A38FE8E38F3FA68D1B37D2279F7C429B366DA24F3FFD943EFBEC33DABC79337DFEF9E7B465CB16F|> AE28B2F68EBD6ADF4E5975FD2B66DDB68FBF6EDB463C70EDAB973277DF5D557B46BD72EFAC31FFE40BB77EFA63D7BF6D0D75F7F4D7BF7EEA53FFEF18FB46FDF3EDABF7F3F656767D39FFEF4273A70E00|> 07DF3CD3774F0E041FAF6DB6FE9D0A14374F8F0613A72E4081D3D7A94BEFBEE3B3A76EC187DFFFDF794939343C78F1FA73FFFF9CF74E2C409FAE1871FE8C71F7FA49F7EFA89727373E9E4C993F497BFF|> C85F2F2F2E8AF7FFD2B9D3A758A4E9F3E4D67CE9CA19F7FFE99CE9E3D4BBFFCF20BFDFAEBAF74EEDC393A7FFE3C5DB87081FEF6B7BFD1C58B17293F3F9F2E5DBA44BFFDF61B151414D0DFFFFE77FAC73|> FFE41972F5FA6C2C242FAE73FFF49FFFAD7BFE8F7DF7FA7A2A222BA72E50A391C0EFAF7BFFF4DFFF9CF7FE8BFFFFD2FFDEF7FFF2345514822D1C4660F8F6DD97DD8F40F0B1437A8E9514BAE792C09835|> E392BF549E241AC8923B7487D927892D8FB72A43E493C887FCA06A94F124FD2EC55A94F124FD2FC4DA94F120FE2DD355BEA93C483048E2B92FA24F1204DB6497D927890C029529F249EA4EBAF529F241|> EA4D15EA94F120F12F69ED4278907095824F549E241FC33A43E493C888557A89A1E90E4FAC6B648EA93C483D8B3A43E493C48D85EA94F120FD2E8BCD4278907E926F549E2491E91FA24F12081DBA53E4|> 93C48E32B529F241E64ACD4278907B1674B7D92789014A94F120FE2BD4EEA93C483B496FA24F1207536487D927890B6529F241EC4FB13A94F120F9222F549E241FC73A43E493CC828A94F120FD2C8A94|> FC36B7A1092DAC356393F493CC870A94F120FD244EA93C483F8E6487D92789027A53E493C483FA94F120F122FF549E241ACBFD5F40824B58A8D353D0049AD62464D0F4052AB90CB2D124FD2A3A60720A|> 955B4A8E901486A158D6A7A00925A45444D0F4052ABB0D7F40024B58A809A1E804422914824128944F2FF195B4D0F4022914874900175124F22F54922915CABC8F94922915CABD4B2F9C9CBDBCFCFC2E|> 2E7C4A78E979747FBF1B50426DD3263DD99CB8585CEFF9C6C5C36A16F7C80C5C7A3BD5C8768EB93DD1E6873E26F3320C0E6870FEF650B2CC15EF27309A57F632FFF6BFF92C6FEAE1665ADEDA57FB0DB4|> BDABA7EF81BF565B1068424741D36ECE15757AE58B162E58AE29F572E193E72E41D839A27B56A1018A81E7080EBC0F68AC1D955C32CEED3E0EC2CF6B4977F55440A326E88F4F72E6FE61D10587EAE25F|> F959E8BDD5EFA0F16EEC0565BE9652FBDF2AEDF95FFC9F5B3C605B096DD107FD5CFA5AD8B7FC377E23A01FF80D256FE65BFF8798BCD78EA585CF7DD6AF4686AEB538E92B766DDBA75999999EB8A7F29F|> EB9F4FF925F32D7BDB3AC131E817DA1C66517196D7535B63D80DA4DD4EDC812D46840FA3E63E9E3C92A8183A8AF76BA5DD5BBE3ACBED873EDEB966962F84BA88F7EEC917D07BEB36E5DD925CE2CFB5DD|> 96F9C6C784CBC97835F57DD998A1B95995976903BC453E8BCE29D4C46E48D39B72447D935344F459DA0E613576F78FBA3F1CD82F41B69EB537F74218A5968DCBF8BC0E74D1DA96BF12DF0EB8EDA2DD77|> 99F58EAA56E31D1CD2095C89C22E3B645A3744EC9DE2BCF58F268FF909267DD6F281AD0045FE6D0BEDD90C0CE10613C7D2E0099BDE2CCD36C8F56C30F6E8C368887B3365BAF28F9B927CF29CA9A04DDC|> 95BE77D77009D988B6CDD47B81CBF99660EA4B42B79ECA2C13D5636C568F612D2F7A4A96EA6A82E43DF73A0F17BDA67143A07F7939D5CF20427A3F3591AC91EBC3E12382A5EF298E340E6727DF1FEAED|> 169FB6CA29E465952CF2947E6F46FD6B2DF4BDF284A8AAF4E336DBC53C1184B988E2DA831A60ED4BE449F42B68176DF77D3EA236281A94E1465757485502C52C10B9AB37ADC7A533D3D53AC28F1D9A0D|> 9C196ECD103760281FCBBC5212199CBBD449959BAADA7C56ABE757C3B9D553E6B5BFC4F5E1DB72A4A2BAD46A4FB7DE79DA5DBA18A2F1AEB1CB582F1668EA3B42F99920327A386E334BA085E65AA0F278|> 7935462C0D852F2B566DF3053D7C5494E1B1B51E422D4AC0F7B78EB2424B0BC8E30A627D09B5B2369F78633BACDCFA6694D5131594A5644CB173A5A2876DC944EDB94AFDC8B14F749462756CC9DF0401|> 34D1DA7549FFCBAA2864BAD62177799EAA298012AB1D9E036148E11BB32F9FA2E666810F9C3A18D652703DF1424B0395C18546FF4E6DE2D5A9D4D8C26B5F1F5C4131FA49CEC400F28A3FC5D557CED29E|> 795AEDAF75BCFFF64D17BC332BC0DF363EE317318A55DA9C918731934DCD644E821D4540F254C52DDBEB47CD0384B3C9B6647DDE86C7C30C1E7635914DB419403081C6E2F0C2AFA1490392F1A50816F1|> B092C12CCD47A0B94A70269B4AB7CEF12E5E560DAAAACD3BEDFBAFECCF84BE85A38B978839E78197D0A4C1C4649289DC5C33F070D4FF7117AB8C94C07A5A80DA818F45D945757E86B2ABADD0CE382E24|> E802647B984DA40640C5DBA47BCC69A1F6B2AF27B8B32E98667B2B001D73C7E8F729BCB189E16D771BFD2CF9F46175C00379EC73F1D8CB2A463F19AB3F4D27F51AB283B8AFD41D47292D0C37357904C0|> 539AD5582DF80C6673AF05D056F34DF958B3B1B3C839A70B6B2ED2124B058F4404103EA09F1BEF4379ED45EE1FC12897945CE4FA1D1CAA5B3CEAF57E72BD7F9B1076E3C4F9DC6064EBB72CEE8BC46CBE|> 965E6284A68696BBF2EA8E59240BE8723663A2843ED40440654C158BEAB64E8046571DC7D276A329A35087DA001F589860185DEDCBBC5AFFB0430A971E34ACCBBDCD5A54F879E7E32E7FD4E564ABDE0D|> 0BEDFFA6A6631F5A93FDDC057EA220DBD558A29D3278A450E98AD4DF91ED0C56478407599D2D0AB388BFF961A606AB25591FD0E6AB18CF3404523010D032A0A5D8253D1828CED2320D38199071B1F526|> E72BDEFE6123DA67C194A775D2A32BEEF1A442347998BEF5A1A1FA4FD211307A9D0A77A9B41CBB38201656A022C6395EACA3640BAFB136FC70E764B774D71A219DB45F09740A040C303F5359039972AC|> ACC05A6E016C692895CA93C6173CE4FAF376FB150D91E4A9BB4BE565C18BC06AD7798B920F719AED152C2263307092B6B6E87F6C3FD7C0FBF98E9A08C1F55EA5F07BDBDCEF4E4BA9A803E3F2B4177B68|> B4068412E102FF20C6440CD14656E380DFA49552FD3F80F510EB6A6298AB2C3F9480DF46A714EE9AF7DBF8D12CEA391BBDAC536E3122D4DCDACAB5D2A9F9F7CE117F642DE91E6D6FCA4A4A92467014BF|> EF274AEAB97DDEACA1CDCF3880DA82CD13BD413BDB97788467C02F2E7EE6354237AB3B2A67EC2A0894FCD1ED69DC2DE530E8609472CC6C84CB7F4357341061A461635DD6AE210DB832B4E13BD84B6F01|> E28530E8972C6AB12C47AA3AFFFCFB8AE1E77AB2B732CE70CA80648E05B0D030A9DC80FFCF7BF73C6419685D25A3D4179F52C2C714B39FF322E43B9D259E77E1B7EF6456D377141561AFA341B7D60E21|> 0EB2B8CFA48F4497E2195EBC1CC245A81DA03056FDD11CE801AE19EEE9AE224F77C8422175CA1684079ED053267F88B46D880529E607CF7F6C105CAA7F724C5C525DFE5BC451AC72B1D8ADE3FB8B0F43|> 07141CE19BA0C429699384456853E0541FB815F06596EA2830A4EAB1C8816144591C7195043CDF878DD2585EDC30E83C0E68957F9312052090F947352639769AC1D172B4AEEAE5D79CEE7BFA3EEFD367|> 64B859A596A7D36D4E008F6574C1C41A54F5E3004E805CE853AD62D9FB5A2F2157BA1D5B822CE80EA81DCDD95613C6B10FA4217DC7AEE0DE9A42792D92CCE1BF13026897F4946A64C5C77FCF8DA499DC|> 5B7A749B075E8E44CB2C11182CC04686655D84FD4C45D03AA331260995A71FBBC7AA3C61FB15D259B0A0B73937739E7502C12D0F04045429986828C751712EA2328A13DB251A348438F23709B07CF357|> 145EE333A428689037CA6D2A72864705DE29628624C74E0A468EFFA19E9E9E9CF0D564D6FF5915036BB301A6DCAF9A128BFED98F7D46BC7CCB555F2390F54F82740A0480CE0F54306545EAA7867E6A20|> 731DD4448390F5A866963C26438BE76D5AA952B57B958E9FAAFFCB7CE9FD6FC88E595C7549FA6D880E20271FD0F9BE8617B97D8E8C81027A141AA1840FFFD40EC2756777D5F37D195B2232DB67E68487|> 84C7C2F33B6A3B08467BF1F09CC1162A0BCA101A5E181EA8FBCFD27816E6881127C829E30754DAAC658953E79C16F80F9EC5AA5978900DC25A2C9E1C2824EEEF7C75801FDB0C60A96459669AC6F58DB1|> D26041E645F20DED080CA14964FBCA001B5518CC38B870FA2F89284C065E22433134C1519AF769D35431FE55B139901D6E9078FBF3F5EFBDC7C615833B7AA7013722A3BA734C67D126DC25EC8E2D4230|> E0954C680CA8E15642C687676F4D5578B4A63198DAF485561F429DA30D4CB4921F715DF101E7F8D9E5704AEBEEE611FD144146AA42877B11341184EF029E03E3022504CB163847022361437959B26C85|> 03A32A09ED2B96C06E0309666C8D6AB3A8C3ED961883067FFFBA325E702DDB43D3BD28FDC54A6BDF55D782EC99C119B08FDD00AF77C044D4002B3042BC5320588383482C8FBA1A5AA1FF4AE9B3E589FF|> CAA7F829AA0AE92876D810CD6E1658156CD3ABD73B3213BD6318D15980DCFA535A74F3E83A1C824D680F2C20694E000F281A98B59E2C75A2C72A75D8CD3BB7055A1D1067845AAC8CD8C67BF190A99DAC|> 6C640F9A4A1E37FAA97D7853348D7B1B76100722A2B49FC7D0B5F8244367241E409482047881CC506D49E0441C61B0558140C10643C80D750F73CD0EED399891F8C7E13347770311E11E8F8D96216432|> 9D003B5338E69DF18ADCA2B6D84796010BA7C0EEE5647AE439D0C134E2410ADBB9FEC27C8D02C6040399ED3BB6EBA9809038EADEE09AA13630F60038AB3796D9F81F679BACF5930B2637F62E3F7FC600|> 4F960612E6C0883347BB1F650C048243053C8B9F487997B1A4B7869E7814CAE67ABD2947163211A6CD560E727EA85DA3FCFC6505B61D2A8EE874A00B26395475901E3BC1027E9627A2D32D2944782590|> 198FCB85EF00CE1C8FB0DE24B3F260FC89CC109BB1CA6D214C2CD5549A9349DD9E7B3C5CFA0FD6ED680F2ED883AF848AF720736A0D6B2B7A15F1E687F588C50BC057D977FCEB95BE37E00023F880BFC5|> 1A893DD1A2F7D6440E5DFA473DD743197F6D2C7F381D36AB8EA0AD130AA812B631081E270BF665DA0EABED06DD8C13EA278555E741C2621C7A1C2F95BEBC1423F43854E8250206C9E46842E0C147E41E|> FBAE9614E9F82CCACEA569EF6ECFC14080DA83B59013B5A423DA5FB9CD545F1FF79AC01E5856C35A59FB0B2110173AD53D949D07F0412982144EDDBA0D74AC303D50BCD133F98A819C720A6226BD2A13|> A227FCAE1D7A3E032C802D680B28D4502E97A2716081320780F1432A0E68A2B654FA23EA67306543B24B0419805BD5B2399B7C4BD30A2916BE627770D2893699E5633712B95868FB06F950B04F6B3B68|> 04F07D4C306BD2C1C6CC7AE6245FBA025BCA3625743D1F7CC575C92667C0E1038297AA042D15C939D24C8D0B740E6C22051C610B369C36DD11956053E023D7A0592E0C2E123D01AF21E2EC8A88206E85|> E6F6575B7112C89211A506DA0D78A4B12AAF70212182274128CDEAAE745A38BA681D9B6E825BDEB5655A6BA1706E916BC3ED9A0013592FD600B46D9AE6706EA9D5728B2634FB18E402FE4387488CEAEB|> 04C743EBDD9F3B162034A7879D9606EFBB3E2D9F74077F5B0717AA580E9B2068D51ADB52A2064C8F441120BD8576400CC8D9FA5775E388172322B0057E5359CCA4FA13EF8B47DE801C9AA8401F5B6587|> C132ED3E408F9FDC6982F93F1607524779420E8532B14747588B5137DDBA32E32F512577DA001B59C15ED8BC21A8F88CE2E9818B397CBE948406FD5D3620C543D54576CBF86018562EACE0ED6B96E552|> 6D24CA66FA53821E49AD687061457ABBA3E32A076EB1A50EE96E0688874BD48CC986E0D3D509C4CF87C24304C580A095D0D44F26F15CFFE517432AFE85D376DDC28E3736F35643316F381300FE33A922|> 3D8492004C5A09DBB51EFB4C25180D22FAC01E50DEB9F8A0654088C9B4A65CFC70297F0D2858B16703B9299239E3D8CAECE36AA48502522716458E5D824BED7072019B70D28BE164139388192AB61860|> C284786D809AC2B3683AB6BD519096C15E24FBCA001F5A65874001A50477597163471A7CCD84D6839DA69A6BC5DC63BCE1F2E5667C30F430D7D4A42B58272D8250A6FE8015CAD9736E6034B702C61332|> ED3909D724834A08621E7D041CEA3D91479860A3596F09065A76540A1F5A3B337EB5C376DDCD1A7209C7E36A061ACEB476CC386AEFF5C448F866B7F1AFA140597F0387BB4C16FA0FDAEE67AA7150F3D5|> 0AC0115833C9AF9A2018597F0B88881F01791C01021D02A6C251029B8451898DF3420E37859EFBA551D581257AB38D10DB042DD56519F2C0F23A1616C41BEB0F7407BFDA5F2888F81E8053696DF07059|> D5F12ABD406C1B220BDD995323F586ABA320694B884E70D0DA8ED42854923DC2AAB695B0D430DC5D4F6C1D0CFB03058EC0A56ED7D915DA2088051EED3C44E4AC0F17B135801B4847745C380820BEA333|> 8BB17D671D82E248179B54232ABC4E29B30B8F5807B06945BB443A683325B90E9F63D9299ACF10424A332ABB9AC43CF1B2EE12DD72B458C132817B00A9F8A9E906C71F3806168963ECA5D8444F4862C6|> C2B74D2200FC8EC6F23C85850FA52F579A09C9DBF8126A85382DFB6D56E20A23CA4A14F51C899C27BA01A226FC6CE16622F253446E1535B58032AFA2268FFB3D855128C9B72DB80BA59A8DA1BFE1A102|> 91475C30A0D280D1BC663B4401F6B454291E516509F2669E8931F0C921DC3BE20C2501DA87CDDDAFB91C879959FCAB4F745CBBB17C57C013B74B6A4B2EAE1773712982DD449B2C18AA7E24BDF071A509|> FBA6540B987D73348A1B2791F472B9853ABA54F04D3D6D6B241B2B6E1B01BBD93C21E28EE2199056669C7EB6227700FAC99DCCA2B4C43DC1DC7F751A70D92592516138406D4410D2F832EEE96B987C9D|> D0EBE1C5F22AC09A1A94F6DD1F60517D9AF726C8C2ED5AB7BE60D6DDF05ACED958A5E90074467D76D5A1BC4AAC9E1B63A82B9ED45E27D86199AD9AD059940747F2EE15D9F2A707B3FEA479105B59BF38|> B84A37A04CA542D7DC206141703D5104568E91B5089B004071B03D5E077D03E57ACCADE0AEEAD10C3553E8033DACD42306E04CA1D2D12BD2636E89A717309CF3DC2F340EF7CF1F4BA6FA0F1A669659FF|> 8CE4062A359350C47D59C0B754A6613D5471972055C1D2814BB93AF91708902D595DEEC0AAF375C427A4A9870FDA1076AB2B08CEC0767E78F452F832E6ECF4F741FE8DDF139AB1E75D7A2F176D30C7A8|> 706D45BEC129E7518127840EF9482A007EA5E5600B65F21760233F7F8244D58CE7AAFE88787997BAF4509327009EFA0E899F02061283B2E8FCD660A81D9D3DD35F529193A60B82F6CB81CBA58AC045F0|> 22E023B9F9D0AA0B36BB76840C17ABAC7B8CBD00C19360E71D35518787E4034BA8251C469A1C60EE97AB83F3F79A1CDCF1DAB99F6DED00ED0D6A708EC81622DB558141BB65B77AF99666821691BEB240|> E4343CB116F5B3C34A0B8E723145EB8C182A11081326F1D62DC4E200C0EAAC6253C270168E238CE2E7DC3580D6D7DF2829516C7B16E68E801BCA26F40211B8F2BD566F910B4BF70BBD08737DC29A21F6|> BDB78C125A4670403CA0AE3A6260BB5A37080459676B9482DDC9F9FC82715BDD897305F2ACFA2E16ADB4F3418B9BADE65ED44CB6DA8A3897AE51D7006E944C6DBE80B13FE340C28B4DF9E3287FB32EE8|> D021F0E88A93430F079A5987109B7EB38280617EB51097D221B7A1365336F07A84F3A912449B0301EB7CD6D32BA2E8B75B70681CEC357193BD60BDEB6ED62CC445F64401DE75E5F897046133D2009286|> EEAB0E8810A45E9D58EBBF4AE9B47F06E8DFC2F73D54F33DC74572747396C2D905352D8B93B0E7DC6FF51D7806A8E42D10EB3B66F289A6B8E8A45FE1BA18AE4455CC440085CC2BB5B08C68D80997B03C|> 42AF5B042F502D395C82B333F51005A2BDBAF9EA06E414BEBE2EE9125C01D8CEFE73C50CF21017137EB52EAC3F83D3606CA1F855B9DD7702AA3C0F32BBCAD3C0E0DEA7DE1EBDF023D50CF0A3327DEE24|> 3EC478F4AE9133506DF430563540FC1101426ACA74F4390FDB0912BA439145D97F1E246BA2504C05B378E7919F9212F9CF2AA68ABCD7437F0BC370C1D6B23F402AB67E788312BB842B5FE06401EC1361|> 50C60BB2AAEAED2FAD41AAE2473926DD15B68A9EE73D61B75B582792B7B43C7E11671B53015D5D3E50DA8263045ED31C1CFD509892813ADBC0C2C9BAD985EC2ABDCFC448D806DA90E5B19842EA39E3E8|> 5C234ED2EEC97613C0A2439A06B40B5CC03A239ACED1B8696FC348ACEC7A0CCBD4B9C0165623325C14CC33B389D14DCDDB08AA832CF6CDD9E4AEA93FFBD60001F563C9E2920D7F59C6ECD20B893C6435|> C0C14FC94D4A8EA5E4214CC20EDCDB40F4035452F6AEC1B8D22C12EF3ABB5309046799B0BB0F68599668AF20AE74EAA130F45D69BDDA2AC92FA445120A1E94C459A4D6BF0DDBF49672B5AA7258FEC872|> D6C20AE0FF4408DD52B7C884B708C635E1356F440294B45030A958373CCE704606A96A2CC621791C260693B27D3D977B1751494385ACD0614F9A3D5D7F5E59F11ADC15B68ABEEF2754B58E7869BDA3A2|> 2036A99AEA71796E058C5F4E50543D7341E935EC8923CCA99364DD0E6AF4E66335EB86E309BC8C5E3CC74D310253B3A31BB8457D9F989A2C0E47DB63CEBBA0D700BE9EB53DDF7D16972953713D012EA5|> 1DD7221AD500DD41FD90A08E168EED430A0A2912579864BFA0D5A0C045CBCDBADFC2BC3DED964159C7753A2CAA64F4B1333B5E2E6A08DC8AA8A0FAAEA3CBFECD32301EC18FD857E780DCC329AC496410|> A9A8E044636699A58FAC3896ADE8F42B1FC0A5B45DFBE1E34BFA46140218FFF45BE4C155CAA2D66E980A4A671918D13DB4D440A5BC1EA5BDA26368E4A486C330205C2963437DC75DC13D4036A72A2ECF|> A078300CD2FF5F569085AF7DFC585760E42D7E5DCE19C0A8EA86E9F153A89C730BA6BBB07B5D728ED060D285EA637DCDFA394EFB6BD96FD93C9B665FCB8EFD55D265E75C5EC13976934A9F4FB8E2C68C|> D6B4EA931100A9EE4CFF5F5A9254CD3E61C4AED4C990FE52C53894247206B407927A1F61F88E7051D94DF72065403B81FC35522AF8B39ADA8BC3E510858163E50BAE4150A8AD5F01B96AB0882D599390|> 32A0EE58EB3E4A8FC0DADD1A39AC7DA5E1168EE3CA46140218FFF49CE80B2C0CD84AE1205D598D5594647B0D03BB9E4051100DC9293C46CDA729E466BC993D807DA0EA3CE19CEA854047BA0BA325DD58|> 541E71A0614FA603DC77BA02656F75E4C6611F22AB5A9C2FC44A18B8C8770A83410053C63530D366087DB5BECE65E1043DCB9464ABEAA4CAE05DABE6C06A90D7AA0786F9213A4EE452F72025DCD1A38D|> 5CDFDE674A22AFA44ED409DF0D20714C4AD1AE9135C41E10DA84EE6BF709C385E5589DE885AAF61FAC24B78EF8ADF44BD90836C0F97D519836B245D1DD2CD15FAAD923E058065E12F4A1230402293913|> E59E18A68573634271E558E6639A89A72DAA01AA83FB3C64D7D64FB7F2B1A5070A52C87DB90C00F06D25C25E61958252AAAA44F940426A892D7C932E346330CF489E620FB6132BB821238D3ADAB94AB0|> AD4C235CCD86F9C5014747E595C95F742FEC6B3FC86040F5463DD777778C19C3E558D401036F466F1F2C638E3B5F81146153FFBA162707B38C72D5CC26338AFAAD8667904B566334803A007EA19F17C9|> 001255433E9560D06D4954AC83CA4B7F2C952B5F9899AEC321CC4A5E280C85B8DBFAC538D468AF707E356E43A230564702C55894267E85AC620F26E8BDAAF17570BE15E913BB88D0FA26110F92AB4BFB|> BC08A87DC757D3A9F25730A51457DB2829C9ED52E1376B8B13EF532D2270B0A9255BAB269FF71B0B220C35ED534DE0665C85D8863BA8A41252E3496F0A00175985B61F48341609F7546E53978C605C1B|> 42A01B1F466B59060EC712C7055FD1A69EC15EE6D3893A6A3DC87875983DC06A3CE198EA96CEC486840A5305D85A1F6452385D3B1A225BC9F790FD483C8075A140AB36D38BA931DC62B731C12F32B34A|> 9E2FC447EB71A8F233DD469039D346C62AC4F7DD1FB6B2F27006B6A319C5615ABF7459B05286318A33410D64C9D2DEC8507EBA4093150D80395E407F3DF19B6C611D961B2284BA6C98C84AAEA13C518B|> B892F38A7FC76C62FF8DE86B1A48D5021CD42EE4C53D0E6790C8EB92A515C828331A0EA400F54A610CA8CEBE97EC67D9ED407EBEE8A729FC5DBAD19EA4ED7031C38D0AD4DC6C7E86572781AEF81C6039|> 95E97928DED922E86C95D7EC8A3E960E348280E552F64F95C75A1DAA0E5E702B6A2492C729E1E16B73D8C42033AC0ED34E38B026394F536F26BFF0B6A554E56C94958BB7C675A44D92C1413D6A1CAF31|> 38518C77CE537A364E3089B38E3E3A3346D075713D20AA3CE190EAA0CA888D751EB142688371CE5213AC43A5001BB80CC197E43828928F5A13084C8A7115A4E2CA328ADD4C3E2D7E82D93224AE1AD576|> B7A72D2C7D84F3CC1AFB5B13E8949F8ECE1D124C01B50705F418653AADD7B70098EF18C0115006DB599C2BBDC0ABD5C7C165E0ADCBBB9AD6B860F812984254CA85838091C62D21325A6585523758DB37|> A2E27807D3A803EC1E8E60B5CEE450A8ADC65516FBA044B70BCC746FFC35D6332B9120BCE89A43B92F9885B2F8884059247176BADA5D97AAC1E5726AAD7E1FCA2169B885F289C68CE97E9293A18D7601|> 81461EC1202FA049728B86284D4106E0EC6B049F5ECA1541CBE04475CAEC371C551CE15F56FAEB87E3A267AA0A28AAE94355289AA64F7F1552EA047ED8392FBED15D0FDF30243FD709C19CC19AB7E2DE|> 65D347E880A37B5375DBDC0431807B4EF4E32B628813EC120D9DFB95D492CD080BA94773237F7A48BDC93B99B550654F862D7DFE4BAFEBEF8DF4ADA94FEB9F867F6DA86DEB970DEBC8C8C8C79CE1F19F|> 3546414332F63A19867143865BEAB7971AB12E1E2DF6594FC795EC6FC745E07471D2FEB3DB7F4D7E241E5568CAAFC9108E8B4EC8CAEF7B8E0CC42B1422251F484ED67F5BEF51CE7BFB8B91ACB8FEBD0C|> E7851E421E3AC9386E0E8BDD13A7E1EB784371406E155DB1E81D7009103D6E59CCAE79FC1825F7EFC6A946E5266C2C46D277EBEC45DB6A20B7987E7B5D32B99A543D5BFEF5C4C329C427618BA24CFE9A|> 59B9701772539CBC57824A337E416F3F5D6AE4B02DB8ECCD876F0C8911379A74F9FCE3DF6DD91BDEB27F5112C3996A82E772DDA75F0D8B1DC53A74E9DCE39726CFFBE5937275DED175D198D61CD7A7DB|> 6C19B8BD4E31217E311012BC09AF5A65CCF04463768D6BD578F9E1D63627413FA0599D886ED537BF64C4B68808C103D3C333FD194CA47E9EC84FA340D79A0F87AA1B3519FBDCC967790B8C922CF1C266|> 17B35EA530F94657482FB9EBD0D2D25CCD0D8714FE2093C343FD1AD95DEFC7C27CC3C8D42FA94CB6E87814B971FA9F66C5749D5F087BB6AE8B1071BC72823FA02971C160E171284CDC125D718ED8C835|> 2F4598F770741155D1DFC5B1B7AA0065ECD0504496530B97C24F008B6657A206BFF0817243B0CED769E210DA86B9D20985FAB8D09DB18EE58739CDB333909B918BED3DB0B4F72CD908022DF74F449BF7|> C41392829E11C674085C218A8A642E4A4E45AA32BAECEA7A54F787EF242311E8E859C042C1C7587B97457494D02E365B59889E727BC9FD85E6E456E04DA827CF5D5484F94540D5FF7D37014E541A3F4E|> 052EAA1831CE18264A101754EB708ACE4DAC1A7120A65EAD31DAA07971E160CEB40B5ACA9B54E891BE0ED4304D24CACA5F94D0107110C28B817E148E981BA1EB0B83D43F535114CEA0D8364B773F610C|> 84956943536EDAE24D716D6B46AD0276C401DE40D28983B2E97F0AE133AEF724F9FCCC48EF8A3639EE53C50765838AA8334A0AE1312E0362A6A6E30333F59A101C5D7B9815BE94CB8BA491B92CA133A0|> 06EDC5641B2194FB52FDC337923E7161D899CAB5BA4415E0D782AFE89C5D2043AA8CB31173A128E0E93CDED429C88D6688AEA69F724B91609E96036FFD99C3ED9515508DE80B27C813AEE2097F03C4FF|> 5CC4F4EBC42DA99CBAB34A74FB687D171F84ACB7351D6D4E3D280BAAEF00E4E0295588B31976BE2070DA82C6E1D7000DAFAE4A8D427CF53ADCBECDE8131C361F2BDC9D0DB08749C7DEC8EF69400F74D4|> 289A4926B0F4B406CFFB9861552E2CC1DA82E2AEC7E61282BE00D7302FBBA99FB2AB926F0F5B3C6A7DEB120F3526119972B7EBABCDB64B261C0FD975D3297CB642F17FF72B9E20F85F33809ABBF139BB|> F0A9BCDDFA6FA1B99842791482412894422914824128944229148241289442291486A3557BF5AB9A43623EB42483C894C6B947812AD1D3D2492CAC26F66249154851E353D0049AD42DC915422A93C337|> 01389C4341B6B7A00925A45812C0B21F120FF2FF682935C35947E353D02496D4249AFE911486A134A8E0F6E24919844519AE04612894914457A34259E4351B6D6F41024B5084551648881C46338F5E9B|> E9A1E83A4F6E0D4A71CB9179CC453B80AB5A5D4F42024B506973E7D2AB79E907888E24A92ED6A7A1492DA42B13E6D909549259EA1A4D46DEB9A1E86A49650A24F99D282927884D25ADC5D6B7A1C92DA4|> 1A93E1D9079C2124F50B659C0B89A1E88A45650A64F5764D88AC40394EF66B253BEF12455A7627B9CA9353D14492D40B5DF92FCC6935419953EE5C7D5F46024D73DEA0DE1BE0EAFE9D148AE77981D06B|> 3A44D2EA912DC96954B64689DA44A700AF5BCDCA4595215387D5216CA82BF922AC0EB939259170B49243A08FAA46C96257F259546D427253BAEA60725B96ED1D027E57CF79A1E95E47A454B9F1465AAB|> 4CA2595425B9F949D327C45521974F449718C97BE7289FBE8E993D32CEF2AB3A824EEA2AF4F8AB2BE794D8F4E72BD61A44F8AB25C6A94C42D8CF5495136A4C825628979903E294ACE2859704C6216AC4|> F4EB68E6C2AB7519098C1943E3939FBCAA004A9531284597D7251F0F18CE13D5AC6D60B92DE73890EFF0725AAE674 |HEADER=Protel for Windows - Schematic Capture Ascii File Version 5.0 ================================================ FILE: samples/AngelScript/botmanager.as ================================================ /* * This is a sample script. */ #include "BotManagerInterface.acs" BotManager::BotManager g_BotManager( @CreateDumbBot ); CConCommand@ m_pAddBot; void PluginInit() { g_BotManager.PluginInit(); @m_pAddBot = @CConCommand( "addbot", "Adds a new bot with the given name", @AddBotCallback ); } void AddBotCallback( const CCommand@ args ) { if( args.ArgC() < 2 ) { g_Game.AlertMessage( at_console, "Usage: addbot " ); return; } BotManager::BaseBot@ pBot = g_BotManager.CreateBot( args[ 1 ] ); if( pBot !is null ) { g_Game.AlertMessage( at_console, "Created bot " + args[ 1 ] + "\n" ); } else { g_Game.AlertMessage( at_console, "Could not create bot\n" ); } } final class DumbBot : BotManager::BaseBot { DumbBot( CBasePlayer@ pPlayer ) { super( pPlayer ); } void Think() { BotManager::BaseBot::Think(); // If the bot is dead and can be respawned, send a button press if( Player.pev.deadflag >= DEAD_RESPAWNABLE ) { Player.pev.button |= IN_ATTACK; } else Player.pev.button &= ~IN_ATTACK; KeyValueBuffer@ pInfoBuffer = g_EngineFuncs.GetInfoKeyBuffer( Player.edict() ); pInfoBuffer.SetValue( "topcolor", Math.RandomLong( 0, 255 ) ); pInfoBuffer.SetValue( "bottomcolor", Math.RandomLong( 0, 255 ) ); if( Math.RandomLong( 0, 100 ) > 10 ) Player.pev.button |= IN_ATTACK; else Player.pev.button &= ~IN_ATTACK; for( uint uiIndex = 0; uiIndex < 3; ++uiIndex ) { m_vecVelocity[ uiIndex ] = Math.RandomLong( -50, 50 ); } } } BotManager::BaseBot@ CreateDumbBot( CBasePlayer@ pPlayer ) { return @DumbBot( pPlayer ); } ================================================ FILE: samples/AngelScript/payload.as ================================================ // Sample script. // Source: https://github.com/codecat/ssbd-payload array g_payloadBeginTriggers; array g_teamForceFields; [GameMode] class Payload : TeamVersusGameMode { [Editable] UnitFeed PayloadUnit; [Editable] UnitFeed FirstNode; [Editable default=10] int PrepareTime; [Editable default=300] int TimeLimit; [Editable default=90] int TimeAddCheckpoint; [Editable default=2] float TimeOvertime; [Editable default=1000] int TimePayloadHeal; [Editable default=1] int PayloadHeal; PayloadBehavior@ m_payload; int m_tmStarting; int m_tmStarted; int m_tmLimitCustom; int m_tmOvertime; int m_tmInOvertime; PayloadHUD@ m_payloadHUD; PayloadClassSwitchWindow@ m_switchClass; array@ m_switchedSidesData; Payload(Scene@ scene) { super(scene); m_tmRespawnCountdown = 5000; @m_payloadHUD = PayloadHUD(m_guiBuilder); @m_switchTeam = PayloadTeamSwitchWindow(m_guiBuilder); @m_switchClass = PayloadClassSwitchWindow(m_guiBuilder); } void UpdateFrame(int ms, GameInput& gameInput, MenuInput& menuInput) override { TeamVersusGameMode::UpdateFrame(ms, gameInput, menuInput); m_payloadHUD.Update(ms); if (Network::IsServer()) { uint64 tmNow = CurrPlaytimeLevel(); if (m_tmStarting == 0) { if (GetPlayersInTeam(0) > 0 && GetPlayersInTeam(1) > 0) { m_tmStarting = tmNow; (Network::Message("GameStarting") << m_tmStarting).SendToAll(); } } if (m_tmStarting > 0 && m_tmStarted == 0 && tmNow - m_tmStarting > PrepareTime * 1000) { m_tmStarted = tmNow; (Network::Message("GameStarted") << m_tmStarted).SendToAll(); for (uint i = 0; i < g_payloadBeginTriggers.length(); i++) { WorldScript@ ws = WorldScript::GetWorldScript(g_scene, g_payloadBeginTriggers[i]); ws.Execute(); } } } if (!m_ended && m_tmStarted > 0) CheckTimeReached(ms); } string NameForTeam(int index) override { if (index == 0) return "Defenders"; else if (index == 1) return "Attackers"; return "Unknown"; } void CheckTimeReached(int dt) { // Check if time limit is not reached yet if (m_tmLimitCustom - (CurrPlaytimeLevel() - m_tmStarted) > 0) { // Don't need to continue checking m_tmOvertime = 0; m_tmInOvertime = 0; return; } // Count how long we're in overtime for later time limit fixing when we reach a checkpoint if (m_tmOvertime > 0) m_tmInOvertime += dt; // Check if there are any attackers still inside if (m_payload.AttackersInside() > 0) { // We have overtime m_tmOvertime = int(TimeOvertime * 1000); return; } // If we have overtime if (m_tmOvertime > 0) { // Decrease timer m_tmOvertime -= dt; if (m_tmOvertime <= 0) { // Overtime countdown reached, time limit reached TimeReached(); } } else { // No overtime, so time limit is reached TimeReached(); } } void TimeReached() { if (!Network::IsServer()) return; (Network::Message("TimeReached")).SendToAll(); SetWinner(false); } bool ShouldFreezeControls() override { return m_switchClass.m_visible || TeamVersusGameMode::ShouldFreezeControls(); } bool ShouldDisplayCursor() override { return m_switchClass.m_visible || TeamVersusGameMode::ShouldDisplayCursor(); } bool CanSwitchTeams() override { return m_tmStarted == 0; } PlayerRecord@ CreatePlayerRecord() override { return PayloadPlayerRecord(); } int GetPlayerClassCount(PlayerClass playerClass, TeamVersusScore@ team) { if (team is null) return 0; int ret = 0; for (uint i = 0; i < team.m_players.length(); i++) { if (team.m_players[i].peer == 255) continue; auto record = cast(team.m_players[i]); if (record.playerClass == playerClass) ret++; } return ret; } void PlayerClassesUpdated() { m_switchClass.PlayerClassesUpdated(); } void SetWinner(bool attackers) { if (attackers) print("Attackers win!"); else print("Defenders win!"); m_payloadHUD.Winner(attackers); EndMatch(); } void DisplayPlayerName(int idt, SpriteBatch& sb, PlayerRecord@ record, PlayerHusk@ plr, vec2 pos) override { TeamVersusGameMode::DisplayPlayerName(idt, sb, record, plr, pos); m_payloadHUD.DisplayPlayerName(idt, sb, cast(record), plr, pos); } void RenderFrame(int idt, SpriteBatch& sb) override { Player@ player = GetLocalPlayer(); if (player !is null) { PlayerHealgun@ healgun = cast(player.m_currWeapon); if (healgun !is null) healgun.RenderMarkers(idt, sb); } TeamVersusGameMode::RenderFrame(idt, sb); } void RenderWidgets(PlayerRecord@ player, int idt, SpriteBatch& sb) override { m_payloadHUD.Draw(sb, idt); TeamVersusGameMode::RenderWidgets(player, idt, sb); m_switchClass.Draw(sb, idt); } void GoNextMap() override { if (m_switchedSidesData !is null) { TeamVersusGameMode::GoNextMap(); return; } ChangeLevel(GetCurrentLevelFilename()); } void SpawnPlayers() override { if (m_switchedSidesData is null) { TeamVersusGameMode::SpawnPlayers(); return; } if (Network::IsServer()) { for (uint i = 0; i < m_switchedSidesData.length(); i += 2) { uint peer = uint(m_switchedSidesData[i].GetInteger()); uint team = uint(m_switchedSidesData[i + 1].GetInteger()); TeamVersusScore@ joinScore = FindTeamScore(team); if (joinScore is m_teamScores[0]) @joinScore = m_teamScores[1]; else @joinScore = m_teamScores[0]; for (uint j = 0; j < g_players.length(); j++) { if (g_players[j].peer != peer) continue; SpawnPlayer(j, vec2(), 0, joinScore.m_team); break; } } } } void Save(SValueBuilder& builder) override { if (m_switchedSidesData is null) { builder.PushArray("teams"); for (uint i = 0; i < g_players.length(); i++) { if (g_players[i].peer == 255) continue; builder.PushInteger(g_players[i].peer); builder.PushInteger(g_players[i].team); } builder.PopArray(); } TeamVersusGameMode::Save(builder); } void Start(uint8 peer, SValue@ save, StartMode sMode) override { if (save !is null) @m_switchedSidesData = GetParamArray(UnitPtr(), save, "teams", false); TeamVersusGameMode::Start(peer, save, sMode); m_tmLimit = 0; // infinite time limit as far as VersusGameMode is concerned m_tmLimitCustom = TimeLimit * 1000; // 5 minutes by default @m_payload = cast(PayloadUnit.FetchFirst().GetScriptBehavior()); if (m_payload is null) PrintError("PayloadUnit is not a PayloadBehavior!"); UnitPtr unitFirstNode = FirstNode.FetchFirst(); if (unitFirstNode.IsValid()) { auto node = cast(unitFirstNode.GetScriptBehavior()); if (node !is null) @m_payload.m_targetNode = node; else PrintError("First target node is not a PayloadNode script!"); } else PrintError("First target node was not set!"); WorldScript::PayloadNode@ prevNode; float totalDistance = 0.0f; UnitPtr unitNode = unitFirstNode; while (unitNode.IsValid()) { auto node = cast(unitNode.GetScriptBehavior()); if (node is null) break; unitNode = node.NextNode.FetchFirst(); @node.m_prevNode = prevNode; @node.m_nextNode = cast(unitNode.GetScriptBehavior()); if (prevNode !is null) totalDistance += dist(prevNode.Position, node.Position); @prevNode = node; } float currDistance = 0.0f; auto distNode = cast(unitFirstNode.GetScriptBehavior()); while (distNode !is null) { if (distNode.m_prevNode is null) distNode.m_locationFactor = 0.0f; else { currDistance += dist(distNode.m_prevNode.Position, distNode.Position); distNode.m_locationFactor = currDistance / totalDistance; } @distNode = distNode.m_nextNode; } m_payloadHUD.AddCheckpoints(); } void SpawnPlayer(int i, vec2 pos = vec2(), int unitId = 0, uint team = 0) override { TeamVersusGameMode::SpawnPlayer(i, pos, unitId, team); PayloadPlayerRecord@ record = cast(g_players[i]); record.HandlePlayerClass(); if (g_players[i].local) { //TODO: This doesn't work well bool localAttackers = (team == HashString("player_1")); for (uint j = 0; j < g_teamForceFields.length(); j++) { bool hasCollision = (localAttackers != g_teamForceFields[j].Attackers); auto units = g_teamForceFields[j].Units.FetchAll(); for (uint k = 0; k < units.length(); k++) { PhysicsBody@ body = units[k].GetPhysicsBody(); if (body is null) { PrintError("PhysicsBody for unit " + units[k].GetDebugName() + "is null"); continue; } body.SetActive(hasCollision); } } } } } ================================================ FILE: samples/Answer Set Programming/15puzzle-encoding.lp ================================================ #include . % if set to one, permits consecutive moves in one time step % this will not provide optimal plans but usually finds solutions much faster #const consecutive = 0. #program base. % neighborhood relation d(1,0;0,1;-1,0;0,-1). n((X,Y),(X+DX,Y+DY)) :- dim((X,Y)), dim((X+DX,Y+DY)), d(DX,DY). % positions at time step zero at(0,(X,Y),N) :- in(X,Y,N). #program step(t). % guess moves 1 { move(t,A,B) : n(A,B) } 1 :- dim(B), not at(t-1,B,_). 0 { move(t,A,B) : n(A,B) } 1 :- move(t,B,_), consecutive == 1. % check moves :- 2 { move(t,A,B) }, dim(A). % state transition at(t,A,N) :- at(t-1,A,N), not move(t,A,_). at(t,B,N) :- at(t-1,A,N), move(t,A,B). % some redundant constraints :- move(t,A,_), not at(t-1,A,_). :- move(t,A,B), move(t-1,B,A), consecutive != 1. #program check(t). % check domain knowledge :- not 1 { not at(t,A,_) : dim(A) } 1. :- 2 { at(t,A,N) }, dim(A). % check goal :- go(X,Y,N), not at(t,(X,Y),N), query(t). #show move/3. #show at/3. ================================================ FILE: samples/Answer Set Programming/apt.lp ================================================ % implementation of APT #include "asp/define.lp". #include "asp/generate.lp". #include "asp/hard.lp". :~ type(E,quantitative), channel(E,x), priority(E,P). [1@P,E] :~ type(E,quantitative), channel(E,y), priority(E,P). [1@P,E] :~ type(E,quantitative), channel(E,size), priority(E,P). [2@P,E] :~ type(E,quantitative), channel(E,color), priority(E,P). [3@P,E] :~ type(E,ordinal), channel(E,x), priority(E,P). [1@P,E] :~ type(E,ordinal), channel(E,y), priority(E,P). [1@P,E] :~ type(E,ordinal), channel(E,color), priority(E,P). [2@P,E] :~ type(E,ordinal), channel(E,size), priority(E,P). [3@P,E] :~ type(E,nominal), channel(E,x), priority(E,P). [1@P,E] :~ type(E,nominal), channel(E,y), priority(E,P). [1@P,E] :~ type(E,nominal), channel(E,color), priority(E,P). [2@P,E] :~ type(E,nominal), channel(E,shape), priority(E,P). [3@P,E] :~ type(E,nominal), channel(E,size), priority(E,P). [4@P,E] :- channel(_,text). :- channel(_,detail). :- channel(_,row). :- channel(_,column). % don't bin, use log, or aggregate :- bin(_). :- log(_). :- aggregate(_,_). #show mark/1. #show channel/2. ================================================ FILE: samples/Answer Set Programming/onmodel-py.lp ================================================ #script (python) import clingo def main(prg): def on_model(m): print("shown") print(" positive: " + ", ".join(map(str, m.symbols(shown=True)))) print(" negative: " + ", ".join(map(str, m.symbols(shown=True, complement=True)))) print("atoms") print(" positive: " + ", ".join(map(str, m.symbols(atoms=True)))) print(" negative: " + ", ".join(map(str, m.symbols(atoms=True, complement=True)))) print("terms") print(" positive: " + ", ".join(map(str, m.symbols(terms=True)))) print(" negative: " + ", ".join(map(str, m.symbols(terms=True, complement=True)))) prg.ground([("base", [])]) prg.solve(on_model=on_model) #end. {a}. b :- a. #show c : a. #show b/0. ================================================ FILE: samples/Answer Set Programming/tohB.lp ================================================ % initial situation on(D,P,0) :- init_on(D,P). % check goal situation ngoal(T) :- on(D,P,T), not goal_on(D,P). :- ngoal(n). % state transition and state constraints 1 { move(D,P,T) : disk(D), peg(P) } 1 :- ngoal(T-1), T<=n. move(D,T) :- move(D,P,T). on(D,P,T) :- move(D,P,T). on(D,P,T) :- on(D,P,T-1), not move(D,T), T<=n. blocked(D-1,P,T) :- on(D,P,T-1). blocked(D-1,P,T) :- blocked(D,P,T), disk(D). :- move(D,P,T), blocked(D-1,P,T). :- move(D,T), on(D,P,T-1), blocked(D,P,T). :- disk(D), not 1 { on(D,P,T) } 1, T=1..n. _minimize(1,T) :- ngoal(T). ================================================ FILE: samples/Ant Build System/filenames/ant.xml ================================================ ================================================ FILE: samples/Antlers/index.antlers.html ================================================ ================================================ FILE: samples/Antlers/kitchensink.antlers.html ================================================ --- foo: bar baz: qux --- {{ seo_title ?? title }} {{ partial:layouts/navigation foo="bar" :baz="qux" }}
    {{ collection:blog limit="10" :foo:bar="baz" }}
  • {{ title }}
  • {{ /collection:blog }}
{{# foo #}} @{{ foo }} {{? foo = "bar" ?}} {{$ foo = "bar" $}} {{ alfa | bravo | charlie(delta, 'echo', "foxtrot", $golf, 42) }} {{ alfa[bravo] }} {{ alfa['bravo'] }} {{ foo ? bar : baz }} {{ foo ?= bar }} {{ switch( (size == 'sm') => '(min-width: 768px) 35vw, 90vw', (size == 'lg') => '(min-width: 768px) 75vw, 90vw', () => '100vw' ) }} {{ items = {collection:headlines} merge {collection:news limit="5"} }} ================================================ FILE: samples/Antlers/kitchensink.antlers.php ================================================ --- foo: bar baz: qux --- {{ seo_title ?? title }} {{ partial:layouts/navigation foo="bar" :baz="qux" }}
    {{ collection:blog limit="10" :foo:bar="baz" }}
  • {{ title }}
  • {{ /collection:blog }}
{{# foo #}} @{{ foo }} {{? foo = "bar" ?}} {{$ foo = "bar" $}} {{ alfa | bravo | charlie(delta, 'echo', "foxtrot", $golf, 42) }} {{ alfa[bravo] }} {{ alfa['bravo'] }} {{ foo ? bar : baz }} {{ foo ?= bar }} {{ switch( (size == 'sm') => '(min-width: 768px) 35vw, 90vw', (size == 'lg') => '(min-width: 768px) 75vw, 90vw', () => '100vw' ) }} {{ items = {collection:headlines} merge {collection:news limit="5"} }} ================================================ FILE: samples/Antlers/layout.antlers.html ================================================ {{# @name Layout @desc The default layout file. #}} {{ partial:snippets/seo }} {{ partial:snippets/browser_appearance }} {{ partial:snippets/noscript }} {{ partial:navigation/skip_to_content }} {{ partial:components/toolbar }} {{ yield:seo_body }} {{ partial:layout/header }} {{ template_content }} {{ partial:layout/footer }} ================================================ FILE: samples/Antlers/sitemap.antlers.xml ================================================ {{ xml_header }} 1 }} xmlns:xhtml="http://www.w3.org/1999/xhtml"{{ /if }}> {{ seo:sitemap_collections }} {{ collection from="{handle}" seo_noindex:isnt="true" as="results" }} {{ results }} {{ permalink }} {{ updated_at format="Y-m-d"}} {{ sitemap_change_frequency ? sitemap_change_frequency : 'weekly' }} {{ sitemap_priority ? sitemap_priority : '0.5' }} {{ if {locales:count} > 1 }} {{ locales }} {{ /locales }} {{ /if }} {{ /results }} {{ /collection }} {{ /seo:sitemap_collections }} ================================================ FILE: samples/ApacheConf/apache.vhost ================================================ ####################### # HOSTNAME ###################### ServerAdmin patrick@heysparkbox.com DocumentRoot "/var/www/HOSTNAME" ServerName HOSTNAME Options Indexes MultiViews FollowSymLinks AllowOverride All Order allow,deny Allow from all DirectoryIndex index.php ================================================ FILE: samples/ApacheConf/filenames/.htaccess ================================================ ServerSignature Off RewriteCond %{REQUEST_METHOD} ^(HEAD|TRACE|DELETE|TRACK) [NC,OR] RewriteCond %{THE_REQUEST} (\\r|\\n|%0A|%0D) [NC,OR] RewriteCond %{HTTP_REFERER} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{HTTP_COOKIE} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] RewriteCond %{REQUEST_URI} ^/(,|;|:|<|>|”>|”<|/|\\\.\.\\).{0,9999} [NC,OR] RewriteCond %{HTTP_USER_AGENT} ^$ [OR] RewriteCond %{HTTP_USER_AGENT} ^(java|curl|wget) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (winhttp|HTTrack|clshttp|archiver|loader|email|harvest|extract|grab|miner) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (libwww-perl|curl|wget|python|nikto|scan) [NC,OR] RewriteCond %{HTTP_USER_AGENT} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC,OR] #Block mySQL injects RewriteCond %{QUERY_STRING} (;|<|>|’|”|\)|%0A|%0D|%22|%27|%3C|%3E|%00).*(/\*|union|select|insert|cast|set|declare|drop|update|md5|benchmark) [NC,OR] RewriteCond %{QUERY_STRING} \.\./\.\. [OR] RewriteCond %{QUERY_STRING} (localhost|loopback|127\.0\.0\.1) [NC,OR] RewriteCond %{QUERY_STRING} \.[a-z0-9] [NC,OR] RewriteCond %{QUERY_STRING} (<|>|’|%0A|%0D|%27|%3C|%3E|%00) [NC] # Note: The final RewriteCond must NOT use the [OR] flag. # Return 403 Forbidden error. RewriteRule .* index.php [F] ================================================ FILE: samples/ApacheConf/filenames/apache2.conf ================================================ # This is the main Apache HTTP server configuration file. It contains the # configuration directives that give the server its instructions. # See for detailed information. # In particular, see # # for a discussion of each configuration directive. # # Do NOT simply read the instructions in here without understanding # what they do. They're here only as hints or reminders. If you are unsure # consult the online docs. You have been warned. # # Configuration and logfile names: If the filenames you specify for many # of the server's control files begin with "/" (or "drive:/" for Win32), the # server will use that explicit path. If the filenames do *not* begin # with "/", the value of ServerRoot is prepended -- so "/var/log/apache2/foo.log" # with ServerRoot set to "" will be interpreted by the # server as "//var/log/apache2/foo.log". # # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # Do not add a slash at the end of the directory path. If you point # ServerRoot at a non-local disk, be sure to point the LockFile directive # at a local disk. If you wish to share the same ServerRoot for multiple # httpd daemons, you will need to change at least LockFile and PidFile. # ServerRoot "" # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 80 # # Dynamic Shared Object (DSO) Support # # To be able to use the functionality of a module which was built as a DSO you # have to place corresponding `LoadModule' lines at this location so the # directives contained in it are actually available _before_ they are used. # Statically compiled modules (those listed by `httpd -l') do not need # to be loaded here. # # Example: # LoadModule foo_module modules/mod_foo.so # LoadModule authn_file_module /usr/lib/apache2/modules/mod_authn_file.so LoadModule authn_dbm_module /usr/lib/apache2/modules/mod_authn_dbm.so LoadModule authn_anon_module /usr/lib/apache2/modules/mod_authn_anon.so LoadModule authn_dbd_module /usr/lib/apache2/modules/mod_authn_dbd.so LoadModule authn_default_module /usr/lib/apache2/modules/mod_authn_default.so LoadModule authn_alias_module /usr/lib/apache2/modules/mod_authn_alias.so LoadModule authz_host_module /usr/lib/apache2/modules/mod_authz_host.so LoadModule authz_groupfile_module /usr/lib/apache2/modules/mod_authz_groupfile.so LoadModule authz_user_module /usr/lib/apache2/modules/mod_authz_user.so LoadModule authz_dbm_module /usr/lib/apache2/modules/mod_authz_dbm.so LoadModule authz_owner_module /usr/lib/apache2/modules/mod_authz_owner.so LoadModule authnz_ldap_module /usr/lib/apache2/modules/mod_authnz_ldap.so LoadModule authz_default_module /usr/lib/apache2/modules/mod_authz_default.so LoadModule auth_basic_module /usr/lib/apache2/modules/mod_auth_basic.so LoadModule auth_digest_module /usr/lib/apache2/modules/mod_auth_digest.so LoadModule file_cache_module /usr/lib/apache2/modules/mod_file_cache.so LoadModule cache_module /usr/lib/apache2/modules/mod_cache.so LoadModule disk_cache_module /usr/lib/apache2/modules/mod_disk_cache.so LoadModule mem_cache_module /usr/lib/apache2/modules/mod_mem_cache.so LoadModule dbd_module /usr/lib/apache2/modules/mod_dbd.so LoadModule dumpio_module /usr/lib/apache2/modules/mod_dumpio.so LoadModule ext_filter_module /usr/lib/apache2/modules/mod_ext_filter.so LoadModule include_module /usr/lib/apache2/modules/mod_include.so LoadModule filter_module /usr/lib/apache2/modules/mod_filter.so LoadModule charset_lite_module /usr/lib/apache2/modules/mod_charset_lite.so LoadModule deflate_module /usr/lib/apache2/modules/mod_deflate.so LoadModule ldap_module /usr/lib/apache2/modules/mod_ldap.so LoadModule log_forensic_module /usr/lib/apache2/modules/mod_log_forensic.so LoadModule env_module /usr/lib/apache2/modules/mod_env.so LoadModule mime_magic_module /usr/lib/apache2/modules/mod_mime_magic.so LoadModule cern_meta_module /usr/lib/apache2/modules/mod_cern_meta.so LoadModule expires_module /usr/lib/apache2/modules/mod_expires.so LoadModule headers_module /usr/lib/apache2/modules/mod_headers.so LoadModule ident_module /usr/lib/apache2/modules/mod_ident.so LoadModule usertrack_module /usr/lib/apache2/modules/mod_usertrack.so LoadModule unique_id_module /usr/lib/apache2/modules/mod_unique_id.so LoadModule setenvif_module /usr/lib/apache2/modules/mod_setenvif.so LoadModule version_module /usr/lib/apache2/modules/mod_version.so LoadModule proxy_module /usr/lib/apache2/modules/mod_proxy.so LoadModule proxy_connect_module /usr/lib/apache2/modules/mod_proxy_connect.so LoadModule proxy_ftp_module /usr/lib/apache2/modules/mod_proxy_ftp.so LoadModule proxy_http_module /usr/lib/apache2/modules/mod_proxy_http.so LoadModule proxy_ajp_module /usr/lib/apache2/modules/mod_proxy_ajp.so LoadModule proxy_balancer_module /usr/lib/apache2/modules/mod_proxy_balancer.so LoadModule ssl_module /usr/lib/apache2/modules/mod_ssl.so LoadModule mime_module /usr/lib/apache2/modules/mod_mime.so LoadModule dav_module /usr/lib/apache2/modules/mod_dav.so LoadModule status_module /usr/lib/apache2/modules/mod_status.so LoadModule autoindex_module /usr/lib/apache2/modules/mod_autoindex.so LoadModule asis_module /usr/lib/apache2/modules/mod_asis.so LoadModule info_module /usr/lib/apache2/modules/mod_info.so LoadModule suexec_module /usr/lib/apache2/modules/mod_suexec.so LoadModule cgid_module /usr/lib/apache2/modules/mod_cgid.so LoadModule cgi_module /usr/lib/apache2/modules/mod_cgi.so LoadModule dav_fs_module /usr/lib/apache2/modules/mod_dav_fs.so LoadModule dav_lock_module /usr/lib/apache2/modules/mod_dav_lock.so LoadModule vhost_alias_module /usr/lib/apache2/modules/mod_vhost_alias.so LoadModule negotiation_module /usr/lib/apache2/modules/mod_negotiation.so LoadModule dir_module /usr/lib/apache2/modules/mod_dir.so LoadModule imagemap_module /usr/lib/apache2/modules/mod_imagemap.so LoadModule actions_module /usr/lib/apache2/modules/mod_actions.so LoadModule speling_module /usr/lib/apache2/modules/mod_speling.so LoadModule userdir_module /usr/lib/apache2/modules/mod_userdir.so LoadModule alias_module /usr/lib/apache2/modules/mod_alias.so LoadModule rewrite_module /usr/lib/apache2/modules/mod_rewrite.so # # If you wish httpd to run as a different user or group, you must run # httpd as root initially and it will switch. # # User/Group: The name (or #number) of the user/group to run httpd as. # It is usually good practice to create a dedicated user and group for # running httpd, as with most system services. # User daemon Group daemon # 'Main' server configuration # # The directives in this section set up the values used by the 'main' # server, which responds to any requests that aren't handled by a # definition. These values also provide defaults for # any containers you may define later in the file. # # All of these directives may appear inside containers, # in which case these default settings will be overridden for the # virtual host being defined. # # # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. e.g. admin@your-domain.com # ServerAdmin you@example.com # # ServerName gives the name and port that the server uses to identify itself. # This can often be determined automatically, but we recommend you specify # it explicitly to prevent problems during startup. # # If your host doesn't have a registered DNS name, enter its IP address here. # #ServerName www.example.com:80 # # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/usr/share/apache2/default-site/htdocs" # # Each directory to which Apache has access can be configured with respect # to which services and features are allowed and/or disabled in that # directory (and its subdirectories). # # First, we configure the "default" to be a very restrictive set of # features. # Options FollowSymLinks AllowOverride None Order deny,allow Deny from all # # Note that from this point forward you must specifically allow # particular features to be enabled - so if something's not working as # you might expect, make sure that you have specifically enabled it # below. # # # This should be changed to whatever you set DocumentRoot to. # # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.2/mod/core.html#options # for more information. # Options Indexes FollowSymLinks # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Order allow,deny Allow from all # # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # DirectoryIndex index.html # # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. # Order allow,deny Deny from all Satisfy All # # ErrorLog: The location of the error log file. # If you do not specify an ErrorLog directive within a # container, error messages relating to that virtual host will be # logged here. If you *do* define an error logfile for a # container, that host's errors will be logged there and not here. # ErrorLog /var/log/apache2/error_log # # LogLevel: Control the number of messages logged to the error_log. # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. # LogLevel warn # # The following directives define some format nicknames for use with # a CustomLog directive (see below). # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a # container, they will be logged here. Contrariwise, if you *do* # define per- access logfiles, transactions will be # logged therein and *not* in this file. # CustomLog /var/log/apache2/access_log common # # If you prefer a logfile with access, agent, and referer information # (Combined Logfile Format) you can use the following directive. # #CustomLog /var/log/apache2/access_log combined # # Redirect: Allows you to tell clients about documents that used to # exist in your server's namespace, but do not anymore. The client # will make a new request for the document at its new location. # Example: # Redirect permanent /foo http://www.example.com/bar # # Alias: Maps web paths into filesystem paths and is used to # access content that does not live under the DocumentRoot. # Example: # Alias /webpath /full/filesystem/path # # If you include a trailing / on /webpath then the server will # require it to be present in the URL. You will also likely # need to provide a section to allow access to # the filesystem path. # # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the target directory are treated as applications and # run by the server when requested rather than as documents sent to the # client. The same rules about trailing "/" apply to ScriptAlias # directives as to Alias. # ScriptAlias /cgi-bin/ "/usr/lib/cgi-bin/" # # ScriptSock: On threaded servers, designate the path to the UNIX # socket used to communicate with the CGI daemon of mod_cgid. # #Scriptsock /var/run/apache2/cgisock # # "/usr/lib/cgi-bin" should be changed to whatever your ScriptAliased # CGI directory exists, if you have that configured. # AllowOverride None Options None Order allow,deny Allow from all # # DefaultType: the default MIME type the server will use for a document # if it cannot otherwise determine one, such as from filename extensions. # If your server contains mostly text or HTML documents, "text/plain" is # a good value. If most of your content is binary, such as applications # or images, you may want to use "application/octet-stream" instead to # keep browsers from trying to display binary files as though they are # text. # DefaultType text/plain # # TypesConfig points to the file containing the list of mappings from # filename extension to MIME-type. # TypesConfig /etc/apache2/mime.types # # AddType allows you to add to or override the MIME configuration # file specified in TypesConfig for specific file types. # #AddType application/x-gzip .tgz # # AddEncoding allows you to have certain browsers uncompress # information on the fly. Note: Not all browsers support this. # #AddEncoding x-compress .Z #AddEncoding x-gzip .gz .tgz # # If the AddEncoding directives above are commented-out, then you # probably should define those extensions to indicate media types: # AddType application/x-compress .Z AddType application/x-gzip .gz .tgz # # AddHandler allows you to map certain file extensions to "handlers": # actions unrelated to filetype. These can be either built into the server # or added with the Action directive (see below) # # To use CGI scripts outside of ScriptAliased directories: # (You will also need to add "ExecCGI" to the "Options" directive.) # #AddHandler cgi-script .cgi # For type maps (negotiated resources): #AddHandler type-map var # # Filters allow you to process content before it is sent to the client. # # To parse .shtml files for server-side includes (SSI): # (You will also need to add "Includes" to the "Options" directive.) # #AddType text/html .shtml #AddOutputFilter INCLUDES .shtml # # The mod_mime_magic module allows the server to use various hints from the # contents of the file itself to determine its type. The MIMEMagicFile # directive tells the module where the hint definitions are located. # #MIMEMagicFile /etc/apache2/magic # # Customizable error responses come in three flavors: # 1) plain text 2) local redirects 3) external redirects # # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_info.html # # # EnableMMAP and EnableSendfile: On systems that support it, # memory-mapping or the sendfile syscall is used to deliver # files. This usually improves server performance, but must # be turned off when serving from networked-mounted # filesystems or if support for these functions is otherwise # broken on your system. # #EnableMMAP off #EnableSendfile off # Supplemental configuration # # The configuration files in the /etc/apache2/extra/ directory can be # included to add extra features or to modify the default configuration of # the server, or you may simply copy their contents here and change as # necessary. # Server-pool management (MPM specific) #Include /etc/apache2/extra/httpd-mpm.conf # Multi-language error messages #Include /etc/apache2/extra/httpd-multilang-errordoc.conf # Fancy directory listings #Include /etc/apache2/extra/httpd-autoindex.conf # Language settings #Include /etc/apache2/extra/httpd-languages.conf # User home directories #Include /etc/apache2/extra/httpd-userdir.conf # Real-time info on requests and configuration #Include /etc/apache2/extra/httpd-info.conf # Virtual hosts #Include /etc/apache2/extra/httpd-vhosts.conf # Local access to the Apache HTTP Server Manual #Include /etc/apache2/extra/httpd-manual.conf # Distributed authoring and versioning (WebDAV) #Include /etc/apache2/extra/httpd-dav.conf # Various default settings #Include /etc/apache2/extra/httpd-default.conf # Secure (SSL/TLS) connections #Include /etc/apache2/extra/httpd-ssl.conf # # Note: The following must must be present to support # starting without SSL on platforms with no /dev/random equivalent # but a statically compiled-in mod_ssl. # SSLRandomSeed startup builtin SSLRandomSeed connect builtin ================================================ FILE: samples/ApacheConf/filenames/httpd.conf ================================================ # # This is the main Apache HTTP server configuration file. It contains the # configuration directives that give the server its instructions. # See for detailed information. # In particular, see # # for a discussion of each configuration directive. # # Do NOT simply read the instructions in here without understanding # what they do. They're here only as hints or reminders. If you are unsure # consult the online docs. You have been warned. # # Configuration and logfile names: If the filenames you specify for many # of the server's control files begin with "/" (or "drive:/" for Win32), the # server will use that explicit path. If the filenames do *not* begin # with "/", the value of ServerRoot is prepended -- so "log/foo_log" # with ServerRoot set to "/usr" will be interpreted by the # server as "/usr/log/foo_log". # # ServerRoot: The top of the directory tree under which the server's # configuration, error, and log files are kept. # # Do not add a slash at the end of the directory path. If you point # ServerRoot at a non-local disk, be sure to point the LockFile directive # at a local disk. If you wish to share the same ServerRoot for multiple # httpd daemons, you will need to change at least LockFile and PidFile. # ServerRoot "/usr" # # Listen: Allows you to bind Apache to specific IP addresses and/or # ports, instead of the default. See also the # directive. # # Change this to Listen on specific IP addresses as shown below to # prevent Apache from glomming onto all bound IP addresses. # #Listen 12.34.56.78:80 Listen 80 # # Dynamic Shared Object (DSO) Support # # To be able to use the functionality of a module which was built as a DSO you # have to place corresponding `LoadModule' lines at this location so the # directives contained in it are actually available _before_ they are used. # Statically compiled modules (those listed by `httpd -l') do not need # to be loaded here. # # Example: # LoadModule foo_module modules/mod_foo.so # LoadModule authn_file_module libexec/apache2/mod_authn_file.so LoadModule authn_dbm_module libexec/apache2/mod_authn_dbm.so LoadModule authn_anon_module libexec/apache2/mod_authn_anon.so LoadModule authn_dbd_module libexec/apache2/mod_authn_dbd.so LoadModule authn_default_module libexec/apache2/mod_authn_default.so LoadModule authz_host_module libexec/apache2/mod_authz_host.so LoadModule authz_groupfile_module libexec/apache2/mod_authz_groupfile.so LoadModule authz_user_module libexec/apache2/mod_authz_user.so LoadModule authz_dbm_module libexec/apache2/mod_authz_dbm.so LoadModule authz_owner_module libexec/apache2/mod_authz_owner.so LoadModule authz_default_module libexec/apache2/mod_authz_default.so LoadModule auth_basic_module libexec/apache2/mod_auth_basic.so LoadModule auth_digest_module libexec/apache2/mod_auth_digest.so LoadModule cache_module libexec/apache2/mod_cache.so LoadModule disk_cache_module libexec/apache2/mod_disk_cache.so LoadModule mem_cache_module libexec/apache2/mod_mem_cache.so LoadModule dbd_module libexec/apache2/mod_dbd.so LoadModule dumpio_module libexec/apache2/mod_dumpio.so LoadModule reqtimeout_module libexec/apache2/mod_reqtimeout.so LoadModule ext_filter_module libexec/apache2/mod_ext_filter.so LoadModule include_module libexec/apache2/mod_include.so LoadModule filter_module libexec/apache2/mod_filter.so LoadModule substitute_module libexec/apache2/mod_substitute.so LoadModule deflate_module libexec/apache2/mod_deflate.so LoadModule log_config_module libexec/apache2/mod_log_config.so LoadModule log_forensic_module libexec/apache2/mod_log_forensic.so LoadModule logio_module libexec/apache2/mod_logio.so LoadModule env_module libexec/apache2/mod_env.so LoadModule mime_magic_module libexec/apache2/mod_mime_magic.so LoadModule cern_meta_module libexec/apache2/mod_cern_meta.so LoadModule expires_module libexec/apache2/mod_expires.so LoadModule headers_module libexec/apache2/mod_headers.so LoadModule ident_module libexec/apache2/mod_ident.so LoadModule usertrack_module libexec/apache2/mod_usertrack.so #LoadModule unique_id_module libexec/apache2/mod_unique_id.so LoadModule setenvif_module libexec/apache2/mod_setenvif.so LoadModule version_module libexec/apache2/mod_version.so LoadModule proxy_module libexec/apache2/mod_proxy.so LoadModule proxy_connect_module libexec/apache2/mod_proxy_connect.so LoadModule proxy_ftp_module libexec/apache2/mod_proxy_ftp.so LoadModule proxy_http_module libexec/apache2/mod_proxy_http.so LoadModule proxy_scgi_module libexec/apache2/mod_proxy_scgi.so LoadModule proxy_ajp_module libexec/apache2/mod_proxy_ajp.so LoadModule proxy_balancer_module libexec/apache2/mod_proxy_balancer.so LoadModule ssl_module libexec/apache2/mod_ssl.so LoadModule mime_module libexec/apache2/mod_mime.so LoadModule dav_module libexec/apache2/mod_dav.so LoadModule status_module libexec/apache2/mod_status.so LoadModule autoindex_module libexec/apache2/mod_autoindex.so LoadModule asis_module libexec/apache2/mod_asis.so LoadModule info_module libexec/apache2/mod_info.so LoadModule cgi_module libexec/apache2/mod_cgi.so LoadModule dav_fs_module libexec/apache2/mod_dav_fs.so LoadModule vhost_alias_module libexec/apache2/mod_vhost_alias.so LoadModule negotiation_module libexec/apache2/mod_negotiation.so LoadModule dir_module libexec/apache2/mod_dir.so LoadModule imagemap_module libexec/apache2/mod_imagemap.so LoadModule actions_module libexec/apache2/mod_actions.so LoadModule speling_module libexec/apache2/mod_speling.so LoadModule userdir_module libexec/apache2/mod_userdir.so LoadModule alias_module libexec/apache2/mod_alias.so LoadModule rewrite_module libexec/apache2/mod_rewrite.so #LoadModule perl_module libexec/apache2/mod_perl.so #LoadModule php5_module libexec/apache2/libphp5.so #LoadModule hfs_apple_module libexec/apache2/mod_hfs_apple.so # # If you wish httpd to run as a different user or group, you must run # httpd as root initially and it will switch. # # User/Group: The name (or #number) of the user/group to run httpd as. # It is usually good practice to create a dedicated user and group for # running httpd, as with most system services. # User _www Group _www # 'Main' server configuration # # The directives in this section set up the values used by the 'main' # server, which responds to any requests that aren't handled by a # definition. These values also provide defaults for # any containers you may define later in the file. # # All of these directives may appear inside containers, # in which case these default settings will be overridden for the # virtual host being defined. # # # ServerAdmin: Your address, where problems with the server should be # e-mailed. This address appears on some server-generated pages, such # as error documents. e.g. admin@your-domain.com # ServerAdmin you@example.com # # ServerName gives the name and port that the server uses to identify itself. # This can often be determined automatically, but we recommend you specify # it explicitly to prevent problems during startup. # # If your host doesn't have a registered DNS name, enter its IP address here. # #ServerName www.example.com:80 # # DocumentRoot: The directory out of which you will serve your # documents. By default, all requests are taken from this directory, but # symbolic links and aliases may be used to point to other locations. # DocumentRoot "/Library/WebServer/Documents" # # Each directory to which Apache has access can be configured with respect # to which services and features are allowed and/or disabled in that # directory (and its subdirectories). # # First, we configure the "default" to be a very restrictive set of # features. # Options FollowSymLinks AllowOverride None Order deny,allow Deny from all # # Note that from this point forward you must specifically allow # particular features to be enabled - so if something's not working as # you might expect, make sure that you have specifically enabled it # below. # # # This should be changed to whatever you set DocumentRoot to. # # # Possible values for the Options directive are "None", "All", # or any combination of: # Indexes Includes FollowSymLinks SymLinksifOwnerMatch ExecCGI MultiViews # # Note that "MultiViews" must be named *explicitly* --- "Options All" # doesn't give it to you. # # The Options directive is both complicated and important. Please see # http://httpd.apache.org/docs/2.2/mod/core.html#options # for more information. # Options Indexes FollowSymLinks MultiViews # # AllowOverride controls what directives may be placed in .htaccess files. # It can be "All", "None", or any combination of the keywords: # Options FileInfo AuthConfig Limit # AllowOverride None # # Controls who can get stuff from this server. # Order allow,deny Allow from all # # DirectoryIndex: sets the file that Apache will serve if a directory # is requested. # DirectoryIndex index.html # # The following lines prevent .htaccess and .htpasswd files from being # viewed by Web clients. # Order allow,deny Deny from all Satisfy All # # Apple specific filesystem protection. # Order allow,deny Deny from all Satisfy All Order allow,deny Deny from all Satisfy All # # ErrorLog: The location of the error log file. # If you do not specify an ErrorLog directive within a # container, error messages relating to that virtual host will be # logged here. If you *do* define an error logfile for a # container, that host's errors will be logged there and not here. # ErrorLog "/private/var/log/apache2/error_log" # # LogLevel: Control the number of messages logged to the error_log. # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. # LogLevel warn # # The following directives define some format nicknames for use with # a CustomLog directive (see below). # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined LogFormat "%h %l %u %t \"%r\" %>s %b" common # You need to enable mod_logio.c to use %I and %O LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\" %I %O" combinedio # # The location and format of the access logfile (Common Logfile Format). # If you do not define any access logfiles within a # container, they will be logged here. Contrariwise, if you *do* # define per- access logfiles, transactions will be # logged therein and *not* in this file. # CustomLog "/private/var/log/apache2/access_log" common # # If you prefer a logfile with access, agent, and referer information # (Combined Logfile Format) you can use the following directive. # #CustomLog "/private/var/log/apache2/access_log" combined # # Redirect: Allows you to tell clients about documents that used to # exist in your server's namespace, but do not anymore. The client # will make a new request for the document at its new location. # Example: # Redirect permanent /foo http://www.example.com/bar # # Alias: Maps web paths into filesystem paths and is used to # access content that does not live under the DocumentRoot. # Example: # Alias /webpath /full/filesystem/path # # If you include a trailing / on /webpath then the server will # require it to be present in the URL. You will also likely # need to provide a section to allow access to # the filesystem path. # # ScriptAlias: This controls which directories contain server scripts. # ScriptAliases are essentially the same as Aliases, except that # documents in the target directory are treated as applications and # run by the server when requested rather than as documents sent to the # client. The same rules about trailing "/" apply to ScriptAlias # directives as to Alias. # ScriptAliasMatch ^/cgi-bin/((?!(?i:webobjects)).*$) "/Library/WebServer/CGI-Executables/$1" # # ScriptSock: On threaded servers, designate the path to the UNIX # socket used to communicate with the CGI daemon of mod_cgid. # #Scriptsock /private/var/run/cgisock # # "/Library/WebServer/CGI-Executables" should be changed to whatever your ScriptAliased # CGI directory exists, if you have that configured. # AllowOverride None Options None Order allow,deny Allow from all # # DefaultType: the default MIME type the server will use for a document # if it cannot otherwise determine one, such as from filename extensions. # If your server contains mostly text or HTML documents, "text/plain" is # a good value. If most of your content is binary, such as applications # or images, you may want to use "application/octet-stream" instead to # keep browsers from trying to display binary files as though they are # text. # DefaultType text/plain # # TypesConfig points to the file containing the list of mappings from # filename extension to MIME-type. # TypesConfig /private/etc/apache2/mime.types # # AddType allows you to add to or override the MIME configuration # file specified in TypesConfig for specific file types. # #AddType application/x-gzip .tgz # # AddEncoding allows you to have certain browsers uncompress # information on the fly. Note: Not all browsers support this. # #AddEncoding x-compress .Z #AddEncoding x-gzip .gz .tgz # # If the AddEncoding directives above are commented-out, then you # probably should define those extensions to indicate media types: # AddType application/x-compress .Z AddType application/x-gzip .gz .tgz # # AddHandler allows you to map certain file extensions to "handlers": # actions unrelated to filetype. These can be either built into the server # or added with the Action directive (see below) # # To use CGI scripts outside of ScriptAliased directories: # (You will also need to add "ExecCGI" to the "Options" directive.) # #AddHandler cgi-script .cgi # For type maps (negotiated resources): #AddHandler type-map var # # Filters allow you to process content before it is sent to the client. # # To parse .shtml files for server-side includes (SSI): # (You will also need to add "Includes" to the "Options" directive.) # #AddType text/html .shtml #AddOutputFilter INCLUDES .shtml # # The mod_mime_magic module allows the server to use various hints from the # contents of the file itself to determine its type. The MIMEMagicFile # directive tells the module where the hint definitions are located. # #MIMEMagicFile /private/etc/apache2/magic # # Customizable error responses come in three flavors: # 1) plain text 2) local redirects 3) external redirects # # Some examples: #ErrorDocument 500 "The server made a boo boo." #ErrorDocument 404 /missing.html #ErrorDocument 404 "/cgi-bin/missing_handler.pl" #ErrorDocument 402 http://www.example.com/subscription_info.html # # # MaxRanges: Maximum number of Ranges in a request before # returning the entire resource, or one of the special # values 'default', 'none' or 'unlimited'. # Default setting is to accept 200 Ranges. #MaxRanges unlimited # # EnableMMAP and EnableSendfile: On systems that support it, # memory-mapping or the sendfile syscall is used to deliver # files. This usually improves server performance, but must # be turned off when serving from networked-mounted # filesystems or if support for these functions is otherwise # broken on your system. # #EnableMMAP off #EnableSendfile off # 6894961 TraceEnable off # Supplemental configuration # # The configuration files in the /private/etc/apache2/extra/ directory can be # included to add extra features or to modify the default configuration of # the server, or you may simply copy their contents here and change as # necessary. # Server-pool management (MPM specific) Include /private/etc/apache2/extra/httpd-mpm.conf # Multi-language error messages #Include /private/etc/apache2/extra/httpd-multilang-errordoc.conf # Fancy directory listings Include /private/etc/apache2/extra/httpd-autoindex.conf # Language settings Include /private/etc/apache2/extra/httpd-languages.conf # User home directories Include /private/etc/apache2/extra/httpd-userdir.conf # Real-time info on requests and configuration #Include /private/etc/apache2/extra/httpd-info.conf # Virtual hosts #Include /private/etc/apache2/extra/httpd-vhosts.conf # Local access to the Apache HTTP Server Manual Include /private/etc/apache2/extra/httpd-manual.conf # Distributed authoring and versioning (WebDAV) #Include /private/etc/apache2/extra/httpd-dav.conf # Various default settings #Include /private/etc/apache2/extra/httpd-default.conf # Secure (SSL/TLS) connections #Include /private/etc/apache2/extra/httpd-ssl.conf # # Note: The following must must be present to support # starting without SSL on platforms with no /dev/random equivalent # but a statically compiled-in mod_ssl. # SSLRandomSeed startup builtin SSLRandomSeed connect builtin Include /private/etc/apache2/other/*.conf ================================================ FILE: samples/Apex/AccountTrigger.trigger ================================================ trigger AccountTrigger on Account( before insert, after insert, before update, after update, before delete, after delete, after undelete ) { // This trigger utilizes a trigger handler pattern & framework. // For more information on how the framework operates, see the following classes: // * TriggerHandler.cls // * AccountTriggerHandler.cls /** * Our TriggerHandler framework can be invoked in one of two ways. * 1. You can directly invoke a trigger handler class by name using this * syntax: new TriggerHandlerName().run(); For instance, you could directly * invoke the AccountTriggerHandler().run(); * */ new AccountTriggerHandler().run(); /** * 2. Alternatively, you can use the MetadataTriggerHandler().run(); * method. This is responsible for identifying from custom metadata which * trigger handler classes are to be invoked, and in what order. * */ new MetadataTriggerHandler().run(); } ================================================ FILE: samples/Apex/AddRelatedRecord.trigger ================================================ trigger AddRelatedRecord on Account(after insert, after update) { List oppList = new List(); // Get the related opportunities for the accounts in this trigger Map acctsWithOpps = new Map( [SELECT Id,(SELECT Id FROM Opportunities) FROM Account WHERE Id IN :Trigger.new]); // Add an opportunity for each account if it doesn't already have one. // Iterate through each account. for(Account a : Trigger.new) { System.debug('acctsWithOpps.get(a.Id).Opportunities.size()=' + acctsWithOpps.get(a.Id).Opportunities.size()); // Check if the account already has a related opportunity. if (acctsWithOpps.get(a.Id).Opportunities.size() == 0) { // If it doesn't, add a default opportunity oppList.add(new Opportunity(Name=a.Name + ' Opportunity', StageName='Prospecting', CloseDate=System.today().addMonths(1), AccountId=a.Id)); } } if (oppList.size() > 0) { insert oppList; } } ================================================ FILE: samples/Apex/ArrayUtils.cls ================================================ /* ============================================================ * This code is part of the "apex-lang" open source project avaiable at: * * http://code.google.com/p/apex-lang/ * * This code is licensed under the Apache License, Version 2.0. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * ============================================================ */ global class ArrayUtils { global static String[] EMPTY_STRING_ARRAY = new String[]{}; global static Integer MAX_NUMBER_OF_ELEMENTS_IN_LIST {get{return 1000;}} global static List objectToString(List objects){ List strings = null; if(objects != null){ strings = new List(); if(objects.size() > 0){ for(Object obj : objects){ if(obj instanceof String){ strings.add((String)obj); } } } } return strings; } global static Object[] reverse(Object[] anArray) { if (anArray == null) { return null; } Integer i = 0; Integer j = anArray.size() - 1; Object tmp; while (j > i) { tmp = anArray[j]; anArray[j] = anArray[i]; anArray[i] = tmp; j--; i++; } return anArray; } global static SObject[] reverse(SObject[] anArray) { if (anArray == null) { return null; } Integer i = 0; Integer j = anArray.size() - 1; SObject tmp; while (j > i) { tmp = anArray[j]; anArray[j] = anArray[i]; anArray[i] = tmp; j--; i++; } return anArray; } global static List lowerCase(List strs){ List returnValue = null; if(strs != null){ returnValue = new List(); if(strs.size() > 0){ for(String str : strs){ returnValue.add(str == null ? null : str.toLowerCase()); } } } return returnValue; } global static List upperCase(List strs){ List returnValue = null; if(strs != null){ returnValue = new List(); if(strs.size() > 0){ for(String str : strs){ returnValue.add(str == null ? null : str.toUpperCase()); } } } return returnValue; } global static List trim(List strs){ List returnValue = null; if(strs != null){ returnValue = new List(); if(strs.size() > 0){ for(String str : strs){ returnValue.add(str == null ? null : str.trim()); } } } return returnValue; } global static Object[] mergex(Object[] array1, Object[] array2){ if(array1 == null){ return array2; } if(array2 == null){ return array1; } Object[] merged = new Object[array1.size() + array2.size()]; for(Integer i = 0; i < array1.size(); i++){ merged[i] = array1[i]; } for(Integer i = 0; i < array2.size(); i++){ merged[i+array1.size()] = array2[i]; } return merged; } global static SObject[] mergex(SObject[] array1, SObject[] array2){ if(array1 == null){ return array2; } if(array2 == null){ return array1; } if(array1.size() <= 0){ return array2; } List merged = new List(); for(SObject sObj : array1){ merged.add(sObj); } for(SObject sObj : array2){ merged.add(sObj); } return merged; } global static Boolean isEmpty(Object[] objectArray){ if(objectArray == null){ return true; } return objectArray.size() == 0; } global static Boolean isEmpty(SObject[] objectArray){ if(objectArray == null){ return true; } return objectArray.size() == 0; } global static Boolean isNotEmpty(Object[] objectArray){ return !isEmpty(objectArray); } global static Boolean isNotEmpty(SObject[] objectArray){ return !isEmpty(objectArray); } global static Object[] pluck(SObject[] objectArray, String fieldName){ if(isEmpty(objectArray) || fieldName == null || fieldName.trim() == null || fieldName.trim().length() == 0){ return new Object[]{}; } Object[] plucked = new Object[objectArray.size()]; for(Integer i = 0; i < objectArray.size(); i++){ plucked[i] = objectArray[i].get(fieldName); } return plucked; } global static String toString(Object[] objectArray){ if(objectArray == null){ return 'null'; } String returnValue = '{'; for(Integer i = 0; i < objectArray.size(); i++){ if(i!=0){ returnValue += ','; } returnValue += '\'' + objectArray[i] + '\''; } returnValue += '}'; return returnValue; } global static String toString(SObject[] objectArray){ if(objectArray == null){ return 'null'; } String returnValue = '{'; for(Integer i = 0; i < objectArray.size(); i++){ if(i!=0){ returnValue += ','; } returnValue += '\'' + objectArray[i] + '\''; } returnValue += '}'; return returnValue; } global static void assertArraysAreEqual(Object[] expected, Object[] actual){ //check to see if one param is null but the other is not System.assert((expected == null && actual == null)|| (expected != null && actual != null), 'Assertion failed, the following two arrays are not equal. Expected: ' + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); if(expected != null && actual != null){ System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal. Expected: ' + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); for(Integer i = 0; i < expected.size(); i++){ System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal. Expected: ' + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); } } } global static void assertArraysAreEqual(SObject[] expected, SObject[] actual){ //check to see if one param is null but the other is not System.assert((expected == null && actual == null)|| (expected != null && actual != null), 'Assertion failed, the following two arrays are not equal. Expected: ' + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); if(expected != null && actual != null){ System.assert(expected.size() == actual.size(), 'Assertion failed, the following two arrays are not equal. Expected: ' + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); for(Integer i = 0; i < expected.size(); i++){ System.assert(expected[i] == actual[i], 'Assertion failed, the following two arrays are not equal. Expected: ' + ArrayUtils.toString(expected) + ', Actual: ' + ArrayUtils.toString(actual)); } } } global static List merg(List list1, List list2) { List returnList = new List(); if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){ throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST); } if(isNotEmpty(list1)){ for(Object elmt : list1){ returnList.add(elmt); } } if(isNotEmpty(list2)){ for(Object elmt : list2){ returnList.add(elmt); } } return returnList; } global static List merg(List list1, List list2) { if(list1 != null && list2 != null && (list1.size()+list2.size()) > MAX_NUMBER_OF_ELEMENTS_IN_LIST){ throw new IllegalArgumentException('Lists cannot be merged because new list would be greater than maximum number of elements in a list: ' + MAX_NUMBER_OF_ELEMENTS_IN_LIST); } if(isEmpty(list1) && isEmpty(list2)){ return null; } List returnList = new List(); if(list1 != null){ for(SObject elmt : list1){ returnList.add(elmt); } } if(list2 != null){ for(SObject elmt : list2){ returnList.add(elmt); } } return returnList; } global static List subset(List aList, Integer count) { return subset(aList,0,count); } global static List subset(List list1, Integer startIndex, Integer count) { List returnList = new List(); if(list1 != null && list1.size() > 0 && startIndex >= 0 && startIndex <= list1.size()-1 && count > 0){ for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){ returnList.add(list1.get(i)); } } return returnList; } global static List subset(List aList, Integer count) { return subset(aList,0,count); } global static List subset(List list1, Integer startIndex, Integer count) { List returnList = null; if(list1 != null && list1.size() > 0 && startIndex <= list1.size()-1 && count > 0){ returnList = new List(); for(Integer i = startIndex; i < list1.size() && i - startIndex < count; i++){ returnList.add(list1.get(i)); } } return returnList; } //=============================================== //LIST/ARRAY SORTING //=============================================== //FOR FORCE.COM PRIMITIVES (Double,Integer,ID,etc.): global static List qsort(List theList) { return qsort(theList,new PrimitiveComparator()); } global static List qsort(List theList, Boolean sortAsc) { return qsort(theList,new PrimitiveComparator(),sortAsc); } global static List qsort(List theList, ObjectComparator comparator) { return qsort(theList,comparator,true); } global static List qsort(List theList, ObjectComparator comparator, Boolean sortAsc) { return qsort(theList, 0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc); } //FOR SALESFORCE OBJECTS (sObjects): global static List qsort(List theList, ISObjectComparator comparator) { return qsort(theList,comparator,true); } global static List qsort(List theList, ISObjectComparator comparator,Boolean sortAsc ) { return qsort(theList, 0, (theList == null ? 0 : theList.size()-1),comparator,sortAsc); } private static List qsort(List theList, Integer lo0, Integer hi0, ObjectComparator comparator, Boolean sortAsc){ Integer lo = lo0; Integer hi = hi0; if (lo >= hi) { return theList; } else if( lo == hi - 1 ) { if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || (comparator.compare(theList[lo],theList[hi])<0 && !sortAsc) ) { Object prs = theList[lo]; theList[lo] = theList[hi]; theList[hi] = prs; } return theList; } Object pivot = theList[(lo + hi) / 2]; theList[(lo + hi) / 2] = theList[hi]; theList[hi] = pivot; while( lo < hi ) { while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || (comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc) ) { lo++; } while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) || ( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc) ) { hi--; } if( lo < hi ){ Object prs = theList[lo]; theList[lo] = theList[hi]; theList[hi] = prs; } } theList[hi0] = theList[hi]; theList[hi] = pivot; qsort(theList, lo0, lo-1,comparator,sortAsc); qsort(theList, hi+1, hi0,comparator,sortAsc); return theList; } private static List qsort(List theList, Integer lo0, Integer hi0, ISObjectComparator comparator, Boolean sortAsc){ Integer lo = lo0; Integer hi = hi0; if (lo >= hi) { return theList; } else if( lo == hi - 1 ) { if (( comparator.compare(theList[lo],theList[hi])>0 && sortAsc) || (comparator.compare(theList[lo],theList[hi])<0 && !sortAsc) ) { SObject prs = theList[lo]; theList[lo] = theList[hi]; theList[hi] = prs; } return theList; } SObject pivot = theList[(lo + hi) / 2]; theList[(lo + hi) / 2] = theList[hi]; theList[hi] = pivot; while( lo < hi ) { while ((comparator.compare(theList[lo], pivot)<=0 && lo < hi && sortAsc) || (comparator.compare(theList[lo], pivot)>=0 && lo < hi && !sortAsc) ) { lo++; } while (( comparator.compare(pivot,theList[hi])<=0 && lo < hi && sortAsc) || ( comparator.compare(pivot,theList[hi])>=0 && lo < hi && !sortAsc) ) { hi--; } if( lo < hi ){ SObject prs = theList[lo]; theList[lo] = theList[hi]; theList[hi] = prs; } } theList[hi0] = theList[hi]; theList[hi] = pivot; qsort(theList, lo0, lo-1,comparator,sortAsc); qsort(theList, hi+1, hi0,comparator,sortAsc); return theList; } /* global static List unique(List theList) { List uniques = new List(); Set keys = new Set(); if(theList != null && theList.size() > 0){ for(Object obj : theList){ if(keys.contains(obj)){ continue; } else { keys.add(obj); uniques.add(obj); } } } return uniques; } global static List unique(List theList) { if(theList == null){ return null; } List uniques = createEmptySObjectList(theList.get(0)); Set keys = new Set(); if(theList != null && theList.size() > 0){ String key = null; for(SObject obj : theList){ key = obj == null ? null : ''+obj; if(keys.contains(key)){ continue; } else { keys.add(key); uniques.add(obj); } } } return uniques; } */ } ================================================ FILE: samples/Apex/BooleanUtils.cls ================================================ /* ============================================================ * This code is part of the "apex-lang" open source project avaiable at: * * http://code.google.com/p/apex-lang/ * * This code is licensed under the Apache License, Version 2.0. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * ============================================================ */ global class BooleanUtils { global static Boolean isFalse(Boolean bool) { if(bool==null) return false; else return !bool; } global static Boolean isNotFalse(Boolean bool) { if(bool==null) return true; else return bool; } global static Boolean isNotTrue(Boolean bool) { if(bool==null) return true; else return !bool; } global static Boolean isTrue(Boolean bool) { if(bool==null) return false; else return bool; } global static Boolean negate(Boolean bool) { if(bool==null) return null; else return !bool; } global static Boolean toBooleanDefaultIfNull(Boolean bool, Boolean defaultVal) { if(bool==null) return defaultVal; else return bool; } global static Boolean toBoolean(Integer value) { if(value==null) return false; else { if(value==0) return false; else return true; } } global static Boolean strToBoolean(String value) { if(value==null) return false; else { if(StringUtils.equalsIgnoreCase(value,'true')) return true; else return false; } } /************************************/ //Converts an int to a boolean specifying //the conversion values. // Parameters: // value - the Integer to convert, may be null // trueValue - the value to match for true, may be null // falseValue - the value to match for false, may be null //Returns: // true or false //Throws: // java.lang.IllegalArgumentException - if no match /************************************/ global static Boolean toBoolean(Integer value, Integer trueValue, Integer falseValue) { if(value==trueValue) return true; else if(value==falseValue) return false; else throw new IllegalArgumentException(); } global static Integer toInteger(Boolean bool) { if(bool==null) throw new IllegalArgumentException(); else { if(bool) return 1; else return 0; } } global static String toStringYesNo(Boolean bool) { if(bool==null) return null; else { if(bool) return 'yes'; else return 'no'; } } global static String toStringYN(Boolean bool) { if(bool==null) return null; else { if(bool) return 'Y'; else return 'N'; } } global static String toString(Boolean bool, String trueString, String falseString) { if(bool==null) return null; else { if(bool) return trueString; else return falseString; } } global static Boolean xor(Boolean[] boolArray) { if(boolArray==null || boolArray.size()==0) throw new IllegalArgumentException(); else { Boolean firstItem=boolArray[0]; for(Boolean bool:boolArray) { if(bool!=firstItem) return false; } return true; } } } ================================================ FILE: samples/Apex/EmailUtils.cls ================================================ /* ============================================================ * Contributor: Caleb Sidel * * This code is part of the "apex-lang" open source project avaiable at: * * http://code.google.com/p/apex-lang/ * * This code is licensed under the Apache License, Version 2.0. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * ============================================================ */ global class EmailUtils { global static void sendEmailWithStandardAttachments(List recipients,String emailSubject,String body,Boolean useHTML,List attachmentIDs) { List stdAttachments = [SELECT id, name, body FROM Attachment WHERE Id IN:attachmentIDs]; sendEmailWithStandardAttachments(recipients, emailSubject, body, useHTML, stdAttachments); } global static void sendEmailWithStandardAttachments(List recipients,String emailSubject,String body,Boolean useHTML,List stdAttachments) { List fileAttachments = new List(); for(Attachment attachment : stdAttachments) { Messaging.EmailFileAttachment fileAttachment = new Messaging.EmailFileAttachment(); fileAttachment.setFileName(attachment.Name); fileAttachment.setBody(attachment.Body); fileAttachments.add(fileAttachment); } sendEmail(recipients, emailSubject, body, useHTML, fileAttachments); } global static void sendTextEmail(List recipients,String emailSubject,String textBody) { sendEmail(recipients, emailSubject, textBody, false, null); } global static void sendHTMLEmail(List recipients,String emailSubject,String htmlBody) { sendEmail(recipients, emailSubject, htmlBody, true, null); } global static void sendEmail(List recipients,String emailSubject,String body,Boolean useHTML,List fileAttachments) { if(recipients == null) return; if(recipients.size() == 0) return; // Create a new single email message object // that will send out a single email to the addresses in the To, CC & BCC list. Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage(); //the email is not saved as an activity. mail.setSaveAsActivity(false); // Assign the addresses for the To lists to the mail object. mail.setToAddresses(recipients); // Specify the subject line for your email address. mail.setSubject(emailSubject); // Set to True if you want to BCC yourself on the email. mail.setBccSender(false); // The email address of the user executing the Apex Code will be used. mail.setUseSignature(false); if (useHTML) { // Specify the html content of the email. mail.setHtmlBody(body); } else { // Specify the text content of the email. mail.setPlainTextBody(body); } // Specify FileAttachments if(fileAttachments != null && fileAttachments.size() > 0) { mail.setFileAttachments(fileAttachments); } // Send the email you have created. Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail }); } /** * null => false * '' => false * ' ' => false * 'x' => false * 'x@' => false * 'x@x' => false * 'x@x.x' => true */ global static Boolean isValidEmailAddress(String str){ if(str != null && str.trim() != null && str.trim().length() > 0){ String[] split = str.split('@'); if(split != null && split.size() == 2){ split = split[1].split('\\.'); if(split != null && split.size() >= 2){ return true; } } } return false; } global static Boolean isNotValidEmailAddress(String str){ return !isValidEmailAddress(str); } } ================================================ FILE: samples/Apex/GeoUtils.cls ================================================ public class GeoUtils { // generate a KML string given a page reference, call getContent() // then cleanup the output. public static string generateFromContent(PageReference pr) { string ret = ''; try { ret = (string) pr.getContent().toString(); ret = ret.replaceAll('"','\'' ); // get content produces quote chars \" ret = ret.replaceAll( '&','&');// we need to escape these in the node value } catch (exception e ) { system.debug( 'ERROR '+e); } ret = ret.replaceAll('\n',' '); // must use ALL since many new line may get ret = ret.replaceAll('\r',' '); // get these also! // system.debug( ret); // dump the KML return ret ; } public static Map geo_response = new Map{'200'=>'G_GEO_SUCCESS', '400'=>'G_GEO_BAD_REQUEST', '500'=>'G_GEO_SERVER_ERROR', '601'=>'G_GEO_MISSING_ADDRESS', '602'=>'G_GEO_UNKNOWN_ADDRESS', '603'=>'G_GEO_UNAVAILABLE_ADDRESS', '604'=>'G_GEO_UNKNOWN_DIRECTIONS', '610'=>'G_GEO_BAD_KEY', '620'=>'G_GEO_TOO_MANY_QUERIES' }; public static string accountAddressString ( account acct ) { // form an address string given an account object string adr = acct.billingstreet + ',' + acct.billingcity + ',' + acct.billingstate; if ( acct.billingpostalcode != null ) adr += ',' + acct.billingpostalcode; if ( acct.billingcountry != null ) adr += ',' + acct.billingcountry; adr = adr.replaceAll('\"', '' ); adr = adr.replaceAll('\'', '' ); adr = adr.replaceAll( '\n', ' ' ); adr = adr.replaceAll( '\r', ' ' ); system.debug( adr ); return adr; } public static testmethod void t1() { PageReference pageRef = Page.kmlPreviewTemplate; Test.setCurrentPage(pageRef); system.assert ( GeoUtils.generateFromContent( pageRef ) != null ); Account a = new Account( name='foo', billingstreet='main', billingcity='springfield',billingstate='il', billingpostalcode='9',billingcountry='us'); insert a; system.assertEquals( 'main,springfield,il,9,us',accountAddressString( a) ); } } ================================================ FILE: samples/Apex/LanguageUtils.cls ================================================ /* ============================================================ * This code is part of the "apex-lang" open source project avaiable at: * * http://code.google.com/p/apex-lang/ * * This code is licensed under the Apache License, Version 2.0. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * ============================================================ */ global class LanguageUtils { global static final String HTTP_LANGUAGE_CODE_PARAMETER_KEY = 'l'; global static final String DEFAULT_LANGUAGE_CODE = 'en_us'; global static Set SUPPORTED_LANGUAGE_CODES = new Set{ 'zh-cn' //Chinese (Simplified) ,'zh-tw' //Chinese (Traditional) ,'nl-nl' //Dutch ,'en-us' //English ,'fi' //Finnish ,'fr' //French ,'de' //German ,'it' //Italian ,'ja' //Japanese ,'ko' //Korean ,'pl' //Polish ,'pt-br' //Portuguese (Brazilian) ,'ru' //Russian ,'es' //Spanish ,'sv' //Swedish ,'th' //Thai ,'cs' //Czech ,'da' //Danish ,'hu' //Hungarian ,'in' //Indonesian ,'tr' //Turkish }; private static Map DEFAULTS = new Map{ 'en'=>'en-us' ,'zh'=>'zh-cn' ,'nl'=>'nl-nl' ,'pt'=>'pt-br' }; global static String getLangCodeByHttpParam(){ String returnValue = null; final Set LANGUAGE_CODE_SET = getSuppLangCodeSet(); if(ApexPages.currentPage() != null && ApexPages.currentPage().getParameters() != null){ String LANGUAGE_HTTP_PARAMETER = StringUtils.lowerCase( StringUtils.replaceChars( ApexPages.currentPage().getParameters().get(HTTP_LANGUAGE_CODE_PARAMETER_KEY) , '_' //underscore , '-' //dash ) ); if(DEFAULTS.containsKey(LANGUAGE_HTTP_PARAMETER)){ LANGUAGE_HTTP_PARAMETER = DEFAULTS.get(LANGUAGE_HTTP_PARAMETER); } if(StringUtils.isNotBlank(LANGUAGE_HTTP_PARAMETER) && SUPPORTED_LANGUAGE_CODES.contains(LANGUAGE_HTTP_PARAMETER)){ returnValue = LANGUAGE_HTTP_PARAMETER; } } return returnValue; } global static String getLangCodeByBrowser(){ final String LANGUAGES_FROM_BROWSER_AS_STRING = ApexPages.currentPage().getHeaders().get('Accept-Language'); final List LANGUAGES_FROM_BROWSER_AS_LIST = splitAndFilterAcceptLanguageHeader(LANGUAGES_FROM_BROWSER_AS_STRING); if(LANGUAGES_FROM_BROWSER_AS_LIST != null && LANGUAGES_FROM_BROWSER_AS_LIST.size() > 0){ for(String languageFromBrowser : LANGUAGES_FROM_BROWSER_AS_LIST){ if(DEFAULTS.containsKey(languageFromBrowser)){ languageFromBrowser = DEFAULTS.get(languageFromBrowser); } if(SUPPORTED_LANGUAGE_CODES.contains(languageFromBrowser)){ return languageFromBrowser; } } } return null; } global static String getLangCodeByUser(){ return UserInfo.getLanguage(); } global static String getLangCodeByHttpParamOrIfNullThenBrowser(){ return StringUtils.defaultString(getLangCodeByHttpParam(),getLangCodeByBrowser()); } global static String getLangCodeByHttpParamOrIfNullThenUser(){ return StringUtils.defaultString(getLangCodeByHttpParam(),getLangCodeByUser()); } global static String getLangCodeByBrowserOrIfNullThenHttpParam(){ return StringUtils.defaultString(getLangCodeByBrowser(),getLangCodeByHttpParam()); } global static String getLangCodeByBrowserOrIfNullThenUser(){ return StringUtils.defaultString(getLangCodeByBrowser(),getLangCodeByUser()); } private static List splitAndFilterAcceptLanguageHeader(String header){ List returnList = new List(); String[] tokens = StringUtils.split(header,','); if(tokens != null){ for(String token : tokens){ if(token != null ){ if(token.contains(';')){ token = token.substring(0,token.indexOf(';',0)); } returnList.add(token); if(StringUtils.length(token) > 2){ returnList.add(StringUtils.substring(token,0,2)); } } } } return returnList; } private static Set getSuppLangCodeSet(){ Set langCodes = new Set(); for(String langCode : SUPPORTED_LANGUAGE_CODES){ if(langCode != null){ langCodes.add(StringUtils.lowerCase(langCode)); } } return langCodes; } global static String getLanguageName(String displayLanguageCode, String languageCode){ return translatedLanguageNames.get(filterLanguageCode(displayLanguageCode)).get(filterLanguageCode(languageCode)); } global static Map getAllLanguages(){ return getAllLanguages(DEFAULT_LANGUAGE_CODE); } global static Map getAllLanguages(String displayLanguageCode){ return translatedLanguageNames.get(filterLanguageCode(displayLanguageCode)); } private static String filterLanguageCode(String displayLanguageCode){ displayLanguageCode = StringUtils.lowerCase(displayLanguageCode); if(DEFAULTS.containsKey(displayLanguageCode)){ displayLanguageCode = StringUtils.replaceChars(DEFAULTS.get(displayLanguageCode),'-','_'); } if(!translatedLanguageNames.containsKey(displayLanguageCode)){ displayLanguageCode = DEFAULT_LANGUAGE_CODE; } return displayLanguageCode; } private static final Map> translatedLanguageNames = new Map>{ 'cs'=> new Map{ 'cs'=>'Čeština' ,'da'=>'Dánština' ,'de'=>'Němčina' ,'en_us'=>'Angličtina (Spojené státy)' ,'es'=>'Španělština' ,'es_mx'=>'Mexická španělština' ,'fi'=>'Finština' ,'fr'=>'Francouzština' ,'hu'=>'Maďarština' ,'in'=>'Indonéština' ,'it'=>'Italština' ,'ja'=>'Japonština' ,'ko'=>'Korejština' ,'nl_nl'=>'Nizozemština' ,'pl'=>'Polština' ,'pt_br'=>'Portugalština (Brazílie)' ,'ro'=>'Rumunština' ,'ru'=>'Ruština' ,'sv'=>'Švédština' ,'th'=>'Thajská' ,'tr'=>'Turečtina' ,'zh_cn'=>'Čínština (zjednodušená)' ,'zh_tw'=>'Čínština (tradiční)' } ,'da'=> new Map{ 'cs'=>'Tjekkisk' ,'da'=>'Dansk' ,'de'=>'Tysk' ,'en_us'=>'Engelsk (USA)' ,'es'=>'Spansk' ,'es_mx'=>'Mexicansk spansk' ,'fi'=>'Finsk' ,'fr'=>'Fransk' ,'hu'=>'Ungarsk' ,'in'=>'Indonesisk' ,'it'=>'Italiensk' ,'ja'=>'Japansk' ,'ko'=>'Koreansk' ,'nl_nl'=>'Hollandsk' ,'pl'=>'Polsk' ,'pt_br'=>'Portugisisk (Brasilien)' ,'ro'=>'Rumænsk' ,'ru'=>'Russisk' ,'sv'=>'Svensk' ,'th'=>'Thai' ,'tr'=>'Tyrkisk' ,'zh_cn'=>'Kinesisk (forenklet)' ,'zh_tw'=>'Kinesisk (traditionelt)' } ,'de'=> new Map{ 'cs'=>'Tschechisch' ,'da'=>'Dänisch' ,'de'=>'Deutsch' ,'en_us'=>'Englisch (Vereinigte Staaten)' ,'es'=>'Spanisch' ,'es_mx'=>'Mexican Spanish' ,'fi'=>'Finnisch' ,'fr'=>'Französisch' ,'hu'=>'Ungarisch' ,'in'=>'Indonesisch' ,'it'=>'Italienisch' ,'ja'=>'Japanisch' ,'ko'=>'Koreanisch' ,'nl_nl'=>'Niederländisch' ,'pl'=>'Polnisch' ,'pt_br'=>'Portugiesisch (Brasilien)' ,'ro'=>'Rumänisch' ,'ru'=>'Russisch' ,'sv'=>'Schwedisch' ,'th'=>'Thai' ,'tr'=>'Türkisch' ,'zh_cn'=>'Chinesisch (Taiwan)' ,'zh_tw'=>'Chinesisch (traditionell)' } ,'en_us'=> new Map{ 'cs'=>'Czech' ,'da'=>'Danish' ,'de'=>'German' ,'en_us'=>'English (United States)' ,'es'=>'Spanish' ,'es_mx'=>'Mexican Spanish' ,'fi'=>'Finnish' ,'fr'=>'French' ,'hu'=>'Hungarian' ,'in'=>'Indonesian' ,'it'=>'Italian' ,'ja'=>'Japanese' ,'ko'=>'Korean' ,'nl_nl'=>'Dutch' ,'pl'=>'Polish' ,'pt_br'=>'Portuguese (Brazilian)' ,'ro'=>'Romanian' ,'ru'=>'Russian' ,'sv'=>'Swedish' ,'th'=>'Thai' ,'tr'=>'Turkish' ,'zh_cn'=>'Chinese (Simplified)' ,'zh_tw'=>'Chinese (Traditional)' } ,'es'=> new Map{ 'cs'=>'Checa' ,'da'=>'Danés' ,'de'=>'Alemán' ,'en_us'=>'Inglés (Estados Unidos)' ,'es'=>'Español' ,'es_mx'=>'El español de México' ,'fi'=>'Finlandés' ,'fr'=>'Francés' ,'hu'=>'Húngaro' ,'in'=>'Indonesia' ,'it'=>'Italiano' ,'ja'=>'Japonés' ,'ko'=>'Corea' ,'nl_nl'=>'Neerlandés' ,'pl'=>'Polaco' ,'pt_br'=>'Portugués (brasileño)' ,'ro'=>'Rumano' ,'ru'=>'Rusia' ,'sv'=>'Sueco' ,'th'=>'Tailandia' ,'tr'=>'Turquía' ,'zh_cn'=>'Chino (simplificado)' ,'zh_tw'=>'Chino (tradicional)' } ,'es_mx'=> new Map{ 'cs'=>'Checa' ,'da'=>'Danés' ,'de'=>'Alemán' ,'en_us'=>'Inglés (Estados Unidos)' ,'es'=>'Español' ,'es_mx'=>'El español de México' ,'fi'=>'Finlandés' ,'fr'=>'Francés' ,'hu'=>'Húngaro' ,'in'=>'Indonesia' ,'it'=>'Italiano' ,'ja'=>'Japonés' ,'ko'=>'Corea' ,'nl_nl'=>'Neerlandés' ,'pl'=>'Polaco' ,'pt_br'=>'Portugués (brasileño)' ,'ro'=>'Rumano' ,'ru'=>'Rusia' ,'sv'=>'Sueco' ,'th'=>'Tailandia' ,'tr'=>'Turquía' ,'zh_cn'=>'Chino (simplificado)' ,'zh_tw'=>'Chino (tradicional)' } ,'fi'=> new Map{ 'cs'=>'Tšekki' ,'da'=>'Tanska' ,'de'=>'Saksa' ,'en_us'=>'Englanti (Yhdysvallat)' ,'es'=>'Espanja' ,'es_mx'=>'Meksikon espanja' ,'fi'=>'Suomen' ,'fr'=>'Ranska' ,'hu'=>'Unkari' ,'in'=>'Indonesia' ,'it'=>'Italia' ,'ja'=>'Japani' ,'ko'=>'Korea' ,'nl_nl'=>'Hollanti' ,'pl'=>'Puola' ,'pt_br'=>'Portugali (Brasilia)' ,'ro'=>'Romania' ,'ru'=>'Venäjä' ,'sv'=>'Ruotsi' ,'th'=>'Thaimaalaisen' ,'tr'=>'Turkki' ,'zh_cn'=>'Kiina (yksinkertaistettu)' ,'zh_tw'=>'Kiina (perinteinen)' } ,'fr'=> new Map{ 'cs'=>'Tchèque' ,'da'=>'Danois' ,'de'=>'Allemand' ,'en_us'=>'Anglais (Etats Unis)' ,'es'=>'Espagnol' ,'es_mx'=>'Espagnol mexicain' ,'fi'=>'Finnois' ,'fr'=>'Français' ,'hu'=>'Hongrois' ,'in'=>'Indonésien' ,'it'=>'Italien' ,'ja'=>'Japonais' ,'ko'=>'Coréen' ,'nl_nl'=>'Néerlandais' ,'pl'=>'Polonais' ,'pt_br'=>'Portugais (brésilien)' ,'ro'=>'Roumain' ,'ru'=>'Russe' ,'sv'=>'Suédois' ,'th'=>'Thai' ,'tr'=>'Turc' ,'zh_cn'=>'Chinois (simplifié)' ,'zh_tw'=>'Chinois (Traditionnel)' } ,'hu'=> new Map{ 'cs'=>'Cseh' ,'da'=>'Dán' ,'de'=>'Német' ,'en_us'=>'Angol (Egyesült Államok)' ,'es'=>'Spanyol' ,'es_mx'=>'Mexikói spanyol' ,'fi'=>'Finn' ,'fr'=>'Francia' ,'hu'=>'Magyar' ,'in'=>'Indonéz' ,'it'=>'Olasz' ,'ja'=>'Japán' ,'ko'=>'Koreai' ,'nl_nl'=>'Holland' ,'pl'=>'Lengyel' ,'pt_br'=>'Portugál (brazíliai)' ,'ro'=>'Román' ,'ru'=>'Orosz' ,'sv'=>'Svéd' ,'th'=>'Thaiföldi' ,'tr'=>'Török' ,'zh_cn'=>'Kínai (egyszerűsített)' ,'zh_tw'=>'Kínai (hagyományos)' } ,'in'=> new Map{ 'cs'=>'Ceko' ,'da'=>'Denmark' ,'de'=>'Jerman' ,'en_us'=>'Inggris (Amerika Serikat)' ,'es'=>'Spanyol' ,'es_mx'=>'Meksiko Spanyol' ,'fi'=>'Finlandia' ,'fr'=>'Prancis' ,'hu'=>'Hungaria' ,'in'=>'Indonesia' ,'it'=>'Italia' ,'ja'=>'Jepang' ,'ko'=>'Korea' ,'nl_nl'=>'Belanda' ,'pl'=>'Polish' ,'pt_br'=>'Portugis (Brasil)' ,'ro'=>'Romanian' ,'ru'=>'Russian' ,'sv'=>'Swedia' ,'th'=>'Thai' ,'tr'=>'Turkish' ,'zh_cn'=>'Cina (Sederhana)' ,'zh_tw'=>'Cina (Tradisional)' } ,'it'=> new Map{ 'cs'=>'Ceco' ,'da'=>'Danese' ,'de'=>'Tedesco' ,'en_us'=>'Inglese (Stati Uniti)' ,'es'=>'Spagnolo' ,'es_mx'=>'Spagnolo messicano' ,'fi'=>'Finlandese' ,'fr'=>'Francese' ,'hu'=>'Ungherese' ,'in'=>'Indonesiano' ,'it'=>'Italiano' ,'ja'=>'Giapponese' ,'ko'=>'Coreano' ,'nl_nl'=>'Olandese' ,'pl'=>'Polacco' ,'pt_br'=>'Portoghese (brasiliano)' ,'ro'=>'Rumeno' ,'ru'=>'Russo' ,'sv'=>'Svedese' ,'th'=>'Thai' ,'tr'=>'Turco' ,'zh_cn'=>'Cinese (semplificato)' ,'zh_tw'=>'Cinese (tradizionale)' } ,'ja'=> new Map{ 'cs'=>'チェコ語' ,'da'=>'デンマーク語' ,'de'=>'ドイツ語' ,'en_us'=>'英語(アメリカ合衆国)' ,'es'=>'スペイン語' ,'es_mx'=>'メキシコのスペイン語' ,'fi'=>'フィンランド語' ,'fr'=>'フランス語' ,'hu'=>'ハンガリー語' ,'in'=>'インドネシア語' ,'it'=>'イタリア語' ,'ja'=>'日本語' ,'ko'=>'韓国語' ,'nl_nl'=>'オランダ語' ,'pl'=>'ポーランド語' ,'pt_br'=>'ポルトガル語(ブラジル)' ,'ro'=>'ルーマニア語' ,'ru'=>'ロシア語' ,'sv'=>'スウェーデン語' ,'th'=>'タイ' ,'tr'=>'トルコ語' ,'zh_cn'=>'中国語(簡体字)' ,'zh_tw'=>'中国語(繁体字)' } ,'ko'=> new Map{ 'cs'=>'체코어' ,'da'=>'덴마크어' ,'de'=>'독일어' ,'en_us'=>'영어 (미국)' ,'es'=>'스페인어' ,'es_mx'=>'멕시코 스페인' ,'fi'=>'핀란드어' ,'fr'=>'프랑스어' ,'hu'=>'헝가리어' ,'in'=>'인도네시 아어' ,'it'=>'이탈리아어' ,'ja'=>'일본어' ,'ko'=>'한국어' ,'nl_nl'=>'네덜란드' ,'pl'=>'폴란드어' ,'pt_br'=>'포르투갈어 (브라질)' ,'ro'=>'루마니아어' ,'ru'=>'러시아어' ,'sv'=>'스웨덴어' ,'th'=>'타이어' ,'tr'=>'터키어' ,'zh_cn'=>'중국어 (간체)' ,'zh_tw'=>'중국어 (번체)' } ,'nl_nl'=> new Map{ 'cs'=>'Tsjechisch' ,'da'=>'Deens' ,'de'=>'Duits' ,'en_us'=>'Engels (Verenigde Staten)' ,'es'=>'Spaans' ,'es_mx'=>'Mexicaans Spaans' ,'fi'=>'Fins' ,'fr'=>'Frans' ,'hu'=>'Hongaars' ,'in'=>'Indonesisch' ,'it'=>'Italiaans' ,'ja'=>'Japans' ,'ko'=>'Koreaans' ,'nl_nl'=>'Nederlandse' ,'pl'=>'Pools' ,'pt_br'=>'Portugees (Braziliaans)' ,'ro'=>'Roemeens' ,'ru'=>'Russisch' ,'sv'=>'Zweeds' ,'th'=>'Thais' ,'tr'=>'Turks' ,'zh_cn'=>'Chinese (Simplified)' ,'zh_tw'=>'Chinees (traditioneel)' } ,'pl'=> new Map{ 'cs'=>'Czeski' ,'da'=>'Duński' ,'de'=>'Niemiecki' ,'en_us'=>'Angielski (Stany Zjednoczone)' ,'es'=>'Hiszpański' ,'es_mx'=>'Mexican hiszpański' ,'fi'=>'Fiński' ,'fr'=>'Francuski' ,'hu'=>'Węgierski' ,'in'=>'Indonezyjski' ,'it'=>'Włoski' ,'ja'=>'Japoński' ,'ko'=>'Koreański' ,'nl_nl'=>'Niderlandzki' ,'pl'=>'Polska' ,'pt_br'=>'Portugalski (Brazylia)' ,'ro'=>'Rumuński' ,'ru'=>'Rosyjski' ,'sv'=>'Szwedzki' ,'th'=>'Taj' ,'tr'=>'Turecki' ,'zh_cn'=>'Chiński (uproszczony)' ,'zh_tw'=>'Chiński (tradycyjny)' } ,'pt_br'=> new Map{ 'cs'=>'Tcheco' ,'da'=>'Dinamarquês' ,'de'=>'Alemão' ,'en_us'=>'Inglês (Estados Unidos)' ,'es'=>'Espanhol' ,'es_mx'=>'Espanhol mexicano' ,'fi'=>'Finlandês' ,'fr'=>'Francês' ,'hu'=>'Húngaro' ,'in'=>'Indonésio' ,'it'=>'Italiano' ,'ja'=>'Japonês' ,'ko'=>'Coreano' ,'nl_nl'=>'Holandês' ,'pl'=>'Polonês' ,'pt_br'=>'Português (Brasil)' ,'ro'=>'Romeno' ,'ru'=>'Russo' ,'sv'=>'Sueco' ,'th'=>'Tailandês' ,'tr'=>'Turco' ,'zh_cn'=>'Chinês (simplificado)' ,'zh_tw'=>'Chinês (Tradicional)' } ,'ro'=> new Map{ 'cs'=>'Cehă' ,'da'=>'Daneză' ,'de'=>'Germană' ,'en_us'=>'În limba engleză (Statele Unite)' ,'es'=>'Spaniolă' ,'es_mx'=>'Mexicane Spanish' ,'fi'=>'Finlandeză' ,'fr'=>'Franţuzesc' ,'hu'=>'Maghiară' ,'in'=>'Indoneziană' ,'it'=>'Italiană' ,'ja'=>'Japoneză' ,'ko'=>'Coreeană' ,'nl_nl'=>'Olandeză' ,'pl'=>'Poloneză' ,'pt_br'=>'Portuguese (Brazilian)' ,'ro'=>'Român' ,'ru'=>'Rus' ,'sv'=>'Suedez' ,'th'=>'Thai' ,'tr'=>'Turcă' ,'zh_cn'=>'Chineză (simplificată)' ,'zh_tw'=>'Chineză (Tradiţională)' } ,'ru'=> new Map{ 'cs'=>'Чешский' ,'da'=>'Датский' ,'de'=>'Немецкий' ,'en_us'=>'Английский (США)' ,'es'=>'Испанский' ,'es_mx'=>'Мексиканские Испанский' ,'fi'=>'Финский' ,'fr'=>'Французский' ,'hu'=>'Венгерский' ,'in'=>'Индонезийский' ,'it'=>'Итальянский' ,'ja'=>'Японский' ,'ko'=>'Корейский' ,'nl_nl'=>'Голландский' ,'pl'=>'Польский' ,'pt_br'=>'Португальский (бразильский)' ,'ro'=>'Румынский' ,'ru'=>'Русский' ,'sv'=>'Шведский' ,'th'=>'Тайский' ,'tr'=>'Турецкий' ,'zh_cn'=>'Китайский (упрощенный)' ,'zh_tw'=>'Китайский (традиционный)' } ,'sv'=> new Map{ 'cs'=>'Tjeckiska' ,'da'=>'Danska' ,'de'=>'Tyska' ,'en_us'=>'Engelska (USA)' ,'es'=>'Spanska' ,'es_mx'=>'Mexikansk spanska' ,'fi'=>'Finska' ,'fr'=>'Franska' ,'hu'=>'Ungerska' ,'in'=>'Indonesiska' ,'it'=>'Italienska' ,'ja'=>'Japanska' ,'ko'=>'Koreanska' ,'nl_nl'=>'Nederländska' ,'pl'=>'Polska' ,'pt_br'=>'Portugisiska (Brasilien)' ,'ro'=>'Rumänska' ,'ru'=>'Ryska' ,'sv'=>'Svenska' ,'th'=>'Thai' ,'tr'=>'Turkiska' ,'zh_cn'=>'Kinesiska (förenklad)' ,'zh_tw'=>'Kinesiska (traditionell)' } ,'th'=> new Map{ 'cs'=>'สาธารณรัฐ เช็ ก' ,'da'=>'เดนมาร์ก' ,'de'=>'เยอรมัน' ,'en_us'=>'ภาษา อังกฤษ States (United)' ,'es'=>'สเปน' ,'es_mx'=>'สเปน เม็ก ซิ กัน' ,'fi'=>'ฟินแลนด์' ,'fr'=>'ฝรั่งเศส' ,'hu'=>'ฮังการี' ,'in'=>'อินโดนีเซีย' ,'it'=>'อิตาเลียน' ,'ja'=>'ญี่ปุ่น' ,'ko'=>'เกาหลี' ,'nl_nl'=>'ดัตช์' ,'pl'=>'เงา' ,'pt_br'=>'โปรตุเกส (บราซิล)' ,'ro'=>'โรมาเนีย' ,'ru'=>'ภาษา รัสเซีย' ,'sv'=>'สวีเดน' ,'th'=>'ไทย' ,'tr'=>'ภาษา ตุรกี' ,'zh_cn'=>'จีน (ประยุกต์)' ,'zh_tw'=>'ภาษา จีน (ดั้งเดิม)' } ,'tr'=> new Map{ 'cs'=>'Çekçe' ,'da'=>'Danca' ,'de'=>'Almanca' ,'en_us'=>'İngilizce (ABD)' ,'es'=>'İspanyolca' ,'es_mx'=>'Mexican İspanyolca' ,'fi'=>'Fince' ,'fr'=>'Fransızca' ,'hu'=>'Macarca' ,'in'=>'Endonezya Dili' ,'it'=>'İtalyanca' ,'ja'=>'Japonca' ,'ko'=>'Korece' ,'nl_nl'=>'Hollanda Dili' ,'pl'=>'Lehçe' ,'pt_br'=>'Portekizce (Brezilya)' ,'ro'=>'Romence' ,'ru'=>'Rusça' ,'sv'=>'İsveççe' ,'th'=>'Tay' ,'tr'=>'Türkçe' ,'zh_cn'=>'Çince (Basitleştirilmiş)' ,'zh_tw'=>'Çince (Geleneksel)' } ,'zh_cn'=> new Map{ 'cs'=>'捷克文' ,'da'=>'丹麦文' ,'de'=>'德语' ,'en_us'=>'英语(美国)' ,'es'=>'西班牙语' ,'es_mx'=>'墨西哥西班牙语' ,'fi'=>'芬兰文' ,'fr'=>'法语' ,'hu'=>'匈牙利文' ,'in'=>'印度尼西亚文' ,'it'=>'意大利语' ,'ja'=>'日语' ,'ko'=>'韩文' ,'nl_nl'=>'荷兰文' ,'pl'=>'波兰文' ,'pt_br'=>'葡萄牙语(巴西)' ,'ro'=>'罗马尼亚文' ,'ru'=>'俄文' ,'sv'=>'瑞典文' ,'th'=>'泰国' ,'tr'=>'土耳其文' ,'zh_cn'=>'中文(简体)' ,'zh_tw'=>'中文(繁体)' } ,'zh_tw'=> new Map{ 'cs'=>'捷克文' ,'da'=>'丹麥文' ,'de'=>'德語' ,'en_us'=>'英語(美國)' ,'es'=>'西班牙語' ,'es_mx'=>'墨西哥西班牙語' ,'fi'=>'芬蘭文' ,'fr'=>'法語' ,'hu'=>'匈牙利文' ,'in'=>'印度尼西亞文' ,'it'=>'意大利語' ,'ja'=>'日語' ,'ko'=>'韓文' ,'nl_nl'=>'荷蘭文' ,'pl'=>'波蘭文' ,'pt_br'=>'葡萄牙語(巴西)' ,'ro'=>'羅馬尼亞文' ,'ru'=>'俄文' ,'sv'=>'瑞典文' ,'th'=>'泰國' ,'tr'=>'土耳其文' ,'zh_cn'=>'中文(簡體)' ,'zh_tw'=>'中文(繁體)' } }; } ================================================ FILE: samples/Apex/LogTriggerHandler.trigger ================================================ /** * @description Trigger handler for persisting Platform Event based * log messages. * * @group Trigger Recipes * @see Log */ public with sharing class LogTriggerHandler extends TriggerHandler { List incomingRecords = new List(); /** * @description constructor accepting a list of log__e records */ public LogTriggerHandler() { this.incomingRecords = (List) Trigger.new; } /** * @description code to be executed in the afterInsert context */ override public void afterInsert() { List events = new List(); for (Log__e event : this.incomingRecords) { events.add( new LogEvent__c( Log_Data__c = event.Log_Message__c, Quiddity__c = event.Quiddity__c, Request_Id__c = event.Request_Id__c, Severity__c = event.Severity__c ) ); } List res = Database.insert(events, false); for (Database.SaveResult saveRes : res) { if (!saveRes.isSuccess()) { System.debug( LoggingLevel.ERROR, 'Failed to save log message: ' + saveRes ); } } } } ================================================ FILE: samples/Apex/SoqlUtils.apex ================================================ /* ============================================================ * This code is part of the "apex-lang" open source project avaiable at: * * http://code.google.com/p/apex-lang/ * * This code is licensed under the Apache License, Version 2.0. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * ============================================================ */ global class SoqlUtils { global static String toLiteral(final Object value){ return toLiteral(value,null); } global static String toLiteral(final Object value, SoqlOptions options){ if(options == null){ options = SoqlOptions.DEFAULT_OPTIONS; } String literal = ''; if( value == null){ literal += 'null'; } else if( value instanceof Soqlable ){ return ((Soqlable)value).toSoql(options); } else if( value instanceof String || value instanceOf ID){ String manipulated = (String) value; if(options.escapeSingleQuotes == true){ manipulated = String.escapeSingleQuotes(manipulated); } literal += '\'' + manipulated + '\''; } else if( value instanceOf Boolean || value instanceOf Integer || value instanceOf Long || value instanceOf Double || value instanceOf Decimal){ literal += value; } else if( value instanceOf Date){ literal += Datetime.newInstance(((Date)value).year(), ((Date)value).month(), ((Date)value).day()).format('yyyy-MM-dd'); } else if( value instanceOf Datetime){ literal += ((Datetime) value).format('yyyy-MM-dd') + 'T' + ((Datetime) value).format('hh:mm:ss') + 'Z'; } else { throw new IllegalArgumentException('invalid value; value must be null, a primitive type ' + '(String|ID|Boolean|Integer|Long|Double|Decimal|Date|Datetime), or implement Soqlable interface'); } return literal; } global static List toLiteral(final List values){ return toLiteral(values,SoqlOptions.DEFAULT_OPTIONS); } global static List toLiteral(final List values, final SoqlOptions options){ final List literals = new List(); if(values != null && values.size() > 0){ for(Object obj : values){ literals.add(toLiteral(obj,options)); } } return literals; } global static void assertEquals(String expected, String actual){ System.assert( equals(expected,actual), 'Assertion failed, the following two SOQLs are not equal. Expected: ' + expected + ', Actual: ' + actual); } /** * This equals is fairly simplistic. It will account for unordered columns, * lower vs upper case (SELECT vs select) but it won't take into account anything else. Different * order of where conditions for example. */ global static Boolean equals(String soql1, String soql2){ if( soql1.contains('\n') != soql2.contains('\n') ){ return false; } soql1 = StringUtils.replace(StringUtils.trim(StringUtils.lowerCase(soql1)), '\n', ''); soql2 = StringUtils.replace(StringUtils.trim(StringUtils.lowerCase(soql2)), '\n', ''); if(StringUtils.equals(soql1,soql2)){ return true; } if(!StringUtils.startsWith(soql1, 'select') || !StringUtils.startsWith(soql2, 'select')){ return false; } String afterSelect1 = StringUtils.trim(StringUtils.substringAfter(soql1,'select')); String afterSelect2 = StringUtils.trim(StringUtils.substringAfter(soql2,'select')); Set columns1 = StringUtils.trimAll(SetUtils.listToSet(StringUtils.split(StringUtils.trim(StringUtils.substringBeforeLast(afterSelect1,' from ')),','))); Set columns2 = StringUtils.trimAll(SetUtils.listToSet(StringUtils.split(StringUtils.trim(StringUtils.substringBeforeLast(afterSelect2,' from ')),','))); if(!SetUtils.equals(columns1,columns2)){ return false; } String afterFrom1 = StringUtils.trim(StringUtils.substringAfterLast(soql1,' from ')); String afterFrom2 = StringUtils.trim(StringUtils.substringAfterLast(soql2,' from ')); return StringUtils.equals(afterFrom1,afterFrom2); } } ================================================ FILE: samples/Apex/TwilioAPI.cls ================================================ /* Copyright (c) 2012 Twilio, Inc. Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /** * Entry point for accessing Twilio resources that are pre-configured * with credentials from the Twilio Config custom setting (TwilioConfig__c). * * To set up your Twilio credentials: * 1. Get a Twilio account at http://www.twilio.com/try-twilio * 2. Find your Twilio Account Sid and Auth Token at https://www.twilio.com/user/account * 3. Log into Salesforce and go to: Setup | Develop | Custom Settings | Manage Twilio Config * 4. Create a new Twilo Config instance * 5. Copy and paste your Account Sid and Auth Token and click Save * * NOTE: The Application Sid field is for use with the Twilio Client softphone * SDK for Javascript. It is not required for the rest of the Twilio API. * * Now you can get easy access to Twilio from your Apex code by calling: * * TwilioRestClient restClient = TwilioAPI.getDefaultClient(); * restClient.getAccount().getCalls(); * // etc. */ global class TwilioAPI { private class MissingTwilioConfigCustomSettingsException extends Exception {} private static TwilioRestClient client; private TwilioAPI() {} /** * Get a TwilioRestClient pre-populated with your TwilioConfig credentials */ public static TwilioRestClient getDefaultClient() { if (client==null) { TwilioConfig__c twilioCfg = getTwilioConfig(); TwilioAPI.client = new TwilioRestClient(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c); } return TwilioAPI.client; } /** * Get your primary account using your TwilioConfig credentials */ public static TwilioAccount getDefaultAccount() { return getDefaultClient().getAccount(); } /** * Get a new Twilio Client capability token generator pre-populated * with your TwilioConfig credentials */ public static TwilioCapability createCapability() { TwilioConfig__c twilioCfg = getTwilioConfig(); return new TwilioCapability(twilioCfg.AccountSid__c, twilioCfg.AuthToken__c); } /** * Get a new TwilioRestClient authorized with the credentials provided */ public static TwilioRestClient createClient(String accountSid, String authToken) { return new TwilioRestClient(accountSid, authToken); } /** * Load the org default TwilioConfig record */ public static TwilioConfig__c getTwilioConfig() { TwilioConfig__c twilioCfg; if (Test.isRunningTest()) { twilioCfg = new TwilioConfig__c(); twilioCfg.AccountSid__c = 'ACba8bc05eacf94afdae398e642c9cc32d'; // dummy sid twilioCfg.AuthToken__c = '12345678901234567890123456789012'; // dummy token } else { twilioCfg = TwilioConfig__c.getOrgDefaults(); if (twilioCfg==null) throw new MissingTwilioConfigCustomSettingsException('Please enter your Twilio account credentials under Twilio Config custom settings (go to Setup | Develop | Custom Settings | Manage Twilio Config)'); } return twilioCfg; } @isTest static void test_TwilioAPI() { System.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getTwilioConfig().AccountSid__c); System.assertEquals('12345678901234567890123456789012', TwilioAPI.getTwilioConfig().AuthToken__c); System.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultClient().getAccountSid()); System.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultClient().getAccount().getSid()); System.assertEquals('ACba8bc05eacf94afdae398e642c9cc32d', TwilioAPI.getDefaultAccount().getSid()); } } ================================================ FILE: samples/Apex/UrlUtils.apex ================================================ /* ============================================================ * This code is part of the "apex-lang" open source project avaiable at: * * http://code.google.com/p/apex-lang/ * * This code is licensed under the Apache License, Version 2.0. You may obtain a * copy of the License at: * * http://www.apache.org/licenses/LICENSE-2.0 * ============================================================ */ global class UrlUtils { global static String getBase(String url){ String[] split = StringUtils.split(url, '?'); if(split == null || split.size() == 0){ return null; } return split[0]; } global static Map getParams(String url){ //url -> http://google.com?api=x&xyz=123 Map returnMap = new Map(); String[] split = StringUtils.split(url, '?'); //split -> ['http://google.com','api=x&xyz=123'] if(split == null || split.size() != 2 || split[1] == null){ return returnMap; } split = StringUtils.split(split[1],'&'); //split -> ['api=x','xyz=123'] if(split != null && split.size() > 0){ String[] split2 = null; for(String keyValuePair : split){ //keyValuePair -> 'api=x' split2 = StringUtils.split(keyValuePair,'='); String key = ''; if(split2 != null && split2.size() > 0) key = split2[0]; String value = ''; if(split2 != null && split2.size() > 1) value = split2[1]; returnMap.put(key,EncodingUtil.urlDecode(value, 'UTF-8')); } } return returnMap; } global static String ensureUrlBeginsWithHttp(String url){ if(StringUtils.isNotEmpty(url)){ final String lowerCaseUrl = StringUtils.lowerCase(url); if( !StringUtils.startsWith(lowerCaseUrl, 'http://') && !StringUtils.startsWith(lowerCaseUrl, 'https://')){ if(StringUtils.contains(lowerCaseUrl, '//')) url = StringUtils.substringAfter(url, '//'); url = 'http://'+ StringUtils.stripStart(url,'/:'); } } return url; } } ================================================ FILE: samples/Apollo Guidance Computer/BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc ================================================ # Copyright: Public domain. # Filename: BURN_BABY_BURN--MASTER_IGNITION_ROUTINE.agc # Purpose: Part of the source code for Luminary 1A build 099. # It is part of the source code for the Lunar Module's (LM) # Apollo Guidance Computer (AGC), for Apollo 11. # Assembler: yaYUL # Contact: Ron Burkey . # Website: www.ibiblio.org/apollo. # Pages: 731-751 # Mod history: 2009-05-19 RSB Adapted from the corresponding # Luminary131 file, using page # images from Luminary 1A. # 2009-06-07 RSB Corrected 3 typos. # 2009-07-23 RSB Added Onno's notes on the naming # of this function, which he got from # Don Eyles. # # This source code has been transcribed or otherwise adapted from # digitized images of a hardcopy from the MIT Museum. The digitization # was performed by Paul Fjeld, and arranged for by Deborah Douglas of # the Museum. Many thanks to both. The images (with suitable reduction # in storage size and consequent reduction in image quality as well) are # available online at www.ibiblio.org/apollo. If for some reason you # find that the images are illegible, contact me at info@sandroid.org # about getting access to the (much) higher-quality images which Paul # actually created. # # Notations on the hardcopy document read, in part: # # Assemble revision 001 of AGC program LMY99 by NASA 2021112-61 # 16:27 JULY 14, 1969 # Page 731 ## At the get-together of the AGC developers celebrating the 40th anniversary ## of the first moonwalk, Don Eyles (one of the authors of this routine along ## with Peter Adler) has related to us a little interesting history behind the ## naming of the routine.
##
## It traces back to 1965 and the Los Angeles riots, and was inspired ## by disc jockey extraordinaire and radio station owner Magnificent Montague. ## Magnificent Montague used the phrase "Burn, baby! BURN!" when spinning the ## hottest new records. Magnificent Montague was the charismatic voice of ## soul music in Chicago, New York, and Los Angeles from the mid-1950s to ## the mid-1960s. # BURN, BABY, BURN -- MASTER IGNITION ROUTINE BANK 36 SETLOC P40S BANK EBANK= WHICH COUNT* $$/P40 # THE MASTER IGNITION ROUTINE IS DESIGNED FOR USE BY THE FOLLOWING LEM PROGRAMS: P12, P40, P42, P61, P63. # IT PERFORMS ALL FUNCTIONS IMMEDIATELY ASSOCIATED WITH APS OR DPS IGNITION: IN PARTICULAR, EVERYTHING LYING # BETWEEN THE PRE-IGNITION TIME CHECK -- ARE WE WITHIN 45 SECONDS OF TIG? -- AND TIG + 26 SECONDS, WHEN DPS # PROGRAMS THROTTLE UP. # # VARIATIONS AMONG PROGRAMS ARE ACCOMODATED BY MEANS OF TABLES CONTAINING CONSTANTS (FOR AVEGEXIT, FOR # WAITLIST, FOR PINBALL) AND TCF INSTRUCTIONS. USERS PLACE THE ADRES OF THE HEAD OF THE APPROPRIATE TABLE # (OF P61TABLE FOR P61LM, FOR EXAMPLE) IN ERASABLE REGISTER `WHICH' (E4). THE IGNITION ROUTINE THEN INDEXES BY # WHICH TO OBTAIN OR EXECUTE THE PROPER TABLE ENTRY. THE IGNITION ROUTINE IS INITIATED BY A TCF BURNBABY, # THROUGH BANKJUMP IF NECESSARY. THERE IS NO RETURN. # # THE MASTER IGNITION ROUTINE WAS CONCEIVED AND EXECUTED, AND (NOTA BENE) IS MAINTAINED BY ADLER AND EYLES. # # HONI SOIT QUI MAL Y PENSE # # *********************************************** # TABLES FOR THE IGNITION ROUTINE # *********************************************** # # NOLI SE TANGERE P12TABLE VN 0674 # (0) TCF ULLGNOT # (1) TCF COMFAIL3 # (2) TCF GOCUTOFF # (3) TCF TASKOVER # (4) TCF P12SPOT # (5) DEC 0 # (6) NO ULLAGE EBANK= WHICH 2CADR SERVEXIT # (7) TCF DISPCHNG # (11) TCF WAITABIT # (12) TCF P12IGN # (13) P40TABLE VN 0640 # (0) TCF ULLGNOT # (1) TCF COMFAIL4 # (2) TCF GOPOST # (3) TCF TASKOVER # (4) TCF P40SPOT # (5) # Page 732 DEC 2240 # (6) EBANK= OMEGAQ 2CADR STEERING # (7) TCF P40SJUNK # (11) TCF WAITABIT # (12) TCF P40IGN # (13) TCF REP40ALM # (14) P41TABLE TCF P41SPOT # (5) DEC -1 # (6) EBANK= OMEGAQ 2CADR CALCN85 # (7) TCF COMMON # (11) TCF TIGTASK # (12) P42TABLE VN 0640 # (0) TCF WANTAPS # (1) TCF COMFAIL4 # (2) TCF GOPOST # (3) TCF TASKOVER # (4) TCF P42SPOT # (5) DEC 2640 # (6) EBANK= OMEGAQ 2CADR STEERING # (7) TCF P40SJUNK # (11) TCF WAITABIT # (12) TCF P42IGN # (13) TCF P42STAGE # (14) P63TABLE VN 0662 # (0) TCF ULLGNOT # (1) TCF COMFAIL3 # (2) TCF V99RECYC # (3) TCF TASKOVER # (4) TCF P63SPOT # (5) DEC 2240 # (6) EBANK= WHICH 2CADR SERVEXIT # (7) TCF DISPCHNG # (11) TCF WAITABIT # (12) # Page 733 TCF P63IGN # (13) ABRTABLE VN 0663 # (0) TCF ULLGNOT # (1) TCF COMFAIL3 # (2) TCF GOCUTOFF # (3) TCF TASKOVER # (4) NOOP # (5) NOOP # (6) NOOP # (7) NOOP TCF DISPCHNG # (11) TCF WAITABIT # (12) TCF ABRTIGN # (13) # ********************************* # GENERAL PURPOSE IGNITION ROUTINES # ********************************* BURNBABY TC PHASCHNG # GROUP 4 RESTARTS HERE OCT 04024 CAF ZERO # EXTIRPATE JUNK LEFT IN DVTOTAL TS DVTOTAL TS DVTOTAL +1 TC BANKCALL # P40AUTO MUST BE BANKCALLED EVEN FROM ITS CADR P40AUTO # OWN BANK TO SET UP RETURN PROPERLY B*RNB*B* EXTEND DCA TIG # STORE NOMINAL TIG FOR OBLATENESS COMP. DXCH GOBLTIME # AND FOR P70 OR P71. INHINT TC IBNKCALL CADR ENGINOF3 RELINT INDEX WHICH TCF 5 P42SPOT = P40SPOT # (5) P12SPOT = P40SPOT # (5) P63SPOT = P41SPOT # (5) IN P63 CLOKTASK ALREADY GOING P40SPOT CS CNTDNDEX # (5) # Page 734 TC BANKCALL # MUST BE BANKCALLED FOR GENERALIZED CADR STCLOK2 # RETURN P41SPOT TC INTPRET # (5) DLOAD DSU TIG D29.9SEC STCALL TDEC1 INITCDUW BOFF CALL MUNFLAG GOMIDAV CSMPREC VLOAD MXV VATT1 REFSMMAT VSR1 STOVL V(CSM) # CSM VELOCITY -- M/CS*2(7) RATT1 VSL4 MXV REFSMMAT STCALL R(CSM) # CSM POSITION -- M*2(24) MUNGRAV STODL G(CSM) # CSM GRAVITY VEC. -- M/CS*2(7) TAT STORE TDEC1 # RELOAD TDEC1 FOR MIDTOAV. GOMIDAV CALRB MIDTOAV1 TCF CALLT-35 # MADE IT IN TIME. EXTEND # TIG WAS SLIPPED, SO RESET TIG TO 29.9 DCA PIPTIME1 # SECONDS AFTER THE TIME TO WHICH WE DID DXCH TIG # INTEGRATE. EXTEND DCA D29.9SEC DAS TIG CALLT-35 DXCH MPAC DXCH SAVET-30 # DELTA-T UNTIL TIG-30 EXTEND DCS 5SECDP DAS SAVET-30 # DELTA-T UNTIL TIG-35 EXTEND DCA SAVET-30 TC LONGCALL EBANK= TTOGO 2CADR TIG-35 TC PHASCHNG OCT 20254 # 4.25SPOT FOR TIG-35 RESTART. # Page 735 TC CHECKMM DEC 63 TCF ENDOFJOB # NOT P63 CS CNTDNDEX # P63 CAN START DISPLAYING NOW. TS DISPDEX TC INTPRET VLOAD ABVAL VN1 STORE ABVEL # INITIALIZE ABVEL FOR P63 DISPLAY EXIT TCF ENDOFJOB # ******************************** TIG-35 CAF 5SEC TC TWIDDLE ADRES TIG-30 TC PHASCHNG OCT 40154 # 4.15SPOT FOR TIG-30 RESTART CS BLANKDEX # BLANK DSKY FOR 5 SECONDS TS DISPDEX INDEX WHICH CS 6 # CHECK ULLAGE TIME. EXTEND BZMF TASKOVER CAF 4.9SEC # SET UP TASK TO RESTORE DISPLAY AT TIG-30 TC TWIDDLE ADRES TIG-30.1 CAF PRIO17 # A NEGATIVE ULLAGE TIME INDICATES P41, IN TC NOVAC # WHICH CASE WE HAVE TO SET UP A JOB TO EBANK= TTOGO # BLANK THE DSKY FOR FIVE SECONDS, SINCE 2CADR P41BLANK # CLOKJOB IS NOT RUNNING DURING P41. TCF TASKOVER P41BLANK TC BANKCALL # BLANK DSKY. CADR CLEANDSP TCF ENDOFJOB TIG-30.1 CAF PRIO17 # SET UP JOB TO RESTORE DISPLAY AT TIG-30 TC NOVAC EBANK= TTOGO 2CADR TIG-30A TCF TASKOVER # Page 736 TIG-30A CAF V16N85B TC BANKCALL # RESTORE DISPLAY. CADR REGODSP # REGODSP DOES A TCF ENDOFJOB # ******************************** TIG-30 CAF S24.9SEC TC TWIDDLE ADRES TIG-5 CS CNTDNDEX # START UP CLOKTASK AGAIN TS DISPDEX INDEX WHICH # PICK UP APPROPRIATE ULLAGE -- ON TIME CA 6 # Was CAF --- RSB 2009. EXTEND BZMF ULLGNOT # DON'T SET UP ULLAGE IF DT IS NEG OR ZERO TS SAVET-30 # SAVE DELTA-T FOR RESTART TC TWIDDLE ADRES ULLGTASK CA THREE # RESTART PROTECT ULLGTASK (1.3SPOT) TS L CS THREE DXCH -PHASE1 CS TIME1 TS TBASE1 INDEX WHICH TCF 1 WANTAPS CS FLGWRD10 # (1) FOR P42 ENSURE APSFLAG IS SET. IF IT MASK APSFLBIT # WASN'T SET, DAP WILL BE INITIALIZED TO ADS FLGWRD10 # ASCENT VALUES BY 1/ACCS IN 2 SECONDS. ULLGNOT EXTEND # (1) INDEX WHICH DCA 7 # LOAD AVEGEXIT WITH APPROPRIATE 2CADR DXCH AVEGEXIT CAF TWO # 4.2SPOT RESTARTS IMMEDIATELY AT REDO4.2 TS L CS TWO # AND ALSO AT TIG-5 AT THE CORRECT TIME. DXCH -PHASE4 CS TIME1 TS TBASE4 # SET TBASE4 FOR TIG-5 RESTART REDO2.17 EXTEND # Page 737 DCA NEG0 # CLEAR OUT GROUP 2 SO LAMBERT CAN START DXCH -PHASE2 # IF NEEDED. REDO4.2 CCS PHASE5 # IF SERVICER GOING? TCF TASKOVER # YES, DON'T START IT UP AGAIN. TC POSTJUMP CADR PREREAD # PREREAD END THIS TASK # ********************************* ULLGTASK TC ONULLAGE # THIS COMES AT TIG-7.5 OR TIG-3.5 TC PHASCHNG OCT 1 TCF TASKOVER # ********************************* TIG-5 EXTEND DCA NEG0 # INSURE THAT GROUP 3 IS INACTIVE. DXCH -PHASE3 CAF 5SEC TC TWIDDLE ADRES TIG-0 TC DOWNFLAG # RESET IGNFLAG AND ASINFLAG ADRES IGNFLAG # FOR LIGHT-UP LOGIC. TC DOWNFLAG ADRES ASTNFLAG INDEX WHICH TCF 11 P40SJUNK CCS PHASE3 # (11) P40 AND P42. S40.13 IN PROGRESS? TCF DISPCHNG # YES CAF PRIO20 TC FINDVAC EBANK= TTOGO 2CADR S40.13 TC PHASCHNG # 3.5SPOT FOR S40.13 OCT 00053 DISPCHNG CS VB99DEX # (11) TS DISPDEX # Page 738 COMMON TC PHASCHNG # RESTART TIG-0 (4.7SPOT) OCT 40074 TCF TASKOVER # ********************************* TIG-0 CS FLAGWRD7 # SET IGNFLAG SINCE TIG HAS ARRIVED MASK IGNFLBIT ADS FLAGWRD7 TC CHECKMM # IN P63 CASE, THROTTLE-UP IS ZOOMTIME DEC 63 # AFTER NOMINAL IGNITION, NOT ACTUAL TCF IGNYET? CA ZOOMTIME TC WAITLIST EBANK= DVCNTR 2CADR P63ZOOM TC 2PHSCHNG OCT 40033 OCT 05014 OCT 77777 IGNYET? CAF ASTNBIT # CHECK ASTNFLAG: HAS ASTRONAUT RESPONDED MASK FLAGWRD7 # TO OUR ENGINE ENABLE REQUEST? EXTEND INDEX WHICH BZF 12 # BRANCH IF HE HAS NOT RESPONDED YET IGNITION CS FLAGWRD5 # INSURE ENGONFLG IS SET. MASK ENGONBIT ADS FLAGWRD5 CS PRIO30 # TURN ON THE ENGINE. EXTEND RAND DSALMOUT AD BIT13 EXTEND WRITE DSALMOUT EXTEND # SET TEVENT FOR DOWNLINK DCA TIME2 DXCH TEVENT EXTEND # UPDATE TIG USING TGO FROM S40.13 DCA TGO DXCH TIG EXTEND DCA TIME2 DAS TIG # Page 739 CS FLUNDBIT # PERMIT GUIDANCE LOOP DISPLAYS MASK FLAGWRD8 TS FLAGWRD8 INDEX WHICH TCF 13 P63IGN EXTEND # (13) INITIATE BURN DISPLAYS DCA DSP2CADR DXCH AVGEXIT CA Z # ASSASSINATE CLOKTASK TS DISPDEX CS FLAGWRD9 # SET FLAG FOR P70-P71 MASK LETABBIT ADS FLAGWRD9 CS FLAGWRD7 # SET SWANDISP TO ENABLE R10. MASK SWANDBIT ADS FLAGWRD7 CS PULSES # MAKE SURE DAP IS NOT IN MINIMUM-IMPULSE MASK DAPBOOLS # MODE, IN CASE OF SWITCH TO P66 TS DAPBOOLS EXTEND # INITIALIZE TIG FOR P70 AND P71. DCA TIME2 DXCH TIG CAF ZERO # INITIALIZE WCHPHASE, AND FLPASS0 TS WCHPHASE TS WCHPHOLD # ALSO WHCPHOLD CA TWO TS FLPASS0 TCF P42IGN P40IGN CS FLAGWRD5 # (13) MASK NOTHRBIT EXTEND BZF P42IGN CA ZOOMTIME TC WAITLIST EBANK= DVCNTR 2CADR P40ZOOM P63IGN1 TC 2PHSCHNG OCT 40033 # 3.3SPOT FOR ZOOM RESTART. OCT 05014 # TYPE C RESTARTS HERE IMMEDIATELY OCT 77777 # Page 740 TCF P42IGN P12IGN CAF EBANK6 TS EBANK EBANK= AOSQ CA IGNAOSQ # INITIALIZE DAP BIAS ACCELERATION TS AOSQ # ESTIMATES AT P12 IGNITION. CA IGNAOSR TS AOSR CAF EBANK7 TS EBANK EBANK= DVCNTR ABRTIGN CA Z # (13) KILL CLOKTASK TS DISPDEX EXTEND # CONNECT ASCENT GYIDANCE TO SERVICER. DCA ATMAGADR DXCH AVGEXIT CS FLAGWRD7 # ENABLE R10. MASK SWANDBIT ADS FLAGWRD7 P42IGN CS DRIFTBIT # ENSURE THAT POWERED-FLIGHT SWITCHING MASK DAPBOOLS # CURVES ARE USED. TS DAPBOOLS CAF IMPULBIT # EXAMINE IMPULSE SWITCH MASK FLAGWRD2 CCS A TCF IMPLBURN DVMONCON TC DOWNFLAG ADRES IGNFLAG # CONNECT DVMON TC DOWNFLAG ADRES ASTNFLAG TC DOWNFLAG ADRES IDLEFLAG TC PHASCHNG OCT 40054 TC FIXDELAY # TURN ULLAGE OFF HALF A SECOND AFTER DEC 50 # LIGHT UP. ULLAGOFF TC NOULLAGE WAITABIT EXTEND # KILL GROUP 4 DCA NEG0 # Page 741 DXCH -PHASE4 TCF TASKOVER TIGTASK TC POSTJUMP # (12) CADR TIGTASK1 # ******************************** BANK 31 SETLOC P40S3 BANK COUNT* $$/P40 TIGTASK1 CAF PRIO16 TC NOVAC EBANK= TRKMKCNT 2CADR TIGNOW TC PHASCHNG OCT 6 # KILL GROUP 6 TCF TASKOVER # ******************************** P63ZOOM EXTEND DCA LUNLANAD DXCH AVEGEXIT TC IBNKCALL CADR FLATOUT TCF P40ZOOMA P40ZOOM CAF BIT13 TS THRUST CAF BIT4 EXTEND WOR CHAN14 P40ZOOMA TC PHASCHNG OCT 3 TCF TASKOVER EBANK= DVCNTR LUNLANAD 2CADR LUNLAND # Page 742 ZOOM = P40ZOOMA BANK 36 SETLOC P40S BANK COUNT* $$/P40 # ******************************** COMFAIL TC UPFLAG # (15) ADRES IDLEFLAG TC UPFLAG # SET FLAG TO SUPRESS CONFLICTING DISPLAY ADRES FLUNDISP CAF FOUR # RESET DVMON TS DVCNTR CCS PHASE6 # CLOCKTASK ACTIVE? TCF +3 # YES TC BANKCALL # OTHERWISE, START IT UP CADR STCLOK1 +3 CS VB97DEX TS DISPDEX TC PHASCHNG # TURN OFF GROUP 4. OCT 00004 TCF ENDOFJOB COMFAIL1 INDEX WHICH TCF 2 COMFAIL3 CA Z # (15) KILL CLOKTASK USING Z TCF +2 COMFAIL4 CS CNTDNDEX TS DISPDEX TC DOWNFLAG # RECONNECT DV MONITOR ADRES IDLEFLAG TC DOWNFLAG # PERMIT GUIDANCE LOOP DISPLAYS ADRES FLUNDISP TCF ENDOFJOB COMFAIL2 TC PHASCHNG # KILL ZOOM RESTART PROTECTION OCT 00003 INHINT TC KILLTASK # KILL ZOOM IN CASE IT'S STILL TO COME CADR ZOOM TC IBNKCALL # COMMAND ENGINE OFF CADR ENGINOF4 TC UPFLAG # SET THE DRIFT BIT FOR THE DAP. ADRES DRIFTDFL # Page 743 TC INVFLAG # USE OTHER RCS SYSTEM ADRES AORBTFLG TC UPFLAG # TURN ON ULLAGE ADRES ULLAGFLG CAF BIT1 INHINT TC TWIDDLE ADRES TIG-5 TCF ENDOFJOB # *********************************** # SUBROUTINES OF THE IGNITION ROUTINE # *********************************** INVFLAG CA Q TC DEBIT COM EXTEND RXOR LCHAN TCF COMFLAG # *********************************** NOULLAGE CS ULLAGER # MUST BE CALLED IN A TASK OR UNDER INHINT MASK DAPBOOLS TS DAPBOOLS TC Q # *********************************** ONULLAGE CS DAPBOOLS # TURN ON ULLAGE. MUST BE CALLED IN MASK ULLAGER # A TASK OR WHILE INHINTED. ADS DAPBOOLS TC Q # *********************************** STCLOK1 CA ZERO # THIS ROUTINE STARTS THE COUNT-DOWN STCLOK2 TS DISPDEX # (CLOKTASK AND CLOKJOB). SETTING STCLOK3 TC MAKECADR # SETTING DISPDEX POSITIVE KILLS IT. TS TBASE4 # RETURN SAVE (NOT FOR RESTARTS). EXTEND DCA TIG DXCH MPAC EXTEND DCS TIME2 # Page 744 DAS MPAC # HAVE TIG -- TIME2, UNDOUBTEDLY A + NUMBER TC TPAGREE # POSITIVE, SINCE WE PASSED THE CAF 1SEC # 45 SECOND CHECK. TS Q DXCH MPAC MASK LOW5 # RESTRICT MAGNITUDE OF NUMBER IN A EXTEND DV Q CA L # GET REMAINDER AD TWO INHINT TC TWIDDLE ADRES CLOKTASK TC 2PHSCHNG OCT 40036 # 6.3SPOT FOR CLOKTASK OCT 05024 OCT 13000 CA TBASE4 TC BANKJUMP CLOKTASK CS TIME1 # SET TBASE6 FOR GROUP 6 RESTART TS TBASE6 CCS DISPDEX TCF KILLCLOK NOOP CAF PRIO27 TC NOVAC EBANK= TTOGO 2CADR CLOKJOB TC FIXDELAY # WAIT A SECOND BEFORE STARTING OVER DEC 100 TCF CLOKTASK KILLCLOK EXTEND # KILL RESTART DCA NEG0 DXCH -PHASE6 TCF TASKOVER CLOKJOB EXTEND DCS TIG DXCH TTOGO EXTEND # Page 745 DCA TIME2 DAS TTOGO INHINT CCS DISPDEX # IF DISPDEX HAS BEEN SET POSITIVE BY A TCF ENDOFJOB # TASK OR A HIGHER PRIORITY JOB SINCE THE TCF ENDOFJOB # LAST CLOKTASK, AVOID USING IT AS AN COM # INDEX. RELINT # ***** DISPDEX MUST NEVER B -0 ***** INDEX A TCF DISPNOT -1 # (-1 DUE TO EFFECT OF CCS) VB97DEX = OCT35 # NEGATIVE OF THIS IS PROPER FOR DISPDEX -35 CS ZERO # INDICATE VERB 97 PASTE TS NVWORD1 CA NVWORD +2 # NVWORD+2 CONTAINS V06 & APPROPRIATE NOUN TC BANKCALL CADR CLOCPLAY TCF STOPCLOK # TERMINATE CLOKTASK ON THE WAY TO P00H TCF COMFAIL1 TCF COMFAIL2 # THIS DISPLAY IS CALLED VIA ASTNCLOK -25 CAF V06N61 # IT IS PRIMARILY USED BY THE CREW IN P63 TC BANKCALL # TO RESET HIS EVENT TIMER TO AGREE WITH CADR REFLASH # TIG. TCF STOPCLOK TCF ASTNRETN TCF -6 CNTDNDEX = LOW4 # OCT17: NEGATIVE PROPER FOR DISPDEX -17 INDEX WHICH # THIS DISPLAY COMES UP AT ONE SECOND # Was CAF --- RSB 2009 CA 0 # INTERVALS. IT IS NORMALLY OPERATED TC BANKCALL # BETWEEN TIG-30 SECONDS AND TIG-5 SECONDS CADR REGODSP # REGODSP DOES ITS OWN TCF ENDOFJOB VB99DEX = ELEVEN # OCT13: NEGATIVE PROPER FOR DISPDEX V99RECYC EQUALS -13 CS BIT9 # INDICATE VERB 99 PASTE TS NVWORD1 INDEX WHICH # THIS IS THE "PLEASE ENABLE ENGINE" # Was CAF --- RSB 2004 CA 0 # DISPLAY; IT IS INITIATED AT TIG-5 SEC. TC BANKCALL # THE DISPLAY IS A V99NXX, WHERE XX IS CADR CLOCPLAY # NOUN THAT HAD PREVIOUSLY BEEN DISPLAYED TCF STOPCLOK # TERMINATE GOTOP00H TURNS OFF ULLAGE. TCF *PROCEED TCF *ENTER # Page 746 BLANKDEX = TWO # NEGATIVE OF THIS IS PROPER FOR DISPDEX -2 TC BANKCALL # BLANK DSKY. THE DSKY IS BLANKED FOR CADR CLEANDSP # 5 SECONDS AT TIG-35 TO INDICATE THAT DISPNOT TCF ENDOFJOB # AVERAGE G IS STARTING. STOPCLOK TC NULLCLOK # STOP CLOKTASK & TURN OFF ULLAGE ON THE TCF GOTOP00H # WAY TO P00 (GOTOP00H RELINTS) NULLCLOK INHINT EXTEND QXCH P40/RET TC NOULLAGE # TURN OFF ULLAGE ... TC KILLTASK # DON'T LET IT COME ON, EITHER ... CADR ULLGTASK TC PHASCHNG # NOT EVEN IF THERE'S A RESTART. OCT 1 CA Z # KILL CLOKTASK TS DISPDEX TC P40/RET ASTNRETN TC PHASCHNG OCT 04024 CAF ZERO # STOP DISPLAYING BUT KEEP RUNNING TS DISPDEX CAF PRIO13 TC FINDVAC EBANK= STARIND 2CADR ASTNRET TCF ENDOFJOB *PROCEED TC UPFLAG ADRES ASTNFLAG TCF IGNITE *ENTER INHINT INDEX WHICH TCF 3 GOPOST CAF PRIO12 # (3) MUST BE LOWER PRIORITY THAN CLOKJOB TC FINDVAC EBANK= TTOGO 2CADR POSTBURN # Page 747 INHINT # SET UP THE DAP FOR COASTING FLIGHT. TC IBNKCALL CADR ALLCOAST TC NULLCLOK TC PHASCHNG # 4.13 RESTART FOR POSTBURN OCT 00134 TCF ENDOFJOB GOCUTOFF CAF PRIO17 # (3) TC FINDVAC EBANK= TGO 2CADR CUTOFF TC DOWNFLAG ADRES FLUNDISP INHINT # SET UP THE DAP FOR COASTING FLIGHT. TC IBNKCALL CADR ALLCOAST TC NULLCLOK TC PHASCHNG OCT 07024 OCT 17000 EBANK= TGO 2CADR CUTOFF TCF ENDOFJOB IGNITE CS FLAGWRD7 # (2) MASK IGNFLBIT CCS A TCF IGNITE1 CAF BIT1 INHINT TC TWIDDLE ADRES IGNITION CAF OCT23 # IMMEDIATE RESTART AT IGNITION TS L COM DXCH -PHASE4 IGNITE1 CS CNTDNDEX # RESTORE OLD DISPLAY. TS DISPDEX TCF ENDOFJOB # Page 748 # ******************************** P40ALM TC ALARM # PROGRAM SELECTION NOT CONSISTENT WITH OCT 1706 # VEHICLE CONFIGURATION REP40ALM CAF V05N09 # (14) TC BANKCALL CADR GOFLASH TCF GOTOP00H # V34E TERMINATE TCF +2 # PROCEED CHECK FOR P42 TCF REP40ALM # V32E REDISPLAY ALARM INDEX WHICH # FOR P42, ALLOW CREW TO PRECEED EVEN TCF 14 # THOUGH VEHICLE IS UNSTAGED. # ******************************** BANK 31 SETLOC P40S2 BANK COUNT* $$/P40 P40AUTO TC MAKECADR # HELLO THERE. TS TEMPR60 # FOR GENERALIZED RETURN TO OTHER BANKS. P40A/P TC BANKCALL # SUBROUTINE TO CHECK PGNCS CONTROL CADR G+N,AUTO # AND AUTO STABILIZATION MODES CCS A # +0 INDICATES IN PGNCS, IN AUTO TCF TURNITON # + INDICATES NOT IN PGNCS AND/OR AUTO CAF APSFLBIT # ARE WE ON THE DESCENT STAGE? MASK FLGWRD10 CCS A TCF GOBACK # RETURN CAF BIT5 # YES, CHECK FOR AUTO-THROTTLE MODE EXTEND RAND CHAN30 EXTEND BZF GOBACK # IN AUTO-THROTTLE MODE -- RETURN TURNITON CAF P40A/PMD # DISPLAYS V50N25 R1=203 PLEASE PERFORM TC BANKCALL # CHECKLIST 203 TURN ON PGNCS ETC. CADR GOPERF1 TCF GOTOP00H # V34E TERMINATE TCF P40A/P # RECYCLE GOBACK CA TEMPR60 TC BANKJUMP # GOODBYE. COME AGAIN SOON. P40A/PMD OCT 00203 # Page 749 BANK 36 SETLOC P40S BANK COUNT* $$/P40 # ********************************** # CONSTANTS FOR THE IGNITION ROUTINE # ********************************** SERVCADR = P63TABLE +7 P40ADRES ADRES P40TABLE P41ADRES ADRES P41TABLE -5 P42ADRES ADRES P42TABLE EBANK= DVCNTR DSP2CADR 2CADR P63DISPS -2 EBANK= DVCNTR ATMAGADR 2CADR ATMAG ? = GOTOP00H D29.9SEC 2DEC 2990 S24.9SEC DEC 2490 4.9SEC DEC 490 OCT20 = BIT5 V06N61 VN 0661 # Page 750 # KILLTASK # MOD NO: NEW PROGRAM # MOD BY: COVELLI # # FUNCTIONAL DESCRIPTION: # # KILLTASK IS USED TO REMOVE A TASK FROM THE WAITLIST BY SUBSTITUTING A NULL TASK CALLED `NULLTASK' (OF COURSE), # WHICH MERELY DOES A TC TASKOVER. IF THE SAME TASK IS SCHEDULED MORE THAN ONCE, ONLY THE ONE WHICH WILL OCCUR # FIRST IS REMOVED. IF THE TASK IS NOT SCHEDULED, KILLTASK TAKES NO ACTION AND RETURNS WITH NO ALARM. KILLTASK # LEAVES INTERRUPTS INHIBITED SO CALLER MUST RELINT # # CALLING SEQUENCE # L TC KILLTASK # IN FIXED-FIXED # L+1 CADR ???????? # CADR (NOT 2CADR) OF TASK TO BE REMOVED. # L+2 (RELINT) # RETURN # # EXIT MODE: AT L+2 OF CALLING SEQUENCE. # # ERASABLE INITIALIZATION: NONE. # # OUTPUT: 2CADR OF NULLTASK IN LST2 # # DEBRIS: ITEMP1 - ITEMP4, A, L, Q. EBANK= LST2 BLOCK 3 # KILLTASK MUST BE IN FIXED-FIXED. SETLOC FFTAG6 BANK COUNT* $$/KILL KILLTASK CA KILLBB INHINT LXCH A INDEX Q CA 0 # GET CADR. LXCH BBANK TCF KILLTSK2 # CONTINUE IN SWITCHED FIXED. EBANK= LST2 KILLBB BBCON KILLTSK2 BANK 27 SETLOC P40S1 BANK COUNT* $$/KILL KILLTSK2 LXCH ITEMP2 # SAVE CALLER'S BBANK # Page 751 INCR Q EXTEND QXCH ITEMP1 # RETURN 2ADR IN ITEMP1,ITEMP2 TS ITEMP3 # CADR IS IN A MASK LOW10 AD BIT11 TS ITEMP4 # GENADR OF TASK CS LOW10 MASK ITEMP3 TS ITEMP3 # FBANK OF TASK ZL ADRSCAN INDEX L CS LST2 AD ITEMP4 # COMPARE GENADRS EXTEND BZF TSTFBANK # IF THEY MATCH, COMPARE FBANKS LETITLIV CS LSTLIM AD L EXTEND # ARE WE DONE? BZF DEAD # YES -- DONE, SO RETURN INCR L INCR L TCF ADRSCAN # CONTINUE LOOP. DEAD DXCH ITEMP1 DTCB TSTFBANK CS LOW10 INDEX L MASK LST2 +1 # COMPARE FBANKS ONLY. EXTEND SU ITEMP3 EXTEND BZF KILLDEAD # MATCH -- KILL IT. TCF LETITLIV # NO MATCH -- CONTINUE. KILLDEAD CA TCTSKOVR INDEX L TS LST2 # REMOVE TASK BY INSERTING TASKOVER TCF DEAD LSTLIM EQUALS BIT5 # DEC 16 ================================================ FILE: samples/AppleScript/Convert To PDF.applescript ================================================ (* Copyright 2003 Apple Computer, Inc. You may incorporate this Apple sample code into your program(s) without restriction. This Apple sample code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample code as "Apple sample code" after having made changes. If you're going to redistribute the code, we require that you make it clear that the code was descended from Apple sample code, but that you've made changes. *) property type_list : {"JPEG", "GIFf", "PICT", "TIFF", "PDF", "TEXT"} property extension_list : {"jpg", "gif", "pct", "tif", "pdf", "rtf"} --html is not currently handled on run {} tell application "Finder" to set FinderSelection to the selection as alias list set FS to FinderSelection --Ideally, this list could be passed to the open handler set SelectionCount to number of FS -- count if SelectionCount is 0 then set FS to userPicksFolder() else if the SelectionCount is 1 then set MyPath to path to me if MyPath is item 1 of FS then --If I'm a droplet then I was double-clicked set FS to userPicksFolder() end if else --I'm not a double-clicked droplet end if open FS end run on userPicksFolder() set these_items to {} set these_items to (choose file with prompt "Select a file to convert to PDF:" of type {"JPEG", "GIFf", "PICT", "TIFF", "TEXT", "RTF"}) as list end userPicksFolder on open these_items set thesefiles to {} set the item_info to {} repeat with i from 1 to the count of these_items set this_item to (item i of these_items) set the item_info to info for this_item if folder of the item_info is true then --if the item is a folder processFolder(this_item) else if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then set theFilePath to (item i of these_items as string) set thePOSIXFilePath to POSIX path of theFilePath as string processFile(thePOSIXFilePath) end if end repeat end open --process folders on processFolder(theFolder) set these_items to list folder theFolder without invisibles repeat with i from 1 to the count of these_items set this_item to alias ((theFolder as text) & (item i of these_items)) set the item_info to info for this_item if folder of the item_info is true then processFolder(this_item) else if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then set theFilePath to (this_item as string) set thePOSIXFilePath to POSIX path of theFilePath as string processFile(thePOSIXFilePath) end if end repeat end processFolder on processFile(thePOSIXFileName) try set terminalCommand to "" set convertCommand to "/System/Library/Printers/Libraries/./convert " set newFileName to thePOSIXFileName & ".pdf" set terminalCommand to convertCommand & "-f " & "\"" & thePOSIXFileName & "\"" & " -o " & "\"" & newFileName & "\"" & " -j \"application/pdf\"" do shell script terminalCommand end try end processFile ================================================ FILE: samples/AppleScript/Convert To PostScript.applescript ================================================ (* Copyright 2003 Apple Computer, Inc. You may incorporate this Apple sample code into your program(s) without restriction. This Apple sample code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample code as "Apple sample code" after having made changes. If you're going to redistribute the code, we require that you make it clear that the code was descended from Apple sample code, but that you've made changes. *) property type_list : {"JPEG", "GIFf", "PICT", "TIFF", "PDF", "TEXT"} property extension_list : {"jpg", "gif", "pct", "tif", "pdf", "rtf"} --html is not currently handled on run {} tell application "Finder" to set FinderSelection to the selection as alias list set FS to FinderSelection --Ideally, this list could be passed to the open handler set SelectionCount to number of FS -- count if SelectionCount is 0 then set FS to userPicksFolder() else if the SelectionCount is 1 then set MyPath to path to me if MyPath is item 1 of FS then --If I'm a droplet then I was double-clicked set FS to userPicksFolder() end if else --I'm not a double-clicked droplet end if open FS end run on userPicksFolder() set these_items to {} set these_items to (choose file with prompt "Select a file to convert to PostScript:" of type {"JPEG", "GIFf", "PICT", "TIFF", "TEXT", "RTF"}) as list end userPicksFolder on open these_items set thesefiles to {} set the item_info to {} repeat with i from 1 to the count of these_items set this_item to (item i of these_items) set the item_info to info for this_item if folder of the item_info is true then --if the item is a folder processFolder(this_item) else if ((folder of the item_info is false) and (alias of the item_info is false)) and (the file type of the item_info is in the type_list) or ((the name extension of the item_info) is in the extension_list) then set theFilePath to (item i of these_items as string) set thePOSIXFilePath to POSIX path of theFilePath as string processFile(thePOSIXFilePath) end if end repeat end open --process folders on processFolder(theFolder) set these_items to list folder theFolder without invisibles repeat with i from 1 to the count of these_items set this_item to alias ((theFolder as text) & (item i of these_items)) set the item_info to info for this_item if folder of the item_info is true then processFolder(this_item) else if (alias of the item_info is false) and ((the file type of the item_info is in the type_list) or the name extension of the item_info is in the extension_list) then set theFilePath to (this_item as string) set thePOSIXFilePath to POSIX path of theFilePath as string processFile(thePOSIXFilePath) end if end repeat end processFolder --need to pass the URL to Terminal on processFile(thePOSIXFileName) try set terminalCommand to "" set convertCommand to "/System/Library/Printers/Libraries/./convert " set newFileName to thePOSIXFileName & ".ps" set terminalCommand to convertCommand & "-f " & "\"" & thePOSIXFileName & "\"" & " -o " & "\"" & newFileName & "\"" & " -j \"application/postscript\"" do shell script terminalCommand end try end processFile ================================================ FILE: samples/AppleScript/Count Messages in All Mailboxes.applescript ================================================ (* Count Messages in All Mailboxes Copyright 2002-2012 Apple Inc. All rights reserved. You may incorporate this Apple sample code into your program(s) without restriction. This Apple sample code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample code as "Apple sample code" after having made changes. If you're going to redistribute the code, we require that you make it clear that the code was descended from Apple sample code, but that you've made changes. *) (* This script goes through each mailbox, gets the total message count and the unread count, then displays the final output in a new email message. *) tell application "Mail" set localMailboxes to every mailbox if (count of localMailboxes) is greater than 0 then set messageCountDisplay to "Local mailboxes (On My Mac)" & return & my getMessageCountsForMailboxes(localMailboxes) else set messageCountDisplay to "" end if set everyAccount to every account repeat with eachAccount in everyAccount set accountMailboxes to every mailbox of eachAccount if (count of accountMailboxes) is greater than 0 then set messageCountDisplay to messageCountDisplay & return & "Mailboxes for Account: " & name of eachAccount & return & my getMessageCountsForMailboxes(accountMailboxes) end if end repeat set outputMessage to make new outgoing message with properties {content:messageCountDisplay, subject:"Message counts for all my mailboxes", visible:true} tell outputMessage set font to "Courier" set size to 12 end tell end tell on getMessageCountsForMailboxes(theMailboxes) -- (list of mailboxes) -- returns string set displayString to "" tell application "Mail" repeat with eachMailbox in theMailboxes set mailboxName to name of eachMailbox set messageCount to (count of (messages of eachMailbox)) as string set unreadCount to unread count of eachMailbox as string set displayString to displayString & " " & my padString(mailboxName, 40) & " " & messageCount & " (" & unreadCount & " unread)" & return end repeat end tell return displayString end getMessageCountsForMailboxes on padString(theString, fieldLength) -- (string, integer) -- returns string set stringLength to length of theString if stringLength is greater than fieldLength then set paddedString to (text from character 1 to character (fieldLength - 3) of theString) & "..." else -- stringLength is less than or equal to fieldLength set paddedString to theString set paddingLength to fieldLength - stringLength repeat paddingLength times set paddedString to paddedString & space end repeat end if return paddedString end padString ================================================ FILE: samples/AppleScript/Crazy Message Text.applescript ================================================ (* Crazy Message Text Copyright 2002-2012 Apple Inc. All rights reserved. You may incorporate this Apple sample code into your program(s) without restriction. This Apple sample code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample code as "Apple sample code" after having made changes. If you're going to redistribute the code, we require that you make it clear that the code was descended from Apple sample code, but that you've made changes. *) (* This script takes a string from the user and then makes a new message where each letter has a different font, size, and color. *) property lowFontSize : 36 property highFontSize : 72 property messageText : "Happy Birthday!" repeat set userInput to display dialog "Enter some message text:" & return & return & "Minimum Character Size: " & (lowFontSize as string) & return & "Maximum Character Size: " & (highFontSize as string) default answer messageText buttons {"Cancel", "Set Prefs", "Continue"} default button 3 if the button returned of userInput is "Set Prefs" then set minimumFontSize to 9 display dialog "Enter the minimum font size to use:" & return & return & "(Must be at least " & (minimumFontSize as string) & ")" default answer lowFontSize buttons {"OK"} set newFontSize to text returned of the result as integer if newFontSize is greater than or equal to minimumFontSize then set lowFontSize to newFontSize else set lowFontSize to minimumFontSize end if display dialog "Enter the maximum font size to use:" & return & return & "(Must be greater than " & (lowFontSize as string) & ")" default answer highFontSize buttons {"OK"} set newFontSize to text returned of the result as integer if newFontSize is greater than lowFontSize then set highFontSize to newFontSize else set highFontSize to lowFontSize end if else -- button returned of userInput is "Continue" set theText to text returned of userInput if theText is not "" then set messageText to theText end if exit repeat end if end repeat set fontList to {"American Typewriter", "American Typewriter Light", "American Typewriter Bold", "American Typewriter Condensed", "American Typewriter Condensed Light", "American Typewriter Condensed Bold", "Arial", "Arial Italic", "Arial Bold", "Arial Bold Italic", "Arial Black", "Baskerville", "Baskerville Italic", "Baskerville SemiBold", "Baskerville Bold", "Baskerville SemiBold Italic", "Baskerville Bold Italic", "Big Caslon Medium", "Comic Sans MS", "Comic Sans MS Bold", "Copperplate", "Copperplate Light", "Copperplate Bold", "Didot", "Didot Italic", "Didot Bold", "Futura Medium", "Futura Medium Italic", "Futura Condensed Medium", "Futura Condensed ExtraBold", "Geneva", "Gill Sans", "Gill Sans Italic", "Gill Sans Light", "Gill Sans Light Italic", "Gill Sans Bold", "Gill Sans Bold Italic", "Herculanum", "Lucida Grande", "Lucida Grande Bold", "Marker Felt Thin", "Marker Felt Wide", "Optima Regular", "Optima Italic", "Optima Bold", "Optima Bold Italic", "Optima ExtraBlack", "Papyrus", "Verdana", "Verdana Italic", "Verdana Bold", "Verdana Bold Italic", "Zapfino"} tell application "Mail" activate set crazyTextMessage to make new outgoing message with properties {content:messageText, visible:true} tell crazyTextMessage repeat with eachCharacter in characters set font of eachCharacter to (some item of fontList) set size of eachCharacter to (random number from lowFontSize to highFontSize) set color of eachCharacter to {random number from 0 to 65535, random number from 0 to 65535, random number from 0 to 65535} end repeat end tell end tell ================================================ FILE: samples/AppleScript/Get User Name.applescript ================================================ (* Get User Name This script uses UI element scripting to get the name for the current user. If "Enable access for assistive devices" is not checked, this script will open the Universal Access System Preference and ask the user to check the checkbox. Copyright 2007 Apple Inc. You may incorporate this Apple sample code into your program(s) without restriction. This Apple sample code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample code as "Apple sample code" after having made changes. If you're going to redistribute the code, we require that you make it clear that the code was descended from Apple sample code, but that you've made changes. *) tell application "System Preferences" activate set current pane to pane "com.apple.preferences.users" end tell tell application "System Events" if UI elements enabled then tell tab group 1 of window "Accounts" of process "System Preferences" click radio button 1 delay 2 get value of text field 1 end tell else tell application "System Preferences" activate set current pane to pane "com.apple.preference.universalaccess" display dialog "UI element scripting is not enabled. Check \"Enable access for assistive devices\"" end tell end if end tell ================================================ FILE: samples/AppleScript/Time Of Day.applescript ================================================ (* Speaks the date and time of day Copyright 2008 Apple Inc. All rights reserved. You may incorporate this Apple sample code into your program(s) without restriction. This Apple sample code has been provided "AS IS" and the responsibility for its operation is yours. You are not permitted to redistribute this Apple sample code as "Apple sample code" after having made changes. If you're going to redistribute the code, we require that you make it clear that the code was descended from Apple sample code, but that you've made changes. *) on isVoiceOverRunning() set isRunning to false tell application "System Events" set isRunning to (name of processes) contains "VoiceOver" end tell return isRunning end isVoiceOverRunning on isVoiceOverRunningWithAppleScript() if isVoiceOverRunning() then set isRunningWithAppleScript to true -- is AppleScript enabled on VoiceOver -- tell application "VoiceOver" try set x to bounds of vo cursor on error set isRunningWithAppleScript to false end try end tell return isRunningWithAppleScript end if return false end isVoiceOverRunningWithAppleScript set currentDate to current date set amPM to "AM" set currentHour to (currentDate's hours) set currentMinutes to currentDate's minutes if (currentHour > 12 and currentHour < 24) then set amPM to "PM" else set amPM to "AM" end if -- make minutes below 10 sound nice if currentMinutes < 10 then set currentMinutes to ("0" & currentMinutes) as text end if -- ensure 0:nn gets set to 12:nn AM if currentHour is equal to 0 then set currentHour to 12 end if -- readjust for 12 hour time if (currentHour > 12) then set currentHour to (currentHour - 12) end if set currentTime to ((currentDate's month) as text) & " " & ((currentDate's day) as text) & ", " & (currentHour as text) & ":" & ((currentMinutes) as text) & " " & amPM as text if isVoiceOverRunningWithAppleScript() then tell application "VoiceOver" output currentTime end tell else say currentTime delay 2 end if ================================================ FILE: samples/AppleScript/center.applescript ================================================ set windowWidth to 800 set windowHeight to 600 delay 0.1 set AppleScript's text item delimiters to "x" set res to text returned of (display dialog "Enter the width x height:" default answer ((windowWidth & windowHeight) as text)) if res is "" then display dialog "You need to enter a correct response" return end if set {windowWidth, windowHeight} to text items of res set AppleScript's text item delimiters to "" tell application "Safari" set screen_width to (do JavaScript "screen.availWidth" in document 1) set screen_height to (do JavaScript "screen.availHeight" in document 1) end tell tell application "System Events" set myFrontMost to name of first item of (processes whose frontmost is true) end tell tell application "Finder" set {desktopTop, desktopLeft, desktopRight, desktopBottom} to bounds of desktop end tell try tell application "System Events" tell process myFrontMost set {{w, h}} to size of drawer of window 1 end tell end tell on error set {w, h} to {0, 0} end try tell application "System Events" tell process myFrontMost try set {{w, h}} to size of drawer of window 1 on error set {w, h} to {0, 0} end try set position of window 1 to {((screen_width - windowWidth) / 2), ((screen_height - windowHeight) / 2.0) - desktopTop} set size of window 1 to {windowWidth -w, windowHeight} end tell end tell ================================================ FILE: samples/AsciiDoc/encoding.asciidoc ================================================ Gregory Romé has written an AsciiDoc plugin for the Redmine project management application. https://github.com/foo-users/foo へと `vicmd` キーマップを足してみている試み、 アニメーションgifです。 tag::romé[] Gregory Romé has written an AsciiDoc plugin for the Redmine project management application. end::romé[] == Überschrift * Codierungen sind verrückt auf älteren Versionen von Ruby ================================================ FILE: samples/AsciiDoc/list.asc ================================================ AsciiDoc Home Page ================== Title ----- Example Articles ~~~~~~~~~~~~~~~~ - Item 1 - Item 2 - Item 3 ================================================ FILE: samples/AsciiDoc/sample.adoc ================================================ Document Title ============== Doc Writer :idprefix: id_ Preamble paragraph. NOTE: This is test, only a test. == Section A *Section A* paragraph. === Section A Subsection *Section A* 'subsection' paragraph. == Section B *Section B* paragraph. .Section B list * Item 1 * Item 2 * Item 3 ================================================ FILE: samples/AspectJ/CacheAspect.aj ================================================ package com.blogspot.miguelinlas3.aspectj.cache; import java.util.Map; import java.util.WeakHashMap; import org.aspectj.lang.JoinPoint; import com.blogspot.miguelinlas3.aspectj.cache.marker.Cachable; /** * This simple aspect simulates the behaviour of a very simple cache * * @author migue * */ public aspect CacheAspect { public pointcut cache(Cachable cachable): execution(@Cachable * * (..)) && @annotation(cachable); Object around(Cachable cachable): cache(cachable){ String evaluatedKey = this.evaluateKey(cachable.scriptKey(), thisJoinPoint); if(cache.containsKey(evaluatedKey)){ System.out.println("Cache hit for key " + evaluatedKey); return this.cache.get(evaluatedKey); } System.out.println("Cache miss for key " + evaluatedKey); Object value = proceed(cachable); cache.put(evaluatedKey, value); return value; } protected String evaluateKey(String key, JoinPoint joinPoint) { // TODO add some smart staff to allow simple scripting in @Cachable annotation return key; } protected Map cache = new WeakHashMap(); } ================================================ FILE: samples/AspectJ/OptimizeRecursionCache.aj ================================================ package aspects.caching; import java.util.Map; /** * Cache aspect for optimize recursive functions. * * @author Migueli * @date 05/11/2013 * @version 1.0 * */ public abstract aspect OptimizeRecursionCache { @SuppressWarnings("rawtypes") private Map _cache; public OptimizeRecursionCache() { _cache = getCache(); } @SuppressWarnings("rawtypes") abstract public Map getCache(); abstract public pointcut operation(Object o); pointcut topLevelOperation(Object o): operation(o) && !cflowbelow(operation(Object)); before(Object o) : topLevelOperation(o) { System.out.println("Seeking value for " + o); } Object around(Object o) : operation(o) { Object cachedValue = _cache.get(o); if (cachedValue != null) { System.out.println("Found cached value for " + o + ": " + cachedValue); return cachedValue; } return proceed(o); } @SuppressWarnings("unchecked") after(Object o) returning(Object result) : topLevelOperation(o) { _cache.put(o, result); } after(Object o) returning(Object result) : topLevelOperation(o) { System.out.println("cache size: " + _cache.size()); } } ================================================ FILE: samples/Assembly/3D_PRG.I ================================================ ; this file is part of Release, written by Malban in 2017 ; *********************************************************** ; input list in X ; destroys u ; 0 move ; negative use as shift ; positive end asm_draw_3ds: ldu 2,x lda 1,x; starts: sta $d004; ldd ,u; sta $d001; clr $d000; lda ,x; inc $d000; stb $d001; sta $d00A; clr $d005; leax 4,x; ldu 2,x; lda ,x; bgt end1s; lda 1,x; ldb #$40; waits: bitb $d00D; beq waits; ldb #0 stb $d00A; bra starts; end1s: ldd #$0040; ends: bitb $d00D; beq ends; sta $d00A rts asm_draw_3d: ldu 1,x start: ldd ,u; sta $d001; clr $d000; lda ,x; inc $d000; stb $d001; sta $d00A; clr $d005; leax 3,x; ldu 1,x; lda ,x; bgt end1; ldd #$0040; wait: bitb $d00D; beq wait; sta $d00A; bra start; end1: ldd #$0040; end: bitb $d00D; beq end; sta $d00A rts ; Cosinus data cosinus3d: DB 63, 62, 61, 60, 58, 55, 52, 48, 43, 39, 34 ; 11 DB 28, 23, 17, 10, 4, -1, -7, -14, -20, -25, -31 ; 22 DB -36, -41, -46, -50, -53, -56, -59, -61, -62, -62, -62 ; 33 DB -62, -61, -59, -56, -53, -50, -46, -41, -36, -31, -25 ; 44 DB -20, -14, -7, -1, 4, 10, 17, 23, 28, 34, 39 ; 55 DB 43, 48, 52, 55, 58, 60, 61, 62, 63 ; Sinus data sinus3d: DB 0, 6, 12, 18, 24, 30, 35, 40, 45, 49, 52 ; 11 DB 56, 58, 60, 62, 62, 62, 62, 61, 59, 57, 54 ; 22 DB 51, 47, 42, 38, 32, 27, 21, 15, 9, 3, -3 ; 33 DB -9, -15, -21, -27, -32, -38, -42, -47, -51, -54, -57 ; 44 DB -59, -61, -62, -62, -62, -62, -60, -58, -56, -52, -49 ; 55 DB -45, -40, -35, -30, -24, -18, -12, -6, -3 ================================================ FILE: samples/Assembly/A8514.i ================================================ ;;/*....................Bit Definitions....................................*/ NOERROR equ 00h NO8514A equ 80h ;;/*....................GC250 REGISTERS....................................*/ DISP_STAT equ 02E8h ;/* Display Status Register */ H_TOTAL equ 02E8h ;/* Horizontal Total Register */ DAC_MASK equ 02EAh ;/* DAC Mask */ DAC_RINDEX equ 02EBh ;/* DAC read index register */ DAC_WINDEX equ 02ECh ;/* DAC write index register */ DAC_DATA equ 02EDh ;/* DAC Data register */ H_DISPLAYED equ 06E8h ;/* Horiz Displayed Reg */ H_SYNC_STRT equ 0AE8h ;/* Horiz Sync Start Reg */ H_SYNC_WID equ 0EE8h ;/* Horiz Sync Width Reg */ V_TOTAL equ 12E8h ;/* Vertical Total Reg */ V_DISPLAYED equ 16E8h ;/* Vertical Displayed Reg */ V_SYNC_STRT equ 1AE8h ;/* Vertical Sync Start Reg */ V_SYNC_WID equ 1EE8h ;/* Vertical Sync Width Reg */ DISP_CNTL equ 22E8h ;/* Display Control Register */ SUBSYS_CNTL equ 42E8h ;/* Subsystem Control Reg */ SUBSYS_STAT equ 42E8h ;/* Subsystem Status Reg */ ROM_PAGE_SEL equ 46E8h ;/* ROM Page Select Reg */ ADVFUNC_CNTL equ 4AE8h ;/* Adv Func Control Reg */ CUR_Y_POS equ 82E8h ;/* Current Y Position */ CUR_X_POS equ 86E8h ;/* Current Y Position */ DESTY_AXSTP equ 8AE8h ;/* Dest Y/Axial Step Reg */ DESTX_DIASTP equ 8EE8h ;/* Dest X/Diagl Step Reg */ ERR_TERM equ 92E8h ;/* Error Term Register */ MAJ_AXIS_PCNT equ 96E8h ;/* Major Axis Pixel Count */ COMMAND equ 9AE8h ;/* Command register */ GP_STATUS equ 9AE8h ;/* Graphics Processor Status */ CMD_STATUS equ 9AE9h ;/* Command status register */ SHORT_STROKE equ 9EE8h ;/* Short Stroke Vector Reg */ BKGD_COLOR equ 0A2E8h ;/* Background Color */ FRGD_COLOR equ 0A6E8h ;/* Foreground Color */ WRT_MASK equ 0AAE8h ;/* Write Mask */ RD_MASK equ 0AEE8h ;/* Read Mask */ COLOR_CMP equ 0B2E8h ;/* Color Compare Register */ BKGD_MIX equ 0B6E8h ;/* Background Mix Register */ FGRD_MIX equ 0BAE8h ;/* Foreground Mix Register */ MLTFUNC_CNTL equ 0BEE8h ;/* Multifunction Control */ PIX_TRANS equ 0E2E8h ;/* Pixel Data Transfer Reg. */ ;/* ..................Bit definitions of Registers .....................*/ CMD_ACTIVE equ 02h ;/* Command is active? */ DATA_AVAIL equ 01h ;/* Input Data Available? */ NO8514 equ 40h ;/* No 8514 Monitor present */ MONOCHROME equ 10h ;/* Monochrome Monitor? */ PLANE8 equ 80h ;/* 8 plane memory available */ ;/* ..................COMMAND mask bits ................................*/ WRITCMD equ 01h PLANAR equ 02h LSTPELNULL equ 04h STROKE_ALG equ 08h DRAWCMD equ 10h INCX equ 20h YMAJAXIS equ 40h INCY equ 80h PC_TRANS equ 100h BIT16 equ 200h BYTE_SWAP equ 1000h NO_FCN equ 0000h LINE_DRAW equ 2000h FILL_X_RECT equ 4000h FILL_Y_RECT equ 6000h FILL_RECT equ 8000h AXIAL_LINE equ 0A000h COPY_RECT equ 0C000h HANG equ 0E000h ;/* ..................MIX Defines ........................................*/ MIX_NOT_DEST equ 00h MIX_ZERO equ 01h MIX_ONE equ 02h MIX_DEST equ 03h MIX_NOT_SRC equ 04h MIX_SRC_XOR_DEST equ 05h MIX_NOT equ 06h MIX_SRC equ 07h ;/* .................MIX Sources .........................................*/ B_CLR_ACTIVE equ 00h F_CLR_ACTIVE equ 20h PTRANS_ACTIVE equ 40h ALL_PLANE_CPY equ 60h ;/* .................MLTFUNC_CNTL ... high order nibble is an index .......*/ MINOR_AXIS_PCNT equ 0000h SCISSOR_T equ 1000h SCISSOR_L equ 2000h SCISSOR_B equ 3000h SCISSOR_R equ 4000h MEM_CNTL equ 5000h PIX_CNTL equ 0A000h ;/* Mix operation select */ ONE_PLN_COPY equ 0C0h ;/* Write transfers use fgdmix for 1's and bkgdmix for 0's */ WRT_PLN_MODE equ 080h ;/* Write transfers use fgdmix for 1's and bkgdmix for 0's */ PIX_MIX_SEL equ 040h FGD_MIX_ACT equ 0000h ;/* Misc bit deinitions */ STOP_SEQ equ 9000h ;/* subsystem cntl reg */ START_SEQ equ 5000h ;/* subsystem cntl reg */ RESET_QUEUE_FULL equ 04h VP1024 equ 0 ;/* AI Monde 0,2,3 */ VP644 equ 1 ;/* AI Mode 1 (4 plane) */ VP648 equ 2 ;/* AI Mode 1 (8 plane) */ ;/*.........................CONTROL WORD BITFIELDS...................*/ GP_READ equ 0 GP_WRITE equ 1 ;/* Writing or reading screen */ GP_PIXEL equ 0 GP_PLANE equ (1<<1) ;/* Bitplane or chunky pixels */ GP_SETL equ 0 GP_SKIPL equ (1<<2) ;/* Skip last pixel in line? */ GP_LINEL equ 0 GP_LINES equ (1<<3) ;/* Short stroke or long line? */ GP_MOVE equ 0 GP_DRAW equ (1<<4) ;/* Draw pixels or just move x/y position */ GP_DECX equ 0 GP_INCX equ (1<<5) ;/* Increment or decrement x position? */ GP_AXISX equ 0 GP_AXISY equ (1<<6) ;/* Is Y or X the major axis? */ GP_DECY equ 0 GP_INCY equ (1<<7) ;/* Increment or decrement y position? */ GP_NODATA equ 0 GP_DATA equ (1<<8) ;/* Pixel Data Transfer register used? */ GP_BUS8 equ 0 GP_BUS16 equ (1<<9) ;/* 16 or 8 bit buss access */ GP_PIXEL8 equ 0 GP_PIXEL16 equ (1<<10) ;/* Always enabled - 16 bit internal */ GP_RESERVED equ (0<<11) GP_NOSWAP equ 0 GP_SWAP equ (1<<12) ;/* Swap bytes on 16 bit PC transfers */ GPC_NOP equ (0<<13) ;/* Do nothing */ GPC_LINE equ (1<<13) ;/* Draw a line */ GPC_RECTX equ (2<<13) ;/* Rectangle drawn x-wise. Pos updated */ GPC_RECTY equ (3<<13) ;/* Rectangle drawn y-wise. Pos updated */ GPC_RECTS equ (4<<13) ;/* Rectangle. XY Pos not updated at end */ GPC_LINEF equ (5<<13) ;/* Line for doing poly-fills. */ GPC_COPY equ (6<<13) ;/* Copy to/from memory */ GPC_HANG equ (7<<13) ;/* Make adapter hang & need reboot */ Wait_free MACRO LOCAL WaitLoop mov DX, CMD_STATUS ; Make sure the board's not busy... WaitLoop: in AX, DX ; Read the status. test AX, CMD_ACTIVE ; Is the machine busy? jnz WaitLoop ; Yes, try again. ENDM Wait_queue macro local bloop mov dx,GP_STATUS bloop: in al,dx test al,02h jnz bloop endm rast8514 struc vm_type dw ? vm_pdepth dw ? vm_lib dd ? vm_aspect_dx dw ? vm_aspect_dy dw ? vm_reserved dd ? vm_w dw ? vm_h dw ? vm_x dw ? vm_y dw ? vm_xcard dd ? vm_ycard dd ? vm_screen_ix dd ? vm_driver_reserved dd ? rast8514 ends ; ; WAITQ ; ; Waits until the specified number of entries are available in the ; command queue. AX, BX, and DX are destroyed. No error checking on the ; input parameter is performed, but it must be <= 8. WAITQ MACRO qEntries LOCAL CheckQ Mov DX, GP_STATUS ; Get the queue status address. CheckQ: In AL, DX ; Get the status test AL, 0100H SHR (qEntries) ; Is the queue entry available? Jnz CheckQ ; Yes if result is Zero. ENDM ; ; CLRCMD ; ; Waits until no more commands are active. ; AX, and DX may be destroyed. CLRCMD MACRO LOCAL WaitLoop mov DX, CMD_STATUS ; Make sure the board's not busy... WaitLoop: in AL, DX ; Read the status. test AL, CMD_ACTIVE ; Is the machine busy? jnz WaitLoop ; Yes, try again. ENDM ; ; CANC_XFER ; ; If we are in the pixel transfer mode, cancel out of it. CANC_XFER MACRO LOCAL OK Cmp xferMode, 0 ; Are we in pixel transfer mode? Je OK ; No, all is well. OUTPW FRGD_MIX_REG, foreMix ; Yes, restore to previous mode. OUTPW BKGD_MIX_REG, backMix ; Restore all. Mov xferMode, 0 ; Remember that we restored it. OK: ENDM ================================================ FILE: samples/Assembly/External Interrupt.a51 ================================================ ORG 0000h SJMP START ORG 0003h LCALL INT0_ISR RETI ORG 000Bh LCALL T0_ISR RETI ORG 0013h LCALL INT1_ISR RETI ORG 001Bh LCALL T1_ISR RETI ORG 0023h LCALL UART_ISR RETI ORG 0030h START: MOV A,#11111110b SETB IT0 ; Set External Interrupt 0 to be falling edge triggered SETB EX0 ; Enable External Interrut 0 SETB EA ; Enable Interrupt LEFT: CJNE A,#01111111b,LOOP1 JMP RIGHT LOOP1: MOV P1,A RL A LCALL DELAY SJMP LEFT RIGHT: CJNE A,#11111110b,LOOP2 JMP LEFT LOOP2: MOV P1,A RR A LCALL DELAY SJMP RIGHT INT0_ISR: MOV R1,#3 FLASH: MOV P1,#00h LCALL DELAY MOV P1,#0FFh LCALL DELAY DJNZ R1,FLASH RET T0_ISR: RET INT1_ISR: RET T1_ISR: RET UART_ISR: RET DELAY: MOV R5,#20 ;R5*20 mS D1: MOV R6,#40 D2: MOV R7,#249 DJNZ R7,$ DJNZ R6,D2 DJNZ R5,D1 RET END ================================================ FILE: samples/Assembly/FASM.asm ================================================ ; flat assembler interface for Win32 ; Copyright (c) 1999-2014, Tomasz Grysztar. ; All rights reserved. format PE console section '.text' code readable executable start: mov [con_handle],STD_OUTPUT_HANDLE mov esi,_logo call display_string call get_params jc information call init_memory mov esi,_memory_prefix call display_string mov eax,[memory_end] sub eax,[memory_start] add eax,[additional_memory_end] sub eax,[additional_memory] shr eax,10 call display_number mov esi,_memory_suffix call display_string call [GetTickCount] mov [start_time],eax call preprocessor call parser call assembler call formatter call display_user_messages movzx eax,[current_pass] inc eax call display_number mov esi,_passes_suffix call display_string call [GetTickCount] sub eax,[start_time] xor edx,edx mov ebx,100 div ebx or eax,eax jz display_bytes_count xor edx,edx mov ebx,10 div ebx push edx call display_number mov dl,'.' call display_character pop eax call display_number mov esi,_seconds_suffix call display_string display_bytes_count: mov eax,[written_size] call display_number mov esi,_bytes_suffix call display_string xor al,al jmp exit_program information: mov esi,_usage call display_string mov al,1 jmp exit_program get_params: mov [input_file],0 mov [output_file],0 mov [symbols_file],0 mov [memory_setting],0 mov [passes_limit],100 call [GetCommandLine] mov esi,eax mov edi,params find_command_start: lodsb cmp al,20h je find_command_start cmp al,22h je skip_quoted_name skip_name: lodsb cmp al,20h je find_param or al,al jz all_params jmp skip_name skip_quoted_name: lodsb cmp al,22h je find_param or al,al jz all_params jmp skip_quoted_name find_param: lodsb cmp al,20h je find_param cmp al,'-' je option_param cmp al,0Dh je all_params or al,al jz all_params cmp [input_file],0 jne get_output_file mov [input_file],edi jmp process_param get_output_file: cmp [output_file],0 jne bad_params mov [output_file],edi process_param: cmp al,22h je string_param copy_param: stosb lodsb cmp al,20h je param_end cmp al,0Dh je param_end or al,al jz param_end jmp copy_param string_param: lodsb cmp al,22h je string_param_end cmp al,0Dh je param_end or al,al jz param_end stosb jmp string_param option_param: lodsb cmp al,'m' je memory_option cmp al,'M' je memory_option cmp al,'p' je passes_option cmp al,'P' je passes_option cmp al,'s' je symbols_option cmp al,'S' je symbols_option bad_params: stc ret get_option_value: xor eax,eax mov edx,eax get_option_digit: lodsb cmp al,20h je option_value_ok cmp al,0Dh je option_value_ok or al,al jz option_value_ok sub al,30h jc invalid_option_value cmp al,9 ja invalid_option_value imul edx,10 jo invalid_option_value add edx,eax jc invalid_option_value jmp get_option_digit option_value_ok: dec esi clc ret invalid_option_value: stc ret memory_option: lodsb cmp al,20h je memory_option cmp al,0Dh je bad_params or al,al jz bad_params dec esi call get_option_value or edx,edx jz bad_params cmp edx,1 shl (32-10) jae bad_params mov [memory_setting],edx jmp find_param passes_option: lodsb cmp al,20h je passes_option cmp al,0Dh je bad_params or al,al jz bad_params dec esi call get_option_value or edx,edx jz bad_params cmp edx,10000h ja bad_params mov [passes_limit],dx jmp find_param symbols_option: mov [symbols_file],edi find_symbols_file_name: lodsb cmp al,20h jne process_param jmp find_symbols_file_name param_end: dec esi string_param_end: xor al,al stosb jmp find_param all_params: cmp [input_file],0 je bad_params clc ret include 'system.inc' include '..\errors.inc' include '..\symbdump.inc' include '..\preproce.inc' include '..\parser.inc' include '..\exprpars.inc' include '..\assemble.inc' include '..\exprcalc.inc' include '..\formats.inc' include '..\x86_64.inc' include '..\avx.inc' include '..\tables.inc' include '..\messages.inc' section '.data' data readable writeable include '..\version.inc' _copyright db 'Copyright (c) 1999-2014, Tomasz Grysztar',0Dh,0Ah,0 _logo db 'flat assembler version ',VERSION_STRING,0 _usage db 0Dh,0Ah db 'usage: fasm [output]',0Dh,0Ah db 'optional settings:',0Dh,0Ah db ' -m set the limit in kilobytes for the available memory',0Dh,0Ah db ' -p set the maximum allowed number of passes',0Dh,0Ah db ' -s dump symbolic information for debugging',0Dh,0Ah db 0 _memory_prefix db ' (',0 _memory_suffix db ' kilobytes memory)',0Dh,0Ah,0 _passes_suffix db ' passes, ',0 _seconds_suffix db ' seconds, ',0 _bytes_suffix db ' bytes.',0Dh,0Ah,0 align 4 include '..\variable.inc' con_handle dd ? memory_setting dd ? start_time dd ? bytes_count dd ? displayed_count dd ? character db ? last_displayed rb 2 params rb 1000h options rb 1000h buffer rb 4000h stack 10000h section '.idata' import data readable writeable dd 0,0,0,rva kernel_name,rva kernel_table dd 0,0,0,0,0 kernel_table: ExitProcess dd rva _ExitProcess CreateFile dd rva _CreateFileA ReadFile dd rva _ReadFile WriteFile dd rva _WriteFile CloseHandle dd rva _CloseHandle SetFilePointer dd rva _SetFilePointer GetCommandLine dd rva _GetCommandLineA GetEnvironmentVariable dd rva _GetEnvironmentVariable GetStdHandle dd rva _GetStdHandle VirtualAlloc dd rva _VirtualAlloc VirtualFree dd rva _VirtualFree GetTickCount dd rva _GetTickCount GetSystemTime dd rva _GetSystemTime GlobalMemoryStatus dd rva _GlobalMemoryStatus dd 0 kernel_name db 'KERNEL32.DLL',0 _ExitProcess dw 0 db 'ExitProcess',0 _CreateFileA dw 0 db 'CreateFileA',0 _ReadFile dw 0 db 'ReadFile',0 _WriteFile dw 0 db 'WriteFile',0 _CloseHandle dw 0 db 'CloseHandle',0 _SetFilePointer dw 0 db 'SetFilePointer',0 _GetCommandLineA dw 0 db 'GetCommandLineA',0 _GetEnvironmentVariable dw 0 db 'GetEnvironmentVariableA',0 _GetStdHandle dw 0 db 'GetStdHandle',0 _VirtualAlloc dw 0 db 'VirtualAlloc',0 _VirtualFree dw 0 db 'VirtualFree',0 _GetTickCount dw 0 db 'GetTickCount',0 _GetSystemTime dw 0 db 'GetSystemTime',0 _GlobalMemoryStatus dw 0 db 'GlobalMemoryStatus',0 section '.reloc' fixups data readable discardable ================================================ FILE: samples/Assembly/cpu_feat.nas ================================================ ; ; ; assembler routines to detect CPU-features ; ; MMX / 3DNow! / SSE / SSE2 ; ; for the LAME project ; Frank Klemm, Robert Hegemann 2000-10-12 ; %include "nasm.h" globaldef has_MMX_nasm globaldef has_3DNow_nasm globaldef has_SSE_nasm globaldef has_SSE2_nasm segment_code testCPUID: pushfd pop eax mov ecx,eax xor eax,0x200000 push eax popfd pushfd pop eax cmp eax,ecx ret ;--------------------------------------- ; int has_MMX_nasm (void) ;--------------------------------------- has_MMX_nasm: pushad call testCPUID jz return0 ; no CPUID command, so no MMX mov eax,0x1 CPUID test edx,0x800000 jz return0 ; no MMX support jmp return1 ; MMX support ;--------------------------------------- ; int has_SSE_nasm (void) ;--------------------------------------- has_SSE_nasm: pushad call testCPUID jz return0 ; no CPUID command, so no SSE mov eax,0x1 CPUID test edx,0x02000000 jz return0 ; no SSE support jmp return1 ; SSE support ;--------------------------------------- ; int has_SSE2_nasm (void) ;--------------------------------------- has_SSE2_nasm: pushad call testCPUID jz return0 ; no CPUID command, so no SSE2 mov eax,0x1 CPUID test edx,0x04000000 jz return0 ; no SSE2 support jmp return1 ; SSE2 support ;--------------------------------------- ; int has_3DNow_nasm (void) ;--------------------------------------- has_3DNow_nasm: pushad call testCPUID jz return0 ; no CPUID command, so no 3DNow! mov eax,0x80000000 CPUID cmp eax,0x80000000 jbe return0 ; no extended MSR(1), so no 3DNow! mov eax,0x80000001 CPUID test edx,0x80000000 jz return0 ; no 3DNow! support ; 3DNow! support return1: popad xor eax,eax inc eax ret return0: popad xor eax,eax ret end ================================================ FILE: samples/Assembly/fftfpu.nas ================================================ ; back port from GOGO-no coda 2.24b by Takehiro TOMINAGA ; GOGO-no-coda ; Copyright (C) 1999 shigeo ; special thanks to URURI %include "nasm.h" externdef costab_fft externdef sintab_fft segment_data align 32 D_1_41421 dd 1.41421356 D_1_0 dd 1.0 D_0_5 dd 0.5 D_0_25 dd 0.25 D_0_0005 dd 0.0005 D_0_0 dd 0.0 segment_code ;void fht(float *fz, int n); proc fht_FPU %$fz arg 4 %$n arg 4 %$k local 4 %$f0 local 4 %$f1 local 4 %$f2 local 4 %$f3 local 4 %$g0 local 4 %$g1 local 4 %$g2 local 4 %$g3 local 4 %$s1 local 4 %$c1 local 4 %$s2 local 4 %$c2 local 4 %$t_s local 4 %$t_c local 4 alloc pushd ebp, ebx, esi, edi fht_FPU_1st_part: fht_FPU_2nd_part: fht_FPU_3rd_part: .do_init: mov r3, 16 ;k1*fsize = 4*fsize = k4 mov r4, 8 ;kx = k1/2 mov r2, 48 ;k3*fsize mov dword [sp(%$k)], 2 ;k = 2 mov r0, [sp(%$fz)] ;fi lea r1, [r0+8] ;gi = fi + kx .do: .do2: ;f fld dword [r0] fsub dword [r0+r3] fld dword [r0] fadd dword [r0+r3] fld dword [r0+r3*2] fsub dword [r0+r2] fld dword [r0+r3*2] fadd dword [r0+r2] ;f2 f3 f0 f1 fld st2 ;f0 f2 f3 f0 f1 fadd st0, st1 fstp dword [r0] ;fi[0] fld st3 ;f1 f2 f3 f0 f1 fadd st0, st2 fstp dword [r0+r3] ;fi[k1] fsubr st0, st2 ;f0-f2 f3 f0 f1 fstp dword [r0+r3*2] ;fi[k2] fsubr st0, st2 ;f1-f3 f0 f1 fstp dword [r0+r2] ;fi[k3] fcompp ;g fld dword [r1] fsub dword [r1+r3] fld dword [r1] fadd dword [r1+r3] fld dword [D_1_41421] fmul dword [r1+r2] fld dword [D_1_41421] fmul dword [r1+r3*2] ;g2 g3 g0 g1 fld st2 ;g0 g2 g3 g0 g1 fadd st0, st1 fstp dword [r1] ;gi[0] fld st3 ;g1 g2 g3 g0 g1 fadd st0, st2 fstp dword [r1+r3] ;gi[k1] fsubr st0, st2 ;g0-g2 g3 g0 g1 fstp dword [r1+r3*2] ;gi[k2] fsubr st0, st2 ;g1-g3 g0 g1 fstp dword [r1+r2] ;gi[k3] fcompp lea r0, [r0+r3*4] lea r1, [r1+r3*4] cmp r0, r6 jb .do2 mov r0, [sp(%$k)] fld dword [costab_fft +r0*4] fstp dword [sp(%$t_c)] fld dword [sintab_fft +r0*4] fstp dword [sp(%$t_s)] fld dword [D_1_0] fstp dword [sp(%$c1)] fld dword [D_0_0] fstp dword [sp(%$s1)] .for_init: mov r5, 4 ;i = 1*fsize .for: fld dword [sp(%$c1)] fmul dword [sp(%$t_c)] fld dword [sp(%$s1)] fmul dword [sp(%$t_s)] fsubp st1, st0 ;c1 fld dword [sp(%$c1)] fmul dword [sp(%$t_s)] fld dword [sp(%$s1)] fmul dword [sp(%$t_c)] faddp st1, st0 ;s1 c1 fld st1 fmul st0, st0 ;c1c1 s1 c1 fld st1 fmul st0, st0 ;s1s1 c1c1 s1 c1 fsubp st1, st0 ;c2 s1 c1 fstp dword [sp(%$c2)] ;s1 c1 fld st1 ;c1 s1 c1 fmul st0, st1 ;c1s1 s1 c1 fadd st0, st0 ;s2 s1 c1 fstp dword [sp(%$s2)] ;s1 c1 fstp dword [sp(%$s1)] ;c1 fstp dword [sp(%$c1)] ; mov r0, [sp(%$fz)] add r0, r5 ;r0 = fi mov r1, [sp(%$fz)] add r1, r3 sub r1, r5 ;r1 = gi .do3: fld dword [sp(%$s2)] fmul dword [r0+r3] fld dword [sp(%$c2)] fmul dword [r1+r3] fsubp st1, st0 ;b = s2*fi[k1] - c2*gi[k1] fld dword [sp(%$c2)] fmul dword [r0+r3] fld dword [sp(%$s2)] fmul dword [r1+r3] faddp st1, st0 ;a = c2*fi[k1] + s2*gi[k1] b fld dword [r0] fsub st0, st1 ;f1 a b fstp dword [sp(%$f1)] ;a b fadd dword [r0] ;f0 b fstp dword [sp(%$f0)] ;b fld dword [r1] fsub st0, st1 ;g1 b fstp dword [sp(%$g1)] ;b fadd dword [r1] ;g0 fstp dword [sp(%$g0)] ; fld dword [sp(%$s2)] fmul dword [r0+r2] fld dword [sp(%$c2)] fmul dword [r1+r2] fsubp st1, st0 ;b = s2*fi[k3] - c2*gi[k3] fld dword [sp(%$c2)] fmul dword [r0+r2] fld dword [sp(%$s2)] fmul dword [r1+r2] faddp st1, st0 ;a = c2*fi[k3] + s2*gi[k3] b fld dword [r0+r3*2] fsub st0, st1 ;f3 a b fstp dword [sp(%$f3)] ;a b fadd dword [r0+r3*2] ;f2 b fstp dword [sp(%$f2)] ;b fld dword [r1+r3*2] fsub st0, st1 ;g3 b fstp dword [sp(%$g3)] ;b fadd dword [r1+r3*2] ;g2 fstp dword [sp(%$g2)] ; fld dword [sp(%$s1)] fmul dword [sp(%$f2)] fld dword [sp(%$c1)] fmul dword [sp(%$g3)] fsubp st1, st0 ;b = s1*f2 - c1*g3 fld dword [sp(%$c1)] fmul dword [sp(%$f2)] fld dword [sp(%$s1)] fmul dword [sp(%$g3)] faddp st1, st0 ;a = c1*f2 + s1*g3 b fld dword [sp(%$f0)] fsub st0, st1 ;fi[k2] a b fstp dword [r0+r3*2] fadd dword [sp(%$f0)] ;fi[0] b fstp dword [r0] fld dword [sp(%$g1)] fsub st0, st1 ;gi[k3] b fstp dword [r1+r2] fadd dword [sp(%$g1)] ;gi[k1] fstp dword [r1+r3] fld dword [sp(%$c1)] fmul dword [sp(%$g2)] fld dword [sp(%$s1)] fmul dword [sp(%$f3)] fsubp st1, st0 ;b = c1*g2 - s1*f3 fld dword [sp(%$s1)] fmul dword [sp(%$g2)] fld dword [sp(%$c1)] fmul dword [sp(%$f3)] faddp st1, st0 ;a = s1*g2 + c1*f3 b fld dword [sp(%$g0)] fsub st0, st1 ;gi[k2] a b fstp dword [r1+r3*2] fadd dword [sp(%$g0)] ;gi[0] b fstp dword [r1] fld dword [sp(%$f1)] fsub st0, st1 ;fi[k3] b fstp dword [r0+r2] fadd dword [sp(%$f1)] ;fi[k1] fstp dword [r0+r3] lea r0, [r0+r3*4] lea r1, [r1+r3*4] cmp r0, r6 jb near .do3 add r5, 4 cmp r5, r4 jb near .for cmp r3, [sp(%$n)] jae .exit add dword [sp(%$k)], 2 ;k += 2; lea r3, [r3*4] ;k1 *= 4 lea r2, [r2*4] ;k3 *= 4 lea r4, [r4*4] ;kx *= 4 mov r0, [sp(%$fz)] ;fi lea r1, [r0+r4] ;gi = fi + kx jmp .do .exit: popd ebp, ebx, esi, edi endproc ;************************************************************* ;void fht_FPU_FXCH(float *fz, int n); proc fht_FPU_FXCH %$fz arg 4 %$n arg 4 %$k local 4 %$f0 local 4 %$f1 local 4 %$f2 local 4 %$f3 local 4 %$g0 local 4 %$g1 local 4 %$g2 local 4 %$g3 local 4 %$s1 local 4 %$c1 local 4 %$s2 local 4 %$c2 local 4 %$t_s local 4 %$t_c local 4 alloc pushd ebp, ebx, esi, edi fht_FPU_FXCH_1st_part: fht_FPU_FXCH_2nd_part: fht_FPU_FXCH_3rd_part: .do_init: mov r3, 16 ;k1*fsize = 4*fsize = k4 mov r4, 8 ;kx = k1/2 mov r2, 48 ;k3*fsize mov dword [sp(%$k)], 2 ;k = 2 mov r0, [sp(%$fz)] ;fi lea r1, [r0+8] ;gi = fi + kx .do: .do2: ;f fld dword [r0] fsub dword [r0+r3] fld dword [r0] fadd dword [r0+r3] fld dword [r0+r3*2] fsub dword [r0+r2] fld dword [r0+r3*2] fadd dword [r0+r2] ;f2 f3 f0 f1 fld st3 fld st3 fxch st5 fadd st0, st3 fxch st4 fadd st0, st2 fxch st3 fsubp st1, st0 fxch st1 fsubp st4, st0 fxch st2 fstp dword [r0+r3] ;fi[k1] fstp dword [r0] ;fi[0] fstp dword [r0+r2] ;fi[k3] fstp dword [r0+r3*2] ;fi[k2] ;g fld dword [r1] fsub dword [r1+r3] fld dword [r1] fadd dword [r1+r3] fld dword [D_1_41421] fmul dword [r1+r2] fld dword [D_1_41421] fmul dword [r1+r3*2] ;g2 g3 g0 g1 fld st3 fld st3 fxch st5 fadd st0, st3 fxch st4 fadd st0, st2 fxch st3 fsubp st1, st0 fxch st1 fsubp st4, st0 fxch st2 fstp dword [r1+r3] ;gi[k1] fstp dword [r1] ;gi[0] fstp dword [r1+r2] ;gi[k3] fstp dword [r1+r3*2] ;gi[k2] lea r0, [r0+r3*4] lea r1, [r1+r3*4] cmp r0, r6 jb .do2 mov r0, [sp(%$k)] fld dword [costab_fft +r0*4] fld dword [sintab_fft +r0*4] fld dword [D_1_0] fld dword [D_0_0] fxch st3 fstp dword [sp(%$t_c)] fxch st1 fstp dword [sp(%$t_s)] fstp dword [sp(%$c1)] fstp dword [sp(%$s1)] .for_init: mov r5, 4 ;i = 1*fsize .for: fld dword [sp(%$c1)] fmul dword [sp(%$t_c)] fld dword [sp(%$s1)] fmul dword [sp(%$t_s)] fld dword [sp(%$c1)] fmul dword [sp(%$t_s)] fld dword [sp(%$s1)] fmul dword [sp(%$t_c)] fxch st2 fsubp st3, st0 ;c1 faddp st1, st0 ;s1 c1 fld st1 fxch st2 fmul st0, st0 ;c1c1 s1 c1 fld st1 fxch st2 fmul st0, st0 ;s1s1 c1c1 s1 c1 fxch st3 fst dword [sp(%$c1)] ;c1 fxch st2 fst dword [sp(%$s1)] ;s1 c1c1 c1 s1s1 fmulp st2, st0 fsubrp st2, st0 fadd st0, st0 ;s2 c2 fxch st1 fstp dword [sp(%$c2)] fstp dword [sp(%$s2)] mov r0, [sp(%$fz)] mov r1, [sp(%$fz)] add r0, r5 ;r0 = fi add r1, r3 sub r1, r5 ;r1 = gi .do3: fld dword [sp(%$s2)] fmul dword [r0+r3] fld dword [sp(%$c2)] fmul dword [r1+r3] fld dword [sp(%$c2)] fmul dword [r0+r3] fld dword [sp(%$s2)] fmul dword [r1+r3] fxch st2 fsubp st3, st0 ;b = s2*fi[k1] - c2*gi[k1] faddp st1, st0 ;a = c2*fi[k1] + s2*gi[k1] b fld dword [r1] fsub st0, st2 ;g1 a b fxch st2 fadd dword [r1] ;g0 a g1 fld dword [r0] fsub st0, st2 ;f1 g0 a g1 fxch st2 fadd dword [r0] ;f0 g0 f1 g1 fxch st3 fstp dword [sp(%$g1)] fstp dword [sp(%$g0)] fstp dword [sp(%$f1)] fstp dword [sp(%$f0)] fld dword [sp(%$s2)] fmul dword [r0+r2] fld dword [sp(%$c2)] fmul dword [r1+r2] fld dword [sp(%$c2)] fmul dword [r0+r2] fld dword [sp(%$s2)] fmul dword [r1+r2] fxch st2 fsubp st3, st0 ;b = s2*fi[k3] - c2*gi[k3] faddp st1, st0 ;a = c2*fi[k3] + s2*gi[k3] b fld dword [r1+r3*2] fsub st0, st2 ;g3 a b fxch st2 fadd dword [r1+r3*2] ;g2 a g3 fld dword [r0+r3*2] fsub st0, st2 ;f3 g2 a g3 fxch st2 fadd dword [r0+r3*2] ;f2 g2 f3 g3 fxch st3 fstp dword [sp(%$g3)] fstp dword [sp(%$g2)] fstp dword [sp(%$f3)] fstp dword [sp(%$f2)] fld dword [sp(%$s1)] fmul dword [sp(%$f2)] fld dword [sp(%$c1)] fmul dword [sp(%$g3)] fld dword [sp(%$c1)] fmul dword [sp(%$f2)] fld dword [sp(%$s1)] fmul dword [sp(%$g3)] fxch st2 fsubp st3, st0 ;b = s1*f2 - c1*g3 faddp st1, st0 ;a = c1*f2 + s1*g3 b fld dword [sp(%$g1)] fsub st0, st2 ;gi[k3] a b fxch st2 fadd dword [sp(%$g1)] ;gi[k1] a gi[k3] fld dword [sp(%$f0)] fsub st0, st2 ;fi[k2] gi[k1] a gi[k3] fxch st2 fadd dword [sp(%$f0)] ;fi[0] gi[k1] fi[k2] gi[k3] fxch st3 fstp dword [r1+r2] fstp dword [r1+r3] fstp dword [r0+r3*2] fstp dword [r0] fld dword [sp(%$c1)] fmul dword [sp(%$g2)] fld dword [sp(%$s1)] fmul dword [sp(%$f3)] fld dword [sp(%$s1)] fmul dword [sp(%$g2)] fld dword [sp(%$c1)] fmul dword [sp(%$f3)] fxch st2 fsubp st3, st0 ;b = c1*g2 - s1*f3 faddp st1, st0 ;a = s1*g2 + c1*f3 b fld dword [sp(%$f1)] fsub st0, st2 ;fi[k3] a b fxch st2 fadd dword [sp(%$f1)] ;fi[k1] a fi[k3] fld dword [sp(%$g0)] fsub st0, st2 ;gi[k2] fi[k1] a fi[k3] fxch st2 fadd dword [sp(%$g0)] ;gi[0] fi[k1] gi[k2] fi[k3] fxch st3 fstp dword [r0+r2] fstp dword [r0+r3] fstp dword [r1+r3*2] fstp dword [r1] lea r0, [r0+r3*4] lea r1, [r1+r3*4] cmp r0, r6 jb near .do3 add r5, 4 cmp r5, r4 jb near .for cmp r3, [sp(%$n)] jae .exit add dword [sp(%$k)], 2 ;k += 2; lea r3, [r3*4] ;k1 *= 4 lea r2, [r2*4] ;k3 *= 4 lea r4, [r4*4] ;kx *= 4 mov r0, [sp(%$fz)] ;fi lea r1, [r0+r4] ;gi = fi + kx jmp .do .exit: popd ebp, ebx, esi, edi endproc end ================================================ FILE: samples/Assembly/forth.nasm ================================================ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; A Forth by Chris Hinsley ;; nasm -f macho forth.nasm ;; ld -o forth -e _main forth.o ;; ./forth ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %define VERSION_NUM 30 ; various buffer area sizes %define DATA_STACK_SIZE 1024 %define USER_DEFS_SIZE (64*1024) %define NUM_HASH_CHAINS 64 %define MAX_LINE_SIZE 128 %define SYS_exit 1 %define SYS_read 3 %define SYS_write 4 %define SYS_open 5 %define SYS_close 6 %define SYS_unlink 10 %define SYS_mprotect 74 %define SYS_fsync 95 %define SYS_rename 128 %define SYS_stat 188 %define SYS_lseek 199 %define SYS_fstat 189 %define SYS_ftruncate 201 %define PROT_READ 0x01 ;pages can be read %define PROT_WRITE 0x02 ;pages can be written %define PROT_EXEC 0x04 ;pages can be executed %define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC) %define PAGE_SIZE 4096 ;;;;;;;;;;;;;;;;;;;;;;;;;; ; some NASM codeing macros ;;;;;;;;;;;;;;;;;;;;;;;;;; %macro loopstart 0 %push loopstart %$loop_start: %endmacro %macro break 0 jmp %$loop_exit %endmacro %macro breakif 1 j%+1 %$loop_exit %endmacro %macro loopend 0 jmp %$loop_start %$loop_exit: %pop %endmacro %macro repeat 0 %push repeat %$loop_start: %endmacro %macro until 1 j%-1 %$loop_start %$loop_exit: %pop %endmacro %macro if 1 %push if j%-1 %$ifnot %endmacro %macro else 0 %ifctx if %repl else jmp %$ifend %$ifnot: %else %error "expected `if' before `else'" %endif %endmacro %macro endif 0 %ifctx if %$ifnot: %pop %elifctx else %$ifend: %pop %else %error "expected `if' or `else' before `endif'" %endif %endmacro ;;;;;;;;;;;;;;;; ; base VM macros ;;;;;;;;;;;;;;;; ; eip Forths IP ; esp Forths R ; ebp Forths S ; ebx Forths TOS ; push on to return stack %macro PUSHRSP 1 push %1 %endm ; pop top of return stack %macro POPRSP 1 pop %1 %endm ; save into return stack %macro PUTRSP 2 %if (%2 = 0) mov [esp], %1 %elif ((%2 >= -128) && (%2 < 128)) mov [byte esp + %2], %1 %else mov [long esp + %2], %1 %endif %endm ; load from return stack %macro PICKRSP 2 %if (%2 = 0) mov %1, [esp] %elif ((%2 >= -128) && (%2 < 128)) mov %1, [byte esp + %2] %else mov %1, [long esp + %2] %endif %endm ; set return stack %macro SETRSP 1 mov esp, %1 %endm ; get return stack %macro GETRSP 1 mov %1, esp %endm ; adjust return stack %macro ADDRSP 1 %if ((%1 >= -128) && (%1 < 128)) add esp, byte %1 %else add esp, %1 %endif %endm ; push on to data stack %macro PUSHDSP 1 sub ebp, byte 4 mov [ebp], %1 %endm ; pop top of data stack %macro POPDSP 1 mov %1, [ebp] add ebp, byte 4 %endm ; save into data stack %macro PUTDSP 2 %if (%2 = 0) mov [ebp], %1 %elif ((%2 >= -128) && (%2 < 128)) mov [byte ebp + %2], %1 %else mov [long ebp + %2], %1 %endif %endm ; load from data stack %macro PICKDSP 2 %if (%2 = 0) mov %1, [ebp] %elif ((%2 >= -128) && (%2 < 128)) mov %1, [byte ebp + %2] %else mov %1, [long ebp + %2] %endif %endm ; set data stack %macro SETDSP 1 mov ebp, %1 %endm ; get data stack %macro GETDSP 1 mov %1, ebp %endm ; adjust data stack %macro ADDDSP 1 %if ((%1 >= -128) && (%1 < 128)) add ebp, byte %1 %else add ebp, %1 %endif %endm ; load value onto data stack %macro LOADTOS 1 PUSHDSP ebx mov ebx, %1 %endm ; move from data to return stack %macro TORSP 0 PUSHRSP ebx POPDSP ebx %endm ; move from return to data stack %macro FROMRSP 0 PUSHDSP ebx POPRSP ebx %endm ; copy from return to data stack %macro FETCHRSP 0 PUSHDSP ebx PICKRSP ebx, 0 %endm ; align reg %define DP_ALIGN 3 %macro ALIGNREG 1 add %1, byte DP_ALIGN and %1, byte ~DP_ALIGN %endm ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; dictionary building macros ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; format of dictionary entry flag byte %define F_IMMED 0x80 %define F_HIDDEN 0x20 %define F_LENMASK 0x1f %define NULL 0 %define H_LLINK 0 %define H_HLINK 4 %define H_NSIZE 8 %define H_NAME 9 %define XT_BODY -12 %define XT_LENGTH -8 %define XT_COMPILE -4 %define XT_SIZE 12 %macro defword 4 %push newword %strlen len %1 align 4 dic_%3: dd NULL ; LATEST list link dd NULL ; hash chain link db len + %2 ; flags + length byte db %1 ; the name dd %3 ; body pointer dd %$code_end - %3 ; code length dd %4 ; compile action word %3: %endm ; assembler code follows %macro defword_end 0 %$code_end: %pop %endm %macro defvar 4 defword %1, %2, %3, WORD_INLINE_COMMA LOADTOS var_%3 ret defword_end align 4 var_%3: dd %4 %endm %macro defvar2 5 defword %1, %2, %3, WORD_INLINE_COMMA LOADTOS var_%3 ret defword_end align 4 var_%3: dd %4 dd %5 %endm %macro defconst 4 defword %1, %2, %3, WORD_INLINE_COMMA LOADTOS %4 ret defword_end %endm ;;;;;;;;;;;;;;;;;;;;;;;;;; ; entry point ;;;;;;;;;;;;;;;;;;;;;;;;;; SECTION .text global _main _main: ; use mprotect to allow read/write/execute of the data section mov edx, forth_start and edx, -PAGE_SIZE ;start address mov ecx, forth_end sub ecx, edx ;length mov ebx, PROT_ALL ;flags push ebx push ecx push edx push 0 ;padding mov eax, SYS_mprotect int 0x80 add esp, 16 jmp forth_start SECTION .data forth_start: ; init data and return stacks, saving initial positions ; in Forth vars R0 and S0 cld GETRSP [var_WORD_SZ] SETDSP [var_WORD_SZ] ADDRSP -DATA_STACK_SIZE GETRSP [var_WORD_RZ] ; link built in dictionary mov esi, dictionary_start xor edi, edi repeat lodsd mov [eax + H_LLINK], edi mov edi, eax push esi mov cl, [eax + H_NSIZE] and ecx, F_LENMASK lea esi, [eax + H_NAME] call strhashi and ebx, NUM_HASH_CHAINS-1 mov esi, hash_buckets mov eax, [esi + (ebx * 4)] mov [esi + (ebx * 4)], edi mov [edi + H_HLINK], eax pop esi cmp esi, dictionary_end until z mov [var_WORD_LATEST], edi ; run temp interpreter loop till we can get into the real QUIT word call WORD_LBRAC ; interpret state LOADTOS 666q ; octal ! TORSP LOADTOS 0 TORSP LOADTOS bootfile TORSP call WORD_SYS_OPEN call WORD_SYSCALL ADDRSP 12 TORSP ; ( fd ) of "forth.f" loopstart LOADTOS tib_buffer LOADTOS MAX_LINE_SIZE FETCHRSP ; ( c-addr len fd ) call WORD_READLINE ; ( num flag flag ) call WORD_DROP2 LOADTOS tib_buffer call WORD_SWAP call WORD_INHASH call WORD_STORE2 LOADTOS 0 call WORD_TOIN call WORD_STORE call WORD_INTERPRET loopend ; and loop till QUIT takes over ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; a few case insensative string operations ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %macro to_lower 1 ; lower case check cmp %1, 'A' if ge cmp %1, 'Z' if le ; make it lower case add %1, byte 'a' - 'A' endif endif %endm strcpyi: test ecx, ecx if nz strcpyi_l1: lodsb to_lower al stosb loop strcpyi_l1 endif ret strcmpi: test ecx, ecx if nz strcmpi_l1: lodsb mov bl, [edi] lea edi, [edi + 1] to_lower al to_lower bl cmp bl, al if z loop strcmpi_l1 endif endif ret ;;;;;;;;;;;;;;; ; hash function ;;;;;;;;;;;;;;; strhashi: mov ebx, 5381 test ecx, ecx if nz mov edx, 33 strhashi_l1: lodsb movzx eax, al to_lower eax imul ebx, edx add ebx, eax loop strhashi_l1 endif ret ;;;;;;;;;;;;;;;;;;; ; syscall functions ;;;;;;;;;;;;;;;;;;; _syscall: int 0x80 if c neg eax endif ret _lsyscall: int 0x80 if c not eax not edx add eax, 1 adc edx, 0 endif ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; built in variables ; STATE Is the interpreter executing code (0) or compiling a word (non-zero)? ; LATEST Points to the latest (most recently defined) word in the dictionary. ; DP Points to the next free byte of memory. When compiling, compiled words go here. ; S0 Stores the address of the top of the parameter stack. ; R0 The address of the top of the return stack. ; BASE The current base for printing and reading numbers. ; #IN The current input buffer descriptor. ; >IN The current input offset. ; SOURCEFD The current input source file descriptor. ; BLK The current block number. ; CHARBUF Single char buffer. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; defvar "state", 0, WORD_STATE, 0 defvar "dp", 0, WORD_DP, dictionary_start defvar "latest", 0, WORD_LATEST, 0 defvar "s0", 0, WORD_SZ, 0 defvar "r0", 0, WORD_RZ, 0 defvar "base", 0, WORD_BASE, 10 defvar2 "#IN", 0, WORD_INHASH, 0, 0 defvar ">in", 0, WORD_TOIN, 0 defvar "sourcefd", 0, WORD_SOURCEFD, 0 defvar "blk", 0, WORD_BLK, 0 defvar "charbuf", 0, WORD_CHARBUF, 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; built in constants ; VERSION The current version of this FORTH. ; WORDBUF The address of the buffer WORD uses. ; LINESIZE The line buffer size. ; F_IMMED The IMMEDIATE flag's actual value. ; F_HIDDEN The HIDDEN flag's actual value. ; F_LENMASK The length mask in the flags/len byte. ; H_NSIZE The flags/len field offset. ; H_NAME The name field offset. ; XT_BODY The xt body pointer. ; XT_LENGTH The xt length field offset. ; XT_COMPILE The xt compile field offset. ; XT_SIZE The xt size offset. ; SYS_* The numeric codes of various syscalls. ; O_* Various sycall flags/modes. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; defconst "version", 0, WORD_VERSION, VERSION_NUM defconst "wordbuf", 0, WORD_WORDBUF, word_buf defconst "linesize", 0, WORD_LINESIZE, MAX_LINE_SIZE defconst "f_immed", 0, WORD__F_IMMED, F_IMMED defconst "f_hidden", 0, WORD__F_HIDDEN, F_HIDDEN defconst "f_lenmask", 0, WORD__F_LENMASK, F_LENMASK defconst "h_nsize", 0, WORD__H_NSIZE, H_NSIZE defconst "h_name", 0, WORD__H_NAME, H_NAME defconst "xt_body", 0, WORD__XT_BODY, XT_BODY defconst "xt_length", 0, WORD__XT_LENGTH, XT_LENGTH defconst "xt_compile", 0, WORD__XT_COMPILE, XT_COMPILE defconst "xt_size", 0, WORD__XT_SIZE, XT_SIZE defconst "sys_exit", 0, WORD_SYS_EXIT, SYS_exit defconst "sys_open", 0, WORD_SYS_OPEN, SYS_open defconst "sys_close", 0, WORD_SYS_CLOSE, SYS_close defconst "sys_read", 0, WORD_SYS_READ, SYS_read defconst "sys_write", 0, WORD_SYS_WRITE, SYS_write defconst "sys_unlink", 0, WORD_SYS_UNLINK, SYS_unlink defconst "sys_rename", 0, WORD_SYS_RENAME, SYS_rename defconst "sys_ftruncate", 0, WORD_SYS_FTRUNCATE, SYS_ftruncate defconst "sys_fsync", 0, WORD_SYS_FSYNC, SYS_fsync defconst "sys_lseek", 0, WORD_SYS_LSEEK, SYS_lseek defconst "sys_fstat", 0, WORD_SYS_FSTAT, SYS_fstat defconst "sys_stat", 0, WORD_SYS_STAT, SYS_stat defconst "o_rdonly", 0, WORD_O_RDONLY, 0x0 defconst "o_wronly", 0, WORD_O_WRONLY, 0x1 defconst "o_rdwr", 0, WORD_O_RDWR, 0x2 defconst "o_creat", 0, WORD_O_CREAT, 0x100 defconst "o_excl", 0, WORD_O_EXCL, 0x200 defconst "o_trunc", 0, WORD_O_TRUNC, 0x1000 defconst "o_append", 0, WORD_O_APPEND, 0x2000 defconst "o_nonblock", 0, WORD_O_NONBLOCK, 0x4000 ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; data stack ordering words ;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "dsp@", 0, WORD_DSPFETCH, WORD_INLINE_COMMA PUSHDSP ebx GETDSP ebx ret defword_end defword "dsp!", 0, WORD_DSPSTORE, WORD_INLINE_COMMA SETDSP ebx POPDSP ebx ret defword_end defword "drop", 0, WORD_DROP, WORD_INLINE_COMMA POPDSP ebx ret defword_end defword "swap", 0, WORD_SWAP, WORD_INLINE_COMMA xchg ebx, [ebp] ret defword_end defword "dup", 0, WORD_DUP, WORD_INLINE_COMMA PUSHDSP ebx ret defword_end defword "over", 0, WORD_OVER, WORD_INLINE_COMMA PUSHDSP ebx PICKDSP ebx, 4 ret defword_end defword "rot", 0, WORD_ROT, WORD_INLINE_COMMA mov eax, ebx PICKDSP ecx, 0 PICKDSP ebx, 4 PUTDSP eax, 0 PUTDSP ecx, 4 ret defword_end defword "-rot", 0, WORD_NROT, WORD_INLINE_COMMA mov eax, ebx PICKDSP ebx, 0 PICKDSP ecx, 4 PUTDSP ecx, 0 PUTDSP eax, 4 ret defword_end defword "2drop", 0, WORD_DROP2, WORD_INLINE_COMMA PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "2dup", 0, WORD_DUP2, WORD_INLINE_COMMA PICKDSP eax, 0 ADDDSP -8 PUTDSP eax, 0 PUTDSP ebx, 4 ret defword_end defword "2swap", 0, WORD_SWAP2, WORD_INLINE_COMMA mov eax, ebx PICKDSP ecx, 0 PICKDSP ebx, 4 PICKDSP edx, 8 PUTDSP edx, 0 PUTDSP eax, 4 PUTDSP ecx, 8 ret defword_end defword "2rot", 0, WORD_ROT2, WORD_INLINE_COMMA mov eax, ebx PICKDSP ecx, 16 PICKDSP ebx, 12 PICKDSP edx, 8 PICKDSP edi, 4 PICKDSP esi, 0 PUTDSP edx, 16 PUTDSP edi, 12 PUTDSP esi, 8 PUTDSP eax, 4 PUTDSP ecx, 0 ret defword_end defword "?dup", 0, WORD_QDUP, WORD_INLINE_COMMA test ebx, ebx if nz PUSHDSP ebx endif ret defword_end defword "!?dup", 0, WORD_NQDUP, WORD_INLINE_COMMA test ebx, ebx if z PUSHDSP ebx endif ret defword_end defword "nip", 0, WORD_NIP, WORD_INLINE_COMMA ADDDSP 4 ret defword_end defword "tuck", 0, WORD_TUCK, WORD_INLINE_COMMA PICKDSP eax, 0 PUTDSP ebx, 0 PUSHDSP eax ret defword_end defword "pick", 0, WORD_PICK, WORD_INLINE_COMMA mov ebx, [ebp + (ebx * 4)] ret defword_end defword "2tuck", 0, WORD_TUCK2, WORD_INLINE_COMMA PICKDSP eax, 0 PICKDSP ecx, 4 PICKDSP edx, 8 ADDDSP -8 PUTDSP eax, 0 PUTDSP ecx, 4 PUTDSP edx, 8 PUTDSP ebx, 12 PUTDSP eax, 16 ret defword_end defword "2nip", 0, WORD_NIP2, WORD_INLINE_COMMA PICKDSP eax, 0 ADDDSP 8 PUTDSP eax, 0 ret defword_end defword "2over", 0, WORD_OVER2, WORD_INLINE_COMMA ADDDSP -8 PUTDSP ebx, 4 PICKDSP ebx, 16 PUTDSP ebx, 0 PICKDSP ebx, 12 ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; return stack ordering words ;;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword ">r", 0, WORD_TOR, WORD_INLINE_COMMA TORSP ret defword_end defword "r>", 0, WORD_FROMR, WORD_INLINE_COMMA FROMRSP ret defword_end defword "2>r", 0, WORD_TOR2, WORD_INLINE_COMMA ADDRSP -8 PICKDSP ecx, 0 PUTRSP ebx, 0 PUTRSP ecx, 4 PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "2r>", 0, WORD_FROMR2, WORD_INLINE_COMMA ADDDSP -8 PUTDSP ebx, 4 PICKRSP ebx, 0 PICKRSP ecx, 4 PUTDSP ecx, 0 ADDRSP 8 ret defword_end defword "rsp@", 0, WORD_RSPFETCH, WORD_INLINE_COMMA PUSHDSP ebx GETRSP ebx ret defword_end defword "r@", 0, WORD_RFETCH, WORD_INLINE_COMMA PUSHDSP ebx PICKRSP ebx, 0 ret defword_end defword "r!", 0, WORD_RSTORE, WORD_INLINE_COMMA PUTRSP ebx, 0 POPDSP ebx ret defword_end defword "2r@", 0, WORD_RFETCH2, WORD_INLINE_COMMA ADDDSP -8 PUTDSP ebx, 4 PICKRSP ebx, 4 PICKRSP ecx, 0 PUTDSP ecx, 0 ret defword_end defword "rsp!", 0, WORD_RSPSTORE, WORD_INLINE_COMMA SETRSP ebx POPDSP ebx ret defword_end defword "rdrop", 0, WORD_RDROP, WORD_INLINE_COMMA ADDRSP 4 ret defword_end defword "2rdrop", 0, WORD_RDROP2, WORD_INLINE_COMMA ADDRSP 8 ret defword_end defword "n>r", 0, WORD_NTOR, WORD_CALL_COMMA PUSHDSP ebx PICKRSP eax, 0 mov ecx, ebx inc ecx neg ebx lea esp, [esp + (ebx * 4)] mov esi, ebp mov edi, esp rep movsd mov ebp, esi POPDSP ebx jmp eax defword_end defword "nr>", 0, WORD_NFROMR, WORD_CALL_COMMA PUSHDSP ebx POPRSP eax PICKRSP ebx, 0 inc ebx mov ecx, ebx neg ebx lea ebp, [ebp + (ebx * 4)] mov esi, esp mov edi, ebp rep movsd mov esp, esi POPDSP ebx jmp eax defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; memory fetch and store words ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "!", 0, WORD_STORE, WORD_INLINE_COMMA PICKDSP eax, 0 mov [ebx], eax PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "@", 0, WORD_FETCH, WORD_INLINE_COMMA mov ebx, [ebx] ret defword_end defword "+!", 0, WORD_ADDSTORE, WORD_INLINE_COMMA PICKDSP eax, 0 add [ebx], eax PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "-!", 0, WORD_SUBSTORE, WORD_INLINE_COMMA PICKDSP eax, 0 sub [ebx], eax PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "c!", 0, WORD_STOREBYTE, WORD_INLINE_COMMA PICKDSP eax, 0 mov [ebx], al PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "c+!", 0, WORD_ADDBYTE, WORD_INLINE_COMMA PICKDSP eax, 0 add [ebx], al PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "c@", 0, WORD_FETCHBYTE, WORD_INLINE_COMMA mov eax, ebx xor ebx, ebx mov bl, [eax] ret defword_end defword "w!", 0, WORD_STORESHORT, WORD_INLINE_COMMA PICKDSP eax, 0 mov [ebx], ax PICKDSP ebx, 4 ADDDSP 8 ret defword_end defword "w@", 0, WORD_FETCHSHORT, WORD_INLINE_COMMA mov eax, ebx xor ebx, ebx mov bx, [eax] ret defword_end defword "2!", 0, WORD_STORE2, WORD_INLINE_COMMA PICKDSP ecx, 4 PICKDSP edx, 0 mov [ebx + 4], ecx mov [ebx], edx PICKDSP ebx, 8 ADDDSP 12 ret defword_end defword "2@", 0, WORD_FETCH2, WORD_INLINE_COMMA ADDDSP -4 mov ecx, [ebx +4] mov ebx, [ebx] PUTDSP ecx, 0 ret defword_end defword "blank", 0, WORD_BLANK, WORD_CALL_COMMA mov ecx, ebx PICKDSP ebx, 4 PICKDSP edi, 0 ADDDSP 8 mov eax, 0x20 rep stosb ret defword_end defword "erase", 0, WORD_ERASE, WORD_CALL_COMMA mov ecx, ebx PICKDSP ebx, 4 PICKDSP edi, 0 ADDDSP 8 xor eax, eax rep stosb ret defword_end defword "fill", 0, WORD_FILL, WORD_CALL_COMMA mov eax, ebx PICKDSP ebx, 8 PICKDSP edi, 4 PICKDSP ecx, 0 ADDDSP 12 rep stosb ret defword_end defword "cmove>", 0, WORD_CMOVEB, WORD_CALL_COMMA mov ecx, ebx PICKDSP ebx, 8 PICKDSP esi, 4 PICKDSP edi, 0 ADDDSP 12 lea esi, [esi + ecx - 1] lea edi, [edi + ecx - 1] std rep movsb cld ret defword_end defword "cmove", 0, WORD_CMOVE, WORD_CALL_COMMA mov ecx, ebx PICKDSP ebx, 8 PICKDSP esi, 4 PICKDSP edi, 0 ADDDSP 12 rep movsb ret defword_end defword "move", 0, WORD_MOVE, WORD_CALL_COMMA mov ecx, ebx PICKDSP ebx, 8 PICKDSP esi, 4 PICKDSP edi, 0 ADDDSP 12 cmp esi, edi if a rep movsb else lea esi, [esi + ecx -1] lea edi, [edi + ecx -1] std rep movsb cld endif ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; single precision alu words ;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "+", 0, WORD_ADD, WORD_INLINE_COMMA add ebx, [ebp] ADDDSP 4 ret defword_end defword "-", 0, WORD_SUB, WORD_INLINE_COMMA mov eax, ebx POPDSP ebx sub ebx, eax ret defword_end defword "*", 0, WORD_MULL, WORD_INLINE_COMMA imul ebx, [ebp] ADDDSP 4 ret defword_end defword "/", 0, WORD_DIV, WORD_INLINE_COMMA POPDSP eax cdq idiv ebx mov ebx, eax ret defword_end defword "mod", 0, WORD_MOD, WORD_INLINE_COMMA POPDSP eax cdq idiv ebx mov ebx, edx ret defword_end defword "1+", 0, WORD_INCR, WORD_INLINE_COMMA add ebx, byte 1 ret defword_end defword "1-", 0, WORD_DECR, WORD_INLINE_COMMA sub ebx, byte 1 ret defword_end defword "4+", 0, WORD_INCR4, WORD_INLINE_COMMA add ebx, byte 4 ret defword_end defword "4-", 0, WORD_DECR4, WORD_INLINE_COMMA sub ebx, byte 4 ret defword_end defword "2+", 0, WORD_INCR2, WORD_INLINE_COMMA add ebx, byte 2 ret defword_end defword "2-", 0, WORD_DECR2, WORD_INLINE_COMMA sub ebx, byte 2 ret defword_end defword "2*", 0, WORD_TWOMUL, WORD_INLINE_COMMA shl ebx, byte 1 ret defword_end defword "2/", 0, WORD_TWODIV, WORD_INLINE_COMMA sar ebx, byte 1 ret defword_end defword "abs", 0, WORD_ABS, WORD_INLINE_COMMA mov eax, ebx sar eax, byte 31 add ebx, eax xor ebx, eax ret defword_end defword "min", 0, WORD_MIN, WORD_INLINE_COMMA POPDSP eax cmp ebx, eax if g mov ebx, eax endif ret defword_end defword "max", 0, WORD_MAX, WORD_INLINE_COMMA POPDSP eax cmp ebx, eax if l mov ebx, eax endif ret defword_end defword "lshift", 0, WORD_LSHIFT, WORD_INLINE_COMMA mov ecx, ebx POPDSP ebx shl ebx, cl ret defword_end defword "rshift", 0, WORD_RSHIFT, WORD_INLINE_COMMA mov ecx, ebx POPDSP ebx shr ebx, cl ret defword_end defword "and", 0, WORD_AND, WORD_INLINE_COMMA and ebx, [ebp] ADDDSP 4 ret defword_end defword "or", 0, WORD_OR, WORD_INLINE_COMMA or ebx, [ebp] ADDDSP 4 ret defword_end defword "xor", 0, WORD_XOR, WORD_INLINE_COMMA xor ebx, [ebp] ADDDSP 4 ret defword_end defword "negate", 0, WORD_NEGATE, WORD_INLINE_COMMA neg ebx ret defword_end defword "invert", 0, WORD_INVERT, WORD_INLINE_COMMA not ebx ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; single precision comparision words ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "=", 0, WORD_EQ, WORD_INLINE_COMMA cmp [ebp], ebx sete bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "<>", 0, WORD_NE, WORD_INLINE_COMMA cmp [ebp], ebx setne bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "<", 0, WORD_LT, WORD_INLINE_COMMA cmp [ebp], ebx setl bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword ">", 0, WORD_GT, WORD_INLINE_COMMA cmp [ebp], ebx setg bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "u<", 0, WORD_ULT, WORD_INLINE_COMMA cmp [ebp], ebx setb bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "u>", 0, WORD_UGT, WORD_INLINE_COMMA cmp [ebp], ebx seta bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "u<=", 0, WORD_ULTEQ, WORD_INLINE_COMMA cmp [ebp], ebx setbe bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "u>=", 0, WORD_UGTEQ, WORD_INLINE_COMMA cmp [ebp], ebx setae bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "<=", 0, WORD_LTEQ, WORD_INLINE_COMMA cmp [ebp], ebx setle bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword ">=", 0, WORD_GTEQ, WORD_INLINE_COMMA cmp [ebp], ebx setge bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "0=", 0, WORD_ZEQ, WORD_INLINE_COMMA test ebx, ebx setz bl movzx ebx, bl neg ebx ret defword_end defword "0<>", 0, WORD_ZNE, WORD_INLINE_COMMA test ebx, ebx setnz bl movzx ebx, bl neg ebx ret defword_end defword "0<", 0, WORD_ZLT, WORD_INLINE_COMMA test ebx, ebx setl bl movzx ebx, bl neg ebx ret defword_end defword "0>", 0, WORD_ZGT, WORD_INLINE_COMMA test ebx, ebx setg bl movzx ebx, bl neg ebx ret defword_end defword "0<=", 0, WORD_ZLTEQ, WORD_INLINE_COMMA test ebx, ebx setle bl movzx ebx, bl neg ebx ret defword_end defword "0>=", 0, WORD_ZGTEQ, WORD_INLINE_COMMA test ebx, ebx setge bl movzx ebx, bl neg ebx ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; double precision ALU words ;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "s>d", 0, WORD_STOD, WORD_INLINE_COMMA mov eax, ebx cdq PUSHDSP eax mov ebx, edx ret defword_end defword "d>s", 0, WORD_DTOS, WORD_INLINE_COMMA POPDSP ebx ret defword_end defword "d+", 0, WORD_DPLUS, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP edx, 4 PICKDSP eax, 0 add eax, ecx adc ebx, edx PUTDSP eax, 8 ADDDSP 8 ret defword_end defword "d-", 0, WORD_DMINUS, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP edx, 4 PICKDSP eax, 0 sub ecx, eax sbb edx, ebx PUTDSP ecx, 8 mov ebx, edx ADDDSP 8 ret defword_end defword "d2*", 0, WORD_D2STAR, WORD_INLINE_COMMA PICKDSP eax, 0 shl eax, 1 rcl ebx, 1 PUTDSP eax, 0 ret defword_end defword "d2/", 0, WORD_D2SLASH, WORD_INLINE_COMMA PICKDSP eax, 0 sar ebx, 1 rcr eax, 1 PUTDSP eax, 0 ret defword_end defword "*/", 0, WORD_MULDIV, WORD_INLINE_COMMA PICKDSP edx, 4 PICKDSP eax, 0 imul edx idiv ebx mov ebx, eax ADDDSP 8 ret defword_end defword "*/mod", 0, WORD_STARSMOD, WORD_INLINE_COMMA PICKDSP edx, 4 PICKDSP eax, 0 imul edx idiv ebx PUTDSP edx, 4 ADDDSP 4 mov ebx, eax ret defword_end defword "/mod", 0, WORD_DIVMOD, WORD_INLINE_COMMA PICKDSP eax, 0 cdq idiv ebx PUTDSP edx, 0 mov ebx, eax ret defword_end defword "dnegate", 0, WORD_DNEGATE, WORD_INLINE_COMMA PICKDSP eax, 0 not eax not ebx add eax, 1 adc ebx, 0 PUTDSP eax, 0 ret defword_end defword "dabs", 0, WORD_DABS, WORD_INLINE_COMMA test ebx, ebx if l PICKDSP eax, 0 not eax not ebx add eax, 1 adc ebx, 0 PUTDSP eax, 0 endif ret defword_end defword "dmax", 0, WORD_DMAX, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP edx, 4 PICKDSP eax, 0 ADDDSP 8 mov esi, ecx mov edi, edx sub esi, eax sbb edi, ebx if l PUTDSP eax, 0 else mov ebx, edx endif ret defword_end defword "dmin", 0, WORD_DMIN, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP edx, 4 PICKDSP eax, 0 ADDDSP 8 mov esi, ecx mov edi, edx sub esi, eax sbb edi, ebx if ge PUTDSP eax, 0 else mov ebx, edx endif ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; double precision comparision words ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "d0=", 0, WORD_DZEQ, WORD_INLINE_COMMA or ebx, [ebp] setz bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "d0<>", 0, WORD_DZNEQ, WORD_INLINE_COMMA or ebx, [ebp] setnz bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "d0<", 0, WORD_DZLT, WORD_INLINE_COMMA test ebx, ebx setl bl ADDDSP 4 movzx ebx, bl neg ebx ret defword_end defword "d=", 0, WORD_DEQ, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP eax, 4 sub ecx, [ebp] sbb eax, ebx setz bl ADDDSP 12 movzx ebx, bl neg ebx ret defword_end defword "d<>", 0, WORD_DNEQ, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP eax, 4 sub ecx, [ebp] sbb eax, ebx setnz bl ADDDSP 12 movzx ebx, bl neg ebx ret defword_end defword "d<", 0, WORD_DLT, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP eax, 4 sub ecx, [ebp] sbb eax, ebx setl bl ADDDSP 12 movzx ebx, bl neg ebx ret defword_end defword "du<", 0, WORD_DULT, WORD_INLINE_COMMA PICKDSP ecx, 8 PICKDSP eax, 4 sub ecx, [ebp] sbb eax, ebx setb bl ADDDSP 12 movzx ebx, bl neg ebx ret defword_end ;;;;;;;;;;;;;;;;;;;;;;; ; mixed precision words ;;;;;;;;;;;;;;;;;;;;;;; defword "m+", 0, WORD_MPLUS, WORD_INLINE_COMMA PICKDSP eax, 4 PICKDSP edx, 0 add eax, ebx adc edx, 0 PUTDSP eax, 4 mov ebx, edx ADDDSP 4 ret defword_end defword "m-", 0, WORD_MMINUS, WORD_INLINE_COMMA PICKDSP eax, 4 PICKDSP edx, 0 sub eax, ebx sbb edx, 0 PUTDSP eax, 4 mov ebx, edx ADDDSP 4 ret defword_end defword "m*", 0, WORD_MULSTAR, WORD_INLINE_COMMA PICKDSP eax, 0 imul ebx PUTDSP eax, 0 mov ebx, edx ret defword_end defword "m/", 0, WORD_MSLASH, WORD_INLINE_COMMA PICKDSP eax, 4 PICKDSP edx, 0 idiv ebx mov ebx, eax ADDDSP 8 ret defword_end defword "um*", 0, WORD_UMULSTAR, WORD_INLINE_COMMA PICKDSP eax, 0 mul ebx PUTDSP eax, 0 mov ebx, edx ret defword_end defword "um/mod", 0, WORD_UMDIVMOD, WORD_INLINE_COMMA PICKDSP eax, 4 PICKDSP edx, 0 div ebx PUTDSP edx, 4 mov ebx, eax ADDDSP 4 ret defword_end defword "fm/mod", 0, WORD_FMDIVMOD, WORD_INLINE_COMMA PICKDSP edx, 0 PICKDSP eax, 4 mov ecx, ebx ADDDSP 4 xor ecx, edx idiv ebx test ecx, ecx if s test edx, edx if nz dec eax add edx, ebx endif endif PUTDSP edx, 0 mov ebx, eax ret defword_end defword "sm/rem", 0, WORD_SMDIVREM, WORD_INLINE_COMMA PICKDSP eax, 4 PICKDSP edx, 0 idiv ebx PUTDSP edx, 4 mov ebx, eax ADDDSP 4 ret defword_end defword "u/mod", 0, WORD_UDIVMOD, WORD_INLINE_COMMA xor edx, edx PICKDSP eax, 0 div ebx PUTDSP edx, 0 mov ebx, eax ret defword_end defword "dm*", 0, WORD_DMULSTAR, WORD_CALL_COMMA call WORD_TUCK call WORD_MULL TORSP call WORD_UMULSTAR FROMRSP call WORD_ADD ret defword_end ;;;;;;;;;;;;;;;;;;;; ; control flow words ;;;;;;;;;;;;;;;;;;;; defword "branch", 0, WORD_BRANCH, WORD_INLINE_COMMA i_jmp: jmp strict near i_ret ret defword_end defword "0branch", 0, WORD_ZBRANCH, WORD_INLINE_COMMA mov eax, ebx POPDSP ebx test eax, eax jz strict near i_jmp ret defword_end defword "exit", 0, WORD_EXIT, WORD_EXIT_COMMA i_ret: ret defword_end defword "exit,", 0, WORD_EXIT_COMMA, WORD_CALL_COMMA mov edi, [var_WORD_DP] sub edi, 5 cmp edi, [lastcall] ; are we just after a call instruction ? if z mov al, [i_jmp] mov [edi], al ; change it to a jmp endif mov edi, [var_WORD_DP] mov al, [i_ret] stosb mov [var_WORD_DP], edi POPDSP ebx ret defword_end defword "execute", 0, WORD_EXECUTE, WORD_CALL_COMMA mov eax, ebx ; Get xt into eax POPDSP ebx ; After xt runs its ret will continue executing the current word. jmp eax ; and jump to it. defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;; ; terminal input words ;;;;;;;;;;;;;;;;;;;;;;;;;; defword "read-char", 0, WORD_READCHAR, WORD_CALL_COMMA mov ecx, var_WORD_CHARBUF ; 2nd param: buffer mov edx, 1 ; 3rd param: max length push edx push ecx push ebx mov eax, SYS_read ; syscall: read call _syscall add esp, 12 xor ebx, ebx test eax, eax if be mov ebx, -1 endif ret defword_end defword "read-line", 0, WORD_READLINE, WORD_CALL_COMMA call WORD_NROT call WORD_OVER call WORD_ADD call WORD_OVER ; ( fd start end cur ) readline_l1: PICKDSP eax, 0 cmp ebx, eax jz readline_l4 PUSHDSP ebx PICKDSP ebx, 12 call WORD_READCHAR test ebx, ebx jz readline_l2 call WORD_DROP call WORD_DROP2 call WORD_DROP2 LOADTOS 0 LOADTOS 0 LOADTOS -1 jmp readline_l5 readline_l2: mov ebx, [var_WORD_CHARBUF] cmp ebx, 10 ; LF jz readline_l3 call WORD_OVER call WORD_STOREBYTE call WORD_INCR jmp readline_l1 readline_l3: call WORD_DROP readline_l4: call WORD_NIP call WORD_SWAP call WORD_SUB call WORD_NIP LOADTOS -1 LOADTOS 0 readline_l5: ret defword_end defword "key", 0, WORD_KEY, WORD_CALL_COMMA PUSHDSP ebx xor ebx, ebx ; stdin call WORD_READCHAR mov ebx, [var_WORD_CHARBUF] ret defword_end defword "accept", 0, WORD_ACCEPT, WORD_CALL_COMMA call WORD_OVER call WORD_ADD call WORD_OVER ; ( start end cur ) accept_l1: call WORD_KEY cmp ebx, 127 ; BS jz accept_l2 cmp ebx, 10 ; LF jz accept_l3 call WORD_OVER ; ( start end cur key cur ) call WORD_STOREBYTE call WORD_INCR ; ( start end cur' ) PICKDSP eax, 0 cmp ebx, eax jz accept_l4 jmp accept_l1 accept_l2: PICKDSP eax, 4 ; ( start end cur' ) cmp ebx, eax jz accept_l1 call WORD_DECR jmp accept_l1 accept_l3: call WORD_DROP ; ( start end cur' ) accept_l4: call WORD_NIP call WORD_SWAP call WORD_SUB ret defword_end defword "tabs>spaces", 0, WORD_TABSTOSPACES, WORD_CALL_COMMA mov ecx, ebx POPDSP esi test ecx, ecx if nz repeat lodsb cmp al, 9 ;TAB if z mov byte [esi - 1], ' ' endif dec ecx until z endif POPDSP ebx ret defword_end ;;;;;;;;;;;;;;;;;;;;;;; ; terminal output words ;;;;;;;;;;;;;;;;;;;;;;; defword "type-fd", 0, WORD_TYPE_FD, WORD_CALL_COMMA PICKDSP edx, 0 ; 3rd param: length of string PICKDSP ecx, 4 ; 2nd param: address of string ADDDSP 8 ; 1st param: FD in ebx mov eax, SYS_write ; write syscall push edx push ecx push ebx call _syscall add esp, 12 POPDSP ebx ret defword_end defword "type", 0, WORD_TYPE, WORD_CALL_COMMA LOADTOS 1 ; stdout call WORD_TYPE_FD ret defword_end defword "emit", 0, WORD_EMIT, WORD_CALL_COMMA mov [emit_scratch], bl ; write needs the address of the byte to write mov ebx, emit_scratch LOADTOS 1 call WORD_TYPE ret defword_end ;;;;;;;;;;;;;;;;;;; ; system call words ;;;;;;;;;;;;;;;;;;; defword "syscall", 0, WORD_SYSCALL, WORD_CALL_COMMA pop eax mov [syscallret], eax ; save return address mov eax, ebx ; System call number (see ) call _syscall mov ebx, eax ; Result (negative for -errno) jmp [syscallret] ; return to caller defword_end defword "lsyscall", 0, WORD_LSYSCALL, WORD_CALL_COMMA pop eax mov [syscallret], eax ; save return address mov eax, ebx ; System call number (see ) call _lsyscall PUSHDSP eax mov ebx, edx ; Result (negative for -errno) jmp [syscallret] ; return to caller defword_end ;;;;;;;;;;;;;; ; string words ;;;;;;;;;;;;;; defword "count", 0, WORD_COUNT, WORD_CALL_COMMA xor eax, eax mov al, [ebx] inc ebx LOADTOS eax ret defword_end defword "-trailing", 0, WORD_TRAILING, WORD_CALL_COMMA test ebx, ebx if nz PICKDSP esi, 0 mov ecx, ebx add esi, ebx dec esi std trailing_l1: lodsb cmp al, ' ' if be loop trailing_l1 endif mov ebx, ecx cld endif ret defword_end defword "/string", 0, WORD_SSTRING, WORD_CALL_COMMA mov eax, ebx POPDSP ebx PICKDSP ecx, 0 sub ebx, eax add ecx, eax PUTDSP ecx, 0 ret defword_end defword "compare", 0, WORD_COMPARE, WORD_CALL_COMMA PICKDSP esi, 8 PICKDSP edx, 4 PICKDSP edi, 0 ADDDSP 12 mov ecx, ebx cmp edx, ebx if be mov ecx, edx endif test ecx, ecx ; ecx lowest length jnz compare_l2 cmp edx, ebx jz compare_l3 ; both are 0 length jmp compare_l4 ; otherwise the longest wins compare_l2: cmpsb jnz compare_l4 ; chars not same loop compare_l2 cmp edx, ebx ; all chars same jnz compare_l4 ; strings not same size compare_l3: xor ebx, ebx ; same jmp compare_l7 compare_l4: ja compare_l6 compare_l5: mov ebx, -1 jmp compare_l7 compare_l6: mov ebx, 1 compare_l7: ret defword_end defword "icompare", 0, WORD_COMPAREI, WORD_CALL_COMMA PICKDSP esi, 8 PICKDSP edx, 4 PICKDSP edi, 0 ADDDSP 12 mov ecx, ebx cmp edx, ebx if be mov ecx, edx endif test ecx, ecx ; ecx lowest length jnz comparei_l2 cmp edx, ebx jz comparei_l3 ; both are 0 length jmp comparei_l4 ; otherwise the longest wins comparei_l2: mov al, [esi] mov ah, [edi] to_lower al to_lower ah cmp ah, al jnz comparei_l4 ; chars not same inc edi inc esi loop comparei_l2 cmp edx, ebx ; all chars same jnz comparei_l4 ; strings not same size comparei_l3: xor ebx, ebx ; same jmp comparei_l7 comparei_l4: ja comparei_l6 comparei_l5: mov ebx, -1 jmp comparei_l7 comparei_l6: mov ebx, 1 comparei_l7: ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; dictionary searching words ;;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "find", 0, WORD_FIND, WORD_CALL_COMMA call WORD_DUP call WORD_COUNT call WORD_FIND_DICT test ebx, ebx if nz mov dl, [ebx + H_NSIZE] call WORD_TCFA LOADTOS 1 and edx, F_IMMED if z neg ebx endif call WORD_ROT call WORD_DROP endif ret defword_end defword "(find)", 0, WORD_FIND_DICT, WORD_CALL_COMMA mov ecx, ebx ; ecx = length POPDSP edi ; edi = address PUSHRSP ecx mov esi, edi call strhashi and ebx, NUM_HASH_CHAINS-1 mov esi, hash_buckets mov edx, [esi + (ebx * 4)] POPRSP ecx ; edx can now scan back through this hash chain findd_l1: test edx, edx ; NULL pointer? (end of the linked list) je findd_l4 xor eax, eax mov al, [edx + H_NSIZE] ; al = flags+length field and al, (F_HIDDEN|F_LENMASK) ; al = name length cmp al, cl ; Length is the same? jne findd_l2 PUSHRSP ecx ; Save the length PUSHRSP edi ; Save the address (repe cmpsb will move this pointer) lea esi, [edx + H_NAME] ; Dictionary string we are checking against. call strcmpi POPRSP edi POPRSP ecx jne findd_l2 ; Not the same. mov ebx, edx ret findd_l2: mov edx, [edx + H_HLINK] ; Move back through the link field to the previous word jmp findd_l1 ; .. and loop. findd_l4: xor ebx, ebx ; Return zero to indicate not found. ret defword_end defword ">cfa", 0, WORD_TCFA, WORD_CALL_COMMA add ebx, H_NSIZE mov al, [ebx] ; Load flags+len into al. inc ebx ; skip flags+len byte. and eax, F_LENMASK ; Just the length, not the flags. add ebx, eax ; skip the name add ebx, XT_SIZE ; skip to the xt ret defword_end defword "(bucket)", 0, WORD_BUCKET, WORD_CALL_COMMA mov ecx, ebx ; ecx = length POPDSP ebx ; ebx = address of name PUSHRSP esi mov esi, ebx call strhashi and ebx, NUM_HASH_CHAINS-1 mov esi, hash_buckets lea ebx, [esi + (ebx * 4)] POPRSP esi ret defword_end defword "unused", 0, WORD_UNUSED, WORD_CALL_COMMA LOADTOS forth_end LOADTOS [var_WORD_DP] call WORD_SUB ret defword_end ;;;;;;;;;;;;;;;;;;;;;;;;;;; ; dictionary building words ;;;;;;;;;;;;;;;;;;;;;;;;;;; defword "align", 0, WORD_ALIGNDP, WORD_CALL_COMMA mov eax, [var_WORD_DP] ALIGNREG eax mov [var_WORD_DP], eax ret defword_end defword "header,", 0, WORD_HEADER_COMMA, WORD_CALL_COMMA mov ecx, ebx ; ecx = length POPDSP ebx ; ebx = address of name call WORD_ALIGNDP ; align header mov edi, [var_WORD_DP] ; edi is the address of the header mov eax, [var_WORD_LATEST] ; Get link pointer mov [edi + H_LLINK], eax ; and store it in the header. mov [var_WORD_LATEST], edi PUSHRSP ebx ; hash chain PUSHRSP ecx mov esi, ebx call strhashi and ebx, NUM_HASH_CHAINS-1 mov esi, hash_buckets mov eax, [esi + (ebx * 4)] mov [esi + (ebx * 4)], edi mov [edi + H_HLINK], eax ; and store it in the header. POPRSP ecx POPRSP esi mov [edi + H_NSIZE], cl ; Store the length/flags byte. add edi, H_NAME call strcpyi mov ecx, XT_SIZE xor eax, eax rep stosb ; clear the gap till the xt mov [var_WORD_DP], edi mov long [edi + XT_COMPILE], WORD_CALL_COMMA ;compile action POPDSP ebx ret defword_end defword "lit,", 0, WORD_LIT_COMMA, WORD_CALL_COMMA mov esi, litc_l1 mov edi, [var_WORD_DP] mov ecx, litc_l2 - litc_l1 - 4 rep movsb mov [var_WORD_DP], edi ret defword_end litc_l1: LOADTOS 0xBAADF00D litc_l2: defword "slits", 0, WORD_SLITS, WORD_CALL_COMMA PUSHDSP ebx POPRSP esi xor eax, eax lodsb ; get the length of the string PUSHDSP esi ; push the address of the start of the string mov ebx, eax ; push length on the stack add esi, eax ; skip past the string jmp esi defword_end defword "clits", 0, WORD_CLITS, WORD_CALL_COMMA FROMRSP xor eax, eax mov al, [ebx] lea eax, [ebx + eax + 1] jmp eax defword_end defword ",", 0, WORD_COMMA, WORD_CALL_COMMA mov edi, [var_WORD_DP] ; DP mov eax, ebx stosd ; Store it. mov [var_WORD_DP], edi ; Update DP (incremented) POPDSP ebx ret defword_end defword "c,", 0, WORD_CHAR_COMMA, WORD_CALL_COMMA mov eax, ebx mov edi, [var_WORD_DP] ; DP stosb ; Store it. mov [var_WORD_DP], edi ; Update DP (incremented) POPDSP ebx ret defword_end defword ":", 0, WORD_COLON, WORD_CALL_COMMA call WORD_PARSENAME call WORD_HEADER_COMMA ; Create the dictionary entry / header mov eax, [var_WORD_DP] mov [eax + XT_BODY], eax call WORD_LATEST call WORD_FETCH call WORD_HIDDEN ; Make the word hidden call WORD_RBRAC ; Go into compile mode. ret defword_end defword "create", 0, WORD_CREATE, WORD_CALL_COMMA call WORD_PARSENAME call WORD_HEADER_COMMA mov esi, create_l1 mov edi, [var_WORD_DP] PUSHRSP edi mov ecx, create_l4 - create_l1 rep movsb mov [var_WORD_DP], edi mov edx, edi call WORD_ALIGNDP POPRSP eax mov edi, [var_WORD_DP] sub edx, eax mov [eax + create_l2 - create_l1 - 4], edi mov [eax + XT_BODY], edi mov [eax + XT_LENGTH], edx ret defword_end create_l1: LOADTOS 0xBAADF00D create_l2: call strict near create_l3 create_l3: ret create_l4: defword "dodoes", 0, WORD_DODOES, WORD_CALL_COMMA call WORD_LATEST call WORD_FETCH call WORD_TCFA add ebx, create_l3 - create_l1 - 4 POPDSP eax sub eax, ebx sub eax, 4 mov [ebx], eax POPDSP ebx ret defword_end defword "does>", F_IMMED, WORD_DOES, WORD_CALL_COMMA call WORD_LIT_COMMA LOADTOS [var_WORD_DP] add ebx, 10 call WORD_COMMA LOADTOS WORD_DODOES call WORD_COMPILE_COMMA LOADTOS 0 mov bl, [does_l1] call WORD_CHAR_COMMA does_l1: ret defword_end defword "postpone", F_IMMED, WORD_POSTPONE, WORD_CALL_COMMA call WORD_PARSENAME call WORD_FIND_DICT mov dl, [ebx + H_NSIZE] call WORD_TCFA and edx, F_IMMED if z call WORD_LIT_COMMA call WORD_COMMA LOADTOS WORD_COMPILE_COMMA endif jmp WORD_COMPILE_COMMA ret defword_end defword "call,", 0, WORD_CALL_COMMA, WORD_CALL_COMMA mov edi, [var_WORD_DP] mov [lastcall], edi ; record last location of last call mov esi, i_call movsb mov eax, ebx sub eax, 4 sub eax, edi stosd mov [var_WORD_DP], edi POPDSP ebx ret defword_end defword "inline,", 0, WORD_INLINE_COMMA, WORD_CALL_COMMA mov ecx, [ebx + XT_LENGTH] dec ecx ; actual code length minus ret mov esi, ebx mov edi, [var_WORD_DP] rep movsb ; inline copy the code mov [var_WORD_DP], edi ; update DP POPDSP ebx ret defword_end defword "compile,", 0, WORD_COMPILE_COMMA, WORD_INLINE_COMMA call [ebx + XT_COMPILE] ret defword_end defword ";", F_IMMED, WORD_SEMICOLON, WORD_CALL_COMMA LOADTOS WORD_EXIT i_call: call strict near WORD_COMPILE_COMMA call WORD_LATEST call WORD_FETCH call WORD_HIDDEN ; toggle hidden flag -- unhide the word (see below for definition). call WORD_LBRAC ; go back to IMMEDIATE mode. mov edx, ebx mov ebx, [var_WORD_LATEST] call WORD_TCFA mov ecx, [var_WORD_DP] sub ecx, ebx mov [ebx + XT_LENGTH], ecx ; set code size of word mov ebx, edx ret defword_end defword "immediate", 0, WORD_IMMEDIATE, WORD_CALL_COMMA mov edi, [var_WORD_LATEST] ; LATEST word. add edi, H_NSIZE ; Point to name/flags byte. xor byte [edi], F_IMMED ; Toggle the IMMED bit. ret defword_end defword "hidden", 0, WORD_HIDDEN, WORD_CALL_COMMA add ebx, H_NSIZE ; Point to name/flags byte. xor byte [ebx], F_HIDDEN ; Toggle the HIDDEN bit. POPDSP ebx ret defword_end defword "[", F_IMMED, WORD_LBRAC, WORD_CALL_COMMA mov long [var_WORD_STATE], 0 ; Set STATE to 0. ret defword_end defword "]", 0, WORD_RBRAC, WORD_CALL_COMMA mov long [var_WORD_STATE], 1 ; Set STATE to 1. ret defword_end ;;;;;;;;;;;;;;;;;;;;; ; source buffer words ;;;;;;;;;;;;;;;;;;;;; defword "source", 0, WORD_SOURCE, WORD_CALL_COMMA call WORD_INHASH call WORD_FETCH2 ret defword_end defword "refill", 0, WORD_REFILL, WORD_CALL_COMMA LOADTOS tib_buffer call WORD_LINESIZE ; ( tib len ) call WORD_OVER call WORD_SWAP ; ( tib tib len ) call WORD_ACCEPT ; read line into TIB call WORD_DUP2 call WORD_TABSTOSPACES call WORD_INHASH call WORD_STORE2 ; set as current WORD_SOURCE LOADTOS 0 call WORD_TOIN call WORD_STORE ; set to start of buffer LOADTOS -1 ret defword_end defword "isspace?", 0, WORD_ISSPACE, WORD_CALL_COMMA LOADTOS ' ' call WORD_ULTEQ ret defword_end defword "isnotspace?", 0, WORD_ISNOTSPACE, WORD_CALL_COMMA call WORD_ISSPACE call WORD_ZEQ ret defword_end defword "xt-skip", 0, WORD_XTSKIP, WORD_CALL_COMMA TORSP xtskip_l1: test ebx, ebx jz xtskip_l3 call WORD_OVER call WORD_FETCHBYTE FETCHRSP call WORD_EXECUTE test ebx, ebx jz xtskip_l2 mov ebx, 1 call WORD_SSTRING jmp xtskip_l1 xtskip_l2: call WORD_DROP xtskip_l3: ADDRSP 4 ret defword_end ;;;;;;;;;;;;;;;;;;;;;; ; input parseing words ;;;;;;;;;;;;;;;;;;;;;; defword "parse-name", 0, WORD_PARSENAME, WORD_CALL_COMMA call WORD_SOURCE call WORD_TOIN call WORD_FETCH call WORD_SSTRING LOADTOS WORD_ISSPACE call WORD_XTSKIP call WORD_OVER TORSP LOADTOS WORD_ISNOTSPACE call WORD_XTSKIP call WORD_DUP2 LOADTOS 1 call WORD_MIN call WORD_ADD call WORD_SOURCE call WORD_DROP call WORD_SUB call WORD_TOIN call WORD_STORE call WORD_DROP FROMRSP call WORD_TUCK call WORD_SUB ; code to print out "P CR" ;LOADTOS 80 ;call WORD_EMIT ;LOADTOS 32 ;call WORD_EMIT ;call WORD_DUP2 ;call WORD_TYPE ;LOADTOS 10 ;call WORD_EMIT ret defword_end defword "word-name", 0, WORD_WORDNAME, WORD_CALL_COMMA call WORD_PARSENAME ; ( start len ) LOADTOS word_buf ; ( string size buf ) call WORD_DUP2 ; ( string size buf size buf ) call WORD_STOREBYTE ; ( string size buf ) call WORD_INCR ; ( string size buf+1 ) call WORD_SWAP ; ( string buf+1 size ) call WORD_CMOVE LOADTOS word_buf ; ( cstring ) ; debug code to print out "N CR" ;LOADTOS 78 ;call WORD_EMIT ;LOADTOS 32 ;call WORD_EMIT ;call WORD_DUP2 ;call WORD_TYPE ;LOADTOS 10 ;call WORD_EMIT ret defword_end defword "interp-name", 0, WORD_INTERPNAME, WORD_CALL_COMMA call WORD_PARSENAME ; ( start len ) LOADTOS intep_name_buf ; ( string size buf ) call WORD_DUP2 ; ( string size buf size buf ) call WORD_STOREBYTE ; ( string size buf ) call WORD_INCR ; ( string size buf+1 ) call WORD_SWAP ; ( string buf+1 size ) call WORD_CMOVE LOADTOS intep_name_buf ;( cstring ) ret defword_end defword "interpret", 0, WORD_INTERPRET, WORD_CALL_COMMA loopstart call WORD_INTERPNAME mov al, [ebx] test al, al breakif z ; debug code to print out "I CR" ;LOADTOS 73 ;call WORD_EMIT ;LOADTOS 32 ;call WORD_EMIT ;call WORD_DUP ;call WORD_COUNT ;call WORD_TYPE ;LOADTOS 10 ;call WORD_EMIT call WORD_INTERP loopend call WORD_DROP ret defword_end defword "interp", 0, WORD_INTERP, WORD_CALL_COMMA call WORD_FIND ; ( cstring 0 | xt 1 | xt | -1 ) mov eax, ebx POPDSP ebx test eax, eax jz tryasnumber jle nonimediate executeword: mov eax, ebx POPDSP ebx jmp eax nonimediate: mov eax, [var_WORD_STATE] test eax, eax ; are we in imedeate mode ? jz executeword jmp WORD_COMPILE_COMMA ; compile xt tryasnumber: call WORD_COUNT ; ( adr len ) LOADTOS 0 LOADTOS 0 call WORD_SWAP2 ; ( 0d addr len ) call WORD_TOSNUMBER ; ( d addr len ) test ebx, ebx jnz parseproblem call WORD_DROP2 call WORD_DROP ; ( num ) mov eax, [var_WORD_STATE] test eax, eax if nz call WORD_LIT_COMMA ; compile LIT call WORD_COMMA ; compile value endif ret parseproblem: LOADTOS errmsg LOADTOS errmsgend - errmsg LOADTOS 2 call WORD_TYPE_FD LOADTOS errmsgnl LOADTOS 1 LOADTOS 2 call WORD_TYPE_FD LOADTOS tib_buffer LOADTOS [var_WORD_TOIN] LOADTOS 2 call WORD_TYPE_FD LOADTOS errmsgnl LOADTOS 1 LOADTOS 2 call WORD_TYPE_FD call WORD_DROP2 call WORD_DROP2 ret defword_end defword ">number", 0, WORD_TONUMBER, WORD_CALL_COMMA call WORD_OVER call WORD_ADD call WORD_SWAP ; ( ud end cur ) tonumber_l1: PICKDSP eax, 0 cmp ebx, eax jz near tonumber_l4 call WORD_DUP call WORD_FETCHBYTE ; ( ud end cur char ) to_lower ebx sub ebx, byte '0' jb tonumber_l3 ; < '0'? cmp ebx, byte 10 jb tonumber_l2 ; <= '9' ? sub ebx, byte 'a' - '0' jb tonumber_l3 ; < 'a' ? add ebx, byte 10 tonumber_l2: cmp ebx, [var_WORD_BASE] jge tonumber_l3 ; >= WORD_BASE ? TORSP call WORD_SWAP2 ; ( end cur ud ) LOADTOS [var_WORD_BASE] call WORD_DMULSTAR FROMRSP call WORD_MPLUS ; ( end cur ud' ) call WORD_SWAP2 call WORD_INCR ; ( ud' end cur' ) jmp tonumber_l1 tonumber_l3: call WORD_DROP tonumber_l4: call WORD_SWAP call WORD_OVER call WORD_SUB ; ( ud' c-addr u2 ) ret defword_end defword ">snumber", 0, WORD_TOSNUMBER, WORD_CALL_COMMA test ebx, ebx if nz PICKDSP eax, 0 mov cl, [eax] cmp cl, '-' jnz WORD_TONUMBER ; not '-' inc eax PUTDSP eax, 0 dec ebx call WORD_TONUMBER call WORD_SWAP2 call WORD_DNEGATE call WORD_SWAP2 endif ret defword_end ;;;;;;;;;;; ; tick word ;;;;;;;;;;; defword "ticks", 0, WORD_TICKS, WORD_CALL_COMMA sub ebp, byte 8 rdtsc mov [byte ebp -4], ebx mov [ebp], eax mov ebx, edx ret defword_end ;;;;;;;;;;; ; test word ;;;;;;;;;;; defword "test", 0, WORD_TEST, WORD_CALL_COMMA ret defword_end ;;;;;;;;;;;;;;;;; ; read/write data ;;;;;;;;;;;;;;;;; align 4 syscallret: ; return address saved by syscall dd 0 lastcall: ; last call layed down by compiler dd 0 tib_buffer: ; keyboard input buffer times MAX_LINE_SIZE db 0 word_buf: ; static buffer where WORD returns. Subsequent calls ; overwrite this buffer. times MAX_LINE_SIZE db 0 intep_name_buf: ; static buffer where INTERPNAME returns. Subsequent calls ; overwrite this buffer. times MAX_LINE_SIZE db 0 emit_scratch: ; scratch used by EMIT db 0 errmsg: db "PARSE ERROR:" errmsgend: errmsgnl: db 10 bootfile: db "forth.f" db 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; dictionary hash table (64) ;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 4 hash_buckets: dd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 dd 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ; addresses of all built in dictionary words. ; this ends up as part of the user space after booting ! ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; align 4 dictionary_start: dd dic_WORD_ABS dd dic_WORD_ACCEPT dd dic_WORD_ADD dd dic_WORD_ADDBYTE dd dic_WORD_ADDSTORE dd dic_WORD_ALIGNDP dd dic_WORD_AND dd dic_WORD_BASE dd dic_WORD_BLANK dd dic_WORD_BLK dd dic_WORD_BRANCH dd dic_WORD_BUCKET dd dic_WORD_CALL_COMMA dd dic_WORD_CHARBUF dd dic_WORD_CHAR_COMMA dd dic_WORD_CLITS dd dic_WORD_CMOVE dd dic_WORD_CMOVEB dd dic_WORD_COLON dd dic_WORD_COMMA dd dic_WORD_COMPARE dd dic_WORD_COMPAREI dd dic_WORD_COMPILE_COMMA dd dic_WORD_COUNT dd dic_WORD_CREATE dd dic_WORD_D2SLASH dd dic_WORD_D2STAR dd dic_WORD_DABS dd dic_WORD_DECR dd dic_WORD_DECR2 dd dic_WORD_DECR4 dd dic_WORD_DEQ dd dic_WORD_DIV dd dic_WORD_DIVMOD dd dic_WORD_DLT dd dic_WORD_DMAX dd dic_WORD_DMIN dd dic_WORD_DMINUS dd dic_WORD_DMULSTAR dd dic_WORD_DNEGATE dd dic_WORD_DNEQ dd dic_WORD_DODOES dd dic_WORD_DOES dd dic_WORD_DP dd dic_WORD_DPLUS dd dic_WORD_DROP dd dic_WORD_DROP2 dd dic_WORD_DSPFETCH dd dic_WORD_DSPSTORE dd dic_WORD_DTOS dd dic_WORD_DULT dd dic_WORD_DUP dd dic_WORD_DUP2 dd dic_WORD_DZEQ dd dic_WORD_DZLT dd dic_WORD_DZNEQ dd dic_WORD_EMIT dd dic_WORD_EQ dd dic_WORD_ERASE dd dic_WORD_EXECUTE dd dic_WORD_EXIT dd dic_WORD_FETCH dd dic_WORD_FETCH2 dd dic_WORD_FETCHBYTE dd dic_WORD_FETCHSHORT dd dic_WORD_FILL dd dic_WORD_FIND dd dic_WORD_FIND_DICT dd dic_WORD_FMDIVMOD dd dic_WORD_FROMR dd dic_WORD_FROMR2 dd dic_WORD_GT dd dic_WORD_GTEQ dd dic_WORD_HEADER_COMMA dd dic_WORD_HIDDEN dd dic_WORD_IMMEDIATE dd dic_WORD_INCR dd dic_WORD_INCR2 dd dic_WORD_INCR4 dd dic_WORD_INHASH dd dic_WORD_INLINE_COMMA dd dic_WORD_INTERP dd dic_WORD_INTERPNAME dd dic_WORD_INTERPRET dd dic_WORD_INVERT dd dic_WORD_ISNOTSPACE dd dic_WORD_ISSPACE dd dic_WORD_KEY dd dic_WORD_LATEST dd dic_WORD_LBRAC dd dic_WORD_LINESIZE dd dic_WORD_LIT_COMMA dd dic_WORD_LSHIFT dd dic_WORD_LSYSCALL dd dic_WORD_LT dd dic_WORD_LTEQ dd dic_WORD_MAX dd dic_WORD_MIN dd dic_WORD_MMINUS dd dic_WORD_MOD dd dic_WORD_MOVE dd dic_WORD_MPLUS dd dic_WORD_MSLASH dd dic_WORD_MULDIV dd dic_WORD_MULL dd dic_WORD_MULSTAR dd dic_WORD_NE dd dic_WORD_NEGATE dd dic_WORD_NFROMR dd dic_WORD_NIP dd dic_WORD_NIP2 dd dic_WORD_NQDUP dd dic_WORD_NROT dd dic_WORD_NTOR dd dic_WORD_OR dd dic_WORD_OVER dd dic_WORD_OVER2 dd dic_WORD_O_APPEND dd dic_WORD_O_CREAT dd dic_WORD_O_EXCL dd dic_WORD_O_NONBLOCK dd dic_WORD_O_RDONLY dd dic_WORD_O_RDWR dd dic_WORD_O_TRUNC dd dic_WORD_O_WRONLY dd dic_WORD_PARSENAME dd dic_WORD_PICK dd dic_WORD_POSTPONE dd dic_WORD_QDUP dd dic_WORD_RBRAC dd dic_WORD_RDROP dd dic_WORD_RDROP2 dd dic_WORD_READCHAR dd dic_WORD_READLINE dd dic_WORD_REFILL dd dic_WORD_RFETCH dd dic_WORD_RFETCH2 dd dic_WORD_ROT dd dic_WORD_ROT2 dd dic_WORD_RSHIFT dd dic_WORD_RSPFETCH dd dic_WORD_RSPSTORE dd dic_WORD_RSTORE dd dic_WORD_RZ dd dic_WORD_SEMICOLON dd dic_WORD_SLITS dd dic_WORD_SMDIVREM dd dic_WORD_SOURCE dd dic_WORD_SOURCEFD dd dic_WORD_SSTRING dd dic_WORD_STARSMOD dd dic_WORD_STATE dd dic_WORD_STOD dd dic_WORD_STORE dd dic_WORD_STORE2 dd dic_WORD_STOREBYTE dd dic_WORD_STORESHORT dd dic_WORD_SUB dd dic_WORD_SUBSTORE dd dic_WORD_SWAP dd dic_WORD_SWAP2 dd dic_WORD_SYSCALL dd dic_WORD_SYS_CLOSE dd dic_WORD_SYS_EXIT dd dic_WORD_SYS_FSTAT dd dic_WORD_SYS_FSYNC dd dic_WORD_SYS_FTRUNCATE dd dic_WORD_SYS_LSEEK dd dic_WORD_SYS_OPEN dd dic_WORD_SYS_READ dd dic_WORD_SYS_RENAME dd dic_WORD_SYS_STAT dd dic_WORD_SYS_UNLINK dd dic_WORD_SYS_WRITE dd dic_WORD_SZ dd dic_WORD_TABSTOSPACES dd dic_WORD_TCFA dd dic_WORD_TICKS dd dic_WORD_TOIN dd dic_WORD_TONUMBER dd dic_WORD_TOR dd dic_WORD_TOR2 dd dic_WORD_TOSNUMBER dd dic_WORD_TRAILING dd dic_WORD_TUCK dd dic_WORD_TUCK2 dd dic_WORD_TWODIV dd dic_WORD_TWOMUL dd dic_WORD_TYPE dd dic_WORD_TYPE_FD dd dic_WORD_UDIVMOD dd dic_WORD_UGT dd dic_WORD_UGTEQ dd dic_WORD_ULT dd dic_WORD_ULTEQ dd dic_WORD_UMDIVMOD dd dic_WORD_UMULSTAR dd dic_WORD_UNUSED dd dic_WORD_VERSION dd dic_WORD_WORDBUF dd dic_WORD_WORDNAME dd dic_WORD_XOR dd dic_WORD_XTSKIP dd dic_WORD_ZBRANCH dd dic_WORD_ZEQ dd dic_WORD_ZGT dd dic_WORD_ZGTEQ dd dic_WORD_ZLT dd dic_WORD_ZLTEQ dd dic_WORD_ZNE dd dic_WORD__F_HIDDEN dd dic_WORD__F_IMMED dd dic_WORD__F_LENMASK dd dic_WORD__H_NAME dd dic_WORD__H_NSIZE dd dic_WORD__XT_BODY dd dic_WORD__XT_COMPILE dd dic_WORD__XT_LENGTH dd dic_WORD__XT_SIZE dd dic_WORD_TEST dictionary_end: ;;;;;;;;;;;;;;;;;;;;;;;;;; ; room for user dictionary ;;;;;;;;;;;;;;;;;;;;;;;;;; times USER_DEFS_SIZE db 0 forth_end: ================================================ FILE: samples/Assembly/fp_sqr32_160_comba.inc ================================================ push r2 dint nop bis #MPYDLYWRTEN,&MPY32CTL0 bic #MPYDLY32,&MPY32CTL0 mov #SUMEXT,r13 clr r12 mov @r15+,r4 mov @r15+,r5 mov @r15+,r6 mov @r15+,r7 mov @r15+,r8 mov @r15+,r9 mov @r15+,r10 mov @r15+,r11 sub #2*8,r15 /* SELF_STEP_FIRST */ mov r4,&MPY32L mov r5,&MPY32H mov r4,&OP2L mov r5,&OP2H /* COLUMN_END */ mov &RES0,2*0(r14) mov &RES1,2*(0+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 /* STEP_1 */ mov r4,&MAC32L mov r5,&MAC32H mov r6,&OP2L mov r7,&OP2H add &SUMEXT,r12 mov r6,&OP2L mov r7,&OP2H /* COLUMN_END */ mov &RES0,2*2(r14) add @r13,r12 mov &RES1,2*(2+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* STEP_1 */ mov r4,&MAC32L mov r5,&MAC32H mov r8,&OP2L mov r9,&OP2H add &SUMEXT,r12 mov r8,&OP2L mov r9,&OP2H /* SELF_STEP */ mov r6,&MAC32L mov r7,&MAC32H add @r13,r12 mov r6,&OP2L mov r7,&OP2H /* COLUMN_END */ mov &RES0,2*4(r14) add @r13,r12 mov &RES1,2*(4+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* STEP_1 */ mov r4,&MAC32L mov r5,&MAC32H mov r10,&OP2L mov r11,&OP2H add &SUMEXT,r12 mov r10,&OP2L mov r11,&OP2H /* STEP_2MORE */ mov r6,&MAC32L mov r7,&MAC32H add @r13,r12 mov r8,&OP2L mov r9,&OP2H add &SUMEXT,r12 mov r8,&OP2L mov r9,&OP2H /* COLUMN_END */ mov &RES0,2*6(r14) add @r13,r12 mov &RES1,2*(6+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* STEP_1 */ mov r4,&MAC32L mov r5,&MAC32H mov 2*8(r15),&OP2L mov 2*9(r15),&OP2H add &SUMEXT,r12 mov 2*8(r15),&OP2L mov 2*9(r15),&OP2H /* STEP_2MORE */ mov r6,&MAC32L mov r7,&MAC32H add @r13,r12 mov r10,&OP2L mov r11,&OP2H add &SUMEXT,r12 mov r10,&OP2L mov r11,&OP2H /* SELF_STEP */ mov r8,&MAC32L mov r9,&MAC32H add @r13,r12 mov r8,&OP2L mov r9,&OP2H /* COLUMN_END */ mov &RES0,2*8(r14) add @r13,r12 mov &RES1,2*(8+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 mov 2*8(r15),r4 mov 2*(8+1)(r15),r5 /* STEP_1 */ mov r6,&MAC32L mov r7,&MAC32H mov r4,&OP2L mov r5,&OP2H add &SUMEXT,r12 mov r4,&OP2L mov r5,&OP2H /* STEP_2MORE */ mov r8,&MAC32L mov r9,&MAC32H add @r13,r12 mov r10,&OP2L mov r11,&OP2H add &SUMEXT,r12 mov r10,&OP2L mov r11,&OP2H /* COLUMN_END */ mov &RES0,2*10(r14) add @r13,r12 mov &RES1,2*(10+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* STEP_1 */ mov r8,&MAC32L mov r9,&MAC32H mov r4,&OP2L mov r5,&OP2H add &SUMEXT,r12 mov r4,&OP2L mov r5,&OP2H /* SELF_STEP */ mov r10,&MAC32L mov r11,&MAC32H add @r13,r12 mov r10,&OP2L mov r11,&OP2H /* COLUMN_END */ mov &RES0,2*12(r14) add @r13,r12 mov &RES1,2*(12+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* STEP_1 */ mov r10,&MAC32L mov r11,&MAC32H mov r4,&OP2L mov r5,&OP2H add &SUMEXT,r12 mov r4,&OP2L mov r5,&OP2H /* COLUMN_END */ mov &RES0,2*14(r14) add @r13,r12 mov &RES1,2*(14+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* SELF_STEP_1 */ mov r4,&MAC32L mov r5,&MAC32H mov r4,&OP2L mov r5,&OP2H /* COLUMN_END */ mov &RES0,2*16(r14) add @r13,r12 mov &RES1,2*(16+1)(r14) mov &RES2,&RES0 mov &RES3,&RES1 mov r12,&RES2 clr &RES3 clr r12 /* END */ mov &RES0,2*18(r14) mov &RES1,2*(18+1)(r14) pop r2 eint ================================================ FILE: samples/Assembly/lib.inc ================================================ ; ------------------------------------------------------------------------ ; 显示 AL 中的数字 ; ------------------------------------------------------------------------ DispAL: push ecx push edx push edi mov edi, [dwDispPos] mov ah, 0Fh ; 0000b: 黑底 1111b: 白字 mov dl, al shr al, 4 mov ecx, 2 .begin: and al, 01111b cmp al, 9 ja .1 add al, '0' jmp .2 .1: sub al, 0Ah add al, 'A' .2: mov [gs:edi], ax add edi, 2 mov al, dl loop .begin ;add edi, 2 mov [dwDispPos], edi pop edi pop edx pop ecx ret ; DispAL 结束------------------------------------------------------------- ; ------------------------------------------------------------------------ ; 显示一个整形数 ; ------------------------------------------------------------------------ DispInt: mov eax, [esp + 4] shr eax, 24 call DispAL mov eax, [esp + 4] shr eax, 16 call DispAL mov eax, [esp + 4] shr eax, 8 call DispAL mov eax, [esp + 4] call DispAL mov ah, 07h ; 0000b: 黑底 0111b: 灰字 mov al, 'h' push edi mov edi, [dwDispPos] mov [gs:edi], ax add edi, 4 mov [dwDispPos], edi pop edi ret ; DispInt 结束------------------------------------------------------------ ; ------------------------------------------------------------------------ ; 显示一个字符串 ; ------------------------------------------------------------------------ DispStr: push ebp mov ebp, esp push ebx push esi push edi mov esi, [ebp + 8] ; pszInfo mov edi, [dwDispPos] mov ah, 0Fh .1: lodsb test al, al jz .2 cmp al, 0Ah ; 是回车吗? jnz .3 push eax mov eax, edi mov bl, 160 div bl and eax, 0FFh inc eax mov bl, 160 mul bl mov edi, eax pop eax jmp .1 .3: mov [gs:edi], ax add edi, 2 jmp .1 .2: mov [dwDispPos], edi pop edi pop esi pop ebx pop ebp ret ; DispStr 结束------------------------------------------------------------ ; ------------------------------------------------------------------------ ; 换行 ; ------------------------------------------------------------------------ DispReturn: push szReturn call DispStr ;printf("\n"); add esp, 4 ret ; DispReturn 结束--------------------------------------------------------- ; ------------------------------------------------------------------------ ; 内存拷贝,仿 memcpy ; ------------------------------------------------------------------------ ; void* MemCpy(void* es:pDest, void* ds:pSrc, int iSize); ; ------------------------------------------------------------------------ MemCpy: push ebp mov ebp, esp push esi push edi push ecx mov edi, [ebp + 8] ; Destination mov esi, [ebp + 12] ; Source mov ecx, [ebp + 16] ; Counter .1: cmp ecx, 0 ; 判断计数器 jz .2 ; 计数器为零时跳出 mov al, [ds:esi] ; ┓ inc esi ; ┃ ; ┣ 逐字节移动 mov byte [es:edi], al ; ┃ inc edi ; ┛ dec ecx ; 计数器减一 jmp .1 ; 循环 .2: mov eax, [ebp + 8] ; 返回值 pop ecx pop edi pop esi mov esp, ebp pop ebp ret ; 函数结束,返回 ; MemCpy 结束------------------------------------------------------------- ================================================ FILE: samples/Assembly/sectorc.s ================================================ bits 16 cpu 386 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Token values as computed by the tokenizer's ;;; atoi() calculation ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; %define TOK_INT 6388 %define TOK_VOID 11386 %define TOK_ASM 5631 %define TOK_COMM 65532 %define TOK_SEMI 11 %define TOK_LPAREN 65528 %define TOK_RPAREN 65529 %define TOK_START 20697 %define TOK_DEREF 64653 %define TOK_WHILE_BEGIN 55810 %define TOK_IF_BEGIN 6232 %define TOK_BODY_BEGIN 5 %define TOK_BLK_BEGIN 75 %define TOK_BLK_END 77 %define TOK_ASSIGN 13 %define TOK_ADDR 65526 %define TOK_SUB 65533 %define TOK_ADD 65531 %define TOK_MUL 65530 %define TOK_AND 65526 %define TOK_OR 76 %define TOK_XOR 46 %define TOK_SHL 132 %define TOK_SHR 154 %define TOK_EQ 143 %define TOK_NE 65399 %define TOK_LT 12 %define TOK_GT 14 %define TOK_LE 133 %define TOK_GE 153 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; Common register uses ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; ax: current token / scratch register / emit val for stosw ;;; bx: current token ;;; cx: used by tok_next for trailing 2 bytes ;;; dl: flag for "tok_is_num" ;;; dh: flags for "tok_is_call", trailing "()" ;;; bp: saved token for assigned variable ;;; sp: stack pointer, we don't mess with this ;;; si: used with lodsw for table scans ;;; ds: fn symbol table segment (occasionally set to "cs" to access binary_oper_tbl) ;;; di: codegen destination offset ;;; es: codegen destination segment ;;; cs: always 0x07c0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; jmp 0x07c0:entry entry: push 0x3000 ; segment 0x3000 is used for fn symbol table pop ds push 0x2000 ; segment 0x2000 is used for codegen output buffer pop es xor di,di ; codegen index, zero'd ;; [fall-through] ;; main loop for parsing all decls compile: ;; advance to either "int" or "void" call tok_next ;; if "int" then skip a variable cmp ax,TOK_INT jne compile_function call tok_next2 ; consume "int" and jmp compile compile_function: ; parse and compile a function decl call tok_next ; consume "void" push bx ; save function name token mov [bx],di ; record function address in symtbl call compile_stmts_tok_next2 ; compile function body mov al,0xc3 ; emit "ret" instruction stosb pop bx ; if the function is _start(), we're done cmp bx,TOK_START jne compile ; otherwise, loop and compile another declaration ;; [fall-through] ;; done compiling, execute the binary execute: push es ; push the codegen segment push word [bx] ; push the offset to "_start()" push 0x4000 ; load new segment for variable data pop ds retf ; jump into it via "retf" ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; compile statements (optionally advancing tokens beforehand) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; compile_stmts_tok_next2: call tok_next compile_stmts_tok_next: call tok_next compile_stmts: mov ax,bx cmp ax,TOK_BLK_END ; if we reach '}' then return je return test dh,dh ; if dh is 0, it's not a call je _not_call mov al,0xe8 ; emit "call" instruction stosb mov ax,[bx] ; load function offset from symbol-table sub ax,di ; compute relative to this location: "dest - cur - 2" sub ax,2 stosw ; emit target jmp compile_stmts_tok_next2 ; loop to compile next statement _not_call: cmp ax,TOK_ASM ; check for "asm" jne _not_asm call tok_next ; tok_next to get literal byte stosb ; emit the literal jmp compile_stmts_tok_next2 ; loop to compile next statement _not_asm: cmp ax,TOK_IF_BEGIN ; check for "if" jne _not_if call _control_flow_block ; compile control-flow block jmp _patch_fwd ; patch up forward jump of if-stmt _not_if: cmp ax,TOK_WHILE_BEGIN ; check for "while" jne _not_while push di ; save loop start location call _control_flow_block ; compile control-flow block jmp _patch_back ; patch up backward and forward jumps of while-stmt _not_while: call compile_assign ; handle an assignment statement jmp compile_stmts ; loop to compile next statement _patch_back: mov al,0xe9 ; emit "jmp" instruction (backwards) stosb pop ax ; restore loop start location sub ax,di ; compute relative to this location: "dest - cur - 2" sub ax,2 stosw ; emit target ;; [fall-through] _patch_fwd: mov ax,di ; compute relative fwd jump to this location: "dest - src" sub ax,si mov es:[si-2],ax ; patch "src - 2" jmp compile_stmts_tok_next ; loop to compile next statement _control_flow_block: call compile_expr_tok_next ; compile loop or if condition expr ;; emit forward jump mov ax,0xc085 ; emit "test ax,ax" stosw mov ax,0x840f ; emit "je" instruction stosw stosw ; emit placeholder for target push di ; save forward patch location call compile_stmts_tok_next ; compile a block of statements pop si ; restore forward patch location return: ; this label gives us a way to do conditional returns ret ; (e.g. "jne return") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; compile assignment statement ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; compile_assign: cmp ax,TOK_DEREF ; check for "*(int*)" jne _not_deref_store call tok_next ; consume "*(int*)" call save_var_and_compile_expr ; compile rhs first ;; [fall-through] compile_store_deref: mov bx,bp ; restore dest var token mov ax,0x0489 ; code for "mov [si],ax" ;; [fall-through] emit_common_ptr_op: push ax mov ax,0x368b ; emit "mov si,[imm]" call emit_var pop ax stosw ; emit ret _not_deref_store: call save_var_and_compile_expr ; compile rhs first ;; [fall-through] compile_store: mov bx,bp ; restore dest var token mov ax,0x0689 ; code for "mov [imm],ax" jmp emit_var ; [tail-call] save_var_and_compile_expr: mov bp,bx ; save dest to bp call tok_next ; consume dest ;; [fall-through] ; fall-through will consume "=" before compiling expr ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; compile expression ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; compile_expr_tok_next: call tok_next compile_expr: call compile_unary ; compile left-hand side push ds ; need to swap out 'ds' to scan the table with lodsw push cs pop ds mov si,binary_oper_tbl - 2 ; load ptr to operator table (biased backwards) _check_next: lodsw ; discard 16-bit of machine-code lodsw ; load 16-bit token value cmp ax,bx ; matches token? je _found test ax,ax ; end of table? jne _check_next pop ds ret ; all-done, not found _found: lodsw ; load 16-bit of machine-code push ax ; save it to the stack mov al,0x50 ; code for "push ax" stosb ; emit call tok_next ; consume operator token call compile_unary ; compile right-hand side mov ax,0x9159 ; code for "pop cx; xchg ax,cx" stosw ; emit pop bx ; restore 16-bit of machine-code cmp bh,0xc0 ; detect the special case for comparison ops jne emit_op emit_cmp_op: mov ax,0xc839 ; code for "cmp ax,cx" stosw ; emit mov ax,0x00b8 ; code for "mov ax,0x00" stosw ; emit mov ax,0x0f00 ; code for the rest of imm and prefix for "setX" instrs stosw ; emit ;; [fall-through] emit_op: mov ax,bx stosw ; emit machine code for op pop ds ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; compile unary ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; compile_unary: cmp ax,TOK_DEREF ; check for "*(int*)" jne _not_deref ;; compile deref (load) call tok_next ; consume "*(int*)" mov ax,0x048b ; code for "mov ax,[si]" jmp emit_common_ptr_op ; [tail-call] _not_deref: cmp ax,TOK_LPAREN ; check for "*(int*)" jne _not_paren call compile_expr_tok_next ; consume "(" and compile expr jmp tok_next ; [tail-call] to consume ")" _not_paren: cmp ax,TOK_ADDR ; check for "&" jne _not_addr call tok_next ; consume "&" mov ax,0x068d ; code for "lea ax,[imm]" jmp emit_var ; [tail-call] to emit code _not_addr: test dl,dl ; check for tok_is_num je _not_int mov al,0xb8 ; code for "mov ax,imm" stosb ; emit jmp emit_tok ; [tail-call] to emit imm _not_int: ;; compile var mov ax,0x068b ; code for "mov ax,[imm]" ;; [fall-through] emit_var: stosw ; emit add bx,bx ; bx = 2*bx (scale up for 16-bit) ;; [fall-through] emit_tok: mov ax,bx stosw ; emit token value jmp tok_next ; [tail-call] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; get next token, setting the following: ;;; ax: token ;;; bx: token ;;; dl: tok_is_num ;;; dh: tok_is_call ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; tok_next2: call tok_next ;; [fall-through] tok_next: call getch cmp al,32 ; skip spaces (anything <= ' ' is considered space) jle tok_next xor bx,bx ; zero token reg xor cx,cx ; zero last-two chars reg cmp al,57 setle dl ; tok_is_num = (al <= '9') _nextch: cmp al,32 jle _done ; if char is space then break shl cx,8 mov cl,al ; shift this char into cx imul bx,10 sub ax,48 add bx,ax ; atoi computation: bx = 10 * bx + (ax - '0') call getch jmp _nextch ; [loop] _done: mov ax,cx cmp ax,0x2f2f ; check for single-line comment "//" je _comment_double_slash cmp ax,0x2f2a ; check for multi-line comment "/*" je _comment_multi_line cmp ax,0x2829 ; check for call parens "()" sete dh mov ax,bx ; return token in ax also ret _comment_double_slash: call getch ; get next char cmp al,10 ; check for newline '\n' jne _comment_double_slash ; [loop] jmp tok_next ; [tail-call] _comment_multi_line: call tok_next ; get next token cmp ax,65475 ; check for token "*/" jne _comment_multi_line ; [loop] jmp tok_next ; [tail-call] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; get next char: returned in ax (ah == 0, al == ch) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; getch: push dx ; need to save dx because tok_next uses it for flags xor si,si ; use ds:0 as a semi-colon buffer, encodes smaller via si mov ax,[si] ; load the semi-colon buffer xor [si],ax ; zero the buffer cmp al,59 ; check for ';' je getch_done ; if ';' return it getch_tryagain: mov ax,0x0200 xor dx,dx int 0x14 ; get a char from serial (bios function) and ah,0x80 ; check for failure and clear ah as a side-effect jne getch_tryagain ; failed, try again later cmp al,59 ; check for ';' jne getch_done ; if not ';' return it mov [si],ax ; save the ';' xor ax,ax ; return 0 instead, treated as whitespcae getch_done: pop dx ret ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; binary operator table ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; binary_oper_tbl: dw TOK_ADD,0xc103 ; add ax,cx dw TOK_SUB,0xc12b ; sub ax,cx dw TOK_MUL,0xe1f7 ; mul ax,cx dw TOK_AND,0xc123 ; and ax,cx dw TOK_OR,0xc10b ; or ax,cx dw TOK_XOR,0xc133 ; xor ax,cx dw TOK_SHL,0xe0d3 ; shl ax,cx dw TOK_SHR,0xf8d3 ; shr ax,cx dw TOK_EQ,0xc094 ; sete al dw TOK_NE,0xc095 ; setne al dw TOK_LT,0xc09c ; setl al dw TOK_GT,0xc09f ; setg al dw TOK_LE,0xc09e ; setle al dw TOK_GE,0xc09d ; setge al dw 0 ; [sentinel] ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;; boot signature ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; times 510-($-$$) db 0 db 0x55, 0xaa ================================================ FILE: samples/Astro/index.astro ================================================ --- // Component Imports import Tour from '../components/Tour.astro'; // You can import components from any supported Framework here! /* ASTRO:COMPONENT_IMPORTS */ // Component Script: // You can write any JavaScript/TypeScript that you'd like here. // It will run during the build, but never in the browser. // All variables are available to use in the HTML template below. let title = 'My Astro Site'; // Full Astro Component Syntax: // https://github.com/withastro/astro/blob/main/docs/core-concepts/astro-components.md --- {title}
Astro logo

Welcome to Astro

================================================ FILE: samples/Asymptote/figarc4_3D.asy ================================================ import graph3; //ASY file for figarc4_3D.asy in Chapter 7 size(200,200,IgnoreAspect); //currentprojection=perspective(7,2,1); currentprojection=orthographic((16.7,13.2,46),(0,1,0),(0,0,0),1,(-.0323,0.0012)); //currentprojection=orthographic((16.7,13.2,46),(0,1,0),(0,0,0),1,(0.0148,0.00673)); defaultrender.merge=true; usepackage("amsmath"); usepackage("mathspec"); texpreamble("\setallmainfonts[Mapping=tex-text]{Calibri}"); texpreamble("\setmainfont[Mapping=tex-text]{Calibri}"); texpreamble("\setsansfont[Mapping=tex-text]{Calibri}"); texpreamble("\setmathsfont(Greek){[cmmi10]}"); // setup and draw the axes real[] myxchoice={}; real[] myychoice={}; real[] myzchoice={}; defaultpen(0.5mm); pair xbounds=(-.25,2.1); pair ybounds=(-1.1,1.1); pair zbounds=(-1.1,1.1); xaxis3("",xbounds.x,xbounds.y,black,OutTicks(myxchoice),Arrow3(size=3mm)); yaxis3("",ybounds.x,ybounds.y,black,OutTicks(myychoice),Arrow3(size=3mm)); zaxis3("",zbounds.x,zbounds.y,invisible,OutTicks(myzchoice),Arrow3(size=3mm)); label("$x$",(xbounds.y+0.05*(xbounds.y-xbounds.x),0,0)); label("$y$",(0,ybounds.y+0.05*(ybounds.y-ybounds.x),0)); //label("$z$",(0,0,zbounds.y+0.05*(zbounds.y-zbounds.x))); //\addplot3[domain=.9:1.4,y domain=-210:150,samples y=36,surf,shader=flat,colormap={mp2}{\colormapone}] // ({x},{(.41*(x-.9)+.78)*sin(y)},{(.41*(x-.9)+.78)*cos(y)}); //\addplot3[domain=.5:1.9,,samples y=0,{\colorone},] ({x},{0},{(sin(deg(x)))}); //\addplot3[domain=0:360,,samples y=0,black,smooth] ({1.4},{.98*cos(x)},{.98*sin(x)}); //\addplot3[domain=130:330,,samples y=0,black,dashed,smooth] ({.9},{.78*cos(x)},{.78*sin(x)}); pen p=rgb(0,0,.7); triple f2(pair t) {return (t.x,(.41*(t.x-.9)+.78)*sin(t.y),(.41*(t.x-.9)+.78)*cos(t.y));} surface s2=surface(f2,(.9,0),(1.4,2*pi),2,16,Spline); draw(s2,emissive(rgb(.6,.6,1)+opacity(.7)),meshpen=p); triple g3(real t) {return (t,sin(t),0);} path3 p3=graph(g3,.5,1.9,operator ..); draw(p3,blue+.4mm); triple g3(real t) {return (.9,.78*sin(t),.78*cos(t));} path3 p3=graph(g3,0,2*pi,operator ..); draw(p3,blue+.2mm); triple g3(real t) {return (1.4,.985*sin(t),.985*cos(t));} path3 p3=graph(g3,0,2*pi,operator ..); draw(p3,blue+.2mm); draw((.9,.78,0)--(1.4,.985,0),red+.6mm); draw((.5,.05,0)--(.5,-.05,0),black+.2mm); label("$a$",(.5,-.05,0),S); draw((1.9,.05,0)--(1.9,-.05,0),black+.2mm); label("$b$",(1.9,-.05,0),S); draw((.9,.05,0)--(.9,-.05,0),black+.2mm); label("$x_i$",(.9,-.05,0),S); draw((1.4,.05,0)--(1.4,-.05,0),black+.2mm); label("$x_{i+1}$",(1.4,-.05,0),S); label(XY*"$\left.\rule{0pt}{40pt}\right\}\ R$",(1.4,.49,0),E,Embedded); label(XY*"$r\left\{\rule{0pt}{30pt}\right.$",(.85,.37,0),W,Embedded); label(rotate(20,(0,0,1))*"$\overbrace{\rule{41pt}{0pt}}^{\text{\normalsize \textit{L}}}$",(1.1,1.03,0),Embedded); // //////////////////////////////////// // SAMPLE CODE // defaultpen(fontsize(10pt)); //real f(pair z) {return -z.x^4+2*z.x^2-z.y^4+2*z.y^2;} //surface s=surface(f,(-1.5,-1.5),(1.5,1.5),Spline); //pen p=rgb(0,0,.7); //draw(s,rgb(.6,.6,1)+opacity(.7),meshpen=p); //triple f(pair t) { // return (cos(t.x)*1.5*cos(t.y),sin(t.x)*cos(t.y),sin(t.y)); //} //surface s=surface(f,(0,0),(pi,2*pi),8,8,Spline); //pen p=rgb(0,0,.7); //draw(s,rgb(.6,.6,1)+opacity(.7),meshpen=p); //draw(s,paleblue); //draw(s,lightblue,meshpen=black+thick(),nolight,render(merge=true)); //draw(mypath,2bp+blue); //triple g(real t) {return (t,t,-2*t^4+4*t^2);} //path3 mypath=graph(g,-1,1,operator ..); //draw(mypath,blue+dashed+linewidth(2)); //pen p=rgb(0,0,1); //draw(s,paleblue+opacity(.5),meshpen=p,render(merge=true)); ================================================ FILE: samples/Asymptote/kappa-sawteeth.asy ================================================ import wtk_graph; size(15cm,10cm,IgnoreAspect); scale(Linear, Linear); real xscale=1e9; real fscale=1e12; void graphSawtooth(string file="datafile", real k, int xcol=0, int fcol=1, real xscale=1, real fscale=1, real dx=0, real df=0, pen p=red, string t="Title") { file fin=input(file).line(); real[][] a=fin.dimension(0,0); a=transpose(a); real[] x=a[xcol]; real[] f=a[fcol]; x = x - f/k; /* Remove cantilever extension */ graphData(x=x, y=f, xscale=xscale, yscale=fscale, dx=dx, dy=df, p=p, t=t, dots=false); } real[] k = {0.001, 0.01, 0.05, 0.1, 0.5, 1, 10}; pen[] p = {blue, green, red, cyan, magenta, yellow, black}; int i; for (i=k.length-1; i>=0; --i) {/* count down so legend and plot orders match */ string file = format("k-%f", k[i])+"."+"dat"; /* We break up .dat so the Asymptote scanner doesn't pick up * .dat as a dependency (which obviously doesn't exist). */ string label = math("k="+units(format("%f",k[i]*1e3), "pN/nm")); if (k[i] >= 1) label = math("k="+units(format("%f",k[i]),"nN/nm")); // TODO: rainbow pen(N, i) graphSawtooth(file=file, k=k[i], xscale=xscale, fscale=fscale, df=300e-12*i, p=p[i], t=label); } xlimits(0, 300e-9*xscale, crop=true); xaxis(sLabel("Distance (nm) ($x_t-x_c$)"), BottomTop, LeftTicks); yaxis(sLabel("Force (pN)"), LeftRight, RightTicks); label(sLabel("Simulated force curves"), point(N), N); add(legend(), point(E), 20E); //add(lengend(). point(E), 20E); //, UnFill); ================================================ FILE: samples/AutoHotkey/hello.ahk ================================================ MsgBox, Hello`, World! ================================================ FILE: samples/Avro IDL/user.avdl ================================================ @namespace("keybase.1") protocol user { import idl "common.avdl"; record TrackProof { string proofType; string proofName; string idString; } record WebProof { string hostname; array protocols; } record Proofs { array social; array web; array publicKeys; } record UserSummary { UID uid; string username; string fullName; union { null, LinkID } linkID; } record UserSummarySet { array users; Time time; int version; } /** listTracking gets verified data from the tracking statements in the user's sigchain. However, it does not check to make sure the tracked users have not reset since the track statement. If assertion is empty, it will use the current logged in user. */ UserSummarySet listTracking(int sessionID, string filter, string assertion); string listTrackingJSON(int sessionID, string filter, boolean verbose, string assertion); /** listTrackersUnverified returns the users following the given user, and is unverified and server-trust. */ UserSummarySet listTrackersUnverified(int sessionID, string assertion); @typedef("string") record EmailAddress {} record Email { EmailAddress email; boolean isVerified; boolean isPrimary; IdentityVisibility visibility; UnixTime lastVerifyEmailDate; } record UserSettings { array emails; array phoneNumbers; } /** Load a user from the server. */ User loadUser(int sessionID, UID uid); User loadUserByName(int sessionID, string username); /** Load a user + device keys from the server. */ UserPlusKeys loadUserPlusKeys(int sessionID, UID uid, KID pollForKID); UserPlusKeysV2AllIncarnations loadUserPlusKeysV2( int sessionID, UID uid, KID pollForKID, OfflineAvailability oa ); /** Load public keys for a user. */ array loadPublicKeys(int sessionID, UID uid); /** Load my public keys (for logged in user). */ array loadMyPublicKeys(int sessionID); /** Load user settings (for logged in user). */ UserSettings loadMySettings(int sessionID); /** Load all the user's public keys (even those in reset key families) from the server with no verification */ array loadAllPublicKeysUnverified(int sessionID, UID uid); void profileEdit(int sessionID, string fullName, string location, string bio); record InterestingPerson { UID uid; string username; string fullname; map serviceMap; } array interestingPeople(int maxUsers, string namespace); UserVersion meUserVersion(int sessionID, boolean forcePoll); /** getUPAK returns a UPAK. Used mainly for debugging. */ @lint("ignore") UPAKVersioned getUPAK(UID uid, boolean unstubbed); /** getUPAKLite returns a UPKLiteV1AllIncarnations. Used mainly for debugging. */ @lint("ignore") UPKLiteV1AllIncarnations getUPAKLite(UID uid); void uploadUserAvatar(string filename, union { null, ImageCropRect } crop); ProofSuggestionsRes proofSuggestions(int sessionID); record ProofSuggestionsRes{ array suggestions; boolean showMore; } // A proof the user doesn't have. record ProofSuggestion { string key; boolean belowFold; string profileText; // "Prove your Twitter", "Add a PGP key" array profileIcon; array profileIconDarkmode; string pickerText; // "Twitter", "Your own website", "octodon.xyz" string pickerSubtext; // "twitter.com", "Mastodon instance" array pickerIcon; array pickerIconDarkmode; array metas; // for 'new' proof types } record NextMerkleRootRes { union { null, MerkleRootV2 } res; } /** FindNextMerkleRootAfterRevoke finds the first Merkle Root that contains the UID/KID revocation at the given SigChainLocataion. The MerkleRootV2 prev is a hint as to where we'll start our search. Usually it's the next one, but not always */ NextMerkleRootRes findNextMerkleRootAfterRevoke(UID uid, KID kid, SigChainLocation loc, MerkleRootV2 prev); /** FindNextMerkleRootAfterReset finds the first Merkle root that contains the UID reset at resetSeqno. You should pass it prev, which was the last known Merkle root at the time of the reset. Usually, we'll just turn up the next Merkle root, but not always. */ NextMerkleRootRes findNextMerkleRootAfterReset(UID uid, Seqno resetSeqno, ResetMerkleRoot prev); /** PassphraseState values are used in .config.json, so should not be changed without a migration strategy */ enum PassphraseState { KNOWN_0, RANDOM_1 } record CanLogoutRes { boolean canLogout; string reason; PassphraseState passphraseState; } CanLogoutRes canLogout(int sessionID); PassphraseState loadPassphraseState(int sessionID); union { null, UserCard } userCard(int sessionID, string username, boolean useSession); // user.passphrase_state gregor message body @lint("ignore") record UserPassphraseStateMsg { @jsonkey("state") PassphraseState passphraseState; } record UserBlockedRow { @jsonkey("block_uid") UID uid; @jsonkey("block_username") string username; @jsonkey("chat") union { null, boolean } chat; @jsonkey("follow") union { null, boolean } follow; } enum UserBlockType { CHAT_0, FOLLOW_1 } // user.blocked gregor message body record UserBlockedBody { @jsonkey("blocks") array blocks; // The user who blocked (should be the currently logged-in user). @jsonkey("blocker_uid") UID uid; @jsonkey("blocker_username") string username; } record UserBlockState { UserBlockType blockType; boolean blocked; } record UserBlockedSummary { string blocker; map> blocks; } // User Blocking record UserBlock { string username; boolean chatBlocked; boolean followBlocked; union { null, Time } createTime; union { null, Time } modifyTime; } record UserBlockArg { string username; union { null, boolean } setChatBlock; union { null, boolean } setFollowBlock; } void setUserBlocks(int sessionID, array blocks); array getUserBlocks(int sessionID, array usernames); void reportUser(int sessionID, string username, string reason, string comment, boolean includeTranscript, union { null, string } convID); void dismissBlockButtons(TLFID tlfID); // Legacy user blocking: void blockUser(string username); void unblockUser(string username); // Team blocking record TeamBlock { @jsonkey("fq_name") string teamName; @jsonkey("ctime") Time createTime; } array getTeamBlocks(int sessionID); } ================================================ FILE: samples/Awk/test.awk ================================================ #!/bin/awk -f BEGIN { # It is not possible to define output file names here because # FILENAME is not define in the BEGIN section n = ""; printf "Generating data files ..."; network_max_bandwidth_in_byte = 10000000; network_max_packet_per_second = 1000000; last3 = 0; last4 = 0; last5 = 0; last6 = 0; } { if ($1 ~ /Average/) { # Skip the Average values n = ""; next; } if ($2 ~ /all/) { # This is the cpu info print $3 > FILENAME".cpu.user.dat"; # print $4 > FILENAME".cpu.nice.dat"; print $5 > FILENAME".cpu.system.dat"; # print $6 > FILENAME".cpu.iowait.dat"; print $7 > FILENAME".cpu.idle.dat"; print 100-$7 > FILENAME".cpu.busy.dat"; } if ($2 ~ /eth0/) { # This is the eth0 network info if ($3 > network_max_packet_per_second) print last3 > FILENAME".net.rxpck.dat"; # Total number of packets received per second. else { last3 = $3; print $3 > FILENAME".net.rxpck.dat"; # Total number of packets received per second. } if ($4 > network_max_packet_per_second) print last4 > FILENAME".net.txpck.dat"; # Total number of packets transmitted per second. else { last4 = $4; print $4 > FILENAME".net.txpck.dat"; # Total number of packets transmitted per second. } if ($5 > network_max_bandwidth_in_byte) print last5 > FILENAME".net.rxbyt.dat"; # Total number of bytes received per second. else { last5 = $5; print $5 > FILENAME".net.rxbyt.dat"; # Total number of bytes received per second. } if ($6 > network_max_bandwidth_in_byte) print last6 > FILENAME".net.txbyt.dat"; # Total number of bytes transmitted per second. else { last6 = $6; print $6 > FILENAME".net.txbyt.dat"; # Total number of bytes transmitted per second. } # print $7 > FILENAME".net.rxcmp.dat"; # Number of compressed packets received per second (for cslip etc.). # print $8 > FILENAME".net.txcmp.dat"; # Number of compressed packets transmitted per second. # print $9 > FILENAME".net.rxmcst.dat"; # Number of multicast packets received per second. } # Detect which is the next info to be parsed if ($2 ~ /proc|cswch|tps|kbmemfree|totsck/) { n = $2; } # Only get lines with numbers (real data !) if ($2 ~ /[0-9]/) { if (n == "proc/s") { # This is the proc/s info print $2 > FILENAME".proc.dat"; # n = ""; } if (n == "cswch/s") { # This is the context switches per second info print $2 > FILENAME".ctxsw.dat"; # n = ""; } if (n == "tps") { # This is the disk info print $2 > FILENAME".disk.tps.dat"; # total transfers per second print $3 > FILENAME".disk.rtps.dat"; # read requests per second print $4 > FILENAME".disk.wtps.dat"; # write requests per second print $5 > FILENAME".disk.brdps.dat"; # block reads per second print $6 > FILENAME".disk.bwrps.dat"; # block writes per second # n = ""; } if (n == "kbmemfree") { # This is the mem info print $2 > FILENAME".mem.kbmemfree.dat"; # Amount of free memory available in kilobytes. print $3 > FILENAME".mem.kbmemused.dat"; # Amount of used memory in kilobytes. This does not take into account memory used by the kernel itself. print $4 > FILENAME".mem.memused.dat"; # Percentage of used memory. # It appears the kbmemshrd has been removed from the sysstat output - ntolia # print $X > FILENAME".mem.kbmemshrd.dat"; # Amount of memory shared by the system in kilobytes. Always zero with 2.4 kernels. # print $5 > FILENAME".mem.kbbuffers.dat"; # Amount of memory used as buffers by the kernel in kilobytes. print $6 > FILENAME".mem.kbcached.dat"; # Amount of memory used to cache data by the kernel in kilobytes. # print $7 > FILENAME".mem.kbswpfree.dat"; # Amount of free swap space in kilobytes. # print $8 > FILENAME".mem.kbswpused.dat"; # Amount of used swap space in kilobytes. print $9 > FILENAME".mem.swpused.dat"; # Percentage of used swap space. # n = ""; } if (n == "totsck") { # This is the socket info print $2 > FILENAME".sock.totsck.dat"; # Total number of used sockets. print $3 > FILENAME".sock.tcpsck.dat"; # Number of TCP sockets currently in use. # print $4 > FILENAME".sock.udpsck.dat"; # Number of UDP sockets currently in use. # print $5 > FILENAME".sock.rawsck.dat"; # Number of RAW sockets currently in use. # print $6 > FILENAME".sock.ip-frag.dat"; # Number of IP fragments currently in use. # n = ""; } } } END { print " '" FILENAME "' done."; } ================================================ FILE: samples/B (Formal Method)/Airlock.mch ================================================ /* Airlock * Author: * Creation date: 10/21/25 */ MACHINE Airlock SEES Airlock_pressure_bs SETS PHASE = {ACQ, CTRL} VARIABLES airlock_pressure1, airlock_pressure2, airlock_pressure3, is_indoor_door_openable, is_outdoor_door_openable, cycle INVARIANT airlock_pressure1 : PRESSURE & airlock_pressure2 : PRESSURE & airlock_pressure3 : PRESSURE & is_indoor_door_openable : BOOL & is_outdoor_door_openable : BOOL & cycle : PHASE & not(is_indoor_door_openable = TRUE & is_outdoor_door_openable = TRUE) INITIALISATION airlock_pressure1 :: PRESSURE || airlock_pressure2 :: PRESSURE || airlock_pressure3 :: PRESSURE || is_indoor_door_openable := FALSE || is_outdoor_door_openable := FALSE || cycle := ACQ OPERATIONS actualize_pressure = PRE cycle = ACQ THEN airlock_pressure1 :: PRESSURE || airlock_pressure2 :: PRESSURE || airlock_pressure3 :: PRESSURE || cycle := CTRL END; enable_doors_opening = PRE cycle = CTRL THEN is_indoor_door_openable, is_outdoor_door_openable: ( is_indoor_door_openable: BOOL & is_outdoor_door_openable: BOOL & (is_indoor_door_openable = TRUE => (indoor_pressure: {airlock_pressure1, airlock_pressure2, airlock_pressure3} & outdoor_pressure /: {airlock_pressure1, airlock_pressure2, airlock_pressure3})) & (is_outdoor_door_openable = TRUE => (outdoor_pressure: {airlock_pressure1, airlock_pressure2, airlock_pressure3} & indoor_pressure /: {airlock_pressure1, airlock_pressure2, airlock_pressure3})) ) || cycle := ACQ END; ret <-- get_airlock_pressure1 = PRE ret : PRESSURE THEN ret := airlock_pressure1 END; ret <-- get_airlock_pressure2 = PRE ret : PRESSURE THEN ret := airlock_pressure2 END; ret <-- get_airlock_pressure3 = PRE ret : PRESSURE THEN ret := airlock_pressure3 END; ret <-- get_is_indoor_door_openable= PRE ret : BOOL THEN ret := is_indoor_door_openable END; ret <-- get_is_outdoor_door_openable= PRE ret : BOOL THEN ret := is_outdoor_door_openable END; ret <-- get_cycle = PRE ret : PHASE THEN ret := cycle END END ================================================ FILE: samples/B (Formal Method)/Leftpad.mch ================================================ // Created by Ilya Shchepetkov MACHINE Leftpad // Chars are modeled as some set. Strings are sequences of chars. SETS Chars OPERATIONS result ← leftpad(cc, nn, ss) = // Precondition of the operation defines types of its parameters PRE cc ∈ Chars ∧ nn ∈ ℕ ∧ ss ∈ seq(Chars) THEN // ANY allows to introduce a local variable // and to constraint its possible values with a predicate ANY vv WHERE vv ∈ seq(Chars) ∧ // 1. The length of the output is max(n, len(str)) size(vv) = max({nn, size(ss)}) ∧ // 2. The prefix of the output is padding characters and nothing but padding characters ∀ii . (ii ∈ ℕ ∧ ii ≥ 0 ∧ ii < nn - size(ss) ⇒ vv(ii + 1) = cc) ∧ // 3. The suffix of the output is the original string. ∀ii . (ii ∈ ℕ ∧ ii ≥ 0 ∧ ii < size(ss) ⇒ vv(max({nn - size(ss), 0}) + ii + 1) = ss(ii + 1)) THEN result := vv END END END ================================================ FILE: samples/B4X/B4XMainPage.bas ================================================ B4A=true Group=Default Group ModulesStructureVersion=1 Type=Class Version=9.85 @EndOfDesignText@ #Region Shared Files #CustomBuildAction: folders ready, %WINDIR%\System32\Robocopy.exe,"..\..\Shared Files" "..\Files" 'Ctrl + click to sync files: ide://run?file=%WINDIR%\System32\Robocopy.exe&args=..\..\Shared+Files&args=..\Files&FilesSync=True #End Region 'Ctrl + click to export as zip: ide://run?File=%B4X%\Zipper.jar&Args=Project.zip&VMArgs=-DZeroSharedFiles%3DTrue Sub Class_Globals Private Root As B4XView Private xui As XUI Public mGame As Game End Sub Public Sub Initialize ' B4XPages.GetManager.LogEvents = True End Sub 'This event will be called once, before the page becomes visible. Private Sub B4XPage_Created (Root1 As B4XView) #if B4A or B4J Root = Root1 #else if B4i 'handle iPhone safe area Root = xui.CreatePanel("") Root1.Color = xui.Color_Black Root1.AddView(Root, 0, 0, Root1.Width, Root1.Height) #end if If Root.Width = 0 Or Root.Height = 0 Then Wait For B4XPage_Resize(Width As Int, Height As Int) End If #if B4i Dim r As Rect = B4XPages.GetNativeParent(Me).SafeAreaInsets Root.SetLayoutAnimated(0, r.Left, r.Top, Width - r.Right - r.Left, Height - r.Bottom - r.Top) #end if mGame.Initialize(Root) mGame.Start End Sub Private Sub B4XPage_Resize (Width As Int, Height As Int) mGame.Resize End Sub Private Sub B4XPage_Appear End Sub Private Sub B4XPage_Disappear If mGame.IsInitialized Then mGame.Pause End If End Sub ================================================ FILE: samples/B4X/OAuth.bas.bas ================================================ B4J=true Group=Network ModulesStructureVersion=1 Type=Class Version=8.5 @EndOfDesignText@ #Event: SignedIn (Result As PLMResult) Sub Class_Globals Private su As StringUtils #if B4A Private LastIntent As Intent #end if #if B4J Private serversock As ServerSocket Private fx As JFX Private port As Int = 51067 Private astream As AsyncStreams #End if Private mCallback As Object Private mEventName As String Private packageName As String 'ignore Private CurrentlySignedInServer As PLMServer End Sub Public Sub Initialize (Callback As Object, EventName As String) mCallback = Callback mEventName = EventName #if B4A packageName = Application.PackageName #Else If B4i packageName = GetPackageName #End If End Sub Public Sub RegisterApp (Server As PLMServer) As ResumableSub Dim j As HttpJob j.Initialize("", Me) Dim sb As StringBuilder sb.Initialize sb.Append("client_name=").Append(su.EncodeUrl(Constants.AppName, "UTF8")) sb.Append("&redirect_uris=").Append(su.EncodeUrl(GetRedirectUri, "UTF8")) sb.Append("&scopes=read+write+follow+push") sb.Append("&website=").Append("https://www.b4x.com") Dim res As PLMResult Try j.PostString(Server.URL & "/api/v1/apps", sb.ToString) Catch Log(LastException) Return B4XPages.MainPage.CreatePLMResult(False, LastException) End Try Wait For (j) JobDone (j As HttpJob) If j.Success Then Try Dim m As Map = B4XPages.MainPage.TextUtils1.JsonParseMap(j.GetString) If m.IsInitialized Then Server.AppClientId = m.Get("client_id") Server.AppClientSecret = m.Get("client_secret") Log("server client id and secret set.") B4XPages.MainPage.PersistUserAndServers res = B4XPages.MainPage.CreatePLMResult2(True, "") End If Catch res = B4XPages.MainPage.CreatePLMResult(False, LastException) Log(LastException) End Try Else res = B4XPages.MainPage.CreatePLMResult2(False, j.ErrorMessage) End If j.Release If Server.AppClientSecret = "" Then res = B4XPages.MainPage.CreatePLMResult2(False, "client secret empty") Return res End Sub Public Sub SignIn (User As PLMUser, Server As PLMServer) Dim link As String = BuildLink(Server.URL & "/oauth/authorize", _ CreateMap("client_id": Server.AppClientId, _ "redirect_uri": GetRedirectUri, _ "response_type": "code", "scope": "read write follow push")) B4XPages.MainPage.ShowExternalLink(link) CurrentlySignedInServer = Server #if B4J PrepareServer #end if End Sub Private Sub BuildLink(Url As String, Params As Map) As String Dim sb As StringBuilder sb.Initialize sb.Append(Url) If Params.Size > 0 Then sb.Append("?") For Each k As String In Params.Keys sb.Append(su.EncodeUrl(k, "utf8")).Append("=").Append(su.EncodeUrl(Params.Get(k), "utf8")) sb.Append("&") Next sb.Remove(sb.Length - 1, sb.Length) End If Return sb.ToString End Sub #if B4J Private Sub PrepareServer If serversock.IsInitialized Then serversock.Close If astream.IsInitialized Then astream.Close Do While True Try serversock.Initialize(port, "server") serversock.Listen Exit Catch port = port + 1 Log(LastException) End Try Loop Wait For server_NewConnection (Successful As Boolean, NewSocket As Socket) If Successful Then astream.Initialize(NewSocket.InputStream, NewSocket.OutputStream, "astream") Dim Response As StringBuilder Response.Initialize Do While Response.ToString.Contains("Host:") = False Wait For AStream_NewData (Buffer() As Byte) Response.Append(BytesToString(Buffer, 0, Buffer.Length, "UTF8")) Loop astream.Write(("HTTP/1.0 200" & Chr(13) & Chr(10)).GetBytes("UTF8")) Sleep(50) astream.Close serversock.Close ParseBrowserUrl(Regex.Split2("$",Regex.MULTILINE, Response.ToString)(0)) End If End Sub #else if B4A Public Sub CallFromResume(Intent As Intent) If IsNewOAuth2Intent(Intent) Then LastIntent = Intent ParseBrowserUrl(Intent.GetData) End If End Sub Private Sub IsNewOAuth2Intent(Intent As Intent) As Boolean Return Intent.IsInitialized And Intent <> LastIntent And Intent.Action = Intent.ACTION_VIEW And _ Intent.GetData <> Null And Intent.GetData.StartsWith(Application.PackageName) End Sub #else if B4I Public Sub CallFromOpenUrl (url As String) If url.StartsWith(packageName & ":/oath") Then ParseBrowserUrl(url) End If Sleep(0) Dim no As NativeObject = B4XPages.MainPage.safari no = no.GetField("safari") If no.IsInitialized Then no.RunMethod("dismissViewControllerAnimated:completion:", Array(True, Null)) End If End Sub Private Sub GetPackageName As String Dim no As NativeObject no = no.Initialize("NSBundle").RunMethod("mainBundle", Null) Dim name As Object = no.RunMethod("objectForInfoDictionaryKey:", Array("CFBundleIdentifier")) Return name End Sub #end if Private Sub ParseBrowserUrl(Response As String) Dim m As Matcher = Regex.Matcher("code=([^&\s]+)", Response) If m.Find Then Dim code As String = m.Group(1) GetTokenFromAuthorizationCode(code) Else Log("Error parsing server response: " & Response) RaiseEvent(B4XPages.MainPage.CreatePLMResult2(False, "Error parsing server response: " & Response)) End If End Sub Private Sub GetTokenFromAuthorizationCode (Code As String) Dim user As PLMUser = B4XPages.MainPage.User Dim server As PLMServer = CurrentlySignedInServer Log(Code) Log("Getting access token from authorization code...") Dim j As HttpJob j.Initialize("", Me) Dim postString As String = $"code=${Code}&client_id=${server.AppClientId}&grant_type=authorization_code&redirect_uri=${su.EncodeUrl(GetRedirectUri, "UTF8")}"$ postString = postString & $"&client_secret=${server.AppClientSecret}&scope=read+write+follow+push"$ j.PostString(server.URL & "/oauth/token", postString) Wait For (j) JobDone(j As HttpJob) If j.Success Then Dim m As Map = B4XPages.MainPage.TextUtils1.JsonParseMap(j.GetString) If m.IsInitialized Then user.AccessToken = m.Get("access_token") user.MeURL = m.Get("me") Wait For (VerifyUser (CurrentlySignedInServer)) Complete (Result As PLMResult) j.Release RaiseEvent(Result) Else RaiseEvent(B4XPages.MainPage.CreatePLMResult2(False, "Failed to parse server response: " & j.GetString)) End If Else RaiseEvent(B4XPages.MainPage.CreatePLMResult2(False, j.ErrorMessage)) End If j.Release End Sub Private Sub RaiseEvent(Result As PLMResult) CallSubDelayed2(mCallback, mEventName & "_SignedIn", Result) End Sub Private Sub GetRedirectUri As String #if B4J Return "http://127.0.0.1:" & port #Else Return packageName & ":/oath" #End If End Sub Public Sub VerifyUser (Server As PLMServer) As ResumableSub Dim user As PLMUser = B4XPages.MainPage.User Dim j As HttpJob j.Initialize("", Me) j.Download(Server.URL & "/api/v1/accounts/verify_credentials") j.GetRequest.SetHeader("Authorization", "Bearer " & user.AccessToken) Dim res As PLMResult Wait For (j) JobDone(j As HttpJob) If j.Success Then Dim m As Map = B4XPages.MainPage.TextUtils1.JsonParseMap(j.GetString) If m.IsInitialized Then user.DisplayName = m.Get("display_name") If user.DisplayName = "" Then user.DisplayName = m.Get("username") user.Avatar = m.Get("avatar") user.Id = m.Get("id") user.Note = m.Get("note") user.Acct = m.Get("acct") res = B4XPages.MainPage.CreatePLMResult2(True, "") Else res = B4XPages.MainPage.CreatePLMResult2(False, "Failed to parse server response: " & j.GetString) End If Else res = B4XPages.MainPage.CreatePLMResult2(False, j.ErrorMessage) Log(j.ErrorMessage) End If j.Release Return res End Sub Public Sub AddAuthorization (job As HttpJob) Dim user As PLMUser = B4XPages.MainPage.User If user.SignedIn Then job.GetRequest.SetHeader("Authorization", "Bearer " & user.AccessToken) End If End Sub ================================================ FILE: samples/B4X/RequestsManager.bas ================================================ B4J=true Group=Network ModulesStructureVersion=1 Type=Class Version=8.45 @EndOfDesignText@ Sub Class_Globals End Sub Public Sub Initialize End Sub Public Sub CancelRequest (URL As String, Job As HttpJob) If HttpUtils2Service.hc.IsInitialized = False Then Return #if B4J or B4A Dim Jo As JavaObject = HttpUtils2Service.hc Dim OkHttpClient As JavaObject = Jo.GetField("client") Dim RunningCalls As List = OkHttpClient.RunMethodJO("dispatcher", Null).RunMethod("runningCalls", Null) For Each call As JavaObject In RunningCalls Dim req As JavaObject = call.RunMethod("request", Null) Dim s As String = req.RunMethod("url", Null) If s = URL Then call.RunMethod("cancel", Null) Return End If Next For Each j As HttpJob In HttpUtils2Service.TaskIdToJob.Values If j = Job Then If j.Out.IsInitialized Then j.Out.Close Return End If Next #else if B4i Dim no As NativeObject = HttpUtils2Service.hc Dim session As NativeObject = no.GetField("session") no = Me no.RunMethod("cancelDownload::", Array(session, Job.req)) #end if End Sub #if OBJC - (void) cancelDownload:(NSURLSession*)session :(B4IHttpRequest*)req{ [session getTasksWithCompletionHandler:^(NSArray *dataTasks, NSArray *uploadTasks, NSArray *downloadTasks) { //NSLog(@"data: %@, \nupload: %@, \ndownload: %@", dataTasks, uploadTasks, downloadTasks); @try { for (NSURLSessionDownloadTask* task in downloadTasks) { if ([task.originalRequest.URL isEqual:((NSURLRequest*)req.object).URL]) { [task cancel]; } } } @catch (NSException *exception) { NSLog(@"%@", exception); } }]; } #End If ================================================ FILE: samples/BASIC/GPIOGW.BAS ================================================ 1 REM GWBASIC program to control MCP23S17 I/O expander inside PC Emulator 10 CLS 20 REM 30 REM check for I/O available 40 IF (INP(&HE0) AND 1) = 0 THEN GOTO 1100 80 REM 90 REM Setup Port A and B as Outputs 100 OUT &HE1, &HFF 110 OUT &HE2, &HFF 120 REM 130 PRINT "on/off Port A and B" 140 FOR I = 1 TO 4 150 OUT &HE5, 255 160 OUT &HE6, 255 170 FOR D = 1 TO 200: NEXT 180 OUT &HE5, 0 190 OUT &HE6, 0 200 FOR D = 1 TO 200: NEXT 210 NEXT 220 REM 230 PRINT "on/off single GPIO A0 to B2" 240 FOR I = 1 TO 4 250 FOR GPIO = 0 TO 10 260 OUT &HE7, GPIO 270 OUT &HE9, 0 280 OUT &HE7, GPIO + 1 290 OUT &HE9, 1 300 FOR D = 1 TO 50: NEXT 310 NEXT 320 FOR GPIO = 10 TO 0 STEP -1 330 OUT &HE7, GPIO 340 OUT &HE9, 0 350 IF GPIO > 0 THEN: OUT &HE7, GPIO - 1 360 OUT &HE9, 1 370 FOR D = 1 TO 50: NEXT 380 NEXT 390 NEXT 400 REM 410 PRINT "Check for B3 to B7 as Inputs..." 420 PRINT "Press any key to stop" 430 OUT &HE2, &H7: REM setup GPIO B3 to B7 as inputs (bits 3..7 = 0) 440 WHILE LEN(INKEY$) = 0 450 FOR GPIO = 11 TO 15 460 GOSUB 1000: REM checkGPIO (gpio) 470 NEXT 480 WEND 490 END 1000 REM SUB checkGPIO (gpio) 1010 OUT &HE7, GPIO 1020 IF INP(&HE9) <> 1 THEN RETURN 1030 PRINT "pressed "; GPIO; "..."; 1040 WHILE INP(&HE9): WEND 1050 PRINT "released" 1070 RETURN 1099 REM 1100 REM expander not available 1110 PRINT "Extended I/O not available on this board!" 1120 END  ================================================ FILE: samples/BASIC/P180.BAS ================================================ 10 PRINT "PROGRAM FILE 180: EXCEPTION - EVALUATION OF NUMERIC" 20 PRINT " EXPRESSIONS IN THE ON-GOTO STATEMENT." 30 PRINT " ANSI STANDARD 7.5, 10.2, 10.5" 40 PRINT 50 PRINT "SECTION 180.1: EXCEPTION - EVALUATION OF NUMERIC" 60 PRINT " EXPRESSIONS IN THE ON-GOTO STATEMENT." 70 PRINT 80 PRINT "THIS SECTION TESTS THE EFFECT OF USING EXPRESSIONS," 90 PRINT "WHICH CAUSE NON-FATAL EXCEPTIONS, TO CONTROL THE ON-GOG." 100 PRINT 130 PRINT "TO PASS THIS TEST:" 140 PRINT 150 PRINT " 1) TWO EXCEPTIONS MUST BE REPORTED: DIVISION " 160 PRINT " BY ZERO AND ON-GOTO OUT OF RANGE, AND" 170 PRINT 180 PRINT " 2) EXECUTION MUST TERMINATE." 190 PRINT 193 PRINT " BEGIN TEST." 196 PRINT 200 PRINT "ABOUT TO EXECUTE:" 210 PRINT " ON 1E-33 / 0 GOTO ..." 220 LET A=0 230 LET C=1E-33 240 PRINT 250 ON C/A GOTO 280,300,320 260 LET I=0 270 GOTO 340 280 LET I=1 290 GOTO 340 300 LET I=2 310 GOTO 340 320 LET I=3 330 GOTO 340 340 PRINT 350 PRINT " PATH TAKEN FOR CONTROL-EXPRESSION = ";I 360 PRINT "*** TEST FAILED: EXECUTION DID NOT TERMINATE ***" 370 PRINT 380 PRINT " END TEST." 390 PRINT 400 PRINT "END PROGRAM 180" 410 END ================================================ FILE: samples/BASIC/mandelbrot.bas ================================================ 10 REM Mandelbrot Set with ANSI Colors in BASIC 20 REM https://github.com/telnet23 30 REM 20 November 2020 40 CLS 50 MAXK = 32 60 MINRE = -2.5 70 MAXRE = 1.5 80 MINIM = -1.5 90 MAXIM = 1.5 100 FOR X = 1 TO WIDTH 110 FOR Y = 1 TO HEIGHT 120 LOCATE Y, X 130 REC = MINRE + (MAXRE - MINRE) / (WIDTH - 1) * (X - 1) 140 IMC = MINIM + (MAXIM - MINIM) / (HEIGHT - 1) * (Y - 1) 150 K = 0 160 REF = 0 170 IMF = 0 180 K = K + 1 190 REF = REC + REF * REF - IMF * IMF 200 IMF = IMC + REF * IMF + REF * IMF 210 IF REF * REF + IMF * IMF > 4 THEN GOTO 230 220 IF K < MAXK THEN GOTO 180 230 M = 40 + INT(8 / MAXK * (K - 1)) 240 PRINT CHR$(27) + "[" + STR$(M) + "m"; 250 PRINT " "; 260 PRINT CHR$(27) + "[49m"; 270 NEXT Y 280 NEXT X ================================================ FILE: samples/BASIC/spacesc.bas ================================================ 10 ' - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 20 ' SPACE ESCAPE! By Neil C. Obremski (Feb-Mar 2011), Music by Scott Happell 30 ' 40 DEFINT A-Z: KEY OFF: RANDOMIZE TIMER: OPTION BASE 1 50 DEF FNRAND (N) = 1 + FIX(RND * N) 60 DEF FNMOVE (N) = FIX(RND * 3) - 1 70 DEF FNSEEK (ME, YOU) = ME + SGN(YOU - ME) 80 HS! = 0: LS = 0 ' High Score and Saved Location 90 ON ERROR GOTO 9700 100 ' Initialize Keyboard (ESC=QUIT, ARROW KEYS=MOVE) 110 KEY 15, CHR$(0) + CHR$(1): KEY(15) ON: ON KEY(15) GOSUB 9990 120 KEY(11) ON: KEY(12) ON: KEY(13) ON: KEY(14) ON 130 ON KEY(11) GOSUB 160: ON KEY(12) GOSUB 170 140 ON KEY(13) GOSUB 180: ON KEY(14) GOSUB 190 150 GOTO 200 160 MY = MY - 1: RETURN ' 11 = ARROW UP 170 MX = MX - 1: RETURN ' 12 = ARROW LEFT 180 MX = MX + 1: RETURN ' 13 = ARROW RIGHT 190 MY = MY + 1: RETURN ' 14 = ARROW DOWN 200 ' Initialize Star Field 210 SC = 0: DIM SX(31), SY(31), SS(31), SO(31) 220 FOR I = 1 TO 31 230 SX(I) = FIX(RND * 320): SY(I) = FIX(RND * 200) 240 SS(I) = .5 + (((31 - I) / 31) * 5) 250 SO(I) = 0 260 NEXT I 270 ' Initialize Palette Rotation DATA and Music List 280 DATA 14, 8, 13, 5, 14, 6, 13, 13, 14, 14, 13, 5, 14, 8, 13, 13, 14, 6, 13, 5, 14, 14, 13, 13, 0, 0 290 DIM BGM$(10): ON PLAY(2) GOSUB 9600 300 ' Initialize Variables / Reset Game 310 I = 0: N = 0 ' Misc. Integer Register 320 PX = 20: OX = PX: PY = 8: OY = PY: PT! = 0 ' Player 330 TX = 0: TY = 0: TD = 0: TS = 0 ' Missile (Torpedo) 340 FX = 0: FY = 0: FD = 0: FS = 0 ' Fragment (X,Y,dir,speed) 350 AX = 0: AH = 0: AL = 0 ' Asteroid (X, height, and Length) 360 WX = 0: WY = 0 ' Worm Hole 370 L = LS ' Location 380 DX = 0: DM$ = "" ' Dash Message 390 C1 = 1: C2 = 2: C3 = 3: C4 = 4: C5 = 5: C6 = 6: C7 = 7: C8 = 8: C9 = 9: C10 = 10: C11 = 11: C12 = 12: C13 = 13: C14 = 14: C15 = 15 500 ' Title Screen 510 SCREEN 7, 1, 0, 0: WIDTH 40: WINDOW: VIEW: CLS : COLOR C15 520 ' "SPACE" DATA 530 DATA 201,205,181, 32,201,205,187, 32,201,205,187, 32,201,205,181, 32,201,205,181, 32 540 DATA 186, 32, 32, 32,186, 32,186, 32,186, 32,186, 32,186, 32, 32, 32,186, 32, 32, 32 550 DATA 200,205,187, 32,204,205,188, 32,204,205,185, 32,186, 32, 32, 32,204,181, 32, 32 560 DATA 32, 32,186, 32,186, 32, 32, 32,186, 32,186, 32,186, 32, 32, 32,186, 32, 32, 32 570 DATA 198,205,188, 32,208, 32, 32, 32,208, 32,208, 32,200,205,181, 32,200,205,181, 32 580 ' "ESCAPE" DATA 590 DATA 201,205,181, 32,201,205,181, 32,201,205,181, 32,201,205,187, 32,201,205,187, 32,201,205,181, 32 600 DATA 186, 32, 32, 32,186, 32, 32, 32,186, 32, 32, 32,186, 32,186, 32,186, 32,186, 32,186, 32, 32, 32 610 DATA 204,181, 32, 32,200,205,187, 32,186, 32, 32, 32,204,205,185, 32,204,205,188, 32,204,181, 32, 32 620 DATA 186, 32, 32, 32, 32, 32,186, 32,186, 32, 32, 32,186, 32,186, 32,186, 32, 32, 32,186, 32, 32, 32 630 DATA 200,205,181, 32,198,205,188, 32,200,205,181, 32,208, 32,208, 32,208, 32, 32, 32,200,205,181, 32 640 ' MUSIC DATA 650 BGM$(1) = "MN T178 O3 D4 A4 > D4 < A4": BGM$(2) = "D4 G4 A8 G4 A8": BGM$(3) = "D4 A4 > D4 < A4." 660 BGM$(4) = "P8 G4 A8 G4 F#8": BGM$(5) = "< B4 > B4 > C#4 D4 E8": BGM$(6) = "D8 C#8 D8 C#8 < B8" 670 BGM$(7) = "< B4 > B4 > C#4 D4 E8": BGM$(8) = "D8 C#8 D8 C#8 < A8": BGM$(9) = "": BGM$(10) = "" 680 IF LS = 0 THEN MUS = 1: PLAY ON: PLAY "MB " + BGM$(1) 700 RESTORE 530: FOR Y = 1 TO 5: LOCATE Y + 2, 3: FOR X = 1 TO 20: READ I: PRINT CHR$(I); : NEXT X, Y 710 RESTORE 590: FOR Y = 1 TO 5: LOCATE Y + 12, 16: FOR X = 1 TO 24: READ I: PRINT CHR$(I); : NEXT X, Y 720 LOCATE 10, 10: COLOR C8: PRINT "BY NEIL C. OBREMSKI" 725 LOCATE 11, 10: COLOR C8: PRINT "MUSIC: SCOTT HAPPELL" 730 LOCATE 21, 9: COLOR C11: PRINT "PRESS ANY KEY TO START" 740 LOCATE 25, 8: COLOR C15: PRINT USING " HIGH SCORE = #,###,### "; HS!; 750 IF LS = 1000 THEN LOCATE 22, 7: COLOR C2: PRINT "(CHECKPOINT: MINE BARRIER)" 760 IF LS = 2000 THEN LOCATE 22, 6: COLOR C2: PRINT "(CHECKPOINT: FRAGMENT FIELD)" 770 IF LS = 3000 THEN LOCATE 22, 7: COLOR C2: PRINT "(CHECKPOINT: ASTEROID BELT)" 780 IF LS = 4000 THEN LOCATE 22, 10: COLOR C2: PRINT "(CHECKPOINT: CANYON)" 870 RESTORE 280 880 IF L = 0 THEN DX = 1: DM$ = " GET READY!" ELSE DX = 0 890 MX = 0: MY = 0: SC = 0: WHILE INKEY$ <> "": A$ = INKEY$: WEND 900 ' Wait for ANY key (including arrows) 920 WHILE TIMER < T2: WEND: T1! = TIMER + .0167: T2! = T1! + .0167: A$ = INKEY$ 930 FOR I = SC TO 1 STEP -1: PSET (SX(I), SY(I)), SO(I): NEXT I 940 SC = 0 950 WHILE TIMER < T1! 960 IF SC < 31 THEN SC = SC + 1: GOSUB 7000 970 WEND 980 IF A$ = "" AND MX = 0 AND MY = 0 THEN 900 990 CLS : SC = 0: PLAY OFF 1000 ' Dash Message 1010 IF DX = 1 THEN PLAY "MB MN T255 O1 A8 A8" 1020 LOCATE 25, 1: COLOR C15 1030 IF DX < LEN(DM$) THEN PRINT RIGHT$(DM$, DX); SPACE$(40 - DX); 1040 IF DX >= LEN(DM$) AND DX < 40 THEN PRINT SPC(DX - LEN(DM$)); DM$; SPACE$(40 - DX); 1050 IF DX >= 40 THEN PRINT SPC(DX - LEN(DM$)); LEFT$(DM$, LEN(DM$) - (DX - 40)); 1060 IF DX = 40 + LEN(DM$) THEN DX = 0 ELSE DX = DX + 1 1070 LOCATE 25, 1: PRINT "" 1090 GOTO 2090 1100 ' Keybuffer Check (i.e. QB arrow key check) 1110 IF K$ = CHR$(0) + CHR$(72) THEN GOSUB 160 1120 IF K$ = CHR$(0) + CHR$(75) THEN GOSUB 170 1130 IF K$ = CHR$(0) + CHR$(77) THEN GOSUB 180 1140 IF K$ = CHR$(0) + CHR$(80) THEN GOSUB 190 1150 WHILE INKEY$ <> "": WEND ' clear buffer 1160 RETURN 2000 ' Main Loop 2010 T1! = TIMER + .0167: T2! = TIMER + .0167 2020 I = MX: OX = PX: PX = PX + I: MX = MX - I 2030 IF PX < 1 THEN PX = 1 ELSE IF PX > 40 THEN PX = 40 2040 I = MY: OY = PY - 1: PY = PY + I: MY = MY - I 2050 IF PY < 1 THEN PY = 1 ELSE IF PY > 20 THEN PY = 20 2060 L = L + 1 2070 FOR I = SC TO 1 STEP -1: PSET (SX(I), SY(I)), SO(I): NEXT I 2080 IF DX <> 0 THEN 1000 ELSE LOCATE 25, 1: COLOR C15: PRINT USING " SCORE:#,###,### HIGH SCORE:#,###,###"; PT!; HS! 2090 IF OY > 0 THEN LOCATE OY, OX: COLOR C14: PRINT "*"; 2130 PT! = PT! + (PY * 1 + (L / 310)): IF HS! < PT! THEN HS! = PT! 2140 IF WX = 0 THEN GOSUB 8500 ELSE GOSUB 8000 2180 ' Process Level Segment and Collision Detect 2190 SC = 0: ON (1 + FIX(L / 1000)) GOTO 2500, 2600, 2700, 2800, 2900, 9200 2200 I = SCREEN(PY, PX): IF I <> 0 AND I <> 32 AND I <> 42 AND I <> 86 THEN GOTO 9000 2210 LOCATE PY, PX: COLOR C3: PRINT "V"; 2220 K$ = INKEY$: IF K$ <> "" THEN GOSUB 1100 2260 ' Stars and Wait 2270 WHILE TIMER < T1! 2280 IF SC < 31 THEN SC = SC + 1: GOSUB 7000 2290 WEND 2300 IF C1 <> 0 THEN READ I, N: IF I = 0 THEN RESTORE 280: READ I, N: PALETTE I, N ELSE PALETTE I, N 2310 WHILE TIMER < T2!: WEND 2490 GOTO 2000 2500 ' Level 1 (0000-0999): Missiles Only 2510 IF L = 60 THEN DX = 1: DM$ = " INCOMING MISSILES!" 2520 IF L < 100 THEN 2200 2530 IF L > 100 AND L MOD 60 = 0 THEN PLAY "MB MN O1 T255 C8" 2540 IF TX = 0 THEN GOSUB 4500 ELSE GOSUB 4000 2590 GOTO 2200 2600 ' Level 2 (1000-1999): Mines and Missiles 2610 IF L = 1000 THEN DX = 1: DM$ = " APPROACHING MINE BARRIER!" 2620 IF L = 1066 THEN LS = 1000: DX = 1: DM$ = " CHECKPOINT SAVED" 2630 IF L > 1122 AND L MOD 45 = 0 THEN PLAY "MB MN O1 T255 D8" 2640 GOSUB 3000 2650 IF TX = 0 THEN GOSUB 4500 ELSE GOSUB 4000 2690 GOTO 2200 2700 ' Level 3 (2000-2999): Mines and Fragments 2710 IF L = 2000 THEN DX = 1: DM$ = " APPROACHING FRAGMENT FIELD!" 2720 IF L = 2068 THEN LS = 2000: DX = 1: DM$ = " CHECKPOINT SAVED" 2730 IF L > 2123 AND L MOD 30 = 0 THEN PLAY "MB MN O1 T255 E8" 2740 GOSUB 3000 2750 IF FX = 0 THEN GOSUB 5500 ELSE GOSUB 5000 2790 GOTO 2200 2800 ' Level 4 (3000-3999): Mines, Frags, and Asteroids 2810 IF L = 3000 THEN DX = 1: DM$ = " APPROACHING ASTEROID BELT!" 2820 IF L = 3067 THEN LS = 3000: DX = 1: DM$ = " CHECKPOINT SAVED" 2830 IF L > 3122 AND L MOD 30 = 0 THEN PLAY "MB MN O1 T255 F8" 2840 GOSUB 3000 2850 IF FX = 0 THEN GOSUB 5500 ELSE GOSUB 5000 2860 IF AX = 0 THEN GOSUB 6500 ELSE GOSUB 6000 2890 GOTO 2200 2900 ' Level 5 (4000-4999): Mines, Frags, Missiles, and Canyon 2910 IF L = 4000 THEN DX = 1: DM$ = " APPROACHING CANYON!" 2920 IF L = 4060 THEN LS = 4000: DX = 1: DM$ = " CHECKPOINT SAVED" 2930 IF L = 4117 THEN DX = 1: DM$ = " MORE MISSILES DETECTED!" 2935 IF L > 4183 AND L MOD 15 = 0 THEN PLAY "MB O1 T255 F8" 2940 I = 1 + FIX(((L - 3999) / 1000) * 16): COLOR C6 2950 LOCATE 24, 1: PRINT STRING$(I, 219); CHR$(221); : LOCATE 24, 40 - I: PRINT CHR$(222); STRING$(I, 219); 2960 GOSUB 3000 2970 IF TX <> 0 THEN GOSUB 4000 ELSE IF L > 4117 THEN GOSUB 4500 2980 IF FX = 0 THEN GOSUB 5500 ELSE GOSUB 5000 2990 GOTO 2200 3000 ' Draw Mine 3010 IF L < 2000 AND RND > ((L - 999) / 1000) THEN RETURN 3020 I = FNRAND(40) 3030 IF SCREEN(24, I) = 0 OR SCREEN(24, I) = 32 THEN LOCATE 24, I: COLOR C13: PRINT "X"; 3040 RETURN 4000 ' Missile (Main) 4010 IF TY > 10 THEN TX = 0: RETURN 4020 IF TY > 1 THEN LOCATE TY - 1, TX: COLOR C14: PRINT "." 4030 TX = TX + TD: IF TX < 1 OR TX > 40 THEN TX = 0: RETURN 4040 IF L MOD TS = 0 THEN TY = TY + 1: TD = SGN(PX - TX) 4050 I = SCREEN(TY, TX) 4060 IF I <> 0 AND I <> 32 AND I <> 42 AND I <> 46 AND I <> 86 THEN PT! = PT! + 100: GOTO 4090 4070 LOCATE TY, TX: COLOR C4: PRINT "!" 4080 RETURN 4090 TX = 0: PLAY "MB T255 O1 L1 D8" 4100 RETURN 4500 ' Missile (Create) 4510 IF L MOD 30 <> 0 THEN RETURN 4520 TX = PX + FNMOVE(0): TY = 1: TD = SGN(PX - TX) 4530 IF TX < 1 THEN TX = 1 ELSE IF TX > 40 THEN TX = 40 4540 TS = FNRAND(8) + 6 4550 RETURN 5000 ' Fragment (Main) 5010 FY = FY - 1: IF FY < 1 THEN FX = 0: RETURN 5020 LOCATE FY, FX: PRINT " "; 5030 IF L MOD FS = 0 THEN FX = FX + FD: IF FX < 1 OR FX > 40 THEN FX = 0: RETURN 5040 LOCATE FY, FX: COLOR C7: PRINT "#"; 5050 RETURN 5500 ' Fragment (Create) 5510 FX = FNRAND(40): FD = SGN(PX - FX) 5520 FY = 25: FS = FNRAND(4) 5530 RETURN 6000 ' Asteroid (Main) 6010 AX = AX + FNMOVE(0) 6020 AL = AL + FNMOVE(0) 6030 IF AX < 1 THEN AX = 1 ELSE IF AX > 40 THEN AX = 40 6040 IF AL < 1 THEN AX = 0: RETURN 6050 IF AX + AL > 40 THEN AL = 40 - AX + 1 6060 LOCATE 24, AX: COLOR C8: PRINT STRING$(AL, 178); 6070 AH = AH - 1: IF AH = 0 THEN AX = 0 6080 RETURN 6500 ' Asteroid (Create) 6510 IF L MOD 10 <> 0 THEN RETURN 6520 AX = FNRAND(40): AL = FNRAND(3): AH = FNRAND(15) + 5 6530 RETURN 7000 ' Star (Main) 7010 SY(SC) = SY(SC) - SS(SC) 7020 IF SY(SC) < 0 THEN SX(SC) = FIX(RND * 320): SY(SC) = 199 7030 SO(SC) = POINT(SX(SC), SY(SC)) 7040 IF 0 = SO(SC) THEN PSET (SX(SC), SY(SC)), 11 7050 RETURN 8000 ' WormHole (Main) 8010 RETURN 8500 ' WormHole (Create) 8510 RETURN 9000 DM$ = "YOU BLEW UP!": I = 0: PLAY "MB O1 T255 ML E2 C1" 9010 WHILE INKEY$ <> "": A$ = INKEY$: WEND 9020 LOCATE 25, 1: PRINT SPACE$(40); 9030 FOR SC = 1 TO 31 9040 IF POINT(SX(SC), SY(SC)) = 0 THEN PSET (SX(SC), SY(SC)), 11 9050 NEXT SC 9100 T1! = TIMER + .0333: A$ = INKEY$: I = I + 1 9110 IF I < 30 THEN CIRCLE (PX * 8 - 4, PY * 8 - 4), I, FNRAND(15) 9120 IF I > 30 AND I < 60 THEN CIRCLE (PX * 8 - 4, PY * 8 - 4), I - 30, 0 9140 IF A$ = "Y" OR A$ = "y" THEN 300 9150 IF A$ = "N" OR A$ = "n" THEN 9990 9160 WHILE TIMER < T1!: WEND 9170 IF I <= 60 THEN 9100 ELSE 9400 9200 ' Level X (5000-5150): FINISHED! FREE AND CLEAR! 9210 IF L > 5150 GOTO 9300 9220 GOTO 2200 9300 DM$ = "YOU ESCAPED!" 9310 WHILE INKEY$ <> "": A$ = INKEY$: WEND 9320 GOTO 9400 9400 ' Death Theme 9410 BGM$(1) = "MN T70 O2 B8 > D8 F#8 < B8": BGM$(2) = "> D8 F#8 < B8 > D8 G8": BGM$(3) = "< B8 > D8 G8 < B8 > D8" 9420 BGM$(4) = "G8 < B8 > D8 F#8 < A8": BGM$(5) = "> D8 F#8 < A8 > D8 F#8 ": BGM$(6) = "< A8 > C#8 E8 < A8 > C#8" 9430 BGM$(7) = "E8 < A8 > C#8": BGM$(8) = "": BGM$(9) = "": BGM$(10) = "" 9440 MUS = 1: PLAY ON: PLAY "MB " + BGM$(1) 9500 ' MESSAGE BOX Y/N 9510 COLOR C15: LOCATE 25, 1: PRINT USING " HIGH SCORE = #,###,### "; HS!; 9520 LOCATE 10, 10: PRINT CHR$(201); STRING$(20, 205); CHR$(187) 9530 LOCATE 11, 10: PRINT CHR$(186); SPC((20 - LEN(DM$)) / 2); DM$; SPC((20 - LEN(DM$)) / 2); CHR$(186) 9540 LOCATE 12, 10: PRINT CHR$(199); STRING$(20, 196); CHR$(182) 9550 LOCATE 13, 10: PRINT CHR$(186); " PLAY AGAIN (Y/N) ? "; CHR$(186) 9560 LOCATE 14, 10: PRINT CHR$(200); STRING$(20, 205); CHR$(188) 9570 IF A$ = "Y" OR A$ = "y" THEN PLAY OFF: GOTO 300 9580 IF A$ = "N" OR A$ = "n" THEN PLAY OFF: GOTO 9990 9590 A$ = INKEY$: GOTO 9570 9600 ' MUSIC HANDLER 9610 MUS = MUS + 1: IF BGM$(MUS) = "" THEN MUS = 1 9620 PLAY "MB " + BGM$(MUS) 9630 RETURN 9700 ' Error handling (only currently handles SCREEN 7 => 1 downgrade) 9710 IF ERR <> 5 <> ERL = 510 THEN PRINT ERR; " ON "; ERL: END 9720 C1 = 0: C2 = 0: C3 = 0: C4 = 0: C5 = 0: C6 = 0: C7 = 0: C8 = 0: C9 = 0: C10 = 0: C11 = 0: C12 = 0: C13 = 0: C14 = 0: C15 = 0 9730 SCREEN 1 9740 RESUME NEXT 9890 GOTO 100 9990 CLS : SCREEN 0, 0, 0, 0: WIDTH 80: CLS : END  ================================================ FILE: samples/BQN/gameoflife.bqn ================================================ # Larger initial matrix r ← 15‿35 ↑ ¯10‿¯20 ↑ (3‿3 ⥊ ↕9) ∊ 1‿2‿3‿4‿7 # Iteration function Life ← {∨´ 1‿𝕩 ∧ 3‿4 = +˘˝ +˝ 1‿0‿¯1 ⌽⌜ 1‿0‿¯1 ⌽˘¨ <𝕩} # 'animate' 100 iterations of the game of life { i ← Life 𝕩 ⋄ •Delay 1 ⋄ •Show i ⊏ "·#" ⋄ i}⍟100 r ================================================ FILE: samples/BQN/snake.bqn ================================================ # ============================================================ # This code is part of the "rayed-lib" open source project avaiable at: # # https://github.com/Brian-ED/rayed-bqn # # This code is licensed under the MIT License. You may obtain a # copy of the License at: # # https://spdx.org/licenses/MIT.html # ============================================================ # My highscore is 112... beat that! ⟨c⇐color,window,draw,k⇐key⟩←r←•Import "../../raylib.bqn" textSize ← 100 size ← 15 nonDarkMode‿darkMode ← { ⟨text, fruit, snake, lines, background⟩ ⇐ 𝕩 }¨{ yellow ← 255‿200‿0‿255 ⟨c.black‿c.red‿c.blue ‿c.white‿yellow ⌈c.white‿c.red‿c.green‿c.white‿c.black÷1.3⟩ # divided to lower intencity } LoadConsts ← {𝕊:{ winSize ⇐ window.GetSize@ textPixelSize ⇐ r.rayFFI.MeasureText¨textSize⋈˜¨"Paused"‿"GAME OVER" tileSize ⇐ ⌊winSize⌊´⊸÷size+2 lines ⇐ ≍´˘⌽¨⊸∾(⊢∾⌜2↑1⌽⁼⊢)tileSize×1+↕1+size # Line drawing positions font ⇐ r.font.LoadBQN 100 }} OnStart ← {𝕤 frame ← 0 ⋄ speed ← 10 # 0 is gameOver, 1 is playing, 2 is paused gameState ← 1 # List of x‿y positions of the snake snake ← [0‿0] fruit ← 2 •rand.Range size # 0‿1 up, 1‿0 right, 0‿¯1 down, ¯1‿0 left # first in list is the current facing, pressing right 1⌽ pressing left 1⌽⁼ facing ← [1‿0, 0‿¯1, ¯1‿0, 0‿1] # buffer for key presses buffer ← ⟨⟩ palete ← nonDarkMode gameState‿frame‿snake‿fruit‿facing‿speed‿buffer‿palete } PerGameFrame ← {𝕊gameState‿snake‿fruit‿facing‿buffer: SpawnFruit ← {•rand.Range∘≠⊸⊑(<˘𝕨)(¬∘∊˜/⊢)⥊↕2⥊size} nowFacing ← facing⌽˜-´k.left‿k.right=⊑1↑buffer extendedSnake ← nowfacing(⊢∾˜size|+○⊏)snake newFruit ← extendedSnake SpawnFruit⍟(⊏⊸≡) fruit cutSnake ← ¯1⊸↓⍟(newFruit≡fruit)extendedSnake ⟨ gameState×⍷⊸≡cutSnake # gameState cutSnake # snake newFruit # fruit nowFacing # facing 1↓2↑buffer # reset buffer ⟩ }⌾(0‿2‿3‿4‿6⊸⊏) PerFrame ←{con𝕊⟨gameState,frame,snake,fruit,facing,speed,buffer,pal⟩: pauseP ← k.right_shift = key ← k.PressedKey@ c.black‿con.font‿40 draw.Text 10‿10⋈•Repr ¯1+≠snake ⊑◶⟨ # each function is one scene { pal.text‿con.font‿textSize draw.Text "GAME OVER"⋈˜2⥊2÷˜con.winSize-1⊑con.textPixelSize pal⌾(7⊑⊢)OnStart⍟pauseP 𝕩 # nums mean values to reset } PerGameFrame⍟(1=speed|frame) {𝕤 c.white⊸draw.Line˘con.lines pal.fruit draw.Rectangle +`(1+con.tileSize×1+fruit)≍2⥊con.tileSize-2 pal.snake⊸draw.Rectangle⟜⍉˘(con.tileSize-2)(⍉+≍⊢)˘1+con.tileSize×1+snake ⟨frame+1 2⌈speed+-´key=k.down‿k.up # speed key∾⍟(⊑∊⟜k.left‿k.right) buffer⟩ # Key buffer }⌾(1‿5‿6⊸⊏) { pauseText←"Paused, d for dark" pal.text‿con.font‿(textSize) draw.Text (2÷˜con.winSize-con.textPixelSize⊑⊸∾textSize)‿pauseText {𝕩≡nonDarkMode?darkMode;nonDarkMode}⌾(7⊑⊢)⍟(key=k.d)𝕩 } ⟩ {1:2;2:1;𝕩}⍟pauseP⌾⊑ 𝕩 } draw._withCanvas_ {(7⊑𝕩).background} Game ← LoadConsts PerFrame•_While_(¬window.ShouldClose) OnStart Game window._openAs "Snake" ================================================ FILE: samples/Ballerina/hello-world-service.bal ================================================ import ballerina.lang.messages; import ballerina.net.http; import ballerina.doc; @doc:Description {value:"By default Ballerina assumes that the service is to be exposed via HTTP/1.1 using the system default port and that all requests coming to the HTTP server will be delivered to this service."} service helloWorld { @doc:Description {value:"All resources are invoked with an argument of type message, the built-in reference type representing a network invocation."} resource sayHello (message m) { // Creates an empty message. message response = {}; // A util method that can be used to set string payload. messages:setStringPayload(response, "Hello, World!"); // Reply keyword sends the response back to the client. reply response; } } ================================================ FILE: samples/Ballerina/hello-world.bal ================================================ import ballerina.lang.system; function main (string[] args) { system:println("Hello, World!"); } ================================================ FILE: samples/Ballerina/json.bal ================================================ import ballerina.lang.system; function main (string[] args) { // JSON string value. json j1 = "Apple"; system:println(j1); // JSON number value. json j2 = 5.36; system:println(j2); // JSON true value. json j3 = true; system:println(j3); // JSON false value. json j4 = false; system:println(j4); // JSON null value. json j5 = null; //JSON Objects. json j6 = {name:"apple", color:"red", price:j2}; system:println(j6); //JSON Arrays. They are arrays of any JSON value. json j7 = [1, false, null, "foo", {first:"John", last:"Pala"}]; system:println(j7); } ================================================ FILE: samples/Ballerina/var.bal ================================================ import ballerina.lang.system; function divideBy10 (int d) (int, int) { return d / 10, d % 10; } function main (string[] args) { //Here the variable type is inferred type from the initial value. This is same as "int k = 5"; var k = 5; system:println(10 + k); //Here the type of the 'strVar' is 'string'. var strVar = "Hello!"; system:println(strVar); //Multiple assignment with 'var' allows you to define the variable then and there. //Variable type is inferred from the right-hand side. var q, r = divideBy10(6); system:println("06/10: " + "quotient=" + q + " " + "remainder=" + r); //To ignore a particular return value in a multiple assignment statement, use '_'. var q1, _ = divideBy10(57); system:println("57/10: " + "quotient=" + q1); var _, r1 = divideBy10(9); system:println("09/10: " + "remainder=" + r1); } ================================================ FILE: samples/Ballerina/xml.bal ================================================ import ballerina.lang.system; function main (string[] args) { // XML element. Can only have one root element. xml x1 = xml `The Lost World`; system:println(x1); // XML text xml x2 = xml `Hello, world!`; system:println(x2); // XML comment xml x3 = xml ``; system:println(x3); // XML processing instruction xml x4 = xml ``; system:println(x4); // Multiple XML items can be combined to form a sequence of XML. The resulting sequence is again an XML on its own. xml x5 = x1 + x2 + x3 + x4; system:println("\nResulting XML sequence:"); system:println(x5); } ================================================ FILE: samples/Batchfile/filenames/gradlew.bat ================================================ @rem @rem Copyright 2015 the original author or authors. @rem @rem Licensed under the Apache License, Version 2.0 (the "License"); @rem you may not use this file except in compliance with the License. @rem You may obtain a copy of the License at @rem @rem https://www.apache.org/licenses/LICENSE-2.0 @rem @rem Unless required by applicable law or agreed to in writing, software @rem distributed under the License is distributed on an "AS IS" BASIS, @rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. @rem See the License for the specific language governing permissions and @rem limitations under the License. @rem @rem SPDX-License-Identifier: Apache-2.0 @rem @if "%DEBUG%"=="" @echo off @rem ########################################################################## @rem @rem Gradle startup script for Windows @rem @rem ########################################################################## @rem Set local scope for the variables with windows NT shell if "%OS%"=="Windows_NT" setlocal set DIRNAME=%~dp0 if "%DIRNAME%"=="" set DIRNAME=. @rem This is normally unused set APP_BASE_NAME=%~n0 set APP_HOME=%DIRNAME% @rem Resolve any "." and ".." in APP_HOME to make it shorter. for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi @rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" @rem Find java.exe if defined JAVA_HOME goto findJavaFromJavaHome set JAVA_EXE=java.exe %JAVA_EXE% -version >NUL 2>&1 if %ERRORLEVEL% equ 0 goto execute echo. 1>&2 echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. 1>&2 echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 goto fail :findJavaFromJavaHome set JAVA_HOME=%JAVA_HOME:"=% set JAVA_EXE=%JAVA_HOME%/bin/java.exe if exist "%JAVA_EXE%" goto execute echo. 1>&2 echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% 1>&2 echo. 1>&2 echo Please set the JAVA_HOME variable in your environment to match the 1>&2 echo location of your Java installation. 1>&2 goto fail :execute @rem Setup the command line @rem Execute Gradle "%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -jar "%APP_HOME%\gradle\wrapper\gradle-wrapper.jar" %* :end @rem End local scope for the variables with windows NT shell if %ERRORLEVEL% equ 0 goto mainEnd :fail rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of rem the _cmd.exe /c_ return code! set EXIT_CODE=%ERRORLEVEL% if %EXIT_CODE% equ 0 set EXIT_CODE=1 if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% exit /b %EXIT_CODE% :mainEnd if "%OS%"=="Windows_NT" endlocal :omega ================================================ FILE: samples/Batchfile/filenames/mvnw.cmd ================================================ @REM ---------------------------------------------------------------------------- @REM Licensed to the Apache Software Foundation (ASF) under one @REM or more contributor license agreements. See the NOTICE file @REM distributed with this work for additional information @REM regarding copyright ownership. The ASF licenses this file @REM to you under the Apache License, Version 2.0 (the @REM "License"); you may not use this file except in compliance @REM with the License. You may obtain a copy of the License at @REM @REM http://www.apache.org/licenses/LICENSE-2.0 @REM @REM Unless required by applicable law or agreed to in writing, @REM software distributed under the License is distributed on an @REM "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY @REM KIND, either express or implied. See the License for the @REM specific language governing permissions and limitations @REM under the License. @REM ---------------------------------------------------------------------------- @REM ---------------------------------------------------------------------------- @REM Apache Maven Wrapper startup batch script, version 3.3.4 @REM @REM Required ENV vars: @REM JAVA_HOME - location of a JDK home dir @REM @REM Optional ENV vars @REM MAVEN_BATCH_ECHO - set to 'on' to enable the echoing of the batch commands @REM MAVEN_BATCH_PAUSE - set to 'on' to wait for a keystroke before ending @REM MAVEN_OPTS - parameters passed to the Java VM when running Maven @REM e.g. to debug Maven itself, use @REM set MAVEN_OPTS=-Xdebug -Xrunjdwp:transport=dt_socket,server=y,suspend=y,address=8000 @REM MAVEN_SKIP_RC - flag to disable loading of mavenrc files @REM ---------------------------------------------------------------------------- @REM Begin all REM lines with '@' in case MAVEN_BATCH_ECHO is 'on' @echo off @REM set title of command window title %0 @REM enable echoing by setting MAVEN_BATCH_ECHO to 'on' @if "%MAVEN_BATCH_ECHO%" == "on" echo %MAVEN_BATCH_ECHO% @REM set %HOME% to equivalent of $HOME if "%HOME%" == "" (set "HOME=%HOMEDRIVE%%HOMEPATH%") @REM Execute a user defined script before this one if not "%MAVEN_SKIP_RC%" == "" goto skipRcPre @REM check for pre script, once with legacy .bat ending and once with .cmd ending if exist "%USERPROFILE%\mavenrc_pre.bat" call "%USERPROFILE%\mavenrc_pre.bat" %* if exist "%USERPROFILE%\mavenrc_pre.cmd" call "%USERPROFILE%\mavenrc_pre.cmd" %* :skipRcPre @setlocal set ERROR_CODE=0 @REM To isolate internal variables from possible post scripts, we use another setlocal @setlocal @REM ==== START VALIDATION ==== if not "%JAVA_HOME%" == "" goto OkJHome echo. >&2 echo Error: JAVA_HOME not found in your environment. >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. >&2 goto error :OkJHome if exist "%JAVA_HOME%\bin\java.exe" goto init echo. >&2 echo Error: JAVA_HOME is set to an invalid directory. >&2 echo JAVA_HOME = "%JAVA_HOME%" >&2 echo Please set the JAVA_HOME variable in your environment to match the >&2 echo location of your Java installation. >&2 echo. >&2 goto error @REM ==== END VALIDATION ==== :init @REM Find the project base dir, i.e. the directory that contains the folder ".mvn". @REM Fallback to current working directory if not found. set MAVEN_PROJECTBASEDIR=%MAVEN_BASEDIR% IF NOT "%MAVEN_PROJECTBASEDIR%"=="" goto endDetectBaseDir set EXEC_DIR=%CD% set WDIR=%EXEC_DIR% :findBaseDir IF EXIST "%WDIR%"\.mvn goto baseDirFound cd .. IF "%WDIR%"=="%CD%" goto baseDirNotFound set WDIR=%CD% goto findBaseDir :baseDirFound set MAVEN_PROJECTBASEDIR=%WDIR% cd "%EXEC_DIR%" goto endDetectBaseDir :baseDirNotFound set MAVEN_PROJECTBASEDIR=%EXEC_DIR% cd "%EXEC_DIR%" :endDetectBaseDir IF NOT EXIST "%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config" goto endReadAdditionalConfig @setlocal EnableExtensions EnableDelayedExpansion for /F "usebackq delims=" %%a in ("%MAVEN_PROJECTBASEDIR%\.mvn\jvm.config") do set JVM_CONFIG_MAVEN_PROPS=!JVM_CONFIG_MAVEN_PROPS! %%a @endlocal & set JVM_CONFIG_MAVEN_PROPS=%JVM_CONFIG_MAVEN_PROPS% :endReadAdditionalConfig SET MAVEN_JAVA_EXE="%JAVA_HOME%\bin\java.exe" set WRAPPER_JAR="%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.jar" set WRAPPER_LAUNCHER=org.apache.maven.wrapper.MavenWrapperMain set WRAPPER_URL="https://repo.maven.apache.org/maven2/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( IF "%%A"=="wrapperUrl" SET WRAPPER_URL=%%B ) @REM Extension to allow automatically downloading the maven-wrapper.jar from Maven-central @REM This allows using the maven wrapper in projects that prohibit checking in binary data. if exist %WRAPPER_JAR% ( if "%MVNW_VERBOSE%" == "true" ( echo Found %WRAPPER_JAR% ) ) else ( if not "%MVNW_REPOURL%" == "" ( SET WRAPPER_URL="%MVNW_REPOURL%/org/apache/maven/wrapper/maven-wrapper/3.3.4/maven-wrapper-3.3.4.jar" ) if "%MVNW_VERBOSE%" == "true" ( echo Couldn't find %WRAPPER_JAR%, downloading it ... echo Downloading from: %WRAPPER_URL% ) powershell -Command "&{"^ "$webclient = new-object System.Net.WebClient;"^ "if (-not ([string]::IsNullOrEmpty('%MVNW_USERNAME%') -and [string]::IsNullOrEmpty('%MVNW_PASSWORD%'))) {"^ "$webclient.Credentials = new-object System.Net.NetworkCredential('%MVNW_USERNAME%', '%MVNW_PASSWORD%');"^ "}"^ "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12; $webclient.DownloadFile('%WRAPPER_URL%', '%WRAPPER_JAR%')"^ "}" if "%MVNW_VERBOSE%" == "true" ( echo Finished downloading %WRAPPER_JAR% ) ) @REM End of extension @REM If specified, validate the SHA-256 sum of the Maven wrapper jar file SET WRAPPER_SHA_256_SUM="" FOR /F "usebackq tokens=1,2 delims==" %%A IN ("%MAVEN_PROJECTBASEDIR%\.mvn\wrapper\maven-wrapper.properties") DO ( IF "%%A"=="wrapperSha256Sum" SET WRAPPER_SHA_256_SUM=%%B ) IF NOT %WRAPPER_SHA_256_SUM%=="" ( powershell -Command "&{"^ "Import-Module $PSHOME\Modules\Microsoft.PowerShell.Utility -Function Get-FileHash;"^ "$hash = (Get-FileHash \"%WRAPPER_JAR%\" -Algorithm SHA256).Hash.ToLower();"^ "If('%WRAPPER_SHA_256_SUM%' -ne $hash){"^ " Write-Error 'Error: Failed to validate Maven wrapper SHA-256, your Maven wrapper might be compromised.';"^ " Write-Error 'Investigate or delete %WRAPPER_JAR% to attempt a clean download.';"^ " Write-Error 'If you updated your Maven version, you need to update the specified wrapperSha256Sum property.';"^ " exit 1;"^ "}"^ "}" if ERRORLEVEL 1 goto error ) @REM Provide a "standardized" way to retrieve the CLI args that will @REM work with both Windows and non-Windows executions. set MAVEN_CMD_LINE_ARGS=%* %MAVEN_JAVA_EXE% ^ %JVM_CONFIG_MAVEN_PROPS% ^ %MAVEN_OPTS% ^ %MAVEN_DEBUG_OPTS% ^ -classpath %WRAPPER_JAR% ^ "-Dmaven.multiModuleProjectDirectory=%MAVEN_PROJECTBASEDIR%" ^ %WRAPPER_LAUNCHER% %MAVEN_CONFIG% %* if ERRORLEVEL 1 goto error goto end :error set ERROR_CODE=1 :end @endlocal & set ERROR_CODE=%ERROR_CODE% if not "%MAVEN_SKIP_RC%"=="" goto skipRcPost @REM check for post script, once with legacy .bat ending and once with .cmd ending if exist "%USERPROFILE%\mavenrc_post.bat" call "%USERPROFILE%\mavenrc_post.bat" if exist "%USERPROFILE%\mavenrc_post.cmd" call "%USERPROFILE%\mavenrc_post.cmd" :skipRcPost @REM pause the script if MAVEN_BATCH_PAUSE is set to 'on' if "%MAVEN_BATCH_PAUSE%"=="on" pause if "%MAVEN_TERMINATE_CMD%"=="on" exit %ERROR_CODE% cmd /C exit /B %ERROR_CODE% ================================================ FILE: samples/Beef/ProfilePanel.bf ================================================ using Beefy.widgets; using Beefy.theme.dark; using Beefy.gfx; using System.Collections; using System; using System.Diagnostics; using Beefy.events; using System.Threading; using Beefy; namespace BeefPerf { class ProfilePanel : Widget { public class ProfileListViewItem : DarkVirtualListViewItem { public override void MouseDown(float x, float y, int32 btn, int32 btnCount) { ((ProfileListView)mListView).mProfilePanel.ItemClicked(this, btn, btnCount, x, y); } public override bool Selected { set { if (value) { int32 selectedIdx = mVirtualIdx; var profilePanel = ((ProfileListView)mListView).mProfilePanel; var result = profilePanel.mProfileCtx.mResults[selectedIdx]; DeleteAndNullify!(profilePanel.mPerfView.mProfileHiliteZone); profilePanel.mPerfView.mProfileHiliteZone = new PerfView.HiliteZone(result.mZoneNameId, result.mUnformattedName); //result.mName } base.Selected = value; //int32 selectedIdx = item.mVirtualIdx; //var foundEntry = mSearchState.mFoundEntries[selectedIdx]; } } } public class ProfileListView : DarkVirtualListView { public ProfilePanel mProfilePanel; public override void ChangeSort(DarkListView.SortType sortType) { base.ChangeSort(sortType); mSortType = sortType; mProfilePanel.RefreshList(); } protected override ListViewItem CreateListViewItem() { return new ProfileListViewItem(); } public override void PopulateVirtualItem(DarkVirtualListViewItem listViewItem) { base.PopulateVirtualItem(listViewItem); var client = mProfilePanel.mPerfView.mSession; var perfInfo = mProfilePanel.mProfileCtx.mResults[listViewItem.mVirtualIdx]; listViewItem.Label = perfInfo.mName; var subItem = listViewItem.CreateSubItem(1); subItem.mLabel = new String(); subItem.mLabel.AppendF("{0}", perfInfo.mCount); subItem = listViewItem.CreateSubItem(2); subItem.mLabel = new String(); client.ElapsedTicksToStr(perfInfo.mTicks, subItem.mLabel); subItem = listViewItem.CreateSubItem(3); subItem.mLabel = new String(); client.ElapsedTicksToStr(perfInfo.mTicks - perfInfo.mChildTicks, subItem.mLabel); } public override void DrawAll(Graphics g) { base.DrawAll(g); if (((mProfilePanel.mProfileCtx != null) && (!mProfilePanel.mProfileCtx.mDone)) || (mProfilePanel.mSorting)) { using (g.PushColor(0xA0595959)) g.FillRect(0, 20, mWidth - 20, mHeight - 20); BPUtils.DrawWait(g, mWidth / 2, mHeight / 2); } } public override void KeyDown(KeyCode keyCode, bool isRepeat) { base.KeyDown(keyCode, isRepeat); if (keyCode == .Escape) { mProfilePanel.RemoveFocus(); } } public void GetSummaryString(String str) { str.Append("Name____________________________________Count_______Total________Self\n"); for (var entry in mProfilePanel.mProfileCtx.mResults) { str.Append(entry.mName); str.Append(' ', Math.Max(38 - entry.mName.Length, 1)); var entryStr = scope String(); entry.mCount.ToString(entryStr); str.Append(' ', Math.Max(7 - entryStr.Length, 1)); str.Append(entryStr); entryStr.Clear(); mProfilePanel.mProfileCtx.mSession.ElapsedTicksToStr(entry.mTicks, entryStr); str.Append(' ', Math.Max(12 - entryStr.Length, 1)); str.Append(entryStr); entryStr.Clear(); mProfilePanel.mProfileCtx.mSession.ElapsedTicksToStr(entry.mTicks - entry.mChildTicks, entryStr); str.Append(' ', Math.Max(12 - entryStr.Length, 1)); str.Append(entryStr); str.Append('\n'); } str.Append("---------------------------------------------------------------------\n"); str.Append("Total Time: "); mProfilePanel.mProfileCtx.mSession.ElapsedTicksToStr(mProfilePanel.mSelection.mTickEnd - mProfilePanel.mSelection.mTickStart, str); } public void AddStaticMenu(Menu menu) { var menuItem = menu.AddItem("Copy to Clipboard"); menuItem.mOnMenuItemSelected.Add(new (item) => { String str = scope String(); GetSummaryString(str); gApp.SetClipboardText(str); //Debug.WriteLine(str); }); } public override void MouseDown(float x, float y, int32 btn, int32 btnCount) { base.MouseDown(x, y, btn, btnCount); GetRoot().SelectItemExclusively(null); if (btn == 1) { Menu menu = new Menu(); AddStaticMenu(menu); MenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu); menuWidget.Init(this, x, y); } } } DarkCheckBox mFormatCheckbox; ProfileListView mListView; DarkButton mGetButton; PerfView mPerfView; BPSelection mSelection; bool mSelectionDirty; int64 mActiveLastCurTick; ProfileContext mProfileCtx ~ delete _; public WaitEvent mSortDoneHandle = new WaitEvent() ~ delete _; public bool mSorting; public this() { mFormatCheckbox = new DarkCheckBox(); mFormatCheckbox.Checked = true; mFormatCheckbox.Label = "Format Strings"; mFormatCheckbox.mOnMouseClick.Add(new [&] (evt) => { mSelectionDirty = true; } ); AddWidget(mFormatCheckbox); mListView = new ProfileListView(); mListView.mProfilePanel = this; mListView.mOnLostFocus.Add(new (evt) => { RemoveFocus(); }); mListView.mSortType.mColumn = 2; mListView.mSortType.mReverse = true; AddWidget(mListView); mListView.AddColumn(200, "Name"); mListView.AddColumn(100, "Count"); mListView.AddColumn(150, "Total"); mListView.AddColumn(150, "Self"); mListView.InitScrollbars(false, true); } public ~this() { FinishSorting(); } void FinishSorting() { if (mSorting) { mSortDoneHandle.WaitFor(); mSorting = false; mSortDoneHandle.Reset(); } } public void RemoveFocus() { mListView.GetRoot().SelectItemExclusively(null); if (mPerfView != null) DeleteAndNullify!(mPerfView.mProfileHiliteZone); } public override void Resize(float x, float y, float width, float height) { base.Resize(x, y, width, height); mListView.ResizeClamped(0, 20, width, height - 20); mFormatCheckbox.Resize(0, 0, 20, 20); } public override void Draw(Graphics g) { base.Draw(g); g.SetFont(DarkTheme.sDarkTheme.mSmallFont); if (mProfileCtx != null) { String str = scope String(); str.Append("Total Time: "); mProfileCtx.mSession.ElapsedTicksToStr(mSelection.mTickEnd - mSelection.mTickStart, str); g.DrawString(str, 150, 0); } //g.DrawBox(DarkTheme.sDarkTheme.GetImage(DarkTheme.ImageIdx.Bkg), 0, 0, mWidth, mHeight); } public override void DrawAll(Graphics g) { base.DrawAll(g); } public void Show(PerfView perfView, BPSelection selection) { Debug.Assert(perfView != null); mPerfView = perfView; mSelection = selection; mSelectionDirty = true; } void GetData() { mListView.GetRoot().Clear(); } struct PerfInfo { public String mName; public int32 mCount; public int64 mTicks; public int64 mChildTicks; public int32 mStackCount; // Number of times this entry appears in entryStack public int32 mZoneNameId; public String mUnformattedName; } struct BPPerfEntry { public int32 mZoneNameId; public int64 mTickStart; public int64 mChildTicks; public int32 mParamsReadPos; public PerfInfo* mPerfInfo; } class ProfileContext { BumpAllocator mAlloc = new BumpAllocator() ~ delete _; public BpSession mSession; public Dictionary mPerfDict = new .() ~ delete _; String mTempStr = new String() ~ delete _; String mTempDynStr = new String() ~ delete _; public List mResults = new List() ~ delete _; public List mSortingResults = new List() ~ delete _; public int32 mStreamDataIdx; public bool mDone; public bool mFormatStrings; public bool mHasSelectionEndChanged; public PerfInfo* GetPerfInfo(BPPerfEntry entry, BPStateContext stateCtx) { int32 paramsSize; String str; if (entry.mZoneNameId < 0) { int32 nameLen = -entry.mZoneNameId; str = mTempDynStr; str.Reference((char8*)stateCtx.mReadStart + entry.mParamsReadPos - nameLen, nameLen, 0); paramsSize = -1; } else { let zoneName = mSession.mZoneNames[entry.mZoneNameId]; str = zoneName.mName; paramsSize = zoneName.mParamsSize; } //bool dbgStr = str == "DeepStack0 %d"; String unformattedStr = str; if ((paramsSize != 0) && (mFormatStrings)) { mTempStr.Clear(); stateCtx.FormatStr(entry.mParamsReadPos, paramsSize, str, mTempStr); str = mTempStr; } String* keyPtr; PerfInfo* perfInfo; PerfInfo** perfInfoPtr; if (mPerfDict.TryAdd(str, out keyPtr, out perfInfoPtr)) { perfInfo = new:mAlloc PerfInfo(); *perfInfoPtr = perfInfo; if (str == (Object)mTempStr) { String heapStr = new:mAlloc String(str); *keyPtr = heapStr; perfInfo.mName = heapStr; } else perfInfo.mName = str; if ((unformattedStr == (Object)mTempDynStr) && (unformattedStr != (Object)mTempStr)) { String heapStr = new:mAlloc String(unformattedStr); perfInfo.mUnformattedName = heapStr; } else perfInfo.mUnformattedName = unformattedStr; perfInfo.mZoneNameId = entry.mZoneNameId; } else { perfInfo = *perfInfoPtr; if ((entry.mZoneNameId > 0) && (perfInfo.mZoneNameId < 0)) { // Set to a valid zoneNameId if the inserting entry was a dynamic string but this one isn't perfInfo.mZoneNameId = entry.mZoneNameId; } } return perfInfo; } } void UpdateProfileCtx() { Stopwatch stopwatch = scope Stopwatch(); stopwatch.Start(); var client = mPerfView.mSession; var thread = client.mThreads[mSelection.mThreadIdx]; bool isRecording = false; bool isFirstDrawn = mProfileCtx.mStreamDataIdx == 0; bool isManualSelection = mSelection.mDepth == -1; StreamLoop: while (mProfileCtx.mStreamDataIdx < thread.mStreamDataList.Count) { int streamDataListIdx = mProfileCtx.mStreamDataIdx++; var streamData = thread.mStreamDataList[streamDataListIdx]; if ((streamData.mSplitTick > 0) && (streamData.mSplitTick < mSelection.mTickStart)) continue; // All data is to the left BPStateContext stateCtx = scope BPStateContext(client, streamData); List entryStack = scope List(); int32 stackDepth = 0; CmdLoop: while (true) { switch (stateCtx.GetNextEvent()) { case let .Enter(startTick, strIdx): int stackPos = stackDepth++; if (((mSelection.mDepth == -1) && (startTick >= mSelection.mTickStart)) || ((startTick == mSelection.mTickStart) && (stackPos == mSelection.mDepth))) { isRecording = true; } if (isRecording) { BPPerfEntry entry; entry.mTickStart = startTick; entry.mZoneNameId = strIdx; entry.mChildTicks = 0; //stateCtx.MoveToParamData(); entry.mParamsReadPos = stateCtx.ReadPos; entry.mPerfInfo = null; entry.mPerfInfo = mProfileCtx.GetPerfInfo(entry, stateCtx); entry.mPerfInfo.mStackCount++; entryStack.Add(entry); } case let .Leave(endTick): stackDepth--; if (isRecording) { let entry = entryStack.PopBack(); entry.mPerfInfo.mStackCount--; if ((entry.mTickStart == mSelection.mTickStart) && (stackDepth == mSelection.mDepth)) { if (client.mCurTick == endTick) { mProfileCtx.mHasSelectionEndChanged = true; mSelection.mTickEnd = endTick; } } int64 ticks = endTick - entry.mTickStart; if (isManualSelection) { int64 tickStart = Math.Max(entry.mTickStart, mSelection.mTickStart); int64 tickEnd = Math.Min(endTick, mSelection.mTickEnd); ticks = tickEnd - tickStart; if (ticks <= 0) continue; } //PerfInfo* perfInfo = mProfileCtx.GetPerfInfo(entry, stateCtx); PerfInfo* perfInfo = entry.mPerfInfo; bool isOld = ((entry.mTickStart <= streamData.mStartTick) && (stackDepth < stateCtx.mSplitCarryoverCount)); // Is this a duplicate spanned entry? If so, we don't add it's stats but we still // must process it as a parent to keep track of mChildTicks for new children if ((isFirstDrawn) || (!isOld)) { perfInfo.mCount++; if (perfInfo.mStackCount != 0) { // Total time is already handled by outer scope } else perfInfo.mTicks += ticks; } if (entryStack.Count > 0) { var prevEntry = entryStack[entryStack.Count - 1]; //bool prevIsOld = ((prevEntry.mTickStart <= streamData.mStartTick) && (stackDepth - 1 < stateCtx.mSplitCarryoverCount)); //if ((isFirstDrawn) || (!prevIsOld)) if (!isOld) { //PerfInfo* prevPerfInfo = mProfileCtx.GetPerfInfo(prevEntry, stateCtx); PerfInfo* prevPerfInfo = prevEntry.mPerfInfo; prevPerfInfo.mChildTicks += ticks; if (perfInfo.mStackCount != 0) { // We have an instance of ourselves on an outer scope, so time we thought was child time actually isn't perfInfo.mChildTicks -= ticks; } } } if (isManualSelection) { if ((stackDepth == 0) && (endTick >= mSelection.mTickEnd)) { if (endTick <= streamData.mSplitTick) break StreamLoop; } //isRecording = false; } if (stackDepth <= mSelection.mDepth) { if (endTick <= streamData.mSplitTick) break StreamLoop; isRecording = false; } } case .EndOfStream: break CmdLoop; default: } } isFirstDrawn = false; if (stopwatch.ElapsedMilliseconds > (int)(gApp.mTimePerFrame * 1000)) { return; } } mProfileCtx.mDone = true; for (var value in mProfileCtx.mPerfDict.Keys) { var perfInfo = @value.Value; Debug.Assert(perfInfo.mName != null); mProfileCtx.mResults.Add(perfInfo); } RefreshList(); } void RefreshData() { mListView.GetRoot().Clear(); if (mPerfView == null) return; var session = mPerfView.mSession; delete mProfileCtx; mProfileCtx = new ProfileContext(); mProfileCtx.mFormatStrings = mFormatCheckbox.Checked; mProfileCtx.mSession = session; } public void ItemClicked(ProfileListViewItem clickedItem, int32 btn, int32 btnCount, float x, float y) { if (clickedItem.mParentItem == null) return; ProfileListViewItem item = (ProfileListViewItem)clickedItem.GetSubItem(0); mListView.GetRoot().SelectItemExclusively(item); mListView.SetFocus(); if (btn == 1) { Menu menu = new Menu(); var menuItem = menu.AddItem("Find Instances"); menuItem.mOnMenuItemSelected.Add(new (selectedItem) => { var find = gApp.mFindPanel; var str = scope String(); var client = mPerfView.mSession; var thread = client.mThreads[mSelection.mThreadIdx]; str.Clear(); var perfInfo = mProfileCtx.mResults[item.mVirtualIdx]; str.Append('='); str.Append(perfInfo.mName); if (str.Contains(' ')) { str.Insert(1, '\"'); str.Append('"'); } if (mSelection.mDepth > 0) { str.Append(" Depth>"); mSelection.mDepth.ToString(str); } find.mEntryEdit.SetText(str); str.Clear(); str.Append('='); thread.GetName(str); if (str.Contains(' ')) { str.Insert(1, '\"'); str.Append('"'); } find.mTrackEdit.mEditWidget.SetText(str); str.Clear(); client.TicksToStr(mSelection.mTickStart, str); find.mTimeFromEdit.mEditWidget.SetText(str); str.Clear(); client.TicksToStr(mSelection.mTickEnd, str); find.mTimeToEdit.mEditWidget.SetText(str); find.mFormatCheckbox.Checked = true; find.mZonesCheckbox.Checked = true; find.mEventsCheckbox.Checked = false; find.mNeedsRestartSearch = true; }); menu.AddItem(); mListView.AddStaticMenu(menu); MenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu); menuWidget.Init(clickedItem, x, y); } } public void ValueClicked(MouseEvent theEvent) { DarkVirtualListViewItem clickedItem = (DarkVirtualListViewItem)theEvent.mSender; DarkVirtualListViewItem item = (DarkVirtualListViewItem)clickedItem.GetSubItem(0); mListView.GetRoot().SelectItemExclusively(item); mListView.SetFocus(); if ((theEvent.mBtn == 0) && (theEvent.mBtnCount > 1)) { for (int32 childIdx = 1; childIdx < mListView.GetRoot().GetChildCount(); childIdx++) { var checkListViewItem = mListView.GetRoot().GetChildAtIndex(childIdx); checkListViewItem.IconImage = null; } /*int32 selectedIdx = item.mVirtualIdx; var foundEntry = mSearchState.mFoundEntries[selectedIdx]; mPerfView.ZoomTo(foundEntry.mStartTick, foundEntry.mEndTick); BPSelection selection; selection.mStartTick = foundEntry.mStartTick; selection.mEndTick = foundEntry.mEndTick; selection.mDepth = foundEntry.mDepth; selection.mThreadIdx = foundEntry.mTrackIdx; mPerfView.mSelection = selection;*/ } if (theEvent.mBtn == 1) { Menu menu = new Menu(); #unwarn var menuItem = menu.AddItem("Set Track Color ..."); MenuWidget menuWidget = DarkTheme.sDarkTheme.CreateMenuWidget(menu); menuWidget.Init(this, theEvent.mX, theEvent.mY); } } int EntryCompare(PerfInfo* lhs, PerfInfo* rhs) { int64 result = 0; if (mListView.mSortType.mColumn == 0) { result = String.Compare(lhs.mName, rhs.mName, true); if (result == 0) result = lhs.mTicks - rhs.mTicks; } else if (mListView.mSortType.mColumn == 1) { result = lhs.mCount - rhs.mCount; } else if (mListView.mSortType.mColumn == 2) { result = lhs.mTicks - rhs.mTicks; } else { result = (lhs.mTicks - lhs.mChildTicks) - (rhs.mTicks - rhs.mChildTicks); } if (mListView.mSortType.mReverse) result = -result; return (int)result; } void SortList() { mProfileCtx.mSortingResults.Sort(scope => EntryCompare); mSortDoneHandle.Set(true); } void CheckSorting(int32 waitMS = 0) { if (mSorting) { if (mSortDoneHandle.WaitFor(waitMS)) { mSorting = false; mSortDoneHandle.Reset(); Debug.Assert(mProfileCtx.mResults.Count == mProfileCtx.mSortingResults.Count); Swap!(mProfileCtx.mResults, mProfileCtx.mSortingResults); mListView.GetRoot().Clear(); if (mProfileCtx.mResults.Count > 0) { var listViewItem = (DarkVirtualListViewItem)mListView.GetRoot().CreateChildItem(); listViewItem.mVirtualHeadItem = listViewItem; listViewItem.mVirtualCount = (int32)mProfileCtx.mResults.Count; mListView.PopulateVirtualItem(listViewItem); } } } } void RefreshList() { if (mPerfView == null) { mListView.GetRoot().Clear(); return; } FinishSorting(); mSorting = true; mProfileCtx.mSortingResults.Clear(); mProfileCtx.mSortingResults.GrowUnitialized(mProfileCtx.mResults.Count); for (int i < mProfileCtx.mResults.Count) mProfileCtx.mSortingResults[i] = mProfileCtx.mResults[i]; ThreadPool.QueueUserWorkItem(new => SortList); CheckSorting(20); /*for (var strId in iList) { var childItem = mListView.GetRoot().CreateChildItem(); childItem.Label = strId; var perfInfo = ref perfDict[strId]; var subItem = childItem.CreateSubItem(1); subItem.mLabel = new String(); subItem.mLabel.FormatInto("{0}", perfInfo.mCount); subItem.mMouseDownHandler.Add(new => ValueClicked); subItem = childItem.CreateSubItem(2); subItem.mLabel = new String(); client.ElapsedTicksToStr(perfInfo.mTicks, subItem.mLabel); subItem.mMouseDownHandler.Add(new => ValueClicked); subItem = childItem.CreateSubItem(3); subItem.mLabel = new String(); client.ElapsedTicksToStr(perfInfo.mTicks - perfInfo.mChildTicks, subItem.mLabel); subItem.mMouseDownHandler.Add(new => ValueClicked); }*/ } public override void Update() { base.Update(); if (mPerfView == null) return; // Were we awaiting more data to refresh var client = mPerfView.mSession; if ((mActiveLastCurTick != 0) && (mActiveLastCurTick != client.mCurTick)) { mActiveLastCurTick = 0; mSelectionDirty = true; } if (mSorting) { CheckSorting(); } else { if ((mSelectionDirty) && (gApp.mIsUpdateBatchStart) && ((mProfileCtx == null) || (mProfileCtx.mDone))) { mSelectionDirty = false; RefreshData(); } if ((mProfileCtx != null) && (!mProfileCtx.mDone)) { if (gApp.mIsUpdateBatchStart) UpdateProfileCtx(); if (mProfileCtx.mDone) { if (mProfileCtx.mHasSelectionEndChanged) { mActiveLastCurTick = client.mCurTick; } else mActiveLastCurTick = 0; } } } } public void Clear() { mListView.GetRoot().Clear(); DeleteAndNullify!(mProfileCtx); mActiveLastCurTick = 0; mPerfView = null; } } } ================================================ FILE: samples/Beef/Program.bf ================================================ // https://raw.githubusercontent.com/beefytech/Beef/5d5186f8127af4c670f76d7af7df735d3544a16d/IDE/dist/lib/gen/src/Program.bf #pragma warning disable 168 using System; using System; using System.Interop; using System.IO; using System.Threading; using System.Diagnostics; using System.Collections; namespace gen { class Program { static String[] sNames = new .[]("comdlg32", "gdi32", "kernel32", "ole32", "netapi32", "ntdll", "rpcrt4", "shell32", "user32", "version", "winmm") ~ delete _; public static int Main(String[] args) { bool isFirst = true; for (var name in sNames) { for (int pass < 2) { String resultStr = scope String(); // { ProcessStartInfo startInfo = scope .(); startInfo.SetFileName(@"c:\bin\dumpbin.exe"); if (pass == 0) startInfo.SetArguments(scope $"/exports c:\\windows\\system32\\{name}.dll"); else startInfo.SetArguments(scope $"/exports c:\\windows\\SysWow64\\{name}.dll"); startInfo.RedirectStandardOutput = true; startInfo.UseShellExecute = false; startInfo.RedirectStandardOutput = true; startInfo.CreateNoWindow = false; SpawnedProcess process = scope SpawnedProcess(); if (process.Start(startInfo) case .Err) continue; FileStream fileStream = scope FileStream(); process.AttachStandardOutput(fileStream); StreamReader streamReader = scope StreamReader(fileStream, null, false, 4096); streamReader.ReadToEnd(resultStr).IgnoreError(); if (process.ExitCode != 0) Runtime.FatalError(scope $"Failed to read lib '{name}'"); } var outStr = scope String(); outStr.Append("EXPORTS\n"); for (var line in resultStr.Split('\n')) { if ((line.Length > 26) && (line.StartsWith(" ")) && (line[25] == ' ') && (line[26] != '[')) { var exportStr = line.Substring(26); int fwdIdx = exportStr.IndexOf("(forwarded to"); if (fwdIdx != -1) { outStr.Append(exportStr.Substring(0, fwdIdx - 1)); outStr.Append(" = "); outStr.Append(exportStr.Substring(fwdIdx + 14, exportStr.Length - fwdIdx - 15)); } else { outStr.Append(exportStr); switch (exportStr) { case "DllMain", "DllGetClassObject", "DllCanUnloadNow", "DllRegisterServer", "DllUnregisterServer", "DllInstall": outStr.Append(" PRIVATE"); } } outStr.Append("\n"); } } File.WriteAllText(scope $"{name}.txt", outStr); // { ProcessStartInfo startInfo = scope .(); startInfo.SetFileName(@"c:\bin\lib.exe"); if (pass == 0) startInfo.SetArguments(scope $"/def:{name}.txt /machine:x64 /out:..\\x64\\{name}.lib"); else startInfo.SetArguments(scope $"/def:{name}.txt /machine:x64 /out:..\\x86\\{name}.lib"); startInfo.CreateNoWindow = false; SpawnedProcess process = scope SpawnedProcess(); if (process.Start(startInfo) case .Err) continue; process.WaitFor(); if (process.ExitCode != 0) Runtime.FatalError(scope $"Failed to generate lib '{name}'"); } } } return 0; } } } ================================================ FILE: samples/Beef/RandoCode.bf ================================================ using System; using System.Collections; using System.Text; using System.IO; using System.Threading.Tasks; using System.Threading; using Beefy.utils; using System.Diagnostics; namespace RandoCode { class Config { public int32 mTypeCount = 800; //20; //70 //300 public float mPrimitiveTypeChance = 0.0f; //public float mStructPct = 0.2f; // Otherwise class public float mStructPct = 0.0f; public float mTypeComplexityPower = 3.0f; public float mCreateGenericTypePct = 0.15f; public float mSpecializedTypePower = 3.0f; public float mUnspecializedTypeScalar = 10.0f; public float mTypeDefPoolPower = 1.1f; public float mTypeDefPoolOffset = 3.0f; public float mTypeDefPoolScalar = 15.0f; public float mFieldCountPower = 1.2f; public float mFieldCountScalar = 12.0f; public float mFieldStaticPct = 0.2f; public float mVoidReturnPct = 0.6f; public float mMethodCodeComplexityPower = 2.0f; public float mMethodLengthScalar = 100.0f; public float mMethodCountScalar = 300.0f; //2000.0f;//300.0f; public float mAssignMemberPct = 0.3f; public float mCreateLocalPct = 0.3f; public float mParamCountPower = 3.0f; public float mParamCountScalar = 5.0f; public float mNewSpacespaceChance = 0.2f; // Chance a class will generate a new namespace vs using an existing one public float mRootNamespaceChance = 0.1f; // Chance we will create root namespace vs adding to an existing one } class WordGroup { public List[] mWords ~ { for (var list in mWords) DeleteContainerAndItems!(list); delete _; }; public HashSet mUsedNames = new HashSet() ~ DeleteContainerAndItems!(_); public void GetName(float complexity, int parts, bool firstUpper, String outName) { int listNum = (int)(complexity * 3.999f); var parts; for (int tryCount = 0; true; tryCount++) { if (tryCount > 4) parts++; for (int namePartIdx = 0; namePartIdx < parts; namePartIdx++) { int idx = Program.sRand.Next(mWords[listNum].Count); String namePart = scope String(mWords[listNum][idx]); if ((firstUpper) || (namePartIdx > 0)) namePart[0] = namePart[0].ToUpper; outName.Append(namePart); } if (mUsedNames.Contains(outName)) continue; mUsedNames.Add(new String(outName)); return; } } } class LocalDef { public String mName ~ delete _; public TypeDef mTypeDef; } class MethodDef { public String mName ~ delete _; public int mParamCount; public TypeDef mReturnType; public List mLocals = new List() ~ DeleteContainerAndItems!(_); public float mComplexity; public int mStatementCount; public bool mIsStatic; } class FieldDef { public String mName ~ delete _; public TypeDef mTypeDef; public bool mIsStatic; } class TypeDef { public NamespaceDef mNamespace; public String mName ~ delete _; public float mComplexity; public bool mIsPrimitive; public int mGenericParamIdx = -1; public bool mIsStruct; public int mUseCount; public bool mIsSpecializedGeneric; public bool mIsUnspecializedGeneric; public List mGenericParams ~ delete _; public HashSet mUsingNamespaces = new HashSet() ~ delete _; public List mFields = new List() ~ DeleteContainerAndItems!(_); public List mMethods = new List() ~ DeleteContainerAndItems!(_); public List mTypeDefPool = new List() ~ delete _; // We only refer to types in this pool public void GetRootName(String outStr) { int ltPos = mName.IndexOf('<'); if (ltPos == -1) { outStr.Append(mName); return; } outStr.Append(mName, 0, ltPos); } public void GetFullName(String outStr) { if (mNamespace == null) { outStr.Append(mName); return; } mNamespace.GetFullName(outStr); outStr.Append(".", mName); } } class NamespaceDef { public NamespaceDef mParent; public String mName ~ delete _; public List mChildren = new List() ~ delete _; public void GetFullName(String outStr) { if (mParent != null) { mParent.GetFullName(outStr); outStr.Append("."); } outStr.Append(mName); } } class Program { public static Random sRand ~ delete _; int mSeed; Config mConfig = new Config() ~ delete _; String mBaseDir = new String("src") ~ delete _; WordGroup mAdjList ~ delete _; WordGroup mAdvList ~ delete _; WordGroup mNounList ~ delete _; WordGroup mVerbList ~ delete _; bool mIsCompat = true; TypeDef mCurTypeDef; MethodDef mCurMethodDef; List mNamespaces = new List() ~ DeleteContainerAndItems!(_); TypeDef mVoidType ~ delete _; List mPrimitives = new List() ~ DeleteContainerAndItems!(_); List mUserTypes = new List() ~ DeleteContainerAndItems!(_); List mOtherTypes = new List() ~ DeleteContainerAndItems!(_); bool mVerbose; int mLineCount; bool mWroteLine; String mQueuedText = new String() ~ delete _; int mIndentCount; int mStartIndentCount; this() { //mSeed = (scope Random()).Next() % 100000; mSeed = 92968; Console.WriteLine("Random seed: {0}", mSeed); sRand = new Random(mSeed); } WordGroup CreateWordGroup(String name) { WordGroup wordGroup = new WordGroup(); wordGroup.mWords = new List[4]; for (int i = 0; i < 4; i++) { wordGroup.mWords[i] = new List(); StreamReader file = scope StreamReader(); var filePath = scope String(); var exePath = scope String(); Environment.GetExecutableFilePath(exePath); Path.GetDirectoryPath(exePath, filePath); filePath.AppendF("/data/{0}{1}.txt", i + 1, name); if (file.Open(filePath) case .Err) continue; while (!file.EndOfStream) { String line = scope String(); file.ReadLine(line); bool isOnlyLetters = true; for (char8 c in line.RawChars) if (!c.IsLetter) isOnlyLetters = false; if (isOnlyLetters) wordGroup.mWords[i].Add(new String(line)); } } return wordGroup; } void CreatePrimitives() { mVoidType = new TypeDef(); mVoidType.mName = new String("void"); mVoidType.mIsPrimitive = true; String[] typeNames; if (mIsCompat) typeNames = scope:: .[] ( "int", "uint", "int", "float", "double" ); else typeNames = scope:: .[] ( "int", "int16", "int32", "int64", "float", "double" ); for (var typeName in typeNames) { TypeDef typeDef = new TypeDef(); typeDef.mName = new String(typeName); typeDef.mIsPrimitive = true; mPrimitives.Add(typeDef); } } float GetComplexity(float power) { return (float)Math.Pow(sRand.NextDouble(), power); } // Must return either a primitive type or a typedef whose name occurs alphabetically before the current type TypeDef GetRandomTypeDef() { bool wantPrimitive = sRand.NextDouble() < mConfig.mPrimitiveTypeChance; if ((!wantPrimitive) && (mUserTypes.Count > 0)) { for (int tryCount = 0; tryCount < 4; tryCount++) { TypeDef checkTypeDef = mUserTypes[sRand.Next(mUserTypes.Count)]; if (checkTypeDef.mIsUnspecializedGeneric) continue; if (mCurTypeDef == null) return checkTypeDef; if (checkTypeDef.mName.CompareTo(mCurTypeDef.mName) < 0) return checkTypeDef; } } return mPrimitives[sRand.Next(mPrimitives.Count)]; } TypeDef GetRandomPooledTypeDef() { return mCurTypeDef.mTypeDefPool[sRand.Next(mCurTypeDef.mTypeDefPool.Count)]; } void GenerateType() { float typeComplexity = GetComplexity(mConfig.mTypeComplexityPower); String className = new String(); mNounList.GetName(typeComplexity, 2, true, className); TypeDef typeDef = new TypeDef(); typeDef.mName = className; typeDef.mComplexity = typeComplexity; mCurTypeDef = typeDef; typeDef.mIsUnspecializedGeneric = sRand.NextDouble() < mConfig.mCreateGenericTypePct; if (typeDef.mIsUnspecializedGeneric) { typeDef.mGenericParams = new List(); int genericCount = (int)(1.0f + GetComplexity(3.0f) * 3.5f); typeDef.mName.Append("<"); for (int genericIdx = 0; genericIdx < genericCount; genericIdx++) { TypeDef genericType = new TypeDef(); genericType.mGenericParamIdx = genericIdx; genericType.mName = new String(); genericType.mName.Append("T"); mOtherTypes.Add(genericType); mAdvList.GetName(0, 1, true, genericType.mName); if (genericIdx > 0) typeDef.mName.Append(", "); typeDef.mName.Append(genericType.mName); typeDef.mGenericParams.Add(genericType); typeDef.mTypeDefPool.Add(genericType); } typeDef.mName.Append(">"); } typeDef.mIsStruct = sRand.NextDouble() < mConfig.mStructPct; if ((mNamespaces.Count == 0) || (sRand.NextDouble() < mConfig.mNewSpacespaceChance)) { NamespaceDef newNamespace = new NamespaceDef(); newNamespace.mName = new String(); mAdjList.GetName((float)sRand.NextDouble(), 1, true, newNamespace.mName); if ((mNamespaces.Count > 0) && (sRand.NextDouble() >= mConfig.mRootNamespaceChance)) { NamespaceDef parentNamepace = mNamespaces[sRand.Next(mNamespaces.Count)]; parentNamepace.mChildren.Add(newNamespace); newNamespace.mParent = parentNamepace; } mNamespaces.Add(newNamespace); typeDef.mNamespace = newNamespace; } else { typeDef.mNamespace = mNamespaces[sRand.Next(mNamespaces.Count)]; } mUserTypes.Add(typeDef); } void CreateTypePool(TypeDef typeDef, int poolSize) { for (int poolIdx = 0; poolIdx < poolSize; poolIdx++) { TypeDef poolTypeDef = GetRandomTypeDef(); ReferenceType(poolTypeDef); poolTypeDef.mUseCount++; typeDef.mTypeDefPool.Add(poolTypeDef); } } void PopulateType(TypeDef typeDef) { mCurTypeDef = typeDef; int poolSize = (int)(GetComplexity(mConfig.mTypeDefPoolPower) * mConfig.mTypeDefPoolScalar + mConfig.mTypeDefPoolOffset); CreateTypePool(typeDef, poolSize); int fieldCount = (int)(GetComplexity(mConfig.mFieldCountPower) * mConfig.mFieldCountScalar); if (typeDef.mIsStruct) fieldCount++; for (int fieldIdx = 0; fieldIdx < fieldCount; fieldIdx++) { FieldDef fieldDef = new FieldDef(); fieldDef.mIsStatic = sRand.NextDouble() < mConfig.mFieldStaticPct; // Just to make sure structs have at least one non-static member if (fieldIdx == 0) fieldDef.mIsStatic = false; // Generic statics don't currently work if (typeDef.mGenericParams != null) fieldDef.mIsStatic = false; if (fieldDef.mIsStatic) { fieldDef.mName = new String("s"); mNounList.GetName((float)sRand.NextDouble(), 1, true, fieldDef.mName); } else { fieldDef.mName = new String("m"); mNounList.GetName((float)sRand.NextDouble(), 1, true, fieldDef.mName); } fieldDef.mTypeDef = GetRandomPooledTypeDef(); typeDef.mFields.Add(fieldDef); } for (int methodIdx = 0; methodIdx < (int)(typeDef.mComplexity * mConfig.mMethodCountScalar); methodIdx++) { MethodDef methodDef = new MethodDef(); mCurMethodDef = methodDef; float methodComplexity = GetComplexity(mConfig.mMethodCodeComplexityPower); methodDef.mName = new String(); mVerbList.GetName(methodComplexity, 2, true, methodDef.mName); methodDef.mComplexity = methodComplexity; if (sRand.NextDouble() < mConfig.mVoidReturnPct) methodDef.mReturnType = mVoidType; else methodDef.mReturnType = GetRandomPooledTypeDef(); int paramCount = (int)(GetComplexity(mConfig.mParamCountPower) * mConfig.mParamCountScalar); for (int paramIdx = 0; paramIdx < paramCount; paramIdx++) { LocalDef localDef = new LocalDef(); localDef.mName = new String(); mNounList.GetName((float)sRand.NextDouble(), 1, false, localDef.mName); localDef.mTypeDef = GetRandomPooledTypeDef(); methodDef.mLocals.Add(localDef); methodDef.mParamCount++; } typeDef.mMethods.Add(methodDef); } MethodDef methodDef = new MethodDef(); methodDef.mIsStatic = true; methodDef.mName = new String("Use"); methodDef.mReturnType = mVoidType; typeDef.mMethods.Add(methodDef); } void DelTree(StringView dirName) { Debug.Assert(!dirName.IsEmpty); if (!Directory.Exists(dirName)) return; for (var subDir in Directory.EnumerateDirectories(dirName)) { var filePath = scope String(); subDir.GetFilePath(filePath); DelTree(filePath); } for (var file in Directory.EnumerateFiles(dirName)) { var filePath = scope String(); file.GetFilePath(filePath); if (filePath.EndsWith(".bf")) { File.Delete(filePath); } } Directory.Delete(dirName); } FieldDef FindField(TypeDef inside, TypeDef wantTypeDef) { for (var field in inside.mFields) { if (field.mTypeDef == wantTypeDef) { if (field.mName == "sTar") { NOP!(); } return field; } } return null; } void FindData(TypeDef typeDef, String outStr) { for (int pass = 0; pass < 10; pass++) { int targetCategory = (int)(GetComplexity(1.0f) * 3); if (targetCategory == 0) // 'This' { if (typeDef == mCurTypeDef) { outStr.Append("this"); return; } } if ((targetCategory == 1) && (mCurTypeDef.mFields.Count > 0)) // Field { var fieldDef = mCurTypeDef.mFields[(int)(sRand.NextDouble() * mCurTypeDef.mFields.Count)]; if (fieldDef.mTypeDef == typeDef) { outStr.Append(fieldDef.mName); return; } FieldDef subFieldDef = FindField(fieldDef.mTypeDef, typeDef); if (subFieldDef != null) { if (subFieldDef.mName == "sTar") { } if (subFieldDef.mIsStatic) { outStr.Append(fieldDef.mTypeDef.mName, ".", subFieldDef.mName); return; } else { outStr.Append(fieldDef.mName, ".", subFieldDef.mName); return; } } } if ((targetCategory == 2) && (mCurMethodDef.mLocals.Count > 0)) // Param / Local { var localDef = mCurMethodDef.mLocals[(int)(sRand.NextDouble() * mCurMethodDef.mLocals.Count)]; if (localDef.mTypeDef == typeDef) { outStr.Append(localDef.mName); return; } FieldDef subFieldDef = FindField(localDef.mTypeDef, typeDef); if (subFieldDef != null) { if (subFieldDef.mIsStatic) { outStr.Append(localDef.mTypeDef.mName, ".", subFieldDef.mName); return; } else { outStr.Append(localDef.mName, ".", subFieldDef.mName); return; } } } } if (typeDef.mIsPrimitive) { outStr.Append("0"); return; } if ((!typeDef.mIsStruct) && (typeDef.mGenericParamIdx == -1)) { outStr.Append("null"); return; } } void WriteLine() { WriteLine(""); } void WriteLine(String str) { mLineCount++; mWroteLine = true; for (int i = 0; i < mIndentCount; i++) mQueuedText.Append("\t"); mQueuedText.Append(str, "\n"); } void WriteLine(String str, params Object[] args) { WriteLine(scope String()..AppendF(str, params args)); } void ReferenceType(TypeDef typeDef) { if (typeDef.mNamespace != null) mCurTypeDef.mUsingNamespaces.Add(typeDef.mNamespace); if (typeDef.mGenericParams != null) { for (var genericParam in typeDef.mGenericParams) ReferenceType(genericParam); } } String GetRandomTarget(out TypeDef targetType) { int targetCategory = (int)(GetComplexity(1.0f) * 3); if (targetCategory == 0) // 'This' { targetType = mCurTypeDef; return ""; } if ((targetCategory == 1) && (mCurTypeDef.mFields.Count > 0)) // Field { var fieldDef = mCurTypeDef.mFields[(int)(sRand.NextDouble() * mCurTypeDef.mFields.Count)]; targetType = fieldDef.mTypeDef; return fieldDef.mName; } if ((targetCategory == 2) && (mCurMethodDef.mLocals.Count > 0)) // Param / Local { var localDef = mCurMethodDef.mLocals[(int)(sRand.NextDouble() * mCurMethodDef.mLocals.Count)]; targetType = localDef.mTypeDef; return localDef.mName; } targetType = null; return null; } MethodDef GenerateMethodCall(String methodTarget, TypeDef targetType) { if (targetType != null) { if (targetType.mMethods.Count > 0) { var methodDef = targetType.mMethods[sRand.Next(targetType.mMethods.Count)]; if (methodDef.mIsStatic) return null; String[] targets = scope String[methodDef.mParamCount]; bool paramsMatch = true; for (int paramIdx = 0; paramIdx < methodDef.mParamCount; paramIdx++) { var paramDef = methodDef.mLocals[paramIdx]; targets[paramIdx] = scope:: String(); FindData(paramDef.mTypeDef, targets[paramIdx]); if (targets[paramIdx].IsEmpty) paramsMatch = false; } if (paramsMatch) { String str = scope String(); bool didAssign = false; if (sRand.NextDouble() < mConfig.mAssignMemberPct) { for (var fieldDef in mCurTypeDef.mFields) { if (fieldDef.mTypeDef == methodDef.mReturnType) { str.Append(fieldDef.mName, " = "); didAssign = true; break; } } } if ((!didAssign) && (sRand.NextDouble() < mConfig.mCreateLocalPct) && (methodDef.mReturnType != mVoidType)) { ReferenceType(methodDef.mReturnType); LocalDef localDef = new LocalDef(); localDef.mName = new String(); mNounList.GetName((float)sRand.NextDouble(), 1, false, localDef.mName); localDef.mTypeDef = methodDef.mReturnType; mCurMethodDef.mLocals.Add(localDef); str.Append(localDef.mTypeDef.mName); str.Append(" "); str.Append(localDef.mName); str.Append(" = "); } str.Append(methodTarget); if (methodTarget != "") str.Append("."); str.Append(methodDef.mName); str.Append("("); for (int paramIdx = 0; paramIdx < methodDef.mParamCount; paramIdx++) { if (paramIdx > 0) str.Append(", "); str.Append(targets[paramIdx]); } str.Append(");"); WriteLine(str); return methodDef; } } } return null; } MethodDef GenerateMethodCall() { TypeDef targetType = null; String methodTarget = GetRandomTarget(out targetType); return GenerateMethodCall(methodTarget, targetType); } void PopLocal() { var localDef = mCurMethodDef.mLocals.PopBack(); delete localDef; } void GetBoolExpression(String outStr) { TypeDef targetType; String checkTarget = GetRandomTarget(out targetType); if (checkTarget == null) return; if (checkTarget == "") checkTarget = "this"; if (targetType.mIsStruct) return; if (targetType.mGenericParamIdx != -1) return; String rhs = scope String(); FindData(targetType, rhs); if ((rhs != null) && (checkTarget != rhs)) { outStr.Append(checkTarget, " != ", rhs); return; } if (targetType.mIsPrimitive) { outStr.Append(checkTarget, " != 0"); return; } outStr.Append(checkTarget, " != null"); } void GenerateMainBlock() { WriteLine("{"); mIndentCount++; for (var pooledType in mUserTypes) { if (pooledType.mIsPrimitive) continue; if (pooledType.mIsUnspecializedGeneric) continue; if (pooledType.mName == "Program") continue; var line = scope String(); pooledType.GetFullName(line); line.Append(".Use();"); WriteLine(line); } WriteLine("return 0;"); mIndentCount--; WriteLine("}"); } void GenerateUseBlock() { WriteLine("{"); mIndentCount++; var line = scope String(); mCurTypeDef.GetFullName(line); line.Append(" val = "); if (!mCurTypeDef.mIsStruct) line.Append("new "); mCurTypeDef.GetFullName(line); line.Append("();"); WriteLine(line); for (var method in mCurTypeDef.mMethods) { if (method.mIsStatic) continue; line.Clear(); line.Append("val.", method.mName); line.Append("("); for (int argIdx < method.mParamCount) { if (argIdx > 0) line.Append(", "); line.Append("default"); } line.Append(");"); WriteLine(line); } mIndentCount--; WriteLine("}"); } void GenerateBlock() { int prevLocalIdx = mCurMethodDef.mLocals.Count; WriteLine("{"); mIndentCount++; int methodLength = (int)(mCurMethodDef.mComplexity * mConfig.mMethodLengthScalar); mWroteLine = false; //while (true) for (int stmtIdx < methodLength) { /*if (mCurMethodDef.mStatementCount > 0) mCurMethodDef.mStatementCount--; else if ((mWroteLine) && ((0.93 + mCurMethodDef.mComplexity * 0.03) < sRand.NextDouble())) break;*/ if (sRand.NextDouble() < 0.5f) { GenerateMethodCall(); } if (sRand.NextDouble() < 0.05f / mIndentCount) { String localVarName = new String()..AppendF("{0}", (char8)('i' + mIndentCount - 3)); String toVal = scope String(); FindData(mPrimitives[0], toVal); if (toVal.IsEmpty) { toVal = scope:: String(); sRand.Next(1000).ToString(toVal); } LocalDef localDef = new LocalDef(); localDef.mName = localVarName; localDef.mTypeDef = mPrimitives[0]; mCurMethodDef.mLocals.Add(localDef); WriteLine("for (int {0} = 0; {0} < {1}; {0}++)", localVarName, toVal); GenerateBlock(); PopLocal(); } if (sRand.NextDouble() < 0.05f / mIndentCount) { String boolExpr = scope String(); GetBoolExpression(boolExpr); if (!boolExpr.IsEmpty) { WriteLine("if ({0})", boolExpr); GenerateBlock(); if (sRand.NextDouble() < 0.35f) { WriteLine("else"); GenerateBlock(); } } } } if (mIndentCount == mStartIndentCount + 1) { if (mCurMethodDef.mReturnType.mName != "void") { String retValName = scope String(); FindData(mCurMethodDef.mReturnType, retValName); if (retValName.IsEmpty) retValName.Append("default(", mCurMethodDef.mReturnType.mName, ")"); WriteLine("return {0};", retValName); } } mIndentCount--; WriteLine("}"); while (mCurMethodDef.mLocals.Count > prevLocalIdx) PopLocal(); } TypeDef FixType(TypeDef typeDef) { if (typeDef.mGenericParamIdx != -1) return mCurTypeDef.mGenericParams[typeDef.mGenericParamIdx]; return typeDef; } void SpecializeType(TypeDef unspecializedType) { TypeDef specializedType = new TypeDef(); mCurTypeDef = specializedType; specializedType.mName = new String(); unspecializedType.GetRootName(specializedType.mName); specializedType.mIsSpecializedGeneric = true; specializedType.mGenericParams = new List(); specializedType.mIsStruct = unspecializedType.mIsStruct; specializedType.mNamespace = unspecializedType.mNamespace; specializedType.mName.Append("<"); for (int genericIdx = 0; genericIdx < unspecializedType.mGenericParams.Count; genericIdx++) { if (genericIdx > 0) specializedType.mName.Append(", "); var genericArg = GetRandomTypeDef(); //specializedType.mName.Append(genericArg.mName); genericArg.GetFullName(specializedType.mName); specializedType.mGenericParams.Add(genericArg); } specializedType.mName.Append(">"); for (var srcFieldDef in unspecializedType.mFields) { FieldDef destFieldDef = new FieldDef(); destFieldDef.mName = new String(srcFieldDef.mName); destFieldDef.mTypeDef = FixType(srcFieldDef.mTypeDef); destFieldDef.mIsStatic = srcFieldDef.mIsStatic; specializedType.mFields.Add(destFieldDef); } for (var srcMethodDef in specializedType.mMethods) { MethodDef destMethodDef = new MethodDef(); destMethodDef.mName = new String(srcMethodDef.mName); destMethodDef.mReturnType = FixType(srcMethodDef.mReturnType); destMethodDef.mParamCount = srcMethodDef.mParamCount; for (var localDef in srcMethodDef.mLocals) { LocalDef destLocalDef = new LocalDef(); destLocalDef.mName = new String(localDef.mName); destLocalDef.mTypeDef = FixType(localDef.mTypeDef); destMethodDef.mLocals.Add(destLocalDef); } specializedType.mMethods.Add(destMethodDef); } mUserTypes.Add(specializedType); } void ProgressStart() { if (cProgressSize > 0) { String str = scope String(); str.Append("["); str.Append(' ', cProgressSize); str.Append("]"); str.Append('\b', cProgressSize + 1); Console.Write(str); } } int mProgressIdx = 0; void WriteProgress(float pct) { int progressIdx = (int)Math.Round(pct * cProgressSize); while (progressIdx > mProgressIdx) { mProgressIdx++; Console.Write("*"); } } const int cProgressSize = 30; void Run() { CreatePrimitives(); DelTree(mBaseDir); mAdjList = CreateWordGroup("adj"); mAdvList = CreateWordGroup("adv"); mNounList = CreateWordGroup("noun"); mVerbList = CreateWordGroup("verb"); for (int typeIdx = 0; typeIdx < mConfig.mTypeCount; typeIdx++) GenerateType(); for (int typeIdx = 0; typeIdx < mUserTypes.Count; typeIdx++ ) { TypeDef typeDef = mUserTypes[typeIdx]; if (typeDef.mIsUnspecializedGeneric) { PopulateType(typeDef); int specializeCount = (int)(GetComplexity(mConfig.mSpecializedTypePower) * mConfig.mUnspecializedTypeScalar); for (int specializedIdx = 0; specializedIdx < specializeCount; specializedIdx++) SpecializeType(typeDef); } } for (int typeIdx = 0; typeIdx < mUserTypes.Count; typeIdx++) { TypeDef typeDef = mUserTypes[typeIdx]; if ((!typeDef.mIsUnspecializedGeneric) && (!typeDef.mIsSpecializedGeneric)) PopulateType(typeDef); } { TypeDef typeDef = new TypeDef(); typeDef.mName = new String("Program"); MethodDef methodDef = new MethodDef(); methodDef.mName = new String("Main"); methodDef.mParamCount = 1; var arrTypeDef = new TypeDef(); arrTypeDef.mName = new String("System.String[]"); mOtherTypes.Add(arrTypeDef); LocalDef localDef = new LocalDef(); localDef.mName = new String("args"); localDef.mTypeDef = arrTypeDef; methodDef.mLocals.Add(localDef); methodDef.mStatementCount = mUserTypes.Count + mPrimitives.Count; methodDef.mReturnType = mPrimitives[2]; methodDef.mIsStatic = true; typeDef.mMethods.Add(methodDef); mCurTypeDef = typeDef; CreateTypePool(typeDef, mUserTypes.Count + mPrimitives.Count); mUserTypes.Add(typeDef); } if (!mVerbose) ProgressStart(); int specializedTypes = 0; int unspecializedTypes = 0; for (var typeDef in mUserTypes) UserTypeBlock: { var typeFullName = scope String(); typeDef.GetFullName(typeFullName); if (typeDef.mIsSpecializedGeneric) { specializedTypes++; if (mVerbose) Console.WriteLine("Skipping type: {0} uses: {1}", typeFullName, typeDef.mUseCount); continue; } if (typeDef.mIsUnspecializedGeneric) unspecializedTypes++; if (mVerbose) Console.WriteLine("Writing type: {0} uses: {1}", typeFullName, typeDef.mUseCount); String directory = scope String(); String namespaceStr = scope String(); if (typeDef.mNamespace != null) { typeDef.mNamespace.GetFullName(namespaceStr); directory.Append(mBaseDir, "/"); directory.Replace('.', '/'); } else { directory.Append(mBaseDir); } //StringWriter StringWriter = new StringWriter(); //mFile = StringWriter; String fullPath = scope String()..Append(directory, "/"); typeDef.GetRootName(fullPath); fullPath.Append(".bf"); FileStream file = scope FileStream(); bool isOpen = false; for (int i = 0; i < 500; i++) { Directory.CreateDirectory(directory).IgnoreError(); if (file.Create(fullPath) case .Ok) { isOpen = true; break; } Thread.Sleep(10); } if (!isOpen) Runtime.FatalError("Unable to create file"); StreamWriter streamWrite = scope .(file, Encoding.UTF8, 4096); mCurTypeDef = typeDef; //mFile = file; mIndentCount = 0; WriteLine("// RandoCode seed: {0}", mSeed); WriteLine("#pragma warning disable 0168"); WriteLine(); if (!namespaceStr.IsEmpty) { WriteLine("namespace {0}", namespaceStr); WriteLine("{"); mIndentCount++; } String typeStr = scope String(); if (typeDef.mIsStruct) typeStr.Append("struct "); else typeStr.Append("class "); typeStr.Append(typeDef.mName); WriteLine(typeStr); WriteLine("{"); mIndentCount++; for (var fieldDef in typeDef.mFields) { String str = scope String("public "); if (fieldDef.mIsStatic) str.Append("static "); str.Append(fieldDef.mTypeDef.mName); str.Append(" "); str.Append(fieldDef.mName); str.Append(";"); WriteLine(str); } for (int methodIdx = 0; methodIdx < typeDef.mMethods.Count; methodIdx++) { WriteLine(); var methodDef = typeDef.mMethods[methodIdx]; mCurMethodDef = methodDef; String str = scope String("public "); if (methodDef.mIsStatic) str.Append("static "); str.Append(methodDef.mReturnType.mName); str.Append(" "); str.Append(methodDef.mName); str.Append("("); for (int paramIdx = 0; paramIdx < methodDef.mParamCount; paramIdx++) { if (paramIdx > 0) str.Append(", "); var paramDef = methodDef.mLocals[paramIdx]; str.Append(paramDef.mTypeDef.mName); str.Append(" "); str.Append(paramDef.mName); } str.Append(")"); if (typeDef.mIsStruct) str.Append("mut "); WriteLine(str); mStartIndentCount = mIndentCount; if (methodDef.mName == "Main") GenerateMainBlock(); else if (methodDef.mName == "Use") GenerateUseBlock(); else GenerateBlock(); } mIndentCount--; WriteLine("}"); if (!namespaceStr.IsEmpty) { mIndentCount--; WriteLine("}"); } for (var namespaceDef in typeDef.mUsingNamespaces) { var namespaceName = scope String(); namespaceDef.GetFullName(namespaceName); streamWrite.WriteLine("using {0};", namespaceName); } streamWrite.Write(mQueuedText); mQueuedText.Clear(); file.Close(); if (!mVerbose) WriteProgress(@typeDef.Index / (float)mUserTypes.Count); } if (!mVerbose) Console.WriteLine(""); Console.WriteLine("Types: {0} UnspecializedGenerics: {1} SpecializedGenerics: {2} Lines: {3}", mUserTypes.Count, unspecializedTypes, specializedTypes, mLineCount); } void HandleConfig(String configPath) { StructuredData sd = scope StructuredData(); sd.Load(configPath); sd.Get("TypeCount", ref mConfig.mTypeCount); sd.Get("PrimitiveTypeChance", ref mConfig.mPrimitiveTypeChance); sd.Get("StructPct", ref mConfig.mStructPct); sd.Get("TypeComplexityPower", ref mConfig.mTypeComplexityPower); sd.Get("CreateGenericTypePct", ref mConfig.mCreateGenericTypePct); sd.Get("SpecializedTypePower", ref mConfig.mSpecializedTypePower); sd.Get("UnspecializedTypeScalar", ref mConfig.mUnspecializedTypeScalar); sd.Get("TypeDefPoolPower", ref mConfig.mTypeDefPoolPower); sd.Get("TypeDefPoolOffset", ref mConfig.mTypeDefPoolOffset); sd.Get("TypeDefPoolScalar", ref mConfig.mTypeDefPoolScalar); sd.Get("FieldCountPower", ref mConfig.mFieldCountPower); sd.Get("FieldCountScalar", ref mConfig.mFieldCountScalar); sd.Get("FieldStaticPct", ref mConfig.mFieldStaticPct); sd.Get("VoidReturnPct", ref mConfig.mVoidReturnPct); sd.Get("MethodCodeComplexityPower", ref mConfig.mMethodCodeComplexityPower); sd.Get("MethodLengthScalar", ref mConfig.mMethodLengthScalar); sd.Get("MethodCountScalar", ref mConfig.mMethodCountScalar); sd.Get("AssignMemberPct", ref mConfig.mAssignMemberPct); sd.Get("CreateLocalPct", ref mConfig.mCreateLocalPct); sd.Get("ParamCountPower", ref mConfig.mParamCountPower); sd.Get("ParamCountScalar", ref mConfig.mParamCountScalar); sd.Get("NewSpacespaceChance", ref mConfig.mNewSpacespaceChance); sd.Get("RootNamespaceChance", ref mConfig.mRootNamespaceChance); } static void Main(String[] args) { if (args.Count == 0) { Console.WriteLine("Usage: RandoCode "); return; } String cwd = scope String(); Directory.GetCurrentDirectory(cwd); Program pg = new Program(); pg.HandleConfig(args[0]); pg.Run(); delete pg; } } } ================================================ FILE: samples/Befunge/aturley.bf ================================================ >84*>:#v_55+"ude.ub@yelruta">:#,_@>188*+>\02p\12p\:22p#v_$ 55+,1- v ^ 0 v +1\ _^#-+*< >22g02g*"_@"*-!1- #v_v> >:>::3g: ,\188 ^^ -1\g21\g22:1 v v.:< # |:\< < >v"No more "0 < 0 ,: : ^_$ v |!-1 < >v"bottle"0< | :,*25< ,: >"s"v@ ^_$1- | , >v" of beer"0< < ,: >v ^_$ :!| >v" on the wall"0< ,: >"."v ^_$ >:2-!| >",">,25*,: | >v"Take one down, pass it around,"0$< ,: ^_$25*,1- :2v ================================================ FILE: samples/Befunge/befunge3.bf ================================================ Bef ung e-9 3 r ock s!* #^< ^ $ - 0 1 _ 2 ^ @ < v+ +: :7 : + < * 0 : *< > - 1 1 - v 1 > + , ^ >:0 g,: 4 %2- | 8 '97 BEM ================================================ FILE: samples/Befunge/cascade.bf ================================================ >011p013p>11g13gg:84*`#v_84*>11g13g4+p$v # 13p^p11 <> ^ > v < # 13pv>11g1+:85*-#^_011p13g1+:4%#^_ ================================================ FILE: samples/Befunge/mycorand.bf ================================================ p4v p00+1g00 <<<<< v< #> : | ," > 1- :2+"^"\7p "^"32p: | ,t v? 1- :2+">"\7p "^"33p: | ,i > 1- :2+"v"\7p "^"34p: | ,m > 1- :2+"<"\7p "^"35p:| ,e v +55<<<<< p6+1*36*88p6*54-1*95<" >" redro eht ni detareneg erew snoitcerid ehT">:#,_" tem saw ?">:#,_g1+."s"^ After going in a direction: Subtract one from the counter Place >^v<, according to which direction was taken, in the string Setup the following being done every time this path is taken again, then do it: If the counter is zero, output the number of tries needed and the order of >^v< and stop Add one to the number of tries needed Go back to the ? ================================================ FILE: samples/Berry/berry_schema_validator.be ================================================ # A berry schema validator similar to a json schema validator import persist var sv = module('sv') sv.regex = 'regex' sv.time = 'time' def gettype(data) var t = type(data) return t == 'instance' ? classname(data) : t end class PatternMatch static formats = {} static def load() if persist.has('sv_formats') PatternMatch.formats = persist.sv_formats else persist.sv_formats = { "%H:%M": { "validator": "time", "pattern": "%H:%M" } } PatternMatch.formats = persist.sv_formats end end end class FormatValidator var _compiled def init() self._compiled = {} end def match(format, value) var found = PatternMatch.formats.find(format) if found != nil var engine = self.invoke(found['validator']) if engine !=nil return !!engine(self, found['pattern'], value) end end return !!self.regex(format, value) end def invoke(engine) return { sv.regex: self.regex, sv.time: self.strptime }.find(engine) end def regex(pattern, value) import re # If the compiled regex is not cached, compile and cache if !self._compiled.contains(pattern) self._compiled[pattern] = re.compile(pattern) end return self._compiled[pattern].match(value) end def strptime(pattern, value) var t = tasmota.strptime(value, pattern) if t && t['hour'] < 24 && t['min'] < 60 && t['sec'] < 60 return true else return false end end end class Validate var node, name, path, errors, value, fv def addError(error) var path = self.path[1..] path.push(self.name) path = path.concat('.') self.errors[path] = error end def isValid(node, data, name, value, path, errors) self.node = node self.name = name self.path = path self.errors = errors self.value = value if !self.isValidRequired() self.addError('is required') return false end if self.value == 'undefined' return true end var tv = gettype(self.value) if !self.isValidType(tv) self.addError('type must be ' .. self.node['type']) return false; end if !self.isValidSize(tv) self.addError('size must be '.. self.node['size']) return false end if !self.isValidValues(tv) self.addError('values must be '.. self.node['values']) return false end if !self.isValidFormat() self.addError('value does not match '.. self.node['format']) return false end return true end def isValidRequired() var required = self.node.find('required') return !(self.value == 'undefined' && required) end def isValidType(tv) if !self.node.contains('type') return true end return tv == self.node['type'] end def isValidSize(tv) if !self.node.contains('size') return true end if tv != 'list' && tv != 'string' return true end var sizeType = gettype(self.node['size']) if sizeType == 'int' return size(self.value) == self.node['size'] elif sizeType == 'range' return size(self.value) >= self.node['size'].lower() && size(self.value) <= self.node['size'].upper() else self.addError('schema size must be int or range') return false end end def isValidValues(tv) if !self.node.contains('values') return true end var nv = self.node['values'] if gettype(nv) != 'list' self.addError("schema values must be list") return false end var num = (tv == 'int' || tv == 'real') for v: nv if num && isinstance(v, range) && self.value >= v.lower() && self.value <= v.upper() return true elif self.value == v return true end end return false end def isValidFormat() if !self.node.contains('format') return true end # Lazy instantiate the FormatValidator if needed if !self.fv self.fv = FormatValidator() end return self.fv.match(self.node['format'], self.value) end end class SchemaValidator var data, errors, path, val def init(schema, data) self.data = {} self.errors = {} self.path = [] self.val = Validate() self.visit({"root": schema}, {"root": data}) end def visit(parentNode, data, opt, cleanedData) data = data ? data : {} opt = opt ? opt : {} cleanedData = cleanedData ? cleanedData : {} if opt.contains('nodeName') self.path.push(opt['nodeName']) end for name: parentNode.keys() var node = parentNode[name] var nodeType = gettype(node) # Expand schema list shortcut if nodeType == 'list' node = { "items": node[0], "type": 'list' } if node['items'].contains('size') node['size'] = node['items']['size'] node['items'].remove('size') end end var value = data.contains(name) ? data[name] : 'undefined' if !self.val.isValid(node, data, name, value, self.path, self.errors) continue end if value == 'undefined' continue end if node['type'] == 'map' cleanedData[name] = {} self.visit( node['properties'], data[name], {"nodeName": name}, cleanedData[name] ) continue elif node['type'] == 'list' cleanedData[name] = [] for idx: data[name].keys() self.visit( {idx: node['items']}, {idx: data[name][idx]}, {"nodeName": name}, cleanedData[name] ) end continue end if gettype(cleanedData) == 'list' cleanedData.push(data[name]) else cleanedData[name] = data[name] end end if opt.contains('nodeName') self.path.pop() end if self.path.size() == 0 self.data = cleanedData.find('root') end return self end def result() return { "is_valid": !self.errors.size(), "errors": self.errors, "data": self.data } end end # Load persisted regex patterns PatternMatch.load() sv.formats = def() var l = [] for k: PatternMatch.formats.keys() l.push(k) end return l end sv.add_format = def(pattern, engine, value) if type(pattern) != 'string' return end if type(value) != 'string' return end if engine != sv.regex && engine != sv.time return end PatternMatch.formats.setitem( value, {"validator": engine, "pattern": pattern} ) persist.save() end sv.remove_format = def(key) PatternMatch.formats.remove(key) persist.save() end sv.validate = def(schema, data) return SchemaValidator(schema, data).result() end return sv ================================================ FILE: samples/Berry/lcd_display.be ================================================ import string var lcd_display = module('lcd_display') # ------------------------------------------------------------------------------------ # This is a Tasmota driver for the Liquid Crystal LCD displays that use the I2C bus. # The backlight is on by default, since that is the most likely operating mode in # most cases. It is a direct berry port of the Arduino Liquid Crystal 12C C++ library. # Cols and Rows both start at 1, not zero. # ------------------------------------------------------------------------------------- class lcd_i2c # commands static LCD_CLEARDISPLAY = 0x01 static LCD_RETURNHOME = 0x02 static LCD_ENTRYMODESET = 0x04 static LCD_DISPLAYCONTROL = 0x08 static LCD_CURSORSHIFT = 0x10 static LCD_FUNCTIONSET = 0x20 static LCD_SETCGRAMADDR = 0x40 static LCD_SETDDRAMADDR = 0x80 # flags for display entry mode static LCD_ENTRYRIGHT = 0x00 static LCD_ENTRYLEFT = 0x02 static LCD_ENTRYSHIFTINCREMENT = 0x01 static LCD_ENTRYSHIFTDECREMENT = 0x00 # flags for display on/off control static LCD_DISPLAYON = 0x04 static LCD_DISPLAYOFF = 0x00 static LCD_CURSORON = 0x02 static LCD_CURSOROFF = 0x00 static LCD_BLINKON = 0x01 static LCD_BLINKOFF = 0x00 # flags for display/cursor shift static LCD_DISPLAYMOVE = 0x08 static LCD_CURSORMOVE = 0x00 static LCD_MOVERIGHT = 0x04 static LCD_MOVELEFT = 0x00 # flags for function set static LCD_8BITMODE = 0x10 static LCD_4BITMODE = 0x00 static LCD_2LINE = 0x08 static LCD_1LINE = 0x00 static LCD_5x10DOTS = 0x04 static LCD_5x8DOTS = 0x00 # flags for backlight control static LCD_BACKLIGHT = 0x08 static LCD_NOBACKLIGHT = 0x00 # Helper flags static LCD_LINES = {1: 0x80, 2: 0xC0, 3: 0x94, 4: 0xD4} static LCD_SLEEP = 1 static Rg = 0x00 # Register default static En = 0x04 # Enable bit static Rs = 0x01 # Register select bit var address, wire, rows, cols, charsize, backlight, displaycontrol, displaymode # Constructor # # @param address I2C slave address of the LCD display. Most likely printed on the # LCD circuit board, or look in the supplied LCD documentation. # @param cols Number of columns your LCD display has. # @param rows Number of rows your LCD display has. # @param charsize The size in dots that the display has, use LCD_5x10DOTS or LCD_5x8DOTS. def init(address, rows, cols, charsize) self.address = address ? address : 0x27 self.rows = rows ? rows : 4 self.cols = cols ? cols : 20 self.charsize = charsize ? charsize : self.LCD_5x8DOTS self.backlight = self.LCD_BACKLIGHT self.wire = tasmota.wire_scan(self.address) # Start the display self.begin() end def begin() # Set some defaults... var displayfunction = self.LCD_4BITMODE | self.LCD_1LINE | self.LCD_5x8DOTS if self.rows > 1 displayfunction |= self.LCD_2LINE end # For some 1 line displays you can select a 10 pixel high font if self.charsize != 0 && self.rows == 1 displayfunction |= self.LCD_5x10DOTS end # Reeset expander and turn backlight off (Bit 8 =1) self.expand_write(self.backlight) tasmota.delay(1) # We start in 8bit mode, try to set 4 bit mode self.write4bits(0x03 << 4) # Wait min 4 ms tasmota.delay(5) # second try self.write4bits(0x03 << 4) tasmota.delay(5) # wait min 4.1ms # third go! self.write4bits(0x03 << 4) tasmota.delay(1) # set to 4-bit interface self.write4bits(0x02 << 4) # Set lines, font size, etc. self.command(self.LCD_FUNCTIONSET | displayfunction) # Turn the display on with no cursor or blinking default self.displaycontrol = self.LCD_DISPLAYON | self.LCD_CURSOROFF | self.LCD_BLINKOFF self.display() # Clear the screen self.clear() # Initialize to default text direction (for roman languages) self.displaymode = self.LCD_ENTRYLEFT | self.LCD_ENTRYSHIFTDECREMENT # Set the entry mode self.command(self.LCD_ENTRYMODESET | self.displaymode) # Set cursor position to zero self.home() end #********** High level commands, for the user! ********** def clear() self.command(self.LCD_CLEARDISPLAY) end # Set cursor position to zero def home() self.command(self.LCD_RETURNHOME) tasmota.delay(2) end # Set cursor position. First row and column is 1 not zero def set_cursor(col, row) var row_offsets = [0x00, 0x40, 0x14, 0x54] if row > self.rows row = self.rows-1 end self.command(self.LCD_SETDDRAMADDR | (col-1 + row_offsets[row-1])) end # Turn the display on/off (quickly) def no_display() self.displaycontrol &= ~self.LCD_DISPLAYON self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol) end def display() self.displaycontrol |= self.LCD_DISPLAYON self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol) end # Turns the underline cursor on/off def no_cursor() self.displaycontrol &= ~self.LCD_CURSORON self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol) end def cursor() self.displaycontrol |= self.LCD_CURSORON self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol) end # Turn on and off the blinking cursor def no_blink() self.displaycontrol &= ~self.LCD_BLINKON self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol) end def blink() self.displaycontrol |= self.LCD_BLINKOFF self.command(self.LCD_DISPLAYCONTROL | self.displaycontrol) end # This is for text that flows Left to Right def display_left() self.command(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVELEFT) end def display_right() self.command(self.LCD_CURSORSHIFT | self.LCD_DISPLAYMOVE | self.LCD_MOVERIGHT) end # This is for text that flows Left to Right def left_to_right() self.displaymode |= self.LCD_ENTRYLEFT self.command(self.LCD_ENTRYMODESET | self.displaymode) end # This is for text that flows Right to Left def right_to_left() self.displaymode &= ~self.LCD_ENTRYLEFT self.command(self.LCD_ENTRYMODESET | self.displaymode) end # This will 'right justify' text from the cursor def autoscroll() self.displaymode |= self.LCD_ENTRYSHIFTINCREMENT self.command(self.LCD_ENTRYMODESET | self.displaymode) end # This will 'left justify' text from the cursor def no_autoscroll() self.displaymode &= ~self.LCD_ENTRYSHIFTINCREMENT self.command(self.LCD_ENTRYMODESET | self.displaymode) end # Allows us to fill the first 8 CGRAM locations with custom characters def create_char(location, chars) location &= 0x7 # We only have 8 locations 0-7 self.command(self.LCD_SETCGRAMADDR | (location << 3)) for char: 0 .. 7 self.write(chars[char]) end end # Turn the (optional) backlight on/off def backlight_on() self.backlight = self.LCD_BACKLIGHT self.expand_write(0) end def backlight_off() self.backlight = self.LCD_NOBACKLIGHT self.expand_write(0) end def get_backlight() return self.backlight == self.LCD_BACKLIGHT end # *********** Mid level commands, for sending data/cmds ************ def command(byte) self.send(byte, 0) end def write(byte) self.send(byte, self.Rs) end def write_line(text, line) if !self.LCD_LINES.has(line) return end import string self.command(self.LCD_LINES[line]) text = self.pad(text) for char: 0 .. size(text) -1 self.write(string.byte(text[char])) end end # ************ low level data pushing commands ************ def send(byte, mode) mode = mode ? mode : 0 self.write4bits(mode | (byte & 0xF0) ) self.write4bits(mode | ((byte << 4) & 0xF0) ) end def write4bits(byte) self.expand_write(byte) self.pulse_enable(byte) end def expand_write(byte) if self.wire != nil self.wire.write(self.address, self.Rg, (byte | self.backlight), 1) end end def pulse_enable(byte) self.expand_write(byte | self.En) tasmota.delay(self.LCD_SLEEP) self.expand_write(byte & ~self.En) tasmota.delay(self.LCD_SLEEP) end # Helper methods def pad(text) for x: size(text) .. self.cols-1 text += " " end return text end def set_backlight(on) if on self.backlight_on() else self.backlight_off() end end end class clock static callback = nil static initialised = false static waiting = false static def initialise() clock.initialised = true if clock.waiting clock.waiting = false clock.callback() clock.set_timer() end end static def start(callback) clock.callback = callback if clock.initialised clock.set_timer() else clock.waiting = true end end static def set_timer() tasmota.set_timer( def() var l = tasmota.rtc()['local'] var t = tasmota.time_dump(l) return 60000-t['sec']*1000 end(), def() if clock.callback clock.callback() end clock.set_timer() end, "hc_lcd_timer" ) end static def stop() tasmota.remove_timer("hc_lcd_timer") end end class dotmatrixscreen var lcd def init() self.lcd = lcd_i2c() end def start() self.power(true) # subscribe to initial time if clock.initialised self.update_clock() else self.lcd.write_line("Starting...", 1) clock.callback = / -> self.update_clock() end self.start_clock() tasmota.add_rule("HeatingDisplay#HeatingZone", /z-> self.update_zone(z)) tasmota.add_rule("HeatingDisplay#ClearZone", /z-> self.clear_zone(z)) end def stop() self.lcd.clear() tasmota.remove_rule("HeatingDisplay#HeatingZone") tasmota.remove_rule("HeatingDisplay#ClearZone") self.stop_clock() self.power(false) end def power(bool) self.lcd.set_backlight(bool) end def update_clock() self.lcd.write_line(tasmota.strftime('%H:%M %a %d %b %y', tasmota.rtc()['local']), 1) end def update_zone(zone) if zone['id'] > 3 return end var const = 12&(1<self.update_clock()) end def stop_clock() clock.stop() end end # Hold a reference to screen instance lcd_display._display = nil def ack() tasmota.publish_result('{"HeatingDisplay":"ACK"}', 'RESULT') end def start() if lcd_display._display return end lcd_display._display = dotmatrixscreen() lcd_display._display.start() end def stop() if !lcd_display._display return end lcd_display._display.stop() lcd_display._display = nil end # Subscibe to Tasmota events tasmota.add_rule("Time#Initialized", /-> clock.initialise()) # Subscribe to events sent from Heating Controller tasmota.add_rule("HeatingDisplay==ON", /->tasmota.set_timer(0, start)) tasmota.add_rule("HeatingDisplay==OFF", /->tasmota.set_timer(0, stop)) tasmota.add_rule("HeatingDisplay==SYN", /->tasmota.set_timer(0, ack)) # Once lvgl_display loads an initialisation trigger is broadcast ack() return lcd_display ================================================ FILE: samples/BibTeX/citations.bib ================================================ %% Following example taken from BibTeX's Wikipedia article @Book{abramowitz+stegun, author = "Milton {Abramowitz} and Irene A. {Stegun}", title = "Handbook of Mathematical Functions with Formulas, Graphs, and Mathematical Tables", publisher = "Dover", year = 1964, address = "New York City", edition = "ninth Dover printing, tenth GPO printing" } %% Next two examples were taken from github/linguist#3679 @incollection{dijkstra1982role, title={On the role of scientific thought}, author={Dijkstra, Edsger W}, booktitle={Selected writings on computing: a personal perspective}, pages={60--66}, year={1982}, publisher={Springer}} @book{knuth1998art, title={The art of computer programming: sorting and searching $math$}, author={Knuth, Donald Ervin}, volume={3}, year={1998}, publisher={Pearson Education} } ================================================ FILE: samples/BibTeX/deeplyaggrevated.bibtex ================================================ @article{DBLP:journals/corr/SunVGBB17, author = {Wen Sun and Arun Venkatraman and Geoffrey J. Gordon and Byron Boots and J. Andrew Bagnell}, title = {Deeply AggreVaTeD: Differentiable Imitation Learning for Sequential Prediction}, journal = {CoRR}, volume = {abs/1703.01030}, year = {2017}, url = {http://arxiv.org/abs/1703.01030}, timestamp = {Wed, 07 Jun 2017 14:41:53 +0200}, biburl = {http://dblp.uni-trier.de/rec/bib/journals/corr/SunVGBB17}, bibsource = {dblp computer science bibliography, http://dblp.org} } ================================================ FILE: samples/BibTeX Style/bibkeys.bst ================================================ % BibTeX bibliography style bibkeys (used to be citekeys) % by David Kotz kotz@dartmouth.edu % March 1994 % modified (distantly) from % BibTeX standard bibliography style `alpha' % Version 0.99b (8-Dec-10 release) for BibTeX versions 0.99a or later. % Copyright (C) 1984, 1985, 1988, 2010 Howard Trickey and Oren Patashnik. % Unlimited copying and redistribution of this file are permitted as long as % it is unmodified. Modifications (and redistribution of modified versions) % are also permitted, but only if the resulting file is renamed to something % besides btxbst.doc, plain.bst, unsrt.bst, alpha.bst, and abbrv.bst. % This restriction helps ensure that all standard styles are identical. % The file btxbst.doc has the documentation for this style. ENTRY { author } {} {} FUNCTION {article} {} FUNCTION {book} {} FUNCTION {booklet} {} FUNCTION {inbook} {} FUNCTION {incollection} {} FUNCTION {inproceedings} {} FUNCTION {conference} {} FUNCTION {manual} {} FUNCTION {mastersthesis} {} FUNCTION {misc} {} FUNCTION {phdthesis} {} FUNCTION {proceedings} {} FUNCTION {techreport} {} FUNCTION {unpublished} {} FUNCTION {default.type} { misc } MACRO {jan} {"January"} MACRO {feb} {"February"} MACRO {mar} {"March"} MACRO {apr} {"April"} MACRO {may} {"May"} MACRO {jun} {"June"} MACRO {jul} {"July"} MACRO {aug} {"August"} MACRO {sep} {"September"} MACRO {oct} {"October"} MACRO {nov} {"November"} MACRO {dec} {"December"} READ FUNCTION {presort} { cite$ #1 entry.max$ substring$ 'sort.key$ := } ITERATE {presort} SORT FUNCTION {cite.key.only} { cite$ write$ newline$ } ITERATE {cite.key.only} ================================================ FILE: samples/Bicep/101-container-registry.bicep ================================================ // params @minLength(5) @maxLength(50) @description('Specifies the name of the azure container registry.') param acrName string = 'acr001${uniqueString(resourceGroup().id)}' // must be globally unique @description('Enable admin user that have push / pull permission to the registry.') param acrAdminUserEnabled bool = false @description('Specifies the Azure location where the key vault should be created.') param location string = resourceGroup().location @allowed([ 'Basic' 'Standard' 'Premium' ]) @description('Tier of your Azure Container Registry.') param acrSku string = 'Basic' // azure container registry resource acr 'Microsoft.ContainerRegistry/registries@2019-12-01-preview' = { name: acrName location: location sku: { name: acrSku } properties: { adminUserEnabled: acrAdminUserEnabled } } output acrLoginServer string = acr.properties.loginServer ================================================ FILE: samples/Bicep/201-1vm-2nics-2subnets-1vnet.bicep ================================================ param virtualMachineSize string param adminUsername string @secure() param adminPassword string param storageAccountType string param location string = resourceGroup().location var nic1Name = 'nic-1' var nic2Name = 'nic-2' var virtualNetworkName = 'virtualNetwork' var subnet1Name = 'subnet-1' var subnet2Name = 'subnet-2' var publicIPAddressName = 'publicIp' var diagStorageAccountName = concat('diags', uniqueString(resourceGroup().id)) var networkSecurityGroupName = 'NSG' var networkSecurityGroupName2 = concat(subnet2Name, '-nsg') module vmMod './vm.bicep' = { name: 'vmMod' params: { adminUsername: adminUsername adminPassword: adminPassword virtualMachineSize: virtualMachineSize virtualMachineName: 'VM-MultiNic' nic1Id: nic1.id nic2Id: nic2.id diagsStorageUri: diagsAccount.properties.primaryEndpoints.blob } } resource diagsAccount 'Microsoft.Storage/storageAccounts@2017-06-01' = { name: diagStorageAccountName location: location sku: { name: storageAccountType } kind: 'Storage' } // Simple Network Security Group for subnet2 resource nsg2 'Microsoft.Network/networkSecurityGroups@2019-08-01' = { name: networkSecurityGroupName2 location: location properties: {} } // This will build a Virtual Network. resource vnet 'Microsoft.Network/virtualNetworks@2017-06-01' = { name: virtualNetworkName location: location properties: { addressSpace: { addressPrefixes: [ '10.0.0.0/16' ] } subnets: [ { name: subnet1Name properties: { addressPrefix: '10.0.0.0/24' } } { name: subnet2Name properties: { addressPrefix: '10.0.1.0/24' networkSecurityGroup: { id: nsg2.id } } } ] } } // This will be your Primary NIC resource nic1 'Microsoft.Network/networkInterfaces@2017-06-01' = { name: nic1Name location: location properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { subnet: { id: '${vnet.id}/subnets/${subnet1Name}' } privateIPAllocationMethod: 'Dynamic' publicIPAddress: { id: pip.id } } } ] networkSecurityGroup: { id: nsg.id } } } // This will be your Secondary NIC resource nic2 'Microsoft.Network/networkInterfaces@2017-06-01' = { name: nic2Name location: location properties: { ipConfigurations: [ { name: 'ipconfig1' properties: { subnet: { id: '${vnet.id}/subnets/${subnet2Name}' } privateIPAllocationMethod: 'Dynamic' } } ] } } // Public IP for your Primary NIC resource pip 'Microsoft.Network/publicIPAddresses@2017-06-01' = { name: publicIPAddressName location: location properties: { publicIPAllocationMethod: 'Dynamic' } } // Network Security Group (NSG) for your Primary NIC resource nsg 'Microsoft.Network/networkSecurityGroups@2016-09-01' = { name: networkSecurityGroupName location: location properties: { securityRules: [ { name: 'default-allow-rdp' properties: { priority: 1000 sourceAddressPrefix: '*' protocol: 'Tcp' destinationPortRange: '3389' access: 'Allow' direction: 'Inbound' sourcePortRange: '*' destinationAddressPrefix: '*' } } ] } } output publicIp string = pip.properties.ipAddress ================================================ FILE: samples/Bicep/params.bicepparam ================================================ using 'br/public:ai/cognitiveservices:1.1.1' var suffix = 'ac9h8d' param skuName = 'S0' param kind = 'OpenAI' param name = 'openai-${suffix}' param location = 'westus2' param deployments = [ { name: 'model-deployment-${suffix}' sku: { name: 'Standard' capacity: 120 } properties: { model: { format: 'OpenAI' name: 'text-davinci-002' version: 1 } raiPolicyName: 'Microsoft.Default' } } ] ================================================ FILE: samples/Bikeshed/example.bs ================================================
{
  "WEBASSEMBLY": {
    "href": "https://webassembly.github.io/spec/core/",
    "title": "WebAssembly Core Specification",
    "publisher": "W3C WebAssembly Community Group",
    "status": "Draft"
  }
}
urlPrefix: https://tc39.github.io/ecma262/; spec: ECMASCRIPT
    type: interface; for: ECMAScript
        text: ArrayBuffer; url: sec-arraybuffer-objects
    type: exception; for: ECMAScript
        text: Error; url: sec-error-objects
        text: NativeError; url: sec-nativeerror-constructors
        text: TypeError; url: sec-native-error-types-used-in-this-standard-typeerror
        text: RangeError; url: sec-native-error-types-used-in-this-standard-rangeerror
    type: dfn
        text: agent cluster; url: sec-agent-clusters
        text: agent; url: agent
        text: data block; url: sec-data-blocks
        text: Bound Function; url: sec-bound-function-exotic-objects
        text: NumericLiteral; url: sec-literals-numeric-literals
        text: surrounding agent; url: surrounding-agent
        text: ToNumber; url: sec-tonumber
        text: ToInt32; url: sec-toint32
        text: ToString; url: sec-tostring
        url: sec-ecmascript-data-types-and-values
            text: Type
            text: Type(x)
        url: sec-iscallable
            text: IsCallable
            text: callable; for: ECMAScript
        url: sec-well-known-intrinsic-objects
            text: %ErrorPrototype%
        text: %ObjectPrototype%; url: sec-properties-of-the-object-prototype-object
        text: %FunctionPrototype%; url: sec-properties-of-the-function-prototype-object
        text: %Promise%; url: sec-promise-constructor
        text: Property Descriptor; url: sec-property-descriptor-specification-type
        text: array index; url: sec-array-exotic-objects
        text: OrdinaryGetOwnProperty; url: sec-ordinarygetownproperty
        text: OrdinaryDefineOwnProperty; url: sec-ordinarydefineownproperty
        text: OrdinaryPreventExtensions; url: sec-ordinarypreventextensions
        text: OrdinarySet; url: sec-ordinaryset
        text: equally close values; url: sec-ecmascript-language-types-number-type
        text: internal slot; url: sec-object-internal-methods-and-internal-slots
        text: JavaScript execution context stack; url: execution-context-stack
        text: running JavaScript execution context; url: running-execution-context
        text: GetIterator; url: sec-getiterator
        text: IteratorStep; url: sec-iteratorstep
        text: NormalCompletion; url: sec-normalcompletion
        text: IteratorValue; url: sec-iteratorvalue
        url: sec-well-known-symbols
            text: @@iterator
            text: @@toStringTag
        text: CreateDataProperty; url: sec-createdataproperty
        text: DetachArrayBuffer; url: sec-detacharraybuffer
        text: SetIntegrityLevel; url: sec-setintegritylevel
        text: Call; url: sec-call
        text: Get; url: sec-get-o-p
        text: DefinePropertyOrThrow; url: sec-definepropertyorthrow
        text: current Realm; url: current-realm
        text: ObjectCreate; url: sec-objectcreate
        text: CreateBuiltinFunction; url: sec-createbuiltinfunction
        text: SetFunctionName; url: sec-setfunctionname
        text: SetFunctionLength; url: sec-setfunctionlength
        text: the Number value; url: sec-ecmascript-language-types-number-type
        text: NumberToRawBytes; url: sec-numbertorawbytes
        text: Built-in Function Objects; url: sec-built-in-function-objects
        text: NativeError Object Structure; url: sec-nativeerror-object-structure
        text: CreateArrayFromList; url: sec-createarrayfromlist
        text: GetMethod; url: sec-getmethod
        text: IterableToList; url: sec-iterabletolist
        text: ToBigInt64; url: #sec-tobigint64
        text: BigInt; url: #sec-ecmascript-language-types-bigint-type
    type: abstract-op
        text: CreateMethodProperty; url: sec-createmethodproperty
urlPrefix: https://webassembly.github.io/spec/core/; spec: WebAssembly; type: dfn
    url: valid/modules.html#valid-module
        text: valid
        text: WebAssembly module validation
    text: module grammar; url: binary/modules.html#binary-module
    text: custom section; url: binary/modules.html#custom-section
    text: customsec; url: binary/modules.html#binary-customsec
    text: memory instance; url: exec/runtime.html#memory-instances
    text: table instance; url: exec/runtime.html#table-instances
    text: global instance; url: exec/runtime.html#global-instances
    text: trap; url: exec/runtime.html#syntax-trap
    url: exec/runtime.html#values
        text: WebAssembly value
        text: i64.const
        text: i32.const
        text: f32.const
        text: f64.const
        text: ref.null
        text: ref.func
        text: ref.extern
    text: function index; url: syntax/modules.html#syntax-funcidx
    text: function instance; url: exec/runtime.html#function-instances
    text: store_init; url: appendix/embedding.html#embed-store-init
    text: module_decode; url: appendix/embedding.html#embed-module-decode
    text: module_validate; url: appendix/embedding.html#embed-module-validate
    text: module_instantiate; url: appendix/embedding.html#embed-module-instantiate
    text: module_imports; url: appendix/embedding.html#embed-module-imports
    text: module_exports; url: appendix/embedding.html#embed-module-exports
    text: instance_export; url: appendix/embedding.html#embed-instance-export
    text: func_alloc; url: appendix/embedding.html#embed-func-alloc
    text: func_type; url: appendix/embedding.html#embed-func-type
    text: func_invoke; url: appendix/embedding.html#embed-func-invoke
    text: table_alloc; url: appendix/embedding.html#embed-table-alloc
    text: table_type; url: appendix/embedding.html#embed-table-type
    text: table_read; url: appendix/embedding.html#embed-table-read
    text: table_write; url: appendix/embedding.html#embed-table-write
    text: table_size; url: appendix/embedding.html#embed-table-size
    text: table_grow; url: appendix/embedding.html#embed-table-grow
    text: mem_alloc; url: appendix/embedding.html#embed-mem-alloc
    text: mem_type; url: appendix/embedding.html#embed-mem-type
    text: mem_read; url: appendix/embedding.html#embed-mem-read
    text: mem_write; url: appendix/embedding.html#embed-mem-write
    text: mem_size; url: appendix/embedding.html#embed-mem-size
    text: mem_grow; url: appendix/embedding.html#embed-mem-grow
    text: global_alloc; url: appendix/embedding.html#embed-global-alloc
    text: global_type; url: appendix/embedding.html#embed-global-type
    text: global_read; url: appendix/embedding.html#embed-global-read
    text: global_write; url: appendix/embedding.html#embed-global-write
    text: error; url: appendix/embedding.html#embed-error
    text: store; url: exec/runtime.html#syntax-store
    text: table type; url: syntax/types.html#syntax-tabletype
    text: table address; url: exec/runtime.html#syntax-tableaddr
    text: function address; url: exec/runtime.html#syntax-funcaddr
    text: memory address; url: exec/runtime.html#syntax-memaddr
    text: global address; url: exec/runtime.html#syntax-globaladdr
    text: extern address; url: exec/runtime.html#syntax-externaddr
    url: syntax/types.html#syntax-numtype
        text: i32
        text: i64
        text: f32
        text: f64
    url: syntax/types.html#syntax-reftype
        text: reftype
        text: funcref
        text: externref
    text: function element; url: exec/runtime.html#syntax-funcelem
    text: import component; url: syntax/modules.html#imports
    text: external value; url: exec/runtime.html#syntax-externval
    text: host function; url: exec/runtime.html#syntax-hostfunc
    text: the instantiation algorithm; url: exec/modules.html#instantiation
    text: module; url: syntax/modules.html#syntax-module
    text: imports; url: syntax/modules.html#syntax-module
    text: import; url: syntax/modules.html#syntax-import
    url: syntax/types.html#external-types
        text: external type
        text: func
        text: table
        text: mem
        text: global
    text: global type; url: syntax/types.html#syntax-globaltype
    url: syntax/types.html#syntax-mut
        text: var
        text: const
    text: address; url: exec/runtime.html#addresses
    text: signed_32; url: exec/numerics.html#aux-signed
    text: memory.grow; url: exec/instructions.html#exec-memory-grow
    text: current frame; url: exec/conventions.html#exec-notation-textual
    text: module; for: frame; url: exec/runtime.html#syntax-frame
    text: memaddrs; for: moduleinst; url: exec/runtime.html#syntax-moduleinst
    text: signed_64; url: exec/numerics.html#aux-signed
    text: sequence; url: syntax/conventions.html#grammar-notation
urlPrefix: https://heycam.github.io/webidl/; spec: WebIDL
    type: dfn
        text: create a namespace object; url: create-a-namespace-object
This API provides a way to access WebAssembly [[WEBASSEMBLY]] through a bridge to explicitly construct modules from JavaScript [[ECMASCRIPT]].

Sample API Usage

This section is non-normative.

================================================ FILE: samples/Bikeshed/example2.bs ================================================
spec: ECMAScript; url: https://tc39.github.io/ecma262/#sec-data-blocks; type: dfn; text: data block;
url: https://www.w3.org/TR/mediacapture-streams/#dom-mediadevices-getusermedia; type: method; for: MediaDevices; text: getUserMedia()

Introduction

Audio on the web has been fairly primitive up to this point and until very recently has had to be delivered through plugins such as Flash and QuickTime. The introduction of the <{audio}> element in HTML5 is very important, allowing for basic streaming audio playback. But, it is not powerful enough to handle more complex audio applications. For sophisticated web-based games or interactive applications, another solution is required. It is a goal of this specification to include the capabilities found in modern game audio engines as well as some of the mixing, processing, and filtering tasks that are found in modern desktop audio production applications. The APIs have been designed with a wide variety of use cases [[webaudio-usecases]] in mind. Ideally, it should be able to support any use case which could reasonably be implemented with an optimized C++ engine controlled via script and run in a browser. That said, modern desktop audio software can have very advanced capabilities, some of which would be difficult or impossible to build with this system. Apple's Logic Audio is one such application which has support for external MIDI controllers, arbitrary plugin audio effects and synthesizers, highly optimized direct-to-disk audio file reading/writing, tightly integrated time-stretching, and so on. Nevertheless, the proposed system will be quite capable of supporting a large range of reasonably complex games and interactive applications, including musical ones. And it can be a very good complement to the more advanced graphics features offered by WebGL. The API has been designed so that more advanced capabilities can be added at a later time.

Features

The API supports these primary features: * [[#ModularRouting|Modular routing]] for simple or complex mixing/effect architectures. * High dynamic range, using 32-bit floats for internal processing. * [[#AudioParam|Sample-accurate scheduled sound playback]] with low [[#latency|latency]] for musical applications requiring a very high degree of rhythmic precision such as drum machines and sequencers. This also includes the possibility of [[#DynamicLifetime|dynamic creation]] of effects. * Automation of audio parameters for envelopes, fade-ins / fade-outs, granular effects, filter sweeps, LFOs etc. * Flexible handling of channels in an audio stream, allowing them to be split and merged. * Processing of audio sources from an <{audio}> or <{video}> {{MediaElementAudioSourceNode|media element}}. * Processing live audio input using a {{MediaStreamTrackAudioSourceNode|MediaStream}} from {{getUserMedia()}}. * Integration with WebRTC * Processing audio received from a remote peer using a {{MediaStreamTrackAudioSourceNode}} and [[!webrtc]]. * Sending a generated or processed audio stream to a remote peer using a {{MediaStreamAudioDestinationNode}} and [[!webrtc]]. * Audio stream synthesis and processing [[#AudioWorklet|directly using scripts]]. * [[#Spatialization|Spatialized audio]] supporting a wide range of 3D games and immersive environments: * Panning models: equalpower, HRTF, pass-through * Distance Attenuation * Sound Cones * Obstruction / Occlusion * Source / Listener based * A convolution engine for a wide range of linear effects, especially very high-quality room effects. Here are some examples of possible effects: * Small / large room * Cathedral * Concert hall * Cave * Tunnel * Hallway * Forest * Amphitheater * Sound of a distant room through a doorway * Extreme filters * Strange backwards effects * Extreme comb filter effects * Dynamics compression for overall control and sweetening of the mix * Efficient [[#AnalyserNode|real-time time-domain and frequency-domain analysis / music visualizer support]]. * Efficient biquad filters for lowpass, highpass, and other common filters. * A Waveshaping effect for distortion and other non-linear effects * Oscillators

Modular Routing

Modular routing allows arbitrary connections between different {{AudioNode}} objects. Each node can have inputs and/or outputs. A source node has no inputs and a single output. A destination node has one input and no outputs. Other nodes such as filters can be placed between the source and destination nodes. The developer doesn't have to worry about low-level stream format details when two objects are connected together; the right thing just happens. For example, if a mono audio stream is connected to a stereo input it should just mix to left and right channels [[#channel-up-mixing-and-down-mixing|appropriately]]. In the simplest case, a single source can be routed directly to the output. All routing occurs within an {{AudioContext}} containing a single {{AudioDestinationNode}}:
modular routing
A simple example of modular routing.
Illustrating this simple routing, here's a simple example playing a single sound:
const context = new AudioContext();

function playSound() {
	const source = context.createBufferSource();
	source.buffer = dogBarkingBuffer;
	source.connect(context.destination);
	source.start(0);
}
Here's a more complex example with three sources and a convolution reverb send with a dynamics compressor at the final output stage:
modular routing2
A more complex example of modular routing.
let context;
let compressor;
let reverb;

let source1, source2, source3;

let lowpassFilter;
let waveShaper;
let panner;

let dry1, dry2, dry3;
let wet1, wet2, wet3;

let mainDry;
let mainWet;

function setupRoutingGraph () {
	context = new AudioContext();

	// Create the effects nodes.
	lowpassFilter = context.createBiquadFilter();
	waveShaper = context.createWaveShaper();
	panner = context.createPanner();
	compressor = context.createDynamicsCompressor();
	reverb = context.createConvolver();

	// Create main wet and dry.
	mainDry = context.createGain();
	mainWet = context.createGain();

	// Connect final compressor to final destination.
	compressor.connect(context.destination);

	// Connect main dry and wet to compressor.
	mainDry.connect(compressor);
	mainWet.connect(compressor);

	// Connect reverb to main wet.
	reverb.connect(mainWet);

	// Create a few sources.
	source1 = context.createBufferSource();
	source2 = context.createBufferSource();
	source3 = context.createOscillator();

	source1.buffer = manTalkingBuffer;
	source2.buffer = footstepsBuffer;
	source3.frequency.value = 440;

	// Connect source1
	dry1 = context.createGain();
	wet1 = context.createGain();
	source1.connect(lowpassFilter);
	lowpassFilter.connect(dry1);
	lowpassFilter.connect(wet1);
	dry1.connect(mainDry);
	wet1.connect(reverb);

	// Connect source2
	dry2 = context.createGain();
	wet2 = context.createGain();
	source2.connect(waveShaper);
	waveShaper.connect(dry2);
	waveShaper.connect(wet2);
	dry2.connect(mainDry);
	wet2.connect(reverb);

	// Connect source3
	dry3 = context.createGain();
	wet3 = context.createGain();
	source3.connect(panner);
	panner.connect(dry3);
	panner.connect(wet3);
	dry3.connect(mainDry);
	wet3.connect(reverb);

	// Start the sources now.
	source1.start(0);
	source2.start(0);
	source3.start(0);
}
Modular routing also permits the output of {{AudioNode}}s to be routed to an {{AudioParam}} parameter that controls the behavior of a different {{AudioNode}}. In this scenario, the output of a node can act as a modulation signal rather than an input signal.
modular routing3
Modular routing illustrating one Oscillator modulating the frequency of another.
function setupRoutingGraph() {
	const context = new AudioContext();

	// Create the low frequency oscillator that supplies the modulation signal
	const lfo = context.createOscillator();
	lfo.frequency.value = 1.0;

	// Create the high frequency oscillator to be modulated
	const hfo = context.createOscillator();
	hfo.frequency.value = 440.0;

	// Create a gain node whose gain determines the amplitude of the modulation signal
	const modulationGain = context.createGain();
	modulationGain.gain.value = 50;

	// Configure the graph and start the oscillators
	lfo.connect(modulationGain);
	modulationGain.connect(hfo.detune);
	hfo.connect(context.destination);
	hfo.start(0);
	lfo.start(0);
}

API Overview

The interfaces defined are: * An AudioContext interface, which contains an audio signal graph representing connections between {{AudioNode}}s. * An {{AudioNode}} interface, which represents audio sources, audio outputs, and intermediate processing modules. {{AudioNode}}s can be dynamically connected together in a [[#ModularRouting|modular fashion]]. {{AudioNode}}s exist in the context of an {{AudioContext}}. * An {{AnalyserNode}} interface, an {{AudioNode}} for use with music visualizers, or other visualization applications. * An {{AudioBuffer}} interface, for working with memory-resident audio assets. These can represent one-shot sounds, or longer audio clips. * An {{AudioBufferSourceNode}} interface, an {{AudioNode}} which generates audio from an AudioBuffer. * An {{AudioDestinationNode}} interface, an {{AudioNode}} subclass representing the final destination for all rendered audio. * An {{AudioParam}} interface, for controlling an individual aspect of an {{AudioNode}}'s functioning, such as volume. * An {{AudioListener}} interface, which works with a {{PannerNode}} for spatialization. * An {{AudioWorklet}} interface representing a factory for creating custom nodes that can process audio directly using scripts. * An {{AudioWorkletGlobalScope}} interface, the context in which AudioWorkletProcessor processing scripts run. * An {{AudioWorkletNode}} interface, an {{AudioNode}} representing a node processed in an AudioWorkletProcessor. * An {{AudioWorkletProcessor}} interface, representing a single node instance inside an audio worker. * A {{BiquadFilterNode}} interface, an {{AudioNode}} for common low-order filters such as: * Low Pass * High Pass * Band Pass * Low Shelf * High Shelf * Peaking * Notch * Allpass * A {{ChannelMergerNode}} interface, an {{AudioNode}} for combining channels from multiple audio streams into a single audio stream. * A {{ChannelSplitterNode}} interface, an {{AudioNode}} for accessing the individual channels of an audio stream in the routing graph. * A {{ConstantSourceNode}} interface, an {{AudioNode}} for generating a nominally constant output value with an {{AudioParam}} to allow automation of the value. * A {{ConvolverNode}} interface, an {{AudioNode}} for applying a real-time linear effect (such as the sound of a concert hall). * A {{DelayNode}} interface, an {{AudioNode}} which applies a dynamically adjustable variable delay. * A {{DynamicsCompressorNode}} interface, an {{AudioNode}} for dynamics compression. * A {{GainNode}} interface, an {{AudioNode}} for explicit gain control. * An {{IIRFilterNode}} interface, an {{AudioNode}} for a general IIR filter. * A {{MediaElementAudioSourceNode}} interface, an {{AudioNode}} which is the audio source from an <{audio}>, <{video}>, or other media element. * A {{MediaStreamAudioSourceNode}} interface, an {{AudioNode}} which is the audio source from a {{MediaStream}} such as live audio input, or from a remote peer. * A {{MediaStreamTrackAudioSourceNode}} interface, an {{AudioNode}} which is the audio source from a {{MediaStreamTrack}}. * A {{MediaStreamAudioDestinationNode}} interface, an {{AudioNode}} which is the audio destination to a {{MediaStream}} sent to a remote peer. * A {{PannerNode}} interface, an {{AudioNode}} for spatializing / positioning audio in 3D space. * A {{PeriodicWave}} interface for specifying custom periodic waveforms for use by the {{OscillatorNode}}. * An {{OscillatorNode}} interface, an {{AudioNode}} for generating a periodic waveform. * A {{StereoPannerNode}} interface, an {{AudioNode}} for equal-power positioning of audio input in a stereo stream. * A {{WaveShaperNode}} interface, an {{AudioNode}} which applies a non-linear waveshaping effect for distortion and other more subtle warming effects. There are also several features that have been deprecated from the Web Audio API but not yet removed, pending implementation experience of their replacements: * A {{ScriptProcessorNode}} interface, an {{AudioNode}} for generating or processing audio directly using scripts. * An {{AudioProcessingEvent}} interface, which is an event type used with {{ScriptProcessorNode}} objects.

The Audio API

The {{BaseAudioContext}} Interface

This interface represents a set of {{AudioNode}} objects and their connections. It allows for arbitrary routing of signals to an {{AudioDestinationNode}}. Nodes are created from the context and are then [[#ModularRouting|connected]] together. {{BaseAudioContext}} is not instantiated directly, but is instead extended by the concrete interfaces {{AudioContext}} (for real-time rendering) and {{OfflineAudioContext}} (for offline rendering). {{BaseAudioContext}} are created with an internal slot [[pending promises]] that is an initially empty ordered list of promises. Each {{BaseAudioContext}} has a unique media element event task source. Additionally, a {{BaseAudioContext}} has two private slots [[rendering thread state]] and [[control thread state]] that take values from {{AudioContextState}}, and that are both
Proposed Correction Issue 2373-1. Use new Web IDL buffer primitives
Buttons here
initialy initially
set to "suspended".
enum AudioContextState {
	"suspended",
	"running",
	"closed"
};
Enumeration description
"suspended" This context is currently suspended (context time is not proceeding, audio hardware may be powered down/released).
"running" Audio is being processed.
"closed" This context has been released, and can no longer be used to process audio. All system audio resources have been released.
callback DecodeErrorCallback = undefined (DOMException error); callback DecodeSuccessCallback = undefined (AudioBuffer decodedData); [Exposed=Window] interface BaseAudioContext : EventTarget { readonly attribute AudioDestinationNode destination; readonly attribute float sampleRate; readonly attribute double currentTime; readonly attribute AudioListener listener; readonly attribute AudioContextState state; [SameObject, SecureContext] readonly attribute AudioWorklet audioWorklet; attribute EventHandler onstatechange; AnalyserNode createAnalyser (); BiquadFilterNode createBiquadFilter (); AudioBuffer createBuffer (unsigned long numberOfChannels, unsigned long length, float sampleRate); AudioBufferSourceNode createBufferSource (); ChannelMergerNode createChannelMerger (optional unsigned long numberOfInputs = 6); ChannelSplitterNode createChannelSplitter ( optional unsigned long numberOfOutputs = 6); ConstantSourceNode createConstantSource (); ConvolverNode createConvolver (); DelayNode createDelay (optional double maxDelayTime = 1.0); DynamicsCompressorNode createDynamicsCompressor (); GainNode createGain (); IIRFilterNode createIIRFilter (sequence<double> feedforward, sequence<double> feedback); OscillatorNode createOscillator (); PannerNode createPanner (); PeriodicWave createPeriodicWave (sequence<float> real, sequence<float> imag, optional PeriodicWaveConstraints constraints = {}); ScriptProcessorNode createScriptProcessor( optional unsigned long bufferSize = 0, optional unsigned long numberOfInputChannels = 2, optional unsigned long numberOfOutputChannels = 2); StereoPannerNode createStereoPanner (); WaveShaperNode createWaveShaper (); Promise<AudioBuffer> decodeAudioData ( ArrayBuffer audioData, optional DecodeSuccessCallback? successCallback, optional DecodeErrorCallback? errorCallback); };

Attributes

: audioWorklet :: Allows access to the Worklet object that can import a script containing {{AudioWorkletProcessor}} class definitions via the algorithms defined by [[!HTML]] and {{AudioWorklet}}. : currentTime :: This is the time in seconds of the sample frame immediately following the last sample-frame in the block of audio most recently processed by the context's rendering graph. If the context's rendering graph has not yet processed a block of audio, then {{BaseAudioContext/currentTime}} has a value of zero. In the time coordinate system of {{BaseAudioContext/currentTime}}, the value of zero corresponds to the first sample-frame in the first block processed by the graph. Elapsed time in this system corresponds to elapsed time in the audio stream generated by the {{BaseAudioContext}}, which may not be synchronized with other clocks in the system. (For an {{OfflineAudioContext}}, since the stream is not being actively played by any device, there is not even an approximation to real time.) All scheduled times in the Web Audio API are relative to the value of {{BaseAudioContext/currentTime}}. When the {{BaseAudioContext}} is in the "{{AudioContextState/running}}" state, the value of this attribute is monotonically increasing and is updated by the rendering thread in uniform increments, corresponding to one render quantum. Thus, for a running context, currentTime increases steadily as the system processes audio blocks, and always represents the time of the start of the next audio block to be processed. It is also the earliest possible time when any change scheduled in the current state might take effect. currentTime MUST be read atomically on the control thread before being returned. : destination :: An {{AudioDestinationNode}} with a single input representing the final destination for all audio. Usually this will represent the actual audio hardware. All {{AudioNode}}s actively rendering audio will directly or indirectly connect to {{BaseAudioContext/destination}}. : listener :: An {{AudioListener}} which is used for 3D spatialization. : onstatechange :: A property used to set the EventHandler for an event that is dispatched to {{BaseAudioContext}} when the state of the AudioContext has changed (i.e. when the corresponding promise would have resolved). An event of type {{Event}} will be dispatched to the event handler, which can query the AudioContext's state directly. A newly-created AudioContext will always begin in the suspended state, and a state change event will be fired whenever the state changes to a different state. This event is fired before the {{oncomplete}} event is fired. : sampleRate :: The sample rate (in sample-frames per second) at which the {{BaseAudioContext}} handles audio. It is assumed that all {{AudioNode}}s in the context run at this rate. In making this assumption, sample-rate converters or "varispeed" processors are not supported in real-time processing. The Nyquist frequency is half this sample-rate value. : state :: Describes the current state of the {{BaseAudioContext}}. Getting this attribute returns the contents of the {{[[control thread state]]}} slot.

Methods

: createAnalyser() :: Factory method for an {{AnalyserNode}}.
No parameters.
Return type: {{AnalyserNode}}
: createBiquadFilter() :: Factory method for a {{BiquadFilterNode}} representing a second order filter which can be configured as one of several common filter types.
No parameters.
Return type: {{BiquadFilterNode}}
: createBuffer(numberOfChannels, length, sampleRate) :: Creates an AudioBuffer of the given size. The audio data in the buffer will be zero-initialized (silent). A {{NotSupportedError}} exception MUST be thrown if any of the arguments is negative, zero, or outside its nominal range.
		numberOfChannels: Determines how many channels the buffer will have. An implementation MUST support at least 32 channels.
		length: Determines the size of the buffer in sample-frames.  This MUST be at least 1.
		sampleRate: Describes the sample-rate of the [=linear PCM=] audio data in the buffer in sample-frames per second. An implementation MUST support sample rates in at least the range 8000 to 96000.
		
Return type: {{AudioBuffer}}
: createBufferSource() :: Factory method for a {{AudioBufferSourceNode}}.
No parameters.
Return type: {{AudioBufferSourceNode}}
: createChannelMerger(numberOfInputs) :: Factory method for a {{ChannelMergerNode}} representing a channel merger. An {{IndexSizeError}} exception MUST be thrown if {{BaseAudioContext/createChannelMerger(numberOfInputs)/numberOfInputs}} is less than 1 or is greater than the number of supported channels.
		numberOfInputs: Determines the number of inputs. Values of up to 32 MUST be supported. If not specified, then `6` will be used.
		
Return type: {{ChannelMergerNode}}
: createChannelSplitter(numberOfOutputs) :: Factory method for a {{ChannelSplitterNode}} representing a channel splitter. An {{IndexSizeError}} exception MUST be thrown if {{BaseAudioContext/createChannelSplitter(numberOfOutputs)/numberOfOutputs}} is less than 1 or is greater than the number of supported channels.
		numberOfOutputs: The number of outputs. Values of up to 32 MUST be supported. If not specified, then `6` will be used.
		
Return type: {{ChannelSplitterNode}}
: createConstantSource() :: Factory method for a {{ConstantSourceNode}}.
No parameters.
Return type: {{ConstantSourceNode}}
: createConvolver() :: Factory method for a {{ConvolverNode}}.
No parameters.
Return type: {{ConvolverNode}}
: createDelay(maxDelayTime) :: Factory method for a {{DelayNode}}. The initial default delay time will be 0 seconds.
		maxDelayTime: Specifies the maximum delay time in seconds allowed for the delay line. If specified, this value MUST be greater than zero and less than three minutes or a {{NotSupportedError}} exception MUST be thrown. If not specified, then `1` will be used.
		
Return type: {{DelayNode}}
: createDynamicsCompressor() :: Factory method for a {{DynamicsCompressorNode}}.
No parameters.
Return type: {{DynamicsCompressorNode}}
: createGain() :: Factory method for {{GainNode}}.
No parameters.
Return type: {{GainNode}}
: createIIRFilter(feedforward, feedback) ::
		feedforward: An array of the feedforward (numerator) coefficients for the transfer function of the IIR filter. The maximum length of this array is 20. If all of the values are zero, an {{InvalidStateError}} MUST be thrown. A {{NotSupportedError}} MUST be thrown if the array length is 0 or greater than 20.
		feedback: An array of the feedback (denominator) coefficients for the transfer function of the IIR filter. The maximum length of this array is 20. If the first element of the array is 0, an {{InvalidStateError}} MUST be thrown. A {{NotSupportedError}} MUST be thrown if the array length is 0 or greater than 20.
		
Return type: {{IIRFilterNode}}
: createOscillator() :: Factory method for an {{OscillatorNode}}.
No parameters.
Return type: {{OscillatorNode}}
: createPanner() :: Factory method for a {{PannerNode}}.
No parameters.
Return type: {{PannerNode}}
: createPeriodicWave(real, imag, constraints) :: Factory method to create a {{PeriodicWave}}.
When calling this method, execute these steps: 1. If {{BaseAudioContext/createPeriodicWave()/real}} and {{BaseAudioContext/createPeriodicWave()/imag}} are not of the same length, an {{IndexSizeError}} MUST be thrown. 2. Let o be a new object of type {{PeriodicWaveOptions}}. 3. Respectively set the {{BaseAudioContext/createPeriodicWave()/real}} and {{BaseAudioContext/createPeriodicWave()/imag}} parameters passed to this factory method to the attributes of the same name on o. 4. Set the {{PeriodicWaveConstraints/disableNormalization}} attribute on o to the value of the {{PeriodicWaveConstraints/disableNormalization}} attribute of the constraints attribute passed to the factory method. 5. Construct a new {{PeriodicWave}} p, passing the {{BaseAudioContext}} this factory method has been called on as a first argument, and o. 6. Return p.
		real: A sequence of cosine parameters. See its {{PeriodicWaveOptions/real}} constructor argument for a more detailed description.
		imag: A sequence of sine parameters. See its {{PeriodicWaveOptions/imag}} constructor argument for a more detailed description.
		constraints: If not given, the waveform is normalized. Otherwise, the waveform is normalized according the value given by constraints.
		
Return type: {{PeriodicWave}}
: createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels) :: Factory method for a {{ScriptProcessorNode}}. This method is DEPRECATED, as it is intended to be replaced by {{AudioWorkletNode}}. Creates a {{ScriptProcessorNode}} for direct audio processing using scripts. An {{IndexSizeError}} exception MUST be thrown if {{bufferSize!!argument}} or {{numberOfInputChannels}} or {{numberOfOutputChannels}} are outside the valid range. It is invalid for both {{numberOfInputChannels}} and {{numberOfOutputChannels}} to be zero. In this case an {{IndexSizeError}} MUST be thrown.
		bufferSize: The {{ScriptProcessorNode/bufferSize}} parameter determines the buffer size in units of sample-frames. If it's not passed in, or if the value is 0, then the implementation will choose the best buffer size for the given environment, which will be constant power of 2 throughout the lifetime of the node. Otherwise if the author explicitly specifies the bufferSize, it MUST be one of the following values: 256, 512, 1024, 2048, 4096, 8192, 16384. This value controls how frequently the {{ScriptProcessorNode/onaudioprocess}} event is dispatched and how many sample-frames need to be processed each call. Lower values for {{ScriptProcessorNode/bufferSize}} will result in a lower (better) latency. Higher values will be necessary to avoid audio breakup and glitches. It is recommended for authors to not specify this buffer size and allow the implementation to pick a good buffer size to balance between latency and audio quality. If the value of this parameter is not one of the allowed power-of-2 values listed above, an {{IndexSizeError}} MUST be thrown.
		numberOfInputChannels: This parameter determines the number of channels for this node's input. The default value is 2. Values of up to 32 must be supported. A {{NotSupportedError}} must be thrown if the number of channels is not supported.
		numberOfOutputChannels: This parameter determines the number of channels for this node's output. The default value is 2. Values of up to 32 must be supported. A {{NotSupportedError}} must be thrown if the number of channels is not supported.
		
Return type: {{ScriptProcessorNode}}
: createStereoPanner() :: Factory method for a {{StereoPannerNode}}.
No parameters.
Return type: {{StereoPannerNode}}
: createWaveShaper() :: Factory method for a {{WaveShaperNode}} representing a non-linear distortion.
No parameters.
Return type: {{WaveShaperNode}}
: decodeAudioData(audioData, successCallback, errorCallback) :: Asynchronously decodes the audio file data contained in the {{ArrayBuffer}}. The {{ArrayBuffer}} can, for example, be loaded from an XMLHttpRequest's response attribute after setting the responseType to "arraybuffer". Audio file data can be in any of the formats supported by the <{audio}> element. The buffer passed to {{BaseAudioContext/decodeAudioData()}} has its content-type determined by sniffing, as described in [[!mimesniff]]. Although the primary method of interfacing with this function is via its promise return value, the callback parameters are provided for legacy reasons.
Candidate Correction Issue 2321:
Buttons here
Encourage implementation to warn authors in case of a corrupted file. It isn't possible to throw because this would be a breaking change.
Note: If the compressed audio data byte-stream is corrupted but the decoding can otherwise proceed, implementations are encouraged to warn authors for example via the developer tools.
When decodeAudioData is called, the following steps MUST be performed on the control thread: 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. 2. Let promise be a new Promise. 3.
Proposed Correction Issue 2361-1. Use new Web IDL buffer primitives
Buttons here
If the operation IsDetachedBuffer (described in [[!ECMASCRIPT]]) on {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}} is false, {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}} is [=BufferSource/detached=], execute the following steps:
1. Append promise to {{BaseAudioContext/[[pending promises]]}}. 2.
Proposed Correction Issue 2361-2. Use new Web IDL buffer primitives
Buttons here
Detach[=ArrayBuffer/Detach=] the {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}} {{ArrayBuffer}}. This operation is described in [[!ECMASCRIPT]]. If this operations throws, jump to the step 3.
3. Queue a decoding operation to be performed on another thread. 4. Else, execute the following error steps: 1. Let error be a {{DataCloneError}}. 2. Reject promise with error, and remove it from {{BaseAudioContext/[[pending promises]]}}. 3. Queue a media element task to invoke {{BaseAudioContext/decodeAudioData()/errorCallback!!argument}} with |error|. 5. Return promise.
When queuing a decoding operation to be performed on another thread, the following steps MUST happen on a thread that is not the control thread nor the rendering thread, called the decoding thread. Note: Multiple {{decoding thread}}s can run in parallel to service multiple calls to decodeAudioData. 1. Let can decode be a boolean flag, initially set to true. 2. Attempt to determine the MIME type of {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}}, using [[mimesniff#matching-an-audio-or-video-type-pattern]]. If the audio or video type pattern matching algorithm returns {{undefined}}, set can decode to false. 3. If can decode is true, attempt to decode the encoded {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}} into [=linear PCM=]. In case of failure, set can decode to false.
Proposed Correction Issue 2375. Only decode the first audio track of a multi-track media file.
Buttons here
If the media byte-stream contains multiple audio tracks, only decode the first track to [=linear pcm=]. Note: Authors who need more control over the decoding process can use [[WEBCODECS]].
4. If |can decode| is `false`, queue a media element task to execute the following steps: 1. Let error be a DOMException whose name is {{EncodingError}}. 2. Reject promise with error, and remove it from {{BaseAudioContext/[[pending promises]]}}. 3. If {{BaseAudioContext/decodeAudioData()/errorCallback!!argument}} is not missing, invoke {{BaseAudioContext/decodeAudioData()/errorCallback!!argument}} with error. 5. Otherwise: 1. Take the result, representing the decoded [=linear PCM=] audio data, and resample it to the sample-rate of the {{BaseAudioContext}} if it is different from the sample-rate of {{BaseAudioContext/decodeAudioData(audioData, successCallback, errorCallback)/audioData!!argument}}. 2. queue a media element task to execute the following steps: 1. Let buffer be an {{AudioBuffer}} containing the final result (after possibly performing sample-rate conversion). 2. Resolve promise with buffer. 3. If {{BaseAudioContext/decodeAudioData()/successCallback!!argument}} is not missing, invoke {{BaseAudioContext/decodeAudioData()/successCallback!!argument}} with buffer.
		audioData: An ArrayBuffer containing compressed audio data.
		successCallback: A callback function which will be invoked when the decoding is finished. The single argument to this callback is an AudioBuffer representing the decoded PCM audio data.
		errorCallback: A callback function which will be invoked if there is an error decoding the audio file.
		
Return type: {{Promise}}<{{AudioBuffer}}>

Callback {{DecodeSuccessCallback()}} Parameters

: {{DecodeSuccessCallback/decodedData!!argument}}, of type {{AudioBuffer}} :: The AudioBuffer containing the decoded audio data.

Callback {{DecodeErrorCallback()}} Parameters

: {{DecodeErrorCallback/error!!argument}}, of type {{DOMException}} :: The error that occurred while decoding.

Lifetime

Once created, an {{AudioContext}} will continue to play sound until it has no more sound to play, or the page goes away.

Lack of Introspection or Serialization Primitives

The Web Audio API takes a fire-and-forget approach to audio source scheduling. That is, source nodes are created for each note during the lifetime of the {{AudioContext}}, and never explicitly removed from the graph. This is incompatible with a serialization API, since there is no stable set of nodes that could be serialized. Moreover, having an introspection API would allow content script to be able to observe garbage collections.

System Resources Associated with {{BaseAudioContext}} Subclasses

The subclasses {{AudioContext}} and {{OfflineAudioContext}} should be considered expensive objects. Creating these objects may involve creating a high-priority thread, or using a low-latency system audio stream, both having an impact on energy consumption. It is usually not necessary to create more than one {{AudioContext}} in a document. Constructing or resuming a {{BaseAudioContext}} subclass involves acquiring system resources for that context. For {{AudioContext}}, this also requires creation of a system audio stream. These operations return when the context begins generating output from its associated audio graph. Additionally, a user-agent can have an implementation-defined maximum number of {{AudioContext}}s, after which any attempt to create a new {{AudioContext}} will fail, throwing {{NotSupportedError}}. {{AudioContext/suspend}} and {{AudioContext/close}} allow authors to release system resources, including threads, processes and audio streams. Suspending a {{BaseAudioContext}} permits implementations to release some of its resources, and allows it to continue to operate later by invoking {{AudioContext/resume}}. Closing an {{AudioContext}} permits implementations to release all of its resources, after which it cannot be used or resumed again. Note: For example, this can involve waiting for the audio callbacks to fire regularly, or to wait for the hardware to be ready for processing.

The {{AudioContext}} Interface

This interface represents an audio graph whose {{AudioDestinationNode}} is routed to a real-time output device that produces a signal directed at the user. In most use cases, only a single {{AudioContext}} is used per document.
enum AudioContextLatencyCategory {
		"balanced",
		"interactive",
		"playback"
};
Enumeration description
"balanced" Balance audio output latency and power consumption.
"interactive" Provide the lowest audio output latency possible without glitching. This is the default.
"playback" Prioritize sustained playback without interruption over audio output latency. Lowest power consumption.
[Exposed=Window] interface AudioContext : BaseAudioContext { constructor (optional AudioContextOptions contextOptions = {}); readonly attribute double baseLatency; readonly attribute double outputLatency; AudioTimestamp getOutputTimestamp (); Promise<undefined> resume (); Promise<undefined> suspend (); Promise<undefined> close (); MediaElementAudioSourceNode createMediaElementSource (HTMLMediaElement mediaElement); MediaStreamAudioSourceNode createMediaStreamSource (MediaStream mediaStream); MediaStreamTrackAudioSourceNode createMediaStreamTrackSource ( MediaStreamTrack mediaStreamTrack); MediaStreamAudioDestinationNode createMediaStreamDestination (); }; An {{AudioContext}} is said to be allowed to start if the user agent allows the context state to transition from "{{AudioContextState/suspended}}" to "{{AudioContextState/running}}". A user agent may disallow this initial transition, and to allow it only when the {{AudioContext}}'s [=relevant global object=] has [=sticky activation=]. {{AudioContext}} has an internal slot:
: [[suspended by user]] :: A boolean flag representing whether the context is suspended by user code. The initial value is false.

Constructors

: AudioContext(contextOptions) ::

If the current settings object's responsible document is NOT fully active, throw an InvalidStateError and abort these steps.

When creating an {{AudioContext}}, execute these steps: 1. Set a {{[[control thread state]]}} to suspended on the {{AudioContext}}. 2. Set a {{[[rendering thread state]]}} to suspended on the {{AudioContext}}. 3. Let [[pending resume promises]] be a slot on this {{AudioContext}}, that is an initially empty ordered list of promises. 4. If contextOptions is given, apply the options: 1. Set the internal latency of this {{AudioContext}} according to contextOptions.{{AudioContextOptions/latencyHint}}, as described in {{AudioContextOptions/latencyHint}}. 2. If contextOptions.{{AudioContextOptions/sampleRate}} is specified, set the {{BaseAudioContext/sampleRate}} of this {{AudioContext}} to this value. Otherwise, use the sample rate of the default output device. If the selected sample rate differs from the sample rate of the output device, this {{AudioContext}} MUST resample the audio output to match the sample rate of the output device. Note: If resampling is required, the latency of the AudioContext may be affected, possibly by a large amount. 5. If the context is allowed to start, send a control message to start processing. 6. Return this {{AudioContext}} object.
Sending a control message to start processing means executing the following steps: 1. Attempt to acquire system resources. In case of failure, abort the following steps. 3. Set the {{[[rendering thread state]]}} to running on the {{AudioContext}}. 1. queue a media element task to execute the following steps: 1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to "{{AudioContextState/running}}". 1. queue a media element task to fire an event named `statechange` at the {{AudioContext}}.
Note: It is unfortunately not possible to programatically notify authors that the creation of the {{AudioContext}} failed. User-Agents are encouraged to log an informative message if they have access to a logging mechanism, such as a developer tools console.
		contextOptions: User-specified options controlling how the {{AudioContext}} should be constructed.
		

Attributes

: baseLatency :: This represents the number of seconds of processing latency incurred by the {{AudioContext}} passing the audio from the {{AudioDestinationNode}} to the audio subsystem. It does not include any additional latency that might be caused by any other processing between the output of the {{AudioDestinationNode}} and the audio hardware and specifically does not include any latency incurred the audio graph itself. For example, if the audio context is running at 44.1 kHz and the {{AudioDestinationNode}} implements double buffering internally and can process and output audio each render quantum, then the processing latency is \((2\cdot128)/44100 = 5.805 \mathrm{ ms}\), approximately. : outputLatency :: The estimation in seconds of audio output latency, i.e., the interval between the time the UA requests the host system to play a buffer and the time at which the first sample in the buffer is actually processed by the audio output device. For devices such as speakers or headphones that produce an acoustic signal, this latter time refers to the time when a sample's sound is produced. The {{outputLatency}} attribute value depends on the platform and the connected hardware audio output device. The {{outputLatency}} attribute value does not change for the context's lifetime as long as the connected audio output device remains the same. If the audio output device is changed the {{outputLatency}} attribute value will be updated accordingly.

Methods

: close() :: Closes the {{AudioContext}}, [=release system resources|releasing the system resources=] being used. This will not automatically release all {{AudioContext}}-created objects, but will suspend the progression of the {{AudioContext}}'s {{BaseAudioContext/currentTime}}, and stop processing audio data.
When close is called, execute these steps: 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. 1. Let promise be a new Promise. 1. If the {{[[control thread state]]}} flag on the {{AudioContext}} is closed reject the promise with {{InvalidStateError}}, abort these steps, returning promise. 1. Set the {{[[control thread state]]}} flag on the {{AudioContext}} to closed. 1. Queue a control message to close the {{AudioContext}}. 1. Return promise.
Running a control message to close an {{AudioContext}} means running these steps on the rendering thread: 1. Attempt to release system resources. 2. Set the {{[[rendering thread state]]}} to suspended.
This will stop rendering.
3. If this control message is being run in a reaction to the document being unloaded, abort this algorithm.
There is no need to notify the control thread in this case.
4. queue a media element task to execute the following steps: 1. Resolve promise. 2. If the {{BaseAudioContext/state}} attribute of the {{AudioContext}} is not already "{{AudioContextState/closed}}": 1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to "{{AudioContextState/closed}}". 1. queue a media element task to fire an event named `statechange` at the {{AudioContext}}.
When an {{AudioContext}} is closed, any {{MediaStream}}s and {{HTMLMediaElement}}s that were connected to an {{AudioContext}} will have their output ignored. That is, these will no longer cause any output to speakers or other output devices. For more flexibility in behavior, consider using HTMLMediaElement.captureStream(). Note: When an {{AudioContext}} has been closed, implementation can choose to aggressively release more resources than when suspending.
No parameters.
Return type: {{Promise}}<{{undefined}}>
: createMediaElementSource(mediaElement) :: Creates a {{MediaElementAudioSourceNode}} given an {{HTMLMediaElement}}. As a consequence of calling this method, audio playback from the {{HTMLMediaElement}} will be re-routed into the processing graph of the {{AudioContext}}.
		mediaElement: The media element that will be re-routed.
		
Return type: {{MediaElementAudioSourceNode}}
: createMediaStreamDestination() :: Creates a {{MediaStreamAudioDestinationNode}}
No parameters.
Return type: {{MediaStreamAudioDestinationNode}}
: createMediaStreamSource(mediaStream) :: Creates a {{MediaStreamAudioSourceNode}}.
		mediaStream: The media stream that will act as source.
		
Return type: {{MediaStreamAudioSourceNode}}
: createMediaStreamTrackSource(mediaStreamTrack) :: Creates a {{MediaStreamTrackAudioSourceNode}}.
		mediaStreamTrack: The {{MediaStreamTrack}} that will act as source. The value of its kind attribute must be equal to "audio", or an {{InvalidStateError}} exception MUST be thrown.
		
Return type: {{MediaStreamTrackAudioSourceNode}}
: getOutputTimestamp() :: Returns a new {{AudioTimestamp}} instance containing two related audio stream position values for the context: the {{AudioTimestamp/contextTime}} member contains the time of the sample frame which is currently being rendered by the audio output device (i.e., output audio stream position), in the same units and origin as context's {{BaseAudioContext/currentTime}}; the {{AudioTimestamp/performanceTime}} member contains the time estimating the moment when the sample frame corresponding to the stored contextTime value was rendered by the audio output device, in the same units and origin as performance.now() (described in [[!hr-time-3]]). If the context's rendering graph has not yet processed a block of audio, then {{getOutputTimestamp}} call returns an {{AudioTimestamp}} instance with both members containing zero. After the context's rendering graph has started processing of blocks of audio, its {{BaseAudioContext/currentTime}} attribute value always exceeds the {{AudioTimestamp/contextTime}} value obtained from {{AudioContext/getOutputTimestamp}} method call.
The value returned from {{getOutputTimestamp}} method can be used to get performance time estimation for the slightly later context's time value:
				function outputPerformanceTime(contextTime) {
					const timestamp = context.getOutputTimestamp();
					const elapsedTime = contextTime - timestamp.contextTime;
					return timestamp.performanceTime + elapsedTime * 1000;
				}
			
In the above example the accuracy of the estimation depends on how close the argument value is to the current output audio stream position: the closer the given contextTime is to timestamp.contextTime, the better the accuracy of the obtained estimation.
Note: The difference between the values of the context's {{BaseAudioContext/currentTime}} and the {{AudioTimestamp/contextTime}} obtained from {{AudioContext/getOutputTimestamp}} method call cannot be considered as a reliable output latency estimation because {{BaseAudioContext/currentTime}} may be incremented at non-uniform time intervals, so {{AudioContext/outputLatency}} attribute should be used instead.
No parameters.
Return type: {{AudioTimestamp}}
: resume() :: Resumes the progression of the {{AudioContext}}'s {{BaseAudioContext/currentTime}} when it has been suspended.
When resume is called, execute these steps: 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. 1. Let promise be a new Promise. 2. If the {{[[control thread state]]}} on the {{AudioContext}} is closed reject the promise with {{InvalidStateError}}, abort these steps, returning promise. 3. Set {{[[suspended by user]]}} to false. 4. If the context is not allowed to start, append promise to {{BaseAudioContext/[[pending promises]]}} and {{AudioContext/[[pending resume promises]]}} and abort these steps, returning promise. 5. Set the {{[[control thread state]]}} on the {{AudioContext}} to running. 6. Queue a control message to resume the {{AudioContext}}. 7. Return promise.
Running a control message to resume an {{AudioContext}} means running these steps on the rendering thread: 1. Attempt to acquire system resources. 2. Set the {{[[rendering thread state]]}} on the {{AudioContext}} to running. 3. Start rendering the audio graph. 4. In case of failure, queue a media element task to execute the following steps: 1. Reject all promises from {{AudioContext/[[pending resume promises]]}} in order, then clear {{AudioContext/[[pending resume promises]]}}. 2. Additionally, remove those promises from {{BaseAudioContext/[[pending promises]]}}. 5. queue a media element task to execute the following steps: 1. Resolve all promises from {{AudioContext/[[pending resume promises]]}} in order. 1. Clear {{AudioContext/[[pending resume promises]]}}. Additionally, remove those promises from {{BaseAudioContext/[[pending promises]]}}. 2. Resolve promise. 3. If the {{BaseAudioContext/state}} attribute of the {{AudioContext}} is not already "{{AudioContextState/running}}": 1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to "{{AudioContextState/running}}". 1. queue a media element task to fire an event named `statechange` at the {{AudioContext}}.
No parameters.
Return type: {{Promise}}<{{undefined}}>
: suspend() :: Suspends the progression of {{AudioContext}}'s {{BaseAudioContext/currentTime}}, allows any current context processing blocks that are already processed to be played to the destination, and then allows the system to release its claim on audio hardware. This is generally useful when the application knows it will not need the {{AudioContext}} for some time, and wishes to temporarily release system resource associated with the {{AudioContext}}. The promise resolves when the frame buffer is empty (has been handed off to the hardware), or immediately (with no other effect) if the context is already suspended. The promise is rejected if the context has been closed.
When suspend is called, execute these steps: 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. 1. Let promise be a new Promise. 2. If the {{[[control thread state]]}} on the {{AudioContext}} is closed reject the promise with {{InvalidStateError}}, abort these steps, returning promise. 3. Append promise to {{BaseAudioContext/[[pending promises]]}}. 4. Set {{[[suspended by user]]}} to true. 5. Set the {{[[control thread state]]}} on the {{AudioContext}} to suspended. 6. Queue a control message to suspend the {{AudioContext}}. 7. Return promise.
Running a control message to suspend an {{AudioContext}} means running these steps on the rendering thread: 1. Attempt to release system resources. 2. Set the {{[[rendering thread state]]}} on the {{AudioContext}} to suspended. 3. queue a media element task to execute the following steps: 1. Resolve promise. 2. If the {{BaseAudioContext/state}} attribute of the {{AudioContext}} is not already "{{AudioContextState/suspended}}": 1. Set the {{BaseAudioContext/state}} attribute of the {{AudioContext}} to "{{AudioContextState/suspended}}". 1. queue a media element task to fire an event named `statechange` at the {{AudioContext}}.
While an {{AudioContext}} is suspended, {{MediaStream}}s will have their output ignored; that is, data will be lost by the real time nature of media streams. {{HTMLMediaElement}}s will similarly have their output ignored until the system is resumed. {{AudioWorkletNode}}s and {{ScriptProcessorNode}}s will cease to have their processing handlers invoked while suspended, but will resume when the context is resumed. For the purpose of {{AnalyserNode}} window functions, the data is considered as a continuous stream - i.e. the resume()/suspend() does not cause silence to appear in the {{AnalyserNode}}'s stream of data. In particular, calling {{AnalyserNode}} functions repeatedly when a {{AudioContext}} is suspended MUST return the same data.
No parameters.
Return type: {{Promise}}<{{undefined}}>

{{AudioContextOptions}}

The {{AudioContextOptions}} dictionary is used to specify user-specified options for an {{AudioContext}}.
dictionary AudioContextOptions {
	(AudioContextLatencyCategory or double) latencyHint = "interactive";
	float sampleRate;
};
Dictionary {{AudioContextOptions}} Members
: latencyHint :: Identify the type of playback, which affects tradeoffs between audio output latency and power consumption. The preferred value of the latencyHint is a value from {{AudioContextLatencyCategory}}. However, a double can also be specified for the number of seconds of latency for finer control to balance latency and power consumption. It is at the browser's discretion to interpret the number appropriately. The actual latency used is given by AudioContext's {{AudioContext/baseLatency}} attribute. : sampleRate :: Set the {{BaseAudioContext/sampleRate}} to this value for the {{AudioContext}} that will be created. The supported values are the same as the sample rates for an {{AudioBuffer}}. A {{NotSupportedError}} exception MUST be thrown if the specified sample rate is not supported. If {{AudioContextOptions/sampleRate}} is not specified, the preferred sample rate of the output device for this {{AudioContext}} is used.

{{AudioTimestamp}}

dictionary AudioTimestamp {
	double contextTime;
	DOMHighResTimeStamp performanceTime;
};
Dictionary {{AudioTimestamp}} Members
: contextTime :: Represents a point in the time coordinate system of BaseAudioContext's {{BaseAudioContext/currentTime}}. : performanceTime :: Represents a point in the time coordinate system of a Performance interface implementation (described in [[!hr-time-3]]).

The {{OfflineAudioContext}} Interface

{{OfflineAudioContext}} is a particular type of {{BaseAudioContext}} for rendering/mixing-down (potentially) faster than real-time. It does not render to the audio hardware, but instead renders as quickly as possible, fulfilling the returned promise with the rendered result as an {{AudioBuffer}}. [Exposed=Window] interface OfflineAudioContext : BaseAudioContext { constructor(OfflineAudioContextOptions contextOptions); constructor(unsigned long numberOfChannels, unsigned long length, float sampleRate); Promise<AudioBuffer> startRendering(); Promise<undefined> resume(); Promise<undefined> suspend(double suspendTime); readonly attribute unsigned long length; attribute EventHandler oncomplete; };

Constructors

: OfflineAudioContext(contextOptions) ::

If the current settings object's responsible document is NOT fully active, throw an InvalidStateError and abort these steps.

Let c be a new {{OfflineAudioContext}} object. Initialize c as follows: 1. Set the {{[[control thread state]]}} for c to "suspended". 2. Set the {{[[rendering thread state]]}} for c to "suspended". 3. Construct an {{AudioDestinationNode}} with its {{AudioNode/channelCount}} set to contextOptions.numberOfChannels.
		contextOptions: The initial parameters needed to construct this context.
		
: OfflineAudioContext(numberOfChannels, length, sampleRate) :: The {{OfflineAudioContext}} can be constructed with the same arguments as AudioContext.createBuffer. A {{NotSupportedError}} exception MUST be thrown if any of the arguments is negative, zero, or outside its nominal range. The OfflineAudioContext is constructed as if
			new OfflineAudioContext({
					numberOfChannels: numberOfChannels,
					length: length,
					sampleRate: sampleRate
			})
		
were called instead.
		numberOfChannels: Determines how many channels the buffer will have. See {{BaseAudioContext/createBuffer()}} for the supported number of channels.
		length: Determines the size of the buffer in sample-frames.
		sampleRate: Describes the sample-rate of the [=linear PCM=] audio data in the buffer in sample-frames per second. See {{BaseAudioContext/createBuffer()}} for valid sample rates.
		

Attributes

: length :: The size of the buffer in sample-frames. This is the same as the value of the length parameter for the constructor. : oncomplete :: An EventHandler of type OfflineAudioCompletionEvent. It is the last event fired on an {{OfflineAudioContext}}.

Methods

: startRendering() :: Given the current connections and scheduled changes, starts rendering audio. Although the primary method of getting the rendered audio data is via its promise return value, the instance will also fire an event named complete for legacy reasons.
Let [[rendering started]] be an internal slot of this {{OfflineAudioContext}}. Initialize this slot to false. When startRendering is called, the following steps MUST be performed on the control thread:
  1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}.
  2. If the {{[[rendering started]]}} slot on the {{OfflineAudioContext}} is true, return a rejected promise with {{InvalidStateError}}, and abort these steps.
  3. Set the {{[[rendering started]]}} slot of the {{OfflineAudioContext}} to true.
  4. Let promise be a new promise.
  5. Create a new {{AudioBuffer}}, with a number of channels, length and sample rate equal respectively to the numberOfChannels, length and sampleRate values passed to this instance's constructor in the contextOptions parameter. Assign this buffer to an internal slot [[rendered buffer]] in the {{OfflineAudioContext}}.
  6. If an exception was thrown during the preceding {{AudioBuffer}} constructor call, reject promise with this exception.
  7. Otherwise, in the case that the buffer was successfully constructed, begin offline rendering.
  8. Append promise to {{BaseAudioContext/[[pending promises]]}}.
  9. Return promise.
To begin offline rendering, the following steps MUST happen on a rendering thread that is created for the occasion.
  1. Given the current connections and scheduled changes, start rendering length sample-frames of audio into {{[[rendered buffer]]}}
  2. For every render quantum, check and {{OfflineAudioContext/suspend()|suspend}} rendering if necessary.
  3. If a suspended context is resumed, continue to render the buffer.
  4. Once the rendering is complete, queue a media element task to execute the following steps:
    1. Resolve the promise created by {{startRendering()}} with {{[[rendered buffer]]}}.
    2. queue a media element task to fire an event named `complete` using an instance of {{OfflineAudioCompletionEvent}} whose `renderedBuffer` property is set to {{[[rendered buffer]]}}.
No parameters.
Return type: {{Promise}}<{{AudioBuffer}}>
: resume() :: Resumes the progression of the {{OfflineAudioContext}}'s {{BaseAudioContext/currentTime}} when it has been suspended.
When resume is called, execute these steps: 1. If [=this=]'s [=relevant global object=]'s [=associated Document=] is not [=fully active=] then return [=a promise rejected with=] "{{InvalidStateError}}" {{DOMException}}. 1. Let promise be a new Promise. 1. Abort these steps and reject promise with {{InvalidStateError}} when any of following conditions is true: - The {{[[control thread state]]}} on the {{OfflineAudioContext}} is closed. - The {{[[rendering started]]}} slot on the {{OfflineAudioContext}} is false. 1. Set the {{[[control thread state]]}} flag on the {{OfflineAudioContext}} to running. 1. Queue a control message to resume the {{OfflineAudioContext}}. 1. Return promise.
Running a control message to resume an {{OfflineAudioContext}} means running these steps on the rendering thread: 1. Set the {{[[rendering thread state]]}} on the {{OfflineAudioContext}} to running. 2. Start rendering the audio graph. 3. In case of failure, queue a media element task to reject |promise| and abort the remaining steps. 4. queue a media element task to execute the following steps: 1. Resolve promise. 2. If the {{BaseAudioContext/state}} attribute of the {{OfflineAudioContext}} is not already "{{AudioContextState/running}}": 1. Set the {{BaseAudioContext/state}} attribute of the {{OfflineAudioContext}} to "{{AudioContextState/running}}". 1. queue a media element task to fire an event named `statechange` at the {{OfflineAudioContext}}.
No parameters.
Return type: {{Promise}}<{{undefined}}>
: suspend(suspendTime) :: Schedules a suspension of the time progression in the audio context at the specified time and returns a promise. This is generally useful when manipulating the audio graph synchronously on {{OfflineAudioContext}}. Note that the maximum precision of suspension is the size of the render quantum and the specified suspension time will be rounded up to the nearest render quantum boundary. For this reason, it is not allowed to schedule multiple suspends at the same quantized frame. Also, scheduling should be done while the context is not running to ensure precise suspension.
		suspendTime: Schedules a suspension of the rendering at the specified time, which is quantized and rounded up to the render quantum size. If the quantized frame number 
  1. is negative or
  2. is less than or equal to the current time or
  3. is greater than or equal to the total render duration or
  4. is scheduled by another suspend for the same time,
then the promise is rejected with {{InvalidStateError}}.
Return type: {{Promise}}<{{undefined}}>

{{OfflineAudioContextOptions}}

This specifies the options to use in constructing an {{OfflineAudioContext}}.
dictionary OfflineAudioContextOptions {
	unsigned long numberOfChannels = 1;
	required unsigned long length;
	required float sampleRate;
};
Dictionary {{OfflineAudioContextOptions}} Members
: length :: The length of the rendered {{AudioBuffer}} in sample-frames. : numberOfChannels :: The number of channels for this {{OfflineAudioContext}}. : sampleRate :: The sample rate for this {{OfflineAudioContext}}.

The {{OfflineAudioCompletionEvent}} Interface

This is an {{Event}} object which is dispatched to {{OfflineAudioContext}} for legacy reasons.
[Exposed=Window]
interface OfflineAudioCompletionEvent : Event {
	constructor (DOMString type, OfflineAudioCompletionEventInit eventInitDict);
	readonly attribute AudioBuffer renderedBuffer;
};
Attributes
: renderedBuffer :: An {{AudioBuffer}} containing the rendered audio data.
{{OfflineAudioCompletionEventInit}}
dictionary OfflineAudioCompletionEventInit : EventInit {
	required AudioBuffer renderedBuffer;
};
Dictionary {{OfflineAudioCompletionEventInit}} Members
: renderedBuffer :: Value to be assigned to the {{OfflineAudioCompletionEvent/renderedBuffer}} attribute of the event.

The {{AudioBuffer}} Interface

This interface represents a memory-resident audio asset. It can contain one or more channels with each channel appearing to be 32-bit floating-point [=linear PCM=] values with a nominal range of \([-1,1]\) but the values are not limited to this range. Typically, it would be expected that the length of the PCM data would be fairly short (usually somewhat less than a minute). For longer sounds, such as music soundtracks, streaming should be used with the <{audio}> element and {{MediaElementAudioSourceNode}}. An {{AudioBuffer}} may be used by one or more {{AudioContext}}s, and can be shared between an {{OfflineAudioContext}} and an {{AudioContext}}. {{AudioBuffer}} has four internal slots:
: [[number of channels]] :: The number of audio channels for this {{AudioBuffer}}, which is an unsigned long. : \[[length]] :: The length of each channel of this {{AudioBuffer}}, which is an unsigned long. : [[sample rate]] :: The sample-rate, in Hz, of this {{AudioBuffer}}, a float. : [[internal data]] :: A [=data block=] holding the audio sample data.
[Exposed=Window]
interface AudioBuffer {
	constructor (AudioBufferOptions options);
	readonly attribute float sampleRate;
	readonly attribute unsigned long length;
	readonly attribute double duration;
	readonly attribute unsigned long numberOfChannels;
	Float32Array getChannelData (unsigned long channel);
	undefined copyFromChannel (Float32Array destination,
	                           unsigned long channelNumber,
	                           optional unsigned long bufferOffset = 0);
	undefined copyToChannel (Float32Array source,
	                         unsigned long channelNumber,
	                         optional unsigned long bufferOffset = 0);
};

Constructors

: AudioBuffer(options) ::
1. If any of the values in {{AudioBuffer/constructor()/options!!argument}} lie outside its nominal range, throw a {{NotSupportedError}} exception and abort the following steps. 1. Let b be a new {{AudioBuffer}} object. 1. Respectively assign the values of the attributes {{AudioBufferOptions/numberOfChannels}}, {{AudioBufferOptions/length}}, {{AudioBufferOptions/sampleRate}} of the {{AudioBufferOptions}} passed in the constructor to the internal slots {{[[number of channels]]}}, {{[[length]]}}, {{[[sample rate]]}}. 1. Set the internal slot {{[[internal data]]}} of this {{AudioBuffer}} to the result of calling CreateByteDataBlock({{[[length]]}} * {{[[number of channels]]}}). Note: This initializes the underlying storage to zero. 1. Return b.
		options: An {{AudioBufferOptions}} that determine the properties for this {{AudioBuffer}}.
		

Attributes

: duration :: Duration of the PCM audio data in seconds. This is computed from the {{[[sample rate]]}} and the {{[[length]]}} of the {{AudioBuffer}} by performing a division between the {{AudioBuffer/[[length]]}} and the {{[[sample rate]]}}. : length :: Length of the PCM audio data in sample-frames. This MUST return the value of {{AudioBuffer/[[length]]}}. : numberOfChannels :: The number of discrete audio channels. This MUST return the value of {{[[number of channels]]}}. : sampleRate :: The sample-rate for the PCM audio data in samples per second. This MUST return the value of {{[[sample rate]]}}.

Methods

: copyFromChannel(destination, channelNumber, bufferOffset) :: The {{AudioBuffer/copyFromChannel()}} method copies the samples from the specified channel of the {{AudioBuffer}} to the destination array. Let buffer be the {{AudioBuffer}} with \(N_b\) frames, let \(N_f\) be the number of elements in the {{AudioBuffer/copyFromChannel()/destination}} array, and \(k\) be the value of {{AudioBuffer/copyFromChannel()/bufferOffset}}. Then the number of frames copied from buffer to {{AudioBuffer/copyFromChannel()/destination}} is \(\max(0, \min(N_b - k, N_f))\). If this is less than \(N_f\), then the remaining elements of {{AudioBuffer/copyFromChannel()/destination}} are not modified.
		destination: The array the channel data will be copied to.
		channelNumber: The index of the channel to copy the data from. If channelNumber is greater or equal than the number of channels of the {{AudioBuffer}}, an {{IndexSizeError}} MUST be thrown.
		bufferOffset: An optional offset, defaulting to 0.  Data from the {{AudioBuffer}} starting at this offset is copied to the {{AudioBuffer/copyFromChannel()/destination}}.
		
Return type: {{undefined}}
: copyToChannel(source, channelNumber, bufferOffset) :: The {{AudioBuffer/copyToChannel()}} method copies the samples to the specified channel of the {{AudioBuffer}} from the source array. A {{UnknownError}} may be thrown if {{AudioBuffer/copyToChannel()/source}} cannot be copied to the buffer. Let buffer be the {{AudioBuffer}} with \(N_b\) frames, let \(N_f\) be the number of elements in the {{AudioBuffer/copyToChannel()/source}} array, and \(k\) be the value of {{AudioBuffer/copyToChannel()/bufferOffset}}. Then the number of frames copied from {{AudioBuffer/copyToChannel()/source}} to the buffer is \(\max(0, \min(N_b - k, N_f))\). If this is less than \(N_f\), then the remaining elements of buffer are not modified.
		source: The array the channel data will be copied from.
		channelNumber: The index of the channel to copy the data to. If channelNumber is greater or equal than the number of channels of the {{AudioBuffer}}, an {{IndexSizeError}} MUST be thrown.
		bufferOffset: An optional offset, defaulting to 0.  Data from the {{AudioBuffer/copyToChannel()/source}} is copied to the {{AudioBuffer}} starting at this offset.
		
Return type: {{undefined}}
: getChannelData(channel) ::
Proposed Correction Issue 2361-3. Use new Web IDL buffer primitives
Buttons here
According to the rules described in acquire the content either get a reference toallow [=ArrayBufferView/write|writing=] into or [=get a copy of the buffer source|getting a copy of=] the bytes stored in {{[[internal data]]}} in a new {{Float32Array}}
A {{UnknownError}} may be thrown if the {{[[internal data]]}} or the new {{Float32Array}} cannot be created.
		channel: This parameter is an index representing the particular channel to get data for. An index value of 0 represents the first channel. This index value MUST be less than {{[[number of channels]]}} or an {{IndexSizeError}} exception MUST be thrown.
		
Return type: {{Float32Array}}
Note: The methods {{AudioBuffer/copyToChannel()}} and {{AudioBuffer/copyFromChannel()}} can be used to fill part of an array by passing in a {{Float32Array}} that's a view onto the larger array. When reading data from an {{AudioBuffer}}'s channels, and the data can be processed in chunks, {{AudioBuffer/copyFromChannel()}} should be preferred to calling {{AudioBuffer/getChannelData()}} and accessing the resulting array, because it may avoid unnecessary memory allocation and copying. An internal operation acquire the contents of an AudioBuffer is invoked when the contents of an {{AudioBuffer}} are needed by some API implementation. This operation returns immutable channel data to the invoker.
When an acquire the content operation occurs on an {{AudioBuffer}}, run the following steps: 1.
Proposed Correction Issue 2361-4. Use new Web IDL buffer primitives
Buttons here
If the operation IsDetachedBuffer on any of the {{AudioBuffer}}'s {{ArrayBuffer}}sany of the {{AudioBuffer}}'s {{ArrayBuffer}}s are [=BufferSource/detached=], return `true`, abort these steps, and return a zero-length channel data buffer to the invoker.
2.
Proposed Correction Issue 2361-5. Use new Web IDL buffer primitives
Buttons here
Detach[=ArrayBuffer/Detach=] all {{ArrayBuffer}}s for arrays previously returned by {{AudioBuffer/getChannelData()}} on this {{AudioBuffer}}.
Note: Because {{AudioBuffer}} can only be created via {{BaseAudioContext/createBuffer()}} or via the {{AudioBuffer}} constructor, this cannot throw. 3. Retain the underlying {{[[internal data]]}} from those {{ArrayBuffer}}s and return references to them to the invoker. 4. Attach {{ArrayBuffer}}s containing copies of the data to the {{AudioBuffer}}, to be returned by the next call to {{AudioBuffer/getChannelData()}}.
The [=acquire the contents of an AudioBuffer=] operation is invoked in the following cases: * When {{AudioBufferSourceNode/start()|AudioBufferSourceNode.start}} is called, it acquires the contents of the node's {{AudioBufferSourceNode/buffer}}. If the operation fails, nothing is played. * When the {{AudioBufferSourceNode/buffer}} of an {{AudioBufferSourceNode}} is set and {{AudioBufferSourceNode/start()|AudioBufferSourceNode.start}} has been previously called, the setter acquires the content of the {{AudioBuffer}}. If the operation fails, nothing is played. * When a {{ConvolverNode}}'s {{ConvolverNode/buffer}} is set to an {{AudioBuffer}} it acquires the content of the {{AudioBuffer}}. * When the dispatch of an {{AudioProcessingEvent}} completes, it acquires the contents of its {{AudioProcessingEvent/outputBuffer}}. Note: This means that {{AudioBuffer/copyToChannel()}} cannot be used to change the content of an {{AudioBuffer}} currently in use by an {{AudioNode}} that has [=acquire the content|acquired the content of an AudioBuffer=] since the {{AudioNode}} will continue to use the data previously acquired.

{{AudioBufferOptions}}

This specifies the options to use in constructing an {{AudioBuffer}}. The {{AudioBufferOptions/length}} and {{AudioBufferOptions/sampleRate}} members are required.
dictionary AudioBufferOptions {
	unsigned long numberOfChannels = 1;
	required unsigned long length;
	required float sampleRate;
};
Dictionary {{AudioBufferOptions}} Members
The allowed values for the members of this dictionary are constrained. See {{BaseAudioContext/createBuffer()}}.
: length :: The length in sample frames of the buffer. See {{BaseAudioContext/createBuffer()/length}} for constraints. : numberOfChannels :: The number of channels for the buffer. See {{BaseAudioContext/createBuffer()/numberOfChannels}} for constraints. : sampleRate :: The sample rate in Hz for the buffer. See {{BaseAudioContext/createBuffer()/sampleRate}} for constraints.

The {{AudioNode}} Interface

{{AudioNode}}s are the building blocks of an {{AudioContext}}. This interface represents audio sources, the audio destination, and intermediate processing modules. These modules can be connected together to form processing graphs for rendering audio to the audio hardware. Each node can have inputs and/or outputs. A source node has no inputs and a single output. Most processing nodes such as filters will have one input and one output. Each type of {{AudioNode}} differs in the details of how it processes or synthesizes audio. But, in general, an {{AudioNode}} will process its inputs (if it has any), and generate audio for its outputs (if it has any). Each output has one or more channels. The exact number of channels depends on the details of the specific {{AudioNode}}. An output may connect to one or more {{AudioNode}} inputs, thus fan-out is supported. An input initially has no connections, but may be connected from one or more {{AudioNode}} outputs, thus fan-in is supported. When the connect() method is called to connect an output of an {{AudioNode}} to an input of an {{AudioNode}}, we call that a connection to the input. Each {{AudioNode}} input has a specific number of channels at any given time. This number can change depending on the connection(s) made to the input. If the input has no connections then it has one channel which is silent. For each input, an {{AudioNode}} performs a mixing of all connections to that input. Please see for normative requirements and details. The processing of inputs and the internal operations of an {{AudioNode}} take place continuously with respect to {{AudioContext}} time, regardless of whether the node has connected outputs, and regardless of whether these outputs ultimately reach an {{AudioContext}}'s {{AudioDestinationNode}}.
[Exposed=Window]
interface AudioNode : EventTarget {
	AudioNode connect (AudioNode destinationNode,
	                   optional unsigned long output = 0,
	                   optional unsigned long input = 0);
	undefined connect (AudioParam destinationParam, optional unsigned long output = 0);
	undefined disconnect ();
	undefined disconnect (unsigned long output);
	undefined disconnect (AudioNode destinationNode);
	undefined disconnect (AudioNode destinationNode, unsigned long output);
	undefined disconnect (AudioNode destinationNode,
	                      unsigned long output,
	                      unsigned long input);
	undefined disconnect (AudioParam destinationParam);
	undefined disconnect (AudioParam destinationParam, unsigned long output);
	readonly attribute BaseAudioContext context;
	readonly attribute unsigned long numberOfInputs;
	readonly attribute unsigned long numberOfOutputs;
	attribute unsigned long channelCount;
	attribute ChannelCountMode channelCountMode;
	attribute ChannelInterpretation channelInterpretation;
};

AudioNode Creation

{{AudioNode}}s can be created in two ways: by using the constructor for this particular interface, or by using the factory method on the {{BaseAudioContext}} or {{AudioContext}}. The {{BaseAudioContext}} passed as first argument of the constructor of an {{AudioNode}}s is called the associated {{BaseAudioContext}} of the {{AudioNode}} to be created. Similarly, when using the factory method, the associated BaseAudioContext of the {{AudioNode}} is the {{BaseAudioContext}} this factory method is called on.
To create a new {{AudioNode}} of a particular type n using its factory method, called on a {{BaseAudioContext}} c, execute these steps: 1. Let node be a new object of type n. 2. Let option be a dictionary of the type associated to the interface associated to this factory method. 3. For each parameter passed to the factory method, set the dictionary member of the same name on option to the value of this parameter. 4. Call the constructor for n on node with c and option as arguments. 5. Return node
Initializing an object o that inherits from {{AudioNode}} means executing the following steps, given the arguments context and dict passed to the constructor of this interface. 1. Set o's associated {{BaseAudioContext}} to context. 2. Set its value for {{AudioNode/numberOfInputs}}, {{AudioNode/numberOfOutputs}}, {{AudioNode/channelCount}}, {{AudioNode/channelCountMode}}, {{AudioNode/channelInterpretation}} to the default value for this specific interface outlined in the section for each {{AudioNode}}. 3. For each member of dict passed in, execute these steps, with k the key of the member, and v its value. If any exceptions is thrown when executing these steps, abort the iteration and propagate the exception to the caller of the algorithm (constructor or factory method). 1. If k is the name of an {{AudioParam}} on this interface, set the {{AudioParam/value}} attribute of this {{AudioParam}} to v. 2. Else if k is the name of an attribute on this interface, set the object associated with this attribute to v.
The associated interface for a factory method is the interface of the objects that are returned from this method. The associated option object for an interface is the option object that can be passed to the constructor for this interface. {{AudioNode}}s are {{EventTarget}}s, as described in [[!DOM]]. This means that it is possible to dispatch events to {{AudioNode}}s the same way that other {{EventTarget}}s accept events.
enum ChannelCountMode {
	"max",
	"clamped-max",
	"explicit"
};
The {{ChannelCountMode}}, in conjuction with the node's {{AudioNode/channelCount}} and {{AudioNode/channelInterpretation}} values, is used to determine the computedNumberOfChannels that controls how inputs to a node are to be mixed. The computedNumberOfChannels is determined as shown below. See for more information on how mixing is to be done.
Enumeration description
"max" computedNumberOfChannels is the maximum of the number of channels of all connections to an input. In this mode {{AudioNode/channelCount}} is ignored.
"clamped-max" computedNumberOfChannels is determined as for "{{ChannelCountMode/max}}" and then clamped to a maximum value of the given {{AudioNode/channelCount}}.
"explicit" computedNumberOfChannels is the exact value as specified by the {{AudioNode/channelCount}}.
enum ChannelInterpretation {
	"speakers",
	"discrete"
};
Enumeration description
"speakers" use up-mix equations or down-mix equations. In cases where the number of channels do not match any of these basic speaker layouts, revert to "{{ChannelInterpretation/discrete}}".
"discrete" Up-mix by filling channels until they run out then zero out remaining channels. Down-mix by filling as many channels as possible, then dropping remaining channels.

AudioNode Tail-Time

An {{AudioNode}} can have a tail-time. This means that even when the {{AudioNode}} is fed silence, the output can be non-silent. {{AudioNode}}s have a non-zero tail-time if they have internal processing state such that input in the past affects the future output. {{AudioNode}}s may continue to produce non-silent output for the calculated tail-time even after the input transitions from non-silent to silent.

AudioNode Lifetime

{{AudioNode}} can be actively processing during a render quantum, if any of the following conditions hold. - An {{AudioScheduledSourceNode}} is [=actively processing=] if and only if it is [=playing=] for at least part of the current rendering quantum. - A {{MediaElementAudioSourceNode}} is [=actively processing=] if and only if its {{MediaElementAudioSourceNode/mediaElement}} is playing for at least part of the current rendering quantum. - A {{MediaStreamAudioSourceNode}} or a {{MediaStreamTrackAudioSourceNode}} are [=actively processing=] when the associated {{MediaStreamTrack}} object has a readyState attribute equal to "live", a muted attribute equal to false and an enabled attribute equal to true. - A {{DelayNode}} in a cycle is [=actively processing=] only when the absolute value of any output sample for the current [=render quantum=] is greater than or equal to \( 2^{-126} \). - A {{ScriptProcessorNode}} is [=actively processing=] when its input or output is connected. - An {{AudioWorkletNode}} is [=actively processing=] when its {{AudioWorkletProcessor}}'s {{[[callable process]]}} returns true and either its [=active source=] flag is true or any {{AudioNode}} connected to one of its inputs is [=actively processing=]. - All other {{AudioNode}}s start [=actively processing=] when any {{AudioNode}} connected to one of its inputs is [=actively processing=], and stops [=actively processing=] when the input that was received from other [=actively processing=] {{AudioNode}} no longer affects the output. Note: This takes into account {{AudioNode}}s that have a [=tail-time=]. {{AudioNode}}s that are not [=actively processing=] output a single channel of silence.

Attributes

: channelCount :: {{AudioNode/channelCount}} is the number of channels used when up-mixing and down-mixing connections to any inputs to the node. The default value is 2 except for specific nodes where its value is specially determined. This attribute has no effect for nodes with no inputs. If this value is set to zero or to a value greater than the implementation's maximum number of channels the implementation MUST throw a {{NotSupportedError}} exception. In addition, some nodes have additional channelCount constraints on the possible values for the channel count: : {{AudioDestinationNode}} :: The behavior depends on whether the destination node is the destination of an {{AudioContext}} or {{OfflineAudioContext}}: : {{AudioContext}} :: The channel count MUST be between 1 and {{AudioDestinationNode/maxChannelCount}}. An {{IndexSizeError}} exception MUST be thrown for any attempt to set the count outside this range. : {{OfflineAudioContext}} :: The channel count cannot be changed. An {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. : {{AudioWorkletNode}} :: See [[#configuring-channels-with-audioworkletnodeoptions]] Configuring Channels with AudioWorkletNodeOptions. : {{ChannelMergerNode}} :: The channel count cannot be changed, and an {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. : {{ChannelSplitterNode}} :: The channel count cannot be changed, and an {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. : {{ConvolverNode}} :: The channel count cannot be greater than two, and a {{NotSupportedError}} exception MUST be thrown for any attempt to change it to a value greater than two. : {{DynamicsCompressorNode}} :: The channel count cannot be greater than two, and a {{NotSupportedError}} exception MUST be thrown for any attempt to change it to a value greater than two. : {{PannerNode}} :: The channel count cannot be greater than two, and a {{NotSupportedError}} exception MUST be thrown for any attempt to change it to a value greater than two. : {{ScriptProcessorNode}} :: The channel count cannot be changed, and an {{NotSupportedError}} exception MUST be thrown for any attempt to change the value. : {{StereoPannerNode}} :: The channel count cannot be greater than two, and a {{NotSupportedError}} exception MUST be thrown for any attempt to change it to a value greater than two. See [[#channel-up-mixing-and-down-mixing]] for more information on this attribute. : channelCountMode :: {{AudioNode/channelCountMode}} determines how channels will be counted when up-mixing and down-mixing connections to any inputs to the node. The default value is "{{ChannelCountMode/max}}". This attribute has no effect for nodes with no inputs. In addition, some nodes have additional channelCountMode constraints on the possible values for the channel count mode: : {{AudioDestinationNode}} :: If the {{AudioDestinationNode}} is the {{BaseAudioContext/destination}} node of an {{OfflineAudioContext}}, then the channel count mode cannot be changed. An {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. : {{ChannelMergerNode}} :: The channel count mode cannot be changed from "{{ChannelCountMode/explicit}}" and an {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. : {{ChannelSplitterNode}} :: The channel count mode cannot be changed from "{{ChannelCountMode/explicit}}" and an {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. : {{ConvolverNode}} :: The channel count mode cannot be set to "{{ChannelCountMode/max}}", and a {{NotSupportedError}} exception MUST be thrown for any attempt to set it to "{{ChannelCountMode/max}}". : {{DynamicsCompressorNode}} :: The channel count mode cannot be set to "{{ChannelCountMode/max}}", and a {{NotSupportedError}} exception MUST be thrown for any attempt to set it to "{{ChannelCountMode/max}}". : {{PannerNode}} :: The channel count mode cannot be set to "{{ChannelCountMode/max}}", and a {{NotSupportedError}} exception MUST be thrown for any attempt to set it to "{{ChannelCountMode/max}}". : {{ScriptProcessorNode}} :: The channel count mode cannot be changed from "{{ChannelCountMode/explicit}}" and an {{NotSupportedError}} exception MUST be thrown for any attempt to change the value. : {{StereoPannerNode}} :: The channel count mode cannot be set to "{{ChannelCountMode/max}}", and a {{NotSupportedError}} exception MUST be thrown for any attempt to set it to "{{ChannelCountMode/max}}". See the section for more information on this attribute. : channelInterpretation :: {{AudioNode/channelInterpretation}} determines how individual channels will be treated when up-mixing and down-mixing connections to any inputs to the node. The default value is "{{ChannelInterpretation/speakers}}". This attribute has no effect for nodes with no inputs. In addition, some nodes have additional channelInterpretation constraints on the possible values for the channel interpretation: : {{ChannelSplitterNode}} :: The channel intepretation can not be changed from "{{ChannelInterpretation/discrete}}" and a {{InvalidStateError}} exception MUST be thrown for any attempt to change the value. See [[#channel-up-mixing-and-down-mixing]] for more information on this attribute. : context :: The {{BaseAudioContext}} which owns this {{AudioNode}}. : numberOfInputs :: The number of inputs feeding into the {{AudioNode}}. For source nodes, this will be 0. This attribute is predetermined for many {{AudioNode}} types, but some {{AudioNode}}s, like the {{ChannelMergerNode}} and the {{AudioWorkletNode}}, have variable number of inputs. : numberOfOutputs :: The number of outputs coming out of the {{AudioNode}}. This attribute is predetermined for some {{AudioNode}} types, but can be variable, like for the {{ChannelSplitterNode}} and the {{AudioWorkletNode}}.

Methods

: connect(destinationNode, output, input) :: There can only be one connection between a given output of one specific node and a given input of another specific node. Multiple connections with the same termini are ignored.
For example:
				nodeA.connect(nodeB);
				nodeA.connect(nodeB);
			
will have the same effect as
				nodeA.connect(nodeB);
			
This method returns destination {{AudioNode}} object.
			destinationNode: The destination parameter is the {{AudioNode}} to connect to. If the destination parameter is an {{AudioNode}} that has been created using another {{AudioContext}}, an {{InvalidAccessError}} MUST be thrown. That is, {{AudioNode}}s cannot be shared between {{AudioContext}}s. Multiple {{AudioNode}}s can be connected to the same {{AudioNode}}, this is described in [[#channel-up-mixing-and-down-mixing|Channel Upmixing and down mixing]] section.
			output: The output parameter is an index describing which output of the {{AudioNode}} from which to connect. If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown. It is possible to connect an {{AudioNode}} output to more than one input with multiple calls to connect(). Thus, "fan-out" is supported.
			input:  The input parameter is an index describing which input of the destination {{AudioNode}} to connect to. If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown. It is possible to connect an {{AudioNode}} to another {{AudioNode}} which creates a cycle: an {{AudioNode}} may connect to another {{AudioNode}}, which in turn connects back to the input or {{AudioParam}} of the first {{AudioNode}}.
		
Return type: {{AudioNode}}
: connect(destinationParam, output) :: Connects the {{AudioNode}} to an {{AudioParam}}, controlling the parameter value with an a-rate signal. It is possible to connect an {{AudioNode}} output to more than one {{AudioParam}} with multiple calls to connect(). Thus, "fan-out" is supported. It is possible to connect more than one {{AudioNode}} output to a single {{AudioParam}} with multiple calls to connect(). Thus, "fan-in" is supported. An {{AudioParam}} will take the rendered audio data from any {{AudioNode}} output connected to it and convert it to mono by down-mixing if it is not already mono, then mix it together with other such outputs and finally will mix with the intrinsic parameter value (the value the {{AudioParam}} would normally have without any audio connections), including any timeline changes scheduled for the parameter. The down-mixing to mono is equivalent to the down-mixing for an {{AudioNode}} with {{AudioNode/channelCount}} = 1, {{AudioNode/channelCountMode}} = "{{ChannelCountMode/explicit}}", and {{AudioNode/channelInterpretation}} = "{{ChannelInterpretation/speakers}}". There can only be one connection between a given output of one specific node and a specific {{AudioParam}}. Multiple connections with the same termini are ignored.
For example:
				nodeA.connect(param);
				nodeA.connect(param);
			
will have the same effect as
				nodeA.connect(param);
			
			destinationParam: The destination parameter is the {{AudioParam}} to connect to. This method does not return the destination {{AudioParam}} object. If {{AudioNode/connect(destinationParam, output)/destinationParam}} belongs to an {{AudioNode}} that belongs to a {{BaseAudioContext}} that is different from the {{BaseAudioContext}} that has created the {{AudioNode}} on which this method was called, an {{InvalidAccessError}} MUST be thrown.
			output: The output parameter is an index describing which output of the {{AudioNode}} from which to connect. If the parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.
		
Return type: {{undefined}}
: disconnect() :: Disconnects all outgoing connections from the {{AudioNode}}.
No parameters.
Return type: {{undefined}}
: disconnect(output) :: Disconnects a single output of the {{AudioNode}} from any other {{AudioNode}} or {{AudioParam}} objects to which it is connected.
			output:  This parameter is an index describing which output of the {{AudioNode}} to disconnect. It disconnects all outgoing connections from the given output. If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.
		
Return type: {{undefined}}
: disconnect(destinationNode) :: Disconnects all outputs of the {{AudioNode}} that go to a specific destination {{AudioNode}}.
			destinationNode: The destinationNode parameter is the {{AudioNode}} to disconnect. It disconnects all outgoing connections to the given destinationNode. If there is no connection to the destinationNode, an {{InvalidAccessError}} exception MUST be thrown.
		
Return type: {{undefined}}
: disconnect(destinationNode, output) :: Disconnects a specific output of the {{AudioNode}} from any and all inputs of some destination {{AudioNode}}.
			destinationNode: The destinationNode parameter is the {{AudioNode}} to disconnect. If there is no connection to the destinationNode from the given output, an {{InvalidAccessError}} exception MUST be thrown.
			output: The output parameter is an index describing which output of the {{AudioNode}} from which to disconnect. If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.
		
Return type: {{undefined}}
: disconnect(destinationNode, output, input) :: Disconnects a specific output of the {{AudioNode}} from a specific input of some destination {{AudioNode}}.
			destinationNode: The destinationNode parameter is the {{AudioNode}} to disconnect. If there is no connection to the destinationNode from the given input to the given output, an {{InvalidAccessError}} exception MUST be thrown.
			output: The output parameter is an index describing which output of the {{AudioNode}} from which to disconnect. If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.
			input: The input parameter is an index describing which input of the destination {{AudioNode}} to disconnect. If this parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.
		
Return type: {{undefined}}
: disconnect(destinationParam) :: Disconnects all outputs of the {{AudioNode}} that go to a specific destination {{AudioParam}}. The contribution of this {{AudioNode}} to the computed parameter value goes to 0 when this operation takes effect. The intrinsic parameter value is not affected by this operation.
			destinationParam: The destinationParam parameter is the {{AudioParam}} to disconnect. If there is no connection to the destinationParam, an {{InvalidAccessError}} exception MUST be thrown.
		
Return type: {{undefined}}
: disconnect(destinationParam, output) :: Disconnects a specific output of the {{AudioNode}} from a specific destination {{AudioParam}}. The contribution of this {{AudioNode}} to the computed parameter value goes to 0 when this operation takes effect. The intrinsic parameter value is not affected by this operation.
			destinationParam: The destinationParam parameter is the {{AudioParam}} to disconnect. If there is no connection to the destinationParam, an {{InvalidAccessError}} exception MUST be thrown.
			output: The output parameter is an index describing which output of the {{AudioNode}} from which to disconnect. If the parameter is out-of-bounds, an {{IndexSizeError}} exception MUST be thrown.
		
Return type: {{undefined}}

{{AudioNodeOptions}}

This specifies the options that can be used in constructing all {{AudioNode}}s. All members are optional. However, the specific values used for each node depends on the actual node.
dictionary AudioNodeOptions {
	unsigned long channelCount;
	ChannelCountMode channelCountMode;
	ChannelInterpretation channelInterpretation;
};
Dictionary {{AudioNodeOptions}} Members
: channelCount :: Desired number of channels for the {{AudioNode/channelCount}} attribute. : channelCountMode :: Desired mode for the {{AudioNode/channelCountMode}} attribute. : channelInterpretation :: Desired mode for the {{AudioNode/channelInterpretation}} attribute.

The {{AudioParam}} Interface

{{AudioParam}} controls an individual aspect of an {{AudioNode}}'s functionality, such as volume. The parameter can be set immediately to a particular value using the value attribute. Or, value changes can be scheduled to happen at very precise times (in the coordinate system of {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute), for envelopes, volume fades, LFOs, filter sweeps, grain windows, etc. In this way, arbitrary timeline-based automation curves can be set on any {{AudioParam}}. Additionally, audio signals from the outputs of {{AudioNode}}s can be connected to an {{AudioParam}}, summing with the intrinsic parameter value. Some synthesis and processing {{AudioNode}}s have {{AudioParam}}s as attributes whose values MUST be taken into account on a per-audio-sample basis. For other {{AudioParam}}s, sample-accuracy is not important and the value changes can be sampled more coarsely. Each individual {{AudioParam}} will specify that it is either an a-rate parameter which means that its values MUST be taken into account on a per-audio-sample basis, or it is a k-rate parameter. Implementations MUST use block processing, with each {{AudioNode}} processing one render quantum. For each render quantum, the value of a k-rate parameter MUST be sampled at the time of the very first sample-frame, and that value MUST be used for the entire block. a-rate parameters MUST be sampled for each sample-frame of the block. Depending on the {{AudioParam}}, its rate can be controlled by setting the {{AudioParam/automationRate}} attribute to either "{{AutomationRate/a-rate}}" or "{{AutomationRate/k-rate}}". See the description of the individual {{AudioParam}}s for further details. Each {{AudioParam}} includes {{AudioParam/minValue}} and {{AudioParam/maxValue}} attributes that together form the simple nominal range for the parameter. In effect, value of the parameter is clamped to the range \([\mathrm{minValue}, \mathrm{maxValue}]\). See [[#computation-of-value]] for full details. For many {{AudioParam}}s the {{AudioParam/minValue}} and {{AudioParam/maxValue}} is intended to be set to the maximum possible range. In this case, {{AudioParam/maxValue}} should be set to the most-positive-single-float value, which is 3.4028235e38. (However, in JavaScript which only supports IEEE-754 double precision float values, this must be written as 3.4028234663852886e38.) Similarly, {{AudioParam/minValue}} should be set to the most-negative-single-float value, which is the negative of the most-positive-single-float: -3.4028235e38. (Similarly, this must be written in JavaScript as -3.4028234663852886e38.) An {{AudioParam}} maintains a list of zero or more automation events. Each automation event specifies changes to the parameter's value over a specific time range, in relation to its automation event time in the time coordinate system of the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. The list of automation events is maintained in ascending order of automation event time. The behavior of a given automation event is a function of the {{AudioContext}}'s current time, as well as the automation event times of this event and of adjacent events in the list. The following automation methods change the event list by adding a new event to the event list, of a type specific to the method: * {{AudioParam/setValueAtTime()}} - SetValue * {{AudioParam/linearRampToValueAtTime()}} - LinearRampToValue * {{AudioParam/exponentialRampToValueAtTime()}} - ExponentialRampToValue * {{AudioParam/setTargetAtTime()}} - SetTarget * {{AudioParam/setValueCurveAtTime()}} - SetValueCurve The following rules will apply when calling these methods: * Automation event times are not quantized with respect to the prevailing sample rate. Formulas for determining curves and ramps are applied to the exact numerical times given when scheduling events. * If one of these events is added at a time where there is already one or more events, then it will be placed in the list after them, but before events whose times are after the event. * If setValueCurveAtTime() is called for time \(T\) and duration \(D\) and there are any events having a time strictly greater than \(T\), but strictly less than \(T + D\), then a {{NotSupportedError}} exception MUST be thrown. In other words, it's not ok to schedule a value curve during a time period containing other events, but it's ok to schedule a value curve exactly at the time of another event. * Similarly a {{NotSupportedError}} exception MUST be thrown if any automation method is called at a time which is contained in \([T, T+D)\), \(T\) being the time of the curve and \(D\) its duration. Note: {{AudioParam}} attributes are read only, with the exception of the {{AudioParam/value}} attribute. The automation rate of an {{AudioParam}} can be selected setting the {{AudioParam/automationRate}} attribute with one of the following values. However, some {{AudioParam}}s have constraints on whether the automation rate can be changed.
enum AutomationRate {
	"a-rate",
	"k-rate"
};
Enumeration description
"a-rate" This {{AudioParam}} is set for [=a-rate=] processing.
"k-rate" This {{AudioParam}} is set for [=k-rate=] processing.
Each {{AudioParam}} has an internal slot [[current value]], initially set to the {{AudioParam}}'s {{AudioParam/defaultValue}}.
[Exposed=Window]
interface AudioParam {
	attribute float value;
	attribute AutomationRate automationRate;
	readonly attribute float defaultValue;
	readonly attribute float minValue;
	readonly attribute float maxValue;
	AudioParam setValueAtTime (float value, double startTime);
	AudioParam linearRampToValueAtTime (float value, double endTime);
	AudioParam exponentialRampToValueAtTime (float value, double endTime);
	AudioParam setTargetAtTime (float target, double startTime, float timeConstant);
	AudioParam setValueCurveAtTime (sequence<float> values,
	                                double startTime,
	                                double duration);
	AudioParam cancelScheduledValues (double cancelTime);
	AudioParam cancelAndHoldAtTime (double cancelTime);
};

Attributes

: automationRate :: The automation rate for the {{AudioParam}}. The default value depends on the actual {{AudioParam}}; see the description of each individual {{AudioParam}} for the default value. Some nodes have additional automation rate constraints as follows: : {{AudioBufferSourceNode}} :: The {{AudioParam}}s {{AudioBufferSourceNode/playbackRate}} and {{AudioBufferSourceNode/detune}} MUST be "{{AutomationRate/k-rate}}". An {{InvalidStateError}} must be thrown if the rate is changed to "{{AutomationRate/a-rate}}". : {{DynamicsCompressorNode}} :: The {{AudioParam}}s {{DynamicsCompressorNode/threshold}}, {{DynamicsCompressorNode/knee}}, {{DynamicsCompressorNode/ratio}}, {{DynamicsCompressorNode/attack}}, and {{DynamicsCompressorNode/release}} MUST be "{{AutomationRate/k-rate}}". An {{InvalidStateError}} must be thrown if the rate is changed to "{{AutomationRate/a-rate}}". : {{PannerNode}} :: If the {{PannerNode/panningModel}} is "{{PanningModelType/HRTF}}", the setting of the {{AudioParam/automationRate}} for any {{AudioParam}} of the {{PannerNode}} is ignored. Likewise, the setting of the {{AudioParam/automationRate}} for any {{AudioParam}} of the {{AudioListener}} is ignored. In this case, the {{AudioParam}} behaves as if the {{AudioParam/automationRate}} were set to "{{AutomationRate/k-rate}}". : defaultValue :: Initial value for the value attribute. : maxValue :: The nominal maximum value that the parameter can take. Together with minValue, this forms the nominal range for this parameter. : minValue :: The nominal minimum value that the parameter can take. Together with maxValue, this forms the nominal range for this parameter. : value :: The parameter's floating-point value. This attribute is initialized to the defaultValue. Getting this attribute returns the contents of the {{[[current value]]}} slot. See [[#computation-of-value]] for the algorithm for the value that is returned. Setting this attribute has the effect of assigning the requested value to the {{[[current value]]}} slot, and calling the setValueAtTime() method with the current {{AudioContext}}'s currentTime and {{[[current value]]}}. Any exceptions that would be thrown by setValueAtTime() will also be thrown by setting this attribute.

Methods

: cancelAndHoldAtTime(cancelTime) :: This is similar to {{AudioParam/cancelScheduledValues()}} in that it cancels all scheduled parameter changes with times greater than or equal to {{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}}. However, in addition, the automation value that would have happened at {{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}} is then proprogated for all future time until other automation events are introduced. The behavior of the timeline in the face of {{AudioParam/cancelAndHoldAtTime()}} when automations are running and can be introduced at any time after calling {{AudioParam/cancelAndHoldAtTime()}} and before {{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}} is reached is quite complicated. The behavior of {{AudioParam/cancelAndHoldAtTime()}} is therefore specified in the following algorithm.
Let \(t_c\) be the value of {{AudioParam/cancelAndHoldAtTime()/cancelTime!!argument}}. Then 1. Let \(E_1\) be the event (if any) at time \(t_1\) where \(t_1\) is the largest number satisfying \(t_1 \le t_c\). 2. Let \(E_2\) be the event (if any) at time \(t_2\) where \(t_2\) is the smallest number satisfying \(t_c \lt t_2\). 3. If \(E_2\) exists: 1. If \(E_2\) is a linear or exponential ramp, 1. Effectively rewrite \(E_2\) to be the same kind of ramp ending at time \(t_c\) with an end value that would be the value of the original ramp at time \(t_c\). Graphical representation of calling cancelAndHoldAtTime when linearRampToValueAtTime has been called at this time. 2. Go to step 5. 2. Otherwise, go to step 4. 4. If \(E_1\) exists: 1. If \(E_1\) is a setTarget event, 1. Implicitly insert a setValueAtTime event at time \(t_c\) with the value that the setTarget would have at time \(t_c\). Graphical representation of calling cancelAndHoldAtTime when setTargetAtTime has been called at this time 2. Go to step 5. 2. If \(E_1\) is a setValueCurve with a start time of \(t_3\) and a duration of \(d\) 1. If \(t_c \gt t_3 + d\), go to step 5. 2. Otherwise, 1. Effectively replace this event with a setValueCurve event with a start time of \(t_3\) and a new duration of \(t_c-t_3\). However, this is not a true replacement; this automation MUST take care to produce the same output as the original, and not one computed using a different duration. (That would cause sampling of the value curve in a slightly different way, producing different results.) Graphical representation of calling cancelAndHoldAtTime when setValueCurve has been called at this time 2. Go to step 5. 5. Remove all events with time greater than \(t_c\). If no events are added, then the automation value after {{AudioParam/cancelAndHoldAtTime()}} is the constant value that the original timeline would have had at time \(t_c\).
Candidate Correction Issue 127:
Buttons here
A {{RangeError}} is only thrown for negative cancelTime values for cancelAndHoldAtTime and cancelScheduledValues. See Issue 127
			cancelTime: The time after which any previously scheduled parameter changes will be cancelled. It is a time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute.  A {{RangeError}} exception MUST be thrown if cancelTime is negative or is not a finite number. If {{AudioParam/cancelAndHoldAtTime()/cancelTime}} is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
		
Return type: {{AudioParam}}
: cancelScheduledValues(cancelTime) :: Cancels all scheduled parameter changes with times greater than or equal to {{AudioParam/cancelScheduledValues()/cancelTime!!argument}}. Cancelling a scheduled parameter change means removing the scheduled event from the event list. Any active automations whose automation event time is less than {{AudioParam/cancelScheduledValues()/cancelTime!!argument}} are also cancelled, and such cancellations may cause discontinuities because the original value (from before such automation) is restored immediately. Any hold values scheduled by {{AudioParam/cancelAndHoldAtTime()}} are also removed if the hold time occurs after {{AudioParam/cancelScheduledValues()/cancelTime!!argument}}. For a {{AudioParam/setValueCurveAtTime()}}, let \(T_0\) and \(T_D\) be the corresponding {{AudioParam/setValueCurveAtTime()/startTime!!argument}} and {{AudioParam/setValueCurveAtTime()/duration!!argument}}, respectively of this event. Then if {{AudioParam/cancelScheduledValues()/cancelTime!!argument}} is in the range \([T_0, T_0 + T_D]\), the event is removed from the timeline.
			cancelTime: The time after which any previously scheduled parameter changes will be cancelled. It is a time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute.  A {{RangeError}} exception MUST be thrown if cancelTime is negative or is not a finite number. If cancelTime is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
		
Return type: {{AudioParam}}
: exponentialRampToValueAtTime(value, endTime) :: Schedules an exponential continuous change in parameter value from the previous scheduled parameter value to the given value. Parameters representing filter frequencies and playback rate are best changed exponentially because of the way humans perceive sound. The value during the time interval \(T_0 \leq t < T_1\) (where \(T_0\) is the time of the previous event and \(T_1\) is the {{AudioParam/exponentialRampToValueAtTime()/endTime!!argument}} parameter passed into this method) will be calculated as:
		$$
			v(t) = V_0 \left(\frac{V_1}{V_0}\right)^\frac{t - T_0}{T_1 - T_0}
		$$
		
where \(V_0\) is the value at the time \(T_0\) and \(V_1\) is the {{AudioParam/exponentialRampToValueAtTime()/value!!argument}} parameter passed into this method. If \(V_0\) and \(V_1\) have opposite signs or if \(V_0\) is zero, then \(v(t) = V_0\) for \(T_0 \le t \lt T_1\). This also implies an exponential ramp to 0 is not possible. A good approximation can be achieved using {{AudioParam/setTargetAtTime()}} with an appropriately chosen time constant. If there are no more events after this ExponentialRampToValue event then for \(t \geq T_1\), \(v(t) = V_1\). If there is no event preceding this event, the exponential ramp behaves as if {{AudioParam/setValueAtTime()|setValueAtTime(value, currentTime)}} were called where value is the current value of the attribute and currentTime is the context {{BaseAudioContext/currentTime}} at the time {{AudioParam/exponentialRampToValueAtTime()}} is called. If the preceding event is a SetTarget event, \(T_0\) and \(V_0\) are chosen from the current time and value of SetTarget automation. That is, if the SetTarget event has not started, \(T_0\) is the start time of the event, and \(V_0\) is the value just before the SetTarget event starts. In this case, the ExponentialRampToValue event effectively replaces the SetTarget event. If the SetTarget event has already started, \(T_0\) is the current context time, and \(V_0\) is the current SetTarget automation value at time \(T_0\). In both cases, the automation curve is continuous.
			value: The value the parameter will exponentially ramp to at the given time. A {{RangeError}} exception MUST be thrown if this value is equal to 0.
			endTime: The time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute where the exponential ramp ends. A {{RangeError}} exception MUST be thrown if endTime is negative or is not a finite number. If endTime is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
		
Return type: {{AudioParam}}
: linearRampToValueAtTime(value, endTime) :: Schedules a linear continuous change in parameter value from the previous scheduled parameter value to the given value. The value during the time interval \(T_0 \leq t < T_1\) (where \(T_0\) is the time of the previous event and \(T_1\) is the {{AudioParam/linearRampToValueAtTime()/endTime!!argument}} parameter passed into this method) will be calculated as:
		$$
			v(t) = V_0 + (V_1 - V_0) \frac{t - T_0}{T_1 - T_0}
		$$
		
where \(V_0\) is the value at the time \(T_0\) and \(V_1\) is the {{AudioParam/linearRampToValueAtTime()/value!!argument}} parameter passed into this method. If there are no more events after this LinearRampToValue event then for \(t \geq T_1\), \(v(t) = V_1\). If there is no event preceding this event, the linear ramp behaves as if {{AudioParam/setValueAtTime()|setValueAtTime(value, currentTime)}} were called where value is the current value of the attribute and currentTime is the context {{BaseAudioContext/currentTime}} at the time {{AudioParam/linearRampToValueAtTime()}} is called. If the preceding event is a SetTarget event, \(T_0\) and \(V_0\) are chosen from the current time and value of SetTarget automation. That is, if the SetTarget event has not started, \(T_0\) is the start time of the event, and \(V_0\) is the value just before the SetTarget event starts. In this case, the LinearRampToValue event effectively replaces the SetTarget event. If the SetTarget event has already started, \(T_0\) is the current context time, and \(V_0\) is the current SetTarget automation value at time \(T_0\). In both cases, the automation curve is continuous.
			value: The value the parameter will linearly ramp to at the given time.
			endTime: The time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute at which the automation ends. A {{RangeError}} exception MUST be thrown if endTime is negative or is not a finite number. If endTime is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
		
Return type: {{AudioParam}}
: setTargetAtTime(target, startTime, timeConstant) :: Start exponentially approaching the target value at the given time with a rate having the given time constant. Among other uses, this is useful for implementing the "decay" and "release" portions of an ADSR envelope. Please note that the parameter value does not immediately change to the target value at the given time, but instead gradually changes to the target value. During the time interval: \(T_0 \leq t\), where \(T_0\) is the {{AudioParam/setTargetAtTime()/startTime!!argument}} parameter:
		$$
			v(t) = V_1 + (V_0 - V_1)\, e^{-\left(\frac{t - T_0}{\tau}\right)}
		$$
		
where \(V_0\) is the initial value (the {{[[current value]]}} attribute) at \(T_0\) (the {{AudioParam/setTargetAtTime()/startTime!!argument}} parameter), \(V_1\) is equal to the {{AudioParam/setTargetAtTime()/target!!argument}} parameter, and \(\tau\) is the {{AudioParam/setTargetAtTime()/timeConstant!!argument}} parameter. If a LinearRampToValue or ExponentialRampToValue event follows this event, the behavior is described in {{AudioParam/linearRampToValueAtTime()}} or {{AudioParam/exponentialRampToValueAtTime()}}, respectively. For all other events, the SetTarget event ends at the time of the next event.
			target: The value the parameter will start changing to at the given time.
			startTime: The time at which the exponential approach will begin, in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. A {{RangeError}} exception MUST be thrown if start is negative or is not a finite number. If startTime is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
			timeConstant: The time-constant value of first-order filter (exponential) approach to the target value. The larger this value is, the slower the transition will be. The value MUST be non-negative or a {{RangeError}} exception MUST be thrown. If timeConstant is zero, the output value jumps immediately to the final value. More precisely, timeConstant is the time it takes a first-order linear continuous time-invariant system to reach the value \(1 - 1/e\) (around 63.2%) given a step input response (transition from 0 to 1 value).
		
Return type: {{AudioParam}}
: setValueAtTime(value, startTime) :: Schedules a parameter value change at the given time. If there are no more events after this SetValue event, then for \(t \geq T_0\), \(v(t) = V\), where \(T_0\) is the {{AudioParam/setValueAtTime()/startTime!!argument}} parameter and \(V\) is the {{AudioParam/setValueAtTime()/value!!argument}} parameter. In other words, the value will remain constant. If the next event (having time \(T_1\)) after this SetValue event is not of type LinearRampToValue or ExponentialRampToValue, then, for \(T_0 \leq t < T_1\):
		$$
			v(t) = V
		$$
		
In other words, the value will remain constant during this time interval, allowing the creation of "step" functions. If the next event after this SetValue event is of type LinearRampToValue or ExponentialRampToValue then please see {{AudioParam/linearRampToValueAtTime()}} or {{AudioParam/exponentialRampToValueAtTime()}}, respectively.
			value: The value the parameter will change to at the given time.
			startTime: The time in the same time coordinate system as the {{BaseAudioContext}}'s {{BaseAudioContext/currentTime}} attribute at which the parameter changes to the given value. A {{RangeError}} exception MUST be thrown if startTime is negative or is not a finite number. If startTime is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
		
Return type: {{AudioParam}}
: setValueCurveAtTime(values, startTime, duration) :: Sets an array of arbitrary parameter values starting at the given time for the given duration. The number of values will be scaled to fit into the desired duration. Let \(T_0\) be {{AudioParam/setValueCurveAtTime()/startTime!!argument}}, \(T_D\) be {{AudioParam/setValueCurveAtTime()/duration!!argument}}, \(V\) be the {{AudioParam/setValueCurveAtTime()/values!!argument}} array, and \(N\) be the length of the {{AudioParam/setValueCurveAtTime()/values!!argument}} array. Then, during the time interval: \(T_0 \le t < T_0 + T_D\), let
		$$
			\begin{align*} k &= \left\lfloor \frac{N - 1}{T_D}(t-T_0) \right\rfloor \\
			\end{align*}
		$$
		
Then \(v(t)\) is computed by linearly interpolating between \(V[k]\) and \(V[k+1]\), After the end of the curve time interval (\(t \ge T_0 + T_D\)), the value will remain constant at the final curve value, until there is another automation event (if any). An implicit call to {{AudioParam/setValueAtTime()}} is made at time \(T_0 + T_D\) with value \(V\[N-1]\) so that following automations will start from the end of the {{AudioParam/setValueCurveAtTime()}} event.
			values: A sequence of float values representing a parameter value curve. These values will apply starting at the given time and lasting for the given duration. When this method is called, an internal copy of the curve is created for automation purposes. Subsequent modifications of the contents of the passed-in array therefore have no effect on the {{AudioParam}}. An {{InvalidStateError}} MUST be thrown if this attribute is a sequence<float> object that has a length less than 2.
			startTime: The start time in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute at which the value curve will be applied. A {{RangeError}} exception MUST be thrown if startTime is negative or is not a finite number. If startTime is less than {{BaseAudioContext/currentTime}}, it is clamped to {{BaseAudioContext/currentTime}}.
			duration: The amount of time in seconds (after the startTime parameter) where values will be calculated according to the values parameter. A {{RangeError}} exception MUST be thrown if duration is not strictly positive or is not a finite number.
		
Return type: {{AudioParam}}

Computation of Value

There are two different kind of {{AudioParam}}s, simple parameters and compound parameters. Simple parameters (the default) are used on their own to compute the final audio output of an {{AudioNode}}. Compound parameters are {{AudioParam}}s that are used with other {{AudioParam}}s to compute a value that is then used as an input to compute the output of an {{AudioNode}}. The computedValue is the final value controlling the audio DSP and is computed by the audio rendering thread during each rendering time quantum.
The computation of the value of an {{AudioParam}} consists of two parts: - the paramIntrinsicValue value that is computed from the {{AudioParam/value}} attribute and any automation events. - the paramComputedValue that is the final value controlling the audio DSP and is computed by the audio rendering thread during each render quantum. These values MUST be computed as follows: 1. paramIntrinsicValue will be calculated at each time, which is either the value set directly to the {{AudioParam/value}} attribute, or, if there are any automation events with times before or at this time, the value as calculated from these events. If automation events are removed from a given time range, then the paramIntrinsicValue value will remain unchanged and stay at its previous value until either the {{AudioParam/value}} attribute is directly set, or automation events are added for the time range. 1. Set {{[[current value]]}} to the value of paramIntrinsicValue at the beginning of this render quantum. 2. paramComputedValue is the sum of the paramIntrinsicValue value and the value of the input AudioParam buffer. If the sum is NaN, replace the sum with the {{AudioParam/defaultValue}}. 3. If this {{AudioParam}} is a compound parameter, compute its final value with other {{AudioParam}}s. 4. Set computedValue to paramComputedValue.
The nominal range for a computedValue are the lower and higher values this parameter can effectively have. For simple parameters, the computedValue is clamped to the simple nominal range for this parameter. Compound parameters have their final value clamped to their nominal range after having been computed from the different {{AudioParam}} values they are composed of. When automation methods are used, clamping is still applied. However, the automation is run as if there were no clamping at all. Only when the automation values are to be applied to the output is the clamping done as specified above.
For example, consider a node \(N\) has an AudioParam \(p\) with a nominal range of \([0, 1]\), and following automation sequence
		N.p.setValueAtTime(0, 0);
		N.p.linearRampToValueAtTime(4, 1);
		N.p.linearRampToValueAtTime(0, 2);
	
The initial slope of the curve is 4, until it reaches the maximum value of 1, at which time, the output is held constant. Finally, near time 2, the slope of the curve is -4. This is illustrated in the graph below where the dashed line indicates what would have happened without clipping, and the solid line indicates the actual expected behavior of the audioparam due to clipping to the nominal range.
AudioParam automation clipping to nominal
An example of clipping of an AudioParam automation from the nominal range.

{{AudioParam}} Automation Example

AudioParam automation
An example of parameter automation.
	const curveLength = 44100;
	const curve = new Float32Array(curveLength);
	for (const i = 0; i < curveLength; ++i)
		curve[i] = Math.sin(Math.PI * i / curveLength);

	const t0 = 0;
	const t1 = 0.1;
	const t2 = 0.2;
	const t3 = 0.3;
	const t4 = 0.325;
	const t5 = 0.5;
	const t6 = 0.6;
	const t7 = 0.7;
	const t8 = 1.0;
	const timeConstant = 0.1;

	param.setValueAtTime(0.2, t0);
	param.setValueAtTime(0.3, t1);
	param.setValueAtTime(0.4, t2);
	param.linearRampToValueAtTime(1, t3);
	param.linearRampToValueAtTime(0.8, t4);
	param.setTargetAtTime(.5, t4, timeConstant);
	// Compute where the setTargetAtTime will be at time t5 so we can make
	// the following exponential start at the right point so there's no
	// jump discontinuity. From the spec, we have
	// v(t) = 0.5 + (0.8 - 0.5)*exp(-(t-t4)/timeConstant)
	// Thus v(t5) = 0.5 + (0.8 - 0.5)*exp(-(t5-t4)/timeConstant)
	param.setValueAtTime(0.5 + (0.8 - 0.5)*Math.exp(-(t5 - t4)/timeConstant), t5);
	param.exponentialRampToValueAtTime(0.75, t6);
	param.exponentialRampToValueAtTime(0.05, t7);
	param.setValueCurveAtTime(curve, t7, t8 - t7);

The {{AudioScheduledSourceNode}} Interface

The interface represents the common features of source nodes such as {{AudioBufferSourceNode}}, {{ConstantSourceNode}}, and {{OscillatorNode}}. Before a source is started (by calling {{AudioScheduledSourceNode/start()}}, the source node MUST output silence (0). After a source has been stopped (by calling {{AudioScheduledSourceNode/stop()}}), the source MUST then output silence (0). {{AudioScheduledSourceNode}} cannot be instantiated directly, but is instead extended by the concrete interfaces for the source nodes. An {{AudioScheduledSourceNode}} is said to be playing when its associated {{BaseAudioContext}}'s {{BaseAudioContext|currentTime}} is greater or equal to the time the {{AudioScheduledSourceNode}} is set to start, and less than the time it's set to stop. {{AudioScheduledSourceNode}}s are created with an internal boolean slot [[source started]], initially set to false.
[Exposed=Window]
interface AudioScheduledSourceNode : AudioNode {
	attribute EventHandler onended;
	undefined start(optional double when = 0);
	undefined stop(optional double when = 0);
};

Attributes

: onended :: A property used to set the EventHandler (described in HTML[[!HTML]]) for the ended event that is dispatched for {{AudioScheduledSourceNode}} node types. When the source node has stopped playing (as determined by the concrete node), an event of type {{Event}} (described in HTML [[!HTML]]) will be dispatched to the event handler. For all {{AudioScheduledSourceNode}}s, the onended event is dispatched when the stop time determined by {{AudioScheduledSourceNode/stop()}} is reached. For an {{AudioBufferSourceNode}}, the event is also dispatched because the {{AudioBufferSourceNode/start(when, offset, duration)/duration}} has been reached or if the entire {{AudioBufferSourceNode/buffer}} has been played.

Methods

: start(when) :: Schedules a sound to playback at an exact time.
When this method is called, execute these steps: 1. If this {{AudioScheduledSourceNode}} internal slot {{AudioScheduledSourceNode/[[source started]]}} is true, an {{InvalidStateError}} exception MUST be thrown. 2. Check for any errors that must be thrown due to parameter constraints described below. If any exception is thrown during this step, abort those steps. 3. Set the internal slot {{AudioScheduledSourceNode/[[source started]]}} on this {{AudioScheduledSourceNode}} to true. 4. Queue a control message to start the {{AudioScheduledSourceNode}}, including the parameter values in the message. 5. Send a control message to the associated {{AudioContext}} to start running its rendering thread only when all the following conditions are met: 1. The context's {{[[control thread state]]}} is "{{AudioContextState/suspended}}". 1. The context is allowed to start. 1. {{[[suspended by user]]}} flag is false. NOTE: This allows {{AudioBufferSourceNode/start()}} to start an {{AudioContext}} that would otherwise not be allowed to start.
			when: The {{AudioScheduledSourceNode/start(when)/when}} parameter describes at what time (in seconds) the sound should start playing. It is in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. When the signal emitted by the {{AudioScheduledSourceNode}} depends on the sound's start time, the exact value of when is always used without rounding to the nearest sample frame. If 0 is passed in for this value or if the value is less than {{BaseAudioContext/currentTime}}, then the sound will start playing immediately. A {{RangeError}} exception MUST be thrown if when is negative.
		
Return type: {{undefined}}
: stop(when) :: Schedules a sound to stop playback at an exact time. If stop is called again after already having been called, the last invocation will be the only one applied; stop times set by previous calls will not be applied, unless the buffer has already stopped prior to any subsequent calls. If the buffer has already stopped, further calls to stop will have no effect. If a stop time is reached prior to the scheduled start time, the sound will not play.
When this method is called, execute these steps: 1. If this {{AudioScheduledSourceNode}} internal slot {{AudioScheduledSourceNode/[[source started]]}} is not true, an {{InvalidStateError}} exception MUST be thrown. 2. Check for any errors that must be thrown due to parameter constraints described below. 3. Queue a control message to stop the {{AudioScheduledSourceNode}}, including the parameter values in the message.
If the node is an {{AudioBufferSourceNode}}, running a control message to stop the {{AudioBufferSourceNode}} means invoking the handleStop() function in the playback algorithm.
			when: The {{AudioScheduledSourceNode/stop(when)/when}} parameter describes at what time (in seconds) the source should stop playing. It is in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. If 0 is passed in for this value or if the value is less than {{BaseAudioContext/currentTime}}, then the sound will stop playing immediately. A {{RangeError}} exception MUST be thrown if when is negative.
		
Return type: {{undefined}}

The {{AnalyserNode}} Interface

This interface represents a node which is able to provide real-time frequency and time-domain analysis information. The audio stream will be passed un-processed from input to output.
path: audionode.include
macros:
	noi: 1
	noo: 1
	noo-notes: This output may be left unconnected.
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: No
[Exposed=Window]
interface AnalyserNode : AudioNode {
	constructor (BaseAudioContext context, optional AnalyserOptions options = {});
	undefined getFloatFrequencyData (Float32Array array);
	undefined getByteFrequencyData (Uint8Array array);
	undefined getFloatTimeDomainData (Float32Array array);
	undefined getByteTimeDomainData (Uint8Array array);
	attribute unsigned long fftSize;
	readonly attribute unsigned long frequencyBinCount;
	attribute double minDecibels;
	attribute double maxDecibels;
	attribute double smoothingTimeConstant;
};

Constructors

: AnalyserNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{AnalyserNode}} will be associated with.
			options: Optional initial parameter value for this {{AnalyserNode}}.
		

Attributes

: fftSize :: The size of the FFT used for frequency-domain analysis (in sample-frames). This MUST be a power of two in the range 32 to 32768, otherwise an {{IndexSizeError}} exception MUST be thrown. The default value is 2048. Note that large FFT sizes can be costly to compute. If the {{AnalyserNode/fftSize}} is changed to a different value, then all state associated with smoothing of the frequency data (for {{AnalyserNode/getByteFrequencyData()}} and {{AnalyserNode/getFloatFrequencyData()}}) is reset. That is the previous block, \(\hat{X}_{-1}[k]\), used for smoothing over time is set to 0 for all \(k\). Note that increasing {{AnalyserNode/fftSize}} does mean that the current time-domain data must be expanded to include past frames that it previously did not. This means that the {{AnalyserNode}} effectively MUST keep around the last 32768 sample-frames and the current time-domain data is the most recent {{AnalyserNode/fftSize}} sample-frames out of that. : frequencyBinCount :: Half the FFT size. : maxDecibels :: {{AnalyserNode/maxDecibels}} is the maximum power value in the scaling range for the FFT analysis data for conversion to unsigned byte values. The default value is -30. If the value of this attribute is set to a value less than or equal to {{AnalyserNode/minDecibels}}, an {{IndexSizeError}} exception MUST be thrown. : minDecibels :: {{AnalyserNode/minDecibels}} is the minimum power value in the scaling range for the FFT analysis data for conversion to unsigned byte values. The default value is -100. If the value of this attribute is set to a value more than or equal to {{AnalyserNode/maxDecibels}}, an {{IndexSizeError}} exception MUST be thrown. : smoothingTimeConstant :: A value from 0 -> 1 where 0 represents no time averaging with the last analysis frame. The default value is 0.8. If the value of this attribute is set to a value less than 0 or more than 1, an {{IndexSizeError}} exception MUST be thrown.

Methods

: getByteFrequencyData(array) ::
Proposed Correction Issue 2361-6. Use new Web IDL buffer primitives
Buttons here
Get a reference to the bytes held by the {{Uint8Array}} passed as an argument. Copies the current frequency data to those bytes. If the array has fewer elements than the {{frequencyBinCount}}, the excess elements will be dropped. If the array has more elements than the {{frequencyBinCount}} [=ArrayBufferView/Write=] the [=current frequency data=] into |array|. If |array|'s [=BufferSource/byte length=] is less than {{frequencyBinCount}}, the excess elements will be dropped. If |array|'s [=BufferSource/byte length=] is greater than the {{frequencyBinCount}}, the excess elements will be ignored. The most recent {{AnalyserNode/fftSize}} frames are used in computing the frequency data.
If another call to {{AnalyserNode/getByteFrequencyData()}} or {{AnalyserNode/getFloatFrequencyData()}} occurs within the same render quantum as a previous call, the current frequency data is not updated with the same data. Instead, the previously computed data is returned. The values stored in the unsigned byte array are computed in the following way. Let \(Y[k]\) be the current frequency data as described in FFT windowing and smoothing. Then the byte value, \(b[k]\), is
		$$
			b[k] = \left\lfloor
					\frac{255}{\mbox{dB}_{max} - \mbox{dB}_{min}}
					\left(Y[k] - \mbox{dB}_{min}\right)
				\right\rfloor
		$$
		
where \(\mbox{dB}_{min}\) is {{AnalyserNode/minDecibels}} and \(\mbox{dB}_{max}\) is {{AnalyserNode/maxDecibels}}. If \(b[k]\) lies outside the range of 0 to 255, \(b[k]\) is clipped to lie in that range.
			array: This parameter is where the frequency-domain analysis data will be copied.
		
Return type: {{undefined}}
: getByteTimeDomainData(array) ::
Proposed Correction Issue 2361-7. Use new Web IDL buffer primitives
Buttons here
Get a reference to the bytes held by the {{Uint8Array}} passed as an argument. Copies the current time-domain data (waveform data) into those bytes. If the array has fewer elements than the value of {{AnalyserNode/fftSize}}, the excess elements will be dropped. If the array has more elements than {{AnalyserNode/fftSize}},[=ArrayBufferView/Write=] the [=current time-domain data=] (waveform data) into |array|. If |array|'s [=BufferSource/byte length=] is less than {{AnalyserNode/fftSize}}, the excess elements will be dropped. If |array|'s [=BufferSource/byte length=] is greater than the {{AnalyserNode/fftSize}}, the excess elements will be ignored. The most recent {{AnalyserNode/fftSize}} frames are used in computing the byte data.
The values stored in the unsigned byte array are computed in the following way. Let \(x[k]\) be the time-domain data. Then the byte value, \(b[k]\), is
		$$
			b[k] = \left\lfloor 128(1 + x[k]) \right\rfloor.
		$$
		
If \(b[k]\) lies outside the range 0 to 255, \(b[k]\) is clipped to lie in that range.
			array: This parameter is where the time-domain sample data will be copied.
		
Return type: {{undefined}}
: getFloatFrequencyData(array) ::
Proposed Correction Issue 2361-8. Use new Web IDL buffer primitives
Buttons here
Get a reference to the bytes held by the {{Float32Array}} passed as an argument. Copies the current frequency data into those bytes. If the array has fewer elements than the {{frequencyBinCount}},[=ArrayBufferView/Write=] the [=current frequency data=] into |array|. If |array| has fewer elements than the {{frequencyBinCount}}, the excess elements will be dropped. If |array| has more elements than the {{frequencyBinCount}}, the excess elements will be ignored. The most recent {{AnalyserNode/fftSize}} frames are used in computing the frequency data.
If another call to {{AnalyserNode/getFloatFrequencyData()}} or {{AnalyserNode/getByteFrequencyData()}} occurs within the same render quantum as a previous call, the current frequency data is not updated with the same data. Instead, the previously computed data is returned. The frequency data are in dB units.
			array: This parameter is where the frequency-domain analysis data will be copied.
		
Return type: {{undefined}}
: getFloatTimeDomainData(array) ::
Proposed Correction Issue 2361-9. Use new Web IDL buffer primitives
Buttons here
Get a reference to the bytes held by the {{Float32Array}} passed as an argument. Copies the current time-domain data (waveform data) into those bytes. If the array has fewer elements than the value of {{AnalyserNode/fftSize}}, the excess elements will be dropped. If the array has more elements than {{AnalyserNode/fftSize}},[=ArrayBufferView/Write=] the [=current time-domain data=] (waveform data) into |array|. If |array| has fewer elements than the value of {{AnalyserNode/fftSize}}, the excess elements will be dropped. If |array| has more elements than the value of {{AnalyserNode/fftSize}}, the excess elements will be ignored. The most recent {{AnalyserNode/fftSize}} frames are written (after downmixing).
			array: This parameter is where the time-domain sample data will be copied.
		
Return type: {{undefined}}

{{AnalyserOptions}}

This specifies the options to be used when constructing an {{AnalyserNode}}. All members are optional; if not specified, the normal default values are used to construct the node.
dictionary AnalyserOptions : AudioNodeOptions {
	unsigned long fftSize = 2048;
	double maxDecibels = -30;
	double minDecibels = -100;
	double smoothingTimeConstant = 0.8;
};
Dictionary {{AnalyserOptions}} Members
: fftSize :: The desired initial size of the FFT for frequency-domain analysis. : maxDecibels :: The desired initial maximum power in dB for FFT analysis. : minDecibels :: The desired initial minimum power in dB for FFT analysis. : smoothingTimeConstant :: The desired initial smoothing constant for the FFT analysis.

Time-Domain Down-Mixing

When the current time-domain data are computed, the input signal must be down-mixed to mono as if {{AudioNode/channelCount}} is 1, {{AudioNode/channelCountMode}} is "{{ChannelCountMode/max}}" and {{AudioNode/channelInterpretation}} is "{{ChannelInterpretation/speakers}}". This is independent of the settings for the {{AnalyserNode}} itself. The most recent {{AnalyserNode/fftSize}} frames are used for the down-mixing operation.

FFT Windowing and Smoothing over Time

When the current frequency data are computed, the following operations are to be performed:
1. Compute the current time-domain data. 2. Apply a Blackman window to the time domain input data. 3. Apply a Fourier transform to the windowed time domain input data to get real and imaginary frequency data. 4. Smooth over time the frequency domain data. 5. Convert to dB.
In the following, let \(N\) be the value of the {{AnalyserNode/fftSize}} attribute of this {{AnalyserNode}}.
Applying a Blackman window consists in the following operation on the input time domain data. Let \(x[n]\) for \(n = 0, \ldots, N - 1\) be the time domain data. The Blackman window is defined by
	$$
	\begin{align*}
		\alpha &= \mbox{0.16} \\ a_0 &= \frac{1-\alpha}{2} \\
		a_1 &= \frac{1}{2} \\
		a_2 &= \frac{\alpha}{2} \\
		w[n] &= a_0 - a_1 \cos\frac{2\pi n}{N} + a_2 \cos\frac{4\pi n}{N}, \mbox{ for } n = 0, \ldots, N - 1
	\end{align*}
	$$
	
The windowed signal \(\hat{x}[n]\) is
	$$
		\hat{x}[n] = x[n] w[n], \mbox{ for } n = 0, \ldots, N - 1
	$$
	
Applying a Fourier transform consists of computing the Fourier transform in the following way. Let \(X[k]\) be the complex frequency domain data and \(\hat{x}[n]\) be the windowed time domain data computed above. Then
	$$
		X[k] = \frac{1}{N} \sum_{n = 0}^{N - 1} \hat{x}[n]\, W^{-kn}_{N}
	$$
	
for \(k = 0, \dots, N/2-1\) where \(W_N = e^{2\pi i/N}\).
Smoothing over time frequency data consists in the following operation: * Let \(\hat{X}_{-1}[k]\) be the result of this operation on the previous block. The previous block is defined as being the buffer computed by the previous smoothing over time operation, or an array of \(N\) zeros if this is the first time we are smoothing over time. * Let \(\tau\) be the value of the {{AnalyserNode/smoothingTimeConstant}} attribute for this {{AnalyserNode}}. * Let \(X[k]\) be the result of applying a Fourier transform of the current block. Then the smoothed value, \(\hat{X}[k]\), is computed by
	$$
		\hat{X}[k] = \tau\, \hat{X}_{-1}[k] + (1 - \tau)\, \left|X[k]\right|
	$$
	
for \(k = 0, \ldots, N - 1\).
Conversion to dB consists of the following operation, where \(\hat{X}[k]\) is computed in smoothing over time:
	$$
		Y[k] = 20\log_{10}\hat{X}[k]
	$$
	
for \(k = 0, \ldots, N-1\). This array, \(Y[k]\), is copied to the output array for {{AnalyserNode/getFloatFrequencyData()}}. For {{AnalyserNode/getByteFrequencyData()}}, the \(Y[k]\) is clipped to lie between {{AnalyserNode/minDecibels}} and {{AnalyserNode/maxDecibels}} and then scaled to fit in an unsigned byte such that {{AnalyserNode/minDecibels}} is represented by the value 0 and {{AnalyserNode/maxDecibels}} is represented by the value 255.

The {{AudioBufferSourceNode}} Interface

This interface represents an audio source from an in-memory audio asset in an {{AudioBuffer}}. It is useful for playing audio assets which require a high degree of scheduling flexibility and accuracy. If sample-accurate playback of network- or disk-backed assets is required, an implementer should use {{AudioWorkletNode}} to implement playback. The {{AudioScheduledSourceNode/start()}} method is used to schedule when sound playback will happen. The {{AudioScheduledSourceNode/start()}} method may not be issued multiple times. The playback will stop automatically when the buffer's audio data has been completely played (if the {{AudioBufferSourceNode/loop}} attribute is false), or when the {{AudioScheduledSourceNode/stop()}} method has been called and the specified time has been reached. Please see more details in the {{AudioScheduledSourceNode/start()}} and {{AudioScheduledSourceNode/stop()}} descriptions.
path: audionode.include
macros:
	noi: 0
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: No
The number of channels of the output equals the number of channels of the AudioBuffer assigned to the {{AudioBufferSourceNode/buffer}} attribute, or is one channel of silence if {{AudioBufferSourceNode/buffer}} is null. In addition, if the buffer has more than one channel, then the {{AudioBufferSourceNode}} output must change to a single channel of silence at the beginning of a render quantum after the time at which any one of the following conditions holds: * the end of the {{AudioBufferSourceNode/buffer}} has been reached; * the {{AudioBufferSourceNode/start(when, offset, duration)/duration}} has been reached; * the {{AudioScheduledSourceNode/stop(when)/when|stop}} time has been reached. A playhead position for an {{AudioBufferSourceNode}} is defined as any quantity representing a time offset in seconds, relative to the time coordinate of the first sample frame in the buffer. Such values are to be considered independently from the node's playbackRate and {{AudioBufferSourceNode/detune}} parameters. In general, playhead positions may be subsample-accurate and need not refer to exact sample frame positions. They may assume valid values between 0 and the duration of the buffer. The {{AudioBufferSourceNode/playbackRate}} and {{AudioBufferSourceNode/detune}} attributes form a compound parameter. They are used together to determine a computedPlaybackRate value:
computedPlaybackRate(t) = playbackRate(t) * pow(2, detune(t) / 1200)
The nominal range for this compound parameter is \((-\infty, \infty)\). {{AudioBufferSourceNode}}s are created with an internal boolean slot [[buffer set]], initially set to false.
[Exposed=Window]
interface AudioBufferSourceNode : AudioScheduledSourceNode {
	constructor (BaseAudioContext context,
	             optional AudioBufferSourceOptions options = {});
	attribute AudioBuffer? buffer;
	readonly attribute AudioParam playbackRate;
	readonly attribute AudioParam detune;
	attribute boolean loop;
	attribute double loopStart;
	attribute double loopEnd;
	undefined start (optional double when = 0,
	                 optional double offset,
	                 optional double duration);
};

Constructors

: AudioBufferSourceNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{AudioBufferSourceNode}} will be associated with.
			options: Optional initial parameter value for this {{AudioBufferSourceNode}}.
		

Attributes

: buffer :: Represents the audio asset to be played.
To set the {{AudioBufferSourceNode/buffer}} attribute, execute these steps: 1. Let new buffer be the {{AudioBuffer}} or null value to be assigned to {{AudioBufferSourceNode/buffer}}. 2. If new buffer is not null and {{AudioBufferSourceNode/[[buffer set]]}} is true, throw an {{InvalidStateError}} and abort these steps. 3. If new buffer is not null, set {{AudioBufferSourceNode/[[buffer set]]}} to true. 4. Assign new buffer to the {{AudioBufferSourceNode/buffer}} attribute. 5. If start() has previously been called on this node, perform the operation acquire the content on {{AudioBufferSourceNode/buffer}}.
: detune :: An additional parameter, in cents, to modulate the speed at which is rendered the audio stream. This parameter is a compound parameter with {{AudioBufferSourceNode/playbackRate}} to form a computedPlaybackRate.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: loop :: Indicates if the region of audio data designated by {{AudioBufferSourceNode/loopStart}} and {{AudioBufferSourceNode/loopEnd}} should be played continuously in a loop. The default value is false. : loopEnd :: An optional playhead position where looping should end if the {{AudioBufferSourceNode/loop}} attribute is true. Its value is exclusive of the content of the loop. Its default value is 0, and it may usefully be set to any value between 0 and the duration of the buffer. If {{AudioBufferSourceNode/loopEnd}} is less than or equal to 0, or if {{AudioBufferSourceNode/loopEnd}} is greater than the duration of the buffer, looping will end at the end of the buffer. : loopStart :: An optional playhead position where looping should begin if the {{AudioBufferSourceNode/loop}} attribute is true. Its default value is 0, and it may usefully be set to any value between 0 and the duration of the buffer. If {{AudioBufferSourceNode/loopStart}} is less than 0, looping will begin at 0. If {{AudioBufferSourceNode/loopStart}} is greater than the duration of the buffer, looping will begin at the end of the buffer. : playbackRate :: The speed at which to render the audio stream. This is a compound parameter with {{AudioBufferSourceNode/detune}} to form a computedPlaybackRate.
		path: audioparam.include
		macros:
			default: 1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		

Methods

: start(when, offset, duration) :: Schedules a sound to playback at an exact time.
When this method is called, execute these steps: 1. If this {{AudioBufferSourceNode}} internal slot {{AudioScheduledSourceNode/[[source started]]}} is `true`, an {{InvalidStateError}} exception MUST be thrown. 1. Check for any errors that must be thrown due to parameter constraints described below. If any exception is thrown during this step, abort those steps. 1. Set the internal slot {{AudioScheduledSourceNode/[[source started]]}} on this {{AudioBufferSourceNode}} to true. 1. Queue a control message to start the {{AudioBufferSourceNode}}, including the parameter values in the message. 1. Acquire the contents of the {{AudioBufferSourceNode/buffer}} if the {{AudioBufferSourceNode/buffer}} has been set. 1. Send a control message to the associated {{AudioContext}} to start running its rendering thread only when all the following conditions are met: 1. The context's {{[[control thread state]]}} is {{AudioContextState/suspended}}. 1. The context is allowed to start. 1. {{[[suspended by user]]}} flag is false. NOTE: This allows {{AudioBufferSourceNode/start()}} to start an {{AudioContext}} that would otherwise not be allowed to start.
Running a control message to start the {{AudioBufferSourceNode}} means invoking the handleStart() function in the [[#playback-AudioBufferSourceNode|playback algorithm]] which follows.
			when: The when parameter describes at what time (in seconds) the sound should start playing. It is in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}} attribute. If 0 is passed in for this value or if the value is less than currentTime, then the sound will start playing immediately. A {{RangeError}} exception MUST be thrown if when is negative.
			offset: The offset parameter supplies a playhead position where playback will begin. If 0 is passed in for this value, then playback will start from the beginning of the buffer. A {{RangeError}} exception MUST be thrown if offset is negative. If offset is greater than {{AudioBufferSourceNode/loopEnd}}, {{AudioBufferSourceNode/playbackRate}} is positive or zero, and {{AudioBufferSourceNode/loop}} is true, playback will begin at {{AudioBufferSourceNode/loopEnd}}.  If offset is greater than {{AudioBufferSourceNode/loopStart}}, {{AudioBufferSourceNode/playbackRate}} is negative, and {{AudioBufferSourceNode/loop}} is true, playback will begin at {{AudioBufferSourceNode/loopStart}}. offset is silently clamped to [0, duration], when startTime is reached, where duration is the value of the duration attribute of the {{AudioBuffer}} set to the {{AudioBufferSourceNode/buffer}} attribute of this AudioBufferSourceNode.
			duration: The {{AudioBufferSourceNode/start(when, offset, duration)/duration}} parameter describes the duration of sound to be played, expressed as seconds of total buffer content to be output, including any whole or partial loop iterations. The units of {{AudioBufferSourceNode/start(when, offset, duration)/duration}} are independent of the effects of {{AudioBufferSourceNode/playbackRate}}. For example, a {{AudioBufferSourceNode/start(when, offset, duration)/duration}} of 5 seconds with a playback rate of 0.5 will output 5 seconds of buffer content at half speed, producing 10 seconds of audible output. A {{RangeError}} exception MUST be thrown if duration is negative.
		
Return type: {{undefined}}

{{AudioBufferSourceOptions}}

This specifies options for constructing a {{AudioBufferSourceNode}}. All members are optional; if not specified, the normal default is used in constructing the node.
dictionary AudioBufferSourceOptions {
	AudioBuffer? buffer;
	float detune = 0;
	boolean loop = false;
	double loopEnd = 0;
	double loopStart = 0;
	float playbackRate = 1;
};
Dictionary {{AudioBufferSourceOptions}} Members
: buffer :: The audio asset to be played. This is equivalent to assigning {{AudioBufferSourceOptions/buffer}} to the {{AudioBufferSourceNode/buffer}} attribute of the {{AudioBufferSourceNode}}. : detune :: The initial value for the {{AudioBufferSourceNode/detune}} AudioParam. : loop :: The initial value for the {{AudioBufferSourceNode/loop}} attribute. : loopEnd :: The initial value for the {{AudioBufferSourceNode/loopEnd}} attribute. : loopStart :: The initial value for the {{AudioBufferSourceNode/loopStart}} attribute. : playbackRate :: The initial value for the {{AudioBufferSourceNode/playbackRate}} AudioParam.

Looping

This section is non-normative. Please see the playback algorithm for normative requirements. Setting the {{AudioBufferSourceNode/loop}} attribute to true causes playback of the region of the buffer defined by the endpoints {{AudioBufferSourceNode/loopStart}} and {{AudioBufferSourceNode/loopEnd}} to continue indefinitely, once any part of the looped region has been played. While {{AudioBufferSourceNode/loop}} remains true, looped playback will continue until one of the following occurs: * {{AudioScheduledSourceNode/stop()}} is called, * the scheduled stop time has been reached, * the duration has been exceeded, if {{AudioBufferSourceNode/start()}} was called with a duration value. The body of the loop is considered to occupy a region from {{AudioBufferSourceNode/loopStart}} up to, but not including, {{AudioBufferSourceNode/loopEnd}}. The direction of playback of the looped region respects the sign of the node's playback rate. For positive playback rates, looping occurs from {{AudioBufferSourceNode/loopStart}} to {{AudioBufferSourceNode/loopEnd}}; for negative rates, looping occurs from {{AudioBufferSourceNode/loopEnd}} to {{AudioBufferSourceNode/loopStart}}. Looping does not affect the interpretation of the offset argument of {{AudioBufferSourceNode/start()}}. Playback always starts at the requested offset, and looping only begins once the body of the loop is encountered during playback. The effective loop start and end points are required to lie within the range of zero and the buffer duration, as specified in the algorithm below. {{AudioBufferSourceNode/loopEnd}} is further constrained to be at or after {{AudioBufferSourceNode/loopStart}}. If any of these constraints are violated, the loop is considered to include the entire buffer contents. Loop endpoints have subsample accuracy. When endpoints do not fall on exact sample frame offsets, or when the playback rate is not equal to 1, playback of the loop is interpolated to splice the beginning and end of the loop together just as if the looped audio occurred in sequential, non-looped regions of the buffer. Loop-related properties may be varied during playback of the buffer, and in general take effect on the next rendering quantum. The exact results are defined by the normative playback algorithm which follows. The default values of the {{AudioBufferSourceNode/loopStart}} and {{AudioBufferSourceNode/loopEnd}} attributes are both 0. Since a {{AudioBufferSourceNode/loopEnd}} value of zero is equivalent to the length of the buffer, the default endpoints cause the entire buffer to be included in the loop. Note that the values of the loop endpoints are expressed as time offsets in terms of the sample rate of the buffer, meaning that these values are independent of the node's {{AudioBufferSourceNode/playbackRate}} parameter which can vary dynamically during the course of playback.

Playback of AudioBuffer Contents

This normative section specifies the playback of the contents of the buffer, accounting for the fact that playback is influenced by the following factors working in combination: * A starting offset, which can be expressed with sub-sample precision. * Loop points, which can be expressed with sub-sample precision and can vary dynamically during playback. * Playback rate and detuning parameters, which combine to yield a single computedPlaybackRate that can assume finite values which may be positive or negative. The algorithm to be followed internally to generate output from an {{AudioBufferSourceNode}} conforms to the following principles: * Resampling of the buffer may be performed arbitrarily by the UA at any desired point to increase the efficiency or quality of the output. * Sub-sample start offsets or loop points may require additional interpolation between sample frames. * The playback of a looped buffer should behave identically to an unlooped buffer containing consecutive occurrences of the looped audio content, excluding any effects from interpolation. The description of the algorithm is as follows: let buffer; // AudioBuffer employed by this node let context; // AudioContext employed by this node // The following variables capture attribute and AudioParam values for the node. // They are updated on a k-rate basis, prior to each invocation of process(). let loop; let detune; let loopStart; let loopEnd; let playbackRate; // Variables for the node's playback parameters let start = 0, offset = 0, duration = Infinity; // Set by start() let stop = Infinity; // Set by stop() // Variables for tracking node's playback state let bufferTime = 0, started = false, enteredLoop = false; let bufferTimeElapsed = 0; let dt = 1 / context.sampleRate; // Handle invocation of start method call function handleStart(when, pos, dur) { if (arguments.length >= 1) { start = when; } offset = pos; if (arguments.length >= 3) { duration = dur; } } // Handle invocation of stop method call function handleStop(when) { if (arguments.length >= 1) { stop = when; } else { stop = context.currentTime; } } // Interpolate a multi-channel signal value for some sample frame. // Returns an array of signal values. function playbackSignal(position) { /* This function provides the playback signal function for buffer, which is a function that maps from a playhead position to a set of output signal values, one for each output channel. If |position| corresponds to the location of an exact sample frame in the buffer, this function returns that frame. Otherwise, its return value is determined by a UA-supplied algorithm that interpolates sample frames in the neighborhood of |position|. If |position| is greater than or equal to |loopEnd| and there is no subsequent sample frame in buffer, then interpolation should be based on the sequence of subsequent frames beginning at |loopStart|. */ ... } // Generate a single render quantum of audio to be placed // in the channel arrays defined by output. Returns an array // of |numberOfFrames| sample frames to be output. function process(numberOfFrames) { let currentTime = context.currentTime; // context time of next rendered frame const output = []; // accumulates rendered sample frames // Combine the two k-rate parameters affecting playback rate const computedPlaybackRate = playbackRate * Math.pow(2, detune / 1200); // Determine loop endpoints as applicable let actualLoopStart, actualLoopEnd; if (loop && buffer != null) { if (loopStart >= 0 && loopEnd > 0 && loopStart < loopEnd) { actualLoopStart = loopStart; actualLoopEnd = Math.min(loopEnd, buffer.duration); } else { actualLoopStart = 0; actualLoopEnd = buffer.duration; } } else { // If the loop flag is false, remove any record of the loop having been entered enteredLoop = false; } // Handle null buffer case if (buffer == null) { stop = currentTime; // force zero output for all time } // Render each sample frame in the quantum for (let index = 0; index < numberOfFrames; index++) { // Check that currentTime and bufferTimeElapsed are // within allowable range for playback if (currentTime < start || currentTime >= stop || bufferTimeElapsed >= duration) { output.push(0); // this sample frame is silent currentTime += dt; continue; } if (!started) { // Take note that buffer has started playing and get initial // playhead position. if (loop && computedPlaybackRate >= 0 && offset >= actualLoopEnd) { offset = actualLoopEnd; } if (computedPlaybackRate < 0 && loop && offset < actualLoopStart) { offset = actualLoopStart; } bufferTime = offset; started = true; } // Handle loop-related calculations if (loop) { // Determine if looped portion has been entered for the first time if (!enteredLoop) { if (offset < actualLoopEnd && bufferTime >= actualLoopStart) { // playback began before or within loop, and playhead is // now past loop start enteredLoop = true; } if (offset >= actualLoopEnd && bufferTime < actualLoopEnd) { // playback began after loop, and playhead is now prior // to the loop end enteredLoop = true; } } // Wrap loop iterations as needed. Note that enteredLoop // may become true inside the preceding conditional. if (enteredLoop) { while (bufferTime >= actualLoopEnd) { bufferTime -= actualLoopEnd - actualLoopStart; } while (bufferTime < actualLoopStart) { bufferTime += actualLoopEnd - actualLoopStart; } } } if (bufferTime >= 0 && bufferTime < buffer.duration) { output.push(playbackSignal(bufferTime)); } else { output.push(0); // past end of buffer, so output silent frame } bufferTime += dt * computedPlaybackRate; bufferTimeElapsed += dt * computedPlaybackRate; currentTime += dt; } // End of render quantum loop if (currentTime >= stop) { // End playback state of this node. No further invocations of process() // will occur. Schedule a change to set the number of output channels to 1. } return output; } The following non-normative figures illustrate the behavior of the algorithm in assorted key scenarios. Dynamic resampling of the buffer is not considered, but as long as the times of loop positions are not changed this does not materially affect the resulting playback. In all figures, the following conventions apply: * context sample rate is 1000 Hz * {{AudioBuffer}} content is shown with the first sample frame at the x origin. * output signals are shown with the sample frame located at time start at the x origin. * linear interpolation is depicted throughout, although a UA could employ other interpolation techniques. * the duration values noted in the figures refer to the buffer, not arguments to {{AudioBufferSourceNode/start()}} This figure illustrates basic playback of a buffer, with a simple loop that ends after the last sample frame in the buffer:
AudioBufferSourceNode basic playback
{{AudioBufferSourceNode}} basic playback
This figure illustrates playbackRate interpolation, showing half-speed playback of buffer contents in which every other output sample frame is interpolated. Of particular note is the last sample frame in the looped output, which is interpolated using the loop start point:
AudioBufferSourceNode playbackRate interpolation
{{AudioBufferSourceNode}} playbackRate interpolation
This figure illustrates sample rate interpolation, showing playback of a buffer whose sample rate is 50% of the context sample rate, resulting in a computed playback rate of 0.5 that corrects for the difference in sample rate between the buffer and the context. The resulting output is the same as the preceding example, but for different reasons.
AudioBufferSourceNode sample rate interpolation
{{AudioBufferSourceNode}} sample rate interpolation.
This figure illustrates subsample offset playback, in which the offset within the buffer begins at exactly half a sample frame. Consequently, every output frame is interpolated:
AudioBufferSourceNode subsample offset playback
{{AudioBufferSourceNode}} subsample offset playback
This figure illustrates subsample loop playback, showing how fractional frame offsets in the loop endpoints map to interpolated data points in the buffer that respect these offsets as if they were references to exact sample frames:
AudioBufferSourceNode subsample loop playback
{{AudioBufferSourceNode}} subsample loop playback

The {{AudioDestinationNode}} Interface

This is an {{AudioNode}} representing the final audio destination and is what the user will ultimately hear. It can often be considered as an audio output device which is connected to speakers. All rendered audio to be heard will be routed to this node, a "terminal" node in the {{AudioContext}}'s routing graph. There is only a single AudioDestinationNode per {{AudioContext}}, provided through the destination attribute of {{AudioContext}}. The output of a {{AudioDestinationNode}} is produced by summing its input, allowing to capture the output of an {{AudioContext}} into, for example, a {{MediaStreamAudioDestinationNode}}, or a MediaRecorder (described in [[mediastream-recording]]). The {{AudioDestinationNode}} can be either the destination of an {{AudioContext}} or {{OfflineAudioContext}}, and the channel properties depend on what the context is. For an {{AudioContext}}, the defaults are
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: explicit
	cc-interp: speakers
	tail-time: No
The {{AudioNode/channelCount}} can be set to any value less than or equal to {{AudioDestinationNode/maxChannelCount}}. An {{IndexSizeError}} exception MUST be thrown if this value is not within the valid range. Giving a concrete example, if the audio hardware supports 8-channel output, then we may set {{AudioNode/channelCount}} to 8, and render 8 channels of output. For an {{OfflineAudioContext}}, the defaults are
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: numberOfChannels
	cc-mode: explicit
	cc-interp: speakers
	tail-time: No
where numberOfChannels is the number of channels specified when constructing the {{OfflineAudioContext}}. This value may not be changed; a {{NotSupportedError}} exception MUST be thrown if {{AudioNode/channelCount}} is changed to a different value.
[Exposed=Window]
interface AudioDestinationNode : AudioNode {
	readonly attribute unsigned long maxChannelCount;
};

Attributes

: maxChannelCount :: The maximum number of channels that the {{AudioNode/channelCount}} attribute can be set to. An {{AudioDestinationNode}} representing the audio hardware end-point (the normal case) can potentially output more than 2 channels of audio if the audio hardware is multi-channel. {{AudioDestinationNode/maxChannelCount}} is the maximum number of channels that this hardware is capable of supporting.

The {{AudioListener}} Interface

This interface represents the position and orientation of the person listening to the audio scene. All {{PannerNode}} objects spatialize in relation to the {{BaseAudioContext}}'s {{BaseAudioContext/listener}}. See [[#Spatialization]] for more details about spatialization. The {{AudioListener/positionX}}, {{AudioListener/positionY}}, and {{AudioListener/positionZ}} parameters represent the location of the listener in 3D Cartesian coordinate space. {{PannerNode}} objects use this position relative to individual audio sources for spatialization. The {{AudioListener/forwardX}}, {{AudioListener/forwardY}}, and {{AudioListener/forwardZ}} parameters represent a direction vector in 3D space. Both a forward vector and an up vector are used to determine the orientation of the listener. In simple human terms, the forward vector represents which direction the person's nose is pointing. The up vector represents the direction the top of a person's head is pointing. These two vectors are expected to be linearly independent. For normative requirements of how these values are to be interpreted, see the [[#Spatialization]] section.
[Exposed=Window]
interface AudioListener {
	readonly attribute AudioParam positionX;
	readonly attribute AudioParam positionY;
	readonly attribute AudioParam positionZ;
	readonly attribute AudioParam forwardX;
	readonly attribute AudioParam forwardY;
	readonly attribute AudioParam forwardZ;
	readonly attribute AudioParam upX;
	readonly attribute AudioParam upY;
	readonly attribute AudioParam upZ;
	undefined setPosition (float x, float y, float z);
	undefined setOrientation (float x, float y, float z, float xUp, float yUp, float zUp);
};

Attributes

: forwardX :: Sets the x coordinate component of the forward direction the listener is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: forwardY :: Sets the y coordinate component of the forward direction the listener is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: forwardZ :: Sets the z coordinate component of the forward direction the listener is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: -1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: positionX :: Sets the x coordinate position of the audio listener in a 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: positionY :: Sets the y coordinate position of the audio listener in a 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: positionZ :: Sets the z coordinate position of the audio listener in a 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: upX :: Sets the x coordinate component of the up direction the listener is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: upY :: Sets the y coordinate component of the up direction the listener is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		
: upZ :: Sets the z coordinate component of the up direction the listener is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		

Methods

: setOrientation(x, y, z, xUp, yUp, zUp) :: This method is DEPRECATED. It is equivalent to setting {{forwardX}}.{{AudioParam/value}}, {{forwardY}}.{{AudioParam/value}}, {{forwardZ}}.{{AudioParam/value}}, {{upX}}.{{AudioParam/value}}, {{upY}}.{{AudioParam/value}}, and {{upZ}}.{{AudioParam/value}} directly with the given x, y, z, xUp, yUp, and zUp values, respectively. Consequently, if any of the {{forwardX}}, {{forwardY}}, {{forwardZ}}, {{upX}}, {{upY}} and {{upZ}} {{AudioParam}}s have an automation curve set using {{AudioParam/setValueCurveAtTime()}} at the time this method is called, a {{NotSupportedError}} MUST be thrown. {{AudioListener/setOrientation()}} describes which direction the listener is pointing in the 3D cartesian coordinate space. Both a [=forward=] vector and an [=up=] vector are provided. In simple human terms, the forward vector represents which direction the person's nose is pointing. The up vector represents the direction the top of a person's head is pointing. These two vectors are expected to be linearly independent. For normative requirements of how these values are to be interpreted, see the [[#Spatialization]]. The {{AudioListener/setOrientation()/x!!argument}}, {{AudioListener/setOrientation()/y!!argument}}, and {{AudioListener/setOrientation()/z!!argument}} parameters represent a forward direction vector in 3D space, with the default value being (0,0,-1). The {{AudioListener/setOrientation()/xUp!!argument}}, {{AudioListener/setOrientation()/yUp!!argument}}, and {{AudioListener/setOrientation()/zUp!!argument}} parameters represent an up direction vector in 3D space, with the default value being (0,1,0).
			x: forward x direction fo the {{AudioListener}}
			y: forward y direction fo the {{AudioListener}}
			z: forward z direction fo the {{AudioListener}}
			xUp: up x direction fo the {{AudioListener}}
			yUp: up y direction fo the {{AudioListener}}
			zUp: up z direction fo the {{AudioListener}}
		
Return type: {{undefined}}
: setPosition(x, y, z) :: This method is DEPRECATED. It is equivalent to setting {{AudioListener/positionX}}.{{AudioParam/value}}, {{AudioListener/positionY}}.{{AudioParam/value}}, and {{AudioListener/positionZ}}.{{AudioParam/value}} directly with the given x, y, and z values, respectively. Consequently, any of the {{AudioListener/positionX}}, {{AudioListener/positionY}}, and {{AudioListener/positionZ}} {{AudioParam}}s for this {{AudioListener}} have an automation curve set using {{AudioParam/setValueCurveAtTime()}} at the time this method is called, a {{NotSupportedError}} MUST be thrown. {{AudioListener/setPosition()}} sets the position of the listener in a 3D cartesian coordinate space. {{PannerNode}} objects use this position relative to individual audio sources for spatialization. The {{AudioListener/setPosition()/x!!argument}}, {{AudioListener/setPosition()/y!!argument}}, and {{AudioListener/setPosition()/z!!argument}} parameters represent the coordinates in 3D space. The default value is (0,0,0).
			x: x-coordinate of the position of the {{AudioListener}}
			y: y-coordinate of the position of the {{AudioListener}}
			z: z-coordinate of the position of the {{AudioListener}}
		

Processing

Because {{AudioListener}}'s parameters can be connected with {{AudioNode}}s and they can also affect the output of {{PannerNode}}s in the same graph, the node ordering algorithm should take the {{AudioListener}} into consideration when computing the order of processing. For this reason, all the {{PannerNode}}s in the graph have the {{AudioListener}} as input.

The {{AudioProcessingEvent}} Interface - DEPRECATED

This is an {{Event}} object which is dispatched to {{ScriptProcessorNode}} nodes. It will be removed when the ScriptProcessorNode is removed, as the replacement {{AudioWorkletNode}} uses a different approach. The event handler processes audio from the input (if any) by accessing the audio data from the inputBuffer attribute. The audio data which is the result of the processing (or the synthesized data if there are no inputs) is then placed into the {{AudioProcessingEvent/outputBuffer}}.
[Exposed=Window]
interface AudioProcessingEvent : Event {
	constructor (DOMString type, AudioProcessingEventInit eventInitDict);
	readonly attribute double playbackTime;
	readonly attribute AudioBuffer inputBuffer;
	readonly attribute AudioBuffer outputBuffer;
};

Attributes

: inputBuffer :: An AudioBuffer containing the input audio data. It will have a number of channels equal to the numberOfInputChannels parameter of the createScriptProcessor() method. This AudioBuffer is only valid while in the scope of the {{ScriptProcessorNode/onaudioprocess}} function. Its values will be meaningless outside of this scope. : outputBuffer :: An AudioBuffer where the output audio data MUST be written. It will have a number of channels equal to the numberOfOutputChannels parameter of the createScriptProcessor() method. Script code within the scope of the {{ScriptProcessorNode/onaudioprocess}} function is expected to modify the {{Float32Array}} arrays representing channel data in this AudioBuffer. Any script modifications to this AudioBuffer outside of this scope will not produce any audible effects. : playbackTime :: The time when the audio will be played in the same time coordinate system as the {{AudioContext}}'s {{BaseAudioContext/currentTime}}.

{{AudioProcessingEventInit}}

dictionary AudioProcessingEventInit : EventInit {
	required double playbackTime;
	required AudioBuffer inputBuffer;
	required AudioBuffer outputBuffer;
};
Dictionary {{AudioProcessingEventInit}} Members
: inputBuffer :: Value to be assigned to the {{AudioProcessingEvent/inputBuffer}} attribute of the event. : outputBuffer :: Value to be assigned to the {{AudioProcessingEvent/outputBuffer}} attribute of the event. : playbackTime :: Value to be assigned to the {{AudioProcessingEvent/playbackTime}} attribute of the event.

The {{BiquadFilterNode}} Interface

{{BiquadFilterNode}} is an {{AudioNode}} processor implementing very common low-order filters. Low-order filters are the building blocks of basic tone controls (bass, mid, treble), graphic equalizers, and more advanced filters. Multiple {{BiquadFilterNode}} filters can be combined to form more complex filters. The filter parameters such as {{BiquadFilterNode/frequency}} can be changed over time for filter sweeps, etc. Each {{BiquadFilterNode}} can be configured as one of a number of common filter types as shown in the IDL below. The default filter type is "lowpass". Both {{BiquadFilterNode/frequency}} and {{BiquadFilterNode/detune}} form a compound parameter and are both a-rate. They are used together to determine a computedFrequency value:
	computedFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)
The nominal range for this compound parameter is [0, Nyquist frequency].
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: Yes
	tail-time-notes:  Continues to output non-silent audio with zero input. Since this is an IIR filter, the filter produces non-zero input forever, but in practice, this can be limited after some finite time where the output is sufficiently close to zero. The actual time depends on the filter coefficients.
The number of channels of the output always equals the number of channels of the input.
enum BiquadFilterType {
	"lowpass",
	"highpass",
	"bandpass",
	"lowshelf",
	"highshelf",
	"peaking",
	"notch",
	"allpass"
};
Enumeration description
"lowpass" A lowpass filter allows frequencies below the cutoff frequency to pass through and attenuates frequencies above the cutoff. It implements a standard second-order resonant lowpass filter with 12dB/octave rolloff. : frequency :: The cutoff frequency : Q :: Controls how peaked the response will be at the cutoff frequency. A large value makes the response more peaked. : gain :: Not used in this filter type
"highpass" A highpass filter is the opposite of a lowpass filter. Frequencies above the cutoff frequency are passed through, but frequencies below the cutoff are attenuated. It implements a standard second-order resonant highpass filter with 12dB/octave rolloff. : frequency :: The cutoff frequency below which the frequencies are attenuated : Q :: Controls how peaked the response will be at the cutoff frequency. A large value makes the response more peaked. : gain :: Not used in this filter type
"bandpass" A bandpass filter allows a range of frequencies to pass through and attenuates the frequencies below and above this frequency range. It implements a second-order bandpass filter. : frequency :: The center of the frequency band : Q :: Controls the width of the band. The width becomes narrower as the Q value increases. : gain :: Not used in this filter type
"lowshelf" The lowshelf filter allows all frequencies through, but adds a boost (or attenuation) to the lower frequencies. It implements a second-order lowshelf filter. : frequency :: The upper limit of the frequences where the boost (or attenuation) is applied. : Q :: Not used in this filter type. : gain :: The boost, in dB, to be applied. If the value is negative, the frequencies are attenuated.
"highshelf" The highshelf filter is the opposite of the lowshelf filter and allows all frequencies through, but adds a boost to the higher frequencies. It implements a second-order highshelf filter : frequency :: The lower limit of the frequences where the boost (or attenuation) is applied. : Q :: Not used in this filter type. : gain :: The boost, in dB, to be applied. If the value is negative, the frequencies are attenuated.
"peaking" The peaking filter allows all frequencies through, but adds a boost (or attenuation) to a range of frequencies. : frequency :: The center frequency of where the boost is applied. : Q :: Controls the width of the band of frequencies that are boosted. A large value implies a narrow width. : gain :: The boost, in dB, to be applied. If the value is negative, the frequencies are attenuated.
"notch" The notch filter (also known as a band-stop or band-rejection filter) is the opposite of a bandpass filter. It allows all frequencies through, except for a set of frequencies. : frequency :: The center frequency of where the notch is applied. : Q :: Controls the width of the band of frequencies that are attenuated. A large value implies a narrow width. : gain :: Not used in this filter type.
"allpass" An allpass filter allows all frequencies through, but changes the phase relationship between the various frequencies. It implements a second-order allpass filter : frequency :: The frequency where the center of the phase transition occurs. Viewed another way, this is the frequency with maximal group delay. : Q :: Controls how sharp the phase transition is at the center frequency. A larger value implies a sharper transition and a larger group delay. : gain :: Not used in this filter type.
All attributes of the {{BiquadFilterNode}} are a-rate {{AudioParam}}s.
[Exposed=Window]
interface BiquadFilterNode : AudioNode {
	constructor (BaseAudioContext context, optional BiquadFilterOptions options = {});
	attribute BiquadFilterType type;
	readonly attribute AudioParam frequency;
	readonly attribute AudioParam detune;
	readonly attribute AudioParam Q;
	readonly attribute AudioParam gain;
	undefined getFrequencyResponse (Float32Array frequencyHz,
	                                Float32Array magResponse,
	                                Float32Array phaseResponse);
};

Constructors

: BiquadFilterNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{BiquadFilterNode}} will be associated with.
			options: Optional initial parameter value for this {{BiquadFilterNode}}.
		

Attributes

: Q :: The Q factor of the filter. For {{BiquadFilterType/lowpass}} and {{BiquadFilterType/highpass}} filters the {{BiquadFilterNode/Q}} value is interpreted to be in dB. For these filters the nominal range is \([-Q_{lim}, Q_{lim}]\) where \(Q_{lim}\) is the largest value for which \(10^{Q/20}\) does not overflow. This is approximately \(770.63678\). For the {{BiquadFilterType/bandpass}}, {{BiquadFilterType/notch}}, {{BiquadFilterType/allpass}}, and {{BiquadFilterType/peaking}} filters, this value is a linear value. The value is related to the bandwidth of the filter and hence should be a positive value. The nominal range is \([0, 3.4028235e38]\), the upper limit being the most-positive-single-float. This is not used for the {{BiquadFilterType/lowshelf}} and {{BiquadFilterType/highshelf}} filters.
		path: audioparam.include
		macros:
			default: 1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38, but see above for the actual limits for different filters
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38, but see above for the actual limits for different filters
			rate: "{{AutomationRate/a-rate}}"
		
: detune :: A detune value, in cents, for the frequency. It forms a compound parameter with {{BiquadFilterNode/frequency}} to form the computedFrequency.
		path: audioparam.include
		macros:
			default: 0
			min: \(\approx -153600\)
			min-notes:
			max: \(\approx 153600\)
			max-notes: This value is approximately \(1200\ \log_2 \mathrm{FLT\_MAX}\) where FLT_MAX is the largest {{float}} value.
			rate: "{{AutomationRate/a-rate}}"
		
: frequency :: The frequency at which the {{BiquadFilterNode}} will operate, in Hz. It forms a compound parameter with {{BiquadFilterNode/detune}} to form the computedFrequency.
		path: audioparam.include
		macros:
			default: 350
			min: 0
			max: Nyquist frequency
			rate: "{{AutomationRate/a-rate}}"
		
: gain :: The gain of the filter. Its value is in dB units. The gain is only used for {{BiquadFilterType/lowshelf}}, {{BiquadFilterType/highshelf}}, and {{BiquadFilterType/peaking}} filters.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: \(\approx 1541\)
			max-notes: This value is approximately \(40\ \log_{10} \mathrm{FLT\_MAX}\) where FLT_MAX is the largest {{float}} value.
			rate: "{{AutomationRate/a-rate}}"
		
: type :: The type of this {{BiquadFilterNode}}. Its default value is "{{BiquadFilterType/lowpass}}". The exact meaning of the other parameters depend on the value of the {{BiquadFilterNode/type}} attribute.

Methods

: getFrequencyResponse(frequencyHz, magResponse, phaseResponse) :: Given the {{[[current value]]}} from each of the filter parameters, synchronously calculates the frequency response for the specified frequencies. The three parameters MUST be {{Float32Array}}s of the same length, or an {{InvalidAccessError}} MUST be thrown. The frequency response returned MUST be computed with the {{AudioParam}} sampled for the current processing block.
			frequencyHz: This parameter specifies an array of frequencies, in Hz, at which the response values will be calculated.
			magResponse: This parameter specifies an output array receiving the linear magnitude response values. If a value in the frequencyHz parameter is not within [0, sampleRate/2], where sampleRate is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the magResponse array MUST be NaN.
			phaseResponse: This parameter specifies an output array receiving the phase response values in radians. If a value in the frequencyHz parameter is not within [0; sampleRate/2], where sampleRate is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the phaseResponse array MUST be NaN.
		
Return type: {{undefined}}

{{BiquadFilterOptions}}

This specifies the options to be used when constructing a {{BiquadFilterNode}}. All members are optional; if not specified, the normal default values are used to construct the node.
dictionary BiquadFilterOptions : AudioNodeOptions {
	BiquadFilterType type = "lowpass";
	float Q = 1;
	float detune = 0;
	float frequency = 350;
	float gain = 0;
};
Dictionary {{BiquadFilterOptions}} Members
: Q :: The desired initial value for {{BiquadFilterNode/Q}}. : detune :: The desired initial value for {{BiquadFilterNode/detune}}. : frequency :: The desired initial value for {{BiquadFilterNode/frequency}}. : gain :: The desired initial value for {{BiquadFilterNode/gain}}. : type :: The desired initial type of the filter.

Filters Characteristics

There are multiple ways of implementing the type of filters available through the {{BiquadFilterNode}} each having very different characteristics. The formulas in this section describe the filters that a conforming implementation MUST implement, as they determine the characteristics of the different filter types. They are inspired by formulas found in the Audio EQ Cookbook. The {{BiquadFilterNode}} processes audio with a transfer function of
$$
 H(z) = \frac{\frac{b_0}{a_0} + \frac{b_1}{a_0}z^{-1} + \frac{b_2}{a_0}z^{-2}}
                                          {1+\frac{a_1}{a_0}z^{-1}+\frac{a_2}{a_0}z^{-2}}
$$
which is equivalent to a time-domain equation of:
$$
a_0 y(n) + a_1 y(n-1) + a_2 y(n-2) =
	b_0 x(n) + b_1 x(n-1) + b_2 x(n-2)
$$
The initial filter state is 0. Note: While fixed filters are stable, it is possible to create unstable biquad filters using automations of {{AudioParam}}s. It is the developers responsibility to manage this. Note: The UA may produce a warning to notify the user that NaN values have occurred in the filter state. This is usually indicative of an unstable filter. The coefficients in the transfer function above are different for each node type. The following intermediate variables are necessary for their computation, based on the computedValue of the {{AudioParam}}s of the {{BiquadFilterNode}}. * Let \(F_s\) be the value of the {{BaseAudioContext/sampleRate}} attribute for this {{AudioContext}}. * Let \(f_0\) be the value of the computedFrequency. * Let \(G\) be the value of the {{BiquadFilterNode/gain}} {{AudioParam}}. * Let \(Q\) be the value of the {{BiquadFilterNode/Q}} {{AudioParam}}. * Finally let
	$$
	\begin{align*}
		A &= 10^{\frac{G}{40}} \\
		\omega_0 &= 2\pi\frac{f_0}{F_s} \\
		\alpha_Q &= \frac{\sin\omega_0}{2Q} \\
		\alpha_{Q_{dB}} &= \frac{\sin\omega_0}{2 \cdot 10^{Q/20}} \\
		S &= 1 \\
		\alpha_S &= \frac{\sin\omega_0}{2}\sqrt{\left(A+\frac{1}{A}\right)\left(\frac{1}{S}-1\right)+2}
	\end{align*}
	$$
	
The six coefficients (\(b_0, b_1, b_2, a_0, a_1, a_2\)) for each filter type, are: : "{{lowpass}}" ::
	$$
		\begin{align*}
			b_0 &= \frac{1 - \cos\omega_0}{2} \\
			b_1 &= 1 - \cos\omega_0 \\
			b_2 &= \frac{1 - \cos\omega_0}{2} \\
			a_0 &= 1 + \alpha_{Q_{dB}} \\
			a_1 &= -2 \cos\omega_0 \\
			a_2 &= 1 - \alpha_{Q_{dB}}
		\end{align*}
	$$
	
: "{{highpass}}" ::
	$$
		\begin{align*}
			b_0 &= \frac{1 + \cos\omega_0}{2} \\
			b_1 &= -(1 + \cos\omega_0) \\
			b_2 &= \frac{1 + \cos\omega_0}{2} \\
			a_0 &= 1 + \alpha_{Q_{dB}} \\
			a_1 &= -2 \cos\omega_0 \\
			a_2 &= 1 - \alpha_{Q_{dB}}
		\end{align*}
	$$
	
: "{{bandpass}}" ::
	$$
		\begin{align*}
			b_0 &= \alpha_Q \\
			b_1 &= 0 \\
			b_2 &= -\alpha_Q \\
			a_0 &= 1 + \alpha_Q \\
			a_1 &= -2 \cos\omega_0 \\
			a_2 &= 1 - \alpha_Q
		\end{align*}
	$$
	
: "{{notch}}" ::
	$$
		\begin{align*}
			b_0 &= 1 \\
			b_1 &= -2\cos\omega_0 \\
			b_2 &= 1 \\
			a_0 &= 1 + \alpha_Q \\
			a_1 &= -2 \cos\omega_0 \\
			a_2 &= 1 - \alpha_Q
		\end{align*}
	$$
	
: "{{allpass}}" ::
	$$
		\begin{align*}
			b_0 &= 1 - \alpha_Q \\
			b_1 &= -2\cos\omega_0 \\
			b_2 &= 1 + \alpha_Q \\
			a_0 &= 1 + \alpha_Q \\
			a_1 &= -2 \cos\omega_0 \\
			a_2 &= 1 - \alpha_Q
		\end{align*}
	$$
	
: "{{peaking}}" ::
	$$
		\begin{align*}
			b_0 &= 1 + \alpha_Q\, A \\
			b_1 &= -2\cos\omega_0 \\
			b_2 &= 1 - \alpha_Q\,A \\
			a_0 &= 1 + \frac{\alpha_Q}{A} \\
			a_1 &= -2 \cos\omega_0 \\
			a_2 &= 1 - \frac{\alpha_Q}{A}
		\end{align*}
	$$
	
: "{{lowshelf}}" ::
	$$
		\begin{align*}
			b_0 &= A \left[ (A+1) - (A-1) \cos\omega_0 + 2 \alpha_S \sqrt{A})\right] \\
			b_1 &= 2 A \left[ (A-1) - (A+1) \cos\omega_0 )\right] \\
			b_2 &= A \left[ (A+1) - (A-1) \cos\omega_0 - 2 \alpha_S \sqrt{A}) \right] \\
			a_0 &= (A+1) + (A-1) \cos\omega_0 + 2 \alpha_S \sqrt{A} \\
			a_1 &= -2 \left[ (A-1) + (A+1) \cos\omega_0\right] \\
			a_2 &= (A+1) + (A-1) \cos\omega_0 - 2 \alpha_S \sqrt{A})
		\end{align*}
	$$
	
: "{{highshelf}}" ::
	$$
		\begin{align*}
			b_0 &= A\left[ (A+1) + (A-1)\cos\omega_0 + 2\alpha_S\sqrt{A} )\right] \\
			b_1 &= -2A\left[ (A-1) + (A+1)\cos\omega_0 )\right] \\
			b_2 &= A\left[ (A+1) + (A-1)\cos\omega_0 - 2\alpha_S\sqrt{A} )\right] \\
			a_0 &= (A+1) - (A-1)\cos\omega_0 + 2\alpha_S\sqrt{A} \\
			a_1 &= 2\left[ (A-1) - (A+1)\cos\omega_0\right] \\
			a_2 &= (A+1) - (A-1)\cos\omega_0 - 2\alpha_S\sqrt{A}
		\end{align*}
	$$
	

The {{ChannelMergerNode}} Interface

The {{ChannelMergerNode}} is for use in more advanced applications and would often be used in conjunction with {{ChannelSplitterNode}}.
path: audionode.include
macros:
	noi: see notes
	noi-notes:  Defaults to 6, but is determined by {{ChannelMergerOptions}},{{ChannelMergerOptions/numberOfInputs}} or the value specified by {{BaseAudioContext/createChannelMerger}}.
	noo: 1
	cc: 1
	cc-notes: Has channelCount constraints
	cc-mode: explicit
	cc-mode-notes: Has channelCountMode constraints
	cc-interp: speakers
	tail-time: No
This interface represents an {{AudioNode}} for combining channels from multiple audio streams into a single audio stream. It has a variable number of inputs (defaulting to 6), but not all of them need be connected. There is a single output whose audio stream has a number of channels equal to the number of inputs when any of the inputs is [=actively processing=]. If none of the inputs are [=actively processing=], then output is a single channel of silence. To merge multiple inputs into one stream, each input gets downmixed into one channel (mono) based on the specified mixing rule. An unconnected input still counts as one silent channel in the output. Changing input streams does not affect the order of output channels.
For example, if a default {{ChannelMergerNode}} has two connected stereo inputs, the first and second input will be downmixed to mono respectively before merging. The output will be a 6-channel stream whose first two channels are be filled with the first two (downmixed) inputs and the rest of channels will be silent. Also the {{ChannelMergerNode}} can be used to arrange multiple audio streams in a certain order for the multi-channel speaker array such as 5.1 surround set up. The merger does not interpret the channel identities (such as left, right, etc.), but simply combines channels in the order that they are input.
channel merger
A diagram of ChannelMerger
[Exposed=Window]
interface ChannelMergerNode : AudioNode {
	constructor (BaseAudioContext context, optional ChannelMergerOptions options = {});
};

Constructors

: ChannelMergerNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{ChannelMergerNode}} will be associated with.
			options: Optional initial parameter value for this {{ChannelMergerNode}}.
		

{{ChannelMergerOptions}}

dictionary ChannelMergerOptions : AudioNodeOptions {
	unsigned long numberOfInputs = 6;
};
Dictionary {{ChannelMergerOptions}} Members
: numberOfInputs :: The number inputs for the {{ChannelMergerNode}}. See {{BaseAudioContext/createChannelMerger()}} for constraints on this value.

The {{ChannelSplitterNode}} Interface

The {{ChannelSplitterNode}} is for use in more advanced applications and would often be used in conjunction with {{ChannelMergerNode}}.
path: audionode.include
macros:
	noi: 1
	noo: see notes
	noo-notes:  This defaults to 6, but is otherwise determined from {{ChannelSplitterOptions/numberOfOutputs|ChannelSplitterOptions.numberOfOutputs}} or the value specified by {{BaseAudioContext/createChannelSplitter}} or the {{ChannelSplitterOptions/numberOfOutputs}} member of the {{ChannelSplitterOptions}} dictionary for the {{ChannelSplitterNode/ChannelSplitterNode()|constructor}}.
	cc: {{AudioNode/numberOfOutputs}}
	cc-notes: Has channelCount constraints
	cc-mode: explicit
	cc-mode-notes: Has channelCountMode constraints
	cc-interp: discrete
	cc-interp-notes: Has channelInterpretation constraints
	tail-time: No
This interface represents an {{AudioNode}} for accessing the individual channels of an audio stream in the routing graph. It has a single input, and a number of "active" outputs which equals the number of channels in the input audio stream. For example, if a stereo input is connected to an {{ChannelSplitterNode}} then the number of active outputs will be two (one from the left channel and one from the right). There are always a total number of N outputs (determined by the numberOfOutputs parameter to the {{AudioContext}} method {{BaseAudioContext/createChannelSplitter()}}), The default number is 6 if this value is not provided. Any outputs which are not "active" will output silence and would typically not be connected to anything.
channel splitter
A diagram of a ChannelSplitter
Please note that in this example, the splitter does not interpret the channel identities (such as left, right, etc.), but simply splits out channels in the order that they are input.
One application for {{ChannelSplitterNode}} is for doing "matrix mixing" where individual gain control of each channel is desired.
[Exposed=Window]
interface ChannelSplitterNode : AudioNode {
	constructor (BaseAudioContext context, optional ChannelSplitterOptions options = {});
};

Constructors

: ChannelSplitterNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{ChannelSplitterNode}} will be associated with.
			options: Optional initial parameter value for this {{ChannelSplitterNode}}.
		

{{ChannelSplitterOptions}}

dictionary ChannelSplitterOptions : AudioNodeOptions {
	unsigned long numberOfOutputs = 6;
};
Dictionary {{ChannelSplitterOptions}} Members
: numberOfOutputs :: The number outputs for the {{ChannelSplitterNode}}. See {{BaseAudioContext/createChannelSplitter()}} for constraints on this value.

The {{ConstantSourceNode}} Interface

This interface represents a constant audio source whose output is nominally a constant value. It is useful as a constant source node in general and can be used as if it were a constructible {{AudioParam}} by automating its {{ConstantSourceNode/offset}} or connecting another node to it. The single output of this node consists of one channel (mono).
path: audionode.include
macros:
	noi: 0
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: No
[Exposed=Window]
interface ConstantSourceNode : AudioScheduledSourceNode {
	constructor (BaseAudioContext context, optional ConstantSourceOptions options = {});
	readonly attribute AudioParam offset;
};

Constructors

: ConstantSourceNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{ConstantSourceNode}} will be associated with.
			options: Optional initial parameter value for this {{ConstantSourceNode}}.
		

Attributes

: offset :: The constant value of the source.
		path: audioparam.include
		macros:
			default: 1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		

{{ConstantSourceOptions}}

This specifies options for constructing a {{ConstantSourceNode}}. All members are optional; if not specified, the normal defaults are used for constructing the node.
dictionary ConstantSourceOptions {
	float offset = 1;
};
Dictionary {{ConstantSourceOptions}} Members
: offset :: The initial value for the {{ConstantSourceNode/offset}} AudioParam of this node.

The {{ConvolverNode}} Interface

This interface represents a processing node which applies a linear convolution effect given an impulse response.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-notes: Has channelCount constraints
	cc-mode: clamped-max
	cc-mode-notes: Has channelCountMode constraints
	cc-interp: speakers
	tail-time: Yes
	tail-time-notes: Continues to output non-silent audio with zero input for the length of the {{ConvolverNode/buffer}}.
The input of this node is either mono (1 channel) or stereo (2 channels) and cannot be increased. Connections from nodes with more channels will be down-mixed appropriately. There are channelCount constraints and channelCountMode constraints for this node. These constraints ensure that the input to the node is either mono or stereo.
[Exposed=Window]
interface ConvolverNode : AudioNode {
	constructor (BaseAudioContext context, optional ConvolverOptions options = {});
	attribute AudioBuffer? buffer;
	attribute boolean normalize;
};

Constructors

: ConvolverNode(context, options) :: When the constructor is called with a {{BaseAudioContext}} context and an option object options, execute these steps: 1. Set the attributes {{ConvolverNode/normalize}} to the inverse of the value of {{ConvolverOptions/disableNormalization}}. 2. If {{ConvolverNode/buffer}} exists, set the {{ConvolverNode/buffer}} attribute to its value. Note: This means that the buffer will be normalized according to the value of the {{ConvolverNode/normalize}} attribute. 3. Let o be new {{AudioNodeOptions}} dictionary. 4. If {{AudioNodeOptions/channelCount}} exists in options, set {{AudioNodeOptions/channelCount}} on o with the same value. 5. If {{AudioNodeOptions/channelCountMode}} exists in options, set {{AudioNodeOptions/channelCountMode}} on o with the same value. 6. If {{AudioNodeOptions/channelInterpretation}} exists in options, set {{AudioNodeOptions/channelInterpretation}} on o with the same value. 7. Initialize the AudioNode this, with c and o as argument.
			context: The {{BaseAudioContext}} this new {{ConvolverNode}} will be associated with.
			options: Optional initial parameter value for this {{ConvolverNode}}.
		

Attributes

: buffer :: At the time when this attribute is set, the {{ConvolverNode/buffer}} and the state of the {{normalize}} attribute will be used to configure the {{ConvolverNode}} with this impulse response having the given normalization. The initial value of this attribute is null.
When setting the buffer attribute, execute the following steps synchronously: 1. If the buffer {{AudioBuffer/numberOfChannels|number of channels}} is not 1, 2, 4, or if the {{AudioBuffer/sampleRate|sample-rate}} of the buffer is not the same as the {{BaseAudioContext/sampleRate|sample-rate}} of its associated {{BaseAudioContext}}, a {{NotSupportedError}} MUST be thrown. 2. Acquire the content of the {{AudioBuffer}}.
Note: If the {{ConvolverNode/buffer}} is set to an new buffer, audio may glitch. If this is undesirable, it is recommended to create a new {{ConvolverNode}} to replace the old, possibly cross-fading between the two. Note: The {{ConvolverNode}} produces a mono output only in the single case where there is a single input channel and a single-channel {{ConvolverNode/buffer}}. In all other cases, the output is stereo. In particular, when the {{ConvolverNode/buffer}} has four channels and there are two input channels, the {{ConvolverNode}} performs matrix "true" stereo convolution. For normative information please see the channel configuration diagrams : normalize :: Controls whether the impulse response from the buffer will be scaled by an equal-power normalization when the {{ConvolverNode/buffer}} atttribute is set. Its default value is `true` in order to achieve a more uniform output level from the convolver when loaded with diverse impulse responses. If {{normalize}} is set to false, then the convolution will be rendered with no pre-processing/scaling of the impulse response. Changes to this value do not take effect until the next time the {{ConvolverNode/buffer}} attribute is set. If the {{normalize}} attribute is false when the {{ConvolverNode/buffer}} attribute is set then the {{ConvolverNode}} will perform a linear convolution given the exact impulse response contained within the {{ConvolverNode/buffer}}. Otherwise, if the {{normalize}} attribute is true when the {{ConvolverNode/buffer}} attribute is set then the {{ConvolverNode}} will first perform a scaled RMS-power analysis of the audio data contained within {{ConvolverNode/buffer}} to calculate a normalizationScale given this algorithm:
		function calculateNormalizationScale(buffer) {
			const GainCalibration = 0.00125;
			const GainCalibrationSampleRate = 44100;
			const MinPower = 0.000125;

			// Normalize by RMS power.
			const numberOfChannels = buffer.numberOfChannels;
			const length = buffer.length;

			let power = 0;

			for (let i = 0; i < numberOfChannels; i++) {
				let channelPower = 0;
				const channelData = buffer.getChannelData(i);

				for (let j = 0; j < length; j++) {
					const sample = channelData[j];
					channelPower += sample * sample;
				}

				power += channelPower;
			}

			power = Math.sqrt(power / (numberOfChannels * length));

			// Protect against accidental overload.
			if (!isFinite(power) || isNaN(power) || power < MinPower)
				power = MinPower;

			let scale = 1 / power;

			// Calibrate to make perceived volume same as unprocessed.
			scale *= GainCalibration;

			// Scale depends on sample-rate.
			if (buffer.sampleRate)
				scale *= GainCalibrationSampleRate / buffer.sampleRate;

			// True-stereo compensation.
			if (numberOfChannels == 4)
				scale *= 0.5;

			return scale;
		}
		
During processing, the ConvolverNode will then take this calculated normalizationScale value and multiply it by the result of the linear convolution resulting from processing the input with the impulse response (represented by the {{ConvolverNode/buffer}}) to produce the final output. Or any mathematically equivalent operation may be used, such as pre-multiplying the input by normalizationScale, or pre-multiplying a version of the impulse-response by normalizationScale.

{{ConvolverOptions}}

The specifies options for constructing a {{ConvolverNode}}. All members are optional; if not specified, the node is contructing using the normal defaults.
dictionary ConvolverOptions : AudioNodeOptions {
	AudioBuffer? buffer;
	boolean disableNormalization = false;
};
Dictionary {{ConvolverOptions}} Members
: buffer :: The desired buffer for the {{ConvolverNode}}. This buffer will be normalized according to the value of {{ConvolverOptions/disableNormalization}}. : disableNormalization :: The opposite of the desired initial value for the {{ConvolverNode/normalize}} attribute of the {{ConvolverNode}}.

Channel Configurations for Input, Impulse Response and Output

Implementations MUST support the following allowable configurations of impulse response channels in a {{ConvolverNode}} to achieve various reverb effects with 1 or 2 channels of input. As shown in the diagram below, single channel convolution operates on a mono audio input, using a mono impulse response, and generating a mono output. The remaining images in the diagram illustrate the supported cases for mono and stereo playback where the number of channels of the input is 1 or 2, and the number of channels in the {{ConvolverNode/buffer}} is 1, 2, or 4. Developers desiring more complex and arbitrary matrixing can use a {{ChannelSplitterNode}}, multiple single-channel {{ConvolverNode}}s and a {{ChannelMergerNode}}. If this node is not [=actively processing=], the output is a single channel of silence. Note: The diagrams below show the outputs when [=actively processing=].
reverb matrixing
A graphical representation of supported input and output channel count possibilities when using a {{ConvolverNode}}.

The {{DelayNode}} Interface

A delay-line is a fundamental building block in audio applications. This interface is an {{AudioNode}} with a single input and single output.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: Yes
	tail-time-notes: Continues to output non-silent audio with zero input up to the {{DelayOptions/maxDelayTime}} of the node.
The number of channels of the output always equals the number of channels of the input. It delays the incoming audio signal by a certain amount. Specifically, at each time t, input signal input(t), delay time delayTime(t) and output signal output(t), the output will be output(t) = input(t - delayTime(t)). The default delayTime is 0 seconds (no delay). When the number of channels in a {{DelayNode}}'s input changes (thus changing the output channel count also), there may be delayed audio samples which have not yet been output by the node and are part of its internal state. If these samples were received earlier with a different channel count, they MUST be upmixed or downmixed before being combined with newly received input so that all internal delay-line mixing takes place using the single prevailing channel layout. Note: By definition, a {{DelayNode}} introduces an audio processing latency equal to the amount of the delay.
[Exposed=Window]
interface DelayNode : AudioNode {
	constructor (BaseAudioContext context, optional DelayOptions options = {});
	readonly attribute AudioParam delayTime;
};

Constructors

: DelayNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{DelayNode}} will be associated with.
			options: Optional initial parameter value for this {{DelayNode}}.
		

Attributes

: delayTime :: An {{AudioParam}} object representing the amount of delay (in seconds) to apply. Its default value is 0 (no delay). The minimum value is 0 and the maximum value is determined by the {{maxDelayTime!!argument}} argument to the {{AudioContext}} method {{createDelay()}} or the {{DelayOptions/maxDelayTime}} member of the {{DelayOptions}} dictionary for the {{DelayNode/DelayNode()|constructor}}. If {{DelayNode}} is part of a cycle, then the value of the {{DelayNode/delayTime}} attribute is clamped to a minimum of one render quantum.
		path: audioparam.include
		macros:
			default: 0
			min: 0
			max: {{DelayOptions/maxDelayTime}}
			rate: "{{AutomationRate/a-rate}}"
		

{{DelayOptions}}

This specifies options for constructing a {{DelayNode}}. All members are optional; if not given, the node is constructed using the normal defaults.
dictionary DelayOptions : AudioNodeOptions {
	double maxDelayTime = 1;
	double delayTime = 0;
};
Dictionary {{DelayOptions}} Members
: delayTime :: The initial delay time for the node. : maxDelayTime :: The maximum delay time for the node. See {{BaseAudioContext/createDelay(maxDelayTime)/maxDelayTime!!argument|createDelay(maxDelayTime)}} for constraints.

Processing

A {{DelayNode}} has an internal buffer that holds {{DelayNode|delayTime}} seconds of audio. The processing of a {{DelayNode}} is broken down in two parts: writing to the delay line, and reading from the delay line. This is done via two internal {{AudioNode}}s (that are not available to authors and exist only to ease the description of the inner workings of the node). Both are created from a {{DelayNode}}. Creating a DelayWriter for a {{DelayNode}} means creating an object that has the same interface as an {{AudioNode}}, and that writes the input audio into the internal buffer of the {{DelayNode}}. It has the same input connections as the {{DelayNode}} it was created from. Creating a DelayReader for a {{DelayNode}} means creating an object that has the same interface as an {{AudioNode}}, and that can read the audio data from the internal buffer of the {{DelayNode}}. It is connected to the same {{AudioNode}}s as the {{DelayNode}} it was created from. A DelayReader is a source node. When processing an input buffer, a DelayWriter MUST write the audio to the internal buffer of the {{DelayNode}}. When producing an output buffer, a DelayReader MUST yield exactly the audio that was written to the corresponding DelayWriter {{DelayNode|delayTime}} seconds ago. Note: This means that channel count changes are reflected after the delay time has passed.

The {{DynamicsCompressorNode}} Interface

{{DynamicsCompressorNode}} is an {{AudioNode}} processor implementing a dynamics compression effect. Dynamics compression is very commonly used in musical production and game audio. It lowers the volume of the loudest parts of the signal and raises the volume of the softest parts. Overall, a louder, richer, and fuller sound can be achieved. It is especially important in games and musical applications where large numbers of individual sounds are played simultaneous to control the overall signal level and help avoid clipping (distorting) the audio output to the speakers.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-notes: Has channelCount constraints
	cc-mode: clamped-max
	cc-mode-notes: Has channelCountMode constraints
	cc-interp: speakers
	tail-time: Yes
	tail-time-notes:  This node has a tail-time such that this node continues to output non-silent audio with zero input due to the look-ahead delay.
[Exposed=Window]
interface DynamicsCompressorNode : AudioNode {
	constructor (BaseAudioContext context,
	             optional DynamicsCompressorOptions options = {});
	readonly attribute AudioParam threshold;
	readonly attribute AudioParam knee;
	readonly attribute AudioParam ratio;
	readonly attribute float reduction;
	readonly attribute AudioParam attack;
	readonly attribute AudioParam release;
};

Constructors

: DynamicsCompressorNode(context, options) ::
			path: audionode-init.include
		
Let [[internal reduction]] be a private slot on this, that holds a floating point number, in decibels. Set {{[[internal reduction]]}} to 0.0.
			context: The {{BaseAudioContext}} this new {{DynamicsCompressorNode}} will be associated with.
			options: Optional initial parameter value for this {{DynamicsCompressorNode}}.
		

Attributes

: attack :: The amount of time (in seconds) to reduce the gain by 10dB.
		path: audioparam.include
		macros:
			default: .003
			min: 0
			max: 1
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: knee :: A decibel value representing the range above the threshold where the curve smoothly transitions to the "ratio" portion.
		path: audioparam.include
		macros:
			default: 30
			min: 0
			max: 40
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: ratio :: The amount of dB change in input for a 1 dB change in output.
		path: audioparam.include
		macros:
			default: 12
			min: 1
			max: 20
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: reduction :: A read-only decibel value for metering purposes, representing the current amount of gain reduction that the compressor is applying to the signal. If fed no signal the value will be 0 (no gain reduction). When this attribute is read, return the value of the private slot {{[[internal reduction]]}}. : release :: The amount of time (in seconds) to increase the gain by 10dB.
		path: audioparam.include
		macros:
			default: .25
			min: 0
			max: 1
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: threshold :: The decibel value above which the compression will start taking effect.
		path: audioparam.include
		macros:
			default: -24
			min: -100
			max: 0
			rate: "{{AutomationRate/k-rate}}"
			rate-notes: Has [=automation rate constraints=]
		

{{DynamicsCompressorOptions}}

This specifies the options to use in constructing a {{DynamicsCompressorNode}}. All members are optional; if not specified the normal defaults are used in constructing the node.
dictionary DynamicsCompressorOptions : AudioNodeOptions {
	float attack = 0.003;
	float knee = 30;
	float ratio = 12;
	float release = 0.25;
	float threshold = -24;
};
Dictionary {{DynamicsCompressorOptions}} Members
: attack :: The initial value for the {{DynamicsCompressorNode/attack}} AudioParam. : knee :: The initial value for the {{DynamicsCompressorNode/knee}} AudioParam. : ratio :: The initial value for the {{DynamicsCompressorNode/ratio}} AudioParam. : release :: The initial value for the {{DynamicsCompressorNode/release}} AudioParam. : threshold :: The initial value for the {{DynamicsCompressorNode/threshold}} AudioParam.

Processing

Dynamics compression can be implemented in a variety of ways. The {{DynamicsCompressorNode}} implements a dynamics processor that has the following characteristics: * Fixed look-ahead (this means that an {{DynamicsCompressorNode}} adds a fixed latency to the signal chain). * Configurable attack speed, release speed, threshold, knee hardness and ratio. * Side-chaining is not supported. * The gain reduction is reported via the reduction property on the {{DynamicsCompressorNode}}. * The compression curve has three parts: * The first part is the identity: \(f(x) = x\). * The second part is the soft-knee portion, which MUST be a monotonically increasing function. * The third part is a linear function: \(f(x) = \frac{1}{ratio} \cdot x \). This curve MUST be continuous and piece-wise differentiable, and corresponds to a target output level, based on the input level. Graphically, such a curve would look something like this:
Graphical representation of a compression curve
A typical compression curve, showing the knee portion (soft or hard) as well as the threshold.
Internally, the {{DynamicsCompressorNode}} is described with a combination of other {{AudioNode}}s, as well as a special algorithm, to compute the gain reduction value. The following {{AudioNode}} graph is used internally, input and output respectively being the input and output {{AudioNode}}, context the {{BaseAudioContext}} for this {{DynamicsCompressorNode}}, and a new class, EnvelopeFollower, that instantiates a special object that behaves like an {{AudioNode}}, described below:
	const delay = new DelayNode(context, {delayTime: 0.006});
	const gain = new GainNode(context);
	const compression = new EnvelopeFollower();

	input.connect(delay).connect(gain).connect(output);
	input.connect(compression).connect(gain.gain);
Schema of
	the internal graph used by the DynamicCompressorNode
The graph of internal {{AudioNode}}s used as part of the {{DynamicsCompressorNode}} processing algorithm.
Note: This implements the pre-delay and the application of the reduction gain. The following algorithm describes the processing performed by an EnvelopeFollower object, to be applied to the input signal to produce the gain reduction value. An EnvelopeFollower has two slots holding floating point values. Those values persist accros invocation of this algorithm. * Let [[detector average]] be a floating point number, initialized to 0.0. * Let [[compressor gain]] be a floating point number, initialized to 1.0.
The following algorithm allow determining a value for reduction gain, for each sample of input, for a render quantum of audio. 1. Let attack and release have the values of {{DynamicsCompressorNode/attack}} and {{DynamicsCompressorNode/release}}, respectively, sampled at the time of processing (those are k-rate parameters), mutiplied by the sample-rate of the {{BaseAudioContext}} this {{DynamicsCompressorNode}} is associated with. 1. Let detector average be the value of the slot {{[[detector average]]}}. 1. Let compressor gain be the value of the slot {{[[compressor gain]]}}. 1. For each sample input of the render quantum to be processed, execute the following steps: 1. If the absolute value of input is less than 0.0001, let attenuation be 1.0. Else, let shaped input be the value of applying the compression curve to the absolute value of input. Let attenuation be shaped input divided by the absolute value of input. 2. Let releasing be `true` if attenuation is greater than compressor gain, false otherwise. 3. Let detector rate be the result of applying the detector curve to attenuation. 4. Subtract detector average from attenuation, and multiply the result by detector rate. Add this new result to detector average. 5. Clamp detector average to a maximum of 1.0. 6. Let envelope rate be the result of computing the envelope rate based on values of attack and release. 7. If releasing is `true`, set compressor gain to be the product of compressor gain and envelope rate, clamped to a maximum of 1.0. 8. Else, if releasing is false, let gain increment to be detector average minus compressor gain. Multiply gain increment by envelope rate, and add the result to compressor gain. 9. Compute reduction gain to be compressor gain multiplied by the return value of computing the makeup gain. 10. Compute metering gain to be reduction gain, converted to decibel. 1. Set {{[[compressor gain]]}} to compressor gain. 1. Set {{[[detector average]]}} to detector average. 1. Atomically set the internal slot {{[[internal reduction]]}} to the value of metering gain. Note: This step makes the metering gain update once per block, at the end of the block processing.
The makeup gain is a fixed gain stage that only depends on ratio, knee and threshold parameter of the compressor, and not on the input signal. The intent here is to increase the output level of the compressor so it is comparable to the input level.
Computing the makeup gain means executing the following steps: 1. Let full range gain be the value returned by applying the compression curve to the value 1.0. 2. Let full range makeup gain be the inverse of full range gain. 3. Return the result of taking the 0.6 power of full range makeup gain.
Computing the envelope rate is done by applying a function to the ratio of the compressor gain and the detector average. User-agents are allowed to choose the shape of the envelope function. However, this function MUST respect the following constraints: * The envelope rate MUST be the calculated from the ratio of the compressor gain and the detector average. Note: When attacking, this number less than or equal to 1, when releasing, this number is strictly greater than 1. * The attack curve MUST be a continuous, monotonically increasing function in the range \([0, 1]\). The shape of this curve MAY be controlled by {{DynamicsCompressorNode/attack}}. * The release curve MUST be a continuous, monotonically decreasing function that is always greater than 1. The shape of this curve MAY be controlled by {{DynamicsCompressorNode/release}}. This operation returns the value computed by applying this function to the ratio of compressor gain and detector average.
Applying the detector curve to the change rate when attacking or releasing allow implementing adaptive release. It is a function that MUST respect the following constraints: * The output of the function MUST be in \([0,1]\). * The function MUST be monotonically increasing, continuous. Note: It is allowed, for example, to have a compressor that performs an adaptive release, that is, releasing faster the harder the compression, or to have curves for attack and release that are not of the same shape.
Applying a compression curve to a value means computing the value of this sample when passed to a function, and returning the computed value. This function MUST respect the following characteristics: 1. Let threshold and knee have the values of {{DynamicsCompressorNode/threshold}} and {{DynamicsCompressorNode/knee}}, respectively, [=decibels to linear gain unit|converted to linear units=] and sampled at the time of processing of this block (as [=k-rate=] parameters). 1. Calculate the sum of {{DynamicsCompressorNode/threshold}} plus {{DynamicsCompressorNode/knee}} also sampled at the time of processing of this block (as [=k-rate=] parameters). 1. Let knee end threshold have the value of this sum [=decibels to linear gain unit|converted to linear units=]. 1. Let ratio have the value of the {{DynamicsCompressorNode/ratio}}, sampled at the time of processing of this block (as a [=k-rate=] parameter). 1. This function is the identity up to the value of the linear threshold (i.e., \(f(x) = x\)). 1. From the threshold up to the knee end threshold, User-Agents can choose the curve shape. The whole function MUST be monotonically increasing and continuous. Note: If the knee is 0, the {{DynamicsCompressorNode}} is called a hard-knee compressor. 1. This function is linear, based on the ratio, after the threshold and the soft knee (i.e., \(f(x) = \frac{1}{ratio} \cdot x \)).
Converting a value \(v\) in linear gain unit to decibel means executing the following steps: 1. If \(v\) is equal to zero, return -1000. 2. Else, return \( 20 \, \log_{10}{v} \).
Converting a value \(v\) in decibels to linear gain unit means returning \(10^{v/20}\).

The {{GainNode}} Interface

Changing the gain of an audio signal is a fundamental operation in audio applications. This interface is an {{AudioNode}} with a single input and single output:
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: No
Each sample of each channel of the input data of the {{GainNode}} MUST be multiplied by the computedValue of the {{GainNode/gain}} {{AudioParam}}.
[Exposed=Window]
interface GainNode : AudioNode {
	constructor (BaseAudioContext context, optional GainOptions options = {});
	readonly attribute AudioParam gain;
};

Constructors

: GainNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{GainNode}} will be associated with.
			options: Optional initial parameter values for this {{GainNode}}.
		

Attributes

: gain :: Represents the amount of gain to apply.
		path: audioparam.include
		macros:
			default: 1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
		

{{GainOptions}}

This specifies options to use in constructing a {{GainNode}}. All members are optional; if not specified, the normal defaults are used in constructing the node.
dictionary GainOptions : AudioNodeOptions {
	float gain = 1.0;
};
Dictionary {{GainOptions}} Members
: gain :: The initial gain value for the {{GainNode/gain}} AudioParam.

The {{IIRFilterNode}} Interface

{{IIRFilterNode}} is an {{AudioNode}} processor implementing a general IIR Filter. In general, it is best to use {{BiquadFilterNode}}'s to implement higher-order filters for the following reasons: * Generally less sensitive to numeric issues * Filter parameters can be automated * Can be used to create all even-ordered IIR filters However, odd-ordered filters cannot be created, so if such filters are needed or automation is not needed, then IIR filters may be appropriate. Once created, the coefficients of the IIR filter cannot be changed.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: Yes
	tail-time-notes: Continues to output non-silent audio with zero input. Since this is an IIR filter, the filter produces non-zero input forever, but in practice, this can be limited after some finite time where the output is sufficiently close to zero. The actual time depends on the filter coefficients.
The number of channels of the output always equals the number of channels of the input.
[Exposed=Window]
interface IIRFilterNode : AudioNode {
	constructor (BaseAudioContext context, IIRFilterOptions options);
	undefined getFrequencyResponse (Float32Array frequencyHz,
	                                Float32Array magResponse,
	                                Float32Array phaseResponse);
};

Constructors

: IIRFilterNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{IIRFilterNode}} will be associated with.
			options: Initial parameter value for this {{IIRFilterNode}}.
		

Methods

: getFrequencyResponse(frequencyHz, magResponse, phaseResponse) :: Given the current filter parameter settings, synchronously calculates the frequency response for the specified frequencies. The three parameters MUST be {{Float32Array}}s of the same length, or an {{InvalidAccessError}} MUST be thrown.
			frequencyHz: This parameter specifies an array of frequencies, in Hz, at which the response values will be calculated.
			magResponse: This parameter specifies an output array receiving the linear magnitude response values. If a value in the frequencyHz parameter is not within [0, sampleRate/2], where sampleRate is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the magResponse array MUST be NaN.
			phaseResponse: This parameter specifies an output array receiving the phase response values in radians. If a value in the frequencyHz parameter is not within [0; sampleRate/2], where sampleRate is the value of the {{BaseAudioContext/sampleRate}} property of the {{AudioContext}}, the corresponding value at the same index of the phaseResponse array MUST be NaN.
		
Return type: {{undefined}}

{{IIRFilterOptions}}

The IIRFilterOptions dictionary is used to specify the filter coefficients of the {{IIRFilterNode}}. dictionary IIRFilterOptions : AudioNodeOptions { required sequence<double> feedforward; required sequence<double> feedback; };
Dictionary {{IIRFilterOptions}} Members
: feedforward :: The feedforward coefficients for the {{IIRFilterNode}}. This member is required. See {{BaseAudioContext/createIIRFilter()/feedforward}} argument of {{BaseAudioContext/createIIRFilter()}} for other constraints. : feedback :: The feedback coefficients for the {{IIRFilterNode}}. This member is required. See {{BaseAudioContext/createIIRFilter()/feedback}} argument of {{BaseAudioContext/createIIRFilter()}} for other constraints.

Filter Definition

Let \(b_m\) be the feedforward coefficients and \(a_n\) be the feedback coefficients specified by {{BaseAudioContext/createIIRFilter()}} or the {{IIRFilterOptions}} dictionary for the {{IIRFilterNode/IIRFilterNode()|constructor}}. Then the transfer function of the general IIR filter is given by
$$
	H(z) = \frac{\sum_{m=0}^{M} b_m z^{-m}}{\sum_{n=0}^{N} a_n z^{-n}}
$$
where \(M + 1\) is the length of the \(b\) array and \(N + 1\) is the length of the \(a\) array. The coefficient \(a_0\) MUST not be 0 (see {{BaseAudioContext/createIIRFilter()/feedback|feedback parameter}} for {{BaseAudioContext/createIIRFilter()}}). At least one of \(b_m\) MUST be non-zero (see {{BaseAudioContext/createIIRFilter()/feedforward|feedforward parameter}} for {{BaseAudioContext/createIIRFilter()}}). Equivalently, the time-domain equation is:
$$
	\sum_{k=0}^{N} a_k y(n-k) = \sum_{k=0}^{M} b_k x(n-k)
$$
The initial filter state is the all-zeroes state. Note: The UA may produce a warning to notify the user that NaN values have occurred in the filter state. This is usually indicative of an unstable filter.

The {{MediaElementAudioSourceNode}} Interface

This interface represents an audio source from an <{audio}> or <{video}> element.
path: audionode-noinput.include
macros:
	noo: 1
	tail-time: No
The number of channels of the output corresponds to the number of channels of the media referenced by the {{HTMLMediaElement}}. Thus, changes to the media element's src attribute can change the number of channels output by this node. If the sample rate of the {{HTMLMediaElement}} differs from the sample rate of the associated {{AudioContext}}, then the output from the {{HTMLMediaElement}} must be resampled to match the context's {{BaseAudioContext/sampleRate|sample rate}}. A {{MediaElementAudioSourceNode}} is created given an {{HTMLMediaElement}} using the {{AudioContext}} {{createMediaElementSource()}} method or the {{MediaElementAudioSourceOptions/mediaElement}} member of the {{MediaElementAudioSourceOptions}} dictionary for the {{MediaElementAudioSourceNode/MediaElementAudioSourceNode()|constructor}}. The number of channels of the single output equals the number of channels of the audio referenced by the {{HTMLMediaElement}} passed in as the argument to {{createMediaElementSource()}}, or is 1 if the {{HTMLMediaElement}} has no audio. The {{HTMLMediaElement}} MUST behave in an identical fashion after the {{MediaElementAudioSourceNode}} has been created, except that the rendered audio will no longer be heard directly, but instead will be heard as a consequence of the {{MediaElementAudioSourceNode}} being connected through the routing graph. Thus pausing, seeking, volume, src attribute changes, and other aspects of the {{HTMLMediaElement}} MUST behave as they normally would if not used with a {{MediaElementAudioSourceNode}}.
	const mediaElement = document.getElementById('mediaElementID');
	const sourceNode = context.createMediaElementSource(mediaElement);
	sourceNode.connect(filterNode);
[Exposed=Window]
interface MediaElementAudioSourceNode : AudioNode {
	constructor (AudioContext context, MediaElementAudioSourceOptions options);
	[SameObject] readonly attribute HTMLMediaElement mediaElement;
};

Constructors

: MediaElementAudioSourceNode(context, options) :: 1. initialize the AudioNode this, with context and options as arguments.
			context: The {{AudioContext}} this new {{MediaElementAudioSourceNode}} will be associated with.
			options: Initial parameter value for this {{MediaElementAudioSourceNode}}.
		

Attributes

: mediaElement :: The {{HTMLMediaElement}} used when constructing this {{MediaElementAudioSourceNode}}.

{{MediaElementAudioSourceOptions}}

This specifies the options to use in constructing a {{MediaElementAudioSourceNode}}.
dictionary MediaElementAudioSourceOptions {
	required HTMLMediaElement mediaElement;
};
Dictionary {{MediaElementAudioSourceOptions}} Members
: mediaElement :: The media element that will be re-routed. This MUST be specified.

Security with MediaElementAudioSourceNode and Cross-Origin Resources

{{HTMLMediaElement}} allows the playback of cross-origin resources. Because Web Audio allows inspection of the content of the resource (e.g. using a {{MediaElementAudioSourceNode}}, and an {{AudioWorkletNode}} or {{ScriptProcessorNode}} to read the samples), information leakage can occur if scripts from one [[html#origin|origin]] inspect the content of a resource from another [[html#origin|origin]]. To prevent this, a {{MediaElementAudioSourceNode}} MUST output silence instead of the normal output of the {{HTMLMediaElement}} if it has been created using an {{HTMLMediaElement}} for which the execution of the fetch algorithm [[!FETCH]] labeled the resource as CORS-cross-origin.

The {{MediaStreamAudioDestinationNode}} Interface

This interface is an audio destination representing a {{MediaStream}} with a single {{MediaStreamTrack}} whose kind is "audio". This {{MediaStream}} is created when the node is created and is accessible via the {{MediaStreamAudioDestinationNode/stream}} attribute. This stream can be used in a similar way as a {{MediaStream}} obtained via {{getUserMedia()}}, and can, for example, be sent to a remote peer using the RTCPeerConnection (described in [[!webrtc]]) addStream() method.
path: audionode.include
macros:
	noi: 1
	noo: 0
	cc: 2
	cc-mode: explicit
	cc-interp: speakers
	tail-time: No
The number of channels of the input is by default 2 (stereo).
[Exposed=Window]
interface MediaStreamAudioDestinationNode : AudioNode {
	constructor (AudioContext context, optional AudioNodeOptions options = {});
	readonly attribute MediaStream stream;
};

Constructors

: MediaStreamAudioDestinationNode(context, options) :: 1. Initialize the AudioNode this, with context and options as arguments.
			context: The {{BaseAudioContext}} this new {{MediaStreamAudioDestinationNode}} will be associated with.
			options: Optional initial parameter value for this {{MediaStreamAudioDestinationNode}}.
		

Attributes

: stream :: A {{MediaStream}} containing a single {{MediaStreamTrack}} with the same number of channels as the node itself, and whose kind attribute has the value "audio".

The {{MediaStreamAudioSourceNode}} Interface

This interface represents an audio source from a {{MediaStream}}.
path: audionode-noinput.include
macros:
	noo: 1
	tail-time: No
The number of channels of the output corresponds to the number of channels of the {{MediaStreamTrack}}. When the {{MediaStreamTrack}} ends, this {{AudioNode}} outputs one channel of silence. If the sample rate of the {{MediaStreamTrack}} differs from the sample rate of the associated {{AudioContext}}, then the output of the {{MediaStreamTrack}} is resampled to match the context's {{BaseAudioContext/sampleRate|sample rate}}.
[Exposed=Window]
interface MediaStreamAudioSourceNode : AudioNode {
	constructor (AudioContext context, MediaStreamAudioSourceOptions options);
	[SameObject] readonly attribute MediaStream mediaStream;
};

Constructors

: MediaStreamAudioSourceNode(context, options) :: 1. If the {{MediaStreamAudioSourceOptions/mediaStream}} member of {{MediaStreamAudioSourceNode/constructor(context, options)/options!!argument}} does not reference a {{MediaStream}} that has at least one {{MediaStreamTrack}} whose kind attribute has the value "audio", throw an {{InvalidStateError}} and abort these steps. Else, let this stream be inputStream. 1. Let tracks be the list of all {{MediaStreamTrack}}s of inputStream that have a kind of "audio". 1. Sort the elements in tracks based on their id attribute using an ordering on sequences of [=code unit=] values. 1. Initialize the AudioNode this, with context and options as arguments. 1. Set an internal slot [[input track]] on this {{MediaStreamAudioSourceNode}} to be the first element of tracks. This is the track used as the input audio for this {{MediaStreamAudioSourceNode}}. After construction, any change to the {{MediaStream}} that was passed to the constructor do not affect the underlying output of this {{AudioNode}}. The slot {{[[input track]]}} is only used to keep a reference to the {{MediaStreamTrack}}. Note: This means that when removing the track chosen by the constructor of the {{MediaStreamAudioSourceNode}} from the {{MediaStream}} passed into this constructor, the {{MediaStreamAudioSourceNode}} will still take its input from the same track. Note: The behaviour for picking the track to output is arbitrary for legacy reasons. {{MediaStreamTrackAudioSourceNode}} can be used instead to be explicit about which track to use as input.
			context: The {{AudioContext}} this new {{MediaStreamAudioSourceNode}} will be associated with.
			options: Initial parameter value for this {{MediaStreamAudioSourceNode}}.
		

Attributes

: mediaStream :: The {{MediaStream}} used when constructing this {{MediaStreamAudioSourceNode}}.

{{MediaStreamAudioSourceOptions}}

This specifies the options for constructing a {{MediaStreamAudioSourceNode}}.
dictionary MediaStreamAudioSourceOptions {
	required MediaStream mediaStream;
};
Dictionary {{MediaStreamAudioSourceOptions}} Members
: mediaStream :: The media stream that will act as a source. This MUST be specified.

The {{MediaStreamTrackAudioSourceNode}} Interface

This interface represents an audio source from a {{MediaStreamTrack}}.
path: audionode-noinput.include
macros:
	noo: 1
	tail-time: No
The number of channels of the output corresponds to the number of channels of the {{MediaStreamTrackAudioSourceOptions/mediaStreamTrack}}. If the sample rate of the {{MediaStreamTrack}} differs from the sample rate of the associated {{AudioContext}}, then the output of the {{MediaStreamTrackAudioSourceOptions/mediaStreamTrack}} is resampled to match the context's {{BaseAudioContext/sampleRate|sample rate}}.
[Exposed=Window]
interface MediaStreamTrackAudioSourceNode : AudioNode {
	constructor (AudioContext context, MediaStreamTrackAudioSourceOptions options);
};

Constructors

: MediaStreamTrackAudioSourceNode(context, options) :: 1. If the {{MediaStreamTrackAudioSourceOptions/mediaStreamTrack}}'s kind attribute is not "audio", throw an {{InvalidStateError}} and abort these steps. 1. Initialize the AudioNode this, with context and options as arguments.
			context: The {{AudioContext}} this new {{MediaStreamTrackAudioSourceNode}} will be associated with.
			options: Initial parameter value for this {{MediaStreamTrackAudioSourceNode}}.
		

{{MediaStreamTrackAudioSourceOptions}}

This specifies the options for constructing a {{MediaStreamTrackAudioSourceNode}}. This is required.
dictionary MediaStreamTrackAudioSourceOptions {
	required MediaStreamTrack mediaStreamTrack;
};
Dictionary {{MediaStreamTrackAudioSourceOptions}} Members
: mediaStreamTrack :: The media stream track that will act as a source. If this {{MediaStreamTrack}} kind attribute is not "audio", an {{InvalidStateError}} MUST be thrown.

The {{OscillatorNode}} Interface

{{OscillatorNode}} represents an audio source generating a periodic waveform. It can be set to a few commonly used waveforms. Additionally, it can be set to an arbitrary periodic waveform through the use of a {{PeriodicWave}} object. Oscillators are common foundational building blocks in audio synthesis. An OscillatorNode will start emitting sound at the time specified by the {{AudioScheduledSourceNode/start()}} method. Mathematically speaking, a continuous-time periodic waveform can have very high (or infinitely high) frequency information when considered in the frequency domain. When this waveform is sampled as a discrete-time digital audio signal at a particular sample-rate, then care MUST be taken to discard (filter out) the high-frequency information higher than the Nyquist frequency before converting the waveform to a digital form. If this is not done, then aliasing of higher frequencies (than the Nyquist frequency) will fold back as mirror images into frequencies lower than the Nyquist frequency. In many cases this will cause audibly objectionable artifacts. This is a basic and well-understood principle of audio DSP. There are several practical approaches that an implementation may take to avoid this aliasing. Regardless of approach, the idealized discrete-time digital audio signal is well defined mathematically. The trade-off for the implementation is a matter of implementation cost (in terms of CPU usage) versus fidelity to achieving this ideal. It is expected that an implementation will take some care in achieving this ideal, but it is reasonable to consider lower-quality, less-costly approaches on lower-end hardware. Both {{OscillatorNode/frequency}} and {{OscillatorNode/detune}} are a-rate parameters, and form a compound parameter. They are used together to determine a computedOscFrequency value:
	computedOscFrequency(t) = frequency(t) * pow(2, detune(t) / 1200)
The OscillatorNode's instantaneous phase at each time is the definite time integral of computedOscFrequency, assuming a phase angle of zero at the node's exact start time. Its nominal range is [-Nyquist frequency, Nyquist frequency]. The single output of this node consists of one channel (mono).
path: audionode.include
macros:
	noi: 0
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: No
enum OscillatorType {
	"sine",
	"square",
	"sawtooth",
	"triangle",
	"custom"
};
Enumeration description
"sine" A sine wave
"square" A square wave of duty period 0.5
"sawtooth" A sawtooth wave
"triangle" A triangle wave
"custom" A custom periodic wave
[Exposed=Window]
interface OscillatorNode : AudioScheduledSourceNode {
	constructor (BaseAudioContext context, optional OscillatorOptions options = {});
	attribute OscillatorType type;
	readonly attribute AudioParam frequency;
	readonly attribute AudioParam detune;
	undefined setPeriodicWave (PeriodicWave periodicWave);
};

Constructors

: OscillatorNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{OscillatorNode}} will be associated with.
			options: Optional initial parameter value for this {{OscillatorNode}}.
		

Attributes

: detune :: A detuning value (in cents) which will offset the {{OscillatorNode/frequency}} by the given amount. Its default value is 0. This parameter is a-rate. It forms a compound parameter with {{OscillatorNode/frequency}} to form the computedOscFrequency. The nominal range listed below allows this parameter to detune the {{OscillatorNode/frequency}} over the entire possible range of frequencies.
		path: audioparam.include
		macros:
			default: 0
			min: \(\approx -153600\)
			min-notes:
			max: \(\approx 153600\)
			max-notes: This value is approximately \(1200\ \log_2 \mathrm{FLT\_MAX}\) where FLT_MAX is the largest {{float}} value.
			rate: "{{AutomationRate/a-rate}}"
		
: frequency :: The frequency (in Hertz) of the periodic waveform. Its default value is 440. This parameter is a-rate. It forms a compound parameter with {{OscillatorNode/detune}} to form the computedOscFrequency. Its nominal range is [-Nyquist frequency, Nyquist frequency].
		path: audioparam.include
		macros:
			default: 440
			min: -Nyquist frequency
			max: Nyquist frequency
			rate: "{{AutomationRate/a-rate}}"
		
: type :: The shape of the periodic waveform. It may directly be set to any of the type constant values except for "{{OscillatorType/custom}}". Doing so MUST throw an {{InvalidStateError}} exception. The {{OscillatorNode/setPeriodicWave()}} method can be used to set a custom waveform, which results in this attribute being set to "{{OscillatorType/custom}}". The default value is "{{OscillatorType/sine}}". When this attribute is set, the phase of the oscillator MUST be conserved.

Methods

: setPeriodicWave(periodicWave) :: Sets an arbitrary custom periodic waveform given a {{PeriodicWave}}.
			periodicWave: custom waveform to be used by the oscillator
		
Return type: {{undefined}}

{{OscillatorOptions}}

This specifies the options to be used when constructing an {{OscillatorNode}}. All of the members are optional; if not specified, the normal default values are used for constructing the oscillator.
dictionary OscillatorOptions : AudioNodeOptions {
	OscillatorType type = "sine";
	float frequency = 440;
	float detune = 0;
	PeriodicWave periodicWave;
};
Dictionary {{OscillatorOptions}} Members
: detune :: The initial detune value for the {{OscillatorNode}}. : frequency :: The initial frequency for the {{OscillatorNode}}. : periodicWave :: The {{PeriodicWave}} for the {{OscillatorNode}}. If this is specified, then any valid value for {{OscillatorOptions/type}} is ignored; it is treated as if "{{OscillatorType/custom}}" were specified. : type :: The type of oscillator to be constructed. If this is set to "custom" without also specifying a {{OscillatorOptions/periodicWave}}, then an {{InvalidStateError}} exception MUST be thrown. If {{OscillatorOptions/periodicWave}} is specified, then any valid value for {{OscillatorOptions/type}} is ignored; it is treated as if it were set to "custom".

Basic Waveform Phase

The idealized mathematical waveforms for the various oscillator types are defined below. In summary, all waveforms are defined mathematically to be an odd function with a positive slope at time 0. The actual waveforms produced by the oscillator may differ to prevent aliasing affects. The oscillator MUST produce the same result as if a {{PeriodicWave}}, with the appropriate Fourier series and with {{PeriodicWaveConstraints/disableNormalization}} set to false, were used to create these basic waveforms. : "{{OscillatorType/sine}}" :: The waveform for sine oscillator is:
	$$
		x(t) = \sin t
	$$
	
: "{{OscillatorType/square}}" :: The waveform for the square wave oscillator is:
	$$
		x(t) = \begin{cases}
					 1 & \mbox{for } 0≤ t < \pi \\
					 -1 & \mbox{for } -\pi < t < 0.
					 \end{cases}
	$$
	
This is extended to all \(t\) by using the fact that the waveform is an odd function with period \(2\pi\). : "{{OscillatorType/sawtooth}}" :: The waveform for the sawtooth oscillator is the ramp:
	$$
		x(t) = \frac{t}{\pi} \mbox{ for } -\pi < t ≤ \pi;
	$$
	
This is extended to all \(t\) by using the fact that the waveform is an odd function with period \(2\pi\). : "{{OscillatorType/triangle}}" :: The waveform for the triangle oscillator is:
	$$
		x(t) = \begin{cases}
						 \frac{2}{\pi} t & \mbox{for } 0 ≤ t ≤ \frac{\pi}{2} \\
						 1-\frac{2}{\pi} \left(t-\frac{\pi}{2}\right) & \mbox{for }
						 \frac{\pi}{2} < t ≤ \pi.
					 \end{cases}
	$$
	
This is extended to all \(t\) by using the fact that the waveform is an odd function with period \(2\pi\).

The {{PannerNode}} Interface

This interface represents a processing node which positions / spatializes an incoming audio stream in three-dimensional space. The spatialization is in relation to the {{BaseAudioContext}}'s {{AudioListener}} ({{BaseAudioContext/listener}} attribute).
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-notes: Has channelCount constraints
	cc-mode: clamped-max
	cc-mode-notes: Has channelCountMode constraints
	cc-interp: speakers
	tail-time: Maybe
	tail-time-notes:  If the {{PannerNode/panningModel}} is set to "{{PanningModelType/HRTF}}", the node will produce non-silent output for silent input due to the inherent processing for head responses. Otherwise the tail-time is zero.
The input of this node is either mono (1 channel) or stereo (2 channels) and cannot be increased. Connections from nodes with fewer or more channels will be up-mixed or down-mixed appropriately. If the node is [=actively processing=], the output of this node is hard-coded to stereo (2 channels) and cannot be configured. If the node is not [=actively processing=], then the output is a single channel of silence. The {{PanningModelType}} enum determines which spatialization algorithm will be used to position the audio in 3D space. The default is "{{PanningModelType/equalpower}}".
enum PanningModelType {
		"equalpower",
		"HRTF"
};
Enumeration description
"equalpower" A simple and efficient spatialization algorithm using equal-power panning. Note: When this panning model is used, all the {{AudioParam}}s used to compute the output of this node are a-rate.
"HRTF" A higher quality spatialization algorithm using a convolution with measured impulse responses from human subjects. This panning method renders stereo output. Note:When this panning model is used, all the {{AudioParam}}s used to compute the output of this node are k-rate.
The effective automation rate for an {{AudioParam}} of a {{PannerNode}} is determined by the {{PannerNode/panningModel}} and {{AudioParam/automationRate}} of the {{AudioParam}}. If the {{PannerNode/panningModel}} is "{{PanningModelType/HRTF}}", the [=effective automation rate=] is "{{AutomationRate/k-rate}}", independent of the setting of the {{AudioParam/automationRate}}. Otherwise the [=effective automation rate=] is the value of {{AudioParam/automationRate}}. The {{DistanceModelType}} enum determines which algorithm will be used to reduce the volume of an audio source as it moves away from the listener. The default is "{{DistanceModelType/inverse}}". In the description of each distance model below, let \(d\) be the distance between the listener and the panner; \(d_{ref}\) be the value of the {{PannerNode/refDistance}} attribute; \(d_{max}\) be the value of the {{PannerNode/maxDistance}} attribute; and \(f\) be the value of the {{PannerNode/rolloffFactor}} attribute.
enum DistanceModelType {
	"linear",
	"inverse",
	"exponential"
};
Enumeration description
"linear" A linear distance model which calculates distanceGain according to:
				$$
					1 - f\ \frac{\max\left[\min\left(d, d'_{max}\right), d'_{ref}\right] - d'_{ref}}{d'_{max} - d'_{ref}}
				$$
				
where \(d'_{ref} = \min\left(d_{ref}, d_{max}\right)\) and \(d'_{max} = \max\left(d_{ref}, d_{max}\right)\). In the case where \(d'_{ref} = d'_{max}\), the value of the linear model is taken to be \(1-f\). Note that \(d\) is clamped to the interval \(\left[d'_{ref},\, d'_{max}\right]\).
"inverse" An inverse distance model which calculates distanceGain according to:
				$$
					\frac{d_{ref}}{d_{ref} + f\ \left[\max\left(d, d_{ref}\right) - d_{ref}\right]}
				$$
				
That is, \(d\) is clamped to the interval \(\left[d_{ref},\, \infty\right)\). If \(d_{ref} = 0\), the value of the inverse model is taken to be 0, independent of the value of \(d\) and \(f\).
"exponential" An exponential distance model which calculates distanceGain according to:
				$$
					\left[\frac{\max\left(d, d_{ref}\right)}{d_{ref}}\right]^{-f}
				$$
				
That is, \(d\) is clamped to the interval \(\left[d_{ref},\, \infty\right)\). If \(d_{ref} = 0\), the value of the exponential model is taken to be 0, independent of \(d\) and \(f\).
[Exposed=Window]
interface PannerNode : AudioNode {
	constructor (BaseAudioContext context, optional PannerOptions options = {});
	attribute PanningModelType panningModel;
	readonly attribute AudioParam positionX;
	readonly attribute AudioParam positionY;
	readonly attribute AudioParam positionZ;
	readonly attribute AudioParam orientationX;
	readonly attribute AudioParam orientationY;
	readonly attribute AudioParam orientationZ;
	attribute DistanceModelType distanceModel;
	attribute double refDistance;
	attribute double maxDistance;
	attribute double rolloffFactor;
	attribute double coneInnerAngle;
	attribute double coneOuterAngle;
	attribute double coneOuterGain;
	undefined setPosition (float x, float y, float z);
	undefined setOrientation (float x, float y, float z);
};

Constructors

: PannerNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{PannerNode}} will be associated with.
			options: Optional initial parameter value for this {{PannerNode}}.
		

Attributes

: coneInnerAngle :: A parameter for directional audio sources that is an angle, in degrees, inside of which there will be no volume reduction. The default value is 360. The behavior is undefined if the angle is outside the interval [0, 360]. : coneOuterAngle :: A parameter for directional audio sources that is an angle, in degrees, outside of which the volume will be reduced to a constant value of {{PannerNode/coneOuterGain}}. The default value is 360. The behavior is undefined if the angle is outside the interval [0, 360]. : coneOuterGain :: A parameter for directional audio sources that is the gain outside of the {{PannerNode/coneOuterAngle}}. The default value is 0. It is a linear value (not dB) in the range [0, 1]. An {{InvalidStateError}} MUST be thrown if the parameter is outside this range. : distanceModel :: Specifies the distance model used by this {{PannerNode}}. Defaults to "{{inverse}}". : maxDistance :: The maximum distance between source and listener, after which the volume will not be reduced any further. The default value is 10000. A {{RangeError}} exception MUST be thrown if this is set to a non-positive value. : orientationX :: Describes the \(x\)-component of the vector of the direction the audio source is pointing in 3D Cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 1
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: orientationY :: Describes the \(y\)-component of the vector of the direction the audio source is pointing in 3D cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: orientationZ :: Describes the \(z\)-component of the vector of the direction the audio source is pointing in 3D cartesian coordinate space.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: panningModel :: Specifies the panning model used by this {{PannerNode}}. Defaults to "{{PanningModelType/equalpower}}". : positionX :: Sets the \(x\)-coordinate position of the audio source in a 3D Cartesian system.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: positionY :: Sets the \(y\)-coordinate position of the audio source in a 3D Cartesian system.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: positionZ :: Sets the \(z\)-coordinate position of the audio source in a 3D Cartesian system.
		path: audioparam.include
		macros:
			default: 0
			min: most-negative-single-float
			min-notes: Approximately -3.4028235e38
			max: most-positive-single-float
			max-notes: Approximately 3.4028235e38
			rate: "{{AutomationRate/a-rate}}"
			rate-notes: Has [=automation rate constraints=]
		
: refDistance :: A reference distance for reducing volume as source moves further from the listener. For distances less than this, the volume is not reduced. The default value is 1. A {{RangeError}} exception MUST be thrown if this is set to a negative value. : rolloffFactor :: Describes how quickly the volume is reduced as source moves away from listener. The default value is 1. A {{RangeError}} exception MUST be thrown if this is set to a negative value. The nominal range for the {{PannerNode/rolloffFactor}} specifies the minimum and maximum values the rolloffFactor can have. Values outside the range are clamped to lie within this range. The nominal range depends on the {{PannerNode/distanceModel}} as follows:
: "{{linear}}" :: The nominal range is \([0, 1]\). : "{{inverse}}" :: The nominal range is \([0, \infty)\). : "{{exponential}}" :: The nominal range is \([0, \infty)\).
Note that the clamping happens as part of the processing of the distance computation. The attribute reflects the value that was set and is not modified.

Methods

: setOrientation(x, y, z) :: This method is DEPRECATED. It is equivalent to setting {{PannerNode/orientationX}}.{{AudioParam/value}}, {{PannerNode/orientationY}}.{{AudioParam/value}}, and {{PannerNode/orientationZ}}.{{AudioParam/value}} attribute directly, with the x, y and z parameters, respectively. Consequently, if any of the {{PannerNode/orientationX}}, {{PannerNode/orientationY}}, and {{PannerNode/orientationZ}} {{AudioParam}}s have an automation curve set using {{AudioParam/setValueCurveAtTime()}} at the time this method is called, a {{NotSupportedError}} MUST be thrown. Describes which direction the audio source is pointing in the 3D cartesian coordinate space. Depending on how directional the sound is (controlled by the cone attributes), a sound pointing away from the listener can be very quiet or completely silent. The x, y, z parameters represent a direction vector in 3D space. The default value is (1,0,0).
			x:
			y:
			z:
		
Return type: {{undefined}}
: setPosition(x, y, z) :: This method is DEPRECATED. It is equivalent to setting {{PannerNode/positionX}}.{{AudioParam/value}}, {{PannerNode/positionY}}.{{AudioParam/value}}, and {{PannerNode/positionZ}}.{{AudioParam/value}} attribute directly with the x, y and z parameters, respectively. Consequently, if any of the {{PannerNode/positionX}}, {{PannerNode/positionY}}, and {{PannerNode/positionZ}} {{AudioParam}}s have an automation curve set using {{AudioParam/setValueCurveAtTime()}} at the time this method is called, a {{NotSupportedError}} MUST be thrown. Sets the position of the audio source relative to the {{BaseAudioContext/listener}} attribute. A 3D cartesian coordinate system is used. The x, y, z parameters represent the coordinates in 3D space. The default value is (0,0,0).
			x:
			y:
			z:
		
Return type: {{undefined}}

{{PannerOptions}}

This specifies options for constructing a {{PannerNode}}. All members are optional; if not specified, the normal default is used in constructing the node.
dictionary PannerOptions : AudioNodeOptions {
	PanningModelType panningModel = "equalpower";
	DistanceModelType distanceModel = "inverse";
	float positionX = 0;
	float positionY = 0;
	float positionZ = 0;
	float orientationX = 1;
	float orientationY = 0;
	float orientationZ = 0;
	double refDistance = 1;
	double maxDistance = 10000;
	double rolloffFactor = 1;
	double coneInnerAngle = 360;
	double coneOuterAngle = 360;
	double coneOuterGain = 0;
};
Dictionary {{PannerOptions}} Members
: coneInnerAngle :: The initial value for the {{PannerNode/coneInnerAngle}} attribute of the node. : coneOuterAngle :: The initial value for the {{PannerNode/coneOuterAngle}} attribute of the node. : coneOuterGain :: The initial value for the {{PannerNode/coneOuterGain}} attribute of the node. : distanceModel :: The distance model to use for the node. : maxDistance :: The initial value for the {{PannerNode/maxDistance}} attribute of the node. : orientationX :: The initial \(x\)-component value for the {{PannerNode/orientationX}} AudioParam. : orientationY :: The initial \(y\)-component value for the {{PannerNode/orientationY}} AudioParam. : orientationZ :: The initial \(z\)-component value for the {{PannerNode/orientationZ}} AudioParam. : panningModel :: The panning model to use for the node. : positionX :: The initial \(x\)-coordinate value for the {{PannerNode/positionX}} AudioParam. : positionY :: The initial \(y\)-coordinate value for the {{PannerNode/positionY}} AudioParam. : positionZ :: The initial \(z\)-coordinate value for the {{PannerNode/positionZ}} AudioParam. : refDistance :: The initial value for the {{PannerNode/refDistance}} attribute of the node. : rolloffFactor :: The initial value for the {{PannerNode/rolloffFactor}} attribute of the node.

Channel Limitations

The set of channel limitations for {{StereoPannerNode}} also apply to {{PannerNode}}.

The {{PeriodicWave}} Interface

{{PeriodicWave}} represents an arbitrary periodic waveform to be used with an {{OscillatorNode}}. A conforming implementation MUST support {{PeriodicWave}} up to at least 8192 elements.
[Exposed=Window]
interface PeriodicWave {
	constructor (BaseAudioContext context, optional PeriodicWaveOptions options = {});
};

Constructors

: PeriodicWave(context, options) ::
1. Let p be a new {{PeriodicWave}} object. Let \[[real]] and \[[imag]] be two internal slots of type {{Float32Array}}, and let \[[normalize]] be an internal slot. 1. Process {{PeriodicWave/constructor(context, options)/options!!argument}} according to one of the following cases: 1. If both {{PeriodicWaveOptions/real|options.real}} and {{PeriodicWaveOptions/imag|options.imag}} are present 1. If the lengths of {{PeriodicWaveOptions/real|options.real}} and {{PeriodicWaveOptions/imag|options.imag}} are different or if either length is less than 2, throw an {{IndexSizeError}} and abort this algorithm. 1. Set {{[[real]]}} and {{[[imag]]}} to new arrays with the same length as {{PeriodicWaveOptions/real|options.real}}. 1. Copy all elements from {{PeriodicWaveOptions/real|options.real}} to {{[[real]]}} and {{PeriodicWaveOptions/imag|options.imag}} to {{[[imag]]}}. 1. If only {{PeriodicWaveOptions/real|options.real}} is present 1. If length of {{PeriodicWaveOptions/real|options.real}} is less than 2, throw an {{IndexSizeError}} and abort this algorithm. 1. Set {{[[real]]}} and {{[[imag]]}} to arrays with the same length as {{PeriodicWaveOptions/real|options.real}}. 1. Copy {{PeriodicWaveOptions/real|options.real}} to {{[[real]]}} and set {{[[imag]]}} to all zeros. 1. If only {{PeriodicWaveOptions/imag|options.imag}} is present 1. If length of {{PeriodicWaveOptions/imag|options.imag}} is less than 2, throw an {{IndexSizeError}} and abort this algorithm. 1. Set {{[[real]]}} and {{[[imag]]}} to arrays with the same length as {{PeriodicWaveOptions/real|options.imag}}. 1. Copy {{PeriodicWaveOptions/imag|options.imag}} to {{[[imag]]}} and set {{[[real]]}} to all zeros. 1. Otherwise 1. Set {{[[real]]}} and {{[[imag]]}} to zero-filled arrays of length 2. 1. Set element at index 1 of {{[[imag]]}} to 1. Note: When setting this {{PeriodicWave}} on an {{OscillatorNode}}, this is equivalent to using the built-in type "{{OscillatorType/sine}}". 1. Set element at index 0 of both {{[[real]]}} and {{[[imag]]}} to 0. (This sets the DC component to 0.) 5. Initialize {{[[normalize]]}} to the inverse of the {{PeriodicWaveConstraints/disableNormalization}} attribute of the {{PeriodicWaveConstraints}} on the {{PeriodicWaveOptions}}. 6. Return p.
			context: The {{BaseAudioContext}} this new {{PeriodicWave}} will be associated with. Unlike {{AudioBuffer}}, {{PeriodicWave}}s can't be shared accross {{AudioContext}}s or {{OfflineAudioContext}}s. It is associated with a particular {{BaseAudioContext}}.
			options: Optional initial parameter value for this {{PeriodicWave}}.
		

{{PeriodicWaveConstraints}}

The {{PeriodicWaveConstraints}} dictionary is used to specify how the waveform is [[#waveform-normalization|normalized]].
dictionary PeriodicWaveConstraints {
	boolean disableNormalization = false;
};
Dictionary {{PeriodicWaveConstraints}} Members
: disableNormalization :: Controls whether the periodic wave is normalized or not. If `true`, the waveform is not normalized; otherwise, the waveform is normalized.

{{PeriodicWaveOptions}}

The {{PeriodicWaveOptions}} dictionary is used to specify how the waveform is constructed. If only one of {{PeriodicWaveOptions/real}} or {{PeriodicWaveOptions/imag}} is specified. The other is treated as if it were an array of all zeroes of the same length, as specified below in description of the dictionary members. If neither is given, a {{PeriodicWave}} is created that MUST be equivalent to an {{OscillatorNode}} with {{OscillatorNode/type}} "{{OscillatorType/sine}}". If both are given, the sequences must have the same length; otherwise an error of type {{NotSupportedError}} MUST be thrown. dictionary PeriodicWaveOptions : PeriodicWaveConstraints { sequence<float> real; sequence<float> imag; };
Dictionary {{PeriodicWaveOptions}} Members
: imag :: The {{PeriodicWaveOptions/imag}} parameter represents an array of sine terms. The first element (index 0) does not exist in the Fourier series. The second element (index 1) represents the fundamental frequency. The third represents the first overtone and so on. : real :: The {{PeriodicWaveOptions/real}} parameter represents an array of cosine terms. The first element (index 0) is the DC-offset of the periodic waveform. The second element (index 1) represents the fundmental frequency. The third represents the first overtone and so on.

Waveform Generation

The {{BaseAudioContext/createPeriodicWave()}} method takes two arrays to specify the Fourier coefficients of the {{PeriodicWave}}. Let \(a\) and \(b\) represent the {{[[real]]}} and {{[[imag]]}} arrays of length \(L\), respectively. Then the basic time-domain waveform, \(x(t)\), can be computed using:
$$
	x(t) = \sum_{k=1}^{L-1} \left[a[k]\cos2\pi k t + b[k]\sin2\pi k t\right]
$$
This is the basic (unnormalized) waveform.

Waveform Normalization

If the internal slot {{[[normalize]]}} of this {{PeriodicWave}} is `true` (the default), the waveform defined in the previous section is normalized so that the maximum value is 1. The normalization is done as follows. Let
$$
	\tilde{x}(n) = \sum_{k=1}^{L-1} \left(a[k]\cos\frac{2\pi k n}{N} + b[k]\sin\frac{2\pi k n}{N}\right)
$$
where \(N\) is a power of two. (Note: \(\tilde{x}(n)\) can conveniently be computed using an inverse FFT.) The fixed normalization factor \(f\) is computed as follows.
$$
	f = \max_{n = 0, \ldots, N - 1} |\tilde{x}(n)|
$$
Thus, the actual normalized waveform \(\hat{x}(n)\) is:
$$
	\hat{x}(n) = \frac{\tilde{x}(n)}{f}
$$
This fixed normalization factor MUST be applied to all generated waveforms.

Oscillator Coefficients

The builtin oscillator types are created using {{PeriodicWave}} objects. For completeness the coefficients for the {{PeriodicWave}} for each of the builtin oscillator types is given here. This is useful if a builtin type is desired but without the default normalization. In the following descriptions, let \(a\) be the array of real coefficients and \(b\) be the array of imaginary coefficients for {{BaseAudioContext/createPeriodicWave()}}. In all cases \(a[n] = 0\) for all \(n\) because the waveforms are odd functions. Also, \(b[0] = 0\) in all cases. Hence, only \(b[n]\) for \(n \ge 1\) is specified below.
: "{{sine}}" ::
		$$
			b[n] = \begin{cases}
							 1 & \mbox{for } n = 1 \\
							 0 & \mbox{otherwise}
						 \end{cases}
		$$
		
: "{{square}}" ::
		$$
			b[n] = \frac{2}{n\pi}\left[1 - (-1)^n\right]
		$$
		
: "{{sawtooth}}" ::
		$$
			b[n] = (-1)^{n+1} \dfrac{2}{n\pi}
		$$
		
: "{{triangle}}" ::
		$$
			b[n] = \frac{8\sin\dfrac{n\pi}{2}}{(\pi n)^2}
		$$
		

The {{ScriptProcessorNode}} Interface - DEPRECATED

This interface is an {{AudioNode}} which can generate, process, or analyse audio directly using a script. This node type is deprecated, to be replaced by the {{AudioWorkletNode}}; this text is only here for informative purposes until implementations remove this node type.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: {{BaseAudioContext/createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)/numberOfInputChannels}}
	cc-notes: This is the number of channels specified when constructing this node. There are channelCount constraints.
	cc-mode: explicit
	cc-mode-notes:  Has channelCountMode constraints
	cc-interp: speakers
	tail-time: No
The {{ScriptProcessorNode}} is constructed with a {{BaseAudioContext/createScriptProcessor(bufferSize, numberOfInputChannels, numberOfOutputChannels)/bufferSize}} which MUST be one of the following values: 256, 512, 1024, 2048, 4096, 8192, 16384. This value controls how frequently the {{ScriptProcessorNode/onaudioprocess}} event is dispatched and how many sample-frames need to be processed each call. {{ScriptProcessorNode/onaudioprocess}} events are only dispatched if the {{ScriptProcessorNode}} has at least one input or one output connected. Lower numbers for {{ScriptProcessorNode/bufferSize}} will result in a lower (better) latency. Higher numbers will be necessary to avoid audio breakup and glitches. This value will be picked by the implementation if the bufferSize argument to {{createScriptProcessor()}} is not passed in, or is set to 0. {{numberOfInputChannels}} and {{numberOfOutputChannels}} determine the number of input and output channels. It is invalid for both {{numberOfInputChannels}} and {{numberOfOutputChannels}} to be zero.
[Exposed=Window]
interface ScriptProcessorNode : AudioNode {
	attribute EventHandler onaudioprocess;
	readonly attribute long bufferSize;
};

Attributes

: bufferSize :: The size of the buffer (in sample-frames) which needs to be processed each time {{ScriptProcessorNode/onaudioprocess}} is called. Legal values are (256, 512, 1024, 2048, 4096, 8192, 16384). : onaudioprocess :: A property used to set the EventHandler (described in HTML[[!HTML]]) for the {{ScriptProcessorNode/onaudioprocess}} event that is dispatched to {{ScriptProcessorNode}} node types. An event of type {{AudioProcessingEvent}} will be dispatched to the event handler.

The {{StereoPannerNode}} Interface

This interface represents a processing node which positions an incoming audio stream in a stereo image using a low-cost panning algorithm. This panning effect is common in positioning audio components in a stereo stream.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-notes: Has channelCount constraints
	cc-mode: clamped-max
	cc-mode-notes: Has channelCountMode constraints
	cc-interp: speakers
	tail-time: No
The input of this node is stereo (2 channels) and cannot be increased. Connections from nodes with fewer or more channels will be up-mixed or down-mixed appropriately. The output of this node is hard-coded to stereo (2 channels) and cannot be configured.
[Exposed=Window]
interface StereoPannerNode : AudioNode {
	constructor (BaseAudioContext context, optional StereoPannerOptions options = {});
	readonly attribute AudioParam pan;
};

Constructors

: StereoPannerNode(context, options) ::
			path: audionode-init.include
		
			context: The {{BaseAudioContext}} this new {{StereoPannerNode}} will be associated with.
			options: Optional initial parameter value for this {{StereoPannerNode}}.
		

Attributes

: pan :: The position of the input in the output's stereo image. -1 represents full left, +1 represents full right.
		path: audioparam.include
		macros:
			default: 0
			min: -1
			max: 1
			rate: "{{AutomationRate/a-rate}}"
		

{{StereoPannerOptions}}

This specifies the options to use in constructing a {{StereoPannerNode}}. All members are optional; if not specified, the normal default is used in constructing the node.
dictionary StereoPannerOptions : AudioNodeOptions {
	float pan = 0;
};
Dictionary {{StereoPannerOptions}} Members
: pan :: The initial value for the {{StereoPannerNode/pan}} AudioParam.

Channel Limitations

Because its processing is constrained by the above definitions, {{StereoPannerNode}} is limited to mixing no more than 2 channels of audio, and producing exactly 2 channels. It is possible to use a {{ChannelSplitterNode}}, intermediate processing by a subgraph of {{GainNode}}s and/or other nodes, and recombination via a {{ChannelMergerNode}} to realize arbitrary approaches to panning and mixing.

The {{WaveShaperNode}} Interface

{{WaveShaperNode}} is an {{AudioNode}} processor implementing non-linear distortion effects. Non-linear waveshaping distortion is commonly used for both subtle non-linear warming, or more obvious distortion effects. Arbitrary non-linear shaping curves may be specified.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: Maybe
	tail-time-notes: There is a tail-time only if the {{WaveShaperNode/oversample}} attribute is set to "{{OverSampleType/2x}}" or "{{OverSampleType/4x}}". The actual duration of this tail-time depends on the implementation.
The number of channels of the output always equals the number of channels of the input.
enum OverSampleType {
	"none",
	"2x",
	"4x"
};
Enumeration description
"none" Don't oversample
"2x" Oversample two times
"4x" Oversample four times
[Exposed=Window]
interface WaveShaperNode : AudioNode {
	constructor (BaseAudioContext context, optional WaveShaperOptions options = {});
	attribute Float32Array? curve;
	attribute OverSampleType oversample;
};

Constructors

: WaveShaperNode(context, options) ::
			path: audionode-init.include
		
Also, let [[curve set]] be an internal slot of this {{WaveShaperNode}}. Initialize this slot to false. If {{WaveShaperNode/constructor(context, options)/options}} is given and specifies a {{WaveShaperOptions/curve}}, set {{[[curve set]]}} to true.
			context: The {{BaseAudioContext}} this new {{WaveShaperNode}} will be associated with.
			options: Optional initial parameter value for this {{WaveShaperNode}}.
		

Attributes

: curve :: The shaping curve used for the waveshaping effect. The input signal is nominally within the range [-1, 1]. Each input sample within this range will index into the shaping curve, with a signal level of zero corresponding to the center value of the curve array if there are an odd number of entries, or interpolated between the two centermost values if there are an even number of entries in the array. Any sample value less than -1 will correspond to the first value in the curve array. Any sample value greater than +1 will correspond to the last value in the curve array. The implementation MUST perform linear interpolation between adjacent points in the curve. Initially the curve attribute is null, which means that the WaveShaperNode will pass its input to its output without modification. Values of the curve are spread with equal spacing in the [-1; 1] range. This means that a {{WaveShaperNode/curve}} with a even number of value will not have a value for a signal at zero, and a {{WaveShaperNode/curve}} with an odd number of value will have a value for a signal at zero. The output is determined by the following algorithm.
1. Let \(x\) be the input sample, \(y\) be the corresponding output of the node, \(c_k\) be the \(k\)'th element of the {{WaveShaperNode/curve}}, and \(N\) be the length of the {{WaveShaperNode/curve}}. 1. Let
				$$
					\begin{align*}
					v &= \frac{N-1}{2}(x + 1) \\
					k &= \lfloor v \rfloor \\
					f &= v - k
					\end{align*}
				$$
				
1. Then
				$$
					\begin{align*}
					y &=
						\begin{cases}
						c_0 & v \lt 0 \\
						c_{N-1} & v \ge N - 1 \\
						(1-f)\,c_k + fc_{k+1} & \mathrm{otherwise}
						\end{cases}
					\end{align*}
				$$
				
A {{InvalidStateError}} MUST be thrown if this attribute is set with a {{Float32Array}} that has a length less than 2. When this attribute is set, an internal copy of the curve is created by the {{WaveShaperNode}}. Subsequent modifications of the contents of the array used to set the attribute therefore have no effect.
To set the {{WaveShaperNode/curve}} attribute, execute these steps: 1. Let new curve be a {{Float32Array}} to be assigned to {{WaveShaperNode/curve}} or null. . 2. If new curve is not null and {{WaveShaperNode/[[curve set]]}} is true, throw an {{InvalidStateError}} and abort these steps. 3. If new curve is not null, set {{WaveShaperNode/[[curve set]]}} to true. 4. Assign new curve to the {{WaveShaperNode/curve}} attribute.
Note: The use of a curve that produces a non-zero output value for zero input value will cause this node to produce a DC signal even if there are no inputs connected to this node. This will persist until the node is disconnected from downstream nodes. : oversample :: Specifies what type of oversampling (if any) should be used when applying the shaping curve. The default value is "{{none}}", meaning the curve will be applied directly to the input samples. A value of "{{2x}}" or "{{4x}}" can improve the quality of the processing by avoiding some aliasing, with the "{{4x}}" value yielding the highest quality. For some applications, it's better to use no oversampling in order to get a very precise shaping curve.
A value of "{{2x}}" or "{{4x}}" means that the following steps MUST be performed: 1. Up-sample the input samples to 2x or 4x the sample-rate of the {{AudioContext}}. Thus for each render quantum, generate 256 (for 2x) or 512 (for 4x) samples. 2. Apply the shaping curve. 3. Down-sample the result back to the sample-rate of the {{AudioContext}}. Thus taking the 256 (or 512) processed samples, generating 128 as the final result.
The exact up-sampling and down-sampling filters are not specified, and can be tuned for sound quality (low aliasing, etc.), low latency, or performance. Note: Use of oversampling introduces some degree of audio processing latency due to the up-sampling and down-sampling filters. The amount of this latency can vary from one implementation to another.

{{WaveShaperOptions}}

This specifies the options for constructing a {{WaveShaperNode}}. All members are optional; if not specified, the normal default is used in constructing the node. dictionary WaveShaperOptions : AudioNodeOptions { sequence<float> curve; OverSampleType oversample = "none"; };
Dictionary {{WaveShaperOptions}} Members
: curve :: The shaping curve for the waveshaping effect. : oversample :: The type of oversampling to use for the shaping curve.

The {{AudioWorklet}} Interface

[Exposed=Window, SecureContext]
interface AudioWorklet : Worklet {
};

Concepts

The {{AudioWorklet}} object allows developers to supply scripts (such as JavaScript or WebAssembly code) to process audio on the rendering thread, supporting custom {{AudioNode}}s. This processing mechanism ensures synchronous execution of the script code with other built-in {{AudioNode}}s in the audio graph. An associated pair of objects MUST be defined in order to realize this mechanism: {{AudioWorkletNode}} and {{AudioWorkletProcessor}}. The former represents the interface for the main global scope similar to other {{AudioNode}} objects, and the latter implements the internal audio processing within a special scope named {{AudioWorkletGlobalScope}}.
AudioWorklet concept
{{AudioWorkletNode}} and {{AudioWorkletProcessor}}
Each {{BaseAudioContext}} possesses exactly one {{AudioWorklet}}. The {{AudioWorklet}}'s worklet global scope type is {{AudioWorkletGlobalScope}}. The {{AudioWorklet}}'s worklet destination type is "audioworklet". Importing a script via the {{addModule()|addModule(moduleUrl)}} method registers class definitions of {{AudioWorkletProcessor}} under the {{AudioWorkletGlobalScope}}. There are two internal storage areas for the imported class constructor and the active instances created from the constructor. {{AudioWorklet}} has one internal slot: - node name to parameter descriptor map which is a map containing an identical set of string keys from node name to processor constructor map that are associated with the matching parameterDescriptors values. This internal storage is populated as a consequence of calling the {{registerProcessor()}} method in the rendering thread. The population is guaranteed to complete prior to the resolution of the promise returned by {{addModule()}} on a context's {{BaseAudioContext/audioWorklet}}.
// bypass-processor.js script file, runs on AudioWorkletGlobalScope
class BypassProcessor extends AudioWorkletProcessor {
	process (inputs, outputs) {
		// Single input, single channel.
		const input = inputs[0];
		const output = outputs[0];
		output[0].set(input[0]);

		// Process only while there are active inputs.
		return false;
	}
};

registerProcessor('bypass-processor', BypassProcessor);
// The main global scope
const context = new AudioContext();
context.audioWorklet.addModule('bypass-processor.js').then(() => {
	const bypassNode = new AudioWorkletNode(context, 'bypass-processor');
});
At the instantiation of {{AudioWorkletNode}} in the main global scope, the counterpart {{AudioWorkletProcessor}} will also be created in {{AudioWorkletGlobalScope}}. These two objects communicate via the asynchronous message passing described in [[#processing-model]].

The {{AudioWorkletGlobalScope}} Interface

This special execution context is designed to enable the generation, processing, and analysis of audio data directly using a script in the audio rendering thread. The user-supplied script code is evaluated in this scope to define one or more {{AudioWorkletProcessor}} subclasses, which in turn are used to instantiate {{AudioWorkletProcessor}}s, in a 1:1 association with {{AudioWorkletNode}}s in the main scope. Exactly one {{AudioWorkletGlobalScope}} exists for each {{AudioContext}} that contains one or more {{AudioWorkletNode}}s. The running of imported scripts is performed by the UA as defined in [[!HTML]]. Overriding the default specified in [[!HTML]], {{AudioWorkletGlobalScope}}s must not be [=terminate a worklet global scope|terminated=] arbitrarily by the user agent. An {{AudioWorkletGlobalScope}} has the following internal slots: - node name to processor constructor map which is a map that stores key-value pairs of processor name{{AudioWorkletProcessorConstructor}} instance. Initially this map is empty and populated when the {{registerProcessor()}} method is called. - pending processor construction data stores temporary data generated by the {{AudioWorkletNode}} constructor for the instantiation of the corresponding {{AudioWorkletProcessor}}. The [=pending processor construction data=] contains the following items: - node reference which is initially empty. This storage is for an {{AudioWorkletNode}} reference that is transferred from the {{AudioWorkletNode}} constructor. - transferred port which is initially empty. This storage is for a deserialized {{MessagePort}} that is transferred from the {{AudioWorkletNode}} constructor. Note: The {{AudioWorkletGlobalScope}} may also contain any other data and code to be shared by these instances. As an example, multiple processors might share an ArrayBuffer defining a wavetable or an impulse response. Note: An {{AudioWorkletGlobalScope}} is associated with a single {{BaseAudioContext}}, and with a single audio rendering thread for that context. This prevents data races from occurring in global scope code running within concurrent threads.
callback AudioWorkletProcessorConstructor = AudioWorkletProcessor (object options);

[Global=(Worklet, AudioWorklet), Exposed=AudioWorklet]
interface AudioWorkletGlobalScope : WorkletGlobalScope {
	undefined registerProcessor (DOMString name,
	                             AudioWorkletProcessorConstructor processorCtor);
	readonly attribute unsigned long long currentFrame;
	readonly attribute double currentTime;
	readonly attribute float sampleRate;
};
Attributes
: currentFrame :: The current frame of the block of audio being processed. This must be equal to the value of the {{[[current frame]]}} internal slot of the {{BaseAudioContext}}. : currentTime :: The context time of the block of audio being processed. By definition this will be equal to the value of {{BaseAudioContext}}'s {{BaseAudioContext/currentTime}} attribute that was most recently observable in the control thread. : sampleRate :: The sample rate of the associated {{BaseAudioContext}}.
Methods
: registerProcessor(name, processorCtor) :: Registers a class constructor derived from {{AudioWorkletProcessor}}.
When the {{AudioWorkletGlobalScope/registerProcessor(name, processorCtor)}} method is called, perform the following steps. If an exception is thrown in any step, abort the remaining steps. 1. If name is an empty string, throw a {{NotSupportedError}}. 1. If name already exists as a key in the node name to processor constructor map, throw a {{NotSupportedError}}. 1. If the result of IsConstructor(argument=processorCtor) is false, throw a {{TypeError}} . 1. Let prototype be the result of Get(O=processorCtor, P="prototype"). 1. If the result of Type(argument=prototype) is not Object, throw a {{TypeError}} . 1. Let parameterDescriptorsValue be the result of Get(O=processorCtor, P="parameterDescriptors"). 1. If parameterDescriptorsValue is not {{undefined}}, execute the following steps: 1. Let parameterDescriptorSequence be the result of the conversion from parameterDescriptorsValue to an IDL value of type sequence<AudioParamDescriptor>. 1. Let paramNames be an empty Array. 1.
For each descriptor of parameterDescriptorSequence: 1. Let paramName be the value of the member {{AudioParamDescriptor/name}} in descriptor. Throw a {{NotSupportedError}} if paramNames already contains paramName value. 1. Append paramName to the paramNames array. 1. Let defaultValue be the value of the member {{AudioParamDescriptor/defaultValue}} in descriptor. 1. Let minValue be the value of the member {{AudioParamDescriptor/minValue}} in descriptor. 1. Let maxValue be the value of the member {{AudioParamDescriptor/maxValue}} in descriptor. 1. If the expresstion minValue <= defaultValue <= maxValue is false, throw an {{InvalidStateError}}. 1. Append the key-value pair nameprocessorCtor to node name to processor constructor map of the associated {{AudioWorkletGlobalScope}}. 1. queue a media element task to append the key-value pair |name| → |parameterDescriptorSequence| to the node name to parameter descriptor map of the associated {{BaseAudioContext}}.
Note: The class constructor should only be looked up once, thus it does not have the opportunity to dynamically change after registration.
			name: A string key that represents a class constructor to be registered. This key is used to look up the constructor of {{AudioWorkletProcessor}} during construction of an {{AudioWorkletNode}}.
			processorCtor: A class constructor extended from {{AudioWorkletProcessor}}.
		
Return type: {{undefined}}
The instantiation of {{AudioWorkletProcessor}}
At the end of the {{AudioWorkletNode}} construction, A [=struct=] named processor construction data will be prepared for cross-thread transfer. This struct contains the following items: - name which is a {{DOMString}} that is to be looked up in the node name to processor constructor map. - node which is a reference to the {{AudioWorkletNode}} created. - options which is a serialized {{AudioWorkletNodeOptions}} given to the {{AudioWorkletNode}}'s {{AudioWorkletNode()|constructor}}. - port which is a serialized {{MessagePort}} paired with the {{AudioWorkletNode}}'s {{AudioWorkletNode/port}}. Upon the arrival of the transferred data on the {{AudioWorkletGlobalScope}}, the rendering thread will invoke the algorithm below:
1. Let constructionData be the [=processor construction data=] transferred from the [=control thread=]. 1. Let processorName, nodeReference and serializedPort be constructionData's [=processor construction data/name=], [=processor construction data/node=], and [=processor construction data/port=] respectively. 1. Let serializedOptions be constructionData's [=processor construction data/options=]. 1. Let deserializedPort be the result of [$StructuredDeserialize$](serializedPort, the current Realm). 1. Let deserializedOptions be the result of [$StructuredDeserialize$](serializedOptions, the current Realm). 1. Let processorCtor be the result of looking up processorName on the {{AudioWorkletGlobalScope}}'s node name to processor constructor map. 1. Store nodeReference and deserializedPort to [=pending processor construction data/node reference=] and [=pending processor construction data/transferred port=] of this {{AudioWorkletGlobalScope}}'s [=pending processor construction data=] respectively. 1. Construct a callback function from |processorCtor| with the argument of |deserializedOptions|. If any exceptions are thrown in the callback, queue a task to the control thread to fire an event named `processorerror` using {{ErrorEvent}} at |nodeReference|. 1. Empty the [=pending processor construction data=] slot.

The {{AudioWorkletNode}} Interface

This interface represents a user-defined {{AudioNode}} which lives on the control thread. The user can create an {{AudioWorkletNode}} from a {{BaseAudioContext}}, and such a node can be connected with other built-in {{AudioNode}}s to form an audio graph.
path: audionode.include
macros:
	noi: 1
	noo: 1
	cc: 2
	cc-mode: max
	cc-interp: speakers
	tail-time: See notes
	tail-time-notes:  Any tail-time is handled by the node itself
Every {{AudioWorkletProcessor}} has an associated active source flag, initially `true`. This flag causes the node to be retained in memory and perform audio processing in the absence of any connected inputs. All tasks posted from an {{AudioWorkletNode}} are posted to the task queue of its associated {{BaseAudioContext}}. [Exposed=Window] interface AudioParamMap { readonly maplike<DOMString, AudioParam>; }; This interface has "entries", "forEach", "get", "has", "keys", "values", @@iterator methods and a "size" getter brought by readonly maplike.
[Exposed=Window, SecureContext]
interface AudioWorkletNode : AudioNode {
	constructor (BaseAudioContext context, DOMString name,
               optional AudioWorkletNodeOptions options = {});
	readonly attribute AudioParamMap parameters;
	readonly attribute MessagePort port;
	attribute EventHandler onprocessorerror;
};
Constructors
: AudioWorkletNode(context, name, options) ::
			context: The {{BaseAudioContext}} this new {{AudioWorkletNode}} will be associated with.
			name: A string that is a key for the {{BaseAudioContext}}’s node name to parameter descriptor map.
			options: Optional initial parameters value for this {{AudioWorkletNode}}.
		
When the constructor is called, the user agent MUST perform the following steps on the control thread:
When the {{AudioWorkletNode()|AudioWorkletNode}} constructor is invoked with context, nodeName, options: 1. If nodeName does not exist as a key in the {{BaseAudioContext}}’s node name to parameter descriptor map, throw a {{InvalidStateError}} exception and abort these steps. 1. Let node be this value. 1. Initialize the AudioNode node with context and options as arguments. 1. Configure input, output and output channels of node with options. Abort the remaining steps if any exception is thrown. 1. Let messageChannel be a new {{MessageChannel}}. 1. Let nodePort be the value of messageChannel's {{MessageChannel/port1}} attribute. 1. Let processorPortOnThisSide be the value of messageChannel's {{MessageChannel/port2}} attribute. 1. Let serializedProcessorPort be the result of [$StructuredSerializeWithTransfer$](processorPortOnThisSide, « processorPortOnThisSide »). 1. Convert options dictionary to optionsObject. 1. Let serializedOptions be the result of [$StructuredSerialize$](optionsObject). 1. Set node's {{AudioWorkletNode/port}} to nodePort. 1. Let parameterDescriptors be the result of retrieval of nodeName from node name to parameter descriptor map: 1. Let audioParamMap be a new {{AudioParamMap}} object. 1. For each descriptor of parameterDescriptors: 1. Let paramName be the value of {{AudioParamDescriptor/name}} member in descriptor. 1. Let audioParam be a new {{AudioParam}} instance with {{AudioParamDescriptor/automationRate}}, {{AudioParamDescriptor/defaultValue}}, {{AudioParamDescriptor/minValue}}, and {{AudioParamDescriptor/maxValue}} having values equal to the values of corresponding members on descriptor. 1. Append a key-value pair paramNameaudioParam to audioParamMap's entries. 1. If {{AudioWorkletNodeOptions/parameterData}} is present on options, perform the following steps: 1. Let parameterData be the value of {{AudioWorkletNodeOptions/parameterData}}. 1. For each paramNameparamValue of parameterData: 1. If there exists a map entry on audioParamMap with key paramName, let audioParamInMap be such entry. 1. Set {{AudioParam/value}} property of audioParamInMap to paramValue. 1. Set node's {{AudioWorkletNode/parameters}} to audioParamMap. 1. Queue a control message to invoke the {{AudioWorkletProcessor()|constructor}} of the corresponding {{AudioWorkletProcessor}} with the [=processor construction data=] that consists of: nodeName, node, serializedOptions, and serializedProcessorPort.
Attributes
: onprocessorerror :: When an unhandled exception is thrown from the processor's constructor, process method, or any user-defined class method, the processor will queue a media element task to fire an event named `processorerror` using ErrorEvent at the associated {{AudioWorkletNode}}. The ErrorEvent is created and initialized appropriately with its message, filename, lineno, colno attributes on the control thread. Note that once a unhandled exception is thrown, the processor will output silence throughout its lifetime. : parameters :: The parameters attribute is a collection of {{AudioParam}} objects with associated names. This maplike object is populated from a list of {{AudioParamDescriptor}}s in the {{AudioWorkletProcessor}} class constructor at the instantiation. : port :: Every {{AudioWorkletNode}} has an associated port which is the {{MessagePort}}. It is connected to the port on the corresponding {{AudioWorkletProcessor}} object allowing bidirectional communication between the {{AudioWorkletNode}} and its {{AudioWorkletProcessor}}. Note: Authors that register a event listener on the "message" event of this {{AudioWorkletNode/port}} should call {{MessagePort/close}} on either end of the {{MessageChannel}} (either in the {{AudioWorkletProcessor}} or the {{AudioWorkletNode}} side) to allow for resources to be [[html#ports-and-garbage-collection|collected]].
{{AudioWorkletNodeOptions}}
The {{AudioWorkletNodeOptions}} dictionary can be used to initialize attibutes in the instance of an {{AudioWorkletNode}}. dictionary AudioWorkletNodeOptions : AudioNodeOptions { unsigned long numberOfInputs = 1; unsigned long numberOfOutputs = 1; sequence<unsigned long> outputChannelCount; record<DOMString, double> parameterData; object processorOptions; };
Dictionary {{AudioWorkletNodeOptions}} Members
: numberOfInputs :: This is used to initialize the value of the {{AudioNode}} {{AudioNode/numberOfInputs}} attribute. : numberOfOutputs :: This is used to initialize the value of the {{AudioNode}} {{AudioNode/numberOfOutputs}} attribute. : outputChannelCount :: This array is used to configure the number of channels in each output. : parameterData :: This is a list of user-defined key-value pairs that are used to set the initial {{AudioParam/value}} of an {{AudioParam}} with the matched name in the {{AudioWorkletNode}}. : processorOptions :: This holds any user-defined data that may be used to initialize custom properties in an {{AudioWorkletProcessor}} instance that is associated with the {{AudioWorkletNode}}.
Configuring Channels with {{AudioWorkletNodeOptions}}
The following algorithm describes how an {{AudioWorkletNodeOptions}} can be used to configure various channel configurations.
1. Let node be an {{AudioWorkletNode}} instance that is given to this algorithm. 1. If both {{AudioWorkletNodeOptions/numberOfInputs}} and {{AudioWorkletNodeOptions/numberOfOutputs}} are zero, throw a {{NotSupportedError}} and abort the remaining steps. 1. If {{AudioWorkletNodeOptions/outputChannelCount}} is present, 1. If any value in {{AudioWorkletNodeOptions/outputChannelCount}} is zero or greater than the implementation’s maximum number of channels, throw a {{NotSupportedError}} and abort the remaining steps. 1. If the length of {{AudioWorkletNodeOptions/outputChannelCount}} does not equal {{AudioWorkletNodeOptions/numberOfOutputs}}, throw an {{IndexSizeError}} and abort the remaining steps. 1. If both {{AudioWorkletNodeOptions/numberOfInputs}} and {{AudioWorkletNodeOptions/numberOfOutputs}} are 1, set the channel count of the node output to the one value in {{AudioWorkletNodeOptions/outputChannelCount}}. 1. Otherwise set the channel count of the kth output of the node to the kth element of {{AudioWorkletNodeOptions/outputChannelCount}} sequence and return. 1. If {{AudioWorkletNodeOptions/outputChannelCount}} is not present, 1. If both {{AudioWorkletNodeOptions/numberOfInputs}} and {{AudioWorkletNodeOptions/numberOfOutputs}} are 1, set the initial channel count of the node output to 1 and return. NOTE: For this case, the output chanel count will change to computedNumberOfChannels dynamically based on the input and the {{AudioNode/channelCountMode}} at runtime. 1. Otherwise set the channel count of each output of the node to 1 and return.

The {{AudioWorkletProcessor}} Interface

This interface represents an audio processing code that runs on the audio rendering thread. It lives in the {{AudioWorkletGlobalScope}}, and the definition of the class manifests the actual audio processing. Note that the an {{AudioWorkletProcessor}} construction can only happen as a result of an {{AudioWorkletNode}} contruction. [Exposed=AudioWorklet] interface AudioWorkletProcessor { constructor (); readonly attribute MessagePort port; }; callback AudioWorkletProcessCallback = boolean (FrozenArray<FrozenArray<Float32Array>> inputs, FrozenArray<FrozenArray<Float32Array>> outputs, object parameters); {{AudioWorkletProcessor}} has two internal slots:
: [[node reference]] :: A reference to the associated {{AudioWorkletNode}}. : [[callable process]] :: A boolean flag representing whether [=process()=] is a valid function that can be invoked.
Constructors
: AudioWorkletProcessor() :: When the constructor for {{AudioWorkletProcessor}} is invoked, the following steps are performed on the rendering thread.
1. Let nodeReference be the result of looking up [=pending processor construction data/node reference=] on the [=pending processor construction data=] of the current {{AudioWorkletGlobalScope}}. Throw a {{TypeError}} exception if the slot is empty. 1. Let processor be the this value. 1. Set processor's {{[[node reference]]}} to nodeReference. 1. Set processor's {{[[callable process]]}} to `true`. 1. Let deserializedPort be the result of looking up [=pending processor construction data/transferred port=] from the [=pending processor construction data=]. 1. Set processor’s {{AudioWorkletProcessor/port}} to deserializedPort. 1. Empty the [=pending processor construction data=] slot.
Attributes
: port :: Every {{AudioWorkletProcessor}} has an associated port which is a {{MessagePort}}. It is connected to the port on the corresponding {{AudioWorkletNode}} object allowing bidirectional communication between an {{AudioWorkletNode}} and its {{AudioWorkletProcessor}}. Note: Authors that register a event listener on the "message" event of this {{AudioWorkletProcessor/port}} should call {{MessagePort/close}} on either end of the {{MessageChannel}} (either in the {{AudioWorkletProcessor}} or the {{AudioWorkletNode}} side) to allow for resources to be [[html#ports-and-garbage-collection|collected]].
Callback {{AudioWorkletProcessCallback}}
Users can define a custom audio processor by extending {{AudioWorkletProcessor}}. The subclass MUST define an {{AudioWorkletProcessCallback}} named process() that implements the audio processing algorithm and may have a static property named parameterDescriptors which is an iterable of {{AudioParamDescriptor}}s. The [=process()=] callback function is handled as specified when rendering a graph.
The return value of this callback controls the lifetime of the {{AudioWorkletProcessor}}'s associated {{AudioWorkletNode}}. This lifetime policy can support a variety of approaches found in built-in nodes, including the following: * Nodes that transform their inputs, and are active only while connected inputs and/or script references exist. Such nodes SHOULD return false from [=process()=] which allows the presence or absence of connected inputs to determine whether the {{AudioWorkletNode}} is [=actively processing=]. * Nodes that transform their inputs, but which remain active for a tail-time after their inputs are disconnected. In this case, [=process()=] SHOULD return `true` for some period of time after inputs is found to contain zero channels. The current time may be obtained from the global scope's {{AudioWorkletGlobalScope/currentTime}} to measure the start and end of this tail-time interval, or the interval could be calculated dynamically depending on the processor's internal state. * Nodes that act as sources of output, typically with a lifetime. Such nodes SHOULD return `true` from [=process()=] until the point at which they are no longer producing an output. Note that the preceding definition implies that when no return value is provided from an implementation of [=process()=], the effect is identical to returning false (since the effective return value is the falsy value {{undefined}}). This is a reasonable behavior for any {{AudioWorkletProcessor}} that is active only when it has active inputs.
The example below shows how {{AudioParam}} can be defined and used in an {{AudioWorkletProcessor}}. class MyProcessor extends AudioWorkletProcessor { static get parameterDescriptors() { return [{ name: 'myParam', defaultValue: 0.5, minValue: 0, maxValue: 1, automationRate: "k-rate" }]; } process(inputs, outputs, parameters) { // Get the first input and output. const input = inputs[0]; const output = outputs[0]; const myParam = parameters.myParam; // A simple amplifier for single input and output. Note that the // automationRate is "k-rate", so it will have a single value at index [0] // for each render quantum. for (let channel = 0; channel < output.length; ++channel) { for (let i = 0; i < output[channel].length; ++i) { output[channel][i] = input[channel][i] * myParam[0]; } } } }
Callback {{AudioWorkletProcessCallback}} Parameters
The following describes the parameters to the {{AudioWorkletProcessCallback}} function. In general, the {{AudioWorkletProcessCallback/inputs!!argument}} and {{AudioWorkletProcessCallback/outputs!!argument}} arrays will be reused between calls so that no memory allocation is done. However, if the topology changes, because, say, the number of channels in the input or the output changes, new arrays are reallocated. New arrays are also reallocated if any part of the {{AudioWorkletProcessCallback/inputs!!argument}} or {{AudioWorkletProcessCallback/outputs!!argument}} arrays are transferred.
: {{AudioWorkletProcessCallback/inputs!!argument}}, of type {{FrozenArray}}<{{FrozenArray}}<{{Float32Array}}>> :: The input audio buffer from the incoming connections provided by the user agent. inputs[n][m] is a {{Float32Array}} of audio samples for the \(m\)th channel of the \(n\)th input. While the number of inputs is fixed at construction, the number of channels can be changed dynamically based on [=computedNumberOfChannels=]. If there are no [=actively processing=] {{AudioNode}}s connected to the \(n\)th input of the {{AudioWorkletNode}} for the current render quantum, then the content of inputs[n] is an empty array, indicating that zero channels of input are available. This is the only circumstance under which the number of elements of inputs[n] can be zero. : {{AudioWorkletProcessCallback/outputs!!argument}}, of type {{FrozenArray}}<{{FrozenArray}}<{{Float32Array}}>> :: The output audio buffer that is to be consumed by the user agent. outputs[n][m] is a {{Float32Array}} object containing the audio samples for \(m\)th channel of \(n\)th output. Each of the {{Float32Array}}s are zero-filled. The number of channels in the output will match [=computedNumberOfChannels=] only when the node has a single output. : {{AudioWorkletProcessCallback/parameters!!argument}}, of type {{object}} :: An [=ordered map=] of nameparameterValues. parameters["name"] returns parameterValues, which is a {{FrozenArray}}<{{Float32Array}}> with the automation values of the name {{AudioParam}}. For each array, the array contains the [=computedValue=] of the parameter for all frames in the [=render quantum=]. However, if no automation is scheduled during this render quantum, the array MAY have length 1 with the array element being the constant value of the {{AudioParam}} for the [=render quantum=]. This object is frozen according the the following steps
1. Let |parameter| be the [=ordered map=] of the name and parameter values. 1. SetIntegrityLevel(|parameter|, frozen)
This frozen [=ordered map=] computed in the algorithm is passed to the {{AudioWorkletProcessCallback/parameters!!argument}} argument. Note: This means the object cannot be modified and hence the same object can be used for successive calls unless length of an array changes.
{{AudioParamDescriptor}}
The {{AudioParamDescriptor}} dictionary is used to specify properties for an {{AudioParam}} object that is used in an {{AudioWorkletNode}}.
dictionary AudioParamDescriptor {
	required DOMString name;
	float defaultValue = 0;
	float minValue = -3.4028235e38;
	float maxValue = 3.4028235e38;
	AutomationRate automationRate = "a-rate";
};
Dictionary {{AudioParamDescriptor}} Members
There are constraints on the values for these members. See the algorithm for handling an AudioParamDescriptor for the constraints.
: automationRate :: Represents the default automation rate. : defaultValue :: Represents the default value of the parameter. : maxValue :: Represents the maximum value. : minValue :: Represents the minimum value. : name :: Represents the name of the parameter.

AudioWorklet Sequence of Events

The following figure illustrates an idealized sequence of events occurring relative to an {{AudioWorklet}}:
{{AudioWorklet}} sequence
The steps depicted in the diagram are one possible sequence of events involving the creation of an {{AudioContext}} and an associated {{AudioWorkletGlobalScope}}, followed by the creation of an {{AudioWorkletNode}} and its associated {{AudioWorkletProcessor}}.
1. An {{AudioContext}} is created. 2. In the main scope, context.audioWorklet is requested to add a script module. 2. Since none exists yet, a new {{AudioWorkletGlobalScope}} is created in association with the context. This is the global scope in which {{AudioWorkletProcessor}} class definitions will be evaluated. (On subsequent calls, this previously created scope will be used.) 2. The imported script is run in the newly created global scope. 3. As part of running the imported script, an {{AudioWorkletProcessor}} is registered under a key ("custom" in the above diagram) within the {{AudioWorkletGlobalScope}}. This populates maps both in the global scope and in the {{AudioContext}}. 3. The promise for the {{addModule()}} call is resolved. 6. In the main scope, an {{AudioWorkletNode}} is created using the user-specified key along with a dictionary of options. 7. As part of the node's creation, this key is used to look up the correct {{AudioWorkletProcessor}} subclass for instantiation. 8. An instance of the {{AudioWorkletProcessor}} subclass is instantiated with a structured clone of the same options dictionary. This instance is paired with the previously created {{AudioWorkletNode}}.

AudioWorklet Examples

The BitCrusher Node
Bitcrushing is a mechanism by which the quality of an audio stream is reduced both by quantizing the sample value (simulating a lower bit-depth), and by quantizing in time resolution (simulating a lower sample rate). This example shows how to use {{AudioParam}}s (in this case, treated as a-rate) inside an {{AudioWorkletProcessor}}. const context = new AudioContext(); context.audioWorklet.addModule('bitcrusher.js').then(() => { const osc = new OscillatorNode(context); const amp = new GainNode(context); // Create a worklet node. 'BitCrusher' identifies the // AudioWorkletProcessor previously registered when // bitcrusher.js was imported. The options automatically // initialize the correspondingly named AudioParams. const bitcrusher = new AudioWorkletNode(context, 'bitcrusher', { parameterData: {bitDepth: 8} }); osc.connect(bitcrusher).connect(amp).connect(context.destination); osc.start(); }); class Bitcrusher extends AudioWorkletProcessor { static get parameterDescriptors () { return [{ name: 'bitDepth', defaultValue: 12, minValue: 1, maxValue: 16 }, { name: 'frequencyReduction', defaultValue: 0.5, minValue: 0, maxValue: 1 }]; } constructor (options) { // The initial parameter value can be set by passing |options| // to the processor's constructor. super(options); this._phase = 0; this._lastSampleValue = 0; } process (inputs, outputs, parameters) { const input = inputs[0]; const output = outputs[0]; const bitDepth = parameters.bitDepth; const frequencyReduction = parameters.frequencyReduction; if (bitDepth.length > 1) { // The bitDepth parameter array has 128 sample values. for (let channel = 0; channel < output.length; ++channel) { for (let i = 0; i < output[channel].length; ++i) { let step = Math.pow(0.5, bitDepth[i]); // Use modulo for indexing to handle the case where // the length of the frequencyReduction array is 1. this._phase += frequencyReduction[i % frequencyReduction.length]; if (this._phase >= 1.0) { this._phase -= 1.0; this._lastSampleValue = step * Math.floor(input[channel][i] / step + 0.5); } output[channel][i] = this._lastSampleValue; } } } else { // Because we know bitDepth is constant for this call, // we can lift the computation of step outside the loop, // saving many operations. const step = Math.pow(0.5, bitDepth[0]); for (let channel = 0; channel < output.length; ++channel) { for (let i = 0; i < output[channel].length; ++i) { this._phase += frequencyReduction[i % frequencyReduction.length]; if (this._phase >= 1.0) { this._phase -= 1.0; this._lastSampleValue = step * Math.floor(input[channel][i] / step + 0.5); } output[channel][i] = this._lastSampleValue; } } } // No need to return a value; this node's lifetime is dependent only on its // input connections. } }); registerProcessor('bitcrusher', Bitcrusher); Note: In the definition of {{AudioWorkletProcessor}} class, an {{InvalidStateError}} will be thrown if the author-supplied constructor has an explicit return value that is not this or does not properly call super().
VU Meter Node
This example of a simple sound level meter further illustrates how to create an {{AudioWorkletNode}} subclass that acts like a native {{AudioNode}}, accepting constructor options and encapsulating the inter-thread communication (asynchronous) between {{AudioWorkletNode}} and {{AudioWorkletProcessor}}. This node does not use any output.
Candidate Correction Issue 2359. Fix typo in code; semi-colon is incorrect.
/* vumeter-node.js: Main global scope */

export default class VUMeterNode extends AudioWorkletNode {
	constructor (context, updateIntervalInMS) {
		super(context, 'vumeter', {
			numberOfInputs: 1,
			numberOfOutputs: 0,
			channelCount: 1,
			processorOptions: {
				updateIntervalInMS: updateIntervalInMS || 16.67;
			}
		});

		// States in AudioWorkletNode
		this._updateIntervalInMS = updateIntervalInMS;
		this._volume = 0;

		// Handles updated values from AudioWorkletProcessor
		this.port.onmessage = event => {
			if (event.data.volume)
				this._volume = event.data.volume;
		}
		this.port.start();
	}

	get updateInterval() {
		return this._updateIntervalInMS;
	}

	set updateInterval(updateIntervalInMS) {
		this._updateIntervalInMS = updateIntervalInMS;
		this.port.postMessage({updateIntervalInMS: updateIntervalInMS});
	}

	draw () {
		// Draws the VU meter based on the volume value
		// every |this._updateIntervalInMS| milliseconds.
	}
};
/* vumeter-processor.js: AudioWorkletGlobalScope */ const SMOOTHING_FACTOR = 0.9; const MINIMUM_VALUE = 0.00001; registerProcessor('vumeter', class extends AudioWorkletProcessor { constructor (options) { super(); this._volume = 0; this._updateIntervalInMS = options.processorOptions.updateIntervalInMS; this._nextUpdateFrame = this._updateIntervalInMS; this.port.onmessage = event => { if (event.data.updateIntervalInMS) this._updateIntervalInMS = event.data.updateIntervalInMS; } } get intervalInFrames () { return this._updateIntervalInMS / 1000 * sampleRate; } process (inputs, outputs, parameters) { const input = inputs[0]; // Note that the input will be down-mixed to mono; however, if no inputs are // connected then zero channels will be passed in. if (input.length > 0) { const samples = input[0]; let sum = 0; let rms = 0; // Calculated the squared-sum. for (let i = 0; i < samples.length; ++i) sum += samples[i] * samples[i]; // Calculate the RMS level and update the volume. rms = Math.sqrt(sum / samples.length); this._volume = Math.max(rms, this._volume * SMOOTHING_FACTOR); // Update and sync the volume property with the main thread. this._nextUpdateFrame -= samples.length; if (this._nextUpdateFrame < 0) { this._nextUpdateFrame += this.intervalInFrames; this.port.postMessage({volume: this._volume}); } } // Keep on processing if the volume is above a threshold, so that // disconnecting inputs does not immediately cause the meter to stop // computing its smoothed value. return this._volume >= MINIMUM_VALUE; } }); /* index.js: Main global scope, entry point */ import VUMeterNode from './vumeter-node.js'; const context = new AudioContext(); context.audioWorklet.addModule('vumeter-processor.js').then(() => { const oscillator = new OscillatorNode(context); const vuMeterNode = new VUMeterNode(context, 25); oscillator.connect(vuMeterNode); oscillator.start(); function drawMeter () { vuMeterNode.draw(); requestAnimationFrame(drawMeter); } drawMeter(); });

Processing model

Background

This section is non-normative. Real-time audio systems that require low latency are often implemented using callback functions, where the operating system calls the program back when more audio has to be computed in order for the playback to stay uninterrupted. Such a callback is ideally called on a high priority thread (often the highest priority on the system). This means that a program that deals with audio only executes code from this callback. Crossing thread boundaries or adding some buffering between a rendering thread and the callback would naturally add latency or make the system less resilient to glitches. For this reason, the traditional way of executing asynchronous operations on the Web Platform, the event loop, does not work here, as the thread is not continuously executing. Additionally, a lot of unnecessary and potentially blocking operations are available from traditional execution contexts (Windows and Workers), which is not something that is desirable to reach an acceptable level of performance. Additionally, the Worker model makes creating a dedicated thread necessary for a script execution context, while all {{AudioNode}}s usually share the same execution context. Note: This section specifies how the end result should look like, not how it should be implemented. In particular, instead of using message queue, implementors can use memory that is shared between threads, as long as the memory operations are not reordered.

Control Thread and Rendering Thread

The Web Audio API MUST be implemented using a control thread, and a rendering thread. The control thread is the thread from which the {{AudioContext}} is instantiated, and from which authors manipulate the audio graph, that is, from where the operation on a {{BaseAudioContext}} are invoked. The rendering thread is the thread on which the actual audio output is computed, in reaction to the calls from the control thread. It can be a real-time, callback-based audio thread, if computing audio for an {{AudioContext}}, or a normal thread if computing audio for an {{OfflineAudioContext}}. The control thread uses a traditional event loop, as described in [[HTML]]. The rendering thread uses a specialized rendering loop, described in the section Rendering an audio graph Communication from the control thread to the rendering thread is done using control message passing. Communication in the other direction is done using regular event loop tasks. Each {{AudioContext}} has a single control message queue that is a list of control messages that are operations running on the rendering thread. Queuing a control message means adding the message to the end of the control message queue of an {{BaseAudioContext}}. Note: For example, successfuly calling start() on an {{AudioBufferSourceNode}} source adds a control message to the control message queue of the associated {{BaseAudioContext}}. Control messages in a control message queue are ordered by time of insertion. The oldest message is therefore the one at the front of the control message queue.
Swapping a control message queue QA with another control message queue QB means executing the following steps: 1. Let QC be a new, empty control message queue. 2. Move all the control messages QA to QC. 3. Move all the control messages QB to QA. 4. Move all the control messages QC to QB.

Asynchronous Operations

Calling methods on {{AudioNode}}s is effectively asynchronous, and MUST to be done in two phases: a synchronous part and an asynchronous part. For each method, some part of the execution happens on the control thread (for example, throwing an exception in case of invalid parameters), and some part happens on the rendering thread (for example, changing the value of an {{AudioParam}}). In the description of each operation on {{AudioNode}}s and {{BaseAudioContext}}s, the synchronous section is marked with a ⌛. All the other operations are executed in parallel, as described in [[HTML]]. The synchronous section is executed on the control thread, and happens immediately. If it fails, the method execution is aborted, possibly throwing an exception. If it succeeds, a control message, encoding the operation to be executed on the rendering thread is enqueued on the control message queue of this rendering thread. The synchronous and asynchronous sections order with respect to other events MUST be the same: given two operation A and B with respective synchronous and asynchronous section ASync and AAsync, and BSync and BAsync, if A happens before B, then ASync happens before BSync, and AAsync happens before BAsync. In other words, synchronous and asynchronous sections can't be reordered.

Rendering an Audio Graph

Rendering an audio graph is done in blocks of 128 samples-frames. A block of 128 samples-frames is called a render quantum, and the render quantum size is 128. Operations that happen atomically on a given thread can only be executed when no other [=Atomically|atomic=] operation is running on another thread. The algorithm for rendering a block of audio from a {{BaseAudioContext}} G with a control message queue Q is comprised of multiple steps and explained in further detail in the algorithm of rendering a graph.
In practice, the {{AudioContext}} rendering thread is often running off a system-level audio callback, that executes in an isochronous fashion. An {{OfflineAudioContext}} is not required to have a system-level audio callback, but behaves as if it did with the callback happening as soon as the previous callback is finished.
The audio callback is also queued as a task in the control message queue. The UA MUST perform the following algorithms to process render quanta to fulfill such task by filling up the requested buffer size. Along with the control message queue, each {{AudioContext}} has a regular task queue, called its associated task queue for tasks that are posted to the rendering thread from the control thread. An additional microtask checkpoint is performed after processing a render quantum to run any microtasks that might have been queued during the execution of the `process` methods of {{AudioWorkletProcessor}}. All tasks posted from an {{AudioWorkletNode}} are posted to the [=associated task queue=] of its associated {{BaseAudioContext}}.
The following step MUST be performed once before the rendering loop starts. 1. Set the internal slot [[current frame]] of the {{BaseAudioContext}} to 0. Also set {{BaseAudioContext/currentTime}} to 0.
The following steps MUST be performed when rendering a render quantum. 1. Let render result be false. 2. Process the [=control message queue=]. 1. Let Qrendering be an empty [=control message queue=]. [=Atomically=] [=swap=] Qrendering with the current [=control message queue=]. 2. While there are messages in Qrendering, execute the following steps: 1. Execute the asynchronous section of the [=oldest message=] of Qrendering. 2. Remove the [=oldest message=] of Qrendering. 3. Process the {{BaseAudioContext}}'s [=associated task queue=]. 1. Let task queue be the {{BaseAudioContext}}'s [=associated task queue=]. 2. Let task count be the number of tasks in the in task queue 3. While task count is not equal to 0, execute the following steps: 1. Let oldest task be the first runnable task in task queue, and remove it from task queue. 2. Set the rendering loop's currently running task to oldest task. 3. Perform oldest task's steps. 4. Set the rendering loop currently running task back to null. 6. Decrement task count 5. Perform a microtask checkpoint. 4. Process a render quantum. 1. If the {{[[rendering thread state]]}} of the {{BaseAudioContext}} is not running, return false. 2. Order the {{AudioNode}}s of the {{BaseAudioContext}} to be processed. 1. Let ordered node list be an empty list of {{AudioNode}}s and {{AudioListener}}. It will contain an ordered list of {{AudioNode}}s and the {{AudioListener}} when this ordering algorithm terminates. 2. Let nodes be the set of all nodes created by this {{BaseAudioContext}}, and still alive. 3. Add the {{AudioListener}} to nodes. 4. Let cycle breakers be an empty set of {{DelayNode}}s. It will contain all the {{DelayNode}}s that are part of a cycle. 5. For each {{AudioNode}} node in nodes: 1. If node is a {{DelayNode}} that is part of a cycle, add it to cycle breakers and remove it from nodes. 6. For each {{DelayNode}} delay in cycle breakers: 1. Let delayWriter and delayReader respectively be a DelayWriter and a DelayReader, for delay. Add delayWriter and delayReader to nodes. Disconnect delay from all its input and outputs. Note: This breaks the cycle: if a DelayNode is in a cycle, its two ends can be considered separately, because delay lines cannot be smaller than one render quantum when in a cycle. 7. If nodes contains cycles, [=mute=] all the {{AudioNode}}s that are part of this cycle, and remove them from nodes. 8. Consider all elements in nodes to be unmarked. While there are unmarked elements in nodes: 1. Choose an element node in nodes. 2. [=Visit=] node.
Visiting a node means performing the following steps: 1. If node is marked, abort these steps. 2. Mark node. 3. If node is an {{AudioNode}}, [=Visit=] each {{AudioNode}} connected to the input of node. 4. For each {{AudioParam}} param of node: 1. For each {{AudioNode}} param input node connected to param: 1. [=Visit=] param input node 5. Add node to the beginning of ordered node list.
9. Reverse the order of ordered node list. 4. [[#computation-of-value|Compute the value(s)]] of the {{AudioListener}}'s {{AudioParam}}s for this block. 5. For each {{AudioNode}}, in ordered node list: 1. For each {{AudioParam}} of this {{AudioNode}}, execute these steps: 1. If this {{AudioParam}} has any {{AudioNode}} connected to it, [[#channel-up-mixing-and-down-mixing|sum]] the buffers [=Making a buffer available for reading|made available for reading=] by all {{AudioNode}} connected to this {{AudioParam}}, [[#down-mix|down mix]] the resulting buffer down to a mono channel, and call this buffer the input AudioParam buffer. 2. [[#computation-of-value|Compute the value(s)]] of this {{AudioParam}} for this block. 3. [=Queue a control message=] to set the {{[[current value]]}} slot of this {{AudioParam}} according to [[#computation-of-value]]. 2. If this {{AudioNode}} has any {{AudioNode}}s connected to its input, [[#channel-up-mixing-and-down-mixing|sum]] the buffers [=Making a buffer available for reading|made available for reading=] by all {{AudioNode}}s connected to this {{AudioNode}}. The resulting buffer is called the input buffer. [[#channel-up-mixing-and-down-mixing|Up or down-mix]] it to match if number of input channels of this {{AudioNode}}. 3. If this {{AudioNode}} is a source node, [=Computing a block of audio|compute a block of audio=], and [=Making a buffer available for reading|make it available for reading=]. 4. If this {{AudioNode}} is an {{AudioWorkletNode}}, execute these substeps: 1. Let |processor| be the associated {{AudioWorkletProcessor}} instance of {{AudioWorkletNode}}. 1. Let |O| be the ECMAScript object corresponding to |processor|. 1. Let |processCallback| be an uninitialized variable. 1. Let |completion| be an uninitialized variable. 1. [=Prepare to run script=] with the [=current settings object=]. 1. [=Prepare to run a callback=] with the [=current settings object=]. 1. Let |getResult| be Get(|O|, "process"). 1. If |getResult| is an abrupt completion, set |completion| to |getResult| and jump to the step labeled return. 1. Set |processCallback| to |getResult|.\[[Value]]. 1. If ! IsCallable(|processCallback|) is `false`, then: 1. Set |completion| to new Completion {\[[Type]]: throw, \[[Value]]: a newly created TypeError object, \[[Target]]: empty}. 1. Jump to the step labeled return. 1. Set {{[[callable process]]}} to `true`. 1. Perform the following substeps: 1. Let |args| be a Web IDL arguments list consisting of {{AudioWorkletProcessCallback/inputs}}, {{AudioWorkletProcessCallback/outputs}}, and {{AudioWorkletProcessCallback/parameters}}. 1. Let |esArgs| be the result of converting |args| to an ECMAScript arguments list. 1. Let |callResult| be the Call(|processCallback|, |O|, |esArgs|). This operation [=Computing a block of audio|computes a block of audio=] with |esArgs|. Upon a successful function call, a buffer containing copies of the elements of the {{Float32Array}}s passed via the {{AudioWorkletProcessCallback/outputs}} is [=Making a buffer available for reading|made available for reading=]. Any {{Promise}} resolved within this call will be queued into the microtask queue in the {{AudioWorkletGlobalScope}}. 1. If |callResult| is an abrupt completion, set |completion| to |callResult| and jump to the step labeled return. 1. Set |processor|’s active source flag to ToBoolean(|callResult|.\[[Value]]). 1. Return: at this point |completion| will be set to an ECMAScript completion value. 1. [=Clean up after running a callback=] with the [=current settings object=]. 1. [=Clean up after running script=] with the [=current settings object=]. 1. If |completion| is an abrupt completion: 1. Set {{[[callable process]]}} to `false`. 1. Set |processor|'s active source flag to `false`. 1. [=Making a buffer available for reading|Make a silent output buffer available for reading=]. 1. Queue a task to the control thread fire an {{ErrorEvent}} named processorerror at the associated {{AudioWorkletNode}}. 5. If this {{AudioNode}} is a destination node, [=Recording the input|record the input=] of this {{AudioNode}}. 6. Else, [=processing-input-buffer|process=] the input buffer, and [=Making a buffer available for reading|make available for reading=] the resulting buffer. 6. [=Atomically=] perform the following steps: 1. Increment {{[[current frame]]}} by the [=render quantum size=]. 2. Set {{BaseAudioContext/currentTime}} to {{[[current frame]]}} divided by {{BaseAudioContext/sampleRate}}. 7. Set render result to true. 5. [=Perform a microtask checkpoint=]. 6. Return render result.
Muting an {{AudioNode}} means that its output MUST be silence for the rendering of this audio block. Making a buffer available for reading from an {{AudioNode}} means putting it in a state where other {{AudioNode}}s connected to this {{AudioNode}} can safely read from it. Note: For example, implementations can choose to allocate a new buffer, or have a more elaborate mechanism, reusing an existing buffer that is now unused. Recording the input of an {{AudioNode}} means copying the input data of this {{AudioNode}} for future usage. Computing a block of audio means running the algorithm for this {{AudioNode}} to produce 128 sample-frames. Processing an input buffer means running the algorithm for an {{AudioNode}}, using an input buffer and the value(s) of the {{AudioParam}}(s) of this {{AudioNode}} as the input for this algorithm.

Unloading a document

Additional unloading document cleanup steps are defined for documents that use {{BaseAudioContext}}: 1. Reject all the promises of {{BaseAudioContext/[[pending promises]]}} with InvalidStateError, for each {{AudioContext}} and {{OfflineAudioContext}} whose relevant global object is the same as the document's associated Window. 2. Stop all {{decoding thread}}s. 3. Queue a control message to {{AudioContext/close()}} the {{AudioContext}} or {{OfflineAudioContext}}.

Dynamic Lifetime

Background

Note: The normative description of {{AudioContext}} and {{AudioNode}} lifetime characteristics is described by the AudioContext lifetime and AudioNode lifetime. This section is non-normative. In addition to allowing the creation of static routing configurations, it should also be possible to do custom effect routing on dynamically allocated voices which have a limited lifetime. For the purposes of this discussion, let's call these short-lived voices "notes". Many audio applications incorporate the ideas of notes, examples being drum machines, sequencers, and 3D games with many one-shot sounds being triggered according to game play. In a traditional software synthesizer, notes are dynamically allocated and released from a pool of available resources. The note is allocated when a MIDI note-on message is received. It is released when the note has finished playing either due to it having reached the end of its sample-data (if non-looping), it having reached a sustain phase of its envelope which is zero, or due to a MIDI note-off message putting it into the release phase of its envelope. In the MIDI note-off case, the note is not released immediately, but only when the release envelope phase has finished. At any given time, there can be a large number of notes playing but the set of notes is constantly changing as new notes are added into the routing graph, and old ones are released. The audio system automatically deals with tearing-down the part of the routing graph for individual "note" events. A "note" is represented by an {{AudioBufferSourceNode}}, which can be directly connected to other processing nodes. When the note has finished playing, the context will automatically release the reference to the {{AudioBufferSourceNode}}, which in turn will release references to any nodes it is connected to, and so on. The nodes will automatically get disconnected from the graph and will be deleted when they have no more references. Nodes in the graph which are long-lived and shared between dynamic voices can be managed explicitly. Although it sounds complicated, this all happens automatically with no extra handling required.

Example

dynamic allocation
A graph featuring a subgraph that will be releases early.
The low-pass filter, panner, and second gain nodes are directly connected from the one-shot sound. So when it has finished playing the context will automatically release them (everything within the dotted line). If there are no longer any references to the one-shot sound and connected nodes, then they will be immediately removed from the graph and deleted. The streaming source has a global reference and will remain connected until it is explicitly disconnected. Here's how it might look in JavaScript:
let context = 0;
let compressor = 0;
let gainNode1 = 0;
let streamingAudioSource = 0;

// Initial setup of the "long-lived" part of the routing graph
function setupAudioContext() {
		context = new AudioContext();

		compressor = context.createDynamicsCompressor();
		gainNode1 = context.createGain();

		// Create a streaming audio source.
		const audioElement = document.getElementById('audioTagID');
		streamingAudioSource = context.createMediaElementSource(audioElement);
		streamingAudioSource.connect(gainNode1);

		gainNode1.connect(compressor);
		compressor.connect(context.destination);
}

// Later in response to some user action (typically mouse or key event)
// a one-shot sound can be played.
function playSound() {
		const oneShotSound = context.createBufferSource();
		oneShotSound.buffer = dogBarkingBuffer;

		// Create a filter, panner, and gain node.
		const lowpass = context.createBiquadFilter();
		const panner = context.createPanner();
		const gainNode2 = context.createGain();

		// Make connections
		oneShotSound.connect(lowpass);
		lowpass.connect(panner);
		panner.connect(gainNode2);
		gainNode2.connect(compressor);

		// Play 0.75 seconds from now (to play immediately pass in 0)
		oneShotSound.start(context.currentTime + 0.75);
}

Channel Up-Mixing and Down-Mixing

This section is normative. An AudioNode input has mixing rules for combining the channels from all of the connections to it. As a simple example, if an input is connected from a mono output and a stereo output, then the mono connection will usually be up-mixed to stereo and summed with the stereo connection. But, of course, it's important to define the exact mixing rules for every input to every {{AudioNode}}. The default mixing rules for all of the inputs have been chosen so that things "just work" without worrying too much about the details, especially in the very common case of mono and stereo streams. Of course, the rules can be changed for advanced use cases, especially multi-channel. To define some terms, up-mixing refers to the process of taking a stream with a smaller number of channels and converting it to a stream with a larger number of channels. down-mixing refers to the process of taking a stream with a larger number of channels and converting it to a stream with a smaller number of channels. An {{AudioNode}} input needs to mix all the outputs connected to this input. As part of this process it computes an internal value computedNumberOfChannels representing the actual number of channels of the input at any given time.
For each input of an {{AudioNode}}, an implementation MUST: 1. Compute computedNumberOfChannels. 2. For each connection to the input: 1. [=up-mix=] or [=down-mix=] the connection to computedNumberOfChannels according to the {{ChannelInterpretation}} value given by the node's {{AudioNode/channelInterpretation}} attribute. 2. Mix it together with all of the other mixed streams (from other connections). This is a straight-forward summing together of each of the corresponding channels that have been [=up-mix|up-mixed=] or [=down-mix|down-mixed=] in step 1 for each connection.

Speaker Channel Layouts

When {{AudioNode/channelInterpretation}} is "{{ChannelInterpretation/speakers}}" then the [=up-mix|up-mixing=] and [=down-mix|down-mixing=] is defined for specific channel layouts. Mono (one channel), stereo (two channels), quad (four channels), and 5.1 (six channels) MUST be supported. Other channel layouts may be supported in future version of this specification.

Channel Ordering

Channel ordering is defined by the following table. Individual multichannel formats MAY not support all intermediate channels. Implementations MUST present the channels provided in the order defined below, skipping over those channels not present.
Order Label Mono Stereo Quad 5.1
0 SPEAKER_FRONT_LEFT 0 0 0 0
1 SPEAKER_FRONT_RIGHT 1 1 1
2 SPEAKER_FRONT_CENTER 2
3 SPEAKER_LOW_FREQUENCY 3
4 SPEAKER_BACK_LEFT 2 4
5 SPEAKER_BACK_RIGHT 3 5
6 SPEAKER_FRONT_LEFT_OF_CENTER
7 SPEAKER_FRONT_RIGHT_OF_CENTER
8 SPEAKER_BACK_CENTER
9 SPEAKER_SIDE_LEFT
10 SPEAKER_SIDE_RIGHT
11 SPEAKER_TOP_CENTER
12 SPEAKER_TOP_FRONT_LEFT
13 SPEAKER_TOP_FRONT_CENTER
14 SPEAKER_TOP_FRONT_RIGHT
15 SPEAKER_TOP_BACK_LEFT
16 SPEAKER_TOP_BACK_CENTER
17 SPEAKER_TOP_BACK_RIGHT

Implication of tail-time on input and output channel count

When an {{AudioNode}} has a non-zero tail-time, and an output channel count that depends on the input channels count, the {{AudioNode}}'s tail-time must be taken into account when the input channel count changes. When there is a decrease in input channel count, the change in output channel count MUST happen when the input that was received with greater channel count no longer affects the output. When there is an increase in input channel count, the behavior depends on the {{AudioNode}} type: - For a {{DelayNode}} or a {{DynamicsCompressorNode}}, the number of output channels MUST increase when the input that was received with greater channel count begins to affect the output. - For other {{AudioNode}}s that have a tail-time, the number of output channels MUST increase immediately. Note: For a {{ConvolverNode}}, this only applies to the case where the impulse response is mono. Otherwise, the {{ConvolverNode}} always outputs a stereo signal regardless of its input channel count. Note: Intuitively, this allows not losing stereo information as part of processing: when multiple input render quanta of different channel count contribute to an output render quantum then the output render quantum's channel count is a superset of the input channel count of the input render quantums.

Up Mixing Speaker Layouts

Mono up-mix:

	1 -> 2 : up-mix from mono to stereo
		output.L = input;
		output.R = input;

	1 -> 4 : up-mix from mono to quad
		output.L = input;
		output.R = input;
		output.SL = 0;
		output.SR = 0;

	1 -> 5.1 : up-mix from mono to 5.1
		output.L = 0;
		output.R = 0;
		output.C = input; // put in center channel
		output.LFE = 0;
		output.SL = 0;
		output.SR = 0;

Stereo up-mix:

	2 -> 4 : up-mix from stereo to quad
		output.L = input.L;
		output.R = input.R;
		output.SL = 0;
		output.SR = 0;

	2 -> 5.1 : up-mix from stereo to 5.1
		output.L = input.L;
		output.R = input.R;
		output.C = 0;
		output.LFE = 0;
		output.SL = 0;
		output.SR = 0;

Quad up-mix:

	4 -> 5.1 : up-mix from quad to 5.1
		output.L = input.L;
		output.R = input.R;
		output.C = 0;
		output.LFE = 0;
		output.SL = input.SL;
		output.SR = input.SR;

Down Mixing Speaker Layouts

A down-mix will be necessary, for example, if processing 5.1 source material, but playing back stereo.
Mono down-mix:

	2 -> 1 : stereo to mono
		output = 0.5 * (input.L + input.R);

	4 -> 1 : quad to mono
		output = 0.25 * (input.L + input.R + input.SL + input.SR);

	5.1 -> 1 : 5.1 to mono
		output = sqrt(0.5) * (input.L + input.R) + input.C + 0.5 * (input.SL + input.SR)

Stereo down-mix:

	4 -> 2 : quad to stereo
		output.L = 0.5 * (input.L + input.SL);
		output.R = 0.5 * (input.R + input.SR);

	5.1 -> 2 : 5.1 to stereo
		output.L = L + sqrt(0.5) * (input.C + input.SL)
		output.R = R + sqrt(0.5) * (input.C + input.SR)

Quad down-mix:

	5.1 -> 4 : 5.1 to quad
		output.L = L + sqrt(0.5) * input.C
		output.R = R + sqrt(0.5) * input.C
		output.SL = input.SL
		output.SR = input.SR

Channel Rules Examples

	// Set gain node to explicit 2-channels (stereo).
	gain.channelCount = 2;
	gain.channelCountMode = "explicit";
	gain.channelInterpretation = "speakers";

	// Set "hardware output" to 4-channels for DJ-app with two stereo output busses.
	context.destination.channelCount = 4;
	context.destination.channelCountMode = "explicit";
	context.destination.channelInterpretation = "discrete";

	// Set "hardware output" to 8-channels for custom multi-channel speaker array
	// with custom matrix mixing.
	context.destination.channelCount = 8;
	context.destination.channelCountMode = "explicit";
	context.destination.channelInterpretation = "discrete";

	// Set "hardware output" to 5.1 to play an HTMLAudioElement.
	context.destination.channelCount = 6;
	context.destination.channelCountMode = "explicit";
	context.destination.channelInterpretation = "speakers";

	// Explicitly down-mix to mono.
	gain.channelCount = 1;
	gain.channelCountMode = "explicit";
	gain.channelInterpretation = "speakers";

Audio Signal Values

Audio sample format

Linear pulse code modulation (linear PCM) describes a format where the audio values are sampled at a regular interval, and where the quantization levels between two successive values are linearly uniform. Whenever signal values are exposed to script in this specification, they are in linear 32-bit floating point pulse code modulation format (linear 32-bit float PCM), often in the form of {{Float32Array}} objects.

Rendering

The range of all audio signals at a destination node of any audio graph is nominally [-1, 1]. The audio rendition of signal values outside this range, or of the values NaN, positive infinity or negative infinity, is undefined by this specification.

Spatialization/Panning

Background

A common feature requirement for modern 3D games is the ability to dynamically spatialize and move multiple audio sources in 3D space. For example OpenAL has this ability. Using a {{PannerNode}}, an audio stream can be spatialized or positioned in space relative to an {{AudioListener}}. A {{BaseAudioContext}} will contain a single {{AudioListener}}. Both panners and listeners have a position in 3D space using a right-handed cartesian coordinate system. The units used in the coordinate system are not defined, and do not need to be because the effects calculated with these coordinates are independent/invariant of any particular units such as meters or feet. {{PannerNode}} objects (representing the source stream) have an orientation vector representing in which direction the sound is projecting. Additionally, they have a sound cone representing how directional the sound is. For example, the sound could be omnidirectional, in which case it would be heard anywhere regardless of its orientation, or it can be more directional and heard only if it is facing the listener. {{AudioListener}} objects (representing a person's ears) have [=forward=] and [=up=] vectors representing in which direction the person is facing. The coordinate system for spatialization is shown in the diagram below, with the default values shown. The locations for the {{AudioListener}} and {{PannerNode}} are moved from the default positions so we can see things better.
panner-coord
Diagram of the coordinate system with AudioListener and PannerNode attributes shown.
During rendering, the {{PannerNode}} calculates an azimuth and elevation. These values are used internally by the implementation in order to render the spatialization effect. See the Panning Algorithm section for details of how these values are used.

Azimuth and Elevation

The following algorithm MUST be used to calculate the azimuth and elevation for the {{PannerNode}}. The implementation must appropriately account for whether the various {{AudioParam}}s below are "{{AutomationRate/a-rate}}" or "{{AutomationRate/k-rate}}". // Let |context| be a BaseAudioContext and let |panner| be a // PannerNode created in |context|. // Calculate the source-listener vector. const listener = context.listener; const sourcePosition = new Vec3(panner.positionX.value, panner.positionY.value, panner.positionZ.value); const listenerPosition = new Vec3(listener.positionX.value, listener.positionY.value, listener.positionZ.value); const sourceListener = sourcePosition.diff(listenerPosition).normalize(); if (sourceListener.magnitude == 0) { // Handle degenerate case if source and listener are at the same point. azimuth = 0; elevation = 0; return; } // Align axes. const listenerForward = new Vec3(listener.forwardX.value, listener.forwardY.value, listener.forwardZ.value); const listenerUp = new Vec3(listener.upX.value, listener.upY.value, listener.upZ.value); const listenerRight = listenerForward.cross(listenerUp); if (listenerRight.magnitude == 0) { // Handle the case where listener's 'up' and 'forward' vectors are linearly // dependent, in which case 'right' cannot be determined azimuth = 0; elevation = 0; return; } // Determine a unit vector orthogonal to listener's right, forward const listenerRightNorm = listenerRight.normalize(); const listenerForwardNorm = listenerForward.normalize(); const up = listenerRightNorm.cross(listenerForwardNorm); const upProjection = sourceListener.dot(up); const projectedSource = sourceListener.diff(up.scale(upProjection)).normalize(); azimuth = 180 * Math.acos(projectedSource.dot(listenerRightNorm)) / Math.PI; // Source in front or behind the listener. const frontBack = projectedSource.dot(listenerForwardNorm); if (frontBack < 0) azimuth = 360 - azimuth; // Make azimuth relative to "forward" and not "right" listener vector. if ((azimuth >= 0) && (azimuth <= 270)) azimuth = 90 - azimuth; else azimuth = 450 - azimuth; elevation = 90 - 180 * Math.acos(sourceListener.dot(up)) / Math.PI; if (elevation > 90) elevation = 180 - elevation; else if (elevation < -90) elevation = -180 - elevation;

Panning Algorithm

Mono-to-stereo and stereo-to-stereo panning MUST be supported. Mono-to-stereo processing is used when all connections to the input are mono. Otherwise stereo-to-stereo processing is used.

PannerNode "equalpower" Panning

This is a simple and relatively inexpensive algorithm which provides basic, but reasonable results. It is used for the for the {{PannerNode}} when the {{PannerNode/panningModel}} attribute is set to "{{PanningModelType/equalpower}}", in which case the elevation value is ignored. This algorithm MUST be implemented using the appropriate rate as specified by the {{AudioParam/automationRate}}. If any of the {{PannerNode}}'s {{AudioParam}}s or the {{AudioListener}}'s {{AudioParam}}s are "{{AutomationRate/a-rate}}", a-rate processing must be used.
1. For each sample to be computed by this {{AudioNode}}: 1. Let azimuth be the value computed in the azimuth and elevation section. 2. The azimuth value is first contained to be within the range [-90, 90] according to:
			// First, clamp azimuth to allowed range of [-180, 180].
			azimuth = max(-180, azimuth);
			azimuth = min(180, azimuth);

			// Then wrap to range [-90, 90].
			if (azimuth < -90)
				azimuth = -180 - azimuth;
			else if (azimuth > 90)
				azimuth = 180 - azimuth;
			
3. A normalized value x is calculated from azimuth for a mono input as:
			x = (azimuth + 90) / 180;
			
Or for a stereo input as:
			if (azimuth <= 0) { // -90 -> 0
				// Transform the azimuth value from [-90, 0] degrees into the range [-90, 90].
				x = (azimuth + 90) / 90;
			} else { // 0 -> 90
				// Transform the azimuth value from [0, 90] degrees into the range [-90, 90].
				x = azimuth / 90;
			}
			
4. Left and right gain values are calculated as:
			gainL = cos(x * Math.PI / 2);
			gainR = sin(x * Math.PI / 2);
			
5. For mono input, the stereo output is calculated as:
			outputL = input * gainL;
			outputR = input * gainR;
			
Else for stereo input, the output is calculated as:
			if (azimuth <= 0) {
				outputL = inputL + inputR * gainL;
				outputR = inputR * gainR;
			} else {
				outputL = inputL * gainL;
				outputR = inputR + inputL * gainR;
			}
			
6. Apply the distance gain and cone gain where the computation of the distance is described in [[#Spatialization-distance-effects|Distance Effects]] and the cone gain is described in [[#Spatialization-sound-cones|Sound Cones]]:
			let distance = distance();
			let distanceGain = distanceModel(distance);
			let totalGain = coneGain() * distanceGain();
			outputL = totalGain * outputL;
			outputR = totalGain * outputR;
			

PannerNode "HRTF" Panning (Stereo Only)

This requires a set of HRTF (Head-related Transfer Function) impulse responses recorded at a variety of azimuths and elevations. The implementation requires a highly optimized convolution function. It is somewhat more costly than "equalpower", but provides more perceptually spatialized sound.
A diagram showing the process of panning a source using HRTF.

StereoPannerNode Panning

For a {{StereoPannerNode}}, the following algorithm MUST be implemented. 1. For each sample to be computed by this {{AudioNode}} 1. Let pan be the computedValue of the pan {{AudioParam}} of this {{StereoPannerNode}}. 2. Clamp pan to [-1, 1].
			pan = max(-1, pan);
			pan = min(1, pan);
			
3. Calculate x by normalizing pan value to [0, 1]. For mono input:
			x = (pan + 1) / 2;
			
For stereo input:
			if (pan <= 0)
				x = pan + 1;
			else
				x = pan;
			
4. Left and right gain values are calculated as:
			gainL = cos(x * Math.PI / 2);
			gainR = sin(x * Math.PI / 2);
			
5. For mono input, the stereo output is calculated as:
			outputL = input * gainL;
			outputR = input * gainR;
			
Else for stereo input, the output is calculated as:
			if (pan <= 0) {
				outputL = inputL + inputR * gainL;
				outputR = inputR * gainR;
			} else {
				outputL = inputL * gainL;
				outputR = inputR + inputL * gainR;
			}
			

Distance Effects

Sounds which are closer are louder, while sounds further away are quieter. Exactly how a sound's volume changes according to distance from the listener depends on the {{PannerNode/distanceModel}} attribute. During audio rendering, a distance value will be calculated based on the panner and listener positions according to: function distance(panner) { const pannerPosition = new Vec3(panner.positionX.value, panner.positionY.value, panner.positionZ.value); const listener = context.listener; const listenerPosition = new Vec3(listener.positionX.value, listener.positionY.value, listener.positionZ.value); return pannerPosition.diff(listenerPosition).magnitude; } distance will then be used to calculate distanceGain which depends on the {{PannerNode/distanceModel}} attribute. See the {{DistanceModelType}} section for details of how this is calculated for each distance model. As part of its processing, the {{PannerNode}} scales/multiplies the input audio signal by distanceGain to make distant sounds quieter and nearer ones louder.

Sound Cones

The listener and each sound source have an orientation vector describing which way they are facing. Each sound source's sound projection characteristics are described by an inner and outer "cone" describing the sound intensity as a function of the source/listener angle from the source's orientation vector. Thus, a sound source pointing directly at the listener will be louder than if it is pointed off-axis. Sound sources can also be omni-directional. The following diagram ilustrates the relationship between the source's cone with respect to the listener. In the diagram, {{PannerNode/coneInnerAngle}} = 50 and {{PannerNode/coneOuterAngle}} = 120. That is, the inner cone extends 25 deg on each side of the direction vector. Similarly, the outer cone is 60 deg on each side.
cone-diagram
Cone angles for a source in relationship to the source orientation and the listeners position and orientation.
The following algorithm MUST be used to calculate the gain contribution due to the cone effect, given the source (the {{PannerNode}}) and the listener: function coneGain() { const sourceOrientation = new Vec3(source.orientationX, source.orientationY, source.orientationZ); if (sourceOrientation.magnitude == 0 || ((source.coneInnerAngle == 360) && (source.coneOuterAngle == 360))) return 1; // no cone specified - unity gain // Normalized source-listener vector const sourcePosition = new Vec3(panner.positionX.value, panner.positionY.value, panner.positionZ.value); const listenerPosition = new Vec3(listener.positionX.value, listener.positionY.value, listener.positionZ.value); const sourceToListener = sourcePosition.diff(listenerPosition).normalize(); const normalizedSourceOrientation = sourceOrientation.normalize(); // Angle between the source orientation vector and the source-listener vector const angle = 180 * Math.acos(sourceToListener.dot(normalizedSourceOrientation)) / Math.PI; const absAngle = Math.abs(angle); // Divide by 2 here since API is entire angle (not half-angle) const absInnerAngle = Math.abs(source.coneInnerAngle) / 2; const absOuterAngle = Math.abs(source.coneOuterAngle) / 2; let gain = 1; if (absAngle <= absInnerAngle) { // No attenuation gain = 1; } else if (absAngle >= absOuterAngle) { // Max attenuation gain = source.coneOuterGain; } else { // Between inner and outer cones // inner -> outer, x goes from 0 -> 1 const x = (absAngle - absInnerAngle) / (absOuterAngle - absInnerAngle); gain = (1 - x) + source.coneOuterGain * x; } return gain; }

Performance Considerations

Latency

latency
Use cases in which the latency can be important
For web applications, the time delay between mouse and keyboard events (keydown, mousedown, etc.) and a sound being heard is important. This time delay is called latency and is caused by several factors (input device latency, internal buffering latency, DSP processing latency, output device latency, distance of user's ears from speakers, etc.), and is cumulative. The larger this latency is, the less satisfying the user's experience is going to be. In the extreme, it can make musical production or game-play impossible. At moderate levels it can affect timing and give the impression of sounds lagging behind or the game being non-responsive. For musical applications the timing problems affect rhythm. For gaming, the timing problems affect precision of gameplay. For interactive applications, it generally cheapens the users experience much in the same way that very low animation frame-rates do. Depending on the application, a reasonable latency can be from as low as 3-6 milliseconds to 25-50 milliseconds. Implementations will generally seek to minimize overall latency. Along with minimizing overall latency, implementations will generally seek to minimize the difference between an {{AudioContext}}'s currentTime and an {{AudioProcessingEvent}}'s playbackTime. Deprecation of {{ScriptProcessorNode}} will make this consideration less important over time. Additionally, some {{AudioNode}}s can add latency to some paths of the audio graph, notably: * The {{AudioWorkletNode}} can run a script that buffers internally, adding delay to the signal path. * The {{DelayNode}}, whose role is to add controlled latency time. * The {{BiquadFilterNode}} and {{IIRFilterNode}} filter design can delay incoming samples, as a natural consequence of the causal filtering process. * The {{ConvolverNode}} depending on the impulse, can delay incoming samples, as a natural result of the convolution operation. * The {{DynamicsCompressorNode}} has a look ahead algorithm that causes delay in the signal path. * The {{MediaStreamAudioSourceNode}}, {{MediaStreamTrackAudioSourceNode}} and {{MediaStreamAudioDestinationNode}}, depending on the implementation, can add buffers internally that add delays. * The {{ScriptProcessorNode}} can have buffers between the control thread and the rendering thread. * The {{WaveShaperNode}}, when oversampling, and depending on the oversampling technique, add delays to the signal path.

Audio Buffer Copying

When an acquire the content operation is performed on an {{AudioBuffer}}, the entire operation can usually be implemented without copying channel data. In particular, the last step SHOULD be performed lazily at the next {{AudioBuffer/getChannelData()}} call. That means a sequence of consecutive acquire the contents operations with no intervening {{AudioBuffer/getChannelData()}} (e.g. multiple {{AudioBufferSourceNode}}s playing the same {{AudioBuffer}}) can be implemented with no allocations or copying. Implementations can perform an additional optimization: if {{AudioBuffer/getChannelData()}} is called on an {{AudioBuffer}}, fresh {{ArrayBuffer}}s have not yet been allocated, but all invokers of previous acquire the content operations on an {{AudioBuffer}} have stopped using the {{AudioBuffer}}'s data, the raw data buffers can be recycled for use with new {{AudioBuffer}}s, avoiding any reallocation or copying of the channel data.

AudioParam Transitions

While no automatic smoothing is done when directly setting the {{AudioParam/value}} attribute of an {{AudioParam}}, for certain parameters, smooth transition are preferable to directly setting the value. Using the {{AudioParam/setTargetAtTime()}} method with a low timeConstant allows authors to perform a smooth transition.

Audio Glitching

Audio glitches are caused by an interruption of the normal continuous audio stream, resulting in loud clicks and pops. It is considered to be a catastrophic failure of a multi-media system and MUST be avoided. It can be caused by problems with the threads responsible for delivering the audio stream to the hardware, such as scheduling latencies caused by threads not having the proper priority and time-constraints. It can also be caused by the audio DSP trying to do more work than is possible in real-time given the CPU's speed.

Security and Privacy Considerations

Per the [[security-privacy-questionnaire#questions]]: 1. Does this specification deal with personally-identifiable information? It would be possible to perform a hearing test using Web Audio API, thus revealing the range of frequencies audible to a person (this decreases with age). It is difficult to see how this could be done without the realization and consent of the user, as it requires active particpation. 2. Does this specification deal with high-value data? No. Credit card information and the like is not used in Web Audio. It is possible to use Web Audio to process or analyze voice data, which might be a privacy concern, but access to the user's microphone is permission-based via {{getUserMedia()}}. 3. Does this specification introduce new state for an origin that persists across browsing sessions? No. AudioWorklet does not persist across browsing sessions. 4. Does this specification expose persistent, cross-origin state to the web? Yes, the supported audio sample rate(s) and the output device channel count are exposed. See {{AudioContext}}. 5. Does this specification expose any other data to an origin that it doesn’t currently have access to? Yes. When giving various information on available {{AudioNode}}s, the Web Audio API potentially exposes information on characteristic features of the client (such as audio hardware sample-rate) to any page that makes use of the {{AudioNode}} interface. Additionally, timing information can be collected through the {{AnalyserNode}} or {{ScriptProcessorNode}} interface. The information could subsequently be used to create a fingerprint of the client. Research by Princeton CITP's Web Transparency and Accountability Project has shown that {{DynamicsCompressorNode}} and {{OscillatorNode}} can be used to gather entropy from a client to fingerprint a device. This is due to small, and normally inaudible, differences in DSP architecture, resampling strategies and rounding trade-offs between differing implementations. The precise compiler flags used and also the CPU architecture (ARM vs. x86) contribute to this entropy. In practice however, this merely allows deduction of information already readily available by easier means (User Agent string), such as "this is browser X running on platform Y". However, to reduce the possibility of additional fingerprinting, we mandate browsers take action to mitigate fingerprinting issues that might be possible from the output of any node. Fingerprinting via clock skew has been described by Steven J Murdoch and Sebastian Zander. It might be possible to determine this from {{getOutputTimestamp}}. Skew-based fingerprinting has also been demonstrated by Nakibly et. al. for HTML. The [[hr-time-3#sec-privacy-security]] section should be consulted for further information on clock resolution and drift. Fingerprinting via latency is also possible; it might be possible to deduce this from {{baseLatency}} and {{outputLatency}}. Mitigation strategies include adding jitter (dithering) and quantization so that the exact skew is incorrectly reported. Note however that most audio systems aim for low latency, to synchronise the audio generated by WebAudio to other audio or video sources or to visual cues (for example in a game, or an audio recording or music making environment). Excessive latency decreases usability and may be an accessibility issue. Fingerprining via the sample rate of the {{AudioContext}} is also possible. We recommend the following steps to be taken to minimize this: 1. 44.1 kHz and 48 kHz are allowed as default rates; the system will choose between them for best applicability. (Obviously, if the audio device is natively 44.1, 44.1 will be chosen, etc., but also the system may choose the most "compatible" rate—e.g. if the system is natively 96kHz, 48kHz would likely be chosen, not 44.1kHz. 1. The system should resample to one of those two rates for devices that are natively at different rates, despite the fact that this may cause extra battery drain due to resampled audio. (Again, the system will choose the most compatible rate—e.g. if the native system is 16kHz, it's expected that 48kHz would be chosen.) 1. It is expected (though not mandated) that browsers would offer a user affordance to force use of the native rate—e.g. by setting a flag in the browser on the device. This setting would not be exposed in the API. 1. It is also expected behavior that a different rate could be explicitly requested in the constructor for {{AudioContext}} (this is already in the specification; it normally causes the audio rendering to be done at the requested sampleRate, and then up- or down-sampled to the device output), and if that rate is natively supported, the rendering could be passed straight through. This would enable apps to render to higher rates without user intervention (although it's not observable from Web Audio that the audio output is not downsampled on output)—for example, if {{MediaDevices}} capabilities were read (with user intervention) and indicated a higher rate was supported. Fingerprinting via the number of output channels for the {{AudioContext}} is possible as well. We recommend that {{AudioDestinationNode/maxChannelCount}} be set to two (stereo). Stereo is by far the most common number of channels. 6. Does this specification enable new script execution/loading mechanisms? No. It does use the [[HTML]] script execution method, defined in that specification. 7. Does this specification allow an origin access to a user’s location? No. 8. Does this specification allow an origin access to sensors on a user’s device? Not directly. Currently, audio input is not specified in this document, but it will involve gaining access to the client machine's audio input or microphone. This will require asking the user for permission in an appropriate way, probably via the {{getUserMedia()}} API. Additionally, the security and privacy considerations from the Media Capture and Streams specification should be noted. In particular, analysis of ambient audio or playing unique audio may enable identification of user location down to the level of a room or even simultaneous occupation of a room by disparate users or devices. Access to both audio output and audio input might also enable communication between otherwise partitioned contexts in one browser. 9. Does this specification allow an origin access to aspects of a user’s local computing environment? Not directly; all requested sample rates are supported, with upsampling if needed. It is possible to use Media Capture and Streams to probe for supported audio sample rates with MediaTrackSupportedConstraints. This requires explicit user consent. This does provide a small measure of fingerprinting. However, in practice most consumer and prosumer devices use one of two standardized sample rates: 44.1kHz (originally used by CD) and 48kHz (originally used by DAT). Highly resource constrained devices may support the speech-quality 11kHz sample rate, and higher-end devices often support 88.2, 96, or even the audiophile 192kHz rate. Requiring all implementations to upsample to a single, commonly-supported rate such as 48kHz would increase CPU cost for no particular benefit, and requiring higher-end devices to use a lower rate would merely result in Web Audio being labelled as unsuitable for professional use. 10. Does this specification allow an origin access to other devices? It typically does not allow access to other networked devices (an exception in a high-end recording studio might be Dante networked devices, although these typically use a separate, dedicated network). It does of necessity allow access to the user's audio output device or devices, which are sometimes separate units to the computer. For voice or sound-actuated devices, Web Audio API might be used to control other devices. In addition, if the sound-operated device is sensitive to near ultrasonic frequencies, such control might not be audible. This possibility also exists with HTML, through either the <audio> or <video> element. At common audio sampling rates, there is (by design) insufficient headroom for much ultrasonic information: The limit of human hearing is usually stated as 20kHz. For a 44.1kHz sampling rate, the Nyquist limit is 22.05kHz. Given that a true brickwall filter cannot be physically realized, the space between 20kHz and 22.05kHz is used for a rapid rolloff filter to strongly attenuate all frequencies above Nyquist. At 48kHz sampling rate, there is still rapid attenuation in the 20kHz to 24kHz band (but it is easier to avoid phase ripple errors in the passband). 11. Does this specification allow an origin some measure of control over a user agent’s native UI? If the UI has audio components, such as a voice assistant or screenreader, Web Audio API might be used to emulate aspects of the native UI to make an attack seem more like a local system event. This possibility also exists with HTML, through the <audio> element. 12. Does this specification expose temporary identifiers to the web? No. 13. Does this specification distinguish between behavior in first-party and third-party contexts? No. 14. How should this specification work in the context of a user agent’s "incognito" mode? Not differently. 15. Does this specification persist data to a user’s local device? No. 16. Does this specification have a "Security Considerations" and "Privacy Considerations" section? Yes (you are reading it). 17. Does this specification allow downgrading default security characteristics? No.

Requirements and Use Cases

Please see [[webaudio-usecases]].

Common Definitions for Specification Code

This section describes common functions and classes employed by JavaScript code used within this specification.
// Three dimensional vector class.
class Vec3 {
	// Construct from 3 coordinates.
	constructor(x, y, z) {
		this.x = x;
		this.y = y;
		this.z = z;
	}

	// Dot product with another vector.
	dot(v) {
		return (this.x * v.x) + (this.y * v.y) + (this.z * v.z);
	}

	// Cross product with another vector.
	cross(v) {
		return new Vec3((this.y * v.z) - (this.z * v.y),
			(this.z * v.x) - (this.x * v.z),
			(this.x * v.y) - (this.y * v.x));
	}

	// Difference with another vector.
	diff(v) {
		return new Vec3(this.x - v.x, this.y - v.y, this.z - v.z);
	}

	// Get the magnitude of this vector.
	get magnitude() {
		return Math.sqrt(dot(this));
	}

	// Get a copy of this vector multiplied by a scalar.
	scale(s) {
		return new Vec3(this.x * s, this.y * s, this.z * s);
	}

	// Get a normalized copy of this vector.
	normalize() {
		const m = magnitude;
		if (m == 0) {
			return new Vec3(0, 0, 0);
		}
		return scale(1 / m);
	}
}

Change Log

Changes since Recommendation of 17 Jun 2021

* Issue 2361: Use new Web IDL buffer primitives
* Issue 127: RangeError is thrown only for negative cancelTime
* Issue 2359: Fix a typo in the VUMeterNode example
* Issue 2373: Fix a typo: initially instead of initialy
* Issue 2321: Warn about corrupted fils in decodeAudioData.
* Issue 2375: decodeAudioData only decodes the first track of a multi-track audio file.

Since Proposed Recommendation of 6 May 2021

* Styling, status and boilerplate updates for Recommendation * Updated links to RFC2119, High-Resolution Time, and Audio EQ Cookbook * A spelling error was corrected

Since Candidate Recommendation of 14 January 2021

* PR 2333: Update links to point to W3C versions * PR 2334: Use bikeshed to link to ErrorEvent * PR 2331: Add MIMESniff to normative references * PR 2328: MediaStream must be resampled to match the context sample rate * PR 2318: Restore empty of pending processor construction data after successful initialization of AudioWorkProcessor#port. * PR 2317: Standardize h3/h4 interface and dictionary markup * PR 2312: Rework description of control thread state and rendering thread state * PR 2311: Adjust the steps to process a context's regular task queue * PR 2310: OscillatorNode output is mono * PR 2308: Refine phrasing for "allowed to start" * PR 2307: Replace "queue a task" with "queue a media element task" * PR 2306: Move some steps from AudioWorkletProcessor constructor to the instantiation algorithm * PR 2304: Add required components for ES operations in the rendering loop * PR 2301: Define when and how regular tasks are processed wrt the processing model * PR 2286: Clean up ABSN start algorithm * PR 2277: Fix compression curve diagram * PR 2273: Clarify units used in threshold & knee value calculations * PR 2256: ABSN extrapolates the last output * PR 2250: Use FrozenArray for AudioWorkletProcessor process() * PR 2298: Bikeshed HTML validation issues

Since Candidate Recommendation of 11 June 2020

* PR 2202: Fixed wrong optionality of IIRFilterNode options * Issue 2191: Restrict sounds beyond normal hearing * PR 2210: Return rejected promise when the document is not fully active, for operations returning promises * Issue 2191: Destination of request created by `addModule` * Issue 2213: The message queue is for message running on the rendering thread. * Issue 2216: Use inclusive language in the spec * PR 2219: Update more terminology in images and markdown documents * Issue 2206: PannerNode.rollOffFactor with "linear" distance model is not clamped to [0, 1] in main browser engines * Issue 2169: AudioParamDescriptor has member constraints that are redundant * Issue 1457: [privacy] Exposing data to an origin: fingerprinting * Issue 2061: Privacy re-review of latest changes * Issue 2225: Describe "Planar versus interleaved buffers" * Issue 2231: WaveShaper [[curve set]] not defined * Issue 2240: Align with Web IDL specification * Issue 2242: LInk to undefined instead of using `` * Issue 2227: Clarify buffer.copyToChannel() must be called before source.buffer = buffer else nothing is played * PR 2253: Fix duplicated IDs for decode callbacks * Issue 2252: When are promises in "[[pending resume promises]]" resolved? * PR 2266: Prohibit arbitrary termination of AudioWorkletGlobalScopes

Since Candidate Recommendation of 18 September 2018

* Issue 2193: Incorrect azimuth comparison in spatialization algorithm * Issue 2192: Waveshaper curve interpolation algorithm incorrect * Issue 2171: Allow not having get parameterDescriptors in an AudioWorkletProcessor * Issue 2184: PannerNode refDistance description unclear * Issue 2165: AudioScheduledSourceNode start algorithm incomplete * Issue 2155: Restore changes accidentally reverted in bikeshed conversion * Issue 2154: Exception for changing channelCountMode on ScriptProcessorNode does not match browsers * Issue 2153: Exception for changing channelCount on ScriptProcessorNode does not match browsers * Issue 2152: close() steps don't make sense * Issue 2150: AudioBufferOptions requires throwing NotFoundError in cases that can't happen * Issue 2149: MediaStreamAudioSourceNode constructor has weird check for AudioContext * Issue 2148: IIRFilterOptions description makes impossible demands * Issue 2147: PeriodicWave constructor examines lengths of things that might not be there * Issue 2113: BiquadFilter gain lower bound can be lower. * Issue 2096: Lifetime of pending processor construction data and exceptions in instantiation of AudioWorkletProcessor * Issue 2087: Minor issues with BiquadFilter AudioParams * Issue 2083: Missing text in WaveShaperNode? * Issue 2082: WaveShaperNode curve interpolation incomplete * Issue 2074: Should the AudioWorkletNode constructor invoke the algorithm for initializing an object that inherits from AudioNode? * Issue 2073: Inconsistencies in constructor descriptions and factory method initialization * Issue 2072: Clarification on `AudioBufferSourceNode` looping, and loop points * Issue 2071: cancelScheduledValues with setValueCurveAtTime * Issue 2060: Would it be helpful to restrict use of `AudioWorkletProcessor.port().postMessage()` in order to facilitate garbage collection? * Issue 2051: Update to constructor operations * Issue 2050: Restore ConvolverNode channel mixing configurability (up to 2 channels) * Issue 2045: Should the check on `process()` be removed from `AudioWorkletGlobalScope.registerProcessor()`? * Issue 2044: Remove `options` parameter from `AudioWorkletProcessor` constructor WebIDL * Issue 2036: Remove `options` parameter of `AudioWorkletProcessor` constructor * Issue 2035: De-duplicate initial value setting on AudioWorkletNode AudioParams * Issue 2027: Revise "processor construction data" algorithm * Issue 2021: AudioWorkletProcessor constructor leads to infinite recursion * Issue 2018: There are still issues with the setup of an AudioWorkletNode's parameters * Issue 2016: Clarify `parameters` in AudioWorkletProcessor.process() * Issue 2011: AudioWorkletNodeOptions.processorOptions should not default to null. * Issue 1989: Please update to Web IDL changes to optional dictionary defaulting * Issue 1984: Handling of exceptions in audio worklet is not very clear * Issue 1976: AudioWorkletProcessor's [[node reference]] seems to be write-only * Issue 1972: parameterDescriptors handling during AudioWorkletNode initialization is probably wrong * Issue 1971: AudioWorkletNode options serialization is underdefined * Issue 1970: "active source" flag handling is a weird monkeypatch * Issue 1969: It would be clearer if the various validation of AudioWorkletNodeOptions were an explicit step or set of steps * Issue 1966: parameterDescriptors is not looked up by the AudioWorkletProcessor constructor * Issue 1963: NewTarget check for AudioWorkletProcessor isn't actually possible with a Web IDL constructor * Issue 1947: Spec is inconsistent about whether parameterDescriptors is an array or an iterable * Issue 1946: Population of "node name to parameter descriptor map" needs to be defined * Issue 1945: registerProcessor is doing odd things with threads and JS values * Issue 1943: Describe how WaveShaperNode shapes the input with the curve * Issue 1935: length of AudioWorkletProcessor.process() parameter sequences with inactive inputs * Issue 1932: Make AudioWorkletNode output buffer available for reading * Issue 1925: front vs forward * Issue 1902: Mixer Gain Structure section not needed * Issue 1906: Steps in rendering algorithm * Issue 1905: Rendering callbacks are observable * Issue 1904: Strange Note in algorithm for swapping a control message queue * Issue 1903: Funny sentence about priority and latency * Issue 1901: AudioWorkletNode state property? * Issue 1900: AudioWorkletProcessor NewTarget undefined * Issue 1899: Missing synchronous markers * Issue 1897: WaveShaper curve value setter allows multiple sets * Issue 1896: WaveShaperNode constructor says curve set is initialized to false * Issue #1471: AudioNode Lifetime section seems to attempt to make garbage collection observable * Issue #1893: Active processing for Panner/Convolver/ChannelMerger * Issue #1894: Funny text in PannerNode.orientationX * Issue #1866: References to garbage collection * Issue #1851: Parameter values used for BiquadFilterNode::getFrequencyResponse * Issue #1905: Rendering callbacks are observable * Issue #1879: ABSN playback algorithm offset * Issue #1882: Biquad lowpass/highpass Q * Issue #1303: MediaElementAudioSourceNode information in a funny place * Issue #1896: WaveShaperNode constructor says curve set is initialized to false * Issue #1897: WaveShaper curve value setter allows multiple sets. * Issue #1880: setOrientation description has confusing paragraph * Issue #1855: createScriptProcessor parameter requirements * Issue #1857: Fix typos and bad phrasing * Issue #1788: Unclear what value is returned by AudioParam.value * Issue #1852: Fix error condition of AudioNode.disconnect(destinationNode, output, input) * Issue #1841: Recovering from unstable biquad filters? * Issue #1777: Picture of the coordinate system for panner node * Issue #1802: Clarify interaction between user-invoked suspend and autoplay policy * Issue #1822: OfflineAudioContext.suspend can suspend before the given time * Issue #1772: Sorting tracks alphabetically is underspecified * Issue #1797: Specification is incomplete for AudioNode.connect() * Issue #1805: Exception ordering on error * Issue #1790: Automation example chart has an error (reversed function arguments * Fix rendering algorithm iteration and cycle breaking * Issue #1719: channel count changes in filter nodes with tail time * Issue #1563: Make decodeAudioData more precise * Issue #1481: Tighten spec on ABSN output channels? * Issue #1762: Setting convolver buffer more than once? * Issue #1758: Explicitly include time-domain processing code for BiquadFilterNode * Issue #1770: Link to correct algorithm for StereoPannerNode, mention algorithm is equal-power * Issue #1753: Have a single `AudioWorkletGlobalScope` per `BaseAudioContext` * Issue #1746: AnalyserNode: Clarify how much time domain data we're supposed to keep around * Issue #1741: Sample rate of AudioBuffer * Issue #1745: Clarify unit of fftSize * Issue #1743: Missing normative reference to Fetch * Use "get a reference to the bytes" algorithm as needed. * Specify rules for determining output chanel count. * Clarified rendering algorithm for AudioListener.

Since Working Draft of 19 June 2018

* Minor editorial clarifications. * Update implementation-report.html. * Widen the valid range of detune values so that any value that doesn't cause 2^(d/1200) to overflow is valid. * PannerNode constructor throws errors. * Rephrase algorithm for setting buffer and curve. * Refine startRendering algorithm. * Make "queue a task" link to the HTML spec. * Specify more precisely, events overlapping with SetValueCurveAtTime. * Add implementation report to gh-pages. * Honor the given value in `outputChannelCount`. * Initialize bufferDuration outside of process() in ABSN algorithm. * Rework definition of ABSN output behavior to account for playbackRate’s interaction with the start(…duration) argument. * Add mention of video element in ultrasonic attack surface.

Since Working Draft of 08 December 2015

* Add AudioWorklet and related interfaces to support custom nodes. This replaces ScriptProcessorNode, which is now deprecated. * Explicitly say what the channel count, mode, and interpretation values are for all source nodes. * Specify the behavior of Web Audio when a document is unloaded. * Merge the proposed SpatialListener interface into AudioListener. * Rework and clean up algorithms for panning and spatialization and define "magic functions". * Clarify that AudioBufferSourceNode looping is limited by duration argument to start(). * Add constructors with options dictionaries for all node types. * Clarify parameter automation method behavior and equations. Handle cases where automation methods may interact with each other. * Support latency hints and arbitrary sample rates in AudioContext constructor. * Clear up ambiguities in definitions of start() and stop() for scheduled sources. * Remove automatic dezippering from AudioParam value setters which now equate to setValueAtTime(). * Specify normative behavior of DynamicsCompressorNode. * Specify that AudioParam.value returns the most recent computed value. * Permit AudioBufferSourceNode to specify sub-sample start, duration, loopStart and loopEnd. Respecify algorithms to say exactly how looping works in all scenarios, including dynamic and negative playback rates. * Harmonized behavior of IIRFilterNode with BiquadFilterNode. * Add diagram describing mono-input-to-matrixed-stereo case. * Prevent connecting an AudioNode to an AudioParam of a different AudioContext. * Added Audioparam cancelAndHoldAtTime * Clarify behaviour of AudioParam.cancelScheduledValues(). * Add playing reference to MediaElementAudioSourceNodes and MediaStreamAudioSourceNodes. * Refactor BaseAudioContext interface out of AudioContext, OfflineAudioContext. * OfflineAudioContext inherits from BaseAudioContext, not AudioContext. * "StereoPanner" replaced with the correct "StereoPannerNode". * Support chaining on AudioNode.connect() and AudioParam automation methods. * Specify behavior of events following SetTarget events. * Reinstate channelCount declaration for AnalyserNode. * Specify exponential ramp behavior when previous value is 0. * Specify behavior of setValueCurveAtTime parameters. * Add spatialListener attribute to AudioContext. * Remove section titled "Doppler Shift". * Added a list of nodes and reason why they can add latency, in an informative section. * Speced nominal ranges, nyquist, and behavior when outside the range. * Spec the processing model for the Web Audio API. * Merge the SpatialPannerNode into the PannerNode, undeprecating the PannerNode. * Merge the SpatialListener into the AudioListener, undeprecating the AudioListener. * Added latencyHint(s). * Move the constructor from BaseAudioContext to AudioContext where it belongs; BaseAudioContext is not constructible. * Specified the Behavior of automations and nominal ranges. * The playbackRate is widened to +/- infinity. * setValueCurveAtTime is modified so that an implicit call to setValueAtTime is made at the end of the curve duration. * Make setting the `value` attribute of an `AudioParam` strictly equivalent of calling setValueAtTime with AudioContext.currentTime. * Add new sections for AudioContextOptions and AudioTimestamp. * Add constructor for all nodes. * Define ConstantSourceNode. * Make the WaveShaperNode have a tail time, depending on the oversampling level. * Allow collecting MediaStreamAudioSourceNode or MediaElementAudioSourceNode when they won't play ever again. * Add a concept of 'allowed to start' and use it when creating an AudioContext and resuming it from resume() (closes #836). * Add AudioScheduledSourceNode base class for source nodes. * Mark all AudioParams as being k-rate.

Acknowledgements

This specification is the collective work of the W3C Audio Working Group. Members and former members of the Working Group and contributors to the specification are (at the time of writing, and by alphabetical order):
Adenot, Paul (Mozilla Foundation) - Specification Co-editor; Akhgari, Ehsan (Mozilla Foundation); Becker, Steven (Microsoft Corporation); Berkovitz, Joe (Invited Expert, affiliated with Noteflight/Hal Leonard) - WG co-chair from September 2013 to December 2017); Bossart, Pierre (Intel Corporation); Borins, Myles (Google, Inc); Buffa, Michel (NSAU); Caceres, Marcos (Invited Expert); Cardoso, Gabriel (INRIA); Carlson, Eric (Apple, Inc); Chen, Bin (Baidu, Inc); Choi, Hongchan (Google, Inc) - Specification Co-editor; Collichio, Lisa (Qualcomm); Geelnard, Marcus (Opera Software); Gehring, Todd (Dolby Laboratories); Goode, Adam (Google, Inc); Gregan, Matthew (Mozilla Foundation); Hikawa, Kazuo (AMEI); Hofmann, Bill (Dolby Laboratories); Jägenstedt, Philip (Google, Inc); Jeong, Paul Changjin (HTML5 Converged Technology Forum); Kalliokoski, Jussi (Invited Expert); Lee, WonSuk (Electronics and Telecommunications Research Institute); Kakishita, Masahiro (AMEI); Kawai, Ryoya (AMEI); Kostiainen, Anssi (Intel Corporation); Lilley, Chris (W3C Staff); Lowis, Chris (Invited Expert) - WG co-chair from December 2012 to September 2013, affiliated with British Broadcasting Corporation; MacDonald, Alistair (W3C Invited Experts) — WG co-chair from March 2011 to July 2012; Mandyam, Giridhar (Qualcomm Innovation Center, Inc); Michel, Thierry (W3C/ERCIM); Nair, Varun (Facebook); Needham, Chris (British Broadcasting Corporation); Noble, Jer (Apple, Inc); O'Callahan, Robert(Mozilla Foundation); Onumonu, Anthony (British Broadcasting Corporation); Paradis, Matthew (British Broadcasting Corporation) - WG co-chair from September 2013 to present; Pozdnyakov, Mikhail (Intel Corporation); Raman, T.V. (Google, Inc); Rogers, Chris (Google, Inc); Schepers, Doug (W3C/MIT); Schmitz, Alexander (JS Foundation); Shires, Glen (Google, Inc); Smith, Jerry (Microsoft Corporation); Smith, Michael (W3C/Keio); Thereaux, Olivier (British Broadcasting Corporation); Toy, Raymond (Google, Inc.) - WG co-chair from December 2017 - Present; Toyoshima, Takashi (Google, Inc); Troncy, Raphael (Institut Telecom); Verdie, Jean-Charles (MStar Semiconductor, Inc.); Wei, James (Intel Corporation); Weitnauer, Michael (IRT); Wilson, Chris (Google,Inc); Zergaoui, Mohamed (INNOVIMAX) ================================================ FILE: samples/BitBake/cmake.bbclass ================================================ # # Copyright OpenEmbedded Contributors # # SPDX-License-Identifier: MIT # # Path to the CMake file to process. OECMAKE_SOURCEPATH ??= "${S}" DEPENDS:prepend = "cmake-native " B = "${WORKDIR}/build" # What CMake generator to use. # The supported options are "Unix Makefiles" or "Ninja". OECMAKE_GENERATOR ?= "Ninja" python() { generator = d.getVar("OECMAKE_GENERATOR") if "Unix Makefiles" in generator: args = "-G '" + generator + "' -DCMAKE_MAKE_PROGRAM=" + d.getVar("MAKE") d.setVar("OECMAKE_GENERATOR_ARGS", args) d.setVarFlag("do_compile", "progress", "percent") elif "Ninja" in generator: args = "-G '" + generator + "' -DCMAKE_MAKE_PROGRAM=ninja" d.appendVar("DEPENDS", " ninja-native") d.setVar("OECMAKE_GENERATOR_ARGS", args) d.setVarFlag("do_compile", "progress", r"outof:^\[(\d+)/(\d+)\]\s+") else: bb.fatal("Unknown CMake Generator %s" % generator) } OECMAKE_AR ?= "${AR}" # Compiler flags OECMAKE_C_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CFLAGS}" OECMAKE_CXX_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS}" OECMAKE_C_FLAGS_RELEASE ?= "-DNDEBUG" OECMAKE_CXX_FLAGS_RELEASE ?= "-DNDEBUG" OECMAKE_C_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CPPFLAGS} ${LDFLAGS}" OECMAKE_CXX_LINK_FLAGS ?= "${HOST_CC_ARCH} ${TOOLCHAIN_OPTIONS} ${CXXFLAGS} ${LDFLAGS}" def oecmake_map_compiler(compiler, d): args = d.getVar(compiler).split() if args[0] == "ccache": return args[1], args[0] return args[0], "" # C/C++ Compiler (without cpu arch/tune arguments) OECMAKE_C_COMPILER ?= "${@oecmake_map_compiler('CC', d)[0]}" OECMAKE_C_COMPILER_LAUNCHER ?= "${@oecmake_map_compiler('CC', d)[1]}" OECMAKE_CXX_COMPILER ?= "${@oecmake_map_compiler('CXX', d)[0]}" OECMAKE_CXX_COMPILER_LAUNCHER ?= "${@oecmake_map_compiler('CXX', d)[1]}" # clear compiler vars for allarch to avoid sig hash difference OECMAKE_C_COMPILER:allarch = "" OECMAKE_C_COMPILER_LAUNCHER:allarch = "" OECMAKE_CXX_COMPILER:allarch = "" OECMAKE_CXX_COMPILER_LAUNCHER:allarch = "" OECMAKE_RPATH ?= "" OECMAKE_PERLNATIVE_DIR ??= "" OECMAKE_EXTRA_ROOT_PATH ?= "" OECMAKE_FIND_ROOT_PATH_MODE_PROGRAM = "ONLY" EXTRA_OECMAKE:append = " ${PACKAGECONFIG_CONFARGS}" export CMAKE_BUILD_PARALLEL_LEVEL CMAKE_BUILD_PARALLEL_LEVEL:task-compile = "${@oe.utils.parallel_make(d, False)}" CMAKE_BUILD_PARALLEL_LEVEL:task-install = "${@oe.utils.parallel_make(d, True)}" OECMAKE_TARGET_COMPILE ?= "all" OECMAKE_TARGET_INSTALL ?= "install" def map_host_os_to_system_name(host_os): if host_os.startswith('mingw'): return 'Windows' if host_os.startswith('linux'): return 'Linux' return host_os # CMake expects target architectures in the format of uname(2), # which do not always match TARGET_ARCH, so all the necessary # conversions should happen here. def map_host_arch_to_uname_arch(host_arch): if host_arch == "powerpc": return "ppc" if host_arch == "powerpc64le": return "ppc64le" if host_arch == "powerpc64": return "ppc64" return host_arch cmake_do_generate_toolchain_file() { if [ "${BUILD_SYS}" = "${HOST_SYS}" ]; then cmake_crosscompiling="set( CMAKE_CROSSCOMPILING FALSE )" else cmake_sysroot="set( CMAKE_SYSROOT \"${RECIPE_SYSROOT}\" )" fi cat > ${WORKDIR}/toolchain.cmake <> ${S}/mkspecs/oe-device-extra.pri fi } RDEPENDS:${PN}:append:rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}" DEPENDS:append:rpi = "${@bb.utils.contains('MACHINE_FEATURES', 'vc4graphics', '', ' userland', d)}" ================================================ FILE: samples/BitBake/tclibc-newlib.inc ================================================ # # Newlib configuration # LIBCEXTENSION = "-newlib" LIBCOVERRIDE = ":libc-newlib" PREFERRED_PROVIDER_virtual/libc ?= "newlib" PREFERRED_PROVIDER_virtual/libiconv ?= "newlib" PREFERRED_PROVIDER_virtual/libintl ?= "newlib" PREFERRED_PROVIDER_virtual/nativesdk-libintl ?= "nativesdk-glibc" PREFERRED_PROVIDER_virtual/nativesdk-libiconv ?= "nativesdk-glibc" DISTRO_FEATURES_BACKFILL_CONSIDERED += "ldconfig" #USE_NLS ?= "no" IMAGE_LINGUAS = "" LIBC_DEPENDENCIES = "\ newlib-dbg \ newlib-dev \ libgloss \ libgloss-dev \ libgloss-dbg \ libgcc-dev \ libgcc-dbg \ libstdc++-dev \ libstdc++-staticdev \ " ASSUME_PROVIDED += "virtual/crypt" # Its useful to be able to extend newlib, but we dont provide a native variant of libgloss NEWLIB_EXTENDED ?= "libgloss libgcc" BASE_DEFAULT_DEPS:append:class-target = " ${NEWLIB_EXTENDED}" TARGET_OS = "elf" TARGET_OS:arm = "eabi" TOOLCHAIN_HOST_TASK ?= "packagegroup-cross-canadian-${MACHINE} nativesdk-qemu nativesdk-sdk-provides-dummy" TOOLCHAIN_TARGET_TASK ?= "${LIBC_DEPENDENCIES}" TOOLCHAIN_NEED_CONFIGSITE_CACHE:remove = "zlib ncurses" # disable pie security flags by default SECURITY_CFLAGS:libc-newlib = "${SECURITY_NOPIE_CFLAGS}" SECURITY_LDFLAGS:libc-newlib = "" ================================================ FILE: samples/BitBake/xorg-driver-common.inc ================================================ SUMMARY = "X driver" HOMEPAGE = "http://www.x.org" BUGTRACKER = "https://bugs.freedesktop.org" SECTION = "x11/drivers" LICENSE = "MIT" PE = "2" DEPENDS = "virtual/xserver xorgproto util-macros" XORG_DRIVER_COMPRESSOR ?= ".tar.bz2" SRC_URI = "${XORG_MIRROR}/individual/driver/${BPN}-${PV}${XORG_DRIVER_COMPRESSOR}" FILES:${PN} += " ${libdir}/xorg/modules/drivers/*.so" XORGBUILDCLASS ??= "autotools" inherit ${XORGBUILDCLASS} pkgconfig features_check # depends on virtual/xserver REQUIRED_DISTRO_FEATURES = "x11" # FIXME: We don't want to include the libtool archives (*.la) from modules # directory, as they serve no useful purpose. Upstream should fix Makefile.am do_install:append() { find ${D}${libdir}/xorg/modules -regex ".*\.la$" | xargs rm -f -- } # Function to add the relevant ABI dependency to drivers, which should be called # from a PACKAGEFUNC. def _add_xorg_abi_depends(d, name): # Map of ABI names exposed in the dependencies to pkg-config variables abis = { "video": "abi_videodrv", "input": "abi_xinput" } output = os.popen("pkg-config xorg-server --variable=%s" % abis[name]).read() mlprefix = d.getVar('MLPREFIX') or '' abi = "%sxorg-abi-%s-%s" % (mlprefix, name, output.split(".")[0]) pn = d.getVar("PN") d.appendVar('RDEPENDS:' + pn, ' ' + abi) SECURITY_LDFLAGS = "${SECURITY_X_LDFLAGS}" ================================================ FILE: samples/Blade/hello.blade ================================================ @yield('title', 'We love GitHub') @stack('scripts') @stack('styles') @include('partials.nav') @yield('content')
    @foreach($foo as $bar)
  • {{ $bar }}
  • @endforeach
{!! $raw_content !!} ================================================ FILE: samples/Blade/hello.blade.php ================================================ @yield('title', 'We love GitHub') @stack('scripts') @stack('styles') @include('partials.nav') @yield('content')
    @foreach($foo as $bar)
  • {{ $bar }}
  • @endforeach
{!! $raw_content !!} ================================================ FILE: samples/BlitzBasic/HalfAndDouble.bb ================================================ Local bk = CreateBank(8) PokeFloat bk, 0, -1 Print Bin(PeekInt(bk, 0)) Print %1000000000000000 Print Bin(1 Shl 31) Print $1f Print $ff Print $1f + (127 - 15) Print Hex(%01111111100000000000000000000000) Print Hex(~%11111111100000000000000000000000) Print Bin(FloatToHalf(-2.5)) Print HalfToFloat(FloatToHalf(-200000000000.0)) Print Bin(FToI(-2.5)) WaitKey End ; Half-precision (16-bit) arithmetic library ;============================================ Global Half_CBank_ Function FToI(f#) If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4) PokeFloat Half_CBank_, 0, f Return PeekInt(Half_CBank_, 0) End Function Function HalfToFloat#(h) Local signBit, exponent, fraction, fBits signBit = (h And 32768) <> 0 exponent = (h And %0111110000000000) Shr 10 fraction = (h And %0000001111111111) If exponent = $1F Then exponent = $FF : ElseIf exponent Then exponent = (exponent - 15) + 127 fBits = (signBit Shl 31) Or (exponent Shl 23) Or (fraction Shl 13) If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4) PokeInt Half_CBank_, 0, fBits Return PeekFloat(Half_CBank_, 0) End Function Function FloatToHalf(f#) Local signBit, exponent, fraction, fBits If Half_CBank_ = 0 Then Half_CBank_ = CreateBank(4) PokeFloat Half_CBank_, 0, f fBits = PeekInt(Half_CBank_, 0) signBit = (fBits And (1 Shl 31)) <> 0 exponent = (fBits And $7F800000) Shr 23 fraction = fBits And $007FFFFF If exponent exponent = exponent - 127 If Abs(exponent) > $1F If exponent <> ($FF - 127) Then fraction = 0 exponent = $1F * Sgn(exponent) Else exponent = exponent + 15 EndIf exponent = exponent And %11111 EndIf fraction = fraction Shr 13 Return (signBit Shl 15) Or (exponent Shl 10) Or fraction End Function Function HalfAdd(l, r) End Function Function HalfSub(l, r) End Function Function HalfMul(l, r) End Function Function HalfDiv(l, r) End Function Function HalfLT(l, r) End Function Function HalfGT(l, r) End Function ; Double-precision (64-bit) arithmetic library) ;=============================================== Global DoubleOut[1], Double_CBank_ Function DoubleToFloat#(d[1]) End Function Function FloatToDouble(f#) End Function Function IntToDouble(i) End Function Function SefToDouble(s, e, f) End Function Function DoubleAdd(l, r) End Function Function DoubleSub(l, r) End Function Function DoubleMul(l, r) End Function Function DoubleDiv(l, r) End Function Function DoubleLT(l, r) End Function Function DoubleGT(l, r) End Function ;~IDEal Editor Parameters: ;~F#1A#20#2F ;~C#Blitz3D ================================================ FILE: samples/BlitzBasic/LList.bb ================================================ ; Double-linked list container class ;==================================== ; with thanks to MusicianKool, for concept and issue fixes Type LList Field head_.ListNode Field tail_.ListNode End Type Type ListNode Field pv_.ListNode Field nx_.ListNode Field Value End Type Type Iterator Field Value Field l_.LList Field cn_.ListNode, cni_ End Type ;Create a new LList object Function CreateList.LList() Local l.LList = New LList l\head_ = New ListNode l\tail_ = New ListNode l\head_\nx_ = l\tail_ ;End caps l\head_\pv_ = l\head_ ;These make it more or less safe to iterate freely l\head_\Value = 0 l\tail_\nx_ = l\tail_ l\tail_\pv_ = l\head_ l\tail_\Value = 0 Return l End Function ;Free a list and all elements (not any values) Function FreeList(l.LList) ClearList l Delete l\head_ Delete l\tail_ Delete l End Function ;Remove all the elements from a list (does not free values) Function ClearList(l.LList) Local n.ListNode = l\head_\nx_ While n <> l\tail_ Local nx.ListNode = n\nx_ Delete n n = nx Wend l\head_\nx_ = l\tail_ l\tail_\pv_ = l\head_ End Function ;Count the number of elements in a list (slow) Function ListLength(l.LList) Local i.Iterator = GetIterator(l), elems While EachIn(i) elems = elems + 1 Wend Return elems End Function ;Return True if a list contains a given value Function ListContains(l.LList, Value) Return (ListFindNode(l, Value) <> Null) End Function ;Create a linked list from the intvalues in a bank (slow) Function ListFromBank.LList(bank) Local l.LList = CreateList() Local size = BankSize(bank), p For p = 0 To size - 4 Step 4 ListAddLast l, PeekInt(bank, p) Next Return l End Function ;Create a bank containing all the values in a list (slow) Function ListToBank(l.LList) Local size = ListLength(l) * 4 Local bank = CreateBank(size) Local i.Iterator = GetIterator(l), p = 0 While EachIn(i) PokeInt bank, p, i\Value p = p + 4 Wend Return bank End Function ;Swap the contents of two list objects Function SwapLists(l1.LList, l2.LList) Local tempH.ListNode = l1\head_, tempT.ListNode = l1\tail_ l1\head_ = l2\head_ l1\tail_ = l2\tail_ l2\head_ = tempH l2\tail_ = tempT End Function ;Create a new list containing the same values as the first Function CopyList.LList(lo.LList) Local ln.LList = CreateList() Local i.Iterator = GetIterator(lo) : While EachIn(i) ListAddLast ln, i\Value Wend Return ln End Function ;Reverse the order of elements of a list Function ReverseList(l.LList) Local n1.ListNode, n2.ListNode, tmp.ListNode n1 = l\head_ n2 = l\head_\nx_ While n1 <> l\tail_ n1\pv_ = n2 tmp = n2\nx_ n2\nx_ = n1 n1 = n2 n2 = tmp Wend tmp = l\head_ l\head_ = l\tail_ l\tail_ = tmp l\head_\pv_ = l\head_ l\tail_\nx_ = l\tail_ End Function ;Search a list to retrieve the first node with the given value Function ListFindNode.ListNode(l.LList, Value) Local n.ListNode = l\head_\nx_ While n <> l\tail_ If n\Value = Value Then Return n n = n\nx_ Wend Return Null End Function ;Append a value to the end of a list (fast) and return the node Function ListAddLast.ListNode(l.LList, Value) Local n.ListNode = New ListNode n\pv_ = l\tail_\pv_ n\nx_ = l\tail_ n\Value = Value l\tail_\pv_ = n n\pv_\nx_ = n Return n End Function ;Attach a value to the start of a list (fast) and return the node Function ListAddFirst.ListNode(l.LList, Value) Local n.ListNode = New ListNode n\pv_ = l\head_ n\nx_ = l\head_\nx_ n\Value = Value l\head_\nx_ = n n\nx_\pv_ = n Return n End Function ;Remove the first occurence of the given value from a list Function ListRemove(l.LList, Value) Local n.ListNode = ListFindNode(l, Value) If n <> Null Then RemoveListNode n End Function ;Remove a node from a list Function RemoveListNode(n.ListNode) n\pv_\nx_ = n\nx_ n\nx_\pv_ = n\pv_ Delete n End Function ;Return the value of the element at the given position from the start of the list, ;or backwards from the end of the list for a negative index Function ValueAtIndex(l.LList, index) Local n.ListNode = ListNodeAtIndex(l, index) If n <> Null Then Return n\Value : Else Return 0 End Function ;Return the ListNode at the given position from the start of the list, or backwards ;from the end of the list for a negative index, or Null if invalid Function ListNodeAtIndex.ListNode(l.LList, index) Local e, n.ListNode If index >= 0 n = l\head_ For e = 0 To index n = n\nx_ Next If n = l\tail_ Then n = Null ;Beyond the end of the list - not valid Else ;Negative index - count backward n = l\tail_ For e = 0 To index Step -1 n = n\pv_ Next If n = l\head_ Then n = Null ;Before the start of the list - not valid EndIf Return n End Function ;Replace a value at the given position (added by MusicianKool) Function ReplaceValueAtIndex(l.LList,index,value) Local n.ListNode = ListNodeAtIndex(l,index) If n <> Null Then n\Value = value:Else Return 0 End Function ;Remove and return a value at the given position (added by MusicianKool) Function RemoveNodeAtIndex(l.LList,index) Local n.ListNode = ListNodeAtIndex(l,index),tval If n <> Null Then tval = n\Value:RemoveListNode(n):Return tval:Else Return 0 End Function ;Retrieve the first value from a list Function ListFirst(l.LList) If l\head_\nx_ <> l\tail_ Then Return l\head_\nx_\Value End Function ;Retrieve the last value from a list Function ListLast(l.LList) If l\tail_\pv_ <> l\head_ Then Return l\tail_\pv_\Value End Function ;Remove the first element from a list, and return its value Function ListRemoveFirst(l.LList) Local val If l\head_\nx_ <> l\tail_ val = l\head_\nx_\Value RemoveListNode l\head_\nx_ EndIf Return val End Function ;Remove the last element from a list, and return its value Function ListRemoveLast(l.LList) Local val If l\tail_\pv_ <> l\head_ val = l\tail_\pv_\Value RemoveListNode l\tail_\pv_ EndIf Return val End Function ;Insert a value into a list before the specified node, and return the new node Function InsertBeforeNode.ListNode(Value, n.ListNode) Local bef.ListNode = New ListNode bef\pv_ = n\pv_ bef\nx_ = n bef\Value = Value n\pv_ = bef bef\pv_\nx_ = bef Return bef End Function ;Insert a value into a list after the specified node, and return then new node Function InsertAfterNode.ListNode(Value, n.ListNode) Local aft.ListNode = New ListNode aft\nx_ = n\nx_ aft\pv_ = n aft\Value = Value n\nx_ = aft aft\nx_\pv_ = aft Return aft End Function ;Get an iterator object to use with a loop ;This function means that most programs won't have to think about deleting iterators manually ;(in general only a small, constant number will be created) Function GetIterator.Iterator(l.LList) Local i.Iterator If l = Null Then RuntimeError "Cannot create Iterator for Null" For i = Each Iterator ;See if there's an available iterator at the moment If i\l_ = Null Then Exit Next If i = Null Then i = New Iterator ;If there wasn't, create one i\l_ = l i\cn_ = l\head_ i\cni_ = -1 i\Value = 0 ;No especial reason why this has to be anything, but meh Return i End Function ;Use as the argument to While to iterate over the members of a list Function EachIn(i.Iterator) i\cn_ = i\cn_\nx_ If i\cn_ <> i\l_\tail_ ;Still items in the list i\Value = i\cn_\Value i\cni_ = i\cni_ + 1 Return True Else i\l_ = Null ;Disconnect from the list, having reached the end i\cn_ = Null i\cni_ = -1 Return False EndIf End Function ;Remove from the containing list the element currently pointed to by an iterator Function IteratorRemove(i.Iterator) If (i\cn_ <> i\l_\head_) And (i\cn_ <> i\l_\tail_) Local temp.ListNode = i\cn_ i\cn_ = i\cn_\pv_ i\cni_ = i\cni_ - 1 i\Value = 0 RemoveListNode temp Return True Else Return False EndIf End Function ;Call this before breaking out of an EachIn loop, to disconnect the iterator from the list Function IteratorBreak(i.Iterator) i\l_ = Null i\cn_ = Null i\cni_ = -1 i\Value = 0 End Function ;~IDEal Editor Parameters: ;~F#5#A#10#18#2A#32#3E#47#4C#58#66#6F#78#8F#9B#A9#B7#BD#C5#CC ;~F#E3#E9#EF#F4#F9#103#10D#11B#12B#13F#152#163 ;~C#Blitz3D ================================================ FILE: samples/BlitzBasic/PObj.bb ================================================ Local i, start, result Local s.Sum3Obj = New Sum3Obj For i = 1 To 100000 s = New Sum3Obj result = Handle Before s Delete s Next start = MilliSecs() For i = 1 To 1000000 result = Sum3_(MakeSum3Obj(i, i, i)) Next start = MilliSecs() - start Print start start = MilliSecs() For i = 1 To 1000000 result = Sum3(i, i, i) Next start = MilliSecs() - start Print start WaitKey End Function Sum3(a, b, c) Return a + b + c End Function Type Sum3Obj Field isActive Field a, b, c End Type Function MakeSum3Obj(a, b, c) Local s.Sum3Obj = Last Sum3Obj If s\isActive Then s = New Sum3Obj s\isActive = True s\a = a s\b = b s\c = c Restore label Read foo Return Handle(s) End Function .label Data (10 + 2), 12, 14 : Function Sum3_(a_) Local a.Sum3Obj = Object.Sum3Obj a_ Local return_ = a\a + a\b + a\c Insert a Before First Sum3Obj :: a\isActive = False Return return_ End Function ;~IDEal Editor Parameters: ;~C#Blitz3D ================================================ FILE: samples/BlitzMax/sample.bmx ================================================ SuperStrict Framework Brl.StandardIO Type TMyType Field property:int Function A:int(param:int) 'do nothing End Function Method B:int(param:int) 'do nothing End Method End Type Global my:TMyType = new TMyType ?Win32 my.A() my.B() ?Linux my.B() my.A() ? ================================================ FILE: samples/Bluespec/TL.bsv ================================================ package TL; interface TL; method Action ped_button_push(); (* always_enabled *) method Action set_car_state_N(Bool x); (* always_enabled *) method Action set_car_state_S(Bool x); (* always_enabled *) method Action set_car_state_E(Bool x); (* always_enabled *) method Action set_car_state_W(Bool x); method Bool lampRedNS(); method Bool lampAmberNS(); method Bool lampGreenNS(); method Bool lampRedE(); method Bool lampAmberE(); method Bool lampGreenE(); method Bool lampRedW(); method Bool lampAmberW(); method Bool lampGreenW(); method Bool lampRedPed(); method Bool lampAmberPed(); method Bool lampGreenPed(); endinterface: TL typedef enum { AllRed, GreenNS, AmberNS, GreenE, AmberE, GreenW, AmberW, GreenPed, AmberPed} TLstates deriving (Eq, Bits); typedef UInt#(5) Time32; typedef UInt#(20) CtrSize; (* synthesize *) module sysTL(TL); Time32 allRedDelay = 2; Time32 amberDelay = 4; Time32 nsGreenDelay = 20; Time32 ewGreenDelay = 10; Time32 pedGreenDelay = 10; Time32 pedAmberDelay = 6; CtrSize clocks_per_sec = 100; Reg#(TLstates) state <- mkReg(AllRed); Reg#(TLstates) next_green <- mkReg(GreenNS); Reg#(Time32) secs <- mkReg(0); Reg#(Bool) ped_button_pushed <- mkReg(False); Reg#(Bool) car_present_N <- mkReg(True); Reg#(Bool) car_present_S <- mkReg(True); Reg#(Bool) car_present_E <- mkReg(True); Reg#(Bool) car_present_W <- mkReg(True); Bool car_present_NS = car_present_N || car_present_S; Reg#(CtrSize) cycle_ctr <- mkReg(0); rule dec_cycle_ctr (cycle_ctr != 0); cycle_ctr <= cycle_ctr - 1; endrule Rules low_priority_rule = (rules rule inc_sec (cycle_ctr == 0); secs <= secs + 1; cycle_ctr <= clocks_per_sec; endrule endrules); function Action next_state(TLstates ns); action state <= ns; secs <= 0; endaction endfunction: next_state function TLstates green_seq(TLstates x); case (x) GreenNS: return (GreenE); GreenE: return (GreenW); GreenW: return (GreenNS); endcase endfunction function Bool car_present(TLstates x); case (x) GreenNS: return (car_present_NS); GreenE: return (car_present_E); GreenW: return (car_present_W); endcase endfunction function Rules make_from_green_rule(TLstates green_state, Time32 delay, Bool car_is_present, TLstates ns); return (rules rule from_green (state == green_state && (secs >= delay || !car_is_present)); next_state(ns); endrule endrules); endfunction: make_from_green_rule function Rules make_from_amber_rule(TLstates amber_state, TLstates ng); return (rules rule from_amber (state == amber_state && secs >= amberDelay); next_state(AllRed); next_green <= ng; endrule endrules); endfunction: make_from_amber_rule Rules hprs[7]; hprs[1] = make_from_green_rule(GreenNS, nsGreenDelay, car_present_NS, AmberNS); hprs[2] = make_from_amber_rule(AmberNS, GreenE); hprs[3] = make_from_green_rule(GreenE, ewGreenDelay, car_present_E, AmberE); hprs[4] = make_from_amber_rule(AmberE, GreenW); hprs[5] = make_from_green_rule(GreenW, ewGreenDelay, car_present_W, AmberW); hprs[6] = make_from_amber_rule(AmberW, GreenNS); hprs[0] = (rules rule fromAllRed (state == AllRed && secs >= allRedDelay); if (ped_button_pushed) action ped_button_pushed <= False; next_state(GreenPed); endaction else if (car_present(next_green)) next_state(next_green); else if (car_present(green_seq(next_green))) next_state(green_seq(next_green)); else if (car_present(green_seq(green_seq(next_green)))) next_state(green_seq(green_seq(next_green))); else noAction; endrule: fromAllRed endrules); Rules high_priority_rules = hprs[0]; for (Integer i = 1; i<7; i=i+1) high_priority_rules = rJoin(hprs[i], high_priority_rules); addRules(preempts(high_priority_rules, low_priority_rule)); method Action ped_button_push(); ped_button_pushed <= True; endmethod: ped_button_push method Action set_car_state_N(b) ; car_present_N <= b; endmethod method Action set_car_state_S(b) ; car_present_S <= b; endmethod method Action set_car_state_E(b) ; car_present_E <= b; endmethod method Action set_car_state_W(b) ; car_present_W <= b; endmethod method lampRedNS() = (!(state == GreenNS || state == AmberNS)); method lampAmberNS() = (state == AmberNS); method lampGreenNS() = (state == GreenNS); method lampRedE() = (!(state == GreenE || state == AmberE)); method lampAmberE() = (state == AmberE); method lampGreenE() = (state == GreenE); method lampRedW() = (!(state == GreenW || state == AmberW)); method lampAmberW() = (state == AmberW); method lampGreenW() = (state == GreenW); method lampRedPed() = (!(state == GreenPed || state == AmberPed)); method lampAmberPed() = (state == AmberPed); method lampGreenPed() = (state == GreenPed); endmodule: sysTL endpackage: TL ================================================ FILE: samples/Bluespec/TbTL.bsv ================================================ package TbTL; import TL::*; interface Lamp; method Bool changed; method Action show_offs; method Action show_ons; method Action reset; endinterface module mkLamp#(String name, Bool lamp)(Lamp); Reg#(Bool) prev <- mkReg(False); method changed = (prev != lamp); method Action show_offs; if (prev && !lamp) $write (name + " off, "); endmethod method Action show_ons; if (!prev && lamp) $write (name + " on, "); endmethod method Action reset; prev <= lamp; endmethod endmodule (* synthesize *) module mkTest(); let dut <- sysTL; Reg#(Bit#(16)) ctr <- mkReg(0); Reg#(Bool) carN <- mkReg(False); Reg#(Bool) carS <- mkReg(False); Reg#(Bool) carE <- mkReg(False); Reg#(Bool) carW <- mkReg(False); Lamp lamps[12]; lamps[0] <- mkLamp("0: NS red ", dut.lampRedNS); lamps[1] <- mkLamp("1: NS amber", dut.lampAmberNS); lamps[2] <- mkLamp("2: NS green", dut.lampGreenNS); lamps[3] <- mkLamp("3: E red ", dut.lampRedE); lamps[4] <- mkLamp("4: E amber", dut.lampAmberE); lamps[5] <- mkLamp("5: E green", dut.lampGreenE); lamps[6] <- mkLamp("6: W red ", dut.lampRedW); lamps[7] <- mkLamp("7: W amber", dut.lampAmberW); lamps[8] <- mkLamp("8: W green", dut.lampGreenW); lamps[9] <- mkLamp("9: Ped red ", dut.lampRedPed); lamps[10] <- mkLamp("10: Ped amber", dut.lampAmberPed); lamps[11] <- mkLamp("11: Ped green", dut.lampGreenPed); rule start (ctr == 0); $dumpvars; endrule rule detect_cars; dut.set_car_state_N(carN); dut.set_car_state_S(carS); dut.set_car_state_E(carE); dut.set_car_state_W(carW); endrule rule go; ctr <= ctr + 1; if (ctr == 5000) carN <= True; if (ctr == 6500) carN <= False; if (ctr == 12_000) dut.ped_button_push; endrule rule stop (ctr > 32768); $display("TESTS FINISHED"); $finish(0); endrule function do_offs(l) = l.show_offs; function do_ons(l) = l.show_ons; function do_reset(l) = l.reset; function do_it(f); action for (Integer i=0; i<12; i=i+1) f(lamps[i]); endaction endfunction function any_changes(); Bool b = False; for (Integer i=0; i<12; i=i+1) b = b || lamps[i].changed; return b; endfunction rule show (any_changes()); do_it(do_offs); do_it(do_ons); do_it(do_reset); $display("(at time %d)", $time); endrule endmodule endpackage ================================================ FILE: samples/Bluespec BH/CGetPut.bs ================================================ -- Copyright (c) 2020 Bluespec, Inc. All rights reserved. -- -- Redistribution and use in source and binary forms, with or without -- modification, are permitted provided that the following conditions are -- met: -- -- 1. Redistributions of source code must retain the above copyright -- notice, this list of conditions and the following disclaimer. -- -- 2. Redistributions in binary form must reproduce the above copyright -- notice, this list of conditions and the following disclaimer in the -- documentation and/or other materials provided with the -- distribution. -- -- 3. Neither the name of the copyright holder nor the names of its -- contributors may be used to endorse or promote products derived -- from this software without specific prior written permission. -- -- THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -- "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -- LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -- A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -- HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -- SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -- LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -- DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -- THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -- (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -- OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. package CGetPut(CGet, CPut, CGetS, CPutS, CGetPut, GetCPut, mkCGetPut, mkGetCPut, mkCGetCPut, CClientServer, ClientCServer, CClient, CServer, CClientS(..), CServerS(..), mkCClientServer, mkClientCServer) where import FIFOF import ConfigReg import Connectable import GetPut import ClientServer import Vector import RegTwo --@ \subsubsection{CGetPut} --@ \index{CGetPut@\te{CGetPut} (package)|textbf} --@ --@ The interfaces \te{CGet} and \te{CPut} are similar to --@ \te{Get} and \te{Put}, but the interconnection of them --@ (via \te{Connectable}) is implemented with a credit based --@ FIFO. This means that the \te{CGet} and \te{CPut} interfaces --@ have completely registered input and outputs, and furthermore --@ that additional register buffers can be introduced in the connection path --@ without any ill effect (except an increase in latency, of course). interface (CGetS :: # -> * -> # -> *) n a sa = gvalue :: Bit sa gpresent :: Bool gcredit :: Bool -> Action interface (CPutS :: # -> * -> # -> *) n a sa = pvalue :: Bit sa -> Action ppresent :: Bool -> Action pcredit :: Bool --@ The interface types are abstract (to avoid any non-proper use of --@ the credit signaling protocol). --@ --@ In the absence of additional register buffers, the round-trip time for communication --@ between the two interfaces is 4 clock cycles. Call this number $r$. The first argument --@ to the type, $n$, specifies that transfers will occur for a fraction $n/r$ of clock --@ cycles (note that the used cycles will not necessarily be evenly spaced). $n$ also --@ specifies the depth of the buffer used in the receiving interface (the transmitter side --@ always has only a single buffer). So (in the absence of additional buffers) use $n=4$ --@ to allow full-bandwidth transmission, at the cost of sufficient registers for quadruple --@ buffering at one end; use $n=1$ for minimal use of registers, at the cost of reducing --@ the bandwidth to one quarter; use intermediate values to select the optimal trade-off if --@ appropriate. --@ --@ \note{For compiler reasons the actual interfaces are called \te{CGetS} and \te{CPutS} --@ with \te{CGet} and \te{CPut} being type abbreviations. Hopefully this will --@ be fixed soon.} --@ \begin{libverbatim} --@ typedef CGetS#(n, a, SizeOf#(a)) CGet #(type n, type a); --@ \end{libverbatim} type CGet n a = CGetS n a (SizeOf a) --@ \lineup --@ \begin{libverbatim} --@ typedef CPutS#(n, a, SizeOf#(a)) CPut #(type n, type a); --@ \end{libverbatim} type CPut n a = CPutS n a (SizeOf a) type CGetPut n a = (CGet n a, Put a) type GetCPut n a = (Get a, CPut n a) --@ Create one end of the credit based FIFO. Access to it is via a \te{Put} interface. --@ \index{mkCGetPut@\te{mkCGetPut} (function)|textbf} --@ \begin{libverbatim} --@ module mkCGetPut(Tuple2 #(CGetS#(n, a, sa), Put#(a))) --@ provisos (Bits#(a, sa), Add#(1, k, n), Add#(n, 1, n1), Log#(n1, ln)); --@ \end{libverbatim} mkCGetPut :: (IsModule m c, Bits a sa, Add 1 k n, Add n 1 n1, Log n1 ln) => m (CGetS n a sa, Put a) mkCGetPut = module putbuf :: FIFOF (Bit sa) <- mkUGLFIFOF credits :: FIFOF () <- mkUGLSizedFIFOF (valueOf n - 1) free :: Reg Bool <- mkConfigReg False let hasData = putbuf.notEmpty rules {-# ASSERT no implicit conditions #-} {-# ASSERT fire when enabled #-} "deq": when hasData ==> putbuf.deq {-# ASSERT no implicit conditions #-} {-# ASSERT fire when enabled #-} "free": when free ==> credits.deq interface -- Pair (interface CGetS gvalue = putbuf.first gpresent = hasData gcredit b = free := b , interface Put put x = action putbuf.enq (pack x) credits.enq () when (credits.notFull || free) ) --@ Create the other end of the credit based FIFO. Access to it is via a \te{Get} interface. --@ \index{mkGetCPut@\te{mkGetCPut} (function)|textbf} --@ \begin{libverbatim} --@ module mkGetCPut(Tuple2 #(Get#(a), CPutS#(n, a, sa))) --@ provisos (Bits#(a, sa), Add#(1, k, n), Log#(n, ln)); --@ \end{libverbatim} mkGetCPut :: (IsModule m c, Bits a sa, Add 1 k n, Log n ln) => m (Get a, CPutS n a sa) mkGetCPut = if valueOf n > 1 then module buff :: Vector n (Reg (Bit sa)) <- genWithM $ const mkConfigRegU gotPresent :: Reg Bool <- mkConfigReg False present :: Vector n (Reg Bool) <- genWithM $ const $ mkConfigReg False ptr :: Reg (Bit ln) <- mkConfigReg 0 crd :: FIFOF () <- mkUGLFIFOF let presentEffective :: Vector n Bool presentEffective = zipWith (\idx p -> if idx == 0 then gotPresent || p else p) genList (map readReg present) -- allAheadTrue :: Vector n Bool -> Vector n Bool -- allAheadTrue bs = let (_, result) = mapAccumR (\aat b -> (aat && b, aat && b)) True bs bubble :: (Action, Vector n Bool) bubble = let f :: (Integer, Bool, Action) -> (Reg Bool, Bool, Reg (Bit sa)) -> ((Integer, Bool, Action), Bool) f (idx, filled, upds) (p, pe, b) = ( (idx-1 , filled && pe , action {upds; if not (filled && pe) then (if idx /= 0 then action {p := presentEffective !! (idx-1); b := (buff !! (idx-1))._read} else action {p := False}) else action {}} ) , if not (filled && pe) then (if idx /= 0 then presentEffective !! (idx-1) else False) else pe ) ((_, _, b_updates), b_presentNext) = mapAccumR f (valueOf n - 1, True, action {}) (zip3 present presentEffective buff) in (b_updates, b_presentNext) presentNext :: Vector n Bool presentNext = bubble.snd updates :: Action updates = bubble.fst -- updates :: Vector n Bool -> (Vector n Bool, Vector n Action) -- updates bs = let f idx (pag, aap, b) = case idx of -- 0 -> if not aap then (False, noAction) else (pag, noAction) -- _ -> if not aap then (select presentAfterGet (idx-1), b := (select buff (idx-1))._read) else (pag, noAction) -- in unzip $ zipWith f genList (zip3 presentAfterGet allAheadPresent buff) clearLastTrue :: Vector n Bool -> Vector n Bool clearLastTrue bs = let (_, result) = mapAccumR (\found b -> if (not found && b) then (True, False) else (found, b)) False bs in result lastTrueIdx :: Vector n Bool -> Bit ln lastTrueIdx bs = let f (idx, h) b = if b then (idx+1, idx) else (idx+1, h) (_, result) = foldl f (0, 0) bs in result rw :: RWire () rw <- mkRWire rules {-# ASSERT no implicit conditions #-} "update": when rw.wget == Nothing ==> action updates ptr := lastTrueIdx presentNext {-# ASSERT no implicit conditions #-} {-# ASSERT fire when enabled #-} "deq-crd": when crd.notEmpty ==> crd.deq interface -- Pair (interface Get get = do rw.wset() crd.enq () joinActions $ zipWith writeReg present (cons False (init $ clearLastTrue presentEffective)) joinActions $ zipWith writeReg (tail buff) (init $ map readReg buff) ptr._write $ lastTrueIdx $ cons False (init $ clearLastTrue presentEffective) return $ unpack (select buff ptr)._read when (fold (||) presentEffective) , interface CPutS pvalue v = (head buff)._write v ppresent p = gotPresent := p pcredit = crd.notEmpty ) else module buff :: Reg (Bit sa) <- mkConfigRegU present :: RegTwo Bool <- mkRegTwo False gotPresent :: Reg Bool <- mkConfigReg False crd :: FIFOF () <- mkUGLFIFOF rules {-# ASSERT no implicit conditions #-} {-# ASSERT fire when enabled #-} "deq-crd": when crd.notEmpty ==> crd.deq {-# ASSERT no implicit conditions #-} {-# ASSERT fire when enabled #-} "save": when gotPresent ==> present.setB True interface -- Pair (interface Get get = do crd.enq () present.setA False return $ unpack buff when (gotPresent || present.get) , interface CPutS pvalue v = buff := v ppresent p = gotPresent := p pcredit = crd.notEmpty ) --@ Create a buffer that can be inserted along a connection path. --@ \index{mkCGetCPut@\te{mkCGetCPut} (function)|textbf} --@ \begin{libverbatim} --@ module mkCGetCPut(Tuple2 #(CGetS#(n, a, sa), CPutS#(n, a, sa))) --@ provisos (Bits#(a, sa)); --@ \end{libverbatim} mkCGetCPut :: (IsModule m c, Bits a sa) => m (CGetS n a sa, CPutS n a sa) mkCGetCPut = module val :: Reg (Bit sa) <- mkConfigRegU prs :: Reg Bool <- mkConfigReg False crd :: Reg Bool <- mkConfigReg False interface -- Pair (interface CGetS gvalue = val gpresent = prs gcredit b = crd := b , interface CPutS pvalue v = val := v ppresent p = prs := p pcredit = crd ) --@ The \te{CGet} and \te{CPut} interface are connectable. --@ \begin{libverbatim} --@ instance Connectable #(CGetS#(n, a, sa), CPutS#(n, a, sa)); --@ \end{libverbatim} instance Connectable (CGetS n a sa) (CPutS n a sa) where mkConnection :: (IsModule m c) => CGetS n a sa -> CPutS n a sa -> m Empty mkConnection g p = module rules {-# ASSERT no implicit conditions #-} {-# ASSERT fire when enabled #-} "moveCGetPut": when True ==> action p.pvalue g.gvalue p.ppresent g.gpresent g.gcredit p.pcredit --@ \lineup --@ \begin{libverbatim} --@ instance Connectable #(CPutS#(n, a, sa), CGetS#(n, a, sa)); --@ \end{libverbatim} instance Connectable (CPutS n a sa) (CGetS n a sa) where mkConnection p g = mkConnection g p --@ The same idea may be extended to clients and servers. interface CClientS n a sa b sb = request :: CGetS n a sa response:: CPutS n b sb interface CServerS n a sa b sb = request :: CPutS n a sa response :: CGetS n b sb --@ \begin{libverbatim} --@ typedef CClientS#(n, a, SizeOf#(a), b, SizeOf#(b)) --@ CClient #(type n, type a, type b); --@ typedef CServerS#(n, a, SizeOf#(a), b, SizeOf#(b)) --@ CServer #(type n, type a, type b); --@ \end{libverbatim} type CClient n a b = CClientS n a (SizeOf a) b (SizeOf b) type CServer n a b = CServerS n a (SizeOf a) b (SizeOf b) type CClientServer n a b = (CClient n a b, Server a b) type ClientCServer n a b = (Client a b, CServer n a b) instance Connectable (CClientS n a sa b sb) (CServerS n a sa b sb) where mkConnection :: (IsModule m c) => (CClientS n a sa b sb) -> (CServerS n a sa b sb) -> m Empty mkConnection cc cs = module cc.request <-> cs.request cc.response <-> cs.response instance Connectable (CServerS n a sa b sb) (CClientS n a sa b sb) where mkConnection cs cc = mkConnection cc cs --@ \index{mkClientCServer@\te{mkClientCServer} (function)|textbf} --@ \begin{libverbatim} --@ module mkClientCServer(Tuple2 #(Client#(a, b), CServerS#(n, a, sa, b, sb))) --@ provisos (Bits#(a, sa), Bits#(b, sb), Add#(1, k, n)); --@ \end{libverbatim} mkClientCServer :: (IsModule m c, Bits a sa, Bits b sb, Add 1 k n) => m (Client a b, CServerS n a sa b sb) mkClientCServer = module (g, cp) <- mkGetCPut (cg, p) <- mkCGetPut interface (interface Client request = g response = p , interface CServerS request = cp response = cg ) --@ \index{mkCClientServer@\te{mkCClientServer} (function)|textbf} --@ \begin{libverbatim} --@ module mkCClientServer(Tuple2 #(CClientS#(n, a, sa, b, sb), Server#(a, b))) --@ provisos (Bits#(a, sa), Bits#(b, sb), Add#(1, k, n)); --@ \end{libverbatim} mkCClientServer :: (IsModule m c, Bits a sa, Bits b sb, Add 1 k n) => m (CClientS n a sa b sb, Server a b) mkCClientServer = module (g, cp) <- mkGetCPut (cg, p) <- mkCGetPut interface (interface CClientS request = cg response = cp , interface Server request = p response = g ) ================================================ FILE: samples/Bluespec BH/COBS.bs ================================================ -- This file is copied from https://github.com/B-Lang-org/bsc-contrib -- SPDX-License-Identifier: BSD-3-Clause package COBS where import FIFO import GetPut import Vector -- Implementation of Consistent Overhead Byte Stuffing (COBS) encoding of messages into a byte stream. -- See https://en.wikipedia.org/wiki/Consistent_Overhead_Byte_Stuffing interface (COBSEncoder :: # -> *) n = msg :: Put (UInt (TLog (TAdd 1 n)), Vector n (Bit 8)) byte :: Get (Bit 8) mkCOBSEncoder :: (Log (TAdd 1 n) sizeWidth) => Module (COBSEncoder n) mkCOBSEncoder = module msgs :: FIFO (UInt sizeWidth, Vector n (Bit 8)) <- mkFIFO bytes :: FIFO (Bit 8) <- mkFIFO let size :: UInt (TMax sizeWidth 8) = zeroExtend msgs.first.fst let msg :: Vector n (Bit 8) = msgs.first.snd -- Index of the next byte to encode i :: Reg (UInt (TMax sizeWidth 8)) <- mkReg 0 -- Distance from i to the next zero / overhead / end of message byte j :: Reg (UInt 8) <- mkReg 0 -- Index of the next overhead byte to be inserted nextOverhead :: Reg (Maybe (UInt (TMax sizeWidth 8))) <- mkReg $ Just 0 let byteI = select msg i let foundNextZero = j == (if nextOverhead == Just i then 0xfe else 0xff) || i + zeroExtend j >= size || select msg (i + zeroExtend j) == 0 rules "next_msg": when i >= size ==> do -- $display "next_msg" msgs.deq bytes.enq 0 i := 0 j := 0 nextOverhead := Just 0 "find_next_zero": when i < size && not foundNextZero ==> j := j + 1 "encode_overhead": when nextOverhead == Just i && i < size && foundNextZero ==> do -- $display "encode_overhead %x" (j + 1) bytes.enq $ pack (j + 1) nextOverhead := if j == 0xfe then Just (i + 0xfe) else Nothing j := 1 "encode_zero": when nextOverhead /= Just i && i < size && byteI == 0 && foundNextZero ==> do -- $display "encode_zero %x" j bytes.enq $ pack j nextOverhead := if j == 0xfe then Just (i + 0xfe) else Nothing i := i + 1 j := 1 "encode_nonzero": when nextOverhead /= Just i && i < size && byteI /= 0 && foundNextZero ==> do -- $display "encode_nonzero %x" byteI bytes.enq byteI i := i + 1 j := if j > 1 || nextOverhead == Just (i + 1) then j - 1 else 1 -- Ensure that j > 0 if the next byte is not an overhead byte interface msg = toPut msgs byte = toGet bytes interface (COBSDecoder :: # -> *) n = msg :: Get (UInt (TLog (TAdd 1 n)), Vector n (Bit 8)) byte :: Put (Bit 8) mkCOBSDecoder :: (Log (TAdd 1 n) sizeWidth) => Module (COBSDecoder n) mkCOBSDecoder = module msgs :: FIFO (UInt sizeWidth, Vector n (Bit 8)) <- mkFIFO bytes :: FIFO (Bit 8) <- mkFIFO -- Index of the next result byte to be decoded i :: Reg (UInt sizeWidth) <- mkReg 0 -- Distance to the next zero / overhead / end of message byte j :: Reg (UInt 8) <- mkReg 0 -- Is the next zero / overhead / end of message byte an overhead byte? isOverhead :: Reg Bool <- mkReg True -- Vector of registers containing partially-decoded message msg :: Vector n (Reg (Bit 8)) <- replicateM $ mkReg 0 rules "next_msg": when bytes.first == 0 ==> do -- $display "next_msg" bytes.deq msgs.enq (i, map readReg msg) i := 0 j := 0 isOverhead := True writeVReg msg $ replicate 0 "decode_overhead": when bytes.first /= 0 && j == 0 && isOverhead ==> do -- $display "decode_overhead %x" bytes.first j := unpack bytes.first - 1 isOverhead := bytes.first == 0xff bytes.deq "decode_zero": when bytes.first /= 0 && j == 0 && not isOverhead ==> do -- $display "decode_zero %x" bytes.first select msg i := 0 i := i + 1 j := if bytes.first == 0xff then 0xff else unpack bytes.first - 1 isOverhead := bytes.first == 0xff bytes.deq "decode_nonzero": when bytes.first /= 0 && j > 0 ==> do -- $display "decode_nonzero %x" bytes.first select msg i := bytes.first i := i + 1 j := j - 1 bytes.deq interface msg = toGet msgs byte = toPut bytes ================================================ FILE: samples/Bluespec BH/TL.bs ================================================ package TL (TL(..), sysTL) where import Vector interface TL = ped_button_push :: Prelude.Action set_car_state_N :: Bool -> Prelude.Action {-# always_enabled #-} set_car_state_S :: Bool -> Prelude.Action {-# always_enabled #-} set_car_state_E :: Bool -> Prelude.Action {-# always_enabled #-} set_car_state_W :: Bool -> Prelude.Action {-# always_enabled #-} lampRedNS :: Bool lampAmberNS :: Bool lampGreenNS :: Bool lampRedE :: Bool lampAmberE :: Bool lampGreenE :: Bool lampRedW :: Bool lampAmberW :: Bool lampGreenW :: Bool lampRedPed :: Bool lampAmberPed :: Bool lampGreenPed :: Bool data TLstates = AllRed | GreenNS | AmberNS | GreenE | AmberE | GreenW | AmberW | GreenPed | AmberPed deriving (Eq, Bits) type Time32 = UInt 5 type CtrSize = UInt 20 {-# properties sysTL = { verilog } #-} sysTL :: Module TL sysTL = module let allRedDelay :: Time32 = 2 amberDelay :: Time32 = 4 nsGreenDelay :: Time32 = 20 ewGreenDelay :: Time32 = 10 pedGreenDelay :: Time32 = 10 pedAmberDelay :: Time32 = 6 clocks_per_sec :: CtrSize = 100 state :: Reg TLstates <- mkReg AllRed next_green :: Reg TLstates <- mkReg GreenNS secs :: Reg Time32 <- mkReg 0 ped_button_pushed :: Reg Bool <- mkReg False car_present_N :: Reg Bool <- mkReg True car_present_S :: Reg Bool <- mkReg True car_present_E :: Reg Bool <- mkReg True car_present_W :: Reg Bool <- mkReg True let car_present_NS :: Bool car_present_NS = car_present_N || car_present_S cycle_ctr :: Reg CtrSize <- mkReg 0 rules "dec_cycle_ctr": when cycle_ctr /= 0 ==> cycle_ctr := cycle_ctr - 1 let low_priority_rule :: Rules low_priority_rule = rules "inc_sec": when cycle_ctr == 0 ==> action secs := secs + 1 cycle_ctr := clocks_per_sec next_state :: TLstates -> Prelude.Action next_state ns = action { state := ns; secs := 0; } green_seq :: TLstates -> TLstates green_seq GreenNS = GreenE green_seq GreenE = GreenW green_seq GreenW = GreenNS car_present :: TLstates -> Bool car_present GreenNS = car_present_NS car_present GreenE = car_present_E car_present GreenW = car_present_W make_from_green_rule :: TLstates -> Time32 -> Bool -> TLstates -> Rules make_from_green_rule green_state delay car_is_present ns = rules "from_green": when (state == green_state) && ((secs >= delay) || (not car_is_present)) ==> next_state ns make_from_amber_rule :: TLstates -> TLstates -> Rules make_from_amber_rule amber_state ng = rules "from_amber": when (state == amber_state) && (secs >= amberDelay) ==> action next_state AllRed next_green := ng hpr0 :: Rules hpr0 = rules "fromAllRed": when (state == AllRed) && (secs >= allRedDelay) ==> if ped_button_pushed then action ped_button_pushed := False next_state GreenPed else if car_present next_green then next_state next_green else if car_present (green_seq next_green) then next_state (green_seq next_green) else if car_present (green_seq (green_seq next_green)) then next_state (green_seq (green_seq next_green)) else noAction hpr1 :: Rules = make_from_green_rule GreenNS nsGreenDelay car_present_NS AmberNS hpr2 :: Rules = make_from_amber_rule AmberNS GreenE hpr3 :: Rules = make_from_green_rule GreenE ewGreenDelay car_present_E AmberE hpr4 :: Rules = make_from_amber_rule AmberE GreenW hpr5 :: Rules = make_from_green_rule GreenW ewGreenDelay car_present_W AmberW hpr6 :: Rules = make_from_amber_rule AmberW GreenNS hprs :: Vector 7 Rules hprs = Vector.cons hpr0 (Vector.cons hpr1 (Vector.cons hpr2 (Vector.cons hpr3 (Vector.cons hpr4 (Vector.cons hpr5 (Vector.cons hpr6 Vector.nil)))))) high_priority_rules :: Rules high_priority_rules = Vector.foldl1 rJoin hprs addRules (preempts high_priority_rules low_priority_rule) interface ped_button_push = ped_button_pushed := True set_car_state_N b = car_present_N := b set_car_state_S b = car_present_S := b set_car_state_E b = car_present_E := b set_car_state_W b = car_present_W := b lampRedNS = not (state == GreenNS || state == AmberNS) lampAmberNS = state == AmberNS lampGreenNS = state == GreenNS lampRedE = not (state == GreenE || state == AmberE) lampAmberE = state == AmberE lampGreenE = state == GreenE lampRedW = not (state == GreenW || state == AmberW) lampAmberW = state == AmberW lampGreenW = state == GreenW lampRedPed = not (state == GreenPed || state == AmberPed) lampAmberPed = state == AmberPed lampGreenPed = state == GreenPed ================================================ FILE: samples/Bluespec BH/TbTL.bs ================================================ package TbTL where import Vector import TL interface Lamp = changed :: Bool show_offs :: Action show_ons :: Action reset :: Action mkLamp :: String -> Bool -> Module Lamp mkLamp name lamp = module prev :: Reg Bool <- mkReg False interface changed = prev /= lamp show_offs = if prev && not lamp then $write (name + " off, ") else noAction show_ons = if not prev && lamp then $write (name + " on, ") else noAction reset = prev := lamp {-# properties mkTest = { verilog } #-} mkTest :: Module Empty mkTest = module dut <- sysTL ctr :: Reg (Bit 16) <- mkReg 0 carN :: Reg Bool <- mkReg False carS :: Reg Bool <- mkReg False carE :: Reg Bool <- mkReg False carW :: Reg Bool <- mkReg False lamp0 :: Lamp <- mkLamp "0: NS red " dut.lampRedNS lamp1 :: Lamp <- mkLamp "1: NS amber" dut.lampAmberNS lamp2 :: Lamp <- mkLamp "2: NS green" dut.lampGreenNS lamp3 :: Lamp <- mkLamp "3: E red " dut.lampRedE lamp4 :: Lamp <- mkLamp "4: E amber" dut.lampAmberE lamp5 :: Lamp <- mkLamp "5: E green" dut.lampGreenE lamp6 :: Lamp <- mkLamp "6: W red " dut.lampRedW lamp7 :: Lamp <- mkLamp "7: W amber" dut.lampAmberW lamp8 :: Lamp <- mkLamp "8: W green" dut.lampGreenW lamp9 :: Lamp <- mkLamp "9: Ped red " dut.lampRedPed lamp10 :: Lamp <- mkLamp "10: Ped amber" dut.lampAmberPed lamp11 :: Lamp <- mkLamp "11: Ped green" dut.lampGreenPed let lamps :: Vector 12 Lamp lamps = Vector.cons lamp0 (Vector.cons lamp1 (Vector.cons lamp2 (Vector.cons lamp3 (Vector.cons lamp4 (Vector.cons lamp5 (Vector.cons lamp6 (Vector.cons lamp7 (Vector.cons lamp8 (Vector.cons lamp9 (Vector.cons lamp10 (Vector.cons lamp11 nil))))))))))) rules "start": when ctr == 0 ==> $dumpvars "detect_cars": when True ==> action dut.set_car_state_N carN dut.set_car_state_S carS dut.set_car_state_E carE dut.set_car_state_W carW "go": when True ==> action ctr := (ctr + 1) if ctr == 5000 then carN := True else if ctr == 6500 then carN := False else if ctr == 12000 then dut.ped_button_push else noAction "stop": when ctr > 32768 ==> action $display "TESTS FINISHED" $finish 0 let do_offs l = l.show_offs do_ons l = l.show_ons do_reset l = l.reset changed l = l.changed do_it f = Vector.mapM_ f lamps any_changes = Vector.any changed lamps rules "show": when any_changes ==> action do_it do_offs do_it do_ons do_it do_reset $display "(at time %d)" ($time) ================================================ FILE: samples/Boogie/Bubble.bpl ================================================ // RUN: %boogie "%s" > "%t" // RUN: %diff "%s.expect" "%t" // Bubble Sort, where the specification says the output is a permutation of // the input. // Introduce a constant 'N' and postulate that it is non-negative const N: int; axiom 0 <= N; // Declare a map from integers to integers. In the procedure below, 'a' will be // treated as an array of 'N' elements, indexed from 0 to less than 'N'. var a: [int]int; // This procedure implements Bubble Sort. One of the postconditions says that, // in the final state of the procedure, the array is sorted. The other // postconditions say that the final array is a permutation of the initial // array. To write that part of the specification, the procedure returns that // permutation mapping. That is, out-parameter 'perm' injectively maps the // numbers [0..N) to [0..N), as stated by the second and third postconditions. // The final postcondition says that 'perm' describes how the elements in // 'a' moved: what is now at index 'i' used to be at index 'perm[i]'. // Note, the specification says nothing about the elements of 'a' outside the // range [0..N). Moreover, Boogie does not prove that the program will terminate. procedure BubbleSort() returns (perm: [int]int) modifies a; // array is sorted ensures (forall i, j: int :: 0 <= i && i <= j && j < N ==> a[i] <= a[j]); // perm is a permutation ensures (forall i: int :: 0 <= i && i < N ==> 0 <= perm[i] && perm[i] < N); ensures (forall i, j: int :: 0 <= i && i < j && j < N ==> perm[i] != perm[j]); // the final array is that permutation of the input array ensures (forall i: int :: 0 <= i && i < N ==> a[i] == old(a)[perm[i]]); { var n, p, tmp: int; n := 0; while (n < N) invariant n <= N; invariant (forall i: int :: 0 <= i && i < n ==> perm[i] == i); { perm[n] := n; n := n + 1; } while (true) invariant 0 <= n && n <= N; // array is sorted from n onwards invariant (forall i, k: int :: n <= i && i < N && 0 <= k && k < i ==> a[k] <= a[i]); // perm is a permutation invariant (forall i: int :: 0 <= i && i < N ==> 0 <= perm[i] && perm[i] < N); invariant (forall i, j: int :: 0 <= i && i < j && j < N ==> perm[i] != perm[j]); // the current array is that permutation of the input array invariant (forall i: int :: 0 <= i && i < N ==> a[i] == old(a)[perm[i]]); { n := n - 1; if (n < 0) { break; } p := 0; while (p < n) invariant 0 <= p && p <= n; // array is sorted from n+1 onwards invariant (forall i, k: int :: n+1 <= i && i < N && 0 <= k && k < i ==> a[k] <= a[i]); // perm is a permutation invariant (forall i: int :: 0 <= i && i < N ==> 0 <= perm[i] && perm[i] < N); invariant (forall i, j: int :: 0 <= i && i < j && j < N ==> perm[i] != perm[j]); // the current array is that permutation of the input array invariant (forall i: int :: 0 <= i && i < N ==> a[i] == old(a)[perm[i]]); // a[p] is at least as large as any of the first p elements invariant (forall k: int :: 0 <= k && k < p ==> a[k] <= a[p]); { if (a[p+1] < a[p]) { tmp := a[p]; a[p] := a[p+1]; a[p+1] := tmp; tmp := perm[p]; perm[p] := perm[p+1]; perm[p+1] := tmp; } p := p + 1; } } } ================================================ FILE: samples/Boogie/TuringFactorial.bpl ================================================ // RUN: %boogie "%s" > "%t" // RUN: %diff "%s.expect" "%t" // A Boogie version of Turing's additive factorial program, from "Checking a large routine" // published in the "Report of a Conference of High Speed Automatic Calculating Machines", // pp. 67-69, 1949. procedure ComputeFactorial(n: int) returns (u: int) requires 1 <= n; ensures u == Factorial(n); { var r, v, s: int; r, u := 1, 1; TOP: // B assert 1 <= r && r <= n; assert 1 <= u; assert u == Factorial(r); v := u; if (n <= r) { return; } s := 1; INNER: // E assert s <= r; assert v == Factorial(r) && u == s * Factorial(r); u := u + v; s := s + 1; assert s - 1 <= r; if (s <= r) { goto INNER; } r := r + 1; goto TOP; } function Factorial(int): int; axiom Factorial(0) == 1; axiom (forall n: int :: {Factorial(n)} 1 <= n ==> Factorial(n) == n * Factorial_Aux(n-1)); function Factorial_Aux(int): int; axiom (forall n: int :: {Factorial(n)} Factorial(n) == Factorial_Aux(n)); ================================================ FILE: samples/Boogie/ticket.bpl ================================================ // RUN: %boogie "%s" > "%t" // RUN: %diff "%s.expect" "%t" function RightOpen (n: int) : [int]bool; function RightClosed (n: int) : [int]bool; axiom (forall x: int, y: int :: RightOpen(x)[y] <==> y < x); axiom (forall x: int, y: int :: RightClosed(x)[y] <==> y <= x); type {:linear "tid"} X; const nil: X; var {:layer 0,1} t: int; // next ticket to issue var {:layer 0,2} s: int; // current ticket permitted to critical section var {:layer 0,2} cs: X; // current thread in critical section var {:layer 0,2} T: [int]bool; // set of issued tickets // ########################################################################### // Invariants function {:inline} Inv1 (tickets: [int]bool, ticket: int): (bool) { tickets == RightOpen(ticket) } function {:inline} Inv2 (tickets: [int]bool, ticket: int, lock: X): (bool) { if (lock == nil) then tickets == RightOpen(ticket) else tickets == RightClosed(ticket) } // ########################################################################### // Yield invariants procedure {:yield_invariant} {:layer 2} YieldSpec ({:linear "tid"} tid: X); requires tid != nil && cs == tid; procedure {:yield_invariant} {:layer 1} Yield1 (); requires Inv1(T, t); procedure {:yield_invariant} {:layer 2} Yield2 (); requires Inv2(T, s, cs); // ########################################################################### // Main program procedure {:yields} {:layer 2} main ({:linear_in "tid"} xls':[X]bool) requires {:layer 2} xls' == MapConst(true); { var {:linear "tid"} tid: X; var {:linear "tid"} xls: [X]bool; call InitAbstract(xls'); xls := xls'; while (*) invariant {:yields} {:layer 1,2} {:yield_loop "Yield1"} {:yield_loop "Yield2"} true; { par xls, tid := Allocate(xls) | Yield1() | Yield2(); async call Customer(tid); } } procedure {:yields} {:layer 2} Allocate ({:linear_in "tid"} xls':[X]bool) returns ({:linear "tid"} xls: [X]bool, {:linear "tid"} xl: X) ensures {:layer 1,2} xl != nil; { call xls, xl := AllocateLow(xls'); } procedure {:yields} {:layer 2} {:yield_requires "Yield1"} {:yield_requires "Yield2"} Customer ({:linear_in "tid"} tid: X) requires {:layer 2} tid != nil; { while (*) invariant {:yields} {:layer 1,2} {:yield_loop "Yield1"} {:yield_loop "Yield2"} true; { call Enter(tid); par Yield1() | Yield2() | YieldSpec(tid); call Leave(tid); } } procedure {:yields} {:layer 2} {:yield_preserves "Yield1"} {:yield_preserves "Yield2"} {:yield_ensures "YieldSpec", tid} Enter ({:linear "tid"} tid: X) requires {:layer 2} tid != nil; { var m: int; call m := GetTicketAbstract(tid); call WaitAndEnter(tid, m); } // ########################################################################### // Abstractions of primitive atomic actions // Note how GetTicketAbstract becomes a right mover procedure {:atomic} {:layer 2} AtomicInitAbstract ({:linear "tid"} xls:[X]bool) modifies cs, s, T; { assert xls == MapConst(true); cs := nil; s := 0; T := RightOpen(0); } procedure {:yields} {:layer 1} {:refines "AtomicInitAbstract"} InitAbstract ({:linear "tid"} xls:[X]bool) ensures {:layer 1} Inv1(T, t); { call Init(xls); } procedure {:right} {:layer 2} AtomicGetTicketAbstract ({:linear "tid"} tid: X) returns (m: int) modifies T; { assume !T[m]; T[m] := true; } procedure {:yields} {:layer 1} {:refines "AtomicGetTicketAbstract"} GetTicketAbstract ({:linear "tid"} tid: X) returns (m: int) requires {:layer 1} Inv1(T, t); ensures {:layer 1} Inv1(T, t); { par Yield1(); call m := GetTicket(tid); par Yield1(); } // ########################################################################### // Primitive atomic actions procedure {:atomic} {:layer 1} AtomicInit ({:linear "tid"} xls:[X]bool) modifies cs, t, s, T; { assert xls == MapConst(true); cs := nil; t := 0; s := 0; T := RightOpen(0); } procedure {:yields} {:layer 0} {:refines "AtomicInit"} Init ({:linear "tid"} xls:[X]bool); procedure {:atomic} {:layer 1} AtomicGetTicket ({:linear "tid"} tid: X) returns (m: int) modifies t, T; { m := t; t := t + 1; T[m] := true; } procedure {:yields} {:layer 0} {:refines "AtomicGetTicket"} GetTicket ({:linear "tid"} tid: X) returns (m: int); procedure {:atomic} {:layer 1,2} AtomicWaitAndEnter ({:linear "tid"} tid: X, m:int) modifies cs; { assume m == s; cs := tid; } procedure {:yields} {:layer 0} {:refines "AtomicWaitAndEnter"} WaitAndEnter ({:linear "tid"} tid: X, m:int); procedure {:atomic} {:layer 1,2} AtomicLeave ({:linear "tid"} tid: X) modifies cs, s; { assert cs == tid; s := s + 1; cs := nil; } procedure {:yields} {:layer 0} {:refines "AtomicLeave"} Leave ({:linear "tid"} tid: X); procedure {:atomic} {:layer 1,2} AtomicAllocateLow ({:linear_in "tid"} xls':[X]bool) returns ({:linear "tid"} xls: [X]bool, {:linear "tid"} xl: X) { assume xl != nil && xls'[xl]; xls := xls'[xl := false]; } procedure {:yields} {:layer 0} {:refines "AtomicAllocateLow"} AllocateLow ({:linear_in "tid"} xls':[X]bool) returns ({:linear "tid"} xls: [X]bool, {:linear "tid"} xl: X); ================================================ FILE: samples/Brainfuck/factor.b ================================================ * factor an arbitrarily large positive integer * * Copyright (C) 1999 by Brian Raiter * under the GNU General Public License >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>- * * read in the number * <<<<<<<<<+ [-[>>>>>>>>>>][-]<<<<<<<<<<[[->>>>>>>>>>+<<<<<<<<<<]<<<<<<<<<<] >>>>>>>>>>,----------] >>>>>>>>>>[------------------------------------->>>>>>>>>->] <[+>[>>>>>>>>>+>]<-<<<<<<<<<<]- * * display the number and initialize the loop variable to two * [>++++++++++++++++++++++++++++++++++++++++++++++++. ------------------------------------------------<<<<<<<<<<<] ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++. --------------------------.[-] >>>>>>>>>>>>++<<<<+ * * the main loop * [ [-]>> * * make copies of the number and the loop variable * [>>>>[-]>[-]>[-]>[-] >[-]>[-] <<<<<<<[->>>+>+<<<<]>>>>>>>>] <<<<<<<<<<[>>>>>>[-<<<<+>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>> [>[->>>+>>+<<<<<]>>>>>>>>>] <<<<<<<<<<[>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<]>>>>>>>>>> * * divide the number by the loop variable * [>>>[-]>>>[-]>[-]>>>] initialize <<<<<<<<<<[<<<<<<<<<<] >>>>>>>>>[-]>>>>>>>+<<<<<<<<[+]+ [ ->> double divisor until above dividend [>>>>>>[->++<]>>>>]<<<<<<<<<< [>>>>>>>>[-]>[-] <<<<[->>>++<<<]<<<<<<<<<<<<<<<]>>>>>>>>>> [>>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+< [->--------->>>>>>>>>+<<<<<<<<<<[->+<]]]]]]]]]]]>>] <<<<<<<<<<[>>>>>>>>>[-<+<<<+>>>>]<<<<<<<<<<<<<<<<<<<]>>>>>>>>>> [>>>>>>>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+>[-<+> [-<--------->>>>>>>>>>>+<<<<<<<<<<[-<+>]]]]]]]]]]]>>>] <<<<<<<<<< [>>>>[->>>+>>+<<<<<]<<<<<<<<<<<<<<] >>>>>>>>>>[>>>>>>>[-<<<+>>>]>>>]<<<<<<<<<< [>>>>>>>>[->-<]> [<<<<<<<<<[<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<<] >>>>>>>>>>>>>>>>>>>] <<<<<<<<<<<<<<<<<<<] >>>>>>>>>[+[+[+[+[+[+[+[+[+[+[[-]<+>]]]]]]]]]]]< ] >>>>>>>> [ subtract divisor from dividend <<<<<< [>>>>>>>>[-]>[-]<<<<<[->>>+>+<<<<]>>>>>>]<<<<<<<<<< [>>>>>>>>[-<<<<+>>>>]<<<[->>>+>+<<<<]<<<<<<<<<<<<<<<]>>>>>>>>>> [>>>>>>>>>[-<<<<+>>>>]>]<<<<<<<<<< [>>>>>>>>[-<->]<<<<<<<<<<<<<<<<<<]>>>>>>>>>> [>>>>>>>[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+<[->+< [++++++++++[+>-<]>>>>>>>>>>-<<<<<<<<<<]]]]]]]]]]]>>>] >>>>>>>+ [ if difference is nonnegative then [-]<<<<<<<<<<<<<<<<< replace dividend and increment quotient [>>>>[-]>>>>[-<<<<+>>>>]<<[->>+<<]<<<<<<<<<<<<<<<<]>>>>>>>>>> [>>>>>>>>[->+<<<+>>]>>]<<<<<<<<<< [>>>[->>>>>>+<<<<<<]<<<<<<<<<<<<<]>>>>>>>>>> [>>>>>>>>>[-<<<<<<+>>>>>>[-<<<<<<+>>>>>> [-<<<<<<+>>>>>>[-<<<<<<+>>>>>> [-<<<<<<+>>>>>>[-<<<<<<+>>>>>> [-<<<<<<+>>>>>>[-<<<<<<+>>>>>> [-<<<<<<+>>>>>>[-<<<<<<--------->>>>>>>>>>>>>>>>+<<<<<<<<<< [-<<<<<<+>>>>>>]]]]]]]]]]]>] >>>>>>> ] halve divisor and loop until zero <<<<<<<<<<<<<<<<<[<<<<<<<<<<]>>>>>>>>>> [>>>>>>>>[-]<<[->+<]<[->>>+<<<]>>>>>]<<<<<<<<<< [+>>>>>>>[-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> [-<<<<<<<+>>>>>>>[-<<<<<<<->>>>>>+> [-<<<<<<<+>>>>>>>]]]]]]]]]<<<<<<< [->>>>>>>+<<<<<<<]-<<<<<<<<<<] >>>>>>> [-<<<<<<<<<<<+>>>>>>>>>>>] >>>[>>>>>>>[-<<<<<<<<<<<+++++>>>>>>>>>>>]>>>]<<<<<<<<<< [+>>>>>>>>[-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>[-<<<<<<<<->>>>>+>>> [-<<<<<<<<+>>>>>>>>]]]]]]]]]<<<<<<<< [->>>>>>>>+<<<<<<<<]-<<<<<<<<<<] >>>>>>>>[-<<<<<<<<<<<<<+>>>>>>>>>>>>>]>> [>>>>>>>>[-<<<<<<<<<<<<<+++++>>>>>>>>>>>>>]>>]<<<<<<<<<< [<<<<<<<<<<]>>>>>>>>>> >>>>>> ] <<<<<< * * make copies of the loop variable and the quotient * [>>>[->>>>+>+<<<<<]>>>>>>>] <<<<<<<<<< [>>>>>>>[-<<<<+>>>>]<<<<<[->>>>>+>>+<<<<<<<]<<<<<<<<<<<<] >>>>>>>>>>[>>>>>>>[-<<<<<+>>>>>]>>>]<<<<<<<<<< * * break out of the loop if the quotient is larger than the loop variable * [>>>>>>>>>[-<->]< [<<<<<<<< [<<[-]>>>>>>>>>>[-<<<<<<<<<<+>>>>>>>>>>]<<<<<<<<<<<<<<<<<<] >>>>>>>>>>>>>>>>>>]<<<<<<<<<<<<<<<<<<] >>>>>>>>[>-<[+[+[+[+[+[+[+[+[+[[-]>+<]]]]]]]]]]]>+ [ [-] * * partially increment the loop variable * <[-]+>>>>+>>>>>>>>[>>>>>>>>>>]<<<<<<<<<< * * examine the remainder for nonzero digits * [<<<<<<[<<<<[<<<<<<<<<<]>>>>+<<<<<<<<<<]<<<<] >>>>>>>>>>>>>>>>>>>>[>>>>>>>>>>]<<<<<<<<<<[<<<<<<<<<<] >>>>- [ [+] * * decrement the loop variable and replace the number with the quotient * >>>>>>>>-<<[>[-]>>[-<<+>>]>>>>>>>]<<<<<<<<<< * * display the loop variable * [+>>[>>>>>>>>+>>]<<-<<<<<<<<<<]- [>>++++++++++++++++++++++++++++++++++++++++++++++++. ------------------------------------------------<<<<<<<<<<<<] ++++++++++++++++++++++++++++++++.[-]>>>> ] * * normalize the loop variable * >>>>>> [>>[->>>>>+<<<<<[->>>>>+<<<<< [->>>>>+<<<<<[->>>>>+<<<<< [->>>>>+<<<<<[->>>>>+<<<<< [->>>>>+<<<<<[->>>>>+<<<<< [->>>>>+<<<<<[->>>>>--------->>>>>+<<<<<<<<<< [->>>>>+<<<<<]]]]]]]]]]]>>>>>>>>] <<<<<<<<<<[>>>>>>>[-<<<<<+>>>>>]<<<<<<<<<<<<<<<<<] >>>>>>>>> ]< ]>> * * display the number and end * [>>>>>>>>>>]<<<<<<<<<<[+>[>>>>>>>>>+>]<-<<<<<<<<<<]- [>++++++++++++++++++++++++++++++++++++++++++++++++.<<<<<<<<<<<] ++++++++++. ================================================ FILE: samples/Brainfuck/fib100.bf ================================================ # Calculate and output all fibonacci numbers under 100 +++++++++++ >+>>>>++++++++++++++++++++++++++++++++++++++++++++ >++++++++++++++++++++++++++++++++<<<<<<[>[>>>>>>+> +<<<<<<<-]>>>>>>>[<<<<<<<+>>>>>>>-]<[>++++++++++[- <-[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]]>[<<[>>>+<<< -]>>[-]]<<]>>>[>>+>+<<<-]>>>[<<<+>>>-]+<[>[-]<[-]] >[<<+>>[-]]<<<<<<<]>>>>>[+++++++++++++++++++++++++ +++++++++++++++++++++++.[-]]++++++++++<[->-<]>++++ ++++++++++++++++++++++++++++++++++++++++++++.[-]<< <<<<<<<<<<[>>>+>+<<<<-]>>>>[<<<<+>>>>-]<-[>>.>.<<< [-]]<<[>>+>+<<<-]>>>[<<<+>>>-]<<[<+>-]>[<+>-]<<<-] ================================================ FILE: samples/Brainfuck/hello.bf ================================================ // More complex version of hello world >++++++++[<+++++++++>-]<.>>+>+>++>[-]+<[>[->+<<++++>]<<]>.+++++++..+++.> >+++++++.<<<[[-]<[-]>]<+++++++++++++++.>>.+++.------.--------.>>+.>++++. ================================================ FILE: samples/Brainfuck/helloworld.bf ================================================ // Hello World ++++++++[>++++[>++>+++>+++>+<<<<-]>+>+>->>+[<]<-]>>.>---.+++++++..+++.>>.<-.<.+++.------.--------.>>+.>++. ================================================ FILE: samples/Brainfuck/rot13.bf ================================================ # ROT13 cipher -,+[ Read first character and start outer character reading loop -[ Skip forward if character is 0 >>++++[>++++++++<-] Set up divisor (32) for division loop (MEMORY LAYOUT: dividend copy remainder divisor quotient zero zero) <+<-[ Set up dividend (x minus 1) and enter division loop >+>+>-[>>>] Increase copy and remainder / reduce divisor / Normal case: skip forward <[[>+<-]>>+>] Special case: move remainder back to divisor and increase quotient <<<<<- Decrement dividend ] End division loop ]>>>[-]+ End skip loop; zero former divisor and reuse space for a flag >--[-[<->+++[-]]]<[ Zero that flag unless quotient was 2 or 3; zero quotient; check flag ++++++++++++<[ If flag then set up divisor (13) for second division loop (MEMORY LAYOUT: zero copy dividend divisor remainder quotient zero zero) >-[>+>>] Reduce divisor; Normal case: increase remainder >[+[<+>-]>+>>] Special case: increase remainder / move it back to divisor / increase quotient <<<<<- Decrease dividend ] End division loop >>[<+>-] Add remainder back to divisor to get a useful 13 >[ Skip forward if quotient was 0 -[ Decrement quotient and skip forward if quotient was 1 -<<[-]>> Zero quotient and divisor if quotient was 2 ]<<[<<->>-]>> Zero divisor and subtract 13 from copy if quotient was 1 ]<<[<<+>>-] Zero divisor and add 13 to copy if quotient was 0 ] End outer skip loop (jump to here if ((character minus 1)/32) was not 2 or 3) <[-] Clear remainder from first division if second division was skipped <.[-] Output ROT13ed character from copy and clear it <-,+ Read next character ] End character reading loop ================================================ FILE: samples/BrighterScript/Main.bs ================================================ ' ********************************************************* ' ** BrighterScript demonstration file ' ** Nov 2021 ' ** Using Roku's SimpleGrid example ' ********************************************************* '************************************************************ '** Import statement '************************************************************ import "SimpleGrid.bs" '************************************************************ '** New Functionalitys examples '************************************************************ function Main() as Void app = new ApplicationClass() end function class ApplicationClass public thisIsATernaryExample as string public thisIsAStringTemplateExample as string public user as Dynamic public aNode as Object public function new() as Void m.init() end function private function init() 'Run imported SimpleGrid StartApp() StartApp() 'Ternary operator m.thisIsATernaryExample = 1 = 1 ? "1 equals 1" : "1 is different from 1" print "Ternary example: ", m.thisIsATernaryExample 'Template Strings m.thisIsAStringTemplateExample = `The result from ternary example is ${m.thisIsATernaryExample}` print "Template strings example: ", m.thisIsAStringTemplateExample 'Null-coalescing operator user = m.user ?? "User is null/invalid, got this string instead" print "Null-coalescing operator: ", user 'Regular Expression Literals ' Gets transpiled to -> print CreateObject("roRegex", "hello world", "ig") print /hello world/ig 'Source Literals ' prints "file :///PATH.bs" print SOURCE_FILE_PATH ' prints the "print SOURCE_LINE_NUM" line's number print SOURCE_LINE_NUM ' prints function's name print FUNCTION_NAME ' prints function's name, namespaced, ex: class.functionName print SOURCE_FUNCTION_NAME ' prints a combination of SOURCE_FILE_PATH and SOURCE_LINE_NUM. ex: "file :///PATH.bs" print SOURCE_LOCATION ' prints The pkg path of the file. ex: "pkg:/source/main.brs" print PKG_PATH end function end class ================================================ FILE: samples/BrighterScript/RowListExample.bs ================================================ sub Main() showChannelSGScreen() end sub sub showChannelSGScreen() screen = CreateObject("roSGScreen") m.port = CreateObject("roMessagePort") screen.setMessagePort(m.port) scene = screen.CreateScene("RowListExample") screen.show() while(true) msg = wait(0, m.port) msgType = type(msg) if msgType = "roSGScreenEvent" if msg.isScreenClosed() then return end if end while end sub ================================================ FILE: samples/BrighterScript/SimpleGrid.bs ================================================ '************************************************************ '** Application startup '************************************************************ Sub StartApp() 'initialize theme attributes like titles, logos and overhang color initTheme() gridstyle = "Flat-Movie" 'set to go, time to get started while gridstyle <> "" print "starting grid style= ";gridstyle screen=preShowGridScreen(gridstyle) gridstyle = showGridScreen(screen, gridstyle) end while End Sub '************************************************************* '** Set the configurable theme attributes for the application '** '** Configure the custom overhang and Logo attributes '** These attributes affect the branding of the application '** and are artwork, colors and offsets specific to the app '************************************************************* Sub initTheme() app = CreateObject("roAppManager") app.SetTheme(CreateDefaultTheme()) End Sub '****************************************************** '** @return The default application theme. '** Screens can make slight adjustments to the default '** theme by getting it from here and then overriding '** individual theme attributes. '****************************************************** Function CreateDefaultTheme() as Object theme = CreateObject("roAssociativeArray") theme.ThemeType = "generic-dark" ' All these are greyscales theme.GridScreenBackgroundColor = "#363636" theme.GridScreenMessageColor = "#808080" theme.GridScreenRetrievingColor = "#CCCCCC" theme.GridScreenListNameColor = "#FFFFFF" ' Color values work here theme.GridScreenDescriptionTitleColor = "#001090" theme.GridScreenDescriptionDateColor = "#FF005B" theme.GridScreenDescriptionRuntimeColor = "#5B005B" theme.GridScreenDescriptionSynopsisColor = "#606000" 'used in the Grid Screen theme.CounterTextLeft = "#FF0000" theme.CounterSeparator = "#00FF00" theme.CounterTextRight = "#0000FF" theme.GridScreenLogoHD = "pkg:/images/Overhang_Test_HD.png" theme.GridScreenLogoOffsetHD_X = "0" theme.GridScreenLogoOffsetHD_Y = "0" theme.GridScreenOverhangHeightHD = "99" theme.GridScreenLogoSD = "pkg:/images/Overhang_Test_SD43.png" theme.GridScreenOverhangHeightSD = "66" theme.GridScreenLogoOffsetSD_X = "0" theme.GridScreenLogoOffsetSD_Y = "0" ' to use your own focus ring artwork 'theme.GridScreenFocusBorderSD = "pkg:/images/GridCenter_Border_Movies_SD43.png" 'theme.GridScreenBorderOffsetSD = "(-26,-25)" 'theme.GridScreenFocusBorderHD = "pkg:/images/GridCenter_Border_Movies_HD.png" 'theme.GridScreenBorderOffsetHD = "(-28,-20)" ' to use your own description background artwork 'theme.GridScreenDescriptionImageSD = "pkg:/images/Grid_Description_Background_SD43.png" 'theme.GridScreenDescriptionOffsetSD = "(125,170)" 'theme.GridScreenDescriptionImageHD = "pkg:/images/Grid_Description_Background_HD.png" 'theme.GridScreenDescriptionOffsetHD = "(190,255)" return theme End Function '****************************************************** '** Perform any startup/initialization stuff prior to '** initially showing the screen. '****************************************************** Function preShowGridScreen(style as string) As Object m.port=CreateObject("roMessagePort") screen = CreateObject("roGridScreen") screen.SetMessagePort(m.port) ' screen.SetDisplayMode("best-fit") screen.SetDisplayMode("scale-to-fill") screen.SetGridStyle(style) return screen End Function '****************************************************** '** Display the gird screen and wait for events from '** the screen. The screen will show retreiving while '** we fetch and parse the feeds for the show posters '****************************************************** Function showGridScreen(screen As Object, gridstyle as string) As string print "enter showGridScreen" categoryList = getCategoryList() categoryList[0] = "GridStyle: " + gridstyle screen.setupLists(categoryList.count()) screen.SetListNames(categoryList) StyleButtons = getGridControlButtons() screen.SetContentList(0, StyleButtons) for i = 1 to categoryList.count()-1 screen.SetContentList(i, getShowsForCategoryItem(categoryList[i])) end for screen.Show() while true print "Waiting for message" msg = wait(0, m.port) 'msg = wait(0, screen.GetMessagePort()) ' getmessageport does not work on gridscreen print "Got Message:";type(msg) if type(msg) = "roGridScreenEvent" then print "msg= "; msg.GetMessage() " , index= "; msg.GetIndex(); " data= "; msg.getData() if msg.isListItemFocused() then print"list item focused | current show = "; msg.GetIndex() else if msg.isListItemSelected() then row = msg.GetIndex() selection = msg.getData() print "list item selected row= "; row; " selection= "; selection ' Did we get a selection from the gridstyle selection row? if (row = 0) ' yes, return so we can come back with new style return StyleButtons[selection].Title endif 'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()]) else if msg.isScreenClosed() then return "" end if end If end while End Function '********************************************************** '** When a poster on the home screen is selected, we call '** this function passing an roAssociativeArray with the '** ContentMetaData for the selected show. This data should '** be sufficient for the springboard to display '********************************************************** Function displayShowDetailScreen(category as Object, showIndex as Integer) As Integer 'add code to create springboard, for now we do nothing return 1 End Function '************************************************************** '** Return the list of categories to display in the filter '** banner. The result is an roArray containing the names of '** all of the categories. All just static data for the example. '*************************************************************** Function getCategoryList() As Object categoryList = [ "GridStyle", "Reality", "History", "News", "Comedy", "Drama"] return categoryList End Function '******************************************************************** '** Given the category from the filter banner, return an array '** of ContentMetaData objects (roAssociativeArray's) representing '** the shows for the category. For this example, we just cheat and '** create and return a static array with just the minimal items '** set, but ideally, you'd go to a feed service, fetch and parse '** this data dynamically, so content for each category is dynamic '******************************************************************** Function getShowsForCategoryItem(category As Object) As Object print "getting shows for category "; category showList = [ { Title: category + ": Header", releaseDate: "1976", length: 3600-600, Description:"This row is category " + category, hdBranded: true, HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif", Description:"Short Synopsis #1", Synopsis:"Length", StarRating:10, } { Title: category + ": Beverly Hillbillies", releaseDate: "1969", rating: "PG", Description:"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.", numEpisodes:42, contentType:"season", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg", StarRating:80, UserStarRating:40 } { Title: category + ": Babylon 5", releaseDate: "1996", rating: "PG", Description:"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.", numEpisodes:102, contentType:"season", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg", StarRating:80, UserStarRating:40 } { Title: category + ": John F. Kennedy", releaseDate: "1961", rating: "PG", Description:"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg", StarRating:100 } { Title: category + ": Man on the Moon", releaseDate: "1969", rating: "PG", Description:"That's one small step for a man, one giant leap for mankind.", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg", StarRating:100 } { Title: category + ": I have a Dream", releaseDate: "1963", rating: "PG", Description:"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg", StarRating:100 } ] return showList End Function function getGridControlButtons() as object buttons = [ { Title: "Flat-Movie" ReleaseDate: "HD:5x2 SD:5x2" Description: "Flat-Movie (Netflix) style" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif" SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif" } { Title: "Flat-Landscape" ReleaseDate: "HD:5x3 SD:4x3" Description: "Channel Store" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg", } { Title: "Flat-Portrait" ReleaseDate: "HD:5x2 SD:5x2" Description: "3x4 style posters" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg", } { Title: "Flat-Square" ReleaseDate: "HD:7x3 SD:6x3" Description: "1x1 style posters" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png", } { Title: "Flat-16x9" ReleaseDate: "HD:5x3 SD:4x3" Description: "HD style posters" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png", } ] return buttons End Function ================================================ FILE: samples/Brightscript/SimpleGrid.brs ================================================ ' ********************************************************* ' ** Simple Grid Screen Demonstration App ' ** Jun 2010 ' ** Copyright (c) 2010 Roku Inc. All Rights Reserved. ' ********************************************************* '************************************************************ '** Application startup '************************************************************ Sub Main() 'initialize theme attributes like titles, logos and overhang color initTheme() gridstyle = "Flat-Movie" 'set to go, time to get started while gridstyle <> "" print "starting grid style= ";gridstyle screen=preShowGridScreen(gridstyle) gridstyle = showGridScreen(screen, gridstyle) end while End Sub '************************************************************* '** Set the configurable theme attributes for the application '** '** Configure the custom overhang and Logo attributes '** These attributes affect the branding of the application '** and are artwork, colors and offsets specific to the app '************************************************************* Sub initTheme() app = CreateObject("roAppManager") app.SetTheme(CreateDefaultTheme()) End Sub '****************************************************** '** @return The default application theme. '** Screens can make slight adjustments to the default '** theme by getting it from here and then overriding '** individual theme attributes. '****************************************************** Function CreateDefaultTheme() as Object theme = CreateObject("roAssociativeArray") theme.ThemeType = "generic-dark" ' All these are greyscales theme.GridScreenBackgroundColor = "#363636" theme.GridScreenMessageColor = "#808080" theme.GridScreenRetrievingColor = "#CCCCCC" theme.GridScreenListNameColor = "#FFFFFF" ' Color values work here theme.GridScreenDescriptionTitleColor = "#001090" theme.GridScreenDescriptionDateColor = "#FF005B" theme.GridScreenDescriptionRuntimeColor = "#5B005B" theme.GridScreenDescriptionSynopsisColor = "#606000" 'used in the Grid Screen theme.CounterTextLeft = "#FF0000" theme.CounterSeparator = "#00FF00" theme.CounterTextRight = "#0000FF" theme.GridScreenLogoHD = "pkg:/images/Overhang_Test_HD.png" theme.GridScreenLogoOffsetHD_X = "0" theme.GridScreenLogoOffsetHD_Y = "0" theme.GridScreenOverhangHeightHD = "99" theme.GridScreenLogoSD = "pkg:/images/Overhang_Test_SD43.png" theme.GridScreenOverhangHeightSD = "66" theme.GridScreenLogoOffsetSD_X = "0" theme.GridScreenLogoOffsetSD_Y = "0" ' to use your own focus ring artwork 'theme.GridScreenFocusBorderSD = "pkg:/images/GridCenter_Border_Movies_SD43.png" 'theme.GridScreenBorderOffsetSD = "(-26,-25)" 'theme.GridScreenFocusBorderHD = "pkg:/images/GridCenter_Border_Movies_HD.png" 'theme.GridScreenBorderOffsetHD = "(-28,-20)" ' to use your own description background artwork 'theme.GridScreenDescriptionImageSD = "pkg:/images/Grid_Description_Background_SD43.png" 'theme.GridScreenDescriptionOffsetSD = "(125,170)" 'theme.GridScreenDescriptionImageHD = "pkg:/images/Grid_Description_Background_HD.png" 'theme.GridScreenDescriptionOffsetHD = "(190,255)" return theme End Function '****************************************************** '** Perform any startup/initialization stuff prior to '** initially showing the screen. '****************************************************** Function preShowGridScreen(style as string) As Object m.port=CreateObject("roMessagePort") screen = CreateObject("roGridScreen") screen.SetMessagePort(m.port) ' screen.SetDisplayMode("best-fit") screen.SetDisplayMode("scale-to-fill") screen.SetGridStyle(style) return screen End Function '****************************************************** '** Display the gird screen and wait for events from '** the screen. The screen will show retreiving while '** we fetch and parse the feeds for the show posters '****************************************************** Function showGridScreen(screen As Object, gridstyle as string) As string print "enter showGridScreen" categoryList = getCategoryList() categoryList[0] = "GridStyle: " + gridstyle screen.setupLists(categoryList.count()) screen.SetListNames(categoryList) StyleButtons = getGridControlButtons() screen.SetContentList(0, StyleButtons) for i = 1 to categoryList.count()-1 screen.SetContentList(i, getShowsForCategoryItem(categoryList[i])) end for screen.Show() while true print "Waiting for message" msg = wait(0, m.port) 'msg = wait(0, screen.GetMessagePort()) ' getmessageport does not work on gridscreen print "Got Message:";type(msg) if type(msg) = "roGridScreenEvent" then print "msg= "; msg.GetMessage() " , index= "; msg.GetIndex(); " data= "; msg.getData() if msg.isListItemFocused() then print"list item focused | current show = "; msg.GetIndex() else if msg.isListItemSelected() then row = msg.GetIndex() selection = msg.getData() print "list item selected row= "; row; " selection= "; selection ' Did we get a selection from the gridstyle selection row? if (row = 0) ' yes, return so we can come back with new style return StyleButtons[selection].Title endif 'm.curShow = displayShowDetailScreen(showList[msg.GetIndex()]) else if msg.isScreenClosed() then return "" end if end If end while End Function '********************************************************** '** When a poster on the home screen is selected, we call '** this function passing an roAssociativeArray with the '** ContentMetaData for the selected show. This data should '** be sufficient for the springboard to display '********************************************************** Function displayShowDetailScreen(category as Object, showIndex as Integer) As Integer 'add code to create springboard, for now we do nothing return 1 End Function '************************************************************** '** Return the list of categories to display in the filter '** banner. The result is an roArray containing the names of '** all of the categories. All just static data for the example. '*************************************************************** Function getCategoryList() As Object categoryList = [ "GridStyle", "Reality", "History", "News", "Comedy", "Drama"] return categoryList End Function '******************************************************************** '** Given the category from the filter banner, return an array '** of ContentMetaData objects (roAssociativeArray's) representing '** the shows for the category. For this example, we just cheat and '** create and return a static array with just the minimal items '** set, but ideally, you'd go to a feed service, fetch and parse '** this data dynamically, so content for each category is dynamic '******************************************************************** Function getShowsForCategoryItem(category As Object) As Object print "getting shows for category "; category showList = [ { Title: category + ": Header", releaseDate: "1976", length: 3600-600, Description:"This row is category " + category, hdBranded: true, HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif", Description:"Short Synopsis #1", Synopsis:"Length", StarRating:10, } { Title: category + ": Beverly Hillbillies", releaseDate: "1969", rating: "PG", Description:"Come and listen to a story about a man named Jed: Poor mountaineer, barely kept his family fed. Then one day he was shootin at some food, and up through the ground came a bubblin crude. Oil that is, black gold, Texas tea.", numEpisodes:42, contentType:"season", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/4/4e/The_Beverly_Hillbillies.jpg", StarRating:80, UserStarRating:40 } { Title: category + ": Babylon 5", releaseDate: "1996", rating: "PG", Description:"The show centers on the Babylon 5 space station: a focal point for politics, diplomacy, and conflict during the years 2257-2262.", numEpisodes:102, contentType:"season", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/9/9d/Smb5-s4.jpg", StarRating:80, UserStarRating:40 } { Title: category + ": John F. Kennedy", releaseDate: "1961", rating: "PG", Description:"My fellow citizens of the world: ask not what America will do for you, but what together we can do for the freedom of man.", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/en/5/52/Jfk_happy_birthday_1.jpg", StarRating:100 } { Title: category + ": Man on the Moon", releaseDate: "1969", rating: "PG", Description:"That's one small step for a man, one giant leap for mankind.", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/1/1e/Apollo_11_first_step.jpg", StarRating:100 } { Title: category + ": I have a Dream", releaseDate: "1963", rating: "PG", Description:"I have a dream that my four little children will one day live in a nation where they will not be judged by the color of their skin, but by the content of their character.", HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/8/81/Martin_Luther_King_-_March_on_Washington.jpg", StarRating:100 } ] return showList End Function function getGridControlButtons() as object buttons = [ { Title: "Flat-Movie" ReleaseDate: "HD:5x2 SD:5x2" Description: "Flat-Movie (Netflix) style" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif" SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/4/43/Gold_star_on_blue.gif" } { Title: "Flat-Landscape" ReleaseDate: "HD:5x3 SD:4x3" Description: "Channel Store" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/9/96/Dunkery_Hill.jpg/800px-Dunkery_Hill.jpg", } { Title: "Flat-Portrait" ReleaseDate: "HD:5x2 SD:5x2" Description: "3x4 style posters" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/9/9f/Kane_George_Gurnett.jpg", } { Title: "Flat-Square" ReleaseDate: "HD:7x3 SD:6x3" Description: "1x1 style posters" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/d/de/SQUARE_SHAPE.svg/536px-SQUARE_SHAPE.svg.png", } { Title: "Flat-16x9" ReleaseDate: "HD:5x3 SD:4x3" Description: "HD style posters" HDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png", SDPosterUrl:"http://upload.wikimedia.org/wikipedia/commons/thumb/2/22/%C3%89cran_TV_plat.svg/200px-%C3%89cran_TV_plat.svg.png", } ] return buttons End Function ================================================ FILE: samples/Browserslist/filenames/.browserslistrc ================================================ # Comment defaults # Not keyword not dead # Market share with % > 10% < 1.5% in US >= .5% # Rare queries maintained node versions supports es6-module # Extend keyword extend @company/browserslist-config # Direct versions Chrome 50 Firefox ESR Safari TP OperaMini all # Block header [production] # and keyword Edge > 40 and Edge < 43 # or/, keywords IE 11 or IE 10, ie 9 ================================================ FILE: samples/Browserslist/filenames/browserslist ================================================ # Comment defaults # Not keyword not dead # Market share with % > 10% < 1.5% in US >= .5% # Rare queries maintained node versions supports es6-module # Extend keyword extend @company/browserslist-config # Direct versions Chrome 50 Firefox ESR Safari TP OperaMini all # Block header [production] # and keyword Edge > 40 and Edge < 43 # or/, keywords IE 11 or IE 10, ie 9 ================================================ FILE: samples/Bru/example.bru ================================================ get { url: https://api.github.com/users/usebruno } get { url: https://api.textlocal.in/send?apiKey=secret&numbers=9988776655&message=hello } headers { content-type: application/json Authorization: Bearer topsecret } post { url: https://api.textlocal.in/send } body { { "apiKey": "secret", "numbers": "9988776655", "message": "Woof! lets play with some apis" } } headers { content-type: application/json Authorization: Bearer topsecret } post { url: https://api.textlocal.in/login } body { { "username": "johnnash", "password": "governingdynamics" } } script:post-response { bru.setVar("token", res.body.token); } tests { test("should be able to login", function() { expect(res.status).to.equal(201); }); test("should receive the token", function() { expect(res.body.token).to.be.a('string'); }); } ================================================ FILE: samples/BuildStream/hello.bst ================================================ kind: manual description: | Building manually # Depend on the base system depends: - base.bst # Stage the files/src directory for building sources: - kind: local path: files/src # Now configure the commands to run config: build-commands: - make PREFIX="%{prefix}" install-commands: - make -j1 PREFIX="%{prefix}" DESTDIR="%{install-root}" install ================================================ FILE: samples/C/2D.C ================================================ #include "2D.h" #include void set_vgabasemem(void) { ULONG vgabase; SELECTOR tmp; asm mov [tmp], ds dpmi_get_sel_base(&vgabase, tmp); vgabasemem = (char *)(-vgabase + 0xa0000); } void drw_chdis(int mode) // change the display! { regs.b.ah = 0x00; // seet theh display moode regs.b.al = mode; // change it to the mode like innit regs.h.flags = 0x72;// Set the dingoes kidneys out of FLAGS eh? regs.h.ss = 0; // Like, totally set the stack segment regs.h.sp = 0; // Set tha stack pointaaaaahhhhh!!! dpmi_simulate_real_interrupt(0x10, ®s); } void drw_pix(int x, int y, enum COLORS col) { *VGAPIX(x, y) = col; } void drw_line(int x0, int y0, int x1, int y1, enum COLORS col) { // Going for the optimized version of bresenham's line algo. int stp = (abs(y0 - y1) > abs(x0 - x1)); int tmp, dx, dy, err, yi, i, j; // yi = y excrement if (stp) { // swappity swap tmp = y0; y0 = x0; x0 = tmp; tmp = y1; y1 = x1; x1 = tmp; } // AAAAND NOW WE MUST DO ZEES AGAIN :( // I'm sure there was a func somewhere that does this? :P if (x0 > x1) { tmp = x0; x0 = x1; x1 = tmp; tmp = y0; y0 = y1; y1 = tmp; } dx = (x1 - x0); dy = (abs(y1 - y0)); err = (dx / 2); if (y0 < y1) yi = 1; else yi = -1; j = y0; for (i = x0; i < x1; i++) { if (stp) *VGAPIX(j, i) = col; else *VGAPIX(i, j) = col; err -= dy; if (err < 0) { j += yi; err += dx; } } } void drw_rectl(int x, int y, int w, int h, enum COLORS col) { drw_line(x, y, x+w, y, col); drw_line(x+w, y, x+w, y+h, col); drw_line(x, y, x, y+h, col); drw_line(x, y+h, x+w+1, y+h, col); } void drw_rectf(int x, int y, int w, int h, enum COLORS col) { int i, j; for (j = y; j < x+h; j++) { for (i = x; i < y+w; i++) { *VGAPIX(i, j) = col; } } } void drw_circl(int x, int y, int rad, enum COLORS col) { int mang, i; // max angle, haha int px, py; mang = 360; // Yeah yeah I'll switch to rad later for (i = 0; i <= mang; i++) { px = cos(i)*rad + x; // + px; // causes some really cools effects! :D py = sin(i)*rad + y; // + py; *VGAPIX(px, py) = col; } } void drw_tex(int x, int y, int w, int h, enum COLORS tex[]) { // i*w+j int i, j; for (i = 0; i < w; i++) { for (j = 0; j < h; j++) { *VGAPIX(x+i, y+j) = tex[j*w+i]; } } } void 2D_init(void) { set_vgabasemem(); drw_chdis(0x13); } void 2D_exit(void) { drw_chdis(3); } /* int main() { set_vgabasemem(); drw_chdis(0x13); while(!kbhit()) { if ((getch()) == 0x1b) // escape break; } drw_chdis(3); return 0; } */ ================================================ FILE: samples/C/2D.H ================================================ #ifndef __2DGFX #define __2DGFX // Includes #include #include #include #include // Defines #define VGAPIX(x,y) (vgabasemem + (x) + (y) * 320) // Variables char * vgabasemem; DPMI_REGS regs; // Drawing functions: //void setvgabasemem(void); void drw_chdis(int mode); // draw_func_change_display void drw_pix(int x, int y, enum COLORS col); void drw_line(int x0, int y0, int x1, int y1, enum COLORS col); void drw_rectl(int x, int y, int w, int h, enum COLORS col); void drw_rectf(int x, int y, int w, int h, enum COLORS col); void drw_cirl(int x, int y, int rad, enum COLORS col); void drw_tex(int x, int y, int w, int h, enum COLORS tex[]); void 2D_init(void); void 2D_exit(void); #endif ================================================ FILE: samples/C/Arduino.cats ================================================ /** The MIT License (MIT) Copyright (c) 2014 Hongwei Xi Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ // Source: https://github.com/githwxi/ATS-Postiats-contrib/blob/master/contrib/arduino/CATS/Arduino.cats /* ** The prelude for Ardunio */ /* ****** ****** */ #ifndef ARDUINO_CATS_ARDUINO #define ARDUINO_CATS_ARDUINO /* ****** ****** */ #include /* ****** ****** */ #define delay_int(ms) delay(ms) #define delay_ulint(ms) delay(ms) /* ****** ****** */ // #define random_int_1(x) random(x) #define random_int_2(x, y) random(x, y) #define random_lint_1(x) random(x) #define random_lint_2(x, y) random(x, y) // #define randomSeed_int(x) randomSeed(x) #define randomSeed_uint(x) randomSeed(x) // /* ****** ****** */ #endif // #ifndef(ARDUINO_CATS_ARDUINO) /* ****** ****** */ /* end of [Arduino.cats] */ ================================================ FILE: samples/C/ArrowLeft.h ================================================ /* * This file is part of GTK++ (libGTK++) * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net) * * GTK++ is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * GTK++ is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ /* GdkPixbuf RGBA C-Source image dump */ #ifdef __SUNPRO_C #pragma align 4 (ArrowLeft) #endif #ifdef __GNUC__ static const uint8_t ArrowLeft[] __attribute__ ((__aligned__ (4))) = #else static const uint8_t ArrowLeft[] = #endif { "" /* Pixbuf magic (0x47646b50) */ "GdkP" /* length: header (24) + pixel_data (1600) */ "\0\0\6X" /* pixdata_type (0x1010002) */ "\1\1\0\2" /* rowstride (80) */ "\0\0\0P" /* width (20) */ "\0\0\0\24" /* height (20) */ "\0\0\0\24" /* pixel_data: */ "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377" "\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0" "\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\377\0\0\0\377\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\377\0\0\0\377\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\377\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0" "\0\0"}; ================================================ FILE: samples/C/Field.h ================================================ /***************************************************************************** * Dwarf Mine - The 13-11 Benchmark * * Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber, * Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary; * Zimmermann, Florian * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ #pragma once enum Field { Free, Black, White, Illegal }; typedef Field Player; ================================================ FILE: samples/C/GLKMatrix4.h ================================================ // // GLKMatrix4.h // GLKit // // Copyright (c) 2011, Apple Inc. All rights reserved. // #ifndef __GLK_MATRIX_4_H #define __GLK_MATRIX_4_H #include #include #include #if defined(__ARM_NEON__) #include #endif #include #include #include #include #ifdef __cplusplus extern "C" { #endif #pragma mark - #pragma mark Prototypes #pragma mark - extern const GLKMatrix4 GLKMatrix4Identity; /* m30, m31, and m32 correspond to the translation values tx, ty, tz, respectively. */ static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33); /* m03, m13, and m23 correspond to the translation values tx, ty, tz, respectively. */ static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33); /* m[12], m[13], and m[14] correspond to the translation values tx, ty, and tz, respectively. */ static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]); /* m[3], m[7], and m[11] correspond to the translation values tx, ty, and tz, respectively. */ static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]); /* row0, row1, and row2's last component should correspond to the translation values tx, ty, and tz, respectively. */ static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0, GLKVector4 row1, GLKVector4 row2, GLKVector4 row3); /* column3's first three components should correspond to the translation values tx, ty, and tz. */ static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0, GLKVector4 column1, GLKVector4 column2, GLKVector4 column3); /* The quaternion will be normalized before conversion. */ static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion); static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz); static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz); static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z); static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians); static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians); static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians); /* Equivalent to gluPerspective. */ static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ); /* Equivalent to glFrustum. */ static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right, float bottom, float top, float nearZ, float farZ); /* Equivalent to glOrtho. */ static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right, float bottom, float top, float nearZ, float farZ); /* Equivalent to gluLookAt. */ static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ); /* Returns the upper left 3x3 portion of the 4x4 matrix. */ static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix); /* Returns the upper left 2x2 portion of the 4x4 matrix. */ static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix); /* GLKMatrix4GetRow returns vectors for rows 0, 1, and 2 whose last component will be the translation value tx, ty, and tz, respectively. Valid row values range from 0 to 3, inclusive. */ static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row); /* GLKMatrix4GetColumn returns a vector for column 3 whose first three components will be the translation values tx, ty, and tz. Valid column values range from 0 to 3, inclusive. */ static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column); /* GLKMatrix4SetRow expects that the vector for row 0, 1, and 2 will have a translation value as its last component. Valid row values range from 0 to 3, inclusive. */ static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector); /* GLKMatrix4SetColumn expects that the vector for column 3 will contain the translation values tx, ty, and tz as its first three components, respectively. Valid column values range from 0 to 3, inclusive. */ static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector); static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix); GLKMatrix4 GLKMatrix4Invert(GLKMatrix4 matrix, bool *isInvertible); GLKMatrix4 GLKMatrix4InvertAndTranspose(GLKMatrix4 matrix, bool *isInvertible); static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight); static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight); static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight); static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz); static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector); /* The last component of the GLKVector4, translationVector, is ignored. */ static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector); static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz); static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector); /* The last component of the GLKVector4, scaleVector, is ignored. */ static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector); static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z); static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector); /* The last component of the GLKVector4, axisVector, is ignored. */ static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector); static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians); static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians); static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians); /* Assumes 0 in the w component. */ static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight); /* Assumes 1 in the w component. */ static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight); /* Assumes 1 in the w component and divides the resulting vector by w before returning. */ static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight); /* Assumes 0 in the w component. */ static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount); /* Assumes 1 in the w component. */ static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount); /* Assumes 1 in the w component and divides the resulting vector by w before returning. */ static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount); static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight); static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount); #pragma mark - #pragma mark Implementations #pragma mark - static __inline__ GLKMatrix4 GLKMatrix4Make(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33) { GLKMatrix4 m = { m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33 }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeAndTranspose(float m00, float m01, float m02, float m03, float m10, float m11, float m12, float m13, float m20, float m21, float m22, float m23, float m30, float m31, float m32, float m33) { GLKMatrix4 m = { m00, m10, m20, m30, m01, m11, m21, m31, m02, m12, m22, m32, m03, m13, m23, m33 }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeWithArray(float values[16]) { GLKMatrix4 m = { values[0], values[1], values[2], values[3], values[4], values[5], values[6], values[7], values[8], values[9], values[10], values[11], values[12], values[13], values[14], values[15] }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeWithArrayAndTranspose(float values[16]) { #if defined(__ARM_NEON__) float32x4x4_t m = vld4q_f32(values); return *(GLKMatrix4 *)&m; #else GLKMatrix4 m = { values[0], values[4], values[8], values[12], values[1], values[5], values[9], values[13], values[2], values[6], values[10], values[14], values[3], values[7], values[11], values[15] }; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4MakeWithRows(GLKVector4 row0, GLKVector4 row1, GLKVector4 row2, GLKVector4 row3) { GLKMatrix4 m = { row0.v[0], row1.v[0], row2.v[0], row3.v[0], row0.v[1], row1.v[1], row2.v[1], row3.v[1], row0.v[2], row1.v[2], row2.v[2], row3.v[2], row0.v[3], row1.v[3], row2.v[3], row3.v[3] }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeWithColumns(GLKVector4 column0, GLKVector4 column1, GLKVector4 column2, GLKVector4 column3) { #if defined(__ARM_NEON__) float32x4x4_t m; m.val[0] = vld1q_f32(column0.v); m.val[1] = vld1q_f32(column1.v); m.val[2] = vld1q_f32(column2.v); m.val[3] = vld1q_f32(column3.v); return *(GLKMatrix4 *)&m; #else GLKMatrix4 m = { column0.v[0], column0.v[1], column0.v[2], column0.v[3], column1.v[0], column1.v[1], column1.v[2], column1.v[3], column2.v[0], column2.v[1], column2.v[2], column2.v[3], column3.v[0], column3.v[1], column3.v[2], column3.v[3] }; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4MakeWithQuaternion(GLKQuaternion quaternion) { quaternion = GLKQuaternionNormalize(quaternion); float x = quaternion.q[0]; float y = quaternion.q[1]; float z = quaternion.q[2]; float w = quaternion.q[3]; float _2x = x + x; float _2y = y + y; float _2z = z + z; float _2w = w + w; GLKMatrix4 m = { 1.0f - _2y * y - _2z * z, _2x * y + _2w * z, _2x * z - _2w * y, 0.0f, _2x * y - _2w * z, 1.0f - _2x * x - _2z * z, _2y * z + _2w * x, 0.0f, _2x * z + _2w * y, _2y * z - _2w * x, 1.0f - _2x * x - _2y * y, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeTranslation(float tx, float ty, float tz) { GLKMatrix4 m = GLKMatrix4Identity; m.m[12] = tx; m.m[13] = ty; m.m[14] = tz; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeScale(float sx, float sy, float sz) { GLKMatrix4 m = GLKMatrix4Identity; m.m[0] = sx; m.m[5] = sy; m.m[10] = sz; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeRotation(float radians, float x, float y, float z) { GLKVector3 v = GLKVector3Normalize(GLKVector3Make(x, y, z)); float cos = cosf(radians); float cosp = 1.0f - cos; float sin = sinf(radians); GLKMatrix4 m = { cos + cosp * v.v[0] * v.v[0], cosp * v.v[0] * v.v[1] + v.v[2] * sin, cosp * v.v[0] * v.v[2] - v.v[1] * sin, 0.0f, cosp * v.v[0] * v.v[1] - v.v[2] * sin, cos + cosp * v.v[1] * v.v[1], cosp * v.v[1] * v.v[2] + v.v[0] * sin, 0.0f, cosp * v.v[0] * v.v[2] + v.v[1] * sin, cosp * v.v[1] * v.v[2] - v.v[0] * sin, cos + cosp * v.v[2] * v.v[2], 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeXRotation(float radians) { float cos = cosf(radians); float sin = sinf(radians); GLKMatrix4 m = { 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, cos, sin, 0.0f, 0.0f, -sin, cos, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeYRotation(float radians) { float cos = cosf(radians); float sin = sinf(radians); GLKMatrix4 m = { cos, 0.0f, -sin, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, sin, 0.0f, cos, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeZRotation(float radians) { float cos = cosf(radians); float sin = sinf(radians); GLKMatrix4 m = { cos, sin, 0.0f, 0.0f, -sin, cos, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f, 0.0f, 0.0f, 1.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakePerspective(float fovyRadians, float aspect, float nearZ, float farZ) { float cotan = 1.0f / tanf(fovyRadians / 2.0f); GLKMatrix4 m = { cotan / aspect, 0.0f, 0.0f, 0.0f, 0.0f, cotan, 0.0f, 0.0f, 0.0f, 0.0f, (farZ + nearZ) / (nearZ - farZ), -1.0f, 0.0f, 0.0f, (2.0f * farZ * nearZ) / (nearZ - farZ), 0.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeFrustum(float left, float right, float bottom, float top, float nearZ, float farZ) { float ral = right + left; float rsl = right - left; float tsb = top - bottom; float tab = top + bottom; float fan = farZ + nearZ; float fsn = farZ - nearZ; GLKMatrix4 m = { 2.0f * nearZ / rsl, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f * nearZ / tsb, 0.0f, 0.0f, ral / rsl, tab / tsb, -fan / fsn, -1.0f, 0.0f, 0.0f, (-2.0f * farZ * nearZ) / fsn, 0.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeOrtho(float left, float right, float bottom, float top, float nearZ, float farZ) { float ral = right + left; float rsl = right - left; float tab = top + bottom; float tsb = top - bottom; float fan = farZ + nearZ; float fsn = farZ - nearZ; GLKMatrix4 m = { 2.0f / rsl, 0.0f, 0.0f, 0.0f, 0.0f, 2.0f / tsb, 0.0f, 0.0f, 0.0f, 0.0f, -2.0f / fsn, 0.0f, -ral / rsl, -tab / tsb, -fan / fsn, 1.0f }; return m; } static __inline__ GLKMatrix4 GLKMatrix4MakeLookAt(float eyeX, float eyeY, float eyeZ, float centerX, float centerY, float centerZ, float upX, float upY, float upZ) { GLKVector3 ev = { eyeX, eyeY, eyeZ }; GLKVector3 cv = { centerX, centerY, centerZ }; GLKVector3 uv = { upX, upY, upZ }; GLKVector3 n = GLKVector3Normalize(GLKVector3Add(ev, GLKVector3Negate(cv))); GLKVector3 u = GLKVector3Normalize(GLKVector3CrossProduct(uv, n)); GLKVector3 v = GLKVector3CrossProduct(n, u); GLKMatrix4 m = { u.v[0], v.v[0], n.v[0], 0.0f, u.v[1], v.v[1], n.v[1], 0.0f, u.v[2], v.v[2], n.v[2], 0.0f, GLKVector3DotProduct(GLKVector3Negate(u), ev), GLKVector3DotProduct(GLKVector3Negate(v), ev), GLKVector3DotProduct(GLKVector3Negate(n), ev), 1.0f }; return m; } static __inline__ GLKMatrix3 GLKMatrix4GetMatrix3(GLKMatrix4 matrix) { GLKMatrix3 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[8], matrix.m[9], matrix.m[10] }; return m; } static __inline__ GLKMatrix2 GLKMatrix4GetMatrix2(GLKMatrix4 matrix) { GLKMatrix2 m = { matrix.m[0], matrix.m[1], matrix.m[4], matrix.m[5] }; return m; } static __inline__ GLKVector4 GLKMatrix4GetRow(GLKMatrix4 matrix, int row) { GLKVector4 v = { matrix.m[row], matrix.m[4 + row], matrix.m[8 + row], matrix.m[12 + row] }; return v; } static __inline__ GLKVector4 GLKMatrix4GetColumn(GLKMatrix4 matrix, int column) { #if defined(__ARM_NEON__) float32x4_t v = vld1q_f32(&(matrix.m[column * 4])); return *(GLKVector4 *)&v; #else GLKVector4 v = { matrix.m[column * 4 + 0], matrix.m[column * 4 + 1], matrix.m[column * 4 + 2], matrix.m[column * 4 + 3] }; return v; #endif } static __inline__ GLKMatrix4 GLKMatrix4SetRow(GLKMatrix4 matrix, int row, GLKVector4 vector) { matrix.m[row] = vector.v[0]; matrix.m[row + 4] = vector.v[1]; matrix.m[row + 8] = vector.v[2]; matrix.m[row + 12] = vector.v[3]; return matrix; } static __inline__ GLKMatrix4 GLKMatrix4SetColumn(GLKMatrix4 matrix, int column, GLKVector4 vector) { #if defined(__ARM_NEON__) float *dst = &(matrix.m[column * 4]); vst1q_f32(dst, vld1q_f32(vector.v)); return matrix; #else matrix.m[column * 4 + 0] = vector.v[0]; matrix.m[column * 4 + 1] = vector.v[1]; matrix.m[column * 4 + 2] = vector.v[2]; matrix.m[column * 4 + 3] = vector.v[3]; return matrix; #endif } static __inline__ GLKMatrix4 GLKMatrix4Transpose(GLKMatrix4 matrix) { #if defined(__ARM_NEON__) float32x4x4_t m = vld4q_f32(matrix.m); return *(GLKMatrix4 *)&m; #else GLKMatrix4 m = { matrix.m[0], matrix.m[4], matrix.m[8], matrix.m[12], matrix.m[1], matrix.m[5], matrix.m[9], matrix.m[13], matrix.m[2], matrix.m[6], matrix.m[10], matrix.m[14], matrix.m[3], matrix.m[7], matrix.m[11], matrix.m[15] }; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4Multiply(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) { #if defined(__ARM_NEON__) float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; float32x4x4_t m; m.val[0] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[0], 0)); m.val[1] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[1], 0)); m.val[2] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[2], 0)); m.val[3] = vmulq_n_f32(iMatrixLeft.val[0], vgetq_lane_f32(iMatrixRight.val[3], 0)); m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[0], 1)); m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[1], 1)); m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[2], 1)); m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[1], vgetq_lane_f32(iMatrixRight.val[3], 1)); m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[0], 2)); m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[1], 2)); m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[2], 2)); m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[2], vgetq_lane_f32(iMatrixRight.val[3], 2)); m.val[0] = vmlaq_n_f32(m.val[0], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[0], 3)); m.val[1] = vmlaq_n_f32(m.val[1], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[1], 3)); m.val[2] = vmlaq_n_f32(m.val[2], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[2], 3)); m.val[3] = vmlaq_n_f32(m.val[3], iMatrixLeft.val[3], vgetq_lane_f32(iMatrixRight.val[3], 3)); return *(GLKMatrix4 *)&m; #else GLKMatrix4 m; m.m[0] = matrixLeft.m[0] * matrixRight.m[0] + matrixLeft.m[4] * matrixRight.m[1] + matrixLeft.m[8] * matrixRight.m[2] + matrixLeft.m[12] * matrixRight.m[3]; m.m[4] = matrixLeft.m[0] * matrixRight.m[4] + matrixLeft.m[4] * matrixRight.m[5] + matrixLeft.m[8] * matrixRight.m[6] + matrixLeft.m[12] * matrixRight.m[7]; m.m[8] = matrixLeft.m[0] * matrixRight.m[8] + matrixLeft.m[4] * matrixRight.m[9] + matrixLeft.m[8] * matrixRight.m[10] + matrixLeft.m[12] * matrixRight.m[11]; m.m[12] = matrixLeft.m[0] * matrixRight.m[12] + matrixLeft.m[4] * matrixRight.m[13] + matrixLeft.m[8] * matrixRight.m[14] + matrixLeft.m[12] * matrixRight.m[15]; m.m[1] = matrixLeft.m[1] * matrixRight.m[0] + matrixLeft.m[5] * matrixRight.m[1] + matrixLeft.m[9] * matrixRight.m[2] + matrixLeft.m[13] * matrixRight.m[3]; m.m[5] = matrixLeft.m[1] * matrixRight.m[4] + matrixLeft.m[5] * matrixRight.m[5] + matrixLeft.m[9] * matrixRight.m[6] + matrixLeft.m[13] * matrixRight.m[7]; m.m[9] = matrixLeft.m[1] * matrixRight.m[8] + matrixLeft.m[5] * matrixRight.m[9] + matrixLeft.m[9] * matrixRight.m[10] + matrixLeft.m[13] * matrixRight.m[11]; m.m[13] = matrixLeft.m[1] * matrixRight.m[12] + matrixLeft.m[5] * matrixRight.m[13] + matrixLeft.m[9] * matrixRight.m[14] + matrixLeft.m[13] * matrixRight.m[15]; m.m[2] = matrixLeft.m[2] * matrixRight.m[0] + matrixLeft.m[6] * matrixRight.m[1] + matrixLeft.m[10] * matrixRight.m[2] + matrixLeft.m[14] * matrixRight.m[3]; m.m[6] = matrixLeft.m[2] * matrixRight.m[4] + matrixLeft.m[6] * matrixRight.m[5] + matrixLeft.m[10] * matrixRight.m[6] + matrixLeft.m[14] * matrixRight.m[7]; m.m[10] = matrixLeft.m[2] * matrixRight.m[8] + matrixLeft.m[6] * matrixRight.m[9] + matrixLeft.m[10] * matrixRight.m[10] + matrixLeft.m[14] * matrixRight.m[11]; m.m[14] = matrixLeft.m[2] * matrixRight.m[12] + matrixLeft.m[6] * matrixRight.m[13] + matrixLeft.m[10] * matrixRight.m[14] + matrixLeft.m[14] * matrixRight.m[15]; m.m[3] = matrixLeft.m[3] * matrixRight.m[0] + matrixLeft.m[7] * matrixRight.m[1] + matrixLeft.m[11] * matrixRight.m[2] + matrixLeft.m[15] * matrixRight.m[3]; m.m[7] = matrixLeft.m[3] * matrixRight.m[4] + matrixLeft.m[7] * matrixRight.m[5] + matrixLeft.m[11] * matrixRight.m[6] + matrixLeft.m[15] * matrixRight.m[7]; m.m[11] = matrixLeft.m[3] * matrixRight.m[8] + matrixLeft.m[7] * matrixRight.m[9] + matrixLeft.m[11] * matrixRight.m[10] + matrixLeft.m[15] * matrixRight.m[11]; m.m[15] = matrixLeft.m[3] * matrixRight.m[12] + matrixLeft.m[7] * matrixRight.m[13] + matrixLeft.m[11] * matrixRight.m[14] + matrixLeft.m[15] * matrixRight.m[15]; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4Add(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) { #if defined(__ARM_NEON__) float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; float32x4x4_t m; m.val[0] = vaddq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]); m.val[1] = vaddq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]); m.val[2] = vaddq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]); m.val[3] = vaddq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]); return *(GLKMatrix4 *)&m; #else GLKMatrix4 m; m.m[0] = matrixLeft.m[0] + matrixRight.m[0]; m.m[1] = matrixLeft.m[1] + matrixRight.m[1]; m.m[2] = matrixLeft.m[2] + matrixRight.m[2]; m.m[3] = matrixLeft.m[3] + matrixRight.m[3]; m.m[4] = matrixLeft.m[4] + matrixRight.m[4]; m.m[5] = matrixLeft.m[5] + matrixRight.m[5]; m.m[6] = matrixLeft.m[6] + matrixRight.m[6]; m.m[7] = matrixLeft.m[7] + matrixRight.m[7]; m.m[8] = matrixLeft.m[8] + matrixRight.m[8]; m.m[9] = matrixLeft.m[9] + matrixRight.m[9]; m.m[10] = matrixLeft.m[10] + matrixRight.m[10]; m.m[11] = matrixLeft.m[11] + matrixRight.m[11]; m.m[12] = matrixLeft.m[12] + matrixRight.m[12]; m.m[13] = matrixLeft.m[13] + matrixRight.m[13]; m.m[14] = matrixLeft.m[14] + matrixRight.m[14]; m.m[15] = matrixLeft.m[15] + matrixRight.m[15]; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4Subtract(GLKMatrix4 matrixLeft, GLKMatrix4 matrixRight) { #if defined(__ARM_NEON__) float32x4x4_t iMatrixLeft = *(float32x4x4_t *)&matrixLeft; float32x4x4_t iMatrixRight = *(float32x4x4_t *)&matrixRight; float32x4x4_t m; m.val[0] = vsubq_f32(iMatrixLeft.val[0], iMatrixRight.val[0]); m.val[1] = vsubq_f32(iMatrixLeft.val[1], iMatrixRight.val[1]); m.val[2] = vsubq_f32(iMatrixLeft.val[2], iMatrixRight.val[2]); m.val[3] = vsubq_f32(iMatrixLeft.val[3], iMatrixRight.val[3]); return *(GLKMatrix4 *)&m; #else GLKMatrix4 m; m.m[0] = matrixLeft.m[0] - matrixRight.m[0]; m.m[1] = matrixLeft.m[1] - matrixRight.m[1]; m.m[2] = matrixLeft.m[2] - matrixRight.m[2]; m.m[3] = matrixLeft.m[3] - matrixRight.m[3]; m.m[4] = matrixLeft.m[4] - matrixRight.m[4]; m.m[5] = matrixLeft.m[5] - matrixRight.m[5]; m.m[6] = matrixLeft.m[6] - matrixRight.m[6]; m.m[7] = matrixLeft.m[7] - matrixRight.m[7]; m.m[8] = matrixLeft.m[8] - matrixRight.m[8]; m.m[9] = matrixLeft.m[9] - matrixRight.m[9]; m.m[10] = matrixLeft.m[10] - matrixRight.m[10]; m.m[11] = matrixLeft.m[11] - matrixRight.m[11]; m.m[12] = matrixLeft.m[12] - matrixRight.m[12]; m.m[13] = matrixLeft.m[13] - matrixRight.m[13]; m.m[14] = matrixLeft.m[14] - matrixRight.m[14]; m.m[15] = matrixLeft.m[15] - matrixRight.m[15]; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4Translate(GLKMatrix4 matrix, float tx, float ty, float tz) { GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7], matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11], matrix.m[0] * tx + matrix.m[4] * ty + matrix.m[8] * tz + matrix.m[12], matrix.m[1] * tx + matrix.m[5] * ty + matrix.m[9] * tz + matrix.m[13], matrix.m[2] * tx + matrix.m[6] * ty + matrix.m[10] * tz + matrix.m[14], matrix.m[15] }; return m; } static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector3(GLKMatrix4 matrix, GLKVector3 translationVector) { GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7], matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11], matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12], matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13], matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14], matrix.m[15] }; return m; } static __inline__ GLKMatrix4 GLKMatrix4TranslateWithVector4(GLKMatrix4 matrix, GLKVector4 translationVector) { GLKMatrix4 m = { matrix.m[0], matrix.m[1], matrix.m[2], matrix.m[3], matrix.m[4], matrix.m[5], matrix.m[6], matrix.m[7], matrix.m[8], matrix.m[9], matrix.m[10], matrix.m[11], matrix.m[0] * translationVector.v[0] + matrix.m[4] * translationVector.v[1] + matrix.m[8] * translationVector.v[2] + matrix.m[12], matrix.m[1] * translationVector.v[0] + matrix.m[5] * translationVector.v[1] + matrix.m[9] * translationVector.v[2] + matrix.m[13], matrix.m[2] * translationVector.v[0] + matrix.m[6] * translationVector.v[1] + matrix.m[10] * translationVector.v[2] + matrix.m[14], matrix.m[15] }; return m; } static __inline__ GLKMatrix4 GLKMatrix4Scale(GLKMatrix4 matrix, float sx, float sy, float sz) { #if defined(__ARM_NEON__) float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix; float32x4x4_t m; m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)sx); m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)sy); m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)sz); m.val[3] = iMatrix.val[3]; return *(GLKMatrix4 *)&m; #else GLKMatrix4 m = { matrix.m[0] * sx, matrix.m[1] * sx, matrix.m[2] * sx, matrix.m[3] * sx, matrix.m[4] * sy, matrix.m[5] * sy, matrix.m[6] * sy, matrix.m[7] * sy, matrix.m[8] * sz, matrix.m[9] * sz, matrix.m[10] * sz, matrix.m[11] * sz, matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] }; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector3(GLKMatrix4 matrix, GLKVector3 scaleVector) { #if defined(__ARM_NEON__) float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix; float32x4x4_t m; m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]); m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]); m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]); m.val[3] = iMatrix.val[3]; return *(GLKMatrix4 *)&m; #else GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0], matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1], matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2], matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] }; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4ScaleWithVector4(GLKMatrix4 matrix, GLKVector4 scaleVector) { #if defined(__ARM_NEON__) float32x4x4_t iMatrix = *(float32x4x4_t *)&matrix; float32x4x4_t m; m.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)scaleVector.v[0]); m.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)scaleVector.v[1]); m.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)scaleVector.v[2]); m.val[3] = iMatrix.val[3]; return *(GLKMatrix4 *)&m; #else GLKMatrix4 m = { matrix.m[0] * scaleVector.v[0], matrix.m[1] * scaleVector.v[0], matrix.m[2] * scaleVector.v[0], matrix.m[3] * scaleVector.v[0], matrix.m[4] * scaleVector.v[1], matrix.m[5] * scaleVector.v[1], matrix.m[6] * scaleVector.v[1], matrix.m[7] * scaleVector.v[1], matrix.m[8] * scaleVector.v[2], matrix.m[9] * scaleVector.v[2], matrix.m[10] * scaleVector.v[2], matrix.m[11] * scaleVector.v[2], matrix.m[12], matrix.m[13], matrix.m[14], matrix.m[15] }; return m; #endif } static __inline__ GLKMatrix4 GLKMatrix4Rotate(GLKMatrix4 matrix, float radians, float x, float y, float z) { GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, x, y, z); return GLKMatrix4Multiply(matrix, rm); } static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector3(GLKMatrix4 matrix, float radians, GLKVector3 axisVector) { GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]); return GLKMatrix4Multiply(matrix, rm); } static __inline__ GLKMatrix4 GLKMatrix4RotateWithVector4(GLKMatrix4 matrix, float radians, GLKVector4 axisVector) { GLKMatrix4 rm = GLKMatrix4MakeRotation(radians, axisVector.v[0], axisVector.v[1], axisVector.v[2]); return GLKMatrix4Multiply(matrix, rm); } static __inline__ GLKMatrix4 GLKMatrix4RotateX(GLKMatrix4 matrix, float radians) { GLKMatrix4 rm = GLKMatrix4MakeXRotation(radians); return GLKMatrix4Multiply(matrix, rm); } static __inline__ GLKMatrix4 GLKMatrix4RotateY(GLKMatrix4 matrix, float radians) { GLKMatrix4 rm = GLKMatrix4MakeYRotation(radians); return GLKMatrix4Multiply(matrix, rm); } static __inline__ GLKMatrix4 GLKMatrix4RotateZ(GLKMatrix4 matrix, float radians) { GLKMatrix4 rm = GLKMatrix4MakeZRotation(radians); return GLKMatrix4Multiply(matrix, rm); } static __inline__ GLKVector3 GLKMatrix4MultiplyVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight) { GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 0.0f)); return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]); } static __inline__ GLKVector3 GLKMatrix4MultiplyVector3WithTranslation(GLKMatrix4 matrixLeft, GLKVector3 vectorRight) { GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f)); return GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]); } static __inline__ GLKVector3 GLKMatrix4MultiplyAndProjectVector3(GLKMatrix4 matrixLeft, GLKVector3 vectorRight) { GLKVector4 v4 = GLKMatrix4MultiplyVector4(matrixLeft, GLKVector4Make(vectorRight.v[0], vectorRight.v[1], vectorRight.v[2], 1.0f)); return GLKVector3MultiplyScalar(GLKVector3Make(v4.v[0], v4.v[1], v4.v[2]), 1.0f / v4.v[3]); } static __inline__ void GLKMatrix4MultiplyVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount) { size_t i; for (i=0; i < vectorCount; i++) vectors[i] = GLKMatrix4MultiplyVector3(matrix, vectors[i]); } static __inline__ void GLKMatrix4MultiplyVector3ArrayWithTranslation(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount) { size_t i; for (i=0; i < vectorCount; i++) vectors[i] = GLKMatrix4MultiplyVector3WithTranslation(matrix, vectors[i]); } static __inline__ void GLKMatrix4MultiplyAndProjectVector3Array(GLKMatrix4 matrix, GLKVector3 *vectors, size_t vectorCount) { size_t i; for (i=0; i < vectorCount; i++) vectors[i] = GLKMatrix4MultiplyAndProjectVector3(matrix, vectors[i]); } static __inline__ GLKVector4 GLKMatrix4MultiplyVector4(GLKMatrix4 matrixLeft, GLKVector4 vectorRight) { #if defined(__ARM_NEON__) float32x4x4_t iMatrix = *(float32x4x4_t *)&matrixLeft; float32x4_t v; iMatrix.val[0] = vmulq_n_f32(iMatrix.val[0], (float32_t)vectorRight.v[0]); iMatrix.val[1] = vmulq_n_f32(iMatrix.val[1], (float32_t)vectorRight.v[1]); iMatrix.val[2] = vmulq_n_f32(iMatrix.val[2], (float32_t)vectorRight.v[2]); iMatrix.val[3] = vmulq_n_f32(iMatrix.val[3], (float32_t)vectorRight.v[3]); iMatrix.val[0] = vaddq_f32(iMatrix.val[0], iMatrix.val[1]); iMatrix.val[2] = vaddq_f32(iMatrix.val[2], iMatrix.val[3]); v = vaddq_f32(iMatrix.val[0], iMatrix.val[2]); return *(GLKVector4 *)&v; #else GLKVector4 v = { matrixLeft.m[0] * vectorRight.v[0] + matrixLeft.m[4] * vectorRight.v[1] + matrixLeft.m[8] * vectorRight.v[2] + matrixLeft.m[12] * vectorRight.v[3], matrixLeft.m[1] * vectorRight.v[0] + matrixLeft.m[5] * vectorRight.v[1] + matrixLeft.m[9] * vectorRight.v[2] + matrixLeft.m[13] * vectorRight.v[3], matrixLeft.m[2] * vectorRight.v[0] + matrixLeft.m[6] * vectorRight.v[1] + matrixLeft.m[10] * vectorRight.v[2] + matrixLeft.m[14] * vectorRight.v[3], matrixLeft.m[3] * vectorRight.v[0] + matrixLeft.m[7] * vectorRight.v[1] + matrixLeft.m[11] * vectorRight.v[2] + matrixLeft.m[15] * vectorRight.v[3] }; return v; #endif } static __inline__ void GLKMatrix4MultiplyVector4Array(GLKMatrix4 matrix, GLKVector4 *vectors, size_t vectorCount) { size_t i; for (i=0; i < vectorCount; i++) vectors[i] = GLKMatrix4MultiplyVector4(matrix, vectors[i]); } #ifdef __cplusplus } #endif #endif /* __GLK_MATRIX_4_H */ ================================================ FILE: samples/C/NWMan.h ================================================ #ifndef _NME_WMAN_H #define _NME_WMAN_H // Internal window manager API #include "NCompat.h" START_HEAD #include "NPos.h" #include "NUtil.h" #include "NTypes.h" NTS(NWMan_event); NSTRUCT(NWMan, { // Init stuff bool (*init)(); bool (*destroy)(); // Window stuff bool (*create_window)(); bool (*destroy_window)(); void (*swap_buffers)(); // Event stuff bool (*next_event)(NWMan_event* event); // Time stuff uint (*get_millis)(); void (*sleep)(uint millis); // Info int rshift_key; int lshift_key; int left_key; int right_key; }); NENUM(NWMan_event_type, { N_WMAN_MOUSE_MOVE = 0, N_WMAN_MOUSE_BUTTON = 1, N_WMAN_MOUSE_WHEEL = 2, N_WMAN_KEYBOARD = 10, N_WMAN_QUIT = 20, N_WMAN_RESIZE = 21, N_WMAN_FOCUS = 22 }); #define N_WMAN_MOUSE_LEFT 0 #define N_WMAN_MOUSE_RIGHT 1 #define N_WMAN_MOUSE_MIDDLE 2 NSTRUCT(NWMan_event, { NWMan_event_type type; union { // Mouse NPos2i mouse_pos; struct { short id; bool state; } mouse_button; signed char mouse_wheel; // 1 if up, -1 if down // Keyboard struct { int key; bool state; } keyboard; // Window bool window_quit; // Will always be true if WM_QUIT NPos2i window_size; bool window_focus; }; }); NWMan_event NWMan_event_new(NWMan_event_type type); bool NWMan_init(); bool NWMan_destroy(); extern NWMan N_WMan; END_HEAD #endif ================================================ FILE: samples/C/Nightmare.h ================================================ #ifndef _NMEX_NIGHTMARE_H #define _NMEX_NIGHTMARE_H //#define NMEX #include "../src/NCompat.h" START_HEAD #include "../src/NTypes.h" #include "../src/NUtil.h" #include "../src/NPorting.h" #include "../src/NGlobals.h" #include "../src/NLog.h" #include "../src/NWMan.h" #include "../src/NRsc.h" #include "../src/NShader.h" #include "../src/NSquare.h" #include "../src/NImage.h" #include "../src/NSprite.h" #include "../src/NSpritesheet.h" #include "../src/NEntity.h" #include "../src/Game.h" END_HEAD #endif ================================================ FILE: samples/C/array.c ================================================ #include unsigned __bump_up(unsigned n) { unsigned base = 1; --n; while (base < sizeof n * 8) { n |= n >> base; base *= 2; } ++n; n += (n == 0); return n; } void *__array_alloc(size_t size, unsigned length) { unsigned allocated = __bump_up(length); struct __array_header *head = malloc(sizeof *head + allocated * size); assert(head); head->length = length; head->allocated = allocated; return (void *) (head + 1); } void __array_resize(void **array, size_t size, int difference) { if (difference == 0) { return; } struct __array_header *head = __header(*array); head->length += difference; if (head->length >= head->allocated) { head->allocated = __bump_up(head->length); head = realloc(head, sizeof *head + head->allocated * size); assert(head); *array = head + 1; } } int __array_search(void *array, void *elem, size_t size) { for (unsigned i = 0; i < alength(array) * size; i += size) { if (memcmp((char *)array + i, elem, size) == 0) { return 1; } } return 0; } ================================================ FILE: samples/C/array.h ================================================ #ifndef ARRAY_H #define ARRAY_H value #include #include #include #define array(type, name, initial_length) \ type *name = __array_alloc(sizeof(type), initial_length) #define aforeach(it, array) \ for (unsigned it = 0; \ it < alength(array); \ ++it) #define __header(array) \ ((struct __array_header *) array - 1) #define alength(array) \ (__header(array)->length) #define afree(array) \ free(__header(array)) #define apush(array, elem) \ __array_resize((void **) &array, sizeof *array, 1); \ array[alength(array)-1] = elem #define apop(array) \ aremove(array, (alength(array) - 1)) #define aremove(array, index) \ assert(alength(array) > index); \ memmove(array + index, array + index + 1, sizeof *array * (alength(array) - index - 1)); \ __array_resize((void **) &array, sizeof *array, -1) #define ainsert(array, index, elem) \ __array_resize((void **) &array, sizeof *array, index >= alength(array) ? index - alength(array) + 1 : 1); \ memmove(array + index + 1, array + index, sizeof *array * (alength(array) - index - 1)); \ array[index] = elem #define acontains(array, elem) \ __array_search(array, &elem, sizeof elem) #define __arrayallocated(array) \ (__header(array)->allocated) struct __array_header { unsigned length; unsigned allocated; }; unsigned __bump_up(unsigned n); void *__array_alloc(size_t size, unsigned length); void __array_resize(void **array, size_t size, int difference); int __array_search(void *array, void *elem, size_t size); #endif /* ifndef ARRAY_H */ ================================================ FILE: samples/C/asm.h ================================================ /* CarbonOS System/Kernel * Copyright 2015-2017 David Aylaian * Licensed under Apache 2.0: https://github.com/DavidAylaian/CarbonOS/blob/master/LICENSE.md */ #ifndef ASM_H #define ASM_H #include // macros for enabling and disabling interrupts #define enable() asm("sti"); #define disable() asm("cli"); // inb instruction uint8_t inb (uint16_t port) { uint8_t val; asm volatile ("inb %0, %1" : "=a"(val): "Nd"(port)); return val; } // outb instruction void outb (uint16_t port, uint8_t val) { asm volatile ("outb %1, %0" : : "a"(val), "Nd"(port)); } #endif ================================================ FILE: samples/C/bitmap.h ================================================ #pragma once /* Copyright © 2010 Christoph Sünderhauf * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include "generic.h" typedef struct { uint32_t numbits; /* an array large enough for numbits to fit in. Might * (if numbits%8!=0) have some spare bits at the end */ uint32_t* bits; } bitmap_t; // creates a new bitmap. // CONTENT IS RANDOM! - use bitmap_clearall() to clear the bitmap. bitmap_t bitmap_init(uint32_t numbits); // returns 1 or 0 uint8_t bitmap_get(bitmap_t bitmap, uint32_t bitnum); // sets a bit (to 1) void bitmap_set(bitmap_t bitmap, uint32_t bitnum); // clears a bit (to 0) void bitmap_clear(bitmap_t bitmap, uint32_t bitnum); // clears every bit to 0 void bitmap_clearAll(bitmap_t bitmap); // finds the first bit set to 0 returns 0 if no cleared bit found (0 is also returned if the first bit is cleared) uint32_t bitmap_findFirstClear(bitmap_t bitmap); ================================================ FILE: samples/C/blob.c ================================================ #include "cache.h" #include "blob.h" const char *blob_type = "blob"; struct blob *lookup_blob(const unsigned char *sha1) { struct object *obj = lookup_object(sha1); if (!obj) return create_object(sha1, OBJ_BLOB, alloc_blob_node()); if (!obj->type) obj->type = OBJ_BLOB; if (obj->type != OBJ_BLOB) { error("Object %s is a %s, not a blob", sha1_to_hex(sha1), typename(obj->type)); return NULL; } return (struct blob *) obj; } int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size) { item->object.parsed = 1; return 0; } ================================================ FILE: samples/C/blob.h ================================================ #ifndef BLOB_H #define BLOB_H #include "object.h" extern const char *blob_type; struct blob { struct object object; }; struct blob *lookup_blob(const unsigned char *sha1); int parse_blob_buffer(struct blob *item, void *buffer, unsigned long size); /** * Blobs do not contain references to other objects and do not have * structured data that needs parsing. However, code may use the * "parsed" bit in the struct object for a blob to determine whether * its content has been found to actually be available, so * parse_blob_buffer() is used (by object.c) to flag that the object * has been read successfully from the database. **/ #endif /* BLOB_H */ ================================================ FILE: samples/C/bootstrap.h ================================================ #ifndef BOOTSTRAP_H #define BOOTSTRAP_H #include #include "cxrs.h" /* If we're not using GNU C, elide __attribute__ */ #ifndef __GNUC__ # define __attribute__(x) /*NOTHING*/ #endif typedef struct object object; object *true; object *false; object *eof; object *empty_list; object *global_enviroment; enum obj_type { scm_bool, scm_empty_list, scm_eof, scm_char, scm_int, scm_pair, scm_symbol, scm_prim_fun, scm_lambda, scm_str, scm_file }; typedef object *(*prim_proc)(object *args); object *read(FILE *in); object *eval(object *code, object *env); void print(FILE *out, object *obj, int display); int check_type(enum obj_type type, object *obj, int err_on_false); static inline int is_true(object *obj) { return obj != false; } object *make_int(int value); int obj2int(object *i); object *make_bool(int value); int obj2bool(object *b); object *make_char(char c); char obj2char(object *ch); object *make_str(char *str); char *obj2str(object *str); object *cons(object *car, object *cdr); object *car(object *pair); object *cdr(object *pair); void set_car(object *pair, object *new); void set_cdr(object *pair, object *new); object *make_symbol(char *name); char *sym2str(object *sym); object *get_symbol(char *name) __attribute__((pure)); object *make_prim_fun(prim_proc fun); prim_proc obj2prim_proc(object *proc); object *make_lambda(object *args, object *code, object *env); object *lambda_code(object *lambda); object *lambda_args(object *lambda); object *make_port(FILE *handle, int direction); int port_direction(object *port); FILE *port_handle(object *port); void set_port_handle_to_null(object *port); /*both of these should never be called*/ object *apply_proc(object *); object *eval_proc(object *); object *maybe_add_begin(object *code); void init_enviroment(object *env); void eval_err(char *msg, object *code) __attribute__((noreturn)); void define_var(object *var, object *val, object *env); void set_var(object *var, object *val, object *env); object *get_var(object *var, object *env); object *cond2nested_if(object *cond); object *let2lambda(object *let); object *and2nested_if(object *and); object *or2nested_if(object *or); #endif /*include guard*/ ================================================ FILE: samples/C/color.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include typedef struct { uint32_t background; uint32_t foreground; } console_color_t; #define CONSOLE_COLOR_BLACK 0x0 #define CONSOLE_COLOR_BLUE 0x1 #define CONSOLE_COLOR_GREEN 0x2 #define CONSOLE_COLOR_CYAN 0x3 #define CONSOLE_COLOR_RED 0x4 #define CONSOLE_COLOR_MAGENTA 0x5 #define CONSOLE_COLOR_BROWN 0x6 #define CONSOLE_COLOR_LGREY 0x7 #define CONSOLE_COLOR_DGREY 0x8 #define CONSOLE_COLOR_LBLUE 0x9 #define CONSOLE_COLOR_LGREEN 0xa #define CONSOLE_COLOR_LCYAN 0xb #define CONSOLE_COLOR_LRED 0xc #define CONSOLE_COLOR_LMAGENTA 0xd #define CONSOLE_COLOR_YELLOW 0xe #define CONSOLE_COLOR_WHITE 0xf ================================================ FILE: samples/C/commit.c ================================================ #include "cache.h" #include "tag.h" #include "commit.h" #include "pkt-line.h" #include "utf8.h" #include "diff.h" #include "revision.h" #include "notes.h" #include "gpg-interface.h" #include "mergesort.h" int save_commit_buffer = 1; const char *commit_type = "commit"; static struct commit *check_commit(struct object *obj, const unsigned char *sha1, int quiet) { if (obj->type != OBJ_COMMIT) { if (!quiet) error("Object %s is a %s, not a commit", sha1_to_hex(sha1), typename(obj->type)); return NULL; } return (struct commit *) obj; } struct commit *lookup_commit_reference_gently(const unsigned char *sha1, int quiet) { struct object *obj = deref_tag(parse_object(sha1), NULL, 0); if (!obj) return NULL; return check_commit(obj, sha1, quiet); } struct commit *lookup_commit_reference(const unsigned char *sha1) { return lookup_commit_reference_gently(sha1, 0); } struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name) { struct commit *c = lookup_commit_reference(sha1); if (!c) die(_("could not parse %s"), ref_name); if (hashcmp(sha1, c->object.sha1)) { warning(_("%s %s is not a commit!"), ref_name, sha1_to_hex(sha1)); } return c; } struct commit *lookup_commit(const unsigned char *sha1) { struct object *obj = lookup_object(sha1); if (!obj) return create_object(sha1, OBJ_COMMIT, alloc_commit_node()); if (!obj->type) obj->type = OBJ_COMMIT; return check_commit(obj, sha1, 0); } struct commit *lookup_commit_reference_by_name(const char *name) { unsigned char sha1[20]; struct commit *commit; if (get_sha1(name, sha1)) return NULL; commit = lookup_commit_reference(sha1); if (!commit || parse_commit(commit)) return NULL; return commit; } static unsigned long parse_commit_date(const char *buf, const char *tail) { const char *dateptr; if (buf + 6 >= tail) return 0; if (memcmp(buf, "author", 6)) return 0; while (buf < tail && *buf++ != '\n') /* nada */; if (buf + 9 >= tail) return 0; if (memcmp(buf, "committer", 9)) return 0; while (buf < tail && *buf++ != '>') /* nada */; if (buf >= tail) return 0; dateptr = buf; while (buf < tail && *buf++ != '\n') /* nada */; if (buf >= tail) return 0; /* dateptr < buf && buf[-1] == '\n', so strtoul will stop at buf-1 */ return strtoul(dateptr, NULL, 10); } static struct commit_graft **commit_graft; static int commit_graft_alloc, commit_graft_nr; static int commit_graft_pos(const unsigned char *sha1) { int lo, hi; lo = 0; hi = commit_graft_nr; while (lo < hi) { int mi = (lo + hi) / 2; struct commit_graft *graft = commit_graft[mi]; int cmp = hashcmp(sha1, graft->sha1); if (!cmp) return mi; if (cmp < 0) hi = mi; else lo = mi + 1; } return -lo - 1; } int register_commit_graft(struct commit_graft *graft, int ignore_dups) { int pos = commit_graft_pos(graft->sha1); if (0 <= pos) { if (ignore_dups) free(graft); else { free(commit_graft[pos]); commit_graft[pos] = graft; } return 1; } pos = -pos - 1; if (commit_graft_alloc <= ++commit_graft_nr) { commit_graft_alloc = alloc_nr(commit_graft_alloc); commit_graft = xrealloc(commit_graft, sizeof(*commit_graft) * commit_graft_alloc); } if (pos < commit_graft_nr) memmove(commit_graft + pos + 1, commit_graft + pos, (commit_graft_nr - pos - 1) * sizeof(*commit_graft)); commit_graft[pos] = graft; return 0; } struct commit_graft *read_graft_line(char *buf, int len) { /* The format is just "Commit Parent1 Parent2 ...\n" */ int i; struct commit_graft *graft = NULL; while (len && isspace(buf[len-1])) buf[--len] = '\0'; if (buf[0] == '#' || buf[0] == '\0') return NULL; if ((len + 1) % 41) goto bad_graft_data; i = (len + 1) / 41 - 1; graft = xmalloc(sizeof(*graft) + 20 * i); graft->nr_parent = i; if (get_sha1_hex(buf, graft->sha1)) goto bad_graft_data; for (i = 40; i < len; i += 41) { if (buf[i] != ' ') goto bad_graft_data; if (get_sha1_hex(buf + i + 1, graft->parent[i/41])) goto bad_graft_data; } return graft; bad_graft_data: error("bad graft data: %s", buf); free(graft); return NULL; } static int read_graft_file(const char *graft_file) { FILE *fp = fopen(graft_file, "r"); char buf[1024]; if (!fp) return -1; while (fgets(buf, sizeof(buf), fp)) { /* The format is just "Commit Parent1 Parent2 ...\n" */ int len = strlen(buf); struct commit_graft *graft = read_graft_line(buf, len); if (!graft) continue; if (register_commit_graft(graft, 1)) error("duplicate graft data: %s", buf); } fclose(fp); return 0; } static void prepare_commit_graft(void) { static int commit_graft_prepared; char *graft_file; if (commit_graft_prepared) return; graft_file = get_graft_file(); read_graft_file(graft_file); /* make sure shallows are read */ is_repository_shallow(); commit_graft_prepared = 1; } struct commit_graft *lookup_commit_graft(const unsigned char *sha1) { int pos; prepare_commit_graft(); pos = commit_graft_pos(sha1); if (pos < 0) return NULL; return commit_graft[pos]; } int for_each_commit_graft(each_commit_graft_fn fn, void *cb_data) { int i, ret; for (i = ret = 0; i < commit_graft_nr && !ret; i++) ret = fn(commit_graft[i], cb_data); return ret; } int unregister_shallow(const unsigned char *sha1) { int pos = commit_graft_pos(sha1); if (pos < 0) return -1; if (pos + 1 < commit_graft_nr) memmove(commit_graft + pos, commit_graft + pos + 1, sizeof(struct commit_graft *) * (commit_graft_nr - pos - 1)); commit_graft_nr--; return 0; } int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size) { const char *tail = buffer; const char *bufptr = buffer; unsigned char parent[20]; struct commit_list **pptr; struct commit_graft *graft; if (item->object.parsed) return 0; item->object.parsed = 1; tail += size; if (tail <= bufptr + 46 || memcmp(bufptr, "tree ", 5) || bufptr[45] != '\n') return error("bogus commit object %s", sha1_to_hex(item->object.sha1)); if (get_sha1_hex(bufptr + 5, parent) < 0) return error("bad tree pointer in commit %s", sha1_to_hex(item->object.sha1)); item->tree = lookup_tree(parent); bufptr += 46; /* "tree " + "hex sha1" + "\n" */ pptr = &item->parents; graft = lookup_commit_graft(item->object.sha1); while (bufptr + 48 < tail && !memcmp(bufptr, "parent ", 7)) { struct commit *new_parent; if (tail <= bufptr + 48 || get_sha1_hex(bufptr + 7, parent) || bufptr[47] != '\n') return error("bad parents in commit %s", sha1_to_hex(item->object.sha1)); bufptr += 48; /* * The clone is shallow if nr_parent < 0, and we must * not traverse its real parents even when we unhide them. */ if (graft && (graft->nr_parent < 0 || grafts_replace_parents)) continue; new_parent = lookup_commit(parent); if (new_parent) pptr = &commit_list_insert(new_parent, pptr)->next; } if (graft) { int i; struct commit *new_parent; for (i = 0; i < graft->nr_parent; i++) { new_parent = lookup_commit(graft->parent[i]); if (!new_parent) continue; pptr = &commit_list_insert(new_parent, pptr)->next; } } item->date = parse_commit_date(bufptr, tail); return 0; } int parse_commit(struct commit *item) { enum object_type type; void *buffer; unsigned long size; int ret; if (!item) return -1; if (item->object.parsed) return 0; buffer = read_sha1_file(item->object.sha1, &type, &size); if (!buffer) return error("Could not read %s", sha1_to_hex(item->object.sha1)); if (type != OBJ_COMMIT) { free(buffer); return error("Object %s not a commit", sha1_to_hex(item->object.sha1)); } ret = parse_commit_buffer(item, buffer, size); if (save_commit_buffer && !ret) { item->buffer = buffer; return 0; } free(buffer); return ret; } int find_commit_subject(const char *commit_buffer, const char **subject) { const char *eol; const char *p = commit_buffer; while (*p && (*p != '\n' || p[1] != '\n')) p++; if (*p) { p += 2; for (eol = p; *eol && *eol != '\n'; eol++) ; /* do nothing */ } else eol = p; *subject = p; return eol - p; } struct commit_list *commit_list_insert(struct commit *item, struct commit_list **list_p) { struct commit_list *new_list = xmalloc(sizeof(struct commit_list)); new_list->item = item; new_list->next = *list_p; *list_p = new_list; return new_list; } unsigned commit_list_count(const struct commit_list *l) { unsigned c = 0; for (; l; l = l->next ) c++; return c; } void free_commit_list(struct commit_list *list) { while (list) { struct commit_list *temp = list; list = temp->next; free(temp); } } struct commit_list * commit_list_insert_by_date(struct commit *item, struct commit_list **list) { struct commit_list **pp = list; struct commit_list *p; while ((p = *pp) != NULL) { if (p->item->date < item->date) { break; } pp = &p->next; } return commit_list_insert(item, pp); } static int commit_list_compare_by_date(const void *a, const void *b) { unsigned long a_date = ((const struct commit_list *)a)->item->date; unsigned long b_date = ((const struct commit_list *)b)->item->date; if (a_date < b_date) return 1; if (a_date > b_date) return -1; return 0; } static void *commit_list_get_next(const void *a) { return ((const struct commit_list *)a)->next; } static void commit_list_set_next(void *a, void *next) { ((struct commit_list *)a)->next = next; } void commit_list_sort_by_date(struct commit_list **list) { *list = llist_mergesort(*list, commit_list_get_next, commit_list_set_next, commit_list_compare_by_date); } struct commit *pop_most_recent_commit(struct commit_list **list, unsigned int mark) { struct commit *ret = (*list)->item; struct commit_list *parents = ret->parents; struct commit_list *old = *list; *list = (*list)->next; free(old); while (parents) { struct commit *commit = parents->item; if (!parse_commit(commit) && !(commit->object.flags & mark)) { commit->object.flags |= mark; commit_list_insert_by_date(commit, list); } parents = parents->next; } return ret; } static void clear_commit_marks_1(struct commit_list **plist, struct commit *commit, unsigned int mark) { while (commit) { struct commit_list *parents; if (!(mark & commit->object.flags)) return; commit->object.flags &= ~mark; parents = commit->parents; if (!parents) return; while ((parents = parents->next)) commit_list_insert(parents->item, plist); commit = commit->parents->item; } } void clear_commit_marks(struct commit *commit, unsigned int mark) { struct commit_list *list = NULL; commit_list_insert(commit, &list); while (list) clear_commit_marks_1(&list, pop_commit(&list), mark); } void clear_commit_marks_for_object_array(struct object_array *a, unsigned mark) { struct object *object; struct commit *commit; unsigned int i; for (i = 0; i < a->nr; i++) { object = a->objects[i].item; commit = lookup_commit_reference_gently(object->sha1, 1); if (commit) clear_commit_marks(commit, mark); } } struct commit *pop_commit(struct commit_list **stack) { struct commit_list *top = *stack; struct commit *item = top ? top->item : NULL; if (top) { *stack = top->next; free(top); } return item; } /* * Performs an in-place topological sort on the list supplied. */ void sort_in_topological_order(struct commit_list ** list, int lifo) { struct commit_list *next, *orig = *list; struct commit_list *work, **insert; struct commit_list **pptr; if (!orig) return; *list = NULL; /* Mark them and clear the indegree */ for (next = orig; next; next = next->next) { struct commit *commit = next->item; commit->indegree = 1; } /* update the indegree */ for (next = orig; next; next = next->next) { struct commit_list * parents = next->item->parents; while (parents) { struct commit *parent = parents->item; if (parent->indegree) parent->indegree++; parents = parents->next; } } /* * find the tips * * tips are nodes not reachable from any other node in the list * * the tips serve as a starting set for the work queue. */ work = NULL; insert = &work; for (next = orig; next; next = next->next) { struct commit *commit = next->item; if (commit->indegree == 1) insert = &commit_list_insert(commit, insert)->next; } /* process the list in topological order */ if (!lifo) commit_list_sort_by_date(&work); pptr = list; *list = NULL; while (work) { struct commit *commit; struct commit_list *parents, *work_item; work_item = work; work = work_item->next; work_item->next = NULL; commit = work_item->item; for (parents = commit->parents; parents ; parents = parents->next) { struct commit *parent = parents->item; if (!parent->indegree) continue; /* * parents are only enqueued for emission * when all their children have been emitted thereby * guaranteeing topological order. */ if (--parent->indegree == 1) { if (!lifo) commit_list_insert_by_date(parent, &work); else commit_list_insert(parent, &work); } } /* * work_item is a commit all of whose children * have already been emitted. we can emit it now. */ commit->indegree = 0; *pptr = work_item; pptr = &work_item->next; } } /* merge-base stuff */ /* bits #0..15 in revision.h */ #define PARENT1 (1u<<16) #define PARENT2 (1u<<17) #define STALE (1u<<18) #define RESULT (1u<<19) static const unsigned all_flags = (PARENT1 | PARENT2 | STALE | RESULT); static struct commit *interesting(struct commit_list *list) { while (list) { struct commit *commit = list->item; list = list->next; if (commit->object.flags & STALE) continue; return commit; } return NULL; } static struct commit_list *merge_bases_many(struct commit *one, int n, struct commit **twos) { struct commit_list *list = NULL; struct commit_list *result = NULL; int i; for (i = 0; i < n; i++) { if (one == twos[i]) /* * We do not mark this even with RESULT so we do not * have to clean it up. */ return commit_list_insert(one, &result); } if (parse_commit(one)) return NULL; for (i = 0; i < n; i++) { if (parse_commit(twos[i])) return NULL; } one->object.flags |= PARENT1; commit_list_insert_by_date(one, &list); for (i = 0; i < n; i++) { twos[i]->object.flags |= PARENT2; commit_list_insert_by_date(twos[i], &list); } while (interesting(list)) { struct commit *commit; struct commit_list *parents; struct commit_list *next; int flags; commit = list->item; next = list->next; free(list); list = next; flags = commit->object.flags & (PARENT1 | PARENT2 | STALE); if (flags == (PARENT1 | PARENT2)) { if (!(commit->object.flags & RESULT)) { commit->object.flags |= RESULT; commit_list_insert_by_date(commit, &result); } /* Mark parents of a found merge stale */ flags |= STALE; } parents = commit->parents; while (parents) { struct commit *p = parents->item; parents = parents->next; if ((p->object.flags & flags) == flags) continue; if (parse_commit(p)) return NULL; p->object.flags |= flags; commit_list_insert_by_date(p, &list); } } /* Clean up the result to remove stale ones */ free_commit_list(list); list = result; result = NULL; while (list) { struct commit_list *next = list->next; if (!(list->item->object.flags & STALE)) commit_list_insert_by_date(list->item, &result); free(list); list = next; } return result; } struct commit_list *get_octopus_merge_bases(struct commit_list *in) { struct commit_list *i, *j, *k, *ret = NULL; struct commit_list **pptr = &ret; for (i = in; i; i = i->next) { if (!ret) pptr = &commit_list_insert(i->item, pptr)->next; else { struct commit_list *new = NULL, *end = NULL; for (j = ret; j; j = j->next) { struct commit_list *bases; bases = get_merge_bases(i->item, j->item, 1); if (!new) new = bases; else end->next = bases; for (k = bases; k; k = k->next) end = k; } ret = new; } } return ret; } struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup) { struct commit_list *list; struct commit **rslt; struct commit_list *result; int cnt, i, j; result = merge_bases_many(one, n, twos); for (i = 0; i < n; i++) { if (one == twos[i]) return result; } if (!result || !result->next) { if (cleanup) { clear_commit_marks(one, all_flags); for (i = 0; i < n; i++) clear_commit_marks(twos[i], all_flags); } return result; } /* There are more than one */ cnt = 0; list = result; while (list) { list = list->next; cnt++; } rslt = xcalloc(cnt, sizeof(*rslt)); for (list = result, i = 0; list; list = list->next) rslt[i++] = list->item; free_commit_list(result); clear_commit_marks(one, all_flags); for (i = 0; i < n; i++) clear_commit_marks(twos[i], all_flags); for (i = 0; i < cnt - 1; i++) { for (j = i+1; j < cnt; j++) { if (!rslt[i] || !rslt[j]) continue; result = merge_bases_many(rslt[i], 1, &rslt[j]); clear_commit_marks(rslt[i], all_flags); clear_commit_marks(rslt[j], all_flags); for (list = result; list; list = list->next) { if (rslt[i] == list->item) rslt[i] = NULL; if (rslt[j] == list->item) rslt[j] = NULL; } } } /* Surviving ones in rslt[] are the independent results */ result = NULL; for (i = 0; i < cnt; i++) { if (rslt[i]) commit_list_insert_by_date(rslt[i], &result); } free(rslt); return result; } struct commit_list *get_merge_bases(struct commit *one, struct commit *two, int cleanup) { return get_merge_bases_many(one, 1, &two, cleanup); } int is_descendant_of(struct commit *commit, struct commit_list *with_commit) { if (!with_commit) return 1; while (with_commit) { struct commit *other; other = with_commit->item; with_commit = with_commit->next; if (in_merge_bases(other, &commit, 1)) return 1; } return 0; } int in_merge_bases(struct commit *commit, struct commit **reference, int num) { struct commit_list *bases, *b; int ret = 0; if (num == 1) bases = get_merge_bases(commit, *reference, 1); else die("not yet"); for (b = bases; b; b = b->next) { if (!hashcmp(commit->object.sha1, b->item->object.sha1)) { ret = 1; break; } } free_commit_list(bases); return ret; } struct commit_list *reduce_heads(struct commit_list *heads) { struct commit_list *p; struct commit_list *result = NULL, **tail = &result; struct commit **other; size_t num_head, num_other; if (!heads) return NULL; /* Avoid unnecessary reallocations */ for (p = heads, num_head = 0; p; p = p->next) num_head++; other = xcalloc(sizeof(*other), num_head); /* For each commit, see if it can be reached by others */ for (p = heads; p; p = p->next) { struct commit_list *q, *base; /* Do we already have this in the result? */ for (q = result; q; q = q->next) if (p->item == q->item) break; if (q) continue; num_other = 0; for (q = heads; q; q = q->next) { if (p->item == q->item) continue; other[num_other++] = q->item; } if (num_other) base = get_merge_bases_many(p->item, num_other, other, 1); else base = NULL; /* * If p->item does not have anything common with other * commits, there won't be any merge base. If it is * reachable from some of the others, p->item will be * the merge base. If its history is connected with * others, but p->item is not reachable by others, we * will get something other than p->item back. */ if (!base || (base->item != p->item)) tail = &(commit_list_insert(p->item, tail)->next); free_commit_list(base); } free(other); return result; } static const char gpg_sig_header[] = "gpgsig"; static const int gpg_sig_header_len = sizeof(gpg_sig_header) - 1; static int do_sign_commit(struct strbuf *buf, const char *keyid) { struct strbuf sig = STRBUF_INIT; int inspos, copypos; /* find the end of the header */ inspos = strstr(buf->buf, "\n\n") - buf->buf + 1; if (!keyid || !*keyid) keyid = get_signing_key(); if (sign_buffer(buf, &sig, keyid)) { strbuf_release(&sig); return -1; } for (copypos = 0; sig.buf[copypos]; ) { const char *bol = sig.buf + copypos; const char *eol = strchrnul(bol, '\n'); int len = (eol - bol) + !!*eol; if (!copypos) { strbuf_insert(buf, inspos, gpg_sig_header, gpg_sig_header_len); inspos += gpg_sig_header_len; } strbuf_insert(buf, inspos++, " ", 1); strbuf_insert(buf, inspos, bol, len); inspos += len; copypos += len; } strbuf_release(&sig); return 0; } int parse_signed_commit(const unsigned char *sha1, struct strbuf *payload, struct strbuf *signature) { unsigned long size; enum object_type type; char *buffer = read_sha1_file(sha1, &type, &size); int in_signature, saw_signature = -1; char *line, *tail; if (!buffer || type != OBJ_COMMIT) goto cleanup; line = buffer; tail = buffer + size; in_signature = 0; saw_signature = 0; while (line < tail) { const char *sig = NULL; char *next = memchr(line, '\n', tail - line); next = next ? next + 1 : tail; if (in_signature && line[0] == ' ') sig = line + 1; else if (!prefixcmp(line, gpg_sig_header) && line[gpg_sig_header_len] == ' ') sig = line + gpg_sig_header_len + 1; if (sig) { strbuf_add(signature, sig, next - sig); saw_signature = 1; in_signature = 1; } else { if (*line == '\n') /* dump the whole remainder of the buffer */ next = tail; strbuf_add(payload, line, next - line); in_signature = 0; } line = next; } cleanup: free(buffer); return saw_signature; } static void handle_signed_tag(struct commit *parent, struct commit_extra_header ***tail) { struct merge_remote_desc *desc; struct commit_extra_header *mergetag; char *buf; unsigned long size, len; enum object_type type; desc = merge_remote_util(parent); if (!desc || !desc->obj) return; buf = read_sha1_file(desc->obj->sha1, &type, &size); if (!buf || type != OBJ_TAG) goto free_return; len = parse_signature(buf, size); if (size == len) goto free_return; /* * We could verify this signature and either omit the tag when * it does not validate, but the integrator may not have the * public key of the signer of the tag he is merging, while a * later auditor may have it while auditing, so let's not run * verify-signed-buffer here for now... * * if (verify_signed_buffer(buf, len, buf + len, size - len, ...)) * warn("warning: signed tag unverified."); */ mergetag = xcalloc(1, sizeof(*mergetag)); mergetag->key = xstrdup("mergetag"); mergetag->value = buf; mergetag->len = size; **tail = mergetag; *tail = &mergetag->next; return; free_return: free(buf); } void append_merge_tag_headers(struct commit_list *parents, struct commit_extra_header ***tail) { while (parents) { struct commit *parent = parents->item; handle_signed_tag(parent, tail); parents = parents->next; } } static void add_extra_header(struct strbuf *buffer, struct commit_extra_header *extra) { strbuf_addstr(buffer, extra->key); if (extra->len) strbuf_add_lines(buffer, " ", extra->value, extra->len); else strbuf_addch(buffer, '\n'); } struct commit_extra_header *read_commit_extra_headers(struct commit *commit, const char **exclude) { struct commit_extra_header *extra = NULL; unsigned long size; enum object_type type; char *buffer = read_sha1_file(commit->object.sha1, &type, &size); if (buffer && type == OBJ_COMMIT) extra = read_commit_extra_header_lines(buffer, size, exclude); free(buffer); return extra; } static inline int standard_header_field(const char *field, size_t len) { return ((len == 4 && !memcmp(field, "tree ", 5)) || (len == 6 && !memcmp(field, "parent ", 7)) || (len == 6 && !memcmp(field, "author ", 7)) || (len == 9 && !memcmp(field, "committer ", 10)) || (len == 8 && !memcmp(field, "encoding ", 9))); } static int excluded_header_field(const char *field, size_t len, const char **exclude) { if (!exclude) return 0; while (*exclude) { size_t xlen = strlen(*exclude); if (len == xlen && !memcmp(field, *exclude, xlen) && field[xlen] == ' ') return 1; exclude++; } return 0; } struct commit_extra_header *read_commit_extra_header_lines(const char *buffer, size_t size, const char **exclude) { struct commit_extra_header *extra = NULL, **tail = &extra, *it = NULL; const char *line, *next, *eof, *eob; struct strbuf buf = STRBUF_INIT; for (line = buffer, eob = line + size; line < eob && *line != '\n'; line = next) { next = memchr(line, '\n', eob - line); next = next ? next + 1 : eob; if (*line == ' ') { /* continuation */ if (it) strbuf_add(&buf, line + 1, next - (line + 1)); continue; } if (it) it->value = strbuf_detach(&buf, &it->len); strbuf_reset(&buf); it = NULL; eof = strchr(line, ' '); if (next <= eof) eof = next; if (standard_header_field(line, eof - line) || excluded_header_field(line, eof - line, exclude)) continue; it = xcalloc(1, sizeof(*it)); it->key = xmemdupz(line, eof-line); *tail = it; tail = &it->next; if (eof + 1 < next) strbuf_add(&buf, eof + 1, next - (eof + 1)); } if (it) it->value = strbuf_detach(&buf, &it->len); return extra; } void free_commit_extra_headers(struct commit_extra_header *extra) { while (extra) { struct commit_extra_header *next = extra->next; free(extra->key); free(extra->value); free(extra); extra = next; } } int commit_tree(const struct strbuf *msg, unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit) { struct commit_extra_header *extra = NULL, **tail = &extra; int result; append_merge_tag_headers(parents, &tail); result = commit_tree_extended(msg, tree, parents, ret, author, sign_commit, extra); free_commit_extra_headers(extra); return result; } static const char commit_utf8_warn[] = "Warning: commit message does not conform to UTF-8.\n" "You may want to amend it after fixing the message, or set the config\n" "variable i18n.commitencoding to the encoding your project uses.\n"; int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit, struct commit_extra_header *extra) { int result; int encoding_is_utf8; struct strbuf buffer; assert_sha1_type(tree, OBJ_TREE); if (memchr(msg->buf, '\0', msg->len)) return error("a NUL byte in commit log message not allowed."); /* Not having i18n.commitencoding is the same as having utf-8 */ encoding_is_utf8 = is_encoding_utf8(git_commit_encoding); strbuf_init(&buffer, 8192); /* should avoid reallocs for the headers */ strbuf_addf(&buffer, "tree %s\n", sha1_to_hex(tree)); /* * NOTE! This ordering means that the same exact tree merged with a * different order of parents will be a _different_ changeset even * if everything else stays the same. */ while (parents) { struct commit_list *next = parents->next; struct commit *parent = parents->item; strbuf_addf(&buffer, "parent %s\n", sha1_to_hex(parent->object.sha1)); free(parents); parents = next; } /* Person/date information */ if (!author) author = git_author_info(IDENT_STRICT); strbuf_addf(&buffer, "author %s\n", author); strbuf_addf(&buffer, "committer %s\n", git_committer_info(IDENT_STRICT)); if (!encoding_is_utf8) strbuf_addf(&buffer, "encoding %s\n", git_commit_encoding); while (extra) { add_extra_header(&buffer, extra); extra = extra->next; } strbuf_addch(&buffer, '\n'); /* And add the comment */ strbuf_addbuf(&buffer, msg); /* And check the encoding */ if (encoding_is_utf8 && !is_utf8(buffer.buf)) fprintf(stderr, commit_utf8_warn); if (sign_commit && do_sign_commit(&buffer, sign_commit)) return -1; result = write_sha1_file(buffer.buf, buffer.len, commit_type, ret); strbuf_release(&buffer); return result; } struct commit *get_merge_parent(const char *name) { struct object *obj; struct commit *commit; unsigned char sha1[20]; if (get_sha1(name, sha1)) return NULL; obj = parse_object(sha1); commit = (struct commit *)peel_to_type(name, 0, obj, OBJ_COMMIT); if (commit && !commit->util) { struct merge_remote_desc *desc; desc = xmalloc(sizeof(*desc)); desc->obj = obj; desc->name = strdup(name); commit->util = desc; } return commit; } /* * Append a commit to the end of the commit_list. * * next starts by pointing to the variable that holds the head of an * empty commit_list, and is updated to point to the "next" field of * the last item on the list as new commits are appended. * * Usage example: * * struct commit_list *list; * struct commit_list **next = &list; * * next = commit_list_append(c1, next); * next = commit_list_append(c2, next); * assert(commit_list_count(list) == 2); * return list; */ struct commit_list **commit_list_append(struct commit *commit, struct commit_list **next) { struct commit_list *new = xmalloc(sizeof(struct commit_list)); new->item = commit; *next = new; new->next = NULL; return &new->next; } ================================================ FILE: samples/C/commit.h ================================================ #ifndef COMMIT_H #define COMMIT_H #include "object.h" #include "tree.h" #include "strbuf.h" #include "decorate.h" struct commit_list { struct commit *item; struct commit_list *next; }; struct commit { struct object object; void *util; unsigned int indegree; unsigned long date; struct commit_list *parents; struct tree *tree; char *buffer; }; extern int save_commit_buffer; extern const char *commit_type; /* While we can decorate any object with a name, it's only used for commits.. */ extern struct decoration name_decoration; struct name_decoration { struct name_decoration *next; int type; char name[1]; }; struct commit *lookup_commit(const unsigned char *sha1); struct commit *lookup_commit_reference(const unsigned char *sha1); struct commit *lookup_commit_reference_gently(const unsigned char *sha1, int quiet); struct commit *lookup_commit_reference_by_name(const char *name); /* * Look up object named by "sha1", dereference tag as necessary, * get a commit and return it. If "sha1" does not dereference to * a commit, use ref_name to report an error and die. */ struct commit *lookup_commit_or_die(const unsigned char *sha1, const char *ref_name); int parse_commit_buffer(struct commit *item, const void *buffer, unsigned long size); int parse_commit(struct commit *item); /* Find beginning and length of commit subject. */ int find_commit_subject(const char *commit_buffer, const char **subject); struct commit_list *commit_list_insert(struct commit *item, struct commit_list **list); struct commit_list **commit_list_append(struct commit *commit, struct commit_list **next); unsigned commit_list_count(const struct commit_list *l); struct commit_list *commit_list_insert_by_date(struct commit *item, struct commit_list **list); void commit_list_sort_by_date(struct commit_list **list); void free_commit_list(struct commit_list *list); /* Commit formats */ enum cmit_fmt { CMIT_FMT_RAW, CMIT_FMT_MEDIUM, CMIT_FMT_DEFAULT = CMIT_FMT_MEDIUM, CMIT_FMT_SHORT, CMIT_FMT_FULL, CMIT_FMT_FULLER, CMIT_FMT_ONELINE, CMIT_FMT_EMAIL, CMIT_FMT_USERFORMAT, CMIT_FMT_UNSPECIFIED }; struct pretty_print_context { enum cmit_fmt fmt; int abbrev; const char *subject; const char *after_subject; int preserve_subject; enum date_mode date_mode; unsigned date_mode_explicit:1; int need_8bit_cte; int show_notes; struct reflog_walk_info *reflog_info; const char *output_encoding; }; struct userformat_want { unsigned notes:1; }; extern int has_non_ascii(const char *text); struct rev_info; /* in revision.h, it circularly uses enum cmit_fmt */ extern char *logmsg_reencode(const struct commit *commit, const char *output_encoding); extern char *reencode_commit_message(const struct commit *commit, const char **encoding_p); extern void get_commit_format(const char *arg, struct rev_info *); extern const char *format_subject(struct strbuf *sb, const char *msg, const char *line_separator); extern void userformat_find_requirements(const char *fmt, struct userformat_want *w); extern void format_commit_message(const struct commit *commit, const char *format, struct strbuf *sb, const struct pretty_print_context *context); extern void pretty_print_commit(const struct pretty_print_context *pp, const struct commit *commit, struct strbuf *sb); extern void pp_commit_easy(enum cmit_fmt fmt, const struct commit *commit, struct strbuf *sb); void pp_user_info(const struct pretty_print_context *pp, const char *what, struct strbuf *sb, const char *line, const char *encoding); void pp_title_line(const struct pretty_print_context *pp, const char **msg_p, struct strbuf *sb, const char *encoding, int need_8bit_cte); void pp_remainder(const struct pretty_print_context *pp, const char **msg_p, struct strbuf *sb, int indent); /** Removes the first commit from a list sorted by date, and adds all * of its parents. **/ struct commit *pop_most_recent_commit(struct commit_list **list, unsigned int mark); struct commit *pop_commit(struct commit_list **stack); void clear_commit_marks(struct commit *commit, unsigned int mark); void clear_commit_marks_for_object_array(struct object_array *a, unsigned mark); /* * Performs an in-place topological sort of list supplied. * * invariant of resulting list is: * a reachable from b => ord(b) < ord(a) * in addition, when lifo == 0, commits on parallel tracks are * sorted in the dates order. */ void sort_in_topological_order(struct commit_list ** list, int lifo); struct commit_graft { unsigned char sha1[20]; int nr_parent; /* < 0 if shallow commit */ unsigned char parent[FLEX_ARRAY][20]; /* more */ }; typedef int (*each_commit_graft_fn)(const struct commit_graft *, void *); struct commit_graft *read_graft_line(char *buf, int len); int register_commit_graft(struct commit_graft *, int); struct commit_graft *lookup_commit_graft(const unsigned char *sha1); extern struct commit_list *get_merge_bases(struct commit *rev1, struct commit *rev2, int cleanup); extern struct commit_list *get_merge_bases_many(struct commit *one, int n, struct commit **twos, int cleanup); extern struct commit_list *get_octopus_merge_bases(struct commit_list *in); extern int register_shallow(const unsigned char *sha1); extern int unregister_shallow(const unsigned char *sha1); extern int for_each_commit_graft(each_commit_graft_fn, void *); extern int is_repository_shallow(void); extern struct commit_list *get_shallow_commits(struct object_array *heads, int depth, int shallow_flag, int not_shallow_flag); int is_descendant_of(struct commit *, struct commit_list *); int in_merge_bases(struct commit *, struct commit **, int); extern int interactive_add(int argc, const char **argv, const char *prefix, int patch); extern int run_add_interactive(const char *revision, const char *patch_mode, const char **pathspec); static inline int single_parent(struct commit *commit) { return commit->parents && !commit->parents->next; } struct commit_list *reduce_heads(struct commit_list *heads); struct commit_extra_header { struct commit_extra_header *next; char *key; char *value; size_t len; }; extern void append_merge_tag_headers(struct commit_list *parents, struct commit_extra_header ***tail); extern int commit_tree(const struct strbuf *msg, unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit); extern int commit_tree_extended(const struct strbuf *msg, unsigned char *tree, struct commit_list *parents, unsigned char *ret, const char *author, const char *sign_commit, struct commit_extra_header *); extern struct commit_extra_header *read_commit_extra_headers(struct commit *, const char **); extern struct commit_extra_header *read_commit_extra_header_lines(const char *buf, size_t len, const char **); extern void free_commit_extra_headers(struct commit_extra_header *extra); struct merge_remote_desc { struct object *obj; /* the named object, could be a tag */ const char *name; }; #define merge_remote_util(commit) ((struct merge_remote_desc *)((commit)->util)) /* * Given "name" from the command line to merge, find the commit object * and return it, while storing merge_remote_desc in its ->util field, * to allow callers to tell if we are told to merge a tag. */ struct commit *get_merge_parent(const char *name); extern int parse_signed_commit(const unsigned char *sha1, struct strbuf *message, struct strbuf *signature); #endif /* COMMIT_H */ ================================================ FILE: samples/C/common.h.in ================================================ // // common.h: Common definitions and such. // // CEN64: Cycle-Accurate Nintendo 64 Emulator. // Copyright (C) 2015, Tyler J. Stachecki. // // This file is subject to the terms and conditions defined in // 'LICENSE', which is part of this source code package. // #ifndef __common_h__ #define __common_h__ #define tostring(s) #s #define stringify(s) tostring(s) #ifdef _MSC_VER #define inline _inline #endif #ifndef __cplusplus #include #include #include #include #include #include #else #include #include #include #include #include #include #endif #ifndef _MSC_VER #ifndef __cplusplus #include #else #include #endif #else typedef char bool; #define false 0 #define true 1 #endif #ifdef __llvm__ #define CEN64_COMPILER "llvm-" stringify(__clang_major__)"." \ stringify(__clang_minor__)"." stringify(__clang_patchlevel__) #elif defined(__GNUC__) #define CEN64_COMPILER "gcc-" stringify(__GNUC__)"." \ stringify(__GNUC_MINOR__)"." stringify(__GNUC_PATCHLEVEL__) #elif defined(_MSC_VER) #if _MSC_VER < 1300 #define CEN64_COMPILER "MSVC 6.0" #elif _MSC_VER < 1500 #define CEN64_COMPILER "MSVC 2005" #elif _MSC_VER < 1600 #define CEN64_COMPILER "MSVC 2008" #elif _MSC_VER < 1700 #define CEN64_COMPILER "MSVC 2010" #elif _MSC_VER < 1800 #define CEN64_COMPILER "MSVC 2012" #elif _MSC_VER < 1900 #define CEN64_COMPILER "MSVC 2013" #elif _MSC_VER < 2000 #define CEN64_COMPILER "MSVC 2014" #else #define CEN64_COMPILER "MSVC" #endif #else #define CEN64_COMPILER "Unknown" #endif #cmakedefine CEN64_ARCH_DIR "@CEN64_ARCH_DIR@" #cmakedefine CEN64_ARCH_SUPPORT "@CEN64_ARCH_SUPPORT@" #define CACHE_LINE_SIZE 64 // Define cen64_align(). #ifdef _MSC_VER #define cen64_align(decl, value) __declspec(align(value)) decl #elif (defined __GNUC__) #define cen64_align(decl, value) decl __attribute__ ((aligned(value))) #else #define cen64_align(decl, value) decl value #endif // Define cen64_cold and cen64_hot. #ifdef __GNUC__ #define cen64_cold __attribute__((cold)) #define cen64_hot __attribute__((hot)) #else #define cen64_cold #define cen64_hot #endif // Define cen64_flatten. #ifdef __GNUC__ #define cen64_flatten __attribute__((flatten)) #else #define cen64_flatten #endif // Define likely()/unlikely(). #ifdef __GNUC__ #define likely(expr) __builtin_expect(!!(expr), !0) #define unlikely(expr) __builtin_expect(!!(expr), 0) #else #define likely(expr) expr #define unlikely(expr) expr #endif // Define unused(). #ifdef __GNUC__ #define unused(decl) __attribute__((unused)) decl #else #define unused(decl) decl #endif // Byte order swap functions. #ifdef BIG_ENDIAN_HOST #define WORD_ADDR_XOR 0 #else #define WORD_ADDR_XOR 4 #endif #ifndef _MSC_VER #ifdef BIG_ENDIAN_HOST #define htonll(x) (x) #define ntohll(x) (x) #else #ifndef __APPLE__ #define htonll(x) __builtin_bswap64(x) #define ntohll(x) __builtin_bswap64(x) #endif #endif #endif #ifdef __GNUC__ __attribute__((pure)) #endif static inline uint32_t byteswap_32(uint32_t word) { #ifdef BIG_ENDIAN_HOST return word; #elif defined(_MSC_VER) return _byteswap_ulong(word); #elif defined(__GNUC__) return __builtin_bswap32(word); #else return (((((word) >> 24) & 0x000000FF) | \ (((word) >> 8) & 0x0000FF00) | \ (((word) << 8) & 0x00FF0000) | \ (((word) << 24) & 0xFF000000)); #endif } #ifdef __GNUC__ __attribute__((pure)) #endif static inline uint16_t byteswap_16(uint16_t hword) { #ifdef BIG_ENDIAN_HOST return hword; #elif defined(_MSC_VER) return _byteswap_ushort(hword); #elif defined(__GNUC__) return __builtin_bswap16(hword); #else return ((((hword) >> 8) & 0x00FF) | \ (((hword) << 8) & 0xFF00)); #endif } // Return from simulation function. struct bus_controller; #ifdef __GNUC__ __attribute__ ((noreturn)) #endif void cen64_return(struct bus_controller *bus) ; #cmakedefine DEBUG_MMIO_REGISTER_ACCESS #ifdef DEBUG_MMIO_REGISTER_ACCESS #ifndef __cplusplus #include #else #include #endif #define debug_mmio_read(what, mnemonic, val) printf(#what": READ [%s]: 0x%.8X\n", mnemonic, val) #define debug_mmio_write(what, mnemonic, val, dqm) printf(#what": WRITE [%s]: 0x%.8X/0x%.8X\n", mnemonic, val, dqm) #else #define debug_mmio_read(what, mnemonic, val) do {} while (0) #define debug_mmio_write(what, mnemonic, val, dqm) do {} while (0) #endif #cmakedefine VR4300_BUSY_WAIT_DETECTION #include "common/debug.h" // Common/shared LUT with one-hot semantics. // Returns index (0-based) of hot bit, or -1. extern const int8_t cen64_one_hot_lut[256]; #endif ================================================ FILE: samples/C/cpuid.h ================================================ #ifndef CPUID_H #define CPUID_H #include "misc.h" static inline void do_cpuid(dword_t *eax, dword_t *ebx, dword_t *ecx, dword_t *edx) { dword_t leaf = *eax; switch (leaf) { case 0: *eax = 0x01; // we support barely anything *ebx = 0x756e6547; // Genu *edx = 0x49656e69; // ineI *ecx = 0x6c65746e; // ntel break; default: // if leaf is too high, use highest supported leaf case 1: *eax = 0x0; // say nothing about cpu model number *ebx = 0x0; // processor number 0, flushes 0 bytes on clflush *ecx = 0b00000000000000000000000000000000; // we support none of the features in ecx *edx = 0b00000000000000000000000000000000; // we also support none of the features in edx break; } } #endif ================================================ FILE: samples/C/custom_extensions.c ================================================ /* Copyright (c) 2014, Google Inc. * * Permission to use, copy, modify, and/or distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY * SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include #include #include #include #include #include #include #include "internal.h" void SSL_CUSTOM_EXTENSION_free(SSL_CUSTOM_EXTENSION *custom_extension) { OPENSSL_free(custom_extension); } static const SSL_CUSTOM_EXTENSION *custom_ext_find( STACK_OF(SSL_CUSTOM_EXTENSION) *stack, unsigned *out_index, uint16_t value) { size_t i; for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) { const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i); if (ext->value == value) { if (out_index != NULL) { *out_index = i; } return ext; } } return NULL; } /* default_add_callback is used as the |add_callback| when the user doesn't * provide one. For servers, it does nothing while, for clients, it causes an * empty extension to be included. */ static int default_add_callback(SSL *ssl, unsigned extension_value, const uint8_t **out, size_t *out_len, int *out_alert_value, void *add_arg) { if (ssl->server) { return 0; } *out_len = 0; return 1; } static int custom_ext_add_hello(SSL *ssl, CBB *extensions) { STACK_OF(SSL_CUSTOM_EXTENSION) *stack = ssl->ctx->client_custom_extensions; if (ssl->server) { stack = ssl->ctx->server_custom_extensions; } if (stack == NULL) { return 1; } size_t i; for (i = 0; i < sk_SSL_CUSTOM_EXTENSION_num(stack); i++) { const SSL_CUSTOM_EXTENSION *ext = sk_SSL_CUSTOM_EXTENSION_value(stack, i); if (ssl->server && !(ssl->s3->tmp.custom_extensions.received & (1u << i))) { /* Servers cannot echo extensions that the client didn't send. */ continue; } const uint8_t *contents; size_t contents_len; int alert = SSL_AD_DECODE_ERROR; CBB contents_cbb; switch (ext->add_callback(ssl, ext->value, &contents, &contents_len, &alert, ext->add_arg)) { case 1: if (!CBB_add_u16(extensions, ext->value) || !CBB_add_u16_length_prefixed(extensions, &contents_cbb) || !CBB_add_bytes(&contents_cbb, contents, contents_len) || !CBB_flush(extensions)) { OPENSSL_PUT_ERROR(SSL, ERR_R_INTERNAL_ERROR); ERR_add_error_dataf("extension: %u", (unsigned) ext->value); if (ext->free_callback && 0 < contents_len) { ext->free_callback(ssl, ext->value, contents, ext->add_arg); } return 0; } if (ext->free_callback && 0 < contents_len) { ext->free_callback(ssl, ext->value, contents, ext->add_arg); } if (!ssl->server) { assert((ssl->s3->tmp.custom_extensions.sent & (1u << i)) == 0); ssl->s3->tmp.custom_extensions.sent |= (1u << i); } break; case 0: break; default: ssl3_send_alert(ssl, SSL3_AL_FATAL, alert); OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR); ERR_add_error_dataf("extension: %u", (unsigned) ext->value); return 0; } } return 1; } int custom_ext_add_clienthello(SSL *ssl, CBB *extensions) { return custom_ext_add_hello(ssl, extensions); } int custom_ext_parse_serverhello(SSL *ssl, int *out_alert, uint16_t value, const CBS *extension) { unsigned index; const SSL_CUSTOM_EXTENSION *ext = custom_ext_find(ssl->ctx->client_custom_extensions, &index, value); if (/* Unknown extensions are not allowed in a ServerHello. */ ext == NULL || /* Also, if we didn't send the extension, that's also unacceptable. */ !(ssl->s3->tmp.custom_extensions.sent & (1u << index))) { OPENSSL_PUT_ERROR(SSL, SSL_R_UNEXPECTED_EXTENSION); ERR_add_error_dataf("extension: %u", (unsigned)value); *out_alert = SSL_AD_DECODE_ERROR; return 0; } if (ext->parse_callback != NULL && !ext->parse_callback(ssl, value, CBS_data(extension), CBS_len(extension), out_alert, ext->parse_arg)) { OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR); ERR_add_error_dataf("extension: %u", (unsigned)ext->value); return 0; } return 1; } int custom_ext_parse_clienthello(SSL *ssl, int *out_alert, uint16_t value, const CBS *extension) { unsigned index; const SSL_CUSTOM_EXTENSION *ext = custom_ext_find(ssl->ctx->server_custom_extensions, &index, value); if (ext == NULL) { return 1; } assert((ssl->s3->tmp.custom_extensions.received & (1u << index)) == 0); ssl->s3->tmp.custom_extensions.received |= (1u << index); if (ext->parse_callback && !ext->parse_callback(ssl, value, CBS_data(extension), CBS_len(extension), out_alert, ext->parse_arg)) { OPENSSL_PUT_ERROR(SSL, SSL_R_CUSTOM_EXTENSION_ERROR); ERR_add_error_dataf("extension: %u", (unsigned)ext->value); return 0; } return 1; } int custom_ext_add_serverhello(SSL *ssl, CBB *extensions) { return custom_ext_add_hello(ssl, extensions); } /* MAX_NUM_CUSTOM_EXTENSIONS is the maximum number of custom extensions that * can be set on an |SSL_CTX|. It's determined by the size of the bitset used * to track when an extension has been sent. */ #define MAX_NUM_CUSTOM_EXTENSIONS \ (sizeof(((struct ssl3_state_st *)NULL)->tmp.custom_extensions.sent) * 8) static int custom_ext_append(STACK_OF(SSL_CUSTOM_EXTENSION) **stack, unsigned extension_value, SSL_custom_ext_add_cb add_cb, SSL_custom_ext_free_cb free_cb, void *add_arg, SSL_custom_ext_parse_cb parse_cb, void *parse_arg) { if (add_cb == NULL || 0xffff < extension_value || SSL_extension_supported(extension_value) || /* Specifying a free callback without an add callback is nonsensical * and an error. */ (*stack != NULL && (MAX_NUM_CUSTOM_EXTENSIONS <= sk_SSL_CUSTOM_EXTENSION_num(*stack) || custom_ext_find(*stack, NULL, extension_value) != NULL))) { return 0; } SSL_CUSTOM_EXTENSION *ext = OPENSSL_malloc(sizeof(SSL_CUSTOM_EXTENSION)); if (ext == NULL) { return 0; } ext->add_callback = add_cb; ext->add_arg = add_arg; ext->free_callback = free_cb; ext->parse_callback = parse_cb; ext->parse_arg = parse_arg; ext->value = extension_value; if (*stack == NULL) { *stack = sk_SSL_CUSTOM_EXTENSION_new_null(); if (*stack == NULL) { SSL_CUSTOM_EXTENSION_free(ext); return 0; } } if (!sk_SSL_CUSTOM_EXTENSION_push(*stack, ext)) { SSL_CUSTOM_EXTENSION_free(ext); if (sk_SSL_CUSTOM_EXTENSION_num(*stack) == 0) { sk_SSL_CUSTOM_EXTENSION_free(*stack); *stack = NULL; } return 0; } return 1; } int SSL_CTX_add_client_custom_ext(SSL_CTX *ctx, unsigned extension_value, SSL_custom_ext_add_cb add_cb, SSL_custom_ext_free_cb free_cb, void *add_arg, SSL_custom_ext_parse_cb parse_cb, void *parse_arg) { return custom_ext_append(&ctx->client_custom_extensions, extension_value, add_cb ? add_cb : default_add_callback, free_cb, add_arg, parse_cb, parse_arg); } int SSL_CTX_add_server_custom_ext(SSL_CTX *ctx, unsigned extension_value, SSL_custom_ext_add_cb add_cb, SSL_custom_ext_free_cb free_cb, void *add_arg, SSL_custom_ext_parse_cb parse_cb, void *parse_arg) { return custom_ext_append(&ctx->server_custom_extensions, extension_value, add_cb ? add_cb : default_add_callback, free_cb, add_arg, parse_cb, parse_arg); } ================================================ FILE: samples/C/driver.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #define CONSOLE_DRV_CAP_CLEAR 0x01 #define CONSOLE_DRV_CAP_SCROLL 0x02 #define CONSOLE_DRV_CAP_SET_CURSOR 0x04 // Input modifier keys typedef struct { bool shift_left:1; bool shift_right:1; bool control_left:1; bool control_right:1; bool alt:1; bool super:1; } console_modifiers_t; typedef struct { char character; console_modifiers_t* modifiers; } console_read_t; typedef struct { int (*write)(console_info_t*, char); console_read_t* (*read)(console_info_t*); int capabilities; int (*_clear)(console_info_t*); int (*scroll)(console_info_t*, int32_t); void (*setCursor)(console_info_t*, uint32_t, uint32_t); } console_driver_t; ================================================ FILE: samples/C/elf.h ================================================ #pragma once /* Copyright © 2011 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #define ELF_TYPE_NONE 0 #define ELF_TYPE_REL 1 #define ELF_TYPE_EXEC 2 #define ELF_TYPE_DYN 3 #define ELF_TYPE_CORE 4 #define ELF_ARCH_NONE 0 #define ELF_ARCH_386 3 #define ELF_VERSION_CURRENT 1 typedef struct { unsigned char magic[4]; /* Note: There _is_ other stuff in here, but we don't need it */ unsigned char pad[12]; } __attribute__((packed)) elf_ident_t; typedef struct { uint32_t type; uint32_t offset; void* virtaddr; void* physaddr; uint32_t filesize; uint32_t memsize; uint32_t flags; uint32_t alignment; } __attribute__((packed)) elf_program_t; typedef struct { elf_ident_t ident; uint16_t type; /* Object file type */ uint16_t machine; /* Architecture */ uint32_t version; /* Object file version */ void* entry; /* Entry point virtual address */ uint32_t phoff; /* Program header table file offset */ uint32_t shoff; /* Section header table file offset */ uint32_t flags; /* Processor-specific flags */ uint16_t ehsize; /* ELF header size in bytes */ uint16_t phentsize; /* Program header table entry size */ uint16_t phnum; /* Program header table entry count */ uint16_t shentsize; /* Section header table entry size */ uint16_t shnum; /* Section header table entry count */ uint16_t shstrndx; /* Section header string table index */ } __attribute__((packed)) elf_t; task_t* elf_load(elf_t* bin, char* name, char** environ, char** argv, int argc); task_t* elf_load_file(char* path, char** environ, char** argv, int argc); ================================================ FILE: samples/C/exception.zep.c ================================================ #ifdef HAVE_CONFIG_H #include "../../ext_config.h" #endif #include #include "../../php_ext.h" #include "../../ext.h" #include #include #include #include "kernel/main.h" /** * Test\Router\Exception * * Exceptions generated by the router */ ZEPHIR_INIT_CLASS(Test_Router_Exception) { ZEPHIR_REGISTER_CLASS_EX(Test\\Router, Exception, test, router_exception, zend_exception_get_default(TSRMLS_C), NULL, 0); return SUCCESS; } ================================================ FILE: samples/C/exception.zep.h ================================================ extern zend_class_entry *test_router_exception_ce; ZEPHIR_INIT_CLASS(Test_Router_Exception); ================================================ FILE: samples/C/filter.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #include struct console_filter { // General callback for all actions etc. // Preferred prototype: // char (char c, console_info_t *info, console_driver_t *input, console_driver_t *output); char (*callback)(char, console_info_t*, console_driver_t*, console_driver_t*); // Specific callbacks for read and write // Preferred prototype: // char (char c, console_info_t *info, console_driver_t *input); char (*read_callback)(char, console_info_t*, console_driver_t*); // Preferred prototype: // char (char c, console_info_t *info, console_driver_t *output); char (*write_callback)(char, console_info_t*, console_driver_t*); // The next filter in the filter chain struct console_filter* next; }; typedef struct console_filter console_filter_t; ================================================ FILE: samples/C/fudge_node.c ================================================ /* Copyright (c) 2010 Jens Nyberg Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #include #include #include #include "pipe.h" static struct system_node root; static struct system_node clone; static unsigned int read(struct pipe_end *endself, struct pipe_end *endtarget, struct service_state *state, unsigned int count, void *buffer) { count = buffer_rcfifo(&endself->buffer, count, buffer); if (!count && endtarget->node.refcount) { list_add(&endself->readlinks, &state->link); task_setstatus(state->link.data, TASK_STATUS_BLOCKED); } system_wakeup(&endtarget->writelinks); return count; } static unsigned int write(struct pipe_end *endself, struct pipe_end *endtarget, struct service_state *state, unsigned int count, void *buffer) { count = buffer_wcfifo(&endtarget->buffer, count, buffer); if (!count) { list_add(&endself->writelinks, &state->link); task_setstatus(state->link.data, TASK_STATUS_BLOCKED); } system_wakeup(&endtarget->readlinks); return count; } static unsigned int end0_read(struct system_node *self, struct service_state *state, unsigned int count, void *buffer) { struct pipe *pipe = (struct pipe *)self->parent; return read(&pipe->end0, &pipe->end1, state, count, buffer); } static unsigned int end0_write(struct system_node *self, struct service_state *state, unsigned int count, void *buffer) { struct pipe *pipe = (struct pipe *)self->parent; return write(&pipe->end0, &pipe->end1, state, count, buffer); } static unsigned int end1_read(struct system_node *self, struct service_state *state, unsigned int count, void *buffer) { struct pipe *pipe = (struct pipe *)self->parent; return read(&pipe->end1, &pipe->end0, state, count, buffer); } static unsigned int end1_write(struct system_node *self, struct service_state *state, unsigned int count, void *buffer) { struct pipe *pipe = (struct pipe *)self->parent; return write(&pipe->end1, &pipe->end0, state, count, buffer); } static unsigned int clone_child(struct system_node *self, unsigned int count, char *path) { struct list_item *current; for (current = root.children.head; current; current = current->next) { struct system_node *node = current->data; struct pipe *pipe = current->data; if (node == self) continue; if (pipe->end0.node.refcount || pipe->end1.node.refcount) continue; return node->child(node, count, path); } return 0; } void pipe_init(struct pipe *pipe) { buffer_init(&pipe->end0.buffer, 4096, pipe->end0.data); buffer_init(&pipe->end1.buffer, 4096, pipe->end1.data); system_initnode(&pipe->end0.node, SYSTEM_NODETYPE_NORMAL, "0"); system_initnode(&pipe->end1.node, SYSTEM_NODETYPE_NORMAL, "1"); pipe->end0.node.read = end0_read; pipe->end0.node.write = end0_write; pipe->end1.node.read = end1_read; pipe->end1.node.write = end1_write; system_initnode(&pipe->root, SYSTEM_NODETYPE_GROUP | SYSTEM_NODETYPE_MULTI, "pipe"); system_addchild(&pipe->root, &pipe->end0.node); system_addchild(&pipe->root, &pipe->end1.node); } void pipe_register(struct pipe *pipe) { system_addchild(&root, &pipe->root); } void pipe_unregister(struct pipe *pipe) { system_removechild(&root, &pipe->root); } void module_init(void) { system_initnode(&root, SYSTEM_NODETYPE_GROUP, "pipe"); system_initnode(&clone, SYSTEM_NODETYPE_GROUP, "clone"); clone.child = clone_child; system_addchild(&root, &clone); } void module_register(void) { system_registernode(&root); } void module_unregister(void) { system_unregisternode(&root); } ================================================ FILE: samples/C/git.c ================================================ #include "builtin.h" #include "cache.h" #include "exec_cmd.h" #include "help.h" #include "quote.h" #include "run-command.h" const char git_usage_string[] = "git [--version] [--exec-path[=]] [--html-path] [--man-path] [--info-path]\n" " [-p|--paginate|--no-pager] [--no-replace-objects] [--bare]\n" " [--git-dir=] [--work-tree=] [--namespace=]\n" " [-c name=value] [--help]\n" " []"; const char git_more_info_string[] = N_("See 'git help ' for more information on a specific command."); static struct startup_info git_startup_info; static int use_pager = -1; struct pager_config { const char *cmd; int want; char *value; }; static int pager_command_config(const char *var, const char *value, void *data) { struct pager_config *c = data; if (!prefixcmp(var, "pager.") && !strcmp(var + 6, c->cmd)) { int b = git_config_maybe_bool(var, value); if (b >= 0) c->want = b; else { c->want = 1; c->value = xstrdup(value); } } return 0; } /* returns 0 for "no pager", 1 for "use pager", and -1 for "not specified" */ int check_pager_config(const char *cmd) { struct pager_config c; c.cmd = cmd; c.want = -1; c.value = NULL; git_config(pager_command_config, &c); if (c.value) pager_program = c.value; return c.want; } static void commit_pager_choice(void) { switch (use_pager) { case 0: setenv("GIT_PAGER", "cat", 1); break; case 1: setup_pager(); break; default: break; } } static int handle_options(const char ***argv, int *argc, int *envchanged) { const char **orig_argv = *argv; while (*argc > 0) { const char *cmd = (*argv)[0]; if (cmd[0] != '-') break; /* * For legacy reasons, the "version" and "help" * commands can be written with "--" prepended * to make them look like flags. */ if (!strcmp(cmd, "--help") || !strcmp(cmd, "--version")) break; /* * Check remaining flags. */ if (!prefixcmp(cmd, "--exec-path")) { cmd += 11; if (*cmd == '=') git_set_argv_exec_path(cmd + 1); else { puts(git_exec_path()); exit(0); } } else if (!strcmp(cmd, "--html-path")) { puts(system_path(GIT_HTML_PATH)); exit(0); } else if (!strcmp(cmd, "--man-path")) { puts(system_path(GIT_MAN_PATH)); exit(0); } else if (!strcmp(cmd, "--info-path")) { puts(system_path(GIT_INFO_PATH)); exit(0); } else if (!strcmp(cmd, "-p") || !strcmp(cmd, "--paginate")) { use_pager = 1; } else if (!strcmp(cmd, "--no-pager")) { use_pager = 0; if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--no-replace-objects")) { read_replace_refs = 0; setenv(NO_REPLACE_OBJECTS_ENVIRONMENT, "1", 1); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--git-dir")) { if (*argc < 2) { fprintf(stderr, "No directory given for --git-dir.\n" ); usage(git_usage_string); } setenv(GIT_DIR_ENVIRONMENT, (*argv)[1], 1); if (envchanged) *envchanged = 1; (*argv)++; (*argc)--; } else if (!prefixcmp(cmd, "--git-dir=")) { setenv(GIT_DIR_ENVIRONMENT, cmd + 10, 1); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--namespace")) { if (*argc < 2) { fprintf(stderr, "No namespace given for --namespace.\n" ); usage(git_usage_string); } setenv(GIT_NAMESPACE_ENVIRONMENT, (*argv)[1], 1); if (envchanged) *envchanged = 1; (*argv)++; (*argc)--; } else if (!prefixcmp(cmd, "--namespace=")) { setenv(GIT_NAMESPACE_ENVIRONMENT, cmd + 12, 1); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--work-tree")) { if (*argc < 2) { fprintf(stderr, "No directory given for --work-tree.\n" ); usage(git_usage_string); } setenv(GIT_WORK_TREE_ENVIRONMENT, (*argv)[1], 1); if (envchanged) *envchanged = 1; (*argv)++; (*argc)--; } else if (!prefixcmp(cmd, "--work-tree=")) { setenv(GIT_WORK_TREE_ENVIRONMENT, cmd + 12, 1); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "--bare")) { static char git_dir[PATH_MAX+1]; is_bare_repository_cfg = 1; setenv(GIT_DIR_ENVIRONMENT, getcwd(git_dir, sizeof(git_dir)), 0); if (envchanged) *envchanged = 1; } else if (!strcmp(cmd, "-c")) { if (*argc < 2) { fprintf(stderr, "-c expects a configuration string\n" ); usage(git_usage_string); } git_config_push_parameter((*argv)[1]); (*argv)++; (*argc)--; } else { fprintf(stderr, "Unknown option: %s\n", cmd); usage(git_usage_string); } (*argv)++; (*argc)--; } return (*argv) - orig_argv; } static int handle_alias(int *argcp, const char ***argv) { int envchanged = 0, ret = 0, saved_errno = errno; const char *subdir; int count, option_count; const char **new_argv; const char *alias_command; char *alias_string; int unused_nongit; subdir = setup_git_directory_gently(&unused_nongit); alias_command = (*argv)[0]; alias_string = alias_lookup(alias_command); if (alias_string) { if (alias_string[0] == '!') { const char **alias_argv; int argc = *argcp, i; commit_pager_choice(); /* build alias_argv */ alias_argv = xmalloc(sizeof(*alias_argv) * (argc + 1)); alias_argv[0] = alias_string + 1; for (i = 1; i < argc; ++i) alias_argv[i] = (*argv)[i]; alias_argv[argc] = NULL; ret = run_command_v_opt(alias_argv, RUN_USING_SHELL); if (ret >= 0) /* normal exit */ exit(ret); die_errno("While expanding alias '%s': '%s'", alias_command, alias_string + 1); } count = split_cmdline(alias_string, &new_argv); if (count < 0) die("Bad alias.%s string: %s", alias_command, split_cmdline_strerror(count)); option_count = handle_options(&new_argv, &count, &envchanged); if (envchanged) die("alias '%s' changes environment variables\n" "You can use '!git' in the alias to do this.", alias_command); memmove(new_argv - option_count, new_argv, count * sizeof(char *)); new_argv -= option_count; if (count < 1) die("empty alias for %s", alias_command); if (!strcmp(alias_command, new_argv[0])) die("recursive alias: %s", alias_command); trace_argv_printf(new_argv, "trace: alias expansion: %s =>", alias_command); new_argv = xrealloc(new_argv, sizeof(char *) * (count + *argcp)); /* insert after command name */ memcpy(new_argv + count, *argv + 1, sizeof(char *) * *argcp); *argv = new_argv; *argcp += count - 1; ret = 1; } if (subdir && chdir(subdir)) die_errno("Cannot change to '%s'", subdir); errno = saved_errno; return ret; } const char git_version_string[] = GIT_VERSION; #define RUN_SETUP (1<<0) #define RUN_SETUP_GENTLY (1<<1) #define USE_PAGER (1<<2) /* * require working tree to be present -- anything uses this needs * RUN_SETUP for reading from the configuration file. */ #define NEED_WORK_TREE (1<<3) struct cmd_struct { const char *cmd; int (*fn)(int, const char **, const char *); int option; }; static int run_builtin(struct cmd_struct *p, int argc, const char **argv) { int status, help; struct stat st; const char *prefix; prefix = NULL; help = argc == 2 && !strcmp(argv[1], "-h"); if (!help) { if (p->option & RUN_SETUP) prefix = setup_git_directory(); if (p->option & RUN_SETUP_GENTLY) { int nongit_ok; prefix = setup_git_directory_gently(&nongit_ok); } if (use_pager == -1 && p->option & (RUN_SETUP | RUN_SETUP_GENTLY)) use_pager = check_pager_config(p->cmd); if (use_pager == -1 && p->option & USE_PAGER) use_pager = 1; if ((p->option & (RUN_SETUP | RUN_SETUP_GENTLY)) && startup_info->have_repository) /* get_git_dir() may set up repo, avoid that */ trace_repo_setup(prefix); } commit_pager_choice(); if (!help && p->option & NEED_WORK_TREE) setup_work_tree(); trace_argv_printf(argv, "trace: built-in: git"); status = p->fn(argc, argv, prefix); if (status) return status; /* Somebody closed stdout? */ if (fstat(fileno(stdout), &st)) return 0; /* Ignore write errors for pipes and sockets.. */ if (S_ISFIFO(st.st_mode) || S_ISSOCK(st.st_mode)) return 0; /* Check for ENOSPC and EIO errors.. */ if (fflush(stdout)) die_errno("write failure on standard output"); if (ferror(stdout)) die("unknown write failure on standard output"); if (fclose(stdout)) die_errno("close failed on standard output"); return 0; } static void handle_internal_command(int argc, const char **argv) { const char *cmd = argv[0]; static struct cmd_struct commands[] = { { "add", cmd_add, RUN_SETUP | NEED_WORK_TREE }, { "annotate", cmd_annotate, RUN_SETUP }, { "apply", cmd_apply, RUN_SETUP_GENTLY }, { "archive", cmd_archive }, { "bisect--helper", cmd_bisect__helper, RUN_SETUP }, { "blame", cmd_blame, RUN_SETUP }, { "branch", cmd_branch, RUN_SETUP }, { "bundle", cmd_bundle, RUN_SETUP_GENTLY }, { "cat-file", cmd_cat_file, RUN_SETUP }, { "check-attr", cmd_check_attr, RUN_SETUP }, { "check-ref-format", cmd_check_ref_format }, { "checkout", cmd_checkout, RUN_SETUP | NEED_WORK_TREE }, { "checkout-index", cmd_checkout_index, RUN_SETUP | NEED_WORK_TREE}, { "cherry", cmd_cherry, RUN_SETUP }, { "cherry-pick", cmd_cherry_pick, RUN_SETUP | NEED_WORK_TREE }, { "clean", cmd_clean, RUN_SETUP | NEED_WORK_TREE }, { "clone", cmd_clone }, { "column", cmd_column, RUN_SETUP_GENTLY }, { "commit", cmd_commit, RUN_SETUP | NEED_WORK_TREE }, { "commit-tree", cmd_commit_tree, RUN_SETUP }, { "config", cmd_config, RUN_SETUP_GENTLY }, { "count-objects", cmd_count_objects, RUN_SETUP }, { "describe", cmd_describe, RUN_SETUP }, { "diff", cmd_diff }, { "diff-files", cmd_diff_files, RUN_SETUP | NEED_WORK_TREE }, { "diff-index", cmd_diff_index, RUN_SETUP }, { "diff-tree", cmd_diff_tree, RUN_SETUP }, { "fast-export", cmd_fast_export, RUN_SETUP }, { "fetch", cmd_fetch, RUN_SETUP }, { "fetch-pack", cmd_fetch_pack, RUN_SETUP }, { "fmt-merge-msg", cmd_fmt_merge_msg, RUN_SETUP }, { "for-each-ref", cmd_for_each_ref, RUN_SETUP }, { "format-patch", cmd_format_patch, RUN_SETUP }, { "fsck", cmd_fsck, RUN_SETUP }, { "fsck-objects", cmd_fsck, RUN_SETUP }, { "gc", cmd_gc, RUN_SETUP }, { "get-tar-commit-id", cmd_get_tar_commit_id }, { "grep", cmd_grep, RUN_SETUP_GENTLY }, { "hash-object", cmd_hash_object }, { "help", cmd_help }, { "index-pack", cmd_index_pack, RUN_SETUP_GENTLY }, { "init", cmd_init_db }, { "init-db", cmd_init_db }, { "log", cmd_log, RUN_SETUP }, { "ls-files", cmd_ls_files, RUN_SETUP }, { "ls-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, { "ls-tree", cmd_ls_tree, RUN_SETUP }, { "mailinfo", cmd_mailinfo }, { "mailsplit", cmd_mailsplit }, { "merge", cmd_merge, RUN_SETUP | NEED_WORK_TREE }, { "merge-base", cmd_merge_base, RUN_SETUP }, { "merge-file", cmd_merge_file, RUN_SETUP_GENTLY }, { "merge-index", cmd_merge_index, RUN_SETUP }, { "merge-ours", cmd_merge_ours, RUN_SETUP }, { "merge-recursive", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, { "merge-recursive-ours", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, { "merge-recursive-theirs", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, { "merge-subtree", cmd_merge_recursive, RUN_SETUP | NEED_WORK_TREE }, { "merge-tree", cmd_merge_tree, RUN_SETUP }, { "mktag", cmd_mktag, RUN_SETUP }, { "mktree", cmd_mktree, RUN_SETUP }, { "mv", cmd_mv, RUN_SETUP | NEED_WORK_TREE }, { "name-rev", cmd_name_rev, RUN_SETUP }, { "notes", cmd_notes, RUN_SETUP }, { "pack-objects", cmd_pack_objects, RUN_SETUP }, { "pack-redundant", cmd_pack_redundant, RUN_SETUP }, { "pack-refs", cmd_pack_refs, RUN_SETUP }, { "patch-id", cmd_patch_id }, { "peek-remote", cmd_ls_remote, RUN_SETUP_GENTLY }, { "pickaxe", cmd_blame, RUN_SETUP }, { "prune", cmd_prune, RUN_SETUP }, { "prune-packed", cmd_prune_packed, RUN_SETUP }, { "push", cmd_push, RUN_SETUP }, { "read-tree", cmd_read_tree, RUN_SETUP }, { "receive-pack", cmd_receive_pack }, { "reflog", cmd_reflog, RUN_SETUP }, { "remote", cmd_remote, RUN_SETUP }, { "remote-ext", cmd_remote_ext }, { "remote-fd", cmd_remote_fd }, { "replace", cmd_replace, RUN_SETUP }, { "repo-config", cmd_repo_config, RUN_SETUP_GENTLY }, { "rerere", cmd_rerere, RUN_SETUP }, { "reset", cmd_reset, RUN_SETUP }, { "rev-list", cmd_rev_list, RUN_SETUP }, { "rev-parse", cmd_rev_parse }, { "revert", cmd_revert, RUN_SETUP | NEED_WORK_TREE }, { "rm", cmd_rm, RUN_SETUP }, { "send-pack", cmd_send_pack, RUN_SETUP }, { "shortlog", cmd_shortlog, RUN_SETUP_GENTLY | USE_PAGER }, { "show", cmd_show, RUN_SETUP }, { "show-branch", cmd_show_branch, RUN_SETUP }, { "show-ref", cmd_show_ref, RUN_SETUP }, { "stage", cmd_add, RUN_SETUP | NEED_WORK_TREE }, { "status", cmd_status, RUN_SETUP | NEED_WORK_TREE }, { "stripspace", cmd_stripspace }, { "symbolic-ref", cmd_symbolic_ref, RUN_SETUP }, { "tag", cmd_tag, RUN_SETUP }, { "tar-tree", cmd_tar_tree }, { "unpack-file", cmd_unpack_file, RUN_SETUP }, { "unpack-objects", cmd_unpack_objects, RUN_SETUP }, { "update-index", cmd_update_index, RUN_SETUP }, { "update-ref", cmd_update_ref, RUN_SETUP }, { "update-server-info", cmd_update_server_info, RUN_SETUP }, { "upload-archive", cmd_upload_archive }, { "upload-archive--writer", cmd_upload_archive_writer }, { "var", cmd_var, RUN_SETUP_GENTLY }, { "verify-pack", cmd_verify_pack }, { "verify-tag", cmd_verify_tag, RUN_SETUP }, { "version", cmd_version }, { "whatchanged", cmd_whatchanged, RUN_SETUP }, { "write-tree", cmd_write_tree, RUN_SETUP }, }; int i; static const char ext[] = STRIP_EXTENSION; if (sizeof(ext) > 1) { i = strlen(argv[0]) - strlen(ext); if (i > 0 && !strcmp(argv[0] + i, ext)) { char *argv0 = xstrdup(argv[0]); argv[0] = cmd = argv0; argv0[i] = '\0'; } } /* Turn "git cmd --help" into "git help cmd" */ if (argc > 1 && !strcmp(argv[1], "--help")) { argv[1] = argv[0]; argv[0] = cmd = "help"; } for (i = 0; i < ARRAY_SIZE(commands); i++) { struct cmd_struct *p = commands+i; if (strcmp(p->cmd, cmd)) continue; exit(run_builtin(p, argc, argv)); } } static void execv_dashed_external(const char **argv) { struct strbuf cmd = STRBUF_INIT; const char *tmp; int status; if (use_pager == -1) use_pager = check_pager_config(argv[0]); commit_pager_choice(); strbuf_addf(&cmd, "git-%s", argv[0]); /* * argv[0] must be the git command, but the argv array * belongs to the caller, and may be reused in * subsequent loop iterations. Save argv[0] and * restore it on error. */ tmp = argv[0]; argv[0] = cmd.buf; trace_argv_printf(argv, "trace: exec:"); /* * if we fail because the command is not found, it is * OK to return. Otherwise, we just pass along the status code. */ status = run_command_v_opt(argv, RUN_SILENT_EXEC_FAILURE | RUN_CLEAN_ON_EXIT); if (status >= 0 || errno != ENOENT) exit(status); argv[0] = tmp; strbuf_release(&cmd); } static int run_argv(int *argcp, const char ***argv) { int done_alias = 0; while (1) { /* See if it's an internal command */ handle_internal_command(*argcp, *argv); /* .. then try the external ones */ execv_dashed_external(*argv); /* It could be an alias -- this works around the insanity * of overriding "git log" with "git show" by having * alias.log = show */ if (done_alias || !handle_alias(argcp, argv)) break; done_alias = 1; } return done_alias; } int main(int argc, const char **argv) { const char *cmd; startup_info = &git_startup_info; cmd = git_extract_argv0_path(argv[0]); if (!cmd) cmd = "git-help"; git_setup_gettext(); /* * "git-xxxx" is the same as "git xxxx", but we obviously: * * - cannot take flags in between the "git" and the "xxxx". * - cannot execute it externally (since it would just do * the same thing over again) * * So we just directly call the internal command handler, and * die if that one cannot handle it. */ if (!prefixcmp(cmd, "git-")) { cmd += 4; argv[0] = cmd; handle_internal_command(argc, argv); die("cannot handle %s internally", cmd); } /* Look for flags.. */ argv++; argc--; handle_options(&argv, &argc, NULL); if (argc > 0) { if (!prefixcmp(argv[0], "--")) argv[0] += 2; } else { /* The user didn't specify a command; give them help */ commit_pager_choice(); printf("usage: %s\n\n", git_usage_string); list_common_cmds_help(); printf("\n%s\n", git_more_info_string); exit(1); } cmd = argv[0]; /* * We use PATH to find git commands, but we prepend some higher * precedence paths: the "--exec-path" option, the GIT_EXEC_PATH * environment, and the $(gitexecdir) from the Makefile at build * time. */ setup_path(); while (1) { static int done_help = 0; static int was_alias = 0; was_alias = run_argv(&argc, &argv); if (errno != ENOENT) break; if (was_alias) { fprintf(stderr, "Expansion of alias '%s' failed; " "'%s' is not a git command\n", cmd, argv[0]); exit(1); } if (!done_help) { cmd = argv[0] = help_unknown_cmd(cmd); done_help = 1; } else break; } fprintf(stderr, "Failed to run command '%s': %s\n", cmd, strerror(errno)); return 1; } ================================================ FILE: samples/C/hello.c ================================================ #include int main() { printf("Hello World\n"); return 0; } ================================================ FILE: samples/C/hello.h ================================================ #ifndef HELLO_H #define HELLO_H void hello(); #endif ================================================ FILE: samples/C/http_parser.c ================================================ /* Based on src/http/ngx_http_parse.c from NGINX copyright Igor Sysoev * * Additional changes are licensed under the same terms as NGINX and * copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "http_parser.h" #include #include #include #include #include #include #ifndef ULLONG_MAX # define ULLONG_MAX ((uint64_t) -1) /* 2^64-1 */ #endif #ifndef MIN # define MIN(a,b) ((a) < (b) ? (a) : (b)) #endif #if HTTP_PARSER_DEBUG #define SET_ERRNO(e) \ do { \ parser->http_errno = (e); \ parser->error_lineno = __LINE__; \ } while (0) #else #define SET_ERRNO(e) \ do { \ parser->http_errno = (e); \ } while(0) #endif /* Run the notify callback FOR, returning ER if it fails */ #define CALLBACK_NOTIFY_(FOR, ER) \ do { \ assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ \ if (settings->on_##FOR) { \ if (0 != settings->on_##FOR(parser)) { \ SET_ERRNO(HPE_CB_##FOR); \ } \ \ /* We either errored above or got paused; get out */ \ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ return (ER); \ } \ } \ } while (0) /* Run the notify callback FOR and consume the current byte */ #define CALLBACK_NOTIFY(FOR) CALLBACK_NOTIFY_(FOR, p - data + 1) /* Run the notify callback FOR and don't consume the current byte */ #define CALLBACK_NOTIFY_NOADVANCE(FOR) CALLBACK_NOTIFY_(FOR, p - data) /* Run data callback FOR with LEN bytes, returning ER if it fails */ #define CALLBACK_DATA_(FOR, LEN, ER) \ do { \ assert(HTTP_PARSER_ERRNO(parser) == HPE_OK); \ \ if (FOR##_mark) { \ if (settings->on_##FOR) { \ if (0 != settings->on_##FOR(parser, FOR##_mark, (LEN))) { \ SET_ERRNO(HPE_CB_##FOR); \ } \ \ /* We either errored above or got paused; get out */ \ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { \ return (ER); \ } \ } \ FOR##_mark = NULL; \ } \ } while (0) /* Run the data callback FOR and consume the current byte */ #define CALLBACK_DATA(FOR) \ CALLBACK_DATA_(FOR, p - FOR##_mark, p - data + 1) /* Run the data callback FOR and don't consume the current byte */ #define CALLBACK_DATA_NOADVANCE(FOR) \ CALLBACK_DATA_(FOR, p - FOR##_mark, p - data) /* Set the mark FOR; non-destructive if mark is already set */ #define MARK(FOR) \ do { \ if (!FOR##_mark) { \ FOR##_mark = p; \ } \ } while (0) #define PROXY_CONNECTION "proxy-connection" #define CONNECTION "connection" #define CONTENT_LENGTH "content-length" #define TRANSFER_ENCODING "transfer-encoding" #define UPGRADE "upgrade" #define CHUNKED "chunked" #define KEEP_ALIVE "keep-alive" #define CLOSE "close" static const char *method_strings[] = { #define XX(num, name, string) #string, HTTP_METHOD_MAP(XX) #undef XX }; /* Tokens as defined by rfc 2616. Also lowercases them. * token = 1* * separators = "(" | ")" | "<" | ">" | "@" * | "," | ";" | ":" | "\" | <"> * | "/" | "[" | "]" | "?" | "=" * | "{" | "}" | SP | HT */ static const char tokens[256] = { /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ 0, 0, 0, 0, 0, 0, 0, 0, /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ 0, 0, 0, 0, 0, 0, 0, 0, /* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ 0, 0, 0, 0, 0, 0, 0, 0, /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ 0, 0, 0, 0, 0, 0, 0, 0, /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ 0, '!', 0, '#', '$', '%', '&', '\'', /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ 0, 0, '*', '+', 0, '-', '.', 0, /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ '0', '1', '2', '3', '4', '5', '6', '7', /* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ '8', '9', 0, 0, 0, 0, 0, 0, /* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ 0, 'a', 'b', 'c', 'd', 'e', 'f', 'g', /* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', /* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', /* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ 'x', 'y', 'z', 0, 0, 0, '^', '_', /* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', /* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', /* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', /* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ 'x', 'y', 'z', 0, '|', 0, '~', 0 }; static const int8_t unhex[256] = {-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 , 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,-1,-1,-1,-1,-1,-1 ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,10,11,12,13,14,15,-1,-1,-1,-1,-1,-1,-1,-1,-1 ,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1 }; #if HTTP_PARSER_STRICT # define T 0 #else # define T 1 #endif static const uint8_t normal_url_char[256] = { /* 0 nul 1 soh 2 stx 3 etx 4 eot 5 enq 6 ack 7 bel */ 0, 0, 0, 0, 0, 0, 0, 0, /* 8 bs 9 ht 10 nl 11 vt 12 np 13 cr 14 so 15 si */ 0, T, 0, 0, T, 0, 0, 0, /* 16 dle 17 dc1 18 dc2 19 dc3 20 dc4 21 nak 22 syn 23 etb */ 0, 0, 0, 0, 0, 0, 0, 0, /* 24 can 25 em 26 sub 27 esc 28 fs 29 gs 30 rs 31 us */ 0, 0, 0, 0, 0, 0, 0, 0, /* 32 sp 33 ! 34 " 35 # 36 $ 37 % 38 & 39 ' */ 0, 1, 1, 0, 1, 1, 1, 1, /* 40 ( 41 ) 42 * 43 + 44 , 45 - 46 . 47 / */ 1, 1, 1, 1, 1, 1, 1, 1, /* 48 0 49 1 50 2 51 3 52 4 53 5 54 6 55 7 */ 1, 1, 1, 1, 1, 1, 1, 1, /* 56 8 57 9 58 : 59 ; 60 < 61 = 62 > 63 ? */ 1, 1, 1, 1, 1, 1, 1, 0, /* 64 @ 65 A 66 B 67 C 68 D 69 E 70 F 71 G */ 1, 1, 1, 1, 1, 1, 1, 1, /* 72 H 73 I 74 J 75 K 76 L 77 M 78 N 79 O */ 1, 1, 1, 1, 1, 1, 1, 1, /* 80 P 81 Q 82 R 83 S 84 T 85 U 86 V 87 W */ 1, 1, 1, 1, 1, 1, 1, 1, /* 88 X 89 Y 90 Z 91 [ 92 \ 93 ] 94 ^ 95 _ */ 1, 1, 1, 1, 1, 1, 1, 1, /* 96 ` 97 a 98 b 99 c 100 d 101 e 102 f 103 g */ 1, 1, 1, 1, 1, 1, 1, 1, /* 104 h 105 i 106 j 107 k 108 l 109 m 110 n 111 o */ 1, 1, 1, 1, 1, 1, 1, 1, /* 112 p 113 q 114 r 115 s 116 t 117 u 118 v 119 w */ 1, 1, 1, 1, 1, 1, 1, 1, /* 120 x 121 y 122 z 123 { 124 | 125 } 126 ~ 127 del */ 1, 1, 1, 1, 1, 1, 1, 0, }; #undef T enum state { s_dead = 1 /* important that this is > 0 */ , s_start_req_or_res , s_res_or_resp_H , s_start_res , s_res_H , s_res_HT , s_res_HTT , s_res_HTTP , s_res_first_http_major , s_res_http_major , s_res_first_http_minor , s_res_http_minor , s_res_first_status_code , s_res_status_code , s_res_status , s_res_line_almost_done , s_start_req , s_req_method , s_req_spaces_before_url , s_req_schema , s_req_schema_slash , s_req_schema_slash_slash , s_req_host_start , s_req_host_v6_start , s_req_host_v6 , s_req_host_v6_end , s_req_host , s_req_port_start , s_req_port , s_req_path , s_req_query_string_start , s_req_query_string , s_req_fragment_start , s_req_fragment , s_req_http_start , s_req_http_H , s_req_http_HT , s_req_http_HTT , s_req_http_HTTP , s_req_first_http_major , s_req_http_major , s_req_first_http_minor , s_req_http_minor , s_req_line_almost_done , s_header_field_start , s_header_field , s_header_value_start , s_header_value , s_header_value_lws , s_header_almost_done , s_chunk_size_start , s_chunk_size , s_chunk_parameters , s_chunk_size_almost_done , s_headers_almost_done , s_headers_done /* Important: 's_headers_done' must be the last 'header' state. All * states beyond this must be 'body' states. It is used for overflow * checking. See the PARSING_HEADER() macro. */ , s_chunk_data , s_chunk_data_almost_done , s_chunk_data_done , s_body_identity , s_body_identity_eof , s_message_done }; #define PARSING_HEADER(state) (state <= s_headers_done) enum header_states { h_general = 0 , h_C , h_CO , h_CON , h_matching_connection , h_matching_proxy_connection , h_matching_content_length , h_matching_transfer_encoding , h_matching_upgrade , h_connection , h_content_length , h_transfer_encoding , h_upgrade , h_matching_transfer_encoding_chunked , h_matching_connection_keep_alive , h_matching_connection_close , h_transfer_encoding_chunked , h_connection_keep_alive , h_connection_close }; /* Macros for character classes; depends on strict-mode */ #define CR '\r' #define LF '\n' #define LOWER(c) (unsigned char)(c | 0x20) #define IS_ALPHA(c) (LOWER(c) >= 'a' && LOWER(c) <= 'z') #define IS_NUM(c) ((c) >= '0' && (c) <= '9') #define IS_ALPHANUM(c) (IS_ALPHA(c) || IS_NUM(c)) #define IS_HEX(c) (IS_NUM(c) || (LOWER(c) >= 'a' && LOWER(c) <= 'f')) #if HTTP_PARSER_STRICT #define TOKEN(c) (tokens[(unsigned char)c]) #define IS_URL_CHAR(c) (normal_url_char[(unsigned char) (c)]) #define IS_HOST_CHAR(c) (IS_ALPHANUM(c) || (c) == '.' || (c) == '-') #else #define TOKEN(c) ((c == ' ') ? ' ' : tokens[(unsigned char)c]) #define IS_URL_CHAR(c) \ (normal_url_char[(unsigned char) (c)] || ((c) & 0x80)) #define IS_HOST_CHAR(c) \ (IS_ALPHANUM(c) || (c) == '.' || (c) == '-' || (c) == '_') #endif #define start_state (parser->type == HTTP_REQUEST ? s_start_req : s_start_res) #if HTTP_PARSER_STRICT # define STRICT_CHECK(cond) \ do { \ if (cond) { \ SET_ERRNO(HPE_STRICT); \ goto error; \ } \ } while (0) # define NEW_MESSAGE() (http_should_keep_alive(parser) ? start_state : s_dead) #else # define STRICT_CHECK(cond) # define NEW_MESSAGE() start_state #endif /* Map errno values to strings for human-readable output */ #define HTTP_STRERROR_GEN(n, s) { "HPE_" #n, s }, static struct { const char *name; const char *description; } http_strerror_tab[] = { HTTP_ERRNO_MAP(HTTP_STRERROR_GEN) }; #undef HTTP_STRERROR_GEN int http_message_needs_eof(http_parser *parser); /* Our URL parser. * * This is designed to be shared by http_parser_execute() for URL validation, * hence it has a state transition + byte-for-byte interface. In addition, it * is meant to be embedded in http_parser_parse_url(), which does the dirty * work of turning state transitions URL components for its API. * * This function should only be invoked with non-space characters. It is * assumed that the caller cares about (and can detect) the transition between * URL and non-URL states by looking for these. */ static enum state parse_url_char(enum state s, const char ch) { if (ch == ' ' || ch == '\r' || ch == '\n') { return s_dead; } #if HTTP_PARSER_STRICT if (ch == '\t' || ch == '\f') { return s_dead; } #endif switch (s) { case s_req_spaces_before_url: /* Proxied requests are followed by scheme of an absolute URI (alpha). * All methods except CONNECT are followed by '/' or '*'. */ if (ch == '/' || ch == '*') { return s_req_path; } if (IS_ALPHA(ch)) { return s_req_schema; } break; case s_req_schema: if (IS_ALPHA(ch)) { return s; } if (ch == ':') { return s_req_schema_slash; } break; case s_req_schema_slash: if (ch == '/') { return s_req_schema_slash_slash; } break; case s_req_schema_slash_slash: if (ch == '/') { return s_req_host_start; } break; case s_req_host_start: if (ch == '[') { return s_req_host_v6_start; } if (IS_HOST_CHAR(ch)) { return s_req_host; } break; case s_req_host: if (IS_HOST_CHAR(ch)) { return s_req_host; } /* FALLTHROUGH */ case s_req_host_v6_end: switch (ch) { case ':': return s_req_port_start; case '/': return s_req_path; case '?': return s_req_query_string_start; } break; case s_req_host_v6: if (ch == ']') { return s_req_host_v6_end; } /* FALLTHROUGH */ case s_req_host_v6_start: if (IS_HEX(ch) || ch == ':') { return s_req_host_v6; } break; case s_req_port: switch (ch) { case '/': return s_req_path; case '?': return s_req_query_string_start; } /* FALLTHROUGH */ case s_req_port_start: if (IS_NUM(ch)) { return s_req_port; } break; case s_req_path: if (IS_URL_CHAR(ch)) { return s; } switch (ch) { case '?': return s_req_query_string_start; case '#': return s_req_fragment_start; } break; case s_req_query_string_start: case s_req_query_string: if (IS_URL_CHAR(ch)) { return s_req_query_string; } switch (ch) { case '?': /* allow extra '?' in query string */ return s_req_query_string; case '#': return s_req_fragment_start; } break; case s_req_fragment_start: if (IS_URL_CHAR(ch)) { return s_req_fragment; } switch (ch) { case '?': return s_req_fragment; case '#': return s; } break; case s_req_fragment: if (IS_URL_CHAR(ch)) { return s; } switch (ch) { case '?': case '#': return s; } break; default: break; } /* We should never fall out of the switch above unless there's an error */ return s_dead; } size_t http_parser_execute (http_parser *parser, const http_parser_settings *settings, const char *data, size_t len) { char c, ch; int8_t unhex_val; const char *p = data; const char *header_field_mark = 0; const char *header_value_mark = 0; const char *url_mark = 0; const char *body_mark = 0; /* We're in an error state. Don't bother doing anything. */ if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { return 0; } if (len == 0) { switch (parser->state) { case s_body_identity_eof: /* Use of CALLBACK_NOTIFY() here would erroneously return 1 byte read if * we got paused. */ CALLBACK_NOTIFY_NOADVANCE(message_complete); return 0; case s_dead: case s_start_req_or_res: case s_start_res: case s_start_req: return 0; default: SET_ERRNO(HPE_INVALID_EOF_STATE); return 1; } } if (parser->state == s_header_field) header_field_mark = data; if (parser->state == s_header_value) header_value_mark = data; switch (parser->state) { case s_req_path: case s_req_schema: case s_req_schema_slash: case s_req_schema_slash_slash: case s_req_host_start: case s_req_host_v6_start: case s_req_host_v6: case s_req_host_v6_end: case s_req_host: case s_req_port_start: case s_req_port: case s_req_query_string_start: case s_req_query_string: case s_req_fragment_start: case s_req_fragment: url_mark = data; break; } for (p=data; p != data + len; p++) { ch = *p; if (PARSING_HEADER(parser->state)) { ++parser->nread; /* Buffer overflow attack */ if (parser->nread > HTTP_MAX_HEADER_SIZE) { SET_ERRNO(HPE_HEADER_OVERFLOW); goto error; } } reexecute_byte: switch (parser->state) { case s_dead: /* this state is used after a 'Connection: close' message * the parser will error out if it reads another message */ if (ch == CR || ch == LF) break; SET_ERRNO(HPE_CLOSED_CONNECTION); goto error; case s_start_req_or_res: { if (ch == CR || ch == LF) break; parser->flags = 0; parser->content_length = ULLONG_MAX; if (ch == 'H') { parser->state = s_res_or_resp_H; CALLBACK_NOTIFY(message_begin); } else { parser->type = HTTP_REQUEST; parser->state = s_start_req; goto reexecute_byte; } break; } case s_res_or_resp_H: if (ch == 'T') { parser->type = HTTP_RESPONSE; parser->state = s_res_HT; } else { if (ch != 'E') { SET_ERRNO(HPE_INVALID_CONSTANT); goto error; } parser->type = HTTP_REQUEST; parser->method = HTTP_HEAD; parser->index = 2; parser->state = s_req_method; } break; case s_start_res: { parser->flags = 0; parser->content_length = ULLONG_MAX; switch (ch) { case 'H': parser->state = s_res_H; break; case CR: case LF: break; default: SET_ERRNO(HPE_INVALID_CONSTANT); goto error; } CALLBACK_NOTIFY(message_begin); break; } case s_res_H: STRICT_CHECK(ch != 'T'); parser->state = s_res_HT; break; case s_res_HT: STRICT_CHECK(ch != 'T'); parser->state = s_res_HTT; break; case s_res_HTT: STRICT_CHECK(ch != 'P'); parser->state = s_res_HTTP; break; case s_res_HTTP: STRICT_CHECK(ch != '/'); parser->state = s_res_first_http_major; break; case s_res_first_http_major: if (ch < '0' || ch > '9') { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_major = ch - '0'; parser->state = s_res_http_major; break; /* major HTTP version or dot */ case s_res_http_major: { if (ch == '.') { parser->state = s_res_first_http_minor; break; } if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_major *= 10; parser->http_major += ch - '0'; if (parser->http_major > 999) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } break; } /* first digit of minor HTTP version */ case s_res_first_http_minor: if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_minor = ch - '0'; parser->state = s_res_http_minor; break; /* minor HTTP version or end of request line */ case s_res_http_minor: { if (ch == ' ') { parser->state = s_res_first_status_code; break; } if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_minor *= 10; parser->http_minor += ch - '0'; if (parser->http_minor > 999) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } break; } case s_res_first_status_code: { if (!IS_NUM(ch)) { if (ch == ' ') { break; } SET_ERRNO(HPE_INVALID_STATUS); goto error; } parser->status_code = ch - '0'; parser->state = s_res_status_code; break; } case s_res_status_code: { if (!IS_NUM(ch)) { switch (ch) { case ' ': parser->state = s_res_status; break; case CR: parser->state = s_res_line_almost_done; break; case LF: parser->state = s_header_field_start; break; default: SET_ERRNO(HPE_INVALID_STATUS); goto error; } break; } parser->status_code *= 10; parser->status_code += ch - '0'; if (parser->status_code > 999) { SET_ERRNO(HPE_INVALID_STATUS); goto error; } break; } case s_res_status: /* the human readable status. e.g. "NOT FOUND" * we are not humans so just ignore this */ if (ch == CR) { parser->state = s_res_line_almost_done; break; } if (ch == LF) { parser->state = s_header_field_start; break; } break; case s_res_line_almost_done: STRICT_CHECK(ch != LF); parser->state = s_header_field_start; break; case s_start_req: { if (ch == CR || ch == LF) break; parser->flags = 0; parser->content_length = ULLONG_MAX; if (!IS_ALPHA(ch)) { SET_ERRNO(HPE_INVALID_METHOD); goto error; } parser->method = (enum http_method) 0; parser->index = 1; switch (ch) { case 'C': parser->method = HTTP_CONNECT; /* or COPY, CHECKOUT */ break; case 'D': parser->method = HTTP_DELETE; break; case 'G': parser->method = HTTP_GET; break; case 'H': parser->method = HTTP_HEAD; break; case 'L': parser->method = HTTP_LOCK; break; case 'M': parser->method = HTTP_MKCOL; /* or MOVE, MKACTIVITY, MERGE, M-SEARCH */ break; case 'N': parser->method = HTTP_NOTIFY; break; case 'O': parser->method = HTTP_OPTIONS; break; case 'P': parser->method = HTTP_POST; /* or PROPFIND|PROPPATCH|PUT|PATCH|PURGE */ break; case 'R': parser->method = HTTP_REPORT; break; case 'S': parser->method = HTTP_SUBSCRIBE; /* or SEARCH */ break; case 'T': parser->method = HTTP_TRACE; break; case 'U': parser->method = HTTP_UNLOCK; /* or UNSUBSCRIBE */ break; default: SET_ERRNO(HPE_INVALID_METHOD); goto error; } parser->state = s_req_method; CALLBACK_NOTIFY(message_begin); break; } case s_req_method: { const char *matcher; if (ch == '\0') { SET_ERRNO(HPE_INVALID_METHOD); goto error; } matcher = method_strings[parser->method]; if (ch == ' ' && matcher[parser->index] == '\0') { parser->state = s_req_spaces_before_url; } else if (ch == matcher[parser->index]) { ; /* nada */ } else if (parser->method == HTTP_CONNECT) { if (parser->index == 1 && ch == 'H') { parser->method = HTTP_CHECKOUT; } else if (parser->index == 2 && ch == 'P') { parser->method = HTTP_COPY; } else { goto error; } } else if (parser->method == HTTP_MKCOL) { if (parser->index == 1 && ch == 'O') { parser->method = HTTP_MOVE; } else if (parser->index == 1 && ch == 'E') { parser->method = HTTP_MERGE; } else if (parser->index == 1 && ch == '-') { parser->method = HTTP_MSEARCH; } else if (parser->index == 2 && ch == 'A') { parser->method = HTTP_MKACTIVITY; } else { goto error; } } else if (parser->method == HTTP_SUBSCRIBE) { if (parser->index == 1 && ch == 'E') { parser->method = HTTP_SEARCH; } else { goto error; } } else if (parser->index == 1 && parser->method == HTTP_POST) { if (ch == 'R') { parser->method = HTTP_PROPFIND; /* or HTTP_PROPPATCH */ } else if (ch == 'U') { parser->method = HTTP_PUT; /* or HTTP_PURGE */ } else if (ch == 'A') { parser->method = HTTP_PATCH; } else { goto error; } } else if (parser->index == 2) { if (parser->method == HTTP_PUT) { if (ch == 'R') parser->method = HTTP_PURGE; } else if (parser->method == HTTP_UNLOCK) { if (ch == 'S') parser->method = HTTP_UNSUBSCRIBE; } } else if (parser->index == 4 && parser->method == HTTP_PROPFIND && ch == 'P') { parser->method = HTTP_PROPPATCH; } else { SET_ERRNO(HPE_INVALID_METHOD); goto error; } ++parser->index; break; } case s_req_spaces_before_url: { if (ch == ' ') break; MARK(url); if (parser->method == HTTP_CONNECT) { parser->state = s_req_host_start; } parser->state = parse_url_char((enum state)parser->state, ch); if (parser->state == s_dead) { SET_ERRNO(HPE_INVALID_URL); goto error; } break; } case s_req_schema: case s_req_schema_slash: case s_req_schema_slash_slash: case s_req_host_start: case s_req_host_v6_start: case s_req_host_v6: case s_req_port_start: { switch (ch) { /* No whitespace allowed here */ case ' ': case CR: case LF: SET_ERRNO(HPE_INVALID_URL); goto error; default: parser->state = parse_url_char((enum state)parser->state, ch); if (parser->state == s_dead) { SET_ERRNO(HPE_INVALID_URL); goto error; } } break; } case s_req_host: case s_req_host_v6_end: case s_req_port: case s_req_path: case s_req_query_string_start: case s_req_query_string: case s_req_fragment_start: case s_req_fragment: { switch (ch) { case ' ': parser->state = s_req_http_start; CALLBACK_DATA(url); break; case CR: case LF: parser->http_major = 0; parser->http_minor = 9; parser->state = (ch == CR) ? s_req_line_almost_done : s_header_field_start; CALLBACK_DATA(url); break; default: parser->state = parse_url_char((enum state)parser->state, ch); if (parser->state == s_dead) { SET_ERRNO(HPE_INVALID_URL); goto error; } } break; } case s_req_http_start: switch (ch) { case 'H': parser->state = s_req_http_H; break; case ' ': break; default: SET_ERRNO(HPE_INVALID_CONSTANT); goto error; } break; case s_req_http_H: STRICT_CHECK(ch != 'T'); parser->state = s_req_http_HT; break; case s_req_http_HT: STRICT_CHECK(ch != 'T'); parser->state = s_req_http_HTT; break; case s_req_http_HTT: STRICT_CHECK(ch != 'P'); parser->state = s_req_http_HTTP; break; case s_req_http_HTTP: STRICT_CHECK(ch != '/'); parser->state = s_req_first_http_major; break; /* first digit of major HTTP version */ case s_req_first_http_major: if (ch < '1' || ch > '9') { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_major = ch - '0'; parser->state = s_req_http_major; break; /* major HTTP version or dot */ case s_req_http_major: { if (ch == '.') { parser->state = s_req_first_http_minor; break; } if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_major *= 10; parser->http_major += ch - '0'; if (parser->http_major > 999) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } break; } /* first digit of minor HTTP version */ case s_req_first_http_minor: if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_minor = ch - '0'; parser->state = s_req_http_minor; break; /* minor HTTP version or end of request line */ case s_req_http_minor: { if (ch == CR) { parser->state = s_req_line_almost_done; break; } if (ch == LF) { parser->state = s_header_field_start; break; } /* XXX allow spaces after digit? */ if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } parser->http_minor *= 10; parser->http_minor += ch - '0'; if (parser->http_minor > 999) { SET_ERRNO(HPE_INVALID_VERSION); goto error; } break; } /* end of request line */ case s_req_line_almost_done: { if (ch != LF) { SET_ERRNO(HPE_LF_EXPECTED); goto error; } parser->state = s_header_field_start; break; } case s_header_field_start: { if (ch == CR) { parser->state = s_headers_almost_done; break; } if (ch == LF) { /* they might be just sending \n instead of \r\n so this would be * the second \n to denote the end of headers*/ parser->state = s_headers_almost_done; goto reexecute_byte; } c = TOKEN(ch); if (!c) { SET_ERRNO(HPE_INVALID_HEADER_TOKEN); goto error; } MARK(header_field); parser->index = 0; parser->state = s_header_field; switch (c) { case 'c': parser->header_state = h_C; break; case 'p': parser->header_state = h_matching_proxy_connection; break; case 't': parser->header_state = h_matching_transfer_encoding; break; case 'u': parser->header_state = h_matching_upgrade; break; default: parser->header_state = h_general; break; } break; } case s_header_field: { c = TOKEN(ch); if (c) { switch (parser->header_state) { case h_general: break; case h_C: parser->index++; parser->header_state = (c == 'o' ? h_CO : h_general); break; case h_CO: parser->index++; parser->header_state = (c == 'n' ? h_CON : h_general); break; case h_CON: parser->index++; switch (c) { case 'n': parser->header_state = h_matching_connection; break; case 't': parser->header_state = h_matching_content_length; break; default: parser->header_state = h_general; break; } break; /* connection */ case h_matching_connection: parser->index++; if (parser->index > sizeof(CONNECTION)-1 || c != CONNECTION[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(CONNECTION)-2) { parser->header_state = h_connection; } break; /* proxy-connection */ case h_matching_proxy_connection: parser->index++; if (parser->index > sizeof(PROXY_CONNECTION)-1 || c != PROXY_CONNECTION[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(PROXY_CONNECTION)-2) { parser->header_state = h_connection; } break; /* content-length */ case h_matching_content_length: parser->index++; if (parser->index > sizeof(CONTENT_LENGTH)-1 || c != CONTENT_LENGTH[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(CONTENT_LENGTH)-2) { parser->header_state = h_content_length; } break; /* transfer-encoding */ case h_matching_transfer_encoding: parser->index++; if (parser->index > sizeof(TRANSFER_ENCODING)-1 || c != TRANSFER_ENCODING[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(TRANSFER_ENCODING)-2) { parser->header_state = h_transfer_encoding; } break; /* upgrade */ case h_matching_upgrade: parser->index++; if (parser->index > sizeof(UPGRADE)-1 || c != UPGRADE[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(UPGRADE)-2) { parser->header_state = h_upgrade; } break; case h_connection: case h_content_length: case h_transfer_encoding: case h_upgrade: if (ch != ' ') parser->header_state = h_general; break; default: assert(0 && "Unknown header_state"); break; } break; } if (ch == ':') { parser->state = s_header_value_start; CALLBACK_DATA(header_field); break; } if (ch == CR) { parser->state = s_header_almost_done; CALLBACK_DATA(header_field); break; } if (ch == LF) { parser->state = s_header_field_start; CALLBACK_DATA(header_field); break; } SET_ERRNO(HPE_INVALID_HEADER_TOKEN); goto error; } case s_header_value_start: { if (ch == ' ' || ch == '\t') break; MARK(header_value); parser->state = s_header_value; parser->index = 0; if (ch == CR) { parser->header_state = h_general; parser->state = s_header_almost_done; CALLBACK_DATA(header_value); break; } if (ch == LF) { parser->state = s_header_field_start; CALLBACK_DATA(header_value); break; } c = LOWER(ch); switch (parser->header_state) { case h_upgrade: parser->flags |= F_UPGRADE; parser->header_state = h_general; break; case h_transfer_encoding: /* looking for 'Transfer-Encoding: chunked' */ if ('c' == c) { parser->header_state = h_matching_transfer_encoding_chunked; } else { parser->header_state = h_general; } break; case h_content_length: if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); goto error; } parser->content_length = ch - '0'; break; case h_connection: /* looking for 'Connection: keep-alive' */ if (c == 'k') { parser->header_state = h_matching_connection_keep_alive; /* looking for 'Connection: close' */ } else if (c == 'c') { parser->header_state = h_matching_connection_close; } else { parser->header_state = h_general; } break; default: parser->header_state = h_general; break; } break; } case s_header_value: { if (ch == CR) { parser->state = s_header_almost_done; CALLBACK_DATA(header_value); break; } if (ch == LF) { parser->state = s_header_almost_done; CALLBACK_DATA_NOADVANCE(header_value); goto reexecute_byte; } c = LOWER(ch); switch (parser->header_state) { case h_general: break; case h_connection: case h_transfer_encoding: assert(0 && "Shouldn't get here."); break; case h_content_length: { uint64_t t; if (ch == ' ') break; if (!IS_NUM(ch)) { SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); goto error; } t = parser->content_length; t *= 10; t += ch - '0'; /* Overflow? */ if (t < parser->content_length || t == ULLONG_MAX) { SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); goto error; } parser->content_length = t; break; } /* Transfer-Encoding: chunked */ case h_matching_transfer_encoding_chunked: parser->index++; if (parser->index > sizeof(CHUNKED)-1 || c != CHUNKED[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(CHUNKED)-2) { parser->header_state = h_transfer_encoding_chunked; } break; /* looking for 'Connection: keep-alive' */ case h_matching_connection_keep_alive: parser->index++; if (parser->index > sizeof(KEEP_ALIVE)-1 || c != KEEP_ALIVE[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(KEEP_ALIVE)-2) { parser->header_state = h_connection_keep_alive; } break; /* looking for 'Connection: close' */ case h_matching_connection_close: parser->index++; if (parser->index > sizeof(CLOSE)-1 || c != CLOSE[parser->index]) { parser->header_state = h_general; } else if (parser->index == sizeof(CLOSE)-2) { parser->header_state = h_connection_close; } break; case h_transfer_encoding_chunked: case h_connection_keep_alive: case h_connection_close: if (ch != ' ') parser->header_state = h_general; break; default: parser->state = s_header_value; parser->header_state = h_general; break; } break; } case s_header_almost_done: { STRICT_CHECK(ch != LF); parser->state = s_header_value_lws; switch (parser->header_state) { case h_connection_keep_alive: parser->flags |= F_CONNECTION_KEEP_ALIVE; break; case h_connection_close: parser->flags |= F_CONNECTION_CLOSE; break; case h_transfer_encoding_chunked: parser->flags |= F_CHUNKED; break; default: break; } break; } case s_header_value_lws: { if (ch == ' ' || ch == '\t') parser->state = s_header_value_start; else { parser->state = s_header_field_start; goto reexecute_byte; } break; } case s_headers_almost_done: { STRICT_CHECK(ch != LF); if (parser->flags & F_TRAILING) { /* End of a chunked request */ parser->state = NEW_MESSAGE(); CALLBACK_NOTIFY(message_complete); break; } parser->state = s_headers_done; /* Set this here so that on_headers_complete() callbacks can see it */ parser->upgrade = (parser->flags & F_UPGRADE || parser->method == HTTP_CONNECT); /* Here we call the headers_complete callback. This is somewhat * different than other callbacks because if the user returns 1, we * will interpret that as saying that this message has no body. This * is needed for the annoying case of recieving a response to a HEAD * request. * * We'd like to use CALLBACK_NOTIFY_NOADVANCE() here but we cannot, so * we have to simulate it by handling a change in errno below. */ if (settings->on_headers_complete) { switch (settings->on_headers_complete(parser)) { case 0: break; case 1: parser->flags |= F_SKIPBODY; break; default: SET_ERRNO(HPE_CB_headers_complete); return p - data; /* Error */ } } if (HTTP_PARSER_ERRNO(parser) != HPE_OK) { return p - data; } goto reexecute_byte; } case s_headers_done: { STRICT_CHECK(ch != LF); parser->nread = 0; /* Exit, the rest of the connect is in a different protocol. */ if (parser->upgrade) { parser->state = NEW_MESSAGE(); CALLBACK_NOTIFY(message_complete); return (p - data) + 1; } if (parser->flags & F_SKIPBODY) { parser->state = NEW_MESSAGE(); CALLBACK_NOTIFY(message_complete); } else if (parser->flags & F_CHUNKED) { /* chunked encoding - ignore Content-Length header */ parser->state = s_chunk_size_start; } else { if (parser->content_length == 0) { /* Content-Length header given but zero: Content-Length: 0\r\n */ parser->state = NEW_MESSAGE(); CALLBACK_NOTIFY(message_complete); } else if (parser->content_length != ULLONG_MAX) { /* Content-Length header given and non-zero */ parser->state = s_body_identity; } else { if (parser->type == HTTP_REQUEST || !http_message_needs_eof(parser)) { /* Assume content-length 0 - read the next */ parser->state = NEW_MESSAGE(); CALLBACK_NOTIFY(message_complete); } else { /* Read body until EOF */ parser->state = s_body_identity_eof; } } } break; } case s_body_identity: { uint64_t to_read = MIN(parser->content_length, (uint64_t) ((data + len) - p)); assert(parser->content_length != 0 && parser->content_length != ULLONG_MAX); /* The difference between advancing content_length and p is because * the latter will automaticaly advance on the next loop iteration. * Further, if content_length ends up at 0, we want to see the last * byte again for our message complete callback. */ MARK(body); parser->content_length -= to_read; p += to_read - 1; if (parser->content_length == 0) { parser->state = s_message_done; /* Mimic CALLBACK_DATA_NOADVANCE() but with one extra byte. * * The alternative to doing this is to wait for the next byte to * trigger the data callback, just as in every other case. The * problem with this is that this makes it difficult for the test * harness to distinguish between complete-on-EOF and * complete-on-length. It's not clear that this distinction is * important for applications, but let's keep it for now. */ CALLBACK_DATA_(body, p - body_mark + 1, p - data); goto reexecute_byte; } break; } /* read until EOF */ case s_body_identity_eof: MARK(body); p = data + len - 1; break; case s_message_done: parser->state = NEW_MESSAGE(); CALLBACK_NOTIFY(message_complete); break; case s_chunk_size_start: { assert(parser->nread == 1); assert(parser->flags & F_CHUNKED); unhex_val = unhex[(unsigned char)ch]; if (unhex_val == -1) { SET_ERRNO(HPE_INVALID_CHUNK_SIZE); goto error; } parser->content_length = unhex_val; parser->state = s_chunk_size; break; } case s_chunk_size: { uint64_t t; assert(parser->flags & F_CHUNKED); if (ch == CR) { parser->state = s_chunk_size_almost_done; break; } unhex_val = unhex[(unsigned char)ch]; if (unhex_val == -1) { if (ch == ';' || ch == ' ') { parser->state = s_chunk_parameters; break; } SET_ERRNO(HPE_INVALID_CHUNK_SIZE); goto error; } t = parser->content_length; t *= 16; t += unhex_val; /* Overflow? */ if (t < parser->content_length || t == ULLONG_MAX) { SET_ERRNO(HPE_INVALID_CONTENT_LENGTH); goto error; } parser->content_length = t; break; } case s_chunk_parameters: { assert(parser->flags & F_CHUNKED); /* just ignore this shit. TODO check for overflow */ if (ch == CR) { parser->state = s_chunk_size_almost_done; break; } break; } case s_chunk_size_almost_done: { assert(parser->flags & F_CHUNKED); STRICT_CHECK(ch != LF); parser->nread = 0; if (parser->content_length == 0) { parser->flags |= F_TRAILING; parser->state = s_header_field_start; } else { parser->state = s_chunk_data; } break; } case s_chunk_data: { uint64_t to_read = MIN(parser->content_length, (uint64_t) ((data + len) - p)); assert(parser->flags & F_CHUNKED); assert(parser->content_length != 0 && parser->content_length != ULLONG_MAX); /* See the explanation in s_body_identity for why the content * length and data pointers are managed this way. */ MARK(body); parser->content_length -= to_read; p += to_read - 1; if (parser->content_length == 0) { parser->state = s_chunk_data_almost_done; } break; } case s_chunk_data_almost_done: assert(parser->flags & F_CHUNKED); assert(parser->content_length == 0); STRICT_CHECK(ch != CR); parser->state = s_chunk_data_done; CALLBACK_DATA(body); break; case s_chunk_data_done: assert(parser->flags & F_CHUNKED); STRICT_CHECK(ch != LF); parser->nread = 0; parser->state = s_chunk_size_start; break; default: assert(0 && "unhandled state"); SET_ERRNO(HPE_INVALID_INTERNAL_STATE); goto error; } } /* Run callbacks for any marks that we have leftover after we ran our of * bytes. There should be at most one of these set, so it's OK to invoke * them in series (unset marks will not result in callbacks). * * We use the NOADVANCE() variety of callbacks here because 'p' has already * overflowed 'data' and this allows us to correct for the off-by-one that * we'd otherwise have (since CALLBACK_DATA() is meant to be run with a 'p' * value that's in-bounds). */ assert(((header_field_mark ? 1 : 0) + (header_value_mark ? 1 : 0) + (url_mark ? 1 : 0) + (body_mark ? 1 : 0)) <= 1); CALLBACK_DATA_NOADVANCE(header_field); CALLBACK_DATA_NOADVANCE(header_value); CALLBACK_DATA_NOADVANCE(url); CALLBACK_DATA_NOADVANCE(body); return len; error: if (HTTP_PARSER_ERRNO(parser) == HPE_OK) { SET_ERRNO(HPE_UNKNOWN); } return (p - data); } /* Does the parser need to see an EOF to find the end of the message? */ int http_message_needs_eof (http_parser *parser) { if (parser->type == HTTP_REQUEST) { return 0; } /* See RFC 2616 section 4.4 */ if (parser->status_code / 100 == 1 || /* 1xx e.g. Continue */ parser->status_code == 204 || /* No Content */ parser->status_code == 304 || /* Not Modified */ parser->flags & F_SKIPBODY) { /* response to a HEAD request */ return 0; } if ((parser->flags & F_CHUNKED) || parser->content_length != ULLONG_MAX) { return 0; } return 1; } int http_should_keep_alive (http_parser *parser) { if (parser->http_major > 0 && parser->http_minor > 0) { /* HTTP/1.1 */ if (parser->flags & F_CONNECTION_CLOSE) { return 0; } } else { /* HTTP/1.0 or earlier */ if (!(parser->flags & F_CONNECTION_KEEP_ALIVE)) { return 0; } } return !http_message_needs_eof(parser); } const char * http_method_str (enum http_method m) { return method_strings[m]; } void http_parser_init (http_parser *parser, enum http_parser_type t) { void *data = parser->data; /* preserve application data */ memset(parser, 0, sizeof(*parser)); parser->data = data; parser->type = t; parser->state = (t == HTTP_REQUEST ? s_start_req : (t == HTTP_RESPONSE ? s_start_res : s_start_req_or_res)); parser->http_errno = HPE_OK; } const char * http_errno_name(enum http_errno err) { assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); return http_strerror_tab[err].name; } const char * http_errno_description(enum http_errno err) { assert(err < (sizeof(http_strerror_tab)/sizeof(http_strerror_tab[0]))); return http_strerror_tab[err].description; } int http_parser_parse_url(const char *buf, size_t buflen, int is_connect, struct http_parser_url *u) { enum state s; const char *p; enum http_parser_url_fields uf, old_uf; u->port = u->field_set = 0; s = is_connect ? s_req_host_start : s_req_spaces_before_url; uf = old_uf = UF_MAX; for (p = buf; p < buf + buflen; p++) { s = parse_url_char(s, *p); /* Figure out the next field that we're operating on */ switch (s) { case s_dead: return 1; /* Skip delimeters */ case s_req_schema_slash: case s_req_schema_slash_slash: case s_req_host_start: case s_req_host_v6_start: case s_req_host_v6_end: case s_req_port_start: case s_req_query_string_start: case s_req_fragment_start: continue; case s_req_schema: uf = UF_SCHEMA; break; case s_req_host: case s_req_host_v6: uf = UF_HOST; break; case s_req_port: uf = UF_PORT; break; case s_req_path: uf = UF_PATH; break; case s_req_query_string: uf = UF_QUERY; break; case s_req_fragment: uf = UF_FRAGMENT; break; default: assert(!"Unexpected state"); return 1; } /* Nothing's changed; soldier on */ if (uf == old_uf) { u->field_data[uf].len++; continue; } u->field_data[uf].off = p - buf; u->field_data[uf].len = 1; u->field_set |= (1 << uf); old_uf = uf; } /* CONNECT requests can only contain "hostname:port" */ if (is_connect && u->field_set != ((1 << UF_HOST)|(1 << UF_PORT))) { return 1; } /* Make sure we don't end somewhere unexpected */ switch (s) { case s_req_host_v6_start: case s_req_host_v6: case s_req_host_v6_end: case s_req_host: case s_req_port_start: return 1; default: break; } if (u->field_set & (1 << UF_PORT)) { /* Don't bother with endp; we've already validated the string */ unsigned long v = strtoul(buf + u->field_data[UF_PORT].off, NULL, 10); /* Ports have a max value of 2^16 */ if (v > 0xffff) { return 1; } u->port = (uint16_t) v; } return 0; } void http_parser_pause(http_parser *parser, int paused) { /* Users should only be pausing/unpausing a parser that is not in an error * state. In non-debug builds, there's not much that we can do about this * other than ignore it. */ if (HTTP_PARSER_ERRNO(parser) == HPE_OK || HTTP_PARSER_ERRNO(parser) == HPE_PAUSED) { SET_ERRNO((paused) ? HPE_PAUSED : HPE_OK); } else { assert(0 && "Attempting to pause parser in error state"); } } ================================================ FILE: samples/C/http_parser.h ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #ifndef http_parser_h #define http_parser_h #ifdef __cplusplus extern "C" { #endif #define HTTP_PARSER_VERSION_MAJOR 1 #define HTTP_PARSER_VERSION_MINOR 0 #include #if defined(_WIN32) && !defined(__MINGW32__) && (!defined(_MSC_VER) || _MSC_VER<1600) typedef __int8 int8_t; typedef unsigned __int8 uint8_t; typedef __int16 int16_t; typedef unsigned __int16 uint16_t; typedef __int32 int32_t; typedef unsigned __int32 uint32_t; typedef __int64 int64_t; typedef unsigned __int64 uint64_t; typedef unsigned int size_t; typedef int ssize_t; #else #include #endif /* Compile with -DHTTP_PARSER_STRICT=0 to make less checks, but run * faster */ #ifndef HTTP_PARSER_STRICT # define HTTP_PARSER_STRICT 1 #endif /* Compile with -DHTTP_PARSER_DEBUG=1 to add extra debugging information to * the error reporting facility. */ #ifndef HTTP_PARSER_DEBUG # define HTTP_PARSER_DEBUG 0 #endif /* Maximium header size allowed */ #define HTTP_MAX_HEADER_SIZE (80*1024) typedef struct http_parser http_parser; typedef struct http_parser_settings http_parser_settings; /* Callbacks should return non-zero to indicate an error. The parser will * then halt execution. * * The one exception is on_headers_complete. In a HTTP_RESPONSE parser * returning '1' from on_headers_complete will tell the parser that it * should not expect a body. This is used when receiving a response to a * HEAD request which may contain 'Content-Length' or 'Transfer-Encoding: * chunked' headers that indicate the presence of a body. * * http_data_cb does not return data chunks. It will be call arbitrarally * many times for each string. E.G. you might get 10 callbacks for "on_path" * each providing just a few characters more data. */ typedef int (*http_data_cb) (http_parser*, const char *at, size_t length); typedef int (*http_cb) (http_parser*); /* Request Methods */ #define HTTP_METHOD_MAP(XX) \ XX(0, DELETE, DELETE) \ XX(1, GET, GET) \ XX(2, HEAD, HEAD) \ XX(3, POST, POST) \ XX(4, PUT, PUT) \ /* pathological */ \ XX(5, CONNECT, CONNECT) \ XX(6, OPTIONS, OPTIONS) \ XX(7, TRACE, TRACE) \ /* webdav */ \ XX(8, COPY, COPY) \ XX(9, LOCK, LOCK) \ XX(10, MKCOL, MKCOL) \ XX(11, MOVE, MOVE) \ XX(12, PROPFIND, PROPFIND) \ XX(13, PROPPATCH, PROPPATCH) \ XX(14, SEARCH, SEARCH) \ XX(15, UNLOCK, UNLOCK) \ /* subversion */ \ XX(16, REPORT, REPORT) \ XX(17, MKACTIVITY, MKACTIVITY) \ XX(18, CHECKOUT, CHECKOUT) \ XX(19, MERGE, MERGE) \ /* upnp */ \ XX(20, MSEARCH, M-SEARCH) \ XX(21, NOTIFY, NOTIFY) \ XX(22, SUBSCRIBE, SUBSCRIBE) \ XX(23, UNSUBSCRIBE, UNSUBSCRIBE) \ /* RFC-5789 */ \ XX(24, PATCH, PATCH) \ XX(25, PURGE, PURGE) \ enum http_method { #define XX(num, name, string) HTTP_##name = num, HTTP_METHOD_MAP(XX) #undef XX }; enum http_parser_type { HTTP_REQUEST, HTTP_RESPONSE, HTTP_BOTH }; /* Flag values for http_parser.flags field */ enum flags { F_CHUNKED = 1 << 0 , F_CONNECTION_KEEP_ALIVE = 1 << 1 , F_CONNECTION_CLOSE = 1 << 2 , F_TRAILING = 1 << 3 , F_UPGRADE = 1 << 4 , F_SKIPBODY = 1 << 5 }; /* Map for errno-related constants * * The provided argument should be a macro that takes 2 arguments. */ #define HTTP_ERRNO_MAP(XX) \ /* No error */ \ XX(OK, "success") \ \ /* Callback-related errors */ \ XX(CB_message_begin, "the on_message_begin callback failed") \ XX(CB_url, "the on_url callback failed") \ XX(CB_header_field, "the on_header_field callback failed") \ XX(CB_header_value, "the on_header_value callback failed") \ XX(CB_headers_complete, "the on_headers_complete callback failed") \ XX(CB_body, "the on_body callback failed") \ XX(CB_message_complete, "the on_message_complete callback failed") \ \ /* Parsing-related errors */ \ XX(INVALID_EOF_STATE, "stream ended at an unexpected time") \ XX(HEADER_OVERFLOW, \ "too many header bytes seen; overflow detected") \ XX(CLOSED_CONNECTION, \ "data received after completed connection: close message") \ XX(INVALID_VERSION, "invalid HTTP version") \ XX(INVALID_STATUS, "invalid HTTP status code") \ XX(INVALID_METHOD, "invalid HTTP method") \ XX(INVALID_URL, "invalid URL") \ XX(INVALID_HOST, "invalid host") \ XX(INVALID_PORT, "invalid port") \ XX(INVALID_PATH, "invalid path") \ XX(INVALID_QUERY_STRING, "invalid query string") \ XX(INVALID_FRAGMENT, "invalid fragment") \ XX(LF_EXPECTED, "LF character expected") \ XX(INVALID_HEADER_TOKEN, "invalid character in header") \ XX(INVALID_CONTENT_LENGTH, \ "invalid character in content-length header") \ XX(INVALID_CHUNK_SIZE, \ "invalid character in chunk size header") \ XX(INVALID_CONSTANT, "invalid constant string") \ XX(INVALID_INTERNAL_STATE, "encountered unexpected internal state")\ XX(STRICT, "strict mode assertion failed") \ XX(PAUSED, "parser is paused") \ XX(UNKNOWN, "an unknown error occurred") /* Define HPE_* values for each errno value above */ #define HTTP_ERRNO_GEN(n, s) HPE_##n, enum http_errno { HTTP_ERRNO_MAP(HTTP_ERRNO_GEN) }; #undef HTTP_ERRNO_GEN /* Get an http_errno value from an http_parser */ #define HTTP_PARSER_ERRNO(p) ((enum http_errno) (p)->http_errno) /* Get the line number that generated the current error */ #if HTTP_PARSER_DEBUG #define HTTP_PARSER_ERRNO_LINE(p) ((p)->error_lineno) #else #define HTTP_PARSER_ERRNO_LINE(p) 0 #endif struct http_parser { /** PRIVATE **/ unsigned char type : 2; /* enum http_parser_type */ unsigned char flags : 6; /* F_* values from 'flags' enum; semi-public */ unsigned char state; /* enum state from http_parser.c */ unsigned char header_state; /* enum header_state from http_parser.c */ unsigned char index; /* index into current matcher */ uint32_t nread; /* # bytes read in various scenarios */ uint64_t content_length; /* # bytes in body (0 if no Content-Length header) */ /** READ-ONLY **/ unsigned short http_major; unsigned short http_minor; unsigned short status_code; /* responses only */ unsigned char method; /* requests only */ unsigned char http_errno : 7; /* 1 = Upgrade header was present and the parser has exited because of that. * 0 = No upgrade header present. * Should be checked when http_parser_execute() returns in addition to * error checking. */ unsigned char upgrade : 1; #if HTTP_PARSER_DEBUG uint32_t error_lineno; #endif /** PUBLIC **/ void *data; /* A pointer to get hook to the "connection" or "socket" object */ }; struct http_parser_settings { http_cb on_message_begin; http_data_cb on_url; http_data_cb on_header_field; http_data_cb on_header_value; http_cb on_headers_complete; http_data_cb on_body; http_cb on_message_complete; }; enum http_parser_url_fields { UF_SCHEMA = 0 , UF_HOST = 1 , UF_PORT = 2 , UF_PATH = 3 , UF_QUERY = 4 , UF_FRAGMENT = 5 , UF_MAX = 6 }; /* Result structure for http_parser_parse_url(). * * Callers should index into field_data[] with UF_* values iff field_set * has the relevant (1 << UF_*) bit set. As a courtesy to clients (and * because we probably have padding left over), we convert any port to * a uint16_t. */ struct http_parser_url { uint16_t field_set; /* Bitmask of (1 << UF_*) values */ uint16_t port; /* Converted UF_PORT string */ struct { uint16_t off; /* Offset into buffer in which field starts */ uint16_t len; /* Length of run in buffer */ } field_data[UF_MAX]; }; void http_parser_init(http_parser *parser, enum http_parser_type type); size_t http_parser_execute(http_parser *parser, const http_parser_settings *settings, const char *data, size_t len); /* If http_should_keep_alive() in the on_headers_complete or * on_message_complete callback returns true, then this will be should be * the last message on the connection. * If you are the server, respond with the "Connection: close" header. * If you are the client, close the connection. */ int http_should_keep_alive(http_parser *parser); /* Returns a string version of the HTTP method. */ const char *http_method_str(enum http_method m); /* Return a string name of the given error */ const char *http_errno_name(enum http_errno err); /* Return a string description of the given error */ const char *http_errno_description(enum http_errno err); /* Parse a URL; return nonzero on failure */ int http_parser_parse_url(const char *buf, size_t buflen, int is_connect, struct http_parser_url *u); /* Pause or un-pause the parser; a nonzero value pauses */ void http_parser_pause(http_parser *parser, int paused); #ifdef __cplusplus } #endif #endif ================================================ FILE: samples/C/info.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include typedef struct { uint32_t cursor_x; uint32_t cursor_y; uint32_t rows; uint32_t columns; uint32_t tabstop; console_color_t default_color; console_color_t current_color; uint8_t nonblocking; uint8_t reverse_video; uint8_t bold; uint8_t blink; uint8_t underline; uint8_t newline_mode; uint8_t auto_echo; uint8_t handle_backspace; } console_info_t; ================================================ FILE: samples/C/interface.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #include #include typedef struct { console_info_t info; console_filter_t* input_filter; console_filter_t* output_filter; console_driver_t* input_driver; console_driver_t* output_driver; } console_t; console_t* default_console; // Generate raw console, connected to the Display, Keyboard and the // ECMA-48-Filter void console_init(); size_t console_write(console_t* console, const char* buffer, int32_t length); #define console_write2(console, buffer) console_write(console, buffer, strlen(buffer)) size_t console_read(console_t* console, char* buffer, size_t length); size_t console_scroll(console_t* console, int32_t pages); void console_clear(console_t* console); ================================================ FILE: samples/C/ip4.h ================================================ #pragma once /* Copyright © 2011 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #define IP4_TOS_ICMP 0 typedef uint32_t ip4_addr_t; typedef struct { unsigned int hl:4; /* both fields are 4 bits */ unsigned int version:4; uint8_t tos; uint16_t len; uint16_t id; uint16_t off; uint8_t ttl; uint8_t p; uint16_t checksum; ip4_addr_t src; ip4_addr_t dst; } ip4_header_t; typedef struct { uint8_t type; uint8_t code; uint16_t checksum; uint16_t id; uint16_t sequence; } ip4_icmp_header_t; void ip4_receive(net_device_t* origin, net_l2proto_t proto, size_t size, void* raw); ================================================ FILE: samples/C/jni_layer.h ================================================ /* DO NOT EDIT THIS FILE - it is machine generated */ #include /* Header for class jni_JniLayer */ #ifndef _Included_jni_JniLayer #define _Included_jni_JniLayer #ifdef __cplusplus extern "C" { #endif /* * Class: jni_JniLayer * Method: jni_layer_initialize * Signature: ([II)J */ JNIEXPORT jlong JNICALL Java_jni_JniLayer_jni_1layer_1initialize (JNIEnv *, jobject, jintArray, jint, jint); /* * Class: jni_JniLayer * Method: jni_layer_mainloop * Signature: (J)V */ JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1mainloop (JNIEnv *, jobject, jlong); /* * Class: jni_JniLayer * Method: jni_layer_set_button * Signature: (JII)V */ JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1button (JNIEnv *, jobject, jlong, jint, jint); /* * Class: jni_JniLayer * Method: jni_layer_set_analog * Signature: (JIIF)V */ JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1set_1analog (JNIEnv *, jobject, jlong, jint, jint, jfloat); /* * Class: jni_JniLayer * Method: jni_layer_report_analog_chg * Signature: (JI)V */ JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1report_1analog_1chg (JNIEnv *, jobject, jlong, jint); /* * Class: jni_JniLayer * Method: jni_layer_kill * Signature: (J)V */ JNIEXPORT void JNICALL Java_jni_JniLayer_jni_1layer_1kill (JNIEnv *, jobject, jlong); #ifdef __cplusplus } #endif #endif ================================================ FILE: samples/C/markdown.c ================================================ /* markdown.c - generic markdown parser */ /* * Copyright (c) 2009, Natacha Porté * Copyright (c) 2011, Vicent Marti * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ #include "markdown.h" #include "stack.h" #include #include #include #include #if defined(_WIN32) #define strncasecmp _strnicmp #endif #define REF_TABLE_SIZE 8 #define BUFFER_BLOCK 0 #define BUFFER_SPAN 1 #define MKD_LI_END 8 /* internal list flag */ #define gperf_case_strncmp(s1, s2, n) strncasecmp(s1, s2, n) #define GPERF_DOWNCASE 1 #define GPERF_CASE_STRNCMP 1 #include "html_blocks.h" /*************** * LOCAL TYPES * ***************/ /* link_ref: reference to a link */ struct link_ref { unsigned int id; struct buf *link; struct buf *title; struct link_ref *next; }; /* char_trigger: function pointer to render active chars */ /* returns the number of chars taken care of */ /* data is the pointer of the beginning of the span */ /* offset is the number of valid chars before data */ struct sd_markdown; typedef size_t (*char_trigger)(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); static size_t char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size); enum markdown_char_t { MD_CHAR_NONE = 0, MD_CHAR_EMPHASIS, MD_CHAR_CODESPAN, MD_CHAR_LINEBREAK, MD_CHAR_LINK, MD_CHAR_LANGLE, MD_CHAR_ESCAPE, MD_CHAR_ENTITITY, MD_CHAR_AUTOLINK_URL, MD_CHAR_AUTOLINK_EMAIL, MD_CHAR_AUTOLINK_WWW, MD_CHAR_SUPERSCRIPT, }; static char_trigger markdown_char_ptrs[] = { NULL, &char_emphasis, &char_codespan, &char_linebreak, &char_link, &char_langle_tag, &char_escape, &char_entity, &char_autolink_url, &char_autolink_email, &char_autolink_www, &char_superscript, }; /* render • structure containing one particular render */ struct sd_markdown { struct sd_callbacks cb; void *opaque; struct link_ref *refs[REF_TABLE_SIZE]; uint8_t active_char[256]; struct stack work_bufs[2]; unsigned int ext_flags; size_t max_nesting; int in_link_body; }; /*************************** * HELPER FUNCTIONS * ***************************/ static inline struct buf * rndr_newbuf(struct sd_markdown *rndr, int type) { static const size_t buf_size[2] = {256, 64}; struct buf *work = NULL; struct stack *pool = &rndr->work_bufs[type]; if (pool->size < pool->asize && pool->item[pool->size] != NULL) { work = pool->item[pool->size++]; work->size = 0; } else { work = bufnew(buf_size[type]); stack_push(pool, work); } return work; } static inline void rndr_popbuf(struct sd_markdown *rndr, int type) { rndr->work_bufs[type].size--; } static void unscape_text(struct buf *ob, struct buf *src) { size_t i = 0, org; while (i < src->size) { org = i; while (i < src->size && src->data[i] != '\\') i++; if (i > org) bufput(ob, src->data + org, i - org); if (i + 1 >= src->size) break; bufputc(ob, src->data[i + 1]); i += 2; } } static unsigned int hash_link_ref(const uint8_t *link_ref, size_t length) { size_t i; unsigned int hash = 0; for (i = 0; i < length; ++i) hash = tolower(link_ref[i]) + (hash << 6) + (hash << 16) - hash; return hash; } static struct link_ref * add_link_ref( struct link_ref **references, const uint8_t *name, size_t name_size) { struct link_ref *ref = calloc(1, sizeof(struct link_ref)); if (!ref) return NULL; ref->id = hash_link_ref(name, name_size); ref->next = references[ref->id % REF_TABLE_SIZE]; references[ref->id % REF_TABLE_SIZE] = ref; return ref; } static struct link_ref * find_link_ref(struct link_ref **references, uint8_t *name, size_t length) { unsigned int hash = hash_link_ref(name, length); struct link_ref *ref = NULL; ref = references[hash % REF_TABLE_SIZE]; while (ref != NULL) { if (ref->id == hash) return ref; ref = ref->next; } return NULL; } static void free_link_refs(struct link_ref **references) { size_t i; for (i = 0; i < REF_TABLE_SIZE; ++i) { struct link_ref *r = references[i]; struct link_ref *next; while (r) { next = r->next; bufrelease(r->link); bufrelease(r->title); free(r); r = next; } } } /* * Check whether a char is a Markdown space. * Right now we only consider spaces the actual * space and a newline: tabs and carriage returns * are filtered out during the preprocessing phase. * * If we wanted to actually be UTF-8 compliant, we * should instead extract an Unicode codepoint from * this character and check for space properties. */ static inline int _isspace(int c) { return c == ' ' || c == '\n'; } /**************************** * INLINE PARSING FUNCTIONS * ****************************/ /* is_mail_autolink • looks for the address part of a mail autolink and '>' */ /* this is less strict than the original markdown e-mail address matching */ static size_t is_mail_autolink(uint8_t *data, size_t size) { size_t i = 0, nb = 0; /* address is assumed to be: [-@._a-zA-Z0-9]+ with exactly one '@' */ for (i = 0; i < size; ++i) { if (isalnum(data[i])) continue; switch (data[i]) { case '@': nb++; case '-': case '.': case '_': break; case '>': return (nb == 1) ? i + 1 : 0; default: return 0; } } return 0; } /* tag_length • returns the length of the given tag, or 0 is it's not valid */ static size_t tag_length(uint8_t *data, size_t size, enum mkd_autolink *autolink) { size_t i, j; /* a valid tag can't be shorter than 3 chars */ if (size < 3) return 0; /* begins with a '<' optionally followed by '/', followed by letter or number */ if (data[0] != '<') return 0; i = (data[1] == '/') ? 2 : 1; if (!isalnum(data[i])) return 0; /* scheme test */ *autolink = MKDA_NOT_AUTOLINK; /* try to find the beginning of an URI */ while (i < size && (isalnum(data[i]) || data[i] == '.' || data[i] == '+' || data[i] == '-')) i++; if (i > 1 && data[i] == '@') { if ((j = is_mail_autolink(data + i, size - i)) != 0) { *autolink = MKDA_EMAIL; return i + j; } } if (i > 2 && data[i] == ':') { *autolink = MKDA_NORMAL; i++; } /* completing autolink test: no whitespace or ' or " */ if (i >= size) *autolink = MKDA_NOT_AUTOLINK; else if (*autolink) { j = i; while (i < size) { if (data[i] == '\\') i += 2; else if (data[i] == '>' || data[i] == '\'' || data[i] == '"' || data[i] == ' ' || data[i] == '\n') break; else i++; } if (i >= size) return 0; if (i > j && data[i] == '>') return i + 1; /* one of the forbidden chars has been found */ *autolink = MKDA_NOT_AUTOLINK; } /* looking for sometinhg looking like a tag end */ while (i < size && data[i] != '>') i++; if (i >= size) return 0; return i + 1; } /* parse_inline • parses inline markdown elements */ static void parse_inline(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t i = 0, end = 0; uint8_t action = 0; struct buf work = { 0, 0, 0, 0 }; if (rndr->work_bufs[BUFFER_SPAN].size + rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting) return; while (i < size) { /* copying inactive chars into the output */ while (end < size && (action = rndr->active_char[data[end]]) == 0) { end++; } if (rndr->cb.normal_text) { work.data = data + i; work.size = end - i; rndr->cb.normal_text(ob, &work, rndr->opaque); } else bufput(ob, data + i, end - i); if (end >= size) break; i = end; end = markdown_char_ptrs[(int)action](ob, rndr, data + i, i, size - i); if (!end) /* no action from the callback */ end = i + 1; else { i += end; end = i; } } } /* find_emph_char • looks for the next emph uint8_t, skipping other constructs */ static size_t find_emph_char(uint8_t *data, size_t size, uint8_t c) { size_t i = 1; while (i < size) { while (i < size && data[i] != c && data[i] != '`' && data[i] != '[') i++; if (i == size) return 0; if (data[i] == c) return i; /* not counting escaped chars */ if (i && data[i - 1] == '\\') { i++; continue; } if (data[i] == '`') { size_t span_nb = 0, bt; size_t tmp_i = 0; /* counting the number of opening backticks */ while (i < size && data[i] == '`') { i++; span_nb++; } if (i >= size) return 0; /* finding the matching closing sequence */ bt = 0; while (i < size && bt < span_nb) { if (!tmp_i && data[i] == c) tmp_i = i; if (data[i] == '`') bt++; else bt = 0; i++; } if (i >= size) return tmp_i; } /* skipping a link */ else if (data[i] == '[') { size_t tmp_i = 0; uint8_t cc; i++; while (i < size && data[i] != ']') { if (!tmp_i && data[i] == c) tmp_i = i; i++; } i++; while (i < size && (data[i] == ' ' || data[i] == '\n')) i++; if (i >= size) return tmp_i; switch (data[i]) { case '[': cc = ']'; break; case '(': cc = ')'; break; default: if (tmp_i) return tmp_i; else continue; } i++; while (i < size && data[i] != cc) { if (!tmp_i && data[i] == c) tmp_i = i; i++; } if (i >= size) return tmp_i; i++; } } return 0; } /* parse_emph1 • parsing single emphase */ /* closed by a symbol not preceded by whitespace and not followed by symbol */ static size_t parse_emph1(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c) { size_t i = 0, len; struct buf *work = 0; int r; if (!rndr->cb.emphasis) return 0; /* skipping one symbol if coming from emph3 */ if (size > 1 && data[0] == c && data[1] == c) i = 1; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; if (i >= size) return 0; if (data[i] == c && !_isspace(data[i - 1])) { if (rndr->ext_flags & MKDEXT_NO_INTRA_EMPHASIS) { if (!(i + 1 == size || _isspace(data[i + 1]) || ispunct(data[i + 1]))) continue; } work = rndr_newbuf(rndr, BUFFER_SPAN); parse_inline(work, rndr, data, i); r = rndr->cb.emphasis(ob, work, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); return r ? i + 1 : 0; } } return 0; } /* parse_emph2 • parsing single emphase */ static size_t parse_emph2(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c) { int (*render_method)(struct buf *ob, const struct buf *text, void *opaque); size_t i = 0, len; struct buf *work = 0; int r; render_method = (c == '~') ? rndr->cb.strikethrough : rndr->cb.double_emphasis; if (!render_method) return 0; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; if (i + 1 < size && data[i] == c && data[i + 1] == c && i && !_isspace(data[i - 1])) { work = rndr_newbuf(rndr, BUFFER_SPAN); parse_inline(work, rndr, data, i); r = render_method(ob, work, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); return r ? i + 2 : 0; } i++; } return 0; } /* parse_emph3 • parsing single emphase */ /* finds the first closing tag, and delegates to the other emph */ static size_t parse_emph3(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, uint8_t c) { size_t i = 0, len; int r; while (i < size) { len = find_emph_char(data + i, size - i, c); if (!len) return 0; i += len; /* skip whitespace preceded symbols */ if (data[i] != c || _isspace(data[i - 1])) continue; if (i + 2 < size && data[i + 1] == c && data[i + 2] == c && rndr->cb.triple_emphasis) { /* triple symbol found */ struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN); parse_inline(work, rndr, data, i); r = rndr->cb.triple_emphasis(ob, work, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); return r ? i + 3 : 0; } else if (i + 1 < size && data[i + 1] == c) { /* double symbol found, handing over to emph1 */ len = parse_emph1(ob, rndr, data - 2, size + 2, c); if (!len) return 0; else return len - 2; } else { /* single symbol found, handing over to emph2 */ len = parse_emph2(ob, rndr, data - 1, size + 1, c); if (!len) return 0; else return len - 1; } } return 0; } /* char_emphasis • single and double emphasis parsing */ static size_t char_emphasis(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { uint8_t c = data[0]; size_t ret; if (size > 2 && data[1] != c) { /* whitespace cannot follow an opening emphasis; * strikethrough only takes two characters '~~' */ if (c == '~' || _isspace(data[1]) || (ret = parse_emph1(ob, rndr, data + 1, size - 1, c)) == 0) return 0; return ret + 1; } if (size > 3 && data[1] == c && data[2] != c) { if (_isspace(data[2]) || (ret = parse_emph2(ob, rndr, data + 2, size - 2, c)) == 0) return 0; return ret + 2; } if (size > 4 && data[1] == c && data[2] == c && data[3] != c) { if (c == '~' || _isspace(data[3]) || (ret = parse_emph3(ob, rndr, data + 3, size - 3, c)) == 0) return 0; return ret + 3; } return 0; } /* char_linebreak • '\n' preceded by two spaces (assuming linebreak != 0) */ static size_t char_linebreak(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { if (offset < 2 || data[-1] != ' ' || data[-2] != ' ') return 0; /* removing the last space from ob and rendering */ while (ob->size && ob->data[ob->size - 1] == ' ') ob->size--; return rndr->cb.linebreak(ob, rndr->opaque) ? 1 : 0; } /* char_codespan • '`' parsing a code span (assuming codespan != 0) */ static size_t char_codespan(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { size_t end, nb = 0, i, f_begin, f_end; /* counting the number of backticks in the delimiter */ while (nb < size && data[nb] == '`') nb++; /* finding the next delimiter */ i = 0; for (end = nb; end < size && i < nb; end++) { if (data[end] == '`') i++; else i = 0; } if (i < nb && end >= size) return 0; /* no matching delimiter */ /* trimming outside whitespaces */ f_begin = nb; while (f_begin < end && data[f_begin] == ' ') f_begin++; f_end = end - nb; while (f_end > nb && data[f_end-1] == ' ') f_end--; /* real code span */ if (f_begin < f_end) { struct buf work = { data + f_begin, f_end - f_begin, 0, 0 }; if (!rndr->cb.codespan(ob, &work, rndr->opaque)) end = 0; } else { if (!rndr->cb.codespan(ob, 0, rndr->opaque)) end = 0; } return end; } /* char_escape • '\\' backslash escape */ static size_t char_escape(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { static const char *escape_chars = "\\`*_{}[]()#+-.!:|&<>^~"; struct buf work = { 0, 0, 0, 0 }; if (size > 1) { if (strchr(escape_chars, data[1]) == NULL) return 0; if (rndr->cb.normal_text) { work.data = data + 1; work.size = 1; rndr->cb.normal_text(ob, &work, rndr->opaque); } else bufputc(ob, data[1]); } else if (size == 1) { bufputc(ob, data[0]); } return 2; } /* char_entity • '&' escaped when it doesn't belong to an entity */ /* valid entities are assumed to be anything matching &#?[A-Za-z0-9]+; */ static size_t char_entity(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { size_t end = 1; struct buf work = { 0, 0, 0, 0 }; if (end < size && data[end] == '#') end++; while (end < size && isalnum(data[end])) end++; if (end < size && data[end] == ';') end++; /* real entity */ else return 0; /* lone '&' */ if (rndr->cb.entity) { work.data = data; work.size = end; rndr->cb.entity(ob, &work, rndr->opaque); } else bufput(ob, data, end); return end; } /* char_langle_tag • '<' when tags or autolinks are allowed */ static size_t char_langle_tag(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { enum mkd_autolink altype = MKDA_NOT_AUTOLINK; size_t end = tag_length(data, size, &altype); struct buf work = { data, end, 0, 0 }; int ret = 0; if (end > 2) { if (rndr->cb.autolink && altype != MKDA_NOT_AUTOLINK) { struct buf *u_link = rndr_newbuf(rndr, BUFFER_SPAN); work.data = data + 1; work.size = end - 2; unscape_text(u_link, &work); ret = rndr->cb.autolink(ob, u_link, altype, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); } else if (rndr->cb.raw_html_tag) ret = rndr->cb.raw_html_tag(ob, &work, rndr->opaque); } if (!ret) return 0; else return end; } static size_t char_autolink_www(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { struct buf *link, *link_url, *link_text; size_t link_len, rewind; if (!rndr->cb.link || rndr->in_link_body) return 0; link = rndr_newbuf(rndr, BUFFER_SPAN); if ((link_len = sd_autolink__www(&rewind, link, data, offset, size)) > 0) { link_url = rndr_newbuf(rndr, BUFFER_SPAN); BUFPUTSL(link_url, "http://"); bufput(link_url, link->data, link->size); ob->size -= rewind; if (rndr->cb.normal_text) { link_text = rndr_newbuf(rndr, BUFFER_SPAN); rndr->cb.normal_text(link_text, link, rndr->opaque); rndr->cb.link(ob, link_url, NULL, link_text, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); } else { rndr->cb.link(ob, link_url, NULL, link, rndr->opaque); } rndr_popbuf(rndr, BUFFER_SPAN); } rndr_popbuf(rndr, BUFFER_SPAN); return link_len; } static size_t char_autolink_email(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { struct buf *link; size_t link_len, rewind; if (!rndr->cb.autolink || rndr->in_link_body) return 0; link = rndr_newbuf(rndr, BUFFER_SPAN); if ((link_len = sd_autolink__email(&rewind, link, data, offset, size)) > 0) { ob->size -= rewind; rndr->cb.autolink(ob, link, MKDA_EMAIL, rndr->opaque); } rndr_popbuf(rndr, BUFFER_SPAN); return link_len; } static size_t char_autolink_url(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { struct buf *link; size_t link_len, rewind; if (!rndr->cb.autolink || rndr->in_link_body) return 0; link = rndr_newbuf(rndr, BUFFER_SPAN); if ((link_len = sd_autolink__url(&rewind, link, data, offset, size)) > 0) { ob->size -= rewind; rndr->cb.autolink(ob, link, MKDA_NORMAL, rndr->opaque); } rndr_popbuf(rndr, BUFFER_SPAN); return link_len; } /* char_link • '[': parsing a link or an image */ static size_t char_link(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { int is_img = (offset && data[-1] == '!'), level; size_t i = 1, txt_e, link_b = 0, link_e = 0, title_b = 0, title_e = 0; struct buf *content = 0; struct buf *link = 0; struct buf *title = 0; struct buf *u_link = 0; size_t org_work_size = rndr->work_bufs[BUFFER_SPAN].size; int text_has_nl = 0, ret = 0; int in_title = 0, qtype = 0; /* checking whether the correct renderer exists */ if ((is_img && !rndr->cb.image) || (!is_img && !rndr->cb.link)) goto cleanup; /* looking for the matching closing bracket */ for (level = 1; i < size; i++) { if (data[i] == '\n') text_has_nl = 1; else if (data[i - 1] == '\\') continue; else if (data[i] == '[') level++; else if (data[i] == ']') { level--; if (level <= 0) break; } } if (i >= size) goto cleanup; txt_e = i; i++; /* skip any amount of whitespace or newline */ /* (this is much more laxist than original markdown syntax) */ while (i < size && _isspace(data[i])) i++; /* inline style link */ if (i < size && data[i] == '(') { /* skipping initial whitespace */ i++; while (i < size && _isspace(data[i])) i++; link_b = i; /* looking for link end: ' " ) */ while (i < size) { if (data[i] == '\\') i += 2; else if (data[i] == ')') break; else if (i >= 1 && _isspace(data[i-1]) && (data[i] == '\'' || data[i] == '"')) break; else i++; } if (i >= size) goto cleanup; link_e = i; /* looking for title end if present */ if (data[i] == '\'' || data[i] == '"') { qtype = data[i]; in_title = 1; i++; title_b = i; while (i < size) { if (data[i] == '\\') i += 2; else if (data[i] == qtype) {in_title = 0; i++;} else if ((data[i] == ')') && !in_title) break; else i++; } if (i >= size) goto cleanup; /* skipping whitespaces after title */ title_e = i - 1; while (title_e > title_b && _isspace(data[title_e])) title_e--; /* checking for closing quote presence */ if (data[title_e] != '\'' && data[title_e] != '"') { title_b = title_e = 0; link_e = i; } } /* remove whitespace at the end of the link */ while (link_e > link_b && _isspace(data[link_e - 1])) link_e--; /* remove optional angle brackets around the link */ if (data[link_b] == '<') link_b++; if (data[link_e - 1] == '>') link_e--; /* building escaped link and title */ if (link_e > link_b) { link = rndr_newbuf(rndr, BUFFER_SPAN); bufput(link, data + link_b, link_e - link_b); } if (title_e > title_b) { title = rndr_newbuf(rndr, BUFFER_SPAN); bufput(title, data + title_b, title_e - title_b); } i++; } /* reference style link */ else if (i < size && data[i] == '[') { struct buf id = { 0, 0, 0, 0 }; struct link_ref *lr; /* looking for the id */ i++; link_b = i; while (i < size && data[i] != ']') i++; if (i >= size) goto cleanup; link_e = i; /* finding the link_ref */ if (link_b == link_e) { if (text_has_nl) { struct buf *b = rndr_newbuf(rndr, BUFFER_SPAN); size_t j; for (j = 1; j < txt_e; j++) { if (data[j] != '\n') bufputc(b, data[j]); else if (data[j - 1] != ' ') bufputc(b, ' '); } id.data = b->data; id.size = b->size; } else { id.data = data + 1; id.size = txt_e - 1; } } else { id.data = data + link_b; id.size = link_e - link_b; } lr = find_link_ref(rndr->refs, id.data, id.size); if (!lr) goto cleanup; /* keeping link and title from link_ref */ link = lr->link; title = lr->title; i++; } /* shortcut reference style link */ else { struct buf id = { 0, 0, 0, 0 }; struct link_ref *lr; /* crafting the id */ if (text_has_nl) { struct buf *b = rndr_newbuf(rndr, BUFFER_SPAN); size_t j; for (j = 1; j < txt_e; j++) { if (data[j] != '\n') bufputc(b, data[j]); else if (data[j - 1] != ' ') bufputc(b, ' '); } id.data = b->data; id.size = b->size; } else { id.data = data + 1; id.size = txt_e - 1; } /* finding the link_ref */ lr = find_link_ref(rndr->refs, id.data, id.size); if (!lr) goto cleanup; /* keeping link and title from link_ref */ link = lr->link; title = lr->title; /* rewinding the whitespace */ i = txt_e + 1; } /* building content: img alt is escaped, link content is parsed */ if (txt_e > 1) { content = rndr_newbuf(rndr, BUFFER_SPAN); if (is_img) { bufput(content, data + 1, txt_e - 1); } else { /* disable autolinking when parsing inline the * content of a link */ rndr->in_link_body = 1; parse_inline(content, rndr, data + 1, txt_e - 1); rndr->in_link_body = 0; } } if (link) { u_link = rndr_newbuf(rndr, BUFFER_SPAN); unscape_text(u_link, link); } /* calling the relevant rendering function */ if (is_img) { if (ob->size && ob->data[ob->size - 1] == '!') ob->size -= 1; ret = rndr->cb.image(ob, u_link, title, content, rndr->opaque); } else { ret = rndr->cb.link(ob, u_link, title, content, rndr->opaque); } /* cleanup */ cleanup: rndr->work_bufs[BUFFER_SPAN].size = (int)org_work_size; return ret ? i : 0; } static size_t char_superscript(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t offset, size_t size) { size_t sup_start, sup_len; struct buf *sup; if (!rndr->cb.superscript) return 0; if (size < 2) return 0; if (data[1] == '(') { sup_start = sup_len = 2; while (sup_len < size && data[sup_len] != ')' && data[sup_len - 1] != '\\') sup_len++; if (sup_len == size) return 0; } else { sup_start = sup_len = 1; while (sup_len < size && !_isspace(data[sup_len])) sup_len++; } if (sup_len - sup_start == 0) return (sup_start == 2) ? 3 : 0; sup = rndr_newbuf(rndr, BUFFER_SPAN); parse_inline(sup, rndr, data + sup_start, sup_len - sup_start); rndr->cb.superscript(ob, sup, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); return (sup_start == 2) ? sup_len + 1 : sup_len; } /********************************* * BLOCK-LEVEL PARSING FUNCTIONS * *********************************/ /* is_empty • returns the line length when it is empty, 0 otherwise */ static size_t is_empty(uint8_t *data, size_t size) { size_t i; for (i = 0; i < size && data[i] != '\n'; i++) if (data[i] != ' ') return 0; return i + 1; } /* is_hrule • returns whether a line is a horizontal rule */ static int is_hrule(uint8_t *data, size_t size) { size_t i = 0, n = 0; uint8_t c; /* skipping initial spaces */ if (size < 3) return 0; if (data[0] == ' ') { i++; if (data[1] == ' ') { i++; if (data[2] == ' ') { i++; } } } /* looking at the hrule uint8_t */ if (i + 2 >= size || (data[i] != '*' && data[i] != '-' && data[i] != '_')) return 0; c = data[i]; /* the whole line must be the char or whitespace */ while (i < size && data[i] != '\n') { if (data[i] == c) n++; else if (data[i] != ' ') return 0; i++; } return n >= 3; } /* check if a line begins with a code fence; return the * width of the code fence */ static size_t prefix_codefence(uint8_t *data, size_t size) { size_t i = 0, n = 0; uint8_t c; /* skipping initial spaces */ if (size < 3) return 0; if (data[0] == ' ') { i++; if (data[1] == ' ') { i++; if (data[2] == ' ') { i++; } } } /* looking at the hrule uint8_t */ if (i + 2 >= size || !(data[i] == '~' || data[i] == '`')) return 0; c = data[i]; /* the whole line must be the uint8_t or whitespace */ while (i < size && data[i] == c) { n++; i++; } if (n < 3) return 0; return i; } /* check if a line is a code fence; return its size if it is */ static size_t is_codefence(uint8_t *data, size_t size, struct buf *syntax) { size_t i = 0, syn_len = 0; uint8_t *syn_start; i = prefix_codefence(data, size); if (i == 0) return 0; while (i < size && data[i] == ' ') i++; syn_start = data + i; if (i < size && data[i] == '{') { i++; syn_start++; while (i < size && data[i] != '}' && data[i] != '\n') { syn_len++; i++; } if (i == size || data[i] != '}') return 0; /* strip all whitespace at the beginning and the end * of the {} block */ while (syn_len > 0 && _isspace(syn_start[0])) { syn_start++; syn_len--; } while (syn_len > 0 && _isspace(syn_start[syn_len - 1])) syn_len--; i++; } else { while (i < size && !_isspace(data[i])) { syn_len++; i++; } } if (syntax) { syntax->data = syn_start; syntax->size = syn_len; } while (i < size && data[i] != '\n') { if (!_isspace(data[i])) return 0; i++; } return i + 1; } /* is_atxheader • returns whether the line is a hash-prefixed header */ static int is_atxheader(struct sd_markdown *rndr, uint8_t *data, size_t size) { if (data[0] != '#') return 0; if (rndr->ext_flags & MKDEXT_SPACE_HEADERS) { size_t level = 0; while (level < size && level < 6 && data[level] == '#') level++; if (level < size && data[level] != ' ') return 0; } return 1; } /* is_headerline • returns whether the line is a setext-style hdr underline */ static int is_headerline(uint8_t *data, size_t size) { size_t i = 0; /* test of level 1 header */ if (data[i] == '=') { for (i = 1; i < size && data[i] == '='; i++); while (i < size && data[i] == ' ') i++; return (i >= size || data[i] == '\n') ? 1 : 0; } /* test of level 2 header */ if (data[i] == '-') { for (i = 1; i < size && data[i] == '-'; i++); while (i < size && data[i] == ' ') i++; return (i >= size || data[i] == '\n') ? 2 : 0; } return 0; } static int is_next_headerline(uint8_t *data, size_t size) { size_t i = 0; while (i < size && data[i] != '\n') i++; if (++i >= size) return 0; return is_headerline(data + i, size - i); } /* prefix_quote • returns blockquote prefix length */ static size_t prefix_quote(uint8_t *data, size_t size) { size_t i = 0; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == '>') { if (i + 1 < size && data[i + 1] == ' ') return i + 2; return i + 1; } return 0; } /* prefix_code • returns prefix length for block code*/ static size_t prefix_code(uint8_t *data, size_t size) { if (size > 3 && data[0] == ' ' && data[1] == ' ' && data[2] == ' ' && data[3] == ' ') return 4; return 0; } /* prefix_oli • returns ordered list item prefix */ static size_t prefix_oli(uint8_t *data, size_t size) { size_t i = 0; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == ' ') i++; if (i >= size || data[i] < '0' || data[i] > '9') return 0; while (i < size && data[i] >= '0' && data[i] <= '9') i++; if (i + 1 >= size || data[i] != '.' || data[i + 1] != ' ') return 0; if (is_next_headerline(data + i, size - i)) return 0; return i + 2; } /* prefix_uli • returns ordered list item prefix */ static size_t prefix_uli(uint8_t *data, size_t size) { size_t i = 0; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == ' ') i++; if (i < size && data[i] == ' ') i++; if (i + 1 >= size || (data[i] != '*' && data[i] != '+' && data[i] != '-') || data[i + 1] != ' ') return 0; if (is_next_headerline(data + i, size - i)) return 0; return i + 2; } /* parse_block • parsing of one block, returning next uint8_t to parse */ static void parse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size); /* parse_blockquote • handles parsing of a blockquote fragment */ static size_t parse_blockquote(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t beg, end = 0, pre, work_size = 0; uint8_t *work_data = 0; struct buf *out = 0; out = rndr_newbuf(rndr, BUFFER_BLOCK); beg = 0; while (beg < size) { for (end = beg + 1; end < size && data[end - 1] != '\n'; end++); pre = prefix_quote(data + beg, end - beg); if (pre) beg += pre; /* skipping prefix */ /* empty line followed by non-quote line */ else if (is_empty(data + beg, end - beg) && (end >= size || (prefix_quote(data + end, size - end) == 0 && !is_empty(data + end, size - end)))) break; if (beg < end) { /* copy into the in-place working buffer */ /* bufput(work, data + beg, end - beg); */ if (!work_data) work_data = data + beg; else if (data + beg != work_data + work_size) memmove(work_data + work_size, data + beg, end - beg); work_size += end - beg; } beg = end; } parse_block(out, rndr, work_data, work_size); if (rndr->cb.blockquote) rndr->cb.blockquote(ob, out, rndr->opaque); rndr_popbuf(rndr, BUFFER_BLOCK); return end; } static size_t parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render); /* parse_blockquote • handles parsing of a regular paragraph */ static size_t parse_paragraph(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t i = 0, end = 0; int level = 0; struct buf work = { data, 0, 0, 0 }; while (i < size) { for (end = i + 1; end < size && data[end - 1] != '\n'; end++) /* empty */; if (is_empty(data + i, size - i)) break; if ((level = is_headerline(data + i, size - i)) != 0) break; if (is_atxheader(rndr, data + i, size - i) || is_hrule(data + i, size - i) || prefix_quote(data + i, size - i)) { end = i; break; } /* * Early termination of a paragraph with the same logic * as Markdown 1.0.0. If this logic is applied, the * Markdown 1.0.3 test suite won't pass cleanly * * :: If the first character in a new line is not a letter, * let's check to see if there's some kind of block starting * here */ if ((rndr->ext_flags & MKDEXT_LAX_SPACING) && !isalnum(data[i])) { if (prefix_oli(data + i, size - i) || prefix_uli(data + i, size - i)) { end = i; break; } /* see if an html block starts here */ if (data[i] == '<' && rndr->cb.blockhtml && parse_htmlblock(ob, rndr, data + i, size - i, 0)) { end = i; break; } /* see if a code fence starts here */ if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 && is_codefence(data + i, size - i, NULL) != 0) { end = i; break; } } i = end; } work.size = i; while (work.size && data[work.size - 1] == '\n') work.size--; if (!level) { struct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK); parse_inline(tmp, rndr, work.data, work.size); if (rndr->cb.paragraph) rndr->cb.paragraph(ob, tmp, rndr->opaque); rndr_popbuf(rndr, BUFFER_BLOCK); } else { struct buf *header_work; if (work.size) { size_t beg; i = work.size; work.size -= 1; while (work.size && data[work.size] != '\n') work.size -= 1; beg = work.size + 1; while (work.size && data[work.size - 1] == '\n') work.size -= 1; if (work.size > 0) { struct buf *tmp = rndr_newbuf(rndr, BUFFER_BLOCK); parse_inline(tmp, rndr, work.data, work.size); if (rndr->cb.paragraph) rndr->cb.paragraph(ob, tmp, rndr->opaque); rndr_popbuf(rndr, BUFFER_BLOCK); work.data += beg; work.size = i - beg; } else work.size = i; } header_work = rndr_newbuf(rndr, BUFFER_SPAN); parse_inline(header_work, rndr, work.data, work.size); if (rndr->cb.header) rndr->cb.header(ob, header_work, (int)level, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); } return end; } /* parse_fencedcode • handles parsing of a block-level code fragment */ static size_t parse_fencedcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t beg, end; struct buf *work = 0; struct buf lang = { 0, 0, 0, 0 }; beg = is_codefence(data, size, &lang); if (beg == 0) return 0; work = rndr_newbuf(rndr, BUFFER_BLOCK); while (beg < size) { size_t fence_end; struct buf fence_trail = { 0, 0, 0, 0 }; fence_end = is_codefence(data + beg, size - beg, &fence_trail); if (fence_end != 0 && fence_trail.size == 0) { beg += fence_end; break; } for (end = beg + 1; end < size && data[end - 1] != '\n'; end++); if (beg < end) { /* verbatim copy to the working buffer, escaping entities */ if (is_empty(data + beg, end - beg)) bufputc(work, '\n'); else bufput(work, data + beg, end - beg); } beg = end; } if (work->size && work->data[work->size - 1] != '\n') bufputc(work, '\n'); if (rndr->cb.blockcode) rndr->cb.blockcode(ob, work, lang.size ? &lang : NULL, rndr->opaque); rndr_popbuf(rndr, BUFFER_BLOCK); return beg; } static size_t parse_blockcode(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t beg, end, pre; struct buf *work = 0; work = rndr_newbuf(rndr, BUFFER_BLOCK); beg = 0; while (beg < size) { for (end = beg + 1; end < size && data[end - 1] != '\n'; end++) {}; pre = prefix_code(data + beg, end - beg); if (pre) beg += pre; /* skipping prefix */ else if (!is_empty(data + beg, end - beg)) /* non-empty non-prefixed line breaks the pre */ break; if (beg < end) { /* verbatim copy to the working buffer, escaping entities */ if (is_empty(data + beg, end - beg)) bufputc(work, '\n'); else bufput(work, data + beg, end - beg); } beg = end; } while (work->size && work->data[work->size - 1] == '\n') work->size -= 1; bufputc(work, '\n'); if (rndr->cb.blockcode) rndr->cb.blockcode(ob, work, NULL, rndr->opaque); rndr_popbuf(rndr, BUFFER_BLOCK); return beg; } /* parse_listitem • parsing of a single list item */ /* assuming initial prefix is already removed */ static size_t parse_listitem(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int *flags) { struct buf *work = 0, *inter = 0; size_t beg = 0, end, pre, sublist = 0, orgpre = 0, i; int in_empty = 0, has_inside_empty = 0, in_fence = 0; /* keeping track of the first indentation prefix */ while (orgpre < 3 && orgpre < size && data[orgpre] == ' ') orgpre++; beg = prefix_uli(data, size); if (!beg) beg = prefix_oli(data, size); if (!beg) return 0; /* skipping to the beginning of the following line */ end = beg; while (end < size && data[end - 1] != '\n') end++; /* getting working buffers */ work = rndr_newbuf(rndr, BUFFER_SPAN); inter = rndr_newbuf(rndr, BUFFER_SPAN); /* putting the first line into the working buffer */ bufput(work, data + beg, end - beg); beg = end; /* process the following lines */ while (beg < size) { size_t has_next_uli = 0, has_next_oli = 0; end++; while (end < size && data[end - 1] != '\n') end++; /* process an empty line */ if (is_empty(data + beg, end - beg)) { in_empty = 1; beg = end; continue; } /* calculating the indentation */ i = 0; while (i < 4 && beg + i < end && data[beg + i] == ' ') i++; pre = i; if (rndr->ext_flags & MKDEXT_FENCED_CODE) { if (is_codefence(data + beg + i, end - beg - i, NULL) != 0) in_fence = !in_fence; } /* Only check for new list items if we are **not** inside * a fenced code block */ if (!in_fence) { has_next_uli = prefix_uli(data + beg + i, end - beg - i); has_next_oli = prefix_oli(data + beg + i, end - beg - i); } /* checking for ul/ol switch */ if (in_empty && ( ((*flags & MKD_LIST_ORDERED) && has_next_uli) || (!(*flags & MKD_LIST_ORDERED) && has_next_oli))){ *flags |= MKD_LI_END; break; /* the following item must have same list type */ } /* checking for a new item */ if ((has_next_uli && !is_hrule(data + beg + i, end - beg - i)) || has_next_oli) { if (in_empty) has_inside_empty = 1; if (pre == orgpre) /* the following item must have */ break; /* the same indentation */ if (!sublist) sublist = work->size; } /* joining only indented stuff after empty lines; * note that now we only require 1 space of indentation * to continue a list */ else if (in_empty && pre == 0) { *flags |= MKD_LI_END; break; } else if (in_empty) { bufputc(work, '\n'); has_inside_empty = 1; } in_empty = 0; /* adding the line without prefix into the working buffer */ bufput(work, data + beg + i, end - beg - i); beg = end; } /* render of li contents */ if (has_inside_empty) *flags |= MKD_LI_BLOCK; if (*flags & MKD_LI_BLOCK) { /* intermediate render of block li */ if (sublist && sublist < work->size) { parse_block(inter, rndr, work->data, sublist); parse_block(inter, rndr, work->data + sublist, work->size - sublist); } else parse_block(inter, rndr, work->data, work->size); } else { /* intermediate render of inline li */ if (sublist && sublist < work->size) { parse_inline(inter, rndr, work->data, sublist); parse_block(inter, rndr, work->data + sublist, work->size - sublist); } else parse_inline(inter, rndr, work->data, work->size); } /* render of li itself */ if (rndr->cb.listitem) rndr->cb.listitem(ob, inter, *flags, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); rndr_popbuf(rndr, BUFFER_SPAN); return beg; } /* parse_list • parsing ordered or unordered list block */ static size_t parse_list(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int flags) { struct buf *work = 0; size_t i = 0, j; work = rndr_newbuf(rndr, BUFFER_BLOCK); while (i < size) { j = parse_listitem(work, rndr, data + i, size - i, &flags); i += j; if (!j || (flags & MKD_LI_END)) break; } if (rndr->cb.list) rndr->cb.list(ob, work, flags, rndr->opaque); rndr_popbuf(rndr, BUFFER_BLOCK); return i; } /* parse_atxheader • parsing of atx-style headers */ static size_t parse_atxheader(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t level = 0; size_t i, end, skip; while (level < size && level < 6 && data[level] == '#') level++; for (i = level; i < size && data[i] == ' '; i++); for (end = i; end < size && data[end] != '\n'; end++); skip = end; while (end && data[end - 1] == '#') end--; while (end && data[end - 1] == ' ') end--; if (end > i) { struct buf *work = rndr_newbuf(rndr, BUFFER_SPAN); parse_inline(work, rndr, data + i, end - i); if (rndr->cb.header) rndr->cb.header(ob, work, (int)level, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); } return skip; } /* htmlblock_end • checking end of HTML block : [ \t]*\n[ \t*]\n */ /* returns the length on match, 0 otherwise */ static size_t htmlblock_end_tag( const char *tag, size_t tag_len, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t i, w; /* checking if tag is a match */ if (tag_len + 3 >= size || strncasecmp((char *)data + 2, tag, tag_len) != 0 || data[tag_len + 2] != '>') return 0; /* checking white lines */ i = tag_len + 3; w = 0; if (i < size && (w = is_empty(data + i, size - i)) == 0) return 0; /* non-blank after tag */ i += w; w = 0; if (i < size) w = is_empty(data + i, size - i); return i + w; } static size_t htmlblock_end(const char *curtag, struct sd_markdown *rndr, uint8_t *data, size_t size, int start_of_line) { size_t tag_size = strlen(curtag); size_t i = 1, end_tag; int block_lines = 0; while (i < size) { i++; while (i < size && !(data[i - 1] == '<' && data[i] == '/')) { if (data[i] == '\n') block_lines++; i++; } /* If we are only looking for unindented tags, skip the tag * if it doesn't follow a newline. * * The only exception to this is if the tag is still on the * initial line; in that case it still counts as a closing * tag */ if (start_of_line && block_lines > 0 && data[i - 2] != '\n') continue; if (i + 2 + tag_size >= size) break; end_tag = htmlblock_end_tag(curtag, tag_size, rndr, data + i - 1, size - i + 1); if (end_tag) return i + end_tag - 1; } return 0; } /* parse_htmlblock • parsing of inline HTML block */ static size_t parse_htmlblock(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, int do_render) { size_t i, j = 0, tag_end; const char *curtag = NULL; struct buf work = { data, 0, 0, 0 }; /* identification of the opening tag */ if (size < 2 || data[0] != '<') return 0; i = 1; while (i < size && data[i] != '>' && data[i] != ' ') i++; if (i < size) curtag = find_block_tag((char *)data + 1, (int)i - 1); /* handling of special cases */ if (!curtag) { /* HTML comment, laxist form */ if (size > 5 && data[1] == '!' && data[2] == '-' && data[3] == '-') { i = 5; while (i < size && !(data[i - 2] == '-' && data[i - 1] == '-' && data[i] == '>')) i++; i++; if (i < size) j = is_empty(data + i, size - i); if (j) { work.size = i + j; if (do_render && rndr->cb.blockhtml) rndr->cb.blockhtml(ob, &work, rndr->opaque); return work.size; } } /* HR, which is the only self-closing block tag considered */ if (size > 4 && (data[1] == 'h' || data[1] == 'H') && (data[2] == 'r' || data[2] == 'R')) { i = 3; while (i < size && data[i] != '>') i++; if (i + 1 < size) { i++; j = is_empty(data + i, size - i); if (j) { work.size = i + j; if (do_render && rndr->cb.blockhtml) rndr->cb.blockhtml(ob, &work, rndr->opaque); return work.size; } } } /* no special case recognised */ return 0; } /* looking for an unindented matching closing tag */ /* followed by a blank line */ tag_end = htmlblock_end(curtag, rndr, data, size, 1); /* if not found, trying a second pass looking for indented match */ /* but not if tag is "ins" or "del" (following original Markdown.pl) */ if (!tag_end && strcmp(curtag, "ins") != 0 && strcmp(curtag, "del") != 0) { tag_end = htmlblock_end(curtag, rndr, data, size, 0); } if (!tag_end) return 0; /* the end of the block has been found */ work.size = tag_end; if (do_render && rndr->cb.blockhtml) rndr->cb.blockhtml(ob, &work, rndr->opaque); return tag_end; } static void parse_table_row( struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, size_t columns, int *col_data, int header_flag) { size_t i = 0, col; struct buf *row_work = 0; if (!rndr->cb.table_cell || !rndr->cb.table_row) return; row_work = rndr_newbuf(rndr, BUFFER_SPAN); if (i < size && data[i] == '|') i++; for (col = 0; col < columns && i < size; ++col) { size_t cell_start, cell_end; struct buf *cell_work; cell_work = rndr_newbuf(rndr, BUFFER_SPAN); while (i < size && _isspace(data[i])) i++; cell_start = i; while (i < size && data[i] != '|') i++; cell_end = i - 1; while (cell_end > cell_start && _isspace(data[cell_end])) cell_end--; parse_inline(cell_work, rndr, data + cell_start, 1 + cell_end - cell_start); rndr->cb.table_cell(row_work, cell_work, col_data[col] | header_flag, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); i++; } for (; col < columns; ++col) { struct buf empty_cell = { 0, 0, 0, 0 }; rndr->cb.table_cell(row_work, &empty_cell, col_data[col] | header_flag, rndr->opaque); } rndr->cb.table_row(ob, row_work, rndr->opaque); rndr_popbuf(rndr, BUFFER_SPAN); } static size_t parse_table_header( struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size, size_t *columns, int **column_data) { int pipes; size_t i = 0, col, header_end, under_end; pipes = 0; while (i < size && data[i] != '\n') if (data[i++] == '|') pipes++; if (i == size || pipes == 0) return 0; header_end = i; while (header_end > 0 && _isspace(data[header_end - 1])) header_end--; if (data[0] == '|') pipes--; if (header_end && data[header_end - 1] == '|') pipes--; *columns = pipes + 1; *column_data = calloc(*columns, sizeof(int)); /* Parse the header underline */ i++; if (i < size && data[i] == '|') i++; under_end = i; while (under_end < size && data[under_end] != '\n') under_end++; for (col = 0; col < *columns && i < under_end; ++col) { size_t dashes = 0; while (i < under_end && data[i] == ' ') i++; if (data[i] == ':') { i++; (*column_data)[col] |= MKD_TABLE_ALIGN_L; dashes++; } while (i < under_end && data[i] == '-') { i++; dashes++; } if (i < under_end && data[i] == ':') { i++; (*column_data)[col] |= MKD_TABLE_ALIGN_R; dashes++; } while (i < under_end && data[i] == ' ') i++; if (i < under_end && data[i] != '|') break; if (dashes < 3) break; i++; } if (col < *columns) return 0; parse_table_row( ob, rndr, data, header_end, *columns, *column_data, MKD_TABLE_HEADER ); return under_end + 1; } static size_t parse_table( struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t i; struct buf *header_work = 0; struct buf *body_work = 0; size_t columns; int *col_data = NULL; header_work = rndr_newbuf(rndr, BUFFER_SPAN); body_work = rndr_newbuf(rndr, BUFFER_BLOCK); i = parse_table_header(header_work, rndr, data, size, &columns, &col_data); if (i > 0) { while (i < size) { size_t row_start; int pipes = 0; row_start = i; while (i < size && data[i] != '\n') if (data[i++] == '|') pipes++; if (pipes == 0 || i == size) { i = row_start; break; } parse_table_row( body_work, rndr, data + row_start, i - row_start, columns, col_data, 0 ); i++; } if (rndr->cb.table) rndr->cb.table(ob, header_work, body_work, rndr->opaque); } free(col_data); rndr_popbuf(rndr, BUFFER_SPAN); rndr_popbuf(rndr, BUFFER_BLOCK); return i; } /* parse_block • parsing of one block, returning next uint8_t to parse */ static void parse_block(struct buf *ob, struct sd_markdown *rndr, uint8_t *data, size_t size) { size_t beg, end, i; uint8_t *txt_data; beg = 0; if (rndr->work_bufs[BUFFER_SPAN].size + rndr->work_bufs[BUFFER_BLOCK].size > rndr->max_nesting) return; while (beg < size) { txt_data = data + beg; end = size - beg; if (is_atxheader(rndr, txt_data, end)) beg += parse_atxheader(ob, rndr, txt_data, end); else if (data[beg] == '<' && rndr->cb.blockhtml && (i = parse_htmlblock(ob, rndr, txt_data, end, 1)) != 0) beg += i; else if ((i = is_empty(txt_data, end)) != 0) beg += i; else if (is_hrule(txt_data, end)) { if (rndr->cb.hrule) rndr->cb.hrule(ob, rndr->opaque); while (beg < size && data[beg] != '\n') beg++; beg++; } else if ((rndr->ext_flags & MKDEXT_FENCED_CODE) != 0 && (i = parse_fencedcode(ob, rndr, txt_data, end)) != 0) beg += i; else if ((rndr->ext_flags & MKDEXT_TABLES) != 0 && (i = parse_table(ob, rndr, txt_data, end)) != 0) beg += i; else if (prefix_quote(txt_data, end)) beg += parse_blockquote(ob, rndr, txt_data, end); else if (prefix_code(txt_data, end)) beg += parse_blockcode(ob, rndr, txt_data, end); else if (prefix_uli(txt_data, end)) beg += parse_list(ob, rndr, txt_data, end, 0); else if (prefix_oli(txt_data, end)) beg += parse_list(ob, rndr, txt_data, end, MKD_LIST_ORDERED); else beg += parse_paragraph(ob, rndr, txt_data, end); } } /********************* * REFERENCE PARSING * *********************/ /* is_ref • returns whether a line is a reference or not */ static int is_ref(const uint8_t *data, size_t beg, size_t end, size_t *last, struct link_ref **refs) { /* int n; */ size_t i = 0; size_t id_offset, id_end; size_t link_offset, link_end; size_t title_offset, title_end; size_t line_end; /* up to 3 optional leading spaces */ if (beg + 3 >= end) return 0; if (data[beg] == ' ') { i = 1; if (data[beg + 1] == ' ') { i = 2; if (data[beg + 2] == ' ') { i = 3; if (data[beg + 3] == ' ') return 0; } } } i += beg; /* id part: anything but a newline between brackets */ if (data[i] != '[') return 0; i++; id_offset = i; while (i < end && data[i] != '\n' && data[i] != '\r' && data[i] != ']') i++; if (i >= end || data[i] != ']') return 0; id_end = i; /* spacer: colon (space | tab)* newline? (space | tab)* */ i++; if (i >= end || data[i] != ':') return 0; i++; while (i < end && data[i] == ' ') i++; if (i < end && (data[i] == '\n' || data[i] == '\r')) { i++; if (i < end && data[i] == '\r' && data[i - 1] == '\n') i++; } while (i < end && data[i] == ' ') i++; if (i >= end) return 0; /* link: whitespace-free sequence, optionally between angle brackets */ if (data[i] == '<') i++; link_offset = i; while (i < end && data[i] != ' ' && data[i] != '\n' && data[i] != '\r') i++; if (data[i - 1] == '>') link_end = i - 1; else link_end = i; /* optional spacer: (space | tab)* (newline | '\'' | '"' | '(' ) */ while (i < end && data[i] == ' ') i++; if (i < end && data[i] != '\n' && data[i] != '\r' && data[i] != '\'' && data[i] != '"' && data[i] != '(') return 0; line_end = 0; /* computing end-of-line */ if (i >= end || data[i] == '\r' || data[i] == '\n') line_end = i; if (i + 1 < end && data[i] == '\n' && data[i + 1] == '\r') line_end = i + 1; /* optional (space|tab)* spacer after a newline */ if (line_end) { i = line_end + 1; while (i < end && data[i] == ' ') i++; } /* optional title: any non-newline sequence enclosed in '"() alone on its line */ title_offset = title_end = 0; if (i + 1 < end && (data[i] == '\'' || data[i] == '"' || data[i] == '(')) { i++; title_offset = i; /* looking for EOL */ while (i < end && data[i] != '\n' && data[i] != '\r') i++; if (i + 1 < end && data[i] == '\n' && data[i + 1] == '\r') title_end = i + 1; else title_end = i; /* stepping back */ i -= 1; while (i > title_offset && data[i] == ' ') i -= 1; if (i > title_offset && (data[i] == '\'' || data[i] == '"' || data[i] == ')')) { line_end = title_end; title_end = i; } } if (!line_end || link_end == link_offset) return 0; /* garbage after the link empty link */ /* a valid ref has been found, filling-in return structures */ if (last) *last = line_end; if (refs) { struct link_ref *ref; ref = add_link_ref(refs, data + id_offset, id_end - id_offset); if (!ref) return 0; ref->link = bufnew(link_end - link_offset); bufput(ref->link, data + link_offset, link_end - link_offset); if (title_end > title_offset) { ref->title = bufnew(title_end - title_offset); bufput(ref->title, data + title_offset, title_end - title_offset); } } return 1; } static void expand_tabs(struct buf *ob, const uint8_t *line, size_t size) { size_t i = 0, tab = 0; while (i < size) { size_t org = i; while (i < size && line[i] != '\t') { i++; tab++; } if (i > org) bufput(ob, line + org, i - org); if (i >= size) break; do { bufputc(ob, ' '); tab++; } while (tab % 4); i++; } } /********************** * EXPORTED FUNCTIONS * **********************/ struct sd_markdown * sd_markdown_new( unsigned int extensions, size_t max_nesting, const struct sd_callbacks *callbacks, void *opaque) { struct sd_markdown *md = NULL; assert(max_nesting > 0 && callbacks); md = malloc(sizeof(struct sd_markdown)); if (!md) return NULL; memcpy(&md->cb, callbacks, sizeof(struct sd_callbacks)); stack_init(&md->work_bufs[BUFFER_BLOCK], 4); stack_init(&md->work_bufs[BUFFER_SPAN], 8); memset(md->active_char, 0x0, 256); if (md->cb.emphasis || md->cb.double_emphasis || md->cb.triple_emphasis) { md->active_char['*'] = MD_CHAR_EMPHASIS; md->active_char['_'] = MD_CHAR_EMPHASIS; if (extensions & MKDEXT_STRIKETHROUGH) md->active_char['~'] = MD_CHAR_EMPHASIS; } if (md->cb.codespan) md->active_char['`'] = MD_CHAR_CODESPAN; if (md->cb.linebreak) md->active_char['\n'] = MD_CHAR_LINEBREAK; if (md->cb.image || md->cb.link) md->active_char['['] = MD_CHAR_LINK; md->active_char['<'] = MD_CHAR_LANGLE; md->active_char['\\'] = MD_CHAR_ESCAPE; md->active_char['&'] = MD_CHAR_ENTITITY; if (extensions & MKDEXT_AUTOLINK) { md->active_char[':'] = MD_CHAR_AUTOLINK_URL; md->active_char['@'] = MD_CHAR_AUTOLINK_EMAIL; md->active_char['w'] = MD_CHAR_AUTOLINK_WWW; } if (extensions & MKDEXT_SUPERSCRIPT) md->active_char['^'] = MD_CHAR_SUPERSCRIPT; /* Extension data */ md->ext_flags = extensions; md->opaque = opaque; md->max_nesting = max_nesting; md->in_link_body = 0; return md; } void sd_markdown_render(struct buf *ob, const uint8_t *document, size_t doc_size, struct sd_markdown *md) { #define MARKDOWN_GROW(x) ((x) + ((x) >> 1)) static const char UTF8_BOM[] = {0xEF, 0xBB, 0xBF}; struct buf *text; size_t beg, end; text = bufnew(64); if (!text) return; /* Preallocate enough space for our buffer to avoid expanding while copying */ bufgrow(text, doc_size); /* reset the references table */ memset(&md->refs, 0x0, REF_TABLE_SIZE * sizeof(void *)); /* first pass: looking for references, copying everything else */ beg = 0; /* Skip a possible UTF-8 BOM, even though the Unicode standard * discourages having these in UTF-8 documents */ if (doc_size >= 3 && memcmp(document, UTF8_BOM, 3) == 0) beg += 3; while (beg < doc_size) /* iterating over lines */ if (is_ref(document, beg, doc_size, &end, md->refs)) beg = end; else { /* skipping to the next line */ end = beg; while (end < doc_size && document[end] != '\n' && document[end] != '\r') end++; /* adding the line body if present */ if (end > beg) expand_tabs(text, document + beg, end - beg); while (end < doc_size && (document[end] == '\n' || document[end] == '\r')) { /* add one \n per newline */ if (document[end] == '\n' || (end + 1 < doc_size && document[end + 1] != '\n')) bufputc(text, '\n'); end++; } beg = end; } /* pre-grow the output buffer to minimize allocations */ bufgrow(ob, MARKDOWN_GROW(text->size)); /* second pass: actual rendering */ if (md->cb.doc_header) md->cb.doc_header(ob, md->opaque); if (text->size) { /* adding a final newline if not already present */ if (text->data[text->size - 1] != '\n' && text->data[text->size - 1] != '\r') bufputc(text, '\n'); parse_block(ob, md, text->data, text->size); } if (md->cb.doc_footer) md->cb.doc_footer(ob, md->opaque); /* clean-up */ bufrelease(text); free_link_refs(md->refs); assert(md->work_bufs[BUFFER_SPAN].size == 0); assert(md->work_bufs[BUFFER_BLOCK].size == 0); } void sd_markdown_free(struct sd_markdown *md) { size_t i; for (i = 0; i < (size_t)md->work_bufs[BUFFER_SPAN].asize; ++i) bufrelease(md->work_bufs[BUFFER_SPAN].item[i]); for (i = 0; i < (size_t)md->work_bufs[BUFFER_BLOCK].asize; ++i) bufrelease(md->work_bufs[BUFFER_BLOCK].item[i]); stack_free(&md->work_bufs[BUFFER_SPAN]); stack_free(&md->work_bufs[BUFFER_BLOCK]); free(md); } void sd_version(int *ver_major, int *ver_minor, int *ver_revision) { *ver_major = SUNDOWN_VER_MAJOR; *ver_minor = SUNDOWN_VER_MINOR; *ver_revision = SUNDOWN_VER_REVISION; } /* vim: set filetype=c: */ ================================================ FILE: samples/C/multiboot.h ================================================ #pragma once /* Copyright © 2010, 2011 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #define MULTIBOOT_KERNELMAGIC 0x2BADB002 #define MULTIBOOT_FLAG_MEM 0x001 #define MULTIBOOT_FLAG_DEVICE 0x002 #define MULTIBOOT_FLAG_CMDLINE 0x004 #define MULTIBOOT_FLAG_MODS 0x008 #define MULTIBOOT_FLAG_AOUT 0x010 #define MULTIBOOT_FLAG_ELF 0x020 #define MULTIBOOT_FLAG_MMAP 0x040 #define MULTIBOOT_FLAG_CONFIG 0x080 #define MULTIBOOT_FLAG_LOADER 0x100 #define MULTIBOOT_FLAG_APM 0x200 #define MULTIBOOT_FLAG_VBE 0x400 // The symbol table for a.out. typedef struct { uint32_t tabSize; uint32_t strSize; uint32_t addr; uint32_t reserved; } __attribute__((packed)) multiboot_aoutSymbolTable_t; // The section header table for ELF. typedef struct { uint32_t num; uint32_t size; uint32_t addr; uint32_t shndx; } __attribute__((packed)) multiboot_elfSectionHeaderTable_t; typedef struct { uint32_t size; uint64_t addr; uint64_t length; uint32_t type; } __attribute__((packed)) multiboot_memoryMap_t; typedef struct { uint32_t start; uint32_t end; char* cmdLine; uint32_t reserved; } __attribute__((packed)) multiboot_module_t; typedef struct { uint32_t flags; uint32_t memLower; uint32_t memUpper; uint32_t bootDevice; char* cmdLine; uint32_t modsCount; multiboot_module_t* modsAddr; union { multiboot_aoutSymbolTable_t aoutSym; multiboot_elfSectionHeaderTable_t elfSec; } u; uint32_t mmapLength; uint32_t mmapAddr; uint32_t drivesLength; uint32_t drivesAddr; // ROM configuration table uint32_t configTable; char* bootLoaderName; uint32_t apmTable; // Video uint32_t vbeControlInfo; uint32_t vbeModeInfo; uint16_t vbeMode; uint16_t vbeInterfaceSeg; uint16_t vbeInterfaceOff; uint16_t vbeInterfaceLen; } __attribute__((packed)) multiboot_info_t; multiboot_info_t* multiboot_info; void arch_multiboot_printInfo(); ================================================ FILE: samples/C/ntru_encrypt.h ================================================ /* * Copyright (C) 2014 FH Bielefeld * * This file is part of a FH Bielefeld project. * * This library is free software; you can redistribute it and/or * modify it under the terms of the GNU Lesser General Public * License as published by the Free Software Foundation; either * version 2.1 of the License, or (at your option) any later version. * * This library is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU * Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public * License along with this library; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, * MA 02110-1301 USA */ /** * @file ntru_encrypt.h * Header for the internal API of ntru_encrypt.c. * @brief header for encrypt.c */ #ifndef PQC_ENCRYPT_H #define PQC_ENCRYPT_H #include "ntru_params.h" #include "ntru_poly.h" #include "ntru_string.h" #include #include /** * encrypt the msg, using the math: * e = (h ∗ r) + m (mod q) * * e = the encrypted poly * * h = the public key * * r = the random poly * * m = the message poly * * q = large mod * * @param msg_tern the message to encrypt, in ternary format * @param pub_key the public key * @param rnd the random poly (should have relatively small * coefficients, but not restricted to {-1, 0, 1}) * @param out the output poly which is in the range {0, q-1} * (not ternary!) [out] * @param params ntru_params the ntru context */ void ntru_encrypt_poly( const fmpz_poly_t msg_tern, const fmpz_poly_t pub_key, const fmpz_poly_t rnd, fmpz_poly_t out, const ntru_params *params); /** * Encrypt a message in the form of a null-terminated char array and * return a string. * * @param msg the message * @param pub_key the public key * @param rnd the random poly (should have relatively small * coefficients, but not restricted to {-1, 0, 1}) * @param params ntru_params the ntru context * @return the newly allocated encrypted string */ string * ntru_encrypt_string( const string *msg, const fmpz_poly_t pub_key, const fmpz_poly_t rnd, const ntru_params *params); #endif /* PQC_ENCRYPT_H */ ================================================ FILE: samples/C/portio.h ================================================ #pragma once /* Copyright © 2011 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include // Legacy #define outb(args...) portio_out8(args) #define outw(args...) portio_out16(args) #define outl(args...) portio_out32(args) #define outq(args...) portio_out64(args) #define inb(args...) portio_in8(args) #define inw(args...) portio_in16(args) #define inl(args...) portio_in32(args) #define inq(args...) portio_in64(args) void portio_out8(uint16_t port, uint8_t value); void portio_out16(uint16_t port, uint16_t value); void portio_out32(uint16_t port, uint32_t value); void portio_out64(uint16_t port, uint64_t value); uint8_t portio_in8(uint16_t port); uint16_t portio_in16(uint16_t port); uint32_t portio_in32(uint16_t port); uint64_t portio_in64(uint16_t port); ================================================ FILE: samples/C/pqiv.h ================================================ /** * pqiv * * Copyright (c) 2013-2014, Phillip Berndt * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * You should have received a copy of the GNU General Public License * along with this program. If not, see . * */ // This file contains the definition of files, image types and // the plugin infrastructure. It should be included in file type // handlers. #ifndef _PQIV_H_INCLUDED #define _PQIV_H_INCLUDED #include #include #include #include "lib/bostree.h" #ifndef PQIV_VERSION #define PQIV_VERSION "2.3" #endif #define FILE_FLAGS_ANIMATION (guint)(1) #define FILE_FLAGS_MEMORY_IMAGE (guint)(1<<1) // The structure for images {{{ typedef struct file_type_handler_struct_t file_type_handler_t; typedef struct { // File type const file_type_handler_t *file_type; // Special flags // FILE_FLAGS_ANIMATION -> Animation functions are invoked // Set by file type handlers // FILE_FLAGS_MEMORY_IMAGE -> File lives in memory guint file_flags; // The file name to display and to sort by gchar *display_name; // The URI or file name of the file gchar *file_name; // If the file is a memory image, the actual image data GBytes *file_data; // The file monitor structure is used for inotify-watching of // the files GFileMonitor *file_monitor; // This flag stores whether this image is currently loaded // and valid. i.e. if it is set, you can assume that // private_data contains a representation of the image; // if not, you can NOT assume that it does not. gboolean is_loaded; // Cached image size guint width; guint height; // File-type specific data, allocated and freed by the file type handlers void *private; } file_t; // }}} // Definition of the built-in file types {{{ // If you want to implement your own file type, you'll have to implement the // following functions and a non-static initialization function named // file_type_NAME_initializer that fills a file_type_handler_t with pointers to // the functions. Store the file in backends/NAME.c and adjust the Makefile to // add the required libraries if your backend is listed in the $(BACKENDS) // variable. typedef enum { PARAMETER, RECURSION, INOTIFY, BROWSE_ORIGINAL_PARAMETER, FILTER_OUTPUT } load_images_state_t; // Allocation function: Allocate the ->private structure within a file and add the // image(s) to the list of available images via load_images_handle_parameter_add_file() // If an image is not to be loaded for any reason, the file structure should be // deallocated using file_free() // Returns a pointer to the first added image // Optional, you can also set the pointer to this function to NULL. typedef BOSNode *(*file_type_alloc_fn_t)(load_images_state_t state, file_t *file); // Deallocation, if a file is removed from the images list. Free the ->private structure. // Only called if ->private is non-NULL. typedef void (*file_type_free_fn_t)(file_t *file); // Actually load a file into memory typedef void (*file_type_load_fn_t)(file_t *file, GInputStream *data, GError **error_pointer); // Unload a file typedef void (*file_type_unload_fn_t)(file_t *file); // Animation support: Initialize memory for animations, return ms until first frame // Optional, you can also set the pointer to this function to NULL. typedef double (*file_type_animation_initialize_fn_t)(file_t *file); // Animation support: Advance to the next frame, return ms until next frame // Optional, you can also set the pointer to this function to NULL. typedef double (*file_type_animation_next_frame_fn_t)(file_t *file); // Draw the current view to a cairo context typedef void (*file_type_draw_fn_t)(file_t *file, cairo_t *cr); struct file_type_handler_struct_t { // All files will be filtered with this filter. If it lets it pass, // a handler is assigned to a file. If none do, the file is // discarded if it was found during directory traversal or // loaded using the first image backend if it was an explicit // parameter. GtkFileFilter *file_types_handled; // Pointers to the functions defined above file_type_alloc_fn_t alloc_fn; file_type_free_fn_t free_fn; file_type_load_fn_t load_fn; file_type_unload_fn_t unload_fn; file_type_animation_initialize_fn_t animation_initialize_fn; file_type_animation_next_frame_fn_t animation_next_frame_fn; file_type_draw_fn_t draw_fn; }; // Initialization function: Tell pqiv about a backend typedef void (*file_type_initializer_fn_t)(file_type_handler_t *info); // pqiv symbols available to plugins {{{ // Global cancellable that should be used for every i/o operation extern GCancellable *image_loader_cancellable; // Current scale level. For backends that don't support cairo natively. extern gdouble current_scale_level; // Load a file from disc/memory/network GInputStream *image_loader_stream_file(file_t *file, GError **error_pointer); // Add a file to the list of loaded files // Should be called at least once in a file_type_alloc_fn_t, with the state being // forwarded unaltered. BOSNode *load_images_handle_parameter_add_file(load_images_state_t state, file_t *file); // Load all data from an input stream into memory, conveinience function GBytes *g_input_stream_read_completely(GInputStream *input_stream, GCancellable *cancellable, GError **error_pointer); // Free a file void file_free(file_t *file); // }}} // File type handlers, used in the initializer and file type guessing extern file_type_handler_t file_type_handlers[]; /* }}} */ #endif ================================================ FILE: samples/C/process.c ================================================ /* Copyright Joyent, Inc. and other Node contributors. All rights reserved. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to * deal in the Software without restriction, including without limitation the * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or * sell copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in * all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS * IN THE SOFTWARE. */ #include "uv.h" #include "internal.h" #include #include #include #include #include #include #include #ifdef __APPLE__ # include #endif #if defined(__APPLE__) && !TARGET_OS_IPHONE # include # define environ (*_NSGetEnviron()) #else extern char **environ; #endif static void uv__chld(EV_P_ ev_child* watcher, int revents) { int status = watcher->rstatus; int exit_status = 0; int term_signal = 0; uv_process_t *process = watcher->data; assert(&process->child_watcher == watcher); assert(revents & EV_CHILD); ev_child_stop(EV_A_ &process->child_watcher); if (WIFEXITED(status)) { exit_status = WEXITSTATUS(status); } if (WIFSIGNALED(status)) { term_signal = WTERMSIG(status); } if (process->exit_cb) { process->exit_cb(process, exit_status, term_signal); } } int uv__make_socketpair(int fds[2], int flags) { #ifdef SOCK_NONBLOCK int fl; fl = SOCK_CLOEXEC; if (flags & UV__F_NONBLOCK) fl |= SOCK_NONBLOCK; if (socketpair(AF_UNIX, SOCK_STREAM|fl, 0, fds) == 0) return 0; if (errno != EINVAL) return -1; /* errno == EINVAL so maybe the kernel headers lied about * the availability of SOCK_NONBLOCK. This can happen if people * build libuv against newer kernel headers than the kernel * they actually run the software on. */ #endif if (socketpair(AF_UNIX, SOCK_STREAM, 0, fds)) return -1; uv__cloexec(fds[0], 1); uv__cloexec(fds[1], 1); if (flags & UV__F_NONBLOCK) { uv__nonblock(fds[0], 1); uv__nonblock(fds[1], 1); } return 0; } int uv__make_pipe(int fds[2], int flags) { #if __linux__ int fl; fl = UV__O_CLOEXEC; if (flags & UV__F_NONBLOCK) fl |= UV__O_NONBLOCK; if (uv__pipe2(fds, fl) == 0) return 0; if (errno != ENOSYS) return -1; #endif if (pipe(fds)) return -1; uv__cloexec(fds[0], 1); uv__cloexec(fds[1], 1); if (flags & UV__F_NONBLOCK) { uv__nonblock(fds[0], 1); uv__nonblock(fds[1], 1); } return 0; } /* * Used for initializing stdio streams like options.stdin_stream. Returns * zero on success. */ static int uv__process_init_stdio(uv_stdio_container_t* container, int fds[2], int writable) { int fd = -1; switch (container->flags & (UV_IGNORE | UV_CREATE_PIPE | UV_INHERIT_FD | UV_INHERIT_STREAM)) { case UV_IGNORE: return 0; case UV_CREATE_PIPE: assert(container->data.stream != NULL); if (container->data.stream->type != UV_NAMED_PIPE) { errno = EINVAL; return -1; } return uv__make_socketpair(fds, 0); case UV_INHERIT_FD: case UV_INHERIT_STREAM: if (container->flags & UV_INHERIT_FD) { fd = container->data.fd; } else { fd = container->data.stream->fd; } if (fd == -1) { errno = EINVAL; return -1; } fds[writable ? 1 : 0] = fd; return 0; default: assert(0 && "Unexpected flags"); return -1; } } static int uv__process_stdio_flags(uv_stdio_container_t* container, int writable) { if (container->data.stream->type == UV_NAMED_PIPE && ((uv_pipe_t*)container->data.stream)->ipc) { return UV_STREAM_READABLE | UV_STREAM_WRITABLE; } else if (writable) { return UV_STREAM_WRITABLE; } else { return UV_STREAM_READABLE; } } static int uv__process_open_stream(uv_stdio_container_t* container, int fds[2], int writable) { int fd = fds[writable ? 1 : 0]; int child_fd = fds[writable ? 0 : 1]; int flags; /* No need to create stream */ if (!(container->flags & UV_CREATE_PIPE) || fd < 0) { return 0; } assert(child_fd >= 0); close(child_fd); uv__nonblock(fd, 1); flags = uv__process_stdio_flags(container, writable); return uv__stream_open((uv_stream_t*)container->data.stream, fd, flags); } static void uv__process_close_stream(uv_stdio_container_t* container) { if (!(container->flags & UV_CREATE_PIPE)) return; uv__stream_close((uv_stream_t*)container->data.stream); } static void uv__process_child_init(uv_process_options_t options, int stdio_count, int* pipes) { int i; if (options.flags & UV_PROCESS_DETACHED) { setsid(); } /* Dup fds */ for (i = 0; i < stdio_count; i++) { /* * stdin has swapped ends of pipe * (it's the only one readable stream) */ int close_fd = i == 0 ? pipes[i * 2 + 1] : pipes[i * 2]; int use_fd = i == 0 ? pipes[i * 2] : pipes[i * 2 + 1]; if (use_fd >= 0) { close(close_fd); } else if (i < 3) { /* `/dev/null` stdin, stdout, stderr even if they've flag UV_IGNORE */ use_fd = open("/dev/null", i == 0 ? O_RDONLY : O_RDWR); if (use_fd < 0) { perror("failed to open stdio"); _exit(127); } } else { continue; } if (i != use_fd) { dup2(use_fd, i); close(use_fd); } } if (options.cwd && chdir(options.cwd)) { perror("chdir()"); _exit(127); } if ((options.flags & UV_PROCESS_SETGID) && setgid(options.gid)) { perror("setgid()"); _exit(127); } if ((options.flags & UV_PROCESS_SETUID) && setuid(options.uid)) { perror("setuid()"); _exit(127); } environ = options.env; execvp(options.file, options.args); perror("execvp()"); _exit(127); } #ifndef SPAWN_WAIT_EXEC # define SPAWN_WAIT_EXEC 1 #endif int uv_spawn(uv_loop_t* loop, uv_process_t* process, uv_process_options_t options) { /* * Save environ in the case that we get it clobbered * by the child process. */ char** save_our_env = environ; int stdio_count = options.stdio_count < 3 ? 3 : options.stdio_count; int* pipes = malloc(2 * stdio_count * sizeof(int)); #if SPAWN_WAIT_EXEC int signal_pipe[2] = { -1, -1 }; struct pollfd pfd; #endif int status; pid_t pid; int i; if (pipes == NULL) { errno = ENOMEM; goto error; } assert(options.file != NULL); assert(!(options.flags & ~(UV_PROCESS_WINDOWS_VERBATIM_ARGUMENTS | UV_PROCESS_DETACHED | UV_PROCESS_SETGID | UV_PROCESS_SETUID))); uv__handle_init(loop, (uv_handle_t*)process, UV_PROCESS); loop->counters.process_init++; uv__handle_start(process); process->exit_cb = options.exit_cb; /* Init pipe pairs */ for (i = 0; i < stdio_count; i++) { pipes[i * 2] = -1; pipes[i * 2 + 1] = -1; } /* Create socketpairs/pipes, or use raw fd */ for (i = 0; i < options.stdio_count; i++) { if (uv__process_init_stdio(&options.stdio[i], pipes + i * 2, i != 0)) { goto error; } } /* This pipe is used by the parent to wait until * the child has called `execve()`. We need this * to avoid the following race condition: * * if ((pid = fork()) > 0) { * kill(pid, SIGTERM); * } * else if (pid == 0) { * execve("/bin/cat", argp, envp); * } * * The parent sends a signal immediately after forking. * Since the child may not have called `execve()` yet, * there is no telling what process receives the signal, * our fork or /bin/cat. * * To avoid ambiguity, we create a pipe with both ends * marked close-on-exec. Then, after the call to `fork()`, * the parent polls the read end until it sees POLLHUP. */ #if SPAWN_WAIT_EXEC if (uv__make_pipe(signal_pipe, UV__F_NONBLOCK)) goto error; #endif pid = fork(); if (pid == -1) { #if SPAWN_WAIT_EXEC close(signal_pipe[0]); close(signal_pipe[1]); #endif environ = save_our_env; goto error; } if (pid == 0) { /* Child */ uv__process_child_init(options, stdio_count, pipes); /* Execution never reaches here. */ } /* Parent. */ /* Restore environment. */ environ = save_our_env; #if SPAWN_WAIT_EXEC /* POLLHUP signals child has exited or execve()'d. */ close(signal_pipe[1]); do { pfd.fd = signal_pipe[0]; pfd.events = POLLIN|POLLHUP; pfd.revents = 0; errno = 0, status = poll(&pfd, 1, -1); } while (status == -1 && (errno == EINTR || errno == ENOMEM)); assert((status == 1) && "poll() on pipe read end failed"); close(signal_pipe[0]); #endif process->pid = pid; ev_child_init(&process->child_watcher, uv__chld, pid, 0); ev_child_start(process->loop->ev, &process->child_watcher); process->child_watcher.data = process; for (i = 0; i < options.stdio_count; i++) { if (uv__process_open_stream(&options.stdio[i], pipes + i * 2, i == 0)) { int j; /* Close all opened streams */ for (j = 0; j < i; j++) { uv__process_close_stream(&options.stdio[j]); } goto error; } } free(pipes); return 0; error: uv__set_sys_error(process->loop, errno); for (i = 0; i < stdio_count; i++) { close(pipes[i * 2]); close(pipes[i * 2 + 1]); } free(pipes); return -1; } int uv_process_kill(uv_process_t* process, int signum) { int r = kill(process->pid, signum); if (r) { uv__set_sys_error(process->loop, errno); return -1; } else { return 0; } } uv_err_t uv_kill(int pid, int signum) { int r = kill(pid, signum); if (r) { return uv__new_sys_error(errno); } else { return uv_ok_; } } void uv__process_close(uv_process_t* handle) { ev_child_stop(handle->loop->ev, &handle->child_watcher); uv__handle_stop(handle); } ================================================ FILE: samples/C/rdiscount.c ================================================ #include #include "ruby.h" #include "mkdio.h" static VALUE rb_cRDiscount; static VALUE rb_rdiscount_to_html(int argc, VALUE *argv, VALUE self) { /* grab char pointer to markdown input text */ char *res; int szres; VALUE encoding; VALUE text = rb_funcall(self, rb_intern("text"), 0); VALUE buf = rb_str_buf_new(1024); Check_Type(text, T_STRING); int flags = rb_rdiscount__get_flags(self); MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags); if ( mkd_compile(doc, flags) ) { szres = mkd_document(doc, &res); if ( szres != EOF ) { rb_str_cat(buf, res, szres); rb_str_cat(buf, "\n", 1); } } mkd_cleanup(doc); /* force the input encoding */ if ( rb_respond_to(text, rb_intern("encoding")) ) { encoding = rb_funcall(text, rb_intern("encoding"), 0); rb_funcall(buf, rb_intern("force_encoding"), 1, encoding); } return buf; } static VALUE rb_rdiscount_toc_content(int argc, VALUE *argv, VALUE self) { char *res; int szres; int flags = rb_rdiscount__get_flags(self); /* grab char pointer to markdown input text */ VALUE text = rb_funcall(self, rb_intern("text"), 0); Check_Type(text, T_STRING); /* allocate a ruby string buffer and wrap it in a stream */ VALUE buf = rb_str_buf_new(4096); MMIOT *doc = mkd_string(RSTRING_PTR(text), RSTRING_LEN(text), flags); if ( mkd_compile(doc, flags) ) { szres = mkd_toc(doc, &res); if ( szres != EOF ) { rb_str_cat(buf, res, szres); rb_str_cat(buf, "\n", 1); } } mkd_cleanup(doc); return buf; } int rb_rdiscount__get_flags(VALUE ruby_obj) { /* compile flags */ int flags = MKD_TABSTOP | MKD_NOHEADER; /* smart */ if ( rb_funcall(ruby_obj, rb_intern("smart"), 0) != Qtrue ) flags = flags | MKD_NOPANTS; /* filter_html */ if ( rb_funcall(ruby_obj, rb_intern("filter_html"), 0) == Qtrue ) flags = flags | MKD_NOHTML; /* generate_toc */ if ( rb_funcall(ruby_obj, rb_intern("generate_toc"), 0) == Qtrue) flags = flags | MKD_TOC; /* no_image */ if ( rb_funcall(ruby_obj, rb_intern("no_image"), 0) == Qtrue) flags = flags | MKD_NOIMAGE; /* no_links */ if ( rb_funcall(ruby_obj, rb_intern("no_links"), 0) == Qtrue) flags = flags | MKD_NOLINKS; /* no_tables */ if ( rb_funcall(ruby_obj, rb_intern("no_tables"), 0) == Qtrue) flags = flags | MKD_NOTABLES; /* strict */ if ( rb_funcall(ruby_obj, rb_intern("strict"), 0) == Qtrue) flags = flags | MKD_STRICT; /* autolink */ if ( rb_funcall(ruby_obj, rb_intern("autolink"), 0) == Qtrue) flags = flags | MKD_AUTOLINK; /* safelink */ if ( rb_funcall(ruby_obj, rb_intern("safelink"), 0) == Qtrue) flags = flags | MKD_SAFELINK; /* no_pseudo_protocols */ if ( rb_funcall(ruby_obj, rb_intern("no_pseudo_protocols"), 0) == Qtrue) flags = flags | MKD_NO_EXT; return flags; } void Init_rdiscount() { rb_cRDiscount = rb_define_class("RDiscount", rb_cObject); rb_define_method(rb_cRDiscount, "to_html", rb_rdiscount_to_html, -1); rb_define_method(rb_cRDiscount, "toc_content", rb_rdiscount_toc_content, -1); } /* vim: set ts=4 sw=4: */ ================================================ FILE: samples/C/readline.cats ================================================ /* ** API in ATS for GNU-readline */ /* ****** ****** */ /* ** Permission to use, copy, modify, and distribute this software for any ** purpose with or without fee is hereby granted, provided that the above ** copyright notice and this permission notice appear in all copies. ** ** THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES ** WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF ** MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ** ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES ** WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ** ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF ** OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /* ****** ****** */ #ifndef READLINE_READLINE_CATS #define READLINE_READLINE_CATS /* ****** ****** */ #include /* ****** ****** */ // #define \ atscntrb_readline_rl_library_version() ((char*)rl_library_version) // #define atscntrb_readline_rl_readline_version() (rl_readline_version) // /* ****** ****** */ #define atscntrb_readline_readline readline /* ****** ****** */ #endif // ifndef READLINE_READLINE_CATS /* ****** ****** */ /* end of [readline.cats] */ ================================================ FILE: samples/C/redis.c ================================================ /* * Copyright (c) 2009-2010, Salvatore Sanfilippo * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are met: * * * Redistributions of source code must retain the above copyright notice, * this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * Neither the name of Redis nor the names of its contributors may be used * to endorse or promote products derived from this software without * specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "redis.h" #include "slowlog.h" #include "bio.h" #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include /* Our shared "common" objects */ struct sharedObjectsStruct shared; /* Global vars that are actually used as constants. The following double * values are used for double on-disk serialization, and are initialized * at runtime to avoid strange compiler optimizations. */ double R_Zero, R_PosInf, R_NegInf, R_Nan; /*================================= Globals ================================= */ /* Global vars */ struct redisServer server; /* server global state */ struct redisCommand *commandTable; /* Our command table. * * Every entry is composed of the following fields: * * name: a string representing the command name. * function: pointer to the C function implementing the command. * arity: number of arguments, it is possible to use -N to say >= N * sflags: command flags as string. See below for a table of flags. * flags: flags as bitmask. Computed by Redis using the 'sflags' field. * get_keys_proc: an optional function to get key arguments from a command. * This is only used when the following three fields are not * enough to specify what arguments are keys. * first_key_index: first argument that is a key * last_key_index: last argument that is a key * key_step: step to get all the keys from first to last argument. For instance * in MSET the step is two since arguments are key,val,key,val,... * microseconds: microseconds of total execution time for this command. * calls: total number of calls of this command. * * The flags, microseconds and calls fields are computed by Redis and should * always be set to zero. * * Command flags are expressed using strings where every character represents * a flag. Later the populateCommandTable() function will take care of * populating the real 'flags' field using this characters. * * This is the meaning of the flags: * * w: write command (may modify the key space). * r: read command (will never modify the key space). * m: may increase memory usage once called. Don't allow if out of memory. * a: admin command, like SAVE or SHUTDOWN. * p: Pub/Sub related command. * f: force replication of this command, regarless of server.dirty. * s: command not allowed in scripts. * R: random command. Command is not deterministic, that is, the same command * with the same arguments, with the same key space, may have different * results. For instance SPOP and RANDOMKEY are two random commands. * S: Sort command output array if called from script, so that the output * is deterministic. */ struct redisCommand redisCommandTable[] = { {"get",getCommand,2,"r",0,NULL,1,1,1,0,0}, {"set",setCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"setnx",setnxCommand,3,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"setex",setexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"psetex",psetexCommand,4,"wm",0,noPreloadGetKeys,1,1,1,0,0}, {"append",appendCommand,3,"wm",0,NULL,1,1,1,0,0}, {"strlen",strlenCommand,2,"r",0,NULL,1,1,1,0,0}, {"del",delCommand,-2,"w",0,noPreloadGetKeys,1,-1,1,0,0}, {"exists",existsCommand,2,"r",0,NULL,1,1,1,0,0}, {"setbit",setbitCommand,4,"wm",0,NULL,1,1,1,0,0}, {"getbit",getbitCommand,3,"r",0,NULL,1,1,1,0,0}, {"setrange",setrangeCommand,4,"wm",0,NULL,1,1,1,0,0}, {"getrange",getrangeCommand,4,"r",0,NULL,1,1,1,0,0}, {"substr",getrangeCommand,4,"r",0,NULL,1,1,1,0,0}, {"incr",incrCommand,2,"wm",0,NULL,1,1,1,0,0}, {"decr",decrCommand,2,"wm",0,NULL,1,1,1,0,0}, {"mget",mgetCommand,-2,"r",0,NULL,1,-1,1,0,0}, {"rpush",rpushCommand,-3,"wm",0,NULL,1,1,1,0,0}, {"lpush",lpushCommand,-3,"wm",0,NULL,1,1,1,0,0}, {"rpushx",rpushxCommand,3,"wm",0,NULL,1,1,1,0,0}, {"lpushx",lpushxCommand,3,"wm",0,NULL,1,1,1,0,0}, {"linsert",linsertCommand,5,"wm",0,NULL,1,1,1,0,0}, {"rpop",rpopCommand,2,"w",0,NULL,1,1,1,0,0}, {"lpop",lpopCommand,2,"w",0,NULL,1,1,1,0,0}, {"brpop",brpopCommand,-3,"ws",0,NULL,1,1,1,0,0}, {"brpoplpush",brpoplpushCommand,4,"wms",0,NULL,1,2,1,0,0}, {"blpop",blpopCommand,-3,"ws",0,NULL,1,-2,1,0,0}, {"llen",llenCommand,2,"r",0,NULL,1,1,1,0,0}, {"lindex",lindexCommand,3,"r",0,NULL,1,1,1,0,0}, {"lset",lsetCommand,4,"wm",0,NULL,1,1,1,0,0}, {"lrange",lrangeCommand,4,"r",0,NULL,1,1,1,0,0}, {"ltrim",ltrimCommand,4,"w",0,NULL,1,1,1,0,0}, {"lrem",lremCommand,4,"w",0,NULL,1,1,1,0,0}, {"rpoplpush",rpoplpushCommand,3,"wm",0,NULL,1,2,1,0,0}, {"sadd",saddCommand,-3,"wm",0,NULL,1,1,1,0,0}, {"srem",sremCommand,-3,"w",0,NULL,1,1,1,0,0}, {"smove",smoveCommand,4,"w",0,NULL,1,2,1,0,0}, {"sismember",sismemberCommand,3,"r",0,NULL,1,1,1,0,0}, {"scard",scardCommand,2,"r",0,NULL,1,1,1,0,0}, {"spop",spopCommand,2,"wRs",0,NULL,1,1,1,0,0}, {"srandmember",srandmemberCommand,2,"rR",0,NULL,1,1,1,0,0}, {"sinter",sinterCommand,-2,"rS",0,NULL,1,-1,1,0,0}, {"sinterstore",sinterstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0}, {"sunion",sunionCommand,-2,"rS",0,NULL,1,-1,1,0,0}, {"sunionstore",sunionstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0}, {"sdiff",sdiffCommand,-2,"rS",0,NULL,1,-1,1,0,0}, {"sdiffstore",sdiffstoreCommand,-3,"wm",0,NULL,1,-1,1,0,0}, {"smembers",sinterCommand,2,"rS",0,NULL,1,1,1,0,0}, {"zadd",zaddCommand,-4,"wm",0,NULL,1,1,1,0,0}, {"zincrby",zincrbyCommand,4,"wm",0,NULL,1,1,1,0,0}, {"zrem",zremCommand,-3,"w",0,NULL,1,1,1,0,0}, {"zremrangebyscore",zremrangebyscoreCommand,4,"w",0,NULL,1,1,1,0,0}, {"zremrangebyrank",zremrangebyrankCommand,4,"w",0,NULL,1,1,1,0,0}, {"zunionstore",zunionstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0}, {"zinterstore",zinterstoreCommand,-4,"wm",0,zunionInterGetKeys,0,0,0,0,0}, {"zrange",zrangeCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zrangebyscore",zrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zrevrangebyscore",zrevrangebyscoreCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zcount",zcountCommand,4,"r",0,NULL,1,1,1,0,0}, {"zrevrange",zrevrangeCommand,-4,"r",0,NULL,1,1,1,0,0}, {"zcard",zcardCommand,2,"r",0,NULL,1,1,1,0,0}, {"zscore",zscoreCommand,3,"r",0,NULL,1,1,1,0,0}, {"zrank",zrankCommand,3,"r",0,NULL,1,1,1,0,0}, {"zrevrank",zrevrankCommand,3,"r",0,NULL,1,1,1,0,0}, {"hset",hsetCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hsetnx",hsetnxCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hget",hgetCommand,3,"r",0,NULL,1,1,1,0,0}, {"hmset",hmsetCommand,-4,"wm",0,NULL,1,1,1,0,0}, {"hmget",hmgetCommand,-3,"r",0,NULL,1,1,1,0,0}, {"hincrby",hincrbyCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hincrbyfloat",hincrbyfloatCommand,4,"wm",0,NULL,1,1,1,0,0}, {"hdel",hdelCommand,-3,"w",0,NULL,1,1,1,0,0}, {"hlen",hlenCommand,2,"r",0,NULL,1,1,1,0,0}, {"hkeys",hkeysCommand,2,"rS",0,NULL,1,1,1,0,0}, {"hvals",hvalsCommand,2,"rS",0,NULL,1,1,1,0,0}, {"hgetall",hgetallCommand,2,"r",0,NULL,1,1,1,0,0}, {"hexists",hexistsCommand,3,"r",0,NULL,1,1,1,0,0}, {"incrby",incrbyCommand,3,"wm",0,NULL,1,1,1,0,0}, {"decrby",decrbyCommand,3,"wm",0,NULL,1,1,1,0,0}, {"incrbyfloat",incrbyfloatCommand,3,"wm",0,NULL,1,1,1,0,0}, {"getset",getsetCommand,3,"wm",0,NULL,1,1,1,0,0}, {"mset",msetCommand,-3,"wm",0,NULL,1,-1,2,0,0}, {"msetnx",msetnxCommand,-3,"wm",0,NULL,1,-1,2,0,0}, {"randomkey",randomkeyCommand,1,"rR",0,NULL,0,0,0,0,0}, {"select",selectCommand,2,"r",0,NULL,0,0,0,0,0}, {"move",moveCommand,3,"w",0,NULL,1,1,1,0,0}, {"rename",renameCommand,3,"w",0,renameGetKeys,1,2,1,0,0}, {"renamenx",renamenxCommand,3,"w",0,renameGetKeys,1,2,1,0,0}, {"expire",expireCommand,3,"w",0,NULL,1,1,1,0,0}, {"expireat",expireatCommand,3,"w",0,NULL,1,1,1,0,0}, {"pexpire",pexpireCommand,3,"w",0,NULL,1,1,1,0,0}, {"pexpireat",pexpireatCommand,3,"w",0,NULL,1,1,1,0,0}, {"keys",keysCommand,2,"rS",0,NULL,0,0,0,0,0}, {"dbsize",dbsizeCommand,1,"r",0,NULL,0,0,0,0,0}, {"auth",authCommand,2,"rs",0,NULL,0,0,0,0,0}, {"ping",pingCommand,1,"r",0,NULL,0,0,0,0,0}, {"echo",echoCommand,2,"r",0,NULL,0,0,0,0,0}, {"save",saveCommand,1,"ars",0,NULL,0,0,0,0,0}, {"bgsave",bgsaveCommand,1,"ar",0,NULL,0,0,0,0,0}, {"bgrewriteaof",bgrewriteaofCommand,1,"ar",0,NULL,0,0,0,0,0}, {"shutdown",shutdownCommand,-1,"ar",0,NULL,0,0,0,0,0}, {"lastsave",lastsaveCommand,1,"r",0,NULL,0,0,0,0,0}, {"type",typeCommand,2,"r",0,NULL,1,1,1,0,0}, {"multi",multiCommand,1,"rs",0,NULL,0,0,0,0,0}, {"exec",execCommand,1,"s",0,NULL,0,0,0,0,0}, {"discard",discardCommand,1,"rs",0,NULL,0,0,0,0,0}, {"sync",syncCommand,1,"ars",0,NULL,0,0,0,0,0}, {"flushdb",flushdbCommand,1,"w",0,NULL,0,0,0,0,0}, {"flushall",flushallCommand,1,"w",0,NULL,0,0,0,0,0}, {"sort",sortCommand,-2,"wmS",0,NULL,1,1,1,0,0}, {"info",infoCommand,-1,"r",0,NULL,0,0,0,0,0}, {"monitor",monitorCommand,1,"ars",0,NULL,0,0,0,0,0}, {"ttl",ttlCommand,2,"r",0,NULL,1,1,1,0,0}, {"pttl",pttlCommand,2,"r",0,NULL,1,1,1,0,0}, {"persist",persistCommand,2,"w",0,NULL,1,1,1,0,0}, {"slaveof",slaveofCommand,3,"as",0,NULL,0,0,0,0,0}, {"debug",debugCommand,-2,"as",0,NULL,0,0,0,0,0}, {"config",configCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"subscribe",subscribeCommand,-2,"rps",0,NULL,0,0,0,0,0}, {"unsubscribe",unsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0}, {"psubscribe",psubscribeCommand,-2,"rps",0,NULL,0,0,0,0,0}, {"punsubscribe",punsubscribeCommand,-1,"rps",0,NULL,0,0,0,0,0}, {"publish",publishCommand,3,"pf",0,NULL,0,0,0,0,0}, {"watch",watchCommand,-2,"rs",0,noPreloadGetKeys,1,-1,1,0,0}, {"unwatch",unwatchCommand,1,"rs",0,NULL,0,0,0,0,0}, {"cluster",clusterCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"restore",restoreCommand,4,"awm",0,NULL,1,1,1,0,0}, {"migrate",migrateCommand,6,"aw",0,NULL,0,0,0,0,0}, {"asking",askingCommand,1,"r",0,NULL,0,0,0,0,0}, {"dump",dumpCommand,2,"ar",0,NULL,1,1,1,0,0}, {"object",objectCommand,-2,"r",0,NULL,2,2,2,0,0}, {"client",clientCommand,-2,"ar",0,NULL,0,0,0,0,0}, {"eval",evalCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0}, {"evalsha",evalShaCommand,-3,"s",0,zunionInterGetKeys,0,0,0,0,0}, {"slowlog",slowlogCommand,-2,"r",0,NULL,0,0,0,0,0}, {"script",scriptCommand,-2,"ras",0,NULL,0,0,0,0,0}, {"time",timeCommand,1,"rR",0,NULL,0,0,0,0,0}, {"bitop",bitopCommand,-4,"wm",0,NULL,2,-1,1,0,0}, {"bitcount",bitcountCommand,-2,"r",0,NULL,1,1,1,0,0} }; /*============================ Utility functions ============================ */ /* Low level logging. To use only for very big messages, otherwise * redisLog() is to prefer. */ void redisLogRaw(int level, const char *msg) { const int syslogLevelMap[] = { LOG_DEBUG, LOG_INFO, LOG_NOTICE, LOG_WARNING }; const char *c = ".-*#"; FILE *fp; char buf[64]; int rawmode = (level & REDIS_LOG_RAW); level &= 0xff; /* clear flags */ if (level < server.verbosity) return; fp = (server.logfile == NULL) ? stdout : fopen(server.logfile,"a"); if (!fp) return; if (rawmode) { fprintf(fp,"%s",msg); } else { int off; struct timeval tv; gettimeofday(&tv,NULL); off = strftime(buf,sizeof(buf),"%d %b %H:%M:%S.",localtime(&tv.tv_sec)); snprintf(buf+off,sizeof(buf)-off,"%03d",(int)tv.tv_usec/1000); fprintf(fp,"[%d] %s %c %s\n",(int)getpid(),buf,c[level],msg); } fflush(fp); if (server.logfile) fclose(fp); if (server.syslog_enabled) syslog(syslogLevelMap[level], "%s", msg); } /* Like redisLogRaw() but with printf-alike support. This is the funciton that * is used across the code. The raw version is only used in order to dump * the INFO output on crash. */ void redisLog(int level, const char *fmt, ...) { va_list ap; char msg[REDIS_MAX_LOGMSG_LEN]; if ((level&0xff) < server.verbosity) return; va_start(ap, fmt); vsnprintf(msg, sizeof(msg), fmt, ap); va_end(ap); redisLogRaw(level,msg); } /* Log a fixed message without printf-alike capabilities, in a way that is * safe to call from a signal handler. * * We actually use this only for signals that are not fatal from the point * of view of Redis. Signals that are going to kill the server anyway and * where we need printf-alike features are served by redisLog(). */ void redisLogFromHandler(int level, const char *msg) { int fd; char buf[64]; if ((level&0xff) < server.verbosity || (server.logfile == NULL && server.daemonize)) return; fd = server.logfile ? open(server.logfile, O_APPEND|O_CREAT|O_WRONLY, 0644) : STDOUT_FILENO; if (fd == -1) return; ll2string(buf,sizeof(buf),getpid()); if (write(fd,"[",1) == -1) goto err; if (write(fd,buf,strlen(buf)) == -1) goto err; if (write(fd," | signal handler] (",20) == -1) goto err; ll2string(buf,sizeof(buf),time(NULL)); if (write(fd,buf,strlen(buf)) == -1) goto err; if (write(fd,") ",2) == -1) goto err; if (write(fd,msg,strlen(msg)) == -1) goto err; if (write(fd,"\n",1) == -1) goto err; err: if (server.logfile) close(fd); } /* Redis generally does not try to recover from out of memory conditions * when allocating objects or strings, it is not clear if it will be possible * to report this condition to the client since the networking layer itself * is based on heap allocation for send buffers, so we simply abort. * At least the code will be simpler to read... */ void oom(const char *msg) { redisLog(REDIS_WARNING, "%s: Out of memory\n",msg); sleep(1); abort(); } /* Return the UNIX time in microseconds */ long long ustime(void) { struct timeval tv; long long ust; gettimeofday(&tv, NULL); ust = ((long long)tv.tv_sec)*1000000; ust += tv.tv_usec; return ust; } /* Return the UNIX time in milliseconds */ long long mstime(void) { return ustime()/1000; } /* After an RDB dump or AOF rewrite we exit from children using _exit() instead of * exit(), because the latter may interact with the same file objects used by * the parent process. However if we are testing the coverage normal exit() is * used in order to obtain the right coverage information. */ void exitFromChild(int retcode) { #ifdef COVERAGE_TEST exit(retcode); #else _exit(retcode); #endif } /*====================== Hash table type implementation ==================== */ /* This is an hash table type that uses the SDS dynamic strings libary as * keys and radis objects as values (objects can hold SDS strings, * lists, sets). */ void dictVanillaFree(void *privdata, void *val) { DICT_NOTUSED(privdata); zfree(val); } void dictListDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); listRelease((list*)val); } int dictSdsKeyCompare(void *privdata, const void *key1, const void *key2) { int l1,l2; DICT_NOTUSED(privdata); l1 = sdslen((sds)key1); l2 = sdslen((sds)key2); if (l1 != l2) return 0; return memcmp(key1, key2, l1) == 0; } /* A case insensitive version used for the command lookup table. */ int dictSdsKeyCaseCompare(void *privdata, const void *key1, const void *key2) { DICT_NOTUSED(privdata); return strcasecmp(key1, key2) == 0; } void dictRedisObjectDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); if (val == NULL) return; /* Values of swapped out keys as set to NULL */ decrRefCount(val); } void dictSdsDestructor(void *privdata, void *val) { DICT_NOTUSED(privdata); sdsfree(val); } int dictObjKeyCompare(void *privdata, const void *key1, const void *key2) { const robj *o1 = key1, *o2 = key2; return dictSdsKeyCompare(privdata,o1->ptr,o2->ptr); } unsigned int dictObjHash(const void *key) { const robj *o = key; return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); } unsigned int dictSdsHash(const void *key) { return dictGenHashFunction((unsigned char*)key, sdslen((char*)key)); } unsigned int dictSdsCaseHash(const void *key) { return dictGenCaseHashFunction((unsigned char*)key, sdslen((char*)key)); } int dictEncObjKeyCompare(void *privdata, const void *key1, const void *key2) { robj *o1 = (robj*) key1, *o2 = (robj*) key2; int cmp; if (o1->encoding == REDIS_ENCODING_INT && o2->encoding == REDIS_ENCODING_INT) return o1->ptr == o2->ptr; o1 = getDecodedObject(o1); o2 = getDecodedObject(o2); cmp = dictSdsKeyCompare(privdata,o1->ptr,o2->ptr); decrRefCount(o1); decrRefCount(o2); return cmp; } unsigned int dictEncObjHash(const void *key) { robj *o = (robj*) key; if (o->encoding == REDIS_ENCODING_RAW) { return dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); } else { if (o->encoding == REDIS_ENCODING_INT) { char buf[32]; int len; len = ll2string(buf,32,(long)o->ptr); return dictGenHashFunction((unsigned char*)buf, len); } else { unsigned int hash; o = getDecodedObject(o); hash = dictGenHashFunction(o->ptr, sdslen((sds)o->ptr)); decrRefCount(o); return hash; } } } /* Sets type hash table */ dictType setDictType = { dictEncObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictEncObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ NULL /* val destructor */ }; /* Sorted sets hash (note: a skiplist is used in addition to the hash table) */ dictType zsetDictType = { dictEncObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictEncObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ NULL /* val destructor */ }; /* Db->dict, keys are sds strings, vals are Redis objects. */ dictType dbDictType = { dictSdsHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCompare, /* key compare */ dictSdsDestructor, /* key destructor */ dictRedisObjectDestructor /* val destructor */ }; /* Db->expires */ dictType keyptrDictType = { dictSdsHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCompare, /* key compare */ NULL, /* key destructor */ NULL /* val destructor */ }; /* Command table. sds string -> command struct pointer. */ dictType commandTableDictType = { dictSdsCaseHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCaseCompare, /* key compare */ dictSdsDestructor, /* key destructor */ NULL /* val destructor */ }; /* Hash type hash table (note that small hashes are represented with zimpaps) */ dictType hashDictType = { dictEncObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictEncObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ dictRedisObjectDestructor /* val destructor */ }; /* Keylist hash table type has unencoded redis objects as keys and * lists as values. It's used for blocking operations (BLPOP) and to * map swapped keys to a list of clients waiting for this keys to be loaded. */ dictType keylistDictType = { dictObjHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictObjKeyCompare, /* key compare */ dictRedisObjectDestructor, /* key destructor */ dictListDestructor /* val destructor */ }; /* Cluster nodes hash table, mapping nodes addresses 1.2.3.4:6379 to * clusterNode structures. */ dictType clusterNodesDictType = { dictSdsHash, /* hash function */ NULL, /* key dup */ NULL, /* val dup */ dictSdsKeyCompare, /* key compare */ dictSdsDestructor, /* key destructor */ NULL /* val destructor */ }; int htNeedsResize(dict *dict) { long long size, used; size = dictSlots(dict); used = dictSize(dict); return (size && used && size > DICT_HT_INITIAL_SIZE && (used*100/size < REDIS_HT_MINFILL)); } /* If the percentage of used slots in the HT reaches REDIS_HT_MINFILL * we resize the hash table to save memory */ void tryResizeHashTables(void) { int j; for (j = 0; j < server.dbnum; j++) { if (htNeedsResize(server.db[j].dict)) dictResize(server.db[j].dict); if (htNeedsResize(server.db[j].expires)) dictResize(server.db[j].expires); } } /* Our hash table implementation performs rehashing incrementally while * we write/read from the hash table. Still if the server is idle, the hash * table will use two tables for a long time. So we try to use 1 millisecond * of CPU time at every serverCron() loop in order to rehash some key. */ void incrementallyRehash(void) { int j; for (j = 0; j < server.dbnum; j++) { /* Keys dictionary */ if (dictIsRehashing(server.db[j].dict)) { dictRehashMilliseconds(server.db[j].dict,1); break; /* already used our millisecond for this loop... */ } /* Expires */ if (dictIsRehashing(server.db[j].expires)) { dictRehashMilliseconds(server.db[j].expires,1); break; /* already used our millisecond for this loop... */ } } } /* This function is called once a background process of some kind terminates, * as we want to avoid resizing the hash tables when there is a child in order * to play well with copy-on-write (otherwise when a resize happens lots of * memory pages are copied). The goal of this function is to update the ability * for dict.c to resize the hash tables accordingly to the fact we have o not * running childs. */ void updateDictResizePolicy(void) { if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) dictEnableResize(); else dictDisableResize(); } /* ======================= Cron: called every 100 ms ======================== */ /* Try to expire a few timed out keys. The algorithm used is adaptive and * will use few CPU cycles if there are few expiring keys, otherwise * it will get more aggressive to avoid that too much memory is used by * keys that can be removed from the keyspace. */ void activeExpireCycle(void) { int j, iteration = 0; long long start = ustime(), timelimit; /* We can use at max REDIS_EXPIRELOOKUPS_TIME_PERC percentage of CPU time * per iteration. Since this function gets called with a frequency of * REDIS_HZ times per second, the following is the max amount of * microseconds we can spend in this function. */ timelimit = 1000000*REDIS_EXPIRELOOKUPS_TIME_PERC/REDIS_HZ/100; if (timelimit <= 0) timelimit = 1; for (j = 0; j < server.dbnum; j++) { int expired; redisDb *db = server.db+j; /* Continue to expire if at the end of the cycle more than 25% * of the keys were expired. */ do { unsigned long num = dictSize(db->expires); unsigned long slots = dictSlots(db->expires); long long now = mstime(); /* When there are less than 1% filled slots getting random * keys is expensive, so stop here waiting for better times... * The dictionary will be resized asap. */ if (num && slots > DICT_HT_INITIAL_SIZE && (num*100/slots < 1)) break; /* The main collection cycle. Sample random keys among keys * with an expire set, checking for expired ones. */ expired = 0; if (num > REDIS_EXPIRELOOKUPS_PER_CRON) num = REDIS_EXPIRELOOKUPS_PER_CRON; while (num--) { dictEntry *de; long long t; if ((de = dictGetRandomKey(db->expires)) == NULL) break; t = dictGetSignedIntegerVal(de); if (now > t) { sds key = dictGetKey(de); robj *keyobj = createStringObject(key,sdslen(key)); propagateExpire(db,keyobj); dbDelete(db,keyobj); decrRefCount(keyobj); expired++; server.stat_expiredkeys++; } } /* We can't block forever here even if there are many keys to * expire. So after a given amount of milliseconds return to the * caller waiting for the other active expire cycle. */ iteration++; if ((iteration & 0xf) == 0 && /* check once every 16 cycles. */ (ustime()-start) > timelimit) return; } while (expired > REDIS_EXPIRELOOKUPS_PER_CRON/4); } } void updateLRUClock(void) { server.lruclock = (server.unixtime/REDIS_LRU_CLOCK_RESOLUTION) & REDIS_LRU_CLOCK_MAX; } /* Add a sample to the operations per second array of samples. */ void trackOperationsPerSecond(void) { long long t = mstime() - server.ops_sec_last_sample_time; long long ops = server.stat_numcommands - server.ops_sec_last_sample_ops; long long ops_sec; ops_sec = t > 0 ? (ops*1000/t) : 0; server.ops_sec_samples[server.ops_sec_idx] = ops_sec; server.ops_sec_idx = (server.ops_sec_idx+1) % REDIS_OPS_SEC_SAMPLES; server.ops_sec_last_sample_time = mstime(); server.ops_sec_last_sample_ops = server.stat_numcommands; } /* Return the mean of all the samples. */ long long getOperationsPerSecond(void) { int j; long long sum = 0; for (j = 0; j < REDIS_OPS_SEC_SAMPLES; j++) sum += server.ops_sec_samples[j]; return sum / REDIS_OPS_SEC_SAMPLES; } /* Check for timeouts. Returns non-zero if the client was terminated */ int clientsCronHandleTimeout(redisClient *c) { time_t now = server.unixtime; if (server.maxidletime && !(c->flags & REDIS_SLAVE) && /* no timeout for slaves */ !(c->flags & REDIS_MASTER) && /* no timeout for masters */ !(c->flags & REDIS_BLOCKED) && /* no timeout for BLPOP */ dictSize(c->pubsub_channels) == 0 && /* no timeout for pubsub */ listLength(c->pubsub_patterns) == 0 && (now - c->lastinteraction > server.maxidletime)) { redisLog(REDIS_VERBOSE,"Closing idle client"); freeClient(c); return 1; } else if (c->flags & REDIS_BLOCKED) { if (c->bpop.timeout != 0 && c->bpop.timeout < now) { addReply(c,shared.nullmultibulk); unblockClientWaitingData(c); } } return 0; } /* The client query buffer is an sds.c string that can end with a lot of * free space not used, this function reclaims space if needed. * * The funciton always returns 0 as it never terminates the client. */ int clientsCronResizeQueryBuffer(redisClient *c) { size_t querybuf_size = sdsAllocSize(c->querybuf); time_t idletime = server.unixtime - c->lastinteraction; /* There are two conditions to resize the query buffer: * 1) Query buffer is > BIG_ARG and too big for latest peak. * 2) Client is inactive and the buffer is bigger than 1k. */ if (((querybuf_size > REDIS_MBULK_BIG_ARG) && (querybuf_size/(c->querybuf_peak+1)) > 2) || (querybuf_size > 1024 && idletime > 2)) { /* Only resize the query buffer if it is actually wasting space. */ if (sdsavail(c->querybuf) > 1024) { c->querybuf = sdsRemoveFreeSpace(c->querybuf); } } /* Reset the peak again to capture the peak memory usage in the next * cycle. */ c->querybuf_peak = 0; return 0; } void clientsCron(void) { /* Make sure to process at least 1/(REDIS_HZ*10) of clients per call. * Since this function is called REDIS_HZ times per second we are sure that * in the worst case we process all the clients in 10 seconds. * In normal conditions (a reasonable number of clients) we process * all the clients in a shorter time. */ int numclients = listLength(server.clients); int iterations = numclients/(REDIS_HZ*10); if (iterations < 50) iterations = (numclients < 50) ? numclients : 50; while(listLength(server.clients) && iterations--) { redisClient *c; listNode *head; /* Rotate the list, take the current head, process. * This way if the client must be removed from the list it's the * first element and we don't incur into O(N) computation. */ listRotate(server.clients); head = listFirst(server.clients); c = listNodeValue(head); /* The following functions do different service checks on the client. * The protocol is that they return non-zero if the client was * terminated. */ if (clientsCronHandleTimeout(c)) continue; if (clientsCronResizeQueryBuffer(c)) continue; } } /* This is our timer interrupt, called REDIS_HZ times per second. * Here is where we do a number of things that need to be done asynchronously. * For instance: * * - Active expired keys collection (it is also performed in a lazy way on * lookup). * - Software watchdong. * - Update some statistic. * - Incremental rehashing of the DBs hash tables. * - Triggering BGSAVE / AOF rewrite, and handling of terminated children. * - Clients timeout of differnet kinds. * - Replication reconnection. * - Many more... * * Everything directly called here will be called REDIS_HZ times per second, * so in order to throttle execution of things we want to do less frequently * a macro is used: run_with_period(milliseconds) { .... } */ /* Using the following macro you can run code inside serverCron() with the * specified period, specified in milliseconds. * The actual resolution depends on REDIS_HZ. */ #define run_with_period(_ms_) if (!(loops % ((_ms_)/(1000/REDIS_HZ)))) int serverCron(struct aeEventLoop *eventLoop, long long id, void *clientData) { int j, loops = server.cronloops; REDIS_NOTUSED(eventLoop); REDIS_NOTUSED(id); REDIS_NOTUSED(clientData); /* Software watchdog: deliver the SIGALRM that will reach the signal * handler if we don't return here fast enough. */ if (server.watchdog_period) watchdogScheduleSignal(server.watchdog_period); /* We take a cached value of the unix time in the global state because * with virtual memory and aging there is to store the current time * in objects at every object access, and accuracy is not needed. * To access a global var is faster than calling time(NULL) */ server.unixtime = time(NULL); run_with_period(100) trackOperationsPerSecond(); /* We have just 22 bits per object for LRU information. * So we use an (eventually wrapping) LRU clock with 10 seconds resolution. * 2^22 bits with 10 seconds resoluton is more or less 1.5 years. * * Note that even if this will wrap after 1.5 years it's not a problem, * everything will still work but just some object will appear younger * to Redis. But for this to happen a given object should never be touched * for 1.5 years. * * Note that you can change the resolution altering the * REDIS_LRU_CLOCK_RESOLUTION define. */ updateLRUClock(); /* Record the max memory used since the server was started. */ if (zmalloc_used_memory() > server.stat_peak_memory) server.stat_peak_memory = zmalloc_used_memory(); /* We received a SIGTERM, shutting down here in a safe way, as it is * not ok doing so inside the signal handler. */ if (server.shutdown_asap) { if (prepareForShutdown(0) == REDIS_OK) exit(0); redisLog(REDIS_WARNING,"SIGTERM received but errors trying to shut down the server, check the logs for more information"); } /* Show some info about non-empty databases */ run_with_period(5000) { for (j = 0; j < server.dbnum; j++) { long long size, used, vkeys; size = dictSlots(server.db[j].dict); used = dictSize(server.db[j].dict); vkeys = dictSize(server.db[j].expires); if (used || vkeys) { redisLog(REDIS_VERBOSE,"DB %d: %lld keys (%lld volatile) in %lld slots HT.",j,used,vkeys,size); /* dictPrintStats(server.dict); */ } } } /* We don't want to resize the hash tables while a bacground saving * is in progress: the saving child is created using fork() that is * implemented with a copy-on-write semantic in most modern systems, so * if we resize the HT while there is the saving child at work actually * a lot of memory movements in the parent will cause a lot of pages * copied. */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1) { tryResizeHashTables(); if (server.activerehashing) incrementallyRehash(); } /* Show information about connected clients */ run_with_period(5000) { redisLog(REDIS_VERBOSE,"%d clients connected (%d slaves), %zu bytes in use", listLength(server.clients)-listLength(server.slaves), listLength(server.slaves), zmalloc_used_memory()); } /* We need to do a few operations on clients asynchronously. */ clientsCron(); /* Start a scheduled AOF rewrite if this was requested by the user while * a BGSAVE was in progress. */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_scheduled) { rewriteAppendOnlyFileBackground(); } /* Check if a background saving or AOF rewrite in progress terminated. */ if (server.rdb_child_pid != -1 || server.aof_child_pid != -1) { int statloc; pid_t pid; if ((pid = wait3(&statloc,WNOHANG,NULL)) != 0) { int exitcode = WEXITSTATUS(statloc); int bysignal = 0; if (WIFSIGNALED(statloc)) bysignal = WTERMSIG(statloc); if (pid == server.rdb_child_pid) { backgroundSaveDoneHandler(exitcode,bysignal); } else { backgroundRewriteDoneHandler(exitcode,bysignal); } updateDictResizePolicy(); } } else { /* If there is not a background saving/rewrite in progress check if * we have to save/rewrite now */ for (j = 0; j < server.saveparamslen; j++) { struct saveparam *sp = server.saveparams+j; if (server.dirty >= sp->changes && server.unixtime-server.lastsave > sp->seconds) { redisLog(REDIS_NOTICE,"%d changes in %d seconds. Saving...", sp->changes, sp->seconds); rdbSaveBackground(server.rdb_filename); break; } } /* Trigger an AOF rewrite if needed */ if (server.rdb_child_pid == -1 && server.aof_child_pid == -1 && server.aof_rewrite_perc && server.aof_current_size > server.aof_rewrite_min_size) { long long base = server.aof_rewrite_base_size ? server.aof_rewrite_base_size : 1; long long growth = (server.aof_current_size*100/base) - 100; if (growth >= server.aof_rewrite_perc) { redisLog(REDIS_NOTICE,"Starting automatic rewriting of AOF on %lld%% growth",growth); rewriteAppendOnlyFileBackground(); } } } /* If we postponed an AOF buffer flush, let's try to do it every time the * cron function is called. */ if (server.aof_flush_postponed_start) flushAppendOnlyFile(0); /* Expire a few keys per cycle, only if this is a master. * On slaves we wait for DEL operations synthesized by the master * in order to guarantee a strict consistency. */ if (server.masterhost == NULL) activeExpireCycle(); /* Close clients that need to be closed asynchronous */ freeClientsInAsyncFreeQueue(); /* Replication cron function -- used to reconnect to master and * to detect transfer failures. */ run_with_period(1000) replicationCron(); /* Run other sub-systems specific cron jobs */ run_with_period(1000) { if (server.cluster_enabled) clusterCron(); } server.cronloops++; return 1000/REDIS_HZ; } /* This function gets called every time Redis is entering the * main loop of the event driven library, that is, before to sleep * for ready file descriptors. */ void beforeSleep(struct aeEventLoop *eventLoop) { REDIS_NOTUSED(eventLoop); listNode *ln; redisClient *c; /* Try to process pending commands for clients that were just unblocked. */ while (listLength(server.unblocked_clients)) { ln = listFirst(server.unblocked_clients); redisAssert(ln != NULL); c = ln->value; listDelNode(server.unblocked_clients,ln); c->flags &= ~REDIS_UNBLOCKED; /* Process remaining data in the input buffer. */ if (c->querybuf && sdslen(c->querybuf) > 0) { server.current_client = c; processInputBuffer(c); server.current_client = NULL; } } /* Write the AOF buffer on disk */ flushAppendOnlyFile(0); } /* =========================== Server initialization ======================== */ void createSharedObjects(void) { int j; shared.crlf = createObject(REDIS_STRING,sdsnew("\r\n")); shared.ok = createObject(REDIS_STRING,sdsnew("+OK\r\n")); shared.err = createObject(REDIS_STRING,sdsnew("-ERR\r\n")); shared.emptybulk = createObject(REDIS_STRING,sdsnew("$0\r\n\r\n")); shared.czero = createObject(REDIS_STRING,sdsnew(":0\r\n")); shared.cone = createObject(REDIS_STRING,sdsnew(":1\r\n")); shared.cnegone = createObject(REDIS_STRING,sdsnew(":-1\r\n")); shared.nullbulk = createObject(REDIS_STRING,sdsnew("$-1\r\n")); shared.nullmultibulk = createObject(REDIS_STRING,sdsnew("*-1\r\n")); shared.emptymultibulk = createObject(REDIS_STRING,sdsnew("*0\r\n")); shared.pong = createObject(REDIS_STRING,sdsnew("+PONG\r\n")); shared.queued = createObject(REDIS_STRING,sdsnew("+QUEUED\r\n")); shared.wrongtypeerr = createObject(REDIS_STRING,sdsnew( "-ERR Operation against a key holding the wrong kind of value\r\n")); shared.nokeyerr = createObject(REDIS_STRING,sdsnew( "-ERR no such key\r\n")); shared.syntaxerr = createObject(REDIS_STRING,sdsnew( "-ERR syntax error\r\n")); shared.sameobjecterr = createObject(REDIS_STRING,sdsnew( "-ERR source and destination objects are the same\r\n")); shared.outofrangeerr = createObject(REDIS_STRING,sdsnew( "-ERR index out of range\r\n")); shared.noscripterr = createObject(REDIS_STRING,sdsnew( "-NOSCRIPT No matching script. Please use EVAL.\r\n")); shared.loadingerr = createObject(REDIS_STRING,sdsnew( "-LOADING Redis is loading the dataset in memory\r\n")); shared.slowscripterr = createObject(REDIS_STRING,sdsnew( "-BUSY Redis is busy running a script. You can only call SCRIPT KILL or SHUTDOWN NOSAVE.\r\n")); shared.masterdownerr = createObject(REDIS_STRING,sdsnew( "-MASTERDOWN Link with MASTER is down and slave-serve-stale-data is set to 'no'.\r\n")); shared.bgsaveerr = createObject(REDIS_STRING,sdsnew( "-MISCONF Redis is configured to save RDB snapshots, but is currently not able to persist on disk. Commands that may modify the data set are disabled. Please check Redis logs for details about the error.\r\n")); shared.roslaveerr = createObject(REDIS_STRING,sdsnew( "-READONLY You can't write against a read only slave.\r\n")); shared.oomerr = createObject(REDIS_STRING,sdsnew( "-OOM command not allowed when used memory > 'maxmemory'.\r\n")); shared.space = createObject(REDIS_STRING,sdsnew(" ")); shared.colon = createObject(REDIS_STRING,sdsnew(":")); shared.plus = createObject(REDIS_STRING,sdsnew("+")); for (j = 0; j < REDIS_SHARED_SELECT_CMDS; j++) { shared.select[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(),"select %d\r\n", j)); } shared.messagebulk = createStringObject("$7\r\nmessage\r\n",13); shared.pmessagebulk = createStringObject("$8\r\npmessage\r\n",14); shared.subscribebulk = createStringObject("$9\r\nsubscribe\r\n",15); shared.unsubscribebulk = createStringObject("$11\r\nunsubscribe\r\n",18); shared.psubscribebulk = createStringObject("$10\r\npsubscribe\r\n",17); shared.punsubscribebulk = createStringObject("$12\r\npunsubscribe\r\n",19); shared.del = createStringObject("DEL",3); shared.rpop = createStringObject("RPOP",4); shared.lpop = createStringObject("LPOP",4); for (j = 0; j < REDIS_SHARED_INTEGERS; j++) { shared.integers[j] = createObject(REDIS_STRING,(void*)(long)j); shared.integers[j]->encoding = REDIS_ENCODING_INT; } for (j = 0; j < REDIS_SHARED_BULKHDR_LEN; j++) { shared.mbulkhdr[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(),"*%d\r\n",j)); shared.bulkhdr[j] = createObject(REDIS_STRING, sdscatprintf(sdsempty(),"$%d\r\n",j)); } } void initServerConfig() { getRandomHexChars(server.runid,REDIS_RUN_ID_SIZE); server.runid[REDIS_RUN_ID_SIZE] = '\0'; server.arch_bits = (sizeof(long) == 8) ? 64 : 32; server.port = REDIS_SERVERPORT; server.bindaddr = NULL; server.unixsocket = NULL; server.unixsocketperm = 0; server.ipfd = -1; server.sofd = -1; server.dbnum = REDIS_DEFAULT_DBNUM; server.verbosity = REDIS_NOTICE; server.maxidletime = REDIS_MAXIDLETIME; server.client_max_querybuf_len = REDIS_MAX_QUERYBUF_LEN; server.saveparams = NULL; server.loading = 0; server.logfile = NULL; /* NULL = log on standard output */ server.syslog_enabled = 0; server.syslog_ident = zstrdup("redis"); server.syslog_facility = LOG_LOCAL0; server.daemonize = 0; server.aof_state = REDIS_AOF_OFF; server.aof_fsync = AOF_FSYNC_EVERYSEC; server.aof_no_fsync_on_rewrite = 0; server.aof_rewrite_perc = REDIS_AOF_REWRITE_PERC; server.aof_rewrite_min_size = REDIS_AOF_REWRITE_MIN_SIZE; server.aof_rewrite_base_size = 0; server.aof_rewrite_scheduled = 0; server.aof_last_fsync = time(NULL); server.aof_rewrite_time_last = -1; server.aof_rewrite_time_start = -1; server.aof_delayed_fsync = 0; server.aof_fd = -1; server.aof_selected_db = -1; /* Make sure the first time will not match */ server.aof_flush_postponed_start = 0; server.pidfile = zstrdup("/var/run/redis.pid"); server.rdb_filename = zstrdup("dump.rdb"); server.aof_filename = zstrdup("appendonly.aof"); server.requirepass = NULL; server.rdb_compression = 1; server.rdb_checksum = 1; server.activerehashing = 1; server.maxclients = REDIS_MAX_CLIENTS; server.bpop_blocked_clients = 0; server.maxmemory = 0; server.maxmemory_policy = REDIS_MAXMEMORY_VOLATILE_LRU; server.maxmemory_samples = 3; server.hash_max_ziplist_entries = REDIS_HASH_MAX_ZIPLIST_ENTRIES; server.hash_max_ziplist_value = REDIS_HASH_MAX_ZIPLIST_VALUE; server.list_max_ziplist_entries = REDIS_LIST_MAX_ZIPLIST_ENTRIES; server.list_max_ziplist_value = REDIS_LIST_MAX_ZIPLIST_VALUE; server.set_max_intset_entries = REDIS_SET_MAX_INTSET_ENTRIES; server.zset_max_ziplist_entries = REDIS_ZSET_MAX_ZIPLIST_ENTRIES; server.zset_max_ziplist_value = REDIS_ZSET_MAX_ZIPLIST_VALUE; server.shutdown_asap = 0; server.repl_ping_slave_period = REDIS_REPL_PING_SLAVE_PERIOD; server.repl_timeout = REDIS_REPL_TIMEOUT; server.cluster_enabled = 0; server.cluster.configfile = zstrdup("nodes.conf"); server.lua_caller = NULL; server.lua_time_limit = REDIS_LUA_TIME_LIMIT; server.lua_client = NULL; server.lua_timedout = 0; updateLRUClock(); resetServerSaveParams(); appendServerSaveParams(60*60,1); /* save after 1 hour and 1 change */ appendServerSaveParams(300,100); /* save after 5 minutes and 100 changes */ appendServerSaveParams(60,10000); /* save after 1 minute and 10000 changes */ /* Replication related */ server.masterauth = NULL; server.masterhost = NULL; server.masterport = 6379; server.master = NULL; server.repl_state = REDIS_REPL_NONE; server.repl_syncio_timeout = REDIS_REPL_SYNCIO_TIMEOUT; server.repl_serve_stale_data = 1; server.repl_slave_ro = 1; server.repl_down_since = time(NULL); /* Client output buffer limits */ server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].hard_limit_bytes = 0; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_bytes = 0; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_NORMAL].soft_limit_seconds = 0; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].hard_limit_bytes = 1024*1024*256; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_bytes = 1024*1024*64; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_SLAVE].soft_limit_seconds = 60; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].hard_limit_bytes = 1024*1024*32; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_bytes = 1024*1024*8; server.client_obuf_limits[REDIS_CLIENT_LIMIT_CLASS_PUBSUB].soft_limit_seconds = 60; /* Double constants initialization */ R_Zero = 0.0; R_PosInf = 1.0/R_Zero; R_NegInf = -1.0/R_Zero; R_Nan = R_Zero/R_Zero; /* Command table -- we intiialize it here as it is part of the * initial configuration, since command names may be changed via * redis.conf using the rename-command directive. */ server.commands = dictCreate(&commandTableDictType,NULL); populateCommandTable(); server.delCommand = lookupCommandByCString("del"); server.multiCommand = lookupCommandByCString("multi"); server.lpushCommand = lookupCommandByCString("lpush"); /* Slow log */ server.slowlog_log_slower_than = REDIS_SLOWLOG_LOG_SLOWER_THAN; server.slowlog_max_len = REDIS_SLOWLOG_MAX_LEN; /* Debugging */ server.assert_failed = ""; server.assert_file = ""; server.assert_line = 0; server.bug_report_start = 0; server.watchdog_period = 0; } /* This function will try to raise the max number of open files accordingly to * the configured max number of clients. It will also account for 32 additional * file descriptors as we need a few more for persistence, listening * sockets, log files and so forth. * * If it will not be possible to set the limit accordingly to the configured * max number of clients, the function will do the reverse setting * server.maxclients to the value that we can actually handle. */ void adjustOpenFilesLimit(void) { rlim_t maxfiles = server.maxclients+32; struct rlimit limit; if (getrlimit(RLIMIT_NOFILE,&limit) == -1) { redisLog(REDIS_WARNING,"Unable to obtain the current NOFILE limit (%s), assuming 1024 and setting the max clients configuration accordingly.", strerror(errno)); server.maxclients = 1024-32; } else { rlim_t oldlimit = limit.rlim_cur; /* Set the max number of files if the current limit is not enough * for our needs. */ if (oldlimit < maxfiles) { rlim_t f; f = maxfiles; while(f > oldlimit) { limit.rlim_cur = f; limit.rlim_max = f; if (setrlimit(RLIMIT_NOFILE,&limit) != -1) break; f -= 128; } if (f < oldlimit) f = oldlimit; if (f != maxfiles) { server.maxclients = f-32; redisLog(REDIS_WARNING,"Unable to set the max number of files limit to %d (%s), setting the max clients configuration to %d.", (int) maxfiles, strerror(errno), (int) server.maxclients); } else { redisLog(REDIS_NOTICE,"Max number of open files set to %d", (int) maxfiles); } } } } void initServer() { int j; signal(SIGHUP, SIG_IGN); signal(SIGPIPE, SIG_IGN); setupSignalHandlers(); if (server.syslog_enabled) { openlog(server.syslog_ident, LOG_PID | LOG_NDELAY | LOG_NOWAIT, server.syslog_facility); } server.current_client = NULL; server.clients = listCreate(); server.clients_to_close = listCreate(); server.slaves = listCreate(); server.monitors = listCreate(); server.unblocked_clients = listCreate(); createSharedObjects(); adjustOpenFilesLimit(); server.el = aeCreateEventLoop(server.maxclients+1024); server.db = zmalloc(sizeof(redisDb)*server.dbnum); if (server.port != 0) { server.ipfd = anetTcpServer(server.neterr,server.port,server.bindaddr); if (server.ipfd == ANET_ERR) { redisLog(REDIS_WARNING, "Opening port %d: %s", server.port, server.neterr); exit(1); } } if (server.unixsocket != NULL) { unlink(server.unixsocket); /* don't care if this fails */ server.sofd = anetUnixServer(server.neterr,server.unixsocket,server.unixsocketperm); if (server.sofd == ANET_ERR) { redisLog(REDIS_WARNING, "Opening socket: %s", server.neterr); exit(1); } } if (server.ipfd < 0 && server.sofd < 0) { redisLog(REDIS_WARNING, "Configured to not listen anywhere, exiting."); exit(1); } for (j = 0; j < server.dbnum; j++) { server.db[j].dict = dictCreate(&dbDictType,NULL); server.db[j].expires = dictCreate(&keyptrDictType,NULL); server.db[j].blocking_keys = dictCreate(&keylistDictType,NULL); server.db[j].watched_keys = dictCreate(&keylistDictType,NULL); server.db[j].id = j; } server.pubsub_channels = dictCreate(&keylistDictType,NULL); server.pubsub_patterns = listCreate(); listSetFreeMethod(server.pubsub_patterns,freePubsubPattern); listSetMatchMethod(server.pubsub_patterns,listMatchPubsubPattern); server.cronloops = 0; server.rdb_child_pid = -1; server.aof_child_pid = -1; aofRewriteBufferReset(); server.aof_buf = sdsempty(); server.lastsave = time(NULL); server.rdb_save_time_last = -1; server.rdb_save_time_start = -1; server.dirty = 0; server.stat_numcommands = 0; server.stat_numconnections = 0; server.stat_expiredkeys = 0; server.stat_evictedkeys = 0; server.stat_starttime = time(NULL); server.stat_keyspace_misses = 0; server.stat_keyspace_hits = 0; server.stat_peak_memory = 0; server.stat_fork_time = 0; server.stat_rejected_conn = 0; memset(server.ops_sec_samples,0,sizeof(server.ops_sec_samples)); server.ops_sec_idx = 0; server.ops_sec_last_sample_time = mstime(); server.ops_sec_last_sample_ops = 0; server.unixtime = time(NULL); server.lastbgsave_status = REDIS_OK; server.stop_writes_on_bgsave_err = 1; aeCreateTimeEvent(server.el, 1, serverCron, NULL, NULL); if (server.ipfd > 0 && aeCreateFileEvent(server.el,server.ipfd,AE_READABLE, acceptTcpHandler,NULL) == AE_ERR) oom("creating file event"); if (server.sofd > 0 && aeCreateFileEvent(server.el,server.sofd,AE_READABLE, acceptUnixHandler,NULL) == AE_ERR) oom("creating file event"); if (server.aof_state == REDIS_AOF_ON) { server.aof_fd = open(server.aof_filename, O_WRONLY|O_APPEND|O_CREAT,0644); if (server.aof_fd == -1) { redisLog(REDIS_WARNING, "Can't open the append-only file: %s", strerror(errno)); exit(1); } } /* 32 bit instances are limited to 4GB of address space, so if there is * no explicit limit in the user provided configuration we set a limit * at 3.5GB using maxmemory with 'noeviction' policy'. This saves * useless crashes of the Redis instance. */ if (server.arch_bits == 32 && server.maxmemory == 0) { redisLog(REDIS_WARNING,"Warning: 32 bit instance detected but no memory limit set. Setting 3.5 GB maxmemory limit with 'noeviction' policy now."); server.maxmemory = 3584LL*(1024*1024); /* 3584 MB = 3.5 GB */ server.maxmemory_policy = REDIS_MAXMEMORY_NO_EVICTION; } if (server.cluster_enabled) clusterInit(); scriptingInit(); slowlogInit(); bioInit(); } /* Populates the Redis Command Table starting from the hard coded list * we have on top of redis.c file. */ void populateCommandTable(void) { int j; int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); for (j = 0; j < numcommands; j++) { struct redisCommand *c = redisCommandTable+j; char *f = c->sflags; int retval; while(*f != '\0') { switch(*f) { case 'w': c->flags |= REDIS_CMD_WRITE; break; case 'r': c->flags |= REDIS_CMD_READONLY; break; case 'm': c->flags |= REDIS_CMD_DENYOOM; break; case 'a': c->flags |= REDIS_CMD_ADMIN; break; case 'p': c->flags |= REDIS_CMD_PUBSUB; break; case 'f': c->flags |= REDIS_CMD_FORCE_REPLICATION; break; case 's': c->flags |= REDIS_CMD_NOSCRIPT; break; case 'R': c->flags |= REDIS_CMD_RANDOM; break; case 'S': c->flags |= REDIS_CMD_SORT_FOR_SCRIPT; break; default: redisPanic("Unsupported command flag"); break; } f++; } retval = dictAdd(server.commands, sdsnew(c->name), c); assert(retval == DICT_OK); } } void resetCommandTableStats(void) { int numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); int j; for (j = 0; j < numcommands; j++) { struct redisCommand *c = redisCommandTable+j; c->microseconds = 0; c->calls = 0; } } /* ========================== Redis OP Array API ============================ */ void redisOpArrayInit(redisOpArray *oa) { oa->ops = NULL; oa->numops = 0; } int redisOpArrayAppend(redisOpArray *oa, struct redisCommand *cmd, int dbid, robj **argv, int argc, int target) { redisOp *op; oa->ops = zrealloc(oa->ops,sizeof(redisOp)*(oa->numops+1)); op = oa->ops+oa->numops; op->cmd = cmd; op->dbid = dbid; op->argv = argv; op->argc = argc; op->target = target; oa->numops++; return oa->numops; } void redisOpArrayFree(redisOpArray *oa) { while(oa->numops) { int j; redisOp *op; oa->numops--; op = oa->ops+oa->numops; for (j = 0; j < op->argc; j++) decrRefCount(op->argv[j]); zfree(op->argv); } zfree(oa->ops); } /* ====================== Commands lookup and execution ===================== */ struct redisCommand *lookupCommand(sds name) { return dictFetchValue(server.commands, name); } struct redisCommand *lookupCommandByCString(char *s) { struct redisCommand *cmd; sds name = sdsnew(s); cmd = dictFetchValue(server.commands, name); sdsfree(name); return cmd; } /* Propagate the specified command (in the context of the specified database id) * to AOF, Slaves and Monitors. * * flags are an xor between: * + REDIS_PROPAGATE_NONE (no propagation of command at all) * + REDIS_PROPAGATE_AOF (propagate into the AOF file if is enabled) * + REDIS_PROPAGATE_REPL (propagate into the replication link) */ void propagate(struct redisCommand *cmd, int dbid, robj **argv, int argc, int flags) { if (server.aof_state != REDIS_AOF_OFF && flags & REDIS_PROPAGATE_AOF) feedAppendOnlyFile(cmd,dbid,argv,argc); if (flags & REDIS_PROPAGATE_REPL && listLength(server.slaves)) replicationFeedSlaves(server.slaves,dbid,argv,argc); } /* Used inside commands to schedule the propagation of additional commands * after the current command is propagated to AOF / Replication. */ void alsoPropagate(struct redisCommand *cmd, int dbid, robj **argv, int argc, int target) { redisOpArrayAppend(&server.also_propagate,cmd,dbid,argv,argc,target); } /* Call() is the core of Redis execution of a command */ void call(redisClient *c, int flags) { long long dirty, start = ustime(), duration; /* Sent the command to clients in MONITOR mode, only if the commands are * not geneated from reading an AOF. */ if (listLength(server.monitors) && !server.loading) replicationFeedMonitors(c,server.monitors,c->db->id,c->argv,c->argc); /* Call the command. */ redisOpArrayInit(&server.also_propagate); dirty = server.dirty; c->cmd->proc(c); dirty = server.dirty-dirty; duration = ustime()-start; /* When EVAL is called loading the AOF we don't want commands called * from Lua to go into the slowlog or to populate statistics. */ if (server.loading && c->flags & REDIS_LUA_CLIENT) flags &= ~(REDIS_CALL_SLOWLOG | REDIS_CALL_STATS); /* Log the command into the Slow log if needed, and populate the * per-command statistics that we show in INFO commandstats. */ if (flags & REDIS_CALL_SLOWLOG) slowlogPushEntryIfNeeded(c->argv,c->argc,duration); if (flags & REDIS_CALL_STATS) { c->cmd->microseconds += duration; c->cmd->calls++; } /* Propagate the command into the AOF and replication link */ if (flags & REDIS_CALL_PROPAGATE) { int flags = REDIS_PROPAGATE_NONE; if (c->cmd->flags & REDIS_CMD_FORCE_REPLICATION) flags |= REDIS_PROPAGATE_REPL; if (dirty) flags |= (REDIS_PROPAGATE_REPL | REDIS_PROPAGATE_AOF); if (flags != REDIS_PROPAGATE_NONE) propagate(c->cmd,c->db->id,c->argv,c->argc,flags); } /* Commands such as LPUSH or BRPOPLPUSH may propagate an additional * PUSH command. */ if (server.also_propagate.numops) { int j; redisOp *rop; for (j = 0; j < server.also_propagate.numops; j++) { rop = &server.also_propagate.ops[j]; propagate(rop->cmd, rop->dbid, rop->argv, rop->argc, rop->target); } redisOpArrayFree(&server.also_propagate); } server.stat_numcommands++; } /* If this function gets called we already read a whole * command, argments are in the client argv/argc fields. * processCommand() execute the command or prepare the * server for a bulk read from the client. * * If 1 is returned the client is still alive and valid and * and other operations can be performed by the caller. Otherwise * if 0 is returned the client was destroied (i.e. after QUIT). */ int processCommand(redisClient *c) { /* The QUIT command is handled separately. Normal command procs will * go through checking for replication and QUIT will cause trouble * when FORCE_REPLICATION is enabled and would be implemented in * a regular command proc. */ if (!strcasecmp(c->argv[0]->ptr,"quit")) { addReply(c,shared.ok); c->flags |= REDIS_CLOSE_AFTER_REPLY; return REDIS_ERR; } /* Now lookup the command and check ASAP about trivial error conditions * such as wrong arity, bad command name and so forth. */ c->cmd = c->lastcmd = lookupCommand(c->argv[0]->ptr); if (!c->cmd) { addReplyErrorFormat(c,"unknown command '%s'", (char*)c->argv[0]->ptr); return REDIS_OK; } else if ((c->cmd->arity > 0 && c->cmd->arity != c->argc) || (c->argc < -c->cmd->arity)) { addReplyErrorFormat(c,"wrong number of arguments for '%s' command", c->cmd->name); return REDIS_OK; } /* Check if the user is authenticated */ if (server.requirepass && !c->authenticated && c->cmd->proc != authCommand) { addReplyError(c,"operation not permitted"); return REDIS_OK; } /* If cluster is enabled, redirect here */ if (server.cluster_enabled && !(c->cmd->getkeys_proc == NULL && c->cmd->firstkey == 0)) { int hashslot; if (server.cluster.state != REDIS_CLUSTER_OK) { addReplyError(c,"The cluster is down. Check with CLUSTER INFO for more information"); return REDIS_OK; } else { int ask; clusterNode *n = getNodeByQuery(c,c->cmd,c->argv,c->argc,&hashslot,&ask); if (n == NULL) { addReplyError(c,"Multi keys request invalid in cluster"); return REDIS_OK; } else if (n != server.cluster.myself) { addReplySds(c,sdscatprintf(sdsempty(), "-%s %d %s:%d\r\n", ask ? "ASK" : "MOVED", hashslot,n->ip,n->port)); return REDIS_OK; } } } /* Handle the maxmemory directive. * * First we try to free some memory if possible (if there are volatile * keys in the dataset). If there are not the only thing we can do * is returning an error. */ if (server.maxmemory) { int retval = freeMemoryIfNeeded(); if ((c->cmd->flags & REDIS_CMD_DENYOOM) && retval == REDIS_ERR) { addReply(c, shared.oomerr); return REDIS_OK; } } /* Don't accept write commands if there are problems persisting on disk. */ if (server.stop_writes_on_bgsave_err && server.saveparamslen > 0 && server.lastbgsave_status == REDIS_ERR && c->cmd->flags & REDIS_CMD_WRITE) { addReply(c, shared.bgsaveerr); return REDIS_OK; } /* Don't accept wirte commands if this is a read only slave. But * accept write commands if this is our master. */ if (server.masterhost && server.repl_slave_ro && !(c->flags & REDIS_MASTER) && c->cmd->flags & REDIS_CMD_WRITE) { addReply(c, shared.roslaveerr); return REDIS_OK; } /* Only allow SUBSCRIBE and UNSUBSCRIBE in the context of Pub/Sub */ if ((dictSize(c->pubsub_channels) > 0 || listLength(c->pubsub_patterns) > 0) && c->cmd->proc != subscribeCommand && c->cmd->proc != unsubscribeCommand && c->cmd->proc != psubscribeCommand && c->cmd->proc != punsubscribeCommand) { addReplyError(c,"only (P)SUBSCRIBE / (P)UNSUBSCRIBE / QUIT allowed in this context"); return REDIS_OK; } /* Only allow INFO and SLAVEOF when slave-serve-stale-data is no and * we are a slave with a broken link with master. */ if (server.masterhost && server.repl_state != REDIS_REPL_CONNECTED && server.repl_serve_stale_data == 0 && c->cmd->proc != infoCommand && c->cmd->proc != slaveofCommand) { addReply(c, shared.masterdownerr); return REDIS_OK; } /* Loading DB? Return an error if the command is not INFO */ if (server.loading && c->cmd->proc != infoCommand) { addReply(c, shared.loadingerr); return REDIS_OK; } /* Lua script too slow? Only allow SHUTDOWN NOSAVE and SCRIPT KILL. */ if (server.lua_timedout && !(c->cmd->proc == shutdownCommand && c->argc == 2 && tolower(((char*)c->argv[1]->ptr)[0]) == 'n') && !(c->cmd->proc == scriptCommand && c->argc == 2 && tolower(((char*)c->argv[1]->ptr)[0]) == 'k')) { addReply(c, shared.slowscripterr); return REDIS_OK; } /* Exec the command */ if (c->flags & REDIS_MULTI && c->cmd->proc != execCommand && c->cmd->proc != discardCommand && c->cmd->proc != multiCommand && c->cmd->proc != watchCommand) { queueMultiCommand(c); addReply(c,shared.queued); } else { call(c,REDIS_CALL_FULL); } return REDIS_OK; } /*================================== Shutdown =============================== */ int prepareForShutdown(int flags) { int save = flags & REDIS_SHUTDOWN_SAVE; int nosave = flags & REDIS_SHUTDOWN_NOSAVE; redisLog(REDIS_WARNING,"User requested shutdown..."); /* Kill the saving child if there is a background saving in progress. We want to avoid race conditions, for instance our saving child may overwrite the synchronous saving did by SHUTDOWN. */ if (server.rdb_child_pid != -1) { redisLog(REDIS_WARNING,"There is a child saving an .rdb. Killing it!"); kill(server.rdb_child_pid,SIGKILL); rdbRemoveTempFile(server.rdb_child_pid); } if (server.aof_state != REDIS_AOF_OFF) { /* Kill the AOF saving child as the AOF we already have may be longer * but contains the full dataset anyway. */ if (server.aof_child_pid != -1) { redisLog(REDIS_WARNING, "There is a child rewriting the AOF. Killing it!"); kill(server.aof_child_pid,SIGKILL); } /* Append only file: fsync() the AOF and exit */ redisLog(REDIS_NOTICE,"Calling fsync() on the AOF file."); aof_fsync(server.aof_fd); } if ((server.saveparamslen > 0 && !nosave) || save) { redisLog(REDIS_NOTICE,"Saving the final RDB snapshot before exiting."); /* Snapshotting. Perform a SYNC SAVE and exit */ if (rdbSave(server.rdb_filename) != REDIS_OK) { /* Ooops.. error saving! The best we can do is to continue * operating. Note that if there was a background saving process, * in the next cron() Redis will be notified that the background * saving aborted, handling special stuff like slaves pending for * synchronization... */ redisLog(REDIS_WARNING,"Error trying to save the DB, can't exit."); return REDIS_ERR; } } if (server.daemonize) { redisLog(REDIS_NOTICE,"Removing the pid file."); unlink(server.pidfile); } /* Close the listening sockets. Apparently this allows faster restarts. */ if (server.ipfd != -1) close(server.ipfd); if (server.sofd != -1) close(server.sofd); if (server.unixsocket) { redisLog(REDIS_NOTICE,"Removing the unix socket file."); unlink(server.unixsocket); /* don't care if this fails */ } redisLog(REDIS_WARNING,"Redis is now ready to exit, bye bye..."); return REDIS_OK; } /*================================== Commands =============================== */ void authCommand(redisClient *c) { if (!server.requirepass) { addReplyError(c,"Client sent AUTH, but no password is set"); } else if (!strcmp(c->argv[1]->ptr, server.requirepass)) { c->authenticated = 1; addReply(c,shared.ok); } else { c->authenticated = 0; addReplyError(c,"invalid password"); } } void pingCommand(redisClient *c) { addReply(c,shared.pong); } void echoCommand(redisClient *c) { addReplyBulk(c,c->argv[1]); } void timeCommand(redisClient *c) { struct timeval tv; /* gettimeofday() can only fail if &tv is a bad addresss so we * don't check for errors. */ gettimeofday(&tv,NULL); addReplyMultiBulkLen(c,2); addReplyBulkLongLong(c,tv.tv_sec); addReplyBulkLongLong(c,tv.tv_usec); } /* Convert an amount of bytes into a human readable string in the form * of 100B, 2G, 100M, 4K, and so forth. */ void bytesToHuman(char *s, unsigned long long n) { double d; if (n < 1024) { /* Bytes */ sprintf(s,"%lluB",n); return; } else if (n < (1024*1024)) { d = (double)n/(1024); sprintf(s,"%.2fK",d); } else if (n < (1024LL*1024*1024)) { d = (double)n/(1024*1024); sprintf(s,"%.2fM",d); } else if (n < (1024LL*1024*1024*1024)) { d = (double)n/(1024LL*1024*1024); sprintf(s,"%.2fG",d); } } /* Create the string returned by the INFO command. This is decoupled * by the INFO command itself as we need to report the same information * on memory corruption problems. */ sds genRedisInfoString(char *section) { sds info = sdsempty(); time_t uptime = server.unixtime-server.stat_starttime; int j, numcommands; struct rusage self_ru, c_ru; unsigned long lol, bib; int allsections = 0, defsections = 0; int sections = 0; if (section) { allsections = strcasecmp(section,"all") == 0; defsections = strcasecmp(section,"default") == 0; } getrusage(RUSAGE_SELF, &self_ru); getrusage(RUSAGE_CHILDREN, &c_ru); getClientsMaxBuffers(&lol,&bib); /* Server */ if (allsections || defsections || !strcasecmp(section,"server")) { struct utsname name; if (sections++) info = sdscat(info,"\r\n"); uname(&name); info = sdscatprintf(info, "# Server\r\n" "redis_version:%s\r\n" "redis_git_sha1:%s\r\n" "redis_git_dirty:%d\r\n" "os:%s %s %s\r\n" "arch_bits:%d\r\n" "multiplexing_api:%s\r\n" "gcc_version:%d.%d.%d\r\n" "process_id:%ld\r\n" "run_id:%s\r\n" "tcp_port:%d\r\n" "uptime_in_seconds:%ld\r\n" "uptime_in_days:%ld\r\n" "lru_clock:%ld\r\n", REDIS_VERSION, redisGitSHA1(), strtol(redisGitDirty(),NULL,10) > 0, name.sysname, name.release, name.machine, server.arch_bits, aeGetApiName(), #ifdef __GNUC__ __GNUC__,__GNUC_MINOR__,__GNUC_PATCHLEVEL__, #else 0,0,0, #endif (long) getpid(), server.runid, server.port, uptime, uptime/(3600*24), (unsigned long) server.lruclock); } /* Clients */ if (allsections || defsections || !strcasecmp(section,"clients")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Clients\r\n" "connected_clients:%lu\r\n" "client_longest_output_list:%lu\r\n" "client_biggest_input_buf:%lu\r\n" "blocked_clients:%d\r\n", listLength(server.clients)-listLength(server.slaves), lol, bib, server.bpop_blocked_clients); } /* Memory */ if (allsections || defsections || !strcasecmp(section,"memory")) { char hmem[64]; char peak_hmem[64]; bytesToHuman(hmem,zmalloc_used_memory()); bytesToHuman(peak_hmem,server.stat_peak_memory); if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Memory\r\n" "used_memory:%zu\r\n" "used_memory_human:%s\r\n" "used_memory_rss:%zu\r\n" "used_memory_peak:%zu\r\n" "used_memory_peak_human:%s\r\n" "used_memory_lua:%lld\r\n" "mem_fragmentation_ratio:%.2f\r\n" "mem_allocator:%s\r\n", zmalloc_used_memory(), hmem, zmalloc_get_rss(), server.stat_peak_memory, peak_hmem, ((long long)lua_gc(server.lua,LUA_GCCOUNT,0))*1024LL, zmalloc_get_fragmentation_ratio(), ZMALLOC_LIB ); } /* Persistence */ if (allsections || defsections || !strcasecmp(section,"persistence")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Persistence\r\n" "loading:%d\r\n" "rdb_changes_since_last_save:%lld\r\n" "rdb_bgsave_in_progress:%d\r\n" "rdb_last_save_time:%ld\r\n" "rdb_last_bgsave_status:%s\r\n" "rdb_last_bgsave_time_sec:%ld\r\n" "rdb_current_bgsave_time_sec:%ld\r\n" "aof_enabled:%d\r\n" "aof_rewrite_in_progress:%d\r\n" "aof_rewrite_scheduled:%d\r\n" "aof_last_rewrite_time_sec:%ld\r\n" "aof_current_rewrite_time_sec:%ld\r\n", server.loading, server.dirty, server.rdb_child_pid != -1, server.lastsave, server.lastbgsave_status == REDIS_OK ? "ok" : "err", server.rdb_save_time_last, (server.rdb_child_pid == -1) ? -1 : time(NULL)-server.rdb_save_time_start, server.aof_state != REDIS_AOF_OFF, server.aof_child_pid != -1, server.aof_rewrite_scheduled, server.aof_rewrite_time_last, (server.aof_child_pid == -1) ? -1 : time(NULL)-server.aof_rewrite_time_start); if (server.aof_state != REDIS_AOF_OFF) { info = sdscatprintf(info, "aof_current_size:%lld\r\n" "aof_base_size:%lld\r\n" "aof_pending_rewrite:%d\r\n" "aof_buffer_length:%zu\r\n" "aof_rewrite_buffer_length:%zu\r\n" "aof_pending_bio_fsync:%llu\r\n" "aof_delayed_fsync:%lu\r\n", (long long) server.aof_current_size, (long long) server.aof_rewrite_base_size, server.aof_rewrite_scheduled, sdslen(server.aof_buf), aofRewriteBufferSize(), bioPendingJobsOfType(REDIS_BIO_AOF_FSYNC), server.aof_delayed_fsync); } if (server.loading) { double perc; time_t eta, elapsed; off_t remaining_bytes = server.loading_total_bytes- server.loading_loaded_bytes; perc = ((double)server.loading_loaded_bytes / server.loading_total_bytes) * 100; elapsed = server.unixtime-server.loading_start_time; if (elapsed == 0) { eta = 1; /* A fake 1 second figure if we don't have enough info */ } else { eta = (elapsed*remaining_bytes)/server.loading_loaded_bytes; } info = sdscatprintf(info, "loading_start_time:%ld\r\n" "loading_total_bytes:%llu\r\n" "loading_loaded_bytes:%llu\r\n" "loading_loaded_perc:%.2f\r\n" "loading_eta_seconds:%ld\r\n" ,(unsigned long) server.loading_start_time, (unsigned long long) server.loading_total_bytes, (unsigned long long) server.loading_loaded_bytes, perc, eta ); } } /* Stats */ if (allsections || defsections || !strcasecmp(section,"stats")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Stats\r\n" "total_connections_received:%lld\r\n" "total_commands_processed:%lld\r\n" "instantaneous_ops_per_sec:%lld\r\n" "rejected_connections:%lld\r\n" "expired_keys:%lld\r\n" "evicted_keys:%lld\r\n" "keyspace_hits:%lld\r\n" "keyspace_misses:%lld\r\n" "pubsub_channels:%ld\r\n" "pubsub_patterns:%lu\r\n" "latest_fork_usec:%lld\r\n", server.stat_numconnections, server.stat_numcommands, getOperationsPerSecond(), server.stat_rejected_conn, server.stat_expiredkeys, server.stat_evictedkeys, server.stat_keyspace_hits, server.stat_keyspace_misses, dictSize(server.pubsub_channels), listLength(server.pubsub_patterns), server.stat_fork_time); } /* Replication */ if (allsections || defsections || !strcasecmp(section,"replication")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Replication\r\n" "role:%s\r\n", server.masterhost == NULL ? "master" : "slave"); if (server.masterhost) { info = sdscatprintf(info, "master_host:%s\r\n" "master_port:%d\r\n" "master_link_status:%s\r\n" "master_last_io_seconds_ago:%d\r\n" "master_sync_in_progress:%d\r\n" ,server.masterhost, server.masterport, (server.repl_state == REDIS_REPL_CONNECTED) ? "up" : "down", server.master ? ((int)(server.unixtime-server.master->lastinteraction)) : -1, server.repl_state == REDIS_REPL_TRANSFER ); if (server.repl_state == REDIS_REPL_TRANSFER) { info = sdscatprintf(info, "master_sync_left_bytes:%ld\r\n" "master_sync_last_io_seconds_ago:%d\r\n" ,(long)server.repl_transfer_left, (int)(server.unixtime-server.repl_transfer_lastio) ); } if (server.repl_state != REDIS_REPL_CONNECTED) { info = sdscatprintf(info, "master_link_down_since_seconds:%ld\r\n", (long)server.unixtime-server.repl_down_since); } } info = sdscatprintf(info, "connected_slaves:%lu\r\n", listLength(server.slaves)); if (listLength(server.slaves)) { int slaveid = 0; listNode *ln; listIter li; listRewind(server.slaves,&li); while((ln = listNext(&li))) { redisClient *slave = listNodeValue(ln); char *state = NULL; char ip[32]; int port; if (anetPeerToString(slave->fd,ip,&port) == -1) continue; switch(slave->replstate) { case REDIS_REPL_WAIT_BGSAVE_START: case REDIS_REPL_WAIT_BGSAVE_END: state = "wait_bgsave"; break; case REDIS_REPL_SEND_BULK: state = "send_bulk"; break; case REDIS_REPL_ONLINE: state = "online"; break; } if (state == NULL) continue; info = sdscatprintf(info,"slave%d:%s,%d,%s\r\n", slaveid,ip,port,state); slaveid++; } } } /* CPU */ if (allsections || defsections || !strcasecmp(section,"cpu")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# CPU\r\n" "used_cpu_sys:%.2f\r\n" "used_cpu_user:%.2f\r\n" "used_cpu_sys_children:%.2f\r\n" "used_cpu_user_children:%.2f\r\n", (float)self_ru.ru_stime.tv_sec+(float)self_ru.ru_stime.tv_usec/1000000, (float)self_ru.ru_utime.tv_sec+(float)self_ru.ru_utime.tv_usec/1000000, (float)c_ru.ru_stime.tv_sec+(float)c_ru.ru_stime.tv_usec/1000000, (float)c_ru.ru_utime.tv_sec+(float)c_ru.ru_utime.tv_usec/1000000); } /* cmdtime */ if (allsections || !strcasecmp(section,"commandstats")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Commandstats\r\n"); numcommands = sizeof(redisCommandTable)/sizeof(struct redisCommand); for (j = 0; j < numcommands; j++) { struct redisCommand *c = redisCommandTable+j; if (!c->calls) continue; info = sdscatprintf(info, "cmdstat_%s:calls=%lld,usec=%lld,usec_per_call=%.2f\r\n", c->name, c->calls, c->microseconds, (c->calls == 0) ? 0 : ((float)c->microseconds/c->calls)); } } /* Cluster */ if (allsections || defsections || !strcasecmp(section,"cluster")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Cluster\r\n" "cluster_enabled:%d\r\n", server.cluster_enabled); } /* Key space */ if (allsections || defsections || !strcasecmp(section,"keyspace")) { if (sections++) info = sdscat(info,"\r\n"); info = sdscatprintf(info, "# Keyspace\r\n"); for (j = 0; j < server.dbnum; j++) { long long keys, vkeys; keys = dictSize(server.db[j].dict); vkeys = dictSize(server.db[j].expires); if (keys || vkeys) { info = sdscatprintf(info, "db%d:keys=%lld,expires=%lld\r\n", j, keys, vkeys); } } } return info; } void infoCommand(redisClient *c) { char *section = c->argc == 2 ? c->argv[1]->ptr : "default"; if (c->argc > 2) { addReply(c,shared.syntaxerr); return; } sds info = genRedisInfoString(section); addReplySds(c,sdscatprintf(sdsempty(),"$%lu\r\n", (unsigned long)sdslen(info))); addReplySds(c,info); addReply(c,shared.crlf); } void monitorCommand(redisClient *c) { /* ignore MONITOR if aleady slave or in monitor mode */ if (c->flags & REDIS_SLAVE) return; c->flags |= (REDIS_SLAVE|REDIS_MONITOR); c->slaveseldb = 0; listAddNodeTail(server.monitors,c); addReply(c,shared.ok); } /* ============================ Maxmemory directive ======================== */ /* This function gets called when 'maxmemory' is set on the config file to limit * the max memory used by the server, before processing a command. * * The goal of the function is to free enough memory to keep Redis under the * configured memory limit. * * The function starts calculating how many bytes should be freed to keep * Redis under the limit, and enters a loop selecting the best keys to * evict accordingly to the configured policy. * * If all the bytes needed to return back under the limit were freed the * function returns REDIS_OK, otherwise REDIS_ERR is returned, and the caller * should block the execution of commands that will result in more memory * used by the server. */ int freeMemoryIfNeeded(void) { size_t mem_used, mem_tofree, mem_freed; int slaves = listLength(server.slaves); /* Remove the size of slaves output buffers and AOF buffer from the * count of used memory. */ mem_used = zmalloc_used_memory(); if (slaves) { listIter li; listNode *ln; listRewind(server.slaves,&li); while((ln = listNext(&li))) { redisClient *slave = listNodeValue(ln); unsigned long obuf_bytes = getClientOutputBufferMemoryUsage(slave); if (obuf_bytes > mem_used) mem_used = 0; else mem_used -= obuf_bytes; } } if (server.aof_state != REDIS_AOF_OFF) { mem_used -= sdslen(server.aof_buf); mem_used -= aofRewriteBufferSize(); } /* Check if we are over the memory limit. */ if (mem_used <= server.maxmemory) return REDIS_OK; if (server.maxmemory_policy == REDIS_MAXMEMORY_NO_EVICTION) return REDIS_ERR; /* We need to free memory, but policy forbids. */ /* Compute how much memory we need to free. */ mem_tofree = mem_used - server.maxmemory; mem_freed = 0; while (mem_freed < mem_tofree) { int j, k, keys_freed = 0; for (j = 0; j < server.dbnum; j++) { long bestval = 0; /* just to prevent warning */ sds bestkey = NULL; struct dictEntry *de; redisDb *db = server.db+j; dict *dict; if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU || server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM) { dict = server.db[j].dict; } else { dict = server.db[j].expires; } if (dictSize(dict) == 0) continue; /* volatile-random and allkeys-random policy */ if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_RANDOM || server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_RANDOM) { de = dictGetRandomKey(dict); bestkey = dictGetKey(de); } /* volatile-lru and allkeys-lru policy */ else if (server.maxmemory_policy == REDIS_MAXMEMORY_ALLKEYS_LRU || server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) { for (k = 0; k < server.maxmemory_samples; k++) { sds thiskey; long thisval; robj *o; de = dictGetRandomKey(dict); thiskey = dictGetKey(de); /* When policy is volatile-lru we need an additonal lookup * to locate the real key, as dict is set to db->expires. */ if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_LRU) de = dictFind(db->dict, thiskey); o = dictGetVal(de); thisval = estimateObjectIdleTime(o); /* Higher idle time is better candidate for deletion */ if (bestkey == NULL || thisval > bestval) { bestkey = thiskey; bestval = thisval; } } } /* volatile-ttl */ else if (server.maxmemory_policy == REDIS_MAXMEMORY_VOLATILE_TTL) { for (k = 0; k < server.maxmemory_samples; k++) { sds thiskey; long thisval; de = dictGetRandomKey(dict); thiskey = dictGetKey(de); thisval = (long) dictGetVal(de); /* Expire sooner (minor expire unix timestamp) is better * candidate for deletion */ if (bestkey == NULL || thisval < bestval) { bestkey = thiskey; bestval = thisval; } } } /* Finally remove the selected key. */ if (bestkey) { long long delta; robj *keyobj = createStringObject(bestkey,sdslen(bestkey)); propagateExpire(db,keyobj); /* We compute the amount of memory freed by dbDelete() alone. * It is possible that actually the memory needed to propagate * the DEL in AOF and replication link is greater than the one * we are freeing removing the key, but we can't account for * that otherwise we would never exit the loop. * * AOF and Output buffer memory will be freed eventually so * we only care about memory used by the key space. */ delta = (long long) zmalloc_used_memory(); dbDelete(db,keyobj); delta -= (long long) zmalloc_used_memory(); mem_freed += delta; server.stat_evictedkeys++; decrRefCount(keyobj); keys_freed++; /* When the memory to free starts to be big enough, we may * start spending so much time here that is impossible to * deliver data to the slaves fast enough, so we force the * transmission here inside the loop. */ if (slaves) flushSlavesOutputBuffers(); } } if (!keys_freed) return REDIS_ERR; /* nothing to free... */ } return REDIS_OK; } /* =================================== Main! ================================ */ #ifdef __linux__ int linuxOvercommitMemoryValue(void) { FILE *fp = fopen("/proc/sys/vm/overcommit_memory","r"); char buf[64]; if (!fp) return -1; if (fgets(buf,64,fp) == NULL) { fclose(fp); return -1; } fclose(fp); return atoi(buf); } void linuxOvercommitMemoryWarning(void) { if (linuxOvercommitMemoryValue() == 0) { redisLog(REDIS_WARNING,"WARNING overcommit_memory is set to 0! Background save may fail under low memory condition. To fix this issue add 'vm.overcommit_memory = 1' to /etc/sysctl.conf and then reboot or run the command 'sysctl vm.overcommit_memory=1' for this to take effect."); } } #endif /* __linux__ */ void createPidFile(void) { /* Try to write the pid file in a best-effort way. */ FILE *fp = fopen(server.pidfile,"w"); if (fp) { fprintf(fp,"%d\n",(int)getpid()); fclose(fp); } } void daemonize(void) { int fd; if (fork() != 0) exit(0); /* parent exits */ setsid(); /* create a new session */ /* Every output goes to /dev/null. If Redis is daemonized but * the 'logfile' is set to 'stdout' in the configuration file * it will not log at all. */ if ((fd = open("/dev/null", O_RDWR, 0)) != -1) { dup2(fd, STDIN_FILENO); dup2(fd, STDOUT_FILENO); dup2(fd, STDERR_FILENO); if (fd > STDERR_FILENO) close(fd); } } void version() { printf("Redis server v=%s sha=%s:%d malloc=%s bits=%d\n", REDIS_VERSION, redisGitSHA1(), atoi(redisGitDirty()) > 0, ZMALLOC_LIB, sizeof(long) == 4 ? 32 : 64); exit(0); } void usage() { fprintf(stderr,"Usage: ./redis-server [/path/to/redis.conf] [options]\n"); fprintf(stderr," ./redis-server - (read config from stdin)\n"); fprintf(stderr," ./redis-server -v or --version\n"); fprintf(stderr," ./redis-server -h or --help\n"); fprintf(stderr," ./redis-server --test-memory \n\n"); fprintf(stderr,"Examples:\n"); fprintf(stderr," ./redis-server (run the server with default conf)\n"); fprintf(stderr," ./redis-server /etc/redis/6379.conf\n"); fprintf(stderr," ./redis-server --port 7777\n"); fprintf(stderr," ./redis-server --port 7777 --slaveof 127.0.0.1 8888\n"); fprintf(stderr," ./redis-server /etc/myredis.conf --loglevel verbose\n"); exit(1); } void redisAsciiArt(void) { #include "asciilogo.h" char *buf = zmalloc(1024*16); snprintf(buf,1024*16,ascii_logo, REDIS_VERSION, redisGitSHA1(), strtol(redisGitDirty(),NULL,10) > 0, (sizeof(long) == 8) ? "64" : "32", server.cluster_enabled ? "cluster" : "stand alone", server.port, (long) getpid() ); redisLogRaw(REDIS_NOTICE|REDIS_LOG_RAW,buf); zfree(buf); } static void sigtermHandler(int sig) { REDIS_NOTUSED(sig); redisLogFromHandler(REDIS_WARNING,"Received SIGTERM, scheduling shutdown..."); server.shutdown_asap = 1; } void setupSignalHandlers(void) { struct sigaction act; /* When the SA_SIGINFO flag is set in sa_flags then sa_sigaction is used. * Otherwise, sa_handler is used. */ sigemptyset(&act.sa_mask); act.sa_flags = 0; act.sa_handler = sigtermHandler; sigaction(SIGTERM, &act, NULL); #ifdef HAVE_BACKTRACE sigemptyset(&act.sa_mask); act.sa_flags = SA_NODEFER | SA_RESETHAND | SA_SIGINFO; act.sa_sigaction = sigsegvHandler; sigaction(SIGSEGV, &act, NULL); sigaction(SIGBUS, &act, NULL); sigaction(SIGFPE, &act, NULL); sigaction(SIGILL, &act, NULL); #endif return; } void memtest(size_t megabytes, int passes); int main(int argc, char **argv) { long long start; struct timeval tv; /* We need to initialize our libraries, and the server configuration. */ zmalloc_enable_thread_safeness(); srand(time(NULL)^getpid()); gettimeofday(&tv,NULL); dictSetHashFunctionSeed(tv.tv_sec^tv.tv_usec^getpid()); initServerConfig(); if (argc >= 2) { int j = 1; /* First option to parse in argv[] */ sds options = sdsempty(); char *configfile = NULL; /* Handle special options --help and --version */ if (strcmp(argv[1], "-v") == 0 || strcmp(argv[1], "--version") == 0) version(); if (strcmp(argv[1], "--help") == 0 || strcmp(argv[1], "-h") == 0) usage(); if (strcmp(argv[1], "--test-memory") == 0) { if (argc == 3) { memtest(atoi(argv[2]),50); exit(0); } else { fprintf(stderr,"Please specify the amount of memory to test in megabytes.\n"); fprintf(stderr,"Example: ./redis-server --test-memory 4096\n\n"); exit(1); } } /* First argument is the config file name? */ if (argv[j][0] != '-' || argv[j][1] != '-') configfile = argv[j++]; /* All the other options are parsed and conceptually appended to the * configuration file. For instance --port 6380 will generate the * string "port 6380\n" to be parsed after the actual file name * is parsed, if any. */ while(j != argc) { if (argv[j][0] == '-' && argv[j][1] == '-') { /* Option name */ if (sdslen(options)) options = sdscat(options,"\n"); options = sdscat(options,argv[j]+2); options = sdscat(options," "); } else { /* Option argument */ options = sdscatrepr(options,argv[j],strlen(argv[j])); options = sdscat(options," "); } j++; } resetServerSaveParams(); loadServerConfig(configfile,options); sdsfree(options); } else { redisLog(REDIS_WARNING,"Warning: no config file specified, using the default config. In order to specify a config file use 'redis-server /path/to/redis.conf'"); } if (server.daemonize) daemonize(); initServer(); if (server.daemonize) createPidFile(); redisAsciiArt(); redisLog(REDIS_WARNING,"Server started, Redis version " REDIS_VERSION); #ifdef __linux__ linuxOvercommitMemoryWarning(); #endif start = ustime(); if (server.aof_state == REDIS_AOF_ON) { if (loadAppendOnlyFile(server.aof_filename) == REDIS_OK) redisLog(REDIS_NOTICE,"DB loaded from append only file: %.3f seconds",(float)(ustime()-start)/1000000); } else { if (rdbLoad(server.rdb_filename) == REDIS_OK) { redisLog(REDIS_NOTICE,"DB loaded from disk: %.3f seconds", (float)(ustime()-start)/1000000); } else if (errno != ENOENT) { redisLog(REDIS_WARNING,"Fatal error loading the DB. Exiting."); exit(1); } } if (server.ipfd > 0) redisLog(REDIS_NOTICE,"The server is now ready to accept connections on port %d", server.port); if (server.sofd > 0) redisLog(REDIS_NOTICE,"The server is now ready to accept connections at %s", server.unixsocket); aeSetBeforeSleepProc(server.el,beforeSleep); aeMain(server.el); aeDeleteEventLoop(server.el); return 0; } /* The End */ ================================================ FILE: samples/C/rf_io.c ================================================ /** ** Copyright (c) 2011-2012, Karapetsas Eleftherios ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ** 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the distribution. ** 3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, ** INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ** SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. **/ #include #include #include #include "io_private.h" #include #include // for rfUTF8_IsContinuationbyte #include // for malloc #include // for memcpy e.t.c. // Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer int32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof) { int32_t bytesN; uint32_t bIndex=0; #ifdef RF_NEWLINE_CRLF char newLineFound = false; #endif // allocate the utf8 buffer *bufferSize = RF_OPTION_FGETS_READBYTESN+4; RF_MALLOC(*utf8,*bufferSize) *byteLength = 0; // read the start bytesN = rfFgets_UTF8(*utf8,RF_OPTION_FGETS_READBYTESN,f,eof); (*byteLength)+=bytesN; if(bytesN < 0)//error check { LOG_ERROR("Failed to read a UTF-8 file",bytesN); free(*utf8); return bytesN; } // if the last character was a newline we are done if(*((*utf8)+bytesN-1) == (char)RF_LF) { #ifdef RF_NEWLINE_CRLF if(*((*utf8)+bytesN-2) == (char)RF_CR) { *((*utf8)+bytesN-2) = RF_LF; *((*utf8)+bytesN-1) = '\0'; (*byteLength)-=1; } #endif return bytesN; } if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the end of file { // keep reading until we have read all until newline or EOF while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false) { if(*byteLength+RF_OPTION_FGETS_READBYTESN+4 >= *bufferSize) { *bufferSize=(*byteLength+RF_OPTION_FGETS_READBYTESN+4)*2; RF_REALLOC(*utf8,char,*bufferSize); } bIndex += bytesN; bytesN = rfFgets_UTF8((*utf8)+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof); (*byteLength)+=bytesN; if(bytesN < 0)// error check { LOG_ERROR("StringX Initialization from file failed in file reading",bytesN); free(*utf8); return bytesN; } // if the last character was a newline break if(*((*utf8)+bIndex+bytesN-1) == (char)RF_LF) { #ifdef RF_NEWLINE_CRLF newLineFound = true; #endif break; } }// end of reading loop #ifdef RF_NEWLINE_CRLF if(newLineFound==true) if(*((*utf8)+bIndex+bytesN-2) == (char)RF_CR) { *((*utf8)+bIndex+bytesN-2) = RF_LF; *((*utf8)+bIndex+bytesN-1) = '\0'; (*byteLength)-=1; } #endif return bIndex; }// end of size not fitting the initial buffer case else { #ifdef RF_NEWLINE_CRLF // if the last character was a newline if(*((*utf8)+bytesN-1) == (char)RF_LF) { if(*((*utf8)+bytesN-2) == (char)RF_CR) { *((*utf8)+bytesN-2) = RF_LF; *((*utf8)+bytesN-1) = '\0'; (*byteLength)-=1; } } #endif // case of size fully fitting the buffer return bytesN; } } // Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer int32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof) { char buff[RF_OPTION_FGETS_READBYTESN+5]; int32_t bytesN; uint32_t *codepoints,charsN,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+5,accum; char* tempBuff = 0,buffAllocated=false; bytesN = rfFgets_UTF16LE(buff,RF_OPTION_FGETS_READBYTESN,f,eof); accum = (uint32_t)bytesN; tempBuff = &buff[0];// point the tempBuff to the initial buffer for now if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Little Endian UTF-16 file",bytesN); return bytesN; } else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF { // allocate the temporary buffer and move the previous buffer's content inside it buffSize=buffSize*2+5; RF_MALLOC(tempBuff,buffSize); memcpy(tempBuff,buff,bytesN); bIndex=bytesN; buffAllocated = true; // keep reading until we have read all until newline or EOF do { bytesN = rfFgets_UTF16LE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof); accum += bytesN; if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Little Endian UTF-16 file",bytesN); free(tempBuff); return bytesN; } // realloc to have more space in the buffer for reading if needed if(accum+RF_OPTION_FGETS_READBYTESN+5 >= buffSize) { buffSize=(accum+RF_OPTION_FGETS_READBYTESN+5)*2; RF_REALLOC(tempBuff,char,buffSize); } bIndex += bytesN; // if the last character was newline break off the loop if( *(uint16_t*)(tempBuff+bIndex-2)== (uint16_t)RF_LF) break; }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);//end of reading loop }// end of size not fitting the initial buffer case if(bytesN >0)//determine the amount of bytes read bIndex+=bytesN; // allocate the codepoints RF_MALLOC(codepoints,(bIndex+5)*2) // decode it into codepoints if(rfUTF16_Decode(tempBuff,&charsN,codepoints)==false) { free(codepoints); if(buffAllocated==true) free(tempBuff); LOG_ERROR("Failed to Decode UTF-16 from a File Descriptor",RE_UTF16_INVALID_SEQUENCE); return RE_UTF16_INVALID_SEQUENCE; } // now encode these codepoints into UTF8 if(((*utf8)=rfUTF8_Encode(codepoints,charsN,byteLength)) == 0) { free(codepoints); if(buffAllocated==true) free(tempBuff); LOG_ERROR("Failed to encode the File Descriptor's UTF-16 bytestream to UTF-8",RE_UTF8_ENCODING); return RE_UTF8_ENCODING;// error } // success free(codepoints); if(buffAllocated==true) free(tempBuff); #ifdef RF_NEWLINE_CRLF // if the last character was a newline if(*((*utf8)+(*byteLength)-1) == (char)RF_LF) { if(*((*utf8)+(*byteLength)-2) == (char)RF_CR) { *((*utf8)+(*byteLength)-2) = RF_LF; *((*utf8)+(*byteLength)-1) = '\0'; (*byteLength)-=1; } } #endif return bIndex; } // Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer int32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof) { char buff[RF_OPTION_FGETS_READBYTESN+5]; int32_t bytesN; uint32_t *codepoints,charsN,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+5,accum; char* tempBuff = 0,buffAllocated=false; bytesN = rfFgets_UTF16BE(buff,RF_OPTION_FGETS_READBYTESN,f,eof); accum = (uint32_t)bytesN; tempBuff = &buff[0];// point the tempBuff to the initial buffer for now if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Big Endian UTF-16 file",bytesN); return bytesN; } else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF { // allocate the temporary buffer and move the previous buffer's content inside it buffSize=buffSize*2+5; RF_MALLOC(tempBuff,buffSize); memcpy(tempBuff,buff,bytesN); bIndex=bytesN; buffAllocated = true; // keep reading until we have read all until newline or EOF do { bytesN = rfFgets_UTF16BE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof); accum+=bytesN; if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Big Endian UTF-16 file",bytesN); free(tempBuff); return bytesN; } // realloc to have more space in the buffer for reading if needed if(accum+RF_OPTION_FGETS_READBYTESN+5 >= buffSize) { buffSize=(accum+RF_OPTION_FGETS_READBYTESN+5)*2; RF_REALLOC(tempBuff,char,buffSize); } bIndex += bytesN; // if the last character was newline break off the loop if( (*(uint16_t*)(tempBuff+bIndex-2))== (uint16_t)RF_LF) break; }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop }// end of size not fitting the initial buffer case if(bytesN >0)// determine the amount of bytes read bIndex+=bytesN; // allocate the codepoints RF_MALLOC(codepoints,(bIndex+5)*2) // decode it into codepoints if(rfUTF16_Decode(tempBuff,&charsN,codepoints)==false) { free(codepoints); if(buffAllocated==true) free(tempBuff); LOG_ERROR("Failed to Decode UTF-16 from a File Descriptor",RE_UTF16_INVALID_SEQUENCE); return RE_UTF16_INVALID_SEQUENCE; } // now encode these codepoints into UTF8 if(((*utf8)=rfUTF8_Encode(codepoints,charsN,byteLength)) == 0) { free(codepoints); if(buffAllocated==true) free(tempBuff); LOG_ERROR("Failed to encode the File Descriptor's UTF-16 bytestream to UTF-8",RE_UTF8_ENCODING); return RE_UTF8_ENCODING;//error } // success free(codepoints); if(buffAllocated==true) free(tempBuff); #ifdef RF_NEWLINE_CRLF // if the last character was a newline if(*((*utf8)+(*byteLength)-1) == (char)RF_LF) { if(*((*utf8)+(*byteLength)-2) == (char)RF_CR) { *((*utf8)+(*byteLength)-2) = RF_LF; *((*utf8)+(*byteLength)-1) = '\0'; (*byteLength)-=1; } } #endif return bIndex; } // Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer int32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof) { char buff[RF_OPTION_FGETS_READBYTESN+7]; int32_t bytesN; uint32_t *codepoints,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+7,accum; char* tempBuff = 0,buffAllocated=false; bytesN = rfFgets_UTF32BE(buff,RF_OPTION_FGETS_READBYTESN,f,eof); accum = (uint32_t)bytesN; tempBuff = &buff[0];// point the tempBuff to the initial buffer for now if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Big Endian UTF-32 file",bytesN); return bytesN; } else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF { // allocate the temporary buffer and move the previous buffer's content inside it buffSize=buffSize*2+7; RF_MALLOC(tempBuff,buffSize); memcpy(tempBuff,buff,bytesN); bIndex=bytesN; buffAllocated = true; // keep reading until we have read all until newline or EOF do { bytesN = rfFgets_UTF32BE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof); accum+=bytesN; if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Big Endian UTF-16 file",bytesN); free(tempBuff); return bytesN; } // realloc to have more space in the buffer for reading if needed if(accum+RF_OPTION_FGETS_READBYTESN+7 >= buffSize) { buffSize=(accum+RF_OPTION_FGETS_READBYTESN+7)*2; RF_REALLOC(tempBuff,char,buffSize); } bIndex += bytesN; // if the last character was newline break off the loop if( (*(uint32_t*)(tempBuff+bIndex-4))== (uint32_t)RF_LF) break; }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop }// end of size not fitting the initial buffer case if(bytesN >0)//determine the amount of bytes read bIndex+=bytesN; // utf-32 is actually codepoints codepoints = (uint32_t*)tempBuff; // now encode these codepoints into UTF8 if(((*utf8)=rfUTF8_Encode(codepoints,bIndex/4,byteLength)) == 0) { if(buffAllocated==true) free(tempBuff); LOG_ERROR("Failed to encode the File Descriptor's UTF-32 bytestream to UTF-8",RE_UTF8_ENCODING); return RE_UTF8_ENCODING;// error } // success if(buffAllocated==true) free(tempBuff); #ifdef RF_NEWLINE_CRLF // if the last character was a newline if(*((*utf8)+(*byteLength)-1) == (char)RF_LF) { if(*((*utf8)+(*byteLength)-2) == (char)RF_CR) { *((*utf8)+(*byteLength)-2) = RF_LF; *((*utf8)+(*byteLength)-1) = '\0'; (*byteLength)-=1; } } #endif return bIndex; } // Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer int32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof) { char buff[RF_OPTION_FGETS_READBYTESN+7]; int32_t bytesN; uint32_t *codepoints,bIndex=0,buffSize=RF_OPTION_FGETS_READBYTESN+7,accum; char* tempBuff = 0,buffAllocated=false; bytesN = rfFgets_UTF32LE(buff,RF_OPTION_FGETS_READBYTESN,f,eof); accum = (uint32_t) bytesN; tempBuff = &buff[0];// point the tempBuff to the initial buffer for now if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Little Endian UTF-32 file",bytesN); return bytesN; } else if(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false)// if the size does not fit in the buffer and if we did not reach the EOF { // allocate the temporary buffer and move the previous buffer's content inside it buffSize=buffSize*2+7; RF_MALLOC(tempBuff,buffSize); memcpy(tempBuff,buff,bytesN); bIndex=bytesN; buffAllocated = true; // keep reading until we have read all until newline or EOF do { bytesN = rfFgets_UTF32LE(tempBuff+bIndex,RF_OPTION_FGETS_READBYTESN,f,eof); accum +=bytesN; if(bytesN < 0)// error check { LOG_ERROR("Failed to read from a Little Endian UTF-16 file",bytesN); free(tempBuff); return bytesN; } // realloc to have more space in the buffer for reading if needed if(accum+RF_OPTION_FGETS_READBYTESN+7 >= buffSize) { buffSize=(accum+RF_OPTION_FGETS_READBYTESN+7)*2; RF_REALLOC(tempBuff,char,buffSize); } bIndex += bytesN; // if the last character was newline break off the loop if( (*(uint32_t*)(tempBuff+bIndex-4))== (uint32_t)RF_LF) break; }while(bytesN >= RF_OPTION_FGETS_READBYTESN && (*eof)==false);// end of reading loop }// end of size not fitting the initial buffer case if(bytesN >0)// determine the amount of bytes read bIndex+=bytesN; // utf-32 is actually codepoints codepoints = (uint32_t*)tempBuff; // now encode these codepoints into UTF8 if(((*utf8)=rfUTF8_Encode(codepoints,bIndex/4,byteLength)) == 0) { if(buffAllocated==true) free(tempBuff); LOG_ERROR("Failed to encode the File Descriptor's UTF-32 bytestream to UTF-8",RE_UTF8_ENCODING); return RE_UTF8_ENCODING;// error } // success if(buffAllocated==true) free(tempBuff); #ifdef RF_NEWLINE_CRLF // if the last character was a newline if(*((*utf8)+(*byteLength)-1) == (char)RF_LF) { if(*((*utf8)+(*byteLength)-2) == (char)RF_CR) { *((*utf8)+(*byteLength)-2) = RF_LF; *((*utf8)+(*byteLength)-1) = '\0'; (*byteLength)-=1; } } #endif return bIndex; } // This is a function that's similar to c library fgets but it also returns the number of bytes read and works for UTF-32 encoded files int32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eofReached) { uint32_t size,c; int32_t error; // initialization *eofReached = false; size = 0; // if end of file or end of line is not found, keep reading do{ if((error=rfFgetc_UTF32BE(f,(uint32_t*)(buff+size))) != RF_SUCCESS) { if(error == RE_FILE_EOF) { break;// EOF found *eofReached = true; } LOG_ERROR("Reading error while reading from a Big Endian UTF-32 file",error); return error; } size+= 4; // if we have read the number of characters requested by the function if(size >= num) { break; } // get the last character read c = *(uint32_t*)(buff+size-4); }while(c != (uint32_t)EOF && !RF_HEXEQ_UI(c,RF_LF)); // null terminate the buffer for UTF32 buff[size] = buff[size+1] = buff[size+2] = buff[size+3] = '\0'; // finally check yet again for end of file right after the new line if((error=rfFgetc_UTF32BE(f,&c))!=RF_SUCCESS) { if(error == RE_FILE_EOF) {// EOF *eofReached = true; } else { LOG_ERROR("Reading error while reading from a Big Endian UTF-32 file",error); return error; } } else// undo the peek ahead of the file pointer fseek(f,-4,SEEK_CUR); return size; } // This is a function that's similar to c library fgets but it also returns the number of bytes read and works for UTF-32 encoded files int32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eofReached) { uint32_t size,c; int32_t error; // initialization *eofReached = false; size = 0; // if end of file or end of line is not found, keep reading do{ if((error=rfFgetc_UTF32LE(f,(uint32_t*)(buff+size))) != RF_SUCCESS) { if(error == RE_FILE_EOF) { break;// EOF found *eofReached = true; } LOG_ERROR("Reading error while reading from a Little Endian UTF-32 file",error); return error; } size+= 4; // if we have read the number of characters requested by the function if(size >= num) { break; } // get the last character read c = *(uint32_t*)(buff+size-4); }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF)); // null terminate the buffer for UTF32 buff[size] = buff[size+1] = buff[size+2] = buff[size+3] = '\0'; // finally check yet again for end of file right after the new line if((error=rfFgetc_UTF32LE(f,&c))!=RF_SUCCESS) { if(error == RE_FILE_EOF) {// EOF *eofReached = true; } else { LOG_ERROR("Reading error while reading from a Little Endian UTF-32 file",error); return error; } } else// undo the peek ahead of the file pointer fseek(f,-4,SEEK_CUR); return size; } // Gets a number of bytes from a BIG endian UTF-16 file descriptor int32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eofReached) { uint32_t size,c; int32_t bytesN; // initialization *eofReached = false; size = 0; // if end of file or end of line is not found, keep reading do{ bytesN = rfFgetc_UTF16BE(f,(uint32_t*)(buff+size),false); // error check if(bytesN < 0) { if(bytesN == RE_FILE_EOF) { break;// EOF found *eofReached = true; } else return bytesN; } size+= bytesN; // if we have read the number of characters requested by the function if(size >= num) { break; } // get the last character read c = *(uint32_t*)(buff+size-bytesN); }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF)); // null terminate the buffer for UTF16 buff[size] = buff[size+1] = '\0'; // finally check yet again for end of file right after the new line bytesN = rfFgetc_UTF16BE(f,&c,false); if(bytesN < 0) { if(bytesN == RE_FILE_EOF) {// EOF *eofReached = true; } else// error return bytesN; } else// undo the peek ahead of the file pointer fseek(f,-bytesN,SEEK_CUR); return size; } // Gets a number of bytes from a Little endian UTF-16 file descriptor int32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eofReached) { uint32_t size,c; int32_t bytesN; // initialization *eofReached = false; size = 0; // if end of file or end of line is not found, keep reading do{ bytesN = rfFgetc_UTF16LE(f,(uint32_t*)(buff+size),false); // error check if(bytesN < 0) { if(bytesN == RE_FILE_EOF) { break;// EOF found *eofReached = true; } else return bytesN; } size+= bytesN; // if we have read the number of characters requested by the function if(size >= num) { break; } // get the last character read c = *(uint32_t*)(buff+size-bytesN); }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF)); // null terminate the buffer for UTF16 buff[size] = buff[size+1] = '\0'; // finally check yet again for end of file right after the new line bytesN = rfFgetc_UTF16LE(f,&c,false); if(bytesN < 0) { if(bytesN == RE_FILE_EOF) {// EOF *eofReached = true; } else// error return bytesN; } else// undo the peek ahead of the file pointer fseek(f,-bytesN,SEEK_CUR); return size; } // Gets a number of bytes from a UTF-8 file descriptor int32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eofReached) { uint32_t size,c; int32_t bytesN; // initialization *eofReached = false; size = 0; // if end of file or end of line is not found, keep reading do{ bytesN = rfFgetc_UTF8(f,(uint32_t*)(buff+size),false); // error check if(bytesN < 0) { if(bytesN == RE_FILE_EOF) { break;// EOF found *eofReached = true; } else return bytesN; } size+= bytesN; // if we have read the number of characters requested by the function if(size >= num) { break; } // get the last character c = *(uint32_t*)(buff+size-bytesN); }while(c !=(uint32_t) EOF && !RF_HEXEQ_UI(c,RF_LF)); // null terminate the buffer for UTF8 buff[size] = '\0'; // finally check yet again for end of file right after the new line if( RF_HEXEQ_C(fgetc(f),EOF)) {// check for error if(ferror(f) != 0) { LOG_ERROR("During reading a UTF-8 file there was a read error",RE_FILE_READ); return RE_FILE_READ; } // if not it's end of file, so note it and take the pointer back by 1 *eofReached = true; }// undo the peek ahead of the file pointer else fseek(f,-1,SEEK_CUR); return size; } // Gets a unicode character from a UTF-8 file descriptor int32_t rfFgetc_UTF8(FILE* f,uint32_t *ret,char cp) { char c,c2,c3,c4; if( (c = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from the stream") else return RE_FILE_EOF; } // if the lead bit of the byte is 0 then range is : U+0000 to U+0007F (1 byte) if( ((c & 0x80)>>7) == 0 ) { /// success if(cp == true) *ret = c; else { *ret = 0; char* cc = (char*) ret; cc[0] = c; } return 1; } else// we need more bytes { // if the leading bits are in the form of 0b110xxxxx then range is: U+0080 to U+07FF (2 bytes) if( RF_HEXEQ_C( ( (~(c ^ 0xC0))>>5), 0x7) ) { // also remember bytes 0xC0 and 0xC1 are invalid and could possibly be found in a starting byte of this type so check for them here if( RF_HEXEQ_C(c,0xC0) || RF_HEXEQ_C(c,0xC1)) { LOG_ERROR("While decoding a UTF-8 file byte stream, an invalid byte was encountered",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE); return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE; } // so now read the next byte if( (c2 = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from a file stream") else { LOG_ERROR("While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes",RE_UTF8_INVALID_SEQUENCE_END); return RE_FILE_EOF; } } // if this second byte is NOT a continuation byte if( !rfUTF8_IsContinuationByte(c2)) { LOG_ERROR("While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found",RE_UTF8_INVALID_SEQUENCE_CONBYTE); return RE_UTF8_INVALID_SEQUENCE_CONBYTE; } /// success if(cp == true)// return decoded codepoint { *ret = 0; // from the second byte take the first 6 bits *ret = (c2 & 0x3F) ; // from the first byte take the first 5 bits and put them in the start *ret |= ((c & 0x1F) << 6); } else { *ret = 0; char* cc = (char*)ret; cc[0] = c; cc[1] = c2; } return 2; }// end of the 2 bytes case // if the leading bits are in the form of 0b1110xxxx then range is U+0800 to U+FFFF (3 bytes) else if( RF_HEXEQ_C( ( (~(c ^ 0xE0))>>4),0xF)) { // so now read the next 2 bytes if( (c2 = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from a file stream") else { LOG_ERROR("While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes",RE_UTF8_INVALID_SEQUENCE_END); return RE_FILE_EOF; } } if( (c3 = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from a file stream") else { LOG_ERROR("While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes",RE_UTF8_INVALID_SEQUENCE_END); return RE_FILE_EOF; } } // if the subsequent bytes are NOT continuation bytes if( !rfUTF8_IsContinuationByte(c2) || !rfUTF8_IsContinuationByte(c3)) { LOG_ERROR("While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found",RE_UTF8_INVALID_SEQUENCE_CONBYTE); return RE_UTF8_INVALID_SEQUENCE_CONBYTE; } /// success if(cp == true)// if we need to decode the codepoint { *ret = 0; // from the third byte take the first 6 bits *ret = (c3 & 0x3F) ; // from the second byte take the first 6 bits and put them to the left of the previous 6 bits *ret |= ((c2 & 0x3F) << 6); // from the first byte take the first 4 bits and put them to the left of the previous 6 bits *ret |= ((c & 0xF) << 12); } else { *ret = 0; char* cc = (char*)ret; cc[0] = c; cc[1] = c2; cc[2] = c3; } return 3; }// end of 3 bytes case // if the leading bits are in the form of 0b11110xxx then range is U+010000 to U+10FFFF (4 bytes) else if(RF_HEXEQ_C( ( (~(c ^ 0xF0))>>3), 0x1F)) { // in this type of starting byte a number of invalid bytes can be encountered. We have to check for them. if(RF_HEXGE_C(c,0xBF)) //invalid byte value are from 0xBF to 0xFF { LOG_ERROR("While decoding a UTF-8 file byte stream, an invalid byte was encountered",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE); return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE; } // so now read the next 3 bytes if( (c2 = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from a file stream") else { LOG_ERROR("While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes",RE_UTF8_INVALID_SEQUENCE_END); return RE_FILE_EOF; } } if( (c3 = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from a file stream") else { LOG_ERROR("While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes",RE_UTF8_INVALID_SEQUENCE_END); return RE_FILE_EOF; } } if( (c4 = fgetc(f)) == EOF) { i_READ_CHECK(f,"While reading a UTF-8 character from a file stream") else { LOG_ERROR("While decoding a UTF-8 file byte stream, EOF was encountered abruplty in-between bytes",RE_UTF8_INVALID_SEQUENCE_END); return RE_FILE_EOF; } } // if the subsequent bytes are NOT continuation bytes if( !rfUTF8_IsContinuationByte(c2) || !rfUTF8_IsContinuationByte(c3) || !rfUTF8_IsContinuationByte(c4)) { LOG_ERROR("While decoding a UTF-8 file byte stream, and expecting a continuation byte, one was not found",RE_UTF8_INVALID_SEQUENCE_CONBYTE); return RE_UTF8_INVALID_SEQUENCE_CONBYTE; } /// success if(cp == true) //if we need to decode the codepoint { *ret = 0; // from the fourth byte take the first 6 bits *ret = (c4 & 0x3F) ; // from the third byte take the first 6 bits and put them to the left of the previous 6 bits *ret |= ((c3 & 0x3F) << 6); // from the second byte take the first 6 bits and put them to the left of the previous 6 bits *ret |= ((c2 & 0x3F) << 12); // from the first byte take the first 3 bits and put them to the left of the previous 6 bits *ret |= ((c & 0x7) << 18); } else { *ret = 0; char* cc = (char*)ret; cc[0] = c; cc[1] = c2; cc[2] = c3; cc[3]=c4; } return 4; }// end of 4 bytes case }// end of needing more than 1 byte // if we get here means the 1st byte belonged to none of the 4 cases LOG_ERROR("While decoding a UTF-8 file byte stream, the first byte of a character was invalid UTF-8",RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE); return RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE; } // Gets a unicode character from a Big Endian UTF-16 file descriptor int32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp) { char swapE=false; uint16_t v1,v2; // check if we need to be swapping if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN) swapE = true; // read the first 2 bytes if(fread(&v1,2,1,f) != 1) { i_READ_CHECK(f,"While reading a UTF-16 from a Big Endian File stream") else return RE_FILE_EOF; } if(swapE)// swap endianess if needed rfUTILS_SwapEndianUS(&v1); /* If the value is in the surrogate area */ if(RF_HEXGE_US(v1,0xD800) && RF_HEXLE_US(v1,0xDFFF)) { if(RF_HEXL_US(v1,0xD800) || RF_HEXG_US(v1,0xDBFF)) { LOG_ERROR("While reading a Big endian UTF-16 file stream the first byte encountered held an illegal value",RE_UTF16_INVALID_SEQUENCE); return RE_UTF16_INVALID_SEQUENCE; } // then we also need to read its surrogate pair if(fread(&v2,2,1,f) != 1) { i_READ_CHECK(f,"While reading a UTF-16 from a Big Endian File stream") else { LOG_ERROR("While decoding a UTF-16 Big Endian file byte stream, EOF was encountered abruplty when expecting a surrogate pair",RE_UTF16_NO_SURRPAIR); return RE_FILE_EOF; } } if(swapE)// swap endianess if needed rfUTILS_SwapEndianUS(&v2); if(RF_HEXL_US(v2,0xDC00) || RF_HEXG_US(v2,0xDFFF)) { LOG_ERROR("While reading a Big endian UTF-16 file stream the surrogate pair encountered held an illegal value",RE_UTF16_INVALID_SEQUENCE); return RE_UTF16_INVALID_SEQUENCE; } if(cp == true)// if the user wants the decoded codepoint { *c = 0; *c = v2&0x3ff; *c |= (10< #include #ifdef __cplusplus extern "C" {// opening bracket for calling from C++ #endif // New line feed #define RF_LF 0xA // Carriage Return #define RF_CR 0xD #ifdef REFU_WIN32_VERSION #define i_PLUSB_WIN32 "b" #else #define i_PLUSB_WIN32 "" #endif // This is the type that represents the file offset #ifdef _MSC_VER typedef __int64 foff_rft; #else #include typedef off64_t foff_rft; #endif ///Fseek and Ftelll definitions #ifdef _MSC_VER #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_) _fseeki64(i_FILE_,i_OFFSET_,i_WHENCE_) #define rfFtell(i_FILE_) _ftelli64(i_FILE_) #else #define rfFseek(i_FILE_,i_OFFSET_,i_WHENCE_) fseeko64(i_FILE_,i_OFFSET_,i_WHENCE_) #define rfFtell(i_FILE_) ftello64(i_FILE_) #endif /** ** @defgroup RF_IOGRP I/O ** @addtogroup RF_IOGRP ** @{ **/ // @brief Reads a UTF-8 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function // shall not be adding any CR character that is found in the file behind a newline character since this is // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. // // @param[in] f The file descriptor to read // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes // @param[out] bufferSize Give an @c uint32_t here to receive the capacity of the @c utf8 buffer in bytes // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file // with reading this line // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. // The possible errors to return are the same as rfFgets_UTF8() i_DECLIMEX_ int32_t rfFReadLine_UTF8(FILE* f,char** utf8,uint32_t* byteLength,uint32_t* bufferSize,char* eof); // @brief Reads a Big Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function // shall not be adding any CR character that is found in the file behind a newline character since this is // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. // // @param[in] f The file descriptor to read // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file // with reading this line // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. // + Any error that can be returned by @ref rfFgets_UTF16BE() // + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 i_DECLIMEX_ int32_t rfFReadLine_UTF16BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); // @brief Reads a Little Endian UTF-16 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function // shall not be adding any CR character that is found in the file behind a newline character since this is // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. // // @param[in] f The file descriptor to read // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file // with reading this line // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. // + Any error that can be returned by @ref rfFgets_UTF16LE() // + @c RE_UTF16_INVALID_SEQUENCE: Failed to decode the UTF-16 byte stream of the file descriptor // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 i_DECLIMEX_ int32_t rfFReadLine_UTF16LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); // @brief Reads a Big Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function // shall not be adding any CR character that is found in the file behind a newline character since this is // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. // // @param[in] f The file descriptor to read // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file // with reading this line // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. // + Any error that can be returned by @ref rfFgets_UTF32BE() // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 i_DECLIMEX_ int32_t rfFReadLine_UTF32BE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); // @brief Reads a Little Endian UTF-32 file descriptor until end of line or EOF is found and returns a UTF-8 byte buffer // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // When the compile flag @c RF_NEWLINE_CRLF is defined (the default case at Windows) then this function // shall not be adding any CR character that is found in the file behind a newline character since this is // the Windows line ending scheme. Beware though that the returned read bytes value shall still count the CR character inside. // // @param[in] f The file descriptor to read // @param[out] utf8 Give here a refence to an unitialized char* that will be allocated inside the function // and contain the utf8 byte buffer. Needs to be freed by the caller explicitly later // @param[out] byteLength Give an @c uint32_t here to receive the length of the @c utf8 buffer in bytes // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file // with reading this line // @return Returns either a positive number for success that represents the number of bytes read from @c f and and error in case something goes wrong. // + Any error that can be returned by @ref rfFgets_UTF32LE() // + @c RE_UTF8_ENCODING: Failed to encode the UTF-16 of the file descriptor into UTF-8 i_DECLIMEX_ int32_t rfFReadLine_UTF32LE(FILE* f,char** utf8,uint32_t* byteLength,char* eof); // @brief Gets a number of bytes from a BIG endian UTF-32 file descriptor // // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes // have been read or new line or EOF character has been encountered. // // The function will read until @c num characters are read and if @c num // would take us to the middle of a UTF32 character then the next character shall also be read // and the function will return the number of bytes read. // Since the function null terminates the buffer the given @c buff needs to be of at least // @c num+7 size to cater for the worst case. // // The final bytestream stored inside @c buff is in the endianess of the system. // // If right after the last character read comes the EOF, the function // shall detect so and assign @c true to @c eof. // // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7 // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4 // @param[in] f A valid FILE descriptor from which to read the bytes // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. // @return Returns the actual number of bytes read or an error if there was a problem. // The possible errors are: // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgets_UTF32BE(char* buff,uint32_t num,FILE* f,char* eof); // @brief Gets a number of bytes from a Little endian UTF-32 file descriptor // // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes // have been read or new line or EOF character has been encountered. // // The function will read until @c num characters are read and if @c num // would take us to the middle of a UTF32 character then the next character shall also be read // and the function will return the number of bytes read. // Since the function null terminates the buffer the given @c buff needs to be of at least // @c num+7 size to cater for the worst case. // // The final bytestream stored inside @c buff is in the endianess of the system. // // If right after the last character read comes the EOF, the function // shall detect so and assign @c true to @c eof. // // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+7 // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 4 bytes). Should be a multiple of 4 // @param[in] f A valid FILE descriptor from which to read the bytes // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. // @return Returns the actual number of bytes read or an error if there was a problem. // The possible errors are: // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgets_UTF32LE(char* buff,uint32_t num,FILE* f,char* eof); // @brief Gets a number of bytes from a BIG endian UTF-16 file descriptor // // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes // have been read or new line or EOF character has been encountered. // // The function will read until @c num characters are read and if @c num // would take us to the middle of a UTF16 character then the next character shall also be read // and the function will return the number of bytes read. // Since the function null terminates the buffer the given @c buff needs to be of at least // @c num+5 size to cater for the worst case. // // The final bytestream stored inside @c buff is in the endianess of the system. // // If right after the last character read comes the EOF, the function // shall detect so and assign @c true to @c eof. // // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+5 // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2 // @param[in] f A valid FILE descriptor from which to read the bytes // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. // @return Returns the actual number of bytes read or an error if there was a problem. // The possible errors are: // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgets_UTF16BE(char* buff,uint32_t num,FILE* f,char* eof); // @brief Gets a number of bytes from a Little endian UTF-16 file descriptor // // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num bytes // have been read or new line or EOF character has been encountered. // // The function will read until @c num characters are read and if @c num // would take us to the middle of a UTF16 character then the next character shall also be read // and the function will return the number of bytes read. // Since the function null terminates the buffer the given @c buff needs to be of at least // @c num+5 size to cater for the worst case. // // The final bytestream stored inside @c buff is in the endianess of the system. // // If right after the last character read comes the EOF, the function // shall detect so and assign @c true to @c eof. // // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param[in] buff A buffer to be filled with the contents of the file. Should be of size at least @c num+2 // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 2 bytes). Should be a multiple of 2 // @param[in] f A valid FILE descriptor from which to read the bytes // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. // @return Returns the actual number of bytes read or an error if there was a problem. // The possible errors are: // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgets_UTF16LE(char* buff,uint32_t num,FILE* f,char* eof); // @brief Gets a number of bytes from a UTF-8 file descriptor // // This is a function that's similar to c library fgets but it also returns the number of bytes read. Reads in from the file until @c num characters // have been read or new line or EOF character has been encountered. // // The function automatically adds a null termination character at the end of // @c buff but this character is not included in the returned actual number of bytes. // // The function will read until @c num characters are read and if @c num // would take us to the middle of a UTF8 character then the next character shall also be read // and the function will return the number of bytes read. // Since the function null terminates the buffer the given @c buff needs to be of at least // @c num+4 size to cater for the worst case. // // If right after the last character read comes the EOF, the function // shall detect so and assign @c true to @c eof. // // In Windows where file endings are in the form of 2 bytes CR-LF (Carriage return - NewLine) this function // shall just ignore the carriage returns and not return it inside the return buffer at @c buff. // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param[in] buff A buffer to be filled with the contents of the file. Should of size at least @c num+4 // @param[in] num The maximum number of bytes to read from within the file NOT including the null terminating character(which in itelf is 1 byte) // @param[in] f A valid FILE descriptor from which to read the bytes // @param[out] eof Pass a reference to a char to receive a true/false value for whether EOF has been reached. // @return Returns the actual number of bytes read or an error if there was a problem. // The possible errors are: // + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found // + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation // byte and did not find it // + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should // have been continuation bytes // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgets_UTF8(char* buff,uint32_t num,FILE* f,char* eof); // @brief Gets a unicode character from a UTF-8 file descriptor // // This function attempts to assume a more modern fgetc() role for UTF-8 encoded files. // Reads bytes from the File descriptor @c f until a full UTF-8 unicode character has been read // // After this function the file pointer will have moved either by @c 1, @c 2, @c 3 or @c 4 // bytes if the return value is positive. You can see how much by checking the return value. // // You shall need to provide an integer at @c c to contain either the decoded Unicode // codepoint or the UTF-8 endoced byte depending on the value of the @c cp argument. // // @param f A valid FILE descriptor from which to read the bytes // @param c Pass an int that will receive either the unicode code point value or // the UTF8 bytes depending on the value of the @c cp flag // @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point // of the read character, so the UTF-8 will be decoded. // If @c false the int passed at @c c will contain the value of the read bytes in UTF-8 without any decoding // @return Returns the number of bytes read (either @c 1, @c 2, @c 3 or @c 4) or an error if the function // fails for some reason. Possible error values are: // + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered // in the middle of a UTF-8 encoded character where we would be expecting something different // and @c RE_UTF8_INVALID_SEQUENCE_END error is also logged // + @c RE_UTF8_INVALID_SEQUENCE_INVALID_BYTE: If an invalid UTF-8 byte has been found // + @c RE_UTF8_INVALID_SEQUENCE_CONBYTE: If during parsing the file we were expecting a continuation // byte and did not find it // + @c RE_UTF8_INVALID_SEQUENCE_END: If the null character is encountered in between bytes that should // have been continuation bytes // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgetc_UTF8(FILE* f,uint32_t *c,char cp); // @brief Gets a unicode character from a UTF-16 Big Endian file descriptor // // This function attempts to assume a more modern fgetc() role for UTF-16 encoded files. // Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read // // After this function the file pointer will have moved either by @c 2 or @c 4 // bytes if the return value is positive. You can see how much by checking the return value. // // You shall need to provide an integer at @c c to contain either the decoded Unicode // codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument. // // @param f A valid FILE descriptor from which to read the bytes // @param c Pass an int that will receive either the unicode code point value or // the UTF16 bytes depending on the value of the @c cp flag // @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point // of the read character, so the UTF-16 will be decoded. // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding // @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function // fails for some reason. Possible error values are: // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values // + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found // + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered // while we expect a UTF-16 surrogate pair an appropriate error is logged // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgetc_UTF16BE(FILE* f,uint32_t *c,char cp); // @brief Gets a unicode character from a UTF-16 Little Endian file descriptor // // This function attempts to assume a more modern fgetc() role for UTF-16 encoded files. // Reads bytes from the File descriptor @c f until a full UTF-16 unicode character has been read // // After this function the file pointer will have moved either by @c 2 or @c 4 // bytes if the return value is positive. You can see how much by checking the return value. // // You shall need to provide an integer at @c c to contain either the decoded Unicode // codepoint or the Bigendian encoded UTF-16 bytes depending on the value of @c the cp argument. // // @param f A valid FILE descriptor from which to read the bytes // @param c Pass an int that will receive either the unicode code point value or // the UTF16 bytes depending on the value of the @c cp flag // @param cp A boolean flag. If @c true then the int passed at @c c will contain the unicode code point // of the read character, so the UTF-16 will be decoded. // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding // @return Returns the number of bytes read (either @c 2 or @c 4) or an error if the function // fails for some reason. Possible error values are: // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values // + @c RE_UTF16_NO_SURRPAIR: According to the first read word a surrogate pair was expected but none was found // + @c RE_FILE_EOF: The end of file has been found while reading. If the end of file is encountered // while we expect a UTF-16 surrogate pair an appropriate error is logged // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgetc_UTF16LE(FILE* f,uint32_t *c,char cp); // @brief Gets a unicode character from a UTF-32 Little Endian file descriptor // // This function attempts to assume a more modern fgetc() role for UTF-32 encoded files. // Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read // // After this function the file pointer will have moved by @c 4 // bytes if the return value is positive. // // You shall need to provide an integer at @c to contain the UTF-32 codepoint. // // @param f A valid FILE descriptor from which to read the bytes // @param c Pass an int that will receive either the unicode code point value or // the UTF16 bytes depending on the value of the @c cp flag // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding // @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors: // + @c RE_FILE_EOF: The end of file has been found while reading. // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgetc_UTF32LE(FILE* f,uint32_t *c); // @brief Gets a unicode character from a UTF-32 Big Endian file descriptor // // This function attempts to assume a more modern fgetc() role for UTF-32 encoded files. // Reads bytes from the File descriptor @c f until a full UTF-32 unicode character has been read // // After this function the file pointer will have moved by @c 4 // bytes if the return value is positive. // // You shall need to provide an integer at @c to contain the UTF-32 codepoint. // // @param f A valid FILE descriptor from which to read the bytes // @param c Pass an int that will receive either the unicode code point value or // the UTF16 bytes depending on the value of the @c cp flag // If @c false the int passed at @c c will contain the value of the read bytes in UTF-16 without any decoding // @return Returns either @c RF_SUCCESS for succesfull readin or one of the following errors: // + @c RE_FILE_EOF: The end of file has been found while reading. // + @c RE_FILE_READ: If during reading the file there was an unknown read error // + @c RE_FILE_READ_BLOCK: If the read operation failed due to the file descriptor being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the file descriptor's mode was not correctly set for reading // + @c RE_FILE_POS_OVERFLOW: If during reading, the current file position can't be represented by the system // + @c RE_INTERRUPT: If during reading, there was a system interrupt // + @c RE_FILE_IO: If there was a physical I/O error // + @c RE_FILE_NOSPACE: If reading failed due to insufficient storage space i_DECLIMEX_ int32_t rfFgetc_UTF32BE(FILE* f,uint32_t *c); // @brief Moves a unicode character backwards in a big endian UTF-32 file stream // // @param f The file stream // @param c Returns the character we moved back to as a unicode codepoint // @return Returns either @c RF_SUCCESS for success or one of the following errors: // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt // + @c RE_FILE_IO: There was a physical I/O error // + @c RE_FILE_NOSPACE: There was no space on the device holding the file // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent // + @c RE_FILE_READ: If during reading the file there was an error // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading i_DECLIMEX_ int32_t rfFback_UTF32BE(FILE* f,uint32_t *c); // @brief Moves a unicode character backwards in a little endian UTF-32 file stream // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param f The file stream // @param c Returns the character we moved back to as a unicode codepoint // @return Returns either @c RF_SUCCESS for success or one of the following errors: // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt // + @c RE_FILE_IO: There was a physical I/O error // + @c RE_FILE_NOSPACE: There was no space on the device holding the file // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent // + @c RE_FILE_READ: If during reading the file there was an error // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading i_DECLIMEX_ int32_t rfFback_UTF32LE(FILE* f,uint32_t *c); // @brief Moves a unicode character backwards in a big endian UTF-16 file stream // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param f The file stream // @param c Returns the character we moved back to as a unicode codepoint // @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors: // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt // + @c RE_FILE_IO: There was a physical I/O error // + @c RE_FILE_NOSPACE: There was no space on the device holding the file // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent // + @c RE_FILE_READ: If during reading the file there was an error // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading i_DECLIMEX_ int32_t rfFback_UTF16BE(FILE* f,uint32_t *c); // @brief Moves a unicode character backwards in a little endian UTF-16 file stream // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param f The file stream // @param c Returns the character we moved back to as a unicode codepoint // @return Returns either the number of bytes moved backwards (either @c 4 or @c 2) for success or one of the following errors: // + @c RE_UTF16_INVALID_SEQUENCE: Either the read word or its surrogate pair if 4 bytes were read held illegal values // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt // + @c RE_FILE_IO: There was a physical I/O error // + @c RE_FILE_NOSPACE: There was no space on the device holding the file // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent // + @c RE_FILE_READ: If during reading the file there was an error // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading i_DECLIMEX_ int32_t rfFback_UTF16LE(FILE* f,uint32_t *c); // @brief Moves a unicode character backwards in a UTF-8 file stream // // The file descriptor at @c f must have been opened in binary and not text mode. That means that if under // Windows make sure to call fopen with "wb", "rb" e.t.c. instead of the simple "w", "r" e.t.c. since the initial // default value under Windows is text mode. Alternatively you can set the initial value using _get_fmode() and // _set_fmode(). For more information take a look at the msdn pages here: // http://msdn.microsoft.com/en-us/library/ktss1a9b.aspx // // @param f The file stream // @param c Returns the character we moved back to as a unicode codepoint // @return Returns either the number of bytes moved backwards for success (either @c 4, @c 3, @c 2 or @c 1) or one of the following errors: // + @c RE_UTF8_INVALID_SEQUENCE: If during moving bacwards in the file unexpected UTF-8 bytes were found // + @c RE_FILE_POS_OVERFLOW: If during trying to read the current file's position it can't be represented by the system // + @c RE_FILE_BAD: If The file descriptor is corrupt/illegal // + @c RE_FILE_NOTFILE: If the file descriptor is not a file but something else. e.g. socket. // + @c RE_FILE_GETFILEPOS: If the file's position could not be retrieved for some unknown reason // + @c RE_FILE_WRITE_BLOCK: While attempting to move the file pointer, it was occupied by another thread, and the no block flag was set // + @c RE_INTERRUPT: Operating on the file failed due to a system interrupt // + @c RE_FILE_IO: There was a physical I/O error // + @c RE_FILE_NOSPACE: There was no space on the device holding the file // + @c RE_FILE_NOTFILE: The device we attempted to manipulate is non-existent // + @c RE_FILE_READ: If during reading the file there was an error // + @c RE_FILE_READ_BLOCK: If during reading the file the read operation failed due to the file being occupied by another thread // + @c RE_FILE_MODE: If during reading the file the underlying file descriptor's mode was not correctly set for reading i_DECLIMEX_ int32_t rfFback_UTF8(FILE* f,uint32_t *c); // @brief Opens another process as a pipe // // This function is a cross-platform popen wrapper. In linux it uses popen and in Windows it uses // _popen. // @lmsFunction // @param command The string with the command to execute. Is basically the name of the program/process you want to spawn // with its full path and its parameters. @inhtype{String,StringX} @tmpSTR // @param mode The mode you want the pipe to work in. There are two possible values: // + @c "r" The calling process can read the spawned command's standard output via the returned stream. // + @c "w" The calling process can write to the spawned command's standard input via the returned stream. // // Anything else will result in an error // @return For success popen will return a FILE descriptor that can be used to either read or write from the pipe. // If there was an error @c 0 is returned and an error is logged. #ifdef RF_IAMHERE_FOR_DOXYGEN i_DECLIMEX_ FILE* rfPopen(void* command,const char* mode); #else i_DECLIMEX_ FILE* i_rfPopen(void* command,const char* mode); #define rfPopen(i_CMD_,i_MODE_) i_rfLMS_WRAP2(FILE*,i_rfPopen,i_CMD_,i_MODE_) #endif // @brief Closes a pipe // // This function is a cross-platform wrapper for pclose. It closes a file descriptor opened with @ref rfPopen() and // returns the exit code of the process that was running // @param stream The file descriptor of the pipe returned by @ref rfPopen() that we want to close // @return Returns the exit code of the process or -1 if there was an error i_DECLIMEX_ int rfPclose(FILE* stream); // @} End of I/O group #ifdef __cplusplus }///closing bracket for calling from C++ #endif #endif//include guards end ================================================ FILE: samples/C/rfc_string.c ================================================ /** ** Copyright (c) 2011-2012, Karapetsas Eleftherios ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: ** 1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. ** 2. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in ** the documentation and/or other materials provided with the distribution. ** 3. Neither the name of the Original Author of Refu nor the names of its contributors may be used to endorse or promote products derived from ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, ** INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE ** DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, ** SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR ** SERVICES;LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, ** WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE ** OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. **/ #include #include // include bitwise operations #include // include the private functions and macros #include "string_private.h" // include io_private only for the write check #include "../IO/io_private.h" // include the extended strin #include // for HUGE_VAL definition #include #include // for the local stack memory /*********************************************************************** Start of the RF_String functions *****************************************************************************************/ /*-------------------------------------------------------------------------Methods to create an RF_String-------------------------------------------------------------------------------*/ // Allocates and returns a string with the given characters a refu string with the given characters. Given characters have to be in UTF-8. A check for valide sequence of bytes is performed. #ifndef RF_OPTION_DEFAULT_ARGUMENTS RF_String* rfString_Create(const char* s,...) #else RF_String* i_rfString_Create(const char* s,...) #endif { READ_VSNPRINTF_ARGS(s,s,0) // check for validity of the given sequence and get the character length uint32_t byteLength; if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE) { LOG_ERROR("Error at String Allocation due to invalid UTF-8 byte sequence",RE_STRING_INIT_FAILURE); if(buffAllocated == true) free(buff); return 0; } RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); // get length ret->byteLength = byteLength; // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(ret->bytes,ret->byteLength+1); memcpy(ret->bytes,buff,ret->byteLength+1); if(buffAllocated==true) free(buff); return ret; } #ifdef RF_OPTION_DEFAULT_ARGUMENTS RF_String* i_NVrfString_Create(const char* s) { // check for validity of the given sequence and get the character length uint32_t byteLength; if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE) { LOG_ERROR("Error at String Allocation due to invalid UTF-8 byte sequence",RE_STRING_INIT_FAILURE); return 0; } RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); // get length ret->byteLength = byteLength; // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(ret->bytes,ret->byteLength+1); memcpy(ret->bytes,s,ret->byteLength+1); return ret; } #endif // Allocates and returns a string with the given characters a refu string with the given characters. Given characters have to be in UTF-8. A check for valid sequence of bytes is performed. RF_String* i_rfString_CreateLocal1(const char* s,...) { #if RF_OPTION_SOURCE_ENCODING != RF_UTF8 uint32_t characterLength,*codepoints,i=0,j; #endif // remember the stack pointer before this macro evaluation rfLMS_MacroEvalPtr(RF_LMS); // read the var args READ_VSNPRINTF_ARGS(s,s,0) // /===Start of Non-UTF-8 code===// / #if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE) // find the bytelength of the UTF-16 buffer while(buff[i] != '\0' && buff[i+1]!= '\0') i++; i+=2; // allocate the codepoint buffer RF_MALLOC(codepoints,i/2) #elif (RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF32_BE) // find the bytelength of the UTF-32 buffer while(buff[i] != '\0' && buff[i+1]!= '\0' && buff[i+2]!= '\0' && buff[i+3]!= '\0') i++; i+=4; // allocate the codepoint buffer RF_MALLOC(codepoints,i) #endif #if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE)// decode the UTF16 if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN) if(rfUTF16_Decode(buff,&characterLength,codepoints) == false) goto cleanup; else if(rfUTF16_Decode_swap(buff,&characterLength,codepoints)==false) goto cleanup; #elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE// decode the UTF16 if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN) if(rfUTF16_Decode_swap(buff,&characterLength,codepoints) == false) goto cleanup; else if(rfUTF16_Decode(buff,&characterLength,codepoints)==false) goto cleanup; #elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE// copy the UTF32 into the codepoint memcpy(codepoints,buff,i); if(rfUTILS_Endianess != RF_LITTLE_ENDIAN) { for(j=0;jbyteLength = byteLength; // now that we know the length we can allocate the buffer and copy the bytes ret->bytes = rfLMS_Push(RF_LMS,ret->byteLength+1); if(ret->bytes == 0) { LOG_ERROR("Memory allocation from the Local Memory Stack failed. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...", RE_LOCALMEMSTACK_INSUFFICIENT); exit(RE_LOCALMEMSTACK_INSUFFICIENT); } memcpy(ret->bytes,buff,ret->byteLength+1); // finally free stuff if needed if(buffAllocated == true) free(buff); return ret; // /cleanup code for non-UTF-8 cases #if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE) cleanup: #if RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE LOG_ERROR("Temporary RF_String creation from a UTF-16 Little Endian buffer failed due to UTF-16 decoding failure",RE_UTF16_INVALID_SEQUENCE); #elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE LOG_ERROR("Temporary RF_String creation from a UTF-16 Big Endian buffer failed due to UTF-16 decoding failure",RE_UTF16_INVALID_SEQUENCE); #endif free(codepoints); if(buffAllocated == true) free(buff); return 0; #endif } RF_String* i_NVrfString_CreateLocal(const char* s) { #if RF_OPTION_SOURCE_ENCODING != RF_UTF8 uint32_t characterLength,*codepoints,i=0,j; char* buff; #endif // remember the stack pointer before this macro evaluation rfLMS_MacroEvalPtr(RF_LMS); // /===Start of Non-UTF-8 code===// / #if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE) // find the bytelength of the UTF-16 buffer while(s[i] != '\0' &&s[i+1]!= '\0') i++; i+=2; // allocate the codepoint buffer RF_MALLOC(codepoints,i/2) #elif (RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF32_BE) // find the bytelength of the UTF-32 buffer while(s[i] != '\0' && s[i+1]!= '\0' && s[i+2]!= '\0' && s[i+3]!= '\0') i++; i+=4; // allocate the codepoint buffer RF_MALLOC(codepoints,i) #endif #if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE)// decode the UTF16 if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN) if(rfUTF16_Decode(s,&characterLength,codepoints) == false) goto cleanup; else if(rfUTF16_Decode_swap(s,&characterLength,codepoints)==false) goto cleanup; #elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE// decode the UTF16 if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN) if(rfUTF16_Decode_swap(s,&characterLength,codepoints) == false) goto cleanup; else if(rfUTF16_Decode(s,&characterLength,codepoints)==false) goto cleanup; #elif RF_OPTION_SOURCE_ENCODING == RF_UTF32_LE// copy the UTF32 into the codepoint memcpy(codepoints,s,i); if(rfUTILS_Endianess != RF_LITTLE_ENDIAN) { for(j=0;jbyteLength = byteLength; ret->bytes = rfLMS_Push(RF_LMS,ret->byteLength+1); if(ret->bytes == 0) { LOG_ERROR("Memory allocation from the Local Memory Stack failed during string allocation. Insufficient local memory stack space. Consider compiling the library with bigger stack space. Quitting proccess...", RE_LOCALMEMSTACK_INSUFFICIENT); exit(RE_LOCALMEMSTACK_INSUFFICIENT); } #if RF_OPTION_SOURCE_ENCODING == RF_UTF8 memcpy(ret->bytes,s,ret->byteLength+1); #else memcpy(ret->bytes,buff,ret->byteLength+1); #endif return ret; // /cleanup code for non-UTF-8 cases #if (RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE) || (RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE) cleanup: #if RF_OPTION_SOURCE_ENCODING == RF_UTF16_LE LOG_ERROR("Temporary RF_String creation from a UTF-16 Little Endian buffer failed due to UTF-16 decoding failure",RE_UTF16_INVALID_SEQUENCE); #elif RF_OPTION_SOURCE_ENCODING == RF_UTF16_BE LOG_ERROR("Temporary RF_String creation from a UTF-16 Big Endian buffer failed due to UTF-16 decoding failure",RE_UTF16_INVALID_SEQUENCE); #endif free(codepoints); return 0; #endif } // Initializes a string with the given characters. Given characters have to be in UTF-8. A check for valide sequence of bytes is performed.Can't be used with RF_StringX #ifndef RF_OPTION_DEFAULT_ARGUMENTS char rfString_Init(RF_String* str,const char* s,...) #else char i_rfString_Init(RF_String* str,const char* s,...) #endif { READ_VSNPRINTF_ARGS(s,s,false) // check for validity of the given sequence and get the character length uint32_t byteLength; if( rfUTF8_VerifySequence(buff,&byteLength) == RF_FAILURE) { LOG_ERROR("Error at String Initialization due to invalid UTF-8 byte sequence",RE_STRING_INIT_FAILURE); if(buffAllocated==true) free(buff); return false; } // get length str->byteLength = byteLength; // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(str->bytes,str->byteLength+1); memcpy(str->bytes,buff,str->byteLength+1); if(buffAllocated == true) free(buff); return true; } #ifdef RF_OPTION_DEFAULT_ARGUMENTS char i_NVrfString_Init(RF_String* str,const char* s) { // check for validity of the given sequence and get the character length uint32_t byteLength; if( rfUTF8_VerifySequence(s,&byteLength) == RF_FAILURE) { LOG_ERROR("Error at String Initialization due to invalid UTF-8 byte sequence",RE_STRING_INIT_FAILURE); return false; } // get length str->byteLength = byteLength; // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(str->bytes,str->byteLength+1); memcpy(str->bytes,s,str->byteLength+1); return true; } #endif // Allocates a String by turning a unicode code point in a String (encoded in UTF-8). RF_String* rfString_Create_cp(uint32_t codepoint) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); if(rfString_Init_cp(ret,codepoint) == true) { return ret; } // failure free(ret); return 0; } // Initializes a string by turning a unicode code point in a String (encoded in UTF-8). char rfString_Init_cp(RF_String* str, uint32_t codepoint) { // alloc enough for a character RF_MALLOC(str->bytes,5) // if we only need a byte to encode it if(RF_HEXLE_UI(codepoint,0x007f)) { str->bytes[0] = codepoint; str->bytes[1] = '\0'; str->byteLength = 1; } // if we need 2 bytes to encode it else if( RF_HEXGE_UI(codepoint,0x0080) && RF_HEXLE_UI(codepoint,0x07ff)) { // get the first bits of the first byte and encode them to the first byte str->bytes[1] = (codepoint & 0x3F)|(0x02<<6); // get the 5 following bits and encode them in the second byte str->bytes[0] = ((codepoint & 0x7C0) >> 6) | (0x6<<5); str->bytes[2] = '\0'; str->byteLength = 2; } // if we need 3 bytes to encode it else if( RF_HEXGE_UI(codepoint,0x0800) && RF_HEXLE_UI(codepoint,0x0ffff)) { // get the first bits of the first byte and encode them to the first byte str->bytes[2] = (codepoint & 0x3F)|(0x02<<6); // get the 6 following bits and encode them in the second byte str->bytes[1] = ((codepoint & 0xFC0) >> 6) | (0x02<<6); // get the 4 following bits and encode them in the third byte str->bytes[0] = (((codepoint & 0xF000))>>12) | (0xE<<4); str->bytes[3] = '\0'; str->byteLength = 3; } // if we need 4 bytes to encode it else if( RF_HEXGE_UI(codepoint,0x10000) && RF_HEXLE_UI(codepoint,0x10ffff)) { // get the first bits of the first byte and encode them to the first byte str->bytes[3] = (codepoint & 0x3F)|(0x02<<6); // get the 6 following bits and encode them in the second byte str->bytes[2] = ((codepoint & 0xFC0) >> 6) | (0x02<<6); // get the 6 following bits and encode them in the third byte str->bytes[1] = (((codepoint & 0x3F000))>>12) | (0x02<<6); // get the 3 following bits and encode them in the fourth byte str->bytes[0] = (((codepoint & 0x1C0000))>>18) | (0x1E<<3); str->bytes[4] = '\0'; str->byteLength = 4; } else { LOG_ERROR("Attempted to encode an invalid unicode code point into a string",RE_UTF8_INVALID_CODE_POINT); free(str->bytes); return false; } return true; } // Allocates and returns a string with the given integer RF_String* rfString_Create_i(int32_t i) { // the size of the int32_t buffer int32_t numLen; // put the int32_t into a buffer and turn it in a char* char buff[12];// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it sprintf(buff,"%d",i); numLen = strlen(buff); // initialize the string and return it RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); ret->byteLength = numLen; RF_MALLOC(ret->bytes,numLen+1); strcpy(ret->bytes,buff); return ret; } // Initializes a string with the given integer. char rfString_Init_i(RF_String* str, int32_t i) { // the size of the int32_t buffer int32_t numLen; // put the int32_t into a buffer and turn it in a char* char buff[12];// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it sprintf(buff,"%d",i); numLen = strlen(buff); str->byteLength = numLen; RF_MALLOC(str->bytes,numLen+1); strcpy(str->bytes,buff); return true; } // Allocates and returns a string with the given float RF_String* rfString_Create_f(float f) { // allocate a buffer for the float in characters char* buff; RF_MALLOC(buff,128); sprintf(buff,"%f",f); uint32_t len = strlen(buff); // initialize and return the string RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); ret->byteLength = len; RF_MALLOC(ret->bytes,len+1); strcpy(ret->bytes,buff); free(buff); return ret; } // Initializes a string with the given float char rfString_Init_f(RF_String* str,float f) { // allocate a buffer for the float in characters char* buff; RF_MALLOC(buff,128); sprintf(buff,"%f",f); uint32_t len = strlen(buff); str->byteLength = len; RF_MALLOC(str->bytes,len+1); strcpy(str->bytes,buff); free(buff); // success return true; } // Allocates and returns a string with the given UTF-16 byte sequence. Given characters have to be in UTF-16. A check for valid sequence of bytes is performed.Can't be used with RF_StringX RF_String* rfString_Create_UTF16(const char* s,char endianess) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); if(rfString_Init_UTF16(ret,s,endianess)==false) { free(ret); return 0; } return ret; } // Initializes a string with the given UTF-16 byte sequence. Given characters have to be in UTF-16. A check for valid sequence of bytes is performed.Can't be used with RF_StringX char rfString_Init_UTF16(RF_String* str,const char* s,char endianess) { // decode the utf-16 and get the code points uint32_t* codepoints; uint32_t byteLength,characterLength,utf8ByteLength; char* utf8; byteLength = 0; while(s[byteLength]!= 0 || s[byteLength+1]!=0) { byteLength++; } byteLength+=3;// for the last utf-16 null termination character RF_MALLOC(codepoints,byteLength*2) // allocate the codepoints // parse the given byte stream depending on the endianess parameter switch(endianess) { case RF_LITTLE_ENDIAN: case RF_BIG_ENDIAN: if(rfUTILS_Endianess() == endianess)// same endianess as the local { if(rfUTF16_Decode(s,&characterLength,codepoints) == false) { free(codepoints); LOG_ERROR("String initialization failed due to invalide UTF-16 sequence",RE_STRING_INIT_FAILURE); return false; } } else// different { if(rfUTF16_Decode_swap(s,&characterLength,codepoints) == false) { free(codepoints); LOG_ERROR("String initialization failed due to invalide UTF-16 sequence",RE_STRING_INIT_FAILURE); return false; } } break; default: LOG_ERROR("Illegal endianess value provided",RE_INPUT); free(codepoints); return false; break; }// switch ends // now encode these codepoints into UTF8 if( (utf8 = rfUTF8_Encode(codepoints,characterLength,&utf8ByteLength))==0) { free(codepoints); return false; } // success free(codepoints); str->bytes = utf8; str->byteLength = utf8ByteLength; return true; } // Allocates and returns a string with the given UTF-32 byte sequence. Given characters have to be in UTF-32. RF_String* rfString_Create_UTF32(const char* s) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); if(rfString_Init_UTF32(ret,s)==false) { free(ret); return 0; } return ret; } // Initializes a string with the given UTF-32 byte sequence. Given characters have to be in UTF-32. char rfString_Init_UTF32(RF_String* str,const char* s) { char swapE = false; uint32_t off = 0; int32_t i = 0; // get the buffer and if swapping is needed do it for all character uint32_t* codeBuffer = (uint32_t*)(s+off); // first of all check for existence of BOM in the beginning of the sequence if(RF_HEXEQ_UI(codeBuffer[0],0xFEFF))// big endian { if(rfUTILS_Endianess()==RF_LITTLE_ENDIAN) swapE = true; } if(RF_HEXEQ_UI(codeBuffer[0],0xFFFE0000))// little { if(rfUTILS_Endianess()==RF_BIG_ENDIAN) swapE = true; } else// according to the standard no BOM means big endian { if(rfUTILS_Endianess() == RF_LITTLE_ENDIAN) swapE = true; } // if we need to have endianess swapped do it if(swapE==true) { while(codeBuffer[i] != 0) { rfUTILS_SwapEndianUI(codeBuffer+i); i++; } } // find the length of the utf32 buffer in characters uint32_t length; rfUTF32_Length(codeBuffer,length); // turn the codepoints into a utf-8 encoded buffer char* utf8;uint32_t utf8ByteLength; if((utf8=rfUTF8_Encode(codeBuffer,length,&utf8ByteLength)) == 0) { return false;// error } // if the encoding happened correctly if(codeBuffer != 0) { str->bytes = (char*)codeBuffer; str->byteLength = utf8ByteLength; return true; } // else return failure return false; } // Assigns the value of the source string to the destination.Both strings should already be initialized and hold a value. It is an error to give null parameters. void i_rfString_Assign(RF_String* dest,void* sourceP) { RF_String* source = (RF_String*)sourceP; // only if the new string value won't fit in the buffer reallocate the buffer (let's avoid unecessary reallocs) if(source->byteLength > dest->byteLength) { RF_REALLOC(dest->bytes,char,source->byteLength+1); } // now copy the value memcpy(dest->bytes,source->bytes,source->byteLength+1); // and fix the lengths dest->byteLength = source->byteLength; } // Assigns the value of a unicode character to the string char rfString_Assign_char(RF_String* str,uint32_t codepoint) { // realloc if needed if(str->byteLength <5) { RF_REALLOC(str->bytes,char,5); } // if we only need a byte to encode it if(RF_HEXLE_UI(codepoint,0x007f)) { str->bytes[0] = codepoint; str->bytes[1] = '\0'; str->byteLength = 1; } // if we need 2 bytes to encode it else if( RF_HEXGE_UI(codepoint,0x0080) && RF_HEXLE_UI(codepoint,0x07ff)) { // get the first bits of the first byte and encode them to the first byte str->bytes[1] = (codepoint & 0x3F)|(0x02<<6); // get the 5 following bits and encode them in the second byte str->bytes[0] = ((codepoint & 0x7C0) >> 6) | (0x6<<5); str->bytes[2] = '\0'; str->byteLength = 2; } // if we need 3 bytes to encode it else if( RF_HEXGE_UI(codepoint,0x0800) && RF_HEXLE_UI(codepoint,0x0ffff)) { // get the first bits of the first byte and encode them to the first byte str->bytes[2] = (codepoint & 0x3F)|(0x02<<6); // get the 6 following bits and encode them in the second byte str->bytes[1] = ((codepoint & 0xFC0) >> 6) | (0x02<<6); // get the 4 following bits and encode them in the third byte str->bytes[0] = (((codepoint & 0xF000))>>12) | (0xE<<4); str->bytes[3] = '\0'; str->byteLength = 3; } // if we need 4 bytes to encode it else if( RF_HEXGE_UI(codepoint,0x10000) && RF_HEXLE_UI(codepoint,0x10ffff)) { // get the first bits of the first byte and encode them to the first byte str->bytes[3] = (codepoint & 0x3F)|(0x02<<6); // get the 6 following bits and encode them in the second byte str->bytes[2] = ((codepoint & 0xFC0) >> 6) | (0x02<<6); // get the 6 following bits and encode them in the third byte str->bytes[1] = (((codepoint & 0x3F000))>>12) | (0x02<<6); // get the 3 following bits and encode them in the fourth byte str->bytes[0] = (((codepoint & 0x1C0000))>>18) | (0x1E<<3); str->bytes[4] = '\0'; str->byteLength = 4; } else { LOG_ERROR("Attempted to encode an invalid unicode code point into a string",RE_UTF8_INVALID_CODE_POINT); return false; } return true; } // Allocates and returns a string with the given characters. NO VALID-UTF8 check is performed #ifndef RF_OPTION_DEFAULT_ARGUMENTS RF_String* rfString_Create_nc(const char* s,...) #else RF_String* i_rfString_Create_nc(const char* s,...) #endif { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); // get the formatted string READ_VSNPRINTF_ARGS(s,s,0); // get the lengt of the byte buffer ret->byteLength = bytesWritten; // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(ret->bytes,ret->byteLength+1); memcpy(ret->bytes,buff,ret->byteLength+1); if(buffAllocated) free(buff); return ret; } #ifdef RF_OPTION_DEFAULT_ARGUMENTS RF_String* i_NVrfString_Create_nc(const char* s) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); // get length ret->byteLength = strlen(s); // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(ret->bytes,ret->byteLength+1); memcpy(ret->bytes,s,ret->byteLength+1); return ret; } #endif // Initializes a string with the given characters. NO VALID-UTF8 check is performed #ifndef RF_OPTION_DEFAULT_ARGUMENTS char rfString_Init_nc(struct RF_String* str,const char* s,...) #else char i_rfString_Init_nc(struct RF_String* str,const char* s,...) #endif { // get the formatted string READ_VSNPRINTF_ARGS(s,s,false) // get its length str->byteLength = bytesWritten; // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(str->bytes,str->byteLength+1); memcpy(str->bytes,buff,str->byteLength+1); if(buffAllocated == true) free(buff); return true; } #ifdef RF_OPTION_DEFAULT_ARGUMENTS char i_NVrfString_Init_nc(struct RF_String* str,const char* s) { // get its length str->byteLength = strlen(s); // now that we know the length we can allocate the buffer and copy the bytes RF_MALLOC(str->bytes,str->byteLength+1); memcpy(str->bytes,s,str->byteLength+1); return true; } #endif /*-------------------------------------------------------------------------Methods to get rid of an RF_String-------------------------------------------------------------------------------*/ // Deletes a string object and also frees its pointer.It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault void rfString_Destroy(RF_String* s) { free(s->bytes); free(s); } // Deletes a string object only, not its memory.It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault void rfString_Deinit(RF_String* s) { free(s->bytes); } /*------------------------------------------------------------------------ RF_String unicode conversio functions-------------------------------------------------------------------------------*/ // Returns the strings contents as a UTF-16 buffer uint16_t* rfString_ToUTF16(RF_String* s,uint32_t* length) { uint32_t* codepoints,charsN; // get the unicode codepoints, no check here since RF_String is always guaranteed to have valid UTF=8 and as such valid codepoints codepoints = rfUTF8_Decode(s->bytes,s->byteLength,&charsN); // encode them in UTF-16, no check here since it comes from an RF_String which is always guaranteed to have valid UTF-8 and as such valid codepoints return rfUTF16_Encode(codepoints,charsN,length); } // Returns the strings contents as a UTF-32 buffer uint32_t* rfString_ToUTF32(RF_String* s,uint32_t* length) { // get the unicode codepoints, no check here since RF_String is always guaranteed to have valid UTF=8 and as such valid codepoints return rfUTF8_Decode(s->bytes,s->byteLength,length); } /*------------------------------------------------------------------------ RF_String retrieval functions-------------------------------------------------------------------------------*/ // Finds the length of the string in characters uint32_t rfString_Length(void* str) { RF_String* s = (RF_String*)str; uint32_t length,i; RF_STRING_ITERATE_START(s,length,i) RF_STRING_ITERATE_END(length,i); return length; } // Retrieves the unicode code point of the parameter character. uint32_t rfString_GetChar(void* str,uint32_t c) { RF_String* thisstr = (RF_String*)str; uint32_t length,i; uint32_t codePoint = RF_STRING_INDEX_OUT_OF_BOUNDS; RF_STRING_ITERATE_START(thisstr,length,i) // if we found the character,inspect the 4 different cases if(length == c) { // take the codepoint from the byte position and break from the loop codePoint = rfString_BytePosToCodePoint(thisstr,i); break; } RF_STRING_ITERATE_END(length,i) // and return the code point. Notice that if the character was not found this will return RF_STRING_INDEX_OUT_OF_BOUNDS return codePoint; } // Retrieves the unicode code point of the parameter bytepos of the string. If the byte position is not the start of a character 0 is returned. This is an internal function, there is no need to use it. Can be used with StringX uint32_t rfString_BytePosToCodePoint(void* str,uint32_t i) { uint32_t codePoint=0; RF_String* thisstr = (RF_String*)str; // /Here I am not checking if byte position 'i' is withing bounds and especially if it is a start of a character // / This is assumed to have been checked or to be known beforehand by the programmer. That's one of the reasons // / why this is an internal function and should not be used unless you know what you are doing // if the lead bit of the byte is 0 then range is : U+0000 to U+0007F (1 byte) if( ((thisstr->bytes[i] & 0x80)>>7) == 0 ) { // and the code point is this whole byte only codePoint = thisstr->bytes[i]; } // if the leading bits are in the form of 0b110xxxxx then range is: U+0080 to U+07FF (2 bytes) else if ( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xC0))>>5),0x7) ) { codePoint =0; // from the second byte take the first 6 bits codePoint = (thisstr->bytes[i+1] & 0x3F) ; // from the first byte take the first 5 bits and put them in the start codePoint |= ((thisstr->bytes[i] & 0x1F) << 6); } // if the leading bits are in the form of 0b1110xxxx then range is U+0800 to U+FFFF (3 bytes) else if( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xE0))>>4),0xF) ) { codePoint = 0; // from the third byte take the first 6 bits codePoint = (thisstr->bytes[i+2] & 0x3F) ; // from the second byte take the first 6 bits and put them to the left of the previous 6 bits codePoint |= ((thisstr->bytes[i+1] & 0x3F) << 6); // from the first byte take the first 4 bits and put them to the left of the previous 6 bits codePoint |= ((thisstr->bytes[i] & 0xF) << 12); } // if the leading bits are in the form of 0b11110xxx then range is U+010000 to U+10FFFF (4 bytes) else if( RF_HEXEQ_C( ( (~(thisstr->bytes[i] ^ 0xF0))>>3), 0x1F)) { codePoint = 0; // from the fourth byte take the first 6 bits codePoint = (thisstr->bytes[i+3] & 0x3F) ; // from the third byte take the first 6 bits and put them to the left of the previous 6 bits codePoint |= ((thisstr->bytes[i+2] & 0x3F) << 6); // from the second byte take the first 6 bits and put them to the left of the previous 6 bits codePoint |= ((thisstr->bytes[i+1] & 0x3F) << 12); // from the first byte take the first 3 bits and put them to the left of the previous 6 bits codePoint |= ((thisstr->bytes[i] & 0x7) << 18); } return codePoint; } // Retrieves character position of a byte position uint32_t rfString_BytePosToCharPos(void* thisstrP,uint32_t bytepos,char before) { // /here there is no check if this is actually a byte pos inside the string's // /byte buffer. The programmer should have made sure it is before hand. This is why it is // / an internal function and should only be used if you know what you are doing RF_String* thisstr = (RF_String*)thisstrP; uint32_t charPos = 0; uint32_t byteI = 0; // iterate the string's bytes until you get to the required byte // if it is not a continuation byte, return the position if(rfUTF8_IsContinuationByte(thisstr->bytes[bytepos])==false) { RF_STRING_ITERATE_START(thisstr,charPos,byteI) if(byteI == bytepos) return charPos; RF_STRING_ITERATE_END(charPos,byteI) } // else iterate the string's bytes until you get anything bigger than the required byte RF_STRING_ITERATE_START(thisstr,charPos,byteI) if(byteI > bytepos) break; RF_STRING_ITERATE_END(charPos,byteI) // if we need the previous one return it if(before == true) return charPos-1; // else return this return charPos; } // Compares two Strings and returns true if they are equal and false otherwise char i_rfString_Equal(void* s1P,void* s2P) { RF_String* s1 = (RF_String*)s1P; RF_String* s2 = (RF_String*)s2P; if( strcmp(s1->bytes,s2->bytes)==0) { return true; } return false; } // Finds the existence of String sstr inside this string, either matching case or not int32_t i_rfString_Find(const void* str,const void* sstrP,const char* optionsP) { // / @note TO SELF: If I make any changes to this function do not forget to change the private version that returns byte position too // / located at string_private.c and called rfString_FindByte and rfString_FindByte_s RF_String* thisstr = (RF_String*)str; RF_String* sstr = (RF_String*)sstrP; char options = *optionsP; char* found = 0; // if we want to match the case of the string then it's a simple search of matching characters if( (RF_BITFLAG_ON( options,RF_CASE_IGNORE)) == false) { // if it is not found if( (found = strstr(thisstr->bytes,sstr->bytes)) == 0) { return RF_FAILURE; } // get the byte position uint32_t bytepos = found-thisstr->bytes; // if we need the exact string as it is given if(RF_BITFLAG_ON( options,RF_MATCH_WORD)) { // check before the found string if(bytepos != 0) { // if is is not a character switch(thisstr->bytes[bytepos-1]) { case ' ':case '\t':case '\n': break; default: return RF_FAILURE; break; } } // check after the found string if(bytepos+sstr->byteLength != thisstr->byteLength) { // if is is not a character switch(thisstr->bytes[bytepos+sstr->byteLength]) { case ' ':case '\t':case '\n': break; default: return RF_FAILURE; break; } } }// end of the exact string option // success return rfString_BytePosToCharPos(thisstr,bytepos,false); } // else ignore case matching uint32_t i,j; // if(cstr[0] >= 0x41 && cstr[0] <= 0x5a) for(i=0;ibyteLength; i ++) { // if i matches the start of the substring for(j = 0; j < sstr->byteLength; j++) { // if the jth char is a big letter if(sstr->bytes[j] >= 0x41 && sstr->bytes[j] <= 0x5a) { // no match if(sstr->bytes[j] != thisstr->bytes[i+j] && sstr->bytes[j]+32 != thisstr->bytes[i+j]) break; // there is a match in the jth character so let's perform additional checks if needed if(RF_BITFLAG_ON( options,RF_MATCH_WORD)) { // if it's the first substring character and if the string we search is not in it's beginning, check for EXACT string before if(j == 0 && i != 0) { switch(thisstr->bytes[i-1]) { case ' ':case '\t':case '\n': break; default: return RF_FAILURE; break; } } }// exact string check if ends } // small letter else if(sstr->bytes[j] >= 0x61 && sstr->bytes[j] <= 0x7a) { // no match if(sstr->bytes[j] != thisstr->bytes[i+j] && sstr->bytes[j]-32 != thisstr->bytes[i+j]) break; // there is a match in the jth character so let's perform additional checks if needed if(RF_BITFLAG_ON(options,RF_MATCH_WORD)) { // if it's the first substring character and if the string we search is not in it's beginning, check for EXACT string before if(j == 0 && i != 0) { switch(thisstr->bytes[i-1]) { case ' ':case '\t':case '\n': break; default: return RF_FAILURE; break; } } }// exact string check if ends } // not a letter and no match else if(sstr->bytes[j] != thisstr->bytes[i+j]) break;// break off the substring search loop // if we get here and it's the last char of the substring we either found it or need to perform one last check for exact string if(j == sstr->byteLength-1) { // only if the end of the string is not right after the substring if( RF_BITFLAG_ON(options,RF_MATCH_WORD) && i+sstr->byteLength < thisstr->byteLength) { switch(thisstr->bytes[i+sstr->byteLength]) { case ' ':case '\t':case '\n': break; default: return RF_FAILURE; break; } }// end of the exact string check // succes return rfString_BytePosToCharPos(thisstr,i,false); }// end of it's the last char of the substring check }// substring iteration ends }// this string iteration ends return RF_FAILURE; } // Returns the integer value of the string if and only if it contains only numbers. If it contains anything else the function fails. char rfString_ToInt(void* str,int32_t* v) { RF_String* thisstr = (RF_String*)str; char* end; // get the integer *v = strtol ( thisstr->bytes, &end,10); // /This is the non-strict case. Takes the number out of the string no matter what else it has inside /* // if we did get something if(strlen(end) < this->length()) return true; */ // /This is the strict case, and the one we will go with. The non-strict case might be moved to its own function, if ever in the future if(end[0] == '\0') return true; // else false return false; } // Returns the float value of a String int rfString_ToDouble(void* thisstrP,double* f) { RF_String* str = (RF_String*)thisstrP; *f = strtod(str->bytes,NULL); // check the result if(*f == 0.0) { // if it's zero and the string equals to zero then we are okay if(rfString_Equal(str,RFS_("0")) || rfString_Equal(str,RFS_("0.0"))) return RF_SUCCESS; // underflow error if(errno == ERANGE) return RE_STRING_TOFLOAT_UNDERFLOW; // in any other case it's a conversion error return RE_STRING_TOFLOAT; } // if the result is a HUGE_VAL and errno is set,the number is not representable by a double if(*f == HUGE_VAL && errno == ERANGE) return RE_STRING_TOFLOAT_RANGE; // any other case success return RF_SUCCESS; } // Returns a cstring version of the string. const char* rfString_ToCstr(const void* str) { RF_String* thisstr = (RF_String*)str; return thisstr->bytes; } // Creates and returns an allocated copy of the given string RF_String* rfString_Copy_OUT(void* srcP) { RF_String* src = (RF_String*)srcP; // create the new string RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); // get the length ret->byteLength = src->byteLength; // copy the bytes RF_MALLOC(ret->bytes,ret->byteLength+1); memcpy(ret->bytes,src->bytes,ret->byteLength+1); return ret; } // Copies all the contents of a string to another void rfString_Copy_IN(RF_String* dst,void* srcP) { RF_String* src = (RF_String*)srcP; // get the length dst->byteLength = src->byteLength; // copy the bytes RF_MALLOC(dst->bytes,src->byteLength+1); memcpy(dst->bytes,src->bytes,dst->byteLength+1); return; } // Copies a certain number of characters from a string void rfString_Copy_chars(RF_String* dst,void* srcP,uint32_t charsN) { uint32_t i = 0,bytePos; RF_String* src = (RF_String*)srcP; // find the byte position until which we need to copy RF_STRING_ITERATE_START(src,i,bytePos) if(i == charsN) break; RF_STRING_ITERATE_END(i,bytePos) dst->byteLength = bytePos; RF_MALLOC(dst->bytes,dst->byteLength+1); memcpy(dst->bytes,src->bytes,dst->byteLength+1); dst->bytes[dst->byteLength] = '\0';// null terminate it } // Applies a limited version of sscanf after the specified substring char i_rfString_ScanfAfter(void* str,void* afterstrP,const char* format,void* var) { RF_String* thisstr = (RF_String*)str; RF_String* afterstr = (RF_String*)afterstrP; // return false if the substring is not found char* found,*s; if( (found = strstr(thisstr->bytes,afterstr->bytes)) ==0 ) { return false; } // get a pointer to the start of the position where sscanf will be used s = thisstr->bytes + (found-thisstr->bytes+afterstr->byteLength); // use sscanf if(sscanf(s,format,var) <=0) { return false; } return true; } // Counts how many times a substring s occurs inside the string int32_t i_rfString_Count(void* str,void* sstr2,const char* optionsP) { RF_String* thisstr = (RF_String*)str; RF_String* sstr = (RF_String*)sstr2; char options = *optionsP; int32_t index = 0; int32_t move; int32_t n = 0; // as long as the substring is found in the string while ((move = rfString_FindBytePos(thisstr,sstr,options)) != RF_FAILURE) { move+= sstr->byteLength; // proceed searching inside the string and also increase the counter n++; thisstr->bytes+=move; index +=move; thisstr->byteLength -=move; } // return string to its original state and return the number of occurences, also returns 0 if not found thisstr->bytes-=index; thisstr->byteLength += index; // success return n; } // Tokenizes the given string. Separates it into @c tokensN depending on how many substrings can be created from the @c sep separatior and stores them // into the Array of RF_String* that should be passed to the function i_DECLIMEX_ char rfString_Tokenize(void* str,char* sep,uint32_t* tokensN,RF_String** tokens) { RF_String* thisstr = (RF_String*)str; uint32_t i; // first find the occurences of the separator, and then the number of tokens *tokensN = rfString_Count(thisstr,RFS_(sep),0)+1; // error checking if(*tokensN == 0) return false; // allocate the tokens RF_MALLOC(*tokens,sizeof(RF_String) *(*tokensN)); // find the length of the separator uint32_t sepLen = strlen(sep); char* s,*e; s = thisstr->bytes; for(i = 0; i < (*tokensN)-1; i ++) { // find each substring e = strstr(s,sep); (*tokens)[i].byteLength = e-s; RF_MALLOC((*tokens)[i].bytes,(*tokens)[i].byteLength+1); // put in the data strncpy((*tokens)[i].bytes,s,(*tokens)[i].byteLength); // null terminate (*tokens)[i].bytes[(*tokens)[i].byteLength] = '\0'; // prepare for next sub-string s = e+sepLen; } // /make sure that if it's the last substring we change strategy (*tokens)[i].byteLength = strlen(s); RF_MALLOC((*tokens)[i].bytes,(*tokens)[i].byteLength+1); // put in the data strncpy((*tokens)[i].bytes,s,(*tokens)[i].byteLength); // null terminate (*tokens)[i].bytes[(*tokens)[i].byteLength] = '\0'; // success return true; } // Initializes the given string as the first substring existing between the left and right parameter substrings. char i_rfString_Between(void* thisstrP,void* lstrP,void* rstrP,RF_String* result,const char* optionsP) { int32_t start,end; RF_String* thisstr = (RF_String*)thisstrP; RF_String* lstr = (RF_String*)lstrP; RF_String* rstr = (RF_String*)rstrP; char options = *optionsP; RF_String temp; // find the left substring if( (start = rfString_FindBytePos(thisstr,lstr,options))== RF_FAILURE) { return false; } // get what is after it rfString_After(thisstr,lstr,&temp,options); // find the right substring in the remaining part if( (end = rfString_FindBytePos(&temp,rstr,options))== RF_FAILURE) { return false; } // free temp string rfString_Deinit(&temp); // initialize the string to return result->byteLength = end; RF_MALLOC(result->bytes,result->byteLength+1); memcpy(result->bytes,thisstr->bytes+start+lstr->byteLength,result->byteLength+1); result->bytes[end]= '\0'; // success return true; } // Initializes the given string as the substring from the start until any of the given Strings are found. #ifndef RF_OPTION_DEFAULT_ARGUMENTS char rfString_Beforev(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP, ...) #else char i_rfString_Beforev(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP, ...) #endif { RF_String* thisstr = (RF_String*)thisstrP; RF_String* s; char options = *optionsP; unsigned char parN = *parNP; int32_t i,minPos,thisPos; // will keep the argument list va_list argList; // get the parameter characters va_start(argList,parNP); minPos = 9999999; for(i = 0; i < parN; i++) { s = (RF_String*) va_arg(argList,RF_String*); if( (thisPos= rfString_FindBytePos(thisstr,s,options))!= RF_FAILURE) { if(thisPos < minPos) minPos = thisPos; } } va_end(argList); // if it is not found if(minPos == 9999999) { return false; } // if it is found initialize the substring result->byteLength = minPos; RF_MALLOC(result->bytes,minPos+1); memcpy(result->bytes,thisstr->bytes,minPos); result->bytes[minPos] = '\0'; // success return true; } // Initializes the given string as the substring from the start until the given string is found char i_rfString_Before(void* thisstrP,void* sstrP,RF_String* result,const char* optionsP) { RF_String* thisstr = (RF_String*)thisstrP; RF_String* sstr = (RF_String*) sstrP; char options = *optionsP; int32_t ret; // find the substring if( (ret = rfString_FindBytePos(thisstr,sstr,options)) == RF_FAILURE) { return false; } // if it is found get the result initialize the substring result->byteLength = ret; RF_MALLOC(result->bytes,result->byteLength+1); memcpy(result->bytes,thisstr->bytes,result->byteLength); result->bytes[result->byteLength] = '\0'; // success return true; } // Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false. char i_rfString_After(void* thisstrP,void* afterP,RF_String* out,const char* optionsP) { RF_String* thisstr = (RF_String*)thisstrP; RF_String* after = (RF_String*)afterP; char options = *optionsP; int32_t bytePos; // check for substring existence if( (bytePos = rfString_FindBytePos(thisstr,after,options)) == RF_FAILURE) { return false; } // done so let's get it. Notice the use of the non-checking initialization rfString_Init_nc(out,thisstr->bytes+bytePos+after->byteLength); // success return true; } // Initialize a string after the first of the given substrings found #ifndef RF_OPTION_DEFAULT_ARGUMENTS char rfString_Afterv(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP,...) #else char i_rfString_Afterv(void* thisstrP,RF_String* result,const char* optionsP,const unsigned char* parNP,...) #endif { RF_String* thisstr = (RF_String*)thisstrP; RF_String* s; char options = *optionsP; unsigned char parN = *parNP; int32_t i,minPos,thisPos; uint32_t minPosLength; // will keep the argument list va_list argList; // get the parameter characters va_start(argList,parNP); minPos = 9999999; for(i = 0; i < parN; i++) { s = (RF_String*) va_arg(argList,RF_String*); if( (thisPos= rfString_FindBytePos(thisstr,s,options))!= RF_FAILURE) { if(thisPos < minPos) { minPos = thisPos; minPosLength = s->byteLength; } } } va_end(argList); // if it is not found if(minPos == 9999999) { return false; } // if it is found initialize the substring minPos += minPosLength;// go after the found substring result->byteLength = thisstr->byteLength-minPos; RF_MALLOC(result->bytes,result->byteLength); memcpy(result->bytes,thisstr->bytes+minPos,result->byteLength); result->bytes[result->byteLength] = '\0'; // success return true; } /*------------------------------------------------------------------------ RF_String manipulation functions-------------------------------------------------------------------------------*/ // Appends the parameter String to this one void i_rfString_Append(RF_String* thisstr,void* otherP) { RF_String* other = (RF_String*)otherP; // /@note Here if a null addition is given lots of actions are done but the result is safe and the same string as the one entered. // /A check here would result in an additional check for every appending so I decided against it // calculate the new length thisstr->byteLength +=other->byteLength; // reallocate this string to fit the new addition RF_REALLOC(thisstr->bytes,char,thisstr->byteLength+1); // add the string to this one strncat(thisstr->bytes,other->bytes,other->byteLength); } // Appends an integer to the string void rfString_Append_i(RF_String* thisstr,const int32_t i) { // create a new buffer for the string big enough to fit any number plus the original string char* buff; RF_MALLOC(buff,thisstr->byteLength+15);// max uint32_t is 4,294,967,295 in most environment so 12 chars will certainly fit it // put the int32_t inside the string sprintf(buff,"%s%i",thisstr->bytes,i); // free the previous c string free(thisstr->bytes); // point the string pointer to the new string thisstr->bytes = buff; thisstr->byteLength = strlen(thisstr->bytes); } // Appends a float to the string. Can't be used with RF_StringX void rfString_Append_f(RF_String* thisstr,const float f) { // a temporary buffer to hold the float and the string char* buff; RF_MALLOC(buff,thisstr->byteLength+64); // put the float inside the string sprintf(buff,"%s%f",thisstr->bytes,f); // free the previous c string free(thisstr->bytes); // point the string pointer to the new string thisstr->bytes = buff; thisstr->byteLength = strlen(thisstr->bytes); } // Prepends the parameter String to this string void i_rfString_Prepend(RF_String* thisstr,void* otherP) { RF_String* other = (RF_String*)otherP; uint32_t size; int32_t i;// is not unsigned since it goes to -1 in the loop // keeep the original byte size of the string size = thisstr->byteLength; // calculate the new lengths thisstr->byteLength += other->byteLength; // reallocate this string to fit the new addition RF_REALLOC(thisstr->bytes,char,thisstr->byteLength+1); // move the pre-existing string to the end of the buffer, by dislocating each byte by cstrlen for(i =size; i >=0 ; i--) thisstr->bytes[i+other->byteLength] = thisstr->bytes[i]; // and now add the new string to the start memcpy(thisstr->bytes,other->bytes,other->byteLength); } // Removes all of the specifed string occurences from this String matching case or not, DOES NOT reallocate buffer size. char i_rfString_Remove(void* thisstrP,void* rstrP,uint32_t* numberP,const char* optionsP) { RF_String* thisstr = (RF_String*)thisstrP; RF_String* rstr = (RF_String*)rstrP; char options = *optionsP; uint32_t number = *numberP; uint32_t i,count,occurences=0; int32_t bytePos; char found = false; // as long as we keep finding rstr in the string keep removing it do { // if the substring is not found if( (bytePos = rfString_FindBytePos(thisstr,rstr,options)) == RF_FAILURE) { // if we have not even found it once , we fail if(found == false) { return false; } else // else we are done break; } // substring found found = true; // move all of the string a position back count = 0; for(i = bytePos; i <=thisstr->byteLength; i ++) { thisstr->bytes[i] = thisstr->bytes[i+rstr->byteLength]; count++; } // now change the byte length thisstr->byteLength -= rstr->byteLength; // count the number of occurences and if we reached the required amount, stop occurences++; if(occurences == number) break; }while(bytePos != RF_FAILURE); // succcess return true; } // Removes all of the characters of the string except those specified void i_rfString_KeepOnly(void* thisstrP,void* keepstrP) { uint32_t keepLength,i,j,charValue,temp; uint32_t *keepChars; RF_String* thisstr = (RF_String*)thisstrP; RF_String* keepstr = (RF_String*)keepstrP; char exists,charBLength; // first let's get all of the characters of the keep string in an array i=0; keepLength = rfString_Length(keepstr); RF_MALLOC(keepChars,4*keepLength); rfString_Iterate_Start(keepstr,i,charValue) keepChars[i] = charValue; rfString_Iterate_End(i) // now iterate every character of this string i=0; rfString_Iterate_Start(thisstr,i,charValue) // for every character check if it exists in the keep str exists = false; for(j=0;jbytes+byteIndex_,thisstr->bytes+byteIndex_+charBLength,thisstr->byteLength-byteIndex_+charBLength); thisstr->byteLength-=charBLength; continue;// by contiuing here we make sure that the current string position won't be moved to assure that we also check the newly move characters } rfString_Iterate_End(i) // before returning free the keep string's character array free(keepChars); } // Removes the first n characters from the start of the string char rfString_PruneStart(void* thisstrP,uint32_t n) { RF_String* thisstr = (RF_String*)thisstrP; // iterate the characters of the string uint32_t i; uint32_t length = 0; unsigned nBytePos = 0; char found = false; RF_STRING_ITERATE_START(thisstr,length,i); // if we reach the number of characters passed as a parameter, note it if(length == n) { // remember that now i is the byte position we need nBytePos = i; found = true; break; } RF_STRING_ITERATE_END(length,i) // if the string does not have n chars to remove it becomes an empty string and we return failure if(found == false) { thisstr->bytes[0] = '\0'; thisstr->byteLength = 0; return false; } // move the string back to cover the empty places.reallocation here would be an overkill, everything will be freed together when the string gets freed for(i =0; i < thisstr->byteLength-nBytePos+1;i++ ) thisstr->bytes[i] = thisstr->bytes[i+nBytePos]; // get the new bytelength thisstr->byteLength -= nBytePos; return true; } // Removes the last n characters from the end of the string char rfString_PruneEnd(void* thisstrP,uint32_t n) { RF_String* thisstr = (RF_String*)thisstrP; // start the iteration of the characters from the end of the string int32_t nBytePos = -1; uint32_t length,i; RF_STRING_ITERATEB_START(thisstr,length,i) // if we found the requested number of characters from the end of the string if(length == n) { // remember that now i is the byte position we need nBytePos = i; break; } RF_STRING_ITERATEB_END(length,i) // if the string does not have n chars to remove it becomes an empty string and we return failure if(nBytePos == -1) { thisstr->bytes[0] = '\0'; return false; } // just set the end of string character characters back, reallocation here would be an overkill, everything will be freed together when the string gets freed thisstr->bytes[nBytePos] = '\0'; // and also set the new byte length thisstr->byteLength -= (thisstr->byteLength - nBytePos); // success return true; } // Removes n characters from the position p of the string counting backwards. If there is no space to do so, nothing is done and returns false. char rfString_PruneMiddleB(void* thisstrP,uint32_t p,uint32_t n) { RF_String* thisstr = (RF_String*)thisstrP; // if we ask to remove more characters from the position that it would be possible do nothign and return false if(n>p+1) return false; // iterate the characters of the string uint32_t j,i,length; int32_t pBytePos,nBytePos; pBytePos = nBytePos = -1; RF_STRING_ITERATE_START(thisstr,length,i) // if we reach the number of characters passed as a parameter, note it if(length == p+1) { // we search for p+1 because we want to include all of the p character pBytePos = i; // also break since we don't care after position p break; } if(length == p-n+1)// +1 is to make sure that indexing works from 0 nBytePos = i; RF_STRING_ITERATE_END(length,i) // if the position was not found in the string do nothing if(pBytePos == -1 || nBytePos == -1) return false; // move the bytes in the buffer to remove the requested characters for(i=nBytePos,j=0;j<= thisstr->byteLength-pBytePos+1; i ++,j++) // here +2 is for (+1 for pbytePos to go to the start of pth character) (+1 for the byteLength to include the null termination character) { thisstr->bytes[i] = thisstr->bytes[pBytePos+j]; } // find the new byte length thisstr->byteLength -= (nBytePos - pBytePos); return true; } // Removes n characters from the position p of the string counting forwards. If there is no space, nothing is done and returns false. char rfString_PruneMiddleF(void* thisstrP,uint32_t p,uint32_t n) { RF_String* thisstr = (RF_String*)thisstrP; // iterate the characters of the string uint32_t j,i,length; int32_t pBytePos,nBytePos; pBytePos = nBytePos = -1; RF_STRING_ITERATE_START(thisstr,length,i) // if we reach the number of characters passed as a parameter, note it if(length == p) pBytePos = i; if(length == p+n) { nBytePos = i; break;// since we got all the data we needed } RF_STRING_ITERATE_END(length,i) // if the position was not found in the string do nothing if(pBytePos == -1 ) return false; // if we did not find the byte position of p+n then we remove everything from pBytePos until the end of the string if(nBytePos == -1) { thisstr->bytes[pBytePos] = '\0'; thisstr->byteLength -= (thisstr->byteLength-pBytePos); return true; } // move the bytes in the buffer to remove the requested characters for(i=pBytePos,j=0;j<= thisstr->byteLength-nBytePos+1; i ++,j++) // here +2 is for (+1 for pbytePos to go to the start of pth character) (+1 for the byteLength to include the null termination character) { thisstr->bytes[i] = thisstr->bytes[nBytePos+j]; } // find the new byte length thisstr->byteLength -= (nBytePos - pBytePos); return true; } // Replaces all of the specified sstr substring from the String with rstr and reallocates size, unless the new size is smaller char i_rfString_Replace(RF_String* thisstr,void* sstrP,void* rstrP,const uint32_t* numP,const char* optionsP) { RF_String* sstr = (RF_String*)sstrP; RF_String* rstr = (RF_String*)rstrP; char options = *optionsP; uint32_t num = *numP; RF_StringX temp;// just a temporary string for finding the occurences // will keep the number of found instances of the substring uint32_t foundN = 0; // will keep the number of given instances to find uint32_t number = num; uint32_t diff,i,j; // if the substring string is not even found return false if(rfString_FindBytePos(thisstr,sstr,options) == RF_FAILURE) { return false; } // create a buffer that will keep the byte positions uint32_t bSize = 50; int32_t * bytePositions; RF_MALLOC(bytePositions,bSize*sizeof(int32_t)); // if the given num is 0 just make sure we replace all if(number == 0) number = 999999;// max number of occurences // find how many occurences exist rfStringX_FromString_IN(&temp,thisstr); while( (bytePositions[foundN] = rfString_FindBytePos(&temp,sstr,options)) != RF_FAILURE) { int32_t move = bytePositions[foundN] + sstr->byteLength; bytePositions[foundN] = bytePositions[foundN]+temp.bIndex; temp.bIndex += move; temp.bytes += move; temp.byteLength -= move; foundN++; // if buffer is in danger of overflow realloc it if(foundN > bSize) { bSize *=2; RF_REALLOC(bytePositions,int32_t,bSize); } // if we found the required number of occurences break; if(foundN >= number) break; } rfStringX_Deinit(&temp); // make sure that the number of occurence to replace do not exceed the actual number of occurences if(number > foundN) number = foundN; // act depending on the size difference of rstr and sstr if(rstr->byteLength > sstr->byteLength) // replace string is bigger than the removed one { int32_t orSize,nSize; diff = rstr->byteLength - sstr->byteLength; // will keep the original size in bytes orSize = thisstr->byteLength +1; // reallocate the string to fit the new bigger size nSize= orSize + number*diff; RF_REALLOC(thisstr->bytes,char,nSize) // now replace all the substrings one by one for(i = 0; i < number; i ++) { // move all of the contents of the string to fit the replacement for(j =orSize+diff-1; j > bytePositions[i]+sstr->byteLength; j -- ) thisstr->bytes[j] = thisstr->bytes[j-diff]; // copy in the replacement strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength); // also increase the original size (since now we moved the whole string by one replacement) orSize += diff; // also increase all the subsequent found byte positions since there is a change of string size for(j = i+1; j < number; j ++) bytePositions[j] = bytePositions[j]+diff; } // finally let's keep the new byte length thisstr->byteLength = nSize-1; } else if( rstr->byteLength < sstr->byteLength) // replace string is smaller than the removed one { // get the differenc in byte length of removed substring and replace string diff = sstr->byteLength-rstr->byteLength; // now replace all the substrings one by one for(i =0; i < number; i ++) { // copy in the replacement strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength); // move all of the contents of the string to fit the replacement for(j =bytePositions[i]+rstr->byteLength; j < thisstr->byteLength; j ++ ) thisstr->bytes[j] = thisstr->bytes[j+diff]; // also decrease all the subsequent found byte positions since there is a change of string size for(j = i+1; j < number; j ++) bytePositions[j] = bytePositions[j]-diff; } // finally let's keep the new byte length thisstr->byteLength -= diff*number; // just note that reallocating downwards is not necessary } else // replace and remove strings are equal { for(i = 0; i < number; i ++) strncpy(thisstr->bytes+bytePositions[i],rstr->bytes,rstr->byteLength); } free(bytePositions); // success return true; } // Removes all characters of a substring only from the start of the String char i_rfString_StripStart(void* thisstrP,void* subP) { RF_String* thisstr = (RF_String*) thisstrP; RF_String*sub = (RF_String*) subP; char ret = false,noMatch; uint32_t charValue,i = 0,*subValues,j,subLength,bytePos; // firstly get all of the characters of the substring in an array subLength = rfString_Length(sub); RF_MALLOC(subValues,4*subLength) rfString_Iterate_Start(sub,i,charValue) subValues[i] = charValue; rfString_Iterate_End(i) // iterate thisstring from the beginning i = 0; RF_STRING_ITERATE_START(thisstr,i,bytePos) noMatch = true; // for every substring character for(j = 0;j < subLength; j++) { // if we got a match if(rfString_BytePosToCodePoint(thisstr,bytePos) == subValues[j]) { ret = true; noMatch = false; break; } } // if we get out of iterating the substring without having found a match, we get out of the iteration in general if(noMatch) break; RF_STRING_ITERATE_END(i,bytePos) // if we had any match if(ret == true) { // remove the characters for(i =0; i < thisstr->byteLength-bytePos+1;i++ ) thisstr->bytes[i] = thisstr->bytes[i+bytePos]; // also change bytelength thisstr->byteLength -= bytePos; } // free stuff and return free(subValues); return ret; } // Removes all characters of a substring starting from the end of the String char i_rfString_StripEnd(void* thisstrP,void* subP) { RF_String* thisstr = (RF_String*) thisstrP; RF_String*sub = (RF_String*) subP; char ret = false,noMatch; uint32_t charValue,i = 0,*subValues,j,subLength,bytePos,lastBytePos,testity; // firstly get all of the characters of the substring in an array subLength = rfString_Length(sub); RF_MALLOC(subValues,4*subLength) rfString_Iterate_Start(sub,i,charValue) subValues[i] = charValue; rfString_Iterate_End(i) // iterate thisstring from the end i = 0; RF_STRING_ITERATEB_START(thisstr,i,bytePos) noMatch = true; // for every substring character for(j = 0;j < subLength; j++) { // if we got a match if((testity=rfString_BytePosToCodePoint(thisstr,bytePos)) == subValues[j]) { ret = true; noMatch = false; lastBytePos = bytePos; break; } } // if we get out of iterating the substring without having found a match, we get out of the iteration in general if(noMatch) break; RF_STRING_ITERATEB_END(i,bytePos) // if we had any match if(ret == true) { // just set the end of string there thisstr->bytes[lastBytePos] = '\0'; // and also set the new byte length thisstr->byteLength -= (thisstr->byteLength - lastBytePos); } // free stuff and return free(subValues); return ret; } // Removes all characters of a substring from both ends of the given String char i_rfString_Strip(void* thisstrP,void* subP) { char res1 = rfString_StripStart(thisstrP,subP); char res2 = rfString_StripEnd(thisstrP,subP); return res1|res2; } /*------------------------------------------------------------------------ RF_String File I/O functions-------------------------------------------------------------------------------*/ // Allocates and returns a string from file parsing. The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned RF_String* rfString_Create_fUTF8(FILE* f, char* eof) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); if(rfString_Init_fUTF8(ret,f,eof) < 0) { free(ret); return 0; } return ret; } // Initializes a string from file parsing. The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned int32_t rfString_Init_fUTF8(RF_String* str,FILE* f,char* eof) { int32_t bytesN; uint32_t bufferSize;// unused if((bytesN=rfFReadLine_UTF8(f,&str->bytes,&str->byteLength,&bufferSize,eof)) < 0) { LOG_ERROR("Failed to initialize String from a UTF-8 file",bytesN); return bytesN; } // success return bytesN; } // Assigns to a String from UTF-8 file parsing int32_t rfString_Assign_fUTF8(RF_String* str,FILE*f,char* eof) { int32_t bytesN; uint32_t utf8ByteLength,utf8BufferSize;// bufferSize unused in this function char* utf8 = 0; if((bytesN=rfFReadLine_UTF8(f,&utf8,&utf8ByteLength,&utf8BufferSize,eof)) < 0) { LOG_ERROR("Failed to assign the contents of a UTF-8 file to a String",bytesN); return bytesN; } // success // assign it to the string if(str->byteLength <= utf8ByteLength) { RF_REALLOC(str->bytes,char,utf8ByteLength+1); } memcpy(str->bytes,utf8,utf8ByteLength+1); str->byteLength = utf8ByteLength; // free the file's utf8 buffer free(utf8); return bytesN; } // Appends to a String from UTF-8 file parsing int32_t rfString_Append_fUTF8(RF_String* str,FILE*f,char* eof) { int32_t bytesN; uint32_t utf8ByteLength,utf8BufferSize;// bufferSize unused in this function char* utf8 = 0; if((bytesN=rfFReadLine_UTF8(f,&utf8,&utf8ByteLength,&utf8BufferSize,eof)) < 0) { LOG_ERROR("Failed to assign the contents of a UTF-8 file to a String",bytesN); return bytesN; } // append the utf8 to the given string rfString_Append(str,RFS_(utf8)); // free the file's utf8 buffer free(utf8); return bytesN; } // Allocates and returns a string from file parsing. The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. RF_String* rfString_Create_fUTF16(FILE* f,char endianess,char* eof) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); if(rfString_Init_fUTF16(ret,f,endianess,eof) < 0) return 0; return ret; } // Initializes a string from file parsing. The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. int32_t rfString_Init_fUTF16(RF_String* str,FILE* f, char endianess,char* eof) { int32_t bytesN; // depending on the file's endianess if(endianess == RF_LITTLE_ENDIAN) { if((bytesN=rfFReadLine_UTF16LE(f,&str->bytes,&str->byteLength,eof)) < 0) { LOG_ERROR("Failure to initialize a String from reading a UTF-16 file",bytesN); return bytesN; } }// end of little endian else// big endian { if((bytesN=rfFReadLine_UTF16BE(f,&str->bytes,&str->byteLength,eof)) < 0) { LOG_ERROR("Failure to initialize a String from reading a UTF-16 file",bytesN); return bytesN; } }// end of big endian case // success return bytesN; } // Assigns to an already initialized String from File parsing int32_t rfString_Assign_fUTF16(RF_String* str,FILE* f, char endianess,char* eof) { uint32_t utf8ByteLength; int32_t bytesN; char* utf8 = 0; // depending on the file's endianess if(endianess == RF_LITTLE_ENDIAN) { if((bytesN=rfFReadLine_UTF16LE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to assign the contents of a Little Endian UTF-16 file to a String",bytesN); return bytesN; } }// end of little endian else// big endian { if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to assign the contents of a Big Endian UTF-16 file to a String",bytesN); return bytesN; } }// end of big endian case // success // assign it to the string if(str->byteLength <= utf8ByteLength) { RF_REALLOC(str->bytes,char,utf8ByteLength+1); } memcpy(str->bytes,utf8,utf8ByteLength+1); str->byteLength = utf8ByteLength; // free the file's utf8 buffer free(utf8); return bytesN; } // Appends to an already initialized String from File parsing int32_t rfString_Append_fUTF16(RF_String* str,FILE* f, char endianess,char* eof) { char*utf8; uint32_t utf8ByteLength; int32_t bytesN; // depending on the file's endianess if(endianess == RF_LITTLE_ENDIAN) { if((bytesN=rfFReadLine_UTF16LE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to append the contents of a Little Endian UTF-16 file to a String",bytesN); return bytesN; } }// end of little endian else// big endian { if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to append the contents of a Big Endian UTF-16 file to a String",bytesN); return bytesN; } }// end of big endian case // success rfString_Append(str,RFS_(utf8)); free(utf8); return bytesN; } // Allocates and returns a string from file parsing. The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. RF_String* rfString_Create_fUTF32(FILE* f,char endianess,char* eof) { RF_String* ret; RF_MALLOC(ret,sizeof(RF_String)); if(rfString_Init_fUTF32(ret,f,endianess,eof) < 0) { free(ret); return 0; } return ret; } // Initializes a string from file parsing. The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. int32_t rfString_Init_fUTF32(RF_String* str,FILE* f,char endianess,char* eof) { int32_t bytesN; // depending on the file's endianess if(endianess == RF_LITTLE_ENDIAN) { if((bytesN=rfFReadLine_UTF32LE(f,&str->bytes,&str->byteLength,eof)) <0) { LOG_ERROR("Failure to initialize a String from reading a Little Endian UTF-32 file",bytesN); return bytesN; } }// end of little endian else// big endian { if((bytesN=rfFReadLine_UTF16BE(f,&str->bytes,&str->byteLength,eof)) < 0) { LOG_ERROR("Failure to initialize a String from reading a Big Endian UTF-32 file",bytesN); return bytesN; } }// end of big endian case // success return bytesN; } // Assigns the contents of a UTF-32 file to a string int32_t rfString_Assign_fUTF32(RF_String* str,FILE* f,char endianess, char* eof) { int32_t bytesN; char*utf8; uint32_t utf8ByteLength; // depending on the file's endianess if(endianess == RF_LITTLE_ENDIAN) { if((bytesN=rfFReadLine_UTF32LE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to assign to a String from reading a Little Endian UTF-32 file",bytesN); return bytesN; } }// end of little endian else// big endian { if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to assign to a String from reading a Big Endian UTF-32 file",bytesN); return bytesN; } }// end of big endian case // success // assign it to the string if(str->byteLength <= utf8ByteLength) { RF_REALLOC(str->bytes,char,utf8ByteLength+1); } memcpy(str->bytes,utf8,utf8ByteLength+1); str->byteLength = utf8ByteLength; // free the file's utf8 buffer free(utf8); return bytesN; } // Appends the contents of a UTF-32 file to a string int32_t rfString_Append_fUTF32(RF_String* str,FILE* f,char endianess, char* eof) { int32_t bytesN; char*utf8; uint32_t utf8ByteLength; // depending on the file's endianess if(endianess == RF_LITTLE_ENDIAN) { if((bytesN=rfFReadLine_UTF32LE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to append to a String from reading a Little Endian UTF-32 file",bytesN); return bytesN; } }// end of little endian else// big endian { if((bytesN=rfFReadLine_UTF16BE(f,&utf8,&utf8ByteLength,eof)) < 0) { LOG_ERROR("Failure to append to a String from reading a Big Endian UTF-32 file",bytesN); return bytesN; } }// end of big endian case // success // append it rfString_Append(str,RFS_(utf8)); // free the file'sutf8 buffer free(utf8); return bytesN; } // Writes a string to a file in UTF-8 encoding. int32_t i_rfString_Fwrite(void* sP,FILE* f,char* encodingP) { uint32_t *utf32,length,i; uint16_t* utf16; RF_String* s = (RF_String*)sP; char encoding = *encodingP; // depending on the encoding switch(encoding) { case RF_UTF8: if(fwrite(s->bytes,1,s->byteLength,f) != s->byteLength) break;// and go to error logging return RF_SUCCESS; break; case RF_UTF16_LE: utf16 = rfString_ToUTF16(s,&length); if(rfUTILS_Endianess() != RF_LITTLE_ENDIAN) { for(i=0;i #ifdef RF_MODULE_STRINGS// check if the strings are included as a module #include #include #include // for the argument count #include // for the local memory function wrapping functionality #include // for unicode #ifdef __cplusplus extern "C" {// opening bracket for calling from C++ #endif // An option for some string functions. Means that the case should not be exactly matched in the string replacing,finding e.t.c. #define RF_CASE_IGNORE 0x1 // An options for some string functions. Means that the exact string should be found/replaced e.t.c. #define RF_MATCH_WORD 0x2 // Denotes that a requested character/byte index in an RF_String is out of bounds #define RF_STRING_INDEX_OUT_OF_BOUNDS ((uint32_t)0xFF0FFFF) /* These are here so that the iteration macros can work*/ // Checks if a given byte is a continuation byte #define rfUTF8_IsContinuationByte2(b__) ( b__ >= 0x80 && b__<= 0xBF ) #pragma pack(push,1) /** ** @internal ** @author Lefteris ** @date 09/12/2010 ** @endinternal ** @brief A unicode String with UTF-8 internal representation ** ** The Refu String is a Unicode String that has two versions. One is this and for the other check @ref RF_StringX to see what operations can be performed on extended Strings. ** Functions to convert to and from all UTF encoding exists but the internal representation is always at UTF-8. Once a ** a String has been created it is always assumed that the stream of bytes inside it is valid UTF-8 since every function ** performs a UTF-8 check unless otherwise specified. ** ** All the functions which have @isinherited{StringX} on their description can be used with extended strings safely, since no specific ** version of the function exists, or needs to exist to manipulate Extended Strings. To make the documentation even clearer the functions that should not ** be used with the extended string are marked with @notinherited{StringX} ** @internal ** @cppcode ** //default constructor ** String(){this->i_StringCHandle = rfString_Create("");} ** @endcpp ** @endinternal */ typedef struct RF_String { // The string's data char* bytes; // The string's length in bytes (not including the null termination). The string keeps its length in bytes // to avoid multiple calls to strlen() uint32_t byteLength; }RF_String; #pragma pack(pop) // @memberof RF_String // @brief Create a termporary String from a String literal // // A macro to be used only inside a function call that accepts an @ref RF_String to create a Temporary RF_String* // that will be used by the function. This macro accepts from 1 to N arguments. // // The first argument shall either be a String literal or a printf styled string literal // given in the source file's encoding(default is UTF-8). For other encodings look at the compile time // option @c RF_OPTION_SOURCE_ENCODING that can be provided during building the library, but it is // @b strongly recommended to use UTF-8 encoded source files. // // Optionally the first argument can be followed by a sequence of additional arguments, // each containing one value to be inserted instead of each %-tag specified in the string literal // parameter, if any. There should be // the same number of these arguments as the number of %-tags that expect a value. // Basically the usage is the same as @ref rfString_Create // // @param s The formatted string that will constitute the RF_String. Must be in the same encoding as that of the source file. // Default is UTF-8. // @param ... \rfoptional{nothing} Depending on the string literal, the function may expect a sequence of additional arguments, // each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be // the same number of these arguments as the number of %-tags that expect a value. // @return Returns true in case of correct initialization and false , due to invalid byte sequence for the given encoding // @isinherited{StringX} #ifdef RF_IAMHERE_FOR_DOXYGEN RF_String* RFS_(const char* s,...); #else #define RFS_(...) i_rfString_CreateLocal(__VA_ARGS__) #endif /*-------------------------------------------------------------------------Methods to create an RF_String-------------------------------------------------------------------------------*/ // @name Creating an RF_String // @{ // @memberof RF_String // @opassign // @brief Allocates and returns a string with the given characters // // Given characters have to be in UTF-8. A check for valid sequence of bytes is performed. @notinherited{StringX} // @param s The sequence of bytes for the characters in UTF-8 (the default). Can also follow a printf-like format which will be formatted with // the variables that follow it. A check to see if it is a valid UTF-8 sequence is performed // @param ... \rfoptional{nothing} Depending on the string literal, the function may expect a sequence of additional arguments, // each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be // the same number of these arguments as the number of %-tags that expect a value. // @return Returns the initialized RF_string or null in case of failure to initialize, due to invalid utf-8 sequence #ifndef RF_OPTION_DEFAULT_ARGUMENTS i_DECLIMEX_ RF_String* rfString_Create(const char* s,...); #else i_DECLIMEX_ RF_String* i_rfString_Create(const char* s,...); i_DECLIMEX_ RF_String* i_NVrfString_Create(const char* s); #define rfString_Create(...) RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATE,1,__VA_ARGS__) #define i_SELECT_RF_STRING_CREATE1(...) i_NVrfString_Create(__VA_ARGS__) #define i_SELECT_RF_STRING_CREATE0(...) i_rfString_Create(__VA_ARGS__) #endif ///Internal function that creates a temporary RF_String* i_DECLIMEX_ RF_String* i_rfString_CreateLocal1(const char* s,...); i_DECLIMEX_ RF_String* i_NVrfString_CreateLocal(const char* s); #define i_rfString_CreateLocal(...) RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATELOCAL,1,__VA_ARGS__) #define i_SELECT_RF_STRING_CREATELOCAL1(...) i_NVrfString_CreateLocal(__VA_ARGS__) #define i_SELECT_RF_STRING_CREATELOCAL0(...) i_rfString_CreateLocal1(__VA_ARGS__) // @memberof RF_String // @brief Initializes a string with the given characters. // // @notinherited{StringX} // Given characters have to be in UTF-8. A check for valide sequence of bytes is performed. // @param str The string to initialize // @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with // the variables that follow it. A check to see if it is a valid UTF-8 sequence is performed // @param ... \rfoptional{nothing} Depending on the string literal, the function may expect a sequence of additional arguments, // each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be // the same number of these arguments as the number of %-tags that expect a value. // @return Returns true in case of correct initialization and false , due to invalid utf-8 sequence #ifndef RF_OPTION_DEFAULT_ARGUMENTS i_DECLIMEX_ char rfString_Init(RF_String* str,const char* s,...); #else i_DECLIMEX_ char i_rfString_Init(RF_String* str,const char* s,...); i_DECLIMEX_ char i_NVrfString_Init(RF_String* str,const char* s); #define rfString_Init(...) RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_INIT,2,__VA_ARGS__) #define i_SELECT_RF_STRING_INIT1(...) i_NVrfString_Init(__VA_ARGS__) #define i_SELECT_RF_STRING_INIT0(...) i_rfString_Init(__VA_ARGS__) #endif // @memberof RF_String // @cppnotctor // @brief Allocates a String by turning a unicode code point in a String (encoded in UTF-8). // // @notinherited{StringX} // @param code The unicode code point to encode // @return A String with the code point encoded in it or a null pointer in case of an illegal code point value i_DECLIMEX_ RF_String* rfString_Create_cp(uint32_t code); // @memberof RF_String // @brief Initializes a string by turning a unicode code point in a String (encoded in UTF-8). // // @notinherited{StringX} // @param str The string to initialize // @param code The unicode code point to encode // @return Returns true in case of correct initialization and false , due to illegal code point value i_DECLIMEX_ char rfString_Init_cp(RF_String* str,uint32_t code); #ifndef RF_OPTION_DEFAULT_ARGUMENTS // @memberof RF_String // @cppnotctor // @brief Allocates and returns a string with the given characters with no checking. // // @notinherited{StringX} // @warning NO VALID-UTF8 check is performed. // @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with // the variables that follow it. No check for valid bytestream is performed // @param ... \rfoptional{nothing} Depending on the string literal, the function may expect a sequence of additional arguments, // each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be // the same number of these arguments as the number of %-tags that expect a value. // @return Returns the initialized RF_string or null in case of failure to initialize i_DECLIMEX_ RF_String* rfString_Create_nc(const char* s,...); #else i_DECLIMEX_ RF_String* i_rfString_Create_nc(const char* s,...); i_DECLIMEX_ RF_String* i_NVrfString_Create_nc(const char* s); #define rfString_Create_nc(...) RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_CREATE_NC,1,__VA_ARGS__) #define i_SELECT_RF_STRING_CREATE_NC1(...) i_NVrfString_Create_nc(__VA_ARGS__) #define i_SELECT_RF_STRING_CREATE_NC0(...) i_rfString_Create_nc(__VA_ARGS__) #endif #ifndef RF_OPTION_DEFAULT_ARGUMENTS // @memberof RF_String // @brief Initializes a string with the given characters with no checking // // @notinherited{StringX} // @warning NO VALID-UTF8 check is performed. // @param str The string to initialize // @param s The sequence of bytes for the characters in UTF-8 (the default).Can also follow a printf-like format which will be formatted with // the variables that follow it. No check for valid bytestream is performed // @param ... \rfoptional{nothing} Depending on the string literal, the function may expect a sequence of additional arguments, // each containing one value to be inserted instead of each %-tag specified in the @c slit parameter, if any. There should be // the same number of these arguments as the number of %-tags that expect a value. // @return Returns true in case of correct initialization and false otherwise i_DECLIMEX_ char rfString_Init_nc(RF_String* str,const char* s,...); #else i_DECLIMEX_ char i_rfString_Init_nc(RF_String* str,const char* s,...); i_DECLIMEX_ char i_NVrfString_Init_nc(RF_String* str,const char* s); #define rfString_Init_nc(...) RP_SELECT_FUNC_IF_NARGIS(i_SELECT_RF_STRING_INIT_NC,2,__VA_ARGS__) #define i_SELECT_RF_STRING_INIT_NC1(...) i_NVrfString_Init_nc(__VA_ARGS__) #define i_SELECT_RF_STRING_INIT_NC0(...) i_rfString_Init_nc(__VA_ARGS__) #endif // @memberof RF_String // @opassign // @brief Allocates and returns a string with the given integer. // // @notinherited{StringX} // @param i The integer to turn into a string // @return Returns the initialized RF_string i_DECLIMEX_ RF_String* rfString_Create_i(int32_t i); // @memberof RF_String // @brief Initializes a string with the given integer. // // @notinherited{StringX} // @param str The string to initialize // @param i The integer to turn into a string // @return Returns true in case of correct initialization and false otherwise i_DECLIMEX_ char rfString_Init_i(RF_String* str,int32_t i); // @memberof RF_String // @opassign // @brief Allocates and returns a string with the given float. // // @notinherited{StringX} // @param f The float to turn into a string // @return Returns the initialized RF_string i_DECLIMEX_ RF_String* rfString_Create_f(float f); // @memberof RF_String // @brief Initializes a string with the given float. // // @notinherited{StringX} // @param str The string to initialize // @param f The float to turn into a string // @return Returns true in case of correct initialization and false otherwise i_DECLIMEX_ char rfString_Init_f(RF_String* str,float f); // @memberof RF_String // @brief Allocates and returns a string with the given UTF-16 byte sequence. // // @notinherited{StringX} // Given characters have to be in UTF-16 // @param s The sequence of bytes for the characters in UTF-16. // @param endianess A flag that determined in what endianess the sequence of UTF-16 bytes is in. Possible values here is // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @return Returns the initialized RF_string or null in case of failure to initialize, due to invalid utf-16 sequence or illegal endianess value i_DECLIMEX_ RF_String* rfString_Create_UTF16(const char* s,char endianess); // @memberof RF_String // @brief Initializes a string with the given UTF-16 byte sequence. // // @notinherited{StringX} // Given characters have to be in UTF-16 // @param str The string to initialize // @param s The sequence of bytes for the characters in UTF-16. // @param endianess A flag that determined in what endianess the sequence of UTF-16 bytes is in. Possible values here is // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @return Returns true for succesfull initialization and false otherwise due to invalid utf-16 sequence or illegal endianess value i_DECLIMEX_ char rfString_Init_UTF16(RF_String* str,const char* s,char endianess); // @memberof RF_String // @cppnotctor // @brief Allocates and returns a string with the given UTF-32 byte sequence. // // @notinherited{StringX} // Given characters have to be in UTF-32 // @param s The sequence of bytes for the characters in UTF-32. Needs to be null terminated. // @return Returns the initialized RF_string or null in case of failure to initialize i_DECLIMEX_ RF_String* rfString_Create_UTF32(const char* s); // @memberof RF_String // @brief Initializes a string with the given UTF-32 byte sequence. // // @notinherited{StringX} // Given characters have to be in UTF-32 // @param str The string to initialize // @param s The sequence of bytes for the characters in UTF-32. Needs to be null terminated. // @return Returns true for successful initialization and false otherwise i_DECLIMEX_ char rfString_Init_UTF32(RF_String* str,const char* s); //@} /*-------------------------------------------------------------------------Methods to copy/assign an RF_String-------------------------------------------------------------------------------*/ // @name Copying - Assigning a String // @{ // @memberof RF_String // @brief Assigns the value of the source string to the destination. // // @notinherited{StringX} // @lmsFunction // Both strings should already be initialized and hold a value. It is an error to give null parameters. // @param dest The destination string, which should get assigned // @param source The source string, whose values to copy. @inhtype{String,StringX} @tmpSTR #if defined(RF_IAMHERE_FOR_DOXYGEN) void rfString_Assign(RF_String* dest,void* source); #else i_DECLIMEX_ void i_rfString_Assign(RF_String* dest,void* source); #define rfString_Assign(i_DESTINATION_,i_SOURCE_) i_rfLMS_WRAP2(void,i_rfString_Assign,i_DESTINATION_,i_SOURCE_) #endif // @memberof RF_String // @brief Assigns the value of a unicode character to the string // // @notinherited{StringX} // @param thisstr The string to assign to // @param character The unicode character codepoint to assign to the String // @return Returns @c true for succesfull assignment and @c false if the given @c character was not a valid unicode codepoint i_DECLIMEX_ char rfString_Assign_char(RF_String* thisstr,uint32_t character); // @} /*-------------------------------------------------------------------------Methods to get rid of an RF_String-------------------------------------------------------------------------------*/ // @name Getting rid of an RF_String // @{ // @memberof RF_String // @cppignore // @brief Deletes a string object and also frees its pointer. // // @notinherited{StringX} // It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault // Use it for strings made with _Create // @param s The string for deletion i_DECLIMEX_ void rfString_Destroy(RF_String* s); // @memberof RF_String // @cppignore // @brief Deletes a string object only, not its memory. // // @notinherited{StringX} // It is an error to give a NULL(0x0) string for deleting. Will most probably lead to a segmentation fault // Use it for strings made with _Init // @param s The string for deletion i_DECLIMEX_ void rfString_Deinit(RF_String* s); // @} /*------------------------------------------------------------------------ RF_String unicode conversion-------------------------------------------------------------------------------*/ // @name Unicode Conversion Functions // @{ // @memberof RF_String // @brief Returns the strings contents as a UTF-8 buffer // // @isinherited{StringX} // This is just a macro wrapper of @ref rfString_ToStr() and exists here // just so that users can guess function names for all unicode encodings. // // Note that just like in @ref rfString_ToStr() this is just a pointer to // the String's internal UTF8 buffer and as such should be read only. If there // is a need to do anything other than that copy the buffer. // @param s The string in question // @return Returns a pointer to the String's internal UTF-8 uffer #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ const char* rfString_ToUTF8(RF_String* s); #else #define rfString_ToUTF8(i_STRING_) rfString_ToCstr(i_STRING_) #endif // @memberof RF_String // @brief Returns the strings contents as a UTF-16 buffer // // @isinherited{StringX} // This function allocates a UTF-16 buffer in which the string's // UTF-8 contents are encoded as UTF-16. The endianess of the buffer // is that of the system. The returned buffer needs to be freed by the user // later. // @param[in] s The string in question // @param[out] length Give a reference to a uint32_t in this argument to receive the length of // the returned UTF-16 buffer in 16-bit words // @return Returns an allocated UTF-16 buffer. Needs to be freed by the user later. i_DECLIMEX_ uint16_t* rfString_ToUTF16(RF_String* s,uint32_t* length); // @memberof RF_String // @brief Returns the strings contents as a UTF-32 buffer // // @isinherited{StringX} // This function allocates a UTF-32 buffer in which the string's // UTF-8 contents are encoded as UTF-32. The endianess of the buffer // is that of the system. The returned buffer needs to be freed by the user // later. // @param[in] s The string in question // @param[out] length Give a reference to a uint32_t in this argument to receive the length // of the returned UTF-32 buffer in codepoints. (32-bit) words // @return Returns an allocated UTF-16 buffer. Needs to be freed by the user later. i_DECLIMEX_ uint32_t* rfString_ToUTF32(RF_String* s,uint32_t*length); // @} /*------------------------------------------------------------------------ RF_String retrieval functions-------------------------------------------------------------------------------*/ // @name String Retrieval // @{ //-- String iteration --/ / // Two macros to accomplish iteration of an RF_String from any given character going forwards. This macro should be used with its end pair. // We take advantage of the fact that an RF_String is always guaranteed to contain a valid UTF-8 sequence and thus no checks are performed. /** ** @memberof RF_String ** @cppignore ** @brief Starts an RF_String forward iteration scope. ** ** @isinherited{StringX} ** Use this macro to iterate every character inside an RF_String or RF_StringX\n ** Must be used with its pair macro #rfString_Iterate_End.\n ** As an example consider this code that iterates every character of a string from the start to finish ** @code ** uint32_t i = 0; ** uint32_t charValue; ** RF_String foo;rfString_Init(&foo,"I am a String"); ** rfString_Iterate_Start(&foo,i,charValue) ** //for every character in the string,let's print it ** printf("Character at index %d is %c\n",i,charValue); ** rfString_Iterate_End(i) ** @endcode ** @param[in] string_ The string to iterate. Must be a pointer to string ** @param[in,out] startCharacterPos_ Here give an uint32_t which will be the character position from which to start the iteration. In each iteration this will hold the character index. If the given position is out of bounds then the iteration does not happen ** @param[in,out] characterUnicodeValue_ Here pass an uint32_t which in each iteration will hold the unicode code point of the character at position startCharacterPos_ **/ #define rfString_Iterate_Start(string_,startCharacterPos_,characterUnicodeValue_) {\ /* b index sec is the byte index and j the character index*/\ uint32_t byteIndex_ = 0;uint32_t j_=0;\ /*iterate until we find the character position requested and its equivalent byte position*/\ while(j_!=startCharacterPos_)\ {\ if( rfUTF8_IsContinuationByte( (string_)->bytes[byteIndex_]) ==false)\ {\ j_++;\ }\ byteIndex_++;\ }\ /*now start the requested iteration*/\ while( (string_)->bytes[byteIndex_]!='\0')\ {\ /*if it's a character*/\ if( rfUTF8_IsContinuationByte( (string_)->bytes[byteIndex_]) ==false)\ {/*Give the character value to the user*/\ characterUnicodeValue_ = rfString_BytePosToCodePoint( (string_),byteIndex_); // @memberof RF_String // @cppignore // @brief Ends an RF_String/RF_StringX forward iteration scope. // // @isinherited{StringX} // Look at #rfString_Iterate_Start for an example usage // @param[in,out] startCharacterPos_ Here give the uint32_t given to #rfString_Iterate_Start #define rfString_Iterate_End(startCharacterPos_) startCharacterPos_++;}byteIndex_++;}} //Two macros to accomplish iteration of an RF_String from any given character going backwards. This macro should be used with its end pair. // We take advantage of the fact that an RF_String is always guaranteed to contain a valid UTF-8 sequence and thus no checks are performed. /** ** @memberof RF_String ** @cppignore ** @brief Starts an RF_String backward iteration scope. ** ** @isinherited{StringX} ** Use this macro to iterate every character inside an RF_String or RF_StringX going backwards\n ** Must be used with its pair macro #rfString_IterateB_End.\n ** ** As an example consider this code that iterates every character of a string from the start to finish ** @code ** uint32_t charValue; ** RF_String foo;rfString_Init(&foo,"I am a String"); ** uint32_t i = rfString_Length(&foo); ** rfString_IterateB_Start(&foo,i,charValue) ** //for every character in the string,let's print it ** printf("Character at index %d is %c\n",i,charValue); ** rfString_IterateB_End(i) ** @endcode ** @param[in] string_ The string to iterate. Must be a pointer to string ** @param[in,out] characterPos_ Here give an uint32_t which will be the character position from which to start the iteration. In each iteration this will hold the character index. If the given position is out of bounds then the iteration does not happen ** @param[in,out] characterUnicodeValue_ Here pass an uint32_t which in each iteration will hold the unicode code point of the character at position characterPos_ **/ #define rfString_IterateB_Start(string_,characterPos_,characterUnicodeValue_) {\ /* b index is the byte index and j the character index*/\ uint32_t b_index_ = 0;uint32_t j_=0;\ /* c index sec is another signed copy of the character index (and is int64_t so that it can cater for any situation). Reason is cause going backwards we gotta have -1 too */\ int64_t c_index_ = characterPos_;\ /*iterate until we find the character position requested and its equivalent byte position*/\ while(j_!=characterPos_)\ {\ if( rfUTF8_IsContinuationByte( (string_)->bytes[b_index_]) ==false)\ {\ j_++;\ }\ b_index_++;\ }\ /*now start the requested iteration - notice that the end condition is to reach the first character position*/\ while(c_index_!=-1)\ {\ /*if it's a character*/\ if( rfUTF8_IsContinuationByte( (string_)->bytes[b_index_]) ==false)\ {/*Give the character value to the user*/\ characterUnicodeValue_ = rfString_BytePosToCodePoint( (string_),b_index_); // @memberof RF_String // @cppignore // @brief Ends an RF_String/RF_StringX backward iteration scope. // // @isinherited{StringX} // Look at #rfString_IterateB_Start for an example usage // @param[in,out] characterPos_ Here give the uint32_t given to #rfString_IterateB_Start #define rfString_IterateB_End(characterPos_) c_index_-- ;characterPos_--;}b_index_--;}} // @memberof RF_String // @brief Finds the length of the string in characters. // // @isinherited{StringX} // @param s The string whose number of characters to find. @inhtype{String,StringX} // @return Returns the length of the sting in characters, not including the null termintion character i_DECLIMEX_ uint32_t rfString_Length(void * s); // @memberof RF_String // @brief Retrieves the unicode code point of the parameter character. // // @isinherited{StringX} // If the character position is out of bounds RF_STRING_INDEX_OUT_OF_BOUNDS is returned. // @param thisstr The string whose character code point we need. @inhtype{String,StringX} // @param c The character index whose unicode code point to return. Must be a positive (including zero) integer. // @return Returns the code point as an uint32_t or the value RF_STRING_INDEX_OUT_OF_BOUNDS if the requested character index is out of bounds i_DECLIMEX_ uint32_t rfString_GetChar(void* thisstr,uint32_t c); // @internal // @memberof RF_String // @cppignore // @brief Retrieves the unicode code point of the parameter bytepos of the string. // // @isinherited{StringX} // This is an internal function, there is no need to use it. The reason it is exposed here is that it is utilized in the iteration macros. // @warning DO NOT use this function unless you know what you are doing // @param thisstr The string whose byte position code point we need. @inhtype{String,StringX} // @param bytepos The byte position of the string from where to get the code point. // @warning If this is out of bounds then nothing can detect it and at best it will cause a SEG FAULT. // Moreover no check to see if this is not a continutation byte is made. All the checks must have been made before calling the function. // @return Returns the code point of the byte position as an uint32_t // @endinternal i_DECLIMEX_ uint32_t rfString_BytePosToCodePoint(void* thisstr,uint32_t bytepos); // @internal // @memberof RF_String // @cppignore // @brief Retrieves character position of a byte position // // @isinherited{StringX} // This is an internal function, there is no need to use it. It attempts to retrieve character position from a byte position. If the byte // position is a continutation byte and does not constitute the start of a character then depending on the option the function will find // either the next character or the previous character position from this byte position // // @warning DO NOT use this function unless you know what you are doing // @param thisstr The string whose byte position code point we need. @inhtype{String,StringX} // @param bytepos The byte position of the string from where to get the character position // @param before A boolean flag denoting the behaviour in case this byte position is a continutation byte. If @c before is true then // the function will retrieve the first character position before the byte. If it is false, it will retrieve the first character position // after the continuation byte. // @endinternal i_DECLIMEX_ uint32_t rfString_BytePosToCharPos(void* thisstr,uint32_t bytepos,char before); // @memberof RF_String // @opcmpeq // @brief Compares two Strings and returns true if they are equal and false otherwise // // @isinherited{StringX} // A macro comparing two String and returning true if they are equal and false otherwise. Use it to compare ONLY Strings here not string literals (c strings) // If you need to compare a String with a string literal (c string) use #rfString_Equal_s // @lmsFunction // @param s1 The first string to compare @inhtype{String,StringX} @tmpSTR // @param s2 The second string to compare @inhtype{String,StringX} @tmpSTR // @return True in case the strings are equal and false otherwise #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_Equal(void* s1,void* s2); #else i_DECLIMEX_ char i_rfString_Equal(void* s1,void* s2); #define rfString_Equal(i_STRING1_,i_STRING2_) i_rfLMSX_WRAP2(char,i_rfString_Equal,i_STRING1_,i_STRING2_) #endif // @memberof RF_String // @brief Finds if a substring exists inside another string. // // @isinherited{StringX} // Finds the existence of String sstr inside this string with the given options. You have the // option to either match case or perform a case-insensitive search. In addition you can search // for the exact string and not it just being a part of another string. // @lmsFunction // @param thisstr This string we want to search in @inhtype{String,StringX} // @param sstr The substring string we want to search for @inhtype{String,StringX} @tmpSTR // @param options \rfoptional{0}. Bitflag options denoting some options for the search.Can have values: // + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would return a failure. Default search is to return any found substring. // @return Returns the character position of the found substring or RF_FAILURE for not found #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ int32_t rfString_Find(const void* thisstr,const void* sstr,const char options); #else i_DECLIMEX_ int32_t i_rfString_Find(const void* thisstr,const void* sstr,const char* options); #ifndef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Find(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_)) #else #define rfString_Find(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_FIND,3,__VA_ARGS__) #define i_NPSELECT_RF_STRING_FIND1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\"") #define i_NPSELECT_RF_STRING_FIND0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_FIND,__VA_ARGS__) #define i_SELECT_RF_STRING_FIND2(i_THISSTR_,i_SEARCHSTR_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(0)) #define i_SELECT_RF_STRING_FIND3(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Find,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_FIND1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\"") #define i_SELECT_RF_STRING_FIND0(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Find() accepts from 2 to 3 arguments\"") #endif #endif // @memberof RF_String // @brief Returns the integer value of a String // // @isinherited{StringX} // The parameter string must contains only numbers. If it contains anything else the function fails. // @param thisstr The string whose integer value to return. @inhtype{String,StringX} // @param[out] v A refence to an integer that will return the float value // @return Returns true in case of succesfull conversion or false if no integer was represented by the string i_DECLIMEX_ char rfString_ToInt(void* thisstr,int32_t* v); // @memberof RF_String // @brief Returns the double value of a String // // @isinherited{StringX} // The parameter string must contain only a number. If it contains anything else the function fails. // @param thisstr The string whose floating point value to return. @inhtype{String,StringX} // @param[out] f A refence to a double that will return the floating point number value // @return Returns RF_SUCCESS in case of succesfull conversion or error if there was failure. Possible errors are: // + @c RE_STRING_TOFLOAT: There was a conversion error. The string probably does not represent a float // + @c RE_STRING_TOFLOAT_RANGE: The represented floating point number is of a range bigger than what can be // represented by the system // + @c RE_STRING_TOFLOAT_UNDERFLOW: Representing the string's floating point number in a double would cause underflow i_DECLIMEX_ int rfString_ToDouble(void* thisstr,double* f); // @memberof RF_String // @brief Returns a cstring version of the string // // @isinherited{StringX} // Remember that this is just a pointer to the string data. It can't be modified. memcpy it if you need a copy of it. // @param str The string whose cstring to return. @inhtype{String,StringX} // @return Returns a c string version of the string i_DECLIMEX_ const char* rfString_ToCstr(const void* str); // @memberof RF_String // @cppignore // @brief Creates and returns an allocated copy of the given string // // @isinherited{StringX} // @note The Returned Substring needs to be freed by the user. BEWARE when assigning to a string using this function since if any previous string exists there IS NOT getting freed. You have to free it explicitly // @param src The string to copy from. @inhtype{String,StringX} // @return Returns a string copied from the previous one or null if the original string was null i_DECLIMEX_ RF_String* rfString_Copy_OUT(void* src); // @memberof RF_String // @cppignore // @brief Copies all the contents of a string to another // // @isinherited{StringX} // @param dst The string to copy in. // @param src The string to copy from. @inhtype{String,StringX} // If the value is bigger than the maximum number of characters then still all characters are copied. i_DECLIMEX_ void rfString_Copy_IN(RF_String* dst,void* src); // @memberof RF_String // @brief Copies a certain number of characters from a string // // @isinherited{StringX} // Copies @c n characters from @c src String into the destination @c dst string. // @param dst The string to copy in // @param src The string to copy from. @inhtype{String,StringX} // @param n The number of characters to copy from the @c src string // If the value is bigger than the maximum number of characters then still all characters are copied. i_DECLIMEX_ void rfString_Copy_chars(RF_String* dst,void* src,uint32_t n); // @memberof RF_String // @brief Applies a limited version of sscanf after the specified substring // // @isinherited{StringX} // @lmsFunction // @param thisstr The current string. @inhtype{String,StringX} // @param afterstr The substring after which to apply sscanf. @inhtype{String,StringX} @tmpSTR // @param format The tokens parameter which give the format of scanf // @param var A void* to pass in any variable we need to get a value // @return Returns true if a value was read and false otherwise, substring not being found in the string or sscanf unable to read into the variable #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_ScanfAfter(void* thisstr,void* afterstr,const char* format,void* var); #else i_DECLIMEX_ char i_rfString_ScanfAfter(void* thisstr,void* afterstr,const char* format,void* var); #define rfString_ScanfAfter(i_THISSTR_,i_AFTERSTR_,i_FORMAT_,i_VAR_) i_rfLMSX_WRAP4(char,i_rfString_ScanfAfter,i_THISSTR_,i_AFTERSTR_,i_FORMAT_,i_VAR_) #endif // @memberof RF_String // @brief Counts how many times a substring occurs inside the string. // // @isinherited{StringX} // @lmsFunction // @param thisstr The string inside which to count. @inhtype{String,StringX} // @param sstr The substring for which to search. @inhtype{String,StringX} @tmpSTR // @param options \rfoptional{0}. Bitflag options denoting some options for the search. Give 0 for the defaults.Can have values: // + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would return a failure. Default search is to return any found substring. // @return Returns the number of times cstr exists inside the string (0 is returned in case it's not found at all #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ int32_t rfString_Count(void* thisstr,void* sstr,const char options); #else i_DECLIMEX_ int32_t i_rfString_Count(void* thisstr,void* sstr,const char* options); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Count(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_COUNT,3,__VA_ARGS__) #define i_NPSELECT_RF_STRING_COUNT1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\"") #define i_NPSELECT_RF_STRING_COUNT0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_COUNT,__VA_ARGS__) #define i_SELECT_RF_STRING_COUNT2(i_THISSTR_,i_SEARCHSTR_) i_rfLMSX_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(0)) #define i_SELECT_RF_STRING_COUNT3(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMS_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_COUNT1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\"") #define i_SELECT_RF_STRING_COUNT0(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Count() accepts from 2 to 3 arguments\"") #else #define rfString_Count(i_THISSTR_,i_SEARCHSTR_,i_OPTIONS_) i_rfLMSX_WRAP3(int32_t,i_rfString_Count,i_THISSTR_,i_SEARCHSTR_,i_RFI8_(i_OPTIONS_)) #endif #endif // @memberof RF_String // @brief Tokenizes the given string // // @isinherited{StringX} // Separates it into @c tokensN depending on how many substrings can be created from the @c sep separatior and stores them // into the Array of RF_String* that should be passed to the function. The array gets initialized inside the function and // has to be freed explicitly later by thg user. Also each String inside the array has to be Deinitialized too. // Here is an example usage: // @snippet Strings/tokenize.cpp Tokenize_C // @cppsnippet Tokenize_CPP // @param[in] thisstr The string to tokenize. @inhtype{String,StringX} // @param[in] sep A string literal that will be used as a separator to tokenize the given string // @param[out] tokensN The number of tokens that got created // @param[out] tokens Pass a pointer to an array of RF_Strings. @keepptr // @return Returns true in success and false in case the the separating character has not been found // @internal @cppcode // char String::Tokenize(char* sep,uint32_t* tokensN, String*** tokens) // { // RF_String* t; // uint32_t i; // if(rfString_Tokenize(this->i_StringCHandle,sep,tokensN,&t)==false) // return false; // // *tokens = (String**) malloc(sizeof(String*)* (*tokensN)); // for(i=0;i<(*tokensN);i++) // { // (*tokens)[i] = new String((RF_String*)&t[i]); // } // return true; // } // @endcpp @endinternal i_DECLIMEX_ char rfString_Tokenize(void* thisstr,char* sep,uint32_t* tokensN,RF_String** tokens); // @memberof RF_String // @brief Initializes the first substring, between two given strings // // @isinherited{StringX} // Initializes the given string as the first substring existing between the left and right parameter substrings // @lmsFunction // @note The Returned Substring needs to be deinitialized by the user. // @param thisstr This current string. @inhtype{String,StringX} // @param[in] lstr The left substring that will define the new substring. @inhtype{String,StringX} @tmpSTR // @param[in] rstr The right substring that will define the new substring. @inhtype{String,StringX} @tmpSTR // @param[out] result The resulting substring. // @param options \rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults. // Can have values: // + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would find nothing. Default is with this flag off. // @return Returns true if the substring is found and initialized and false otherwise #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_Between(void* thisstr,void* lstr,void* rstr,RF_String* result,const char options); #else i_DECLIMEX_ char i_rfString_Between(void* thisstr,void* lstr,void* rstr,RF_String* result,const char* options); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Between(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BETWEEN,5,__VA_ARGS__) #define i_NPSELECT_RF_STRING_BETWEEN1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\"") #define i_NPSELECT_RF_STRING_BETWEEN0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_BETWEEN,__VA_ARGS__) #define i_SELECT_RF_STRING_BETWEEN4(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_) \ i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(0)) #define i_SELECT_RF_STRING_BETWEEN5(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_OPTIONS_) \ i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_BETWEEN3(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\"") #define i_SELECT_RF_STRING_BETWEEN2(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\"") #define i_SELECT_RF_STRING_BETWEEN1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\"") #define i_SELECT_RF_STRING_BETWEEN0(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Between() accepts from 4 to 5 arguments\"") #else #define rfString_Between(i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_OPTIONS_) \ i_rfLMSX_WRAP5(char,i_rfString_Between,i_THISSTR_,i_LEFTSTR_,i_RIGHTSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_)) #endif #endif // @memberof RF_String // @brief Initializes the given string as the substring from the start until any of the given Strings are found // // @isinherited{StringX} // The parameters that have to be given as variable argument must be of type RF_String* or RF_StringX* or even // string initialized with the temporary string macro // @rfNoDefArgsWarn1 // @warning if the library has been compiled with @c DEFAULT_ARGUMENTS off then arguments @c options and @c parN are actually pointers // to @c char and @c unsigned char respectively // @lmsFunction // @param thisstr The string to operate in. @inhtype{String,StringX} // @param result The resulting substring. // @param options Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults. // Can have values: // + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would find nothing. Default is with this flag off. // @param parN The number of strings to search for // @param ... The strings to search for. @inhtype{String,StringX} @tmpSTR // @extraVarArgLim // @return Returns true if the substring was initialized and false if none of the parameters were found or an invalid UTF-8 sequence was given. In the latter case an error is also logged. #ifdef RF_IAMHERE_FOR_DOXYGEN i_DECLIMEX_ char rfString_Beforev(void* thisstr,RF_String* result,const char options,const unsigned char parN, ...); #endif #ifdef RF_OPTION_DEFAULT_ARGUMENTS i_DECLIMEX_ char i_rfString_Beforev(void* thisstr,RF_String* result,const char* options,const unsigned char* parN, ...); #define rfString_Beforev(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BEFOREV,4,__VA_ARGS__) #define i_NPSELECT_RF_STRING_BEFOREV1(...) RF_SELECT_FUNC_IF_NARGGT2(i_LIMSELECT_RF_STRING_BEFOREV,18,__VA_ARGS__) #define i_NPSELECT_RF_STRING_BEFOREV0(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Beforev() needs to receive more than 4 arguments\"") #define i_LIMSELECT_RF_STRING_BEFOREV1(...) RF_COMPILE_ERROR("message \"Extra Arguments Limit Reached: Function rfString_Beforev() received more extra arguments than the limit permits\"") #define i_LIMSELECT_RF_STRING_BEFOREV0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_BEFOREV,__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV5(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) \ i_rfLMSX_WRAP5(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV6(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP6(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV7(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP7(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV8(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP8(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV9(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP9(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV10(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP10(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV11(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP11(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV12(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP12(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV13(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP13(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV14(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP14(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV15(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP15(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV16(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP16(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV17(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP17(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_BEFOREV18(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP18(char,i_rfString_Beforev,i_ARG1_,i_ARG2_,i_RFI8_(i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #else i_DECLIMEX_ char rfString_Beforev(void* thisstr,RF_String* result,const char* options,const unsigned char* parN, ...); #endif // @memberof RF_String // @brief Initializes the given string as the substring from the start until the given string is found // // @isinherited{StringX} // @lmsFunction // @param thisstr The string to operate in. @inhtype{String,StringX} // @param sstr The substring that we want to find inside the string @inhtype{String,StringX} @tmpSTR // @param result The resulting substring. // @param options \rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults. // Can have values: // + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would find nothing. Default is with this flag off. // @return Returns true if the substring was initialized and false if none of the parameters were found or an invalid UTF-8 sequence was given. In the latter case an error is also logged. #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_Before(void* thisstr,void* sstr,RF_String* result,const char options); #else i_DECLIMEX_ char i_rfString_Before(void* thisstr,void* sstr,RF_String* result,const char* options); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Before(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_BEFORE,4,__VA_ARGS__) #define i_NPSELECT_RF_STRING_BEFORE1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\"") #define i_NPSELECT_RF_STRING_BEFORE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_BEFORE,__VA_ARGS__) #define i_SELECT_RF_STRING_BEFORE3(i_THISSTR_,i_SEARCHSTR_,i_RESULT_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(0)) #define i_SELECT_RF_STRING_BEFORE4(i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_BEFORE2(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\"") #define i_SELECT_RF_STRING_BEFORE1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\"") #define i_SELECT_RF_STRING_BEFORE0(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Before() accepts from 3 to 4 arguments\"") #else #define rfString_Before(i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Before,i_THISSTR_,i_SEARCHSTR_,i_RESULT_,i_RFI8_(i_OPTIONS_)) #endif #endif // @memberof RF_String // @brief Initialize a string after a given substring // // @isinherited{StringX} // Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false. // @note The given String needs to be deinitialized by the user // @lmsFunction // @param[in] thisstr The parameter string from which the substring will be formed. @inhtype{String,StringX} // @param[in] after The substring to search for inside the parameter string. @inhtype{String,StringX} @tmpSTR // @param[out] out Pass a reference to a String inside which the substring of the original string after the @c after substring will be placed // @param options \rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults. // Can have values: // + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would find nothing. Default is with this flag off. // @return Returns true for success and false if the substring is not found in the parameter string. #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_After(void* thisstr,void* after,RF_String* out,const char options); #else i_DECLIMEX_ char i_rfString_After(void* thisstr,void* after,RF_String* out,const char* options); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_After(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_AFTER,4,__VA_ARGS__) #define i_NPSELECT_RF_STRING_AFTER1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\"") #define i_NPSELECT_RF_STRING_AFTER0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_AFTER,__VA_ARGS__) #define i_SELECT_RF_STRING_AFTER3(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(0)) #define i_SELECT_RF_STRING_AFTER4(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_AFTER2(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\"") #define i_SELECT_RF_STRING_AFTER1(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\"") #define i_SELECT_RF_STRING_AFTER0(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_After() accepts from 3 to 4 arguments\"") #else #define rfString_After(i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_After,i_THISSTR_,i_AFTERSTR_,i_OUTSTR_,i_RFI8_(i_OPTIONS_)) #endif #endif // @memberof RF_String // @brief Initialize a string after the first of the given substrings found // // @isinherited{StringX} // Initializes the given String with the substring located after (and not including) the after substring inside the parameter string. If the substring is not located the function returns false. // The parameters that have to be given as variable argument must be of type RF_String* or RF_StringX* or even // string initializes with the temporary string macro // @rfNoDefArgsWarn1 // @warning if the library has been compiled with @c DEFAULT_ARGUMENTS off then arguments @c options and @c parN are actually pointers // to @c char and @c unsigned char respectively // @lmsFunction // @param[in] thisstr The parameter string from which the substring will be formed. @inhtype{String,StringX} // @param[out] out Pass a reference to a String inside which the substring of the original string // after the found substring will be placed. // @param options \rfoptional{0} Bitflag options denoting the method with which to search for the substring literals inside the string. Give 0 for the defaults. // Can have values: // + @c RF_CASE_IGNORE: If you want to search for any occurence of the substring disregarding CAPS or not. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you to find only exact matches of the substring. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would find nothing. Default is with this flag off. // @param parN The number of substrings to search for. // @param ... The substrings to search for. @inhtype{String,StringX} @tmpSTR // @extraVarArgLim // @return Returns true for success and false if the substring is not found in the parameter string. #ifdef RF_IAMHERE_FOR_DOXYGEN i_DECLIMEX_ char rfString_Afterv(void* thisstr,RF_String* out,const char options,const unsigned char parN,...); #endif #ifdef RF_OPTION_DEFAULT_ARGUMENTS i_DECLIMEX_ char i_rfString_Afterv(void* thisstr,RF_String* out,const char* options,const unsigned char* parN,...); #define rfString_Afterv(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_AFTERV,4,__VA_ARGS__) #define i_NPSELECT_RF_STRING_AFTERV1(...) RF_SELECT_FUNC_IF_NARGGT2(i_LIMSELECT_RF_STRING_AFTERV,18,__VA_ARGS__) #define i_NPSELECT_RF_STRING_AFTERV0(...) RF_COMPILE_ERROR("message \"Ileggal Arguments Number: Function rfString_Afterv() needs to receive more than 4 arguments\"") #define i_LIMSELECT_RF_STRING_AFTERV1(...) RF_COMPILE_ERROR("message \"Extra Arguments Limit Reached: Function rfString_Afterv() received more extra arguments than the limit permits\"") #define i_LIMSELECT_RF_STRING_AFTERV0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_AFTERV,__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV5(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP5(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV6(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP6(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV7(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP7(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV8(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP8(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV9(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP9(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV10(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP10(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV11(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP11(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV12(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP12(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV13(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP13(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV14(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP14(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV15(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP15(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV16(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP16(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV17(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP17(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #define i_SELECT_RF_STRING_AFTERV18(i_ARG1_,i_ARG2_,i_ARG3_,i_ARG4_,...) i_rfLMSX_WRAP18(char,i_rfString_Afterv,i_ARG1_,i_ARG2_,i_RFI8_((i_ARG3_),i_RFUI8_(i_ARG4_),__VA_ARGS__) #else char rfString_Afterv(void* thisstr,RF_String* out,const char* options,const unsigned char* parN,...); #endif // @} /*------------------------------------------------------------------------ RF_String manipulation functions-------------------------------------------------------------------------------*/ // @name String Manipulation // @{ // @memberof RF_String // @opadd // @brief Appends a string to this one // // @notinherited{StringX} // @lmsFunction // @param thisstr The string to append to // @param other The string to add to this string. @inhtype{String,StringX} @tmpSTR #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ void rfString_Append(RF_String* thisstr,void* other); #else i_DECLIMEX_ void i_rfString_Append(RF_String* thisstr,void* other); #define rfString_Append(i_THISSTR_,i_OTHERSTR_) i_rfLMS_WRAP2(void,i_rfString_Append,i_THISSTR_,i_OTHERSTR_) #endif // @memberof RF_String // @opadd // @brief Appends an integer to the string // // @notinherited{StringX} // @param thisstr The string to append to // @param i The integer to add i_DECLIMEX_ void rfString_Append_i(RF_String* thisstr,const int32_t i); // @memberof RF_String // @opadd // @brief Appends a float to the string // // @notinherited{StringX} // @param thisstr The string to append to // @param f The float to add i_DECLIMEX_ void rfString_Append_f(RF_String* thisstr,const float f); // @memberof RF_String // @brief Prepends the parameter String to this string // // @notinherited{StringX} // @lmsFunction // @param thisstr The string to prepend to // @param other The string to prepend to this string. @inhtype{String,StringX} @tmpSTR #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ void rfString_Prepend(RF_String* thisstr,void* other); #else i_DECLIMEX_ void i_rfString_Prepend(RF_String* thisstr,void* other); #define rfString_Prepend(i_THISSTR_,i_OTHERSTR_) i_rfLMS_WRAP2(void,i_rfString_Prepend,i_THISSTR_,i_OTHERSTR_) #endif // @memberof RF_String // @brief Removes occurences of a substring // // @isinherited{StringX} // Removes a @c number of occurences of a substring from this string, that agree with the given parameters. // Does not reallocate buffer size // @lmsFunction // @param thisstr This string we want to remove from. @inhtype{String,StringX} // @param rstr The string whose occurences we need to locate and remove from the current string. @inhtype{String,StringX} @tmpSTR // @param number \rfoptional{0}. The number of occurences to remove. Give @e 0 for all the occurences. // If the given number is bigger than the actual number of occurences, still all occurences get replaced. // @param options \rfoptional{0}. Bitflag options denoting some options for the search. Give 0 for the defaults. // Can have values: // + @c RF_CASE_IGNORE: If you want the found substring to ignore the case and returns success for any occurence of the string in any case. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you want the found substring to be exact. For example an exact search for @e "HELLO" in the string // @e "HELLOWORLD" would return a failure. Default search is to return any found substring. // @return Returns true in case of success, and false if the substring was not even found inside the string #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_Remove(void* thisstr,void* rstr,uint32_t number,const char options); #else i_DECLIMEX_ char i_rfString_Remove(void* thisstr,void* rstr,uint32_t* number,const char* options); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Remove(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_REMOVE,4,__VA_ARGS__) #define i_NPSELECT_RF_STRING_REMOVE1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\"") #define i_NPSELECT_RF_STRING_REMOVE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_REMOVE,__VA_ARGS__) #define i_SELECT_RF_STRING_REMOVE2(i_THISSTR_,i_REPSTR_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(0),i_RFI8_(0)) #define i_SELECT_RF_STRING_REMOVE3(i_THISSTR_,i_REPSTR_,i_NUMBER_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(0)) #define i_SELECT_RF_STRING_REMOVE4(i_THISSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \ i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_REMOVE1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\"") #define i_SELECT_RF_STRING_REMOVE0(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Remove() accepts from 2 to 4 arguments\"") #else #define rfString_Remove(i_THISSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) i_rfLMSX_WRAP4(char,i_rfString_Remove,i_THISSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_)) #endif #endif // @memberof RF_String // @brief Removes all of the characters of the string except those specified // // This string is scanned for the existence of each characters inside the given // @c keepstr. Any character found there is kept in the original string. All other // characters are removed. // @isinherited{StringX} // @lmsFunction // @param thisstr The string to remove from @inhtype{String,StringX} // @param keepstr A string all of whose characters will be kept in @c thisstr @inhtype{String,StringX} @tmpSTR #ifdef RF_IAMHERE_FOR_DOXYGEN i_DECLIMEX_ void rfString_KeepOnly(void* thisstr,void* keepstr); #else i_DECLIMEX_ void i_rfString_KeepOnly(void* thisstr,void* keepstr); #define rfString_KeepOnly(i_THISSTR_,I_KEEPSTR_) i_rfLMS_WRAP2(void,i_rfString_KeepOnly,i_THISSTR_,I_KEEPSTR_) #endif // @memberof RF_String // @brief Removes the first n characters from the start of the string. // // @isinherited{StringX} // @param thisstr The string to prune from. @inhtype{String,StringX} // @param n The number of characters to remove. Must be a positive integer. // @return True if n characters got removed and false if there are not enough characters to remove. (in which case the string becomes empty) i_DECLIMEX_ char rfString_PruneStart(void* thisstr,uint32_t n); // @memberof RF_String // @brief Removes the last n characters from the end of the string // // @isinherited{StringX} // @param thisstr The string to prune from. @inhtype{String,StringX} // @param n The number of characters to remove. Must be a positive integer. // @return True if n characters got removed and false if there are not enough characters to remove. (in which case the string becomes empty) i_DECLIMEX_ char rfString_PruneEnd(void* thisstr,uint32_t n); // @memberof RF_String // @brief Removes characters from one point of the string to another going backwards // // @isinherited{StringX} // Removes n characters from the position p (including the character at p) of the string counting backwards. If there is no space to do so, nothing is done and returns false. // @param thisstr The string to prune from. @inhtype{String,StringX} // @param p The position to remove the characters from. Must be a positive integer. Indexing starts from zero. // @param n The number of characters to remove from the position and back.Must be a positive integer. // @return Returns true in case of succesfull removal and false in any other case. i_DECLIMEX_ char rfString_PruneMiddleB(void* thisstr,uint32_t p,uint32_t n); // @memberof RF_String // @brief Removes characters from one point of the string to another going forward // // @isinherited{StringX} // Removes n characters from the position p (including the character at p) of the string counting forwards. If there is no space, nothing is done and returns false. // @param thisstr The string to prune from. @inhtype{String,StringX} // @param p The position to remove the characters from. Must be a positive integer. Indexing starts from zero. // @param n The number of characters to remove from the position and on. Must be a positive integer. // @return Returns true in case of succesfull removal and false in any other case. i_DECLIMEX_ char rfString_PruneMiddleF(void* thisstr,uint32_t p,uint32_t n); // @memberof RF_String // @brief Replace all occurences of a String // // @notinherited{StringX} // Replaces all of the specified sstr substring from the String with rstr and reallocates size, unless the new size is smaller // @lmsFunction // @param thisstr The string in which to do the replacing // @param sstr The string to locate and replace from the current string. @inhtype{String,StringX} @tmpSTR // @param rstr The string with which to replace it. @inhtype{String,StringX} @tmpSTR // @param number \rfoptional{0}. The number of occurences to replace. Give @e 0 for all the occurences. // If the given number is bigger than the actual number of occurences, still all occurences get replaced. // @param options \rfoptional{0}. Bitflag options denoting some options for the string to replace. Give 0 for the defaults. Can have values: // + @c RF_CASE_IGNORE: If you want to replace any occurence of the substring disregarding CAPS or not. // Default search option is to @b match the case. For now this works only for characters of the english language. // + @c RF_MATCH_WORD: If you to replace only exact matches of the substring. For example an exact replace for @e "HELLO" in the string // @e "HELLOWORLD" would replace nothing. Default is with this flag off. // @return Returns true in case of success, and false if the substring was not even found inside the string #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_Replace(RF_String* thisstr,void* sstr,void* rstr,const uint32_t number,const char options); #else i_DECLIMEX_ char i_rfString_Replace(RF_String* thisstr,void* sstr,void* rstr,const uint32_t* number,const char* options); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Replace(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_REPLACE,5,__VA_ARGS__) #define i_NPSELECT_RF_STRING_REPLACE1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\"") #define i_NPSELECT_RF_STRING_REPLACE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_REPLACE,__VA_ARGS__) #define i_SELECT_RF_STRING_REPLACE3(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_) i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(0),i_RFI8_(0)) #define i_SELECT_RF_STRING_REPLACE4(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_) \ i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(0)) #define i_SELECT_RF_STRING_REPLACE5(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \ i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_)) #define i_SELECT_RF_STRING_REPLACE2(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\"") #define i_SELECT_RF_STRING_REPLACE1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\"") #define i_SELECT_RF_STRING_REPLACE0(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Replace() accepts from 3 to 5 arguments\"") #else #define rfString_Replace(i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_NUMBER_,i_OPTIONS_) \ i_rfLMSX_WRAP5(char,i_rfString_Replace,i_THISSTR_,i_SEARCHSTR_,i_REPSTR_,i_RFUI32_(i_NUMBER_),i_RFI8_(i_OPTIONS_)) #endif #endif // @memberof RF_String // @brief Removes all characters of a substring only from the start of the String // // @isinherited{StringX} // Searches for and removes each individual character inside the @c sub substring from the // given String @c thisstr starting from the beginning of the String and until it finds any other character // @lmsFunction // @param thisstr The string to search in. @inhtype{String,StringX} // @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR // @return Returns true for success and false if none of @c sub characters were found inside the given String #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_StripStart(void* thisstr,void* sub); #else i_DECLIMEX_ char i_rfString_StripStart(void* thisstr,void* sub); #define rfString_StripStart(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_StripStart,i_THISSTR_,i_SUBSTR_) #endif // @memberof RF_String // @brief Removes all characters of a substring starting from the end of the String // // @isinherited{StringX} // Searches for and removes each individual character inside the @c sub substring from the // given String @c thisstr starting from the end of the String and until it finds any other character // @lmsFunction // @param thisstr The string to search in. @inhtype{String,StringX} // @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR // @return Returns true for success and false if none of @c sub characters were found inside the given String #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_StripEnd(void* thisstr,void* sub); #else i_DECLIMEX_ char i_rfString_StripEnd(void* thisstr,void* sub); #define rfString_StripEnd(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_StripEnd,i_THISSTR_,i_SUBSTR_) #endif // @memberof RF_String // @brief Removes all characters of a substring from both ends of the given String // // @isinherited{StringX} // Searches for and removes each individual character inside the @c sub substring from the // given String @c thisstr starting from both the beginning and the end of the String and until it finds any other character // @lmsFunction // @param thisstr The string to search in. @inhtype{String,StringX} // @param sub The substring to search for. @inhtype{String,StringX} @tmpSTR // @return Returns true for success and false if none of @c sub characters were found inside the given String #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ char rfString_Strip(void* thisstr,void* sub); #else i_DECLIMEX_ char i_rfString_Strip(void* thisstr,void* sub); #define rfString_Strip(i_THISSTR_,i_SUBSTR_) i_rfLMSX_WRAP2(char,i_rfString_Strip,i_THISSTR_,i_SUBSTR_) #endif // @} /*------------------------------------------------------------------------ RF_String File Descriptor I/O functions-------------------------------------------------------------------------------*/ // @name String File Descriptor I/O functions // @{ // @memberof RF_String // @brief Allocates and returns a string from UTF-8 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_String // The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned // Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed. // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization // @return The initialized string or null pointer in case of failure to read the file, or unexpected data (non-UTF8 encoded string) i_DECLIMEX_ RF_String* rfString_Create_fUTF8(FILE* f, char* eof); // @memberof RF_String // @brief Initializes a string from UTF-8 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_String // The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned // Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed. // @param str The extended string to initialize // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization // @return Returns either a positive number for succesfull initialization that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce. i_DECLIMEX_ int32_t rfString_Init_fUTF8(RF_String* str,FILE* f, char* eof); // @memberof RF_String // @brief Assigns to a string from UTF-8 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and assigns it to an RF_StringX // The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned // Given file character stream must be encoded in UTF-8. A check for valide sequence of bytes is performed. // @param str The extended string to assign to // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment // @return Returns either a positive number for succesfull assignment that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce. i_DECLIMEX_ int32_t rfString_Assign_fUTF8(RF_String* str,FILE* f, char* eof); // @memberof RF_String // @brief Appends to a string from UTF-8 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and appends it to an RF_StringX // The file's encoding must be UTF-8.If for some reason (like EOF reached) no string can be read then null is returned // Given file character stream must be encoded in UTF-8. A check for valid sequence of bytes is performed. // @param str The extended string to append to // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-8.A check for valide sequence of bytes is performed. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending // @return Returns either a positive number for succesfull appending that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF8() can produce. i_DECLIMEX_ int32_t rfString_Append_fUTF8(RF_String* str,FILE* f, char* eof); // @memberof RF_String // @cppnotctor // @brief Allocates and returns a string from UTF-16 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX // The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16. // @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization // @return The initialized string or null pointer in case of failure to read the file i_DECLIMEX_ RF_String* rfString_Create_fUTF16(FILE* f, char endianess,char* eof); // @memberof RF_String // @brief Initializes a string from UTF-16 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX // The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param str The extended string to initialize // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16. // @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization // @return Returns either a positive number for succesfull initialization that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce. i_DECLIMEX_ int32_t rfString_Init_fUTF16(RF_String* str,FILE* f, char endianess,char* eof); // @memberof RF_String // @brief Appends the contents of a UTF-16 file a String // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and appends it to an RF_StringX // The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param str The extended string to append to // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16. // @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending // @return Returns either a positive number for succesfull appending that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce. i_DECLIMEX_ int32_t rfString_Append_fUTF16(RF_String* str,FILE* f, char endianess,char* eof); // @memberof RF_String // @brief Assigns the contents of a UTF-16 file to an already initialized string // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and assigns it to an RF_StringX // The file's encoding must be UTF-16.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param str The extended string to assign to // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-16. // @param endianess A flag that determines in what endianess the UTF-16 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment // @return Returns either a positive number for succesfull assignment that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF16LE() can produce. i_DECLIMEX_ int32_t rfString_Assign_fUTF16(RF_String* str,FILE* f, char endianess,char* eof); // @memberof RF_String // @cppnotctor // @brief Allocates and returns a string from UTF-32 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX // The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32. // @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization // @return The initialized string or null pointer in case of failure to read the file i_DECLIMEX_ RF_String* rfString_Create_fUTF32(FILE* f,char endianess, char* eof); // @memberof RF_String // @brief Initializes a string from UTF-32 file parsing // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and saves it as an RF_StringX // The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param str The extended string to initialize // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32. // @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this initialization // @return Returns either a positive number for succesfull initialization that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce. i_DECLIMEX_ int32_t rfString_Init_fUTF32(RF_String* str,FILE* f,char endianess, char* eof); // @memberof RF_String // @brief Assigns the contents of a UTF-32 file to a string // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and assigns it as the contents of the given RF_StringX // The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param str The extended string to assign to // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32. // @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this assignment // @return Returns either a positive number for succesfull assignment that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce. i_DECLIMEX_ int32_t rfString_Assign_fUTF32(RF_String* str,FILE* f,char endianess, char* eof); // @memberof RF_String // @brief Appends the contents of a UTF-32 file to a string // // @notinherited{StringX} // Read the file stream @c f until either a newline character or the EOF is reached and appends to the given RF_StringX // The file's encoding must be UTF-32.If for some reason (like EOF reached) no string can be read then null is returned. A check for a valid sequence of bytes is performed. // @param str The extended string to append to // @param f A valid and open file pointer in read mode from which to read the string. The file's encoding must be UTF-32. // @param endianess A flag that determines in what endianess the UTF-32 file is encoded in. Possible values here are // @c RF_LITTLE_ENDIAN and @c RF_BIG_ENDIAN. // @param[out] eof Pass a pointer to a char to receive a true or false value in case the end of file was reached with this appending // @return Returns either a positive number for succesfull appending that represents the bytes read from the file. // If there was a problem an error is returned. Possible errors are any of those that @ref rfFReadLine_UTF32LE() can produce. i_DECLIMEX_ int32_t rfString_Append_fUTF32(RF_String* str,FILE* f,char endianess, char* eof); // @memberof RF_String // @brief Writes a string to a file depending on the given encoding // // @isinherited{StringX} // This function shall output the string @c s into the file descriptor @c f in the given @c encoding . // @lmsFunction // @param s The string to write to the file @inhtype{String,StringX} @tmpSTR // @param f A valid and open file pointer into which to write the string. // @param encoding \rfoptional{@c RF_UTF8} The encoding of the file. Default is @c RF_UTF8. Can be one of: // + @c RF_UTF8: For Unicode UTF-8 encoding // + @c RF_UTF16_BE: For Unicode UTF-16 encoding in Big Endian endianess // + @c RF_UTF16_LE: For Unicode UTF-16 encoding in Little Endian endianess // + @c RF_UTF32_BE: For Unicode UTF-32 encoding in Big Endian endianess // + @c RF_UTF32_LE: For Unicode UTF-32 encoding in Little Endian endianess // @return Returns @c RF_SUCCESS for succesfull writting and error otherwise. Possible errors are: // + @c RE_FILE_WRITE: There was an unknown write error // + @c RE_FILE_WRITE_BLOCK: The write failed because the file was occupied by another thread and the no block flag was set // + @c RE_FILE_BAD: The file descriptor @c f was corrupt // + @c RE_FILE_TOOBIG: The file's size exceeds the system limiti // + @c RE_INTERRUPT: Writting failed due to a system interrupt // + @c RE_FILE_IO: Writting failed because of a physical I/O error // + @c RE_FILE_NOSPACE: Writting failed because the device containing the file had no free space // + @c RE_FILE_NOT_FILE: Writting failed because the given file descriptor @c f is either non existen or not a file #if defined(RF_IAMHERE_FOR_DOXYGEN) i_DECLIMEX_ int32_t rfString_Fwrite(void* s,FILE* f,char encoding); #else i_DECLIMEX_ int32_t i_rfString_Fwrite(void* s,FILE* f,char* encoding); #ifdef RF_OPTION_DEFAULT_ARGUMENTS #define rfString_Fwrite(...) RF_SELECT_FUNC_IF_NARGGT(i_NPSELECT_RF_STRING_FWRITE,3,__VA_ARGS__) #define i_NPSELECT_RF_STRING_FWRITE1(...) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\"") #define i_NPSELECT_RF_STRING_FWRITE0(...) RF_SELECT_FUNC(i_SELECT_RF_STRING_FWRITE,__VA_ARGS__) #define i_SELECT_RF_STRING_FWRITE3(i_STR_,i_FILE_,i_ENCODING_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(i_ENCODING_)) #define i_SELECT_RF_STRING_FWRITE2(i_STR_,i_FILE_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(RF_UTF8)) #define i_SELECT_RF_STRING_FWRITE1(i_STR_,i_FILE_) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\"") #define i_SELECT_RF_STRING_FWRITE0(i_STR_,i_FILE_) RF_COMPILE_ERROR("message \"Illegal Arguments Number: Function rfString_Fwrite() accepts from 2 to 3 arguments\"") #else #define rfString_Fwrite_fUTF8(i_STR_,i_FILE_,i_ENCODING_) i_rfLMSX_WRAP3(int32_t,i_rfString_Fwrite,i_STR_,i_FILE_,i_RFI8_(i_ENCODING_)) #endif #endif // @} // closing the String File I/o functions #ifdef __cplusplus }// closing bracket for calling from C++ #endif #else // end of the strings module include #error Attempted to include Refu String manipulation with the String module flag off. Rebuild the library with that option added if you need to include them #endif #endif// include guards end ================================================ FILE: samples/C/rpc.h ================================================ // Copyright (C) 2013 Simon Que // // This file is part of DuinoCube. // // DuinoCube is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // DuinoCube is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with DuinoCube. If not, see . // DuinoCube remote procedure call functions. #include // Initializes RPC system. void rpc_init(); // Runs the RPC server loop forever. void rpc_server_loop(); ================================================ FILE: samples/C/scheduler.h ================================================ #pragma once /* Copyright © 2011 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #include #define SCHEDULER_MAXNAME 256 #define SCHEDULER_TASK_PATH_MAX 256 // Single linked list typedef struct task { uint32_t pid; char name[SCHEDULER_MAXNAME]; struct task *parent; cpu_state_t* state; struct task* next; struct task* previous; void* stack; void* entry; struct vmem_context *memory_context; // Current task state enum { TASK_STATE_KILLED, TASK_STATE_TERMINATED, TASK_STATE_BLOCKING, TASK_STATE_STOPPED, TASK_STATE_RUNNING } task_state; char** environ; char** argv; int argc; // TODO Is this actually the same as PATH_MAX in our toolchain? char cwd[SCHEDULER_TASK_PATH_MAX + 1]; } task_t; int scheduler_state; task_t* scheduler_new(void* entry, task_t* parent, char name[SCHEDULER_MAXNAME], char** environ, char** argv, int argc, struct vmem_context* memory_context, bool map_structs); void scheduler_add(task_t *task); void scheduler_terminate_current(); task_t* scheduler_get_current(); task_t* scheduler_select(cpu_state_t* lastRegs); void scheduler_init(); void scheduler_yield(); void scheduler_remove(task_t *t); task_t* scheduler_fork(task_t* to_fork, cpu_state_t* state); ================================================ FILE: samples/C/script ================================================ #!/usr/bin/tcc -run -lm // // ZyklonB scripting plugin, using a custom stack-based language // // Copyright 2014 Přemysl Janouch. All rights reserved. // See the file LICENSE for licensing information. // // Just compile this file as usual (sans #!) if you don't feel like using TCC. // It is a very basic and portable C99 application. It's not supposed to be // very sophisticated, for it'd get extremely big. // // The main influences of the language were Factor and Joy, stripped of all // even barely complex stuff. In its current state, it's only really useful as // a calculator but it's got great potential for extending. // // If you don't like something, just change it; this is just an experiment. // // NOTE: it is relatively easy to abuse. Be careful. // #define _XOPEN_SOURCE 500 #include #include #include #include #include #include #include #include #include #include #include #define ADDRESS_SPACE_LIMIT (100 * 1024 * 1024) #include #if defined __GNUC__ #define ATTRIBUTE_PRINTF(x, y) __attribute__ ((format (printf, x, y))) #else // ! __GNUC__ #define ATTRIBUTE_PRINTF(x, y) #endif // ! __GNUC__ #define N_ELEMENTS(a) (sizeof (a) / sizeof ((a)[0])) // --- Utilities --------------------------------------------------------------- static char *strdup_printf (const char *format, ...) ATTRIBUTE_PRINTF (1, 2); static char * strdup_vprintf (const char *format, va_list ap) { va_list aq; va_copy (aq, ap); int size = vsnprintf (NULL, 0, format, aq); va_end (aq); if (size < 0) return NULL; char buf[size + 1]; size = vsnprintf (buf, sizeof buf, format, ap); if (size < 0) return NULL; return strdup (buf); } static char * strdup_printf (const char *format, ...) { va_list ap; va_start (ap, format); char *result = strdup_vprintf (format, ap); va_end (ap); return result; } // --- Generic buffer ---------------------------------------------------------- struct buffer { char *s; ///< Buffer data size_t alloc; ///< Number of bytes allocated size_t len; ///< Number of bytes used bool memory_failure; ///< Memory allocation failed }; #define BUFFER_INITIALIZER { NULL, 0, 0, false } static bool buffer_append (struct buffer *self, const void *s, size_t n) { if (self->memory_failure) return false; if (!self->s) self->s = malloc (self->alloc = 8); while (self->len + n > self->alloc) self->s = realloc (self->s, self->alloc <<= 1); if (!self->s) { self->memory_failure = true; return false; } memcpy (self->s + self->len, s, n); self->len += n; return true; } inline static bool buffer_append_c (struct buffer *self, char c) { return buffer_append (self, &c, 1); } // --- Data types -------------------------------------------------------------- enum item_type { ITEM_STRING, ITEM_WORD, ITEM_INTEGER, ITEM_FLOAT, ITEM_LIST }; struct item { #define ITEM_HEADER \ enum item_type type; /**< The type of this object */ \ struct item *next; /**< Next item on the list/stack */ ITEM_HEADER }; struct item_string { ITEM_HEADER size_t len; ///< Length of the string (sans '\0') char value[]; ///< The null-terminated string value }; #define get_string(item) \ (assert ((item)->type == ITEM_STRING), \ ((struct item_string *)(item))->value) /// It looks like a string but it doesn't quack like a string #define item_word item_string #define get_word(item) \ (assert ((item)->type == ITEM_WORD), \ ((struct item_word *)(item))->value) struct item_integer { ITEM_HEADER long long value; ///< The integer value }; #define get_integer(item) \ (assert ((item)->type == ITEM_INTEGER), \ ((struct item_integer *)(item))->value) struct item_float { ITEM_HEADER long double value; ///< The floating point value }; #define get_float(item) \ (assert ((item)->type == ITEM_FLOAT), \ ((struct item_float *)(item))->value) struct item_list { ITEM_HEADER struct item *head; ///< The head of the list }; #define get_list(item) \ (assert ((item)->type == ITEM_LIST), \ ((struct item_list *)(item))->head) #define set_list(item, head_) \ (assert ((item)->type == ITEM_LIST), \ item_free_list (((struct item_list *)(item))->head), \ ((struct item_list *)(item))->head = (head_)) const char * item_type_to_str (enum item_type type) { switch (type) { case ITEM_STRING: return "string"; case ITEM_WORD: return "word"; case ITEM_INTEGER: return "integer"; case ITEM_FLOAT: return "float"; case ITEM_LIST: return "list"; } abort (); } // --- Item management --------------------------------------------------------- static void item_free_list (struct item *); static struct item *new_clone_list (const struct item *); static void item_free (struct item *item) { if (item->type == ITEM_LIST) item_free_list (get_list (item)); free (item); } static void item_free_list (struct item *item) { while (item) { struct item *link = item; item = item->next; item_free (link); } } static struct item * new_clone (const struct item *item) { size_t size; switch (item->type) { case ITEM_STRING: case ITEM_WORD: { const struct item_string *x = (const struct item_string *) item; size = sizeof *x + x->len + 1; break; } case ITEM_INTEGER: size = sizeof (struct item_integer); break; case ITEM_FLOAT: size = sizeof (struct item_float); break; case ITEM_LIST: size = sizeof (struct item_list); break; } struct item *clone = malloc (size); if (!clone) return NULL; memcpy (clone, item, size); if (item->type == ITEM_LIST) { struct item_list *x = (struct item_list *) clone; if (x->head && !(x->head = new_clone_list (x->head))) { free (clone); return NULL; } } clone->next = NULL; return clone; } static struct item * new_clone_list (const struct item *item) { struct item *head = NULL, *clone; for (struct item **out = &head; item; item = item->next) { if (!(clone = *out = new_clone (item))) { item_free_list (head); return NULL; } clone->next = NULL; out = &clone->next; } return head; } static struct item * new_string (const char *s, ssize_t len) { if (len < 0) len = strlen (s); struct item_string *item = calloc (1, sizeof *item + len + 1); if (!item) return NULL; item->type = ITEM_STRING; item->len = len; memcpy (item->value, s, len); item->value[len] = '\0'; return (struct item *) item; } static struct item * new_word (const char *s, ssize_t len) { struct item *item = new_string (s, len); if (!item) return NULL; item->type = ITEM_WORD; return item; } static struct item * new_integer (long long value) { struct item_integer *item = calloc (1, sizeof *item); if (!item) return NULL; item->type = ITEM_INTEGER; item->value = value; return (struct item *) item; } static struct item * new_float (long double value) { struct item_float *item = calloc (1, sizeof *item); if (!item) return NULL; item->type = ITEM_FLOAT; item->value = value; return (struct item *) item; } static struct item * new_list (struct item *head) { struct item_list *item = calloc (1, sizeof *item); if (!item) return NULL; item->type = ITEM_LIST; item->head = head; return (struct item *) item; } // --- Parsing ----------------------------------------------------------------- #define PARSE_ERROR_TABLE(XX) \ XX( OK, NULL ) \ XX( EOF, "unexpected end of input" ) \ XX( INVALID_HEXA_ESCAPE, "invalid hexadecimal escape sequence" ) \ XX( INVALID_ESCAPE, "unrecognized escape sequence" ) \ XX( MEMORY, "memory allocation failure" ) \ XX( FLOAT_RANGE, "floating point value out of range" ) \ XX( INTEGER_RANGE, "integer out of range" ) \ XX( INVALID_INPUT, "invalid input" ) \ XX( UNEXPECTED_INPUT, "unexpected input" ) enum tokenizer_error { #define XX(x, y) PARSE_ERROR_ ## x, PARSE_ERROR_TABLE (XX) #undef XX PARSE_ERROR_COUNT }; struct tokenizer { const char *cursor; enum tokenizer_error error; }; static bool decode_hexa_escape (struct tokenizer *self, struct buffer *buf) { int i; char c, code = 0; for (i = 0; i < 2; i++) { c = tolower (*self->cursor); if (c >= '0' && c <= '9') code = (code << 4) | (c - '0'); else if (c >= 'a' && c <= 'f') code = (code << 4) | (c - 'a' + 10); else break; self->cursor++; } if (!i) return false; buffer_append_c (buf, code); return true; } static bool decode_octal_escape (struct tokenizer *self, struct buffer *buf) { int i; char c, code = 0; for (i = 0; i < 3; i++) { c = *self->cursor; if (c < '0' || c > '7') break; code = (code << 3) | (c - '0'); self->cursor++; } if (!i) return false; buffer_append_c (buf, code); return true; } static bool decode_escape_sequence (struct tokenizer *self, struct buffer *buf) { // Support some basic escape sequences from the C language char c; switch ((c = *self->cursor)) { case '\0': self->error = PARSE_ERROR_EOF; return false; case 'x': case 'X': self->cursor++; if (decode_hexa_escape (self, buf)) return true; self->error = PARSE_ERROR_INVALID_HEXA_ESCAPE; return false; default: if (decode_octal_escape (self, buf)) return true; self->cursor++; const char *from = "abfnrtv\"\\", *to = "\a\b\f\n\r\t\v\"\\", *x; if ((x = strchr (from, c))) { buffer_append_c (buf, to[x - from]); return true; } self->error = PARSE_ERROR_INVALID_ESCAPE; return false; } } static struct item * parse_string (struct tokenizer *self) { struct buffer buf = BUFFER_INITIALIZER; struct item *item = NULL; char c; while (true) switch ((c = *self->cursor++)) { case '\0': self->cursor--; self->error = PARSE_ERROR_EOF; goto end; case '"': if (buf.memory_failure || !(item = new_string (buf.s, buf.len))) self->error = PARSE_ERROR_MEMORY; goto end; case '\\': if (decode_escape_sequence (self, &buf)) break; goto end; default: buffer_append_c (&buf, c); } end: free (buf.s); return item; } static struct item * try_parse_number (struct tokenizer *self) { // These two standard library functions can digest a lot of various inputs, // including NaN and +/- infinity. That may get a bit confusing. char *float_end; errno = 0; long double float_value = strtold (self->cursor, &float_end); int float_errno = errno; char *int_end; errno = 0; long long int_value = strtoll (self->cursor, &int_end, 10); int int_errno = errno; // If they both fail, then this is most probably not a number. if (float_end == int_end && float_end == self->cursor) return NULL; // Only use the floating point result if it parses more characters: struct item *item; if (float_end > int_end) { if (float_errno == ERANGE) { self->error = PARSE_ERROR_FLOAT_RANGE; return NULL; } self->cursor = float_end; if (!(item = new_float (float_value))) self->error = PARSE_ERROR_MEMORY; return item; } else { if (int_errno == ERANGE) { self->error = PARSE_ERROR_INTEGER_RANGE; return NULL; } self->cursor = int_end; if (!(item = new_integer (int_value))) self->error = PARSE_ERROR_MEMORY; return item; } } static struct item * parse_word (struct tokenizer *self) { struct buffer buf = BUFFER_INITIALIZER; struct item *item = NULL; char c; // Here we accept almost anything that doesn't break the grammar while (!strchr (" []\"", (c = *self->cursor++)) && (unsigned char) c > ' ') buffer_append_c (&buf, c); self->cursor--; if (buf.memory_failure) self->error = PARSE_ERROR_MEMORY; else if (!buf.len) self->error = PARSE_ERROR_INVALID_INPUT; else if (!(item = new_word (buf.s, buf.len))) self->error = PARSE_ERROR_MEMORY; free (buf.s); return item; } static struct item *parse_item_list (struct tokenizer *); static struct item * parse_list (struct tokenizer *self) { struct item *list = parse_item_list (self); if (self->error) { assert (list == NULL); return NULL; } if (!*self->cursor) { self->error = PARSE_ERROR_EOF; item_free_list (list); return NULL; } assert (*self->cursor == ']'); self->cursor++; return new_list (list); } static struct item * parse_item (struct tokenizer *self) { char c; switch ((c = *self->cursor++)) { case '[': return parse_list (self); case '"': return parse_string (self); default:; } self->cursor--; struct item *item = try_parse_number (self); if (!item && !self->error) item = parse_word (self); return item; } static struct item * parse_item_list (struct tokenizer *self) { struct item *head = NULL; struct item **tail = &head; char c; bool expected = true; while ((c = *self->cursor) && c != ']') { if (isspace (c)) { self->cursor++; expected = true; continue; } else if (!expected) { self->error = PARSE_ERROR_UNEXPECTED_INPUT; goto fail; } if (!(*tail = parse_item (self))) goto fail; tail = &(*tail)->next; expected = false; } return head; fail: item_free_list (head); return NULL; } static struct item * parse (const char *s, const char **error) { struct tokenizer self = { .cursor = s, .error = PARSE_ERROR_OK }; struct item *list = parse_item_list (&self); if (!self.error && *self.cursor != '\0') { self.error = PARSE_ERROR_UNEXPECTED_INPUT; item_free_list (list); list = NULL; } #define XX(x, y) y, static const char *strings[PARSE_ERROR_COUNT] = { PARSE_ERROR_TABLE (XX) }; #undef XX static char error_buf[128]; if (self.error && error) { snprintf (error_buf, sizeof error_buf, "at character %d: %s", (int) (self.cursor - s) + 1, strings[self.error]); *error = error_buf; } return list; } // --- Runtime ----------------------------------------------------------------- // TODO: try to think of a _simple_ way to do preemptive multitasking struct context { struct item *stack; ///< The current top of the stack size_t stack_size; ///< Number of items on the stack size_t reduction_count; ///< # of function calls so far size_t reduction_limit; ///< The hard limit on function calls char *error; ///< Error information bool error_is_fatal; ///< Whether the error can be catched bool memory_failure; ///< Memory allocation failure void *user_data; ///< User data }; /// Internal handler for a function typedef bool (*handler_fn) (struct context *); struct fn { struct fn *next; ///< The next link in the chain handler_fn handler; ///< Internal C handler, or NULL struct item *script; ///< Alternatively runtime code char name[]; ///< The name of the function }; struct fn *g_functions; ///< Maps words to functions static void context_init (struct context *ctx) { ctx->stack = NULL; ctx->stack_size = 0; ctx->reduction_count = 0; ctx->reduction_limit = 2000; ctx->error = NULL; ctx->error_is_fatal = false; ctx->memory_failure = false; ctx->user_data = NULL; } static void context_free (struct context *ctx) { item_free_list (ctx->stack); ctx->stack = NULL; free (ctx->error); ctx->error = NULL; } static bool set_error (struct context *ctx, const char *format, ...) { free (ctx->error); va_list ap; va_start (ap, format); ctx->error = strdup_vprintf (format, ap); va_end (ap); if (!ctx->error) ctx->memory_failure = true; return false; } static bool push (struct context *ctx, struct item *item) { // The `item' is typically a result from new_(), thus when it is null, // that function must have failed. This is a shortcut for convenience. if (!item) { ctx->memory_failure = true; return false; } assert (item->next == NULL); item->next = ctx->stack; ctx->stack = item; ctx->stack_size++; return true; } static bool bump_reductions (struct context *ctx) { if (++ctx->reduction_count >= ctx->reduction_limit) { ctx->error_is_fatal = true; return set_error (ctx, "reduction limit reached"); } return true; } static bool execute (struct context *, struct item *); static bool call_function (struct context *ctx, const char *name) { struct fn *iter; for (iter = g_functions; iter; iter = iter->next) if (!strcmp (name, iter->name)) goto found; return set_error (ctx, "unknown function: %s", name); found: if (!bump_reductions (ctx)) return false; if (iter->handler ? iter->handler (ctx) : execute (ctx, iter->script)) return true; // In this case, `error' is NULL if (ctx->memory_failure) return false; // This creates some form of a stack trace char *tmp = ctx->error; ctx->error = NULL; set_error (ctx, "%s -> %s", name, tmp); free (tmp); return false; } static void free_function (struct fn *fn) { item_free_list (fn->script); free (fn); } static void unregister_function (const char *name) { for (struct fn **iter = &g_functions; *iter; iter = &(*iter)->next) if (!strcmp ((*iter)->name, name)) { struct fn *tmp = *iter; *iter = tmp->next; free_function (tmp); break; } } static struct fn * prepend_new_fn (const char *name) { struct fn *fn = calloc (1, sizeof *fn + strlen (name) + 1); if (!fn) return NULL; strcpy (fn->name, name); fn->next = g_functions; return g_functions = fn; } static bool register_handler (const char *name, handler_fn handler) { unregister_function (name); struct fn *fn = prepend_new_fn (name); if (!fn) return false; fn->handler = handler; return true; } static bool register_script (const char *name, struct item *script) { unregister_function (name); struct fn *fn = prepend_new_fn (name); if (!fn) return false; fn->script = script; return true; } static bool execute (struct context *ctx, struct item *script) { for (; script; script = script->next) { if (script->type != ITEM_WORD) { if (!bump_reductions (ctx) || !push (ctx, new_clone (script))) return false; } else if (!call_function (ctx, get_word (script))) return false; } return true; } // --- Runtime library --------------------------------------------------------- #define defn(name) static bool name (struct context *ctx) #define check_stack(n) \ if (ctx->stack_size < n) { \ set_error (ctx, "stack underflow"); \ return 0; \ } inline static bool check_stack_safe (struct context *ctx, size_t n) { check_stack (n); return true; } static bool check_type (struct context *ctx, const void *item_, enum item_type type) { const struct item *item = item_; if (item->type == type) return true; return set_error (ctx, "invalid type: expected `%s', got `%s'", item_type_to_str (type), item_type_to_str (item->type)); } static struct item * pop (struct context *ctx) { check_stack (1); struct item *top = ctx->stack; ctx->stack = top->next; top->next = NULL; ctx->stack_size--; return top; } // - - Types - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - #define defn_is_type(name, item_type) \ defn (fn_is_##name) { \ check_stack (1); \ struct item *top = pop (ctx); \ push (ctx, new_integer (top->type == (item_type))); \ item_free (top); \ return true; \ } defn_is_type (string, ITEM_STRING) defn_is_type (word, ITEM_WORD) defn_is_type (integer, ITEM_INTEGER) defn_is_type (float, ITEM_FLOAT) defn_is_type (list, ITEM_LIST) defn (fn_to_string) { check_stack (1); struct item *item = pop (ctx); char *value; switch (item->type) { case ITEM_WORD: item->type = ITEM_STRING; case ITEM_STRING: return push (ctx, item); case ITEM_FLOAT: value = strdup_printf ("%Lf", get_float (item)); break; case ITEM_INTEGER: value = strdup_printf ("%lld", get_integer (item)); break; default: set_error (ctx, "cannot convert `%s' to `%s'", item_type_to_str (item->type), item_type_to_str (ITEM_STRING)); item_free (item); return false; } item_free (item); if (!value) { ctx->memory_failure = true; return false; } item = new_string (value, -1); free (value); return push (ctx, item); } defn (fn_to_integer) { check_stack (1); struct item *item = pop (ctx); long long value; switch (item->type) { case ITEM_INTEGER: return push (ctx, item); case ITEM_FLOAT: value = get_float (item); break; case ITEM_STRING: { char *end; const char *s = get_string (item); value = strtoll (s, &end, 10); if (end != s && *s == '\0') break; item_free (item); return set_error (ctx, "integer conversion error"); } default: set_error (ctx, "cannot convert `%s' to `%s'", item_type_to_str (item->type), item_type_to_str (ITEM_INTEGER)); item_free (item); return false; } item_free (item); return push (ctx, new_integer (value)); } defn (fn_to_float) { check_stack (1); struct item *item = pop (ctx); long double value; switch (item->type) { case ITEM_FLOAT: return push (ctx, item); case ITEM_INTEGER: value = get_integer (item); break; case ITEM_STRING: { char *end; const char *s = get_string (item); value = strtold (s, &end); if (end != s && *s == '\0') break; item_free (item); return set_error (ctx, "float conversion error"); } default: set_error (ctx, "cannot convert `%s' to `%s'", item_type_to_str (item->type), item_type_to_str (ITEM_FLOAT)); item_free (item); return false; } item_free (item); return push (ctx, new_float (value)); } // - - Miscellaneous - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - defn (fn_length) { check_stack (1); struct item *item = pop (ctx); bool success = true; switch (item->type) { case ITEM_STRING: success = push (ctx, new_integer (((struct item_string *) item)->len)); break; case ITEM_LIST: { long long length = 0; struct item *iter; for (iter = get_list (item); iter; iter = iter->next) length++; success = push (ctx, new_integer (length)); break; } default: success = set_error (ctx, "invalid type"); } item_free (item); return success; } // - - Stack operations - - - - - - - - - - - - - - - - - - - - - - - - - - - - defn (fn_dup) { check_stack (1); return push (ctx, new_clone (ctx->stack)); } defn (fn_drop) { check_stack (1); item_free (pop (ctx)); return true; } defn (fn_swap) { check_stack (2); struct item *second = pop (ctx), *first = pop (ctx); return push (ctx, second) && push (ctx, first); } defn (fn_call) { check_stack (1); struct item *script = pop (ctx); bool success = check_type (ctx, script, ITEM_LIST) && execute (ctx, get_list (script)); item_free (script); return success; } defn (fn_dip) { check_stack (2); struct item *script = pop (ctx); struct item *item = pop (ctx); bool success = check_type (ctx, script, ITEM_LIST) && execute (ctx, get_list (script)); item_free (script); if (!success) { item_free (item); return false; } return push (ctx, item); } defn (fn_unit) { check_stack (1); struct item *item = pop (ctx); return push (ctx, new_list (item)); } defn (fn_cons) { check_stack (2); struct item *list = pop (ctx); struct item *item = pop (ctx); if (!check_type (ctx, list, ITEM_LIST)) { item_free (list); item_free (item); return false; } item->next = get_list (list); ((struct item_list *) list)->head = item; return push (ctx, list); } defn (fn_cat) { check_stack (2); struct item *scnd = pop (ctx); struct item *frst = pop (ctx); if (!check_type (ctx, frst, ITEM_LIST) || !check_type (ctx, scnd, ITEM_LIST)) { item_free (frst); item_free (scnd); return false; } // XXX: we shouldn't have to do this in O(n) struct item **tail = &((struct item_list *) frst)->head; while (*tail) tail = &(*tail)->next; *tail = get_list (scnd); ((struct item_list *) scnd)->head = NULL; item_free (scnd); return push (ctx, frst); } defn (fn_uncons) { check_stack (1); struct item *list = pop (ctx); if (!check_type (ctx, list, ITEM_LIST)) goto fail; struct item *first = get_list (list); if (!first) { set_error (ctx, "list is empty"); goto fail; } ((struct item_list *) list)->head = first->next; first->next = NULL; return push (ctx, first) && push (ctx, list); fail: item_free (list); return false; } // - - Logical - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static bool to_boolean (struct context *ctx, struct item *item, bool *ok) { switch (item->type) { case ITEM_STRING: return *get_string (item) != '\0'; case ITEM_INTEGER: return get_integer (item) != 0; case ITEM_FLOAT: return get_float (item) != 0.; default: return (*ok = set_error (ctx, "cannot convert `%s' to boolean", item_type_to_str (item->type))); } } defn (fn_not) { check_stack (1); struct item *item = pop (ctx); bool ok = true; bool result = !to_boolean (ctx, item, &ok); item_free (item); return ok && push (ctx, new_integer (result)); } defn (fn_and) { check_stack (2); struct item *op1 = pop (ctx); struct item *op2 = pop (ctx); bool ok = true; bool result = to_boolean (ctx, op1, &ok) && to_boolean (ctx, op2, &ok); item_free (op1); item_free (op2); return ok && push (ctx, new_integer (result)); } defn (fn_or) { check_stack (2); struct item *op1 = pop (ctx); struct item *op2 = pop (ctx); bool ok = true; bool result = to_boolean (ctx, op1, &ok) || !ok || to_boolean (ctx, op2, &ok); item_free (op1); item_free (op2); return ok && push (ctx, new_integer (result)); } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - defn (fn_if) { check_stack (3); struct item *else_ = pop (ctx); struct item *then_ = pop (ctx); struct item *cond_ = pop (ctx); bool ok = true; bool condition = to_boolean (ctx, cond_, &ok); item_free (cond_); bool success = false; if (ok && check_type (ctx, then_, ITEM_LIST) && check_type (ctx, else_, ITEM_LIST)) success = execute (ctx, condition ? get_list (then_) : get_list (else_)); item_free (then_); item_free (else_); return success; } defn (fn_try) { check_stack (2); struct item *catch = pop (ctx); struct item *try = pop (ctx); bool success = false; if (!check_type (ctx, try, ITEM_LIST) || !check_type (ctx, catch, ITEM_LIST)) goto fail; if (!execute (ctx, get_list (try))) { if (ctx->memory_failure || ctx->error_is_fatal) goto fail; success = push (ctx, new_string (ctx->error, -1)); free (ctx->error); ctx->error = NULL; if (success) success = execute (ctx, get_list (catch)); } fail: item_free (try); item_free (catch); return success; } defn (fn_map) { check_stack (2); struct item *fn = pop (ctx); struct item *list = pop (ctx); if (!check_type (ctx, fn, ITEM_LIST) || !check_type (ctx, list, ITEM_LIST)) { item_free (fn); item_free (list); return false; } bool success = false; struct item *result = NULL, **tail = &result; for (struct item *iter = get_list (list); iter; iter = iter->next) { if (!push (ctx, new_clone (iter)) || !execute (ctx, get_list (fn)) || !check_stack_safe (ctx, 1)) goto fail; struct item *item = pop (ctx); *tail = item; tail = &item->next; } success = true; fail: set_list (list, result); item_free (fn); if (!success) { item_free (list); return false; } return push (ctx, list); } defn (fn_filter) { check_stack (2); struct item *fn = pop (ctx); struct item *list = pop (ctx); if (!check_type (ctx, fn, ITEM_LIST) || !check_type (ctx, list, ITEM_LIST)) { item_free (fn); item_free (list); return false; } bool success = false; bool ok = true; struct item *result = NULL, **tail = &result; for (struct item *iter = get_list (list); iter; iter = iter->next) { if (!push (ctx, new_clone (iter)) || !execute (ctx, get_list (fn)) || !check_stack_safe (ctx, 1)) goto fail; struct item *item = pop (ctx); bool survived = to_boolean (ctx, item, &ok); item_free (item); if (!ok) goto fail; if (!survived) continue; if (!(item = new_clone (iter))) goto fail; *tail = item; tail = &item->next; } success = true; fail: set_list (list, result); item_free (fn); if (!success) { item_free (list); return false; } return push (ctx, list); } defn (fn_fold) { check_stack (3); struct item *op = pop (ctx); struct item *null = pop (ctx); struct item *list = pop (ctx); bool success = false; if (!check_type (ctx, op, ITEM_LIST) || !check_type (ctx, list, ITEM_LIST)) { item_free (null); goto fail; } push (ctx, null); for (struct item *iter = get_list (list); iter; iter = iter->next) if (!push (ctx, new_clone (iter)) || !execute (ctx, get_list (op))) goto fail; success = true; fail: item_free (op); item_free (list); return success; } defn (fn_each) { check_stack (2); struct item *op = pop (ctx); struct item *list = pop (ctx); bool success = false; if (!check_type (ctx, op, ITEM_LIST) || !check_type (ctx, list, ITEM_LIST)) goto fail; for (struct item *iter = get_list (list); iter; iter = iter->next) if (!push (ctx, new_clone (iter)) || !execute (ctx, get_list (op))) goto fail; success = true; fail: item_free (op); item_free (list); return success; } // - - Arithmetic - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // XXX: why not a `struct item_string *` argument? static bool push_repeated_string (struct context *ctx, struct item *op1, struct item *op2) { struct item_string *string = (struct item_string *) op1; struct item_integer *repeat = (struct item_integer *) op2; assert (string->type == ITEM_STRING); assert (repeat->type == ITEM_INTEGER); if (repeat->value < 0) return set_error (ctx, "cannot multiply a string by a negative value"); char *buf = NULL; size_t len = string->len * repeat->value; if (len < string->len && repeat->value != 0) goto allocation_fail; buf = malloc (len); if (!buf) goto allocation_fail; for (size_t i = 0; i < len; i += string->len) memcpy (buf + i, string->value, string->len); struct item *item = new_string (buf, len); free (buf); return push (ctx, item); allocation_fail: ctx->memory_failure = true; return false; } defn (fn_times) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_integer (op1) * get_integer (op2))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_integer (op1) * get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_float (op1) * get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_float (get_float (op1) * get_integer (op2))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_STRING) ok = push_repeated_string (ctx, op2, op1); else if (op1->type == ITEM_STRING && op2->type == ITEM_INTEGER) ok = push_repeated_string (ctx, op1, op2); else ok = set_error (ctx, "cannot multiply `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } defn (fn_pow) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) // TODO: implement this properly, outputting an integer ok = push (ctx, new_float (powl (get_integer (op1), get_integer (op2)))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (powl (get_integer (op1), get_float (op2)))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (powl (get_float (op1), get_float (op2)))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_float (powl (get_float (op1), get_integer (op2)))); else ok = set_error (ctx, "cannot exponentiate `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } defn (fn_div) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) { if (get_integer (op2) == 0) ok = set_error (ctx, "division by zero"); else ok = push (ctx, new_integer (get_integer (op1) / get_integer (op2))); } else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_integer (op1) / get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_float (op1) / get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_float (get_float (op1) / get_integer (op2))); else ok = set_error (ctx, "cannot divide `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } defn (fn_mod) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) { if (get_integer (op2) == 0) ok = set_error (ctx, "division by zero"); else ok = push (ctx, new_integer (get_integer (op1) % get_integer (op2))); } else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (fmodl (get_integer (op1), get_float (op2)))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (fmodl (get_float (op1), get_float (op2)))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_float (fmodl (get_float (op1), get_integer (op2)))); else ok = set_error (ctx, "cannot divide `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } static bool push_concatenated_string (struct context *ctx, struct item *op1, struct item *op2) { struct item_string *s1 = (struct item_string *) op1; struct item_string *s2 = (struct item_string *) op2; assert (s1->type == ITEM_STRING); assert (s2->type == ITEM_STRING); char *buf = NULL; size_t len = s1->len + s2->len; if (len < s1->len || len < s2->len) goto allocation_fail; buf = malloc (len); if (!buf) goto allocation_fail; memcpy (buf, s1->value, s1->len); memcpy (buf + s1->len, s2->value, s2->len); struct item *item = new_string (buf, len); free (buf); return push (ctx, item); allocation_fail: ctx->memory_failure = true; return false; } defn (fn_plus) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_integer (op1) + get_integer (op2))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_integer (op1) + get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_float (op1) + get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_float (get_float (op1) + get_integer (op2))); else if (op1->type == ITEM_STRING && op2->type == ITEM_STRING) ok = push_concatenated_string (ctx, op1, op2); else ok = set_error (ctx, "cannot add `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } defn (fn_minus) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_integer (op1) - get_integer (op2))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_integer (op1) - get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_float (get_float (op1) - get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_float (get_float (op1) - get_integer (op2))); else ok = set_error (ctx, "cannot subtract `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } // - - Comparison - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static int compare_strings (struct item_string *s1, struct item_string *s2) { // XXX: not entirely correct wrt. null bytes size_t len = (s1->len < s2->len ? s1->len : s2->len) + 1; return memcmp (s1->value, s2->value, len); } static bool compare_lists (struct item *, struct item *); static bool compare_list_items (struct item *op1, struct item *op2) { if (op1->type != op2->type) return false; switch (op1->type) { case ITEM_STRING: case ITEM_WORD: return !compare_strings ((struct item_string *) op1, (struct item_string *) op2); case ITEM_FLOAT: return get_float (op1) == get_float (op2); case ITEM_INTEGER: return get_integer (op1) == get_integer (op2); case ITEM_LIST: return compare_lists (get_list (op1), get_list (op2)); } abort (); } static bool compare_lists (struct item *op1, struct item *op2) { while (op1 && op2) { if (!compare_list_items (op1, op2)) return false; op1 = op1->next; op2 = op2->next; } return !op1 && !op2; } defn (fn_eq) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_integer (op1) == get_integer (op2))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_integer (get_integer (op1) == get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_integer (get_float (op1) == get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_float (op1) == get_integer (op2))); else if (op1->type == ITEM_LIST && op2->type == ITEM_LIST) ok = push (ctx, new_integer (compare_lists (get_list (op1), get_list (op2)))); else if (op1->type == ITEM_STRING && op2->type == ITEM_STRING) ok = push (ctx, new_integer (compare_strings ((struct item_string *)(op1), (struct item_string *)(op2)) == 0)); else ok = set_error (ctx, "cannot compare `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } defn (fn_lt) { check_stack (2); struct item *op2 = pop (ctx); struct item *op1 = pop (ctx); bool ok; if (op1->type == ITEM_INTEGER && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_integer (op1) < get_integer (op2))); else if (op1->type == ITEM_INTEGER && op2->type == ITEM_FLOAT) ok = push (ctx, new_integer (get_integer (op1) < get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_FLOAT) ok = push (ctx, new_integer (get_float (op1) < get_float (op2))); else if (op1->type == ITEM_FLOAT && op2->type == ITEM_INTEGER) ok = push (ctx, new_integer (get_float (op1) < get_integer (op2))); else if (op1->type == ITEM_STRING && op2->type == ITEM_STRING) ok = push (ctx, new_integer (compare_strings ((struct item_string *)(op1), (struct item_string *)(op2)) < 0)); else ok = set_error (ctx, "cannot compare `%s' and `%s'", item_type_to_str (op1->type), item_type_to_str (op2->type)); item_free (op1); item_free (op2); return ok; } // - - Utilities - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - defn (fn_rand) { return push (ctx, new_float ((long double) rand () / ((long double) RAND_MAX + 1))); } defn (fn_time) { return push (ctx, new_integer (time (NULL))); } // XXX: this is a bit too constrained; combines strftime() with gmtime() defn (fn_strftime) { check_stack (2); struct item *format = pop (ctx); struct item *time_ = pop (ctx); bool success = false; if (!check_type (ctx, time_, ITEM_INTEGER) || !check_type (ctx, format, ITEM_STRING)) goto fail; if (get_integer (time_) < 0) { set_error (ctx, "invalid time value"); goto fail; } char buf[128]; time_t time__ = get_integer (time_); struct tm tm; gmtime_r (&time__, &tm); buf[strftime (buf, sizeof buf, get_string (format), &tm)] = '\0'; success = push (ctx, new_string (buf, -1)); fail: item_free (time_); item_free (format); return success; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - static void item_list_to_str (const struct item *, struct buffer *); static void string_to_str (const struct item_string *string, struct buffer *buf) { buffer_append_c (buf, '"'); for (size_t i = 0; i < string->len; i++) { char c = string->value[i]; if (c == '\n') buffer_append (buf, "\\n", 2); else if (c == '\r') buffer_append (buf, "\\r", 2); else if (c == '\t') buffer_append (buf, "\\t", 2); else if (!isprint (c)) { char tmp[8]; snprintf (tmp, sizeof tmp, "\\x%02x", (unsigned char) c); buffer_append (buf, tmp, strlen (tmp)); } else if (c == '\\') buffer_append (buf, "\\\\", 2); else if (c == '"') buffer_append (buf, "\\\"", 2); else buffer_append_c (buf, c); } buffer_append_c (buf, '"'); } static void item_to_str (const struct item *item, struct buffer *buf) { switch (item->type) { char *x; case ITEM_STRING: string_to_str ((struct item_string *) item, buf); break; case ITEM_WORD: { struct item_word *word = (struct item_word *) item; buffer_append (buf, word->value, word->len); break; } case ITEM_INTEGER: if (!(x = strdup_printf ("%lld", get_integer (item)))) goto alloc_failure; buffer_append (buf, x, strlen (x)); free (x); break; case ITEM_FLOAT: if (!(x = strdup_printf ("%Lf", get_float (item)))) goto alloc_failure; buffer_append (buf, x, strlen (x)); free (x); break; case ITEM_LIST: buffer_append_c (buf, '['); item_list_to_str (get_list (item), buf); buffer_append_c (buf, ']'); break; } return; alloc_failure: // This is a bit hackish but it simplifies stuff buf->memory_failure = true; free (buf->s); buf->s = NULL; } static void item_list_to_str (const struct item *script, struct buffer *buf) { if (!script) return; item_to_str (script, buf); while ((script = script->next)) { buffer_append_c (buf, ' '); item_to_str (script, buf); } } // --- IRC protocol ------------------------------------------------------------ struct message { char *prefix; ///< Message prefix char *command; ///< IRC command char *params[16]; ///< Command parameters (0-terminated) size_t n_params; ///< Number of parameters present }; inline static char * cut_word (char **s) { char *start = *s, *end = *s + strcspn (*s, " "); *s = end + strspn (end, " "); *end = '\0'; return start; } static bool parse_message (char *s, struct message *msg) { memset (msg, 0, sizeof *msg); // Ignore IRC 3.2 message tags, if present if (*s == '@') { s += strcspn (s, " "); s += strspn (s, " "); } // Prefix if (*s == ':') msg->prefix = cut_word (&s) + 1; // Command if (!*(msg->command = cut_word (&s))) return false; // Parameters while (*s) { size_t n = msg->n_params++; if (msg->n_params >= N_ELEMENTS (msg->params)) return false; if (*s == ':') { msg->params[n] = ++s; break; } msg->params[n] = cut_word (&s); } return true; } static struct message * read_message (void) { static bool discard = false; static char buf[1025]; static struct message msg; bool discard_this; do { if (!fgets (buf, sizeof buf, stdin)) return NULL; size_t len = strlen (buf); // Just to be on the safe side, if the line overflows our buffer, // ignore everything up until the next line. discard_this = discard; if (len >= 2 && !strcmp (buf + len - 2, "\r\n")) { buf[len -= 2] = '\0'; discard = false; } else discard = true; } // Invalid messages are silently ignored while (discard_this || !parse_message (buf, &msg)); return &msg; } // --- Interfacing with the bot ------------------------------------------------ #define BOT_PRINT "ZYKLONB print :script: " static const char * get_config (const char *key) { printf ("ZYKLONB get_config :%s\r\n", key); struct message *msg = read_message (); if (!msg || msg->n_params <= 0) exit (EXIT_FAILURE); return msg->params[0]; } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // TODO: implement more functions; try to avoid writing them in C static bool init_runtime_library_scripts (void) { bool ok = true; // It's much cheaper (and more fun) to define functions in terms of other // ones. The "unit tests" serve a secondary purpose of showing the usage. struct script { const char *name; ///< Name of the function const char *definition; ///< The defining script const char *unit_test; ///< Trivial unit test, must return 1 } scripts[] = { { "nip", "swap drop", "1 2 nip 2 =" }, { "over", "[dup] dip swap", "1 2 over nip nip 1 =" }, { "swons", "swap cons", "[2] 1 swons [1 2] =" }, { "first", "uncons drop", "[1 2 3] first 1 =" }, { "rest", "uncons swap drop", "[1 2 3] rest [2 3] =" }, { "reverse", "[] swap [swap cons] each", "[1 2] reverse [2 1] =" }, { "curry", "cons", "1 2 [+] curry call 3 =" }, { "xor", "not swap not + 1 =", "1 1 xor 0 =" }, { "min", "over over < [drop] [nip] if", "1 2 min 1 =" }, { "max", "over over > [drop] [nip] if", "1 2 max 2 =" }, { "all?", "[and] cat 1 swap fold", "[3 4 5] [> 3] all? 0 =" }, { "any?", "[or] cat 0 swap fold", "[3 4 5] [> 3] any? 1 =" }, { ">", "swap <", "1 2 > 0 =" }, { "!=", "= not", "1 2 != 1 =" }, { "<=", "> not", "1 2 <= 1 =" }, { ">=", "< not", "1 2 >= 0 =" }, // XXX: this is a bit crazy and does not work with an empty list { "join", "[uncons] dip swap [[dup] dip swap [+ +] dip] each drop", "[1 2 3] [>string] map \" -> \" join \"1 -> 2 -> 3\" =" }, }; for (size_t i = 0; i < N_ELEMENTS (scripts); i++) { const char *error = NULL; struct item *script = parse (scripts[i].definition, &error); if (error) { printf (BOT_PRINT "error parsing internal script `%s': %s\r\n", scripts[i].definition, error); ok = false; } else ok &= register_script (scripts[i].name, script); } struct context ctx; for (size_t i = 0; i < N_ELEMENTS (scripts); i++) { const char *error = NULL; struct item *script = parse (scripts[i].unit_test, &error); if (error) { printf (BOT_PRINT "error parsing unit test for `%s': %s\r\n", scripts[i].name, error); ok = false; continue; } context_init (&ctx); execute (&ctx, script); item_free_list (script); const char *failure = NULL; if (ctx.memory_failure) failure = "memory allocation failure"; else if (ctx.error) failure = ctx.error; else if (ctx.stack_size != 1) failure = "too many results on the stack"; else if (ctx.stack->type != ITEM_INTEGER) failure = "result is not an integer"; else if (get_integer (ctx.stack) != 1) failure = "wrong test result"; if (failure) { printf (BOT_PRINT "error executing unit test for `%s': %s\r\n", scripts[i].name, failure); ok = false; } context_free (&ctx); } return ok; } static bool init_runtime_library (void) { bool ok = true; // Type detection ok &= register_handler ("string?", fn_is_string); ok &= register_handler ("word?", fn_is_word); ok &= register_handler ("integer?", fn_is_integer); ok &= register_handler ("float?", fn_is_float); ok &= register_handler ("list?", fn_is_list); // Type conversion ok &= register_handler (">string", fn_to_string); ok &= register_handler (">integer", fn_to_integer); ok &= register_handler (">float", fn_to_float); // Miscellaneous ok &= register_handler ("length", fn_length); // Basic stack manipulation ok &= register_handler ("dup", fn_dup); ok &= register_handler ("drop", fn_drop); ok &= register_handler ("swap", fn_swap); // Calling stuff ok &= register_handler ("call", fn_call); ok &= register_handler ("dip", fn_dip); // Control flow ok &= register_handler ("if", fn_if); ok &= register_handler ("try", fn_try); // List processing ok &= register_handler ("map", fn_map); ok &= register_handler ("filter", fn_filter); ok &= register_handler ("fold", fn_fold); ok &= register_handler ("each", fn_each); // List manipulation ok &= register_handler ("unit", fn_unit); ok &= register_handler ("cons", fn_cons); ok &= register_handler ("cat", fn_cat); ok &= register_handler ("uncons", fn_uncons); // Arithmetic operations ok &= register_handler ("+", fn_plus); ok &= register_handler ("-", fn_minus); ok &= register_handler ("*", fn_times); ok &= register_handler ("^", fn_pow); ok &= register_handler ("/", fn_div); ok &= register_handler ("%", fn_mod); // Comparison ok &= register_handler ("=", fn_eq); ok &= register_handler ("<", fn_lt); // Logical operations ok &= register_handler ("not", fn_not); ok &= register_handler ("and", fn_and); ok &= register_handler ("or", fn_or); // Utilities ok &= register_handler ("rand", fn_rand); ok &= register_handler ("time", fn_time); ok &= register_handler ("strftime", fn_strftime); ok &= init_runtime_library_scripts (); return ok; } static void free_runtime_library (void) { struct fn *next, *iter; for (iter = g_functions; iter; iter = next) { next = iter->next; free_function (iter); } } // --- Function database ------------------------------------------------------- // TODO: a global variable storing the various procedures (db) // XXX: defining procedures would ideally need some kind of an ACL static void read_db (void) { // TODO } static void write_db (void) { // TODO } // --- Main -------------------------------------------------------------------- static char *g_prefix; struct user_info { char *ctx; ///< Context: channel or user char *ctx_quote; ///< Reply quotation }; defn (fn_dot) { check_stack (1); struct item *item = pop (ctx); struct user_info *info = ctx->user_data; struct buffer buf = BUFFER_INITIALIZER; item_to_str (item, &buf); item_free (item); buffer_append_c (&buf, '\0'); if (buf.memory_failure) { ctx->memory_failure = true; return false; } if (buf.len > 255) buf.s[255] = '\0'; printf ("PRIVMSG %s :%s%s\r\n", info->ctx, info->ctx_quote, buf.s); free (buf.s); return true; } static void process_message (struct message *msg) { if (!msg->prefix || strcasecmp (msg->command, "PRIVMSG") || msg->n_params < 2) return; char *line = msg->params[1]; // Filter out only our commands size_t prefix_len = strlen (g_prefix); if (strncmp (line, g_prefix, prefix_len)) return; line += prefix_len; char *command = cut_word (&line); if (strcasecmp (command, "script")) return; // Retrieve information on how to respond back char *msg_ctx = msg->prefix, *x; if ((x = strchr (msg_ctx, '!'))) *x = '\0'; char *msg_ctx_quote; if (strchr ("#+&!", *msg->params[0])) { msg_ctx_quote = strdup_printf ("%s: ", msg_ctx); msg_ctx = msg->params[0]; } else msg_ctx_quote = strdup (""); if (!msg_ctx_quote) { printf (BOT_PRINT "%s\r\n", "memory allocation failure"); return; } struct user_info info; info.ctx = msg_ctx; info.ctx_quote = msg_ctx_quote; // Finally parse and execute the macro const char *error = NULL; struct item *script = parse (line, &error); if (error) { printf ("PRIVMSG %s :%s%s: %s\r\n", msg_ctx, msg_ctx_quote, "parse error", error); goto end; } struct context ctx; context_init (&ctx); ctx.user_data = &info; execute (&ctx, script); item_free_list (script); const char *failure = NULL; if (ctx.memory_failure) failure = "memory allocation failure"; else if (ctx.error) failure = ctx.error; if (failure) printf ("PRIVMSG %s :%s%s: %s\r\n", msg_ctx, msg_ctx_quote, "runtime error", failure); context_free (&ctx); end: free (msg_ctx_quote); } int main (int argc, char *argv[]) { freopen (NULL, "rb", stdin); setvbuf (stdin, NULL, _IOLBF, BUFSIZ); freopen (NULL, "wb", stdout); setvbuf (stdout, NULL, _IOLBF, BUFSIZ); struct rlimit limit = { .rlim_cur = ADDRESS_SPACE_LIMIT, .rlim_max = ADDRESS_SPACE_LIMIT }; // Lower the memory limits to something sensible to prevent abuse (void) setrlimit (RLIMIT_AS, &limit); read_db (); if (!init_runtime_library () || !register_handler (".", fn_dot)) printf (BOT_PRINT "%s\r\n", "runtime library initialization failed"); g_prefix = strdup (get_config ("prefix")); printf ("ZYKLONB register\r\n"); struct message *msg; while ((msg = read_message ())) process_message (msg); free_runtime_library (); free (g_prefix); return 0; } ================================================ FILE: samples/C/sgd_fast.c ================================================ /* Generated by Cython 0.17.4 on Mon Jan 7 18:29:40 2013 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #elif PY_VERSION_HEX < 0x02040000 #error Cython requires Python 2.4+. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #ifndef Py_HUGE_VAL #define Py_HUGE_VAL HUGE_VAL #endif #ifdef PYPY_VERSION #define CYTHON_COMPILING_IN_PYPY 1 #define CYTHON_COMPILING_IN_CPYTHON 0 #else #define CYTHON_COMPILING_IN_PYPY 0 #define CYTHON_COMPILING_IN_CPYTHON 1 #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define CYTHON_FORMAT_SSIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) __Pyx_PyInt_AsInt(o) #define PyNumber_Index(o) ((PyNumber_Check(o) && !PyFloat_Check(o)) ? PyNumber_Int(o) : \ (PyErr_Format(PyExc_TypeError, \ "expected index value, got %.200s", Py_TYPE(o)->tp_name), \ (PyObject*)0)) #define __Pyx_PyIndex_Check(o) (PyNumber_Check(o) && !PyFloat_Check(o) && \ !PyComplex_Check(o)) #define PyIndex_Check __Pyx_PyIndex_Check #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #define __PYX_BUILD_PY_SSIZE_T "i" #else #define __PYX_BUILD_PY_SSIZE_T "n" #define CYTHON_FORMAT_SSIZE_T "z" #define __Pyx_PyIndex_Check PyIndex_Check #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #define PyBUF_RECORDS (PyBUF_STRIDES | PyBUF_FORMAT | PyBUF_WRITABLE) #define PyBUF_FULL (PyBUF_INDIRECT | PyBUF_FORMAT | PyBUF_WRITABLE) typedef int (*getbufferproc)(PyObject *, Py_buffer *, int); typedef void (*releasebufferproc)(PyObject *, Py_buffer *); #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #define __Pyx_PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) \ PyCode_New(a, k, l, s, f, code, c, n, v, fv, cell, fn, name, fline, lnos) #endif #if PY_MAJOR_VERSION < 3 && PY_MINOR_VERSION < 6 #define PyUnicode_FromString(s) PyUnicode_Decode(s, strlen(s), "UTF-8", "strict") #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_VERSION_HEX > 0x03030000 && defined(PyUnicode_KIND) #define CYTHON_PEP393_ENABLED 1 #define __Pyx_PyUnicode_READY(op) (likely(PyUnicode_IS_READY(op)) ? \ 0 : _PyUnicode_Ready((PyObject *)(op))) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_LENGTH(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) PyUnicode_READ_CHAR(u, i) #define __Pyx_PyUnicode_READ(k, d, i) PyUnicode_READ(k, d, i) #else #define CYTHON_PEP393_ENABLED 0 #define __Pyx_PyUnicode_READY(op) (0) #define __Pyx_PyUnicode_GET_LENGTH(u) PyUnicode_GET_SIZE(u) #define __Pyx_PyUnicode_READ_CHAR(u, i) ((Py_UCS4)(PyUnicode_AS_UNICODE(u)[i])) #define __Pyx_PyUnicode_READ(k, d, i) ((k=k), (Py_UCS4)(((Py_UNICODE*)d)[i])) #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_VERSION_HEX < 0x03020000 typedef long Py_hash_t; #define __Pyx_PyInt_FromHash_t PyInt_FromLong #define __Pyx_PyInt_AsHash_t PyInt_AsLong #else #define __Pyx_PyInt_FromHash_t PyInt_FromSsize_t #define __Pyx_PyInt_AsHash_t PyInt_AsSsize_t #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #ifndef __PYX_EXTERN_C #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE__sklearn__linear_model__sgd_fast #define __PYX_HAVE_API__sklearn__linear_model__sgd_fast #include "math.h" #include "stdio.h" #include "stdlib.h" #include "numpy/arrayobject.h" #include "numpy/ufuncobject.h" #ifdef _OPENMP #include #endif /* _OPENMP */ #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif /* inline attribute */ #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif /* unused attribute */ #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || (defined(__INTEL_COMPILER) && !defined(_MSC_VER)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ /* Type Conversion Predeclarations */ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_Owned_Py_None(b) (Py_INCREF(Py_None), Py_None) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #if CYTHON_COMPILING_IN_CPYTHON #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #else #define __pyx_PyFloat_AsDouble(x) PyFloat_AsDouble(x) #endif #define __pyx_PyFloat_AsFloat(x) ((float) __pyx_PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "sgd_fast.pyx", "numpy.pxd", "type.pxd", "weight_vector.pxd", "seq_dataset.pxd", }; #define IS_UNSIGNED(type) (((type) -1) > 0) struct __Pyx_StructField_; #define __PYX_BUF_FLAGS_PACKED_STRUCT (1 << 0) typedef struct { const char* name; /* for error messages only */ struct __Pyx_StructField_* fields; size_t size; /* sizeof(type) */ size_t arraysize[8]; /* length of array in each dimension */ int ndim; char typegroup; /* _R_eal, _C_omplex, Signed _I_nt, _U_nsigned int, _S_truct, _P_ointer, _O_bject, c_H_ar */ char is_unsigned; int flags; } __Pyx_TypeInfo; typedef struct __Pyx_StructField_ { __Pyx_TypeInfo* type; const char* name; size_t offset; } __Pyx_StructField; typedef struct { __Pyx_StructField* field; size_t parent_offset; } __Pyx_BufFmt_StackElem; typedef struct { __Pyx_StructField root; __Pyx_BufFmt_StackElem* head; size_t fmt_offset; size_t new_count, enc_count; size_t struct_alignment; int is_complex; char enc_type; char new_packmode; char enc_packmode; char is_valid_array; } __Pyx_BufFmt_Context; /* "numpy.pxd":723 * # in Cython to enable them only on the right systems. * * ctypedef npy_int8 int8_t # <<<<<<<<<<<<<< * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t */ typedef npy_int8 __pyx_t_5numpy_int8_t; /* "numpy.pxd":724 * * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t # <<<<<<<<<<<<<< * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t */ typedef npy_int16 __pyx_t_5numpy_int16_t; /* "numpy.pxd":725 * ctypedef npy_int8 int8_t * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t # <<<<<<<<<<<<<< * ctypedef npy_int64 int64_t * #ctypedef npy_int96 int96_t */ typedef npy_int32 __pyx_t_5numpy_int32_t; /* "numpy.pxd":726 * ctypedef npy_int16 int16_t * ctypedef npy_int32 int32_t * ctypedef npy_int64 int64_t # <<<<<<<<<<<<<< * #ctypedef npy_int96 int96_t * #ctypedef npy_int128 int128_t */ typedef npy_int64 __pyx_t_5numpy_int64_t; /* "numpy.pxd":730 * #ctypedef npy_int128 int128_t * * ctypedef npy_uint8 uint8_t # <<<<<<<<<<<<<< * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t */ typedef npy_uint8 __pyx_t_5numpy_uint8_t; /* "numpy.pxd":731 * * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t # <<<<<<<<<<<<<< * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t */ typedef npy_uint16 __pyx_t_5numpy_uint16_t; /* "numpy.pxd":732 * ctypedef npy_uint8 uint8_t * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t # <<<<<<<<<<<<<< * ctypedef npy_uint64 uint64_t * #ctypedef npy_uint96 uint96_t */ typedef npy_uint32 __pyx_t_5numpy_uint32_t; /* "numpy.pxd":733 * ctypedef npy_uint16 uint16_t * ctypedef npy_uint32 uint32_t * ctypedef npy_uint64 uint64_t # <<<<<<<<<<<<<< * #ctypedef npy_uint96 uint96_t * #ctypedef npy_uint128 uint128_t */ typedef npy_uint64 __pyx_t_5numpy_uint64_t; /* "numpy.pxd":737 * #ctypedef npy_uint128 uint128_t * * ctypedef npy_float32 float32_t # <<<<<<<<<<<<<< * ctypedef npy_float64 float64_t * #ctypedef npy_float80 float80_t */ typedef npy_float32 __pyx_t_5numpy_float32_t; /* "numpy.pxd":738 * * ctypedef npy_float32 float32_t * ctypedef npy_float64 float64_t # <<<<<<<<<<<<<< * #ctypedef npy_float80 float80_t * #ctypedef npy_float128 float128_t */ typedef npy_float64 __pyx_t_5numpy_float64_t; /* "numpy.pxd":747 * # The int types are mapped a bit surprising -- * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t # <<<<<<<<<<<<<< * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t */ typedef npy_long __pyx_t_5numpy_int_t; /* "numpy.pxd":748 * # numpy.int corresponds to 'l' and numpy.long to 'q' * ctypedef npy_long int_t * ctypedef npy_longlong long_t # <<<<<<<<<<<<<< * ctypedef npy_longlong longlong_t * */ typedef npy_longlong __pyx_t_5numpy_long_t; /* "numpy.pxd":749 * ctypedef npy_long int_t * ctypedef npy_longlong long_t * ctypedef npy_longlong longlong_t # <<<<<<<<<<<<<< * * ctypedef npy_ulong uint_t */ typedef npy_longlong __pyx_t_5numpy_longlong_t; /* "numpy.pxd":751 * ctypedef npy_longlong longlong_t * * ctypedef npy_ulong uint_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t */ typedef npy_ulong __pyx_t_5numpy_uint_t; /* "numpy.pxd":752 * * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t # <<<<<<<<<<<<<< * ctypedef npy_ulonglong ulonglong_t * */ typedef npy_ulonglong __pyx_t_5numpy_ulong_t; /* "numpy.pxd":753 * ctypedef npy_ulong uint_t * ctypedef npy_ulonglong ulong_t * ctypedef npy_ulonglong ulonglong_t # <<<<<<<<<<<<<< * * ctypedef npy_intp intp_t */ typedef npy_ulonglong __pyx_t_5numpy_ulonglong_t; /* "numpy.pxd":755 * ctypedef npy_ulonglong ulonglong_t * * ctypedef npy_intp intp_t # <<<<<<<<<<<<<< * ctypedef npy_uintp uintp_t * */ typedef npy_intp __pyx_t_5numpy_intp_t; /* "numpy.pxd":756 * * ctypedef npy_intp intp_t * ctypedef npy_uintp uintp_t # <<<<<<<<<<<<<< * * ctypedef npy_double float_t */ typedef npy_uintp __pyx_t_5numpy_uintp_t; /* "numpy.pxd":758 * ctypedef npy_uintp uintp_t * * ctypedef npy_double float_t # <<<<<<<<<<<<<< * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t */ typedef npy_double __pyx_t_5numpy_float_t; /* "numpy.pxd":759 * * ctypedef npy_double float_t * ctypedef npy_double double_t # <<<<<<<<<<<<<< * ctypedef npy_longdouble longdouble_t * */ typedef npy_double __pyx_t_5numpy_double_t; /* "numpy.pxd":760 * ctypedef npy_double float_t * ctypedef npy_double double_t * ctypedef npy_longdouble longdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cfloat cfloat_t */ typedef npy_longdouble __pyx_t_5numpy_longdouble_t; /* "sklearn/utils/weight_vector.pxd":10 * * * ctypedef np.float64_t DOUBLE # <<<<<<<<<<<<<< * ctypedef np.int32_t INTEGER * */ typedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE; /* "sklearn/utils/weight_vector.pxd":11 * * ctypedef np.float64_t DOUBLE * ctypedef np.int32_t INTEGER # <<<<<<<<<<<<<< * * */ typedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_5utils_13weight_vector_INTEGER; /* "sklearn/utils/seq_dataset.pxd":5 * cimport numpy as np * * ctypedef np.float64_t DOUBLE # <<<<<<<<<<<<<< * ctypedef np.int32_t INTEGER * */ typedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE; /* "sklearn/utils/seq_dataset.pxd":6 * * ctypedef np.float64_t DOUBLE * ctypedef np.int32_t INTEGER # <<<<<<<<<<<<<< * * */ typedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER; /* "sklearn/linear_model/sgd_fast.pyx":25 * * * ctypedef np.float64_t DOUBLE # <<<<<<<<<<<<<< * ctypedef np.int32_t INTEGER * */ typedef __pyx_t_5numpy_float64_t __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE; /* "sklearn/linear_model/sgd_fast.pyx":26 * * ctypedef np.float64_t DOUBLE * ctypedef np.int32_t INTEGER # <<<<<<<<<<<<<< * * */ typedef __pyx_t_5numpy_int32_t __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER; #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif /*--- Type declarations ---*/ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber; struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification; struct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge; struct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber; struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive; /* "numpy.pxd":762 * ctypedef npy_longdouble longdouble_t * * ctypedef npy_cfloat cfloat_t # <<<<<<<<<<<<<< * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; /* "numpy.pxd":763 * * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t # <<<<<<<<<<<<<< * ctypedef npy_clongdouble clongdouble_t * */ typedef npy_cdouble __pyx_t_5numpy_cdouble_t; /* "numpy.pxd":764 * ctypedef npy_cfloat cfloat_t * ctypedef npy_cdouble cdouble_t * ctypedef npy_clongdouble clongdouble_t # <<<<<<<<<<<<<< * * ctypedef npy_cdouble complex_t */ typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; /* "numpy.pxd":766 * ctypedef npy_clongdouble clongdouble_t * * ctypedef npy_cdouble complex_t # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew1(a): */ typedef npy_cdouble __pyx_t_5numpy_complex_t; /* "sklearn/linear_model/sgd_fast.pyx":46 * # ---------------------------------------- * * cdef class LossFunction: # <<<<<<<<<<<<<< * """Base class for convex loss functions""" * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction { PyObject_HEAD struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_vtab; }; /* "sklearn/linear_model/sgd_fast.pyx":84 * * * cdef class Regression(LossFunction): # <<<<<<<<<<<<<< * """Base class for loss functions for regression""" * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base; }; /* "sklearn/linear_model/sgd_fast.pyx":235 * * * cdef class Huber(Regression): # <<<<<<<<<<<<<< * """Huber regression loss * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; double c; }; /* "sklearn/utils/seq_dataset.pxd":9 * * * cdef class SequentialDataset: # <<<<<<<<<<<<<< * cdef Py_ssize_t n_samples * */ struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset { PyObject_HEAD struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_vtab; Py_ssize_t n_samples; }; /* "sklearn/linear_model/sgd_fast.pyx":271 * * * cdef class EpsilonInsensitive(Regression): # <<<<<<<<<<<<<< * """Epsilon-Insensitive loss (used by SVR). * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; double epsilon; }; /* "sklearn/linear_model/sgd_fast.pyx":94 * * * cdef class Classification(LossFunction): # <<<<<<<<<<<<<< * """Base class for loss functions for classification""" * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base; }; /* "sklearn/utils/seq_dataset.pxd":34 * * * cdef class CSRDataset(SequentialDataset): # <<<<<<<<<<<<<< * cdef int current_index * cdef int stride */ struct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset { struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base; int current_index; int stride; __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *X_data_ptr; __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *X_indptr_ptr; __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *X_indices_ptr; __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *Y_data_ptr; PyArrayObject *feature_indices; __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *feature_indices_ptr; PyArrayObject *index; __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *index_data_ptr; __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *sample_weight_data; }; /* "sklearn/linear_model/sgd_fast.pyx":198 * * * cdef class Log(Classification): # <<<<<<<<<<<<<< * """Logistic regression loss for binary classification with y in {-1, 1}""" * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base; }; /* "sklearn/linear_model/sgd_fast.pyx":134 * * * cdef class Hinge(Classification): # <<<<<<<<<<<<<< * """Hinge loss for binary classification tasks with y in {-1,1} * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base; double threshold; }; /* "sklearn/utils/seq_dataset.pxd":17 * * * cdef class ArrayDataset(SequentialDataset): # <<<<<<<<<<<<<< * cdef Py_ssize_t n_features * cdef int current_index */ struct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset { struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base; Py_ssize_t n_features; int current_index; int stride; __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *X_data_ptr; __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *Y_data_ptr; PyArrayObject *feature_indices; __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *feature_indices_ptr; PyArrayObject *index; __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER *index_data_ptr; __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *sample_weight_data; }; /* "sklearn/linear_model/sgd_fast.pyx":166 * * * cdef class SquaredHinge(LossFunction): # <<<<<<<<<<<<<< * """Squared Hinge loss for binary classification tasks with y in {-1,1} * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base; double threshold; }; /* "sklearn/linear_model/sgd_fast.pyx":104 * * * cdef class ModifiedHuber(Classification): # <<<<<<<<<<<<<< * """Modified Huber loss for binary classification with y in {-1, 1} * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base; }; /* "sklearn/utils/weight_vector.pxd":14 * * * cdef class WeightVector(object): # <<<<<<<<<<<<<< * cdef np.ndarray w * cdef DOUBLE *w_data_ptr */ struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector { PyObject_HEAD struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *__pyx_vtab; PyArrayObject *w; __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *w_data_ptr; double wscale; Py_ssize_t n_features; double sq_norm; }; /* "sklearn/linear_model/sgd_fast.pyx":223 * * * cdef class SquaredLoss(Regression): # <<<<<<<<<<<<<< * """Squared loss traditional used in linear regression.""" * cpdef double loss(self, double p, double y): */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; }; /* "sklearn/linear_model/sgd_fast.pyx":298 * * * cdef class SquaredEpsilonInsensitive(Regression): # <<<<<<<<<<<<<< * """Epsilon-Insensitive loss. * */ struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; double epsilon; }; /* "sklearn/linear_model/sgd_fast.pyx":46 * # ---------------------------------------- * * cdef class LossFunction: # <<<<<<<<<<<<<< * """Base class for convex loss functions""" * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction { double (*loss)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch); double (*dloss)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch); }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction; /* "sklearn/linear_model/sgd_fast.pyx":84 * * * cdef class Regression(LossFunction): # <<<<<<<<<<<<<< * """Base class for loss functions for regression""" * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression; /* "sklearn/linear_model/sgd_fast.pyx":223 * * * cdef class SquaredLoss(Regression): # <<<<<<<<<<<<<< * """Squared loss traditional used in linear regression.""" * cpdef double loss(self, double p, double y): */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss; /* "sklearn/linear_model/sgd_fast.pyx":94 * * * cdef class Classification(LossFunction): # <<<<<<<<<<<<<< * """Base class for loss functions for classification""" * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification; /* "sklearn/linear_model/sgd_fast.pyx":104 * * * cdef class ModifiedHuber(Classification): # <<<<<<<<<<<<<< * """Modified Huber loss for binary classification with y in {-1, 1} * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber; /* "sklearn/linear_model/sgd_fast.pyx":198 * * * cdef class Log(Classification): # <<<<<<<<<<<<<< * """Logistic regression loss for binary classification with y in {-1, 1}""" * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log; /* "sklearn/linear_model/sgd_fast.pyx":298 * * * cdef class SquaredEpsilonInsensitive(Regression): # <<<<<<<<<<<<<< * """Epsilon-Insensitive loss. * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive; /* "sklearn/utils/seq_dataset.pxd":9 * * * cdef class SequentialDataset: # <<<<<<<<<<<<<< * cdef Py_ssize_t n_samples * */ struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset { void (*next)(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE **, __pyx_t_7sklearn_5utils_11seq_dataset_INTEGER **, int *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *, __pyx_t_7sklearn_5utils_11seq_dataset_DOUBLE *); void (*shuffle)(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *, PyObject *); }; static struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset; /* "sklearn/utils/seq_dataset.pxd":17 * * * cdef class ArrayDataset(SequentialDataset): # <<<<<<<<<<<<<< * cdef Py_ssize_t n_features * cdef int current_index */ struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset { struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset; /* "sklearn/utils/seq_dataset.pxd":34 * * * cdef class CSRDataset(SequentialDataset): # <<<<<<<<<<<<<< * cdef int current_index * cdef int stride */ struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset { struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset *__pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset; /* "sklearn/linear_model/sgd_fast.pyx":271 * * * cdef class EpsilonInsensitive(Regression): # <<<<<<<<<<<<<< * """Epsilon-Insensitive loss (used by SVR). * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive; /* "sklearn/linear_model/sgd_fast.pyx":166 * * * cdef class SquaredHinge(LossFunction): # <<<<<<<<<<<<<< * """Squared Hinge loss for binary classification tasks with y in {-1,1} * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge; /* "sklearn/linear_model/sgd_fast.pyx":235 * * * cdef class Huber(Regression): # <<<<<<<<<<<<<< * """Huber regression loss * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber; /* "sklearn/linear_model/sgd_fast.pyx":134 * * * cdef class Hinge(Classification): # <<<<<<<<<<<<<< * """Hinge loss for binary classification tasks with y in {-1,1} * */ struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge { struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_base; }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge; /* "sklearn/utils/weight_vector.pxd":14 * * * cdef class WeightVector(object): # <<<<<<<<<<<<<< * cdef np.ndarray w * cdef DOUBLE *w_data_ptr */ struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector { void (*add)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *, __pyx_t_7sklearn_5utils_13weight_vector_INTEGER *, int, double); double (*dot)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *, __pyx_t_7sklearn_5utils_13weight_vector_INTEGER *, int); void (*scale)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, double); void (*reset_wscale)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *); double (*norm)(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *); }; static struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *__pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname); /*proto*/ #define __Pyx_RefNannyDeclarations void *__pyx_refnanny = NULL; #ifdef WITH_THREAD #define __Pyx_RefNannySetupContext(name, acquire_gil) \ if (acquire_gil) { \ PyGILState_STATE __pyx_gilstate_save = PyGILState_Ensure(); \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ PyGILState_Release(__pyx_gilstate_save); \ } else { \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__); \ } #else #define __Pyx_RefNannySetupContext(name, acquire_gil) \ __pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #endif #define __Pyx_RefNannyFinishContext() \ __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XINCREF(r) do { if((r) != NULL) {__Pyx_INCREF(r); }} while(0) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r); }} while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r); }} while(0) #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);}} while(0) #else #define __Pyx_RefNannyDeclarations #define __Pyx_RefNannySetupContext(name, acquire_gil) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XINCREF(r) Py_XINCREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #define __Pyx_XGOTREF(r) #define __Pyx_XGIVEREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_CLEAR(r) do { PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);} while(0) #define __Pyx_XCLEAR(r) do { if((r) != NULL) {PyObject* tmp = ((PyObject*)(r)); r = NULL; __Pyx_DECREF(tmp);}} while(0) static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause); /*proto*/ static void __Pyx_RaiseArgtupleInvalid(const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found); /*proto*/ static void __Pyx_RaiseDoubleKeywordsError(const char* func_name, PyObject* kw_name); /*proto*/ static int __Pyx_ParseOptionalKeywords(PyObject *kwds, PyObject **argnames[], \ PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, \ const char* function_name); /*proto*/ static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact); /*proto*/ static CYTHON_INLINE int __Pyx_GetBufferAndValidate(Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack); static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info); static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ static void __Pyx_RaiseBufferFallbackError(void); /*proto*/ static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Generic(PyObject *o, PyObject* j) { PyObject *r; if (!j) return NULL; r = PyObject_GetItem(o, j); Py_DECREF(j); return r; } #define __Pyx_GetItemInt_List(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_List_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_List_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyList_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyList_GET_ITEM(o, PyList_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt_Tuple(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Tuple_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Tuple_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (likely((0 <= i) & (i < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, i); Py_INCREF(r); return r; } else if ((-PyTuple_GET_SIZE(o) <= i) & (i < 0)) { PyObject *r = PyTuple_GET_ITEM(o, PyTuple_GET_SIZE(o) + i); Py_INCREF(r); return r; } return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); #else return PySequence_GetItem(o, i); #endif } #define __Pyx_GetItemInt(o, i, size, to_py_func) (((size) <= sizeof(Py_ssize_t)) ? \ __Pyx_GetItemInt_Fast(o, i) : \ __Pyx_GetItemInt_Generic(o, to_py_func(i))) static CYTHON_INLINE PyObject *__Pyx_GetItemInt_Fast(PyObject *o, Py_ssize_t i) { #if CYTHON_COMPILING_IN_CPYTHON if (PyList_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyList_GET_SIZE(o); if (likely((n >= 0) & (n < PyList_GET_SIZE(o)))) { PyObject *r = PyList_GET_ITEM(o, n); Py_INCREF(r); return r; } } else if (PyTuple_CheckExact(o)) { Py_ssize_t n = (likely(i >= 0)) ? i : i + PyTuple_GET_SIZE(o); if (likely((n >= 0) & (n < PyTuple_GET_SIZE(o)))) { PyObject *r = PyTuple_GET_ITEM(o, n); Py_INCREF(r); return r; } } else { /* inlined PySequence_GetItem() */ PySequenceMethods *m = Py_TYPE(o)->tp_as_sequence; if (likely(m && m->sq_item)) { if (unlikely(i < 0) && likely(m->sq_length)) { Py_ssize_t l = m->sq_length(o); if (unlikely(l < 0)) return NULL; i += l; } return m->sq_item(o, i); } } #else if (PySequence_Check(o)) { return PySequence_GetItem(o, i); } #endif return __Pyx_GetItemInt_Generic(o, PyInt_FromSsize_t(i)); } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); static CYTHON_INLINE int __Pyx_IterFinish(void); /*proto*/ static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected); /*proto*/ typedef struct { Py_ssize_t shape, strides, suboffsets; } __Pyx_Buf_DimInfo; typedef struct { size_t refcount; Py_buffer pybuffer; } __Pyx_Buffer; typedef struct { __Pyx_Buffer *rcbuffer; char *data; __Pyx_Buf_DimInfo diminfo[8]; } __Pyx_LocalBuf_ND; #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags); static void __Pyx_ReleaseBuffer(Py_buffer *view); #else #define __Pyx_GetBuffer PyObject_GetBuffer #define __Pyx_ReleaseBuffer PyBuffer_Release #endif static Py_ssize_t __Pyx_zeros[] = {0, 0, 0, 0, 0, 0, 0, 0}; static Py_ssize_t __Pyx_minusones[] = {-1, -1, -1, -1, -1, -1, -1, -1}; static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level); /*proto*/ static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name); static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/ #if CYTHON_COMPILING_IN_PYPY || PY_MAJOR_VERSION >= 3 static PyObject* __pyx_print = 0; static PyObject* __pyx_print_kwargs = 0; #endif static int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/ #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); #if CYTHON_CCOMPLEX #define __Pyx_c_eqf(a, b) ((a)==(b)) #define __Pyx_c_sumf(a, b) ((a)+(b)) #define __Pyx_c_difff(a, b) ((a)-(b)) #define __Pyx_c_prodf(a, b) ((a)*(b)) #define __Pyx_c_quotf(a, b) ((a)/(b)) #define __Pyx_c_negf(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zerof(z) ((z)==(float)0) #define __Pyx_c_conjf(z) (::std::conj(z)) #if 1 #define __Pyx_c_absf(z) (::std::abs(z)) #define __Pyx_c_powf(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zerof(z) ((z)==0) #define __Pyx_c_conjf(z) (conjf(z)) #if 1 #define __Pyx_c_absf(z) (cabsf(z)) #define __Pyx_c_powf(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); #if CYTHON_CCOMPLEX #define __Pyx_c_eq(a, b) ((a)==(b)) #define __Pyx_c_sum(a, b) ((a)+(b)) #define __Pyx_c_diff(a, b) ((a)-(b)) #define __Pyx_c_prod(a, b) ((a)*(b)) #define __Pyx_c_quot(a, b) ((a)/(b)) #define __Pyx_c_neg(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero(z) ((z)==(double)0) #define __Pyx_c_conj(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs(z) (::std::abs(z)) #define __Pyx_c_pow(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero(z) ((z)==0) #define __Pyx_c_conj(z) (conj(z)) #if 1 #define __Pyx_c_abs(z) (cabs(z)) #define __Pyx_c_pow(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static void __Pyx_WriteUnraisable(const char *name, int clineno, int lineno, const char *filename); /*proto*/ static int __Pyx_check_binary_version(void); static int __Pyx_SetVtable(PyObject *dict, void *vtable); /*proto*/ #if !defined(__Pyx_PyIdentifier_FromString) #if PY_MAJOR_VERSION < 3 #define __Pyx_PyIdentifier_FromString(s) PyString_FromString(s) #else #define __Pyx_PyIdentifier_FromString(s) PyUnicode_FromString(s) #endif #endif static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict); /*proto*/ static void* __Pyx_GetVtable(PyObject *dict); /*proto*/ typedef struct { int code_line; PyCodeObject* code_object; } __Pyx_CodeObjectCacheEntry; struct __Pyx_CodeObjectCache { int count; int max_count; __Pyx_CodeObjectCacheEntry* entries; }; static struct __Pyx_CodeObjectCache __pyx_code_cache = {0,0,NULL}; static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line); static PyCodeObject *__pyx_find_code_object(int code_line); static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object); static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from 'libc.math' */ /* Module declarations from 'cpython.buffer' */ /* Module declarations from 'cpython.ref' */ /* Module declarations from 'libc.stdio' */ /* Module declarations from 'cpython.object' */ /* Module declarations from '__builtin__' */ /* Module declarations from 'cpython.type' */ static PyTypeObject *__pyx_ptype_7cpython_4type_type = 0; /* Module declarations from 'libc.stdlib' */ /* Module declarations from 'numpy' */ /* Module declarations from 'numpy' */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ /* Module declarations from 'cython' */ /* Module declarations from 'sklearn.utils.weight_vector' */ static PyTypeObject *__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector = 0; /* Module declarations from 'sklearn.utils.seq_dataset' */ static PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset = 0; static PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset = 0; static PyTypeObject *__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset = 0; /* Module declarations from 'sklearn.linear_model.sgd_fast' */ static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = 0; static PyTypeObject *__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = 0; static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double, double); /*proto*/ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double, double); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *, int); /*proto*/ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *, __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *, int, double); /*proto*/ static __Pyx_TypeInfo __Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE = { "DOUBLE", NULL, sizeof(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE), { 0 }, 0, 'R', 0, 0 }; #define __Pyx_MODULE_NAME "sklearn.linear_model.sgd_fast" int __pyx_module_is_main_sklearn__linear_model__sgd_fast = 0; /* Implementation of 'sklearn.linear_model.sgd_fast' */ static PyObject *__pyx_builtin_NotImplementedError; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_RuntimeError; static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self); /* proto */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_threshold); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self); /* proto */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_threshold); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self); /* proto */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_c); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self); /* proto */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self); /* proto */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self); /* proto */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_weights, double __pyx_v_intercept, struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss, int __pyx_v_penalty_type, double __pyx_v_alpha, double __pyx_v_C, double __pyx_v_rho, struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset, int __pyx_v_n_iter, int __pyx_v_fit_intercept, int __pyx_v_verbose, int __pyx_v_shuffle, PyObject *__pyx_v_seed, double __pyx_v_weight_pos, double __pyx_v_weight_neg, int __pyx_v_learning_rate, double __pyx_v_eta0, double __pyx_v_power_t, double __pyx_v_t, double __pyx_v_intercept_decay); /* proto */ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /* proto */ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info); /* proto */ static char __pyx_k_1[] = "-- Epoch %d"; static char __pyx_k_2[] = "Norm: %.2f, NNZs: %d, Bias: %.6f, T: %d, Avg. loss: %.6f"; static char __pyx_k_3[] = "Total training time: %.2f seconds."; static char __pyx_k_4[] = "floating-point under-/overflow occured."; static char __pyx_k_6[] = "ndarray is not C contiguous"; static char __pyx_k_8[] = "ndarray is not Fortran contiguous"; static char __pyx_k_10[] = "Non-native byte order not supported"; static char __pyx_k_12[] = "unknown dtype code in numpy.pxd (%d)"; static char __pyx_k_13[] = "Format string allocated too short, see comment in numpy.pxd"; static char __pyx_k_16[] = "Format string allocated too short."; static char __pyx_k_20[] = "/scratch/apps/src/scikit-learn/sklearn/linear_model/sgd_fast.pyx"; static char __pyx_k_21[] = "sklearn.linear_model.sgd_fast"; static char __pyx_k__B[] = "B"; static char __pyx_k__C[] = "C"; static char __pyx_k__H[] = "H"; static char __pyx_k__I[] = "I"; static char __pyx_k__L[] = "L"; static char __pyx_k__O[] = "O"; static char __pyx_k__Q[] = "Q"; static char __pyx_k__b[] = "b"; static char __pyx_k__c[] = "c"; static char __pyx_k__d[] = "d"; static char __pyx_k__f[] = "f"; static char __pyx_k__g[] = "g"; static char __pyx_k__h[] = "h"; static char __pyx_k__i[] = "i"; static char __pyx_k__l[] = "l"; static char __pyx_k__p[] = "p"; static char __pyx_k__q[] = "q"; static char __pyx_k__t[] = "t"; static char __pyx_k__u[] = "u"; static char __pyx_k__w[] = "w"; static char __pyx_k__y[] = "y"; static char __pyx_k__Zd[] = "Zd"; static char __pyx_k__Zf[] = "Zf"; static char __pyx_k__Zg[] = "Zg"; static char __pyx_k__np[] = "np"; static char __pyx_k__any[] = "any"; static char __pyx_k__eta[] = "eta"; static char __pyx_k__rho[] = "rho"; static char __pyx_k__sys[] = "sys"; static char __pyx_k__eta0[] = "eta0"; static char __pyx_k__loss[] = "loss"; static char __pyx_k__seed[] = "seed"; static char __pyx_k__time[] = "time"; static char __pyx_k__xnnz[] = "xnnz"; static char __pyx_k__alpha[] = "alpha"; static char __pyx_k__count[] = "count"; static char __pyx_k__dloss[] = "dloss"; static char __pyx_k__dtype[] = "dtype"; static char __pyx_k__epoch[] = "epoch"; static char __pyx_k__isinf[] = "isinf"; static char __pyx_k__isnan[] = "isnan"; static char __pyx_k__numpy[] = "numpy"; static char __pyx_k__order[] = "order"; static char __pyx_k__range[] = "range"; static char __pyx_k__shape[] = "shape"; static char __pyx_k__zeros[] = "zeros"; static char __pyx_k__n_iter[] = "n_iter"; static char __pyx_k__update[] = "update"; static char __pyx_k__dataset[] = "dataset"; static char __pyx_k__epsilon[] = "epsilon"; static char __pyx_k__float64[] = "float64"; static char __pyx_k__nonzero[] = "nonzero"; static char __pyx_k__power_t[] = "power_t"; static char __pyx_k__shuffle[] = "shuffle"; static char __pyx_k__sumloss[] = "sumloss"; static char __pyx_k__t_start[] = "t_start"; static char __pyx_k__verbose[] = "verbose"; static char __pyx_k__weights[] = "weights"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__is_hinge[] = "is_hinge"; static char __pyx_k__intercept[] = "intercept"; static char __pyx_k__n_samples[] = "n_samples"; static char __pyx_k__plain_sgd[] = "plain_sgd"; static char __pyx_k__threshold[] = "threshold"; static char __pyx_k__x_ind_ptr[] = "x_ind_ptr"; static char __pyx_k__ValueError[] = "ValueError"; static char __pyx_k__n_features[] = "n_features"; static char __pyx_k__q_data_ptr[] = "q_data_ptr"; static char __pyx_k__weight_neg[] = "weight_neg"; static char __pyx_k__weight_pos[] = "weight_pos"; static char __pyx_k__x_data_ptr[] = "x_data_ptr"; static char __pyx_k__RuntimeError[] = "RuntimeError"; static char __pyx_k__class_weight[] = "class_weight"; static char __pyx_k__penalty_type[] = "penalty_type"; static char __pyx_k__fit_intercept[] = "fit_intercept"; static char __pyx_k__learning_rate[] = "learning_rate"; static char __pyx_k__sample_weight[] = "sample_weight"; static char __pyx_k__intercept_decay[] = "intercept_decay"; static char __pyx_k__NotImplementedError[] = "NotImplementedError"; static PyObject *__pyx_kp_s_1; static PyObject *__pyx_kp_u_10; static PyObject *__pyx_kp_u_12; static PyObject *__pyx_kp_u_13; static PyObject *__pyx_kp_u_16; static PyObject *__pyx_kp_s_2; static PyObject *__pyx_kp_s_20; static PyObject *__pyx_n_s_21; static PyObject *__pyx_kp_s_3; static PyObject *__pyx_kp_s_4; static PyObject *__pyx_kp_u_6; static PyObject *__pyx_kp_u_8; static PyObject *__pyx_n_s__C; static PyObject *__pyx_n_s__NotImplementedError; static PyObject *__pyx_n_s__RuntimeError; static PyObject *__pyx_n_s__ValueError; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s__alpha; static PyObject *__pyx_n_s__any; static PyObject *__pyx_n_s__c; static PyObject *__pyx_n_s__class_weight; static PyObject *__pyx_n_s__count; static PyObject *__pyx_n_s__dataset; static PyObject *__pyx_n_s__dloss; static PyObject *__pyx_n_s__dtype; static PyObject *__pyx_n_s__epoch; static PyObject *__pyx_n_s__epsilon; static PyObject *__pyx_n_s__eta; static PyObject *__pyx_n_s__eta0; static PyObject *__pyx_n_s__fit_intercept; static PyObject *__pyx_n_s__float64; static PyObject *__pyx_n_s__i; static PyObject *__pyx_n_s__intercept; static PyObject *__pyx_n_s__intercept_decay; static PyObject *__pyx_n_s__is_hinge; static PyObject *__pyx_n_s__isinf; static PyObject *__pyx_n_s__isnan; static PyObject *__pyx_n_s__learning_rate; static PyObject *__pyx_n_s__loss; static PyObject *__pyx_n_s__n_features; static PyObject *__pyx_n_s__n_iter; static PyObject *__pyx_n_s__n_samples; static PyObject *__pyx_n_s__nonzero; static PyObject *__pyx_n_s__np; static PyObject *__pyx_n_s__numpy; static PyObject *__pyx_n_s__order; static PyObject *__pyx_n_s__p; static PyObject *__pyx_n_s__penalty_type; static PyObject *__pyx_n_s__plain_sgd; static PyObject *__pyx_n_s__power_t; static PyObject *__pyx_n_s__q; static PyObject *__pyx_n_s__q_data_ptr; static PyObject *__pyx_n_s__range; static PyObject *__pyx_n_s__rho; static PyObject *__pyx_n_s__sample_weight; static PyObject *__pyx_n_s__seed; static PyObject *__pyx_n_s__shape; static PyObject *__pyx_n_s__shuffle; static PyObject *__pyx_n_s__sumloss; static PyObject *__pyx_n_s__sys; static PyObject *__pyx_n_s__t; static PyObject *__pyx_n_s__t_start; static PyObject *__pyx_n_s__threshold; static PyObject *__pyx_n_s__time; static PyObject *__pyx_n_s__u; static PyObject *__pyx_n_s__update; static PyObject *__pyx_n_s__verbose; static PyObject *__pyx_n_s__w; static PyObject *__pyx_n_s__weight_neg; static PyObject *__pyx_n_s__weight_pos; static PyObject *__pyx_n_s__weights; static PyObject *__pyx_n_s__x_data_ptr; static PyObject *__pyx_n_s__x_ind_ptr; static PyObject *__pyx_n_s__xnnz; static PyObject *__pyx_n_s__y; static PyObject *__pyx_n_s__zeros; static PyObject *__pyx_int_15; static PyObject *__pyx_k_tuple_5; static PyObject *__pyx_k_tuple_7; static PyObject *__pyx_k_tuple_9; static PyObject *__pyx_k_tuple_11; static PyObject *__pyx_k_tuple_14; static PyObject *__pyx_k_tuple_15; static PyObject *__pyx_k_tuple_17; static PyObject *__pyx_k_tuple_18; static PyObject *__pyx_k_codeobj_19; /* "sklearn/linear_model/sgd_fast.pyx":49 * """Base class for convex loss functions""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * """Evaluate the loss function. * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":64 * The loss evaluated at `p` and `y`. * """ * raise NotImplementedError() # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.LossFunction.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss[] = "Evaluate the loss function.\n\n Parameters\n ----------\n p : double\n The prediction, p = w^T x\n y : double\n The true value (aka target)\n\n Returns\n -------\n double\n The loss evaluated at `p` and `y`.\n "; static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.LossFunction.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":49 * """Base class for convex loss functions""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * """Evaluate the loss function. * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self->__pyx_vtab)->loss(__pyx_v_self, __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.LossFunction.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":66 * raise NotImplementedError() * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * """Evaluate the derivative of the loss function with respect to * the prediction `p`. */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":81 * The derivative of the loss function w.r.t. `p`. * """ * raise NotImplementedError() # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 81; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.LossFunction.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss[] = "Evaluate the derivative of the loss function with respect to\n the prediction `p`.\n\n Parameters\n ----------\n p : double\n The prediction, p = w^T x\n y : double\n The true value (aka target)\n Returns\n -------\n double\n The derivative of the loss function w.r.t. `p`.\n "; static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.LossFunction.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":66 * raise NotImplementedError() * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * """Evaluate the derivative of the loss function with respect to * the prediction `p`. */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self->__pyx_vtab)->dloss(__pyx_v_self, __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.LossFunction.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":87 * """Base class for loss functions for regression""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":88 * * cpdef double loss(self, double p, double y): * raise NotImplementedError() # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 88; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Regression.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Regression.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":87 * """Base class for loss functions for regression""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 87; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Regression.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":90 * raise NotImplementedError() * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":91 * * cpdef double dloss(self, double p, double y): * raise NotImplementedError() # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 91; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Regression.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Regression.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":90 * raise NotImplementedError() * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_10Regression_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 90; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Regression.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":97 * """Base class for loss functions for classification""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":98 * * cpdef double loss(self, double p, double y): * raise NotImplementedError() # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 98; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Classification.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Classification.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":97 * """Base class for loss functions for classification""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 97; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Classification.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":100 * raise NotImplementedError() * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, CYTHON_UNUSED double __pyx_v_p, CYTHON_UNUSED double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":101 * * cpdef double dloss(self, double p, double y): * raise NotImplementedError() # <<<<<<<<<<<<<< * * */ __pyx_t_1 = PyObject_Call(__pyx_builtin_NotImplementedError, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 101; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Classification.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Classification.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":100 * raise NotImplementedError() * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * raise NotImplementedError() * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_14Classification_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 100; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Classification.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":112 * Stochastic Gradient Descent', ICML'04. * """ * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z >= 1.0: */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":113 * """ * cpdef double loss(self, double p, double y): * cdef double z = p * y # <<<<<<<<<<<<<< * if z >= 1.0: * return 0.0 */ __pyx_v_z = (__pyx_v_p * __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":114 * cpdef double loss(self, double p, double y): * cdef double z = p * y * if z >= 1.0: # <<<<<<<<<<<<<< * return 0.0 * elif z >= -1.0: */ __pyx_t_6 = (__pyx_v_z >= 1.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":115 * cdef double z = p * y * if z >= 1.0: * return 0.0 # <<<<<<<<<<<<<< * elif z >= -1.0: * return (1.0 - z) * (1.0 - z) */ __pyx_r = 0.0; goto __pyx_L0; goto __pyx_L3; } /* "sklearn/linear_model/sgd_fast.pyx":116 * if z >= 1.0: * return 0.0 * elif z >= -1.0: # <<<<<<<<<<<<<< * return (1.0 - z) * (1.0 - z) * else: */ __pyx_t_6 = (__pyx_v_z >= -1.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":117 * return 0.0 * elif z >= -1.0: * return (1.0 - z) * (1.0 - z) # <<<<<<<<<<<<<< * else: * return -4.0 * z */ __pyx_r = ((1.0 - __pyx_v_z) * (1.0 - __pyx_v_z)); goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":119 * return (1.0 - z) * (1.0 - z) * else: * return -4.0 * z # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_r = (-4.0 * __pyx_v_z); goto __pyx_L0; } __pyx_L3:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.ModifiedHuber.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.ModifiedHuber.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":112 * Stochastic Gradient Descent', ICML'04. * """ * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z >= 1.0: */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 112; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.ModifiedHuber.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":121 * return -4.0 * z * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z >= 1.0: */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":122 * * cpdef double dloss(self, double p, double y): * cdef double z = p * y # <<<<<<<<<<<<<< * if z >= 1.0: * return 0.0 */ __pyx_v_z = (__pyx_v_p * __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":123 * cpdef double dloss(self, double p, double y): * cdef double z = p * y * if z >= 1.0: # <<<<<<<<<<<<<< * return 0.0 * elif z >= -1.0: */ __pyx_t_6 = (__pyx_v_z >= 1.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":124 * cdef double z = p * y * if z >= 1.0: * return 0.0 # <<<<<<<<<<<<<< * elif z >= -1.0: * return 2.0 * (1.0 - z) * -y */ __pyx_r = 0.0; goto __pyx_L0; goto __pyx_L3; } /* "sklearn/linear_model/sgd_fast.pyx":125 * if z >= 1.0: * return 0.0 * elif z >= -1.0: # <<<<<<<<<<<<<< * return 2.0 * (1.0 - z) * -y * else: */ __pyx_t_6 = (__pyx_v_z >= -1.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":126 * return 0.0 * elif z >= -1.0: * return 2.0 * (1.0 - z) * -y # <<<<<<<<<<<<<< * else: * return -4.0 * y */ __pyx_r = ((2.0 * (1.0 - __pyx_v_z)) * (-__pyx_v_y)); goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":128 * return 2.0 * (1.0 - z) * -y * else: * return -4.0 * y # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = (-4.0 * __pyx_v_y); goto __pyx_L0; } __pyx_L3:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.ModifiedHuber.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.ModifiedHuber.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":121 * return -4.0 * z * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z >= 1.0: */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 121; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.ModifiedHuber.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":130 * return -4.0 * y * * def __reduce__(self): # <<<<<<<<<<<<<< * return ModifiedHuber, () * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":131 * * def __reduce__(self): * return ModifiedHuber, () # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 131; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber))); __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.ModifiedHuber.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_threshold; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__threshold,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold); if (value) { values[0] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } } if (values[0]) { __pyx_v_threshold = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_threshold == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } else { /* "sklearn/linear_model/sgd_fast.pyx":147 * cdef double threshold * * def __init__(self, double threshold=1.0): # <<<<<<<<<<<<<< * self.threshold = threshold * */ __pyx_v_threshold = ((double)1.0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 147; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Hinge.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_threshold); __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_threshold) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); /* "sklearn/linear_model/sgd_fast.pyx":148 * * def __init__(self, double threshold=1.0): * self.threshold = threshold # <<<<<<<<<<<<<< * * cpdef double loss(self, double p, double y): */ __pyx_v_self->threshold = __pyx_v_threshold; __pyx_r = 0; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":150 * self.threshold = threshold * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z <= self.threshold: */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":151 * * cpdef double loss(self, double p, double y): * cdef double z = p * y # <<<<<<<<<<<<<< * if z <= self.threshold: * return (self.threshold - z) */ __pyx_v_z = (__pyx_v_p * __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":152 * cpdef double loss(self, double p, double y): * cdef double z = p * y * if z <= self.threshold: # <<<<<<<<<<<<<< * return (self.threshold - z) * return 0.0 */ __pyx_t_6 = (__pyx_v_z <= __pyx_v_self->threshold); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":153 * cdef double z = p * y * if z <= self.threshold: * return (self.threshold - z) # <<<<<<<<<<<<<< * return 0.0 * */ __pyx_r = (__pyx_v_self->threshold - __pyx_v_z); goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "sklearn/linear_model/sgd_fast.pyx":154 * if z <= self.threshold: * return (self.threshold - z) * return 0.0 # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_r = 0.0; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Hinge.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Hinge.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":150 * self.threshold = threshold * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z <= self.threshold: */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 150; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Hinge.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":156 * return 0.0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z <= self.threshold: */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":157 * * cpdef double dloss(self, double p, double y): * cdef double z = p * y # <<<<<<<<<<<<<< * if z <= self.threshold: * return -y */ __pyx_v_z = (__pyx_v_p * __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":158 * cpdef double dloss(self, double p, double y): * cdef double z = p * y * if z <= self.threshold: # <<<<<<<<<<<<<< * return -y * return 0.0 */ __pyx_t_6 = (__pyx_v_z <= __pyx_v_self->threshold); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":159 * cdef double z = p * y * if z <= self.threshold: * return -y # <<<<<<<<<<<<<< * return 0.0 * */ __pyx_r = (-__pyx_v_y); goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "sklearn/linear_model/sgd_fast.pyx":160 * if z <= self.threshold: * return -y * return 0.0 # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = 0.0; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Hinge.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Hinge.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":156 * return 0.0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * if z <= self.threshold: */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 156; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Hinge.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":162 * return 0.0 * * def __reduce__(self): # <<<<<<<<<<<<<< * return Hinge, (self.threshold,) * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Hinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":163 * * def __reduce__(self): * return Hinge, (self.threshold,) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->threshold); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge))); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2)); __Pyx_GIVEREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Hinge.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_threshold; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__threshold,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__threshold); if (value) { values[0] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } } if (values[0]) { __pyx_v_threshold = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_threshold == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } else { /* "sklearn/linear_model/sgd_fast.pyx":179 * cdef double threshold * * def __init__(self, double threshold=1.0): # <<<<<<<<<<<<<< * self.threshold = threshold * */ __pyx_v_threshold = ((double)1.0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 0, 0, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 179; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredHinge.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_threshold); __Pyx_RefNannyFinishContext(); return __pyx_r; } static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_threshold) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); /* "sklearn/linear_model/sgd_fast.pyx":180 * * def __init__(self, double threshold=1.0): * self.threshold = threshold # <<<<<<<<<<<<<< * * cpdef double loss(self, double p, double y): */ __pyx_v_self->threshold = __pyx_v_threshold; __pyx_r = 0; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":182 * self.threshold = threshold * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = self.threshold - p * y * if z > 0: */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":183 * * cpdef double loss(self, double p, double y): * cdef double z = self.threshold - p * y # <<<<<<<<<<<<<< * if z > 0: * return z * z */ __pyx_v_z = (__pyx_v_self->threshold - (__pyx_v_p * __pyx_v_y)); /* "sklearn/linear_model/sgd_fast.pyx":184 * cpdef double loss(self, double p, double y): * cdef double z = self.threshold - p * y * if z > 0: # <<<<<<<<<<<<<< * return z * z * return 0.0 */ __pyx_t_6 = (__pyx_v_z > 0.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":185 * cdef double z = self.threshold - p * y * if z > 0: * return z * z # <<<<<<<<<<<<<< * return 0.0 * */ __pyx_r = (__pyx_v_z * __pyx_v_z); goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "sklearn/linear_model/sgd_fast.pyx":186 * if z > 0: * return z * z * return 0.0 # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_r = 0.0; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.SquaredHinge.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredHinge.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":182 * self.threshold = threshold * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = self.threshold - p * y * if z > 0: */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 182; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredHinge.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":188 * return 0.0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = self.threshold - p * y * if z > 0: */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":189 * * cpdef double dloss(self, double p, double y): * cdef double z = self.threshold - p * y # <<<<<<<<<<<<<< * if z > 0: * return -2 * y * z */ __pyx_v_z = (__pyx_v_self->threshold - (__pyx_v_p * __pyx_v_y)); /* "sklearn/linear_model/sgd_fast.pyx":190 * cpdef double dloss(self, double p, double y): * cdef double z = self.threshold - p * y * if z > 0: # <<<<<<<<<<<<<< * return -2 * y * z * return 0.0 */ __pyx_t_6 = (__pyx_v_z > 0.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":191 * cdef double z = self.threshold - p * y * if z > 0: * return -2 * y * z # <<<<<<<<<<<<<< * return 0.0 * */ __pyx_r = ((-2.0 * __pyx_v_y) * __pyx_v_z); goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "sklearn/linear_model/sgd_fast.pyx":192 * if z > 0: * return -2 * y * z * return 0.0 # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = 0.0; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.SquaredHinge.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredHinge.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":188 * return 0.0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = self.threshold - p * y * if z > 0: */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self->__pyx_base.__pyx_vtab)->__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 188; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredHinge.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":194 * return 0.0 * * def __reduce__(self): # <<<<<<<<<<<<<< * return SquaredHinge, (self.threshold,) * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":195 * * def __reduce__(self): * return SquaredHinge, (self.threshold,) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->threshold); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 195; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge))); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2)); __Pyx_GIVEREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredHinge.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":201 * """Logistic regression loss for binary classification with y in {-1, 1}""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * # approximately equal and saves the computation of the log */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":202 * * cpdef double loss(self, double p, double y): * cdef double z = p * y # <<<<<<<<<<<<<< * # approximately equal and saves the computation of the log * if z > 18: */ __pyx_v_z = (__pyx_v_p * __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":204 * cdef double z = p * y * # approximately equal and saves the computation of the log * if z > 18: # <<<<<<<<<<<<<< * return exp(-z) * if z < -18: */ __pyx_t_6 = (__pyx_v_z > 18.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":205 * # approximately equal and saves the computation of the log * if z > 18: * return exp(-z) # <<<<<<<<<<<<<< * if z < -18: * return -z */ __pyx_r = exp((-__pyx_v_z)); goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "sklearn/linear_model/sgd_fast.pyx":206 * if z > 18: * return exp(-z) * if z < -18: # <<<<<<<<<<<<<< * return -z * return log(1.0 + exp(-z)) */ __pyx_t_6 = (__pyx_v_z < -18.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":207 * return exp(-z) * if z < -18: * return -z # <<<<<<<<<<<<<< * return log(1.0 + exp(-z)) * */ __pyx_r = (-__pyx_v_z); goto __pyx_L0; goto __pyx_L4; } __pyx_L4:; /* "sklearn/linear_model/sgd_fast.pyx":208 * if z < -18: * return -z * return log(1.0 + exp(-z)) # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_r = log((1.0 + exp((-__pyx_v_z)))); goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Log.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Log.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":201 * """Logistic regression loss for binary classification with y in {-1, 1}""" * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * # approximately equal and saves the computation of the log */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 201; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Log.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":210 * return log(1.0 + exp(-z)) * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * # approximately equal and saves the computation of the log */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":211 * * cpdef double dloss(self, double p, double y): * cdef double z = p * y # <<<<<<<<<<<<<< * # approximately equal and saves the computation of the log * if z > 18.0: */ __pyx_v_z = (__pyx_v_p * __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":213 * cdef double z = p * y * # approximately equal and saves the computation of the log * if z > 18.0: # <<<<<<<<<<<<<< * return exp(-z) * -y * if z < -18.0: */ __pyx_t_6 = (__pyx_v_z > 18.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":214 * # approximately equal and saves the computation of the log * if z > 18.0: * return exp(-z) * -y # <<<<<<<<<<<<<< * if z < -18.0: * return -y */ __pyx_r = (exp((-__pyx_v_z)) * (-__pyx_v_y)); goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "sklearn/linear_model/sgd_fast.pyx":215 * if z > 18.0: * return exp(-z) * -y * if z < -18.0: # <<<<<<<<<<<<<< * return -y * return -y / (exp(z) + 1.0) */ __pyx_t_6 = (__pyx_v_z < -18.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":216 * return exp(-z) * -y * if z < -18.0: * return -y # <<<<<<<<<<<<<< * return -y / (exp(z) + 1.0) * */ __pyx_r = (-__pyx_v_y); goto __pyx_L0; goto __pyx_L4; } __pyx_L4:; /* "sklearn/linear_model/sgd_fast.pyx":217 * if z < -18.0: * return -y * return -y / (exp(z) + 1.0) # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = ((-__pyx_v_y) / (exp(__pyx_v_z) + 1.0)); goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Log.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Log.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":210 * return log(1.0 + exp(-z)) * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z = p * y * # approximately equal and saves the computation of the log */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Log.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":219 * return -y / (exp(z) + 1.0) * * def __reduce__(self): # <<<<<<<<<<<<<< * return Log, () * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_3Log_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":220 * * def __reduce__(self): * return Log, () # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 220; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log))); __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Log.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":225 * cdef class SquaredLoss(Regression): * """Squared loss traditional used in linear regression.""" * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * return 0.5 * (p - y) * (p - y) * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":226 * """Squared loss traditional used in linear regression.""" * cpdef double loss(self, double p, double y): * return 0.5 * (p - y) * (p - y) # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_r = ((0.5 * (__pyx_v_p - __pyx_v_y)) * (__pyx_v_p - __pyx_v_y)); goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.SquaredLoss.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredLoss.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":225 * cdef class SquaredLoss(Regression): * """Squared loss traditional used in linear regression.""" * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * return 0.5 * (p - y) * (p - y) * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 225; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredLoss.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":228 * return 0.5 * (p - y) * (p - y) * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * return p - y * */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":229 * * cpdef double dloss(self, double p, double y): * return p - y # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = (__pyx_v_p - __pyx_v_y); goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.SquaredLoss.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredLoss.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":228 * return 0.5 * (p - y) * (p - y) * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * return p - y * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_2dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 228; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredLoss.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":231 * return p - y * * def __reduce__(self): # <<<<<<<<<<<<<< * return SquaredLoss, () * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_4__reduce__(CYTHON_UNUSED struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":232 * * def __reduce__(self): * return SquaredLoss, () # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 232; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss))); __Pyx_INCREF(((PyObject *)__pyx_empty_tuple)); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_empty_tuple)); __Pyx_GIVEREF(((PyObject *)__pyx_empty_tuple)); __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredLoss.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_c; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__c,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__c)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); } __pyx_v_c = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_c == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 246; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Huber.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_c); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":246 * cdef double c * * def __init__(self, double c): # <<<<<<<<<<<<<< * self.c = c * */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_c) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); /* "sklearn/linear_model/sgd_fast.pyx":247 * * def __init__(self, double c): * self.c = c # <<<<<<<<<<<<<< * * cpdef double loss(self, double p, double y): */ __pyx_v_self->c = __pyx_v_c; __pyx_r = 0; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":249 * self.c = c * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double r = p - y * cdef double abs_r = abs(r) */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_r; double __pyx_v_abs_r; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":250 * * cpdef double loss(self, double p, double y): * cdef double r = p - y # <<<<<<<<<<<<<< * cdef double abs_r = abs(r) * if abs_r <= self.c: */ __pyx_v_r = (__pyx_v_p - __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":251 * cpdef double loss(self, double p, double y): * cdef double r = p - y * cdef double abs_r = abs(r) # <<<<<<<<<<<<<< * if abs_r <= self.c: * return 0.5 * r * r */ __pyx_v_abs_r = fabs(__pyx_v_r); /* "sklearn/linear_model/sgd_fast.pyx":252 * cdef double r = p - y * cdef double abs_r = abs(r) * if abs_r <= self.c: # <<<<<<<<<<<<<< * return 0.5 * r * r * else: */ __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":253 * cdef double abs_r = abs(r) * if abs_r <= self.c: * return 0.5 * r * r # <<<<<<<<<<<<<< * else: * return self.c * abs_r - (0.5 * self.c * self.c) */ __pyx_r = ((0.5 * __pyx_v_r) * __pyx_v_r); goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":255 * return 0.5 * r * r * else: * return self.c * abs_r - (0.5 * self.c * self.c) # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ __pyx_r = ((__pyx_v_self->c * __pyx_v_abs_r) - ((0.5 * __pyx_v_self->c) * __pyx_v_self->c)); goto __pyx_L0; } __pyx_L3:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Huber.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Huber.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":249 * self.c = c * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double r = p - y * cdef double abs_r = abs(r) */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 249; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Huber.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":257 * return self.c * abs_r - (0.5 * self.c * self.c) * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double r = p - y * cdef double abs_r = abs(r) */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_r; double __pyx_v_abs_r; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":258 * * cpdef double dloss(self, double p, double y): * cdef double r = p - y # <<<<<<<<<<<<<< * cdef double abs_r = abs(r) * if abs_r <= self.c: */ __pyx_v_r = (__pyx_v_p - __pyx_v_y); /* "sklearn/linear_model/sgd_fast.pyx":259 * cpdef double dloss(self, double p, double y): * cdef double r = p - y * cdef double abs_r = abs(r) # <<<<<<<<<<<<<< * if abs_r <= self.c: * return r */ __pyx_v_abs_r = fabs(__pyx_v_r); /* "sklearn/linear_model/sgd_fast.pyx":260 * cdef double r = p - y * cdef double abs_r = abs(r) * if abs_r <= self.c: # <<<<<<<<<<<<<< * return r * elif r > 0.0: */ __pyx_t_6 = (__pyx_v_abs_r <= __pyx_v_self->c); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":261 * cdef double abs_r = abs(r) * if abs_r <= self.c: * return r # <<<<<<<<<<<<<< * elif r > 0.0: * return self.c */ __pyx_r = __pyx_v_r; goto __pyx_L0; goto __pyx_L3; } /* "sklearn/linear_model/sgd_fast.pyx":262 * if abs_r <= self.c: * return r * elif r > 0.0: # <<<<<<<<<<<<<< * return self.c * else: */ __pyx_t_6 = (__pyx_v_r > 0.0); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":263 * return r * elif r > 0.0: * return self.c # <<<<<<<<<<<<<< * else: * return -self.c */ __pyx_r = __pyx_v_self->c; goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":265 * return self.c * else: * return -self.c # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = (-__pyx_v_self->c); goto __pyx_L0; } __pyx_L3:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.Huber.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Huber.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":257 * return self.c * abs_r - (0.5 * self.c * self.c) * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double r = p - y * cdef double abs_r = abs(r) */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Huber.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":267 * return -self.c * * def __reduce__(self): # <<<<<<<<<<<<<< * return Huber, (self.c,) * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_5Huber_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":268 * * def __reduce__(self): * return Huber, (self.c,) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->c); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 268; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber))); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2)); __Pyx_GIVEREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.Huber.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_epsilon; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__epsilon,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__epsilon)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); } __pyx_v_epsilon = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_epsilon == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 279; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.EpsilonInsensitive.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_epsilon); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":279 * cdef double epsilon * * def __init__(self, double epsilon): # <<<<<<<<<<<<<< * self.epsilon = epsilon * */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); /* "sklearn/linear_model/sgd_fast.pyx":280 * * def __init__(self, double epsilon): * self.epsilon = epsilon # <<<<<<<<<<<<<< * * cpdef double loss(self, double p, double y): */ __pyx_v_self->epsilon = __pyx_v_epsilon; __pyx_r = 0; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":282 * self.epsilon = epsilon * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double ret = abs(y - p) - self.epsilon * return ret if ret > 0 else 0 */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_ret; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":283 * * cpdef double loss(self, double p, double y): * cdef double ret = abs(y - p) - self.epsilon # <<<<<<<<<<<<<< * return ret if ret > 0 else 0 * */ __pyx_v_ret = (fabs((__pyx_v_y - __pyx_v_p)) - __pyx_v_self->epsilon); /* "sklearn/linear_model/sgd_fast.pyx":284 * cpdef double loss(self, double p, double y): * cdef double ret = abs(y - p) - self.epsilon * return ret if ret > 0 else 0 # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ if ((__pyx_v_ret > 0.0)) { __pyx_t_5 = __pyx_v_ret; } else { __pyx_t_5 = 0; } __pyx_r = __pyx_t_5; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":282 * self.epsilon = epsilon * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double ret = abs(y - p) - self.epsilon * return ret if ret > 0 else 0 */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 282; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.EpsilonInsensitive.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":286 * return ret if ret > 0 else 0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * if y - p > self.epsilon: * return -1 */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":287 * * cpdef double dloss(self, double p, double y): * if y - p > self.epsilon: # <<<<<<<<<<<<<< * return -1 * elif p - y > self.epsilon: */ __pyx_t_6 = ((__pyx_v_y - __pyx_v_p) > __pyx_v_self->epsilon); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":288 * cpdef double dloss(self, double p, double y): * if y - p > self.epsilon: * return -1 # <<<<<<<<<<<<<< * elif p - y > self.epsilon: * return 1 */ __pyx_r = -1.0; goto __pyx_L0; goto __pyx_L3; } /* "sklearn/linear_model/sgd_fast.pyx":289 * if y - p > self.epsilon: * return -1 * elif p - y > self.epsilon: # <<<<<<<<<<<<<< * return 1 * else: */ __pyx_t_6 = ((__pyx_v_p - __pyx_v_y) > __pyx_v_self->epsilon); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":290 * return -1 * elif p - y > self.epsilon: * return 1 # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = 1.0; goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":292 * return 1 * else: * return 0 # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = 0.0; goto __pyx_L0; } __pyx_L3:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":286 * return ret if ret > 0 else 0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * if y - p > self.epsilon: * return -1 */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 286; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.EpsilonInsensitive.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":294 * return 0 * * def __reduce__(self): # <<<<<<<<<<<<<< * return EpsilonInsensitive, (self.epsilon,) * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":295 * * def __reduce__(self): * return EpsilonInsensitive, (self.epsilon,) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->epsilon); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 295; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive))); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2)); __Pyx_GIVEREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.EpsilonInsensitive.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static int __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_epsilon; int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__ (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__epsilon,0}; PyObject* values[1] = {0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__epsilon)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "__init__") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 1) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); } __pyx_v_epsilon = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_epsilon == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("__init__", 1, 1, 1, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 306; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.__init__", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return -1; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_epsilon); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":306 * cdef double epsilon * * def __init__(self, double epsilon): # <<<<<<<<<<<<<< * self.epsilon = epsilon * */ static int __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive___init__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_epsilon) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__init__", 0); /* "sklearn/linear_model/sgd_fast.pyx":307 * * def __init__(self, double epsilon): * self.epsilon = epsilon # <<<<<<<<<<<<<< * * cpdef double loss(self, double p, double y): */ __pyx_v_self->epsilon = __pyx_v_epsilon; __pyx_r = 0; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":309 * self.epsilon = epsilon * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double ret = abs(y - p) - self.epsilon * return ret * ret if ret > 0 else 0 */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_ret; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__loss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":310 * * cpdef double loss(self, double p, double y): * cdef double ret = abs(y - p) - self.epsilon # <<<<<<<<<<<<<< * return ret * ret if ret > 0 else 0 * */ __pyx_v_ret = (fabs((__pyx_v_y - __pyx_v_p)) - __pyx_v_self->epsilon); /* "sklearn/linear_model/sgd_fast.pyx":311 * cpdef double loss(self, double p, double y): * cdef double ret = abs(y - p) - self.epsilon * return ret * ret if ret > 0 else 0 # <<<<<<<<<<<<<< * * cpdef double dloss(self, double p, double y): */ if ((__pyx_v_ret > 0.0)) { __pyx_t_5 = (__pyx_v_ret * __pyx_v_ret); } else { __pyx_t_5 = 0; } __pyx_r = __pyx_t_5; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("loss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "loss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("loss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":309 * self.epsilon = epsilon * * cpdef double loss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double ret = abs(y - p) - self.epsilon * return ret * ret if ret > 0 else 0 */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_2loss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("loss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.loss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 309; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.loss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":313 * return ret * ret if ret > 0 else 0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z * z = y - p */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y, int __pyx_skip_dispatch) { double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; int __pyx_t_6; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); /* Check if called by wrapper */ if (unlikely(__pyx_skip_dispatch)) ; /* Check if overriden in Python */ else if (unlikely(Py_TYPE(((PyObject *)__pyx_v_self))->tp_dictoffset != 0)) { __pyx_t_1 = PyObject_GetAttr(((PyObject *)__pyx_v_self), __pyx_n_s__dloss); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (!PyCFunction_Check(__pyx_t_1) || (PyCFunction_GET_FUNCTION(__pyx_t_1) != (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss)) { __pyx_t_2 = PyFloat_FromDouble(__pyx_v_p); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyFloat_FromDouble(__pyx_v_y); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_4 = PyTuple_New(2); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_4, 1, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_2 = 0; __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_1, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_3); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = __pyx_t_5; __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } /* "sklearn/linear_model/sgd_fast.pyx":315 * cpdef double dloss(self, double p, double y): * cdef double z * z = y - p # <<<<<<<<<<<<<< * if z > self.epsilon: * return -2 * (z - self.epsilon) */ __pyx_v_z = (__pyx_v_y - __pyx_v_p); /* "sklearn/linear_model/sgd_fast.pyx":316 * cdef double z * z = y - p * if z > self.epsilon: # <<<<<<<<<<<<<< * return -2 * (z - self.epsilon) * elif z < self.epsilon: */ __pyx_t_6 = (__pyx_v_z > __pyx_v_self->epsilon); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":317 * z = y - p * if z > self.epsilon: * return -2 * (z - self.epsilon) # <<<<<<<<<<<<<< * elif z < self.epsilon: * return 2 * (-z - self.epsilon) */ __pyx_r = (-2.0 * (__pyx_v_z - __pyx_v_self->epsilon)); goto __pyx_L0; goto __pyx_L3; } /* "sklearn/linear_model/sgd_fast.pyx":318 * if z > self.epsilon: * return -2 * (z - self.epsilon) * elif z < self.epsilon: # <<<<<<<<<<<<<< * return 2 * (-z - self.epsilon) * else: */ __pyx_t_6 = (__pyx_v_z < __pyx_v_self->epsilon); if (__pyx_t_6) { /* "sklearn/linear_model/sgd_fast.pyx":319 * return -2 * (z - self.epsilon) * elif z < self.epsilon: * return 2 * (-z - self.epsilon) # <<<<<<<<<<<<<< * else: * return 0 */ __pyx_r = (2.0 * ((-__pyx_v_z) - __pyx_v_self->epsilon)); goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":321 * return 2 * (-z - self.epsilon) * else: * return 0 # <<<<<<<<<<<<<< * * def __reduce__(self): */ __pyx_r = 0.0; goto __pyx_L0; } __pyx_L3:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss(PyObject *__pyx_v_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { double __pyx_v_p; double __pyx_v_y; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("dloss (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__p,&__pyx_n_s__y,0}; PyObject* values[2] = {0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__p)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__y)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "dloss") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else if (PyTuple_GET_SIZE(__pyx_args) != 2) { goto __pyx_L5_argtuple_error; } else { values[0] = PyTuple_GET_ITEM(__pyx_args, 0); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); } __pyx_v_p = __pyx_PyFloat_AsDouble(values[0]); if (unlikely((__pyx_v_p == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_y = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_y == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("dloss", 1, 2, 2, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self), __pyx_v_p, __pyx_v_y); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":313 * return ret * ret if ret > 0 else 0 * * cpdef double dloss(self, double p, double y): # <<<<<<<<<<<<<< * cdef double z * z = y - p */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_4dloss(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self, double __pyx_v_p, double __pyx_v_y) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("dloss", 0); __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self->__pyx_base.__pyx_base.__pyx_vtab)->__pyx_base.__pyx_base.dloss(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_self), __pyx_v_p, __pyx_v_y, 1)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 313; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.dloss", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__(PyObject *__pyx_v_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__reduce__ (wrapper)", 0); __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)__pyx_v_self)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":323 * return 0 * * def __reduce__(self): # <<<<<<<<<<<<<< * return SquaredEpsilonInsensitive, (self.epsilon,) * */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_6__reduce__(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *__pyx_v_self) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__reduce__", 0); /* "sklearn/linear_model/sgd_fast.pyx":324 * * def __reduce__(self): * return SquaredEpsilonInsensitive, (self.epsilon,) # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyFloat_FromDouble(__pyx_v_self->epsilon); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_2, 0, __pyx_t_1); __Pyx_GIVEREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(2); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 324; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive))); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive))); __Pyx_GIVEREF(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive))); PyTuple_SET_ITEM(__pyx_t_1, 1, ((PyObject *)__pyx_t_2)); __Pyx_GIVEREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_r = ((PyObject *)__pyx_t_1); __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive.__reduce__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds); /*proto*/ static char __pyx_doc_7sklearn_12linear_model_8sgd_fast_plain_sgd[] = "Plain SGD for generic loss functions and penalties.\n\n Parameters\n ----------\n weights : ndarray[double, ndim=1]\n The allocated coef_ vector.\n intercept : double\n The initial intercept.\n loss : LossFunction\n A concrete ``LossFunction`` object.\n penalty_type : int\n The penalty 2 for L2, 1 for L1, and 3 for Elastic-Net.\n alpha : float\n The regularization parameter.\n rho : float\n The elastic net hyperparameter.\n dataset : SequentialDataset\n A concrete ``SequentialDataset`` object.\n n_iter : int\n The number of iterations (epochs).\n fit_intercept : int\n Whether or not to fit the intercept (1 or 0).\n verbose : int\n Print verbose output; 0 for quite.\n shuffle : int\n Whether to shuffle the training data before each epoch.\n weight_pos : float\n The weight of the positive class.\n weight_neg : float\n The weight of the negative class.\n seed : int or RandomState object\n The seed of the pseudo random number generator to use when\n shuffling the data\n learning_rate : int\n The learning rate:\n (1) constant, eta = eta0\n (2) optimal, eta = 1.0/(t+t0)\n (3) inverse scaling, eta = eta0 / pow(t, power_t)\n (4) Passive Agressive-I, eta = min(alpha, loss/norm(x))\n (5) Passive Agressive-II, eta = 1.0 / (norm(x) + 0.5*alpha)\n eta0 : double\n The initial learning rate.\n power_t : double\n The exponent for inverse scaling learning rate.\n t : double\n Initial state of the learning rate. This value is equal to the\n iteration count except when the learning rate is set to `optimal`.\n Default: 1.0.\n\n Returns\n -------\n weights : array, shape=[n_features]\n The fitted weight vector.\n intercept : float\n The fitted intercept term.\n\n "; static PyMethodDef __pyx_mdef_7sklearn_12linear_model_8sgd_fast_1plain_sgd = {__Pyx_NAMESTR("plain_sgd"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_plain_sgd)}; static PyObject *__pyx_pw_7sklearn_12linear_model_8sgd_fast_1plain_sgd(PyObject *__pyx_self, PyObject *__pyx_args, PyObject *__pyx_kwds) { PyArrayObject *__pyx_v_weights = 0; double __pyx_v_intercept; struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss = 0; int __pyx_v_penalty_type; double __pyx_v_alpha; double __pyx_v_C; double __pyx_v_rho; struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset = 0; int __pyx_v_n_iter; int __pyx_v_fit_intercept; int __pyx_v_verbose; int __pyx_v_shuffle; PyObject *__pyx_v_seed = 0; double __pyx_v_weight_pos; double __pyx_v_weight_neg; int __pyx_v_learning_rate; double __pyx_v_eta0; double __pyx_v_power_t; double __pyx_v_t; double __pyx_v_intercept_decay; PyObject *__pyx_r = 0; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("plain_sgd (wrapper)", 0); { static PyObject **__pyx_pyargnames[] = {&__pyx_n_s__weights,&__pyx_n_s__intercept,&__pyx_n_s__loss,&__pyx_n_s__penalty_type,&__pyx_n_s__alpha,&__pyx_n_s__C,&__pyx_n_s__rho,&__pyx_n_s__dataset,&__pyx_n_s__n_iter,&__pyx_n_s__fit_intercept,&__pyx_n_s__verbose,&__pyx_n_s__shuffle,&__pyx_n_s__seed,&__pyx_n_s__weight_pos,&__pyx_n_s__weight_neg,&__pyx_n_s__learning_rate,&__pyx_n_s__eta0,&__pyx_n_s__power_t,&__pyx_n_s__t,&__pyx_n_s__intercept_decay,0}; PyObject* values[20] = {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0}; if (unlikely(__pyx_kwds)) { Py_ssize_t kw_args; const Py_ssize_t pos_args = PyTuple_GET_SIZE(__pyx_args); switch (pos_args) { case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19); case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18); case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17); case 17: values[16] = PyTuple_GET_ITEM(__pyx_args, 16); case 16: values[15] = PyTuple_GET_ITEM(__pyx_args, 15); case 15: values[14] = PyTuple_GET_ITEM(__pyx_args, 14); case 14: values[13] = PyTuple_GET_ITEM(__pyx_args, 13); case 13: values[12] = PyTuple_GET_ITEM(__pyx_args, 12); case 12: values[11] = PyTuple_GET_ITEM(__pyx_args, 11); case 11: values[10] = PyTuple_GET_ITEM(__pyx_args, 10); case 10: values[9] = PyTuple_GET_ITEM(__pyx_args, 9); case 9: values[8] = PyTuple_GET_ITEM(__pyx_args, 8); case 8: values[7] = PyTuple_GET_ITEM(__pyx_args, 7); case 7: values[6] = PyTuple_GET_ITEM(__pyx_args, 6); case 6: values[5] = PyTuple_GET_ITEM(__pyx_args, 5); case 5: values[4] = PyTuple_GET_ITEM(__pyx_args, 4); case 4: values[3] = PyTuple_GET_ITEM(__pyx_args, 3); case 3: values[2] = PyTuple_GET_ITEM(__pyx_args, 2); case 2: values[1] = PyTuple_GET_ITEM(__pyx_args, 1); case 1: values[0] = PyTuple_GET_ITEM(__pyx_args, 0); case 0: break; default: goto __pyx_L5_argtuple_error; } kw_args = PyDict_Size(__pyx_kwds); switch (pos_args) { case 0: if (likely((values[0] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weights)) != 0)) kw_args--; else goto __pyx_L5_argtuple_error; case 1: if (likely((values[1] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 1); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 2: if (likely((values[2] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__loss)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 2); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 3: if (likely((values[3] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__penalty_type)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 3); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 4: if (likely((values[4] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__alpha)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 4); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 5: if (likely((values[5] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__C)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 5); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 6: if (likely((values[6] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__rho)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 6); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 7: if (likely((values[7] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__dataset)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 7); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 8: if (likely((values[8] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__n_iter)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 8); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 9: if (likely((values[9] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__fit_intercept)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 9); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 10: if (likely((values[10] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__verbose)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 10); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 11: if (likely((values[11] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__shuffle)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 11); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 12: if (likely((values[12] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__seed)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 12); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 13: if (likely((values[13] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_pos)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 13); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 14: if (likely((values[14] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__weight_neg)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 14); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 15: if (likely((values[15] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__learning_rate)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 15); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 16: if (likely((values[16] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__eta0)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 16); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 17: if (likely((values[17] = PyDict_GetItem(__pyx_kwds, __pyx_n_s__power_t)) != 0)) kw_args--; else { __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, 17); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } case 18: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__t); if (value) { values[18] = value; kw_args--; } } case 19: if (kw_args > 0) { PyObject* value = PyDict_GetItem(__pyx_kwds, __pyx_n_s__intercept_decay); if (value) { values[19] = value; kw_args--; } } } if (unlikely(kw_args > 0)) { if (unlikely(__Pyx_ParseOptionalKeywords(__pyx_kwds, __pyx_pyargnames, 0, values, pos_args, "plain_sgd") < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } } else { switch (PyTuple_GET_SIZE(__pyx_args)) { case 20: values[19] = PyTuple_GET_ITEM(__pyx_args, 19); case 19: values[18] = PyTuple_GET_ITEM(__pyx_args, 18); case 18: values[17] = PyTuple_GET_ITEM(__pyx_args, 17); values[16] = PyTuple_GET_ITEM(__pyx_args, 16); values[15] = PyTuple_GET_ITEM(__pyx_args, 15); values[14] = PyTuple_GET_ITEM(__pyx_args, 14); values[13] = PyTuple_GET_ITEM(__pyx_args, 13); values[12] = PyTuple_GET_ITEM(__pyx_args, 12); values[11] = PyTuple_GET_ITEM(__pyx_args, 11); values[10] = PyTuple_GET_ITEM(__pyx_args, 10); values[9] = PyTuple_GET_ITEM(__pyx_args, 9); values[8] = PyTuple_GET_ITEM(__pyx_args, 8); values[7] = PyTuple_GET_ITEM(__pyx_args, 7); values[6] = PyTuple_GET_ITEM(__pyx_args, 6); values[5] = PyTuple_GET_ITEM(__pyx_args, 5); values[4] = PyTuple_GET_ITEM(__pyx_args, 4); values[3] = PyTuple_GET_ITEM(__pyx_args, 3); values[2] = PyTuple_GET_ITEM(__pyx_args, 2); values[1] = PyTuple_GET_ITEM(__pyx_args, 1); values[0] = PyTuple_GET_ITEM(__pyx_args, 0); break; default: goto __pyx_L5_argtuple_error; } } __pyx_v_weights = ((PyArrayObject *)values[0]); __pyx_v_intercept = __pyx_PyFloat_AsDouble(values[1]); if (unlikely((__pyx_v_intercept == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 328; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_loss = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)values[2]); __pyx_v_penalty_type = __Pyx_PyInt_AsInt(values[3]); if (unlikely((__pyx_v_penalty_type == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 330; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_alpha = __pyx_PyFloat_AsDouble(values[4]); if (unlikely((__pyx_v_alpha == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_C = __pyx_PyFloat_AsDouble(values[5]); if (unlikely((__pyx_v_C == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 331; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_rho = __pyx_PyFloat_AsDouble(values[6]); if (unlikely((__pyx_v_rho == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 332; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_dataset = ((struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *)values[7]); __pyx_v_n_iter = __Pyx_PyInt_AsInt(values[8]); if (unlikely((__pyx_v_n_iter == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_fit_intercept = __Pyx_PyInt_AsInt(values[9]); if (unlikely((__pyx_v_fit_intercept == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 334; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_verbose = __Pyx_PyInt_AsInt(values[10]); if (unlikely((__pyx_v_verbose == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_shuffle = __Pyx_PyInt_AsInt(values[11]); if (unlikely((__pyx_v_shuffle == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 335; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_seed = values[12]; __pyx_v_weight_pos = __pyx_PyFloat_AsDouble(values[13]); if (unlikely((__pyx_v_weight_pos == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_weight_neg = __pyx_PyFloat_AsDouble(values[14]); if (unlikely((__pyx_v_weight_neg == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 336; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_learning_rate = __Pyx_PyInt_AsInt(values[15]); if (unlikely((__pyx_v_learning_rate == (int)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_eta0 = __pyx_PyFloat_AsDouble(values[16]); if (unlikely((__pyx_v_eta0 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 337; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_v_power_t = __pyx_PyFloat_AsDouble(values[17]); if (unlikely((__pyx_v_power_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 338; __pyx_clineno = __LINE__; goto __pyx_L3_error;} if (values[18]) { __pyx_v_t = __pyx_PyFloat_AsDouble(values[18]); if (unlikely((__pyx_v_t == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 339; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } else { /* "sklearn/linear_model/sgd_fast.pyx":339 * int learning_rate, double eta0, * double power_t, * double t=1.0, # <<<<<<<<<<<<<< * double intercept_decay=1.0): * """Plain SGD for generic loss functions and penalties. */ __pyx_v_t = ((double)1.0); } if (values[19]) { __pyx_v_intercept_decay = __pyx_PyFloat_AsDouble(values[19]); if (unlikely((__pyx_v_intercept_decay == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 340; __pyx_clineno = __LINE__; goto __pyx_L3_error;} } else { /* "sklearn/linear_model/sgd_fast.pyx":340 * double power_t, * double t=1.0, * double intercept_decay=1.0): # <<<<<<<<<<<<<< * """Plain SGD for generic loss functions and penalties. * */ __pyx_v_intercept_decay = ((double)1.0); } } goto __pyx_L4_argument_unpacking_done; __pyx_L5_argtuple_error:; __Pyx_RaiseArgtupleInvalid("plain_sgd", 0, 18, 20, PyTuple_GET_SIZE(__pyx_args)); {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L3_error;} __pyx_L3_error:; __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.plain_sgd", __pyx_clineno, __pyx_lineno, __pyx_filename); __Pyx_RefNannyFinishContext(); return NULL; __pyx_L4_argument_unpacking_done:; if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_weights), __pyx_ptype_5numpy_ndarray, 1, "weights", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_loss), __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction, 1, "loss", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 329; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (unlikely(!__Pyx_ArgTypeTest(((PyObject *)__pyx_v_dataset), __pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset, 1, "dataset", 0))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 333; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_r = __pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(__pyx_self, __pyx_v_weights, __pyx_v_intercept, __pyx_v_loss, __pyx_v_penalty_type, __pyx_v_alpha, __pyx_v_C, __pyx_v_rho, __pyx_v_dataset, __pyx_v_n_iter, __pyx_v_fit_intercept, __pyx_v_verbose, __pyx_v_shuffle, __pyx_v_seed, __pyx_v_weight_pos, __pyx_v_weight_neg, __pyx_v_learning_rate, __pyx_v_eta0, __pyx_v_power_t, __pyx_v_t, __pyx_v_intercept_decay); goto __pyx_L0; __pyx_L1_error:; __pyx_r = NULL; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":327 * * * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights, # <<<<<<<<<<<<<< * double intercept, * LossFunction loss, */ static PyObject *__pyx_pf_7sklearn_12linear_model_8sgd_fast_plain_sgd(CYTHON_UNUSED PyObject *__pyx_self, PyArrayObject *__pyx_v_weights, double __pyx_v_intercept, struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *__pyx_v_loss, int __pyx_v_penalty_type, double __pyx_v_alpha, double __pyx_v_C, double __pyx_v_rho, struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset *__pyx_v_dataset, int __pyx_v_n_iter, int __pyx_v_fit_intercept, int __pyx_v_verbose, int __pyx_v_shuffle, PyObject *__pyx_v_seed, double __pyx_v_weight_pos, double __pyx_v_weight_neg, int __pyx_v_learning_rate, double __pyx_v_eta0, double __pyx_v_power_t, double __pyx_v_t, double __pyx_v_intercept_decay) { Py_ssize_t __pyx_v_n_samples; Py_ssize_t __pyx_v_n_features; struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *__pyx_v_w = 0; __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_x_data_ptr; __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr; int __pyx_v_xnnz; double __pyx_v_eta; double __pyx_v_p; double __pyx_v_update; double __pyx_v_sumloss; __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE __pyx_v_y; __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE __pyx_v_sample_weight; double __pyx_v_class_weight; unsigned int __pyx_v_count; unsigned int __pyx_v_epoch; CYTHON_UNUSED unsigned int __pyx_v_i; int __pyx_v_is_hinge; PyArrayObject *__pyx_v_q = 0; __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_q_data_ptr; double __pyx_v_u; PyObject *__pyx_v_t_start = NULL; __Pyx_LocalBuf_ND __pyx_pybuffernd_q; __Pyx_Buffer __pyx_pybuffer_q; __Pyx_LocalBuf_ND __pyx_pybuffernd_weights; __Pyx_Buffer __pyx_pybuffer_weights; PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations Py_ssize_t __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; int __pyx_t_4; PyArrayObject *__pyx_t_5 = NULL; PyObject *__pyx_t_6 = NULL; PyObject *__pyx_t_7 = NULL; PyObject *__pyx_t_8 = NULL; int __pyx_t_9; PyObject *__pyx_t_10 = NULL; PyObject *__pyx_t_11 = NULL; PyObject *__pyx_t_12 = NULL; unsigned int __pyx_t_13; unsigned int __pyx_t_14; PyObject *__pyx_t_15 = NULL; int __pyx_t_16; int __pyx_t_17; int __pyx_t_18; int __pyx_t_19; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("plain_sgd", 0); __pyx_pybuffer_q.pybuffer.buf = NULL; __pyx_pybuffer_q.refcount = 0; __pyx_pybuffernd_q.data = NULL; __pyx_pybuffernd_q.rcbuffer = &__pyx_pybuffer_q; __pyx_pybuffer_weights.pybuffer.buf = NULL; __pyx_pybuffer_weights.refcount = 0; __pyx_pybuffernd_weights.data = NULL; __pyx_pybuffernd_weights.rcbuffer = &__pyx_pybuffer_weights; { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_weights.rcbuffer->pybuffer, (PyObject*)__pyx_v_weights, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_pybuffernd_weights.diminfo[0].strides = __pyx_pybuffernd_weights.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_weights.diminfo[0].shape = __pyx_pybuffernd_weights.rcbuffer->pybuffer.shape[0]; /* "sklearn/linear_model/sgd_fast.pyx":400 * * # get the data information into easy vars * cdef Py_ssize_t n_samples = dataset.n_samples # <<<<<<<<<<<<<< * cdef Py_ssize_t n_features = weights.shape[0] * */ __pyx_t_1 = __pyx_v_dataset->n_samples; __pyx_v_n_samples = __pyx_t_1; /* "sklearn/linear_model/sgd_fast.pyx":401 * # get the data information into easy vars * cdef Py_ssize_t n_samples = dataset.n_samples * cdef Py_ssize_t n_features = weights.shape[0] # <<<<<<<<<<<<<< * * cdef WeightVector w = WeightVector(weights) */ __pyx_v_n_features = (__pyx_v_weights->dimensions[0]); /* "sklearn/linear_model/sgd_fast.pyx":403 * cdef Py_ssize_t n_features = weights.shape[0] * * cdef WeightVector w = WeightVector(weights) # <<<<<<<<<<<<<< * * cdef DOUBLE * x_data_ptr = NULL */ __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_INCREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_weights)); __Pyx_GIVEREF(((PyObject *)__pyx_v_weights)); __pyx_t_3 = PyObject_Call(((PyObject *)((PyObject*)__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector)), ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 403; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_v_w = ((struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_t_3); __pyx_t_3 = 0; /* "sklearn/linear_model/sgd_fast.pyx":405 * cdef WeightVector w = WeightVector(weights) * * cdef DOUBLE * x_data_ptr = NULL # <<<<<<<<<<<<<< * cdef INTEGER * x_ind_ptr = NULL * */ __pyx_v_x_data_ptr = NULL; /* "sklearn/linear_model/sgd_fast.pyx":406 * * cdef DOUBLE * x_data_ptr = NULL * cdef INTEGER * x_ind_ptr = NULL # <<<<<<<<<<<<<< * * # helper variable */ __pyx_v_x_ind_ptr = NULL; /* "sklearn/linear_model/sgd_fast.pyx":410 * # helper variable * cdef int xnnz * cdef double eta = 0.0 # <<<<<<<<<<<<<< * cdef double p = 0.0 * cdef double update = 0.0 */ __pyx_v_eta = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":411 * cdef int xnnz * cdef double eta = 0.0 * cdef double p = 0.0 # <<<<<<<<<<<<<< * cdef double update = 0.0 * cdef double sumloss = 0.0 */ __pyx_v_p = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":412 * cdef double eta = 0.0 * cdef double p = 0.0 * cdef double update = 0.0 # <<<<<<<<<<<<<< * cdef double sumloss = 0.0 * cdef DOUBLE y = 0.0 */ __pyx_v_update = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":413 * cdef double p = 0.0 * cdef double update = 0.0 * cdef double sumloss = 0.0 # <<<<<<<<<<<<<< * cdef DOUBLE y = 0.0 * cdef DOUBLE sample_weight */ __pyx_v_sumloss = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":414 * cdef double update = 0.0 * cdef double sumloss = 0.0 * cdef DOUBLE y = 0.0 # <<<<<<<<<<<<<< * cdef DOUBLE sample_weight * cdef double class_weight = 1.0 */ __pyx_v_y = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":416 * cdef DOUBLE y = 0.0 * cdef DOUBLE sample_weight * cdef double class_weight = 1.0 # <<<<<<<<<<<<<< * cdef unsigned int count = 0 * cdef unsigned int epoch = 0 */ __pyx_v_class_weight = 1.0; /* "sklearn/linear_model/sgd_fast.pyx":417 * cdef DOUBLE sample_weight * cdef double class_weight = 1.0 * cdef unsigned int count = 0 # <<<<<<<<<<<<<< * cdef unsigned int epoch = 0 * cdef unsigned int i = 0 */ __pyx_v_count = 0; /* "sklearn/linear_model/sgd_fast.pyx":418 * cdef double class_weight = 1.0 * cdef unsigned int count = 0 * cdef unsigned int epoch = 0 # <<<<<<<<<<<<<< * cdef unsigned int i = 0 * cdef int is_hinge = isinstance(loss, Hinge) */ __pyx_v_epoch = 0; /* "sklearn/linear_model/sgd_fast.pyx":419 * cdef unsigned int count = 0 * cdef unsigned int epoch = 0 * cdef unsigned int i = 0 # <<<<<<<<<<<<<< * cdef int is_hinge = isinstance(loss, Hinge) * */ __pyx_v_i = 0; /* "sklearn/linear_model/sgd_fast.pyx":420 * cdef unsigned int epoch = 0 * cdef unsigned int i = 0 * cdef int is_hinge = isinstance(loss, Hinge) # <<<<<<<<<<<<<< * * # q vector is only used for L1 regularization */ __pyx_t_3 = ((PyObject *)((PyObject*)__pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge)); __Pyx_INCREF(__pyx_t_3); __pyx_t_4 = __Pyx_TypeCheck(((PyObject *)__pyx_v_loss), __pyx_t_3); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_v_is_hinge = __pyx_t_4; /* "sklearn/linear_model/sgd_fast.pyx":423 * * # q vector is only used for L1 regularization * cdef np.ndarray[DOUBLE, ndim = 1, mode = "c"] q = None # <<<<<<<<<<<<<< * cdef DOUBLE * q_data_ptr = NULL * if penalty_type == L1 or penalty_type == ELASTICNET: */ __pyx_t_5 = ((PyArrayObject *)Py_None); { __Pyx_BufFmt_StackElem __pyx_stack[1]; if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { __pyx_v_q = ((PyArrayObject *)Py_None); __Pyx_INCREF(Py_None); __pyx_pybuffernd_q.rcbuffer->pybuffer.buf = NULL; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 423; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else {__pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0]; } } __pyx_t_5 = 0; __Pyx_INCREF(Py_None); __pyx_v_q = ((PyArrayObject *)Py_None); /* "sklearn/linear_model/sgd_fast.pyx":424 * # q vector is only used for L1 regularization * cdef np.ndarray[DOUBLE, ndim = 1, mode = "c"] q = None * cdef DOUBLE * q_data_ptr = NULL # <<<<<<<<<<<<<< * if penalty_type == L1 or penalty_type == ELASTICNET: * q = np.zeros((n_features,), dtype=np.float64, order="c") */ __pyx_v_q_data_ptr = NULL; /* "sklearn/linear_model/sgd_fast.pyx":425 * cdef np.ndarray[DOUBLE, ndim = 1, mode = "c"] q = None * cdef DOUBLE * q_data_ptr = NULL * if penalty_type == L1 or penalty_type == ELASTICNET: # <<<<<<<<<<<<<< * q = np.zeros((n_features,), dtype=np.float64, order="c") * q_data_ptr = q.data */ switch (__pyx_v_penalty_type) { case 1: case 3: /* "sklearn/linear_model/sgd_fast.pyx":426 * cdef DOUBLE * q_data_ptr = NULL * if penalty_type == L1 or penalty_type == ELASTICNET: * q = np.zeros((n_features,), dtype=np.float64, order="c") # <<<<<<<<<<<<<< * q_data_ptr = q.data * cdef double u = 0.0 */ __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__zeros); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyInt_FromSsize_t(__pyx_v_n_features); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_6 = PyTuple_New(1); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_6, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_6)); __Pyx_GIVEREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0; __pyx_t_6 = PyDict_New(); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_6)); __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_8 = PyObject_GetAttr(__pyx_t_7, __pyx_n_s__float64); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__dtype), __pyx_t_8) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; if (PyDict_SetItem(__pyx_t_6, ((PyObject *)__pyx_n_s__order), ((PyObject *)__pyx_n_s__c)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_8 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_3), ((PyObject *)__pyx_t_6)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_6)); __pyx_t_6 = 0; if (!(likely(((__pyx_t_8) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_8, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_5 = ((PyArrayObject *)__pyx_t_8); { __Pyx_BufFmt_StackElem __pyx_stack[1]; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer); __pyx_t_9 = __Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_t_5, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack); if (unlikely(__pyx_t_9 < 0)) { PyErr_Fetch(&__pyx_t_10, &__pyx_t_11, &__pyx_t_12); if (unlikely(__Pyx_GetBufferAndValidate(&__pyx_pybuffernd_q.rcbuffer->pybuffer, (PyObject*)__pyx_v_q, &__Pyx_TypeInfo_nn___pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE, PyBUF_FORMAT| PyBUF_C_CONTIGUOUS, 1, 0, __pyx_stack) == -1)) { Py_XDECREF(__pyx_t_10); Py_XDECREF(__pyx_t_11); Py_XDECREF(__pyx_t_12); __Pyx_RaiseBufferFallbackError(); } else { PyErr_Restore(__pyx_t_10, __pyx_t_11, __pyx_t_12); } } __pyx_pybuffernd_q.diminfo[0].strides = __pyx_pybuffernd_q.rcbuffer->pybuffer.strides[0]; __pyx_pybuffernd_q.diminfo[0].shape = __pyx_pybuffernd_q.rcbuffer->pybuffer.shape[0]; if (unlikely(__pyx_t_9 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 426; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_5 = 0; __Pyx_DECREF(((PyObject *)__pyx_v_q)); __pyx_v_q = ((PyArrayObject *)__pyx_t_8); __pyx_t_8 = 0; /* "sklearn/linear_model/sgd_fast.pyx":427 * if penalty_type == L1 or penalty_type == ELASTICNET: * q = np.zeros((n_features,), dtype=np.float64, order="c") * q_data_ptr = q.data # <<<<<<<<<<<<<< * cdef double u = 0.0 * */ __pyx_v_q_data_ptr = ((__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *)__pyx_v_q->data); break; } /* "sklearn/linear_model/sgd_fast.pyx":428 * q = np.zeros((n_features,), dtype=np.float64, order="c") * q_data_ptr = q.data * cdef double u = 0.0 # <<<<<<<<<<<<<< * * if penalty_type == L2: */ __pyx_v_u = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":432 * if penalty_type == L2: * rho = 1.0 * elif penalty_type == L1: # <<<<<<<<<<<<<< * rho = 0.0 * */ switch (__pyx_v_penalty_type) { /* "sklearn/linear_model/sgd_fast.pyx":430 * cdef double u = 0.0 * * if penalty_type == L2: # <<<<<<<<<<<<<< * rho = 1.0 * elif penalty_type == L1: */ case 2: /* "sklearn/linear_model/sgd_fast.pyx":431 * * if penalty_type == L2: * rho = 1.0 # <<<<<<<<<<<<<< * elif penalty_type == L1: * rho = 0.0 */ __pyx_v_rho = 1.0; break; /* "sklearn/linear_model/sgd_fast.pyx":432 * if penalty_type == L2: * rho = 1.0 * elif penalty_type == L1: # <<<<<<<<<<<<<< * rho = 0.0 * */ case 1: /* "sklearn/linear_model/sgd_fast.pyx":433 * rho = 1.0 * elif penalty_type == L1: * rho = 0.0 # <<<<<<<<<<<<<< * * eta = eta0 */ __pyx_v_rho = 0.0; break; } /* "sklearn/linear_model/sgd_fast.pyx":435 * rho = 0.0 * * eta = eta0 # <<<<<<<<<<<<<< * * t_start = time() */ __pyx_v_eta = __pyx_v_eta0; /* "sklearn/linear_model/sgd_fast.pyx":437 * eta = eta0 * * t_start = time() # <<<<<<<<<<<<<< * for epoch in range(n_iter): * if verbose > 0: */ __pyx_t_8 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __pyx_t_6 = PyObject_Call(__pyx_t_8, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 437; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; __pyx_v_t_start = __pyx_t_6; __pyx_t_6 = 0; /* "sklearn/linear_model/sgd_fast.pyx":438 * * t_start = time() * for epoch in range(n_iter): # <<<<<<<<<<<<<< * if verbose > 0: * print("-- Epoch %d" % (epoch + 1)) */ __pyx_t_9 = __pyx_v_n_iter; for (__pyx_t_13 = 0; __pyx_t_13 < __pyx_t_9; __pyx_t_13+=1) { __pyx_v_epoch = __pyx_t_13; /* "sklearn/linear_model/sgd_fast.pyx":439 * t_start = time() * for epoch in range(n_iter): * if verbose > 0: # <<<<<<<<<<<<<< * print("-- Epoch %d" % (epoch + 1)) * if shuffle: */ __pyx_t_4 = (__pyx_v_verbose > 0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":440 * for epoch in range(n_iter): * if verbose > 0: * print("-- Epoch %d" % (epoch + 1)) # <<<<<<<<<<<<<< * if shuffle: * dataset.shuffle(seed) */ __pyx_t_6 = PyInt_FromLong((__pyx_v_epoch + 1)); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_1), __pyx_t_6); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_8)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 440; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; goto __pyx_L5; } __pyx_L5:; /* "sklearn/linear_model/sgd_fast.pyx":441 * if verbose > 0: * print("-- Epoch %d" % (epoch + 1)) * if shuffle: # <<<<<<<<<<<<<< * dataset.shuffle(seed) * for i in range(n_samples): */ if (__pyx_v_shuffle) { /* "sklearn/linear_model/sgd_fast.pyx":442 * print("-- Epoch %d" % (epoch + 1)) * if shuffle: * dataset.shuffle(seed) # <<<<<<<<<<<<<< * for i in range(n_samples): * dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y, */ ((struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *)__pyx_v_dataset->__pyx_vtab)->shuffle(__pyx_v_dataset, __pyx_v_seed); goto __pyx_L6; } __pyx_L6:; /* "sklearn/linear_model/sgd_fast.pyx":443 * if shuffle: * dataset.shuffle(seed) * for i in range(n_samples): # <<<<<<<<<<<<<< * dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y, * & sample_weight) */ __pyx_t_1 = __pyx_v_n_samples; for (__pyx_t_14 = 0; __pyx_t_14 < __pyx_t_1; __pyx_t_14+=1) { __pyx_v_i = __pyx_t_14; /* "sklearn/linear_model/sgd_fast.pyx":445 * for i in range(n_samples): * dataset.next( & x_data_ptr, & x_ind_ptr, & xnnz, & y, * & sample_weight) # <<<<<<<<<<<<<< * * p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept */ ((struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset *)__pyx_v_dataset->__pyx_vtab)->next(__pyx_v_dataset, (&__pyx_v_x_data_ptr), (&__pyx_v_x_ind_ptr), (&__pyx_v_xnnz), (&__pyx_v_y), (&__pyx_v_sample_weight)); /* "sklearn/linear_model/sgd_fast.pyx":447 * & sample_weight) * * p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept # <<<<<<<<<<<<<< * * if learning_rate == OPTIMAL: */ __pyx_v_p = (((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->dot(__pyx_v_w, __pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz) + __pyx_v_intercept); /* "sklearn/linear_model/sgd_fast.pyx":451 * if learning_rate == OPTIMAL: * eta = 1.0 / (alpha * t) * elif learning_rate == INVSCALING: # <<<<<<<<<<<<<< * eta = eta0 / pow(t, power_t) * */ switch (__pyx_v_learning_rate) { /* "sklearn/linear_model/sgd_fast.pyx":449 * p = w.dot(x_data_ptr, x_ind_ptr, xnnz) + intercept * * if learning_rate == OPTIMAL: # <<<<<<<<<<<<<< * eta = 1.0 / (alpha * t) * elif learning_rate == INVSCALING: */ case 2: /* "sklearn/linear_model/sgd_fast.pyx":450 * * if learning_rate == OPTIMAL: * eta = 1.0 / (alpha * t) # <<<<<<<<<<<<<< * elif learning_rate == INVSCALING: * eta = eta0 / pow(t, power_t) */ __pyx_v_eta = (1.0 / (__pyx_v_alpha * __pyx_v_t)); break; /* "sklearn/linear_model/sgd_fast.pyx":451 * if learning_rate == OPTIMAL: * eta = 1.0 / (alpha * t) * elif learning_rate == INVSCALING: # <<<<<<<<<<<<<< * eta = eta0 / pow(t, power_t) * */ case 3: /* "sklearn/linear_model/sgd_fast.pyx":452 * eta = 1.0 / (alpha * t) * elif learning_rate == INVSCALING: * eta = eta0 / pow(t, power_t) # <<<<<<<<<<<<<< * * if verbose > 0: */ __pyx_v_eta = (__pyx_v_eta0 / pow(__pyx_v_t, __pyx_v_power_t)); break; } /* "sklearn/linear_model/sgd_fast.pyx":454 * eta = eta0 / pow(t, power_t) * * if verbose > 0: # <<<<<<<<<<<<<< * sumloss += loss.loss(p, y) * */ __pyx_t_4 = (__pyx_v_verbose > 0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":455 * * if verbose > 0: * sumloss += loss.loss(p, y) # <<<<<<<<<<<<<< * * if y > 0.0: */ __pyx_v_sumloss = (__pyx_v_sumloss + ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0)); goto __pyx_L9; } __pyx_L9:; /* "sklearn/linear_model/sgd_fast.pyx":457 * sumloss += loss.loss(p, y) * * if y > 0.0: # <<<<<<<<<<<<<< * class_weight = weight_pos * else: */ __pyx_t_4 = (__pyx_v_y > 0.0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":458 * * if y > 0.0: * class_weight = weight_pos # <<<<<<<<<<<<<< * else: * class_weight = weight_neg */ __pyx_v_class_weight = __pyx_v_weight_pos; goto __pyx_L10; } /*else*/ { /* "sklearn/linear_model/sgd_fast.pyx":460 * class_weight = weight_pos * else: * class_weight = weight_neg # <<<<<<<<<<<<<< * * if learning_rate == PA1: */ __pyx_v_class_weight = __pyx_v_weight_neg; } __pyx_L10:; /* "sklearn/linear_model/sgd_fast.pyx":467 * continue * update = min(C, loss.loss(p, y) / update) * elif learning_rate == PA2: # <<<<<<<<<<<<<< * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) * update = loss.loss(p, y) / (update + 0.5 / C) */ switch (__pyx_v_learning_rate) { /* "sklearn/linear_model/sgd_fast.pyx":462 * class_weight = weight_neg * * if learning_rate == PA1: # <<<<<<<<<<<<<< * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) * if update == 0: */ case 4: /* "sklearn/linear_model/sgd_fast.pyx":463 * * if learning_rate == PA1: * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) # <<<<<<<<<<<<<< * if update == 0: * continue */ __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz); /* "sklearn/linear_model/sgd_fast.pyx":464 * if learning_rate == PA1: * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) * if update == 0: # <<<<<<<<<<<<<< * continue * update = min(C, loss.loss(p, y) / update) */ __pyx_t_4 = (__pyx_v_update == 0.0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":465 * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) * if update == 0: * continue # <<<<<<<<<<<<<< * update = min(C, loss.loss(p, y) / update) * elif learning_rate == PA2: */ goto __pyx_L7_continue; goto __pyx_L11; } __pyx_L11:; /* "sklearn/linear_model/sgd_fast.pyx":466 * if update == 0: * continue * update = min(C, loss.loss(p, y) / update) # <<<<<<<<<<<<<< * elif learning_rate == PA2: * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) */ __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_min(__pyx_v_C, (((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0) / __pyx_v_update)); break; /* "sklearn/linear_model/sgd_fast.pyx":467 * continue * update = min(C, loss.loss(p, y) / update) * elif learning_rate == PA2: # <<<<<<<<<<<<<< * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) * update = loss.loss(p, y) / (update + 0.5 / C) */ case 5: /* "sklearn/linear_model/sgd_fast.pyx":468 * update = min(C, loss.loss(p, y) / update) * elif learning_rate == PA2: * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) # <<<<<<<<<<<<<< * update = loss.loss(p, y) / (update + 0.5 / C) * else: */ __pyx_v_update = __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz); /* "sklearn/linear_model/sgd_fast.pyx":469 * elif learning_rate == PA2: * update = sqnorm(x_data_ptr, x_ind_ptr, xnnz) * update = loss.loss(p, y) / (update + 0.5 / C) # <<<<<<<<<<<<<< * else: * update = -eta * loss.dloss(p, y) */ __pyx_v_update = (((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->loss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0) / (__pyx_v_update + (0.5 / __pyx_v_C))); break; default: /* "sklearn/linear_model/sgd_fast.pyx":471 * update = loss.loss(p, y) / (update + 0.5 / C) * else: * update = -eta * loss.dloss(p, y) # <<<<<<<<<<<<<< * * if learning_rate >= PA1: */ __pyx_v_update = ((-__pyx_v_eta) * ((struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction *)__pyx_v_loss->__pyx_vtab)->dloss(__pyx_v_loss, __pyx_v_p, __pyx_v_y, 0)); break; } /* "sklearn/linear_model/sgd_fast.pyx":473 * update = -eta * loss.dloss(p, y) * * if learning_rate >= PA1: # <<<<<<<<<<<<<< * if is_hinge: * # classification */ __pyx_t_4 = (__pyx_v_learning_rate >= 4); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":474 * * if learning_rate >= PA1: * if is_hinge: # <<<<<<<<<<<<<< * # classification * update *= y */ if (__pyx_v_is_hinge) { /* "sklearn/linear_model/sgd_fast.pyx":476 * if is_hinge: * # classification * update *= y # <<<<<<<<<<<<<< * elif y - p < 0: * # regression */ __pyx_v_update = (__pyx_v_update * __pyx_v_y); goto __pyx_L13; } /* "sklearn/linear_model/sgd_fast.pyx":477 * # classification * update *= y * elif y - p < 0: # <<<<<<<<<<<<<< * # regression * update *= -1 */ __pyx_t_4 = ((__pyx_v_y - __pyx_v_p) < 0.0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":479 * elif y - p < 0: * # regression * update *= -1 # <<<<<<<<<<<<<< * * update *= class_weight * sample_weight */ __pyx_v_update = (__pyx_v_update * -1.0); goto __pyx_L13; } __pyx_L13:; goto __pyx_L12; } __pyx_L12:; /* "sklearn/linear_model/sgd_fast.pyx":481 * update *= -1 * * update *= class_weight * sample_weight # <<<<<<<<<<<<<< * * if update != 0.0: */ __pyx_v_update = (__pyx_v_update * (__pyx_v_class_weight * __pyx_v_sample_weight)); /* "sklearn/linear_model/sgd_fast.pyx":483 * update *= class_weight * sample_weight * * if update != 0.0: # <<<<<<<<<<<<<< * w.add(x_data_ptr, x_ind_ptr, xnnz, update) * if fit_intercept == 1: */ __pyx_t_4 = (__pyx_v_update != 0.0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":484 * * if update != 0.0: * w.add(x_data_ptr, x_ind_ptr, xnnz, update) # <<<<<<<<<<<<<< * if fit_intercept == 1: * intercept += update * intercept_decay */ ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->add(__pyx_v_w, __pyx_v_x_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz, __pyx_v_update); /* "sklearn/linear_model/sgd_fast.pyx":485 * if update != 0.0: * w.add(x_data_ptr, x_ind_ptr, xnnz, update) * if fit_intercept == 1: # <<<<<<<<<<<<<< * intercept += update * intercept_decay * if penalty_type >= L2: */ __pyx_t_4 = (__pyx_v_fit_intercept == 1); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":486 * w.add(x_data_ptr, x_ind_ptr, xnnz, update) * if fit_intercept == 1: * intercept += update * intercept_decay # <<<<<<<<<<<<<< * if penalty_type >= L2: * w.scale(1.0 - (rho * eta * alpha)) */ __pyx_v_intercept = (__pyx_v_intercept + (__pyx_v_update * __pyx_v_intercept_decay)); goto __pyx_L15; } __pyx_L15:; goto __pyx_L14; } __pyx_L14:; /* "sklearn/linear_model/sgd_fast.pyx":487 * if fit_intercept == 1: * intercept += update * intercept_decay * if penalty_type >= L2: # <<<<<<<<<<<<<< * w.scale(1.0 - (rho * eta * alpha)) * */ __pyx_t_4 = (__pyx_v_penalty_type >= 2); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":488 * intercept += update * intercept_decay * if penalty_type >= L2: * w.scale(1.0 - (rho * eta * alpha)) # <<<<<<<<<<<<<< * * if penalty_type == L1 or penalty_type == ELASTICNET: */ ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->scale(__pyx_v_w, (1.0 - ((__pyx_v_rho * __pyx_v_eta) * __pyx_v_alpha))); goto __pyx_L16; } __pyx_L16:; /* "sklearn/linear_model/sgd_fast.pyx":490 * w.scale(1.0 - (rho * eta * alpha)) * * if penalty_type == L1 or penalty_type == ELASTICNET: # <<<<<<<<<<<<<< * u += ((1.0 - rho) * eta * alpha) * l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u) */ switch (__pyx_v_penalty_type) { case 1: case 3: /* "sklearn/linear_model/sgd_fast.pyx":491 * * if penalty_type == L1 or penalty_type == ELASTICNET: * u += ((1.0 - rho) * eta * alpha) # <<<<<<<<<<<<<< * l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u) * t += 1 */ __pyx_v_u = (__pyx_v_u + (((1.0 - __pyx_v_rho) * __pyx_v_eta) * __pyx_v_alpha)); /* "sklearn/linear_model/sgd_fast.pyx":492 * if penalty_type == L1 or penalty_type == ELASTICNET: * u += ((1.0 - rho) * eta * alpha) * l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u) # <<<<<<<<<<<<<< * t += 1 * count += 1 */ __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(__pyx_v_w, __pyx_v_q_data_ptr, __pyx_v_x_ind_ptr, __pyx_v_xnnz, __pyx_v_u); break; } /* "sklearn/linear_model/sgd_fast.pyx":493 * u += ((1.0 - rho) * eta * alpha) * l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u) * t += 1 # <<<<<<<<<<<<<< * count += 1 * */ __pyx_v_t = (__pyx_v_t + 1.0); /* "sklearn/linear_model/sgd_fast.pyx":494 * l1penalty(w, q_data_ptr, x_ind_ptr, xnnz, u) * t += 1 * count += 1 # <<<<<<<<<<<<<< * * # report epoch information */ __pyx_v_count = (__pyx_v_count + 1); __pyx_L7_continue:; } /* "sklearn/linear_model/sgd_fast.pyx":497 * * # report epoch information * if verbose > 0: # <<<<<<<<<<<<<< * print("Norm: %.2f, NNZs: %d, " * "Bias: %.6f, T: %d, Avg. loss: %.6f" % (w.norm(), */ __pyx_t_4 = (__pyx_v_verbose > 0); if (__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":499 * if verbose > 0: * print("Norm: %.2f, NNZs: %d, " * "Bias: %.6f, T: %d, Avg. loss: %.6f" % (w.norm(), # <<<<<<<<<<<<<< * weights.nonzero()[0].shape[0], * intercept, count, */ __pyx_t_8 = PyFloat_FromDouble(((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->norm(__pyx_v_w)); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); /* "sklearn/linear_model/sgd_fast.pyx":500 * print("Norm: %.2f, NNZs: %d, " * "Bias: %.6f, T: %d, Avg. loss: %.6f" % (w.norm(), * weights.nonzero()[0].shape[0], # <<<<<<<<<<<<<< * intercept, count, * sumloss / count)) */ __pyx_t_6 = PyObject_GetAttr(((PyObject *)__pyx_v_weights), __pyx_n_s__nonzero); if (unlikely(!__pyx_t_6)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __pyx_t_3 = PyObject_Call(__pyx_t_6, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyObject_GetAttr(__pyx_t_6, __pyx_n_s__shape); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_6); __pyx_t_6 = 0; __pyx_t_6 = __Pyx_GetItemInt(__pyx_t_3, 0, sizeof(long), PyInt_FromLong); if (!__pyx_t_6) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 500; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_6); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "sklearn/linear_model/sgd_fast.pyx":501 * "Bias: %.6f, T: %d, Avg. loss: %.6f" % (w.norm(), * weights.nonzero()[0].shape[0], * intercept, count, # <<<<<<<<<<<<<< * sumloss / count)) * print("Total training time: %.2f seconds." % (time() - t_start)) */ __pyx_t_3 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_2 = PyLong_FromUnsignedLong(__pyx_v_count); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 501; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); /* "sklearn/linear_model/sgd_fast.pyx":502 * weights.nonzero()[0].shape[0], * intercept, count, * sumloss / count)) # <<<<<<<<<<<<<< * print("Total training time: %.2f seconds." % (time() - t_start)) * */ __pyx_t_7 = PyFloat_FromDouble((__pyx_v_sumloss / __pyx_v_count)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 502; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_15 = PyTuple_New(5); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_8); __Pyx_GIVEREF(__pyx_t_8); PyTuple_SET_ITEM(__pyx_t_15, 1, __pyx_t_6); __Pyx_GIVEREF(__pyx_t_6); PyTuple_SET_ITEM(__pyx_t_15, 2, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_15, 3, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); PyTuple_SET_ITEM(__pyx_t_15, 4, __pyx_t_7); __Pyx_GIVEREF(__pyx_t_7); __pyx_t_8 = 0; __pyx_t_6 = 0; __pyx_t_3 = 0; __pyx_t_2 = 0; __pyx_t_7 = 0; __pyx_t_7 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_2), ((PyObject *)__pyx_t_15)); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 499; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_7)); __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0; if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_7)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 498; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_7)); __pyx_t_7 = 0; /* "sklearn/linear_model/sgd_fast.pyx":503 * intercept, count, * sumloss / count)) * print("Total training time: %.2f seconds." % (time() - t_start)) # <<<<<<<<<<<<<< * * # floating-point under-/overflow check. */ __pyx_t_7 = __Pyx_GetName(__pyx_m, __pyx_n_s__time); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __pyx_t_15 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_empty_tuple), NULL); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __pyx_t_7 = PyNumber_Subtract(__pyx_t_15, __pyx_v_t_start); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; __pyx_t_15 = PyNumber_Remainder(((PyObject *)__pyx_kp_s_3), __pyx_t_7); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_15)); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; if (__Pyx_PrintOne(0, ((PyObject *)__pyx_t_15)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 503; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0; goto __pyx_L17; } __pyx_L17:; /* "sklearn/linear_model/sgd_fast.pyx":506 * * # floating-point under-/overflow check. * if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \ # <<<<<<<<<<<<<< * or np.isnan(intercept) or np.isinf(intercept): * raise ValueError("floating-point under-/overflow occured.") */ __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); __pyx_t_7 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__any); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; __pyx_t_15 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); __pyx_t_2 = PyObject_GetAttr(__pyx_t_15, __pyx_n_s__isinf); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); __Pyx_INCREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_15, 0, ((PyObject *)__pyx_v_weights)); __Pyx_GIVEREF(((PyObject *)__pyx_v_weights)); __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0; __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_3); __Pyx_GIVEREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0; __pyx_t_4 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_4 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_4) { /* "sklearn/linear_model/sgd_fast.pyx":507 * # floating-point under-/overflow check. * if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \ * or np.isnan(intercept) or np.isinf(intercept): # <<<<<<<<<<<<<< * raise ValueError("floating-point under-/overflow occured.") * */ __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_15 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__any); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; /* "sklearn/linear_model/sgd_fast.pyx":506 * * # floating-point under-/overflow check. * if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \ # <<<<<<<<<<<<<< * or np.isnan(intercept) or np.isinf(intercept): * raise ValueError("floating-point under-/overflow occured.") */ __pyx_t_3 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_7 = PyObject_GetAttr(__pyx_t_3, __pyx_n_s__isnan); if (unlikely(!__pyx_t_7)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_7); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_weights)); __Pyx_GIVEREF(((PyObject *)__pyx_v_weights)); __pyx_t_2 = PyObject_Call(__pyx_t_7, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_7); __pyx_t_7 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __pyx_t_16 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_16 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 506; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (!__pyx_t_16) { /* "sklearn/linear_model/sgd_fast.pyx":507 * # floating-point under-/overflow check. * if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \ * or np.isnan(intercept) or np.isinf(intercept): # <<<<<<<<<<<<<< * raise ValueError("floating-point under-/overflow occured.") * */ __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isnan); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_15 = PyTuple_New(1); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); PyTuple_SET_ITEM(__pyx_t_15, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_15), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_15)); __pyx_t_15 = 0; __pyx_t_17 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_17 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; if (!__pyx_t_17) { __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_15 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__isinf); if (unlikely(!__pyx_t_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_15); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyObject_Call(__pyx_t_15, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_15); __pyx_t_15 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __pyx_t_18 = __Pyx_PyObject_IsTrue(__pyx_t_2); if (unlikely(__pyx_t_18 < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 507; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_19 = __pyx_t_18; } else { __pyx_t_19 = __pyx_t_17; } __pyx_t_17 = __pyx_t_19; } else { __pyx_t_17 = __pyx_t_16; } __pyx_t_16 = __pyx_t_17; } else { __pyx_t_16 = __pyx_t_4; } if (__pyx_t_16) { /* "sklearn/linear_model/sgd_fast.pyx":508 * if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \ * or np.isnan(intercept) or np.isinf(intercept): * raise ValueError("floating-point under-/overflow occured.") # <<<<<<<<<<<<<< * * w.reset_wscale() */ __pyx_t_2 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_5), NULL); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_Raise(__pyx_t_2, 0, 0, 0); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L18; } __pyx_L18:; } /* "sklearn/linear_model/sgd_fast.pyx":510 * raise ValueError("floating-point under-/overflow occured.") * * w.reset_wscale() # <<<<<<<<<<<<<< * * return weights, intercept */ ((struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector *)__pyx_v_w->__pyx_vtab)->reset_wscale(__pyx_v_w); /* "sklearn/linear_model/sgd_fast.pyx":512 * w.reset_wscale() * * return weights, intercept # <<<<<<<<<<<<<< * * */ __Pyx_XDECREF(__pyx_r); __pyx_t_2 = PyFloat_FromDouble(__pyx_v_intercept); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyTuple_New(2); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 512; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_INCREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_v_weights)); __Pyx_GIVEREF(((PyObject *)__pyx_v_weights)); PyTuple_SET_ITEM(__pyx_t_3, 1, __pyx_t_2); __Pyx_GIVEREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_r = ((PyObject *)__pyx_t_3); __pyx_t_3 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_6); __Pyx_XDECREF(__pyx_t_7); __Pyx_XDECREF(__pyx_t_8); __Pyx_XDECREF(__pyx_t_15); { PyObject *__pyx_type, *__pyx_value, *__pyx_tb; __Pyx_ErrFetch(&__pyx_type, &__pyx_value, &__pyx_tb); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer); __Pyx_ErrRestore(__pyx_type, __pyx_value, __pyx_tb);} __Pyx_AddTraceback("sklearn.linear_model.sgd_fast.plain_sgd", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; goto __pyx_L2; __pyx_L0:; __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_q.rcbuffer->pybuffer); __Pyx_SafeReleaseBuffer(&__pyx_pybuffernd_weights.rcbuffer->pybuffer); __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_w); __Pyx_XDECREF((PyObject *)__pyx_v_q); __Pyx_XDECREF(__pyx_v_t_start); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":515 * * * cdef inline double max(double a, double b): # <<<<<<<<<<<<<< * return a if a >= b else b * */ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_max(double __pyx_v_a, double __pyx_v_b) { double __pyx_r; __Pyx_RefNannyDeclarations double __pyx_t_1; __Pyx_RefNannySetupContext("max", 0); /* "sklearn/linear_model/sgd_fast.pyx":516 * * cdef inline double max(double a, double b): * return a if a >= b else b # <<<<<<<<<<<<<< * * */ if ((__pyx_v_a >= __pyx_v_b)) { __pyx_t_1 = __pyx_v_a; } else { __pyx_t_1 = __pyx_v_b; } __pyx_r = __pyx_t_1; goto __pyx_L0; __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":519 * * * cdef inline double min(double a, double b): # <<<<<<<<<<<<<< * return a if a <= b else b * */ static CYTHON_INLINE double __pyx_f_7sklearn_12linear_model_8sgd_fast_min(double __pyx_v_a, double __pyx_v_b) { double __pyx_r; __Pyx_RefNannyDeclarations double __pyx_t_1; __Pyx_RefNannySetupContext("min", 0); /* "sklearn/linear_model/sgd_fast.pyx":520 * * cdef inline double min(double a, double b): * return a if a <= b else b # <<<<<<<<<<<<<< * * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz): */ if ((__pyx_v_a <= __pyx_v_b)) { __pyx_t_1 = __pyx_v_a; } else { __pyx_t_1 = __pyx_v_b; } __pyx_r = __pyx_t_1; goto __pyx_L0; __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":522 * return a if a <= b else b * * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz): # <<<<<<<<<<<<<< * cdef double x_norm = 0.0 * cdef int j */ static double __pyx_f_7sklearn_12linear_model_8sgd_fast_sqnorm(__pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_x_data_ptr, CYTHON_UNUSED __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr, int __pyx_v_xnnz) { double __pyx_v_x_norm; int __pyx_v_j; double __pyx_v_z; double __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; __Pyx_RefNannySetupContext("sqnorm", 0); /* "sklearn/linear_model/sgd_fast.pyx":523 * * cdef double sqnorm(DOUBLE * x_data_ptr, INTEGER * x_ind_ptr, int xnnz): * cdef double x_norm = 0.0 # <<<<<<<<<<<<<< * cdef int j * cdef double z */ __pyx_v_x_norm = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":526 * cdef int j * cdef double z * for j in range(xnnz): # <<<<<<<<<<<<<< * z = x_data_ptr[j] * x_norm += z * z */ __pyx_t_1 = __pyx_v_xnnz; for (__pyx_t_2 = 0; __pyx_t_2 < __pyx_t_1; __pyx_t_2+=1) { __pyx_v_j = __pyx_t_2; /* "sklearn/linear_model/sgd_fast.pyx":527 * cdef double z * for j in range(xnnz): * z = x_data_ptr[j] # <<<<<<<<<<<<<< * x_norm += z * z * return x_norm */ __pyx_v_z = (__pyx_v_x_data_ptr[__pyx_v_j]); /* "sklearn/linear_model/sgd_fast.pyx":528 * for j in range(xnnz): * z = x_data_ptr[j] * x_norm += z * z # <<<<<<<<<<<<<< * return x_norm * */ __pyx_v_x_norm = (__pyx_v_x_norm + (__pyx_v_z * __pyx_v_z)); } /* "sklearn/linear_model/sgd_fast.pyx":529 * z = x_data_ptr[j] * x_norm += z * z * return x_norm # <<<<<<<<<<<<<< * * cdef void l1penalty(WeightVector w, DOUBLE * q_data_ptr, */ __pyx_r = __pyx_v_x_norm; goto __pyx_L0; __pyx_r = 0; __pyx_L0:; __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "sklearn/linear_model/sgd_fast.pyx":531 * return x_norm * * cdef void l1penalty(WeightVector w, DOUBLE * q_data_ptr, # <<<<<<<<<<<<<< * INTEGER * x_ind_ptr, int xnnz, double u): * """Apply the L1 penalty to each updated feature */ static void __pyx_f_7sklearn_12linear_model_8sgd_fast_l1penalty(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector *__pyx_v_w, __pyx_t_7sklearn_12linear_model_8sgd_fast_DOUBLE *__pyx_v_q_data_ptr, __pyx_t_7sklearn_12linear_model_8sgd_fast_INTEGER *__pyx_v_x_ind_ptr, int __pyx_v_xnnz, double __pyx_v_u) { double __pyx_v_z; int __pyx_v_j; int __pyx_v_idx; double __pyx_v_wscale; double *__pyx_v_w_data_ptr; __Pyx_RefNannyDeclarations double __pyx_t_1; __pyx_t_7sklearn_5utils_13weight_vector_DOUBLE *__pyx_t_2; int __pyx_t_3; int __pyx_t_4; int __pyx_t_5; int __pyx_t_6; __Pyx_RefNannySetupContext("l1penalty", 0); /* "sklearn/linear_model/sgd_fast.pyx":538 * [Tsuruoka, Y., Tsujii, J., and Ananiadou, S., 2009]. * """ * cdef double z = 0.0 # <<<<<<<<<<<<<< * cdef int j = 0 * cdef int idx = 0 */ __pyx_v_z = 0.0; /* "sklearn/linear_model/sgd_fast.pyx":539 * """ * cdef double z = 0.0 * cdef int j = 0 # <<<<<<<<<<<<<< * cdef int idx = 0 * cdef double wscale = w.wscale */ __pyx_v_j = 0; /* "sklearn/linear_model/sgd_fast.pyx":540 * cdef double z = 0.0 * cdef int j = 0 * cdef int idx = 0 # <<<<<<<<<<<<<< * cdef double wscale = w.wscale * cdef double * w_data_ptr = w.w_data_ptr */ __pyx_v_idx = 0; /* "sklearn/linear_model/sgd_fast.pyx":541 * cdef int j = 0 * cdef int idx = 0 * cdef double wscale = w.wscale # <<<<<<<<<<<<<< * cdef double * w_data_ptr = w.w_data_ptr * for j in range(xnnz): */ __pyx_t_1 = __pyx_v_w->wscale; __pyx_v_wscale = __pyx_t_1; /* "sklearn/linear_model/sgd_fast.pyx":542 * cdef int idx = 0 * cdef double wscale = w.wscale * cdef double * w_data_ptr = w.w_data_ptr # <<<<<<<<<<<<<< * for j in range(xnnz): * idx = x_ind_ptr[j] */ __pyx_t_2 = __pyx_v_w->w_data_ptr; __pyx_v_w_data_ptr = __pyx_t_2; /* "sklearn/linear_model/sgd_fast.pyx":543 * cdef double wscale = w.wscale * cdef double * w_data_ptr = w.w_data_ptr * for j in range(xnnz): # <<<<<<<<<<<<<< * idx = x_ind_ptr[j] * z = w_data_ptr[idx] */ __pyx_t_3 = __pyx_v_xnnz; for (__pyx_t_4 = 0; __pyx_t_4 < __pyx_t_3; __pyx_t_4+=1) { __pyx_v_j = __pyx_t_4; /* "sklearn/linear_model/sgd_fast.pyx":544 * cdef double * w_data_ptr = w.w_data_ptr * for j in range(xnnz): * idx = x_ind_ptr[j] # <<<<<<<<<<<<<< * z = w_data_ptr[idx] * if (wscale * w_data_ptr[idx]) > 0.0: */ __pyx_v_idx = (__pyx_v_x_ind_ptr[__pyx_v_j]); /* "sklearn/linear_model/sgd_fast.pyx":545 * for j in range(xnnz): * idx = x_ind_ptr[j] * z = w_data_ptr[idx] # <<<<<<<<<<<<<< * if (wscale * w_data_ptr[idx]) > 0.0: * w_data_ptr[idx] = max( */ __pyx_v_z = (__pyx_v_w_data_ptr[__pyx_v_idx]); /* "sklearn/linear_model/sgd_fast.pyx":546 * idx = x_ind_ptr[j] * z = w_data_ptr[idx] * if (wscale * w_data_ptr[idx]) > 0.0: # <<<<<<<<<<<<<< * w_data_ptr[idx] = max( * 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale)) */ __pyx_t_5 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) > 0.0); if (__pyx_t_5) { /* "sklearn/linear_model/sgd_fast.pyx":547 * z = w_data_ptr[idx] * if (wscale * w_data_ptr[idx]) > 0.0: * w_data_ptr[idx] = max( # <<<<<<<<<<<<<< * 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale)) * */ (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_7sklearn_12linear_model_8sgd_fast_max(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) - ((__pyx_v_u + (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale))); goto __pyx_L5; } /* "sklearn/linear_model/sgd_fast.pyx":550 * 0.0, w_data_ptr[idx] - ((u + q_data_ptr[idx]) / wscale)) * * elif (wscale * w_data_ptr[idx]) < 0.0: # <<<<<<<<<<<<<< * w_data_ptr[idx] = min( * 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale)) */ __pyx_t_5 = ((__pyx_v_wscale * (__pyx_v_w_data_ptr[__pyx_v_idx])) < 0.0); if (__pyx_t_5) { /* "sklearn/linear_model/sgd_fast.pyx":551 * * elif (wscale * w_data_ptr[idx]) < 0.0: * w_data_ptr[idx] = min( # <<<<<<<<<<<<<< * 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale)) * */ (__pyx_v_w_data_ptr[__pyx_v_idx]) = __pyx_f_7sklearn_12linear_model_8sgd_fast_min(0.0, ((__pyx_v_w_data_ptr[__pyx_v_idx]) + ((__pyx_v_u - (__pyx_v_q_data_ptr[__pyx_v_idx])) / __pyx_v_wscale))); goto __pyx_L5; } __pyx_L5:; /* "sklearn/linear_model/sgd_fast.pyx":554 * 0.0, w_data_ptr[idx] + ((u - q_data_ptr[idx]) / wscale)) * * q_data_ptr[idx] += (wscale * (w_data_ptr[idx] - z)) # <<<<<<<<<<<<<< */ __pyx_t_6 = __pyx_v_idx; (__pyx_v_q_data_ptr[__pyx_t_6]) = ((__pyx_v_q_data_ptr[__pyx_t_6]) + (__pyx_v_wscale * ((__pyx_v_w_data_ptr[__pyx_v_idx]) - __pyx_v_z))); } __Pyx_RefNannyFinishContext(); } /* Python wrapper */ static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ static CYTHON_UNUSED int __pyx_pw_5numpy_7ndarray_1__getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_r; __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__getbuffer__ (wrapper)", 0); __pyx_r = __pyx_pf_5numpy_7ndarray___getbuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info), ((int)__pyx_v_flags)); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":194 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< * # This implementation of getbuffer is geared towards Cython * # requirements, and does not yet fullfill the PEP. */ static int __pyx_pf_5numpy_7ndarray___getbuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_v_copy_shape; int __pyx_v_i; int __pyx_v_ndim; int __pyx_v_endian_detector; int __pyx_v_little_endian; int __pyx_v_t; char *__pyx_v_f; PyArray_Descr *__pyx_v_descr = 0; int __pyx_v_offset; int __pyx_v_hasfields; int __pyx_r; __Pyx_RefNannyDeclarations int __pyx_t_1; int __pyx_t_2; int __pyx_t_3; PyObject *__pyx_t_4 = NULL; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; char *__pyx_t_9; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("__getbuffer__", 0); if (__pyx_v_info != NULL) { __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); } /* "numpy.pxd":200 * # of flags * * if info == NULL: return # <<<<<<<<<<<<<< * * cdef int copy_shape, i, ndim */ __pyx_t_1 = (__pyx_v_info == NULL); if (__pyx_t_1) { __pyx_r = 0; goto __pyx_L0; goto __pyx_L3; } __pyx_L3:; /* "numpy.pxd":203 * * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * */ __pyx_v_endian_detector = 1; /* "numpy.pxd":204 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":206 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_v_ndim = PyArray_NDIM(__pyx_v_self); /* "numpy.pxd":208 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: */ __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_1) { /* "numpy.pxd":209 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: * copy_shape = 0 */ __pyx_v_copy_shape = 1; goto __pyx_L4; } /*else*/ { /* "numpy.pxd":211 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ __pyx_v_copy_shape = 0; } __pyx_L4:; /* "numpy.pxd":213 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ __pyx_t_1 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS); if (__pyx_t_1) { /* "numpy.pxd":214 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") * */ __pyx_t_2 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_C_CONTIGUOUS)); __pyx_t_3 = __pyx_t_2; } else { __pyx_t_3 = __pyx_t_1; } if (__pyx_t_3) { /* "numpy.pxd":215 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_7), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":217 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ __pyx_t_3 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS); if (__pyx_t_3) { /* "numpy.pxd":218 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") * */ __pyx_t_1 = (!PyArray_CHKFLAGS(__pyx_v_self, NPY_F_CONTIGUOUS)); __pyx_t_2 = __pyx_t_1; } else { __pyx_t_2 = __pyx_t_3; } if (__pyx_t_2) { /* "numpy.pxd":219 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_9), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "numpy.pxd":221 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: */ __pyx_v_info->buf = PyArray_DATA(__pyx_v_self); /* "numpy.pxd":222 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: * # Allocate new buffer for strides and shape info. */ __pyx_v_info->ndim = __pyx_v_ndim; /* "numpy.pxd":223 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. */ if (__pyx_v_copy_shape) { /* "numpy.pxd":226 * # Allocate new buffer for strides and shape info. * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< * info.shape = info.strides + ndim * for i in range(ndim): */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * ((size_t)__pyx_v_ndim)) * 2))); /* "numpy.pxd":227 * # This is allocated as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); /* "numpy.pxd":228 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] */ __pyx_t_5 = __pyx_v_ndim; for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; /* "numpy.pxd":229 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< * info.shape[i] = PyArray_DIMS(self)[i] * else: */ (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(__pyx_v_self)[__pyx_v_i]); /* "numpy.pxd":230 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< * else: * info.strides = PyArray_STRIDES(self) */ (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(__pyx_v_self)[__pyx_v_i]); } goto __pyx_L7; } /*else*/ { /* "numpy.pxd":232 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL */ __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(__pyx_v_self)); /* "numpy.pxd":233 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) */ __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(__pyx_v_self)); } __pyx_L7:; /* "numpy.pxd":234 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) */ __pyx_v_info->suboffsets = NULL; /* "numpy.pxd":235 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) * */ __pyx_v_info->itemsize = PyArray_ITEMSIZE(__pyx_v_self); /* "numpy.pxd":236 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< * * cdef int t */ __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(__pyx_v_self)); /* "numpy.pxd":239 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr * cdef list stack */ __pyx_v_f = NULL; /* "numpy.pxd":240 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef list stack * cdef int offset */ __pyx_t_4 = ((PyObject *)__pyx_v_self->descr); __Pyx_INCREF(__pyx_t_4); __pyx_v_descr = ((PyArray_Descr *)__pyx_t_4); __pyx_t_4 = 0; /* "numpy.pxd":244 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "numpy.pxd":246 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None */ __pyx_t_2 = (!__pyx_v_hasfields); if (__pyx_t_2) { __pyx_t_3 = (!__pyx_v_copy_shape); __pyx_t_1 = __pyx_t_3; } else { __pyx_t_1 = __pyx_t_2; } if (__pyx_t_1) { /* "numpy.pxd":248 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< * else: * # need to call releasebuffer */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = Py_None; goto __pyx_L10; } /*else*/ { /* "numpy.pxd":251 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< * * if not hasfields: */ __Pyx_INCREF(((PyObject *)__pyx_v_self)); __Pyx_GIVEREF(((PyObject *)__pyx_v_self)); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = ((PyObject *)__pyx_v_self); } __pyx_L10:; /* "numpy.pxd":253 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or */ __pyx_t_1 = (!__pyx_v_hasfields); if (__pyx_t_1) { /* "numpy.pxd":254 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): */ __pyx_t_5 = __pyx_v_descr->type_num; __pyx_v_t = __pyx_t_5; /* "numpy.pxd":255 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_1 = (__pyx_v_descr->byteorder == '>'); if (__pyx_t_1) { __pyx_t_2 = __pyx_v_little_endian; } else { __pyx_t_2 = __pyx_t_1; } if (!__pyx_t_2) { /* "numpy.pxd":256 * t = descr.type_num * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" */ __pyx_t_1 = (__pyx_v_descr->byteorder == '<'); if (__pyx_t_1) { __pyx_t_3 = (!__pyx_v_little_endian); __pyx_t_7 = __pyx_t_3; } else { __pyx_t_7 = __pyx_t_1; } __pyx_t_1 = __pyx_t_7; } else { __pyx_t_1 = __pyx_t_2; } if (__pyx_t_1) { /* "numpy.pxd":257 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_t_4 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_11), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_Raise(__pyx_t_4, 0, 0, 0); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L12; } __pyx_L12:; /* "numpy.pxd":258 * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" */ __pyx_t_1 = (__pyx_v_t == NPY_BYTE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__b; goto __pyx_L13; } /* "numpy.pxd":259 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" */ __pyx_t_1 = (__pyx_v_t == NPY_UBYTE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__B; goto __pyx_L13; } /* "numpy.pxd":260 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" */ __pyx_t_1 = (__pyx_v_t == NPY_SHORT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__h; goto __pyx_L13; } /* "numpy.pxd":261 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" */ __pyx_t_1 = (__pyx_v_t == NPY_USHORT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__H; goto __pyx_L13; } /* "numpy.pxd":262 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" */ __pyx_t_1 = (__pyx_v_t == NPY_INT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__i; goto __pyx_L13; } /* "numpy.pxd":263 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" */ __pyx_t_1 = (__pyx_v_t == NPY_UINT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__I; goto __pyx_L13; } /* "numpy.pxd":264 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" */ __pyx_t_1 = (__pyx_v_t == NPY_LONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__l; goto __pyx_L13; } /* "numpy.pxd":265 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" */ __pyx_t_1 = (__pyx_v_t == NPY_ULONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__L; goto __pyx_L13; } /* "numpy.pxd":266 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" */ __pyx_t_1 = (__pyx_v_t == NPY_LONGLONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__q; goto __pyx_L13; } /* "numpy.pxd":267 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" */ __pyx_t_1 = (__pyx_v_t == NPY_ULONGLONG); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Q; goto __pyx_L13; } /* "numpy.pxd":268 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" */ __pyx_t_1 = (__pyx_v_t == NPY_FLOAT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__f; goto __pyx_L13; } /* "numpy.pxd":269 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" */ __pyx_t_1 = (__pyx_v_t == NPY_DOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__d; goto __pyx_L13; } /* "numpy.pxd":270 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" */ __pyx_t_1 = (__pyx_v_t == NPY_LONGDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__g; goto __pyx_L13; } /* "numpy.pxd":271 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" */ __pyx_t_1 = (__pyx_v_t == NPY_CFLOAT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zf; goto __pyx_L13; } /* "numpy.pxd":272 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" */ __pyx_t_1 = (__pyx_v_t == NPY_CDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zd; goto __pyx_L13; } /* "numpy.pxd":273 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f = "O" * else: */ __pyx_t_1 = (__pyx_v_t == NPY_CLONGDOUBLE); if (__pyx_t_1) { __pyx_v_f = __pyx_k__Zg; goto __pyx_L13; } /* "numpy.pxd":274 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_1 = (__pyx_v_t == NPY_OBJECT); if (__pyx_t_1) { __pyx_v_f = __pyx_k__O; goto __pyx_L13; } /*else*/ { /* "numpy.pxd":276 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * info.format = f * return */ __pyx_t_4 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_t_4); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_t_4 = PyTuple_New(1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); PyTuple_SET_ITEM(__pyx_t_4, 0, ((PyObject *)__pyx_t_8)); __Pyx_GIVEREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_4), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(((PyObject *)__pyx_t_4)); __pyx_t_4 = 0; __Pyx_Raise(__pyx_t_8, 0, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 276; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L13:; /* "numpy.pxd":277 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< * return * else: */ __pyx_v_info->format = __pyx_v_f; /* "numpy.pxd":278 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< * else: * info.format = stdlib.malloc(_buffer_format_string_len) */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L11; } /*else*/ { /* "numpy.pxd":280 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 */ __pyx_v_info->format = ((char *)malloc(255)); /* "numpy.pxd":281 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment # <<<<<<<<<<<<<< * offset = 0 * f = _util_dtypestring(descr, info.format + 1, */ (__pyx_v_info->format[0]) = '^'; /* "numpy.pxd":282 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = c'^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, */ __pyx_v_offset = 0; /* "numpy.pxd":285 * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, * &offset) # <<<<<<<<<<<<<< * f[0] = c'\0' # Terminate format string * */ __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 283; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_9; /* "numpy.pxd":286 * info.format + _buffer_format_string_len, * &offset) * f[0] = c'\0' # Terminate format string # <<<<<<<<<<<<<< * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = '\x00'; } __pyx_L11:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.ndarray.__getbuffer__", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = -1; if (__pyx_v_info != NULL && __pyx_v_info->obj != NULL) { __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; } goto __pyx_L2; __pyx_L0:; if (__pyx_v_info != NULL && __pyx_v_info->obj == Py_None) { __Pyx_GOTREF(Py_None); __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; } __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_descr); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* Python wrapper */ static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ static CYTHON_UNUSED void __pyx_pw_5numpy_7ndarray_3__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__releasebuffer__ (wrapper)", 0); __pyx_pf_5numpy_7ndarray_2__releasebuffer__(((PyArrayObject *)__pyx_v_self), ((Py_buffer *)__pyx_v_info)); __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":288 * f[0] = c'\0' # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) */ static void __pyx_pf_5numpy_7ndarray_2__releasebuffer__(PyArrayObject *__pyx_v_self, Py_buffer *__pyx_v_info) { __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("__releasebuffer__", 0); /* "numpy.pxd":289 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_t_1 = PyArray_HASFIELDS(__pyx_v_self); if (__pyx_t_1) { /* "numpy.pxd":290 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) */ free(__pyx_v_info->format); goto __pyx_L3; } __pyx_L3:; /* "numpy.pxd":291 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * stdlib.free(info.strides) * # info.shape was stored after info.strides in the same block */ __pyx_t_1 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_1) { /* "numpy.pxd":292 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block * */ free(__pyx_v_info->strides); goto __pyx_L4; } __pyx_L4:; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":768 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1", 0); /* "numpy.pxd":769 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":771 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2", 0); /* "numpy.pxd":772 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 772; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":774 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3", 0); /* "numpy.pxd":775 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 775; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":777 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4", 0); /* "numpy.pxd":778 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 778; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":780 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5", 0); /* "numpy.pxd":781 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 781; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":783 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. */ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { PyArray_Descr *__pyx_v_child = 0; int __pyx_v_endian_detector; int __pyx_v_little_endian; PyObject *__pyx_v_fields = 0; PyObject *__pyx_v_childname = NULL; PyObject *__pyx_v_new_offset = NULL; PyObject *__pyx_v_t = NULL; char *__pyx_r; __Pyx_RefNannyDeclarations PyObject *__pyx_t_1 = NULL; Py_ssize_t __pyx_t_2; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; PyObject *(*__pyx_t_6)(PyObject *); int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; int __pyx_t_10; long __pyx_t_11; char *__pyx_t_12; int __pyx_lineno = 0; const char *__pyx_filename = NULL; int __pyx_clineno = 0; __Pyx_RefNannySetupContext("_util_dtypestring", 0); /* "numpy.pxd":790 * cdef int delta_offset * cdef tuple i * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * cdef tuple fields */ __pyx_v_endian_detector = 1; /* "numpy.pxd":791 * cdef tuple i * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":794 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields */ if (unlikely(((PyObject *)__pyx_v_descr->names) == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_1 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = 0; for (;;) { if (__pyx_t_2 >= PyTuple_GET_SIZE(__pyx_t_1)) break; #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_1, __pyx_t_2); __Pyx_INCREF(__pyx_t_3); __pyx_t_2++; if (unlikely(0 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #else __pyx_t_3 = PySequence_ITEM(__pyx_t_1, __pyx_t_2); __pyx_t_2++; if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 794; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif __Pyx_XDECREF(__pyx_v_childname); __pyx_v_childname = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":795 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields * */ __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 795; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF(((PyObject *)__pyx_v_fields)); __pyx_v_fields = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "numpy.pxd":796 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(PyTuple_CheckExact(((PyObject *)__pyx_v_fields)))) { PyObject* sequence = ((PyObject *)__pyx_v_fields); #if CYTHON_COMPILING_IN_CPYTHON Py_ssize_t size = Py_SIZE(sequence); #else Py_ssize_t size = PySequence_Size(sequence); #endif if (unlikely(size != 2)) { if (size > 2) __Pyx_RaiseTooManyValuesError(2); else if (size >= 0) __Pyx_RaiseNeedMoreValuesError(size); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } #if CYTHON_COMPILING_IN_CPYTHON __pyx_t_3 = PyTuple_GET_ITEM(sequence, 0); __pyx_t_4 = PyTuple_GET_ITEM(sequence, 1); __Pyx_INCREF(__pyx_t_3); __Pyx_INCREF(__pyx_t_4); #else __pyx_t_3 = PySequence_ITEM(sequence, 0); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = PySequence_ITEM(sequence, 1); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif } else if (1) { __Pyx_RaiseNoneNotIterableError(); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } else { Py_ssize_t index = -1; __pyx_t_5 = PyObject_GetIter(((PyObject *)__pyx_v_fields)); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_6 = Py_TYPE(__pyx_t_5)->tp_iternext; index = 0; __pyx_t_3 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_3)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_3); index = 1; __pyx_t_4 = __pyx_t_6(__pyx_t_5); if (unlikely(!__pyx_t_4)) goto __pyx_L5_unpacking_failed; __Pyx_GOTREF(__pyx_t_4); if (__Pyx_IternextUnpackEndCheck(__pyx_t_6(__pyx_t_5), 2) < 0) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_6 = NULL; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; goto __pyx_L6_unpacking_done; __pyx_L5_unpacking_failed:; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = NULL; if (__Pyx_IterFinish() == 0) __Pyx_RaiseNeedMoreValuesError(index); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_L6_unpacking_done:; } if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 796; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_XDECREF(((PyObject *)__pyx_v_child)); __pyx_v_child = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; __Pyx_XDECREF(__pyx_v_new_offset); __pyx_v_new_offset = __pyx_t_4; __pyx_t_4 = 0; /* "numpy.pxd":798 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 798; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { /* "numpy.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "numpy.pxd":801 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == c'>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_7 = (__pyx_v_child->byteorder == '>'); if (__pyx_t_7) { __pyx_t_8 = __pyx_v_little_endian; } else { __pyx_t_8 = __pyx_t_7; } if (!__pyx_t_8) { /* "numpy.pxd":802 * * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * # One could encode it in the format string and have Cython */ __pyx_t_7 = (__pyx_v_child->byteorder == '<'); if (__pyx_t_7) { __pyx_t_9 = (!__pyx_v_little_endian); __pyx_t_10 = __pyx_t_9; } else { __pyx_t_10 = __pyx_t_7; } __pyx_t_7 = __pyx_t_10; } else { __pyx_t_7 = __pyx_t_8; } if (__pyx_t_7) { /* "numpy.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_15), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L8; } __pyx_L8:; /* "numpy.pxd":813 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte * f += 1 */ while (1) { __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 813; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_7) break; /* "numpy.pxd":814 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< * f += 1 * offset[0] += 1 */ (__pyx_v_f[0]) = 120; /* "numpy.pxd":815 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 * */ __pyx_v_f = (__pyx_v_f + 1); /* "numpy.pxd":816 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< * * offset[0] += child.itemsize */ __pyx_t_11 = 0; (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + 1); } /* "numpy.pxd":818 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< * * if not PyDataType_HASFIELDS(child): */ __pyx_t_11 = 0; (__pyx_v_offset[__pyx_t_11]) = ((__pyx_v_offset[__pyx_t_11]) + __pyx_v_child->elsize); /* "numpy.pxd":820 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: */ __pyx_t_7 = (!PyDataType_HASFIELDS(__pyx_v_child)); if (__pyx_t_7) { /* "numpy.pxd":821 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") */ __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_XDECREF(__pyx_v_t); __pyx_v_t = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":822 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") * */ __pyx_t_7 = ((__pyx_v_end - __pyx_v_f) < 5); if (__pyx_t_7) { /* "numpy.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_17), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L12; } __pyx_L12:; /* "numpy.pxd":826 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" */ __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 98; goto __pyx_L13; } /* "numpy.pxd":827 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" */ __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 66; goto __pyx_L13; } /* "numpy.pxd":828 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" */ __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 104; goto __pyx_L13; } /* "numpy.pxd":829 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" */ __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 72; goto __pyx_L13; } /* "numpy.pxd":830 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" */ __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 105; goto __pyx_L13; } /* "numpy.pxd":831 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" */ __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 831; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 73; goto __pyx_L13; } /* "numpy.pxd":832 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" */ __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 108; goto __pyx_L13; } /* "numpy.pxd":833 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 833; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 76; goto __pyx_L13; } /* "numpy.pxd":834 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" */ __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 834; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 113; goto __pyx_L13; } /* "numpy.pxd":835 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 835; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 81; goto __pyx_L13; } /* "numpy.pxd":836 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" */ __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 836; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 102; goto __pyx_L13; } /* "numpy.pxd":837 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf */ __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 100; goto __pyx_L13; } /* "numpy.pxd":838 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd */ __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 838; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 103; goto __pyx_L13; } /* "numpy.pxd":839 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg */ __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 839; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 102; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L13; } /* "numpy.pxd":840 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" */ __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 840; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 100; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L13; } /* "numpy.pxd":841 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: */ __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); __Pyx_XGOTREF(__pyx_t_3); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 841; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 103; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L13; } /* "numpy.pxd":842 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); __Pyx_XGOTREF(__pyx_t_5); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_7 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_7 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 842; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_7) { (__pyx_v_f[0]) = 79; goto __pyx_L13; } /*else*/ { /* "numpy.pxd":844 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * f += 1 * else: */ __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_12), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_5)); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5)); __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_5, 0, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 844; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L13:; /* "numpy.pxd":845 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< * else: * # Cython ignores struct boundary information ("T{...}"), */ __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /*else*/ { /* "numpy.pxd":849 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f * */ __pyx_t_12 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_12 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_12; } __pyx_L11:; } __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":850 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_v_f; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("numpy._util_dtypestring", __pyx_clineno, __pyx_lineno, __pyx_filename); __pyx_r = NULL; __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_child); __Pyx_XDECREF(__pyx_v_fields); __Pyx_XDECREF(__pyx_v_childname); __Pyx_XDECREF(__pyx_v_new_offset); __Pyx_XDECREF(__pyx_v_t); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":965 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { PyObject *__pyx_v_baseptr; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("set_array_base", 0); /* "numpy.pxd":967 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< * baseptr = NULL * else: */ __pyx_t_1 = (__pyx_v_base == Py_None); if (__pyx_t_1) { /* "numpy.pxd":968 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< * else: * Py_INCREF(base) # important to do this before decref below! */ __pyx_v_baseptr = NULL; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":970 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< * baseptr = base * Py_XDECREF(arr.base) */ Py_INCREF(__pyx_v_base); /* "numpy.pxd":971 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< * Py_XDECREF(arr.base) * arr.base = baseptr */ __pyx_v_baseptr = ((PyObject *)__pyx_v_base); } __pyx_L3:; /* "numpy.pxd":972 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr * */ Py_XDECREF(__pyx_v_arr->base); /* "numpy.pxd":973 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":975 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_r = NULL; __Pyx_RefNannyDeclarations int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base", 0); /* "numpy.pxd":976 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None * else: */ __pyx_t_1 = (__pyx_v_arr->base == NULL); if (__pyx_t_1) { /* "numpy.pxd":977 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< * else: * return arr.base */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(Py_None); __pyx_r = Py_None; goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":979 * return None * else: * return arr.base # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); __pyx_r = ((PyObject *)__pyx_v_arr->base); goto __pyx_L0; } __pyx_L3:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(PyTypeObject *t, CYTHON_UNUSED PyObject *a, CYTHON_UNUSED PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *p; PyObject *o = (*t->tp_alloc)(t, 0); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *)o); p->__pyx_vtab = __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction; return o; } static void __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction(PyObject *o) { (*Py_TYPE(o)->tp_free)(o); } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_LossFunction[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12LossFunction_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(__pyx_doc_7sklearn_12linear_model_8sgd_fast_12LossFunction_2dloss)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_LossFunction = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_LossFunction = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_LossFunction = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_LossFunction = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.LossFunction"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_LossFunction, /*tp_as_number*/ &__pyx_tp_as_sequence_LossFunction, /*tp_as_sequence*/ &__pyx_tp_as_mapping_LossFunction, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_LossFunction, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Base class for convex loss functions"), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Regression __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Regression(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Regression[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_10Regression_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Regression = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Regression = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Regression = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Regression = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Regression = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.Regression"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Regression), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_Regression, /*tp_as_number*/ &__pyx_tp_as_sequence_Regression, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Regression, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Regression, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Base class for loss functions for regression"), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_Regression, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Regression, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Classification __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Classification(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Classification[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_14Classification_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Classification = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Classification = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Classification = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Classification = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Classification = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.Classification"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Classification), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_Classification, /*tp_as_number*/ &__pyx_tp_as_sequence_Classification, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Classification, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Classification, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Base class for loss functions for classification"), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_Classification, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Classification, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_ModifiedHuber __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_ModifiedHuber(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_ModifiedHuber[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_ModifiedHuber = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_ModifiedHuber = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_ModifiedHuber = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_ModifiedHuber = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.ModifiedHuber"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_ModifiedHuber), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_ModifiedHuber, /*tp_as_number*/ &__pyx_tp_as_sequence_ModifiedHuber, /*tp_as_sequence*/ &__pyx_tp_as_mapping_ModifiedHuber, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_ModifiedHuber, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Modified Huber loss for binary classification with y in {-1, 1}\n\n This is equivalent to quadratically smoothed SVM with gamma = 2.\n\n See T. Zhang 'Solving Large Scale Linear Prediction Problems Using\n Stochastic Gradient Descent', ICML'04.\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_ModifiedHuber, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_ModifiedHuber, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Hinge __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Hinge(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Hinge[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Hinge = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Hinge = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Hinge = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Hinge = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.Hinge"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Hinge), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_Hinge, /*tp_as_number*/ &__pyx_tp_as_sequence_Hinge, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Hinge, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Hinge, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Hinge loss for binary classification tasks with y in {-1,1}\n\n Parameters\n ----------\n\n threshold : float > 0.0\n Margin threshold. When threshold=1.0, one gets the loss used by SVM.\n When threshold=0.0, one gets the loss used by the Perceptron.\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_Hinge, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Hinge_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Hinge, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredHinge __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredHinge(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge *)o); p->__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredHinge[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_SquaredHinge = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_SquaredHinge = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_SquaredHinge = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_SquaredHinge = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.SquaredHinge"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredHinge), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_SquaredHinge, /*tp_as_number*/ &__pyx_tp_as_sequence_SquaredHinge, /*tp_as_sequence*/ &__pyx_tp_as_mapping_SquaredHinge, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_SquaredHinge, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Squared Hinge loss for binary classification tasks with y in {-1,1}\n\n Parameters\n ----------\n\n threshold : float > 0.0\n Margin threshold. When threshold=1.0, one gets the loss used by\n (quadratically penalized) SVM.\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredHinge, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredHinge, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Log __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Log(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Log[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_3Log_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Log = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Log = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Log = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Log = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Log = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.Log"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Log), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_Log, /*tp_as_number*/ &__pyx_tp_as_sequence_Log, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Log, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Log, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Logistic regression loss for binary classification with y in {-1, 1}"), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_Log, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Log, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredLoss __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredLoss(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredLoss[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_1loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_3dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_5__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_SquaredLoss = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_SquaredLoss = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_SquaredLoss = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_SquaredLoss = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.SquaredLoss"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredLoss), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_SquaredLoss, /*tp_as_number*/ &__pyx_tp_as_sequence_SquaredLoss, /*tp_as_sequence*/ &__pyx_tp_as_mapping_SquaredLoss, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_SquaredLoss, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Squared loss traditional used in linear regression."), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredLoss, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ 0, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredLoss, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_Huber __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Huber(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_Huber[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_Huber = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_Huber = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_Huber = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_Huber = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_Huber = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.Huber"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_Huber), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_Huber, /*tp_as_number*/ &__pyx_tp_as_sequence_Huber, /*tp_as_sequence*/ &__pyx_tp_as_mapping_Huber, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_Huber, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Huber regression loss\n\n Variant of the SquaredLoss that is robust to outliers (quadratic near zero,\n linear in for large errors).\n\n http://en.wikipedia.org/wiki/Huber_Loss_Function\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_Huber, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7sklearn_12linear_model_8sgd_fast_5Huber_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_Huber, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_EpsilonInsensitive = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_EpsilonInsensitive = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_EpsilonInsensitive = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_EpsilonInsensitive = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.EpsilonInsensitive"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_EpsilonInsensitive, /*tp_as_number*/ &__pyx_tp_as_sequence_EpsilonInsensitive, /*tp_as_sequence*/ &__pyx_tp_as_mapping_EpsilonInsensitive, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_EpsilonInsensitive, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Epsilon-Insensitive loss (used by SVR).\n\n loss = max(0, |y - p| - epsilon)\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive; static PyObject *__pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive(PyTypeObject *t, PyObject *a, PyObject *k) { struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *p; PyObject *o = __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_LossFunction(t, a, k); if (!o) return 0; p = ((struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive *)o); p->__pyx_base.__pyx_base.__pyx_vtab = (struct __pyx_vtabstruct_7sklearn_12linear_model_8sgd_fast_LossFunction*)__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive; return o; } static PyMethodDef __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive[] = { {__Pyx_NAMESTR("loss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_3loss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("dloss"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_5dloss, METH_VARARGS|METH_KEYWORDS, __Pyx_DOCSTR(0)}, {__Pyx_NAMESTR("__reduce__"), (PyCFunction)__pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_7__reduce__, METH_NOARGS, __Pyx_DOCSTR(0)}, {0, 0, 0, 0} }; static PyNumberMethods __pyx_tp_as_number_SquaredEpsilonInsensitive = { 0, /*nb_add*/ 0, /*nb_subtract*/ 0, /*nb_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_divide*/ #endif 0, /*nb_remainder*/ 0, /*nb_divmod*/ 0, /*nb_power*/ 0, /*nb_negative*/ 0, /*nb_positive*/ 0, /*nb_absolute*/ 0, /*nb_nonzero*/ 0, /*nb_invert*/ 0, /*nb_lshift*/ 0, /*nb_rshift*/ 0, /*nb_and*/ 0, /*nb_xor*/ 0, /*nb_or*/ #if PY_MAJOR_VERSION < 3 0, /*nb_coerce*/ #endif 0, /*nb_int*/ #if PY_MAJOR_VERSION < 3 0, /*nb_long*/ #else 0, /*reserved*/ #endif 0, /*nb_float*/ #if PY_MAJOR_VERSION < 3 0, /*nb_oct*/ #endif #if PY_MAJOR_VERSION < 3 0, /*nb_hex*/ #endif 0, /*nb_inplace_add*/ 0, /*nb_inplace_subtract*/ 0, /*nb_inplace_multiply*/ #if PY_MAJOR_VERSION < 3 0, /*nb_inplace_divide*/ #endif 0, /*nb_inplace_remainder*/ 0, /*nb_inplace_power*/ 0, /*nb_inplace_lshift*/ 0, /*nb_inplace_rshift*/ 0, /*nb_inplace_and*/ 0, /*nb_inplace_xor*/ 0, /*nb_inplace_or*/ 0, /*nb_floor_divide*/ 0, /*nb_true_divide*/ 0, /*nb_inplace_floor_divide*/ 0, /*nb_inplace_true_divide*/ #if PY_VERSION_HEX >= 0x02050000 0, /*nb_index*/ #endif }; static PySequenceMethods __pyx_tp_as_sequence_SquaredEpsilonInsensitive = { 0, /*sq_length*/ 0, /*sq_concat*/ 0, /*sq_repeat*/ 0, /*sq_item*/ 0, /*sq_slice*/ 0, /*sq_ass_item*/ 0, /*sq_ass_slice*/ 0, /*sq_contains*/ 0, /*sq_inplace_concat*/ 0, /*sq_inplace_repeat*/ }; static PyMappingMethods __pyx_tp_as_mapping_SquaredEpsilonInsensitive = { 0, /*mp_length*/ 0, /*mp_subscript*/ 0, /*mp_ass_subscript*/ }; static PyBufferProcs __pyx_tp_as_buffer_SquaredEpsilonInsensitive = { #if PY_MAJOR_VERSION < 3 0, /*bf_getreadbuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getwritebuffer*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getsegcount*/ #endif #if PY_MAJOR_VERSION < 3 0, /*bf_getcharbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_getbuffer*/ #endif #if PY_VERSION_HEX >= 0x02060000 0, /*bf_releasebuffer*/ #endif }; static PyTypeObject __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = { PyVarObject_HEAD_INIT(0, 0) __Pyx_NAMESTR("sklearn.linear_model.sgd_fast.SquaredEpsilonInsensitive"), /*tp_name*/ sizeof(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive), /*tp_basicsize*/ 0, /*tp_itemsize*/ __pyx_tp_dealloc_7sklearn_12linear_model_8sgd_fast_LossFunction, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ #if PY_MAJOR_VERSION < 3 0, /*tp_compare*/ #else 0, /*reserved*/ #endif 0, /*tp_repr*/ &__pyx_tp_as_number_SquaredEpsilonInsensitive, /*tp_as_number*/ &__pyx_tp_as_sequence_SquaredEpsilonInsensitive, /*tp_as_sequence*/ &__pyx_tp_as_mapping_SquaredEpsilonInsensitive, /*tp_as_mapping*/ 0, /*tp_hash*/ 0, /*tp_call*/ 0, /*tp_str*/ 0, /*tp_getattro*/ 0, /*tp_setattro*/ &__pyx_tp_as_buffer_SquaredEpsilonInsensitive, /*tp_as_buffer*/ Py_TPFLAGS_DEFAULT|Py_TPFLAGS_CHECKTYPES|Py_TPFLAGS_HAVE_NEWBUFFER|Py_TPFLAGS_BASETYPE, /*tp_flags*/ __Pyx_DOCSTR("Epsilon-Insensitive loss.\n\n loss = max(0, |y - p| - epsilon)^2\n "), /*tp_doc*/ 0, /*tp_traverse*/ 0, /*tp_clear*/ 0, /*tp_richcompare*/ 0, /*tp_weaklistoffset*/ 0, /*tp_iter*/ 0, /*tp_iternext*/ __pyx_methods_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive, /*tp_methods*/ 0, /*tp_members*/ 0, /*tp_getset*/ 0, /*tp_base*/ 0, /*tp_dict*/ 0, /*tp_descr_get*/ 0, /*tp_descr_set*/ 0, /*tp_dictoffset*/ __pyx_pw_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_1__init__, /*tp_init*/ 0, /*tp_alloc*/ __pyx_tp_new_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive, /*tp_new*/ 0, /*tp_free*/ 0, /*tp_is_gc*/ 0, /*tp_bases*/ 0, /*tp_mro*/ 0, /*tp_cache*/ 0, /*tp_subclasses*/ 0, /*tp_weaklist*/ 0, /*tp_del*/ #if PY_VERSION_HEX >= 0x02060000 0, /*tp_version_tag*/ #endif }; static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("sgd_fast"), 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, {&__pyx_kp_u_10, __pyx_k_10, sizeof(__pyx_k_10), 0, 1, 0, 0}, {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0}, {&__pyx_kp_u_13, __pyx_k_13, sizeof(__pyx_k_13), 0, 1, 0, 0}, {&__pyx_kp_u_16, __pyx_k_16, sizeof(__pyx_k_16), 0, 1, 0, 0}, {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0}, {&__pyx_kp_s_20, __pyx_k_20, sizeof(__pyx_k_20), 0, 0, 1, 0}, {&__pyx_n_s_21, __pyx_k_21, sizeof(__pyx_k_21), 0, 0, 1, 1}, {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0}, {&__pyx_kp_s_4, __pyx_k_4, sizeof(__pyx_k_4), 0, 0, 1, 0}, {&__pyx_kp_u_6, __pyx_k_6, sizeof(__pyx_k_6), 0, 1, 0, 0}, {&__pyx_kp_u_8, __pyx_k_8, sizeof(__pyx_k_8), 0, 1, 0, 0}, {&__pyx_n_s__C, __pyx_k__C, sizeof(__pyx_k__C), 0, 0, 1, 1}, {&__pyx_n_s__NotImplementedError, __pyx_k__NotImplementedError, sizeof(__pyx_k__NotImplementedError), 0, 0, 1, 1}, {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s__alpha, __pyx_k__alpha, sizeof(__pyx_k__alpha), 0, 0, 1, 1}, {&__pyx_n_s__any, __pyx_k__any, sizeof(__pyx_k__any), 0, 0, 1, 1}, {&__pyx_n_s__c, __pyx_k__c, sizeof(__pyx_k__c), 0, 0, 1, 1}, {&__pyx_n_s__class_weight, __pyx_k__class_weight, sizeof(__pyx_k__class_weight), 0, 0, 1, 1}, {&__pyx_n_s__count, __pyx_k__count, sizeof(__pyx_k__count), 0, 0, 1, 1}, {&__pyx_n_s__dataset, __pyx_k__dataset, sizeof(__pyx_k__dataset), 0, 0, 1, 1}, {&__pyx_n_s__dloss, __pyx_k__dloss, sizeof(__pyx_k__dloss), 0, 0, 1, 1}, {&__pyx_n_s__dtype, __pyx_k__dtype, sizeof(__pyx_k__dtype), 0, 0, 1, 1}, {&__pyx_n_s__epoch, __pyx_k__epoch, sizeof(__pyx_k__epoch), 0, 0, 1, 1}, {&__pyx_n_s__epsilon, __pyx_k__epsilon, sizeof(__pyx_k__epsilon), 0, 0, 1, 1}, {&__pyx_n_s__eta, __pyx_k__eta, sizeof(__pyx_k__eta), 0, 0, 1, 1}, {&__pyx_n_s__eta0, __pyx_k__eta0, sizeof(__pyx_k__eta0), 0, 0, 1, 1}, {&__pyx_n_s__fit_intercept, __pyx_k__fit_intercept, sizeof(__pyx_k__fit_intercept), 0, 0, 1, 1}, {&__pyx_n_s__float64, __pyx_k__float64, sizeof(__pyx_k__float64), 0, 0, 1, 1}, {&__pyx_n_s__i, __pyx_k__i, sizeof(__pyx_k__i), 0, 0, 1, 1}, {&__pyx_n_s__intercept, __pyx_k__intercept, sizeof(__pyx_k__intercept), 0, 0, 1, 1}, {&__pyx_n_s__intercept_decay, __pyx_k__intercept_decay, sizeof(__pyx_k__intercept_decay), 0, 0, 1, 1}, {&__pyx_n_s__is_hinge, __pyx_k__is_hinge, sizeof(__pyx_k__is_hinge), 0, 0, 1, 1}, {&__pyx_n_s__isinf, __pyx_k__isinf, sizeof(__pyx_k__isinf), 0, 0, 1, 1}, {&__pyx_n_s__isnan, __pyx_k__isnan, sizeof(__pyx_k__isnan), 0, 0, 1, 1}, {&__pyx_n_s__learning_rate, __pyx_k__learning_rate, sizeof(__pyx_k__learning_rate), 0, 0, 1, 1}, {&__pyx_n_s__loss, __pyx_k__loss, sizeof(__pyx_k__loss), 0, 0, 1, 1}, {&__pyx_n_s__n_features, __pyx_k__n_features, sizeof(__pyx_k__n_features), 0, 0, 1, 1}, {&__pyx_n_s__n_iter, __pyx_k__n_iter, sizeof(__pyx_k__n_iter), 0, 0, 1, 1}, {&__pyx_n_s__n_samples, __pyx_k__n_samples, sizeof(__pyx_k__n_samples), 0, 0, 1, 1}, {&__pyx_n_s__nonzero, __pyx_k__nonzero, sizeof(__pyx_k__nonzero), 0, 0, 1, 1}, {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1}, {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1}, {&__pyx_n_s__order, __pyx_k__order, sizeof(__pyx_k__order), 0, 0, 1, 1}, {&__pyx_n_s__p, __pyx_k__p, sizeof(__pyx_k__p), 0, 0, 1, 1}, {&__pyx_n_s__penalty_type, __pyx_k__penalty_type, sizeof(__pyx_k__penalty_type), 0, 0, 1, 1}, {&__pyx_n_s__plain_sgd, __pyx_k__plain_sgd, sizeof(__pyx_k__plain_sgd), 0, 0, 1, 1}, {&__pyx_n_s__power_t, __pyx_k__power_t, sizeof(__pyx_k__power_t), 0, 0, 1, 1}, {&__pyx_n_s__q, __pyx_k__q, sizeof(__pyx_k__q), 0, 0, 1, 1}, {&__pyx_n_s__q_data_ptr, __pyx_k__q_data_ptr, sizeof(__pyx_k__q_data_ptr), 0, 0, 1, 1}, {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, {&__pyx_n_s__rho, __pyx_k__rho, sizeof(__pyx_k__rho), 0, 0, 1, 1}, {&__pyx_n_s__sample_weight, __pyx_k__sample_weight, sizeof(__pyx_k__sample_weight), 0, 0, 1, 1}, {&__pyx_n_s__seed, __pyx_k__seed, sizeof(__pyx_k__seed), 0, 0, 1, 1}, {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1}, {&__pyx_n_s__shuffle, __pyx_k__shuffle, sizeof(__pyx_k__shuffle), 0, 0, 1, 1}, {&__pyx_n_s__sumloss, __pyx_k__sumloss, sizeof(__pyx_k__sumloss), 0, 0, 1, 1}, {&__pyx_n_s__sys, __pyx_k__sys, sizeof(__pyx_k__sys), 0, 0, 1, 1}, {&__pyx_n_s__t, __pyx_k__t, sizeof(__pyx_k__t), 0, 0, 1, 1}, {&__pyx_n_s__t_start, __pyx_k__t_start, sizeof(__pyx_k__t_start), 0, 0, 1, 1}, {&__pyx_n_s__threshold, __pyx_k__threshold, sizeof(__pyx_k__threshold), 0, 0, 1, 1}, {&__pyx_n_s__time, __pyx_k__time, sizeof(__pyx_k__time), 0, 0, 1, 1}, {&__pyx_n_s__u, __pyx_k__u, sizeof(__pyx_k__u), 0, 0, 1, 1}, {&__pyx_n_s__update, __pyx_k__update, sizeof(__pyx_k__update), 0, 0, 1, 1}, {&__pyx_n_s__verbose, __pyx_k__verbose, sizeof(__pyx_k__verbose), 0, 0, 1, 1}, {&__pyx_n_s__w, __pyx_k__w, sizeof(__pyx_k__w), 0, 0, 1, 1}, {&__pyx_n_s__weight_neg, __pyx_k__weight_neg, sizeof(__pyx_k__weight_neg), 0, 0, 1, 1}, {&__pyx_n_s__weight_pos, __pyx_k__weight_pos, sizeof(__pyx_k__weight_pos), 0, 0, 1, 1}, {&__pyx_n_s__weights, __pyx_k__weights, sizeof(__pyx_k__weights), 0, 0, 1, 1}, {&__pyx_n_s__x_data_ptr, __pyx_k__x_data_ptr, sizeof(__pyx_k__x_data_ptr), 0, 0, 1, 1}, {&__pyx_n_s__x_ind_ptr, __pyx_k__x_ind_ptr, sizeof(__pyx_k__x_ind_ptr), 0, 0, 1, 1}, {&__pyx_n_s__xnnz, __pyx_k__xnnz, sizeof(__pyx_k__xnnz), 0, 0, 1, 1}, {&__pyx_n_s__y, __pyx_k__y, sizeof(__pyx_k__y), 0, 0, 1, 1}, {&__pyx_n_s__zeros, __pyx_k__zeros, sizeof(__pyx_k__zeros), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_NotImplementedError = __Pyx_GetName(__pyx_b, __pyx_n_s__NotImplementedError); if (!__pyx_builtin_NotImplementedError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 438; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannyDeclarations __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants", 0); /* "sklearn/linear_model/sgd_fast.pyx":508 * if np.any(np.isinf(weights)) or np.any(np.isnan(weights)) \ * or np.isnan(intercept) or np.isinf(intercept): * raise ValueError("floating-point under-/overflow occured.") # <<<<<<<<<<<<<< * * w.reset_wscale() */ __pyx_k_tuple_5 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 508; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_5); __Pyx_INCREF(((PyObject *)__pyx_kp_s_4)); PyTuple_SET_ITEM(__pyx_k_tuple_5, 0, ((PyObject *)__pyx_kp_s_4)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_s_4)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_5)); /* "numpy.pxd":215 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_k_tuple_7 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_7)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 215; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_7); __Pyx_INCREF(((PyObject *)__pyx_kp_u_6)); PyTuple_SET_ITEM(__pyx_k_tuple_7, 0, ((PyObject *)__pyx_kp_u_6)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_6)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_7)); /* "numpy.pxd":219 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_k_tuple_9 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_9)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_9); __Pyx_INCREF(((PyObject *)__pyx_kp_u_8)); PyTuple_SET_ITEM(__pyx_k_tuple_9, 0, ((PyObject *)__pyx_kp_u_8)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_8)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_9)); /* "numpy.pxd":257 * if ((descr.byteorder == c'>' and little_endian) or * (descr.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_k_tuple_11 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_11)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 257; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_11); __Pyx_INCREF(((PyObject *)__pyx_kp_u_10)); PyTuple_SET_ITEM(__pyx_k_tuple_11, 0, ((PyObject *)__pyx_kp_u_10)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_11)); /* "numpy.pxd":799 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == c'>' and little_endian) or */ __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 799; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_14); __Pyx_INCREF(((PyObject *)__pyx_kp_u_13)); PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_13)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_13)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14)); /* "numpy.pxd":803 * if ((child.byteorder == c'>' and little_endian) or * (child.byteorder == c'<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_k_tuple_15 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_15)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 803; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_15); __Pyx_INCREF(((PyObject *)__pyx_kp_u_10)); PyTuple_SET_ITEM(__pyx_k_tuple_15, 0, ((PyObject *)__pyx_kp_u_10)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_10)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_15)); /* "numpy.pxd":823 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_k_tuple_17 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_17)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_17); __Pyx_INCREF(((PyObject *)__pyx_kp_u_16)); PyTuple_SET_ITEM(__pyx_k_tuple_17, 0, ((PyObject *)__pyx_kp_u_16)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_16)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_17)); /* "sklearn/linear_model/sgd_fast.pyx":327 * * * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights, # <<<<<<<<<<<<<< * double intercept, * LossFunction loss, */ __pyx_k_tuple_18 = PyTuple_New(41); if (unlikely(!__pyx_k_tuple_18)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_k_tuple_18); __Pyx_INCREF(((PyObject *)__pyx_n_s__weights)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 0, ((PyObject *)__pyx_n_s__weights)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weights)); __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 1, ((PyObject *)__pyx_n_s__intercept)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept)); __Pyx_INCREF(((PyObject *)__pyx_n_s__loss)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 2, ((PyObject *)__pyx_n_s__loss)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__loss)); __Pyx_INCREF(((PyObject *)__pyx_n_s__penalty_type)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 3, ((PyObject *)__pyx_n_s__penalty_type)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__penalty_type)); __Pyx_INCREF(((PyObject *)__pyx_n_s__alpha)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 4, ((PyObject *)__pyx_n_s__alpha)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__alpha)); __Pyx_INCREF(((PyObject *)__pyx_n_s__C)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 5, ((PyObject *)__pyx_n_s__C)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__C)); __Pyx_INCREF(((PyObject *)__pyx_n_s__rho)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 6, ((PyObject *)__pyx_n_s__rho)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__rho)); __Pyx_INCREF(((PyObject *)__pyx_n_s__dataset)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 7, ((PyObject *)__pyx_n_s__dataset)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__dataset)); __Pyx_INCREF(((PyObject *)__pyx_n_s__n_iter)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 8, ((PyObject *)__pyx_n_s__n_iter)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_iter)); __Pyx_INCREF(((PyObject *)__pyx_n_s__fit_intercept)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 9, ((PyObject *)__pyx_n_s__fit_intercept)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__fit_intercept)); __Pyx_INCREF(((PyObject *)__pyx_n_s__verbose)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 10, ((PyObject *)__pyx_n_s__verbose)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__verbose)); __Pyx_INCREF(((PyObject *)__pyx_n_s__shuffle)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 11, ((PyObject *)__pyx_n_s__shuffle)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__shuffle)); __Pyx_INCREF(((PyObject *)__pyx_n_s__seed)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 12, ((PyObject *)__pyx_n_s__seed)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__seed)); __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_pos)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 13, ((PyObject *)__pyx_n_s__weight_pos)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_pos)); __Pyx_INCREF(((PyObject *)__pyx_n_s__weight_neg)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 14, ((PyObject *)__pyx_n_s__weight_neg)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__weight_neg)); __Pyx_INCREF(((PyObject *)__pyx_n_s__learning_rate)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 15, ((PyObject *)__pyx_n_s__learning_rate)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__learning_rate)); __Pyx_INCREF(((PyObject *)__pyx_n_s__eta0)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 16, ((PyObject *)__pyx_n_s__eta0)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta0)); __Pyx_INCREF(((PyObject *)__pyx_n_s__power_t)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 17, ((PyObject *)__pyx_n_s__power_t)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__power_t)); __Pyx_INCREF(((PyObject *)__pyx_n_s__t)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 18, ((PyObject *)__pyx_n_s__t)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t)); __Pyx_INCREF(((PyObject *)__pyx_n_s__intercept_decay)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 19, ((PyObject *)__pyx_n_s__intercept_decay)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__intercept_decay)); __Pyx_INCREF(((PyObject *)__pyx_n_s__n_samples)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 20, ((PyObject *)__pyx_n_s__n_samples)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_samples)); __Pyx_INCREF(((PyObject *)__pyx_n_s__n_features)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 21, ((PyObject *)__pyx_n_s__n_features)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__n_features)); __Pyx_INCREF(((PyObject *)__pyx_n_s__w)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 22, ((PyObject *)__pyx_n_s__w)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__w)); __Pyx_INCREF(((PyObject *)__pyx_n_s__x_data_ptr)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 23, ((PyObject *)__pyx_n_s__x_data_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x_data_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__x_ind_ptr)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 24, ((PyObject *)__pyx_n_s__x_ind_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__x_ind_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__xnnz)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 25, ((PyObject *)__pyx_n_s__xnnz)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__xnnz)); __Pyx_INCREF(((PyObject *)__pyx_n_s__eta)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 26, ((PyObject *)__pyx_n_s__eta)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__eta)); __Pyx_INCREF(((PyObject *)__pyx_n_s__p)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 27, ((PyObject *)__pyx_n_s__p)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__p)); __Pyx_INCREF(((PyObject *)__pyx_n_s__update)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 28, ((PyObject *)__pyx_n_s__update)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__update)); __Pyx_INCREF(((PyObject *)__pyx_n_s__sumloss)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 29, ((PyObject *)__pyx_n_s__sumloss)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sumloss)); __Pyx_INCREF(((PyObject *)__pyx_n_s__y)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 30, ((PyObject *)__pyx_n_s__y)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__y)); __Pyx_INCREF(((PyObject *)__pyx_n_s__sample_weight)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 31, ((PyObject *)__pyx_n_s__sample_weight)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__sample_weight)); __Pyx_INCREF(((PyObject *)__pyx_n_s__class_weight)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 32, ((PyObject *)__pyx_n_s__class_weight)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__class_weight)); __Pyx_INCREF(((PyObject *)__pyx_n_s__count)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 33, ((PyObject *)__pyx_n_s__count)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__count)); __Pyx_INCREF(((PyObject *)__pyx_n_s__epoch)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 34, ((PyObject *)__pyx_n_s__epoch)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__epoch)); __Pyx_INCREF(((PyObject *)__pyx_n_s__i)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 35, ((PyObject *)__pyx_n_s__i)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__i)); __Pyx_INCREF(((PyObject *)__pyx_n_s__is_hinge)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 36, ((PyObject *)__pyx_n_s__is_hinge)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__is_hinge)); __Pyx_INCREF(((PyObject *)__pyx_n_s__q)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 37, ((PyObject *)__pyx_n_s__q)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q)); __Pyx_INCREF(((PyObject *)__pyx_n_s__q_data_ptr)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 38, ((PyObject *)__pyx_n_s__q_data_ptr)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__q_data_ptr)); __Pyx_INCREF(((PyObject *)__pyx_n_s__u)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 39, ((PyObject *)__pyx_n_s__u)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__u)); __Pyx_INCREF(((PyObject *)__pyx_n_s__t_start)); PyTuple_SET_ITEM(__pyx_k_tuple_18, 40, ((PyObject *)__pyx_n_s__t_start)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__t_start)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_18)); __pyx_k_codeobj_19 = (PyObject*)__Pyx_PyCode_New(20, 0, 41, 0, 0, __pyx_empty_bytes, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_k_tuple_18, __pyx_empty_tuple, __pyx_empty_tuple, __pyx_kp_s_20, __pyx_n_s__plain_sgd, 327, __pyx_empty_bytes); if (unlikely(!__pyx_k_codeobj_19)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC initsgd_fast(void); /*proto*/ PyMODINIT_FUNC initsgd_fast(void) #else PyMODINIT_FUNC PyInit_sgd_fast(void); /*proto*/ PyMODINIT_FUNC PyInit_sgd_fast(void) #endif { PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; __Pyx_RefNannyDeclarations #if CYTHON_REFNANNY __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } #endif __Pyx_RefNannySetupContext("PyMODINIT_FUNC PyInit_sgd_fast(void)", 0); if ( __Pyx_check_binary_version() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __Pyx_CyFunction_USED if (__Pyx_CyFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_FusedFunction_USED if (__pyx_FusedFunction_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif #ifdef __Pyx_Generator_USED if (__pyx_Generator_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("sgd_fast"), __pyx_methods, 0, 0, PYTHON_API_VERSION); Py_XINCREF(__pyx_m); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (unlikely(!__pyx_m)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if PY_MAJOR_VERSION >= 3 { PyObject *modules = PyImport_GetModuleDict(); if (unlikely(!modules)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (!PyDict_GetItemString(modules, "sklearn.linear_model.sgd_fast")) { if (unlikely(PyDict_SetItemString(modules, "sklearn.linear_model.sgd_fast", __pyx_m) < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } } #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (unlikely(!__pyx_b)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #if CYTHON_COMPILING_IN_PYPY Py_INCREF(__pyx_b); #endif if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main_sklearn__linear_model__sgd_fast) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Variable export code ---*/ /*--- Function export code ---*/ /*--- Type init code ---*/ __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_LossFunction.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12LossFunction_dloss; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "LossFunction", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 46; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction = &__pyx_type_7sklearn_12linear_model_8sgd_fast_LossFunction; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Regression.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_10Regression_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_Regression.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Regression", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 84; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Regression; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Classification.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_14Classification_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_Classification.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Classification", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 94; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Classification; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_13ModifiedHuber_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "ModifiedHuber", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 104; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_ModifiedHuber = &__pyx_type_7sklearn_12linear_model_8sgd_fast_ModifiedHuber; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Hinge.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Hinge_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Hinge", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 134; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Hinge = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Hinge; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_LossFunction; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredHinge.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_12SquaredHinge_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_LossFunction; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "SquaredHinge", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 166; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredHinge = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredHinge; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Classification; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Log.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_3Log_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_Log.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Classification; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Log.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Log", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Log) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 198; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Log = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Log; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredLoss.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_11SquaredLoss_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "SquaredLoss", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 223; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredLoss = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredLoss; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_Huber.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_5Huber_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_Huber.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "Huber", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 235; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Huber = &__pyx_type_7sklearn_12linear_model_8sgd_fast_Huber; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_18EpsilonInsensitive_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "EpsilonInsensitive", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 271; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive = &__pyx_type_7sklearn_12linear_model_8sgd_fast_EpsilonInsensitive; __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = &__pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base = *__pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_Regression; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base.__pyx_base.loss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_loss; __pyx_vtable_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.__pyx_base.__pyx_base.dloss = (double (*)(struct __pyx_obj_7sklearn_12linear_model_8sgd_fast_LossFunction *, double, double, int __pyx_skip_dispatch))__pyx_f_7sklearn_12linear_model_8sgd_fast_25SquaredEpsilonInsensitive_dloss; __pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.tp_base = __pyx_ptype_7sklearn_12linear_model_8sgd_fast_Regression; if (PyType_Ready(&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetVtable(__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive.tp_dict, __pyx_vtabptr_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_SetAttrString(__pyx_m, "SquaredEpsilonInsensitive", (PyObject *)&__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 298; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive = &__pyx_type_7sklearn_12linear_model_8sgd_fast_SquaredEpsilonInsensitive; /*--- Type import code ---*/ __pyx_ptype_7cpython_4type_type = __Pyx_ImportType(__Pyx_BUILTIN_MODULE_NAME, "type", #if CYTHON_COMPILING_IN_PYPY sizeof(PyTypeObject), #else sizeof(PyHeapTypeObject), #endif 0); if (unlikely(!__pyx_ptype_7cpython_4type_type)) {__pyx_filename = __pyx_f[2]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 155; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 165; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 169; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 178; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 861; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector = __Pyx_ImportType("sklearn.utils.weight_vector", "WeightVector", sizeof(struct __pyx_obj_7sklearn_5utils_13weight_vector_WeightVector), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector = (struct __pyx_vtabstruct_7sklearn_5utils_13weight_vector_WeightVector*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_13weight_vector_WeightVector->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_13weight_vector_WeightVector)) {__pyx_filename = __pyx_f[3]; __pyx_lineno = 14; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset = __Pyx_ImportType("sklearn.utils.seq_dataset", "SequentialDataset", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_SequentialDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_SequentialDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_SequentialDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_SequentialDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset = __Pyx_ImportType("sklearn.utils.seq_dataset", "ArrayDataset", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_ArrayDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_ArrayDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_ArrayDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_ArrayDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 17; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset = __Pyx_ImportType("sklearn.utils.seq_dataset", "CSRDataset", sizeof(struct __pyx_obj_7sklearn_5utils_11seq_dataset_CSRDataset), 1); if (unlikely(!__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset = (struct __pyx_vtabstruct_7sklearn_5utils_11seq_dataset_CSRDataset*)__Pyx_GetVtable(__pyx_ptype_7sklearn_5utils_11seq_dataset_CSRDataset->tp_dict); if (unlikely(!__pyx_vtabptr_7sklearn_5utils_11seq_dataset_CSRDataset)) {__pyx_filename = __pyx_f[4]; __pyx_lineno = 34; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Variable import code ---*/ /*--- Function import code ---*/ /*--- Execution code ---*/ /* "sklearn/linear_model/sgd_fast.pyx":11 * * * import numpy as np # <<<<<<<<<<<<<< * import sys * from time import time */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 11; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "sklearn/linear_model/sgd_fast.pyx":12 * * import numpy as np * import sys # <<<<<<<<<<<<<< * from time import time * */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__sys), 0, -1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__sys, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 12; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "sklearn/linear_model/sgd_fast.pyx":13 * import numpy as np * import sys * from time import time # <<<<<<<<<<<<<< * * from libc.math cimport exp, log, sqrt, pow, fabs */ __pyx_t_1 = PyList_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_INCREF(((PyObject *)__pyx_n_s__time)); PyList_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_n_s__time)); __Pyx_GIVEREF(((PyObject *)__pyx_n_s__time)); __pyx_t_2 = __Pyx_Import(((PyObject *)__pyx_n_s__time), ((PyObject *)__pyx_t_1), -1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __pyx_t_1 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__time); if (__pyx_t_1 == NULL) { if (PyErr_ExceptionMatches(PyExc_AttributeError)) __Pyx_RaiseImportError(__pyx_n_s__time); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__time, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 13; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "sklearn/linear_model/sgd_fast.pyx":22 * from sklearn.utils.seq_dataset cimport SequentialDataset * * np.import_array() # <<<<<<<<<<<<<< * * */ import_array(); /* "sklearn/linear_model/sgd_fast.pyx":327 * * * def plain_sgd(np.ndarray[DOUBLE, ndim=1, mode='c'] weights, # <<<<<<<<<<<<<< * double intercept, * LossFunction loss, */ __pyx_t_2 = PyCFunction_NewEx(&__pyx_mdef_7sklearn_12linear_model_8sgd_fast_1plain_sgd, NULL, __pyx_n_s_21); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__plain_sgd, __pyx_t_2) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 327; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "sklearn/linear_model/sgd_fast.pyx":1 * # encoding: utf-8 # <<<<<<<<<<<<<< * # cython: cdivision=True * # cython: boundscheck=False */ __pyx_t_2 = PyDict_New(); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 1; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; /* "numpy.pxd":975 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); if (__pyx_m) { __Pyx_AddTraceback("init sklearn.linear_model.sgd_fast", __pyx_clineno, __pyx_lineno, __pyx_filename); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init sklearn.linear_model.sgd_fast"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ #if CYTHON_REFNANNY static __Pyx_RefNannyAPIStruct *__Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #endif /* CYTHON_REFNANNY */ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) { if (dict != __pyx_b) { PyErr_Clear(); result = PyObject_GetAttr(__pyx_b, name); } if (!result) { PyErr_SetObject(PyExc_NameError, name); } } return result; } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { #if CYTHON_COMPILING_IN_CPYTHON PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); #else PyErr_Restore(type, value, tb); #endif } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; #else PyErr_Fetch(type, value, tb); #endif } #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, CYTHON_UNUSED PyObject *cause) { Py_XINCREF(type); if (!value || value == Py_None) value = NULL; else Py_INCREF(value); if (!tb || tb == Py_None) tb = NULL; else { Py_INCREF(tb); if (!PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } } #if PY_VERSION_HEX < 0x02050000 if (PyClass_Check(type)) { #else if (PyType_Check(type)) { #endif #if CYTHON_COMPILING_IN_PYPY if (!value) { Py_INCREF(Py_None); value = Py_None; } #endif PyErr_NormalizeException(&type, &value, &tb); } else { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } value = type; #if PY_VERSION_HEX < 0x02050000 if (PyInstance_Check(type)) { type = (PyObject*) ((PyInstanceObject*)type)->in_class; Py_INCREF(type); } else { type = 0; PyErr_SetString(PyExc_TypeError, "raise: exception must be an old-style class or instance"); goto raise_error; } #else type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } #endif } __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else /* Python 3+ */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb, PyObject *cause) { PyObject* owned_instance = NULL; if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (PyExceptionClass_Check(type)) { PyObject *args; if (!value) args = PyTuple_New(0); else if (PyTuple_Check(value)) { Py_INCREF(value); args = value; } else args = PyTuple_Pack(1, value); if (!args) goto bad; owned_instance = PyEval_CallObject(type, args); Py_DECREF(args); if (!owned_instance) goto bad; value = owned_instance; if (!PyExceptionInstance_Check(value)) { PyErr_Format(PyExc_TypeError, "calling %R should have returned an instance of " "BaseException, not %R", type, Py_TYPE(value)); goto bad; } } else { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } if (cause && cause != Py_None) { PyObject *fixed_cause; if (PyExceptionClass_Check(cause)) { fixed_cause = PyObject_CallObject(cause, NULL); if (fixed_cause == NULL) goto bad; } else if (PyExceptionInstance_Check(cause)) { fixed_cause = cause; Py_INCREF(fixed_cause); } else { PyErr_SetString(PyExc_TypeError, "exception causes must derive from " "BaseException"); goto bad; } PyException_SetCause(value, fixed_cause); } PyErr_SetObject(type, value); if (tb) { PyThreadState *tstate = PyThreadState_GET(); PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } } bad: Py_XDECREF(owned_instance); return; } #endif static void __Pyx_RaiseArgtupleInvalid( const char* func_name, int exact, Py_ssize_t num_min, Py_ssize_t num_max, Py_ssize_t num_found) { Py_ssize_t num_expected; const char *more_or_less; if (num_found < num_min) { num_expected = num_min; more_or_less = "at least"; } else { num_expected = num_max; more_or_less = "at most"; } if (exact) { more_or_less = "exactly"; } PyErr_Format(PyExc_TypeError, "%s() takes %s %" CYTHON_FORMAT_SSIZE_T "d positional argument%s (%" CYTHON_FORMAT_SSIZE_T "d given)", func_name, more_or_less, num_expected, (num_expected == 1) ? "" : "s", num_found); } static void __Pyx_RaiseDoubleKeywordsError( const char* func_name, PyObject* kw_name) { PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION >= 3 "%s() got multiple values for keyword argument '%U'", func_name, kw_name); #else "%s() got multiple values for keyword argument '%s'", func_name, PyString_AsString(kw_name)); #endif } static int __Pyx_ParseOptionalKeywords( PyObject *kwds, PyObject **argnames[], PyObject *kwds2, PyObject *values[], Py_ssize_t num_pos_args, const char* function_name) { PyObject *key = 0, *value = 0; Py_ssize_t pos = 0; PyObject*** name; PyObject*** first_kw_arg = argnames + num_pos_args; while (PyDict_Next(kwds, &pos, &key, &value)) { name = first_kw_arg; while (*name && (**name != key)) name++; if (*name) { values[name-argnames] = value; continue; } name = first_kw_arg; #if PY_MAJOR_VERSION < 3 if (likely(PyString_CheckExact(key)) || likely(PyString_Check(key))) { while (*name) { if ((CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**name) == PyString_GET_SIZE(key)) && _PyString_Eq(**name, key)) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { if ((**argname == key) || ( (CYTHON_COMPILING_IN_PYPY || PyString_GET_SIZE(**argname) == PyString_GET_SIZE(key)) && _PyString_Eq(**argname, key))) { goto arg_passed_twice; } argname++; } } } else #endif if (likely(PyUnicode_Check(key))) { while (*name) { int cmp = (**name == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**name) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**name, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) { values[name-argnames] = value; break; } name++; } if (*name) continue; else { PyObject*** argname = argnames; while (argname != first_kw_arg) { int cmp = (**argname == key) ? 0 : #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION >= 3 (PyUnicode_GET_SIZE(**argname) != PyUnicode_GET_SIZE(key)) ? 1 : #endif PyUnicode_Compare(**argname, key); if (cmp < 0 && unlikely(PyErr_Occurred())) goto bad; if (cmp == 0) goto arg_passed_twice; argname++; } } } else goto invalid_keyword_type; if (kwds2) { if (unlikely(PyDict_SetItem(kwds2, key, value))) goto bad; } else { goto invalid_keyword; } } return 0; arg_passed_twice: __Pyx_RaiseDoubleKeywordsError(function_name, key); goto bad; invalid_keyword_type: PyErr_Format(PyExc_TypeError, "%s() keywords must be strings", function_name); goto bad; invalid_keyword: PyErr_Format(PyExc_TypeError, #if PY_MAJOR_VERSION < 3 "%s() got an unexpected keyword argument '%s'", function_name, PyString_AsString(key)); #else "%s() got an unexpected keyword argument '%U'", function_name, key); #endif bad: return -1; } static int __Pyx_ArgTypeTest(PyObject *obj, PyTypeObject *type, int none_allowed, const char *name, int exact) { if (!type) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (none_allowed && obj == Py_None) return 1; else if (exact) { if (Py_TYPE(obj) == type) return 1; } else { if (PyObject_TypeCheck(obj, type)) return 1; } PyErr_Format(PyExc_TypeError, "Argument '%s' has incorrect type (expected %s, got %s)", name, type->tp_name, Py_TYPE(obj)->tp_name); return 0; } static CYTHON_INLINE int __Pyx_IsLittleEndian(void) { unsigned int n = 1; return *(unsigned char*)(&n) != 0; } static void __Pyx_BufFmt_Init(__Pyx_BufFmt_Context* ctx, __Pyx_BufFmt_StackElem* stack, __Pyx_TypeInfo* type) { stack[0].field = &ctx->root; stack[0].parent_offset = 0; ctx->root.type = type; ctx->root.name = "buffer dtype"; ctx->root.offset = 0; ctx->head = stack; ctx->head->field = &ctx->root; ctx->fmt_offset = 0; ctx->head->parent_offset = 0; ctx->new_packmode = '@'; ctx->enc_packmode = '@'; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->is_complex = 0; ctx->is_valid_array = 0; ctx->struct_alignment = 0; while (type->typegroup == 'S') { ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = 0; type = type->fields->type; } } static int __Pyx_BufFmt_ParseNumber(const char** ts) { int count; const char* t = *ts; if (*t < '0' || *t > '9') { return -1; } else { count = *t++ - '0'; while (*t >= '0' && *t < '9') { count *= 10; count += *t++ - '0'; } } *ts = t; return count; } static int __Pyx_BufFmt_ExpectNumber(const char **ts) { int number = __Pyx_BufFmt_ParseNumber(ts); if (number == -1) /* First char was not a digit */ PyErr_Format(PyExc_ValueError,\ "Does not understand character buffer dtype format string ('%c')", **ts); return number; } static void __Pyx_BufFmt_RaiseUnexpectedChar(char ch) { PyErr_Format(PyExc_ValueError, "Unexpected format string character: '%c'", ch); } static const char* __Pyx_BufFmt_DescribeTypeChar(char ch, int is_complex) { switch (ch) { case 'c': return "'char'"; case 'b': return "'signed char'"; case 'B': return "'unsigned char'"; case 'h': return "'short'"; case 'H': return "'unsigned short'"; case 'i': return "'int'"; case 'I': return "'unsigned int'"; case 'l': return "'long'"; case 'L': return "'unsigned long'"; case 'q': return "'long long'"; case 'Q': return "'unsigned long long'"; case 'f': return (is_complex ? "'complex float'" : "'float'"); case 'd': return (is_complex ? "'complex double'" : "'double'"); case 'g': return (is_complex ? "'complex long double'" : "'long double'"); case 'T': return "a struct"; case 'O': return "Python object"; case 'P': return "a pointer"; case 's': case 'p': return "a string"; case 0: return "end"; default: return "unparseable format string"; } } static size_t __Pyx_BufFmt_TypeCharToStandardSize(char ch, int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return 2; case 'i': case 'I': case 'l': case 'L': return 4; case 'q': case 'Q': return 8; case 'f': return (is_complex ? 8 : 4); case 'd': return (is_complex ? 16 : 8); case 'g': { PyErr_SetString(PyExc_ValueError, "Python does not define a standard format string size for long double ('g').."); return 0; } case 'O': case 'P': return sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static size_t __Pyx_BufFmt_TypeCharToNativeSize(char ch, int is_complex) { switch (ch) { case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(short); case 'i': case 'I': return sizeof(int); case 'l': case 'L': return sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(float) * (is_complex ? 2 : 1); case 'd': return sizeof(double) * (is_complex ? 2 : 1); case 'g': return sizeof(long double) * (is_complex ? 2 : 1); case 'O': case 'P': return sizeof(void*); default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } typedef struct { char c; short x; } __Pyx_st_short; typedef struct { char c; int x; } __Pyx_st_int; typedef struct { char c; long x; } __Pyx_st_long; typedef struct { char c; float x; } __Pyx_st_float; typedef struct { char c; double x; } __Pyx_st_double; typedef struct { char c; long double x; } __Pyx_st_longdouble; typedef struct { char c; void *x; } __Pyx_st_void_p; #ifdef HAVE_LONG_LONG typedef struct { char c; PY_LONG_LONG x; } __Pyx_st_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToAlignment(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_st_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_st_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_st_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_st_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_st_float) - sizeof(float); case 'd': return sizeof(__Pyx_st_double) - sizeof(double); case 'g': return sizeof(__Pyx_st_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_st_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } /* These are for computing the padding at the end of the struct to align on the first member of the struct. This will probably the same as above, but we don't have any guarantees. */ typedef struct { short x; char c; } __Pyx_pad_short; typedef struct { int x; char c; } __Pyx_pad_int; typedef struct { long x; char c; } __Pyx_pad_long; typedef struct { float x; char c; } __Pyx_pad_float; typedef struct { double x; char c; } __Pyx_pad_double; typedef struct { long double x; char c; } __Pyx_pad_longdouble; typedef struct { void *x; char c; } __Pyx_pad_void_p; #ifdef HAVE_LONG_LONG typedef struct { PY_LONG_LONG x; char c; } __Pyx_pad_longlong; #endif static size_t __Pyx_BufFmt_TypeCharToPadding(char ch, CYTHON_UNUSED int is_complex) { switch (ch) { case '?': case 'c': case 'b': case 'B': case 's': case 'p': return 1; case 'h': case 'H': return sizeof(__Pyx_pad_short) - sizeof(short); case 'i': case 'I': return sizeof(__Pyx_pad_int) - sizeof(int); case 'l': case 'L': return sizeof(__Pyx_pad_long) - sizeof(long); #ifdef HAVE_LONG_LONG case 'q': case 'Q': return sizeof(__Pyx_pad_longlong) - sizeof(PY_LONG_LONG); #endif case 'f': return sizeof(__Pyx_pad_float) - sizeof(float); case 'd': return sizeof(__Pyx_pad_double) - sizeof(double); case 'g': return sizeof(__Pyx_pad_longdouble) - sizeof(long double); case 'P': case 'O': return sizeof(__Pyx_pad_void_p) - sizeof(void*); default: __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } static char __Pyx_BufFmt_TypeCharToGroup(char ch, int is_complex) { switch (ch) { case 'c': return 'H'; case 'b': case 'h': case 'i': case 'l': case 'q': case 's': case 'p': return 'I'; case 'B': case 'H': case 'I': case 'L': case 'Q': return 'U'; case 'f': case 'd': case 'g': return (is_complex ? 'C' : 'R'); case 'O': return 'O'; case 'P': return 'P'; default: { __Pyx_BufFmt_RaiseUnexpectedChar(ch); return 0; } } } static void __Pyx_BufFmt_RaiseExpected(__Pyx_BufFmt_Context* ctx) { if (ctx->head == NULL || ctx->head->field == &ctx->root) { const char* expected; const char* quote; if (ctx->head == NULL) { expected = "end"; quote = ""; } else { expected = ctx->head->field->type->name; quote = "'"; } PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected %s%s%s but got %s", quote, expected, quote, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex)); } else { __Pyx_StructField* field = ctx->head->field; __Pyx_StructField* parent = (ctx->head - 1)->field; PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch, expected '%s' but got %s in '%s.%s'", field->type->name, __Pyx_BufFmt_DescribeTypeChar(ctx->enc_type, ctx->is_complex), parent->type->name, field->name); } } static int __Pyx_BufFmt_ProcessTypeChunk(__Pyx_BufFmt_Context* ctx) { char group; size_t size, offset, arraysize = 1; if (ctx->enc_type == 0) return 0; if (ctx->head->field->type->arraysize[0]) { int i, ndim = 0; if (ctx->enc_type == 's' || ctx->enc_type == 'p') { ctx->is_valid_array = ctx->head->field->type->ndim == 1; ndim = 1; if (ctx->enc_count != ctx->head->field->type->arraysize[0]) { PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %zu", ctx->head->field->type->arraysize[0], ctx->enc_count); return -1; } } if (!ctx->is_valid_array) { PyErr_Format(PyExc_ValueError, "Expected %d dimensions, got %d", ctx->head->field->type->ndim, ndim); return -1; } for (i = 0; i < ctx->head->field->type->ndim; i++) { arraysize *= ctx->head->field->type->arraysize[i]; } ctx->is_valid_array = 0; ctx->enc_count = 1; } group = __Pyx_BufFmt_TypeCharToGroup(ctx->enc_type, ctx->is_complex); do { __Pyx_StructField* field = ctx->head->field; __Pyx_TypeInfo* type = field->type; if (ctx->enc_packmode == '@' || ctx->enc_packmode == '^') { size = __Pyx_BufFmt_TypeCharToNativeSize(ctx->enc_type, ctx->is_complex); } else { size = __Pyx_BufFmt_TypeCharToStandardSize(ctx->enc_type, ctx->is_complex); } if (ctx->enc_packmode == '@') { size_t align_at = __Pyx_BufFmt_TypeCharToAlignment(ctx->enc_type, ctx->is_complex); size_t align_mod_offset; if (align_at == 0) return -1; align_mod_offset = ctx->fmt_offset % align_at; if (align_mod_offset > 0) ctx->fmt_offset += align_at - align_mod_offset; if (ctx->struct_alignment == 0) ctx->struct_alignment = __Pyx_BufFmt_TypeCharToPadding(ctx->enc_type, ctx->is_complex); } if (type->size != size || type->typegroup != group) { if (type->typegroup == 'C' && type->fields != NULL) { size_t parent_offset = ctx->head->parent_offset + field->offset; ++ctx->head; ctx->head->field = type->fields; ctx->head->parent_offset = parent_offset; continue; } if ((type->typegroup == 'H' || group == 'H') && type->size == size) { } else { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } } offset = ctx->head->parent_offset + field->offset; if (ctx->fmt_offset != offset) { PyErr_Format(PyExc_ValueError, "Buffer dtype mismatch; next field is at offset %" CYTHON_FORMAT_SSIZE_T "d but %" CYTHON_FORMAT_SSIZE_T "d expected", (Py_ssize_t)ctx->fmt_offset, (Py_ssize_t)offset); return -1; } ctx->fmt_offset += size; if (arraysize) ctx->fmt_offset += (arraysize - 1) * size; --ctx->enc_count; /* Consume from buffer string */ while (1) { if (field == &ctx->root) { ctx->head = NULL; if (ctx->enc_count != 0) { __Pyx_BufFmt_RaiseExpected(ctx); return -1; } break; /* breaks both loops as ctx->enc_count == 0 */ } ctx->head->field = ++field; if (field->type == NULL) { --ctx->head; field = ctx->head->field; continue; } else if (field->type->typegroup == 'S') { size_t parent_offset = ctx->head->parent_offset + field->offset; if (field->type->fields->type == NULL) continue; /* empty struct */ field = field->type->fields; ++ctx->head; ctx->head->field = field; ctx->head->parent_offset = parent_offset; break; } else { break; } } } while (ctx->enc_count); ctx->enc_type = 0; ctx->is_complex = 0; return 0; } static CYTHON_INLINE PyObject * __pyx_buffmt_parse_array(__Pyx_BufFmt_Context* ctx, const char** tsp) { const char *ts = *tsp; int i = 0, number; int ndim = ctx->head->field->type->ndim; ; ++ts; if (ctx->new_count != 1) { PyErr_SetString(PyExc_ValueError, "Cannot handle repeated arrays in format string"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; while (*ts && *ts != ')') { if (isspace(*ts)) continue; number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; if (i < ndim && (size_t) number != ctx->head->field->type->arraysize[i]) return PyErr_Format(PyExc_ValueError, "Expected a dimension of size %zu, got %d", ctx->head->field->type->arraysize[i], number); if (*ts != ',' && *ts != ')') return PyErr_Format(PyExc_ValueError, "Expected a comma in format string, got '%c'", *ts); if (*ts == ',') ts++; i++; } if (i != ndim) return PyErr_Format(PyExc_ValueError, "Expected %d dimension(s), got %d", ctx->head->field->type->ndim, i); if (!*ts) { PyErr_SetString(PyExc_ValueError, "Unexpected end of format string, expected ')'"); return NULL; } ctx->is_valid_array = 1; ctx->new_count = 1; *tsp = ++ts; return Py_None; } static const char* __Pyx_BufFmt_CheckString(__Pyx_BufFmt_Context* ctx, const char* ts) { int got_Z = 0; while (1) { switch(*ts) { case 0: if (ctx->enc_type != 0 && ctx->head == NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; if (ctx->head != NULL) { __Pyx_BufFmt_RaiseExpected(ctx); return NULL; } return ts; case ' ': case 10: case 13: ++ts; break; case '<': if (!__Pyx_IsLittleEndian()) { PyErr_SetString(PyExc_ValueError, "Little-endian buffer not supported on big-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '>': case '!': if (__Pyx_IsLittleEndian()) { PyErr_SetString(PyExc_ValueError, "Big-endian buffer not supported on little-endian compiler"); return NULL; } ctx->new_packmode = '='; ++ts; break; case '=': case '@': case '^': ctx->new_packmode = *ts++; break; case 'T': /* substruct */ { const char* ts_after_sub; size_t i, struct_count = ctx->new_count; size_t struct_alignment = ctx->struct_alignment; ctx->new_count = 1; ++ts; if (*ts != '{') { PyErr_SetString(PyExc_ValueError, "Buffer acquisition: Expected '{' after 'T'"); return NULL; } if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; /* Erase processed last struct element */ ctx->enc_count = 0; ctx->struct_alignment = 0; ++ts; ts_after_sub = ts; for (i = 0; i != struct_count; ++i) { ts_after_sub = __Pyx_BufFmt_CheckString(ctx, ts); if (!ts_after_sub) return NULL; } ts = ts_after_sub; if (struct_alignment) ctx->struct_alignment = struct_alignment; } break; case '}': /* end of substruct; either repeat or move on */ { size_t alignment = ctx->struct_alignment; ++ts; if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_type = 0; /* Erase processed last struct element */ if (alignment && ctx->fmt_offset % alignment) { ctx->fmt_offset += alignment - (ctx->fmt_offset % alignment); } } return ts; case 'x': if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->fmt_offset += ctx->new_count; ctx->new_count = 1; ctx->enc_count = 0; ctx->enc_type = 0; ctx->enc_packmode = ctx->new_packmode; ++ts; break; case 'Z': got_Z = 1; ++ts; if (*ts != 'f' && *ts != 'd' && *ts != 'g') { __Pyx_BufFmt_RaiseUnexpectedChar('Z'); return NULL; } /* fall through */ case 'c': case 'b': case 'B': case 'h': case 'H': case 'i': case 'I': case 'l': case 'L': case 'q': case 'Q': case 'f': case 'd': case 'g': case 'O': case 's': case 'p': if (ctx->enc_type == *ts && got_Z == ctx->is_complex && ctx->enc_packmode == ctx->new_packmode) { ctx->enc_count += ctx->new_count; } else { if (__Pyx_BufFmt_ProcessTypeChunk(ctx) == -1) return NULL; ctx->enc_count = ctx->new_count; ctx->enc_packmode = ctx->new_packmode; ctx->enc_type = *ts; ctx->is_complex = got_Z; } ++ts; ctx->new_count = 1; got_Z = 0; break; case ':': ++ts; while(*ts != ':') ++ts; ++ts; break; case '(': if (!__pyx_buffmt_parse_array(ctx, &ts)) return NULL; break; default: { int number = __Pyx_BufFmt_ExpectNumber(&ts); if (number == -1) return NULL; ctx->new_count = (size_t)number; } } } } static CYTHON_INLINE void __Pyx_ZeroBuffer(Py_buffer* buf) { buf->buf = NULL; buf->obj = NULL; buf->strides = __Pyx_zeros; buf->shape = __Pyx_zeros; buf->suboffsets = __Pyx_minusones; } static CYTHON_INLINE int __Pyx_GetBufferAndValidate( Py_buffer* buf, PyObject* obj, __Pyx_TypeInfo* dtype, int flags, int nd, int cast, __Pyx_BufFmt_StackElem* stack) { if (obj == Py_None || obj == NULL) { __Pyx_ZeroBuffer(buf); return 0; } buf->buf = NULL; if (__Pyx_GetBuffer(obj, buf, flags) == -1) goto fail; if (buf->ndim != nd) { PyErr_Format(PyExc_ValueError, "Buffer has wrong number of dimensions (expected %d, got %d)", nd, buf->ndim); goto fail; } if (!cast) { __Pyx_BufFmt_Context ctx; __Pyx_BufFmt_Init(&ctx, stack, dtype); if (!__Pyx_BufFmt_CheckString(&ctx, buf->format)) goto fail; } if ((unsigned)buf->itemsize != dtype->size) { PyErr_Format(PyExc_ValueError, "Item size of buffer (%" CYTHON_FORMAT_SSIZE_T "d byte%s) does not match size of '%s' (%" CYTHON_FORMAT_SSIZE_T "d byte%s)", buf->itemsize, (buf->itemsize > 1) ? "s" : "", dtype->name, (Py_ssize_t)dtype->size, (dtype->size > 1) ? "s" : ""); goto fail; } if (buf->suboffsets == NULL) buf->suboffsets = __Pyx_minusones; return 0; fail:; __Pyx_ZeroBuffer(buf); return -1; } static CYTHON_INLINE void __Pyx_SafeReleaseBuffer(Py_buffer* info) { if (info->buf == NULL) return; if (info->suboffsets == __Pyx_minusones) info->suboffsets = NULL; __Pyx_ReleaseBuffer(info); } static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (likely(PyObject_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } static void __Pyx_RaiseBufferFallbackError(void) { PyErr_Format(PyExc_ValueError, "Buffer acquisition failed on assignment; and then reacquiring the old buffer failed too!"); } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, "too many values to unpack (expected %" CYTHON_FORMAT_SSIZE_T "d)", expected); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, "need more than %" CYTHON_FORMAT_SSIZE_T "d value%s to unpack", index, (index == 1) ? "" : "s"); } static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } static CYTHON_INLINE int __Pyx_IterFinish(void) { #if CYTHON_COMPILING_IN_CPYTHON PyThreadState *tstate = PyThreadState_GET(); PyObject* exc_type = tstate->curexc_type; if (unlikely(exc_type)) { if (likely(exc_type == PyExc_StopIteration) || PyErr_GivenExceptionMatches(exc_type, PyExc_StopIteration)) { PyObject *exc_value, *exc_tb; exc_value = tstate->curexc_value; exc_tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; Py_DECREF(exc_type); Py_XDECREF(exc_value); Py_XDECREF(exc_tb); return 0; } else { return -1; } } return 0; #else if (unlikely(PyErr_Occurred())) { if (likely(PyErr_ExceptionMatches(PyExc_StopIteration))) { PyErr_Clear(); return 0; } else { return -1; } } return 0; #endif } static int __Pyx_IternextUnpackEndCheck(PyObject *retval, Py_ssize_t expected) { if (unlikely(retval)) { Py_DECREF(retval); __Pyx_RaiseTooManyValuesError(expected); return -1; } else { return __Pyx_IterFinish(); } return 0; } #if PY_MAJOR_VERSION < 3 static int __Pyx_GetBuffer(PyObject *obj, Py_buffer *view, int flags) { CYTHON_UNUSED PyObject *getbuffer_cobj; #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) return PyObject_GetBuffer(obj, view, flags); #endif if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) return __pyx_pw_5numpy_7ndarray_1__getbuffer__(obj, view, flags); #if PY_VERSION_HEX < 0x02060000 if (obj->ob_type->tp_dict && (getbuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict, "__pyx_getbuffer"))) { getbufferproc func; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0) func = (getbufferproc) PyCapsule_GetPointer(getbuffer_cobj, "getbuffer(obj, view, flags)"); #else func = (getbufferproc) PyCObject_AsVoidPtr(getbuffer_cobj); #endif Py_DECREF(getbuffer_cobj); if (!func) goto fail; return func(obj, view, flags); } else { PyErr_Clear(); } #endif PyErr_Format(PyExc_TypeError, "'%100s' does not have the buffer interface", Py_TYPE(obj)->tp_name); #if PY_VERSION_HEX < 0x02060000 fail: #endif return -1; } static void __Pyx_ReleaseBuffer(Py_buffer *view) { PyObject *obj = view->obj; CYTHON_UNUSED PyObject *releasebuffer_cobj; if (!obj) return; #if PY_VERSION_HEX >= 0x02060000 if (PyObject_CheckBuffer(obj)) { PyBuffer_Release(view); return; } #endif if (PyObject_TypeCheck(obj, __pyx_ptype_5numpy_ndarray)) { __pyx_pw_5numpy_7ndarray_3__releasebuffer__(obj, view); return; } #if PY_VERSION_HEX < 0x02060000 if (obj->ob_type->tp_dict && (releasebuffer_cobj = PyMapping_GetItemString(obj->ob_type->tp_dict, "__pyx_releasebuffer"))) { releasebufferproc func; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION == 3 && PY_MINOR_VERSION == 0) func = (releasebufferproc) PyCapsule_GetPointer(releasebuffer_cobj, "releasebuffer(obj, view)"); #else func = (releasebufferproc) PyCObject_AsVoidPtr(releasebuffer_cobj); #endif Py_DECREF(releasebuffer_cobj); if (!func) goto fail; func(obj, view); return; } else { PyErr_Clear(); } #endif goto nofail; #if PY_VERSION_HEX < 0x02060000 fail: #endif PyErr_WriteUnraisable(obj); nofail: Py_DECREF(obj); view->obj = NULL; } #endif /* PY_MAJOR_VERSION < 3 */ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list, long level) { PyObject *py_import = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; #if PY_VERSION_HEX >= 0x02050000 { #if PY_MAJOR_VERSION >= 3 if (level == -1) { if (strchr(__Pyx_MODULE_NAME, '.')) { /* try package relative import first */ PyObject *py_level = PyInt_FromLong(1); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); if (!module) { if (!PyErr_ExceptionMatches(PyExc_ImportError)) goto bad; PyErr_Clear(); } } level = 0; /* try absolute import on failure */ } #endif if (!module) { PyObject *py_level = PyInt_FromLong(level); if (!py_level) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, py_level, NULL); Py_DECREF(py_level); } } #else if (level>0) { PyErr_SetString(PyExc_RuntimeError, "Relative import is not supported for Python <=2.4."); goto bad; } module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); #endif bad: Py_XDECREF(empty_list); Py_XDECREF(py_import); Py_XDECREF(empty_dict); return module; } static CYTHON_INLINE void __Pyx_RaiseImportError(PyObject *name) { #if PY_MAJOR_VERSION < 3 PyErr_Format(PyExc_ImportError, "cannot import name %.230s", PyString_AsString(name)); #else PyErr_Format(PyExc_ImportError, "cannot import name %S", name); #endif } #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3 static PyObject *__Pyx_GetStdout(void) { PyObject *f = PySys_GetObject((char *)"stdout"); if (!f) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); } return f; } static int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) { int i; if (!f) { if (!(f = __Pyx_GetStdout())) return -1; } Py_INCREF(f); for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { PyObject* v; if (PyFile_SoftSpace(f, 1)) { if (PyFile_WriteString(" ", f) < 0) goto error; } v = PyTuple_GET_ITEM(arg_tuple, i); if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) goto error; if (PyString_Check(v)) { char *s = PyString_AsString(v); Py_ssize_t len = PyString_Size(v); if (len > 0 && isspace(Py_CHARMASK(s[len-1])) && s[len-1] != ' ') PyFile_SoftSpace(f, 0); } } if (newline) { if (PyFile_WriteString("\n", f) < 0) goto error; PyFile_SoftSpace(f, 0); } Py_DECREF(f); return 0; error: Py_DECREF(f); return -1; } #else /* Python 3 has a print function */ static int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) { PyObject* kwargs = 0; PyObject* result = 0; PyObject* end_string; if (unlikely(!__pyx_print)) { __pyx_print = __Pyx_GetAttrString(__pyx_b, "print"); if (!__pyx_print) return -1; } if (stream) { kwargs = PyDict_New(); if (unlikely(!kwargs)) return -1; if (unlikely(PyDict_SetItemString(kwargs, "file", stream) < 0)) goto bad; if (!newline) { end_string = PyUnicode_FromStringAndSize(" ", 1); if (unlikely(!end_string)) goto bad; if (PyDict_SetItemString(kwargs, "end", end_string) < 0) { Py_DECREF(end_string); goto bad; } Py_DECREF(end_string); } } else if (!newline) { if (unlikely(!__pyx_print_kwargs)) { __pyx_print_kwargs = PyDict_New(); if (unlikely(!__pyx_print_kwargs)) return -1; end_string = PyUnicode_FromStringAndSize(" ", 1); if (unlikely(!end_string)) return -1; if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) { Py_DECREF(end_string); return -1; } Py_DECREF(end_string); } kwargs = __pyx_print_kwargs; } result = PyObject_Call(__pyx_print, arg_tuple, kwargs); if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs)) Py_DECREF(kwargs); if (!result) return -1; Py_DECREF(result); return 0; bad: if (kwargs != __pyx_print_kwargs) Py_XDECREF(kwargs); return -1; } #endif #if !CYTHON_COMPILING_IN_PYPY && PY_MAJOR_VERSION < 3 static int __Pyx_PrintOne(PyObject* f, PyObject *o) { if (!f) { if (!(f = __Pyx_GetStdout())) return -1; } Py_INCREF(f); if (PyFile_SoftSpace(f, 0)) { if (PyFile_WriteString(" ", f) < 0) goto error; } if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) goto error; if (PyFile_WriteString("\n", f) < 0) goto error; Py_DECREF(f); return 0; error: Py_DECREF(f); return -1; /* the line below is just to avoid C compiler * warnings about unused functions */ return __Pyx_Print(f, NULL, 0); } #else /* Python 3 has a print function */ static int __Pyx_PrintOne(PyObject* stream, PyObject *o) { int res; PyObject* arg_tuple = PyTuple_Pack(1, o); if (unlikely(!arg_tuple)) return -1; res = __Pyx_Print(stream, arg_tuple, 1); Py_DECREF(arg_tuple); return res; } #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(a, a); case 3: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, a); case 4: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_absf(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(a, a); case 3: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, a); case 4: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_abs(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)PyLong_AsUnsignedLong(x); } else { return (unsigned long)PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (unsigned PY_LONG_LONG)PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)PyLong_AsUnsignedLong(x); } else { return (long)PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (PY_LONG_LONG)PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)PyLong_AsUnsignedLong(x); } else { return (signed long)PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)PyLong_AsUnsignedLongLong(x); } else { return (signed PY_LONG_LONG)PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } static void __Pyx_WriteUnraisable(const char *name, CYTHON_UNUSED int clineno, CYTHON_UNUSED int lineno, CYTHON_UNUSED const char *filename) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } } static int __Pyx_check_binary_version(void) { char ctversion[4], rtversion[4]; PyOS_snprintf(ctversion, 4, "%d.%d", PY_MAJOR_VERSION, PY_MINOR_VERSION); PyOS_snprintf(rtversion, 4, "%s", Py_GetVersion()); if (ctversion[0] != rtversion[0] || ctversion[2] != rtversion[2]) { char message[200]; PyOS_snprintf(message, sizeof(message), "compiletime version %s of module '%.100s' " "does not match runtime version %s", ctversion, __Pyx_MODULE_NAME, rtversion); #if PY_VERSION_HEX < 0x02050000 return PyErr_Warn(NULL, message); #else return PyErr_WarnEx(NULL, message, 1); #endif } return 0; } static int __Pyx_SetVtable(PyObject *dict, void *vtable) { #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) PyObject *ob = PyCapsule_New(vtable, 0, 0); #else PyObject *ob = PyCObject_FromVoidPtr(vtable, 0); #endif if (!ob) goto bad; if (PyDict_SetItemString(dict, "__pyx_vtable__", ob) < 0) goto bad; Py_DECREF(ob); return 0; bad: Py_XDECREF(ob); return -1; } #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; py_name = __Pyx_PyIdentifier_FromString(name); if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, size_t size, int strict) { PyObject *py_module = 0; PyObject *result = 0; PyObject *py_name = 0; char warning[200]; py_module = __Pyx_ImportModule(module_name); if (!py_module) goto bad; py_name = __Pyx_PyIdentifier_FromString(class_name); if (!py_name) goto bad; result = PyObject_GetAttr(py_module, py_name); Py_DECREF(py_name); py_name = 0; Py_DECREF(py_module); py_module = 0; if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%s.%s is not a type object", module_name, class_name); goto bad; } if (!strict && (size_t)((PyTypeObject *)result)->tp_basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility", module_name, class_name); #if PY_VERSION_HEX < 0x02050000 if (PyErr_Warn(NULL, warning) < 0) goto bad; #else if (PyErr_WarnEx(NULL, warning, 0) < 0) goto bad; #endif } else if ((size_t)((PyTypeObject *)result)->tp_basicsize != size) { PyErr_Format(PyExc_ValueError, "%s.%s has the wrong size, try recompiling", module_name, class_name); goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(py_module); Py_XDECREF(result); return NULL; } #endif static void* __Pyx_GetVtable(PyObject *dict) { void* ptr; PyObject *ob = PyMapping_GetItemString(dict, (char *)"__pyx_vtable__"); if (!ob) goto bad; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) ptr = PyCapsule_GetPointer(ob, 0); #else ptr = PyCObject_AsVoidPtr(ob); #endif if (!ptr && !PyErr_Occurred()) PyErr_SetString(PyExc_RuntimeError, "invalid vtable found for imported type"); Py_DECREF(ob); return ptr; bad: Py_XDECREF(ob); return NULL; } static int __pyx_bisect_code_objects(__Pyx_CodeObjectCacheEntry* entries, int count, int code_line) { int start = 0, mid = 0, end = count - 1; if (end >= 0 && code_line > entries[end].code_line) { return count; } while (start < end) { mid = (start + end) / 2; if (code_line < entries[mid].code_line) { end = mid; } else if (code_line > entries[mid].code_line) { start = mid + 1; } else { return mid; } } if (code_line <= entries[mid].code_line) { return mid; } else { return mid + 1; } } static PyCodeObject *__pyx_find_code_object(int code_line) { PyCodeObject* code_object; int pos; if (unlikely(!code_line) || unlikely(!__pyx_code_cache.entries)) { return NULL; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if (unlikely(pos >= __pyx_code_cache.count) || unlikely(__pyx_code_cache.entries[pos].code_line != code_line)) { return NULL; } code_object = __pyx_code_cache.entries[pos].code_object; Py_INCREF(code_object); return code_object; } static void __pyx_insert_code_object(int code_line, PyCodeObject* code_object) { int pos, i; __Pyx_CodeObjectCacheEntry* entries = __pyx_code_cache.entries; if (unlikely(!code_line)) { return; } if (unlikely(!entries)) { entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Malloc(64*sizeof(__Pyx_CodeObjectCacheEntry)); if (likely(entries)) { __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = 64; __pyx_code_cache.count = 1; entries[0].code_line = code_line; entries[0].code_object = code_object; Py_INCREF(code_object); } return; } pos = __pyx_bisect_code_objects(__pyx_code_cache.entries, __pyx_code_cache.count, code_line); if ((pos < __pyx_code_cache.count) && unlikely(__pyx_code_cache.entries[pos].code_line == code_line)) { PyCodeObject* tmp = entries[pos].code_object; entries[pos].code_object = code_object; Py_DECREF(tmp); return; } if (__pyx_code_cache.count == __pyx_code_cache.max_count) { int new_max = __pyx_code_cache.max_count + 64; entries = (__Pyx_CodeObjectCacheEntry*)PyMem_Realloc( __pyx_code_cache.entries, new_max*sizeof(__Pyx_CodeObjectCacheEntry)); if (unlikely(!entries)) { return; } __pyx_code_cache.entries = entries; __pyx_code_cache.max_count = new_max; } for (i=__pyx_code_cache.count; i>pos; i--) { entries[i] = entries[i-1]; } entries[pos].code_line = code_line; entries[pos].code_object = code_object; __pyx_code_cache.count++; Py_INCREF(code_object); } #include "compile.h" #include "frameobject.h" #include "traceback.h" static PyCodeObject* __Pyx_CreateCodeObjectForTraceback( const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_srcfile = 0; PyObject *py_funcname = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(filename); #else py_srcfile = PyUnicode_FromString(filename); #endif if (!py_srcfile) goto bad; if (c_line) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, c_line); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_code = __Pyx_PyCode_New( 0, /*int argcount,*/ 0, /*int kwonlyargcount,*/ 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ py_line, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); Py_DECREF(py_srcfile); Py_DECREF(py_funcname); return py_code; bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); return NULL; } static void __Pyx_AddTraceback(const char *funcname, int c_line, int py_line, const char *filename) { PyCodeObject *py_code = 0; PyObject *py_globals = 0; PyFrameObject *py_frame = 0; py_code = __pyx_find_code_object(c_line ? c_line : py_line); if (!py_code) { py_code = __Pyx_CreateCodeObjectForTraceback( funcname, c_line, py_line, filename); if (!py_code) goto bad; __pyx_insert_code_object(c_line ? c_line : py_line, py_code); } py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = py_line; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } /* Type Conversion Functions */ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ ================================================ FILE: samples/C/syscalldefs.h ================================================ static const syscalldef syscalldefs[] = { [SYSCALL_OR_NUM(0, SYS_restart_syscall)] = MAKE_UINT16(0, 1), [SYSCALL_OR_NUM(1, SYS_exit)] = MAKE_UINT16(1, 17), [SYSCALL_OR_NUM(2, SYS_fork)] = MAKE_UINT16(0, 22), }; ================================================ FILE: samples/C/syscalls.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #include #include "syscalls/write.h" #include "syscalls/exit.h" #include "syscalls/getpid.h" #include "syscalls/getppid.h" #include "syscalls/read.h" #include "syscalls/brk.h" #include "syscalls/mmap.h" #include "syscalls/munmap.h" #include "syscalls/test.h" #include "syscalls/hostname.h" #include "syscalls/uname.h" #include "syscalls/open.h" #include "syscalls/execve.h" #include "syscalls/seek.h" #include "syscalls/opendir.h" #include "syscalls/readdir.h" #include "syscalls/kill.h" #include "syscalls/getexecdata.h" #include "syscalls/cwd.h" #include "syscalls/fork.h" syscall_t syscall_table[] = { NULL, sys_exit, // 1 sys_read, // 2 sys_write, // 3 sys_getpid, // 4 sys_brk, // 5 sys_getppid, // 6 sys_mmap, // 7 sys_munmap, // 8 sys_test, // 9 sys_get_hostname, // 10 sys_set_hostname, // 11 sys_uname, // 12 sys_open, // 13 sys_execve, // 14 sys_seek, // 15 sys_opendir, // 16 sys_readdir, // 17 sys_kill, // 18 sys_getexecdata, // 19 sys_chdir, // 20 sys_getcwd, // 21 sys_fork, // 22 }; char* syscall_name_table[] = { NULL, "exit", // 1 "read", // 2 "write", // 3 "getpid", // 4 "brk", // 5 "getppid", // 6 "mmap", // 7 "munmap", // 8 "test", // 9 "get_hostname", // 10 "set_hostname", // 11 "uname", // 12 "open", // 13 "execve", // 14 "seek", // 15 "opendir", // 16 "readdir", // 17 "kill", // 18 "getexecdata", // 19 "chdir", // 20 "getcwd", // 21 "fork", // 22 }; ================================================ FILE: samples/C/vfs.h ================================================ #pragma once /* Copyright © 2010, 2011 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include #define VFS_SEEK_SET 0 #define VFS_SEEK_CUR 1 #define VFS_SEEK_END 2 typedef struct { uint64_t num; char path[512]; char mount_path[512]; uint32_t offset; uint32_t mountpoint; } vfs_file_t; typedef struct { uint64_t num; char path[512]; char mount_path[512]; uint32_t mountpoint; } vfs_dir_t; typedef void* (*vfs_read_callback_t)(char* path, uint32_t offset, uint32_t size); typedef char* (*vfs_read_dir_callback_t)(char* path, uint32_t offset); // Used to always store the last read/write attempt (used for kernel panic debugging) char vfs_last_read_attempt[512]; vfs_file_t* vfs_get_from_id(uint32_t id); vfs_dir_t* vfs_get_dir_from_id(uint32_t id); void* vfs_read(vfs_file_t* fp, uint32_t size); char* vfs_dir_read(vfs_dir_t* dir, uint32_t offset); void vfs_seek(vfs_file_t* fp, uint32_t offset, int origin); vfs_file_t* vfs_open(char* path); vfs_dir_t* vfs_dir_open(char* path); int vfs_mount(char* path, vfs_read_callback_t read_callback, vfs_read_dir_callback_t read_dir_callback); ================================================ FILE: samples/C/vmem.h ================================================ #pragma once /* Copyright © 2011 Fritz Grimpen * Copyright © 2013 Lukas Martini * * This file is part of Xelix. * * Xelix is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * Xelix is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with Xelix. If not, see . */ #include struct vmem_context; struct vmem_page { enum { VMEM_SECTION_STACK, /* Initial stack */ VMEM_SECTION_CODE, /* Contains program code and is read-only */ VMEM_SECTION_DATA, /* Contains static data */ VMEM_SECTION_HEAP, /* Allocated by brk(2) at runtime */ VMEM_SECTION_MMAP, /* Allocated by mmap(2) at runtime */ VMEM_SECTION_KERNEL, /* Contains kernel-internal data */ VMEM_SECTION_UNMAPPED /* Unmapped */ } section; bool readonly:1; bool cow:1; /* Copy-on-Write mechanism */ bool allocated:1; void *cow_src_addr; void *virt_addr; void *phys_addr; }; typedef void (*vmem_iterator_t)(struct vmem_context *, struct vmem_page *, uint32_t); /* Initialize vmem_kernelContext for paging_init() */ void vmem_init(); struct vmem_context *vmem_kernelContext; struct vmem_context *vmem_currentContext; struct vmem_context *vmem_processContext; void *vmem_faultAddress; /* Some callbacks for magic functions */ void (*vmem_applyPage)(struct vmem_context *, struct vmem_page *); /* Generate new page context */ struct vmem_context *vmem_new(); struct vmem_page *vmem_new_page(); int vmem_add_page(struct vmem_context *ctx, struct vmem_page *pg); struct vmem_page *vmem_get_page_phys(struct vmem_context *ctx, void *phys_addr); struct vmem_page *vmem_get_page_virt(struct vmem_context *ctx, void *virt_addr); struct vmem_page *vmem_get_page(struct vmem_context *ctx, uint32_t offset); /* Remove pages in a specific context by physical or virtual address */ struct vmem_page *vmem_rm_page_phys(struct vmem_context *ctx, void *phys_addr); struct vmem_page *vmem_rm_page_virt(struct vmem_context *ctx, void *virt_addr); /* Iterator */ int vmem_iterate(struct vmem_context *ctx, vmem_iterator_t callback); uint32_t vmem_count_pages(struct vmem_context *ctx); void vmem_dump_page(struct vmem_page *pg); void vmem_dump(struct vmem_context *ctx); void vmem_handle_fault(uint32_t code, void *addr, void *instruction); /* Get/Set cached paging context */ void vmem_set_cache(struct vmem_context *ctx, void *cache); void *vmem_get_cache(struct vmem_context *ctx); #ifdef __i386__ #define PAGE_SIZE 4096 #define VMEM_ALIGN(x) (typeof(x))(((intptr_t)(x) & 0xFFFFF000) + 0x1000) #define VMEM_ALIGN_DOWN(x) (typeof(x))( \ ((intptr_t)(x) - ((intptr_t)(x) % PAGE_SIZE))) #else #define PAGE_SIZE 0 #define VMEM_ALIGN(x) (x) #endif ================================================ FILE: samples/C/wglew.h ================================================ /* ** The OpenGL Extension Wrangler Library ** Copyright (C) 2002-2008, Milan Ikits ** Copyright (C) 2002-2008, Marcelo E. Magallon ** Copyright (C) 2002, Lev Povalahev ** All rights reserved. ** ** Redistribution and use in source and binary forms, with or without ** modification, are permitted provided that the following conditions are met: ** ** * Redistributions of source code must retain the above copyright notice, ** this list of conditions and the following disclaimer. ** * Redistributions in binary form must reproduce the above copyright notice, ** this list of conditions and the following disclaimer in the documentation ** and/or other materials provided with the distribution. ** * The name of the author may be used to endorse or promote products ** derived from this software without specific prior written permission. ** ** THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" ** AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE ** IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ** ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE ** LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR ** CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF ** SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS ** INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN ** CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ** ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF ** THE POSSIBILITY OF SUCH DAMAGE. */ /* ** Copyright (c) 2007 The Khronos Group Inc. ** ** Permission is hereby granted, free of charge, to any person obtaining a ** copy of this software and/or associated documentation files (the ** "Materials"), to deal in the Materials without restriction, including ** without limitation the rights to use, copy, modify, merge, publish, ** distribute, sublicense, and/or sell copies of the Materials, and to ** permit persons to whom the Materials are furnished to do so, subject to ** the following conditions: ** ** The above copyright notice and this permission notice shall be included ** in all copies or substantial portions of the Materials. ** ** THE MATERIALS ARE PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, ** EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF ** MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. ** IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY ** CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, ** TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE ** MATERIALS OR THE USE OR OTHER DEALINGS IN THE MATERIALS. */ #ifndef __wglew_h__ #define __wglew_h__ #define __WGLEW_H__ #ifdef __wglext_h_ #error wglext.h included before wglew.h #endif #define __wglext_h_ #if !defined(WINAPI) # ifndef WIN32_LEAN_AND_MEAN # define WIN32_LEAN_AND_MEAN 1 # endif #include # undef WIN32_LEAN_AND_MEAN #endif /* * GLEW_STATIC needs to be set when using the static version. * GLEW_BUILD is set when building the DLL version. */ #ifdef GLEW_STATIC # define GLEWAPI extern #else # ifdef GLEW_BUILD # define GLEWAPI extern __declspec(dllexport) # else # define GLEWAPI extern __declspec(dllimport) # endif #endif #ifdef __cplusplus extern "C" { #endif /* -------------------------- WGL_3DFX_multisample ------------------------- */ #ifndef WGL_3DFX_multisample #define WGL_3DFX_multisample 1 #define WGL_SAMPLE_BUFFERS_3DFX 0x2060 #define WGL_SAMPLES_3DFX 0x2061 #define WGLEW_3DFX_multisample WGLEW_GET_VAR(__WGLEW_3DFX_multisample) #endif /* WGL_3DFX_multisample */ /* ------------------------- WGL_3DL_stereo_control ------------------------ */ #ifndef WGL_3DL_stereo_control #define WGL_3DL_stereo_control 1 #define WGL_STEREO_EMITTER_ENABLE_3DL 0x2055 #define WGL_STEREO_EMITTER_DISABLE_3DL 0x2056 #define WGL_STEREO_POLARITY_NORMAL_3DL 0x2057 #define WGL_STEREO_POLARITY_INVERT_3DL 0x2058 typedef BOOL (WINAPI * PFNWGLSETSTEREOEMITTERSTATE3DLPROC) (HDC hDC, UINT uState); #define wglSetStereoEmitterState3DL WGLEW_GET_FUN(__wglewSetStereoEmitterState3DL) #define WGLEW_3DL_stereo_control WGLEW_GET_VAR(__WGLEW_3DL_stereo_control) #endif /* WGL_3DL_stereo_control */ /* ------------------------ WGL_AMD_gpu_association ------------------------ */ #ifndef WGL_AMD_gpu_association #define WGL_AMD_gpu_association 1 #define WGL_GPU_VENDOR_AMD 0x1F00 #define WGL_GPU_RENDERER_STRING_AMD 0x1F01 #define WGL_GPU_OPENGL_VERSION_STRING_AMD 0x1F02 #define WGL_GPU_FASTEST_TARGET_GPUS_AMD 0x21A2 #define WGL_GPU_RAM_AMD 0x21A3 #define WGL_GPU_CLOCK_AMD 0x21A4 #define WGL_GPU_NUM_PIPES_AMD 0x21A5 #define WGL_GPU_NUM_SIMD_AMD 0x21A6 #define WGL_GPU_NUM_RB_AMD 0x21A7 #define WGL_GPU_NUM_SPI_AMD 0x21A8 typedef VOID (WINAPI * PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC) (HGLRC dstCtx, GLint srcX0, GLint srcY0, GLint srcX1, GLint srcY1, GLint dstX0, GLint dstY0, GLint dstX1, GLint dstY1, GLbitfield mask, GLenum filter); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC) (UINT id); typedef HGLRC (WINAPI * PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC) (UINT id, HGLRC hShareContext, const int* attribList); typedef BOOL (WINAPI * PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC) (HGLRC hglrc); typedef UINT (WINAPI * PFNWGLGETCONTEXTGPUIDAMDPROC) (HGLRC hglrc); typedef HGLRC (WINAPI * PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC) (void); typedef UINT (WINAPI * PFNWGLGETGPUIDSAMDPROC) (UINT maxCount, UINT* ids); typedef INT (WINAPI * PFNWGLGETGPUINFOAMDPROC) (UINT id, INT property, GLenum dataType, UINT size, void* data); typedef BOOL (WINAPI * PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC) (HGLRC hglrc); #define wglBlitContextFramebufferAMD WGLEW_GET_FUN(__wglewBlitContextFramebufferAMD) #define wglCreateAssociatedContextAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAMD) #define wglCreateAssociatedContextAttribsAMD WGLEW_GET_FUN(__wglewCreateAssociatedContextAttribsAMD) #define wglDeleteAssociatedContextAMD WGLEW_GET_FUN(__wglewDeleteAssociatedContextAMD) #define wglGetContextGPUIDAMD WGLEW_GET_FUN(__wglewGetContextGPUIDAMD) #define wglGetCurrentAssociatedContextAMD WGLEW_GET_FUN(__wglewGetCurrentAssociatedContextAMD) #define wglGetGPUIDsAMD WGLEW_GET_FUN(__wglewGetGPUIDsAMD) #define wglGetGPUInfoAMD WGLEW_GET_FUN(__wglewGetGPUInfoAMD) #define wglMakeAssociatedContextCurrentAMD WGLEW_GET_FUN(__wglewMakeAssociatedContextCurrentAMD) #define WGLEW_AMD_gpu_association WGLEW_GET_VAR(__WGLEW_AMD_gpu_association) #endif /* WGL_AMD_gpu_association */ /* ------------------------- WGL_ARB_buffer_region ------------------------- */ #ifndef WGL_ARB_buffer_region #define WGL_ARB_buffer_region 1 #define WGL_FRONT_COLOR_BUFFER_BIT_ARB 0x00000001 #define WGL_BACK_COLOR_BUFFER_BIT_ARB 0x00000002 #define WGL_DEPTH_BUFFER_BIT_ARB 0x00000004 #define WGL_STENCIL_BUFFER_BIT_ARB 0x00000008 typedef HANDLE (WINAPI * PFNWGLCREATEBUFFERREGIONARBPROC) (HDC hDC, int iLayerPlane, UINT uType); typedef VOID (WINAPI * PFNWGLDELETEBUFFERREGIONARBPROC) (HANDLE hRegion); typedef BOOL (WINAPI * PFNWGLRESTOREBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height, int xSrc, int ySrc); typedef BOOL (WINAPI * PFNWGLSAVEBUFFERREGIONARBPROC) (HANDLE hRegion, int x, int y, int width, int height); #define wglCreateBufferRegionARB WGLEW_GET_FUN(__wglewCreateBufferRegionARB) #define wglDeleteBufferRegionARB WGLEW_GET_FUN(__wglewDeleteBufferRegionARB) #define wglRestoreBufferRegionARB WGLEW_GET_FUN(__wglewRestoreBufferRegionARB) #define wglSaveBufferRegionARB WGLEW_GET_FUN(__wglewSaveBufferRegionARB) #define WGLEW_ARB_buffer_region WGLEW_GET_VAR(__WGLEW_ARB_buffer_region) #endif /* WGL_ARB_buffer_region */ /* ------------------------- WGL_ARB_create_context ------------------------ */ #ifndef WGL_ARB_create_context #define WGL_ARB_create_context 1 #define WGL_CONTEXT_DEBUG_BIT_ARB 0x0001 #define WGL_CONTEXT_FORWARD_COMPATIBLE_BIT_ARB 0x0002 #define WGL_CONTEXT_MAJOR_VERSION_ARB 0x2091 #define WGL_CONTEXT_MINOR_VERSION_ARB 0x2092 #define WGL_CONTEXT_LAYER_PLANE_ARB 0x2093 #define WGL_CONTEXT_FLAGS_ARB 0x2094 #define ERROR_INVALID_VERSION_ARB 0x2095 #define ERROR_INVALID_PROFILE_ARB 0x2096 typedef HGLRC (WINAPI * PFNWGLCREATECONTEXTATTRIBSARBPROC) (HDC hDC, HGLRC hShareContext, const int* attribList); #define wglCreateContextAttribsARB WGLEW_GET_FUN(__wglewCreateContextAttribsARB) #define WGLEW_ARB_create_context WGLEW_GET_VAR(__WGLEW_ARB_create_context) #endif /* WGL_ARB_create_context */ /* --------------------- WGL_ARB_create_context_profile -------------------- */ #ifndef WGL_ARB_create_context_profile #define WGL_ARB_create_context_profile 1 #define WGL_CONTEXT_CORE_PROFILE_BIT_ARB 0x00000001 #define WGL_CONTEXT_COMPATIBILITY_PROFILE_BIT_ARB 0x00000002 #define WGL_CONTEXT_PROFILE_MASK_ARB 0x9126 #define WGLEW_ARB_create_context_profile WGLEW_GET_VAR(__WGLEW_ARB_create_context_profile) #endif /* WGL_ARB_create_context_profile */ /* ------------------- WGL_ARB_create_context_robustness ------------------- */ #ifndef WGL_ARB_create_context_robustness #define WGL_ARB_create_context_robustness 1 #define WGL_CONTEXT_ROBUST_ACCESS_BIT_ARB 0x00000004 #define WGL_LOSE_CONTEXT_ON_RESET_ARB 0x8252 #define WGL_CONTEXT_RESET_NOTIFICATION_STRATEGY_ARB 0x8256 #define WGL_NO_RESET_NOTIFICATION_ARB 0x8261 #define WGLEW_ARB_create_context_robustness WGLEW_GET_VAR(__WGLEW_ARB_create_context_robustness) #endif /* WGL_ARB_create_context_robustness */ /* ----------------------- WGL_ARB_extensions_string ----------------------- */ #ifndef WGL_ARB_extensions_string #define WGL_ARB_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGARBPROC) (HDC hdc); #define wglGetExtensionsStringARB WGLEW_GET_FUN(__wglewGetExtensionsStringARB) #define WGLEW_ARB_extensions_string WGLEW_GET_VAR(__WGLEW_ARB_extensions_string) #endif /* WGL_ARB_extensions_string */ /* ------------------------ WGL_ARB_framebuffer_sRGB ----------------------- */ #ifndef WGL_ARB_framebuffer_sRGB #define WGL_ARB_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_ARB 0x20A9 #define WGLEW_ARB_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_ARB_framebuffer_sRGB) #endif /* WGL_ARB_framebuffer_sRGB */ /* ----------------------- WGL_ARB_make_current_read ----------------------- */ #ifndef WGL_ARB_make_current_read #define WGL_ARB_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_ARB 0x2043 #define ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB 0x2054 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCARBPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTARBPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCARB WGLEW_GET_FUN(__wglewGetCurrentReadDCARB) #define wglMakeContextCurrentARB WGLEW_GET_FUN(__wglewMakeContextCurrentARB) #define WGLEW_ARB_make_current_read WGLEW_GET_VAR(__WGLEW_ARB_make_current_read) #endif /* WGL_ARB_make_current_read */ /* -------------------------- WGL_ARB_multisample -------------------------- */ #ifndef WGL_ARB_multisample #define WGL_ARB_multisample 1 #define WGL_SAMPLE_BUFFERS_ARB 0x2041 #define WGL_SAMPLES_ARB 0x2042 #define WGLEW_ARB_multisample WGLEW_GET_VAR(__WGLEW_ARB_multisample) #endif /* WGL_ARB_multisample */ /* ---------------------------- WGL_ARB_pbuffer ---------------------------- */ #ifndef WGL_ARB_pbuffer #define WGL_ARB_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_ARB 0x202D #define WGL_MAX_PBUFFER_PIXELS_ARB 0x202E #define WGL_MAX_PBUFFER_WIDTH_ARB 0x202F #define WGL_MAX_PBUFFER_HEIGHT_ARB 0x2030 #define WGL_PBUFFER_LARGEST_ARB 0x2033 #define WGL_PBUFFER_WIDTH_ARB 0x2034 #define WGL_PBUFFER_HEIGHT_ARB 0x2035 #define WGL_PBUFFER_LOST_ARB 0x2036 DECLARE_HANDLE(HPBUFFERARB); typedef HPBUFFERARB (WINAPI * PFNWGLCREATEPBUFFERARBPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFERARBPROC) (HPBUFFERARB hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFERARBPROC) (HPBUFFERARB hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCARBPROC) (HPBUFFERARB hPbuffer, HDC hDC); #define wglCreatePbufferARB WGLEW_GET_FUN(__wglewCreatePbufferARB) #define wglDestroyPbufferARB WGLEW_GET_FUN(__wglewDestroyPbufferARB) #define wglGetPbufferDCARB WGLEW_GET_FUN(__wglewGetPbufferDCARB) #define wglQueryPbufferARB WGLEW_GET_FUN(__wglewQueryPbufferARB) #define wglReleasePbufferDCARB WGLEW_GET_FUN(__wglewReleasePbufferDCARB) #define WGLEW_ARB_pbuffer WGLEW_GET_VAR(__WGLEW_ARB_pbuffer) #endif /* WGL_ARB_pbuffer */ /* -------------------------- WGL_ARB_pixel_format ------------------------- */ #ifndef WGL_ARB_pixel_format #define WGL_ARB_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_ARB 0x2000 #define WGL_DRAW_TO_WINDOW_ARB 0x2001 #define WGL_DRAW_TO_BITMAP_ARB 0x2002 #define WGL_ACCELERATION_ARB 0x2003 #define WGL_NEED_PALETTE_ARB 0x2004 #define WGL_NEED_SYSTEM_PALETTE_ARB 0x2005 #define WGL_SWAP_LAYER_BUFFERS_ARB 0x2006 #define WGL_SWAP_METHOD_ARB 0x2007 #define WGL_NUMBER_OVERLAYS_ARB 0x2008 #define WGL_NUMBER_UNDERLAYS_ARB 0x2009 #define WGL_TRANSPARENT_ARB 0x200A #define WGL_SHARE_DEPTH_ARB 0x200C #define WGL_SHARE_STENCIL_ARB 0x200D #define WGL_SHARE_ACCUM_ARB 0x200E #define WGL_SUPPORT_GDI_ARB 0x200F #define WGL_SUPPORT_OPENGL_ARB 0x2010 #define WGL_DOUBLE_BUFFER_ARB 0x2011 #define WGL_STEREO_ARB 0x2012 #define WGL_PIXEL_TYPE_ARB 0x2013 #define WGL_COLOR_BITS_ARB 0x2014 #define WGL_RED_BITS_ARB 0x2015 #define WGL_RED_SHIFT_ARB 0x2016 #define WGL_GREEN_BITS_ARB 0x2017 #define WGL_GREEN_SHIFT_ARB 0x2018 #define WGL_BLUE_BITS_ARB 0x2019 #define WGL_BLUE_SHIFT_ARB 0x201A #define WGL_ALPHA_BITS_ARB 0x201B #define WGL_ALPHA_SHIFT_ARB 0x201C #define WGL_ACCUM_BITS_ARB 0x201D #define WGL_ACCUM_RED_BITS_ARB 0x201E #define WGL_ACCUM_GREEN_BITS_ARB 0x201F #define WGL_ACCUM_BLUE_BITS_ARB 0x2020 #define WGL_ACCUM_ALPHA_BITS_ARB 0x2021 #define WGL_DEPTH_BITS_ARB 0x2022 #define WGL_STENCIL_BITS_ARB 0x2023 #define WGL_AUX_BUFFERS_ARB 0x2024 #define WGL_NO_ACCELERATION_ARB 0x2025 #define WGL_GENERIC_ACCELERATION_ARB 0x2026 #define WGL_FULL_ACCELERATION_ARB 0x2027 #define WGL_SWAP_EXCHANGE_ARB 0x2028 #define WGL_SWAP_COPY_ARB 0x2029 #define WGL_SWAP_UNDEFINED_ARB 0x202A #define WGL_TYPE_RGBA_ARB 0x202B #define WGL_TYPE_COLORINDEX_ARB 0x202C #define WGL_TRANSPARENT_RED_VALUE_ARB 0x2037 #define WGL_TRANSPARENT_GREEN_VALUE_ARB 0x2038 #define WGL_TRANSPARENT_BLUE_VALUE_ARB 0x2039 #define WGL_TRANSPARENT_ALPHA_VALUE_ARB 0x203A #define WGL_TRANSPARENT_INDEX_VALUE_ARB 0x203B typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATARBPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVARBPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, const int* piAttributes, int *piValues); #define wglChoosePixelFormatARB WGLEW_GET_FUN(__wglewChoosePixelFormatARB) #define wglGetPixelFormatAttribfvARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvARB) #define wglGetPixelFormatAttribivARB WGLEW_GET_FUN(__wglewGetPixelFormatAttribivARB) #define WGLEW_ARB_pixel_format WGLEW_GET_VAR(__WGLEW_ARB_pixel_format) #endif /* WGL_ARB_pixel_format */ /* ----------------------- WGL_ARB_pixel_format_float ---------------------- */ #ifndef WGL_ARB_pixel_format_float #define WGL_ARB_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ARB 0x21A0 #define WGLEW_ARB_pixel_format_float WGLEW_GET_VAR(__WGLEW_ARB_pixel_format_float) #endif /* WGL_ARB_pixel_format_float */ /* ------------------------- WGL_ARB_render_texture ------------------------ */ #ifndef WGL_ARB_render_texture #define WGL_ARB_render_texture 1 #define WGL_BIND_TO_TEXTURE_RGB_ARB 0x2070 #define WGL_BIND_TO_TEXTURE_RGBA_ARB 0x2071 #define WGL_TEXTURE_FORMAT_ARB 0x2072 #define WGL_TEXTURE_TARGET_ARB 0x2073 #define WGL_MIPMAP_TEXTURE_ARB 0x2074 #define WGL_TEXTURE_RGB_ARB 0x2075 #define WGL_TEXTURE_RGBA_ARB 0x2076 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_TEXTURE_CUBE_MAP_ARB 0x2078 #define WGL_TEXTURE_1D_ARB 0x2079 #define WGL_TEXTURE_2D_ARB 0x207A #define WGL_MIPMAP_LEVEL_ARB 0x207B #define WGL_CUBE_MAP_FACE_ARB 0x207C #define WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB 0x207D #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB 0x207E #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB 0x207F #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB 0x2080 #define WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB 0x2081 #define WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB 0x2082 #define WGL_FRONT_LEFT_ARB 0x2083 #define WGL_FRONT_RIGHT_ARB 0x2084 #define WGL_BACK_LEFT_ARB 0x2085 #define WGL_BACK_RIGHT_ARB 0x2086 #define WGL_AUX0_ARB 0x2087 #define WGL_AUX1_ARB 0x2088 #define WGL_AUX2_ARB 0x2089 #define WGL_AUX3_ARB 0x208A #define WGL_AUX4_ARB 0x208B #define WGL_AUX5_ARB 0x208C #define WGL_AUX6_ARB 0x208D #define WGL_AUX7_ARB 0x208E #define WGL_AUX8_ARB 0x208F #define WGL_AUX9_ARB 0x2090 typedef BOOL (WINAPI * PFNWGLBINDTEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLRELEASETEXIMAGEARBPROC) (HPBUFFERARB hPbuffer, int iBuffer); typedef BOOL (WINAPI * PFNWGLSETPBUFFERATTRIBARBPROC) (HPBUFFERARB hPbuffer, const int* piAttribList); #define wglBindTexImageARB WGLEW_GET_FUN(__wglewBindTexImageARB) #define wglReleaseTexImageARB WGLEW_GET_FUN(__wglewReleaseTexImageARB) #define wglSetPbufferAttribARB WGLEW_GET_FUN(__wglewSetPbufferAttribARB) #define WGLEW_ARB_render_texture WGLEW_GET_VAR(__WGLEW_ARB_render_texture) #endif /* WGL_ARB_render_texture */ /* ----------------------- WGL_ATI_pixel_format_float ---------------------- */ #ifndef WGL_ATI_pixel_format_float #define WGL_ATI_pixel_format_float 1 #define WGL_TYPE_RGBA_FLOAT_ATI 0x21A0 #define GL_RGBA_FLOAT_MODE_ATI 0x8820 #define GL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI 0x8835 #define WGLEW_ATI_pixel_format_float WGLEW_GET_VAR(__WGLEW_ATI_pixel_format_float) #endif /* WGL_ATI_pixel_format_float */ /* -------------------- WGL_ATI_render_texture_rectangle ------------------- */ #ifndef WGL_ATI_render_texture_rectangle #define WGL_ATI_render_texture_rectangle 1 #define WGL_TEXTURE_RECTANGLE_ATI 0x21A5 #define WGLEW_ATI_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_ATI_render_texture_rectangle) #endif /* WGL_ATI_render_texture_rectangle */ /* ------------------- WGL_EXT_create_context_es2_profile ------------------ */ #ifndef WGL_EXT_create_context_es2_profile #define WGL_EXT_create_context_es2_profile 1 #define WGL_CONTEXT_ES2_PROFILE_BIT_EXT 0x00000004 #define WGLEW_EXT_create_context_es2_profile WGLEW_GET_VAR(__WGLEW_EXT_create_context_es2_profile) #endif /* WGL_EXT_create_context_es2_profile */ /* -------------------------- WGL_EXT_depth_float -------------------------- */ #ifndef WGL_EXT_depth_float #define WGL_EXT_depth_float 1 #define WGL_DEPTH_FLOAT_EXT 0x2040 #define WGLEW_EXT_depth_float WGLEW_GET_VAR(__WGLEW_EXT_depth_float) #endif /* WGL_EXT_depth_float */ /* ---------------------- WGL_EXT_display_color_table ---------------------- */ #ifndef WGL_EXT_display_color_table #define WGL_EXT_display_color_table 1 typedef GLboolean (WINAPI * PFNWGLBINDDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef void (WINAPI * PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC) (GLushort id); typedef GLboolean (WINAPI * PFNWGLLOADDISPLAYCOLORTABLEEXTPROC) (GLushort* table, GLuint length); #define wglBindDisplayColorTableEXT WGLEW_GET_FUN(__wglewBindDisplayColorTableEXT) #define wglCreateDisplayColorTableEXT WGLEW_GET_FUN(__wglewCreateDisplayColorTableEXT) #define wglDestroyDisplayColorTableEXT WGLEW_GET_FUN(__wglewDestroyDisplayColorTableEXT) #define wglLoadDisplayColorTableEXT WGLEW_GET_FUN(__wglewLoadDisplayColorTableEXT) #define WGLEW_EXT_display_color_table WGLEW_GET_VAR(__WGLEW_EXT_display_color_table) #endif /* WGL_EXT_display_color_table */ /* ----------------------- WGL_EXT_extensions_string ----------------------- */ #ifndef WGL_EXT_extensions_string #define WGL_EXT_extensions_string 1 typedef const char* (WINAPI * PFNWGLGETEXTENSIONSSTRINGEXTPROC) (void); #define wglGetExtensionsStringEXT WGLEW_GET_FUN(__wglewGetExtensionsStringEXT) #define WGLEW_EXT_extensions_string WGLEW_GET_VAR(__WGLEW_EXT_extensions_string) #endif /* WGL_EXT_extensions_string */ /* ------------------------ WGL_EXT_framebuffer_sRGB ----------------------- */ #ifndef WGL_EXT_framebuffer_sRGB #define WGL_EXT_framebuffer_sRGB 1 #define WGL_FRAMEBUFFER_SRGB_CAPABLE_EXT 0x20A9 #define WGLEW_EXT_framebuffer_sRGB WGLEW_GET_VAR(__WGLEW_EXT_framebuffer_sRGB) #endif /* WGL_EXT_framebuffer_sRGB */ /* ----------------------- WGL_EXT_make_current_read ----------------------- */ #ifndef WGL_EXT_make_current_read #define WGL_EXT_make_current_read 1 #define ERROR_INVALID_PIXEL_TYPE_EXT 0x2043 typedef HDC (WINAPI * PFNWGLGETCURRENTREADDCEXTPROC) (VOID); typedef BOOL (WINAPI * PFNWGLMAKECONTEXTCURRENTEXTPROC) (HDC hDrawDC, HDC hReadDC, HGLRC hglrc); #define wglGetCurrentReadDCEXT WGLEW_GET_FUN(__wglewGetCurrentReadDCEXT) #define wglMakeContextCurrentEXT WGLEW_GET_FUN(__wglewMakeContextCurrentEXT) #define WGLEW_EXT_make_current_read WGLEW_GET_VAR(__WGLEW_EXT_make_current_read) #endif /* WGL_EXT_make_current_read */ /* -------------------------- WGL_EXT_multisample -------------------------- */ #ifndef WGL_EXT_multisample #define WGL_EXT_multisample 1 #define WGL_SAMPLE_BUFFERS_EXT 0x2041 #define WGL_SAMPLES_EXT 0x2042 #define WGLEW_EXT_multisample WGLEW_GET_VAR(__WGLEW_EXT_multisample) #endif /* WGL_EXT_multisample */ /* ---------------------------- WGL_EXT_pbuffer ---------------------------- */ #ifndef WGL_EXT_pbuffer #define WGL_EXT_pbuffer 1 #define WGL_DRAW_TO_PBUFFER_EXT 0x202D #define WGL_MAX_PBUFFER_PIXELS_EXT 0x202E #define WGL_MAX_PBUFFER_WIDTH_EXT 0x202F #define WGL_MAX_PBUFFER_HEIGHT_EXT 0x2030 #define WGL_OPTIMAL_PBUFFER_WIDTH_EXT 0x2031 #define WGL_OPTIMAL_PBUFFER_HEIGHT_EXT 0x2032 #define WGL_PBUFFER_LARGEST_EXT 0x2033 #define WGL_PBUFFER_WIDTH_EXT 0x2034 #define WGL_PBUFFER_HEIGHT_EXT 0x2035 DECLARE_HANDLE(HPBUFFEREXT); typedef HPBUFFEREXT (WINAPI * PFNWGLCREATEPBUFFEREXTPROC) (HDC hDC, int iPixelFormat, int iWidth, int iHeight, const int* piAttribList); typedef BOOL (WINAPI * PFNWGLDESTROYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer); typedef HDC (WINAPI * PFNWGLGETPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer); typedef BOOL (WINAPI * PFNWGLQUERYPBUFFEREXTPROC) (HPBUFFEREXT hPbuffer, int iAttribute, int* piValue); typedef int (WINAPI * PFNWGLRELEASEPBUFFERDCEXTPROC) (HPBUFFEREXT hPbuffer, HDC hDC); #define wglCreatePbufferEXT WGLEW_GET_FUN(__wglewCreatePbufferEXT) #define wglDestroyPbufferEXT WGLEW_GET_FUN(__wglewDestroyPbufferEXT) #define wglGetPbufferDCEXT WGLEW_GET_FUN(__wglewGetPbufferDCEXT) #define wglQueryPbufferEXT WGLEW_GET_FUN(__wglewQueryPbufferEXT) #define wglReleasePbufferDCEXT WGLEW_GET_FUN(__wglewReleasePbufferDCEXT) #define WGLEW_EXT_pbuffer WGLEW_GET_VAR(__WGLEW_EXT_pbuffer) #endif /* WGL_EXT_pbuffer */ /* -------------------------- WGL_EXT_pixel_format ------------------------- */ #ifndef WGL_EXT_pixel_format #define WGL_EXT_pixel_format 1 #define WGL_NUMBER_PIXEL_FORMATS_EXT 0x2000 #define WGL_DRAW_TO_WINDOW_EXT 0x2001 #define WGL_DRAW_TO_BITMAP_EXT 0x2002 #define WGL_ACCELERATION_EXT 0x2003 #define WGL_NEED_PALETTE_EXT 0x2004 #define WGL_NEED_SYSTEM_PALETTE_EXT 0x2005 #define WGL_SWAP_LAYER_BUFFERS_EXT 0x2006 #define WGL_SWAP_METHOD_EXT 0x2007 #define WGL_NUMBER_OVERLAYS_EXT 0x2008 #define WGL_NUMBER_UNDERLAYS_EXT 0x2009 #define WGL_TRANSPARENT_EXT 0x200A #define WGL_TRANSPARENT_VALUE_EXT 0x200B #define WGL_SHARE_DEPTH_EXT 0x200C #define WGL_SHARE_STENCIL_EXT 0x200D #define WGL_SHARE_ACCUM_EXT 0x200E #define WGL_SUPPORT_GDI_EXT 0x200F #define WGL_SUPPORT_OPENGL_EXT 0x2010 #define WGL_DOUBLE_BUFFER_EXT 0x2011 #define WGL_STEREO_EXT 0x2012 #define WGL_PIXEL_TYPE_EXT 0x2013 #define WGL_COLOR_BITS_EXT 0x2014 #define WGL_RED_BITS_EXT 0x2015 #define WGL_RED_SHIFT_EXT 0x2016 #define WGL_GREEN_BITS_EXT 0x2017 #define WGL_GREEN_SHIFT_EXT 0x2018 #define WGL_BLUE_BITS_EXT 0x2019 #define WGL_BLUE_SHIFT_EXT 0x201A #define WGL_ALPHA_BITS_EXT 0x201B #define WGL_ALPHA_SHIFT_EXT 0x201C #define WGL_ACCUM_BITS_EXT 0x201D #define WGL_ACCUM_RED_BITS_EXT 0x201E #define WGL_ACCUM_GREEN_BITS_EXT 0x201F #define WGL_ACCUM_BLUE_BITS_EXT 0x2020 #define WGL_ACCUM_ALPHA_BITS_EXT 0x2021 #define WGL_DEPTH_BITS_EXT 0x2022 #define WGL_STENCIL_BITS_EXT 0x2023 #define WGL_AUX_BUFFERS_EXT 0x2024 #define WGL_NO_ACCELERATION_EXT 0x2025 #define WGL_GENERIC_ACCELERATION_EXT 0x2026 #define WGL_FULL_ACCELERATION_EXT 0x2027 #define WGL_SWAP_EXCHANGE_EXT 0x2028 #define WGL_SWAP_COPY_EXT 0x2029 #define WGL_SWAP_UNDEFINED_EXT 0x202A #define WGL_TYPE_RGBA_EXT 0x202B #define WGL_TYPE_COLORINDEX_EXT 0x202C typedef BOOL (WINAPI * PFNWGLCHOOSEPIXELFORMATEXTPROC) (HDC hdc, const int* piAttribIList, const FLOAT *pfAttribFList, UINT nMaxFormats, int *piFormats, UINT *nNumFormats); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBFVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, FLOAT *pfValues); typedef BOOL (WINAPI * PFNWGLGETPIXELFORMATATTRIBIVEXTPROC) (HDC hdc, int iPixelFormat, int iLayerPlane, UINT nAttributes, int* piAttributes, int *piValues); #define wglChoosePixelFormatEXT WGLEW_GET_FUN(__wglewChoosePixelFormatEXT) #define wglGetPixelFormatAttribfvEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribfvEXT) #define wglGetPixelFormatAttribivEXT WGLEW_GET_FUN(__wglewGetPixelFormatAttribivEXT) #define WGLEW_EXT_pixel_format WGLEW_GET_VAR(__WGLEW_EXT_pixel_format) #endif /* WGL_EXT_pixel_format */ /* ------------------- WGL_EXT_pixel_format_packed_float ------------------- */ #ifndef WGL_EXT_pixel_format_packed_float #define WGL_EXT_pixel_format_packed_float 1 #define WGL_TYPE_RGBA_UNSIGNED_FLOAT_EXT 0x20A8 #define WGLEW_EXT_pixel_format_packed_float WGLEW_GET_VAR(__WGLEW_EXT_pixel_format_packed_float) #endif /* WGL_EXT_pixel_format_packed_float */ /* -------------------------- WGL_EXT_swap_control ------------------------- */ #ifndef WGL_EXT_swap_control #define WGL_EXT_swap_control 1 typedef int (WINAPI * PFNWGLGETSWAPINTERVALEXTPROC) (void); typedef BOOL (WINAPI * PFNWGLSWAPINTERVALEXTPROC) (int interval); #define wglGetSwapIntervalEXT WGLEW_GET_FUN(__wglewGetSwapIntervalEXT) #define wglSwapIntervalEXT WGLEW_GET_FUN(__wglewSwapIntervalEXT) #define WGLEW_EXT_swap_control WGLEW_GET_VAR(__WGLEW_EXT_swap_control) #endif /* WGL_EXT_swap_control */ /* --------------------- WGL_I3D_digital_video_control --------------------- */ #ifndef WGL_I3D_digital_video_control #define WGL_I3D_digital_video_control 1 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D 0x2050 #define WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D 0x2051 #define WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D 0x2052 #define WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D 0x2053 typedef BOOL (WINAPI * PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewGetDigitalVideoParametersI3D) #define wglSetDigitalVideoParametersI3D WGLEW_GET_FUN(__wglewSetDigitalVideoParametersI3D) #define WGLEW_I3D_digital_video_control WGLEW_GET_VAR(__WGLEW_I3D_digital_video_control) #endif /* WGL_I3D_digital_video_control */ /* ----------------------------- WGL_I3D_gamma ----------------------------- */ #ifndef WGL_I3D_gamma #define WGL_I3D_gamma 1 #define WGL_GAMMA_TABLE_SIZE_I3D 0x204E #define WGL_GAMMA_EXCLUDE_DESKTOP_I3D 0x204F typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, USHORT* puRed, USHORT *puGreen, USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLGETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEI3DPROC) (HDC hDC, int iEntries, const USHORT* puRed, const USHORT *puGreen, const USHORT *puBlue); typedef BOOL (WINAPI * PFNWGLSETGAMMATABLEPARAMETERSI3DPROC) (HDC hDC, int iAttribute, const int* piValue); #define wglGetGammaTableI3D WGLEW_GET_FUN(__wglewGetGammaTableI3D) #define wglGetGammaTableParametersI3D WGLEW_GET_FUN(__wglewGetGammaTableParametersI3D) #define wglSetGammaTableI3D WGLEW_GET_FUN(__wglewSetGammaTableI3D) #define wglSetGammaTableParametersI3D WGLEW_GET_FUN(__wglewSetGammaTableParametersI3D) #define WGLEW_I3D_gamma WGLEW_GET_VAR(__WGLEW_I3D_gamma) #endif /* WGL_I3D_gamma */ /* ---------------------------- WGL_I3D_genlock ---------------------------- */ #ifndef WGL_I3D_genlock #define WGL_I3D_genlock 1 #define WGL_GENLOCK_SOURCE_MULTIVIEW_I3D 0x2044 #define WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D 0x2045 #define WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D 0x2046 #define WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D 0x2047 #define WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D 0x2048 #define WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D 0x2049 #define WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D 0x204A #define WGL_GENLOCK_SOURCE_EDGE_RISING_I3D 0x204B #define WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D 0x204C typedef BOOL (WINAPI * PFNWGLDISABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLENABLEGENLOCKI3DPROC) (HDC hDC); typedef BOOL (WINAPI * PFNWGLGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT uRate); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT uDelay); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT uEdge); typedef BOOL (WINAPI * PFNWGLGENLOCKSOURCEI3DPROC) (HDC hDC, UINT uSource); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSAMPLERATEI3DPROC) (HDC hDC, UINT* uRate); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEDELAYI3DPROC) (HDC hDC, UINT* uDelay); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEEDGEI3DPROC) (HDC hDC, UINT* uEdge); typedef BOOL (WINAPI * PFNWGLGETGENLOCKSOURCEI3DPROC) (HDC hDC, UINT* uSource); typedef BOOL (WINAPI * PFNWGLISENABLEDGENLOCKI3DPROC) (HDC hDC, BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC) (HDC hDC, UINT* uMaxLineDelay, UINT *uMaxPixelDelay); #define wglDisableGenlockI3D WGLEW_GET_FUN(__wglewDisableGenlockI3D) #define wglEnableGenlockI3D WGLEW_GET_FUN(__wglewEnableGenlockI3D) #define wglGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGenlockSampleRateI3D) #define wglGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGenlockSourceDelayI3D) #define wglGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGenlockSourceEdgeI3D) #define wglGenlockSourceI3D WGLEW_GET_FUN(__wglewGenlockSourceI3D) #define wglGetGenlockSampleRateI3D WGLEW_GET_FUN(__wglewGetGenlockSampleRateI3D) #define wglGetGenlockSourceDelayI3D WGLEW_GET_FUN(__wglewGetGenlockSourceDelayI3D) #define wglGetGenlockSourceEdgeI3D WGLEW_GET_FUN(__wglewGetGenlockSourceEdgeI3D) #define wglGetGenlockSourceI3D WGLEW_GET_FUN(__wglewGetGenlockSourceI3D) #define wglIsEnabledGenlockI3D WGLEW_GET_FUN(__wglewIsEnabledGenlockI3D) #define wglQueryGenlockMaxSourceDelayI3D WGLEW_GET_FUN(__wglewQueryGenlockMaxSourceDelayI3D) #define WGLEW_I3D_genlock WGLEW_GET_VAR(__WGLEW_I3D_genlock) #endif /* WGL_I3D_genlock */ /* -------------------------- WGL_I3D_image_buffer ------------------------- */ #ifndef WGL_I3D_image_buffer #define WGL_I3D_image_buffer 1 #define WGL_IMAGE_BUFFER_MIN_ACCESS_I3D 0x00000001 #define WGL_IMAGE_BUFFER_LOCK_I3D 0x00000002 typedef BOOL (WINAPI * PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, HANDLE* pEvent, LPVOID *pAddress, DWORD *pSize, UINT count); typedef LPVOID (WINAPI * PFNWGLCREATEIMAGEBUFFERI3DPROC) (HDC hDC, DWORD dwSize, UINT uFlags); typedef BOOL (WINAPI * PFNWGLDESTROYIMAGEBUFFERI3DPROC) (HDC hDC, LPVOID pAddress); typedef BOOL (WINAPI * PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC) (HDC hdc, LPVOID* pAddress, UINT count); #define wglAssociateImageBufferEventsI3D WGLEW_GET_FUN(__wglewAssociateImageBufferEventsI3D) #define wglCreateImageBufferI3D WGLEW_GET_FUN(__wglewCreateImageBufferI3D) #define wglDestroyImageBufferI3D WGLEW_GET_FUN(__wglewDestroyImageBufferI3D) #define wglReleaseImageBufferEventsI3D WGLEW_GET_FUN(__wglewReleaseImageBufferEventsI3D) #define WGLEW_I3D_image_buffer WGLEW_GET_VAR(__WGLEW_I3D_image_buffer) #endif /* WGL_I3D_image_buffer */ /* ------------------------ WGL_I3D_swap_frame_lock ------------------------ */ #ifndef WGL_I3D_swap_frame_lock #define WGL_I3D_swap_frame_lock 1 typedef BOOL (WINAPI * PFNWGLDISABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLENABLEFRAMELOCKI3DPROC) (VOID); typedef BOOL (WINAPI * PFNWGLISENABLEDFRAMELOCKI3DPROC) (BOOL* pFlag); typedef BOOL (WINAPI * PFNWGLQUERYFRAMELOCKMASTERI3DPROC) (BOOL* pFlag); #define wglDisableFrameLockI3D WGLEW_GET_FUN(__wglewDisableFrameLockI3D) #define wglEnableFrameLockI3D WGLEW_GET_FUN(__wglewEnableFrameLockI3D) #define wglIsEnabledFrameLockI3D WGLEW_GET_FUN(__wglewIsEnabledFrameLockI3D) #define wglQueryFrameLockMasterI3D WGLEW_GET_FUN(__wglewQueryFrameLockMasterI3D) #define WGLEW_I3D_swap_frame_lock WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_lock) #endif /* WGL_I3D_swap_frame_lock */ /* ------------------------ WGL_I3D_swap_frame_usage ----------------------- */ #ifndef WGL_I3D_swap_frame_usage #define WGL_I3D_swap_frame_usage 1 typedef BOOL (WINAPI * PFNWGLBEGINFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLENDFRAMETRACKINGI3DPROC) (void); typedef BOOL (WINAPI * PFNWGLGETFRAMEUSAGEI3DPROC) (float* pUsage); typedef BOOL (WINAPI * PFNWGLQUERYFRAMETRACKINGI3DPROC) (DWORD* pFrameCount, DWORD *pMissedFrames, float *pLastMissedUsage); #define wglBeginFrameTrackingI3D WGLEW_GET_FUN(__wglewBeginFrameTrackingI3D) #define wglEndFrameTrackingI3D WGLEW_GET_FUN(__wglewEndFrameTrackingI3D) #define wglGetFrameUsageI3D WGLEW_GET_FUN(__wglewGetFrameUsageI3D) #define wglQueryFrameTrackingI3D WGLEW_GET_FUN(__wglewQueryFrameTrackingI3D) #define WGLEW_I3D_swap_frame_usage WGLEW_GET_VAR(__WGLEW_I3D_swap_frame_usage) #endif /* WGL_I3D_swap_frame_usage */ /* --------------------------- WGL_NV_DX_interop --------------------------- */ #ifndef WGL_NV_DX_interop #define WGL_NV_DX_interop 1 #define WGL_ACCESS_READ_ONLY_NV 0x0000 #define WGL_ACCESS_READ_WRITE_NV 0x0001 #define WGL_ACCESS_WRITE_DISCARD_NV 0x0002 typedef BOOL (WINAPI * PFNWGLDXCLOSEDEVICENVPROC) (HANDLE hDevice); typedef BOOL (WINAPI * PFNWGLDXLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXOBJECTACCESSNVPROC) (HANDLE hObject, GLenum access); typedef HANDLE (WINAPI * PFNWGLDXOPENDEVICENVPROC) (void* dxDevice); typedef HANDLE (WINAPI * PFNWGLDXREGISTEROBJECTNVPROC) (HANDLE hDevice, void* dxObject, GLuint name, GLenum type, GLenum access); typedef BOOL (WINAPI * PFNWGLDXSETRESOURCESHAREHANDLENVPROC) (void* dxObject, HANDLE shareHandle); typedef BOOL (WINAPI * PFNWGLDXUNLOCKOBJECTSNVPROC) (HANDLE hDevice, GLint count, HANDLE* hObjects); typedef BOOL (WINAPI * PFNWGLDXUNREGISTEROBJECTNVPROC) (HANDLE hDevice, HANDLE hObject); #define wglDXCloseDeviceNV WGLEW_GET_FUN(__wglewDXCloseDeviceNV) #define wglDXLockObjectsNV WGLEW_GET_FUN(__wglewDXLockObjectsNV) #define wglDXObjectAccessNV WGLEW_GET_FUN(__wglewDXObjectAccessNV) #define wglDXOpenDeviceNV WGLEW_GET_FUN(__wglewDXOpenDeviceNV) #define wglDXRegisterObjectNV WGLEW_GET_FUN(__wglewDXRegisterObjectNV) #define wglDXSetResourceShareHandleNV WGLEW_GET_FUN(__wglewDXSetResourceShareHandleNV) #define wglDXUnlockObjectsNV WGLEW_GET_FUN(__wglewDXUnlockObjectsNV) #define wglDXUnregisterObjectNV WGLEW_GET_FUN(__wglewDXUnregisterObjectNV) #define WGLEW_NV_DX_interop WGLEW_GET_VAR(__WGLEW_NV_DX_interop) #endif /* WGL_NV_DX_interop */ /* --------------------------- WGL_NV_copy_image --------------------------- */ #ifndef WGL_NV_copy_image #define WGL_NV_copy_image 1 typedef BOOL (WINAPI * PFNWGLCOPYIMAGESUBDATANVPROC) (HGLRC hSrcRC, GLuint srcName, GLenum srcTarget, GLint srcLevel, GLint srcX, GLint srcY, GLint srcZ, HGLRC hDstRC, GLuint dstName, GLenum dstTarget, GLint dstLevel, GLint dstX, GLint dstY, GLint dstZ, GLsizei width, GLsizei height, GLsizei depth); #define wglCopyImageSubDataNV WGLEW_GET_FUN(__wglewCopyImageSubDataNV) #define WGLEW_NV_copy_image WGLEW_GET_VAR(__WGLEW_NV_copy_image) #endif /* WGL_NV_copy_image */ /* -------------------------- WGL_NV_float_buffer -------------------------- */ #ifndef WGL_NV_float_buffer #define WGL_NV_float_buffer 1 #define WGL_FLOAT_COMPONENTS_NV 0x20B0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV 0x20B1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV 0x20B2 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV 0x20B3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV 0x20B4 #define WGL_TEXTURE_FLOAT_R_NV 0x20B5 #define WGL_TEXTURE_FLOAT_RG_NV 0x20B6 #define WGL_TEXTURE_FLOAT_RGB_NV 0x20B7 #define WGL_TEXTURE_FLOAT_RGBA_NV 0x20B8 #define WGLEW_NV_float_buffer WGLEW_GET_VAR(__WGLEW_NV_float_buffer) #endif /* WGL_NV_float_buffer */ /* -------------------------- WGL_NV_gpu_affinity -------------------------- */ #ifndef WGL_NV_gpu_affinity #define WGL_NV_gpu_affinity 1 #define WGL_ERROR_INCOMPATIBLE_AFFINITY_MASKS_NV 0x20D0 #define WGL_ERROR_MISSING_AFFINITY_MASK_NV 0x20D1 DECLARE_HANDLE(HGPUNV); typedef struct _GPU_DEVICE { DWORD cb; CHAR DeviceName[32]; CHAR DeviceString[128]; DWORD Flags; RECT rcVirtualScreen; } GPU_DEVICE, *PGPU_DEVICE; typedef HDC (WINAPI * PFNWGLCREATEAFFINITYDCNVPROC) (const HGPUNV *phGpuList); typedef BOOL (WINAPI * PFNWGLDELETEDCNVPROC) (HDC hdc); typedef BOOL (WINAPI * PFNWGLENUMGPUDEVICESNVPROC) (HGPUNV hGpu, UINT iDeviceIndex, PGPU_DEVICE lpGpuDevice); typedef BOOL (WINAPI * PFNWGLENUMGPUSFROMAFFINITYDCNVPROC) (HDC hAffinityDC, UINT iGpuIndex, HGPUNV *hGpu); typedef BOOL (WINAPI * PFNWGLENUMGPUSNVPROC) (UINT iGpuIndex, HGPUNV *phGpu); #define wglCreateAffinityDCNV WGLEW_GET_FUN(__wglewCreateAffinityDCNV) #define wglDeleteDCNV WGLEW_GET_FUN(__wglewDeleteDCNV) #define wglEnumGpuDevicesNV WGLEW_GET_FUN(__wglewEnumGpuDevicesNV) #define wglEnumGpusFromAffinityDCNV WGLEW_GET_FUN(__wglewEnumGpusFromAffinityDCNV) #define wglEnumGpusNV WGLEW_GET_FUN(__wglewEnumGpusNV) #define WGLEW_NV_gpu_affinity WGLEW_GET_VAR(__WGLEW_NV_gpu_affinity) #endif /* WGL_NV_gpu_affinity */ /* ---------------------- WGL_NV_multisample_coverage ---------------------- */ #ifndef WGL_NV_multisample_coverage #define WGL_NV_multisample_coverage 1 #define WGL_COVERAGE_SAMPLES_NV 0x2042 #define WGL_COLOR_SAMPLES_NV 0x20B9 #define WGLEW_NV_multisample_coverage WGLEW_GET_VAR(__WGLEW_NV_multisample_coverage) #endif /* WGL_NV_multisample_coverage */ /* -------------------------- WGL_NV_present_video ------------------------- */ #ifndef WGL_NV_present_video #define WGL_NV_present_video 1 #define WGL_NUM_VIDEO_SLOTS_NV 0x20F0 DECLARE_HANDLE(HVIDEOOUTPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEODEVICENVPROC) (HDC hDc, unsigned int uVideoSlot, HVIDEOOUTPUTDEVICENV hVideoDevice, const int* piAttribList); typedef int (WINAPI * PFNWGLENUMERATEVIDEODEVICESNVPROC) (HDC hDc, HVIDEOOUTPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLQUERYCURRENTCONTEXTNVPROC) (int iAttribute, int* piValue); #define wglBindVideoDeviceNV WGLEW_GET_FUN(__wglewBindVideoDeviceNV) #define wglEnumerateVideoDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoDevicesNV) #define wglQueryCurrentContextNV WGLEW_GET_FUN(__wglewQueryCurrentContextNV) #define WGLEW_NV_present_video WGLEW_GET_VAR(__WGLEW_NV_present_video) #endif /* WGL_NV_present_video */ /* ---------------------- WGL_NV_render_depth_texture ---------------------- */ #ifndef WGL_NV_render_depth_texture #define WGL_NV_render_depth_texture 1 #define WGL_NO_TEXTURE_ARB 0x2077 #define WGL_BIND_TO_TEXTURE_DEPTH_NV 0x20A3 #define WGL_BIND_TO_TEXTURE_RECTANGLE_DEPTH_NV 0x20A4 #define WGL_DEPTH_TEXTURE_FORMAT_NV 0x20A5 #define WGL_TEXTURE_DEPTH_COMPONENT_NV 0x20A6 #define WGL_DEPTH_COMPONENT_NV 0x20A7 #define WGLEW_NV_render_depth_texture WGLEW_GET_VAR(__WGLEW_NV_render_depth_texture) #endif /* WGL_NV_render_depth_texture */ /* -------------------- WGL_NV_render_texture_rectangle -------------------- */ #ifndef WGL_NV_render_texture_rectangle #define WGL_NV_render_texture_rectangle 1 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV 0x20A0 #define WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV 0x20A1 #define WGL_TEXTURE_RECTANGLE_NV 0x20A2 #define WGLEW_NV_render_texture_rectangle WGLEW_GET_VAR(__WGLEW_NV_render_texture_rectangle) #endif /* WGL_NV_render_texture_rectangle */ /* --------------------------- WGL_NV_swap_group --------------------------- */ #ifndef WGL_NV_swap_group #define WGL_NV_swap_group 1 typedef BOOL (WINAPI * PFNWGLBINDSWAPBARRIERNVPROC) (GLuint group, GLuint barrier); typedef BOOL (WINAPI * PFNWGLJOINSWAPGROUPNVPROC) (HDC hDC, GLuint group); typedef BOOL (WINAPI * PFNWGLQUERYFRAMECOUNTNVPROC) (HDC hDC, GLuint* count); typedef BOOL (WINAPI * PFNWGLQUERYMAXSWAPGROUPSNVPROC) (HDC hDC, GLuint* maxGroups, GLuint *maxBarriers); typedef BOOL (WINAPI * PFNWGLQUERYSWAPGROUPNVPROC) (HDC hDC, GLuint* group, GLuint *barrier); typedef BOOL (WINAPI * PFNWGLRESETFRAMECOUNTNVPROC) (HDC hDC); #define wglBindSwapBarrierNV WGLEW_GET_FUN(__wglewBindSwapBarrierNV) #define wglJoinSwapGroupNV WGLEW_GET_FUN(__wglewJoinSwapGroupNV) #define wglQueryFrameCountNV WGLEW_GET_FUN(__wglewQueryFrameCountNV) #define wglQueryMaxSwapGroupsNV WGLEW_GET_FUN(__wglewQueryMaxSwapGroupsNV) #define wglQuerySwapGroupNV WGLEW_GET_FUN(__wglewQuerySwapGroupNV) #define wglResetFrameCountNV WGLEW_GET_FUN(__wglewResetFrameCountNV) #define WGLEW_NV_swap_group WGLEW_GET_VAR(__WGLEW_NV_swap_group) #endif /* WGL_NV_swap_group */ /* ----------------------- WGL_NV_vertex_array_range ----------------------- */ #ifndef WGL_NV_vertex_array_range #define WGL_NV_vertex_array_range 1 typedef void * (WINAPI * PFNWGLALLOCATEMEMORYNVPROC) (GLsizei size, GLfloat readFrequency, GLfloat writeFrequency, GLfloat priority); typedef void (WINAPI * PFNWGLFREEMEMORYNVPROC) (void *pointer); #define wglAllocateMemoryNV WGLEW_GET_FUN(__wglewAllocateMemoryNV) #define wglFreeMemoryNV WGLEW_GET_FUN(__wglewFreeMemoryNV) #define WGLEW_NV_vertex_array_range WGLEW_GET_VAR(__WGLEW_NV_vertex_array_range) #endif /* WGL_NV_vertex_array_range */ /* -------------------------- WGL_NV_video_capture ------------------------- */ #ifndef WGL_NV_video_capture #define WGL_NV_video_capture 1 #define WGL_UNIQUE_ID_NV 0x20CE #define WGL_NUM_VIDEO_CAPTURE_SLOTS_NV 0x20CF DECLARE_HANDLE(HVIDEOINPUTDEVICENV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOCAPTUREDEVICENVPROC) (UINT uVideoSlot, HVIDEOINPUTDEVICENV hDevice); typedef UINT (WINAPI * PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC) (HDC hDc, HVIDEOINPUTDEVICENV* phDeviceList); typedef BOOL (WINAPI * PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); typedef BOOL (WINAPI * PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice, int iAttribute, int* piValue); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC) (HDC hDc, HVIDEOINPUTDEVICENV hDevice); #define wglBindVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewBindVideoCaptureDeviceNV) #define wglEnumerateVideoCaptureDevicesNV WGLEW_GET_FUN(__wglewEnumerateVideoCaptureDevicesNV) #define wglLockVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewLockVideoCaptureDeviceNV) #define wglQueryVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewQueryVideoCaptureDeviceNV) #define wglReleaseVideoCaptureDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoCaptureDeviceNV) #define WGLEW_NV_video_capture WGLEW_GET_VAR(__WGLEW_NV_video_capture) #endif /* WGL_NV_video_capture */ /* -------------------------- WGL_NV_video_output -------------------------- */ #ifndef WGL_NV_video_output #define WGL_NV_video_output 1 #define WGL_BIND_TO_VIDEO_RGB_NV 0x20C0 #define WGL_BIND_TO_VIDEO_RGBA_NV 0x20C1 #define WGL_BIND_TO_VIDEO_RGB_AND_DEPTH_NV 0x20C2 #define WGL_VIDEO_OUT_COLOR_NV 0x20C3 #define WGL_VIDEO_OUT_ALPHA_NV 0x20C4 #define WGL_VIDEO_OUT_DEPTH_NV 0x20C5 #define WGL_VIDEO_OUT_COLOR_AND_ALPHA_NV 0x20C6 #define WGL_VIDEO_OUT_COLOR_AND_DEPTH_NV 0x20C7 #define WGL_VIDEO_OUT_FRAME 0x20C8 #define WGL_VIDEO_OUT_FIELD_1 0x20C9 #define WGL_VIDEO_OUT_FIELD_2 0x20CA #define WGL_VIDEO_OUT_STACKED_FIELDS_1_2 0x20CB #define WGL_VIDEO_OUT_STACKED_FIELDS_2_1 0x20CC DECLARE_HANDLE(HPVIDEODEV); typedef BOOL (WINAPI * PFNWGLBINDVIDEOIMAGENVPROC) (HPVIDEODEV hVideoDevice, HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLGETVIDEODEVICENVPROC) (HDC hDC, int numDevices, HPVIDEODEV* hVideoDevice); typedef BOOL (WINAPI * PFNWGLGETVIDEOINFONVPROC) (HPVIDEODEV hpVideoDevice, unsigned long* pulCounterOutputPbuffer, unsigned long *pulCounterOutputVideo); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEODEVICENVPROC) (HPVIDEODEV hVideoDevice); typedef BOOL (WINAPI * PFNWGLRELEASEVIDEOIMAGENVPROC) (HPBUFFERARB hPbuffer, int iVideoBuffer); typedef BOOL (WINAPI * PFNWGLSENDPBUFFERTOVIDEONVPROC) (HPBUFFERARB hPbuffer, int iBufferType, unsigned long* pulCounterPbuffer, BOOL bBlock); #define wglBindVideoImageNV WGLEW_GET_FUN(__wglewBindVideoImageNV) #define wglGetVideoDeviceNV WGLEW_GET_FUN(__wglewGetVideoDeviceNV) #define wglGetVideoInfoNV WGLEW_GET_FUN(__wglewGetVideoInfoNV) #define wglReleaseVideoDeviceNV WGLEW_GET_FUN(__wglewReleaseVideoDeviceNV) #define wglReleaseVideoImageNV WGLEW_GET_FUN(__wglewReleaseVideoImageNV) #define wglSendPbufferToVideoNV WGLEW_GET_FUN(__wglewSendPbufferToVideoNV) #define WGLEW_NV_video_output WGLEW_GET_VAR(__WGLEW_NV_video_output) #endif /* WGL_NV_video_output */ /* -------------------------- WGL_OML_sync_control ------------------------- */ #ifndef WGL_OML_sync_control #define WGL_OML_sync_control 1 typedef BOOL (WINAPI * PFNWGLGETMSCRATEOMLPROC) (HDC hdc, INT32* numerator, INT32 *denominator); typedef BOOL (WINAPI * PFNWGLGETSYNCVALUESOMLPROC) (HDC hdc, INT64* ust, INT64 *msc, INT64 *sbc); typedef INT64 (WINAPI * PFNWGLSWAPBUFFERSMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder); typedef INT64 (WINAPI * PFNWGLSWAPLAYERBUFFERSMSCOMLPROC) (HDC hdc, INT fuPlanes, INT64 target_msc, INT64 divisor, INT64 remainder); typedef BOOL (WINAPI * PFNWGLWAITFORMSCOMLPROC) (HDC hdc, INT64 target_msc, INT64 divisor, INT64 remainder, INT64* ust, INT64 *msc, INT64 *sbc); typedef BOOL (WINAPI * PFNWGLWAITFORSBCOMLPROC) (HDC hdc, INT64 target_sbc, INT64* ust, INT64 *msc, INT64 *sbc); #define wglGetMscRateOML WGLEW_GET_FUN(__wglewGetMscRateOML) #define wglGetSyncValuesOML WGLEW_GET_FUN(__wglewGetSyncValuesOML) #define wglSwapBuffersMscOML WGLEW_GET_FUN(__wglewSwapBuffersMscOML) #define wglSwapLayerBuffersMscOML WGLEW_GET_FUN(__wglewSwapLayerBuffersMscOML) #define wglWaitForMscOML WGLEW_GET_FUN(__wglewWaitForMscOML) #define wglWaitForSbcOML WGLEW_GET_FUN(__wglewWaitForSbcOML) #define WGLEW_OML_sync_control WGLEW_GET_VAR(__WGLEW_OML_sync_control) #endif /* WGL_OML_sync_control */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX #define WGLEW_EXPORT #else #define WGLEW_EXPORT GLEWAPI #endif /* GLEW_MX */ #ifdef GLEW_MX struct WGLEWContextStruct { #endif /* GLEW_MX */ WGLEW_EXPORT PFNWGLSETSTEREOEMITTERSTATE3DLPROC __wglewSetStereoEmitterState3DL; WGLEW_EXPORT PFNWGLBLITCONTEXTFRAMEBUFFERAMDPROC __wglewBlitContextFramebufferAMD; WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTAMDPROC __wglewCreateAssociatedContextAMD; WGLEW_EXPORT PFNWGLCREATEASSOCIATEDCONTEXTATTRIBSAMDPROC __wglewCreateAssociatedContextAttribsAMD; WGLEW_EXPORT PFNWGLDELETEASSOCIATEDCONTEXTAMDPROC __wglewDeleteAssociatedContextAMD; WGLEW_EXPORT PFNWGLGETCONTEXTGPUIDAMDPROC __wglewGetContextGPUIDAMD; WGLEW_EXPORT PFNWGLGETCURRENTASSOCIATEDCONTEXTAMDPROC __wglewGetCurrentAssociatedContextAMD; WGLEW_EXPORT PFNWGLGETGPUIDSAMDPROC __wglewGetGPUIDsAMD; WGLEW_EXPORT PFNWGLGETGPUINFOAMDPROC __wglewGetGPUInfoAMD; WGLEW_EXPORT PFNWGLMAKEASSOCIATEDCONTEXTCURRENTAMDPROC __wglewMakeAssociatedContextCurrentAMD; WGLEW_EXPORT PFNWGLCREATEBUFFERREGIONARBPROC __wglewCreateBufferRegionARB; WGLEW_EXPORT PFNWGLDELETEBUFFERREGIONARBPROC __wglewDeleteBufferRegionARB; WGLEW_EXPORT PFNWGLRESTOREBUFFERREGIONARBPROC __wglewRestoreBufferRegionARB; WGLEW_EXPORT PFNWGLSAVEBUFFERREGIONARBPROC __wglewSaveBufferRegionARB; WGLEW_EXPORT PFNWGLCREATECONTEXTATTRIBSARBPROC __wglewCreateContextAttribsARB; WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGARBPROC __wglewGetExtensionsStringARB; WGLEW_EXPORT PFNWGLGETCURRENTREADDCARBPROC __wglewGetCurrentReadDCARB; WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTARBPROC __wglewMakeContextCurrentARB; WGLEW_EXPORT PFNWGLCREATEPBUFFERARBPROC __wglewCreatePbufferARB; WGLEW_EXPORT PFNWGLDESTROYPBUFFERARBPROC __wglewDestroyPbufferARB; WGLEW_EXPORT PFNWGLGETPBUFFERDCARBPROC __wglewGetPbufferDCARB; WGLEW_EXPORT PFNWGLQUERYPBUFFERARBPROC __wglewQueryPbufferARB; WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCARBPROC __wglewReleasePbufferDCARB; WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATARBPROC __wglewChoosePixelFormatARB; WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVARBPROC __wglewGetPixelFormatAttribfvARB; WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVARBPROC __wglewGetPixelFormatAttribivARB; WGLEW_EXPORT PFNWGLBINDTEXIMAGEARBPROC __wglewBindTexImageARB; WGLEW_EXPORT PFNWGLRELEASETEXIMAGEARBPROC __wglewReleaseTexImageARB; WGLEW_EXPORT PFNWGLSETPBUFFERATTRIBARBPROC __wglewSetPbufferAttribARB; WGLEW_EXPORT PFNWGLBINDDISPLAYCOLORTABLEEXTPROC __wglewBindDisplayColorTableEXT; WGLEW_EXPORT PFNWGLCREATEDISPLAYCOLORTABLEEXTPROC __wglewCreateDisplayColorTableEXT; WGLEW_EXPORT PFNWGLDESTROYDISPLAYCOLORTABLEEXTPROC __wglewDestroyDisplayColorTableEXT; WGLEW_EXPORT PFNWGLLOADDISPLAYCOLORTABLEEXTPROC __wglewLoadDisplayColorTableEXT; WGLEW_EXPORT PFNWGLGETEXTENSIONSSTRINGEXTPROC __wglewGetExtensionsStringEXT; WGLEW_EXPORT PFNWGLGETCURRENTREADDCEXTPROC __wglewGetCurrentReadDCEXT; WGLEW_EXPORT PFNWGLMAKECONTEXTCURRENTEXTPROC __wglewMakeContextCurrentEXT; WGLEW_EXPORT PFNWGLCREATEPBUFFEREXTPROC __wglewCreatePbufferEXT; WGLEW_EXPORT PFNWGLDESTROYPBUFFEREXTPROC __wglewDestroyPbufferEXT; WGLEW_EXPORT PFNWGLGETPBUFFERDCEXTPROC __wglewGetPbufferDCEXT; WGLEW_EXPORT PFNWGLQUERYPBUFFEREXTPROC __wglewQueryPbufferEXT; WGLEW_EXPORT PFNWGLRELEASEPBUFFERDCEXTPROC __wglewReleasePbufferDCEXT; WGLEW_EXPORT PFNWGLCHOOSEPIXELFORMATEXTPROC __wglewChoosePixelFormatEXT; WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBFVEXTPROC __wglewGetPixelFormatAttribfvEXT; WGLEW_EXPORT PFNWGLGETPIXELFORMATATTRIBIVEXTPROC __wglewGetPixelFormatAttribivEXT; WGLEW_EXPORT PFNWGLGETSWAPINTERVALEXTPROC __wglewGetSwapIntervalEXT; WGLEW_EXPORT PFNWGLSWAPINTERVALEXTPROC __wglewSwapIntervalEXT; WGLEW_EXPORT PFNWGLGETDIGITALVIDEOPARAMETERSI3DPROC __wglewGetDigitalVideoParametersI3D; WGLEW_EXPORT PFNWGLSETDIGITALVIDEOPARAMETERSI3DPROC __wglewSetDigitalVideoParametersI3D; WGLEW_EXPORT PFNWGLGETGAMMATABLEI3DPROC __wglewGetGammaTableI3D; WGLEW_EXPORT PFNWGLGETGAMMATABLEPARAMETERSI3DPROC __wglewGetGammaTableParametersI3D; WGLEW_EXPORT PFNWGLSETGAMMATABLEI3DPROC __wglewSetGammaTableI3D; WGLEW_EXPORT PFNWGLSETGAMMATABLEPARAMETERSI3DPROC __wglewSetGammaTableParametersI3D; WGLEW_EXPORT PFNWGLDISABLEGENLOCKI3DPROC __wglewDisableGenlockI3D; WGLEW_EXPORT PFNWGLENABLEGENLOCKI3DPROC __wglewEnableGenlockI3D; WGLEW_EXPORT PFNWGLGENLOCKSAMPLERATEI3DPROC __wglewGenlockSampleRateI3D; WGLEW_EXPORT PFNWGLGENLOCKSOURCEDELAYI3DPROC __wglewGenlockSourceDelayI3D; WGLEW_EXPORT PFNWGLGENLOCKSOURCEEDGEI3DPROC __wglewGenlockSourceEdgeI3D; WGLEW_EXPORT PFNWGLGENLOCKSOURCEI3DPROC __wglewGenlockSourceI3D; WGLEW_EXPORT PFNWGLGETGENLOCKSAMPLERATEI3DPROC __wglewGetGenlockSampleRateI3D; WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEDELAYI3DPROC __wglewGetGenlockSourceDelayI3D; WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEEDGEI3DPROC __wglewGetGenlockSourceEdgeI3D; WGLEW_EXPORT PFNWGLGETGENLOCKSOURCEI3DPROC __wglewGetGenlockSourceI3D; WGLEW_EXPORT PFNWGLISENABLEDGENLOCKI3DPROC __wglewIsEnabledGenlockI3D; WGLEW_EXPORT PFNWGLQUERYGENLOCKMAXSOURCEDELAYI3DPROC __wglewQueryGenlockMaxSourceDelayI3D; WGLEW_EXPORT PFNWGLASSOCIATEIMAGEBUFFEREVENTSI3DPROC __wglewAssociateImageBufferEventsI3D; WGLEW_EXPORT PFNWGLCREATEIMAGEBUFFERI3DPROC __wglewCreateImageBufferI3D; WGLEW_EXPORT PFNWGLDESTROYIMAGEBUFFERI3DPROC __wglewDestroyImageBufferI3D; WGLEW_EXPORT PFNWGLRELEASEIMAGEBUFFEREVENTSI3DPROC __wglewReleaseImageBufferEventsI3D; WGLEW_EXPORT PFNWGLDISABLEFRAMELOCKI3DPROC __wglewDisableFrameLockI3D; WGLEW_EXPORT PFNWGLENABLEFRAMELOCKI3DPROC __wglewEnableFrameLockI3D; WGLEW_EXPORT PFNWGLISENABLEDFRAMELOCKI3DPROC __wglewIsEnabledFrameLockI3D; WGLEW_EXPORT PFNWGLQUERYFRAMELOCKMASTERI3DPROC __wglewQueryFrameLockMasterI3D; WGLEW_EXPORT PFNWGLBEGINFRAMETRACKINGI3DPROC __wglewBeginFrameTrackingI3D; WGLEW_EXPORT PFNWGLENDFRAMETRACKINGI3DPROC __wglewEndFrameTrackingI3D; WGLEW_EXPORT PFNWGLGETFRAMEUSAGEI3DPROC __wglewGetFrameUsageI3D; WGLEW_EXPORT PFNWGLQUERYFRAMETRACKINGI3DPROC __wglewQueryFrameTrackingI3D; WGLEW_EXPORT PFNWGLDXCLOSEDEVICENVPROC __wglewDXCloseDeviceNV; WGLEW_EXPORT PFNWGLDXLOCKOBJECTSNVPROC __wglewDXLockObjectsNV; WGLEW_EXPORT PFNWGLDXOBJECTACCESSNVPROC __wglewDXObjectAccessNV; WGLEW_EXPORT PFNWGLDXOPENDEVICENVPROC __wglewDXOpenDeviceNV; WGLEW_EXPORT PFNWGLDXREGISTEROBJECTNVPROC __wglewDXRegisterObjectNV; WGLEW_EXPORT PFNWGLDXSETRESOURCESHAREHANDLENVPROC __wglewDXSetResourceShareHandleNV; WGLEW_EXPORT PFNWGLDXUNLOCKOBJECTSNVPROC __wglewDXUnlockObjectsNV; WGLEW_EXPORT PFNWGLDXUNREGISTEROBJECTNVPROC __wglewDXUnregisterObjectNV; WGLEW_EXPORT PFNWGLCOPYIMAGESUBDATANVPROC __wglewCopyImageSubDataNV; WGLEW_EXPORT PFNWGLCREATEAFFINITYDCNVPROC __wglewCreateAffinityDCNV; WGLEW_EXPORT PFNWGLDELETEDCNVPROC __wglewDeleteDCNV; WGLEW_EXPORT PFNWGLENUMGPUDEVICESNVPROC __wglewEnumGpuDevicesNV; WGLEW_EXPORT PFNWGLENUMGPUSFROMAFFINITYDCNVPROC __wglewEnumGpusFromAffinityDCNV; WGLEW_EXPORT PFNWGLENUMGPUSNVPROC __wglewEnumGpusNV; WGLEW_EXPORT PFNWGLBINDVIDEODEVICENVPROC __wglewBindVideoDeviceNV; WGLEW_EXPORT PFNWGLENUMERATEVIDEODEVICESNVPROC __wglewEnumerateVideoDevicesNV; WGLEW_EXPORT PFNWGLQUERYCURRENTCONTEXTNVPROC __wglewQueryCurrentContextNV; WGLEW_EXPORT PFNWGLBINDSWAPBARRIERNVPROC __wglewBindSwapBarrierNV; WGLEW_EXPORT PFNWGLJOINSWAPGROUPNVPROC __wglewJoinSwapGroupNV; WGLEW_EXPORT PFNWGLQUERYFRAMECOUNTNVPROC __wglewQueryFrameCountNV; WGLEW_EXPORT PFNWGLQUERYMAXSWAPGROUPSNVPROC __wglewQueryMaxSwapGroupsNV; WGLEW_EXPORT PFNWGLQUERYSWAPGROUPNVPROC __wglewQuerySwapGroupNV; WGLEW_EXPORT PFNWGLRESETFRAMECOUNTNVPROC __wglewResetFrameCountNV; WGLEW_EXPORT PFNWGLALLOCATEMEMORYNVPROC __wglewAllocateMemoryNV; WGLEW_EXPORT PFNWGLFREEMEMORYNVPROC __wglewFreeMemoryNV; WGLEW_EXPORT PFNWGLBINDVIDEOCAPTUREDEVICENVPROC __wglewBindVideoCaptureDeviceNV; WGLEW_EXPORT PFNWGLENUMERATEVIDEOCAPTUREDEVICESNVPROC __wglewEnumerateVideoCaptureDevicesNV; WGLEW_EXPORT PFNWGLLOCKVIDEOCAPTUREDEVICENVPROC __wglewLockVideoCaptureDeviceNV; WGLEW_EXPORT PFNWGLQUERYVIDEOCAPTUREDEVICENVPROC __wglewQueryVideoCaptureDeviceNV; WGLEW_EXPORT PFNWGLRELEASEVIDEOCAPTUREDEVICENVPROC __wglewReleaseVideoCaptureDeviceNV; WGLEW_EXPORT PFNWGLBINDVIDEOIMAGENVPROC __wglewBindVideoImageNV; WGLEW_EXPORT PFNWGLGETVIDEODEVICENVPROC __wglewGetVideoDeviceNV; WGLEW_EXPORT PFNWGLGETVIDEOINFONVPROC __wglewGetVideoInfoNV; WGLEW_EXPORT PFNWGLRELEASEVIDEODEVICENVPROC __wglewReleaseVideoDeviceNV; WGLEW_EXPORT PFNWGLRELEASEVIDEOIMAGENVPROC __wglewReleaseVideoImageNV; WGLEW_EXPORT PFNWGLSENDPBUFFERTOVIDEONVPROC __wglewSendPbufferToVideoNV; WGLEW_EXPORT PFNWGLGETMSCRATEOMLPROC __wglewGetMscRateOML; WGLEW_EXPORT PFNWGLGETSYNCVALUESOMLPROC __wglewGetSyncValuesOML; WGLEW_EXPORT PFNWGLSWAPBUFFERSMSCOMLPROC __wglewSwapBuffersMscOML; WGLEW_EXPORT PFNWGLSWAPLAYERBUFFERSMSCOMLPROC __wglewSwapLayerBuffersMscOML; WGLEW_EXPORT PFNWGLWAITFORMSCOMLPROC __wglewWaitForMscOML; WGLEW_EXPORT PFNWGLWAITFORSBCOMLPROC __wglewWaitForSbcOML; WGLEW_EXPORT GLboolean __WGLEW_3DFX_multisample; WGLEW_EXPORT GLboolean __WGLEW_3DL_stereo_control; WGLEW_EXPORT GLboolean __WGLEW_AMD_gpu_association; WGLEW_EXPORT GLboolean __WGLEW_ARB_buffer_region; WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context; WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_profile; WGLEW_EXPORT GLboolean __WGLEW_ARB_create_context_robustness; WGLEW_EXPORT GLboolean __WGLEW_ARB_extensions_string; WGLEW_EXPORT GLboolean __WGLEW_ARB_framebuffer_sRGB; WGLEW_EXPORT GLboolean __WGLEW_ARB_make_current_read; WGLEW_EXPORT GLboolean __WGLEW_ARB_multisample; WGLEW_EXPORT GLboolean __WGLEW_ARB_pbuffer; WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format; WGLEW_EXPORT GLboolean __WGLEW_ARB_pixel_format_float; WGLEW_EXPORT GLboolean __WGLEW_ARB_render_texture; WGLEW_EXPORT GLboolean __WGLEW_ATI_pixel_format_float; WGLEW_EXPORT GLboolean __WGLEW_ATI_render_texture_rectangle; WGLEW_EXPORT GLboolean __WGLEW_EXT_create_context_es2_profile; WGLEW_EXPORT GLboolean __WGLEW_EXT_depth_float; WGLEW_EXPORT GLboolean __WGLEW_EXT_display_color_table; WGLEW_EXPORT GLboolean __WGLEW_EXT_extensions_string; WGLEW_EXPORT GLboolean __WGLEW_EXT_framebuffer_sRGB; WGLEW_EXPORT GLboolean __WGLEW_EXT_make_current_read; WGLEW_EXPORT GLboolean __WGLEW_EXT_multisample; WGLEW_EXPORT GLboolean __WGLEW_EXT_pbuffer; WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format; WGLEW_EXPORT GLboolean __WGLEW_EXT_pixel_format_packed_float; WGLEW_EXPORT GLboolean __WGLEW_EXT_swap_control; WGLEW_EXPORT GLboolean __WGLEW_I3D_digital_video_control; WGLEW_EXPORT GLboolean __WGLEW_I3D_gamma; WGLEW_EXPORT GLboolean __WGLEW_I3D_genlock; WGLEW_EXPORT GLboolean __WGLEW_I3D_image_buffer; WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_lock; WGLEW_EXPORT GLboolean __WGLEW_I3D_swap_frame_usage; WGLEW_EXPORT GLboolean __WGLEW_NV_DX_interop; WGLEW_EXPORT GLboolean __WGLEW_NV_copy_image; WGLEW_EXPORT GLboolean __WGLEW_NV_float_buffer; WGLEW_EXPORT GLboolean __WGLEW_NV_gpu_affinity; WGLEW_EXPORT GLboolean __WGLEW_NV_multisample_coverage; WGLEW_EXPORT GLboolean __WGLEW_NV_present_video; WGLEW_EXPORT GLboolean __WGLEW_NV_render_depth_texture; WGLEW_EXPORT GLboolean __WGLEW_NV_render_texture_rectangle; WGLEW_EXPORT GLboolean __WGLEW_NV_swap_group; WGLEW_EXPORT GLboolean __WGLEW_NV_vertex_array_range; WGLEW_EXPORT GLboolean __WGLEW_NV_video_capture; WGLEW_EXPORT GLboolean __WGLEW_NV_video_output; WGLEW_EXPORT GLboolean __WGLEW_OML_sync_control; #ifdef GLEW_MX }; /* WGLEWContextStruct */ #endif /* GLEW_MX */ /* ------------------------------------------------------------------------- */ #ifdef GLEW_MX typedef struct WGLEWContextStruct WGLEWContext; GLEWAPI GLenum wglewContextInit (WGLEWContext* ctx); GLEWAPI GLboolean wglewContextIsSupported (const WGLEWContext* ctx, const char* name); #define wglewInit() wglewContextInit(wglewGetContext()) #define wglewIsSupported(x) wglewContextIsSupported(wglewGetContext(), x) #define WGLEW_GET_VAR(x) (*(const GLboolean*)&(wglewGetContext()->x)) #define WGLEW_GET_FUN(x) wglewGetContext()->x #else /* GLEW_MX */ #define WGLEW_GET_VAR(x) (*(const GLboolean*)&x) #define WGLEW_GET_FUN(x) x GLEWAPI GLboolean wglewIsSupported (const char* name); #endif /* GLEW_MX */ GLEWAPI GLboolean wglewGetExtension (const char* name); #ifdef __cplusplus } #endif #undef GLEWAPI #endif /* __wglew_h__ */ ================================================ FILE: samples/C/yajl.c ================================================ /* * Copyright 2010, Lloyd Hilaiel. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions are * met: * * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * 3. Neither the name of Lloyd Hilaiel nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING * IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE * POSSIBILITY OF SUCH DAMAGE. */ #include "api/yajl_parse.h" #include "yajl_lex.h" #include "yajl_parser.h" #include "yajl_alloc.h" #include #include #include const char * yajl_status_to_string(yajl_status stat) { const char * statStr = "unknown"; switch (stat) { case yajl_status_ok: statStr = "ok, no error"; break; case yajl_status_client_canceled: statStr = "client canceled parse"; break; case yajl_status_insufficient_data: statStr = "eof was met before the parse could complete"; break; case yajl_status_error: statStr = "parse error"; break; } return statStr; } yajl_handle yajl_alloc(const yajl_callbacks * callbacks, const yajl_parser_config * config, const yajl_alloc_funcs * afs, void * ctx) { unsigned int allowComments = 0; unsigned int validateUTF8 = 0; yajl_handle hand = NULL; yajl_alloc_funcs afsBuffer; /* first order of business is to set up memory allocation routines */ if (afs != NULL) { if (afs->malloc == NULL || afs->realloc == NULL || afs->free == NULL) { return NULL; } } else { yajl_set_default_alloc_funcs(&afsBuffer); afs = &afsBuffer; } hand = (yajl_handle) YA_MALLOC(afs, sizeof(struct yajl_handle_t)); /* copy in pointers to allocation routines */ memcpy((void *) &(hand->alloc), (void *) afs, sizeof(yajl_alloc_funcs)); if (config != NULL) { allowComments = config->allowComments; validateUTF8 = config->checkUTF8; } hand->callbacks = callbacks; hand->ctx = ctx; hand->lexer = yajl_lex_alloc(&(hand->alloc), allowComments, validateUTF8); hand->bytesConsumed = 0; hand->decodeBuf = yajl_buf_alloc(&(hand->alloc)); yajl_bs_init(hand->stateStack, &(hand->alloc)); yajl_bs_push(hand->stateStack, yajl_state_start); return hand; } void yajl_reset_parser(yajl_handle hand) { hand->lexer = yajl_lex_realloc(hand->lexer); } void yajl_free(yajl_handle handle) { yajl_bs_free(handle->stateStack); yajl_buf_free(handle->decodeBuf); yajl_lex_free(handle->lexer); YA_FREE(&(handle->alloc), handle); } yajl_status yajl_parse(yajl_handle hand, const unsigned char * jsonText, unsigned int jsonTextLen) { yajl_status status; status = yajl_do_parse(hand, jsonText, jsonTextLen); return status; } yajl_status yajl_parse_complete(yajl_handle hand) { /* The particular case we want to handle is a trailing number. * Further input consisting of digits could cause our interpretation * of the number to change (buffered "1" but "2" comes in). * A very simple approach to this is to inject whitespace to terminate * any number in the lex buffer. */ return yajl_parse(hand, (const unsigned char *)" ", 1); } unsigned char * yajl_get_error(yajl_handle hand, int verbose, const unsigned char * jsonText, unsigned int jsonTextLen) { return yajl_render_error_string(hand, jsonText, jsonTextLen, verbose); } unsigned int yajl_get_bytes_consumed(yajl_handle hand) { if (!hand) return 0; else return hand->bytesConsumed; } void yajl_free_error(yajl_handle hand, unsigned char * str) { /* use memory allocation functions if set */ YA_FREE(&(hand->alloc), str); } /* XXX: add utility routines to parse from file */ ================================================ FILE: samples/C#/AssemblyInfo.cs ================================================ using System.Reflection; using System.Runtime.CompilerServices; // Information about this assembly is defined by the following attributes. // Change them to the values specific to your project. [assembly: AssemblyTitle("Simple")] [assembly: AssemblyDescription("")] [assembly: AssemblyConfiguration("")] [assembly: AssemblyCompany("")] [assembly: AssemblyProduct("")] [assembly: AssemblyCopyright("")] [assembly: AssemblyTrademark("")] [assembly: AssemblyCulture("")] // The assembly version has the format "{Major}.{Minor}.{Build}.{Revision}". // The form "{Major}.{Minor}.*" will automatically update the build and revision, // and "{Major}.{Minor}.{Build}.*" will update just the revision. [assembly: AssemblyVersion("1.0.*")] // The following attributes are used to specify the signing key for the assembly, // if desired. See the Mono documentation for more information about signing. //[assembly: AssemblyDelaySign(false)] //[assembly: AssemblyKeyFile("")] ================================================ FILE: samples/C#/BsonPropertyValue.cs ================================================ using System; namespace MongoDB.Serialization.Descriptors { internal class BsonPropertyValue { public bool IsDictionary { get; private set; } public Type Type { get; private set; } public object Value { get; private set; } public BsonPropertyValue(Type type, object value, bool isDictionary) { Type = type; Value = value; IsDictionary = isDictionary; } } } ================================================ FILE: samples/C#/FileScopedNamespace.cs ================================================ namespace SampleNamespace; class AnotherSampleClass { public void AnotherSampleMethod() { System.Console.WriteLine( "SampleMethod inside SampleNamespace"); } } ================================================ FILE: samples/C#/MongoExpressionVisitor.cs ================================================ using System.Collections.Generic; using System.Collections.ObjectModel; using System.Linq; using System.Linq.Expressions; namespace MongoDB.Linq.Expressions { internal class MongoExpressionVisitor : ExpressionVisitor { protected override Expression Visit(Expression exp) { if (exp == null) return null; switch ((MongoExpressionType)exp.NodeType) { case MongoExpressionType.Collection: return VisitCollection((CollectionExpression)exp); case MongoExpressionType.Field: return VisitField((FieldExpression)exp); case MongoExpressionType.Projection: return VisitProjection((ProjectionExpression)exp); case MongoExpressionType.Select: return VisitSelect((SelectExpression)exp); case MongoExpressionType.Aggregate: return VisitAggregate((AggregateExpression)exp); case MongoExpressionType.AggregateSubquery: return VisitAggregateSubquery((AggregateSubqueryExpression)exp); case MongoExpressionType.Scalar: return VisitScalar((ScalarExpression)exp); default: return base.Visit(exp); } } protected virtual Expression VisitAggregate(AggregateExpression aggregate) { var exp = Visit(aggregate.Argument); if (exp != aggregate.Argument) return new AggregateExpression(aggregate.Type, aggregate.AggregateType, exp, aggregate.Distinct); return aggregate; } protected virtual Expression VisitAggregateSubquery(AggregateSubqueryExpression aggregateSubquery) { Expression e = Visit(aggregateSubquery.AggregateAsSubquery); ScalarExpression subquery = (ScalarExpression)e; if (subquery != aggregateSubquery.AggregateAsSubquery) return new AggregateSubqueryExpression(aggregateSubquery.GroupByAlias, aggregateSubquery.AggregateInGroupSelect, subquery); return aggregateSubquery; } protected virtual Expression VisitCollection(CollectionExpression collection) { return collection; } protected virtual Expression VisitField(FieldExpression field) { var e = Visit(field.Expression); if (field.Expression != e) field = new FieldExpression(e, field.Alias, field.Name); return field; } protected virtual Expression VisitProjection(ProjectionExpression projection) { var source = (SelectExpression)Visit(projection.Source); var projector = Visit(projection.Projector); if (source != projection.Source || projector != projection.Projector) return new ProjectionExpression(source, projector, projection.Aggregator); return projection; } protected ReadOnlyCollection VisitOrderBy(ReadOnlyCollection orderBys) { if (orderBys != null) { List alternate = null; for (int i = 0, n = orderBys.Count; i < n; i++) { OrderExpression expr = orderBys[i]; Expression e = this.Visit(expr.Expression); if (alternate == null && e != expr.Expression) alternate = orderBys.Take(i).ToList(); if (alternate != null) alternate.Add(new OrderExpression(expr.OrderType, e)); } if (alternate != null) return alternate.AsReadOnly(); } return orderBys; } protected virtual Expression VisitScalar(ScalarExpression scalar) { SelectExpression select = (SelectExpression)Visit(scalar.Select); if (select != scalar.Select) return new ScalarExpression(scalar.Type, select); return scalar; } protected virtual Expression VisitSelect(SelectExpression select) { var from = VisitSource(select.From); var where = Visit(select.Where); var groupBy = Visit(select.GroupBy); var orderBy = VisitOrderBy(select.OrderBy); var skip = Visit(select.Skip); var take = Visit(select.Take); var fields = VisitFieldDeclarationList(select.Fields); if (from != select.From || where != select.Where || orderBy != select.OrderBy || groupBy != select.GroupBy || skip != select.Skip || take != select.Take || fields != select.Fields) return new SelectExpression(select.Alias, fields, from, where, orderBy, groupBy, select.IsDistinct, skip, take); return select; } protected virtual Expression VisitSource(Expression source) { return Visit(source); } protected virtual Expression VisitSubquery(SubqueryExpression subquery) { switch ((MongoExpressionType)subquery.NodeType) { case MongoExpressionType.Scalar: return VisitScalar((ScalarExpression)subquery); } return subquery; } protected virtual ReadOnlyCollection VisitFieldDeclarationList(ReadOnlyCollection fields) { if (fields == null) return fields; List alternate = null; for (int i = 0, n = fields.Count; i < n; i++) { var f = fields[i]; var e = Visit(f.Expression); if (f.Expression != e && alternate == null) alternate = fields.Take(i).ToList(); if (alternate != null) alternate.Add(new FieldDeclaration(f.Name, e)); } if (alternate != null) return alternate.AsReadOnly(); return fields; } } } ================================================ FILE: samples/C#/Program.cs ================================================ using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace LittleSampleApp { /// /// Just what it says on the tin. A little sample application for Linguist to try out. /// /// class Program { static void Main(string[] args) { Console.WriteLine("Hello, I am a little sample application to test GitHub's Linguist module."); Console.WriteLine("I also include a Razor MVC file just to prove it handles cshtml files now."); } } } ================================================ FILE: samples/C#/SimpleHttpServer.cs ================================================ using System; using System.IO; using System.Net; using System.Reflection; using System.Text; using System.Threading.Tasks; /* * Based on HttpServer.cs from Benjamin N. Summerton, thx - https://gist.github.com/define-private-public/d05bc52dd0bed1c4699d49e2737e80e7 * * Compile how-to: * - e.g.: c:\windows\microsoft.net\framework64\v4.0.30319\csc.exe /out:.\httpserver.exe .\SimpleHttpServer.cs * * Upload how-to: * - Access via browser on your listening port * - PowerShell: iwr -Uri http://:/filename.dll -OutFile filename.dll * * Download how-to: * - Access via browser on your listening port * - PowerShell 3+: Invoke-RestMethod -Method POST -Body ([System.IO.File]::ReadAllBytes('c:\filename.dll)) http://:/?fn=filename.dll * * */ class SimpleHttpServer { public static HttpListener listener; public static string url = ""; public const string pageStart = @" HTTP Server
    "; public const string pageEnd = @"

Upload file:

"; public static async Task HandleIncomingConnections() { string localDir = Directory.GetCurrentDirectory(); while (true) { string html = String.Format(pageStart, url); HttpListenerContext ctx = await listener.GetContextAsync(); HttpListenerRequest req = ctx.Request; HttpListenerResponse resp = ctx.Response; byte[] data = new byte[0]; string queryFname = req.QueryString.Get("fn"); double mb = Math.Pow(2,20); Console.Write(req.HttpMethod + " " + req.Url.ToString() + " " + req.RemoteEndPoint.ToString()); if (req.Url.AbsolutePath.Length > 1) { string downFname = req.Url.AbsolutePath.Substring(1); downFname = System.Uri.UnescapeDataString(downFname); try { data = File.ReadAllBytes(localDir+"\\"+downFname); Console.Write(" '" + downFname + "' sent"); } catch (FileNotFoundException) { resp.StatusCode = 404; Console.Write(" '" + downFname + "' not found"); } resp.ContentType = "application/octet-stream"; resp.Headers.Add("Content-Disposition", "attachment; filename=\"" + downFname + "\""); } else if (req.HttpMethod == "POST" && queryFname != null) { using (FileStream destination = new FileStream(queryFname, FileMode.Create, FileAccess.Write)) { req.InputStream.CopyTo(destination); } Console.Write(" '" + queryFname + "' saved"); } else { DirectoryInfo directoryInfo = new DirectoryInfo(localDir); foreach (FileInfo fi in directoryInfo.EnumerateFiles("*")) { html += String.Format("
  • \n{0} (Size: {1:.000}MB)\n
  • ", fi, fi.Length/mb); } html += pageEnd; data = Encoding.UTF8.GetBytes(html); resp.ContentType = "text/html"; resp.ContentEncoding = Encoding.UTF8; } resp.ContentLength64 = data.LongLength; await resp.OutputStream.WriteAsync(data, 0, data.Length); resp.Close(); req = null; resp = null; ctx = null; data = new byte[0]; GC.Collect(); // otherwise it takes stupidly long time to free memory after downloads Console.Write("\n"); } } public static void Main(string[] args) { if (args.Length != 2) { Console.WriteLine(String.Format("Usage: {0} ", Environment.GetCommandLineArgs()[0])); return; } url = "http://" + args[0] + ":" + args[1] + "/"; listener = new HttpListener(); listener.Prefixes.Add(url); listener.Start(); Console.WriteLine("Listening for connections on {0}", url); Task task = HandleIncomingConnections(); task.GetAwaiter().GetResult(); listener.Close(); } } ================================================ FILE: samples/C#/_CodeSugarIO.DriveInfo.cs.pp ================================================ // Copyright (c) CodeSugar 2024 Vicente Penades using System; using System.Collections.Generic; using System.Text; using System.IO; using System.Runtime.CompilerServices; #nullable disable using FILE = System.IO.FileInfo; using DIRECTORY = System.IO.DirectoryInfo; using SYSTEMENTRY = System.IO.FileSystemInfo; #if CODESUGAR_USECODESUGARNAMESPACE namespace CodeSugar #elif CODESUGAR_USESYSTEMNAMESPACE namespace System.IO #else namespace $rootnamespace$ #endif { static partial class CodeSugarForSystemIO { /// /// Tries to get the DriveInfo from a given system file object. /// /// /// /// it will fail if the path points to a network drive, as in: \\NetworkDevice\path\ /// /// /// This only works on Windows. /// /// public static bool TryGetDriveInfo(this System.IO.DirectoryInfo dinfo, out System.IO.DriveInfo drive) { drive = null; if (dinfo == null) return false; var root = dinfo.Root.GetNormalizedFullName(); if (string.IsNullOrWhiteSpace(root)) return false; if (root.Length < 2) return false; // network drive if (root[0] == System.IO.Path.DirectorySeparatorChar && root[1] == System.IO.Path.DirectorySeparatorChar) return false; // system drive var interned = _TryGetInternedDriveInfo(root); if (interned != null) { drive = interned; return true; } drive = new System.IO.DriveInfo(root); return true; } /// /// Gets the drive or network name of the given object. /// public static string GetDriveOrNetworkName(this System.IO.DirectoryInfo dinfo) { if (dinfo == null) return null; var root = dinfo.Root.GetNormalizedFullName(); var interned = _TryGetInternedDriveInfo(root); if (interned != null) return interned.Name; return root; } // this is a helper method that allows reusing tha same System.IO.DriveInfo instanced mapped to System Drives. private static System.IO.DriveInfo _TryGetInternedDriveInfo(string root) { if (_InternedFixedDrives == null) // initialize { _InternedFixedDrives = new Dictionary(FileSystemStringComparer); foreach(var d in System.IO.DriveInfo.GetDrives()) { if (!d.IsReady) continue; if (d.DriveType != System.IO.DriveType.Fixed) continue; _InternedFixedDrives[d.Name] = d; } } return _InternedFixedDrives.TryGetValue(root, out var drive) ? drive : null; } } } ================================================ FILE: samples/C#/build.cake ================================================ /////////////////////////////////////////////////////////////////////////////// // ARGUMENTS /////////////////////////////////////////////////////////////////////////////// var target = Argument("target", "Default"); var configuration = Argument("configuration", "Release"); /////////////////////////////////////////////////////////////////////////////// // GLOBAL VARIABLES /////////////////////////////////////////////////////////////////////////////// var solutions = GetFiles("./**/*.sln"); var solutionPaths = solutions.Select(solution => solution.GetDirectory()); /////////////////////////////////////////////////////////////////////////////// // SETUP / TEARDOWN /////////////////////////////////////////////////////////////////////////////// Setup(() => { // Executed BEFORE the first task. Information("Running tasks..."); }); Teardown(() => { // Executed AFTER the last task. Information("Finished running tasks."); }); /////////////////////////////////////////////////////////////////////////////// // TASK DEFINITIONS /////////////////////////////////////////////////////////////////////////////// Task("Clean") .Does(() => { // Clean solution directories. foreach(var path in solutionPaths) { Information("Cleaning {0}", path); CleanDirectories(path + "/**/bin/" + configuration); CleanDirectories(path + "/**/obj/" + configuration); } }); Task("Restore") .Does(() => { // Restore all NuGet packages. foreach(var solution in solutions) { Information("Restoring {0}...", solution); NuGetRestore(solution); } }); Task("Build") .IsDependentOn("Clean") .IsDependentOn("Restore") .Does(() => { // Build all solutions. foreach(var solution in solutions) { Information("Building {0}", solution); MSBuild(solution, settings => settings.SetPlatformTarget(PlatformTarget.MSIL) .WithProperty("TreatWarningsAsErrors","true") .WithTarget("Build") .SetConfiguration(configuration)); } }); /////////////////////////////////////////////////////////////////////////////// // TARGETS /////////////////////////////////////////////////////////////////////////////// Task("Default") .IsDependentOn("Build"); /////////////////////////////////////////////////////////////////////////////// // EXECUTION /////////////////////////////////////////////////////////////////////////////// RunTarget(target); ================================================ FILE: samples/C#/chart-process-memory.linq ================================================ System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 System System.Dynamic System.Management.Automation System.Runtime.Serialization.Formatters System.Xml.Linq void Main() { /* * chart process memory * Authored by zyonet * No waranties provided what soever, use at your own risk or benefit ;D * MIT license * https://raw.githubusercontent.com/zyonet/PowerLinqPadScripts/master/LinqPad5/chart-process-memory.linq */ //To Test: open this file in LinqPad 5 (https://www.linqpad.net) //refence System.Management.Automation dll in GAC //and set language to C# in vscode for the current editor var ps = PowerShell.Create(); var _1m = 1024 * 1024; var script = @"get-process | Select Name,WS | Sort-Object -Descending WS | Where-Object {$_.WS -gt 10 * 1024 * 1024}"; ps.AddScript(script); var res = ps.Invoke(); var processes = res.Select( x => new { Name = (string) x.Properties["Name"].Value, WSInMb = (long) x.Properties["WS"].Value / _1m }); //now chart it Util.Chart(processes .Where( p => p.WSInMb >= 100), //replace with your filter (p) => p.Name, (p) => p.WSInMb, Util.SeriesType.Pie) .Dump("Processes Where WS > 100M (unit = 1Mb)"); } // Define other methods and classes here ================================================ FILE: samples/C++/16F88.h ================================================ /* * This file is part of PIC * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net) * * PIC is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PIC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ enum PIC16F88Instruction { ADDWF, ANDWF, CLRF, CLRW, COMF, DECF, DECFSZ, INCF, INCFSZ, IORWF, MOVF, MOVWF, NOP, RLF, RRF, SUBWF, SWAPF, XORWF, BCF, BSF, BTFSC, BTFSS, ADDLW, ANDLW, CALL, CLRWDT, GOTO, IORLW, MOVLW, RETFIE, RETLW, RETURN, SLEEP, SUBLW, XORLW }; class PIC16F88 { public: PIC16F88(ROM *ProgramMemory); void Step(); private: uint8_t q; bool nextIsNop, trapped; Memory *memory; ROM *program; Stack *CallStack; Register *PC; Register<> *WREG, *PCL, *STATUS, *PCLATCH; PIC16F88Instruction inst; uint16_t instrWord; private: void DecodeInstruction(); void ProcessInstruction(); uint8_t GetBank(); uint8_t GetMemoryContents(uint8_t partialAddress); void SetMemoryContents(uint8_t partialAddress, uint8_t newVal); void CheckZero(uint8_t value); void StoreValue(uint8_t value, bool updateZero); uint8_t SetCarry(bool val); uint16_t GetPCHFinalBits(); }; ================================================ FILE: samples/C++/ClasspathVMSystemProperties.inc ================================================ //===- ClasspathVMSystem/Properties.cpp -----------------------------------===// //===--------------------- GNU classpath gnu/classpath/VMSystemProperties -===// // // The VMKit project // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include #include "types.h" #include "Classpath.h" #include "JavaArray.h" #include "JavaClass.h" #include "JavaObject.h" #include "JavaThread.h" #include "JavaUpcalls.h" #include "Jnjvm.h" #include "SetProperties.inc" using namespace j3; extern "C" { JNIEXPORT void JNICALL Java_gnu_classpath_VMSystemProperties_preInit( #ifdef NATIVE_JNI JNIEnv *env, jclass clazz, #endif JavaObject* prop) { llvm_gcroot(prop, 0); BEGIN_NATIVE_EXCEPTION(0) setProperties(prop); END_NATIVE_EXCEPTION } extern "C" void Java_gnu_classpath_VMSystemProperties_postInit__Ljava_util_Properties_2(JavaObject* prop) { llvm_gcroot(prop, 0); BEGIN_NATIVE_EXCEPTION(0) setCommandLineProperties(prop); END_NATIVE_EXCEPTION } } ================================================ FILE: samples/C++/CsvStreamer.h ================================================ #pragma once #include #include #include #include "util.h" using namespace std; #define DEFAULT_DELIMITER ',' class CsvStreamer { private: ofstream file; // File output stream vector row_buffer; // Buffer which stores a row's data before being flushed/written int fields; // Number of fields (columns) long rows; // Number of rows (records) including header row char delimiter; // Delimiter character; comma by default string sanitize(string); // Returns a string ready for output into the file public: CsvStreamer(); // Empty CSV streamer... be sure to open the file before writing! CsvStreamer(string, char); // Same as open(string, char)... CsvStreamer(string); // Opens an output CSV file given a file path/name ~CsvStreamer(); // Ensures the output file is closed and saved void open(string); // Opens an output CSV file given a file path/name (default delimiter) void open(string, char); // Opens an output CSV file given a file path/name and a delimiting character (default comma) void add_field(string); // If still on first line, adds a new field to the header row void save_fields(); // Call this to save the header row; all new writes should be through append() void append(string); // Appends the current row with this data for the next field; quoted only if needed (leading/trailing spaces are trimmed) void append(string, bool); // Like append(string) but can specify whether to trim spaces at either end of the data (false to keep spaces) void append(float); // Appends the current row with this number void append(double); // Appends the current row with this number void append(long); // Appends the current row with this number void append(int); // Appends the current row with this number void writeln(); // Flushes what was in the row buffer into the file (writes the row) void close(); // Saves and closes the file int field_count(); // Gets the number of fields (columns) long row_count(); // Gets the number of records (rows) -- NOT including the header row }; ================================================ FILE: samples/C++/Entity.h ================================================ /** * @file Entity.h * @page EntityPage Entity * @brief represent an entity in the game * @author vinz243 * @version 0.1.0 * This file represents an Entity in the game system * This parent type is a static entity which is shown and loaded into the Physics engine but never updated */ #ifndef ENTITY_H #define ENTITY_H #include "base.h" /// @namespace Whitedrop namespace Whitedrop { /** @class Entity * This parent type is a static entity which is shown and loaded into the Physics engine but never updated */ class Entity { public: /** * @brief Create static entity * @details creates a static entity instance according to the mesh and the id, the position * This needs to be attached to a World after! * The material name is not the file name but the material name! * @ref WorldPage * @param mesh the name of the mesh for the object, file must be in media/meshes * @param id an unique identifier for the object, shortest as possible * @param dimensions an Ogre::Vector3 which contains the dimensions in meter * @param position the Vector3 which contains it position * @param material the material name */ Entity(std::string mesh, std::string id, Ogre::Vector3 dimensions, Ogre::Vector3 position, std::string material); /** * @brief The copy constructor * @details A copy constr * * @param ref the Entity to be copied from */ Entity(const Entity &ref); /** * @brief The assignement operator * @details * * @param ent the entity to be copied */ Entity& operator=(const Entity ent); /** * @brief destrctor * @details */ virtual ~Entity(void); /** * @brief a constance type of the entity * @details depends of the class. * May contain STATIC, DYNAMIC or ETHERAL */ const std::string type = "STATIC"; /** * @brief Attach the entity to specified sceneManager * @details This creates the OgreEntity using sceneMgr, * set material, create a Node with name as `_n`, * scale it to match dimensions and translate the node to pos * @param sceneMgr the scene manager to use */ virtual void setup(Ogre::SceneManager* sceneMgr); /** * @brief the update method * @details this method should be called on each world update. * Even though the method is necessary declared, the main impl of * a static entity should be empty since it is not updated by physics * However, a Dynamic entity should implement this function in order to: * 1) Get from the physics engine the actor position in the physic world * 2) Update the OgreEntity position and rotation from the previous actor * @return whether it was successful or not, if falsey engine should stop */ virtual bool update(void); protected: std::string mMesh = "cube.mesh"; std::string mId; std::string mMaterial; Ogre::Vector3 mDimensions; Ogre::Vector3 mPosition; Ogre::Entity* mEntity; Ogre::SceneNode* mNode; }; } #endif ================================================ FILE: samples/C++/Math.inl ================================================ /* =========================================================================== The Open Game Libraries. Copyright (C) 2007-2010 Lusito Software Author: Santo Pfingsten (TTK-Bandit) Purpose: Math namespace ----------------------------------------- This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: 1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. 2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. 3. This notice may not be removed or altered from any source distribution. =========================================================================== */ #ifndef __OG_MATH_INL__ #define __OG_MATH_INL__ namespace og { /* ============================================================================== Math ============================================================================== */ /* ================ Math::Abs ================ */ OG_INLINE int Math::Abs( int i ) { #if 1 if ( i & 0x80000000 ) return 0x80000000 - (i & MASK_SIGNED); return i; #else int y = x >> 31; return ( ( x ^ y ) - y ); #endif } /* ================ Math::Fabs ================ */ OG_INLINE float Math::Fabs( float f ) { #if 1 uInt *pf = reinterpret_cast(&f); *(pf) &= MASK_SIGNED; return f; #else return fabsf( f ); #endif } /* ================ Math::Round ================ */ OG_INLINE float Math::Round( float f ) { return floorf( f + 0.5f ); } /* ================ Math::Floor ================ */ OG_INLINE float Math::Floor( float f ) { return floorf( f ); } /* ================ Math::Ceil ================ */ OG_INLINE float Math::Ceil( float f ) { return ceilf( f ); } /* ================ Math::Ftoi ok since this is SSE, why should the other ftoi be the faster one ? and: we might need to add a check for SSE extensions.. because sse isn't *really* faster (I actually read that GCC does not handle SSE extensions perfectly. I'll find the link and send it to you when you're online) ================ */ OG_INLINE int Math::Ftoi( float f ) { //! @todo needs testing // note: sse function cvttss2si #if OG_ASM_MSVC int i; #if defined(OG_FTOI_USE_SSE) if( SysInfo::cpu.general.SSE ) { __asm cvttss2si eax, f __asm mov i, eax return i; } else #endif { __asm fld f __asm fistp i //__asm mov eax, i // do we need this ? O_o } return i; #elif OG_ASM_GNU int i; #if defined(OG_FTOI_USE_SSE) if( SysInfo::cpu.general.SSE ) { __asm__ __volatile__( "cvttss2si %1 \n\t" : "=m" (i) : "m" (f) ); } else #endif { __asm__ __volatile__( "flds %1 \n\t" "fistpl %0 \n\t" : "=m" (i) : "m" (f) ); } return i; #else // we use c++ cast instead of c cast (not sure why id did that) return static_cast(f); #endif } /* ================ Math::FtoiFast ================ */ OG_INLINE int Math::FtoiFast( float f ) { #if OG_ASM_MSVC int i; __asm fld f __asm fistp i //__asm mov eax, i // do we need this ? O_o return i; #elif OG_ASM_GNU int i; __asm__ __volatile__( "flds %1 \n\t" "fistpl %0 \n\t" : "=m" (i) : "m" (f) ); return i; #else // we use c++ cast instead of c cast (not sure why id did that) return static_cast(f); #endif } /* ================ Math::Ftol ================ */ OG_INLINE long Math::Ftol( float f ) { #if OG_ASM_MSVC long i; __asm fld f __asm fistp i //__asm mov eax, i // do we need this ? O_o return i; #elif OG_ASM_GNU long i; __asm__ __volatile__( "flds %1 \n\t" "fistpl %0 \n\t" : "=m" (i) : "m" (f) ); return i; #else // we use c++ cast instead of c cast (not sure why id did that) return static_cast(f); #endif } /* ================ Math::Sign ================ */ OG_INLINE float Math::Sign( float f ) { if ( f > 0.0f ) return 1.0f; if ( f < 0.0f ) return -1.0f; return 0.0f; } /* ================ Math::Fmod ================ */ OG_INLINE float Math::Fmod( float numerator, float denominator ) { return fmodf( numerator, denominator ); } /* ================ Math::Modf ================ */ OG_INLINE float Math::Modf( float f, float& i ) { return modff( f, &i ); } OG_INLINE float Math::Modf( float f ) { float i; return modff( f, &i ); } /* ================ Math::Sqrt ================ */ OG_INLINE float Math::Sqrt( float f ) { return sqrtf( f ); } /* ================ Math::InvSqrt Cannot be 0.0f ================ */ OG_INLINE float Math::InvSqrt( float f ) { OG_ASSERT( f != 0.0f ); return 1.0f / sqrtf( f ); } /* ================ Math::RSqrt Can be 0.0f ================ */ OG_INLINE float Math::RSqrt( float f ) { float g = 0.5f * f; int i = *reinterpret_cast(&f); // do a guess i = 0x5f375a86 - ( i>>1 ); f = *reinterpret_cast(&i); // Newtons calculation f = f * ( 1.5f - g * f * f ); return f; } /* ================ Math::Log/Log2/Log10 Log of 0 is bad. I've also heard you're not really supposed to do log of negatives, yet they work fine. ================ */ OG_INLINE float Math::Log( float f ) { OG_ASSERT( f != 0.0f ); return logf( f ); } OG_INLINE float Math::Log2( float f ) { OG_ASSERT( f != 0.0f ); return INV_LN_2 * logf( f ); } OG_INLINE float Math::Log10( float f ) { OG_ASSERT( f != 0.0f ); return INV_LN_10 * logf( f ); } /* ================ Math::Pow ================ */ OG_INLINE float Math::Pow( float base, float exp ) { return powf( base, exp ); } /* ================ Math::Exp ================ */ OG_INLINE float Math::Exp( float f ) { return expf( f ); } /* ================ Math::IsPowerOfTwo ================ */ OG_INLINE bool Math::IsPowerOfTwo( int x ) { // This is the faster of the two known methods // with the x > 0 check moved to the beginning return x > 0 && ( x & ( x - 1 ) ) == 0; } /* ================ Math::HigherPowerOfTwo ================ */ OG_INLINE int Math::HigherPowerOfTwo( int x ) { x--; x |= x >> 1; x |= x >> 2; x |= x >> 4; x |= x >> 8; x |= x >> 16; return x + 1; } /* ================ Math::LowerPowerOfTwo ================ */ OG_INLINE int Math::LowerPowerOfTwo( int x ) { return HigherPowerOfTwo( x ) >> 1; } /* ================ Math::FloorPowerOfTwo ================ */ OG_INLINE int Math::FloorPowerOfTwo( int x ) { return IsPowerOfTwo( x ) ? x : LowerPowerOfTwo( x ); } /* ================ Math::CeilPowerOfTwo ================ */ OG_INLINE int Math::CeilPowerOfTwo( int x ) { return IsPowerOfTwo( x ) ? x : HigherPowerOfTwo( x ); } /* ================ Math::ClosestPowerOfTwo ================ */ OG_INLINE int Math::ClosestPowerOfTwo( int x ) { if ( IsPowerOfTwo( x ) ) return x; int high = HigherPowerOfTwo( x ); int low = high >> 1; return ((high-x) < (x-low)) ? high : low; } /* ================ Math::Digits ================ */ OG_INLINE int Math::Digits( int x ) { int digits = 1; int step = 10; while (step <= x) { digits++; step *= 10; } return digits; } /* ================ Math::Sin/ASin ================ */ OG_INLINE float Math::Sin( float f ) { return sinf( f ); } OG_INLINE float Math::ASin( float f ) { if ( f <= -1.0f ) return -HALF_PI; if ( f >= 1.0f ) return HALF_PI; return asinf( f ); } /* ================ Math::Cos/ACos ================ */ OG_INLINE float Math::Cos( float f ) { return cosf( f ); } OG_INLINE float Math::ACos( float f ) { if ( f <= -1.0f ) return PI; if ( f >= 1.0f ) return 0.0f; return acosf( f ); } /* ================ Math::Tan/ATan ================ */ OG_INLINE float Math::Tan( float f ) { return tanf( f ); } OG_INLINE float Math::ATan( float f ) { return atanf( f ); } OG_INLINE float Math::ATan( float f1, float f2 ) { return atan2f( f1, f2 ); } /* ================ Math::SinCos ================ */ OG_INLINE void Math::SinCos( float f, float &s, float &c ) { #if OG_ASM_MSVC // sometimes assembler is just waaayy faster _asm { fld f fsincos mov ecx, c mov edx, s fstp dword ptr [ecx] fstp dword ptr [edx] } #elif OG_ASM_GNU asm ("fsincos" : "=t" (c), "=u" (s) : "0" (f)); #else s = Sin(f); c = Sqrt( 1.0f - s * s ); // faster than calling Cos(f) #endif } /* ================ Math::Deg2Rad ================ */ OG_INLINE float Math::Deg2Rad( float f ) { return f * DEG_TO_RAD; } /* ================ Math::Rad2Deg ================ */ OG_INLINE float Math::Rad2Deg( float f ) { return f * RAD_TO_DEG; } /* ================ Math::Square ================ */ OG_INLINE float Math::Square( float v ) { return v * v; } /* ================ Math::Cube ================ */ OG_INLINE float Math::Cube( float v ) { return v * v * v; } /* ================ Math::Sec2Ms ================ */ OG_INLINE int Math::Sec2Ms( int sec ) { return sec * 1000; } /* ================ Math::Ms2Sec ================ */ OG_INLINE int Math::Ms2Sec( int ms ) { return FtoiFast( ms * 0.001f ); } } #endif ================================================ FILE: samples/C++/Memory16F88.h ================================================ /* * This file is part of PIC * Copyright © 2012 Rachel Mant (dx-mon@users.sourceforge.net) * * PIC is free software: you can redistribute it and/or modify * it under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * PIC is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU Lesser General Public License for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this program. If not, see . */ #include "Memory.h" class Memory16F88 : public Memory { private: uint8_t memory[512]; std::map memoryMap; public: Memory16F88(); uint8_t Dereference(uint8_t bank, uint8_t partialAddress); uint8_t *Reference(uint8_t bank, uint8_t partialAddress); uint8_t *operator [](uint32_t ref); }; ================================================ FILE: samples/C++/NoDiscard.h ================================================ //===--- NoDiscard.h ------------------------------------------------------===// // // This source file is part of the Swift.org open source project // // Copyright (c) 2014 - 2022 Apple Inc. and the Swift project authors // Licensed under Apache License v2.0 with Runtime Library Exception // // See https://swift.org/LICENSE.txt for license information // See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors // //===----------------------------------------------------------------------===// #ifndef SWIFT_BASIC_NODISCARD_H #define SWIFT_BASIC_NODISCARD_H #if __cplusplus > 201402l && __has_cpp_attribute(nodiscard) #define SWIFT_NODISCARD [[nodiscard]] #elif __has_cpp_attribute(clang::warn_unused_result) #define SWIFT_NODISCARD [[clang::warn_unused_result]] #else #define SWIFT_NODISCARD #endif #endif ================================================ FILE: samples/C++/PackageInfoParser.cpp ================================================ /* * Copyright 2011, Oliver Tappe * Copyright 2016, Andrew Lindesay * Distributed under the terms of the MIT License. * * Source - https://github.com/haiku/haiku/blob/73e180c9b965aaeb034055453e153bc3adf47917/src/kits/package/PackageInfoParser.cpp */ #include "PackageInfoParser.h" #include #include #include #include #include #include namespace BPackageKit { BPackageInfo::ParseErrorListener::~ParseErrorListener() { } BPackageInfo::Parser::Parser(ParseErrorListener* listener) : fListener(listener), fPos(NULL) { } status_t BPackageInfo::Parser::Parse(const BString& packageInfoString, BPackageInfo* packageInfo) { if (packageInfo == NULL) return B_BAD_VALUE; fPos = packageInfoString.String(); try { _Parse(packageInfo); } catch (const ParseError& error) { if (fListener != NULL) { // map error position to line and column int line = 1; int inLineOffset; int32 offset = error.pos - packageInfoString.String(); int32 newlinePos = packageInfoString.FindLast('\n', offset - 1); if (newlinePos < 0) inLineOffset = offset; else { inLineOffset = offset - newlinePos - 1; do { line++; newlinePos = packageInfoString.FindLast('\n', newlinePos - 1); } while (newlinePos >= 0); } int column = 0; for (int i = 0; i < inLineOffset; i++) { column++; if (error.pos[i - inLineOffset] == '\t') column = (column + 3) / 4 * 4; } fListener->OnError(error.message, line, column + 1); } return B_BAD_DATA; } catch (const std::bad_alloc& e) { if (fListener != NULL) fListener->OnError("out of memory", 0, 0); return B_NO_MEMORY; } return B_OK; } status_t BPackageInfo::Parser::ParseVersion(const BString& versionString, bool revisionIsOptional, BPackageVersion& _version) { fPos = versionString.String(); try { Token token(TOKEN_STRING, fPos, versionString.Length()); _ParseVersionValue(token, &_version, revisionIsOptional); } catch (const ParseError& error) { if (fListener != NULL) { int32 offset = error.pos - versionString.String(); fListener->OnError(error.message, 1, offset); } return B_BAD_DATA; } catch (const std::bad_alloc& e) { if (fListener != NULL) fListener->OnError("out of memory", 0, 0); return B_NO_MEMORY; } return B_OK; } status_t BPackageInfo::Parser::ParseResolvableExpression(const BString& expressionString, BPackageResolvableExpression& _expression) { fPos = expressionString.String(); try { Token token(TOKEN_STRING, fPos, expressionString.Length()); _ParseResolvableExpression(_NextToken(), _expression, NULL); } catch (const ParseError& error) { if (fListener != NULL) { int32 offset = error.pos - expressionString.String(); fListener->OnError(error.message, 1, offset); } return B_BAD_DATA; } catch (const std::bad_alloc& e) { if (fListener != NULL) fListener->OnError("out of memory", 0, 0); return B_NO_MEMORY; } return B_OK; } BPackageInfo::Parser::Token BPackageInfo::Parser::_NextToken() { // Eat any whitespace, comments, or escaped new lines. Also eat ';' -- they // have the same function as newlines. We remember the last encountered ';' // or '\n' and return it as a token afterwards. const char* itemSeparatorPos = NULL; bool inComment = false; while ((inComment && *fPos != '\0') || isspace(*fPos) || *fPos == ';' || *fPos == '#' || *fPos == '\\') { if (*fPos == '#') { inComment = true; } else if (!inComment && *fPos == '\\') { if (fPos[1] != '\n') break; // ignore escaped line breaks fPos++; } else if (*fPos == '\n') { itemSeparatorPos = fPos; inComment = false; } else if (!inComment && *fPos == ';') itemSeparatorPos = fPos; fPos++; } if (itemSeparatorPos != NULL) { return Token(TOKEN_ITEM_SEPARATOR, itemSeparatorPos); } const char* tokenPos = fPos; switch (*fPos) { case '\0': return Token(TOKEN_EOF, fPos); case '{': fPos++; return Token(TOKEN_OPEN_BRACE, tokenPos); case '}': fPos++; return Token(TOKEN_CLOSE_BRACE, tokenPos); case '<': fPos++; if (*fPos == '=') { fPos++; return Token(TOKEN_OPERATOR_LESS_EQUAL, tokenPos, 2); } return Token(TOKEN_OPERATOR_LESS, tokenPos, 1); case '=': fPos++; if (*fPos == '=') { fPos++; return Token(TOKEN_OPERATOR_EQUAL, tokenPos, 2); } return Token(TOKEN_OPERATOR_ASSIGN, tokenPos, 1); case '!': if (fPos[1] == '=') { fPos += 2; return Token(TOKEN_OPERATOR_NOT_EQUAL, tokenPos, 2); } break; case '>': fPos++; if (*fPos == '=') { fPos++; return Token(TOKEN_OPERATOR_GREATER_EQUAL, tokenPos, 2); } return Token(TOKEN_OPERATOR_GREATER, tokenPos, 1); default: { std::string string; char quoteChar = '\0'; for (; *fPos != '\0'; fPos++) { char c = *fPos; if (quoteChar != '\0') { // within a quoted string segment if (c == quoteChar) { quoteChar = '\0'; continue; } if (c == '\\') { // next char is escaped c = *++fPos; if (c == '\0') { throw ParseError("unterminated quoted-string", tokenPos); } if (c == 'n') c = '\n'; else if (c == 't') c = '\t'; } string += c; } else { // unquoted string segment switch (c) { case '"': case '\'': // quoted string start quoteChar = c; continue; case '{': case '}': case '<': case '=': case '!': case '>': // a separator character -- this ends the string break; case '\\': // next char is escaped c = *++fPos; if (c == '\0') { throw ParseError("'\\' at end of string", tokenPos); } string += c; continue; default: if (isspace(c)) break; string += c; continue; } break; } } return Token(TOKEN_STRING, tokenPos, fPos - tokenPos, string.c_str()); } } BString error = BString("unknown token '") << *fPos << "' encountered"; throw ParseError(error.String(), fPos); } void BPackageInfo::Parser::_RewindTo(const Token& token) { fPos = token.pos; } void BPackageInfo::Parser::_ParseStringValue(BString* value, const char** _tokenPos) { Token string = _NextToken(); if (string.type != TOKEN_STRING) throw ParseError("expected string", string.pos); *value = string.text; if (_tokenPos != NULL) *_tokenPos = string.pos; } void BPackageInfo::Parser::_ParseArchitectureValue(BPackageArchitecture* value) { Token arch = _NextToken(); if (arch.type == TOKEN_STRING) { for (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) { if (arch.text.ICompare(BPackageInfo::kArchitectureNames[i]) == 0) { *value = (BPackageArchitecture)i; return; } } } BString error("architecture must be one of: ["); for (int i = 0; i < B_PACKAGE_ARCHITECTURE_ENUM_COUNT; ++i) { if (i > 0) error << ","; error << BPackageInfo::kArchitectureNames[i]; } error << "]"; throw ParseError(error, arch.pos); } void BPackageInfo::Parser::_ParseVersionValue(BPackageVersion* value, bool revisionIsOptional) { Token word = _NextToken(); _ParseVersionValue(word, value, revisionIsOptional); } /*static*/ void BPackageInfo::Parser::_ParseVersionValue(Token& word, BPackageVersion* value, bool revisionIsOptional) { if (word.type != TOKEN_STRING) throw ParseError("expected string (a version)", word.pos); // get the revision number uint32 revision = 0; int32 dashPos = word.text.FindLast('-'); if (dashPos >= 0) { char* end; long long number = strtoll(word.text.String() + dashPos + 1, &end, 0); if (*end != '\0' || number < 0 || number > UINT_MAX) { throw ParseError("revision must be a number > 0 and < UINT_MAX", word.pos + dashPos + 1); } revision = (uint32)number; word.text.Truncate(dashPos); } if (revision == 0 && !revisionIsOptional) { throw ParseError("expected revision number (- suffix)", word.pos + word.text.Length()); } // get the pre-release string BString preRelease; int32 tildePos = word.text.FindLast('~'); if (tildePos >= 0) { word.text.CopyInto(preRelease, tildePos + 1, word.text.Length() - tildePos - 1); word.text.Truncate(tildePos); if (preRelease.IsEmpty()) { throw ParseError("invalid empty pre-release string", word.pos + tildePos + 1); } int32 errorPos; if (!_IsAlphaNumUnderscore(preRelease, ".", &errorPos)) { throw ParseError("invalid character in pre-release string", word.pos + tildePos + 1 + errorPos); } } // get major, minor, and micro strings BString major; BString minor; BString micro; int32 firstDotPos = word.text.FindFirst('.'); if (firstDotPos < 0) major = word.text; else { word.text.CopyInto(major, 0, firstDotPos); int32 secondDotPos = word.text.FindFirst('.', firstDotPos + 1); if (secondDotPos == firstDotPos + 1) throw ParseError("expected minor version", word.pos + secondDotPos); if (secondDotPos < 0) { word.text.CopyInto(minor, firstDotPos + 1, word.text.Length()); } else { word.text.CopyInto(minor, firstDotPos + 1, secondDotPos - (firstDotPos + 1)); word.text.CopyInto(micro, secondDotPos + 1, word.text.Length()); int32 errorPos; if (!_IsAlphaNumUnderscore(micro, ".", &errorPos)) { throw ParseError("invalid character in micro version string", word.pos + secondDotPos + 1 + errorPos); } } int32 errorPos; if (!_IsAlphaNumUnderscore(minor, "", &errorPos)) { throw ParseError("invalid character in minor version string", word.pos + firstDotPos + 1 + errorPos); } } int32 errorPos; if (!_IsAlphaNumUnderscore(major, "", &errorPos)) { throw ParseError("invalid character in major version string", word.pos + errorPos); } value->SetTo(major, minor, micro, preRelease, revision); } void BPackageInfo::Parser::_ParseResolvableExpression(const Token& token, BPackageResolvableExpression& _value, BString* _basePackage) { if (token.type != TOKEN_STRING) { throw ParseError("expected word (a resolvable name)", token.pos); } int32 errorPos; if (!_IsValidResolvableName(token.text, &errorPos)) { throw ParseError("invalid character in resolvable name", token.pos + errorPos); } BPackageVersion version; Token op = _NextToken(); BPackageResolvableOperator resolvableOperator; if (op.type == TOKEN_OPERATOR_LESS || op.type == TOKEN_OPERATOR_LESS_EQUAL || op.type == TOKEN_OPERATOR_EQUAL || op.type == TOKEN_OPERATOR_NOT_EQUAL || op.type == TOKEN_OPERATOR_GREATER_EQUAL || op.type == TOKEN_OPERATOR_GREATER) { _ParseVersionValue(&version, true); if (_basePackage != NULL) { Token base = _NextToken(); if (base.type == TOKEN_STRING && base.text == "base") { if (!_basePackage->IsEmpty()) { throw ParseError("multiple packages marked as base package", token.pos); } *_basePackage = token.text; } else _RewindTo(base); } resolvableOperator = (BPackageResolvableOperator) (op.type - TOKEN_OPERATOR_LESS); } else if (op.type == TOKEN_ITEM_SEPARATOR || op.type == TOKEN_CLOSE_BRACE || op.type == TOKEN_EOF) { _RewindTo(op); resolvableOperator = B_PACKAGE_RESOLVABLE_OP_ENUM_COUNT; } else { throw ParseError( "expected '<', '<=', '==', '!=', '>=', '>', comma or '}'", op.pos); } _value.SetTo(token.text, resolvableOperator, version); } void BPackageInfo::Parser::_ParseList(ListElementParser& elementParser, bool allowSingleNonListElement) { Token openBracket = _NextToken(); if (openBracket.type != TOKEN_OPEN_BRACE) { if (!allowSingleNonListElement) throw ParseError("expected start of list ('{')", openBracket.pos); elementParser(openBracket); return; } while (true) { Token token = _NextToken(); if (token.type == TOKEN_CLOSE_BRACE) return; if (token.type == TOKEN_ITEM_SEPARATOR) continue; elementParser(token); } } void BPackageInfo::Parser::_ParseStringList(BStringList* value, bool requireResolvableName, bool convertToLowerCase, StringValidator* stringValidator) { struct StringParser : public ListElementParser { BStringList* value; bool requireResolvableName; bool convertToLowerCase; StringValidator* stringValidator; StringParser(BStringList* value, bool requireResolvableName, bool convertToLowerCase, StringValidator* stringValidator) : value(value), requireResolvableName(requireResolvableName), convertToLowerCase(convertToLowerCase), stringValidator(stringValidator) { } virtual void operator()(const Token& token) { if (token.type != TOKEN_STRING) throw ParseError("expected string", token.pos); if (requireResolvableName) { int32 errorPos; if (!_IsValidResolvableName(token.text, &errorPos)) { throw ParseError("invalid character in resolvable name", token.pos + errorPos); } } BString element(token.text); if (convertToLowerCase) element.ToLower(); if (stringValidator != NULL) stringValidator->Validate(element, token.pos); value->Add(element); } } stringParser(value, requireResolvableName, convertToLowerCase, stringValidator); _ParseList(stringParser, true); } uint32 BPackageInfo::Parser::_ParseFlags() { struct FlagParser : public ListElementParser { uint32 flags; FlagParser() : flags(0) { } virtual void operator()(const Token& token) { if (token.type != TOKEN_STRING) throw ParseError("expected word (a flag)", token.pos); if (token.text.ICompare("approve_license") == 0) flags |= B_PACKAGE_FLAG_APPROVE_LICENSE; else if (token.text.ICompare("system_package") == 0) flags |= B_PACKAGE_FLAG_SYSTEM_PACKAGE; else { throw ParseError( "expected 'approve_license' or 'system_package'", token.pos); } } } flagParser; _ParseList(flagParser, true); return flagParser.flags; } void BPackageInfo::Parser::_ParseResolvableList( BObjectList* value) { struct ResolvableParser : public ListElementParser { Parser& parser; BObjectList* value; ResolvableParser(Parser& parser_, BObjectList* value_) : parser(parser_), value(value_) { } virtual void operator()(const Token& token) { if (token.type != TOKEN_STRING) { throw ParseError("expected word (a resolvable name)", token.pos); } int32 errorPos; if (!_IsValidResolvableName(token.text, &errorPos)) { throw ParseError("invalid character in resolvable name", token.pos + errorPos); } // parse version BPackageVersion version; Token op = parser._NextToken(); if (op.type == TOKEN_OPERATOR_ASSIGN) { parser._ParseVersionValue(&version, true); } else if (op.type == TOKEN_ITEM_SEPARATOR || op.type == TOKEN_CLOSE_BRACE) { parser._RewindTo(op); } else throw ParseError("expected '=', comma or '}'", op.pos); // parse compatible version BPackageVersion compatibleVersion; Token compatible = parser._NextToken(); if (compatible.type == TOKEN_STRING && (compatible.text == "compat" || compatible.text == "compatible")) { op = parser._NextToken(); if (op.type == TOKEN_OPERATOR_GREATER_EQUAL) { parser._ParseVersionValue(&compatibleVersion, true); } else parser._RewindTo(compatible); } else parser._RewindTo(compatible); value->AddItem(new BPackageResolvable(token.text, version, compatibleVersion)); } } resolvableParser(*this, value); _ParseList(resolvableParser, false); } void BPackageInfo::Parser::_ParseResolvableExprList( BObjectList* value, BString* _basePackage) { struct ResolvableExpressionParser : public ListElementParser { Parser& parser; BObjectList* value; BString* basePackage; ResolvableExpressionParser(Parser& parser, BObjectList* value, BString* basePackage) : parser(parser), value(value), basePackage(basePackage) { } virtual void operator()(const Token& token) { BPackageResolvableExpression expression; parser._ParseResolvableExpression(token, expression, basePackage); value->AddItem(new BPackageResolvableExpression(expression)); } } resolvableExpressionParser(*this, value, _basePackage); _ParseList(resolvableExpressionParser, false); } void BPackageInfo::Parser::_ParseGlobalWritableFileInfos( GlobalWritableFileInfoList* infos) { struct GlobalWritableFileInfoParser : public ListElementParser { Parser& parser; GlobalWritableFileInfoList* infos; GlobalWritableFileInfoParser(Parser& parser, GlobalWritableFileInfoList* infos) : parser(parser), infos(infos) { } virtual void operator()(const Token& token) { if (token.type != TOKEN_STRING) { throw ParseError("expected string (a file path)", token.pos); } BWritableFileUpdateType updateType = B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT; bool isDirectory = false; Token nextToken = parser._NextToken(); if (nextToken.type == TOKEN_STRING && nextToken.text == "directory") { isDirectory = true; nextToken = parser._NextToken(); } if (nextToken.type == TOKEN_STRING) { const char* const* end = kWritableFileUpdateTypes + B_WRITABLE_FILE_UPDATE_TYPE_ENUM_COUNT; const char* const* found = std::find(kWritableFileUpdateTypes, end, nextToken.text); if (found == end) { throw ParseError(BString("expected an update type"), nextToken.pos); } updateType = (BWritableFileUpdateType)( found - kWritableFileUpdateTypes); } else if (nextToken.type == TOKEN_ITEM_SEPARATOR || nextToken.type == TOKEN_CLOSE_BRACE) { parser._RewindTo(nextToken); } else { throw ParseError( "expected 'included', semicolon, new line or '}'", nextToken.pos); } if (!infos->AddItem(new BGlobalWritableFileInfo(token.text, updateType, isDirectory))) { throw std::bad_alloc(); } } } resolvableExpressionParser(*this, infos); _ParseList(resolvableExpressionParser, false); } void BPackageInfo::Parser::_ParseUserSettingsFileInfos( UserSettingsFileInfoList* infos) { struct UserSettingsFileInfoParser : public ListElementParser { Parser& parser; UserSettingsFileInfoList* infos; UserSettingsFileInfoParser(Parser& parser, UserSettingsFileInfoList* infos) : parser(parser), infos(infos) { } virtual void operator()(const Token& token) { if (token.type != TOKEN_STRING) { throw ParseError("expected string (a settings file path)", token.pos); } BString templatePath; bool isDirectory = false; Token nextToken = parser._NextToken(); if (nextToken.type == TOKEN_STRING && nextToken.text == "directory") { isDirectory = true; } else if (nextToken.type == TOKEN_STRING && nextToken.text == "template") { nextToken = parser._NextToken(); if (nextToken.type != TOKEN_STRING) { throw ParseError( "expected string (a settings template file path)", nextToken.pos); } templatePath = nextToken.text; } else if (nextToken.type == TOKEN_ITEM_SEPARATOR || nextToken.type == TOKEN_CLOSE_BRACE) { parser._RewindTo(nextToken); } else { throw ParseError( "expected 'template', semicolon, new line or '}'", nextToken.pos); } if (isDirectory ? !infos->AddItem(new BUserSettingsFileInfo(token.text, true)) : !infos->AddItem(new BUserSettingsFileInfo(token.text, templatePath))) { throw std::bad_alloc(); } } } resolvableExpressionParser(*this, infos); _ParseList(resolvableExpressionParser, false); } void BPackageInfo::Parser::_ParseUsers(UserList* users) { struct UserParser : public ListElementParser { Parser& parser; UserList* users; UserParser(Parser& parser, UserList* users) : parser(parser), users(users) { } virtual void operator()(const Token& token) { if (token.type != TOKEN_STRING || !BUser::IsValidUserName(token.text)) { throw ParseError("expected a user name", token.pos); } BString realName; BString home; BString shell; BStringList groups; for (;;) { Token nextToken = parser._NextToken(); if (nextToken.type != TOKEN_STRING) { parser._RewindTo(nextToken); break; } if (nextToken.text == "real-name") { nextToken = parser._NextToken(); if (nextToken.type != TOKEN_STRING) { throw ParseError("expected string (a user real name)", nextToken.pos); } realName = nextToken.text; } else if (nextToken.text == "home") { nextToken = parser._NextToken(); if (nextToken.type != TOKEN_STRING) { throw ParseError("expected string (a home path)", nextToken.pos); } home = nextToken.text; } else if (nextToken.text == "shell") { nextToken = parser._NextToken(); if (nextToken.type != TOKEN_STRING) { throw ParseError("expected string (a shell path)", nextToken.pos); } shell = nextToken.text; } else if (nextToken.text == "groups") { for (;;) { nextToken = parser._NextToken(); if (nextToken.type == TOKEN_STRING && BUser::IsValidUserName(nextToken.text)) { if (!groups.Add(nextToken.text)) throw std::bad_alloc(); } else if (nextToken.type == TOKEN_ITEM_SEPARATOR || nextToken.type == TOKEN_CLOSE_BRACE) { parser._RewindTo(nextToken); break; } else { throw ParseError("expected a group name", nextToken.pos); } } break; } else { throw ParseError( "expected 'real-name', 'home', 'shell', or 'groups'", nextToken.pos); } } BString templatePath; Token nextToken = parser._NextToken(); if (nextToken.type == TOKEN_STRING && nextToken.text == "template") { nextToken = parser._NextToken(); if (nextToken.type != TOKEN_STRING) { throw ParseError( "expected string (a settings template file path)", nextToken.pos); } templatePath = nextToken.text; } else if (nextToken.type == TOKEN_ITEM_SEPARATOR || nextToken.type == TOKEN_CLOSE_BRACE) { parser._RewindTo(nextToken); } else { throw ParseError( "expected 'template', semicolon, new line or '}'", nextToken.pos); } if (!users->AddItem(new BUser(token.text, realName, home, shell, groups))) { throw std::bad_alloc(); } } } resolvableExpressionParser(*this, users); _ParseList(resolvableExpressionParser, false); } void BPackageInfo::Parser::_Parse(BPackageInfo* packageInfo) { bool seen[B_PACKAGE_INFO_ENUM_COUNT]; for (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; ++i) seen[i] = false; const char* const* names = BPackageInfo::kElementNames; while (Token t = _NextToken()) { if (t.type == TOKEN_ITEM_SEPARATOR) continue; if (t.type != TOKEN_STRING) throw ParseError("expected string (a variable name)", t.pos); BPackageInfoAttributeID attribute = B_PACKAGE_INFO_ENUM_COUNT; for (int i = 0; i < B_PACKAGE_INFO_ENUM_COUNT; i++) { if (names[i] != NULL && t.text.ICompare(names[i]) == 0) { attribute = (BPackageInfoAttributeID)i; break; } } if (attribute == B_PACKAGE_INFO_ENUM_COUNT) { BString error = BString("unknown attribute \"") << t.text << '"'; throw ParseError(error, t.pos); } if (seen[attribute]) { BString error = BString(names[attribute]) << " already seen!"; throw ParseError(error, t.pos); } switch (attribute) { case B_PACKAGE_INFO_NAME: { BString name; const char* namePos; _ParseStringValue(&name, &namePos); int32 errorPos; if (!_IsValidResolvableName(name, &errorPos)) { throw ParseError("invalid character in package name", namePos + errorPos); } packageInfo->SetName(name); break; } case B_PACKAGE_INFO_SUMMARY: { BString summary; _ParseStringValue(&summary); if (summary.FindFirst('\n') >= 0) throw ParseError("the summary contains linebreaks", t.pos); packageInfo->SetSummary(summary); break; } case B_PACKAGE_INFO_DESCRIPTION: _ParseStringValue(&packageInfo->fDescription); break; case B_PACKAGE_INFO_VENDOR: _ParseStringValue(&packageInfo->fVendor); break; case B_PACKAGE_INFO_PACKAGER: _ParseStringValue(&packageInfo->fPackager); break; case B_PACKAGE_INFO_BASE_PACKAGE: _ParseStringValue(&packageInfo->fBasePackage); break; case B_PACKAGE_INFO_ARCHITECTURE: _ParseArchitectureValue(&packageInfo->fArchitecture); break; case B_PACKAGE_INFO_VERSION: _ParseVersionValue(&packageInfo->fVersion, false); break; case B_PACKAGE_INFO_COPYRIGHTS: _ParseStringList(&packageInfo->fCopyrightList); break; case B_PACKAGE_INFO_LICENSES: _ParseStringList(&packageInfo->fLicenseList); break; case B_PACKAGE_INFO_URLS: { UrlStringValidator stringValidator; _ParseStringList(&packageInfo->fURLList, false, false, &stringValidator); } break; case B_PACKAGE_INFO_SOURCE_URLS: { UrlStringValidator stringValidator; _ParseStringList(&packageInfo->fSourceURLList, false, false, &stringValidator); } break; case B_PACKAGE_INFO_GLOBAL_WRITABLE_FILES: _ParseGlobalWritableFileInfos( &packageInfo->fGlobalWritableFileInfos); break; case B_PACKAGE_INFO_USER_SETTINGS_FILES: _ParseUserSettingsFileInfos( &packageInfo->fUserSettingsFileInfos); break; case B_PACKAGE_INFO_USERS: _ParseUsers(&packageInfo->fUsers); break; case B_PACKAGE_INFO_GROUPS: _ParseStringList(&packageInfo->fGroups); break; case B_PACKAGE_INFO_POST_INSTALL_SCRIPTS: _ParseStringList(&packageInfo->fPostInstallScripts); break; case B_PACKAGE_INFO_PROVIDES: _ParseResolvableList(&packageInfo->fProvidesList); break; case B_PACKAGE_INFO_REQUIRES: packageInfo->fBasePackage.Truncate(0); _ParseResolvableExprList(&packageInfo->fRequiresList, &packageInfo->fBasePackage); break; case B_PACKAGE_INFO_SUPPLEMENTS: _ParseResolvableExprList(&packageInfo->fSupplementsList); break; case B_PACKAGE_INFO_CONFLICTS: _ParseResolvableExprList(&packageInfo->fConflictsList); break; case B_PACKAGE_INFO_FRESHENS: _ParseResolvableExprList(&packageInfo->fFreshensList); break; case B_PACKAGE_INFO_REPLACES: _ParseStringList(&packageInfo->fReplacesList, true); break; case B_PACKAGE_INFO_FLAGS: packageInfo->SetFlags(_ParseFlags()); break; default: // can never get here break; } seen[attribute] = true; } // everything up to and including 'provides' is mandatory for (int i = 0; i <= B_PACKAGE_INFO_PROVIDES; ++i) { if (!seen[i]) { BString error = BString(names[i]) << " is not being set anywhere!"; throw ParseError(error, fPos); } } } /*static*/ inline bool BPackageInfo::Parser::_IsAlphaNumUnderscore(const BString& string, const char* additionalChars, int32* _errorPos) { return _IsAlphaNumUnderscore(string.String(), string.String() + string.Length(), additionalChars, _errorPos); } /*static*/ inline bool BPackageInfo::Parser::_IsAlphaNumUnderscore(const char* string, const char* additionalChars, int32* _errorPos) { return _IsAlphaNumUnderscore(string, string + strlen(string), additionalChars, _errorPos); } /*static*/ bool BPackageInfo::Parser::_IsAlphaNumUnderscore(const char* start, const char* end, const char* additionalChars, int32* _errorPos) { for (const char* c = start; c < end; c++) { if (!isalnum(*c) && *c != '_' && strchr(additionalChars, *c) == NULL) { if (_errorPos != NULL) *_errorPos = c - start; return false; } } return true; } /*static*/ bool BPackageInfo::Parser::_IsValidResolvableName(const char* string, int32* _errorPos) { for (const char* c = string; *c != '\0'; c++) { switch (*c) { case '-': case '/': case '<': case '>': case '=': case '!': break; default: if (!isspace(*c)) continue; break; } if (_errorPos != NULL) *_errorPos = c - string; return false; } return true; } void BPackageInfo::Parser::UrlStringValidator::Validate(const BString& urlString, const char* pos) { BUrl url(urlString); if (!url.IsValid()) throw ParseError("invalid url", pos); } } // namespace BPackageKit ================================================ FILE: samples/C++/ThreadedQueue.h ================================================ /* * This file is part of IRCBot * Copyright © 2014 Rachel Mant (dx-mon@users.sourceforge.net) * * IRCBot is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * IRCBot is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef __THREADED_QUEUE_H__ #define __THREADED_QUEUE_H__ #include #include template class ThreadedQueue : public std::queue { private: pthread_mutex_t queueMutex; pthread_cond_t queueCond; public: ThreadedQueue() { pthread_mutexattr_t mutexAttrs; pthread_condattr_t condAttrs; pthread_mutexattr_init(&mutexAttrs); pthread_mutexattr_settype(&mutexAttrs, PTHREAD_MUTEX_ERRORCHECK); pthread_mutex_init(&queueMutex, &mutexAttrs); pthread_mutexattr_destroy(&mutexAttrs); pthread_condattr_init(&condAttrs); pthread_condattr_setpshared(&condAttrs, PTHREAD_PROCESS_PRIVATE); pthread_cond_init(&queueCond, &condAttrs); pthread_condattr_destroy(&condAttrs); } ~ThreadedQueue() { pthread_cond_destroy(&queueCond); pthread_mutex_destroy(&queueMutex); } void waitItems() { pthread_mutex_lock(&queueMutex); pthread_cond_wait(&queueCond, &queueMutex); pthread_mutex_unlock(&queueMutex); } void signalItems() { pthread_mutex_lock(&queueMutex); pthread_cond_broadcast(&queueCond); pthread_mutex_unlock(&queueMutex); } void push(T item) { std::queue::push(item); signalItems(); } }; #endif /*__THREADED_QUEUE_H__*/ ================================================ FILE: samples/C++/Types.h ================================================ /***************************************************************************** * Dwarf Mine - The 13-11 Benchmark * * Copyright (c) 2013 Bünger, Thomas; Kieschnick, Christian; Kusber, * Michael; Lohse, Henning; Wuttke, Nikolai; Xylander, Oliver; Yao, Gary; * Zimmermann, Florian * * Permission is hereby granted, free of charge, to any person obtaining * a copy of this software and associated documentation files (the * "Software"), to deal in the Software without restriction, including * without limitation the rights to use, copy, modify, merge, publish, * distribute, sublicense, and/or sell copies of the Software, and to * permit persons to whom the Software is furnished to do so, subject to * the following conditions: * * The above copyright notice and this permission notice shall be * included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. *****************************************************************************/ #pragma once #include typedef uint32_t smallPrime_t; ================================================ FILE: samples/C++/bar.h ================================================ class Bar { protected: char *name; public: void hello(); } ================================================ FILE: samples/C++/bar.hh ================================================ class Bar { protected: char *name; public: void hello(); } ================================================ FILE: samples/C++/bar.hpp ================================================ class Bar { protected: char *name; public: void hello(); } ================================================ FILE: samples/C++/bug1163046.--skeleton.re ================================================ #include #define YYCTYPE unsigned char #define YYCURSOR cursor #define YYLIMIT cursor #define YYMARKER marker #define YYFILL(n) bool scan(const char *text) { YYCTYPE *start = (YYCTYPE *)text; YYCTYPE *cursor = (YYCTYPE *)text; YYCTYPE *marker = (YYCTYPE *)text; next: YYCTYPE *token = cursor; /*!re2c '(This file must be converted with BinHex 4.0)' { if (token == start || *(token - 1) == '\n') return true; else goto next; } [\001-\377] { goto next; } [\000] { return false; } */ return false; } #define do_scan(str, expect) \ res = scan(str) == expect ? 0 : 1; \ std::cerr << str << "\t-\t" << (res ? "fail" : "ok") << std::endl; \ result += res /*!max:re2c */ int main(int,void**) { int res, result = 0; do_scan("(This file must be converted with BinHex 4.0)", 1); do_scan("x(This file must be converted with BinHex 4.0)", 0); do_scan("(This file must be converted with BinHex 4.0)x", 1); do_scan("x(This file must be converted with BinHex 4.0)x", 0); return result; } ================================================ FILE: samples/C++/cnokw.re ================================================ #include #include #include #define ADDEQ 257 #define ANDAND 258 #define ANDEQ 259 #define ARRAY 260 #define ASM 261 #define AUTO 262 #define BREAK 263 #define CASE 264 #define CHAR 265 #define CONST 266 #define CONTINUE 267 #define DECR 268 #define DEFAULT 269 #define DEREF 270 #define DIVEQ 271 #define DO 272 #define DOUBLE 273 #define ELLIPSIS 274 #define ELSE 275 #define ENUM 276 #define EQL 277 #define EXTERN 278 #define FCON 279 #define FLOAT 280 #define FOR 281 #define FUNCTION 282 #define GEQ 283 #define GOTO 284 #define ICON 285 #define ID 286 #define IF 287 #define INCR 288 #define INT 289 #define LEQ 290 #define LONG 291 #define LSHIFT 292 #define LSHIFTEQ 293 #define MODEQ 294 #define MULEQ 295 #define NEQ 296 #define OREQ 297 #define OROR 298 #define POINTER 299 #define REGISTER 300 #define RETURN 301 #define RSHIFT 302 #define RSHIFTEQ 303 #define SCON 304 #define SHORT 305 #define SIGNED 306 #define SIZEOF 307 #define STATIC 308 #define STRUCT 309 #define SUBEQ 310 #define SWITCH 311 #define TYPEDEF 312 #define UNION 313 #define UNSIGNED 314 #define VOID 315 #define VOLATILE 316 #define WHILE 317 #define XOREQ 318 #define EOI 319 typedef unsigned int uint; typedef unsigned char uchar; #define BSIZE 8192 #define YYCTYPE uchar #define YYCURSOR cursor #define YYLIMIT s->lim #define YYMARKER s->ptr #define YYFILL(n) {cursor = fill(s, cursor);} #define RET(i) {s->cur = cursor; return i;} typedef struct Scanner { int fd; uchar *bot, *tok, *ptr, *cur, *pos, *lim, *top, *eof; uint line; } Scanner; uchar *fill(Scanner *s, uchar *cursor){ if(!s->eof){ uint cnt = s->tok - s->bot; if(cnt){ memcpy(s->bot, s->tok, s->lim - s->tok); s->tok = s->bot; s->ptr -= cnt; cursor -= cnt; s->pos -= cnt; s->lim -= cnt; } if((s->top - s->lim) < BSIZE){ uchar *buf = (uchar*) malloc(((s->lim - s->bot) + BSIZE)*sizeof(uchar)); memcpy(buf, s->tok, s->lim - s->tok); s->tok = buf; s->ptr = &buf[s->ptr - s->bot]; cursor = &buf[cursor - s->bot]; s->pos = &buf[s->pos - s->bot]; s->lim = &buf[s->lim - s->bot]; s->top = &s->lim[BSIZE]; free(s->bot); s->bot = buf; } if((cnt = read(s->fd, (char*) s->lim, BSIZE)) != BSIZE){ s->eof = &s->lim[cnt]; *(s->eof)++ = '\n'; } s->lim += cnt; } return cursor; } int scan(Scanner *s){ uchar *cursor = s->cur; std: s->tok = cursor; /*!re2c any = [\000-\377]; O = [0-7]; D = [0-9]; L = [a-zA-Z_]; H = [a-fA-F0-9]; E = [Ee] [+-]? D+; FS = [fFlL]; IS = [uUlL]*; ESC = [\\] ([abfnrtv?'"\\] | "x" H+ | O+); */ /*!re2c "/*" { goto comment; } L (L|D)* { RET(ID); } ("0" [xX] H+ IS?) | ("0" D+ IS?) | (D+ IS?) | (['] (ESC|any\[\n\\'])* [']) { RET(ICON); } (D+ E FS?) | (D* "." D+ E? FS?) | (D+ "." D* E? FS?) { RET(FCON); } (["] (ESC|any\[\n\\"])* ["]) { RET(SCON); } "..." { RET(ELLIPSIS); } ">>=" { RET(RSHIFTEQ); } "<<=" { RET(LSHIFTEQ); } "+=" { RET(ADDEQ); } "-=" { RET(SUBEQ); } "*=" { RET(MULEQ); } "/=" { RET(DIVEQ); } "%=" { RET(MODEQ); } "&=" { RET(ANDEQ); } "^=" { RET(XOREQ); } "|=" { RET(OREQ); } ">>" { RET(RSHIFT); } "<<" { RET(LSHIFT); } "++" { RET(INCR); } "--" { RET(DECR); } "->" { RET(DEREF); } "&&" { RET(ANDAND); } "||" { RET(OROR); } "<=" { RET(LEQ); } ">=" { RET(GEQ); } "==" { RET(EQL); } "!=" { RET(NEQ); } ";" { RET(';'); } "{" { RET('{'); } "}" { RET('}'); } "," { RET(','); } ":" { RET(':'); } "=" { RET('='); } "(" { RET('('); } ")" { RET(')'); } "[" { RET('['); } "]" { RET(']'); } "." { RET('.'); } "&" { RET('&'); } "!" { RET('!'); } "~" { RET('~'); } "-" { RET('-'); } "+" { RET('+'); } "*" { RET('*'); } "/" { RET('/'); } "%" { RET('%'); } "<" { RET('<'); } ">" { RET('>'); } "^" { RET('^'); } "|" { RET('|'); } "?" { RET('?'); } [ \t\v\f]+ { goto std; } "\n" { if(cursor == s->eof) RET(EOI); s->pos = cursor; s->line++; goto std; } any { printf("unexpected character: %c\n", *s->tok); goto std; } */ comment: /*!re2c "*/" { goto std; } "\n" { if(cursor == s->eof) RET(EOI); s->tok = s->pos = cursor; s->line++; goto comment; } any { goto comment; } */ } main(){ Scanner in; int t; memset((char*) &in, 0, sizeof(in)); in.fd = 0; while((t = scan(&in)) != EOI){ /* printf("%d\t%.*s\n", t, in.cur - in.tok, in.tok); printf("%d\n", t); */ } close(in.fd); } ================================================ FILE: samples/C++/constexpr_header.h ================================================ constexpr double VERSION_NUMBER {1.2}; constexpr int FRAME_RATE {60}; constexpr int MIN_FRAME_RATE {30}; ================================================ FILE: samples/C++/crypter.cpp ================================================ // Copyright (c) 2009-2012 The Bitcoin Developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. // Source - https://github.com/Bradfrogger/Marvelous/blob/master/src/crypter.cpp #include #include #include #include #ifdef WIN32 #include #endif #include "crypter.h" bool CCrypter::SetKeyFromPassphrase(const SecureString& strKeyData, const std::vector& chSalt, const unsigned int nRounds, const unsigned int nDerivationMethod) { if (nRounds < 1 || chSalt.size() != WALLET_CRYPTO_SALT_SIZE) return false; int i = 0; if (nDerivationMethod == 0) i = EVP_BytesToKey(EVP_aes_256_cbc(), EVP_sha512(), &chSalt[0], (unsigned char *)&strKeyData[0], strKeyData.size(), nRounds, chKey, chIV); if (i != (int)WALLET_CRYPTO_KEY_SIZE) { OPENSSL_cleanse(chKey, sizeof(chKey)); OPENSSL_cleanse(chIV, sizeof(chIV)); return false; } fKeySet = true; return true; } bool CCrypter::SetKey(const CKeyingMaterial& chNewKey, const std::vector& chNewIV) { if (chNewKey.size() != WALLET_CRYPTO_KEY_SIZE || chNewIV.size() != WALLET_CRYPTO_KEY_SIZE) return false; memcpy(&chKey[0], &chNewKey[0], sizeof chKey); memcpy(&chIV[0], &chNewIV[0], sizeof chIV); fKeySet = true; return true; } bool CCrypter::Encrypt(const CKeyingMaterial& vchPlaintext, std::vector &vchCiphertext) { if (!fKeySet) return false; // max ciphertext len for a n bytes of plaintext is // n + AES_BLOCK_SIZE - 1 bytes int nLen = vchPlaintext.size(); int nCLen = nLen + AES_BLOCK_SIZE, nFLen = 0; vchCiphertext = std::vector (nCLen); EVP_CIPHER_CTX ctx; bool fOk = true; EVP_CIPHER_CTX_init(&ctx); if (fOk) fOk = EVP_EncryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV); if (fOk) fOk = EVP_EncryptUpdate(&ctx, &vchCiphertext[0], &nCLen, &vchPlaintext[0], nLen); if (fOk) fOk = EVP_EncryptFinal_ex(&ctx, (&vchCiphertext[0])+nCLen, &nFLen); EVP_CIPHER_CTX_cleanup(&ctx); if (!fOk) return false; vchCiphertext.resize(nCLen + nFLen); return true; } bool CCrypter::Decrypt(const std::vector& vchCiphertext, CKeyingMaterial& vchPlaintext) { if (!fKeySet) return false; // plaintext will always be equal to or lesser than length of ciphertext int nLen = vchCiphertext.size(); int nPLen = nLen, nFLen = 0; vchPlaintext = CKeyingMaterial(nPLen); EVP_CIPHER_CTX ctx; bool fOk = true; EVP_CIPHER_CTX_init(&ctx); if (fOk) fOk = EVP_DecryptInit_ex(&ctx, EVP_aes_256_cbc(), NULL, chKey, chIV); if (fOk) fOk = EVP_DecryptUpdate(&ctx, &vchPlaintext[0], &nPLen, &vchCiphertext[0], nLen); if (fOk) fOk = EVP_DecryptFinal_ex(&ctx, (&vchPlaintext[0])+nPLen, &nFLen); EVP_CIPHER_CTX_cleanup(&ctx); if (!fOk) return false; vchPlaintext.resize(nPLen + nFLen); return true; } bool EncryptSecret(const CKeyingMaterial& vMasterKey, const CKeyingMaterial &vchPlaintext, const uint256& nIV, std::vector &vchCiphertext) { CCrypter cKeyCrypter; std::vector chIV(WALLET_CRYPTO_KEY_SIZE); memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE); if(!cKeyCrypter.SetKey(vMasterKey, chIV)) return false; return cKeyCrypter.Encrypt(*((const CKeyingMaterial*)&vchPlaintext), vchCiphertext); } bool DecryptSecret(const CKeyingMaterial& vMasterKey, const std::vector& vchCiphertext, const uint256& nIV, CKeyingMaterial& vchPlaintext) { CCrypter cKeyCrypter; std::vector chIV(WALLET_CRYPTO_KEY_SIZE); memcpy(&chIV[0], &nIV, WALLET_CRYPTO_KEY_SIZE); if(!cKeyCrypter.SetKey(vMasterKey, chIV)) return false; return cKeyCrypter.Decrypt(vchCiphertext, *((CKeyingMaterial*)&vchPlaintext)); } ================================================ FILE: samples/C++/cvsignore.re ================================================ #define YYFILL(n) if (cursor >= limit) break; #define YYCTYPE char #define YYCURSOR cursor #define YYLIMIT limit #define YYMARKER marker /*!re2c any = (.|"\n"); value = (":" (.\"$")+)?; cvsdat = "Date"; cvsid = "Id"; cvslog = "Log"; cvsrev = "Revision"; cvssrc = "Source"; */ #define APPEND(text) \ append(output, outsize, text, sizeof(text) - sizeof(YYCTYPE)) inline void append(YYCTYPE *output, size_t & outsize, const YYCTYPE * text, size_t len) { memcpy(output + outsize, text, len); outsize += (len / sizeof(YYCTYPE)); } void scan(YYCTYPE *pText, size_t *pSize, int *pbChanged) { // rule // scan lines // find $ in lines // compact $: .. $ to $$ YYCTYPE *output; const YYCTYPE *cursor, *limit, *marker; cursor = marker = output = *pText; size_t insize = *pSize; size_t outsize = 0; limit = cursor + insize; while(1) { loop: /*!re2c "$" cvsdat value "$" { APPEND(L"$" L"Date$"); goto loop; } "$" cvsid value "$" { APPEND(L"$" L"Id$"); goto loop; } "$" cvslog value "$" { APPEND(L"$" L"Log$"); goto loop; } "$" cvsrev value "$" { APPEND(L"$" L"Revision$"); goto loop; } "$" cvssrc value "$" { APPEND(L"$" L"Source$"); goto loop; } any { output[outsize++] = cursor[-1]; if (cursor >= limit) break; goto loop; } */ } output[outsize] = '\0'; // set the new size *pSize = outsize; *pbChanged = (insize == outsize) ? 0 : 1; } ================================================ FILE: samples/C++/env.cpp ================================================ /* This file is part of the PhantomJS project from Ofi Labs. Copyright (C) 2012 execjosh, http://execjosh.blogspot.com Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "env.h" #include #include #include static Env *env_instance = (Env *)NULL; Env *Env::instance() { if ((Env *)NULL == env_instance) env_instance = new Env(); return env_instance; } Env::Env() : QObject(QCoreApplication::instance()) { } // public: void Env::parse(const char **envp) { const char **env = (const char **)NULL; QString envvar, name, value; int indexOfEquals; // Loop for each of the = pairs and split them into a map for (env = envp; *env != (const char *)NULL; env++) { envvar = QString(*env); indexOfEquals = envvar.indexOf('='); if (0 >= indexOfEquals) { // Should never happen because names cannot contain "=" and cannot // be empty. If it does happen, then just ignore this record. // See: http://pubs.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap08.html continue; } // Extract name and value (if it exists) from envvar // NOTE: // QString::mid() will gracefully return an empty QString when the // specified position index is >= the length() of the string name = envvar.left(indexOfEquals); value = envvar.mid(indexOfEquals + 1); m_map.insert(name, value); } } QVariantMap Env::asVariantMap() const { return m_map; } ================================================ FILE: samples/C++/env.h ================================================ /* This file is part of the PhantomJS project from Ofi Labs. Copyright (C) 2012 execjosh, http://execjosh.blogspot.com Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef ENV_H #define ENV_H #include #include class Env : public QObject { Q_OBJECT public: static Env *instance(); void parse(const char ** envp); QVariantMap asVariantMap() const; private: Env(); QVariantMap m_map; }; #endif // ENV_H ================================================ FILE: samples/C++/epoll_reactor.ipp ================================================ // // detail/impl/epoll_reactor.ipp // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // // Copyright (c) 2003-2013 Christopher M. Kohlhoff (chris at kohlhoff dot com) // // Distributed under the Boost Software License, Version 1.0. (See accompanying // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) // #ifndef BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP #define BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP #if defined(_MSC_VER) && (_MSC_VER >= 1200) # pragma once #endif // defined(_MSC_VER) && (_MSC_VER >= 1200) #include #if defined(BOOST_ASIO_HAS_EPOLL) #include #include #include #include #include #if defined(BOOST_ASIO_HAS_TIMERFD) # include #endif // defined(BOOST_ASIO_HAS_TIMERFD) #include namespace boost { namespace asio { namespace detail { epoll_reactor::epoll_reactor(boost::asio::io_service& io_service) : boost::asio::detail::service_base(io_service), io_service_(use_service(io_service)), mutex_(), interrupter_(), epoll_fd_(do_epoll_create()), timer_fd_(do_timerfd_create()), shutdown_(false) { // Add the interrupter's descriptor to epoll. epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLET; ev.data.ptr = &interrupter_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); interrupter_.interrupt(); // Add the timer descriptor to epoll. if (timer_fd_ != -1) { ev.events = EPOLLIN | EPOLLERR; ev.data.ptr = &timer_fd_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); } } epoll_reactor::~epoll_reactor() { if (epoll_fd_ != -1) close(epoll_fd_); if (timer_fd_ != -1) close(timer_fd_); } void epoll_reactor::shutdown_service() { mutex::scoped_lock lock(mutex_); shutdown_ = true; lock.unlock(); op_queue ops; while (descriptor_state* state = registered_descriptors_.first()) { for (int i = 0; i < max_ops; ++i) ops.push(state->op_queue_[i]); state->shutdown_ = true; registered_descriptors_.free(state); } timer_queues_.get_all_timers(ops); io_service_.abandon_operations(ops); } void epoll_reactor::fork_service(boost::asio::io_service::fork_event fork_ev) { if (fork_ev == boost::asio::io_service::fork_child) { if (epoll_fd_ != -1) ::close(epoll_fd_); epoll_fd_ = -1; epoll_fd_ = do_epoll_create(); if (timer_fd_ != -1) ::close(timer_fd_); timer_fd_ = -1; timer_fd_ = do_timerfd_create(); interrupter_.recreate(); // Add the interrupter's descriptor to epoll. epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLET; ev.data.ptr = &interrupter_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev); interrupter_.interrupt(); // Add the timer descriptor to epoll. if (timer_fd_ != -1) { ev.events = EPOLLIN | EPOLLERR; ev.data.ptr = &timer_fd_; epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, timer_fd_, &ev); } update_timeout(); // Re-register all descriptors with epoll. mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); for (descriptor_state* state = registered_descriptors_.first(); state != 0; state = state->next_) { ev.events = state->registered_events_; ev.data.ptr = state; int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, state->descriptor_, &ev); if (result != 0) { boost::system::error_code ec(errno, boost::asio::error::get_system_category()); boost::asio::detail::throw_error(ec, "epoll re-registration"); } } } } void epoll_reactor::init_task() { io_service_.init_task(); } int epoll_reactor::register_descriptor(socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data) { descriptor_data = allocate_descriptor_state(); { mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); descriptor_data->reactor_ = this; descriptor_data->descriptor_ = descriptor; descriptor_data->shutdown_ = false; } epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; descriptor_data->registered_events_ = ev.events; ev.data.ptr = descriptor_data; int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); if (result != 0) return errno; return 0; } int epoll_reactor::register_internal_descriptor( int op_type, socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op) { descriptor_data = allocate_descriptor_state(); { mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); descriptor_data->reactor_ = this; descriptor_data->descriptor_ = descriptor; descriptor_data->shutdown_ = false; descriptor_data->op_queue_[op_type].push(op); } epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLHUP | EPOLLPRI | EPOLLET; descriptor_data->registered_events_ = ev.events; ev.data.ptr = descriptor_data; int result = epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, descriptor, &ev); if (result != 0) return errno; return 0; } void epoll_reactor::move_descriptor(socket_type, epoll_reactor::per_descriptor_data& target_descriptor_data, epoll_reactor::per_descriptor_data& source_descriptor_data) { target_descriptor_data = source_descriptor_data; source_descriptor_data = 0; } void epoll_reactor::start_op(int op_type, socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data, reactor_op* op, bool is_continuation, bool allow_speculative) { if (!descriptor_data) { op->ec_ = boost::asio::error::bad_descriptor; post_immediate_completion(op, is_continuation); return; } mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (descriptor_data->shutdown_) { post_immediate_completion(op, is_continuation); return; } if (descriptor_data->op_queue_[op_type].empty()) { if (allow_speculative && (op_type != read_op || descriptor_data->op_queue_[except_op].empty())) { if (op->perform()) { descriptor_lock.unlock(); io_service_.post_immediate_completion(op, is_continuation); return; } if (op_type == write_op) { if ((descriptor_data->registered_events_ & EPOLLOUT) == 0) { epoll_event ev = { 0, { 0 } }; ev.events = descriptor_data->registered_events_ | EPOLLOUT; ev.data.ptr = descriptor_data; if (epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev) == 0) { descriptor_data->registered_events_ |= ev.events; } else { op->ec_ = boost::system::error_code(errno, boost::asio::error::get_system_category()); io_service_.post_immediate_completion(op, is_continuation); return; } } } } else { if (op_type == write_op) { descriptor_data->registered_events_ |= EPOLLOUT; } epoll_event ev = { 0, { 0 } }; ev.events = descriptor_data->registered_events_; ev.data.ptr = descriptor_data; epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, descriptor, &ev); } } descriptor_data->op_queue_[op_type].push(op); io_service_.work_started(); } void epoll_reactor::cancel_ops(socket_type, epoll_reactor::per_descriptor_data& descriptor_data) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); op_queue ops; for (int i = 0; i < max_ops; ++i) { while (reactor_op* op = descriptor_data->op_queue_[i].front()) { op->ec_ = boost::asio::error::operation_aborted; descriptor_data->op_queue_[i].pop(); ops.push(op); } } descriptor_lock.unlock(); io_service_.post_deferred_completions(ops); } void epoll_reactor::deregister_descriptor(socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data, bool closing) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (!descriptor_data->shutdown_) { if (closing) { // The descriptor will be automatically removed from the epoll set when // it is closed. } else { epoll_event ev = { 0, { 0 } }; epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); } op_queue ops; for (int i = 0; i < max_ops; ++i) { while (reactor_op* op = descriptor_data->op_queue_[i].front()) { op->ec_ = boost::asio::error::operation_aborted; descriptor_data->op_queue_[i].pop(); ops.push(op); } } descriptor_data->descriptor_ = -1; descriptor_data->shutdown_ = true; descriptor_lock.unlock(); free_descriptor_state(descriptor_data); descriptor_data = 0; io_service_.post_deferred_completions(ops); } } void epoll_reactor::deregister_internal_descriptor(socket_type descriptor, epoll_reactor::per_descriptor_data& descriptor_data) { if (!descriptor_data) return; mutex::scoped_lock descriptor_lock(descriptor_data->mutex_); if (!descriptor_data->shutdown_) { epoll_event ev = { 0, { 0 } }; epoll_ctl(epoll_fd_, EPOLL_CTL_DEL, descriptor, &ev); op_queue ops; for (int i = 0; i < max_ops; ++i) ops.push(descriptor_data->op_queue_[i]); descriptor_data->descriptor_ = -1; descriptor_data->shutdown_ = true; descriptor_lock.unlock(); free_descriptor_state(descriptor_data); descriptor_data = 0; } } void epoll_reactor::run(bool block, op_queue& ops) { // This code relies on the fact that the task_io_service queues the reactor // task behind all descriptor operations generated by this function. This // means, that by the time we reach this point, any previously returned // descriptor operations have already been dequeued. Therefore it is now safe // for us to reuse and return them for the task_io_service to queue again. // Calculate a timeout only if timerfd is not used. int timeout; if (timer_fd_ != -1) timeout = block ? -1 : 0; else { mutex::scoped_lock lock(mutex_); timeout = block ? get_timeout() : 0; } // Block on the epoll descriptor. epoll_event events[128]; int num_events = epoll_wait(epoll_fd_, events, 128, timeout); #if defined(BOOST_ASIO_HAS_TIMERFD) bool check_timers = (timer_fd_ == -1); #else // defined(BOOST_ASIO_HAS_TIMERFD) bool check_timers = true; #endif // defined(BOOST_ASIO_HAS_TIMERFD) // Dispatch the waiting events. for (int i = 0; i < num_events; ++i) { void* ptr = events[i].data.ptr; if (ptr == &interrupter_) { // No need to reset the interrupter since we're leaving the descriptor // in a ready-to-read state and relying on edge-triggered notifications // to make it so that we only get woken up when the descriptor's epoll // registration is updated. #if defined(BOOST_ASIO_HAS_TIMERFD) if (timer_fd_ == -1) check_timers = true; #else // defined(BOOST_ASIO_HAS_TIMERFD) check_timers = true; #endif // defined(BOOST_ASIO_HAS_TIMERFD) } #if defined(BOOST_ASIO_HAS_TIMERFD) else if (ptr == &timer_fd_) { check_timers = true; } #endif // defined(BOOST_ASIO_HAS_TIMERFD) else { // The descriptor operation doesn't count as work in and of itself, so we // don't call work_started() here. This still allows the io_service to // stop if the only remaining operations are descriptor operations. descriptor_state* descriptor_data = static_cast(ptr); descriptor_data->set_ready_events(events[i].events); ops.push(descriptor_data); } } if (check_timers) { mutex::scoped_lock common_lock(mutex_); timer_queues_.get_ready_timers(ops); #if defined(BOOST_ASIO_HAS_TIMERFD) if (timer_fd_ != -1) { itimerspec new_timeout; itimerspec old_timeout; int flags = get_timeout(new_timeout); timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); } #endif // defined(BOOST_ASIO_HAS_TIMERFD) } } void epoll_reactor::interrupt() { epoll_event ev = { 0, { 0 } }; ev.events = EPOLLIN | EPOLLERR | EPOLLET; ev.data.ptr = &interrupter_; epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev); } int epoll_reactor::do_epoll_create() { #if defined(EPOLL_CLOEXEC) int fd = epoll_create1(EPOLL_CLOEXEC); #else // defined(EPOLL_CLOEXEC) int fd = -1; errno = EINVAL; #endif // defined(EPOLL_CLOEXEC) if (fd == -1 && (errno == EINVAL || errno == ENOSYS)) { fd = epoll_create(epoll_size); if (fd != -1) ::fcntl(fd, F_SETFD, FD_CLOEXEC); } if (fd == -1) { boost::system::error_code ec(errno, boost::asio::error::get_system_category()); boost::asio::detail::throw_error(ec, "epoll"); } return fd; } int epoll_reactor::do_timerfd_create() { #if defined(BOOST_ASIO_HAS_TIMERFD) # if defined(TFD_CLOEXEC) int fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); # else // defined(TFD_CLOEXEC) int fd = -1; errno = EINVAL; # endif // defined(TFD_CLOEXEC) if (fd == -1 && errno == EINVAL) { fd = timerfd_create(CLOCK_MONOTONIC, 0); if (fd != -1) ::fcntl(fd, F_SETFD, FD_CLOEXEC); } return fd; #else // defined(BOOST_ASIO_HAS_TIMERFD) return -1; #endif // defined(BOOST_ASIO_HAS_TIMERFD) } epoll_reactor::descriptor_state* epoll_reactor::allocate_descriptor_state() { mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); return registered_descriptors_.alloc(); } void epoll_reactor::free_descriptor_state(epoll_reactor::descriptor_state* s) { mutex::scoped_lock descriptors_lock(registered_descriptors_mutex_); registered_descriptors_.free(s); } void epoll_reactor::do_add_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.insert(&queue); } void epoll_reactor::do_remove_timer_queue(timer_queue_base& queue) { mutex::scoped_lock lock(mutex_); timer_queues_.erase(&queue); } void epoll_reactor::update_timeout() { #if defined(BOOST_ASIO_HAS_TIMERFD) if (timer_fd_ != -1) { itimerspec new_timeout; itimerspec old_timeout; int flags = get_timeout(new_timeout); timerfd_settime(timer_fd_, flags, &new_timeout, &old_timeout); return; } #endif // defined(BOOST_ASIO_HAS_TIMERFD) interrupt(); } int epoll_reactor::get_timeout() { // By default we will wait no longer than 5 minutes. This will ensure that // any changes to the system clock are detected after no longer than this. return timer_queues_.wait_duration_msec(5 * 60 * 1000); } #if defined(BOOST_ASIO_HAS_TIMERFD) int epoll_reactor::get_timeout(itimerspec& ts) { ts.it_interval.tv_sec = 0; ts.it_interval.tv_nsec = 0; long usec = timer_queues_.wait_duration_usec(5 * 60 * 1000 * 1000); ts.it_value.tv_sec = usec / 1000000; ts.it_value.tv_nsec = usec ? (usec % 1000000) * 1000 : 1; return usec ? 0 : TFD_TIMER_ABSTIME; } #endif // defined(BOOST_ASIO_HAS_TIMERFD) struct epoll_reactor::perform_io_cleanup_on_block_exit { explicit perform_io_cleanup_on_block_exit(epoll_reactor* r) : reactor_(r), first_op_(0) { } ~perform_io_cleanup_on_block_exit() { if (first_op_) { // Post the remaining completed operations for invocation. if (!ops_.empty()) reactor_->io_service_.post_deferred_completions(ops_); // A user-initiated operation has completed, but there's no need to // explicitly call work_finished() here. Instead, we'll take advantage of // the fact that the task_io_service will call work_finished() once we // return. } else { // No user-initiated operations have completed, so we need to compensate // for the work_finished() call that the task_io_service will make once // this operation returns. reactor_->io_service_.work_started(); } } epoll_reactor* reactor_; op_queue ops_; operation* first_op_; }; epoll_reactor::descriptor_state::descriptor_state() : operation(&epoll_reactor::descriptor_state::do_complete) { } operation* epoll_reactor::descriptor_state::perform_io(uint32_t events) { mutex_.lock(); perform_io_cleanup_on_block_exit io_cleanup(reactor_); mutex::scoped_lock descriptor_lock(mutex_, mutex::scoped_lock::adopt_lock); // Exception operations must be processed first to ensure that any // out-of-band data is read before normal data. static const int flag[max_ops] = { EPOLLIN, EPOLLOUT, EPOLLPRI }; for (int j = max_ops - 1; j >= 0; --j) { if (events & (flag[j] | EPOLLERR | EPOLLHUP)) { while (reactor_op* op = op_queue_[j].front()) { if (op->perform()) { op_queue_[j].pop(); io_cleanup.ops_.push(op); } else break; } } } // The first operation will be returned for completion now. The others will // be posted for later by the io_cleanup object's destructor. io_cleanup.first_op_ = io_cleanup.ops_.front(); io_cleanup.ops_.pop(); return io_cleanup.first_op_; } void epoll_reactor::descriptor_state::do_complete( io_service_impl* owner, operation* base, const boost::system::error_code& ec, std::size_t bytes_transferred) { if (owner) { descriptor_state* descriptor_data = static_cast(base); uint32_t events = static_cast(bytes_transferred); if (operation* op = descriptor_data->perform_io(events)) { op->complete(*owner, ec, 0); } } } } // namespace detail } // namespace asio } // namespace boost #include #endif // defined(BOOST_ASIO_HAS_EPOLL) #endif // BOOST_ASIO_DETAIL_IMPL_EPOLL_REACTOR_IPP ================================================ FILE: samples/C++/gblib.cppm ================================================ export module gblib; import std; export enum ScopeLevel { LEVEL_UNIV, LEVEL_STAR, LEVEL_PLAN, LEVEL_SHIP }; export using shipnum_t = uint64_t; export using starnum_t = uint32_t; export using planetnum_t = uint32_t; export using player_t = uint32_t; export using governor_t = uint32_t; export using ap_t = uint32_t; export using commodnum_t = int64_t; export using resource_t = int64_t; export using money_t = int64_t; export using population_t = int64_t; export using command_t = std::vector; // Shipping routes - DON'T change this unless you know what you are doing export inline constexpr int MAX_ROUTES = 4; /** * \brief Convert input string to a shipnum_t * \param s User-provided input string * \return If the user provided a valid number, return it. */ export inline std::optional string_to_shipnum(std::string_view s) { while (s.size() > 1 && s.front() == '#') { s.remove_prefix(1); } if (s.size() > 0 && std::isdigit(s.front())) { return std::stoi(std::string(s.begin(), s.end())); } return {}; } /** * \brief Scales used in production efficiency etc. * \param x Integer from 0-100 * \return Float 0.0 - 1.0 (logscaleOB 0.5 - .95) */ export inline double logscale(const int x) { return log10(( double )x + 1.0) / 2.0; } export inline double morale_factor(const double x) { return (atan(( double )x / 10000.) / 3.14159565 + .5); } export class Db { public: virtual ~Db() {} virtual int Numcommods() = 0; virtual int Numraces() = 0; protected: Db() {} }; export class GameObj { public: player_t player; governor_t governor; bool god; double lastx[2] = { 0.0, 0.0 }; double lasty[2] = { 0.0, 0.0 }; double zoom[2] = { 1.0, 0.5 }; ///< last coords for zoom ScopeLevel level; ///< what directory level starnum_t snum; ///< what star system obj # (level=0) planetnum_t pnum; ///< number of planet shipnum_t shipno; ///< # of ship std::stringstream out; Db& db; GameObj(Db& db_) : db(db_) {} GameObj(const GameObj&) = delete; GameObj& operator=(const GameObj&) = delete; }; export class Sector { public: Sector(unsigned int x_, unsigned int y_, unsigned int eff_, unsigned int fert_, unsigned int mobilization_, unsigned int crystals_, resource_t resource_, population_t popn_, population_t troops_, player_t owner_, player_t race_, unsigned int type_, unsigned int condition_) : x(x_), y(y_), eff(eff_), fert(fert_), mobilization(mobilization_), crystals(crystals_), resource(resource_), popn(popn_), troops(troops_), owner(owner_), race(race_), type(type_), condition(condition_) {} Sector() = default; Sector(Sector&) = delete; void operator=(const Sector&) = delete; Sector(Sector&&) = default; Sector& operator=(Sector&&) = default; auto operator<=>(const Sector&) const = default; unsigned int x { 0 }; unsigned int y { 0 }; unsigned int eff { 0 }; /* efficiency (0-100) */ unsigned int fert { 0 }; /* max popn is proportional to this */ unsigned int mobilization { 0 }; /* percent popn is mobilized for war */ unsigned int crystals { 0 }; resource_t resource { 0 }; population_t popn { 0 }; population_t troops { 0 }; /* troops (additional combat value) */ player_t owner { 0 }; /* owner of place */ player_t race { 0 }; /* race type occupying sector (usually==owner) - makes things more realistic when alien races revolt and you gain control of them! */ unsigned int type { 0 }; /* underlying sector geology */ unsigned int condition { 0 }; /* environmental effects */ friend std::ostream& operator<<(std::ostream&, const Sector&); }; export struct Commod { player_t owner; governor_t governor; uint8_t type; uint64_t amount; bool deliver; /* whether the lot is ready for shipping or not */ money_t bid; player_t bidder; governor_t bidder_gov; starnum_t star_from; /* where the stuff originated from */ planetnum_t planet_from; starnum_t star_to; /* where it goes to */ planetnum_t planet_to; }; export struct Victory { std::weak_ordering operator<=>(const Victory& that) const { // Ensure that folks who shouldn't count are always ranked last. if (no_count && !that.no_count) { return std::weak_ordering::greater; } if (that.no_count && !no_count) { return std::weak_ordering::less; } if (that.rawscore > rawscore) { return std::weak_ordering::greater; } if (that.rawscore < rawscore) { return std::weak_ordering::less; } // Must be equal return std::weak_ordering::equivalent; } player_t racenum; std::string name; bool no_count = false; double tech; int Thing; int IQ; unsigned long rawscore; }; export struct plinfo { /* planetary stockpiles */ unsigned short fuel; /* fuel for powering things */ unsigned short destruct; /* destructive potential */ resource_t resource; /* resources in storage */ population_t popn; population_t troops; unsigned short crystals; unsigned short prod_res; /* shows last update production */ unsigned short prod_fuel; unsigned short prod_dest; unsigned short prod_crystals; money_t prod_money; double prod_tech; money_t tech_invest; unsigned short numsectsowned; unsigned char comread; /* combat readiness (mobilization)*/ unsigned char mob_set; /* mobilization target */ unsigned char tox_thresh; /* min to build a waste can */ unsigned char explored; unsigned char autorep; unsigned char tax; /* tax rate */ unsigned char newtax; /* new tax rate (after update) */ unsigned char guns; /* number of planet guns (mob/5) */ /* merchant shipping parameters */ struct { unsigned char set; /* does the planet have orders? */ unsigned char dest_star; /* star that ship has to go to next */ unsigned char dest_planet; /* planet destination */ unsigned char load; /* bit-field commodities to be loaded there */ unsigned char unload; /* unloaded commodities */ unsigned char x, y; /* location that ship has to land on */ } route[MAX_ROUTES]; /* i am allowing up to four routes per planet */ long mob_points; double est_production; /* estimated production */ }; export template concept Unsigned = std::is_unsigned::value; export template void setbit(T& target, const Unsigned auto pos) requires Unsigned { T bit = 1; target |= (bit << pos); } export template void clrbit(T& target, const Unsigned auto pos) requires Unsigned { T bit = 1; target &= ~(bit << pos); } export template bool isset(const T target, const Unsigned auto pos) requires Unsigned { T bit = 1; return target & (bit << pos); } export template bool isclr(const T target, const Unsigned auto pos) requires Unsigned { return !isset(target, pos); } ================================================ FILE: samples/C++/gdsdbreader.h ================================================ #ifndef GDSDBREADER_H #define GDSDBREADER_H // This file contains core structures, classes and types for the entire gds app // WARNING: DO NOT MODIFY UNTIL IT'S STRICTLY NECESSARY #include #include "diagramwidget/qgldiagramwidget.h" #define GDS_DIR "gdsdata" enum level {LEVEL_ONE, LEVEL_TWO, LEVEL_THREE}; // The internal structure of the db to store information about each node (each level) // this will be serialized before being written to file class dbDataStructure { public: QString label; quint32 depth; quint32 userIndex; QByteArray data; // This is COMPRESSED data, optimize ram and disk space, is decompressed // just when needed (to display the comments) // The following ID is used to create second-third level files quint64 uniqueID; // All the next items linked to this one QVector nextItems; // Corresponding indices vector (used to store data) QVector nextItemsIndices; // The father element (or NULL if it's root) dbDataStructure* father; // Corresponding indices vector (used to store data) quint32 fatherIndex; bool noFatherRoot; // Used to tell if this node is the root (so hasn't a father) // These fields will be useful for levels 2 and 3 QString fileName; // Relative filename for the associated code file QByteArray firstLineData; // Compressed first line data, this will be used with the line number to retrieve info QVector linesNumbers; // First and next lines (next are relative to the first) numbers // -- Generic system data not to be stored on disk void *glPointer; // GL pointer // These operator overrides prevent the glPointer and other non-disk-necessary data serialization friend QDataStream& operator<<(QDataStream& stream, const dbDataStructure& myclass) // Notice: this function has to be "friend" because it cannot be a member function, member functions // have an additional parameter "this" which isn't in the argument list of an operator overload. A friend // function has full access to private data of the class without having the "this" argument { // Don't write glPointer and every pointer-dependent structure return stream << myclass.label << myclass.depth << myclass.userIndex << qCompress(myclass.data) << myclass.uniqueID << myclass.nextItemsIndices << myclass.fatherIndex << myclass.noFatherRoot << myclass.fileName << qCompress(myclass.firstLineData) << myclass.linesNumbers; } friend QDataStream& operator>>(QDataStream& stream, dbDataStructure& myclass) { //Don't read it, either stream >> myclass.label >> myclass.depth >> myclass.userIndex >> myclass.data >> myclass.uniqueID >> myclass.nextItemsIndices >> myclass.fatherIndex >> myclass.noFatherRoot >> myclass.fileName >> myclass.firstLineData >> myclass.linesNumbers; myclass.data = qUncompress(myclass.data); myclass.firstLineData = qUncompress(myclass.firstLineData); return stream; } }; #endif // GDSDBREADER_H ================================================ FILE: samples/C++/graphics.cpp ================================================ // License - https://github.com/TurtleP/Flask/blob/master/LICENSE #include int currentR = 0xFF; int currentG = 0xFF; int currentB = 0xFF; int currentA = 0xFF; int currentScreen = GFX_BOTTOM; float transX = 0; float transY = 0; bool isPushed = false; u32 getCurrentColor() { return RGBA8(currentR, currentG, currentB, currentA); } void setColor(int r, int g, int b) { currentR = r; currentG = g; currentB = b; currentA = currentA; } void setColor(int r, int g, int b, int a) { currentR = r; currentG = g; currentB = b; currentA = a; } void setScreen(int screen) { currentScreen = screen; } int getCurrentScreen() { return currentScreen; } void screenShot() //for showing stuff being done { FILE * topScreen = fopen("sdmc:/framebuffer_top.rgb", "w+"); fwrite(gfxGetFramebuffer(GFX_TOP, GFX_LEFT, NULL, NULL), 288000, 1, topScreen); fclose(topScreen); FILE * bottomScreen = fopen("sdmc:/framebuffer_bottom.rgb", "w+");; fwrite(gfxGetFramebuffer(GFX_BOTTOM, GFX_LEFT, NULL, NULL), 230400, 1, bottomScreen); fclose(bottomScreen); } void translateCoords(float * x, float * y) { if (isPushed) { *x += transX; *y += transY; } } void translate(float dx, float dy) { if (sf2d_get_current_screen() == getCurrentScreen()) { transX = transX + dx; transY = transY + dy; } } void push() { if (sf2d_get_current_screen() == getCurrentScreen()) { isPushed = true; } } void pop() { if (sf2d_get_current_screen() == getCurrentScreen()) { transX = 0; transY = 0; isPushed = false; } } void setScissor(u32 x, u32 y, u32 width, u32 height) { if (sf2d_get_current_screen() == getCurrentScreen()) { GPU_SCISSORMODE mode = GPU_SCISSOR_NORMAL; if (!x && !y && !width && !height) { mode = GPU_SCISSOR_DISABLE; } sf2d_set_scissor_test(mode, x, y, width, height); } } ================================================ FILE: samples/C++/grpc.pb.cc ================================================ // Generated by the gRPC protobuf plugin. // If you make any local change, they will be lost. ================================================ FILE: samples/C++/hello.cpp ================================================ #include using namespace std; int main() { cout << "Hello World" << endl; } ================================================ FILE: samples/C++/hello.grpc.pb.h ================================================ // Generated by the gRPC C++ plugin. // If you make any local change, they will be lost. // source: hello.proto #ifndef GRPC_hello_2eproto__INCLUDED #define GRPC_hello_2eproto__INCLUDED #include "hello.pb.h" #include #include #include #include #include #include #include #include #include namespace grpc { class CompletionQueue; class Channel; class RpcService; class ServerCompletionQueue; class ServerContext; } // namespace grpc class HelloService final { public: class StubInterface { public: virtual ~StubInterface() {} virtual ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) = 0; std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) { return std::unique_ptr< ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq)); } private: virtual ::grpc::ClientAsyncResponseReaderInterface< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) = 0; }; class Stub final : public StubInterface { public: Stub(const std::shared_ptr< ::grpc::ChannelInterface>& channel); ::grpc::Status SayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::HelloResponse* response) override; std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>> AsyncSayHello(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) { return std::unique_ptr< ::grpc::ClientAsyncResponseReader< ::HelloResponse>>(AsyncSayHelloRaw(context, request, cq)); } private: std::shared_ptr< ::grpc::ChannelInterface> channel_; ::grpc::ClientAsyncResponseReader< ::HelloResponse>* AsyncSayHelloRaw(::grpc::ClientContext* context, const ::HelloRequest& request, ::grpc::CompletionQueue* cq) override; const ::grpc::RpcMethod rpcmethod_SayHello_; }; static std::unique_ptr NewStub(const std::shared_ptr< ::grpc::ChannelInterface>& channel, const ::grpc::StubOptions& options = ::grpc::StubOptions()); class Service : public ::grpc::Service { public: Service(); virtual ~Service(); virtual ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response); }; template class WithAsyncMethod_SayHello : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: WithAsyncMethod_SayHello() { ::grpc::Service::MarkMethodAsync(0); } ~WithAsyncMethod_SayHello() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } void RequestSayHello(::grpc::ServerContext* context, ::HelloRequest* request, ::grpc::ServerAsyncResponseWriter< ::HelloResponse>* response, ::grpc::CompletionQueue* new_call_cq, ::grpc::ServerCompletionQueue* notification_cq, void *tag) { ::grpc::Service::RequestAsyncUnary(0, context, request, response, new_call_cq, notification_cq, tag); } }; typedef WithAsyncMethod_SayHello AsyncService; template class WithGenericMethod_SayHello : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: WithGenericMethod_SayHello() { ::grpc::Service::MarkMethodGeneric(0); } ~WithGenericMethod_SayHello() override { BaseClassMustBeDerivedFromService(this); } // disable synchronous version of this method ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } }; template class WithStreamedUnaryMethod_SayHello : public BaseClass { private: void BaseClassMustBeDerivedFromService(const Service *service) {} public: WithStreamedUnaryMethod_SayHello() { ::grpc::Service::MarkMethodStreamed(0, new ::grpc::StreamedUnaryHandler< ::HelloRequest, ::HelloResponse>(std::bind(&WithStreamedUnaryMethod_SayHello::StreamedSayHello, this, std::placeholders::_1, std::placeholders::_2))); } ~WithStreamedUnaryMethod_SayHello() override { BaseClassMustBeDerivedFromService(this); } // disable regular version of this method ::grpc::Status SayHello(::grpc::ServerContext* context, const ::HelloRequest* request, ::HelloResponse* response) final override { abort(); return ::grpc::Status(::grpc::StatusCode::UNIMPLEMENTED, ""); } // replace default version of method with streamed unary virtual ::grpc::Status StreamedSayHello(::grpc::ServerContext* context, ::grpc::ServerUnaryStreamer< ::HelloRequest,::HelloResponse>* server_unary_streamer) = 0; }; typedef WithStreamedUnaryMethod_SayHello StreamedUnaryService; typedef Service SplitStreamedService; typedef WithStreamedUnaryMethod_SayHello StreamedService; }; #endif // GRPC_hello_2eproto__INCLUDED ================================================ FILE: samples/C++/hello.ino ================================================ void setup() { Serial.begin(9600); } void loop() { Serial.print("Hello"); } ================================================ FILE: samples/C++/initClasses.inc ================================================ // start // define cpp macros: SET_SYMBOL, CREATE_CLASS, SET_CLASS, DEFINE_BASE_CLASSES, DEFINE_CLASS_NAMES, EXPOSE_TO_CANDO // define cpp macro: ALL_STAGES to get the effect of defining all of the macros above // define cpp macro: EXPOSE_PYTHON to expose python // Associating namespace(llvmo) with package(LlvmoPkg) // class DebugLoc_O : public core::T_O // class InsertPoint_O : public core::T_O // class LLVMContext_O : public core::ExternalObject_O // class Pass_O : public core::ExternalObject_O // class FunctionPass_O : public Pass_O // class ModulePass_O : public Pass_O // class ImmutablePass_O : public ModulePass_O // class PassManagerBase_O : public core::ExternalObject_O // class Value_O : public core::ExternalObject_O // class User_O : public Value_O // class LLVMContext_O : public core::ExternalObject_O // class Pass_O : public core::ExternalObject_O // class FunctionPass_O : public Pass_O // class ModulePass_O : public Pass_O // class ImmutablePass_O : public ModulePass_O // class PassManagerBase_O : public core::ExternalObject_O // class Value_O : public core::ExternalObject_O // class User_O : public Value_O // class Attribute_O : public core::T_O // class DataLayout_O : public ImmutablePass_O // class Constant_O : public User_O // class ConstantArray_O : public Constant_O // class ConstantDataSequential_O : public Constant_O // class ConstantDataArray_O : public ConstantDataSequential_O // class ConstantExpr_O : public Constant_O // class GlobalValue_O : public Constant_O // class GlobalVariable_O : public GlobalValue_O // class ExecutionEngine_O : public core::ExternalObject_O // class Module_O : public core::ExternalObject_O // class FunctionPassManager_O : public PassManagerBase_O // class EngineBuilder_O : public core::ExternalObject_O // class APFloat_O : public core::ExternalObject_O // class APInt_O : public core::ExternalObject_O // class IRBuilderBase_O : public core::ExternalObject_O // class IRBuilder_O : public IRBuilderBase_O // class Instruction_O : public User_O // class StoreInst_O : public Instruction_O // class FenceInst_O : public Instruction_O // class AtomicCmpXchgInst_O : public Instruction_O // class AtomicRMWInst_O : public Instruction_O // class PHINode_O : public Instruction_O // class CallInst_O : public Instruction_O // class LandingPadInst_O : public Instruction_O // class UnaryInstruction_O : public Instruction_O // class AllocaInst_O : public UnaryInstruction_O // class VAArgInst_O : public UnaryInstruction_O // class LoadInst_O : public UnaryInstruction_O // class TerminatorInst_O : public Instruction_O // class BranchInst_O : public TerminatorInst_O // class SwitchInst_O : public TerminatorInst_O // class IndirectBrInst_O : public TerminatorInst_O // class InvokeInst_O : public TerminatorInst_O // class ResumeInst_O : public TerminatorInst_O // class UnreachableInst_O : public TerminatorInst_O // class ReturnInst_O : public TerminatorInst_O // class ConstantFP_O : public Constant_O // class ConstantInt_O : public Constant_O // class UndefValue_O : public Constant_O // class ConstantPointerNull_O : public Constant_O // class MDNode_O : public Value_O // class MDString_O : public Value_O // class Function_O : public GlobalValue_O // class BasicBlock_O : public Value_O // class Argument_O : public Value_O // class Type_O : public core::ExternalObject_O // class FunctionType_O : public Type_O // class IntegerType_O : public Type_O // class CompositeType_O : public Type_O // class StructType_O : public CompositeType_O // class SequentialType_O : public CompositeType_O // class PointerType_O : public SequentialType_O // class ArrayType_O : public SequentialType_O // class VectorType_O : public SequentialType_O // class LLVMContext_O : public core::ExternalObject_O // class Module_O : public core::ExternalObject_O // class Builder_O : public core::ExternalObject_O // class APFloat_O : public core::ExternalObject_O // class Value_O : public core::ExternalObject_O // class User_O : public Value_O // class Constant_O : public User_O // class ConstantFP_O : public Constant_O // Associating namespace(llvmo) with package(LlvmoPkg) #ifdef HEADER_INCLUDES #include "llvmoExpose.h" #include "llvmoExpose.scrape_inc.h" #include "debugLoc.h" #include "insertPoint.h" #include "llvmoExpose.generated.h" #endif // HEADER_INCLUDES #undef HEADER_INCLUDES #if defined(SET_SYMBOL) || defined(ALL_STAGES) // requires LOOKUP_SYMBOL(pkg,symbolName) be defined llvmo::APFloat_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::APFloat_O::static_packageName(),llvmo::APFloat_O::static_className())); llvmo::APInt_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::APInt_O::static_packageName(),llvmo::APInt_O::static_className())); llvmo::Attribute_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Attribute_O::static_packageName(),llvmo::Attribute_O::static_className())); llvmo::Builder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Builder_O::static_packageName(),llvmo::Builder_O::static_className())); llvmo::DebugLoc_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::DebugLoc_O::static_packageName(),llvmo::DebugLoc_O::static_className())); llvmo::EngineBuilder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::EngineBuilder_O::static_packageName(),llvmo::EngineBuilder_O::static_className())); llvmo::ExecutionEngine_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ExecutionEngine_O::static_packageName(),llvmo::ExecutionEngine_O::static_className())); llvmo::IRBuilderBase_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IRBuilderBase_O::static_packageName(),llvmo::IRBuilderBase_O::static_className())); llvmo::InsertPoint_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::InsertPoint_O::static_packageName(),llvmo::InsertPoint_O::static_className())); llvmo::LLVMContext_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LLVMContext_O::static_packageName(),llvmo::LLVMContext_O::static_className())); llvmo::Module_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Module_O::static_packageName(),llvmo::Module_O::static_className())); llvmo::PassManagerBase_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PassManagerBase_O::static_packageName(),llvmo::PassManagerBase_O::static_className())); llvmo::Pass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Pass_O::static_packageName(),llvmo::Pass_O::static_className())); llvmo::Type_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Type_O::static_packageName(),llvmo::Type_O::static_className())); llvmo::Value_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Value_O::static_packageName(),llvmo::Value_O::static_className())); llvmo::Argument_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Argument_O::static_packageName(),llvmo::Argument_O::static_className())); llvmo::BasicBlock_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::BasicBlock_O::static_packageName(),llvmo::BasicBlock_O::static_className())); llvmo::CompositeType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::CompositeType_O::static_packageName(),llvmo::CompositeType_O::static_className())); llvmo::FunctionPassManager_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionPassManager_O::static_packageName(),llvmo::FunctionPassManager_O::static_className())); llvmo::FunctionPass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionPass_O::static_packageName(),llvmo::FunctionPass_O::static_className())); llvmo::FunctionType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FunctionType_O::static_packageName(),llvmo::FunctionType_O::static_className())); llvmo::IRBuilder_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IRBuilder_O::static_packageName(),llvmo::IRBuilder_O::static_className())); llvmo::IntegerType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IntegerType_O::static_packageName(),llvmo::IntegerType_O::static_className())); llvmo::MDNode_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::MDNode_O::static_packageName(),llvmo::MDNode_O::static_className())); llvmo::MDString_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::MDString_O::static_packageName(),llvmo::MDString_O::static_className())); llvmo::ModulePass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ModulePass_O::static_packageName(),llvmo::ModulePass_O::static_className())); llvmo::User_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::User_O::static_packageName(),llvmo::User_O::static_className())); llvmo::Constant_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Constant_O::static_packageName(),llvmo::Constant_O::static_className())); llvmo::ImmutablePass_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ImmutablePass_O::static_packageName(),llvmo::ImmutablePass_O::static_className())); llvmo::Instruction_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Instruction_O::static_packageName(),llvmo::Instruction_O::static_className())); llvmo::SequentialType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::SequentialType_O::static_packageName(),llvmo::SequentialType_O::static_className())); llvmo::StructType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::StructType_O::static_packageName(),llvmo::StructType_O::static_className())); llvmo::ArrayType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ArrayType_O::static_packageName(),llvmo::ArrayType_O::static_className())); llvmo::AtomicCmpXchgInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AtomicCmpXchgInst_O::static_packageName(),llvmo::AtomicCmpXchgInst_O::static_className())); llvmo::AtomicRMWInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AtomicRMWInst_O::static_packageName(),llvmo::AtomicRMWInst_O::static_className())); llvmo::CallInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::CallInst_O::static_packageName(),llvmo::CallInst_O::static_className())); llvmo::ConstantArray_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantArray_O::static_packageName(),llvmo::ConstantArray_O::static_className())); llvmo::ConstantDataSequential_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantDataSequential_O::static_packageName(),llvmo::ConstantDataSequential_O::static_className())); llvmo::ConstantExpr_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantExpr_O::static_packageName(),llvmo::ConstantExpr_O::static_className())); llvmo::ConstantFP_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantFP_O::static_packageName(),llvmo::ConstantFP_O::static_className())); llvmo::ConstantInt_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantInt_O::static_packageName(),llvmo::ConstantInt_O::static_className())); llvmo::ConstantPointerNull_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantPointerNull_O::static_packageName(),llvmo::ConstantPointerNull_O::static_className())); llvmo::DataLayout_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::DataLayout_O::static_packageName(),llvmo::DataLayout_O::static_className())); llvmo::FenceInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::FenceInst_O::static_packageName(),llvmo::FenceInst_O::static_className())); llvmo::GlobalValue_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::GlobalValue_O::static_packageName(),llvmo::GlobalValue_O::static_className())); llvmo::LandingPadInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LandingPadInst_O::static_packageName(),llvmo::LandingPadInst_O::static_className())); llvmo::PHINode_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PHINode_O::static_packageName(),llvmo::PHINode_O::static_className())); llvmo::PointerType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::PointerType_O::static_packageName(),llvmo::PointerType_O::static_className())); llvmo::StoreInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::StoreInst_O::static_packageName(),llvmo::StoreInst_O::static_className())); llvmo::TerminatorInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::TerminatorInst_O::static_packageName(),llvmo::TerminatorInst_O::static_className())); llvmo::UnaryInstruction_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UnaryInstruction_O::static_packageName(),llvmo::UnaryInstruction_O::static_className())); llvmo::UndefValue_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UndefValue_O::static_packageName(),llvmo::UndefValue_O::static_className())); llvmo::VectorType_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::VectorType_O::static_packageName(),llvmo::VectorType_O::static_className())); llvmo::AllocaInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::AllocaInst_O::static_packageName(),llvmo::AllocaInst_O::static_className())); llvmo::BranchInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::BranchInst_O::static_packageName(),llvmo::BranchInst_O::static_className())); llvmo::ConstantDataArray_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ConstantDataArray_O::static_packageName(),llvmo::ConstantDataArray_O::static_className())); llvmo::Function_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::Function_O::static_packageName(),llvmo::Function_O::static_className())); llvmo::GlobalVariable_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::GlobalVariable_O::static_packageName(),llvmo::GlobalVariable_O::static_className())); llvmo::IndirectBrInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::IndirectBrInst_O::static_packageName(),llvmo::IndirectBrInst_O::static_className())); llvmo::InvokeInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::InvokeInst_O::static_packageName(),llvmo::InvokeInst_O::static_className())); llvmo::LoadInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::LoadInst_O::static_packageName(),llvmo::LoadInst_O::static_className())); llvmo::ResumeInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ResumeInst_O::static_packageName(),llvmo::ResumeInst_O::static_className())); llvmo::ReturnInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::ReturnInst_O::static_packageName(),llvmo::ReturnInst_O::static_className())); llvmo::SwitchInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::SwitchInst_O::static_packageName(),llvmo::SwitchInst_O::static_className())); llvmo::UnreachableInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::UnreachableInst_O::static_packageName(),llvmo::UnreachableInst_O::static_className())); llvmo::VAArgInst_O::___set_static_ClassSymbol(LOOKUP_SYMBOL(llvmo::VAArgInst_O::static_packageName(),llvmo::VAArgInst_O::static_className())); #endif // SET_SYMBOL #undef SET_SYMBOL #if defined(CREATE_CLASS) || defined(ALL_STAGES) // Depends on undefinedMetaClass core::MetaClass_sp undefinedMetaClass; undefinedMetaClass.reset(); LOG(BF("Creating class[classllvmo__APFloat_Oval]")); core::BuiltInClass_sp classllvmo__APFloat_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__APFloat_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__APFloat_Oval,_lisp,llvmo::APFloat_O::static_classSymbol()); llvmo::APFloat_O::___staticMetaClass = classllvmo__APFloat_Oval; _lisp->setf_findClass(llvmo::APFloat_O::static_classSymbol(),classllvmo__APFloat_Oval); { AllocatorCallback cb = &new_Nil; llvmo::APFloat_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::APFloat_O::static_className() % (void*)(llvmo::APFloat_O::static_newNil_callback()) ); classllvmo__APFloat_Oval->setInstance_newNil_callback(llvmo::APFloat_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::APFloat_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::APFloat_O::static_className() ); llvmo::APFloat_O::_nil = nil_for_class; classllvmo__APFloat_Oval->setInstanceNil(nil_for_class); } classllvmo__APFloat_Oval->setSupportsSlots(llvmo::APFloat_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__APInt_Oval]")); core::BuiltInClass_sp classllvmo__APInt_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__APInt_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__APInt_Oval,_lisp,llvmo::APInt_O::static_classSymbol()); llvmo::APInt_O::___staticMetaClass = classllvmo__APInt_Oval; _lisp->setf_findClass(llvmo::APInt_O::static_classSymbol(),classllvmo__APInt_Oval); { AllocatorCallback cb = &new_Nil; llvmo::APInt_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::APInt_O::static_className() % (void*)(llvmo::APInt_O::static_newNil_callback()) ); classllvmo__APInt_Oval->setInstance_newNil_callback(llvmo::APInt_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::APInt_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::APInt_O::static_className() ); llvmo::APInt_O::_nil = nil_for_class; classllvmo__APInt_Oval->setInstanceNil(nil_for_class); } classllvmo__APInt_Oval->setSupportsSlots(llvmo::APInt_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Attribute_Oval]")); core::BuiltInClass_sp classllvmo__Attribute_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Attribute_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Attribute_Oval,_lisp,llvmo::Attribute_O::static_classSymbol()); llvmo::Attribute_O::___staticMetaClass = classllvmo__Attribute_Oval; _lisp->setf_findClass(llvmo::Attribute_O::static_classSymbol(),classllvmo__Attribute_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Attribute_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Attribute_O::static_className() % (void*)(llvmo::Attribute_O::static_newNil_callback()) ); classllvmo__Attribute_Oval->setInstance_newNil_callback(llvmo::Attribute_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Attribute_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Attribute_O::static_className() ); llvmo::Attribute_O::_nil = nil_for_class; classllvmo__Attribute_Oval->setInstanceNil(nil_for_class); } classllvmo__Attribute_Oval->setSupportsSlots(llvmo::Attribute_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Builder_Oval]")); core::BuiltInClass_sp classllvmo__Builder_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Builder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Builder_Oval,_lisp,llvmo::Builder_O::static_classSymbol()); llvmo::Builder_O::___staticMetaClass = classllvmo__Builder_Oval; _lisp->setf_findClass(llvmo::Builder_O::static_classSymbol(),classllvmo__Builder_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Builder_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Builder_O::static_className() % (void*)(llvmo::Builder_O::static_newNil_callback()) ); classllvmo__Builder_Oval->setInstance_newNil_callback(llvmo::Builder_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Builder_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Builder_O::static_className() ); llvmo::Builder_O::_nil = nil_for_class; classllvmo__Builder_Oval->setInstanceNil(nil_for_class); } classllvmo__Builder_Oval->setSupportsSlots(llvmo::Builder_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__DebugLoc_Oval]")); core::BuiltInClass_sp classllvmo__DebugLoc_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__DebugLoc_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__DebugLoc_Oval,_lisp,llvmo::DebugLoc_O::static_classSymbol()); llvmo::DebugLoc_O::___staticMetaClass = classllvmo__DebugLoc_Oval; _lisp->setf_findClass(llvmo::DebugLoc_O::static_classSymbol(),classllvmo__DebugLoc_Oval); { AllocatorCallback cb = &new_Nil; llvmo::DebugLoc_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::DebugLoc_O::static_className() % (void*)(llvmo::DebugLoc_O::static_newNil_callback()) ); classllvmo__DebugLoc_Oval->setInstance_newNil_callback(llvmo::DebugLoc_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::DebugLoc_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::DebugLoc_O::static_className() ); llvmo::DebugLoc_O::_nil = nil_for_class; classllvmo__DebugLoc_Oval->setInstanceNil(nil_for_class); } classllvmo__DebugLoc_Oval->setSupportsSlots(llvmo::DebugLoc_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__EngineBuilder_Oval]")); core::BuiltInClass_sp classllvmo__EngineBuilder_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__EngineBuilder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__EngineBuilder_Oval,_lisp,llvmo::EngineBuilder_O::static_classSymbol()); llvmo::EngineBuilder_O::___staticMetaClass = classllvmo__EngineBuilder_Oval; _lisp->setf_findClass(llvmo::EngineBuilder_O::static_classSymbol(),classllvmo__EngineBuilder_Oval); { AllocatorCallback cb = &new_Nil; llvmo::EngineBuilder_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::EngineBuilder_O::static_className() % (void*)(llvmo::EngineBuilder_O::static_newNil_callback()) ); classllvmo__EngineBuilder_Oval->setInstance_newNil_callback(llvmo::EngineBuilder_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::EngineBuilder_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::EngineBuilder_O::static_className() ); llvmo::EngineBuilder_O::_nil = nil_for_class; classllvmo__EngineBuilder_Oval->setInstanceNil(nil_for_class); } classllvmo__EngineBuilder_Oval->setSupportsSlots(llvmo::EngineBuilder_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ExecutionEngine_Oval]")); core::BuiltInClass_sp classllvmo__ExecutionEngine_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ExecutionEngine_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ExecutionEngine_Oval,_lisp,llvmo::ExecutionEngine_O::static_classSymbol()); llvmo::ExecutionEngine_O::___staticMetaClass = classllvmo__ExecutionEngine_Oval; _lisp->setf_findClass(llvmo::ExecutionEngine_O::static_classSymbol(),classllvmo__ExecutionEngine_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ExecutionEngine_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ExecutionEngine_O::static_className() % (void*)(llvmo::ExecutionEngine_O::static_newNil_callback()) ); classllvmo__ExecutionEngine_Oval->setInstance_newNil_callback(llvmo::ExecutionEngine_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ExecutionEngine_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ExecutionEngine_O::static_className() ); llvmo::ExecutionEngine_O::_nil = nil_for_class; classllvmo__ExecutionEngine_Oval->setInstanceNil(nil_for_class); } classllvmo__ExecutionEngine_Oval->setSupportsSlots(llvmo::ExecutionEngine_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__IRBuilderBase_Oval]")); core::BuiltInClass_sp classllvmo__IRBuilderBase_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__IRBuilderBase_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IRBuilderBase_Oval,_lisp,llvmo::IRBuilderBase_O::static_classSymbol()); llvmo::IRBuilderBase_O::___staticMetaClass = classllvmo__IRBuilderBase_Oval; _lisp->setf_findClass(llvmo::IRBuilderBase_O::static_classSymbol(),classllvmo__IRBuilderBase_Oval); { AllocatorCallback cb = &new_Nil; llvmo::IRBuilderBase_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::IRBuilderBase_O::static_className() % (void*)(llvmo::IRBuilderBase_O::static_newNil_callback()) ); classllvmo__IRBuilderBase_Oval->setInstance_newNil_callback(llvmo::IRBuilderBase_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::IRBuilderBase_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::IRBuilderBase_O::static_className() ); llvmo::IRBuilderBase_O::_nil = nil_for_class; classllvmo__IRBuilderBase_Oval->setInstanceNil(nil_for_class); } classllvmo__IRBuilderBase_Oval->setSupportsSlots(llvmo::IRBuilderBase_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__InsertPoint_Oval]")); core::BuiltInClass_sp classllvmo__InsertPoint_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__InsertPoint_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__InsertPoint_Oval,_lisp,llvmo::InsertPoint_O::static_classSymbol()); llvmo::InsertPoint_O::___staticMetaClass = classllvmo__InsertPoint_Oval; _lisp->setf_findClass(llvmo::InsertPoint_O::static_classSymbol(),classllvmo__InsertPoint_Oval); { AllocatorCallback cb = &new_Nil; llvmo::InsertPoint_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::InsertPoint_O::static_className() % (void*)(llvmo::InsertPoint_O::static_newNil_callback()) ); classllvmo__InsertPoint_Oval->setInstance_newNil_callback(llvmo::InsertPoint_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::InsertPoint_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::InsertPoint_O::static_className() ); llvmo::InsertPoint_O::_nil = nil_for_class; classllvmo__InsertPoint_Oval->setInstanceNil(nil_for_class); } classllvmo__InsertPoint_Oval->setSupportsSlots(llvmo::InsertPoint_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__LLVMContext_Oval]")); core::BuiltInClass_sp classllvmo__LLVMContext_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__LLVMContext_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LLVMContext_Oval,_lisp,llvmo::LLVMContext_O::static_classSymbol()); llvmo::LLVMContext_O::___staticMetaClass = classllvmo__LLVMContext_Oval; _lisp->setf_findClass(llvmo::LLVMContext_O::static_classSymbol(),classllvmo__LLVMContext_Oval); { AllocatorCallback cb = &new_Nil; llvmo::LLVMContext_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::LLVMContext_O::static_className() % (void*)(llvmo::LLVMContext_O::static_newNil_callback()) ); classllvmo__LLVMContext_Oval->setInstance_newNil_callback(llvmo::LLVMContext_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::LLVMContext_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::LLVMContext_O::static_className() ); llvmo::LLVMContext_O::_nil = nil_for_class; classllvmo__LLVMContext_Oval->setInstanceNil(nil_for_class); } classllvmo__LLVMContext_Oval->setSupportsSlots(llvmo::LLVMContext_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Module_Oval]")); core::BuiltInClass_sp classllvmo__Module_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Module_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Module_Oval,_lisp,llvmo::Module_O::static_classSymbol()); llvmo::Module_O::___staticMetaClass = classllvmo__Module_Oval; _lisp->setf_findClass(llvmo::Module_O::static_classSymbol(),classllvmo__Module_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Module_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Module_O::static_className() % (void*)(llvmo::Module_O::static_newNil_callback()) ); classllvmo__Module_Oval->setInstance_newNil_callback(llvmo::Module_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Module_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Module_O::static_className() ); llvmo::Module_O::_nil = nil_for_class; classllvmo__Module_Oval->setInstanceNil(nil_for_class); } classllvmo__Module_Oval->setSupportsSlots(llvmo::Module_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__PassManagerBase_Oval]")); core::BuiltInClass_sp classllvmo__PassManagerBase_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__PassManagerBase_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PassManagerBase_Oval,_lisp,llvmo::PassManagerBase_O::static_classSymbol()); llvmo::PassManagerBase_O::___staticMetaClass = classllvmo__PassManagerBase_Oval; _lisp->setf_findClass(llvmo::PassManagerBase_O::static_classSymbol(),classllvmo__PassManagerBase_Oval); { AllocatorCallback cb = &new_Nil; llvmo::PassManagerBase_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::PassManagerBase_O::static_className() % (void*)(llvmo::PassManagerBase_O::static_newNil_callback()) ); classllvmo__PassManagerBase_Oval->setInstance_newNil_callback(llvmo::PassManagerBase_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::PassManagerBase_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::PassManagerBase_O::static_className() ); llvmo::PassManagerBase_O::_nil = nil_for_class; classllvmo__PassManagerBase_Oval->setInstanceNil(nil_for_class); } classllvmo__PassManagerBase_Oval->setSupportsSlots(llvmo::PassManagerBase_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Pass_Oval]")); core::BuiltInClass_sp classllvmo__Pass_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Pass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Pass_Oval,_lisp,llvmo::Pass_O::static_classSymbol()); llvmo::Pass_O::___staticMetaClass = classllvmo__Pass_Oval; _lisp->setf_findClass(llvmo::Pass_O::static_classSymbol(),classllvmo__Pass_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Pass_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Pass_O::static_className() % (void*)(llvmo::Pass_O::static_newNil_callback()) ); classllvmo__Pass_Oval->setInstance_newNil_callback(llvmo::Pass_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Pass_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Pass_O::static_className() ); llvmo::Pass_O::_nil = nil_for_class; classllvmo__Pass_Oval->setInstanceNil(nil_for_class); } classllvmo__Pass_Oval->setSupportsSlots(llvmo::Pass_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Type_Oval]")); core::BuiltInClass_sp classllvmo__Type_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Type_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Type_Oval,_lisp,llvmo::Type_O::static_classSymbol()); llvmo::Type_O::___staticMetaClass = classllvmo__Type_Oval; _lisp->setf_findClass(llvmo::Type_O::static_classSymbol(),classllvmo__Type_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Type_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Type_O::static_className() % (void*)(llvmo::Type_O::static_newNil_callback()) ); classllvmo__Type_Oval->setInstance_newNil_callback(llvmo::Type_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Type_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Type_O::static_className() ); llvmo::Type_O::_nil = nil_for_class; classllvmo__Type_Oval->setInstanceNil(nil_for_class); } classllvmo__Type_Oval->setSupportsSlots(llvmo::Type_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Value_Oval]")); core::BuiltInClass_sp classllvmo__Value_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Value_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Value_Oval,_lisp,llvmo::Value_O::static_classSymbol()); llvmo::Value_O::___staticMetaClass = classllvmo__Value_Oval; _lisp->setf_findClass(llvmo::Value_O::static_classSymbol(),classllvmo__Value_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Value_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Value_O::static_className() % (void*)(llvmo::Value_O::static_newNil_callback()) ); classllvmo__Value_Oval->setInstance_newNil_callback(llvmo::Value_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Value_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Value_O::static_className() ); llvmo::Value_O::_nil = nil_for_class; classllvmo__Value_Oval->setInstanceNil(nil_for_class); } classllvmo__Value_Oval->setSupportsSlots(llvmo::Value_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Argument_Oval]")); core::BuiltInClass_sp classllvmo__Argument_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Argument_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Argument_Oval,_lisp,llvmo::Argument_O::static_classSymbol()); llvmo::Argument_O::___staticMetaClass = classllvmo__Argument_Oval; _lisp->setf_findClass(llvmo::Argument_O::static_classSymbol(),classllvmo__Argument_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Argument_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Argument_O::static_className() % (void*)(llvmo::Argument_O::static_newNil_callback()) ); classllvmo__Argument_Oval->setInstance_newNil_callback(llvmo::Argument_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Argument_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Argument_O::static_className() ); llvmo::Argument_O::_nil = nil_for_class; classllvmo__Argument_Oval->setInstanceNil(nil_for_class); } classllvmo__Argument_Oval->setSupportsSlots(llvmo::Argument_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__BasicBlock_Oval]")); core::BuiltInClass_sp classllvmo__BasicBlock_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__BasicBlock_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__BasicBlock_Oval,_lisp,llvmo::BasicBlock_O::static_classSymbol()); llvmo::BasicBlock_O::___staticMetaClass = classllvmo__BasicBlock_Oval; _lisp->setf_findClass(llvmo::BasicBlock_O::static_classSymbol(),classllvmo__BasicBlock_Oval); { AllocatorCallback cb = &new_Nil; llvmo::BasicBlock_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::BasicBlock_O::static_className() % (void*)(llvmo::BasicBlock_O::static_newNil_callback()) ); classllvmo__BasicBlock_Oval->setInstance_newNil_callback(llvmo::BasicBlock_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::BasicBlock_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::BasicBlock_O::static_className() ); llvmo::BasicBlock_O::_nil = nil_for_class; classllvmo__BasicBlock_Oval->setInstanceNil(nil_for_class); } classllvmo__BasicBlock_Oval->setSupportsSlots(llvmo::BasicBlock_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__CompositeType_Oval]")); core::BuiltInClass_sp classllvmo__CompositeType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__CompositeType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__CompositeType_Oval,_lisp,llvmo::CompositeType_O::static_classSymbol()); llvmo::CompositeType_O::___staticMetaClass = classllvmo__CompositeType_Oval; _lisp->setf_findClass(llvmo::CompositeType_O::static_classSymbol(),classllvmo__CompositeType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::CompositeType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::CompositeType_O::static_className() % (void*)(llvmo::CompositeType_O::static_newNil_callback()) ); classllvmo__CompositeType_Oval->setInstance_newNil_callback(llvmo::CompositeType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::CompositeType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::CompositeType_O::static_className() ); llvmo::CompositeType_O::_nil = nil_for_class; classllvmo__CompositeType_Oval->setInstanceNil(nil_for_class); } classllvmo__CompositeType_Oval->setSupportsSlots(llvmo::CompositeType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__FunctionPassManager_Oval]")); core::BuiltInClass_sp classllvmo__FunctionPassManager_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__FunctionPassManager_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionPassManager_Oval,_lisp,llvmo::FunctionPassManager_O::static_classSymbol()); llvmo::FunctionPassManager_O::___staticMetaClass = classllvmo__FunctionPassManager_Oval; _lisp->setf_findClass(llvmo::FunctionPassManager_O::static_classSymbol(),classllvmo__FunctionPassManager_Oval); { AllocatorCallback cb = &new_Nil; llvmo::FunctionPassManager_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::FunctionPassManager_O::static_className() % (void*)(llvmo::FunctionPassManager_O::static_newNil_callback()) ); classllvmo__FunctionPassManager_Oval->setInstance_newNil_callback(llvmo::FunctionPassManager_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::FunctionPassManager_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::FunctionPassManager_O::static_className() ); llvmo::FunctionPassManager_O::_nil = nil_for_class; classllvmo__FunctionPassManager_Oval->setInstanceNil(nil_for_class); } classllvmo__FunctionPassManager_Oval->setSupportsSlots(llvmo::FunctionPassManager_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__FunctionPass_Oval]")); core::BuiltInClass_sp classllvmo__FunctionPass_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__FunctionPass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionPass_Oval,_lisp,llvmo::FunctionPass_O::static_classSymbol()); llvmo::FunctionPass_O::___staticMetaClass = classllvmo__FunctionPass_Oval; _lisp->setf_findClass(llvmo::FunctionPass_O::static_classSymbol(),classllvmo__FunctionPass_Oval); { AllocatorCallback cb = &new_Nil; llvmo::FunctionPass_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::FunctionPass_O::static_className() % (void*)(llvmo::FunctionPass_O::static_newNil_callback()) ); classllvmo__FunctionPass_Oval->setInstance_newNil_callback(llvmo::FunctionPass_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::FunctionPass_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::FunctionPass_O::static_className() ); llvmo::FunctionPass_O::_nil = nil_for_class; classllvmo__FunctionPass_Oval->setInstanceNil(nil_for_class); } classllvmo__FunctionPass_Oval->setSupportsSlots(llvmo::FunctionPass_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__FunctionType_Oval]")); core::BuiltInClass_sp classllvmo__FunctionType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__FunctionType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FunctionType_Oval,_lisp,llvmo::FunctionType_O::static_classSymbol()); llvmo::FunctionType_O::___staticMetaClass = classllvmo__FunctionType_Oval; _lisp->setf_findClass(llvmo::FunctionType_O::static_classSymbol(),classllvmo__FunctionType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::FunctionType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::FunctionType_O::static_className() % (void*)(llvmo::FunctionType_O::static_newNil_callback()) ); classllvmo__FunctionType_Oval->setInstance_newNil_callback(llvmo::FunctionType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::FunctionType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::FunctionType_O::static_className() ); llvmo::FunctionType_O::_nil = nil_for_class; classllvmo__FunctionType_Oval->setInstanceNil(nil_for_class); } classllvmo__FunctionType_Oval->setSupportsSlots(llvmo::FunctionType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__IRBuilder_Oval]")); core::BuiltInClass_sp classllvmo__IRBuilder_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__IRBuilder_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IRBuilder_Oval,_lisp,llvmo::IRBuilder_O::static_classSymbol()); llvmo::IRBuilder_O::___staticMetaClass = classllvmo__IRBuilder_Oval; _lisp->setf_findClass(llvmo::IRBuilder_O::static_classSymbol(),classllvmo__IRBuilder_Oval); { AllocatorCallback cb = &new_Nil; llvmo::IRBuilder_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::IRBuilder_O::static_className() % (void*)(llvmo::IRBuilder_O::static_newNil_callback()) ); classllvmo__IRBuilder_Oval->setInstance_newNil_callback(llvmo::IRBuilder_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::IRBuilder_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::IRBuilder_O::static_className() ); llvmo::IRBuilder_O::_nil = nil_for_class; classllvmo__IRBuilder_Oval->setInstanceNil(nil_for_class); } classllvmo__IRBuilder_Oval->setSupportsSlots(llvmo::IRBuilder_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__IntegerType_Oval]")); core::BuiltInClass_sp classllvmo__IntegerType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__IntegerType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IntegerType_Oval,_lisp,llvmo::IntegerType_O::static_classSymbol()); llvmo::IntegerType_O::___staticMetaClass = classllvmo__IntegerType_Oval; _lisp->setf_findClass(llvmo::IntegerType_O::static_classSymbol(),classllvmo__IntegerType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::IntegerType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::IntegerType_O::static_className() % (void*)(llvmo::IntegerType_O::static_newNil_callback()) ); classllvmo__IntegerType_Oval->setInstance_newNil_callback(llvmo::IntegerType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::IntegerType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::IntegerType_O::static_className() ); llvmo::IntegerType_O::_nil = nil_for_class; classllvmo__IntegerType_Oval->setInstanceNil(nil_for_class); } classllvmo__IntegerType_Oval->setSupportsSlots(llvmo::IntegerType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__MDNode_Oval]")); core::BuiltInClass_sp classllvmo__MDNode_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__MDNode_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__MDNode_Oval,_lisp,llvmo::MDNode_O::static_classSymbol()); llvmo::MDNode_O::___staticMetaClass = classllvmo__MDNode_Oval; _lisp->setf_findClass(llvmo::MDNode_O::static_classSymbol(),classllvmo__MDNode_Oval); { AllocatorCallback cb = &new_Nil; llvmo::MDNode_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::MDNode_O::static_className() % (void*)(llvmo::MDNode_O::static_newNil_callback()) ); classllvmo__MDNode_Oval->setInstance_newNil_callback(llvmo::MDNode_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::MDNode_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::MDNode_O::static_className() ); llvmo::MDNode_O::_nil = nil_for_class; classllvmo__MDNode_Oval->setInstanceNil(nil_for_class); } classllvmo__MDNode_Oval->setSupportsSlots(llvmo::MDNode_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__MDString_Oval]")); core::BuiltInClass_sp classllvmo__MDString_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__MDString_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__MDString_Oval,_lisp,llvmo::MDString_O::static_classSymbol()); llvmo::MDString_O::___staticMetaClass = classllvmo__MDString_Oval; _lisp->setf_findClass(llvmo::MDString_O::static_classSymbol(),classllvmo__MDString_Oval); { AllocatorCallback cb = &new_Nil; llvmo::MDString_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::MDString_O::static_className() % (void*)(llvmo::MDString_O::static_newNil_callback()) ); classllvmo__MDString_Oval->setInstance_newNil_callback(llvmo::MDString_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::MDString_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::MDString_O::static_className() ); llvmo::MDString_O::_nil = nil_for_class; classllvmo__MDString_Oval->setInstanceNil(nil_for_class); } classllvmo__MDString_Oval->setSupportsSlots(llvmo::MDString_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ModulePass_Oval]")); core::BuiltInClass_sp classllvmo__ModulePass_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ModulePass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ModulePass_Oval,_lisp,llvmo::ModulePass_O::static_classSymbol()); llvmo::ModulePass_O::___staticMetaClass = classllvmo__ModulePass_Oval; _lisp->setf_findClass(llvmo::ModulePass_O::static_classSymbol(),classllvmo__ModulePass_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ModulePass_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ModulePass_O::static_className() % (void*)(llvmo::ModulePass_O::static_newNil_callback()) ); classllvmo__ModulePass_Oval->setInstance_newNil_callback(llvmo::ModulePass_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ModulePass_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ModulePass_O::static_className() ); llvmo::ModulePass_O::_nil = nil_for_class; classllvmo__ModulePass_Oval->setInstanceNil(nil_for_class); } classllvmo__ModulePass_Oval->setSupportsSlots(llvmo::ModulePass_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__User_Oval]")); core::BuiltInClass_sp classllvmo__User_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__User_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__User_Oval,_lisp,llvmo::User_O::static_classSymbol()); llvmo::User_O::___staticMetaClass = classllvmo__User_Oval; _lisp->setf_findClass(llvmo::User_O::static_classSymbol(),classllvmo__User_Oval); { AllocatorCallback cb = &new_Nil; llvmo::User_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::User_O::static_className() % (void*)(llvmo::User_O::static_newNil_callback()) ); classllvmo__User_Oval->setInstance_newNil_callback(llvmo::User_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::User_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::User_O::static_className() ); llvmo::User_O::_nil = nil_for_class; classllvmo__User_Oval->setInstanceNil(nil_for_class); } classllvmo__User_Oval->setSupportsSlots(llvmo::User_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Constant_Oval]")); core::BuiltInClass_sp classllvmo__Constant_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Constant_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Constant_Oval,_lisp,llvmo::Constant_O::static_classSymbol()); llvmo::Constant_O::___staticMetaClass = classllvmo__Constant_Oval; _lisp->setf_findClass(llvmo::Constant_O::static_classSymbol(),classllvmo__Constant_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Constant_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Constant_O::static_className() % (void*)(llvmo::Constant_O::static_newNil_callback()) ); classllvmo__Constant_Oval->setInstance_newNil_callback(llvmo::Constant_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Constant_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Constant_O::static_className() ); llvmo::Constant_O::_nil = nil_for_class; classllvmo__Constant_Oval->setInstanceNil(nil_for_class); } classllvmo__Constant_Oval->setSupportsSlots(llvmo::Constant_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ImmutablePass_Oval]")); core::BuiltInClass_sp classllvmo__ImmutablePass_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ImmutablePass_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ImmutablePass_Oval,_lisp,llvmo::ImmutablePass_O::static_classSymbol()); llvmo::ImmutablePass_O::___staticMetaClass = classllvmo__ImmutablePass_Oval; _lisp->setf_findClass(llvmo::ImmutablePass_O::static_classSymbol(),classllvmo__ImmutablePass_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ImmutablePass_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ImmutablePass_O::static_className() % (void*)(llvmo::ImmutablePass_O::static_newNil_callback()) ); classllvmo__ImmutablePass_Oval->setInstance_newNil_callback(llvmo::ImmutablePass_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ImmutablePass_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ImmutablePass_O::static_className() ); llvmo::ImmutablePass_O::_nil = nil_for_class; classllvmo__ImmutablePass_Oval->setInstanceNil(nil_for_class); } classllvmo__ImmutablePass_Oval->setSupportsSlots(llvmo::ImmutablePass_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Instruction_Oval]")); core::BuiltInClass_sp classllvmo__Instruction_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Instruction_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Instruction_Oval,_lisp,llvmo::Instruction_O::static_classSymbol()); llvmo::Instruction_O::___staticMetaClass = classllvmo__Instruction_Oval; _lisp->setf_findClass(llvmo::Instruction_O::static_classSymbol(),classllvmo__Instruction_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Instruction_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Instruction_O::static_className() % (void*)(llvmo::Instruction_O::static_newNil_callback()) ); classllvmo__Instruction_Oval->setInstance_newNil_callback(llvmo::Instruction_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Instruction_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Instruction_O::static_className() ); llvmo::Instruction_O::_nil = nil_for_class; classllvmo__Instruction_Oval->setInstanceNil(nil_for_class); } classllvmo__Instruction_Oval->setSupportsSlots(llvmo::Instruction_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__SequentialType_Oval]")); core::BuiltInClass_sp classllvmo__SequentialType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__SequentialType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__SequentialType_Oval,_lisp,llvmo::SequentialType_O::static_classSymbol()); llvmo::SequentialType_O::___staticMetaClass = classllvmo__SequentialType_Oval; _lisp->setf_findClass(llvmo::SequentialType_O::static_classSymbol(),classllvmo__SequentialType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::SequentialType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::SequentialType_O::static_className() % (void*)(llvmo::SequentialType_O::static_newNil_callback()) ); classllvmo__SequentialType_Oval->setInstance_newNil_callback(llvmo::SequentialType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::SequentialType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::SequentialType_O::static_className() ); llvmo::SequentialType_O::_nil = nil_for_class; classllvmo__SequentialType_Oval->setInstanceNil(nil_for_class); } classllvmo__SequentialType_Oval->setSupportsSlots(llvmo::SequentialType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__StructType_Oval]")); core::BuiltInClass_sp classllvmo__StructType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__StructType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__StructType_Oval,_lisp,llvmo::StructType_O::static_classSymbol()); llvmo::StructType_O::___staticMetaClass = classllvmo__StructType_Oval; _lisp->setf_findClass(llvmo::StructType_O::static_classSymbol(),classllvmo__StructType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::StructType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::StructType_O::static_className() % (void*)(llvmo::StructType_O::static_newNil_callback()) ); classllvmo__StructType_Oval->setInstance_newNil_callback(llvmo::StructType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::StructType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::StructType_O::static_className() ); llvmo::StructType_O::_nil = nil_for_class; classllvmo__StructType_Oval->setInstanceNil(nil_for_class); } classllvmo__StructType_Oval->setSupportsSlots(llvmo::StructType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ArrayType_Oval]")); core::BuiltInClass_sp classllvmo__ArrayType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ArrayType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ArrayType_Oval,_lisp,llvmo::ArrayType_O::static_classSymbol()); llvmo::ArrayType_O::___staticMetaClass = classllvmo__ArrayType_Oval; _lisp->setf_findClass(llvmo::ArrayType_O::static_classSymbol(),classllvmo__ArrayType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ArrayType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ArrayType_O::static_className() % (void*)(llvmo::ArrayType_O::static_newNil_callback()) ); classllvmo__ArrayType_Oval->setInstance_newNil_callback(llvmo::ArrayType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ArrayType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ArrayType_O::static_className() ); llvmo::ArrayType_O::_nil = nil_for_class; classllvmo__ArrayType_Oval->setInstanceNil(nil_for_class); } classllvmo__ArrayType_Oval->setSupportsSlots(llvmo::ArrayType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__AtomicCmpXchgInst_Oval]")); core::BuiltInClass_sp classllvmo__AtomicCmpXchgInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__AtomicCmpXchgInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AtomicCmpXchgInst_Oval,_lisp,llvmo::AtomicCmpXchgInst_O::static_classSymbol()); llvmo::AtomicCmpXchgInst_O::___staticMetaClass = classllvmo__AtomicCmpXchgInst_Oval; _lisp->setf_findClass(llvmo::AtomicCmpXchgInst_O::static_classSymbol(),classllvmo__AtomicCmpXchgInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::AtomicCmpXchgInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::AtomicCmpXchgInst_O::static_className() % (void*)(llvmo::AtomicCmpXchgInst_O::static_newNil_callback()) ); classllvmo__AtomicCmpXchgInst_Oval->setInstance_newNil_callback(llvmo::AtomicCmpXchgInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::AtomicCmpXchgInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::AtomicCmpXchgInst_O::static_className() ); llvmo::AtomicCmpXchgInst_O::_nil = nil_for_class; classllvmo__AtomicCmpXchgInst_Oval->setInstanceNil(nil_for_class); } classllvmo__AtomicCmpXchgInst_Oval->setSupportsSlots(llvmo::AtomicCmpXchgInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__AtomicRMWInst_Oval]")); core::BuiltInClass_sp classllvmo__AtomicRMWInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__AtomicRMWInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AtomicRMWInst_Oval,_lisp,llvmo::AtomicRMWInst_O::static_classSymbol()); llvmo::AtomicRMWInst_O::___staticMetaClass = classllvmo__AtomicRMWInst_Oval; _lisp->setf_findClass(llvmo::AtomicRMWInst_O::static_classSymbol(),classllvmo__AtomicRMWInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::AtomicRMWInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::AtomicRMWInst_O::static_className() % (void*)(llvmo::AtomicRMWInst_O::static_newNil_callback()) ); classllvmo__AtomicRMWInst_Oval->setInstance_newNil_callback(llvmo::AtomicRMWInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::AtomicRMWInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::AtomicRMWInst_O::static_className() ); llvmo::AtomicRMWInst_O::_nil = nil_for_class; classllvmo__AtomicRMWInst_Oval->setInstanceNil(nil_for_class); } classllvmo__AtomicRMWInst_Oval->setSupportsSlots(llvmo::AtomicRMWInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__CallInst_Oval]")); core::BuiltInClass_sp classllvmo__CallInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__CallInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__CallInst_Oval,_lisp,llvmo::CallInst_O::static_classSymbol()); llvmo::CallInst_O::___staticMetaClass = classllvmo__CallInst_Oval; _lisp->setf_findClass(llvmo::CallInst_O::static_classSymbol(),classllvmo__CallInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::CallInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::CallInst_O::static_className() % (void*)(llvmo::CallInst_O::static_newNil_callback()) ); classllvmo__CallInst_Oval->setInstance_newNil_callback(llvmo::CallInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::CallInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::CallInst_O::static_className() ); llvmo::CallInst_O::_nil = nil_for_class; classllvmo__CallInst_Oval->setInstanceNil(nil_for_class); } classllvmo__CallInst_Oval->setSupportsSlots(llvmo::CallInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantArray_Oval]")); core::BuiltInClass_sp classllvmo__ConstantArray_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantArray_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantArray_Oval,_lisp,llvmo::ConstantArray_O::static_classSymbol()); llvmo::ConstantArray_O::___staticMetaClass = classllvmo__ConstantArray_Oval; _lisp->setf_findClass(llvmo::ConstantArray_O::static_classSymbol(),classllvmo__ConstantArray_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantArray_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantArray_O::static_className() % (void*)(llvmo::ConstantArray_O::static_newNil_callback()) ); classllvmo__ConstantArray_Oval->setInstance_newNil_callback(llvmo::ConstantArray_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantArray_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantArray_O::static_className() ); llvmo::ConstantArray_O::_nil = nil_for_class; classllvmo__ConstantArray_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantArray_Oval->setSupportsSlots(llvmo::ConstantArray_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantDataSequential_Oval]")); core::BuiltInClass_sp classllvmo__ConstantDataSequential_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantDataSequential_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantDataSequential_Oval,_lisp,llvmo::ConstantDataSequential_O::static_classSymbol()); llvmo::ConstantDataSequential_O::___staticMetaClass = classllvmo__ConstantDataSequential_Oval; _lisp->setf_findClass(llvmo::ConstantDataSequential_O::static_classSymbol(),classllvmo__ConstantDataSequential_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantDataSequential_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantDataSequential_O::static_className() % (void*)(llvmo::ConstantDataSequential_O::static_newNil_callback()) ); classllvmo__ConstantDataSequential_Oval->setInstance_newNil_callback(llvmo::ConstantDataSequential_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantDataSequential_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantDataSequential_O::static_className() ); llvmo::ConstantDataSequential_O::_nil = nil_for_class; classllvmo__ConstantDataSequential_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantDataSequential_Oval->setSupportsSlots(llvmo::ConstantDataSequential_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantExpr_Oval]")); core::BuiltInClass_sp classllvmo__ConstantExpr_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantExpr_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantExpr_Oval,_lisp,llvmo::ConstantExpr_O::static_classSymbol()); llvmo::ConstantExpr_O::___staticMetaClass = classllvmo__ConstantExpr_Oval; _lisp->setf_findClass(llvmo::ConstantExpr_O::static_classSymbol(),classllvmo__ConstantExpr_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantExpr_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantExpr_O::static_className() % (void*)(llvmo::ConstantExpr_O::static_newNil_callback()) ); classllvmo__ConstantExpr_Oval->setInstance_newNil_callback(llvmo::ConstantExpr_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantExpr_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantExpr_O::static_className() ); llvmo::ConstantExpr_O::_nil = nil_for_class; classllvmo__ConstantExpr_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantExpr_Oval->setSupportsSlots(llvmo::ConstantExpr_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantFP_Oval]")); core::BuiltInClass_sp classllvmo__ConstantFP_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantFP_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantFP_Oval,_lisp,llvmo::ConstantFP_O::static_classSymbol()); llvmo::ConstantFP_O::___staticMetaClass = classllvmo__ConstantFP_Oval; _lisp->setf_findClass(llvmo::ConstantFP_O::static_classSymbol(),classllvmo__ConstantFP_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantFP_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantFP_O::static_className() % (void*)(llvmo::ConstantFP_O::static_newNil_callback()) ); classllvmo__ConstantFP_Oval->setInstance_newNil_callback(llvmo::ConstantFP_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantFP_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantFP_O::static_className() ); llvmo::ConstantFP_O::_nil = nil_for_class; classllvmo__ConstantFP_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantFP_Oval->setSupportsSlots(llvmo::ConstantFP_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantInt_Oval]")); core::BuiltInClass_sp classllvmo__ConstantInt_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantInt_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantInt_Oval,_lisp,llvmo::ConstantInt_O::static_classSymbol()); llvmo::ConstantInt_O::___staticMetaClass = classllvmo__ConstantInt_Oval; _lisp->setf_findClass(llvmo::ConstantInt_O::static_classSymbol(),classllvmo__ConstantInt_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantInt_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantInt_O::static_className() % (void*)(llvmo::ConstantInt_O::static_newNil_callback()) ); classllvmo__ConstantInt_Oval->setInstance_newNil_callback(llvmo::ConstantInt_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantInt_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantInt_O::static_className() ); llvmo::ConstantInt_O::_nil = nil_for_class; classllvmo__ConstantInt_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantInt_Oval->setSupportsSlots(llvmo::ConstantInt_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantPointerNull_Oval]")); core::BuiltInClass_sp classllvmo__ConstantPointerNull_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantPointerNull_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantPointerNull_Oval,_lisp,llvmo::ConstantPointerNull_O::static_classSymbol()); llvmo::ConstantPointerNull_O::___staticMetaClass = classllvmo__ConstantPointerNull_Oval; _lisp->setf_findClass(llvmo::ConstantPointerNull_O::static_classSymbol(),classllvmo__ConstantPointerNull_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantPointerNull_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantPointerNull_O::static_className() % (void*)(llvmo::ConstantPointerNull_O::static_newNil_callback()) ); classllvmo__ConstantPointerNull_Oval->setInstance_newNil_callback(llvmo::ConstantPointerNull_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantPointerNull_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantPointerNull_O::static_className() ); llvmo::ConstantPointerNull_O::_nil = nil_for_class; classllvmo__ConstantPointerNull_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantPointerNull_Oval->setSupportsSlots(llvmo::ConstantPointerNull_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__DataLayout_Oval]")); core::BuiltInClass_sp classllvmo__DataLayout_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__DataLayout_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__DataLayout_Oval,_lisp,llvmo::DataLayout_O::static_classSymbol()); llvmo::DataLayout_O::___staticMetaClass = classllvmo__DataLayout_Oval; _lisp->setf_findClass(llvmo::DataLayout_O::static_classSymbol(),classllvmo__DataLayout_Oval); { AllocatorCallback cb = &new_Nil; llvmo::DataLayout_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::DataLayout_O::static_className() % (void*)(llvmo::DataLayout_O::static_newNil_callback()) ); classllvmo__DataLayout_Oval->setInstance_newNil_callback(llvmo::DataLayout_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::DataLayout_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::DataLayout_O::static_className() ); llvmo::DataLayout_O::_nil = nil_for_class; classllvmo__DataLayout_Oval->setInstanceNil(nil_for_class); } classllvmo__DataLayout_Oval->setSupportsSlots(llvmo::DataLayout_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__FenceInst_Oval]")); core::BuiltInClass_sp classllvmo__FenceInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__FenceInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__FenceInst_Oval,_lisp,llvmo::FenceInst_O::static_classSymbol()); llvmo::FenceInst_O::___staticMetaClass = classllvmo__FenceInst_Oval; _lisp->setf_findClass(llvmo::FenceInst_O::static_classSymbol(),classllvmo__FenceInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::FenceInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::FenceInst_O::static_className() % (void*)(llvmo::FenceInst_O::static_newNil_callback()) ); classllvmo__FenceInst_Oval->setInstance_newNil_callback(llvmo::FenceInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::FenceInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::FenceInst_O::static_className() ); llvmo::FenceInst_O::_nil = nil_for_class; classllvmo__FenceInst_Oval->setInstanceNil(nil_for_class); } classllvmo__FenceInst_Oval->setSupportsSlots(llvmo::FenceInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__GlobalValue_Oval]")); core::BuiltInClass_sp classllvmo__GlobalValue_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__GlobalValue_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__GlobalValue_Oval,_lisp,llvmo::GlobalValue_O::static_classSymbol()); llvmo::GlobalValue_O::___staticMetaClass = classllvmo__GlobalValue_Oval; _lisp->setf_findClass(llvmo::GlobalValue_O::static_classSymbol(),classllvmo__GlobalValue_Oval); { AllocatorCallback cb = &new_Nil; llvmo::GlobalValue_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::GlobalValue_O::static_className() % (void*)(llvmo::GlobalValue_O::static_newNil_callback()) ); classllvmo__GlobalValue_Oval->setInstance_newNil_callback(llvmo::GlobalValue_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::GlobalValue_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::GlobalValue_O::static_className() ); llvmo::GlobalValue_O::_nil = nil_for_class; classllvmo__GlobalValue_Oval->setInstanceNil(nil_for_class); } classllvmo__GlobalValue_Oval->setSupportsSlots(llvmo::GlobalValue_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__LandingPadInst_Oval]")); core::BuiltInClass_sp classllvmo__LandingPadInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__LandingPadInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LandingPadInst_Oval,_lisp,llvmo::LandingPadInst_O::static_classSymbol()); llvmo::LandingPadInst_O::___staticMetaClass = classllvmo__LandingPadInst_Oval; _lisp->setf_findClass(llvmo::LandingPadInst_O::static_classSymbol(),classllvmo__LandingPadInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::LandingPadInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::LandingPadInst_O::static_className() % (void*)(llvmo::LandingPadInst_O::static_newNil_callback()) ); classllvmo__LandingPadInst_Oval->setInstance_newNil_callback(llvmo::LandingPadInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::LandingPadInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::LandingPadInst_O::static_className() ); llvmo::LandingPadInst_O::_nil = nil_for_class; classllvmo__LandingPadInst_Oval->setInstanceNil(nil_for_class); } classllvmo__LandingPadInst_Oval->setSupportsSlots(llvmo::LandingPadInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__PHINode_Oval]")); core::BuiltInClass_sp classllvmo__PHINode_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__PHINode_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PHINode_Oval,_lisp,llvmo::PHINode_O::static_classSymbol()); llvmo::PHINode_O::___staticMetaClass = classllvmo__PHINode_Oval; _lisp->setf_findClass(llvmo::PHINode_O::static_classSymbol(),classllvmo__PHINode_Oval); { AllocatorCallback cb = &new_Nil; llvmo::PHINode_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::PHINode_O::static_className() % (void*)(llvmo::PHINode_O::static_newNil_callback()) ); classllvmo__PHINode_Oval->setInstance_newNil_callback(llvmo::PHINode_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::PHINode_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::PHINode_O::static_className() ); llvmo::PHINode_O::_nil = nil_for_class; classllvmo__PHINode_Oval->setInstanceNil(nil_for_class); } classllvmo__PHINode_Oval->setSupportsSlots(llvmo::PHINode_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__PointerType_Oval]")); core::BuiltInClass_sp classllvmo__PointerType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__PointerType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__PointerType_Oval,_lisp,llvmo::PointerType_O::static_classSymbol()); llvmo::PointerType_O::___staticMetaClass = classllvmo__PointerType_Oval; _lisp->setf_findClass(llvmo::PointerType_O::static_classSymbol(),classllvmo__PointerType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::PointerType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::PointerType_O::static_className() % (void*)(llvmo::PointerType_O::static_newNil_callback()) ); classllvmo__PointerType_Oval->setInstance_newNil_callback(llvmo::PointerType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::PointerType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::PointerType_O::static_className() ); llvmo::PointerType_O::_nil = nil_for_class; classllvmo__PointerType_Oval->setInstanceNil(nil_for_class); } classllvmo__PointerType_Oval->setSupportsSlots(llvmo::PointerType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__StoreInst_Oval]")); core::BuiltInClass_sp classllvmo__StoreInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__StoreInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__StoreInst_Oval,_lisp,llvmo::StoreInst_O::static_classSymbol()); llvmo::StoreInst_O::___staticMetaClass = classllvmo__StoreInst_Oval; _lisp->setf_findClass(llvmo::StoreInst_O::static_classSymbol(),classllvmo__StoreInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::StoreInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::StoreInst_O::static_className() % (void*)(llvmo::StoreInst_O::static_newNil_callback()) ); classllvmo__StoreInst_Oval->setInstance_newNil_callback(llvmo::StoreInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::StoreInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::StoreInst_O::static_className() ); llvmo::StoreInst_O::_nil = nil_for_class; classllvmo__StoreInst_Oval->setInstanceNil(nil_for_class); } classllvmo__StoreInst_Oval->setSupportsSlots(llvmo::StoreInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__TerminatorInst_Oval]")); core::BuiltInClass_sp classllvmo__TerminatorInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__TerminatorInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__TerminatorInst_Oval,_lisp,llvmo::TerminatorInst_O::static_classSymbol()); llvmo::TerminatorInst_O::___staticMetaClass = classllvmo__TerminatorInst_Oval; _lisp->setf_findClass(llvmo::TerminatorInst_O::static_classSymbol(),classllvmo__TerminatorInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::TerminatorInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::TerminatorInst_O::static_className() % (void*)(llvmo::TerminatorInst_O::static_newNil_callback()) ); classllvmo__TerminatorInst_Oval->setInstance_newNil_callback(llvmo::TerminatorInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::TerminatorInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::TerminatorInst_O::static_className() ); llvmo::TerminatorInst_O::_nil = nil_for_class; classllvmo__TerminatorInst_Oval->setInstanceNil(nil_for_class); } classllvmo__TerminatorInst_Oval->setSupportsSlots(llvmo::TerminatorInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__UnaryInstruction_Oval]")); core::BuiltInClass_sp classllvmo__UnaryInstruction_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__UnaryInstruction_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UnaryInstruction_Oval,_lisp,llvmo::UnaryInstruction_O::static_classSymbol()); llvmo::UnaryInstruction_O::___staticMetaClass = classllvmo__UnaryInstruction_Oval; _lisp->setf_findClass(llvmo::UnaryInstruction_O::static_classSymbol(),classllvmo__UnaryInstruction_Oval); { AllocatorCallback cb = &new_Nil; llvmo::UnaryInstruction_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::UnaryInstruction_O::static_className() % (void*)(llvmo::UnaryInstruction_O::static_newNil_callback()) ); classllvmo__UnaryInstruction_Oval->setInstance_newNil_callback(llvmo::UnaryInstruction_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::UnaryInstruction_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::UnaryInstruction_O::static_className() ); llvmo::UnaryInstruction_O::_nil = nil_for_class; classllvmo__UnaryInstruction_Oval->setInstanceNil(nil_for_class); } classllvmo__UnaryInstruction_Oval->setSupportsSlots(llvmo::UnaryInstruction_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__UndefValue_Oval]")); core::BuiltInClass_sp classllvmo__UndefValue_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__UndefValue_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UndefValue_Oval,_lisp,llvmo::UndefValue_O::static_classSymbol()); llvmo::UndefValue_O::___staticMetaClass = classllvmo__UndefValue_Oval; _lisp->setf_findClass(llvmo::UndefValue_O::static_classSymbol(),classllvmo__UndefValue_Oval); { AllocatorCallback cb = &new_Nil; llvmo::UndefValue_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::UndefValue_O::static_className() % (void*)(llvmo::UndefValue_O::static_newNil_callback()) ); classllvmo__UndefValue_Oval->setInstance_newNil_callback(llvmo::UndefValue_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::UndefValue_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::UndefValue_O::static_className() ); llvmo::UndefValue_O::_nil = nil_for_class; classllvmo__UndefValue_Oval->setInstanceNil(nil_for_class); } classllvmo__UndefValue_Oval->setSupportsSlots(llvmo::UndefValue_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__VectorType_Oval]")); core::BuiltInClass_sp classllvmo__VectorType_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__VectorType_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__VectorType_Oval,_lisp,llvmo::VectorType_O::static_classSymbol()); llvmo::VectorType_O::___staticMetaClass = classllvmo__VectorType_Oval; _lisp->setf_findClass(llvmo::VectorType_O::static_classSymbol(),classllvmo__VectorType_Oval); { AllocatorCallback cb = &new_Nil; llvmo::VectorType_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::VectorType_O::static_className() % (void*)(llvmo::VectorType_O::static_newNil_callback()) ); classllvmo__VectorType_Oval->setInstance_newNil_callback(llvmo::VectorType_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::VectorType_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::VectorType_O::static_className() ); llvmo::VectorType_O::_nil = nil_for_class; classllvmo__VectorType_Oval->setInstanceNil(nil_for_class); } classllvmo__VectorType_Oval->setSupportsSlots(llvmo::VectorType_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__AllocaInst_Oval]")); core::BuiltInClass_sp classllvmo__AllocaInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__AllocaInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__AllocaInst_Oval,_lisp,llvmo::AllocaInst_O::static_classSymbol()); llvmo::AllocaInst_O::___staticMetaClass = classllvmo__AllocaInst_Oval; _lisp->setf_findClass(llvmo::AllocaInst_O::static_classSymbol(),classllvmo__AllocaInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::AllocaInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::AllocaInst_O::static_className() % (void*)(llvmo::AllocaInst_O::static_newNil_callback()) ); classllvmo__AllocaInst_Oval->setInstance_newNil_callback(llvmo::AllocaInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::AllocaInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::AllocaInst_O::static_className() ); llvmo::AllocaInst_O::_nil = nil_for_class; classllvmo__AllocaInst_Oval->setInstanceNil(nil_for_class); } classllvmo__AllocaInst_Oval->setSupportsSlots(llvmo::AllocaInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__BranchInst_Oval]")); core::BuiltInClass_sp classllvmo__BranchInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__BranchInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__BranchInst_Oval,_lisp,llvmo::BranchInst_O::static_classSymbol()); llvmo::BranchInst_O::___staticMetaClass = classllvmo__BranchInst_Oval; _lisp->setf_findClass(llvmo::BranchInst_O::static_classSymbol(),classllvmo__BranchInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::BranchInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::BranchInst_O::static_className() % (void*)(llvmo::BranchInst_O::static_newNil_callback()) ); classllvmo__BranchInst_Oval->setInstance_newNil_callback(llvmo::BranchInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::BranchInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::BranchInst_O::static_className() ); llvmo::BranchInst_O::_nil = nil_for_class; classllvmo__BranchInst_Oval->setInstanceNil(nil_for_class); } classllvmo__BranchInst_Oval->setSupportsSlots(llvmo::BranchInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ConstantDataArray_Oval]")); core::BuiltInClass_sp classllvmo__ConstantDataArray_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ConstantDataArray_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ConstantDataArray_Oval,_lisp,llvmo::ConstantDataArray_O::static_classSymbol()); llvmo::ConstantDataArray_O::___staticMetaClass = classllvmo__ConstantDataArray_Oval; _lisp->setf_findClass(llvmo::ConstantDataArray_O::static_classSymbol(),classllvmo__ConstantDataArray_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ConstantDataArray_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ConstantDataArray_O::static_className() % (void*)(llvmo::ConstantDataArray_O::static_newNil_callback()) ); classllvmo__ConstantDataArray_Oval->setInstance_newNil_callback(llvmo::ConstantDataArray_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ConstantDataArray_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ConstantDataArray_O::static_className() ); llvmo::ConstantDataArray_O::_nil = nil_for_class; classllvmo__ConstantDataArray_Oval->setInstanceNil(nil_for_class); } classllvmo__ConstantDataArray_Oval->setSupportsSlots(llvmo::ConstantDataArray_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__Function_Oval]")); core::BuiltInClass_sp classllvmo__Function_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__Function_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__Function_Oval,_lisp,llvmo::Function_O::static_classSymbol()); llvmo::Function_O::___staticMetaClass = classllvmo__Function_Oval; _lisp->setf_findClass(llvmo::Function_O::static_classSymbol(),classllvmo__Function_Oval); { AllocatorCallback cb = &new_Nil; llvmo::Function_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::Function_O::static_className() % (void*)(llvmo::Function_O::static_newNil_callback()) ); classllvmo__Function_Oval->setInstance_newNil_callback(llvmo::Function_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::Function_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::Function_O::static_className() ); llvmo::Function_O::_nil = nil_for_class; classllvmo__Function_Oval->setInstanceNil(nil_for_class); } classllvmo__Function_Oval->setSupportsSlots(llvmo::Function_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__GlobalVariable_Oval]")); core::BuiltInClass_sp classllvmo__GlobalVariable_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__GlobalVariable_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__GlobalVariable_Oval,_lisp,llvmo::GlobalVariable_O::static_classSymbol()); llvmo::GlobalVariable_O::___staticMetaClass = classllvmo__GlobalVariable_Oval; _lisp->setf_findClass(llvmo::GlobalVariable_O::static_classSymbol(),classllvmo__GlobalVariable_Oval); { AllocatorCallback cb = &new_Nil; llvmo::GlobalVariable_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::GlobalVariable_O::static_className() % (void*)(llvmo::GlobalVariable_O::static_newNil_callback()) ); classllvmo__GlobalVariable_Oval->setInstance_newNil_callback(llvmo::GlobalVariable_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::GlobalVariable_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::GlobalVariable_O::static_className() ); llvmo::GlobalVariable_O::_nil = nil_for_class; classllvmo__GlobalVariable_Oval->setInstanceNil(nil_for_class); } classllvmo__GlobalVariable_Oval->setSupportsSlots(llvmo::GlobalVariable_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__IndirectBrInst_Oval]")); core::BuiltInClass_sp classllvmo__IndirectBrInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__IndirectBrInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__IndirectBrInst_Oval,_lisp,llvmo::IndirectBrInst_O::static_classSymbol()); llvmo::IndirectBrInst_O::___staticMetaClass = classllvmo__IndirectBrInst_Oval; _lisp->setf_findClass(llvmo::IndirectBrInst_O::static_classSymbol(),classllvmo__IndirectBrInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::IndirectBrInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::IndirectBrInst_O::static_className() % (void*)(llvmo::IndirectBrInst_O::static_newNil_callback()) ); classllvmo__IndirectBrInst_Oval->setInstance_newNil_callback(llvmo::IndirectBrInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::IndirectBrInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::IndirectBrInst_O::static_className() ); llvmo::IndirectBrInst_O::_nil = nil_for_class; classllvmo__IndirectBrInst_Oval->setInstanceNil(nil_for_class); } classllvmo__IndirectBrInst_Oval->setSupportsSlots(llvmo::IndirectBrInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__InvokeInst_Oval]")); core::BuiltInClass_sp classllvmo__InvokeInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__InvokeInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__InvokeInst_Oval,_lisp,llvmo::InvokeInst_O::static_classSymbol()); llvmo::InvokeInst_O::___staticMetaClass = classllvmo__InvokeInst_Oval; _lisp->setf_findClass(llvmo::InvokeInst_O::static_classSymbol(),classllvmo__InvokeInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::InvokeInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::InvokeInst_O::static_className() % (void*)(llvmo::InvokeInst_O::static_newNil_callback()) ); classllvmo__InvokeInst_Oval->setInstance_newNil_callback(llvmo::InvokeInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::InvokeInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::InvokeInst_O::static_className() ); llvmo::InvokeInst_O::_nil = nil_for_class; classllvmo__InvokeInst_Oval->setInstanceNil(nil_for_class); } classllvmo__InvokeInst_Oval->setSupportsSlots(llvmo::InvokeInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__LoadInst_Oval]")); core::BuiltInClass_sp classllvmo__LoadInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__LoadInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__LoadInst_Oval,_lisp,llvmo::LoadInst_O::static_classSymbol()); llvmo::LoadInst_O::___staticMetaClass = classllvmo__LoadInst_Oval; _lisp->setf_findClass(llvmo::LoadInst_O::static_classSymbol(),classllvmo__LoadInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::LoadInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::LoadInst_O::static_className() % (void*)(llvmo::LoadInst_O::static_newNil_callback()) ); classllvmo__LoadInst_Oval->setInstance_newNil_callback(llvmo::LoadInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::LoadInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::LoadInst_O::static_className() ); llvmo::LoadInst_O::_nil = nil_for_class; classllvmo__LoadInst_Oval->setInstanceNil(nil_for_class); } classllvmo__LoadInst_Oval->setSupportsSlots(llvmo::LoadInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ResumeInst_Oval]")); core::BuiltInClass_sp classllvmo__ResumeInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ResumeInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ResumeInst_Oval,_lisp,llvmo::ResumeInst_O::static_classSymbol()); llvmo::ResumeInst_O::___staticMetaClass = classllvmo__ResumeInst_Oval; _lisp->setf_findClass(llvmo::ResumeInst_O::static_classSymbol(),classllvmo__ResumeInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ResumeInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ResumeInst_O::static_className() % (void*)(llvmo::ResumeInst_O::static_newNil_callback()) ); classllvmo__ResumeInst_Oval->setInstance_newNil_callback(llvmo::ResumeInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ResumeInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ResumeInst_O::static_className() ); llvmo::ResumeInst_O::_nil = nil_for_class; classllvmo__ResumeInst_Oval->setInstanceNil(nil_for_class); } classllvmo__ResumeInst_Oval->setSupportsSlots(llvmo::ResumeInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__ReturnInst_Oval]")); core::BuiltInClass_sp classllvmo__ReturnInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__ReturnInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__ReturnInst_Oval,_lisp,llvmo::ReturnInst_O::static_classSymbol()); llvmo::ReturnInst_O::___staticMetaClass = classllvmo__ReturnInst_Oval; _lisp->setf_findClass(llvmo::ReturnInst_O::static_classSymbol(),classllvmo__ReturnInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::ReturnInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::ReturnInst_O::static_className() % (void*)(llvmo::ReturnInst_O::static_newNil_callback()) ); classllvmo__ReturnInst_Oval->setInstance_newNil_callback(llvmo::ReturnInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::ReturnInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::ReturnInst_O::static_className() ); llvmo::ReturnInst_O::_nil = nil_for_class; classllvmo__ReturnInst_Oval->setInstanceNil(nil_for_class); } classllvmo__ReturnInst_Oval->setSupportsSlots(llvmo::ReturnInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__SwitchInst_Oval]")); core::BuiltInClass_sp classllvmo__SwitchInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__SwitchInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__SwitchInst_Oval,_lisp,llvmo::SwitchInst_O::static_classSymbol()); llvmo::SwitchInst_O::___staticMetaClass = classllvmo__SwitchInst_Oval; _lisp->setf_findClass(llvmo::SwitchInst_O::static_classSymbol(),classllvmo__SwitchInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::SwitchInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::SwitchInst_O::static_className() % (void*)(llvmo::SwitchInst_O::static_newNil_callback()) ); classllvmo__SwitchInst_Oval->setInstance_newNil_callback(llvmo::SwitchInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::SwitchInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::SwitchInst_O::static_className() ); llvmo::SwitchInst_O::_nil = nil_for_class; classllvmo__SwitchInst_Oval->setInstanceNil(nil_for_class); } classllvmo__SwitchInst_Oval->setSupportsSlots(llvmo::SwitchInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__UnreachableInst_Oval]")); core::BuiltInClass_sp classllvmo__UnreachableInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__UnreachableInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__UnreachableInst_Oval,_lisp,llvmo::UnreachableInst_O::static_classSymbol()); llvmo::UnreachableInst_O::___staticMetaClass = classllvmo__UnreachableInst_Oval; _lisp->setf_findClass(llvmo::UnreachableInst_O::static_classSymbol(),classllvmo__UnreachableInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::UnreachableInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::UnreachableInst_O::static_className() % (void*)(llvmo::UnreachableInst_O::static_newNil_callback()) ); classllvmo__UnreachableInst_Oval->setInstance_newNil_callback(llvmo::UnreachableInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::UnreachableInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::UnreachableInst_O::static_className() ); llvmo::UnreachableInst_O::_nil = nil_for_class; classllvmo__UnreachableInst_Oval->setInstanceNil(nil_for_class); } classllvmo__UnreachableInst_Oval->setSupportsSlots(llvmo::UnreachableInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ LOG(BF("Creating class[classllvmo__VAArgInst_Oval]")); core::BuiltInClass_sp classllvmo__VAArgInst_Oval = core::BuiltInClass_O::create(undefinedMetaClass); classllvmo__VAArgInst_Oval->__setup_stage1_with_sharedPtr_lisp_sid(classllvmo__VAArgInst_Oval,_lisp,llvmo::VAArgInst_O::static_classSymbol()); llvmo::VAArgInst_O::___staticMetaClass = classllvmo__VAArgInst_Oval; _lisp->setf_findClass(llvmo::VAArgInst_O::static_classSymbol(),classllvmo__VAArgInst_Oval); { AllocatorCallback cb = &new_Nil; llvmo::VAArgInst_O::___set_static_newNil_callback(cb); } LOG(BF("Set _newNil_callback for class(%s) to %X")% llvmo::VAArgInst_O::static_className() % (void*)(llvmo::VAArgInst_O::static_newNil_callback()) ); classllvmo__VAArgInst_Oval->setInstance_newNil_callback(llvmo::VAArgInst_O::static_newNil_callback()); { boost::shared_ptr nil_for_class(new llvmo::VAArgInst_O(undefinedMetaClass)); nil_for_class->__setWeakThis(nil_for_class); LOG(BF("Created nil for class[%s]") % llvmo::VAArgInst_O::static_className() ); llvmo::VAArgInst_O::_nil = nil_for_class; classllvmo__VAArgInst_Oval->setInstanceNil(nil_for_class); } classllvmo__VAArgInst_Oval->setSupportsSlots(llvmo::VAArgInst_O::static_supportsSlots()); /* ----- the class and its nil are now defined but the _class of these objects is undefined - set in next stage ----- */ #endif // CREATE_CLASS #undef CREATE_CLASS #ifdef DUMP_INFO_CLASS // { // Depends on nothing LOG(BF("--- dump_info --- className: llvmo::APFloat_O @ %X") % classllvmo__APFloat_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::APFloat_O::static_className() % llvmo::APFloat_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::APInt_O @ %X") % classllvmo__APInt_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::APInt_O::static_className() % llvmo::APInt_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Attribute_O @ %X") % classllvmo__Attribute_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Attribute_O::static_className() % llvmo::Attribute_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Builder_O @ %X") % classllvmo__Builder_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Builder_O::static_className() % llvmo::Builder_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::DebugLoc_O @ %X") % classllvmo__DebugLoc_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::DebugLoc_O::static_className() % llvmo::DebugLoc_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::EngineBuilder_O @ %X") % classllvmo__EngineBuilder_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::EngineBuilder_O::static_className() % llvmo::EngineBuilder_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ExecutionEngine_O @ %X") % classllvmo__ExecutionEngine_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ExecutionEngine_O::static_className() % llvmo::ExecutionEngine_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::IRBuilderBase_O @ %X") % classllvmo__IRBuilderBase_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::IRBuilderBase_O::static_className() % llvmo::IRBuilderBase_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::InsertPoint_O @ %X") % classllvmo__InsertPoint_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::InsertPoint_O::static_className() % llvmo::InsertPoint_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::LLVMContext_O @ %X") % classllvmo__LLVMContext_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::LLVMContext_O::static_className() % llvmo::LLVMContext_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Module_O @ %X") % classllvmo__Module_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Module_O::static_className() % llvmo::Module_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::PassManagerBase_O @ %X") % classllvmo__PassManagerBase_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::PassManagerBase_O::static_className() % llvmo::PassManagerBase_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Pass_O @ %X") % classllvmo__Pass_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Pass_O::static_className() % llvmo::Pass_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Type_O @ %X") % classllvmo__Type_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Type_O::static_className() % llvmo::Type_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Value_O @ %X") % classllvmo__Value_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Value_O::static_className() % llvmo::Value_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Argument_O @ %X") % classllvmo__Argument_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Argument_O::static_className() % llvmo::Argument_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::BasicBlock_O @ %X") % classllvmo__BasicBlock_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::BasicBlock_O::static_className() % llvmo::BasicBlock_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::CompositeType_O @ %X") % classllvmo__CompositeType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::CompositeType_O::static_className() % llvmo::CompositeType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::FunctionPassManager_O @ %X") % classllvmo__FunctionPassManager_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::FunctionPassManager_O::static_className() % llvmo::FunctionPassManager_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::FunctionPass_O @ %X") % classllvmo__FunctionPass_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::FunctionPass_O::static_className() % llvmo::FunctionPass_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::FunctionType_O @ %X") % classllvmo__FunctionType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::FunctionType_O::static_className() % llvmo::FunctionType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::IRBuilder_O @ %X") % classllvmo__IRBuilder_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::IRBuilder_O::static_className() % llvmo::IRBuilder_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::IntegerType_O @ %X") % classllvmo__IntegerType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::IntegerType_O::static_className() % llvmo::IntegerType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::MDNode_O @ %X") % classllvmo__MDNode_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::MDNode_O::static_className() % llvmo::MDNode_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::MDString_O @ %X") % classllvmo__MDString_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::MDString_O::static_className() % llvmo::MDString_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ModulePass_O @ %X") % classllvmo__ModulePass_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ModulePass_O::static_className() % llvmo::ModulePass_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::User_O @ %X") % classllvmo__User_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::User_O::static_className() % llvmo::User_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Constant_O @ %X") % classllvmo__Constant_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Constant_O::static_className() % llvmo::Constant_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ImmutablePass_O @ %X") % classllvmo__ImmutablePass_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ImmutablePass_O::static_className() % llvmo::ImmutablePass_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Instruction_O @ %X") % classllvmo__Instruction_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Instruction_O::static_className() % llvmo::Instruction_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::SequentialType_O @ %X") % classllvmo__SequentialType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::SequentialType_O::static_className() % llvmo::SequentialType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::StructType_O @ %X") % classllvmo__StructType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::StructType_O::static_className() % llvmo::StructType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ArrayType_O @ %X") % classllvmo__ArrayType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ArrayType_O::static_className() % llvmo::ArrayType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::AtomicCmpXchgInst_O @ %X") % classllvmo__AtomicCmpXchgInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::AtomicCmpXchgInst_O::static_className() % llvmo::AtomicCmpXchgInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::AtomicRMWInst_O @ %X") % classllvmo__AtomicRMWInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::AtomicRMWInst_O::static_className() % llvmo::AtomicRMWInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::CallInst_O @ %X") % classllvmo__CallInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::CallInst_O::static_className() % llvmo::CallInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantArray_O @ %X") % classllvmo__ConstantArray_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantArray_O::static_className() % llvmo::ConstantArray_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantDataSequential_O @ %X") % classllvmo__ConstantDataSequential_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantDataSequential_O::static_className() % llvmo::ConstantDataSequential_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantExpr_O @ %X") % classllvmo__ConstantExpr_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantExpr_O::static_className() % llvmo::ConstantExpr_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantFP_O @ %X") % classllvmo__ConstantFP_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantFP_O::static_className() % llvmo::ConstantFP_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantInt_O @ %X") % classllvmo__ConstantInt_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantInt_O::static_className() % llvmo::ConstantInt_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantPointerNull_O @ %X") % classllvmo__ConstantPointerNull_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantPointerNull_O::static_className() % llvmo::ConstantPointerNull_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::DataLayout_O @ %X") % classllvmo__DataLayout_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::DataLayout_O::static_className() % llvmo::DataLayout_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::FenceInst_O @ %X") % classllvmo__FenceInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::FenceInst_O::static_className() % llvmo::FenceInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::GlobalValue_O @ %X") % classllvmo__GlobalValue_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::GlobalValue_O::static_className() % llvmo::GlobalValue_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::LandingPadInst_O @ %X") % classllvmo__LandingPadInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::LandingPadInst_O::static_className() % llvmo::LandingPadInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::PHINode_O @ %X") % classllvmo__PHINode_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::PHINode_O::static_className() % llvmo::PHINode_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::PointerType_O @ %X") % classllvmo__PointerType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::PointerType_O::static_className() % llvmo::PointerType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::StoreInst_O @ %X") % classllvmo__StoreInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::StoreInst_O::static_className() % llvmo::StoreInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::TerminatorInst_O @ %X") % classllvmo__TerminatorInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::TerminatorInst_O::static_className() % llvmo::TerminatorInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::UnaryInstruction_O @ %X") % classllvmo__UnaryInstruction_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::UnaryInstruction_O::static_className() % llvmo::UnaryInstruction_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::UndefValue_O @ %X") % classllvmo__UndefValue_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::UndefValue_O::static_className() % llvmo::UndefValue_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::VectorType_O @ %X") % classllvmo__VectorType_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::VectorType_O::static_className() % llvmo::VectorType_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::AllocaInst_O @ %X") % classllvmo__AllocaInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::AllocaInst_O::static_className() % llvmo::AllocaInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::BranchInst_O @ %X") % classllvmo__BranchInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::BranchInst_O::static_className() % llvmo::BranchInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ConstantDataArray_O @ %X") % classllvmo__ConstantDataArray_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ConstantDataArray_O::static_className() % llvmo::ConstantDataArray_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::Function_O @ %X") % classllvmo__Function_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::Function_O::static_className() % llvmo::Function_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::GlobalVariable_O @ %X") % classllvmo__GlobalVariable_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::GlobalVariable_O::static_className() % llvmo::GlobalVariable_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::IndirectBrInst_O @ %X") % classllvmo__IndirectBrInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::IndirectBrInst_O::static_className() % llvmo::IndirectBrInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::InvokeInst_O @ %X") % classllvmo__InvokeInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::InvokeInst_O::static_className() % llvmo::InvokeInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::LoadInst_O @ %X") % classllvmo__LoadInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::LoadInst_O::static_className() % llvmo::LoadInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ResumeInst_O @ %X") % classllvmo__ResumeInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ResumeInst_O::static_className() % llvmo::ResumeInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::ReturnInst_O @ %X") % classllvmo__ReturnInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::ReturnInst_O::static_className() % llvmo::ReturnInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::SwitchInst_O @ %X") % classllvmo__SwitchInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::SwitchInst_O::static_className() % llvmo::SwitchInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::UnreachableInst_O @ %X") % classllvmo__UnreachableInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::UnreachableInst_O::static_className() % llvmo::UnreachableInst_O::static_classSymbol() ); LOG(BF("--- dump_info --- className: llvmo::VAArgInst_O @ %X") % classllvmo__VAArgInst_Oval.get()); LOG(BF("%s::static_classSymbol() = %d") % llvmo::VAArgInst_O::static_className() % llvmo::VAArgInst_O::static_classSymbol() ); #endif // } DUMP_INFO_CLASS #undef DUMP_INFO_CLASS #if defined(DEFINE_BASE_CLASSES) || defined(ALL_STAGES) // { // Depends on nothing classllvmo__APFloat_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__APInt_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__Attribute_Oval->addInstanceBaseClass(core::T_O::static_classSymbol()); classllvmo__Builder_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__DebugLoc_Oval->addInstanceBaseClass(core::T_O::static_classSymbol()); classllvmo__EngineBuilder_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__ExecutionEngine_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__IRBuilderBase_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__InsertPoint_Oval->addInstanceBaseClass(core::T_O::static_classSymbol()); classllvmo__LLVMContext_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__Module_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__PassManagerBase_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__Pass_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__Type_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__Value_Oval->addInstanceBaseClass(core::ExternalObject_O::static_classSymbol()); classllvmo__Argument_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol()); classllvmo__BasicBlock_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol()); classllvmo__CompositeType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol()); classllvmo__FunctionPassManager_Oval->addInstanceBaseClass(llvmo::PassManagerBase_O::static_classSymbol()); classllvmo__FunctionPass_Oval->addInstanceBaseClass(llvmo::Pass_O::static_classSymbol()); classllvmo__FunctionType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol()); classllvmo__IRBuilder_Oval->addInstanceBaseClass(llvmo::IRBuilderBase_O::static_classSymbol()); classllvmo__IntegerType_Oval->addInstanceBaseClass(llvmo::Type_O::static_classSymbol()); classllvmo__MDNode_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol()); classllvmo__MDString_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol()); classllvmo__ModulePass_Oval->addInstanceBaseClass(llvmo::Pass_O::static_classSymbol()); classllvmo__User_Oval->addInstanceBaseClass(llvmo::Value_O::static_classSymbol()); classllvmo__Constant_Oval->addInstanceBaseClass(llvmo::User_O::static_classSymbol()); classllvmo__ImmutablePass_Oval->addInstanceBaseClass(llvmo::ModulePass_O::static_classSymbol()); classllvmo__Instruction_Oval->addInstanceBaseClass(llvmo::User_O::static_classSymbol()); classllvmo__SequentialType_Oval->addInstanceBaseClass(llvmo::CompositeType_O::static_classSymbol()); classllvmo__StructType_Oval->addInstanceBaseClass(llvmo::CompositeType_O::static_classSymbol()); classllvmo__ArrayType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol()); classllvmo__AtomicCmpXchgInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__AtomicRMWInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__CallInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__ConstantArray_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__ConstantDataSequential_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__ConstantExpr_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__ConstantFP_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__ConstantInt_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__ConstantPointerNull_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__DataLayout_Oval->addInstanceBaseClass(llvmo::ImmutablePass_O::static_classSymbol()); classllvmo__FenceInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__GlobalValue_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__LandingPadInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__PHINode_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__PointerType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol()); classllvmo__StoreInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__TerminatorInst_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__UnaryInstruction_Oval->addInstanceBaseClass(llvmo::Instruction_O::static_classSymbol()); classllvmo__UndefValue_Oval->addInstanceBaseClass(llvmo::Constant_O::static_classSymbol()); classllvmo__VectorType_Oval->addInstanceBaseClass(llvmo::SequentialType_O::static_classSymbol()); classllvmo__AllocaInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol()); classllvmo__BranchInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__ConstantDataArray_Oval->addInstanceBaseClass(llvmo::ConstantDataSequential_O::static_classSymbol()); classllvmo__Function_Oval->addInstanceBaseClass(llvmo::GlobalValue_O::static_classSymbol()); classllvmo__GlobalVariable_Oval->addInstanceBaseClass(llvmo::GlobalValue_O::static_classSymbol()); classllvmo__IndirectBrInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__InvokeInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__LoadInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol()); classllvmo__ResumeInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__ReturnInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__SwitchInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__UnreachableInst_Oval->addInstanceBaseClass(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__VAArgInst_Oval->addInstanceBaseClass(llvmo::UnaryInstruction_O::static_classSymbol()); #endif // } DEFINE_BASE_CLASSES #undef DEFINE_BASE_CLASSES #if defined(DEFINE_CLASS_NAMES) || defined(ALL_STAGES) // { core::Package_sp _curPkg = _lisp->findPackage(CurrentPkg); // Depends on nothing classllvmo__APFloat_Oval->__setup_stage3_name(llvmo::APFloat_O::static_classSymbol()); classllvmo__APInt_Oval->__setup_stage3_name(llvmo::APInt_O::static_classSymbol()); classllvmo__Attribute_Oval->__setup_stage3_name(llvmo::Attribute_O::static_classSymbol()); classllvmo__Builder_Oval->__setup_stage3_name(llvmo::Builder_O::static_classSymbol()); classllvmo__DebugLoc_Oval->__setup_stage3_name(llvmo::DebugLoc_O::static_classSymbol()); classllvmo__EngineBuilder_Oval->__setup_stage3_name(llvmo::EngineBuilder_O::static_classSymbol()); classllvmo__ExecutionEngine_Oval->__setup_stage3_name(llvmo::ExecutionEngine_O::static_classSymbol()); classllvmo__IRBuilderBase_Oval->__setup_stage3_name(llvmo::IRBuilderBase_O::static_classSymbol()); classllvmo__InsertPoint_Oval->__setup_stage3_name(llvmo::InsertPoint_O::static_classSymbol()); classllvmo__LLVMContext_Oval->__setup_stage3_name(llvmo::LLVMContext_O::static_classSymbol()); classllvmo__Module_Oval->__setup_stage3_name(llvmo::Module_O::static_classSymbol()); classllvmo__PassManagerBase_Oval->__setup_stage3_name(llvmo::PassManagerBase_O::static_classSymbol()); classllvmo__Pass_Oval->__setup_stage3_name(llvmo::Pass_O::static_classSymbol()); classllvmo__Type_Oval->__setup_stage3_name(llvmo::Type_O::static_classSymbol()); classllvmo__Value_Oval->__setup_stage3_name(llvmo::Value_O::static_classSymbol()); classllvmo__Argument_Oval->__setup_stage3_name(llvmo::Argument_O::static_classSymbol()); classllvmo__BasicBlock_Oval->__setup_stage3_name(llvmo::BasicBlock_O::static_classSymbol()); classllvmo__CompositeType_Oval->__setup_stage3_name(llvmo::CompositeType_O::static_classSymbol()); classllvmo__FunctionPassManager_Oval->__setup_stage3_name(llvmo::FunctionPassManager_O::static_classSymbol()); classllvmo__FunctionPass_Oval->__setup_stage3_name(llvmo::FunctionPass_O::static_classSymbol()); classllvmo__FunctionType_Oval->__setup_stage3_name(llvmo::FunctionType_O::static_classSymbol()); classllvmo__IRBuilder_Oval->__setup_stage3_name(llvmo::IRBuilder_O::static_classSymbol()); classllvmo__IntegerType_Oval->__setup_stage3_name(llvmo::IntegerType_O::static_classSymbol()); classllvmo__MDNode_Oval->__setup_stage3_name(llvmo::MDNode_O::static_classSymbol()); classllvmo__MDString_Oval->__setup_stage3_name(llvmo::MDString_O::static_classSymbol()); classllvmo__ModulePass_Oval->__setup_stage3_name(llvmo::ModulePass_O::static_classSymbol()); classllvmo__User_Oval->__setup_stage3_name(llvmo::User_O::static_classSymbol()); classllvmo__Constant_Oval->__setup_stage3_name(llvmo::Constant_O::static_classSymbol()); classllvmo__ImmutablePass_Oval->__setup_stage3_name(llvmo::ImmutablePass_O::static_classSymbol()); classllvmo__Instruction_Oval->__setup_stage3_name(llvmo::Instruction_O::static_classSymbol()); classllvmo__SequentialType_Oval->__setup_stage3_name(llvmo::SequentialType_O::static_classSymbol()); classllvmo__StructType_Oval->__setup_stage3_name(llvmo::StructType_O::static_classSymbol()); classllvmo__ArrayType_Oval->__setup_stage3_name(llvmo::ArrayType_O::static_classSymbol()); classllvmo__AtomicCmpXchgInst_Oval->__setup_stage3_name(llvmo::AtomicCmpXchgInst_O::static_classSymbol()); classllvmo__AtomicRMWInst_Oval->__setup_stage3_name(llvmo::AtomicRMWInst_O::static_classSymbol()); classllvmo__CallInst_Oval->__setup_stage3_name(llvmo::CallInst_O::static_classSymbol()); classllvmo__ConstantArray_Oval->__setup_stage3_name(llvmo::ConstantArray_O::static_classSymbol()); classllvmo__ConstantDataSequential_Oval->__setup_stage3_name(llvmo::ConstantDataSequential_O::static_classSymbol()); classllvmo__ConstantExpr_Oval->__setup_stage3_name(llvmo::ConstantExpr_O::static_classSymbol()); classllvmo__ConstantFP_Oval->__setup_stage3_name(llvmo::ConstantFP_O::static_classSymbol()); classllvmo__ConstantInt_Oval->__setup_stage3_name(llvmo::ConstantInt_O::static_classSymbol()); classllvmo__ConstantPointerNull_Oval->__setup_stage3_name(llvmo::ConstantPointerNull_O::static_classSymbol()); classllvmo__DataLayout_Oval->__setup_stage3_name(llvmo::DataLayout_O::static_classSymbol()); classllvmo__FenceInst_Oval->__setup_stage3_name(llvmo::FenceInst_O::static_classSymbol()); classllvmo__GlobalValue_Oval->__setup_stage3_name(llvmo::GlobalValue_O::static_classSymbol()); classllvmo__LandingPadInst_Oval->__setup_stage3_name(llvmo::LandingPadInst_O::static_classSymbol()); classllvmo__PHINode_Oval->__setup_stage3_name(llvmo::PHINode_O::static_classSymbol()); classllvmo__PointerType_Oval->__setup_stage3_name(llvmo::PointerType_O::static_classSymbol()); classllvmo__StoreInst_Oval->__setup_stage3_name(llvmo::StoreInst_O::static_classSymbol()); classllvmo__TerminatorInst_Oval->__setup_stage3_name(llvmo::TerminatorInst_O::static_classSymbol()); classllvmo__UnaryInstruction_Oval->__setup_stage3_name(llvmo::UnaryInstruction_O::static_classSymbol()); classllvmo__UndefValue_Oval->__setup_stage3_name(llvmo::UndefValue_O::static_classSymbol()); classllvmo__VectorType_Oval->__setup_stage3_name(llvmo::VectorType_O::static_classSymbol()); classllvmo__AllocaInst_Oval->__setup_stage3_name(llvmo::AllocaInst_O::static_classSymbol()); classllvmo__BranchInst_Oval->__setup_stage3_name(llvmo::BranchInst_O::static_classSymbol()); classllvmo__ConstantDataArray_Oval->__setup_stage3_name(llvmo::ConstantDataArray_O::static_classSymbol()); classllvmo__Function_Oval->__setup_stage3_name(llvmo::Function_O::static_classSymbol()); classllvmo__GlobalVariable_Oval->__setup_stage3_name(llvmo::GlobalVariable_O::static_classSymbol()); classllvmo__IndirectBrInst_Oval->__setup_stage3_name(llvmo::IndirectBrInst_O::static_classSymbol()); classllvmo__InvokeInst_Oval->__setup_stage3_name(llvmo::InvokeInst_O::static_classSymbol()); classllvmo__LoadInst_Oval->__setup_stage3_name(llvmo::LoadInst_O::static_classSymbol()); classllvmo__ResumeInst_Oval->__setup_stage3_name(llvmo::ResumeInst_O::static_classSymbol()); classllvmo__ReturnInst_Oval->__setup_stage3_name(llvmo::ReturnInst_O::static_classSymbol()); classllvmo__SwitchInst_Oval->__setup_stage3_name(llvmo::SwitchInst_O::static_classSymbol()); classllvmo__UnreachableInst_Oval->__setup_stage3_name(llvmo::UnreachableInst_O::static_classSymbol()); classllvmo__VAArgInst_Oval->__setup_stage3_name(llvmo::VAArgInst_O::static_classSymbol()); #endif // } DEFINE_CLASS_NAMES #undef DEFINE_CLASS_NAMES #if defined(EXPOSE_TO_CANDO) || defined(ALL_STAGES) #ifdef Use_LlvmoPkg extern void Register_llvmo__APFloat_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__APFloat_O"); Register_llvmo__APFloat_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__APInt_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__APInt_O"); Register_llvmo__APInt_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Attribute_O(core::Lisp_sp); // base(s): set(['core::T_O']) {_BLOCK_TRACE("initializing Register_llvmo__Attribute_O"); Register_llvmo__Attribute_O(_lisp); // base(s): set(['core::T_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Builder_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__Builder_O"); Register_llvmo__Builder_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__DebugLoc_O(core::Lisp_sp); // base(s): set(['core::T_O']) {_BLOCK_TRACE("initializing Register_llvmo__DebugLoc_O"); Register_llvmo__DebugLoc_O(_lisp); // base(s): set(['core::T_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__EngineBuilder_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__EngineBuilder_O"); Register_llvmo__EngineBuilder_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ExecutionEngine_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__ExecutionEngine_O"); Register_llvmo__ExecutionEngine_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__IRBuilderBase_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__IRBuilderBase_O"); Register_llvmo__IRBuilderBase_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__InsertPoint_O(core::Lisp_sp); // base(s): set(['core::T_O']) {_BLOCK_TRACE("initializing Register_llvmo__InsertPoint_O"); Register_llvmo__InsertPoint_O(_lisp); // base(s): set(['core::T_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__LLVMContext_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__LLVMContext_O"); Register_llvmo__LLVMContext_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Module_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__Module_O"); Register_llvmo__Module_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__PassManagerBase_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__PassManagerBase_O"); Register_llvmo__PassManagerBase_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Pass_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__Pass_O"); Register_llvmo__Pass_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Type_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__Type_O"); Register_llvmo__Type_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Value_O(core::Lisp_sp); // base(s): set(['core::ExternalObject_O']) {_BLOCK_TRACE("initializing Register_llvmo__Value_O"); Register_llvmo__Value_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Argument_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O']) {_BLOCK_TRACE("initializing Register_llvmo__Argument_O"); Register_llvmo__Argument_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__BasicBlock_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O']) {_BLOCK_TRACE("initializing Register_llvmo__BasicBlock_O"); Register_llvmo__BasicBlock_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__CompositeType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O']) {_BLOCK_TRACE("initializing Register_llvmo__CompositeType_O"); Register_llvmo__CompositeType_O(_lisp); // base(s): set(['llvmo::Type_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__FunctionPassManager_O(core::Lisp_sp); // base(s): set(['llvmo::PassManagerBase_O']) {_BLOCK_TRACE("initializing Register_llvmo__FunctionPassManager_O"); Register_llvmo__FunctionPassManager_O(_lisp); // base(s): set(['llvmo::PassManagerBase_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__FunctionPass_O(core::Lisp_sp); // base(s): set(['llvmo::Pass_O']) {_BLOCK_TRACE("initializing Register_llvmo__FunctionPass_O"); Register_llvmo__FunctionPass_O(_lisp); // base(s): set(['llvmo::Pass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__FunctionType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O']) {_BLOCK_TRACE("initializing Register_llvmo__FunctionType_O"); Register_llvmo__FunctionType_O(_lisp); // base(s): set(['llvmo::Type_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__IRBuilder_O(core::Lisp_sp); // base(s): set(['llvmo::IRBuilderBase_O']) {_BLOCK_TRACE("initializing Register_llvmo__IRBuilder_O"); Register_llvmo__IRBuilder_O(_lisp); // base(s): set(['llvmo::IRBuilderBase_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__IntegerType_O(core::Lisp_sp); // base(s): set(['llvmo::Type_O']) {_BLOCK_TRACE("initializing Register_llvmo__IntegerType_O"); Register_llvmo__IntegerType_O(_lisp); // base(s): set(['llvmo::Type_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__MDNode_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O']) {_BLOCK_TRACE("initializing Register_llvmo__MDNode_O"); Register_llvmo__MDNode_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__MDString_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O']) {_BLOCK_TRACE("initializing Register_llvmo__MDString_O"); Register_llvmo__MDString_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ModulePass_O(core::Lisp_sp); // base(s): set(['llvmo::Pass_O']) {_BLOCK_TRACE("initializing Register_llvmo__ModulePass_O"); Register_llvmo__ModulePass_O(_lisp); // base(s): set(['llvmo::Pass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__User_O(core::Lisp_sp); // base(s): set(['llvmo::Value_O']) {_BLOCK_TRACE("initializing Register_llvmo__User_O"); Register_llvmo__User_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Constant_O(core::Lisp_sp); // base(s): set(['llvmo::User_O']) {_BLOCK_TRACE("initializing Register_llvmo__Constant_O"); Register_llvmo__Constant_O(_lisp); // base(s): set(['llvmo::User_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ImmutablePass_O(core::Lisp_sp); // base(s): set(['llvmo::ModulePass_O']) {_BLOCK_TRACE("initializing Register_llvmo__ImmutablePass_O"); Register_llvmo__ImmutablePass_O(_lisp); // base(s): set(['llvmo::ModulePass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Instruction_O(core::Lisp_sp); // base(s): set(['llvmo::User_O']) {_BLOCK_TRACE("initializing Register_llvmo__Instruction_O"); Register_llvmo__Instruction_O(_lisp); // base(s): set(['llvmo::User_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__SequentialType_O(core::Lisp_sp); // base(s): set(['llvmo::CompositeType_O']) {_BLOCK_TRACE("initializing Register_llvmo__SequentialType_O"); Register_llvmo__SequentialType_O(_lisp); // base(s): set(['llvmo::CompositeType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__StructType_O(core::Lisp_sp); // base(s): set(['llvmo::CompositeType_O']) {_BLOCK_TRACE("initializing Register_llvmo__StructType_O"); Register_llvmo__StructType_O(_lisp); // base(s): set(['llvmo::CompositeType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ArrayType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O']) {_BLOCK_TRACE("initializing Register_llvmo__ArrayType_O"); Register_llvmo__ArrayType_O(_lisp); // base(s): set(['llvmo::SequentialType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__AtomicCmpXchgInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__AtomicCmpXchgInst_O"); Register_llvmo__AtomicCmpXchgInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__AtomicRMWInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__AtomicRMWInst_O"); Register_llvmo__AtomicRMWInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__CallInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__CallInst_O"); Register_llvmo__CallInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantArray_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantArray_O"); Register_llvmo__ConstantArray_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantDataSequential_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantDataSequential_O"); Register_llvmo__ConstantDataSequential_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantExpr_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantExpr_O"); Register_llvmo__ConstantExpr_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantFP_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantFP_O"); Register_llvmo__ConstantFP_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantInt_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantInt_O"); Register_llvmo__ConstantInt_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantPointerNull_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantPointerNull_O"); Register_llvmo__ConstantPointerNull_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__DataLayout_O(core::Lisp_sp); // base(s): set(['llvmo::ImmutablePass_O']) {_BLOCK_TRACE("initializing Register_llvmo__DataLayout_O"); Register_llvmo__DataLayout_O(_lisp); // base(s): set(['llvmo::ImmutablePass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__FenceInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__FenceInst_O"); Register_llvmo__FenceInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__GlobalValue_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__GlobalValue_O"); Register_llvmo__GlobalValue_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__LandingPadInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__LandingPadInst_O"); Register_llvmo__LandingPadInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__PHINode_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__PHINode_O"); Register_llvmo__PHINode_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__PointerType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O']) {_BLOCK_TRACE("initializing Register_llvmo__PointerType_O"); Register_llvmo__PointerType_O(_lisp); // base(s): set(['llvmo::SequentialType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__StoreInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__StoreInst_O"); Register_llvmo__StoreInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__TerminatorInst_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__TerminatorInst_O"); Register_llvmo__TerminatorInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__UnaryInstruction_O(core::Lisp_sp); // base(s): set(['llvmo::Instruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__UnaryInstruction_O"); Register_llvmo__UnaryInstruction_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__UndefValue_O(core::Lisp_sp); // base(s): set(['llvmo::Constant_O']) {_BLOCK_TRACE("initializing Register_llvmo__UndefValue_O"); Register_llvmo__UndefValue_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__VectorType_O(core::Lisp_sp); // base(s): set(['llvmo::SequentialType_O']) {_BLOCK_TRACE("initializing Register_llvmo__VectorType_O"); Register_llvmo__VectorType_O(_lisp); // base(s): set(['llvmo::SequentialType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__AllocaInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__AllocaInst_O"); Register_llvmo__AllocaInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__BranchInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__BranchInst_O"); Register_llvmo__BranchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ConstantDataArray_O(core::Lisp_sp); // base(s): set(['llvmo::ConstantDataSequential_O']) {_BLOCK_TRACE("initializing Register_llvmo__ConstantDataArray_O"); Register_llvmo__ConstantDataArray_O(_lisp); // base(s): set(['llvmo::ConstantDataSequential_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__Function_O(core::Lisp_sp); // base(s): set(['llvmo::GlobalValue_O']) {_BLOCK_TRACE("initializing Register_llvmo__Function_O"); Register_llvmo__Function_O(_lisp); // base(s): set(['llvmo::GlobalValue_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__GlobalVariable_O(core::Lisp_sp); // base(s): set(['llvmo::GlobalValue_O']) {_BLOCK_TRACE("initializing Register_llvmo__GlobalVariable_O"); Register_llvmo__GlobalVariable_O(_lisp); // base(s): set(['llvmo::GlobalValue_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__IndirectBrInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__IndirectBrInst_O"); Register_llvmo__IndirectBrInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__InvokeInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__InvokeInst_O"); Register_llvmo__InvokeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__LoadInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__LoadInst_O"); Register_llvmo__LoadInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ResumeInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__ResumeInst_O"); Register_llvmo__ResumeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__ReturnInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__ReturnInst_O"); Register_llvmo__ReturnInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__SwitchInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__SwitchInst_O"); Register_llvmo__SwitchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__UnreachableInst_O(core::Lisp_sp); // base(s): set(['llvmo::TerminatorInst_O']) {_BLOCK_TRACE("initializing Register_llvmo__UnreachableInst_O"); Register_llvmo__UnreachableInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Register_llvmo__VAArgInst_O(core::Lisp_sp); // base(s): set(['llvmo::UnaryInstruction_O']) {_BLOCK_TRACE("initializing Register_llvmo__VAArgInst_O"); Register_llvmo__VAArgInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O']) } #endif // ifdef Use_LlvmoPkg #endif // EXPOSE_TO_CANDO #undef EXPOSE_TO_CANDO #ifdef EXPOSE_TO_PYTHON #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__APFloat_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__APFloat_O"); Call_exposePython_llvmo__APFloat_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__APInt_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__APInt_O"); Call_exposePython_llvmo__APInt_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Attribute_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Attribute_O"); Call_exposePython_llvmo__Attribute_O(_lisp); // base(s): set(['core::T_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Builder_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Builder_O"); Call_exposePython_llvmo__Builder_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__DebugLoc_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__DebugLoc_O"); Call_exposePython_llvmo__DebugLoc_O(_lisp); // base(s): set(['core::T_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__EngineBuilder_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__EngineBuilder_O"); Call_exposePython_llvmo__EngineBuilder_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ExecutionEngine_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ExecutionEngine_O"); Call_exposePython_llvmo__ExecutionEngine_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__IRBuilderBase_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__IRBuilderBase_O"); Call_exposePython_llvmo__IRBuilderBase_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__InsertPoint_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__InsertPoint_O"); Call_exposePython_llvmo__InsertPoint_O(_lisp); // base(s): set(['core::T_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__LLVMContext_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__LLVMContext_O"); Call_exposePython_llvmo__LLVMContext_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Module_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Module_O"); Call_exposePython_llvmo__Module_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__PassManagerBase_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__PassManagerBase_O"); Call_exposePython_llvmo__PassManagerBase_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Pass_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Pass_O"); Call_exposePython_llvmo__Pass_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Type_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Type_O"); Call_exposePython_llvmo__Type_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Value_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Value_O"); Call_exposePython_llvmo__Value_O(_lisp); // base(s): set(['core::ExternalObject_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Argument_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Argument_O"); Call_exposePython_llvmo__Argument_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__BasicBlock_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__BasicBlock_O"); Call_exposePython_llvmo__BasicBlock_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__CompositeType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__CompositeType_O"); Call_exposePython_llvmo__CompositeType_O(_lisp); // base(s): set(['llvmo::Type_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__FunctionPassManager_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__FunctionPassManager_O"); Call_exposePython_llvmo__FunctionPassManager_O(_lisp); // base(s): set(['llvmo::PassManagerBase_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__FunctionPass_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__FunctionPass_O"); Call_exposePython_llvmo__FunctionPass_O(_lisp); // base(s): set(['llvmo::Pass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__FunctionType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__FunctionType_O"); Call_exposePython_llvmo__FunctionType_O(_lisp); // base(s): set(['llvmo::Type_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__IRBuilder_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__IRBuilder_O"); Call_exposePython_llvmo__IRBuilder_O(_lisp); // base(s): set(['llvmo::IRBuilderBase_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__IntegerType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__IntegerType_O"); Call_exposePython_llvmo__IntegerType_O(_lisp); // base(s): set(['llvmo::Type_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__MDNode_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__MDNode_O"); Call_exposePython_llvmo__MDNode_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__MDString_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__MDString_O"); Call_exposePython_llvmo__MDString_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ModulePass_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ModulePass_O"); Call_exposePython_llvmo__ModulePass_O(_lisp); // base(s): set(['llvmo::Pass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__User_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__User_O"); Call_exposePython_llvmo__User_O(_lisp); // base(s): set(['llvmo::Value_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Constant_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Constant_O"); Call_exposePython_llvmo__Constant_O(_lisp); // base(s): set(['llvmo::User_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ImmutablePass_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ImmutablePass_O"); Call_exposePython_llvmo__ImmutablePass_O(_lisp); // base(s): set(['llvmo::ModulePass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Instruction_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Instruction_O"); Call_exposePython_llvmo__Instruction_O(_lisp); // base(s): set(['llvmo::User_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__SequentialType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__SequentialType_O"); Call_exposePython_llvmo__SequentialType_O(_lisp); // base(s): set(['llvmo::CompositeType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__StructType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__StructType_O"); Call_exposePython_llvmo__StructType_O(_lisp); // base(s): set(['llvmo::CompositeType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ArrayType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ArrayType_O"); Call_exposePython_llvmo__ArrayType_O(_lisp); // base(s): set(['llvmo::SequentialType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__AtomicCmpXchgInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__AtomicCmpXchgInst_O"); Call_exposePython_llvmo__AtomicCmpXchgInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__AtomicRMWInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__AtomicRMWInst_O"); Call_exposePython_llvmo__AtomicRMWInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__CallInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__CallInst_O"); Call_exposePython_llvmo__CallInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantArray_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantArray_O"); Call_exposePython_llvmo__ConstantArray_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantDataSequential_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantDataSequential_O"); Call_exposePython_llvmo__ConstantDataSequential_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantExpr_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantExpr_O"); Call_exposePython_llvmo__ConstantExpr_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantFP_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantFP_O"); Call_exposePython_llvmo__ConstantFP_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantInt_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantInt_O"); Call_exposePython_llvmo__ConstantInt_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantPointerNull_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantPointerNull_O"); Call_exposePython_llvmo__ConstantPointerNull_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__DataLayout_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__DataLayout_O"); Call_exposePython_llvmo__DataLayout_O(_lisp); // base(s): set(['llvmo::ImmutablePass_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__FenceInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__FenceInst_O"); Call_exposePython_llvmo__FenceInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__GlobalValue_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__GlobalValue_O"); Call_exposePython_llvmo__GlobalValue_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__LandingPadInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__LandingPadInst_O"); Call_exposePython_llvmo__LandingPadInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__PHINode_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__PHINode_O"); Call_exposePython_llvmo__PHINode_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__PointerType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__PointerType_O"); Call_exposePython_llvmo__PointerType_O(_lisp); // base(s): set(['llvmo::SequentialType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__StoreInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__StoreInst_O"); Call_exposePython_llvmo__StoreInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__TerminatorInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__TerminatorInst_O"); Call_exposePython_llvmo__TerminatorInst_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__UnaryInstruction_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__UnaryInstruction_O"); Call_exposePython_llvmo__UnaryInstruction_O(_lisp); // base(s): set(['llvmo::Instruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__UndefValue_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__UndefValue_O"); Call_exposePython_llvmo__UndefValue_O(_lisp); // base(s): set(['llvmo::Constant_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__VectorType_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__VectorType_O"); Call_exposePython_llvmo__VectorType_O(_lisp); // base(s): set(['llvmo::SequentialType_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__AllocaInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__AllocaInst_O"); Call_exposePython_llvmo__AllocaInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__BranchInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__BranchInst_O"); Call_exposePython_llvmo__BranchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ConstantDataArray_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ConstantDataArray_O"); Call_exposePython_llvmo__ConstantDataArray_O(_lisp); // base(s): set(['llvmo::ConstantDataSequential_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__Function_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__Function_O"); Call_exposePython_llvmo__Function_O(_lisp); // base(s): set(['llvmo::GlobalValue_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__GlobalVariable_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__GlobalVariable_O"); Call_exposePython_llvmo__GlobalVariable_O(_lisp); // base(s): set(['llvmo::GlobalValue_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__IndirectBrInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__IndirectBrInst_O"); Call_exposePython_llvmo__IndirectBrInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__InvokeInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__InvokeInst_O"); Call_exposePython_llvmo__InvokeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__LoadInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__LoadInst_O"); Call_exposePython_llvmo__LoadInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ResumeInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ResumeInst_O"); Call_exposePython_llvmo__ResumeInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__ReturnInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__ReturnInst_O"); Call_exposePython_llvmo__ReturnInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__SwitchInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__SwitchInst_O"); Call_exposePython_llvmo__SwitchInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__UnreachableInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__UnreachableInst_O"); Call_exposePython_llvmo__UnreachableInst_O(_lisp); // base(s): set(['llvmo::TerminatorInst_O']) } #endif // ifdef Use_LlvmoPkg #ifdef Use_LlvmoPkg extern void Call_exposePython_llvmo__VAArgInst_O(::core::Lisp_sp lisp); {_DBG("exposing to python: llvmo__VAArgInst_O"); Call_exposePython_llvmo__VAArgInst_O(_lisp); // base(s): set(['llvmo::UnaryInstruction_O']) } #endif // ifdef Use_LlvmoPkg #endif // EXPOSE_TO_PYTHON #undef EXPOSE_TO_PYTHON #undef ALL_STAGES ================================================ FILE: samples/C++/instances.inc ================================================ #include "QPBO.h" #ifdef _MSC_VER #pragma warning(disable: 4661) #endif // Instantiations template class QPBO; template class QPBO; template class QPBO; template <> inline void QPBO::get_type_information(char*& type_name, char*& type_format) { type_name = "int"; type_format = "d"; } template <> inline void QPBO::get_type_information(char*& type_name, char*& type_format) { type_name = "float"; type_format = "f"; } template <> inline void QPBO::get_type_information(char*& type_name, char*& type_format) { type_name = "double"; type_format = "Lf"; } ================================================ FILE: samples/C++/json_reader.cpp ================================================ // Copyright 2007-2010 Baptiste Lepilleur // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_reader.cpp #include #include #include #include #include #include #include #include #if _MSC_VER >= 1400 // VC++ 8.0 #pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. #endif namespace Json { // QNX is strict about declaring C symbols in the std namespace. #ifdef __QNXNTO__ using std::memcpy; using std::sprintf; using std::sscanf; #endif // Implementation of class Features // //////////////////////////////// Features::Features() : allowComments_( true ) , strictRoot_( false ) { } Features Features::all() { return Features(); } Features Features::strictMode() { Features features; features.allowComments_ = false; features.strictRoot_ = true; return features; } // Implementation of class Reader // //////////////////////////////// static inline bool in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4 ) { return c == c1 || c == c2 || c == c3 || c == c4; } static inline bool in( Reader::Char c, Reader::Char c1, Reader::Char c2, Reader::Char c3, Reader::Char c4, Reader::Char c5 ) { return c == c1 || c == c2 || c == c3 || c == c4 || c == c5; } static bool containsNewLine( Reader::Location begin, Reader::Location end ) { for ( ;begin < end; ++begin ) if ( *begin == '\n' || *begin == '\r' ) return true; return false; } static std::string codePointToUTF8(unsigned int cp) { std::string result; // based on description from http://en.wikipedia.org/wiki/UTF-8 if (cp <= 0x7f) { result.resize(1); result[0] = static_cast(cp); } else if (cp <= 0x7FF) { result.resize(2); result[1] = static_cast(0x80 | (0x3f & cp)); result[0] = static_cast(0xC0 | (0x1f & (cp >> 6))); } else if (cp <= 0xFFFF) { result.resize(3); result[2] = static_cast(0x80 | (0x3f & cp)); result[1] = 0x80 | static_cast((0x3f & (cp >> 6))); result[0] = 0xE0 | static_cast((0xf & (cp >> 12))); } else if (cp <= 0x10FFFF) { result.resize(4); result[3] = static_cast(0x80 | (0x3f & cp)); result[2] = static_cast(0x80 | (0x3f & (cp >> 6))); result[1] = static_cast(0x80 | (0x3f & (cp >> 12))); result[0] = static_cast(0xF0 | (0x7 & (cp >> 18))); } return result; } // Class Reader // ////////////////////////////////////////////////////////////////// Reader::Reader() : features_( Features::all() ) { } Reader::Reader( const Features &features ) : features_( features ) { } bool Reader::parse( const std::string &document, Value &root, bool collectComments ) { document_ = document; const char *begin = document_.c_str(); const char *end = begin + document_.length(); return parse( begin, end, root, collectComments ); } bool Reader::parse( std::istream& sin, Value &root, bool collectComments ) { //std::istream_iterator begin(sin); //std::istream_iterator end; // Those would allow streamed input from a file, if parse() were a // template function. // Since std::string is reference-counted, this at least does not // create an extra copy. std::string doc; std::getline(sin, doc, (char)EOF); return parse( doc, root, collectComments ); } bool Reader::parse( const char *beginDoc, const char *endDoc, Value &root, bool collectComments ) { if ( !features_.allowComments_ ) { collectComments = false; } begin_ = beginDoc; end_ = endDoc; collectComments_ = collectComments; current_ = begin_; lastValueEnd_ = 0; lastValue_ = 0; commentsBefore_ = ""; errors_.clear(); while ( !nodes_.empty() ) nodes_.pop(); nodes_.push( &root ); bool successful = readValue(); Token token; skipCommentTokens( token ); if ( collectComments_ && !commentsBefore_.empty() ) root.setComment( commentsBefore_, commentAfter ); if ( features_.strictRoot_ ) { if ( !root.isArray() && !root.isObject() ) { // Set error location to start of doc, ideally should be first token found in doc token.type_ = tokenError; token.start_ = beginDoc; token.end_ = endDoc; addError( "A valid JSON document must be either an array or an object value.", token ); return false; } } return successful; } bool Reader::readValue() { Token token; skipCommentTokens( token ); bool successful = true; if ( collectComments_ && !commentsBefore_.empty() ) { currentValue().setComment( commentsBefore_, commentBefore ); commentsBefore_ = ""; } switch ( token.type_ ) { case tokenObjectBegin: successful = readObject( token ); break; case tokenArrayBegin: successful = readArray( token ); break; case tokenNumber: successful = decodeNumber( token ); break; case tokenString: successful = decodeString( token ); break; case tokenTrue: currentValue() = true; break; case tokenFalse: currentValue() = false; break; case tokenNull: currentValue() = Value(); break; default: return addError( "Syntax error: value, object or array expected.", token ); } if ( collectComments_ ) { lastValueEnd_ = current_; lastValue_ = ¤tValue(); } return successful; } void Reader::skipCommentTokens( Token &token ) { if ( features_.allowComments_ ) { do { readToken( token ); } while ( token.type_ == tokenComment ); } else { readToken( token ); } } bool Reader::expectToken( TokenType type, Token &token, const char *message ) { readToken( token ); if ( token.type_ != type ) return addError( message, token ); return true; } bool Reader::readToken( Token &token ) { skipSpaces(); token.start_ = current_; Char c = getNextChar(); bool ok = true; switch ( c ) { case '{': token.type_ = tokenObjectBegin; break; case '}': token.type_ = tokenObjectEnd; break; case '[': token.type_ = tokenArrayBegin; break; case ']': token.type_ = tokenArrayEnd; break; case '"': token.type_ = tokenString; ok = readString(); break; case '/': token.type_ = tokenComment; ok = readComment(); break; case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': case '-': token.type_ = tokenNumber; readNumber(); break; case 't': token.type_ = tokenTrue; ok = match( "rue", 3 ); break; case 'f': token.type_ = tokenFalse; ok = match( "alse", 4 ); break; case 'n': token.type_ = tokenNull; ok = match( "ull", 3 ); break; case ',': token.type_ = tokenArraySeparator; break; case ':': token.type_ = tokenMemberSeparator; break; case 0: token.type_ = tokenEndOfStream; break; default: ok = false; break; } if ( !ok ) token.type_ = tokenError; token.end_ = current_; return true; } void Reader::skipSpaces() { while ( current_ != end_ ) { Char c = *current_; if ( c == ' ' || c == '\t' || c == '\r' || c == '\n' ) ++current_; else break; } } bool Reader::match( Location pattern, int patternLength ) { if ( end_ - current_ < patternLength ) return false; int index = patternLength; while ( index-- ) if ( current_[index] != pattern[index] ) return false; current_ += patternLength; return true; } bool Reader::readComment() { Location commentBegin = current_ - 1; Char c = getNextChar(); bool successful = false; if ( c == '*' ) successful = readCStyleComment(); else if ( c == '/' ) successful = readCppStyleComment(); if ( !successful ) return false; if ( collectComments_ ) { CommentPlacement placement = commentBefore; if ( lastValueEnd_ && !containsNewLine( lastValueEnd_, commentBegin ) ) { if ( c != '*' || !containsNewLine( commentBegin, current_ ) ) placement = commentAfterOnSameLine; } addComment( commentBegin, current_, placement ); } return true; } void Reader::addComment( Location begin, Location end, CommentPlacement placement ) { assert( collectComments_ ); if ( placement == commentAfterOnSameLine ) { assert( lastValue_ != 0 ); lastValue_->setComment( std::string( begin, end ), placement ); } else { if ( !commentsBefore_.empty() ) commentsBefore_ += "\n"; commentsBefore_ += std::string( begin, end ); } } bool Reader::readCStyleComment() { while ( current_ != end_ ) { Char c = getNextChar(); if ( c == '*' && *current_ == '/' ) break; } return getNextChar() == '/'; } bool Reader::readCppStyleComment() { while ( current_ != end_ ) { Char c = getNextChar(); if ( c == '\r' || c == '\n' ) break; } return true; } void Reader::readNumber() { while ( current_ != end_ ) { if ( !(*current_ >= '0' && *current_ <= '9') && !in( *current_, '.', 'e', 'E', '+', '-' ) ) break; ++current_; } } bool Reader::readString() { Char c = 0; while ( current_ != end_ ) { c = getNextChar(); if ( c == '\\' ) getNextChar(); else if ( c == '"' ) break; } return c == '"'; } bool Reader::readObject( Token &tokenStart ) { Token tokenName; std::string name; currentValue() = Value( objectValue ); while ( readToken( tokenName ) ) { bool initialTokenOk = true; while ( tokenName.type_ == tokenComment && initialTokenOk ) initialTokenOk = readToken( tokenName ); if ( !initialTokenOk ) break; if ( tokenName.type_ == tokenObjectEnd && name.empty() ) // empty object return true; if ( tokenName.type_ != tokenString ) break; name = ""; if ( !decodeString( tokenName, name ) ) return recoverFromError( tokenObjectEnd ); Token colon; if ( !readToken( colon ) || colon.type_ != tokenMemberSeparator ) { return addErrorAndRecover( "Missing ':' after object member name", colon, tokenObjectEnd ); } Value &value = currentValue()[ name ]; nodes_.push( &value ); bool ok = readValue(); nodes_.pop(); if ( !ok ) // error already set return recoverFromError( tokenObjectEnd ); Token comma; if ( !readToken( comma ) || ( comma.type_ != tokenObjectEnd && comma.type_ != tokenArraySeparator && comma.type_ != tokenComment ) ) { return addErrorAndRecover( "Missing ',' or '}' in object declaration", comma, tokenObjectEnd ); } bool finalizeTokenOk = true; while ( comma.type_ == tokenComment && finalizeTokenOk ) finalizeTokenOk = readToken( comma ); if ( comma.type_ == tokenObjectEnd ) return true; } return addErrorAndRecover( "Missing '}' or object member name", tokenName, tokenObjectEnd ); } bool Reader::readArray( Token &tokenStart ) { currentValue() = Value( arrayValue ); skipSpaces(); if ( *current_ == ']' ) // empty array { Token endArray; readToken( endArray ); return true; } int index = 0; while ( true ) { Value &value = currentValue()[ index++ ]; nodes_.push( &value ); bool ok = readValue(); nodes_.pop(); if ( !ok ) // error already set return recoverFromError( tokenArrayEnd ); Token token; // Accept Comment after last item in the array. ok = readToken( token ); while ( token.type_ == tokenComment && ok ) { ok = readToken( token ); } bool badTokenType = ( token.type_ == tokenArraySeparator && token.type_ == tokenArrayEnd ); if ( !ok || badTokenType ) { return addErrorAndRecover( "Missing ',' or ']' in array declaration", token, tokenArrayEnd ); } if ( token.type_ == tokenArrayEnd ) break; } return true; } bool Reader::decodeNumber( Token &token ) { bool isDouble = false; for ( Location inspect = token.start_; inspect != token.end_; ++inspect ) { isDouble = isDouble || in( *inspect, '.', 'e', 'E', '+' ) || ( *inspect == '-' && inspect != token.start_ ); } if ( isDouble ) return decodeDouble( token ); Location current = token.start_; bool isNegative = *current == '-'; if ( isNegative ) ++current; Value::UInt threshold = (isNegative ? Value::UInt(-Value::minInt) : Value::maxUInt) / 10; Value::UInt value = 0; while ( current < token.end_ ) { Char c = *current++; if ( c < '0' || c > '9' ) return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); if ( value >= threshold ) return decodeDouble( token ); value = value * 10 + Value::UInt(c - '0'); } if ( isNegative ) currentValue() = -Value::Int( value ); else if ( value <= Value::UInt(Value::maxInt) ) currentValue() = Value::Int( value ); else currentValue() = value; return true; } bool Reader::decodeDouble( Token &token ) { double value = 0; const int bufferSize = 32; int count; int length = int(token.end_ - token.start_); if ( length <= bufferSize ) { Char buffer[bufferSize]; memcpy( buffer, token.start_, length ); buffer[length] = 0; count = sscanf( buffer, "%lf", &value ); } else { std::string buffer( token.start_, token.end_ ); count = sscanf( buffer.c_str(), "%lf", &value ); } if ( count != 1 ) return addError( "'" + std::string( token.start_, token.end_ ) + "' is not a number.", token ); currentValue() = value; return true; } bool Reader::decodeString( Token &token ) { std::string decoded; if ( !decodeString( token, decoded ) ) return false; currentValue() = decoded; return true; } bool Reader::decodeString( Token &token, std::string &decoded ) { decoded.reserve( token.end_ - token.start_ - 2 ); Location current = token.start_ + 1; // skip '"' Location end = token.end_ - 1; // do not include '"' while ( current != end ) { Char c = *current++; if ( c == '"' ) break; else if ( c == '\\' ) { if ( current == end ) return addError( "Empty escape sequence in string", token, current ); Char escape = *current++; switch ( escape ) { case '"': decoded += '"'; break; case '/': decoded += '/'; break; case '\\': decoded += '\\'; break; case 'b': decoded += '\b'; break; case 'f': decoded += '\f'; break; case 'n': decoded += '\n'; break; case 'r': decoded += '\r'; break; case 't': decoded += '\t'; break; case 'u': { unsigned int unicode; if ( !decodeUnicodeCodePoint( token, current, end, unicode ) ) return false; decoded += codePointToUTF8(unicode); } break; default: return addError( "Bad escape sequence in string", token, current ); } } else { decoded += c; } } return true; } bool Reader::decodeUnicodeCodePoint( Token &token, Location ¤t, Location end, unsigned int &unicode ) { if ( !decodeUnicodeEscapeSequence( token, current, end, unicode ) ) return false; if (unicode >= 0xD800 && unicode <= 0xDBFF) { // surrogate pairs if (end - current < 6) return addError( "additional six characters expected to parse unicode surrogate pair.", token, current ); unsigned int surrogatePair; if (*(current++) == '\\' && *(current++)== 'u') { if (decodeUnicodeEscapeSequence( token, current, end, surrogatePair )) { unicode = 0x10000 + ((unicode & 0x3FF) << 10) + (surrogatePair & 0x3FF); } else return false; } else return addError( "expecting another \\u token to begin the second half of a unicode surrogate pair", token, current ); } return true; } bool Reader::decodeUnicodeEscapeSequence( Token &token, Location ¤t, Location end, unsigned int &unicode ) { if ( end - current < 4 ) return addError( "Bad unicode escape sequence in string: four digits expected.", token, current ); unicode = 0; for ( int index =0; index < 4; ++index ) { Char c = *current++; unicode *= 16; if ( c >= '0' && c <= '9' ) unicode += c - '0'; else if ( c >= 'a' && c <= 'f' ) unicode += c - 'a' + 10; else if ( c >= 'A' && c <= 'F' ) unicode += c - 'A' + 10; else return addError( "Bad unicode escape sequence in string: hexadecimal digit expected.", token, current ); } return true; } bool Reader::addError( const std::string &message, Token &token, Location extra ) { ErrorInfo info; info.token_ = token; info.message_ = message; info.extra_ = extra; errors_.push_back( info ); return false; } bool Reader::recoverFromError( TokenType skipUntilToken ) { int errorCount = int(errors_.size()); Token skip; while ( true ) { if ( !readToken(skip) ) errors_.resize( errorCount ); // discard errors caused by recovery if ( skip.type_ == skipUntilToken || skip.type_ == tokenEndOfStream ) break; } errors_.resize( errorCount ); return false; } bool Reader::addErrorAndRecover( const std::string &message, Token &token, TokenType skipUntilToken ) { addError( message, token ); return recoverFromError( skipUntilToken ); } Value & Reader::currentValue() { return *(nodes_.top()); } Reader::Char Reader::getNextChar() { if ( current_ == end_ ) return 0; return *current_++; } void Reader::getLocationLineAndColumn( Location location, int &line, int &column ) const { Location current = begin_; Location lastLineStart = current; line = 0; while ( current < location && current != end_ ) { Char c = *current++; if ( c == '\r' ) { if ( *current == '\n' ) ++current; lastLineStart = current; ++line; } else if ( c == '\n' ) { lastLineStart = current; ++line; } } // column & line start at 1 column = int(location - lastLineStart) + 1; ++line; } std::string Reader::getLocationLineAndColumn( Location location ) const { int line, column; getLocationLineAndColumn( location, line, column ); char buffer[18+16+16+1]; sprintf( buffer, "Line %d, Column %d", line, column ); return buffer; } std::string Reader::getFormatedErrorMessages() const { std::string formattedMessage; for ( Errors::const_iterator itError = errors_.begin(); itError != errors_.end(); ++itError ) { const ErrorInfo &error = *itError; formattedMessage += "* " + getLocationLineAndColumn( error.token_.start_ ) + "\n"; formattedMessage += " " + error.message_ + "\n"; if ( error.extra_ ) formattedMessage += "See " + getLocationLineAndColumn( error.extra_ ) + " for detail.\n"; } return formattedMessage; } std::istream& operator>>( std::istream &sin, Value &root ) { Json::Reader reader; bool ok = reader.parse(sin, root, true); //JSON_ASSERT( ok ); if (!ok) throw std::runtime_error(reader.getFormatedErrorMessages()); return sin; } } // namespace Json ================================================ FILE: samples/C++/json_writer.cpp ================================================ // Copyright 2007-2010 Baptiste Lepilleur // Distributed under MIT license, or public domain if desired and // recognized in your jurisdiction. // See file LICENSE for detail or copy at http://jsoncpp.sourceforge.net/LICENSE /* Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Source - https://github.com/Ij888/ApacheCordovaRecipes/blob/6e8a2c1d9de7302f74bc3dbac54a021f0499bbb3/jqmsandbox/plugins/cordova-plugin-globalization/src/blackberry10/native/public/json_writer.cpp #include #include #include #include #include #include #include #include #if _MSC_VER >= 1400 // VC++ 8.0 #pragma warning( disable : 4996 ) // disable warning about strdup being deprecated. #endif namespace Json { static bool isControlCharacter(char ch) { return ch > 0 && ch <= 0x1F; } static bool containsControlCharacter( const char* str ) { while ( *str ) { if ( isControlCharacter( *(str++) ) ) return true; } return false; } static void uintToString( unsigned int value, char *¤t ) { *--current = 0; do { *--current = (value % 10) + '0'; value /= 10; } while ( value != 0 ); } std::string valueToString( Int value ) { char buffer[32]; char *current = buffer + sizeof(buffer); bool isNegative = value < 0; if ( isNegative ) value = -value; uintToString( UInt(value), current ); if ( isNegative ) *--current = '-'; assert( current >= buffer ); return current; } std::string valueToString( UInt value ) { char buffer[32]; char *current = buffer + sizeof(buffer); uintToString( value, current ); assert( current >= buffer ); return current; } std::string valueToString( double value ) { char buffer[32]; #if defined(_MSC_VER) && defined(__STDC_SECURE_LIB__) // Use secure version with visual studio 2005 to avoid warning. sprintf_s(buffer, sizeof(buffer), "%#.16g", value); #else sprintf(buffer, "%#.16g", value); #endif char* ch = buffer + strlen(buffer) - 1; if (*ch != '0') return buffer; // nothing to truncate, so save time while(ch > buffer && *ch == '0'){ --ch; } char* last_nonzero = ch; while(ch >= buffer){ switch(*ch){ case '0': case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': --ch; continue; case '.': // Truncate zeroes to save bytes in output, but keep one. *(last_nonzero+2) = '\0'; return buffer; default: return buffer; } } return buffer; } std::string valueToString( bool value ) { return value ? "true" : "false"; } std::string valueToQuotedString( const char *value ) { // Not sure how to handle unicode... if (strpbrk(value, "\"\\\b\f\n\r\t") == NULL && !containsControlCharacter( value )) return std::string("\"") + value + "\""; // We have to walk value and escape any special characters. // Appending to std::string is not efficient, but this should be rare. // (Note: forward slashes are *not* rare, but I am not escaping them.) unsigned maxsize = strlen(value)*2 + 3; // allescaped+quotes+NULL std::string result; result.reserve(maxsize); // to avoid lots of mallocs result += "\""; for (const char* c=value; *c != 0; ++c) { switch(*c) { case '\"': result += "\\\""; break; case '\\': result += "\\\\"; break; case '\b': result += "\\b"; break; case '\f': result += "\\f"; break; case '\n': result += "\\n"; break; case '\r': result += "\\r"; break; case '\t': result += "\\t"; break; //case '/': // Even though \/ is considered a legal escape in JSON, a bare // slash is also legal, so I see no reason to escape it. // (I hope I am not misunderstanding something. // blep notes: actually escaping \/ may be useful in javascript to avoid (*c); result += oss.str(); } else { result += *c; } break; } } result += "\""; return result; } // Class Writer // ////////////////////////////////////////////////////////////////// Writer::~Writer() { } // Class FastWriter // ////////////////////////////////////////////////////////////////// FastWriter::FastWriter() : yamlCompatiblityEnabled_( false ) { } void FastWriter::enableYAMLCompatibility() { yamlCompatiblityEnabled_ = true; } std::string FastWriter::write( const Value &root ) { document_ = ""; writeValue( root ); document_ += "\n"; return document_; } void FastWriter::writeValue( const Value &value ) { switch ( value.type() ) { case nullValue: document_ += "null"; break; case intValue: document_ += valueToString( value.asInt() ); break; case uintValue: document_ += valueToString( value.asUInt() ); break; case realValue: document_ += valueToString( value.asDouble() ); break; case stringValue: document_ += valueToQuotedString( value.asCString() ); break; case booleanValue: document_ += valueToString( value.asBool() ); break; case arrayValue: { document_ += "["; int size = value.size(); for ( int index =0; index < size; ++index ) { if ( index > 0 ) document_ += ","; writeValue( value[index] ); } document_ += "]"; } break; case objectValue: { Value::Members members( value.getMemberNames() ); document_ += "{"; for ( Value::Members::iterator it = members.begin(); it != members.end(); ++it ) { const std::string &name = *it; if ( it != members.begin() ) document_ += ","; document_ += valueToQuotedString( name.c_str() ); document_ += yamlCompatiblityEnabled_ ? ": " : ":"; writeValue( value[name] ); } document_ += "}"; } break; } } // Class StyledWriter // ////////////////////////////////////////////////////////////////// StyledWriter::StyledWriter() : rightMargin_( 74 ) , indentSize_( 3 ) { } std::string StyledWriter::write( const Value &root ) { document_ = ""; addChildValues_ = false; indentString_ = ""; writeCommentBeforeValue( root ); writeValue( root ); writeCommentAfterValueOnSameLine( root ); document_ += "\n"; return document_; } void StyledWriter::writeValue( const Value &value ) { switch ( value.type() ) { case nullValue: pushValue( "null" ); break; case intValue: pushValue( valueToString( value.asInt() ) ); break; case uintValue: pushValue( valueToString( value.asUInt() ) ); break; case realValue: pushValue( valueToString( value.asDouble() ) ); break; case stringValue: pushValue( valueToQuotedString( value.asCString() ) ); break; case booleanValue: pushValue( valueToString( value.asBool() ) ); break; case arrayValue: writeArrayValue( value); break; case objectValue: { Value::Members members( value.getMemberNames() ); if ( members.empty() ) pushValue( "{}" ); else { writeWithIndent( "{" ); indent(); Value::Members::iterator it = members.begin(); while ( true ) { const std::string &name = *it; const Value &childValue = value[name]; writeCommentBeforeValue( childValue ); writeWithIndent( valueToQuotedString( name.c_str() ) ); document_ += " : "; writeValue( childValue ); if ( ++it == members.end() ) { writeCommentAfterValueOnSameLine( childValue ); break; } document_ += ","; writeCommentAfterValueOnSameLine( childValue ); } unindent(); writeWithIndent( "}" ); } } break; } } void StyledWriter::writeArrayValue( const Value &value ) { unsigned size = value.size(); if ( size == 0 ) pushValue( "[]" ); else { bool isArrayMultiLine = isMultineArray( value ); if ( isArrayMultiLine ) { writeWithIndent( "[" ); indent(); bool hasChildValue = !childValues_.empty(); unsigned index =0; while ( true ) { const Value &childValue = value[index]; writeCommentBeforeValue( childValue ); if ( hasChildValue ) writeWithIndent( childValues_[index] ); else { writeIndent(); writeValue( childValue ); } if ( ++index == size ) { writeCommentAfterValueOnSameLine( childValue ); break; } document_ += ","; writeCommentAfterValueOnSameLine( childValue ); } unindent(); writeWithIndent( "]" ); } else // output on a single line { assert( childValues_.size() == size ); document_ += "[ "; for ( unsigned index =0; index < size; ++index ) { if ( index > 0 ) document_ += ", "; document_ += childValues_[index]; } document_ += " ]"; } } } bool StyledWriter::isMultineArray( const Value &value ) { int size = value.size(); bool isMultiLine = size*3 >= rightMargin_ ; childValues_.clear(); for ( int index =0; index < size && !isMultiLine; ++index ) { const Value &childValue = value[index]; isMultiLine = isMultiLine || ( (childValue.isArray() || childValue.isObject()) && childValue.size() > 0 ); } if ( !isMultiLine ) // check if line length > max line length { childValues_.reserve( size ); addChildValues_ = true; int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' for ( int index =0; index < size && !isMultiLine; ++index ) { writeValue( value[index] ); lineLength += int( childValues_[index].length() ); isMultiLine = isMultiLine && hasCommentForValue( value[index] ); } addChildValues_ = false; isMultiLine = isMultiLine || lineLength >= rightMargin_; } return isMultiLine; } void StyledWriter::pushValue( const std::string &value ) { if ( addChildValues_ ) childValues_.push_back( value ); else document_ += value; } void StyledWriter::writeIndent() { if ( !document_.empty() ) { char last = document_[document_.length()-1]; if ( last == ' ' ) // already indented return; if ( last != '\n' ) // Comments may add new-line document_ += '\n'; } document_ += indentString_; } void StyledWriter::writeWithIndent( const std::string &value ) { writeIndent(); document_ += value; } void StyledWriter::indent() { indentString_ += std::string( indentSize_, ' ' ); } void StyledWriter::unindent() { assert( int(indentString_.size()) >= indentSize_ ); indentString_.resize( indentString_.size() - indentSize_ ); } void StyledWriter::writeCommentBeforeValue( const Value &root ) { if ( !root.hasComment( commentBefore ) ) return; document_ += normalizeEOL( root.getComment( commentBefore ) ); document_ += "\n"; } void StyledWriter::writeCommentAfterValueOnSameLine( const Value &root ) { if ( root.hasComment( commentAfterOnSameLine ) ) document_ += " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); if ( root.hasComment( commentAfter ) ) { document_ += "\n"; document_ += normalizeEOL( root.getComment( commentAfter ) ); document_ += "\n"; } } bool StyledWriter::hasCommentForValue( const Value &value ) { return value.hasComment( commentBefore ) || value.hasComment( commentAfterOnSameLine ) || value.hasComment( commentAfter ); } std::string StyledWriter::normalizeEOL( const std::string &text ) { std::string normalized; normalized.reserve( text.length() ); const char *begin = text.c_str(); const char *end = begin + text.length(); const char *current = begin; while ( current != end ) { char c = *current++; if ( c == '\r' ) // mac or dos EOL { if ( *current == '\n' ) // convert dos EOL ++current; normalized += '\n'; } else // handle unix EOL & other char normalized += c; } return normalized; } // Class StyledStreamWriter // ////////////////////////////////////////////////////////////////// StyledStreamWriter::StyledStreamWriter( std::string indentation ) : document_(NULL) , rightMargin_( 74 ) , indentation_( indentation ) { } void StyledStreamWriter::write( std::ostream &out, const Value &root ) { document_ = &out; addChildValues_ = false; indentString_ = ""; writeCommentBeforeValue( root ); writeValue( root ); writeCommentAfterValueOnSameLine( root ); *document_ << "\n"; document_ = NULL; // Forget the stream, for safety. } void StyledStreamWriter::writeValue( const Value &value ) { switch ( value.type() ) { case nullValue: pushValue( "null" ); break; case intValue: pushValue( valueToString( value.asInt() ) ); break; case uintValue: pushValue( valueToString( value.asUInt() ) ); break; case realValue: pushValue( valueToString( value.asDouble() ) ); break; case stringValue: pushValue( valueToQuotedString( value.asCString() ) ); break; case booleanValue: pushValue( valueToString( value.asBool() ) ); break; case arrayValue: writeArrayValue( value); break; case objectValue: { Value::Members members( value.getMemberNames() ); if ( members.empty() ) pushValue( "{}" ); else { writeWithIndent( "{" ); indent(); Value::Members::iterator it = members.begin(); while ( true ) { const std::string &name = *it; const Value &childValue = value[name]; writeCommentBeforeValue( childValue ); writeWithIndent( valueToQuotedString( name.c_str() ) ); *document_ << " : "; writeValue( childValue ); if ( ++it == members.end() ) { writeCommentAfterValueOnSameLine( childValue ); break; } *document_ << ","; writeCommentAfterValueOnSameLine( childValue ); } unindent(); writeWithIndent( "}" ); } } break; } } void StyledStreamWriter::writeArrayValue( const Value &value ) { unsigned size = value.size(); if ( size == 0 ) pushValue( "[]" ); else { bool isArrayMultiLine = isMultineArray( value ); if ( isArrayMultiLine ) { writeWithIndent( "[" ); indent(); bool hasChildValue = !childValues_.empty(); unsigned index =0; while ( true ) { const Value &childValue = value[index]; writeCommentBeforeValue( childValue ); if ( hasChildValue ) writeWithIndent( childValues_[index] ); else { writeIndent(); writeValue( childValue ); } if ( ++index == size ) { writeCommentAfterValueOnSameLine( childValue ); break; } *document_ << ","; writeCommentAfterValueOnSameLine( childValue ); } unindent(); writeWithIndent( "]" ); } else // output on a single line { assert( childValues_.size() == size ); *document_ << "[ "; for ( unsigned index =0; index < size; ++index ) { if ( index > 0 ) *document_ << ", "; *document_ << childValues_[index]; } *document_ << " ]"; } } } bool StyledStreamWriter::isMultineArray( const Value &value ) { int size = value.size(); bool isMultiLine = size*3 >= rightMargin_ ; childValues_.clear(); for ( int index =0; index < size && !isMultiLine; ++index ) { const Value &childValue = value[index]; isMultiLine = isMultiLine || ( (childValue.isArray() || childValue.isObject()) && childValue.size() > 0 ); } if ( !isMultiLine ) // check if line length > max line length { childValues_.reserve( size ); addChildValues_ = true; int lineLength = 4 + (size-1)*2; // '[ ' + ', '*n + ' ]' for ( int index =0; index < size && !isMultiLine; ++index ) { writeValue( value[index] ); lineLength += int( childValues_[index].length() ); isMultiLine = isMultiLine && hasCommentForValue( value[index] ); } addChildValues_ = false; isMultiLine = isMultiLine || lineLength >= rightMargin_; } return isMultiLine; } void StyledStreamWriter::pushValue( const std::string &value ) { if ( addChildValues_ ) childValues_.push_back( value ); else *document_ << value; } void StyledStreamWriter::writeIndent() { /* Some comments in this method would have been nice. ;-) if ( !document_.empty() ) { char last = document_[document_.length()-1]; if ( last == ' ' ) // already indented return; if ( last != '\n' ) // Comments may add new-line *document_ << '\n'; } */ *document_ << '\n' << indentString_; } void StyledStreamWriter::writeWithIndent( const std::string &value ) { writeIndent(); *document_ << value; } void StyledStreamWriter::indent() { indentString_ += indentation_; } void StyledStreamWriter::unindent() { assert( indentString_.size() >= indentation_.size() ); indentString_.resize( indentString_.size() - indentation_.size() ); } void StyledStreamWriter::writeCommentBeforeValue( const Value &root ) { if ( !root.hasComment( commentBefore ) ) return; *document_ << normalizeEOL( root.getComment( commentBefore ) ); *document_ << "\n"; } void StyledStreamWriter::writeCommentAfterValueOnSameLine( const Value &root ) { if ( root.hasComment( commentAfterOnSameLine ) ) *document_ << " " + normalizeEOL( root.getComment( commentAfterOnSameLine ) ); if ( root.hasComment( commentAfter ) ) { *document_ << "\n"; *document_ << normalizeEOL( root.getComment( commentAfter ) ); *document_ << "\n"; } } bool StyledStreamWriter::hasCommentForValue( const Value &value ) { return value.hasComment( commentBefore ) || value.hasComment( commentAfterOnSameLine ) || value.hasComment( commentAfter ); } std::string StyledStreamWriter::normalizeEOL( const std::string &text ) { std::string normalized; normalized.reserve( text.length() ); const char *begin = text.c_str(); const char *end = begin + text.length(); const char *current = begin; while ( current != end ) { char c = *current++; if ( c == '\r' ) // mac or dos EOL { if ( *current == '\n' ) // convert dos EOL ++current; normalized += '\n'; } else // handle unix EOL & other char normalized += c; } return normalized; } std::ostream& operator<<( std::ostream &sout, const Value &root ) { Json::StyledStreamWriter writer; writer.write(sout, root); return sout; } } // namespace Json ================================================ FILE: samples/C++/key.cpp ================================================ // Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #include #include #include #include "key.h" // Generate a private key from just the secret parameter int EC_KEY_regenerate_key(EC_KEY *eckey, BIGNUM *priv_key) { int ok = 0; BN_CTX *ctx = NULL; EC_POINT *pub_key = NULL; if (!eckey) return 0; const EC_GROUP *group = EC_KEY_get0_group(eckey); if ((ctx = BN_CTX_new()) == NULL) goto err; pub_key = EC_POINT_new(group); if (pub_key == NULL) goto err; if (!EC_POINT_mul(group, pub_key, priv_key, NULL, NULL, ctx)) goto err; EC_KEY_set_private_key(eckey,priv_key); EC_KEY_set_public_key(eckey,pub_key); ok = 1; err: if (pub_key) EC_POINT_free(pub_key); if (ctx != NULL) BN_CTX_free(ctx); return(ok); } // Perform ECDSA key recovery (see SEC1 4.1.6) for curves over (mod p)-fields // recid selects which key is recovered // if check is nonzero, additional checks are performed int ECDSA_SIG_recover_key_GFp(EC_KEY *eckey, ECDSA_SIG *ecsig, const unsigned char *msg, int msglen, int recid, int check) { if (!eckey) return 0; int ret = 0; BN_CTX *ctx = NULL; BIGNUM *x = NULL; BIGNUM *e = NULL; BIGNUM *order = NULL; BIGNUM *sor = NULL; BIGNUM *eor = NULL; BIGNUM *field = NULL; EC_POINT *R = NULL; EC_POINT *O = NULL; EC_POINT *Q = NULL; BIGNUM *rr = NULL; BIGNUM *zero = NULL; int n = 0; int i = recid / 2; const EC_GROUP *group = EC_KEY_get0_group(eckey); if ((ctx = BN_CTX_new()) == NULL) { ret = -1; goto err; } BN_CTX_start(ctx); order = BN_CTX_get(ctx); if (!EC_GROUP_get_order(group, order, ctx)) { ret = -2; goto err; } x = BN_CTX_get(ctx); if (!BN_copy(x, order)) { ret=-1; goto err; } if (!BN_mul_word(x, i)) { ret=-1; goto err; } if (!BN_add(x, x, ecsig->r)) { ret=-1; goto err; } field = BN_CTX_get(ctx); if (!EC_GROUP_get_curve_GFp(group, field, NULL, NULL, ctx)) { ret=-2; goto err; } if (BN_cmp(x, field) >= 0) { ret=0; goto err; } if ((R = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } if (!EC_POINT_set_compressed_coordinates_GFp(group, R, x, recid % 2, ctx)) { ret=0; goto err; } if (check) { if ((O = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } if (!EC_POINT_mul(group, O, NULL, R, order, ctx)) { ret=-2; goto err; } if (!EC_POINT_is_at_infinity(group, O)) { ret = 0; goto err; } } if ((Q = EC_POINT_new(group)) == NULL) { ret = -2; goto err; } n = EC_GROUP_get_degree(group); e = BN_CTX_get(ctx); if (!BN_bin2bn(msg, msglen, e)) { ret=-1; goto err; } if (8*msglen > n) BN_rshift(e, e, 8-(n & 7)); zero = BN_CTX_get(ctx); if (!BN_zero(zero)) { ret=-1; goto err; } if (!BN_mod_sub(e, zero, e, order, ctx)) { ret=-1; goto err; } rr = BN_CTX_get(ctx); if (!BN_mod_inverse(rr, ecsig->r, order, ctx)) { ret=-1; goto err; } sor = BN_CTX_get(ctx); if (!BN_mod_mul(sor, ecsig->s, rr, order, ctx)) { ret=-1; goto err; } eor = BN_CTX_get(ctx); if (!BN_mod_mul(eor, e, rr, order, ctx)) { ret=-1; goto err; } if (!EC_POINT_mul(group, Q, eor, R, sor, ctx)) { ret=-2; goto err; } if (!EC_KEY_set_public_key(eckey, Q)) { ret=-2; goto err; } ret = 1; err: if (ctx) { BN_CTX_end(ctx); BN_CTX_free(ctx); } if (R != NULL) EC_POINT_free(R); if (O != NULL) EC_POINT_free(O); if (Q != NULL) EC_POINT_free(Q); return ret; } void CKey::SetCompressedPubKey() { EC_KEY_set_conv_form(pkey, POINT_CONVERSION_COMPRESSED); fCompressedPubKey = true; } void CKey::Reset() { fCompressedPubKey = false; pkey = EC_KEY_new_by_curve_name(NID_secp256k1); if (pkey == NULL) throw key_error("CKey::CKey() : EC_KEY_new_by_curve_name failed"); fSet = false; } CKey::CKey() { Reset(); } CKey::CKey(const CKey& b) { pkey = EC_KEY_dup(b.pkey); if (pkey == NULL) throw key_error("CKey::CKey(const CKey&) : EC_KEY_dup failed"); fSet = b.fSet; } CKey& CKey::operator=(const CKey& b) { if (!EC_KEY_copy(pkey, b.pkey)) throw key_error("CKey::operator=(const CKey&) : EC_KEY_copy failed"); fSet = b.fSet; return (*this); } CKey::~CKey() { EC_KEY_free(pkey); } bool CKey::IsNull() const { return !fSet; } bool CKey::IsCompressed() const { return fCompressedPubKey; } void CKey::MakeNewKey(bool fCompressed) { if (!EC_KEY_generate_key(pkey)) throw key_error("CKey::MakeNewKey() : EC_KEY_generate_key failed"); if (fCompressed) SetCompressedPubKey(); fSet = true; } bool CKey::SetPrivKey(const CPrivKey& vchPrivKey) { const unsigned char* pbegin = &vchPrivKey[0]; if (!d2i_ECPrivateKey(&pkey, &pbegin, vchPrivKey.size())) return false; fSet = true; return true; } bool CKey::SetSecret(const CSecret& vchSecret, bool fCompressed) { EC_KEY_free(pkey); pkey = EC_KEY_new_by_curve_name(NID_secp256k1); if (pkey == NULL) throw key_error("CKey::SetSecret() : EC_KEY_new_by_curve_name failed"); if (vchSecret.size() != 32) throw key_error("CKey::SetSecret() : secret must be 32 bytes"); BIGNUM *bn = BN_bin2bn(&vchSecret[0],32,BN_new()); if (bn == NULL) throw key_error("CKey::SetSecret() : BN_bin2bn failed"); if (!EC_KEY_regenerate_key(pkey,bn)) { BN_clear_free(bn); throw key_error("CKey::SetSecret() : EC_KEY_regenerate_key failed"); } BN_clear_free(bn); fSet = true; if (fCompressed || fCompressedPubKey) SetCompressedPubKey(); return true; } CSecret CKey::GetSecret(bool &fCompressed) const { CSecret vchRet; vchRet.resize(32); const BIGNUM *bn = EC_KEY_get0_private_key(pkey); int nBytes = BN_num_bytes(bn); if (bn == NULL) throw key_error("CKey::GetSecret() : EC_KEY_get0_private_key failed"); int n=BN_bn2bin(bn,&vchRet[32 - nBytes]); if (n != nBytes) throw key_error("CKey::GetSecret(): BN_bn2bin failed"); fCompressed = fCompressedPubKey; return vchRet; } CPrivKey CKey::GetPrivKey() const { int nSize = i2d_ECPrivateKey(pkey, NULL); if (!nSize) throw key_error("CKey::GetPrivKey() : i2d_ECPrivateKey failed"); CPrivKey vchPrivKey(nSize, 0); unsigned char* pbegin = &vchPrivKey[0]; if (i2d_ECPrivateKey(pkey, &pbegin) != nSize) throw key_error("CKey::GetPrivKey() : i2d_ECPrivateKey returned unexpected size"); return vchPrivKey; } bool CKey::SetPubKey(const CPubKey& vchPubKey) { const unsigned char* pbegin = &vchPubKey.vchPubKey[0]; if (!o2i_ECPublicKey(&pkey, &pbegin, vchPubKey.vchPubKey.size())) return false; fSet = true; if (vchPubKey.vchPubKey.size() == 33) SetCompressedPubKey(); return true; } CPubKey CKey::GetPubKey() const { int nSize = i2o_ECPublicKey(pkey, NULL); if (!nSize) throw key_error("CKey::GetPubKey() : i2o_ECPublicKey failed"); std::vector vchPubKey(nSize, 0); unsigned char* pbegin = &vchPubKey[0]; if (i2o_ECPublicKey(pkey, &pbegin) != nSize) throw key_error("CKey::GetPubKey() : i2o_ECPublicKey returned unexpected size"); return CPubKey(vchPubKey); } bool CKey::Sign(uint256 hash, std::vector& vchSig) { unsigned int nSize = ECDSA_size(pkey); vchSig.resize(nSize); // Make sure it is big enough if (!ECDSA_sign(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], &nSize, pkey)) { vchSig.clear(); return false; } vchSig.resize(nSize); // Shrink to fit actual size return true; } // create a compact signature (65 bytes), which allows reconstructing the used public key // The format is one header byte, followed by two times 32 bytes for the serialized r and s values. // The header byte: 0x1B = first key with even y, 0x1C = first key with odd y, // 0x1D = second key with even y, 0x1E = second key with odd y bool CKey::SignCompact(uint256 hash, std::vector& vchSig) { bool fOk = false; ECDSA_SIG *sig = ECDSA_do_sign((unsigned char*)&hash, sizeof(hash), pkey); if (sig==NULL) return false; vchSig.clear(); vchSig.resize(65,0); int nBitsR = BN_num_bits(sig->r); int nBitsS = BN_num_bits(sig->s); if (nBitsR <= 256 && nBitsS <= 256) { int nRecId = -1; for (int i=0; i<4; i++) { CKey keyRec; keyRec.fSet = true; if (fCompressedPubKey) keyRec.SetCompressedPubKey(); if (ECDSA_SIG_recover_key_GFp(keyRec.pkey, sig, (unsigned char*)&hash, sizeof(hash), i, 1) == 1) if (keyRec.GetPubKey() == this->GetPubKey()) { nRecId = i; break; } } if (nRecId == -1) throw key_error("CKey::SignCompact() : unable to construct recoverable key"); vchSig[0] = nRecId+27+(fCompressedPubKey ? 4 : 0); BN_bn2bin(sig->r,&vchSig[33-(nBitsR+7)/8]); BN_bn2bin(sig->s,&vchSig[65-(nBitsS+7)/8]); fOk = true; } ECDSA_SIG_free(sig); return fOk; } // reconstruct public key from a compact signature // This is only slightly more CPU intensive than just verifying it. // If this function succeeds, the recovered public key is guaranteed to be valid // (the signature is a valid signature of the given data for that key) bool CKey::SetCompactSignature(uint256 hash, const std::vector& vchSig) { if (vchSig.size() != 65) return false; int nV = vchSig[0]; if (nV<27 || nV>=35) return false; ECDSA_SIG *sig = ECDSA_SIG_new(); BN_bin2bn(&vchSig[1],32,sig->r); BN_bin2bn(&vchSig[33],32,sig->s); EC_KEY_free(pkey); pkey = EC_KEY_new_by_curve_name(NID_secp256k1); if (nV >= 31) { SetCompressedPubKey(); nV -= 4; } if (ECDSA_SIG_recover_key_GFp(pkey, sig, (unsigned char*)&hash, sizeof(hash), nV - 27, 0) == 1) { fSet = true; ECDSA_SIG_free(sig); return true; } return false; } bool CKey::Verify(uint256 hash, const std::vector& vchSig) { // -1 = error, 0 = bad sig, 1 = good if (ECDSA_verify(0, (unsigned char*)&hash, sizeof(hash), &vchSig[0], vchSig.size(), pkey) != 1) return false; return true; } bool CKey::VerifyCompact(uint256 hash, const std::vector& vchSig) { CKey key; if (!key.SetCompactSignature(hash, vchSig)) return false; if (GetPubKey() != key.GetPubKey()) return false; return true; } bool CKey::IsValid() { if (!fSet) return false; bool fCompr; CSecret secret = GetSecret(fCompr); CKey key2; key2.SetSecret(secret, fCompr); return GetPubKey() == key2.GetPubKey(); } ================================================ FILE: samples/C++/key.h ================================================ // Copyright (c) 2009-2010 Satoshi Nakamoto // Copyright (c) 2009-2012 The Bitcoin developers // Distributed under the MIT/X11 software license, see the accompanying // file COPYING or http://www.opensource.org/licenses/mit-license.php. #ifndef BITCOIN_KEY_H #define BITCOIN_KEY_H #include #include #include "allocators.h" #include "serialize.h" #include "uint256.h" #include "util.h" #include // for EC_KEY definition // secp160k1 // const unsigned int PRIVATE_KEY_SIZE = 192; // const unsigned int PUBLIC_KEY_SIZE = 41; // const unsigned int SIGNATURE_SIZE = 48; // // secp192k1 // const unsigned int PRIVATE_KEY_SIZE = 222; // const unsigned int PUBLIC_KEY_SIZE = 49; // const unsigned int SIGNATURE_SIZE = 57; // // secp224k1 // const unsigned int PRIVATE_KEY_SIZE = 250; // const unsigned int PUBLIC_KEY_SIZE = 57; // const unsigned int SIGNATURE_SIZE = 66; // // secp256k1: // const unsigned int PRIVATE_KEY_SIZE = 279; // const unsigned int PUBLIC_KEY_SIZE = 65; // const unsigned int SIGNATURE_SIZE = 72; // // see www.keylength.com // script supports up to 75 for single byte push class key_error : public std::runtime_error { public: explicit key_error(const std::string& str) : std::runtime_error(str) {} }; /** A reference to a CKey: the Hash160 of its serialized public key */ class CKeyID : public uint160 { public: CKeyID() : uint160(0) { } CKeyID(const uint160 &in) : uint160(in) { } }; /** A reference to a CScript: the Hash160 of its serialization (see script.h) */ class CScriptID : public uint160 { public: CScriptID() : uint160(0) { } CScriptID(const uint160 &in) : uint160(in) { } }; /** An encapsulated public key. */ class CPubKey { private: std::vector vchPubKey; friend class CKey; public: CPubKey() { } CPubKey(const std::vector &vchPubKeyIn) : vchPubKey(vchPubKeyIn) { } friend bool operator==(const CPubKey &a, const CPubKey &b) { return a.vchPubKey == b.vchPubKey; } friend bool operator!=(const CPubKey &a, const CPubKey &b) { return a.vchPubKey != b.vchPubKey; } friend bool operator<(const CPubKey &a, const CPubKey &b) { return a.vchPubKey < b.vchPubKey; } IMPLEMENT_SERIALIZE( READWRITE(vchPubKey); ) CKeyID GetID() const { return CKeyID(Hash160(vchPubKey)); } uint256 GetHash() const { return Hash(vchPubKey.begin(), vchPubKey.end()); } bool IsValid() const { return vchPubKey.size() == 33 || vchPubKey.size() == 65; } bool IsCompressed() const { return vchPubKey.size() == 33; } std::vector Raw() const { return vchPubKey; } }; // secure_allocator is defined in serialize.h // CPrivKey is a serialized private key, with all parameters included (279 bytes) typedef std::vector > CPrivKey; // CSecret is a serialization of just the secret parameter (32 bytes) typedef std::vector > CSecret; /** An encapsulated OpenSSL Elliptic Curve key (public and/or private) */ class CKey { protected: EC_KEY* pkey; bool fSet; bool fCompressedPubKey; void SetCompressedPubKey(); public: void Reset(); CKey(); CKey(const CKey& b); CKey& operator=(const CKey& b); ~CKey(); bool IsNull() const; bool IsCompressed() const; void MakeNewKey(bool fCompressed); bool SetPrivKey(const CPrivKey& vchPrivKey); bool SetSecret(const CSecret& vchSecret, bool fCompressed = false); CSecret GetSecret(bool &fCompressed) const; CPrivKey GetPrivKey() const; bool SetPubKey(const CPubKey& vchPubKey); CPubKey GetPubKey() const; bool Sign(uint256 hash, std::vector& vchSig); // create a compact signature (65 bytes), which allows reconstructing the used public key // The format is one header byte, followed by two times 32 bytes for the serialized r and s values. // The header byte: 0x1B = first key with even y, 0x1C = first key with odd y, // 0x1D = second key with even y, 0x1E = second key with odd y bool SignCompact(uint256 hash, std::vector& vchSig); // reconstruct public key from a compact signature // This is only slightly more CPU intensive than just verifying it. // If this function succeeds, the recovered public key is guaranteed to be valid // (the signature is a valid signature of the given data for that key) bool SetCompactSignature(uint256 hash, const std::vector& vchSig); bool Verify(uint256 hash, const std::vector& vchSig); // Verify a compact signature bool VerifyCompact(uint256 hash, const std::vector& vchSig); bool IsValid(); }; #endif ================================================ FILE: samples/C++/libcanister.h ================================================ #ifndef LIBCANIH #define LIBCANIH #include #include #include #include #define int64 unsigned long long //#define DEBUG #ifdef DEBUG #define dout cout #else #define dout if (0) cerr #endif using namespace std; namespace libcanister { //the canmem object is a generic memory container used commonly //throughout the canister framework to hold memory of uncertain //length which may or may not contain null bytes. class canmem { public: char* data; //the raw memory block int size; //the absolute length of the block canmem(); //creates an unallocated canmem canmem(int allocsize); //creates an allocated, blank canmem of size canmem(char* strdata); //automates the creation of zero-limited canmems ~canmem(); //cleans up the canmem void zeromem(); //overwrites this canmem void fragmem(); //overwrites this canmem with fragment notation void countlen(); //counts length of zero-limited strings and stores it in size void trim(); //removes any nulls from the end of the string static canmem null(); //returns a singleton null canmem }; //contains information about the canister class caninfo { public: canmem path; //physical path canmem internalname; //a name for the canister int numfiles; //the number of files in the canister }; //necessary for the use of this class as a type in canfile class canister; //this object holds the definition of a 'file' within the //canister 'filesystem.' class canfile { public: libcanister::canister* parent; //the canister that holds this file canmem path; //internal path ('filename') canmem data; //the file's decompressed contents int isfrag; //0 = probably not fragment, 1 = definitely a fragment (ignore) int cfid; //'canfile id' -- a unique ID for this file int64 dsize; //ondisk size (compressed form size) int cachestate; //0 = not in memory, 1 = in memory, 2 = in memory and needs flush //-1 = error, check the data for the message void cache(); //pull the file from disk and cache it in memory void cachedump(); //deletes the contents of this file from the memory cache after assuring the on disk copy is up to date void cachedumpfinal(fstream& infile); //same as cachedump, but more efficient during closing procedures void flush(); //updates the on disk copy, but retains the memory cache }; //the primary class //this defines and controls a single canister class canister { //table of contents //absolutely worthless to the control code in the canister //but quite useful to programs using the API, as they may //desire to enumerate the files in a canister for a user's //use or for their own. //contains a newline-delimited list of files in the container. canfile TOC; public: caninfo info; //the general info about this canister //the raw canfiles -- recommended that programs do not modify //these files directly, but not enforced. canfile* files; bool readonly; //if true then no write routines will do anything //maximum number of files to have in memory at any given //time, change this to whatever suits your application. int cachemax; int cachecnt; //number of files in the cache (should not be modified) //both initialize the canister from a physical location canister (canmem fspath); canister (char* fspath); //destroys the canister (after flushing the modded buffers, of course) ~canister(); //open the fspath //does it exist? // | --- yes --- opening it (return 1) // | --- yes --- file is corrupted, halting (return -1) // | --- no --- making a new one (return 0) int open(); //close the canister, flush all buffers, clean up int close(); //deletes the file at path inside this canister int delFile(canmem path); //pulls the contents of the file from disk or memory and returns it as a file canfile getFile(canmem path); //creates a file if it does not exist, otherwise overwrites //returns whether operation succeeded bool writeFile(canmem path, canmem data); bool writeFile(canfile file); //get the 'table of contents', a file containing a newline delimited //list of the file paths in the container which have contents canfile getTOC(); //brings the cache back within the cachemax limit //important: sCFID is the safe CFID //(the CFID of the file we want to avoid uncaching) //really just used internally, but it can't do any harm. void cacheclean(int sCFID, bool dFlush = false); }; } #endif ================================================ FILE: samples/C++/main.cpp ================================================ /* This file is part of the PhantomJS project from Ofi Labs. Copyright (C) 2011 Ariya Hidayat Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "consts.h" #include "utils.h" #include "env.h" #include "phantom.h" #ifdef Q_OS_LINUX #include "client/linux/handler/exception_handler.h" #endif #include #if QT_VERSION != QT_VERSION_CHECK(4, 8, 0) #error Something is wrong with the setup. Please report to the mailing list! #endif int main(int argc, char** argv, const char** envp) { #ifdef Q_OS_LINUX google_breakpad::ExceptionHandler eh("/tmp", NULL, Utils::exceptionHandler, NULL, true); #endif // Registering an alternative Message Handler qInstallMsgHandler(Utils::messageHandler); QApplication app(argc, argv); #ifdef STATIC_BUILD Q_INIT_RESOURCE(WebKit); Q_INIT_RESOURCE(InspectorBackendStub); #endif app.setWindowIcon(QIcon(":/phantomjs-icon.png")); app.setApplicationName("PhantomJS"); app.setOrganizationName("Ofi Labs"); app.setOrganizationDomain("www.ofilabs.com"); app.setApplicationVersion(PHANTOMJS_VERSION_STRING); Env::instance()->parse(envp); Phantom phantom; if (phantom.execute()) { app.exec(); } return phantom.returnValue(); } ================================================ FILE: samples/C++/metrics.h ================================================ // Copyright 2011 Google Inc. All Rights Reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. #ifndef NINJA_METRICS_H_ #define NINJA_METRICS_H_ #include #include using namespace std; #include "util.h" // For int64_t. /// The Metrics module is used for the debug mode that dumps timing stats of /// various actions. To use, see METRIC_RECORD below. /// A single metrics we're tracking, like "depfile load time". struct Metric { string name; /// Number of times we've hit the code path. int count; /// Total time (in micros) we've spent on the code path. int64_t sum; }; /// A scoped object for recording a metric across the body of a function. /// Used by the METRIC_RECORD macro. struct ScopedMetric { explicit ScopedMetric(Metric* metric); ~ScopedMetric(); private: Metric* metric_; /// Timestamp when the measurement started. /// Value is platform-dependent. int64_t start_; }; /// The singleton that stores metrics and prints the report. struct Metrics { Metric* NewMetric(const string& name); /// Print a summary report to stdout. void Report(); private: vector metrics_; }; /// Get the current time as relative to some epoch. /// Epoch varies between platforms; only useful for measuring elapsed time. int64_t GetTimeMillis(); /// A simple stopwatch which returns the time /// in seconds since Restart() was called. struct Stopwatch { public: Stopwatch() : started_(0) {} /// Seconds since Restart() call. double Elapsed() const { return 1e-6 * static_cast(Now() - started_); } void Restart() { started_ = Now(); } private: uint64_t started_; uint64_t Now() const; }; /// The primary interface to metrics. Use METRIC_RECORD("foobar") at the top /// of a function to get timing stats recorded for each call of the function. #define METRIC_RECORD(name) \ static Metric* metrics_h_metric = \ g_metrics ? g_metrics->NewMetric(name) : NULL; \ ScopedMetric metrics_h_scoped(metrics_h_metric); extern Metrics* g_metrics; #endif // NINJA_METRICS_H_ ================================================ FILE: samples/C++/module.ixx ================================================ //********************************************************************** // Copyright Patrick Sweeney 2015-2021 // Licensed under the MIT license. // See file LICENSE for details. //********************************************************************** module; #include #include #include #include #include #include export module Rendering.Caustic.Shader; import Base.Core.Core; import Base.Core.Error; import Base.Core.RefCount; import Base.Core.IRefCount; import Base.Math.BBox; import Base.Math.Matrix; import Rendering.Caustic.IShader; // A shader is a object that manages the vertex and pixel shader // export namespace Caustic { const int c_MaxFrames = 2; // Maximum number of frames being buffered //********************************************************************** // EShaderParamType defines the various types of parameters that can // be passed to a CShader // // Module: // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}} //********************************************************************** enum EShaderParamType { ShaderType_Undefined, ShaderType_Texture, ShaderType_Sampler, ShaderType_Float, ShaderType_Float2, ShaderType_Float3, ShaderType_Float4, ShaderType_Int, ShaderType_Matrix, ShaderType_Matrix3x3, ShaderType_Float_Array, ShaderType_Float2_Array, ShaderType_Float3_Array, ShaderType_Float4_Array, ShaderType_Int_Array, ShaderType_Matrix_Array, ShaderType_Matrix3x3_Array, ShaderType_StructuredBuffer, ShaderType_RWStructuredBuffer, ShaderType_AppendStructuredBuffer, ShaderType_RWByteAddressBuffer }; //********************************************************************** // Struct: ShaderParamDef // ShaderParamDef defines the shader definitions that were parsed from HLSL // by ParseShader. These definitions define the variables that each // shader defines (i.e. may be set by the client) // // Parameters: // m_type - Defines type of this parameter // m_name - Name of shader parameter // m_offset - Register offset // m_members - Number of elements (i.e. some parameters can be arrays) // m_elemSize - sizeof a single element in bytes (used by buffers) // // Module: // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}} //********************************************************************** struct ShaderParamDef { EShaderParamType m_type; // Defines type of this parameter std::wstring m_name; // Name of shader parameter uint32 m_offset; // register offset uint32 m_members; // Number of elements (i.e. some parameters can be arrays) uint32 m_elemSize; // size of a single element (used by buffers) }; //********************************************************************** // Struct: ShaderParamInstance // ShaderParamInstance defines each parameter that a shader exposes. These parameters // are derived from the ShaderParamDefs above. This is servers copy of each // parameter along with its value and position in the constant buffer. // // Parameters: // m_value - Value assigned to this parameter // m_values - Array of values assigned to this parameter // m_dirty - Is parameter dirty and needs to be pushed to constant buffer // // Module: // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}} //********************************************************************** struct ShaderParamInstance : public ShaderParamDef { std::any m_value; // Value assigned to this parameter std::vector m_values; bool m_dirty; // Is parameter dirty and needs to be pushed to constant buffer uint32 m_cbOffset; // Byte offset of this variable in the constant buffer }; struct Float { float x; Float(float _x) { x = _x; } }; struct Int { int x; Int(int _x) { x = _x; } }; struct Float2 { float x; float y; Float2(float _x, float _y) { x = _x; y = _y; } }; struct Float3 { float x; float y; float z; Float3(float _x, float _y, float _z) { x = _x; y = _y; z = _z; } }; struct Float4 { float x; float y; float z; float w; Float4(float _x, float _y, float _z, float _w) { x = _x; y = _y; z = _z; w = _w; } }; struct Matrix { float x[16]; Matrix() { ZeroMemory(x, sizeof(x)); } Matrix(Matrix4x4& m) { int index = 0; for (int col = 0; col < 4; col++) for (int row = 0; row < 4; row++) x[index++] = m[row][col]; } Matrix(Matrix3x3& m) { int index = 0; x[index++] = m[0][0]; x[index++] = m[1][0]; x[index++] = 0.0f; x[index++] = m[2][0]; x[index++] = m[0][1]; x[index++] = m[1][1]; x[index++] = 0.0f; x[index++] = m[2][1]; x[index++] = m[0][2]; x[index++] = m[1][2]; x[index++] = 0.0f; x[index++] = m[2][2]; x[index++] = 0.0f; x[index++] = 0.0f; x[index++] = 0.0f; x[index++] = 1.0f; } Matrix(float _x[16]) { memcpy(x, _x, sizeof(float) * 16); } }; struct Matrix_3x3 { float x[16]; Matrix_3x3() { ZeroMemory(x, sizeof(x)); } Matrix_3x3(Matrix3x3& m) { int index = 0; for (int col = 0; col < 4; col++) for (int row = 0; row < 4; row++) if (row == 3 || col == 3) x[index++] = 0.0f; else x[index++] = m[row][col]; } Matrix_3x3(float _x[16]) { memcpy(x, _x, sizeof(float) * 16); } }; //********************************************************************** // Class: SBuffer // Defines a buffer (which may be either a constant buffer or // and unordered access buffer used by a compute shader). // // Members: // m_spBuffer - the D3D buffer (that will be passed to the compute shader) // m_spStagingBuffer - staging buffer for going between CPU and GPU // m_spView - A view onto the buffer m_spBuffer // m_bufferSize - size of buffer in bytes // m_heapSize - size of the total heap the buffer is contained in // // Module: // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}} //********************************************************************** struct SBuffer { CComPtr m_spBuffer; CComPtr m_spStagingBuffer; CComPtr m_spUAView; CComPtr m_spSRView; uint32 m_bufferSize; uint32 m_heapSize; int m_bufferSlot; std::wstring m_name; SBuffer() : m_bufferSize(0), m_heapSize(0), m_bufferSlot(0) { } }; //********************************************************************** // Class: CGPUBuffer // Defines a buffer that is created by the client for passing/receiving // data from a compute shader. // // Module: // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}} //********************************************************************** class CGPUBuffer : public IGPUBuffer, public CRefCount { CComPtr m_spBuffer; CComPtr m_spStagingBuffer; CComPtr m_spUAView; CComPtr m_spSRView; uint32 m_bufferSize; uint32 m_heapSize; int m_bufferSlot; std::wstring m_name; EBufferType m_bufferType; uint32 m_numElems; // Number of elemens in buffer uint32 m_elemSize; // Element size (unaligned on CPU) void CreateBuffer(ID3D11Device* pDevice, uint32 bufSize, uint32 bindFlags, uint32 cpuAccessFlags, D3D11_USAGE usage, uint32 miscFlags, uint32 stride, uint32 alignment, ID3D11Buffer** ppBuffer); public: CGPUBuffer() : m_bufferSize(0), m_heapSize(0), m_bufferSlot(0), m_bufferType(EBufferType::StructuredBuffer) { } ~CGPUBuffer() { m_numElems = 0; } void Create(IRenderer* pRenderer, EBufferType bufferType, uint32 numElems, uint32 elemSize, uint32 bindFlags); //********************************************************************** // IRefCount //********************************************************************** virtual uint32 AddRef() override { return CRefCount::AddRef(); } virtual uint32 Release() override { return CRefCount::Release(); } //********************************************************************** // IGPUBuffer //********************************************************************** virtual EBufferType GetBufferType() override { return m_bufferType; } virtual CComPtr GetBuffer() override { return m_spBuffer; } virtual CComPtr GetStagingBuffer() override { return m_spStagingBuffer; } virtual CComPtr GetUAView() override { return m_spUAView; } virtual CComPtr GetSRView() override { return m_spSRView; } virtual void CopyFromCPU(IRenderer* pRenderer, uint8* pData) override; virtual void CopyToCPU(IRenderer* pRenderer, uint8* pData) override; }; //********************************************************************** // Class: CShader // Defines a shader used to render materials on an object // // A shader defines a material on a renderable. It is comprised of a pixel // shader, a vertex shader, and constants passed to those shaders. // // Module: // {Link:import Rendering.Caustic.Shader;{Rendering/Caustic/Shader.ixx}} //********************************************************************** class CShader : public IShader, public CRefCount { enum MatrixTypesAvail { PSMatrixAvail_world = 1, PSMatrixAvail_worldInv = 1 << 1, PSMatrixAvail_worldInvTranspose = 1 << 2, PSMatrixAvail_view = 1 << 3, PSMatrixAvail_viewInv = 1 << 4, PSMatrixAvail_proj = 1 << 5, PSMatrixAvail_projInv = 1 << 6, PSMatrixAvail_worldView = 1 << 7, PSMatrixAvail_worldViewInv = 1 << 8, PSMatrixAvail_worldViewProj = 1 << 9, PSMatrixAvail_worldViewProjInv = 1 << 10, VSMatrixAvail_world = 1 << 11, VSMatrixAvail_worldInv = 1 << 12, VSMatrixAvail_worldInvTranspose = 1 << 13, VSMatrixAvail_view = 1 << 14, VSMatrixAvail_viewInv = 1 << 15, VSMatrixAvail_proj = 1 << 16, VSMatrixAvail_projInv = 1 << 17, VSMatrixAvail_worldView = 1 << 18, VSMatrixAvail_worldViewInv = 1 << 19, VSMatrixAvail_worldViewProj = 1 << 20, VSMatrixAvail_worldViewProjInv = 1 << 21, }; uint32 m_matricesAvail; // Combination of MatrixTypesAvail flags indicating which matrices are referenced by the shader std::wstring m_name; std::vector m_layout; CComPtr m_spSamplerState; CComPtr m_spLayout; CComPtr m_spPixelShader; CComPtr m_spVertexShader; CComPtr m_spComputeShader; SBuffer m_vertexConstants; SBuffer m_pixelConstants; SBuffer m_computeConstants; std::map m_psParams; std::map m_vsParams; std::map m_csParams; CRefObj m_spShaderInfo; int m_xThreads; int m_yThreads; int m_zThreads; int m_maxTextureSlot; protected: void DetermineMatricesUsed(); void PushMatrix(const wchar_t* pParamName, std::any mat, uint32 vsmask, uint32 psmask); void PushLights(std::vector>& lights); void PushMatrices(IRenderer* pRenderer, DirectX::XMMATRIX *pWorld); uint32 ComputeParamSize(ShaderParamDef *pParams, uint32 numParams, std::map ¶ms); uint32 ShaderTypeSize(ShaderParamDef& paramDef); void PushConstants(IRenderer* pRenderer, SBuffer *pBuffer, std::map ¶ms); void ClearSamplers(IRenderer* pRenderer); void PushSamplers(IRenderer* pRenderer, std::map& params, bool isPixelShader); void PushBuffers(IRenderer* pRenderer, std::map& params); void PopBuffers(IRenderer* pRenderer, std::map& params); void SetParam(const std::wstring& paramName, const std::any& value, std::map& params); void SetParam(const wchar_t* paramName, const std::any& value, std::map& params); void SetParam(const std::wstring& paramName, int index, const std::any& value, std::map& params); void SetParam(const wchar_t* paramName, int index, const std::any& value, std::map& params); public: void Create(IRenderer *pRenderer, const wchar_t *pShaderName, IShaderInfo *pShaderInfo, ID3DBlob *pPSBlob, ID3DBlob* pVSBlob, ID3DBlob* pCSBlob); void CreateBuffer(ID3D11Device* pDevice, uint32 bufSize, uint32 bindFlags, uint32 cpuAccessFlags, D3D11_USAGE usage, uint32 miscFlags, uint32 stride, uint32 alignment, SBuffer* pBuffer, ID3D11Buffer **ppBuffer); void CreateConstantBuffer(ID3D11Device *pDevice, ShaderParamDef *pDefs, uint32 paramsSize, std::map ¶ms, SBuffer *pConstantBuffer); CShader() : m_xThreads(32), m_yThreads(32), m_zThreads(1), m_maxTextureSlot(0), m_matricesAvail(0) { } //********************************************************************** // IRefCount //********************************************************************** virtual uint32 AddRef() override { return CRefCount::AddRef(); } virtual uint32 Release() override { return CRefCount::Release(); } //********************************************************************** // IShader //********************************************************************** virtual CRefObj Clone(ID3D11Device *pDevice) override; virtual std::wstring &Name() override { return m_name; } virtual void BeginRender(IRenderer* pRenderer, IRenderMaterial* pMaterial, std::vector>& lights, DirectX::XMMATRIX* pWorld) override; virtual void SetPSParam(const std::wstring& paramName, const std::any& value) override; virtual void SetPSParam(const wchar_t* paramName, const std::any& value) override; virtual void SetPSParamFloat(const std::wstring& paramName, float value) override; virtual void SetPSParamFloat(const wchar_t* paramName, float value) override; virtual void SetPSParamInt(const std::wstring& paramName, int value) override; virtual void SetPSParamInt(const wchar_t* paramName, int value) override; virtual void SetPSParam(const std::wstring& paramName, int index, const std::any& value) override; virtual void SetPSParam(const wchar_t* paramName, int index, const std::any& value) override; virtual void SetVSParam(const std::wstring& paramName, const std::any& value) override; virtual void SetVSParam(const wchar_t* paramName, const std::any& value) override; virtual void SetVSParamFloat(const std::wstring& paramName, float value) override; virtual void SetVSParamFloat(const wchar_t* paramName, float value) override; virtual void SetVSParamInt(const std::wstring& paramName, int value) override; virtual void SetVSParamInt(const wchar_t* paramName, int value) override; virtual void SetVSParam(const std::wstring& paramName, int index, const std::any& value) override; virtual void SetVSParam(const wchar_t* paramName, int index, const std::any& value) override; virtual void SetCSParam(const std::wstring& paramName, const std::any& value) override; virtual void SetCSParam(const wchar_t* paramName, const std::any& value) override; virtual void SetCSParamFloat(const std::wstring& paramName, float value) override; virtual void SetCSParamFloat(const wchar_t* paramName, float value) override; virtual void SetCSParamInt(const std::wstring& paramName, int value) override; virtual void SetCSParamInt(const wchar_t* paramName, int value) override; virtual void SetCSParam(const std::wstring& paramName, int index, const std::any& value) override; virtual void SetCSParam(const wchar_t* paramName, int index, const std::any& value) override; virtual void EndRender(IRenderer* pRenderer) override; virtual CRefObj GetShaderInfo() override; virtual void Dispatch(IRenderer* pRenderer, int xThreads, int yThreads, int zThreads) override; }; } ================================================ FILE: samples/C++/octave_changer.ino ================================================ const int buttons[4] = {2,3,4,5}; const int octaves[2] = {6,7}; void setup() { // initialize the digital pin as an output. // Pin 13 has an LED connected on most Arduino boards: pinMode(13,OUTPUT); for(int i =0;i=0){ Serial.print(output); Serial.println(";"); digitalWrite(13,HIGH); }else{ digitalWrite(13,LOW); } } ================================================ FILE: samples/C++/program.cp ================================================ /** The MIT License (MIT) Copyright (c) 2016 Sahil Dua ( sahildua2305 | http://sahildua.com ) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ #include #include #include #include #include #include #include #include #include #include #include using namespace std; typedef long long ll; #define DEBUG #define mod 1000000007 #define pb push_back int r2, c2, n, m; bool dfs(vector graph, int r, int c){ //cout<0){ if(dfs(graph, r-1, c)) return true; } if(c>0){ if(dfs(graph, r, c-1)) return true; } if(r<(n-1)){ if(dfs(graph, r+1, c)) return true; } if(c<(m-1)){ if(dfs(graph, r, c+1)) return true; } return false; } struct point{ int r,c; point(int rr, int cc){ r = rr; c = cc; } }; stack st; // if(r>0){ // if(dfs(graph, r-1, c)) // return true; // } // if(c>0){ // if(dfs(graph, r, c-1)) // return true; // } // if(r<(n-1)){ // if(dfs(graph, r+1, c)) // return true; // } // if(c<(m-1)){ // if(dfs(graph, r, c+1)) // return true; // } bool search(vector graph, int rr, int cc){ point t; t.r=rr; t.c=cc; st.push(t); while(!st.empty()){ point u = st.top(); st.pop(); int r = u.r, c = u.c; cout<0){ t.r=r-1; t.c=c; st.push(t); } if(c>0){ t.r=r; t.c=c-1; st.push(t); } if(r<(n-1)){ t.r=r+1; t.c=c; st.push(t); } if(c<(m-1)){ t.r=r; t.c=c+1; st.push(t); } } return false; } int main(){ ios::sync_with_stdio(false); #ifdef DEBUG freopen("input.txt", "r", stdin); #endif // DEBUG cin>>n>>m; string temp; vector graph; for(int i=0;i>temp; graph.pb(temp); } int r1,c1; cin>>r1>>c1; cin>>r2>>c2; r2--; c2--; r1--; c1--; graph[r1][c1] = '.'; if(search(graph, r1, c1)) cout<<"YES\n"; else cout<<"NO\n"; return 0; } ================================================ FILE: samples/C++/protocol-buffer.pb.cc ================================================ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: protocol-buffer.proto #define INTERNAL_SUPPRESS_PROTOBUF_FIELD_DEPRECATION #include "protocol-buffer.pb.h" #include #include #include #include #include #include #include #include #include // @@protoc_insertion_point(includes) namespace persons { namespace { const ::google::protobuf::Descriptor* Person_descriptor_ = NULL; const ::google::protobuf::internal::GeneratedMessageReflection* Person_reflection_ = NULL; } // namespace void protobuf_AssignDesc_protocol_2dbuffer_2eproto() { protobuf_AddDesc_protocol_2dbuffer_2eproto(); const ::google::protobuf::FileDescriptor* file = ::google::protobuf::DescriptorPool::generated_pool()->FindFileByName( "protocol-buffer.proto"); GOOGLE_CHECK(file != NULL); Person_descriptor_ = file->message_type(0); static const int Person_offsets_[1] = { GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, name_), }; Person_reflection_ = new ::google::protobuf::internal::GeneratedMessageReflection( Person_descriptor_, Person::default_instance_, Person_offsets_, GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, _has_bits_[0]), GOOGLE_PROTOBUF_GENERATED_MESSAGE_FIELD_OFFSET(Person, _unknown_fields_), -1, ::google::protobuf::DescriptorPool::generated_pool(), ::google::protobuf::MessageFactory::generated_factory(), sizeof(Person)); } namespace { GOOGLE_PROTOBUF_DECLARE_ONCE(protobuf_AssignDescriptors_once_); inline void protobuf_AssignDescriptorsOnce() { ::google::protobuf::GoogleOnceInit(&protobuf_AssignDescriptors_once_, &protobuf_AssignDesc_protocol_2dbuffer_2eproto); } void protobuf_RegisterTypes(const ::std::string&) { protobuf_AssignDescriptorsOnce(); ::google::protobuf::MessageFactory::InternalRegisterGeneratedMessage( Person_descriptor_, &Person::default_instance()); } } // namespace void protobuf_ShutdownFile_protocol_2dbuffer_2eproto() { delete Person::default_instance_; delete Person_reflection_; } void protobuf_AddDesc_protocol_2dbuffer_2eproto() { static bool already_here = false; if (already_here) return; already_here = true; GOOGLE_PROTOBUF_VERIFY_VERSION; ::google::protobuf::DescriptorPool::InternalAddGeneratedFile( "\n\025protocol-buffer.proto\022\007persons\"\026\n\006Pers" "on\022\014\n\004name\030\001 \002(\t", 56); ::google::protobuf::MessageFactory::InternalRegisterGeneratedFile( "protocol-buffer.proto", &protobuf_RegisterTypes); Person::default_instance_ = new Person(); Person::default_instance_->InitAsDefaultInstance(); ::google::protobuf::internal::OnShutdown(&protobuf_ShutdownFile_protocol_2dbuffer_2eproto); } // Force AddDescriptors() to be called at static initialization time. struct StaticDescriptorInitializer_protocol_2dbuffer_2eproto { StaticDescriptorInitializer_protocol_2dbuffer_2eproto() { protobuf_AddDesc_protocol_2dbuffer_2eproto(); } } static_descriptor_initializer_protocol_2dbuffer_2eproto_; // =================================================================== #ifndef _MSC_VER const int Person::kNameFieldNumber; #endif // !_MSC_VER Person::Person() : ::google::protobuf::Message() { SharedCtor(); } void Person::InitAsDefaultInstance() { } Person::Person(const Person& from) : ::google::protobuf::Message() { SharedCtor(); MergeFrom(from); } void Person::SharedCtor() { _cached_size_ = 0; name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); ::memset(_has_bits_, 0, sizeof(_has_bits_)); } Person::~Person() { SharedDtor(); } void Person::SharedDtor() { if (name_ != &::google::protobuf::internal::kEmptyString) { delete name_; } if (this != default_instance_) { } } void Person::SetCachedSize(int size) const { GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); } const ::google::protobuf::Descriptor* Person::descriptor() { protobuf_AssignDescriptorsOnce(); return Person_descriptor_; } const Person& Person::default_instance() { if (default_instance_ == NULL) protobuf_AddDesc_protocol_2dbuffer_2eproto(); return *default_instance_; } Person* Person::default_instance_ = NULL; Person* Person::New() const { return new Person; } void Person::Clear() { if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { if (has_name()) { if (name_ != &::google::protobuf::internal::kEmptyString) { name_->clear(); } } } ::memset(_has_bits_, 0, sizeof(_has_bits_)); mutable_unknown_fields()->Clear(); } bool Person::MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input) { #define DO_(EXPRESSION) if (!(EXPRESSION)) return false ::google::protobuf::uint32 tag; while ((tag = input->ReadTag()) != 0) { switch (::google::protobuf::internal::WireFormatLite::GetTagFieldNumber(tag)) { // required string name = 1; case 1: { if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_LENGTH_DELIMITED) { DO_(::google::protobuf::internal::WireFormatLite::ReadString( input, this->mutable_name())); ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->name().data(), this->name().length(), ::google::protobuf::internal::WireFormat::PARSE); } else { goto handle_uninterpreted; } if (input->ExpectAtEnd()) return true; break; } default: { handle_uninterpreted: if (::google::protobuf::internal::WireFormatLite::GetTagWireType(tag) == ::google::protobuf::internal::WireFormatLite::WIRETYPE_END_GROUP) { return true; } DO_(::google::protobuf::internal::WireFormat::SkipField( input, tag, mutable_unknown_fields())); break; } } } return true; #undef DO_ } void Person::SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const { // required string name = 1; if (has_name()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->name().data(), this->name().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); ::google::protobuf::internal::WireFormatLite::WriteString( 1, this->name(), output); } if (!unknown_fields().empty()) { ::google::protobuf::internal::WireFormat::SerializeUnknownFields( unknown_fields(), output); } } ::google::protobuf::uint8* Person::SerializeWithCachedSizesToArray( ::google::protobuf::uint8* target) const { // required string name = 1; if (has_name()) { ::google::protobuf::internal::WireFormat::VerifyUTF8String( this->name().data(), this->name().length(), ::google::protobuf::internal::WireFormat::SERIALIZE); target = ::google::protobuf::internal::WireFormatLite::WriteStringToArray( 1, this->name(), target); } if (!unknown_fields().empty()) { target = ::google::protobuf::internal::WireFormat::SerializeUnknownFieldsToArray( unknown_fields(), target); } return target; } int Person::ByteSize() const { int total_size = 0; if (_has_bits_[0 / 32] & (0xffu << (0 % 32))) { // required string name = 1; if (has_name()) { total_size += 1 + ::google::protobuf::internal::WireFormatLite::StringSize( this->name()); } } if (!unknown_fields().empty()) { total_size += ::google::protobuf::internal::WireFormat::ComputeUnknownFieldsSize( unknown_fields()); } GOOGLE_SAFE_CONCURRENT_WRITES_BEGIN(); _cached_size_ = total_size; GOOGLE_SAFE_CONCURRENT_WRITES_END(); return total_size; } void Person::MergeFrom(const ::google::protobuf::Message& from) { GOOGLE_CHECK_NE(&from, this); const Person* source = ::google::protobuf::internal::dynamic_cast_if_available( &from); if (source == NULL) { ::google::protobuf::internal::ReflectionOps::Merge(from, this); } else { MergeFrom(*source); } } void Person::MergeFrom(const Person& from) { GOOGLE_CHECK_NE(&from, this); if (from._has_bits_[0 / 32] & (0xffu << (0 % 32))) { if (from.has_name()) { set_name(from.name()); } } mutable_unknown_fields()->MergeFrom(from.unknown_fields()); } void Person::CopyFrom(const ::google::protobuf::Message& from) { if (&from == this) return; Clear(); MergeFrom(from); } void Person::CopyFrom(const Person& from) { if (&from == this) return; Clear(); MergeFrom(from); } bool Person::IsInitialized() const { if ((_has_bits_[0] & 0x00000001) != 0x00000001) return false; return true; } void Person::Swap(Person* other) { if (other != this) { std::swap(name_, other->name_); std::swap(_has_bits_[0], other->_has_bits_[0]); _unknown_fields_.Swap(&other->_unknown_fields_); std::swap(_cached_size_, other->_cached_size_); } } ::google::protobuf::Metadata Person::GetMetadata() const { protobuf_AssignDescriptorsOnce(); ::google::protobuf::Metadata metadata; metadata.descriptor = Person_descriptor_; metadata.reflection = Person_reflection_; return metadata; } // @@protoc_insertion_point(namespace_scope) } // namespace persons // @@protoc_insertion_point(global_scope) ================================================ FILE: samples/C++/protocol-buffer.pb.h ================================================ // Generated by the protocol buffer compiler. DO NOT EDIT! // source: protocol-buffer.proto #ifndef PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED #define PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED #include #include #if GOOGLE_PROTOBUF_VERSION < 2005000 #error This file was generated by a newer version of protoc which is #error incompatible with your Protocol Buffer headers. Please update #error your headers. #endif #if 2005000 < GOOGLE_PROTOBUF_MIN_PROTOC_VERSION #error This file was generated by an older version of protoc which is #error incompatible with your Protocol Buffer headers. Please #error regenerate this file with a newer version of protoc. #endif #include #include #include #include #include // @@protoc_insertion_point(includes) namespace persons { // Internal implementation detail -- do not call these. void protobuf_AddDesc_protocol_2dbuffer_2eproto(); void protobuf_AssignDesc_protocol_2dbuffer_2eproto(); void protobuf_ShutdownFile_protocol_2dbuffer_2eproto(); class Person; // =================================================================== class Person : public ::google::protobuf::Message { public: Person(); virtual ~Person(); Person(const Person& from); inline Person& operator=(const Person& from) { CopyFrom(from); return *this; } inline const ::google::protobuf::UnknownFieldSet& unknown_fields() const { return _unknown_fields_; } inline ::google::protobuf::UnknownFieldSet* mutable_unknown_fields() { return &_unknown_fields_; } static const ::google::protobuf::Descriptor* descriptor(); static const Person& default_instance(); void Swap(Person* other); // implements Message ---------------------------------------------- Person* New() const; void CopyFrom(const ::google::protobuf::Message& from); void MergeFrom(const ::google::protobuf::Message& from); void CopyFrom(const Person& from); void MergeFrom(const Person& from); void Clear(); bool IsInitialized() const; int ByteSize() const; bool MergePartialFromCodedStream( ::google::protobuf::io::CodedInputStream* input); void SerializeWithCachedSizes( ::google::protobuf::io::CodedOutputStream* output) const; ::google::protobuf::uint8* SerializeWithCachedSizesToArray(::google::protobuf::uint8* output) const; int GetCachedSize() const { return _cached_size_; } private: void SharedCtor(); void SharedDtor(); void SetCachedSize(int size) const; public: ::google::protobuf::Metadata GetMetadata() const; // nested types ---------------------------------------------------- // accessors ------------------------------------------------------- // required string name = 1; inline bool has_name() const; inline void clear_name(); static const int kNameFieldNumber = 1; inline const ::std::string& name() const; inline void set_name(const ::std::string& value); inline void set_name(const char* value); inline void set_name(const char* value, size_t size); inline ::std::string* mutable_name(); inline ::std::string* release_name(); inline void set_allocated_name(::std::string* name); // @@protoc_insertion_point(class_scope:persons.Person) private: inline void set_has_name(); inline void clear_has_name(); ::google::protobuf::UnknownFieldSet _unknown_fields_; ::std::string* name_; mutable int _cached_size_; ::google::protobuf::uint32 _has_bits_[(1 + 31) / 32]; friend void protobuf_AddDesc_protocol_2dbuffer_2eproto(); friend void protobuf_AssignDesc_protocol_2dbuffer_2eproto(); friend void protobuf_ShutdownFile_protocol_2dbuffer_2eproto(); void InitAsDefaultInstance(); static Person* default_instance_; }; // =================================================================== // =================================================================== // Person // required string name = 1; inline bool Person::has_name() const { return (_has_bits_[0] & 0x00000001u) != 0; } inline void Person::set_has_name() { _has_bits_[0] |= 0x00000001u; } inline void Person::clear_has_name() { _has_bits_[0] &= ~0x00000001u; } inline void Person::clear_name() { if (name_ != &::google::protobuf::internal::kEmptyString) { name_->clear(); } clear_has_name(); } inline const ::std::string& Person::name() const { return *name_; } inline void Person::set_name(const ::std::string& value) { set_has_name(); if (name_ == &::google::protobuf::internal::kEmptyString) { name_ = new ::std::string; } name_->assign(value); } inline void Person::set_name(const char* value) { set_has_name(); if (name_ == &::google::protobuf::internal::kEmptyString) { name_ = new ::std::string; } name_->assign(value); } inline void Person::set_name(const char* value, size_t size) { set_has_name(); if (name_ == &::google::protobuf::internal::kEmptyString) { name_ = new ::std::string; } name_->assign(reinterpret_cast(value), size); } inline ::std::string* Person::mutable_name() { set_has_name(); if (name_ == &::google::protobuf::internal::kEmptyString) { name_ = new ::std::string; } return name_; } inline ::std::string* Person::release_name() { clear_has_name(); if (name_ == &::google::protobuf::internal::kEmptyString) { return NULL; } else { ::std::string* temp = name_; name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); return temp; } } inline void Person::set_allocated_name(::std::string* name) { if (name_ != &::google::protobuf::internal::kEmptyString) { delete name_; } if (name) { set_has_name(); name_ = name; } else { clear_has_name(); name_ = const_cast< ::std::string*>(&::google::protobuf::internal::kEmptyString); } } // @@protoc_insertion_point(namespace_scope) } // namespace persons #ifndef SWIG namespace google { namespace protobuf { } // namespace google } // namespace protobuf #endif // SWIG // @@protoc_insertion_point(global_scope) #endif // PROTOBUF_protocol_2dbuffer_2eproto__INCLUDED ================================================ FILE: samples/C++/render_adapter.cpp ================================================ #include namespace Gui { } ================================================ FILE: samples/C++/runtime-compiler.cc ================================================ // Copyright 2014 the V8 project authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. #include "src/runtime/runtime-utils.h" #include "src/arguments.h" #include "src/compiler.h" #include "src/deoptimizer.h" #include "src/frames-inl.h" #include "src/full-codegen/full-codegen.h" #include "src/isolate-inl.h" #include "src/messages.h" #include "src/v8threads.h" #include "src/vm-state-inl.h" namespace v8 { namespace internal { RUNTIME_FUNCTION(Runtime_CompileLazy) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); #ifdef DEBUG if (FLAG_trace_lazy && !function->shared()->is_compiled()) { PrintF("[unoptimized: "); function->PrintName(); PrintF("]\n"); } #endif StackLimitCheck check(isolate); if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); if (!Compiler::Compile(function, Compiler::KEEP_EXCEPTION)) { return isolate->heap()->exception(); } DCHECK(function->is_compiled()); return function->code(); } RUNTIME_FUNCTION(Runtime_CompileBaseline) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); StackLimitCheck check(isolate); if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); if (!Compiler::CompileBaseline(function)) { return isolate->heap()->exception(); } DCHECK(function->is_compiled()); return function->code(); } RUNTIME_FUNCTION(Runtime_CompileOptimized_Concurrent) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); StackLimitCheck check(isolate); if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); if (!Compiler::CompileOptimized(function, Compiler::CONCURRENT)) { return isolate->heap()->exception(); } DCHECK(function->is_compiled()); return function->code(); } RUNTIME_FUNCTION(Runtime_CompileOptimized_NotConcurrent) { HandleScope scope(isolate); DCHECK_EQ(1, args.length()); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); StackLimitCheck check(isolate); if (check.JsHasOverflowed(1 * KB)) return isolate->StackOverflow(); if (!Compiler::CompileOptimized(function, Compiler::NOT_CONCURRENT)) { return isolate->heap()->exception(); } DCHECK(function->is_compiled()); return function->code(); } RUNTIME_FUNCTION(Runtime_NotifyStubFailure) { HandleScope scope(isolate); DCHECK(args.length() == 0); Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); DCHECK(AllowHeapAllocation::IsAllowed()); delete deoptimizer; return isolate->heap()->undefined_value(); } class ActivationsFinder : public ThreadVisitor { public: Code* code_; bool has_code_activations_; explicit ActivationsFinder(Code* code) : code_(code), has_code_activations_(false) {} void VisitThread(Isolate* isolate, ThreadLocalTop* top) { JavaScriptFrameIterator it(isolate, top); VisitFrames(&it); } void VisitFrames(JavaScriptFrameIterator* it) { for (; !it->done(); it->Advance()) { JavaScriptFrame* frame = it->frame(); if (code_->contains(frame->pc())) has_code_activations_ = true; } } }; RUNTIME_FUNCTION(Runtime_NotifyDeoptimized) { HandleScope scope(isolate); DCHECK(args.length() == 1); CONVERT_SMI_ARG_CHECKED(type_arg, 0); Deoptimizer::BailoutType type = static_cast(type_arg); Deoptimizer* deoptimizer = Deoptimizer::Grab(isolate); DCHECK(AllowHeapAllocation::IsAllowed()); TimerEventScope timer(isolate); TRACE_EVENT0("v8", "V8.DeoptimizeCode"); Handle function = deoptimizer->function(); Handle optimized_code = deoptimizer->compiled_code(); DCHECK(optimized_code->kind() == Code::OPTIMIZED_FUNCTION); DCHECK(type == deoptimizer->bailout_type()); // Make sure to materialize objects before causing any allocation. JavaScriptFrameIterator it(isolate); deoptimizer->MaterializeHeapObjects(&it); delete deoptimizer; // Ensure the context register is updated for materialized objects. JavaScriptFrameIterator top_it(isolate); JavaScriptFrame* top_frame = top_it.frame(); isolate->set_context(Context::cast(top_frame->context())); if (type == Deoptimizer::LAZY) { return isolate->heap()->undefined_value(); } // Search for other activations of the same optimized code. // At this point {it} is at the topmost frame of all the frames materialized // by the deoptimizer. Note that this frame does not necessarily represent // an activation of {function} because of potential inlined tail-calls. ActivationsFinder activations_finder(*optimized_code); activations_finder.VisitFrames(&it); isolate->thread_manager()->IterateArchivedThreads(&activations_finder); if (!activations_finder.has_code_activations_) { if (function->code() == *optimized_code) { if (FLAG_trace_deopt) { PrintF("[removing optimized code for: "); function->PrintName(); PrintF("]\n"); } function->ReplaceCode(function->shared()->code()); } // Evict optimized code for this function from the cache so that it // doesn't get used for new closures. function->shared()->EvictFromOptimizedCodeMap(*optimized_code, "notify deoptimized"); } else { // TODO(titzer): we should probably do DeoptimizeCodeList(code) // unconditionally if the code is not already marked for deoptimization. // If there is an index by shared function info, all the better. Deoptimizer::DeoptimizeFunction(*function); } return isolate->heap()->undefined_value(); } static bool IsSuitableForOnStackReplacement( Isolate* isolate, Handle function ) { // Keep track of whether we've succeeded in optimizing. if (function->shared()->optimization_disabled()) return false; // If we are trying to do OSR when there are already optimized // activations of the function, it means (a) the function is directly or // indirectly recursive and (b) an optimized invocation has been // deoptimized so that we are currently in an unoptimized activation. // Check for optimized activations of this function. for (JavaScriptFrameIterator it(isolate); !it.done(); it.Advance()) { JavaScriptFrame* frame = it.frame(); if (frame->is_optimized() && frame->function() == *function) return false; } return true; } RUNTIME_FUNCTION(Runtime_CompileForOnStackReplacement) { HandleScope scope(isolate); DCHECK(args.length() == 1); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); Handle caller_code(function->shared()->code()); // We're not prepared to handle a function with arguments object. DCHECK(!function->shared()->uses_arguments()); RUNTIME_ASSERT(FLAG_use_osr); // Passing the PC in the javascript frame from the caller directly is // not GC safe, so we walk the stack to get it. JavaScriptFrameIterator it(isolate); JavaScriptFrame* frame = it.frame(); if (!caller_code->contains(frame->pc())) { // Code on the stack may not be the code object referenced by the shared // function info. It may have been replaced to include deoptimization data. caller_code = Handle(frame->LookupCode()); } uint32_t pc_offset = static_cast(frame->pc() - caller_code->instruction_start()); #ifdef DEBUG DCHECK_EQ(frame->function(), *function); DCHECK_EQ(frame->LookupCode(), *caller_code); DCHECK(caller_code->contains(frame->pc())); #endif // DEBUG BailoutId ast_id = caller_code->TranslatePcOffsetToAstId(pc_offset); DCHECK(!ast_id.IsNone()); MaybeHandle maybe_result; if (IsSuitableForOnStackReplacement(isolate, function)) { if (FLAG_trace_osr) { PrintF("[OSR - Compiling: "); function->PrintName(); PrintF(" at -*- scheme -*- %d]\n", ast_id.ToInt()); } maybe_result = Compiler::GetOptimizedCodeForOSR(function, ast_id, frame); } // Revert the patched back edge table, regardless of whether OSR succeeds. BackEdgeTable::Revert(isolate, *caller_code); // Check whether we ended up with usable optimized code. Handle result; if (maybe_result.ToHandle(&result) && result->kind() == Code::OPTIMIZED_FUNCTION) { DeoptimizationInputData* data = DeoptimizationInputData::cast(result->deoptimization_data()); if (data->OsrPcOffset()->value() >= 0) { DCHECK(BailoutId(data->OsrAstId()->value()) == ast_id); if (FLAG_trace_osr) { PrintF("[OSR - Entry at AST id %d, offset %d in optimized code]\n", ast_id.ToInt(), data->OsrPcOffset()->value()); } // TODO(titzer): this is a massive hack to make the deopt counts // match. Fix heuristics for reenabling optimizations! function->shared()->increment_deopt_count(); if (result->is_turbofanned()) { // TurboFanned OSR code cannot be installed into the function. // But the function is obviously hot, so optimize it next time. function->ReplaceCode( isolate->builtins()->builtin(Builtins::kCompileOptimized)); } else { // Crankshafted OSR code can be installed into the function. function->ReplaceCode(*result); } return *result; } } // Failed. if (FLAG_trace_osr) { PrintF("[OSR - Failed: "); function->PrintName(); PrintF(" at AST id %d]\n", ast_id.ToInt()); } if (!function->IsOptimized()) { function->ReplaceCode(function->shared()->code()); } return NULL; } RUNTIME_FUNCTION(Runtime_TryInstallOptimizedCode) { HandleScope scope(isolate); DCHECK(args.length() == 1); CONVERT_ARG_HANDLE_CHECKED(JSFunction, function, 0); // First check if this is a real stack overflow. StackLimitCheck check(isolate); if (check.JsHasOverflowed()) { SealHandleScope shs(isolate); return isolate->StackOverflow(); } isolate->optimizing_compile_dispatcher()->InstallOptimizedFunctions(); return (function->IsOptimized()) ? function->code() : function->shared()->code(); } bool CodeGenerationFromStringsAllowed( Isolate* isolate, Handle context ){ DCHECK(context->allow_code_gen_from_strings()->IsFalse()); // Check with callback if set. AllowCodeGenerationFromStringsCallback callback = isolate->allow_code_gen_callback(); if (callback == NULL) { // No callback set and code generation disallowed. return false; } else { // Callback set. Let it decide if code generation is allowed. VMState state(isolate); return callback(v8::Utils::ToLocal(context)); } } static Object* CompileGlobalEval( Isolate* isolate, Handle source, Handle outer_info, LanguageMode language_mode, int eval_scope_position, int eval_position ){ Handle context = Handle(isolate->context()); Handle native_context = Handle(context->native_context()); // Check if native context allows code generation from // strings. Throw an exception if it doesn't. if (native_context->allow_code_gen_from_strings()->IsFalse() && !CodeGenerationFromStringsAllowed(isolate, native_context)) { Handle error_message = native_context->ErrorMessageForCodeGenerationFromStrings(); Handle error; MaybeHandle maybe_error = isolate->factory()->NewEvalError( MessageTemplate::kCodeGenFromStrings, error_message); if (maybe_error.ToHandle(&error)) isolate->Throw(*error); return isolate->heap()->exception(); } // Deal with a normal eval call with a string argument. Compile it // and return the compiled function bound in the local context. static const ParseRestriction restriction = NO_PARSE_RESTRICTION; Handle compiled; ASSIGN_RETURN_ON_EXCEPTION_VALUE( isolate, compiled, Compiler::GetFunctionFromEval( source, outer_info, context, language_mode, restriction, eval_scope_position, eval_position ), isolate->heap()->exception() ); return *compiled; } RUNTIME_FUNCTION(Runtime_ResolvePossiblyDirectEval) { HandleScope scope(isolate); DCHECK(args.length() == 6); Handle callee = args.at(0); // If "eval" didn't refer to the original GlobalEval, it's not a // direct call to eval. // (And even if it is, but the first argument isn't a string, just let // execution default to an indirect call to eval, which will also return // the first argument without doing anything). if (*callee != isolate->native_context()->global_eval_fun() || !args[1]->IsString()) { return *callee; } DCHECK(args[3]->IsSmi()); DCHECK(is_valid_language_mode(args.smi_at(3))); LanguageMode language_mode = static_cast(args.smi_at(3)); DCHECK(args[4]->IsSmi()); Handle outer_info(args.at(2)->shared(), isolate); return CompileGlobalEval( isolate, args.at(1), outer_info, language_mode, args.smi_at(4), args.smi_at(5) ); } } // namespace internal } // namespace v8 /* vim: set shiftwidth=4 softtabstop=0 cindent cinoptions={1s: */ ================================================ FILE: samples/C++/scanner.cc ================================================ // Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Features shared by parsing and pre-parsing scanners. #include "scanner.h" #include "../include/v8stdint.h" #include "char-predicates-inl.h" namespace v8 { namespace internal { // ---------------------------------------------------------------------------- // Scanner Scanner::Scanner(UnicodeCache* unicode_cache) : unicode_cache_(unicode_cache), octal_pos_(Location::invalid()), harmony_scoping_(false), harmony_modules_(false) { } void Scanner::Initialize(Utf16CharacterStream* source) { source_ = source; // Need to capture identifiers in order to recognize "get" and "set" // in object literals. Init(); // Skip initial whitespace allowing HTML comment ends just like // after a newline and scan first token. has_line_terminator_before_next_ = true; SkipWhiteSpace(); Scan(); } uc32 Scanner::ScanHexNumber(int expected_length) { ASSERT(expected_length <= 4); // prevent overflow uc32 digits[4] = { 0, 0, 0, 0 }; uc32 x = 0; for (int i = 0; i < expected_length; i++) { digits[i] = c0_; int d = HexValue(c0_); if (d < 0) { // According to ECMA-262, 3rd, 7.8.4, page 18, these hex escapes // should be illegal, but other JS VMs just return the // non-escaped version of the original character. // Push back digits that we have advanced past. for (int j = i-1; j >= 0; j--) { PushBack(digits[j]); } return -1; } x = x * 16 + d; Advance(); } return x; } // Ensure that tokens can be stored in a byte. STATIC_ASSERT(Token::NUM_TOKENS <= 0x100); // Table of one-character tokens, by character (0x00..0x7f only). static const byte one_char_tokens[] = { Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::LPAREN, // 0x28 Token::RPAREN, // 0x29 Token::ILLEGAL, Token::ILLEGAL, Token::COMMA, // 0x2c Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::COLON, // 0x3a Token::SEMICOLON, // 0x3b Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::CONDITIONAL, // 0x3f Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::LBRACK, // 0x5b Token::ILLEGAL, Token::RBRACK, // 0x5d Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::ILLEGAL, Token::LBRACE, // 0x7b Token::ILLEGAL, Token::RBRACE, // 0x7d Token::BIT_NOT, // 0x7e Token::ILLEGAL }; Token::Value Scanner::Next() { current_ = next_; has_line_terminator_before_next_ = false; has_multiline_comment_before_next_ = false; if (static_cast(c0_) <= 0x7f) { Token::Value token = static_cast(one_char_tokens[c0_]); if (token != Token::ILLEGAL) { int pos = source_pos(); next_.token = token; next_.location.beg_pos = pos; next_.location.end_pos = pos + 1; Advance(); return current_.token; } } Scan(); return current_.token; } static inline bool IsByteOrderMark(uc32 c) { // The Unicode value U+FFFE is guaranteed never to be assigned as a // Unicode character; this implies that in a Unicode context the // 0xFF, 0xFE byte pattern can only be interpreted as the U+FEFF // character expressed in little-endian byte order (since it could // not be a U+FFFE character expressed in big-endian byte // order). Nevertheless, we check for it to be compatible with // Spidermonkey. return c == 0xFEFF || c == 0xFFFE; } bool Scanner::SkipWhiteSpace() { int start_position = source_pos(); while (true) { // We treat byte-order marks (BOMs) as whitespace for better // compatibility with Spidermonkey and other JavaScript engines. while (unicode_cache_->IsWhiteSpace(c0_) || IsByteOrderMark(c0_)) { // IsWhiteSpace() includes line terminators! if (unicode_cache_->IsLineTerminator(c0_)) { // Ignore line terminators, but remember them. This is necessary // for automatic semicolon insertion. has_line_terminator_before_next_ = true; } Advance(); } // If there is an HTML comment end '-->' at the beginning of a // line (with only whitespace in front of it), we treat the rest // of the line as a comment. This is in line with the way // SpiderMonkey handles it. if (c0_ == '-' && has_line_terminator_before_next_) { Advance(); if (c0_ == '-') { Advance(); if (c0_ == '>') { // Treat the rest of the line as a comment. SkipSingleLineComment(); // Continue skipping white space after the comment. continue; } PushBack('-'); // undo Advance() } PushBack('-'); // undo Advance() } // Return whether or not we skipped any characters. return source_pos() != start_position; } } Token::Value Scanner::SkipSingleLineComment() { Advance(); // The line terminator at the end of the line is not considered // to be part of the single-line comment; it is recognized // separately by the lexical grammar and becomes part of the // stream of input elements for the syntactic grammar (see // ECMA-262, section 7.4). while (c0_ >= 0 && !unicode_cache_->IsLineTerminator(c0_)) { Advance(); } return Token::WHITESPACE; } Token::Value Scanner::SkipMultiLineComment() { ASSERT(c0_ == '*'); Advance(); while (c0_ >= 0) { uc32 ch = c0_; Advance(); if (unicode_cache_->IsLineTerminator(ch)) { // Following ECMA-262, section 7.4, a comment containing // a newline will make the comment count as a line-terminator. has_multiline_comment_before_next_ = true; } // If we have reached the end of the multi-line comment, we // consume the '/' and insert a whitespace. This way all // multi-line comments are treated as whitespace. if (ch == '*' && c0_ == '/') { c0_ = ' '; return Token::WHITESPACE; } } // Unterminated multi-line comment. return Token::ILLEGAL; } Token::Value Scanner::ScanHtmlComment() { // Check for -= Advance(); if (c0_ == '-') { Advance(); if (c0_ == '>' && has_line_terminator_before_next_) { // For compatibility with SpiderMonkey, we skip lines that // start with an HTML comment end '-->'. token = SkipSingleLineComment(); } else { token = Token::DEC; } } else if (c0_ == '=') { token = Select(Token::ASSIGN_SUB); } else { token = Token::SUB; } break; case '*': // * *= token = Select('=', Token::ASSIGN_MUL, Token::MUL); break; case '%': // % %= token = Select('=', Token::ASSIGN_MOD, Token::MOD); break; case '/': // / // /* /= Advance(); if (c0_ == '/') { token = SkipSingleLineComment(); } else if (c0_ == '*') { token = SkipMultiLineComment(); } else if (c0_ == '=') { token = Select(Token::ASSIGN_DIV); } else { token = Token::DIV; } break; case '&': // & && &= Advance(); if (c0_ == '&') { token = Select(Token::AND); } else if (c0_ == '=') { token = Select(Token::ASSIGN_BIT_AND); } else { token = Token::BIT_AND; } break; case '|': // | || |= Advance(); if (c0_ == '|') { token = Select(Token::OR); } else if (c0_ == '=') { token = Select(Token::ASSIGN_BIT_OR); } else { token = Token::BIT_OR; } break; case '^': // ^ ^= token = Select('=', Token::ASSIGN_BIT_XOR, Token::BIT_XOR); break; case '.': // . Number Advance(); if (IsDecimalDigit(c0_)) { token = ScanNumber(true); } else { token = Token::PERIOD; } break; case ':': token = Select(Token::COLON); break; case ';': token = Select(Token::SEMICOLON); break; case ',': token = Select(Token::COMMA); break; case '(': token = Select(Token::LPAREN); break; case ')': token = Select(Token::RPAREN); break; case '[': token = Select(Token::LBRACK); break; case ']': token = Select(Token::RBRACK); break; case '{': token = Select(Token::LBRACE); break; case '}': token = Select(Token::RBRACE); break; case '?': token = Select(Token::CONDITIONAL); break; case '~': token = Select(Token::BIT_NOT); break; default: if (unicode_cache_->IsIdentifierStart(c0_)) { token = ScanIdentifierOrKeyword(); } else if (IsDecimalDigit(c0_)) { token = ScanNumber(false); } else if (SkipWhiteSpace()) { token = Token::WHITESPACE; } else if (c0_ < 0) { token = Token::EOS; } else { token = Select(Token::ILLEGAL); } break; } // Continue scanning for tokens as long as we're just skipping // whitespace. } while (token == Token::WHITESPACE); next_.location.end_pos = source_pos(); next_.token = token; } void Scanner::SeekForward(int pos) { // After this call, we will have the token at the given position as // the "next" token. The "current" token will be invalid. if (pos == next_.location.beg_pos) return; int current_pos = source_pos(); ASSERT_EQ(next_.location.end_pos, current_pos); // Positions inside the lookahead token aren't supported. ASSERT(pos >= current_pos); if (pos != current_pos) { source_->SeekForward(pos - source_->pos()); Advance(); // This function is only called to seek to the location // of the end of a function (at the "}" token). It doesn't matter // whether there was a line terminator in the part we skip. has_line_terminator_before_next_ = false; has_multiline_comment_before_next_ = false; } Scan(); } bool Scanner::ScanEscape() { uc32 c = c0_; Advance(); // Skip escaped newlines. if (unicode_cache_->IsLineTerminator(c)) { // Allow CR+LF newlines in multiline string literals. if (IsCarriageReturn(c) && IsLineFeed(c0_)) Advance(); // Allow LF+CR newlines in multiline string literals. if (IsLineFeed(c) && IsCarriageReturn(c0_)) Advance(); return true; } switch (c) { case '\'': // fall through case '"' : // fall through case '\\': break; case 'b' : c = '\b'; break; case 'f' : c = '\f'; break; case 'n' : c = '\n'; break; case 'r' : c = '\r'; break; case 't' : c = '\t'; break; case 'u' : { c = ScanHexNumber(4); if (c < 0) return false; break; } case 'v' : c = '\v'; break; case 'x' : { c = ScanHexNumber(2); if (c < 0) return false; break; } case '0' : // fall through case '1' : // fall through case '2' : // fall through case '3' : // fall through case '4' : // fall through case '5' : // fall through case '6' : // fall through case '7' : c = ScanOctalEscape(c, 2); break; } // According to ECMA-262, section 7.8.4, characters not covered by the // above cases should be illegal, but they are commonly handled as // non-escaped characters by JS VMs. AddLiteralChar(c); return true; } // Octal escapes of the forms '\0xx' and '\xxx' are not a part of // ECMA-262. Other JS VMs support them. uc32 Scanner::ScanOctalEscape(uc32 c, int length) { uc32 x = c - '0'; int i = 0; for (; i < length; i++) { int d = c0_ - '0'; if (d < 0 || d > 7) break; int nx = x * 8 + d; if (nx >= 256) break; x = nx; Advance(); } // Anything except '\0' is an octal escape sequence, illegal in strict mode. // Remember the position of octal escape sequences so that an error // can be reported later (in strict mode). // We don't report the error immediately, because the octal escape can // occur before the "use strict" directive. if (c != '0' || i > 0) { octal_pos_ = Location(source_pos() - i - 1, source_pos() - 1); } return x; } Token::Value Scanner::ScanString() { uc32 quote = c0_; Advance(); // consume quote LiteralScope literal(this); while (c0_ != quote && c0_ >= 0 && !unicode_cache_->IsLineTerminator(c0_)) { uc32 c = c0_; Advance(); if (c == '\\') { if (c0_ < 0 || !ScanEscape()) return Token::ILLEGAL; } else { AddLiteralChar(c); } } if (c0_ != quote) return Token::ILLEGAL; literal.Complete(); Advance(); // consume quote return Token::STRING; } void Scanner::ScanDecimalDigits() { while (IsDecimalDigit(c0_)) AddLiteralCharAdvance(); } Token::Value Scanner::ScanNumber(bool seen_period) { ASSERT(IsDecimalDigit(c0_)); // the first digit of the number or the fraction enum { DECIMAL, HEX, OCTAL } kind = DECIMAL; LiteralScope literal(this); if (seen_period) { // we have already seen a decimal point of the float AddLiteralChar('.'); ScanDecimalDigits(); // we know we have at least one digit } else { // if the first character is '0' we must check for octals and hex if (c0_ == '0') { int start_pos = source_pos(); // For reporting octal positions. AddLiteralCharAdvance(); // either 0, 0exxx, 0Exxx, 0.xxx, an octal number, or a hex number if (c0_ == 'x' || c0_ == 'X') { // hex number kind = HEX; AddLiteralCharAdvance(); if (!IsHexDigit(c0_)) { // we must have at least one hex digit after 'x'/'X' return Token::ILLEGAL; } while (IsHexDigit(c0_)) { AddLiteralCharAdvance(); } } else if ('0' <= c0_ && c0_ <= '7') { // (possible) octal number kind = OCTAL; while (true) { if (c0_ == '8' || c0_ == '9') { kind = DECIMAL; break; } if (c0_ < '0' || '7' < c0_) { // Octal literal finished. octal_pos_ = Location(start_pos, source_pos()); break; } AddLiteralCharAdvance(); } } } // Parse decimal digits and allow trailing fractional part. if (kind == DECIMAL) { ScanDecimalDigits(); // optional if (c0_ == '.') { AddLiteralCharAdvance(); ScanDecimalDigits(); // optional } } } // scan exponent, if any if (c0_ == 'e' || c0_ == 'E') { ASSERT(kind != HEX); // 'e'/'E' must be scanned as part of the hex number if (kind == OCTAL) return Token::ILLEGAL; // no exponent for octals allowed // scan exponent AddLiteralCharAdvance(); if (c0_ == '+' || c0_ == '-') AddLiteralCharAdvance(); if (!IsDecimalDigit(c0_)) { // we must have at least one decimal digit after 'e'/'E' return Token::ILLEGAL; } ScanDecimalDigits(); } // The source character immediately following a numeric literal must // not be an identifier start or a decimal digit; see ECMA-262 // section 7.8.3, page 17 (note that we read only one decimal digit // if the value is 0). if (IsDecimalDigit(c0_) || unicode_cache_->IsIdentifierStart(c0_)) return Token::ILLEGAL; literal.Complete(); return Token::NUMBER; } uc32 Scanner::ScanIdentifierUnicodeEscape() { Advance(); if (c0_ != 'u') return -1; Advance(); uc32 result = ScanHexNumber(4); if (result < 0) PushBack('u'); return result; } // ---------------------------------------------------------------------------- // Keyword Matcher #define KEYWORDS(KEYWORD_GROUP, KEYWORD) \ KEYWORD_GROUP('b') \ KEYWORD("break", Token::BREAK) \ KEYWORD_GROUP('c') \ KEYWORD("case", Token::CASE) \ KEYWORD("catch", Token::CATCH) \ KEYWORD("class", Token::FUTURE_RESERVED_WORD) \ KEYWORD("const", Token::CONST) \ KEYWORD("continue", Token::CONTINUE) \ KEYWORD_GROUP('d') \ KEYWORD("debugger", Token::DEBUGGER) \ KEYWORD("default", Token::DEFAULT) \ KEYWORD("delete", Token::DELETE) \ KEYWORD("do", Token::DO) \ KEYWORD_GROUP('e') \ KEYWORD("else", Token::ELSE) \ KEYWORD("enum", Token::FUTURE_RESERVED_WORD) \ KEYWORD("export", harmony_modules \ ? Token::EXPORT : Token::FUTURE_RESERVED_WORD) \ KEYWORD("extends", Token::FUTURE_RESERVED_WORD) \ KEYWORD_GROUP('f') \ KEYWORD("false", Token::FALSE_LITERAL) \ KEYWORD("finally", Token::FINALLY) \ KEYWORD("for", Token::FOR) \ KEYWORD("function", Token::FUNCTION) \ KEYWORD_GROUP('i') \ KEYWORD("if", Token::IF) \ KEYWORD("implements", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD("import", harmony_modules \ ? Token::IMPORT : Token::FUTURE_RESERVED_WORD) \ KEYWORD("in", Token::IN) \ KEYWORD("instanceof", Token::INSTANCEOF) \ KEYWORD("interface", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD_GROUP('l') \ KEYWORD("let", harmony_scoping \ ? Token::LET : Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD_GROUP('n') \ KEYWORD("new", Token::NEW) \ KEYWORD("null", Token::NULL_LITERAL) \ KEYWORD_GROUP('p') \ KEYWORD("package", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD("private", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD("protected", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD("public", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD_GROUP('r') \ KEYWORD("return", Token::RETURN) \ KEYWORD_GROUP('s') \ KEYWORD("static", Token::FUTURE_STRICT_RESERVED_WORD) \ KEYWORD("super", Token::FUTURE_RESERVED_WORD) \ KEYWORD("switch", Token::SWITCH) \ KEYWORD_GROUP('t') \ KEYWORD("this", Token::THIS) \ KEYWORD("throw", Token::THROW) \ KEYWORD("true", Token::TRUE_LITERAL) \ KEYWORD("try", Token::TRY) \ KEYWORD("typeof", Token::TYPEOF) \ KEYWORD_GROUP('v') \ KEYWORD("var", Token::VAR) \ KEYWORD("void", Token::VOID) \ KEYWORD_GROUP('w') \ KEYWORD("while", Token::WHILE) \ KEYWORD("with", Token::WITH) \ KEYWORD_GROUP('y') \ KEYWORD("yield", Token::FUTURE_STRICT_RESERVED_WORD) static Token::Value KeywordOrIdentifierToken(const char* input, int input_length, bool harmony_scoping, bool harmony_modules) { ASSERT(input_length >= 1); const int kMinLength = 2; const int kMaxLength = 10; if (input_length < kMinLength || input_length > kMaxLength) { return Token::IDENTIFIER; } switch (input[0]) { default: #define KEYWORD_GROUP_CASE(ch) \ break; \ case ch: #define KEYWORD(keyword, token) \ { \ /* 'keyword' is a char array, so sizeof(keyword) is */ \ /* strlen(keyword) plus 1 for the NUL char. */ \ const int keyword_length = sizeof(keyword) - 1; \ STATIC_ASSERT(keyword_length >= kMinLength); \ STATIC_ASSERT(keyword_length <= kMaxLength); \ if (input_length == keyword_length && \ input[1] == keyword[1] && \ (keyword_length <= 2 || input[2] == keyword[2]) && \ (keyword_length <= 3 || input[3] == keyword[3]) && \ (keyword_length <= 4 || input[4] == keyword[4]) && \ (keyword_length <= 5 || input[5] == keyword[5]) && \ (keyword_length <= 6 || input[6] == keyword[6]) && \ (keyword_length <= 7 || input[7] == keyword[7]) && \ (keyword_length <= 8 || input[8] == keyword[8]) && \ (keyword_length <= 9 || input[9] == keyword[9])) { \ return token; \ } \ } KEYWORDS(KEYWORD_GROUP_CASE, KEYWORD) } return Token::IDENTIFIER; } Token::Value Scanner::ScanIdentifierOrKeyword() { ASSERT(unicode_cache_->IsIdentifierStart(c0_)); LiteralScope literal(this); // Scan identifier start character. if (c0_ == '\\') { uc32 c = ScanIdentifierUnicodeEscape(); // Only allow legal identifier start characters. if (c < 0 || c == '\\' || // No recursive escapes. !unicode_cache_->IsIdentifierStart(c)) { return Token::ILLEGAL; } AddLiteralChar(c); return ScanIdentifierSuffix(&literal); } uc32 first_char = c0_; Advance(); AddLiteralChar(first_char); // Scan the rest of the identifier characters. while (unicode_cache_->IsIdentifierPart(c0_)) { if (c0_ != '\\') { uc32 next_char = c0_; Advance(); AddLiteralChar(next_char); continue; } // Fallthrough if no longer able to complete keyword. return ScanIdentifierSuffix(&literal); } literal.Complete(); if (next_.literal_chars->is_ascii()) { Vector chars = next_.literal_chars->ascii_literal(); return KeywordOrIdentifierToken(chars.start(), chars.length(), harmony_scoping_, harmony_modules_); } return Token::IDENTIFIER; } Token::Value Scanner::ScanIdentifierSuffix(LiteralScope* literal) { // Scan the rest of the identifier characters. while (unicode_cache_->IsIdentifierPart(c0_)) { if (c0_ == '\\') { uc32 c = ScanIdentifierUnicodeEscape(); // Only allow legal identifier part characters. if (c < 0 || c == '\\' || !unicode_cache_->IsIdentifierPart(c)) { return Token::ILLEGAL; } AddLiteralChar(c); } else { AddLiteralChar(c0_); Advance(); } } literal->Complete(); return Token::IDENTIFIER; } bool Scanner::ScanRegExpPattern(bool seen_equal) { // Scan: ('/' | '/=') RegularExpressionBody '/' RegularExpressionFlags bool in_character_class = false; // Previous token is either '/' or '/=', in the second case, the // pattern starts at =. next_.location.beg_pos = source_pos() - (seen_equal ? 2 : 1); next_.location.end_pos = source_pos() - (seen_equal ? 1 : 0); // Scan regular expression body: According to ECMA-262, 3rd, 7.8.5, // the scanner should pass uninterpreted bodies to the RegExp // constructor. LiteralScope literal(this); if (seen_equal) { AddLiteralChar('='); } while (c0_ != '/' || in_character_class) { if (unicode_cache_->IsLineTerminator(c0_) || c0_ < 0) return false; if (c0_ == '\\') { // Escape sequence. AddLiteralCharAdvance(); if (unicode_cache_->IsLineTerminator(c0_) || c0_ < 0) return false; AddLiteralCharAdvance(); // If the escape allows more characters, i.e., \x??, \u????, or \c?, // only "safe" characters are allowed (letters, digits, underscore), // otherwise the escape isn't valid and the invalid character has // its normal meaning. I.e., we can just continue scanning without // worrying whether the following characters are part of the escape // or not, since any '/', '\\' or '[' is guaranteed to not be part // of the escape sequence. // TODO(896): At some point, parse RegExps more throughly to capture // octal esacpes in strict mode. } else { // Unescaped character. if (c0_ == '[') in_character_class = true; if (c0_ == ']') in_character_class = false; AddLiteralCharAdvance(); } } Advance(); // consume '/' literal.Complete(); return true; } bool Scanner::ScanLiteralUnicodeEscape() { ASSERT(c0_ == '\\'); uc32 chars_read[6] = {'\\', 'u', 0, 0, 0, 0}; Advance(); int i = 1; if (c0_ == 'u') { i++; while (i < 6) { Advance(); if (!IsHexDigit(c0_)) break; chars_read[i] = c0_; i++; } } if (i < 6) { // Incomplete escape. Undo all advances and return false. while (i > 0) { i--; PushBack(chars_read[i]); } return false; } // Complete escape. Add all chars to current literal buffer. for (int i = 0; i < 6; i++) { AddLiteralChar(chars_read[i]); } return true; } bool Scanner::ScanRegExpFlags() { // Scan regular expression flags. LiteralScope literal(this); while (unicode_cache_->IsIdentifierPart(c0_)) { if (c0_ != '\\') { AddLiteralCharAdvance(); } else { if (!ScanLiteralUnicodeEscape()) { break; } } } literal.Complete(); next_.location.end_pos = source_pos() - 1; return true; } } } // namespace v8::internal ================================================ FILE: samples/C++/scanner.h ================================================ // Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // Features shared by parsing and pre-parsing scanners. #ifndef V8_SCANNER_H_ #define V8_SCANNER_H_ #include "allocation.h" #include "char-predicates.h" #include "checks.h" #include "globals.h" #include "token.h" #include "unicode-inl.h" #include "utils.h" namespace v8 { namespace internal { // General collection of (multi-)bit-flags that can be passed to scanners and // parsers to signify their (initial) mode of operation. enum ParsingFlags { kNoParsingFlags = 0, // Embed LanguageMode values in parsing flags, i.e., equivalent to: // CLASSIC_MODE = 0, // STRICT_MODE, // EXTENDED_MODE, kLanguageModeMask = 0x03, kAllowLazy = 0x04, kAllowNativesSyntax = 0x08, kAllowModules = 0x10 }; STATIC_ASSERT((kLanguageModeMask & CLASSIC_MODE) == CLASSIC_MODE); STATIC_ASSERT((kLanguageModeMask & STRICT_MODE) == STRICT_MODE); STATIC_ASSERT((kLanguageModeMask & EXTENDED_MODE) == EXTENDED_MODE); // Returns the value (0 .. 15) of a hexadecimal character c. // If c is not a legal hexadecimal character, returns a value < 0. inline int HexValue(uc32 c) { c -= '0'; if (static_cast(c) <= 9) return c; c = (c | 0x20) - ('a' - '0'); // detect 0x11..0x16 and 0x31..0x36. if (static_cast(c) <= 5) return c + 10; return -1; } // --------------------------------------------------------------------- // Buffered stream of UTF-16 code units, using an internal UTF-16 buffer. // A code unit is a 16 bit value representing either a 16 bit code point // or one part of a surrogate pair that make a single 21 bit code point. class Utf16CharacterStream { public: Utf16CharacterStream() : pos_(0) { } virtual ~Utf16CharacterStream() { } // Returns and advances past the next UTF-16 code unit in the input // stream. If there are no more code units, it returns a negative // value. inline uc32 Advance() { if (buffer_cursor_ < buffer_end_ || ReadBlock()) { pos_++; return static_cast(*(buffer_cursor_++)); } // Note: currently the following increment is necessary to avoid a // parser problem! The scanner treats the final kEndOfInput as // a code unit with a position, and does math relative to that // position. pos_++; return kEndOfInput; } // Return the current position in the code unit stream. // Starts at zero. inline unsigned pos() const { return pos_; } // Skips forward past the next code_unit_count UTF-16 code units // in the input, or until the end of input if that comes sooner. // Returns the number of code units actually skipped. If less // than code_unit_count, inline unsigned SeekForward(unsigned code_unit_count) { unsigned buffered_chars = static_cast(buffer_end_ - buffer_cursor_); if (code_unit_count <= buffered_chars) { buffer_cursor_ += code_unit_count; pos_ += code_unit_count; return code_unit_count; } return SlowSeekForward(code_unit_count); } // Pushes back the most recently read UTF-16 code unit (or negative // value if at end of input), i.e., the value returned by the most recent // call to Advance. // Must not be used right after calling SeekForward. virtual void PushBack(int32_t code_unit) = 0; protected: static const uc32 kEndOfInput = -1; // Ensures that the buffer_cursor_ points to the code_unit at // position pos_ of the input, if possible. If the position // is at or after the end of the input, return false. If there // are more code_units available, return true. virtual bool ReadBlock() = 0; virtual unsigned SlowSeekForward(unsigned code_unit_count) = 0; const uc16* buffer_cursor_; const uc16* buffer_end_; unsigned pos_; }; class UnicodeCache { // --------------------------------------------------------------------- // Caching predicates used by scanners. public: UnicodeCache() {} typedef unibrow::Utf8InputBuffer<1024> Utf8Decoder; StaticResource* utf8_decoder() { return &utf8_decoder_; } bool IsIdentifierStart(unibrow::uchar c) { return kIsIdentifierStart.get(c); } bool IsIdentifierPart(unibrow::uchar c) { return kIsIdentifierPart.get(c); } bool IsLineTerminator(unibrow::uchar c) { return kIsLineTerminator.get(c); } bool IsWhiteSpace(unibrow::uchar c) { return kIsWhiteSpace.get(c); } private: unibrow::Predicate kIsIdentifierStart; unibrow::Predicate kIsIdentifierPart; unibrow::Predicate kIsLineTerminator; unibrow::Predicate kIsWhiteSpace; StaticResource utf8_decoder_; DISALLOW_COPY_AND_ASSIGN(UnicodeCache); }; // ---------------------------------------------------------------------------- // LiteralBuffer - Collector of chars of literals. class LiteralBuffer { public: LiteralBuffer() : is_ascii_(true), position_(0), backing_store_() { } ~LiteralBuffer() { if (backing_store_.length() > 0) { backing_store_.Dispose(); } } INLINE(void AddChar(uint32_t code_unit)) { if (position_ >= backing_store_.length()) ExpandBuffer(); if (is_ascii_) { if (code_unit < kMaxAsciiCharCodeU) { backing_store_[position_] = static_cast(code_unit); position_ += kASCIISize; return; } ConvertToUtf16(); } ASSERT(code_unit < 0x10000u); *reinterpret_cast(&backing_store_[position_]) = code_unit; position_ += kUC16Size; } bool is_ascii() { return is_ascii_; } Vector utf16_literal() { ASSERT(!is_ascii_); ASSERT((position_ & 0x1) == 0); return Vector( reinterpret_cast(backing_store_.start()), position_ >> 1); } Vector ascii_literal() { ASSERT(is_ascii_); return Vector( reinterpret_cast(backing_store_.start()), position_); } int length() { return is_ascii_ ? position_ : (position_ >> 1); } void Reset() { position_ = 0; is_ascii_ = true; } private: static const int kInitialCapacity = 16; static const int kGrowthFactory = 4; static const int kMinConversionSlack = 256; static const int kMaxGrowth = 1 * MB; inline int NewCapacity(int min_capacity) { int capacity = Max(min_capacity, backing_store_.length()); int new_capacity = Min(capacity * kGrowthFactory, capacity + kMaxGrowth); return new_capacity; } void ExpandBuffer() { Vector new_store = Vector::New(NewCapacity(kInitialCapacity)); memcpy(new_store.start(), backing_store_.start(), position_); backing_store_.Dispose(); backing_store_ = new_store; } void ConvertToUtf16() { ASSERT(is_ascii_); Vector new_store; int new_content_size = position_ * kUC16Size; if (new_content_size >= backing_store_.length()) { // Ensure room for all currently read code units as UC16 as well // as the code unit about to be stored. new_store = Vector::New(NewCapacity(new_content_size)); } else { new_store = backing_store_; } char* src = reinterpret_cast(backing_store_.start()); uc16* dst = reinterpret_cast(new_store.start()); for (int i = position_ - 1; i >= 0; i--) { dst[i] = src[i]; } if (new_store.start() != backing_store_.start()) { backing_store_.Dispose(); backing_store_ = new_store; } position_ = new_content_size; is_ascii_ = false; } bool is_ascii_; int position_; Vector backing_store_; DISALLOW_COPY_AND_ASSIGN(LiteralBuffer); }; // ---------------------------------------------------------------------------- // JavaScript Scanner. class Scanner { public: // Scoped helper for literal recording. Automatically drops the literal // if aborting the scanning before it's complete. class LiteralScope { public: explicit LiteralScope(Scanner* self) : scanner_(self), complete_(false) { scanner_->StartLiteral(); } ~LiteralScope() { if (!complete_) scanner_->DropLiteral(); } void Complete() { scanner_->TerminateLiteral(); complete_ = true; } private: Scanner* scanner_; bool complete_; }; // Representation of an interval of source positions. struct Location { Location(int b, int e) : beg_pos(b), end_pos(e) { } Location() : beg_pos(0), end_pos(0) { } bool IsValid() const { return beg_pos >= 0 && end_pos >= beg_pos; } static Location invalid() { return Location(-1, -1); } int beg_pos; int end_pos; }; // -1 is outside of the range of any real source code. static const int kNoOctalLocation = -1; typedef unibrow::Utf8InputBuffer<1024> Utf8Decoder; explicit Scanner(UnicodeCache* scanner_contants); void Initialize(Utf16CharacterStream* source); // Returns the next token and advances input. Token::Value Next(); // Returns the current token again. Token::Value current_token() { return current_.token; } // Returns the location information for the current token // (the token last returned by Next()). Location location() const { return current_.location; } // Returns the literal string, if any, for the current token (the // token last returned by Next()). The string is 0-terminated. // Literal strings are collected for identifiers, strings, and // numbers. // These functions only give the correct result if the literal // was scanned between calls to StartLiteral() and TerminateLiteral(). Vector literal_ascii_string() { ASSERT_NOT_NULL(current_.literal_chars); return current_.literal_chars->ascii_literal(); } Vector literal_utf16_string() { ASSERT_NOT_NULL(current_.literal_chars); return current_.literal_chars->utf16_literal(); } bool is_literal_ascii() { ASSERT_NOT_NULL(current_.literal_chars); return current_.literal_chars->is_ascii(); } int literal_length() const { ASSERT_NOT_NULL(current_.literal_chars); return current_.literal_chars->length(); } bool literal_contains_escapes() const { Location location = current_.location; int source_length = (location.end_pos - location.beg_pos); if (current_.token == Token::STRING) { // Subtract delimiters. source_length -= 2; } return current_.literal_chars->length() != source_length; } // Similar functions for the upcoming token. // One token look-ahead (past the token returned by Next()). Token::Value peek() const { return next_.token; } Location peek_location() const { return next_.location; } // Returns the literal string for the next token (the token that // would be returned if Next() were called). Vector next_literal_ascii_string() { ASSERT_NOT_NULL(next_.literal_chars); return next_.literal_chars->ascii_literal(); } Vector next_literal_utf16_string() { ASSERT_NOT_NULL(next_.literal_chars); return next_.literal_chars->utf16_literal(); } bool is_next_literal_ascii() { ASSERT_NOT_NULL(next_.literal_chars); return next_.literal_chars->is_ascii(); } int next_literal_length() const { ASSERT_NOT_NULL(next_.literal_chars); return next_.literal_chars->length(); } UnicodeCache* unicode_cache() { return unicode_cache_; } static const int kCharacterLookaheadBufferSize = 1; // Scans octal escape sequence. Also accepts "\0" decimal escape sequence. uc32 ScanOctalEscape(uc32 c, int length); // Returns the location of the last seen octal literal. Location octal_position() const { return octal_pos_; } void clear_octal_position() { octal_pos_ = Location::invalid(); } // Seek forward to the given position. This operation does not // work in general, for instance when there are pushed back // characters, but works for seeking forward until simple delimiter // tokens, which is what it is used for. void SeekForward(int pos); bool HarmonyScoping() const { return harmony_scoping_; } void SetHarmonyScoping(bool scoping) { harmony_scoping_ = scoping; } bool HarmonyModules() const { return harmony_modules_; } void SetHarmonyModules(bool modules) { harmony_modules_ = modules; } // Returns true if there was a line terminator before the peek'ed token, // possibly inside a multi-line comment. bool HasAnyLineTerminatorBeforeNext() const { return has_line_terminator_before_next_ || has_multiline_comment_before_next_; } // Scans the input as a regular expression pattern, previous // character(s) must be /(=). Returns true if a pattern is scanned. bool ScanRegExpPattern(bool seen_equal); // Returns true if regexp flags are scanned (always since flags can // be empty). bool ScanRegExpFlags(); // Tells whether the buffer contains an identifier (no escapes). // Used for checking if a property name is an identifier. static bool IsIdentifier(unibrow::CharacterStream* buffer); private: // The current and look-ahead token. struct TokenDesc { Token::Value token; Location location; LiteralBuffer* literal_chars; }; // Call this after setting source_ to the input. void Init() { // Set c0_ (one character ahead) STATIC_ASSERT(kCharacterLookaheadBufferSize == 1); Advance(); // Initialize current_ to not refer to a literal. current_.literal_chars = NULL; } // Literal buffer support inline void StartLiteral() { LiteralBuffer* free_buffer = (current_.literal_chars == &literal_buffer1_) ? &literal_buffer2_ : &literal_buffer1_; free_buffer->Reset(); next_.literal_chars = free_buffer; } INLINE(void AddLiteralChar(uc32 c)) { ASSERT_NOT_NULL(next_.literal_chars); next_.literal_chars->AddChar(c); } // Complete scanning of a literal. inline void TerminateLiteral() { // Does nothing in the current implementation. } // Stops scanning of a literal and drop the collected characters, // e.g., due to an encountered error. inline void DropLiteral() { next_.literal_chars = NULL; } inline void AddLiteralCharAdvance() { AddLiteralChar(c0_); Advance(); } // Low-level scanning support. void Advance() { c0_ = source_->Advance(); } void PushBack(uc32 ch) { source_->PushBack(c0_); c0_ = ch; } inline Token::Value Select(Token::Value tok) { Advance(); return tok; } inline Token::Value Select(uc32 next, Token::Value then, Token::Value else_) { Advance(); if (c0_ == next) { Advance(); return then; } else { return else_; } } uc32 ScanHexNumber(int expected_length); // Scans a single JavaScript token. void Scan(); bool SkipWhiteSpace(); Token::Value SkipSingleLineComment(); Token::Value SkipMultiLineComment(); // Scans a possible HTML comment -- begins with 'pos() - kCharacterLookaheadBufferSize; } UnicodeCache* unicode_cache_; // Buffers collecting literal strings, numbers, etc. LiteralBuffer literal_buffer1_; LiteralBuffer literal_buffer2_; TokenDesc current_; // desc for current token (as returned by Next()) TokenDesc next_; // desc for next token (one token look-ahead) // Input stream. Must be initialized to an Utf16CharacterStream. Utf16CharacterStream* source_; // Start position of the octal literal last scanned. Location octal_pos_; // One Unicode character look-ahead; c0_ < 0 at the end of the input. uc32 c0_; // Whether there is a line terminator whitespace character after // the current token, and before the next. Does not count newlines // inside multiline comments. bool has_line_terminator_before_next_; // Whether there is a multi-line comment that contains a // line-terminator after the current token, and before the next. bool has_multiline_comment_before_next_; // Whether we scan 'let' as a keyword for harmony block-scoped let bindings. bool harmony_scoping_; // Whether we scan 'module', 'import', 'export' as keywords. bool harmony_modules_; }; } } // namespace v8::internal #endif // V8_SCANNER_H_ ================================================ FILE: samples/C++/search.txx ================================================ #ifdef __DEBUG__ #ifndef __DEBUG_PAR__ #define __DEBUG_PAR__ #endif #endif /** @file search.txx @brief Parallel Search Function @author Rahul S. Sampath, rahul.sampath@gmail.com */ namespace par { template int maxLowerBound(const std::vector & keys, const std::vector & searchList, std::vector & results, MPI_Comm comm) { PROF_SEARCH_BEGIN int rank, npes; MPI_Comm_size(comm, &npes); MPI_Comm_rank(comm, &rank); // allocate memory for the mins array std::vector mins (npes); assert(!searchList.empty()); par::MPI_Allgather( &(*searchList.begin()), &(*mins.begin()), 1, comm); //For each key decide which processor to send to unsigned int *part = new unsigned int[keys.size()]; for ( unsigned int i=0; i key bool found = par::maxLowerBound(mins,keys[i], part+i); if ( !found ) { //This key is smaller than the mins from every processor. //No point in searching. part[i] = rank; } } mins.clear(); int *numKeysSend = new int[npes]; int *numKeysRecv = new int[npes]; for ( int i=0; i sendK (keys.size()); std::vector recvK (totalKeys); // the mapping .. unsigned int * comm_map = new unsigned int [keys.size()]; // Now create sendK int *sendOffsets = new int[npes]; sendOffsets[0] = 0; int *recvOffsets = new int[npes]; recvOffsets[0] = 0; int *numKeysTmp = new int[npes]; numKeysTmp[0] = 0; // compute offsets ... for ( int i=1; i::value(), &(*recvK.begin()), numKeysRecv, recvOffsets, par::Mpi_datatype::value(), comm); std::vector resSend (totalKeys); std::vector resRecv (keys.size()); //Final local search. for ( unsigned int i=0; i( searchList, recvK[i], &idx ); if(found) { resSend[i] = searchList[idx]; } }//end for i //Exchange Results //Return what you received in the earlier communication. par::MPI_Alltoallv_sparse((void*)&(*resSend.begin()), numKeysRecv, recvOffsets,par::Mpi_datatype::value(), &(*resRecv.begin()), numKeysSend, sendOffsets, par::Mpi_datatype::value(), comm); delete [] sendOffsets; delete [] recvOffsets; delete [] numKeysSend; delete [] numKeysRecv; for ( unsigned int i=0; i < keys.size(); i++ ) { results[i] = resRecv[comm_map[i]]; }//end for // Clean up ... delete [] comm_map; PROF_SEARCH_END } }//end namespace ================================================ FILE: samples/C++/simple.re ================================================ #define NULL ((char*) 0) char *scan(char *p){ char *q; #define YYCTYPE char #define YYCURSOR p #define YYLIMIT p #define YYMARKER q #define YYFILL(n) /*!re2c [0-9]+ {return YYCURSOR;} [\000-\377] {return NULL;} */ } ================================================ FILE: samples/C++/srs_app_ingest.cpp ================================================ /* The MIT License (MIT) Copyright (c) 2013-2015 SRS(ossrs) Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ // Source - https://github.com/REN-I/srs/blob/3aae7854702a37955bce706fcd8122b02ac07f53/trunk/src/app/srs_app_ingest.cpp #include #ifdef SRS_AUTO_INGEST #include using namespace std; #include #include #include #include #include #include #include // when error, ingester sleep for a while and retry. // ingest never sleep a long time, for we must start the stream ASAP. #define SRS_AUTO_INGESTER_SLEEP_US (int64_t)(3*1000*1000LL) SrsIngesterFFMPEG::SrsIngesterFFMPEG() { ffmpeg = NULL; } SrsIngesterFFMPEG::~SrsIngesterFFMPEG() { srs_freep(ffmpeg); } int SrsIngesterFFMPEG::initialize(SrsFFMPEG* ff, string v, string i) { int ret = ERROR_SUCCESS; ffmpeg = ff; vhost = v; id = i; starttime = srs_get_system_time_ms(); return ret; } string SrsIngesterFFMPEG::uri() { return vhost + "/" + id; } int SrsIngesterFFMPEG::alive() { return (int)(srs_get_system_time_ms() - starttime); } bool SrsIngesterFFMPEG::equals(string v) { return vhost == v; } bool SrsIngesterFFMPEG::equals(string v, string i) { return vhost == v && id == i; } int SrsIngesterFFMPEG::start() { return ffmpeg->start(); } void SrsIngesterFFMPEG::stop() { ffmpeg->stop(); } int SrsIngesterFFMPEG::cycle() { return ffmpeg->cycle(); } void SrsIngesterFFMPEG::fast_stop() { ffmpeg->fast_stop(); } SrsIngester::SrsIngester() { _srs_config->subscribe(this); pthread = new SrsReusableThread("ingest", this, SRS_AUTO_INGESTER_SLEEP_US); pprint = SrsPithyPrint::create_ingester(); } SrsIngester::~SrsIngester() { _srs_config->unsubscribe(this); srs_freep(pthread); clear_engines(); } int SrsIngester::start() { int ret = ERROR_SUCCESS; if ((ret = parse()) != ERROR_SUCCESS) { clear_engines(); ret = ERROR_SUCCESS; return ret; } // even no ingesters, we must also start it, // for the reload may add more ingesters. // start thread to run all encoding engines. if ((ret = pthread->start()) != ERROR_SUCCESS) { srs_error("st_thread_create failed. ret=%d", ret); return ret; } srs_trace("ingest thread cid=%d, current_cid=%d", pthread->cid(), _srs_context->get_id()); return ret; } int SrsIngester::parse_ingesters(SrsConfDirective* vhost) { int ret = ERROR_SUCCESS; std::vector ingesters = _srs_config->get_ingesters(vhost->arg0()); // create engine for (int i = 0; i < (int)ingesters.size(); i++) { SrsConfDirective* ingest = ingesters[i]; if ((ret = parse_engines(vhost, ingest)) != ERROR_SUCCESS) { return ret; } } return ret; } int SrsIngester::parse_engines(SrsConfDirective* vhost, SrsConfDirective* ingest) { int ret = ERROR_SUCCESS; if (!_srs_config->get_ingest_enabled(ingest)) { return ret; } std::string ffmpeg_bin = _srs_config->get_ingest_ffmpeg(ingest); if (ffmpeg_bin.empty()) { ret = ERROR_ENCODER_PARSE; srs_trace("empty ffmpeg ret=%d", ret); return ret; } // get all engines. std::vector engines = _srs_config->get_transcode_engines(ingest); // create ingesters without engines. if (engines.empty()) { SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin); if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, NULL)) != ERROR_SUCCESS) { srs_freep(ffmpeg); if (ret != ERROR_ENCODER_LOOP) { srs_error("invalid ingest engine. ret=%d", ret); } return ret; } SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG(); if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) { srs_freep(ingester); return ret; } ingesters.push_back(ingester); return ret; } // create ingesters with engine for (int i = 0; i < (int)engines.size(); i++) { SrsConfDirective* engine = engines[i]; SrsFFMPEG* ffmpeg = new SrsFFMPEG(ffmpeg_bin); if ((ret = initialize_ffmpeg(ffmpeg, vhost, ingest, engine)) != ERROR_SUCCESS) { srs_freep(ffmpeg); if (ret != ERROR_ENCODER_LOOP) { srs_error("invalid ingest engine: %s %s, ret=%d", ingest->arg0().c_str(), engine->arg0().c_str(), ret); } return ret; } SrsIngesterFFMPEG* ingester = new SrsIngesterFFMPEG(); if ((ret = ingester->initialize(ffmpeg, vhost->arg0(), ingest->arg0())) != ERROR_SUCCESS) { srs_freep(ingester); return ret; } ingesters.push_back(ingester); } return ret; } void SrsIngester::dispose() { // first, use fast stop to notice all FFMPEG to quit gracefully. std::vector::iterator it; for (it = ingesters.begin(); it != ingesters.end(); ++it) { SrsIngesterFFMPEG* ingester = *it; ingester->fast_stop(); } if (!ingesters.empty()) { srs_trace("fast stop all ingesters ok."); } // then, use stop to wait FFMPEG quit one by one and send SIGKILL if needed. stop(); } void SrsIngester::stop() { pthread->stop(); clear_engines(); } int SrsIngester::cycle() { int ret = ERROR_SUCCESS; std::vector::iterator it; for (it = ingesters.begin(); it != ingesters.end(); ++it) { SrsIngesterFFMPEG* ingester = *it; // start all ffmpegs. if ((ret = ingester->start()) != ERROR_SUCCESS) { srs_error("ingest ffmpeg start failed. ret=%d", ret); return ret; } // check ffmpeg status. if ((ret = ingester->cycle()) != ERROR_SUCCESS) { srs_error("ingest ffmpeg cycle failed. ret=%d", ret); return ret; } } // pithy print show_ingest_log_message(); return ret; } void SrsIngester::on_thread_stop() { } void SrsIngester::clear_engines() { std::vector::iterator it; for (it = ingesters.begin(); it != ingesters.end(); ++it) { SrsIngesterFFMPEG* ingester = *it; srs_freep(ingester); } ingesters.clear(); } int SrsIngester::parse() { int ret = ERROR_SUCCESS; // parse ingesters std::vector vhosts; _srs_config->get_vhosts(vhosts); for (int i = 0; i < (int)vhosts.size(); i++) { SrsConfDirective* vhost = vhosts[i]; if ((ret = parse_ingesters(vhost)) != ERROR_SUCCESS) { return ret; } } return ret; } int SrsIngester::initialize_ffmpeg(SrsFFMPEG* ffmpeg, SrsConfDirective* vhost, SrsConfDirective* ingest, SrsConfDirective* engine) { int ret = ERROR_SUCCESS; std::string port; if (true) { std::vector ip_ports = _srs_config->get_listens(); srs_assert(ip_ports.size() > 0); std::string ep = ip_ports[0]; std::string ip; srs_parse_endpoint(ep, ip, port); } std::string output = _srs_config->get_engine_output(engine); // output stream, to other/self server // ie. rtmp://localhost:1935/live/livestream_sd output = srs_string_replace(output, "[vhost]", vhost->arg0()); output = srs_string_replace(output, "[port]", port); if (output.empty()) { ret = ERROR_ENCODER_NO_OUTPUT; srs_trace("empty output url, ingest=%s. ret=%d", ingest->arg0().c_str(), ret); return ret; } // find the app and stream in rtmp url std::string url = output; std::string app, stream; size_t pos = std::string::npos; if ((pos = url.rfind("/")) != std::string::npos) { stream = url.substr(pos + 1); url = url.substr(0, pos); } if ((pos = url.rfind("/")) != std::string::npos) { app = url.substr(pos + 1); url = url.substr(0, pos); } if ((pos = app.rfind("?")) != std::string::npos) { app = app.substr(0, pos); } std::string log_file = SRS_CONSTS_NULL_FILE; // disabled // write ffmpeg info to log file. if (_srs_config->get_ffmpeg_log_enabled()) { log_file = _srs_config->get_ffmpeg_log_dir(); log_file += "/"; log_file += "ffmpeg-ingest"; log_file += "-"; log_file += vhost->arg0(); log_file += "-"; log_file += app; log_file += "-"; log_file += stream; log_file += ".log"; } // input std::string input_type = _srs_config->get_ingest_input_type(ingest); if (input_type.empty()) { ret = ERROR_ENCODER_NO_INPUT; srs_trace("empty intput type, ingest=%s. ret=%d", ingest->arg0().c_str(), ret); return ret; } if (srs_config_ingest_is_file(input_type)) { std::string input_url = _srs_config->get_ingest_input_url(ingest); if (input_url.empty()) { ret = ERROR_ENCODER_NO_INPUT; srs_trace("empty intput url, ingest=%s. ret=%d", ingest->arg0().c_str(), ret); return ret; } // for file, set re. ffmpeg->set_iparams("-re"); if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) { return ret; } } else if (srs_config_ingest_is_stream(input_type)) { std::string input_url = _srs_config->get_ingest_input_url(ingest); if (input_url.empty()) { ret = ERROR_ENCODER_NO_INPUT; srs_trace("empty intput url, ingest=%s. ret=%d", ingest->arg0().c_str(), ret); return ret; } // for stream, no re. ffmpeg->set_iparams(""); if ((ret = ffmpeg->initialize(input_url, output, log_file)) != ERROR_SUCCESS) { return ret; } } else { ret = ERROR_ENCODER_INPUT_TYPE; srs_error("invalid ingest=%s type=%s, ret=%d", ingest->arg0().c_str(), input_type.c_str(), ret); } // set output format to flv for RTMP ffmpeg->set_oformat("flv"); std::string vcodec = _srs_config->get_engine_vcodec(engine); std::string acodec = _srs_config->get_engine_acodec(engine); // whatever the engine config, use copy as default. bool engine_disabled = !engine || !_srs_config->get_engine_enabled(engine); if (engine_disabled || vcodec.empty() || acodec.empty()) { if ((ret = ffmpeg->initialize_copy()) != ERROR_SUCCESS) { return ret; } } else { if ((ret = ffmpeg->initialize_transcode(engine)) != ERROR_SUCCESS) { return ret; } } srs_trace("parse success, ingest=%s, vhost=%s", ingest->arg0().c_str(), vhost->arg0().c_str()); return ret; } void SrsIngester::show_ingest_log_message() { pprint->elapse(); if ((int)ingesters.size() <= 0) { return; } // random choose one ingester to report. int index = rand() % (int)ingesters.size(); SrsIngesterFFMPEG* ingester = ingesters.at(index); // reportable if (pprint->can_print()) { srs_trace("-> "SRS_CONSTS_LOG_INGESTER" time=%"PRId64", ingesters=%d, #%d(alive=%ds, %s)", pprint->age(), (int)ingesters.size(), index, ingester->alive() / 1000, ingester->uri().c_str()); } } int SrsIngester::on_reload_vhost_added(string vhost) { int ret = ERROR_SUCCESS; SrsConfDirective* _vhost = _srs_config->get_vhost(vhost); if ((ret = parse_ingesters(_vhost)) != ERROR_SUCCESS) { return ret; } srs_trace("reload add vhost ingesters, vhost=%s", vhost.c_str()); return ret; } int SrsIngester::on_reload_vhost_removed(string vhost) { int ret = ERROR_SUCCESS; std::vector::iterator it; for (it = ingesters.begin(); it != ingesters.end();) { SrsIngesterFFMPEG* ingester = *it; if (!ingester->equals(vhost)) { ++it; continue; } // stop the ffmpeg and free it. ingester->stop(); srs_trace("reload stop ingester, vhost=%s, id=%s", vhost.c_str(), ingester->uri().c_str()); srs_freep(ingester); // remove the item from ingesters. it = ingesters.erase(it); } return ret; } int SrsIngester::on_reload_ingest_removed(string vhost, string ingest_id) { int ret = ERROR_SUCCESS; std::vector::iterator it; for (it = ingesters.begin(); it != ingesters.end();) { SrsIngesterFFMPEG* ingester = *it; if (!ingester->equals(vhost, ingest_id)) { ++it; continue; } // stop the ffmpeg and free it. ingester->stop(); srs_trace("reload stop ingester, vhost=%s, id=%s", vhost.c_str(), ingester->uri().c_str()); srs_freep(ingester); // remove the item from ingesters. it = ingesters.erase(it); } return ret; } int SrsIngester::on_reload_ingest_added(string vhost, string ingest_id) { int ret = ERROR_SUCCESS; SrsConfDirective* _vhost = _srs_config->get_vhost(vhost); SrsConfDirective* _ingester = _srs_config->get_ingest_by_id(vhost, ingest_id); if ((ret = parse_engines(_vhost, _ingester)) != ERROR_SUCCESS) { return ret; } srs_trace("reload add ingester, " "vhost=%s, id=%s", vhost.c_str(), ingest_id.c_str()); return ret; } int SrsIngester::on_reload_ingest_updated(string vhost, string ingest_id) { int ret = ERROR_SUCCESS; if ((ret = on_reload_ingest_removed(vhost, ingest_id)) != ERROR_SUCCESS) { return ret; } if ((ret = on_reload_ingest_added(vhost, ingest_id)) != ERROR_SUCCESS) { return ret; } srs_trace("reload updated ingester, " "vhost=%s, id=%s", vhost.c_str(), ingest_id.c_str()); return ret; } #endif ================================================ FILE: samples/C++/target.txx ================================================ // file : libbuild2/target.txx -*- C++ -*- // license : MIT; see accompanying LICENSE file #include #include namespace build2 { template const char* target_extension_fix (const target_key& tk, const scope*) { // A generic file target type doesn't imply any extension while a very // specific one (say man1) may have a fixed extension. So if one wasn't // specified set it to fixed ext rather than unspecified. For file{} // itself we make it empty which means we treat file{foo} as file{foo.}. // return tk.ext ? tk.ext->c_str () : ext; } template bool target_pattern_fix (const target_type&, const scope&, string& v, optional& e, const location& l, bool r) { if (r) { // If we get called to reverse then it means we've added the extension // in the first place. // assert (e); e = nullopt; } else { e = target::split_name (v, l); // We only add our extension if there isn't one already. // if (!e) { e = ext; return true; } } return false; } inline optional target_extension_var_impl (const target_type& tt, const string& tn, const scope& s, const char* def) { // Include target type/pattern-specific variables. // // Note that we know this is not dir{} or fsdir{} and that the extension // is not part of the match (see variable_type_map::find() for details). // if (auto l = s.lookup (*s.ctx.var_extension, tt, tn)) { // Help the user here and strip leading '.' from the extension. // const string& e (cast (l)); return !e.empty () && e.front () == '.' ? string (e, 1) : e; } return def != nullptr ? optional (def) : nullopt; } template optional target_extension_var (const target_key& tk, const scope& s, const char*, bool) { return target_extension_var_impl (*tk.type, *tk.name, s, def); } template bool target_pattern_var (const target_type& tt, const scope& s, string& v, optional& e, const location& l, bool r) { if (r) { // If we get called to reverse then it means we've added the extension // in the first place. // assert (e); e = nullopt; } else { e = target::split_name (v, l); // We only add our extension if there isn't one already. // if (!e) { // Use empty name as a target since we only want target type/pattern- // specific variables that match any target ('*' but not '*.txt'). // if ((e = target_extension_var_impl (tt, string (), s, def))) return true; } } return false; } // dir // template const target* dir:: search_implied (const scope& bs, const K& k, tracer& trace) { using namespace butl; // See if we have any prerequisites. // prerequisites_type ps (collect_implied (bs)); if (ps.empty ()) return nullptr; l5 ([&]{trace << "implying buildfile for " << k;}); // We behave as if this target was explicitly mentioned in the (implied) // buildfile. Thus not implied. // target& t (bs.ctx.targets.insert (dir::static_type, bs.out_path (), dir_path (), string (), nullopt, target_decl::real, trace).first); t.prerequisites (move (ps)); return &t; } // exe // template const T* exe:: lookup_metadata (const char* var) const { if (auto* ns = cast_null (vars[ctx.var_export_metadata])) { // Metadata variable prefix must be in the second name. // if (ns->size () < 2 || !(*ns)[1].simple ()) fail << "invalid metadata variable prefix in target " << *this; return cast_null (vars[(*ns)[1].value + '.' + var]); } return nullptr; } } ================================================ FILE: samples/C++/utils.h ================================================ /* This file is part of the PhantomJS project from Ofi Labs. Copyright (C) 2011 Ariya Hidayat Copyright (C) 2011 Ivan De Marino Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: * Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. * Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. * Neither the name of the nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #ifndef UTILS_H #define UTILS_H #include #include #include #include "csconverter.h" #include "encoding.h" class QTemporaryFile; /** * Aggregate common utility functions. * Functions are static methods. * It's important to notice that, at the moment, this class can't be instantiated by design. */ class Utils { public: static void showUsage(); static void messageHandler(QtMsgType type, const char *msg); static bool exceptionHandler(const char* dump_path, const char* minidump_id, void* context, bool succeeded); static QVariant coffee2js(const QString &script); static bool injectJsInFrame(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false); static bool injectJsInFrame(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool startingScript = false); static QString readResourceFileUtf8(const QString &resourceFilePath); static bool loadJSForDebug(const QString &jsFilePath, const Encoding &jsFileEnc, const QString &libraryPath, QWebFrame *targetFrame, const bool autorun = false); static bool loadJSForDebug(const QString &jsFilePath, const QString &libraryPath, QWebFrame *targetFrame, const bool autorun = false); static void cleanupFromDebug(); private: static QString findScript(const QString &jsFilePath, const QString& libraryPath); static QString jsFromScriptFile(const QString& scriptPath, const Encoding& enc); Utils(); //< This class shouldn't be instantiated static QTemporaryFile* m_tempHarness; //< We want to make sure to clean up after ourselves static QTemporaryFile* m_tempWrapper; }; #endif // UTILS_H ================================================ FILE: samples/C++/v8.cc ================================================ // Copyright 2012 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #include "v8.h" #include "assembler.h" #include "isolate.h" #include "elements.h" #include "bootstrapper.h" #include "debug.h" #include "deoptimizer.h" #include "frames.h" #include "heap-profiler.h" #include "hydrogen.h" #include "lithium-allocator.h" #include "log.h" #include "once.h" #include "platform.h" #include "runtime-profiler.h" #include "serialize.h" #include "store-buffer.h" namespace v8 { namespace internal { V8_DECLARE_ONCE(init_once); bool V8::is_running_ = false; bool V8::has_been_set_up_ = false; bool V8::has_been_disposed_ = false; bool V8::has_fatal_error_ = false; bool V8::use_crankshaft_ = true; List* V8::call_completed_callbacks_ = NULL; static LazyMutex entropy_mutex = LAZY_MUTEX_INITIALIZER; static EntropySource entropy_source; bool V8::Initialize(Deserializer* des) { FlagList::EnforceFlagImplications(); InitializeOncePerProcess(); // The current thread may not yet had entered an isolate to run. // Note the Isolate::Current() may be non-null because for various // initialization purposes an initializing thread may be assigned an isolate // but not actually enter it. if (i::Isolate::CurrentPerIsolateThreadData() == NULL) { i::Isolate::EnterDefaultIsolate(); } ASSERT(i::Isolate::CurrentPerIsolateThreadData() != NULL); ASSERT(i::Isolate::CurrentPerIsolateThreadData()->thread_id().Equals( i::ThreadId::Current())); ASSERT(i::Isolate::CurrentPerIsolateThreadData()->isolate() == i::Isolate::Current()); if (IsDead()) return false; Isolate* isolate = Isolate::Current(); if (isolate->IsInitialized()) return true; is_running_ = true; has_been_set_up_ = true; has_fatal_error_ = false; has_been_disposed_ = false; return isolate->Init(des); } void V8::SetFatalError() { is_running_ = false; has_fatal_error_ = true; } void V8::TearDown() { Isolate* isolate = Isolate::Current(); ASSERT(isolate->IsDefaultIsolate()); if (!has_been_set_up_ || has_been_disposed_) return; ElementsAccessor::TearDown(); LOperand::TearDownCaches(); RegisteredExtension::UnregisterAll(); isolate->TearDown(); delete isolate; is_running_ = false; has_been_disposed_ = true; delete call_completed_callbacks_; call_completed_callbacks_ = NULL; OS::TearDown(); } static void seed_random(uint32_t* state) { for (int i = 0; i < 2; ++i) { if (FLAG_random_seed != 0) { state[i] = FLAG_random_seed; } else if (entropy_source != NULL) { uint32_t val; ScopedLock lock(entropy_mutex.Pointer()); entropy_source(reinterpret_cast(&val), sizeof(uint32_t)); state[i] = val; } else { state[i] = random(); } } } // Random number generator using George Marsaglia's MWC algorithm. static uint32_t random_base(uint32_t* state) { // Initialize seed using the system random(). // No non-zero seed will ever become zero again. if (state[0] == 0) seed_random(state); // Mix the bits. Never replaces state[i] with 0 if it is nonzero. state[0] = 18273 * (state[0] & 0xFFFF) + (state[0] >> 16); state[1] = 36969 * (state[1] & 0xFFFF) + (state[1] >> 16); return (state[0] << 14) + (state[1] & 0x3FFFF); } void V8::SetEntropySource(EntropySource source) { entropy_source = source; } void V8::SetReturnAddressLocationResolver( ReturnAddressLocationResolver resolver) { StackFrame::SetReturnAddressLocationResolver(resolver); } // Used by JavaScript APIs uint32_t V8::Random(Context* context) { ASSERT(context->IsGlobalContext()); ByteArray* seed = context->random_seed(); return random_base(reinterpret_cast(seed->GetDataStartAddress())); } // Used internally by the JIT and memory allocator for security // purposes. So, we keep a different state to prevent informations // leaks that could be used in an exploit. uint32_t V8::RandomPrivate(Isolate* isolate) { ASSERT(isolate == Isolate::Current()); return random_base(isolate->private_random_seed()); } bool V8::IdleNotification(int hint) { // Returning true tells the caller that there is no need to call // IdleNotification again. if (!FLAG_use_idle_notification) return true; // Tell the heap that it may want to adjust. return HEAP->IdleNotification(hint); } void V8::AddCallCompletedCallback(CallCompletedCallback callback) { if (call_completed_callbacks_ == NULL) { // Lazy init. call_completed_callbacks_ = new List(); } for (int i = 0; i < call_completed_callbacks_->length(); i++) { if (callback == call_completed_callbacks_->at(i)) return; } call_completed_callbacks_->Add(callback); } void V8::RemoveCallCompletedCallback(CallCompletedCallback callback) { if (call_completed_callbacks_ == NULL) return; for (int i = 0; i < call_completed_callbacks_->length(); i++) { if (callback == call_completed_callbacks_->at(i)) { call_completed_callbacks_->Remove(i); } } } void V8::FireCallCompletedCallback(Isolate* isolate) { if (call_completed_callbacks_ == NULL) return; HandleScopeImplementer* handle_scope_implementer = isolate->handle_scope_implementer(); if (!handle_scope_implementer->CallDepthIsZero()) return; // Fire callbacks. Increase call depth to prevent recursive callbacks. handle_scope_implementer->IncrementCallDepth(); for (int i = 0; i < call_completed_callbacks_->length(); i++) { call_completed_callbacks_->at(i)(); } handle_scope_implementer->DecrementCallDepth(); } // Use a union type to avoid type-aliasing optimizations in GCC. typedef union { double double_value; uint64_t uint64_t_value; } double_int_union; Object* V8::FillHeapNumberWithRandom(Object* heap_number, Context* context) { double_int_union r; uint64_t random_bits = Random(context); // Convert 32 random bits to 0.(32 random bits) in a double // by computing: // ( 1.(20 0s)(32 random bits) x 2^20 ) - (1.0 x 2^20)). static const double binary_million = 1048576.0; r.double_value = binary_million; r.uint64_t_value |= random_bits; r.double_value -= binary_million; HeapNumber::cast(heap_number)->set_value(r.double_value); return heap_number; } void V8::InitializeOncePerProcessImpl() { OS::SetUp(); use_crankshaft_ = FLAG_crankshaft; if (Serializer::enabled()) { use_crankshaft_ = false; } CPU::SetUp(); if (!CPU::SupportsCrankshaft()) { use_crankshaft_ = false; } OS::PostSetUp(); RuntimeProfiler::GlobalSetUp(); ElementsAccessor::InitializeOncePerProcess(); if (FLAG_stress_compaction) { FLAG_force_marking_deque_overflows = true; FLAG_gc_global = true; FLAG_max_new_space_size = (1 << (kPageSizeBits - 10)) * 2; } LOperand::SetUpCaches(); SetUpJSCallerSavedCodeData(); SamplerRegistry::SetUp(); ExternalReference::SetUp(); } void V8::InitializeOncePerProcess() { CallOnce(&init_once, &InitializeOncePerProcessImpl); } } } // namespace v8::internal ================================================ FILE: samples/C++/v8.h ================================================ // Copyright 2011 the V8 project authors. All rights reserved. // Redistribution and use in source and binary forms, with or without // modification, are permitted provided that the following conditions are // met: // // * Redistributions of source code must retain the above copyright // notice, this list of conditions and the following disclaimer. // * Redistributions in binary form must reproduce the above // copyright notice, this list of conditions and the following // disclaimer in the documentation and/or other materials provided // with the distribution. // * Neither the name of Google Inc. nor the names of its // contributors may be used to endorse or promote products derived // from this software without specific prior written permission. // // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. // // Top include for all V8 .cc files. // #ifndef V8_V8_H_ #define V8_V8_H_ #if defined(GOOGLE3) // Google3 special flag handling. #if defined(DEBUG) && defined(NDEBUG) // V8 only uses DEBUG and whenever it is set we are building a debug // version of V8. We do not use NDEBUG and simply undef it here for // consistency. #undef NDEBUG #endif #endif // defined(GOOGLE3) // V8 only uses DEBUG, but included external files // may use NDEBUG - make sure they are consistent. #if defined(DEBUG) && defined(NDEBUG) #error both DEBUG and NDEBUG are set #endif // Basic includes #include "../include/v8.h" #include "v8globals.h" #include "v8checks.h" #include "allocation.h" #include "v8utils.h" #include "flags.h" // Objects & heap #include "objects-inl.h" #include "spaces-inl.h" #include "heap-inl.h" #include "incremental-marking-inl.h" #include "mark-compact-inl.h" #include "log-inl.h" #include "cpu-profiler-inl.h" #include "handles-inl.h" #include "zone-inl.h" namespace v8 { namespace internal { class Deserializer; class V8 : public AllStatic { public: // Global actions. // If Initialize is called with des == NULL, the initial state is // created from scratch. If a non-null Deserializer is given, the // initial state is created by reading the deserialized data into an // empty heap. static bool Initialize(Deserializer* des); static void TearDown(); static bool IsRunning() { return is_running_; } static bool UseCrankshaft() { return use_crankshaft_; } // To be dead you have to have lived // TODO(isolates): move IsDead to Isolate. static bool IsDead() { return has_fatal_error_ || has_been_disposed_; } static void SetFatalError(); // Report process out of memory. Implementation found in api.cc. static void FatalProcessOutOfMemory(const char* location, bool take_snapshot = false); // Allows an entropy source to be provided for use in random number // generation. static void SetEntropySource(EntropySource source); // Support for return-address rewriting profilers. static void SetReturnAddressLocationResolver( ReturnAddressLocationResolver resolver); // Random number generation support. Not cryptographically safe. static uint32_t Random(Context* context); // We use random numbers internally in memory allocation and in the // compilers for security. In order to prevent information leaks we // use a separate random state for internal random number // generation. static uint32_t RandomPrivate(Isolate* isolate); static Object* FillHeapNumberWithRandom(Object* heap_number, Context* context); // Idle notification directly from the API. static bool IdleNotification(int hint); static void AddCallCompletedCallback(CallCompletedCallback callback); static void RemoveCallCompletedCallback(CallCompletedCallback callback); static void FireCallCompletedCallback(Isolate* isolate); private: static void InitializeOncePerProcessImpl(); static void InitializeOncePerProcess(); // True if engine is currently running static bool is_running_; // True if V8 has ever been run static bool has_been_set_up_; // True if error has been signaled for current engine // (reset to false if engine is restarted) static bool has_fatal_error_; // True if engine has been shut down // (reset if engine is restarted) static bool has_been_disposed_; // True if we are using the crankshaft optimizing compiler. static bool use_crankshaft_; // List of callbacks when a Call completes. static List* call_completed_callbacks_; }; // JavaScript defines two kinds of 'nil'. enum NilValue { kNullValue, kUndefinedValue }; // JavaScript defines two kinds of equality. enum EqualityKind { kStrictEquality, kNonStrictEquality }; } } // namespace v8::internal namespace i = v8::internal; #endif // V8_V8_H_ ================================================ FILE: samples/C++/vtkSparseArray.txx ================================================ /*========================================================================= Program: Visualization Toolkit Module: vtkSparseArray.txx ------------------------------------------------------------------------- Copyright 2008 Sandia Corporation. Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation, the U.S. Government retains certain rights in this software. ------------------------------------------------------------------------- Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen All rights reserved. See Copyright.txt or http://www.kitware.com/Copyright.htm for details. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the above copyright notice for more information. =========================================================================*/ #ifndef vtkSparseArray_txx #define vtkSparseArray_txx #include #include VTK_ABI_NAMESPACE_BEGIN template vtkSparseArray* vtkSparseArray::New() { // Don't use object factory macros on templates, it'll confuse the object // factory. vtkSparseArray* ret = new vtkSparseArray; ret->InitializeObjectBase(); return ret; } template void vtkSparseArray::PrintSelf(ostream& os, vtkIndent indent) { vtkSparseArray::Superclass::PrintSelf(os, indent); } template bool vtkSparseArray::IsDense() { return false; } template const vtkArrayExtents& vtkSparseArray::GetExtents() { return this->Extents; } template typename vtkSparseArray::SizeT vtkSparseArray::GetNonNullSize() { return this->Values.size(); } template void vtkSparseArray::GetCoordinatesN(SizeT n, vtkArrayCoordinates& coordinates) { coordinates.SetDimensions(this->GetDimensions()); for (DimensionT i = 0; i != this->GetDimensions(); ++i) coordinates[i] = this->Coordinates[i][n]; } template vtkArray* vtkSparseArray::DeepCopy() { ThisT* const copy = ThisT::New(); copy->SetName(this->GetName()); copy->Extents = this->Extents; copy->DimensionLabels = this->DimensionLabels; copy->Coordinates = this->Coordinates; copy->Values = this->Values; copy->NullValue = this->NullValue; return copy; } template const T& vtkSparseArray::GetValue(CoordinateT i) { if (1 != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return this->NullValue; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { if (i != this->Coordinates[0][row]) continue; return this->Values[row]; } return this->NullValue; } template const T& vtkSparseArray::GetValue(CoordinateT i, CoordinateT j) { if (2 != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return this->NullValue; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { if (i != this->Coordinates[0][row]) continue; if (j != this->Coordinates[1][row]) continue; return this->Values[row]; } return this->NullValue; } template const T& vtkSparseArray::GetValue(CoordinateT i, CoordinateT j, CoordinateT k) { if (3 != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return this->NullValue; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { if (i != this->Coordinates[0][row]) continue; if (j != this->Coordinates[1][row]) continue; if (k != this->Coordinates[2][row]) continue; return this->Values[row]; } return this->NullValue; } template const T& vtkSparseArray::GetValue(const vtkArrayCoordinates& coordinates) { if (coordinates.GetDimensions() != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return this->NullValue; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { for (DimensionT column = 0; column != this->GetDimensions(); ++column) { if (coordinates[column] != this->Coordinates[column][row]) break; if (column + 1 == this->GetDimensions()) return this->Values[row]; } } return this->NullValue; } template const T& vtkSparseArray::GetValueN(SizeT n) { return this->Values[n]; } template void vtkSparseArray::SetValue(CoordinateT i, const T& value) { if (1 != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { if (i != this->Coordinates[0][row]) continue; this->Values[row] = value; return; } // Element doesn't already exist, so add it to the end of the list ... this->AddValue(i, value); } template void vtkSparseArray::SetValue(CoordinateT i, CoordinateT j, const T& value) { if (2 != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { if (i != this->Coordinates[0][row]) continue; if (j != this->Coordinates[1][row]) continue; this->Values[row] = value; return; } // Element doesn't already exist, so add it to the end of the list ... this->AddValue(i, j, value); } template void vtkSparseArray::SetValue(CoordinateT i, CoordinateT j, CoordinateT k, const T& value) { if (3 != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { if (i != this->Coordinates[0][row]) continue; if (j != this->Coordinates[1][row]) continue; if (k != this->Coordinates[2][row]) continue; this->Values[row] = value; return; } // Element doesn't already exist, so add it to the end of the list ... this->AddValue(i, j, k, value); } template void vtkSparseArray::SetValue(const vtkArrayCoordinates& coordinates, const T& value) { if (coordinates.GetDimensions() != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return; } // Do a naive linear-search for the time-being ... for (vtkIdType row = 0; row != static_cast(this->Values.size()); ++row) { for (DimensionT column = 0; column != this->GetDimensions(); ++column) { if (coordinates[column] != this->Coordinates[column][row]) break; if (column + 1 == this->GetDimensions()) { this->Values[row] = value; return; } } } // Element doesn't already exist, so add it to the end of the list ... this->AddValue(coordinates, value); } template void vtkSparseArray::SetValueN(SizeT n, const T& value) { this->Values[n] = value; } template void vtkSparseArray::SetNullValue(const T& value) { this->NullValue = value; } template const T& vtkSparseArray::GetNullValue() { return this->NullValue; } template void vtkSparseArray::Clear() { for (DimensionT column = 0; column != this->GetDimensions(); ++column) this->Coordinates[column].clear(); this->Values.clear(); } /// Predicate object for use with std::sort(). Given a vtkArraySort object that defines which array /// dimensions will be sorted in what order, SortCoordinates is used to establish a sorted order for /// the values stored in vtkSparseArray. Note that SortCoordinates never actually modifies its /// inputs. struct SortCoordinates { SortCoordinates(const vtkArraySort& sort, const std::vector>& coordinates) : Sort(&sort) , Coordinates(&coordinates) { } bool operator()(const vtkIdType lhs, const vtkIdType rhs) const { const vtkArraySort& sort = *this->Sort; const std::vector>& coordinates = *this->Coordinates; for (vtkIdType i = 0; i != sort.GetDimensions(); ++i) { if (coordinates[sort[i]][lhs] == coordinates[sort[i]][rhs]) continue; return coordinates[sort[i]][lhs] < coordinates[sort[i]][rhs]; } return false; } const vtkArraySort* Sort; const std::vector>* Coordinates; }; template void vtkSparseArray::Sort(const vtkArraySort& sort) { if (sort.GetDimensions() < 1) { vtkErrorMacro(<< "Sort must order at least one dimension."); return; } for (DimensionT i = 0; i != sort.GetDimensions(); ++i) { if (sort[i] < 0 || sort[i] >= this->GetDimensions()) { vtkErrorMacro(<< "Sort dimension out-of-bounds."); return; } } const SizeT count = this->GetNonNullSize(); std::vector sort_order(count); for (SizeT i = 0; i != count; ++i) sort_order[i] = static_cast(i); std::sort(sort_order.begin(), sort_order.end(), SortCoordinates(sort, this->Coordinates)); std::vector temp_coordinates(count); for (DimensionT j = 0; j != this->GetDimensions(); ++j) { for (SizeT i = 0; i != count; ++i) temp_coordinates[i] = this->Coordinates[j][sort_order[i]]; std::swap(temp_coordinates, this->Coordinates[j]); } std::vector temp_values(count); for (SizeT i = 0; i != count; ++i) temp_values[i] = this->Values[sort_order[i]]; std::swap(temp_values, this->Values); } template std::vector::CoordinateT> vtkSparseArray::GetUniqueCoordinates( DimensionT dimension) { if (dimension < 0 || dimension >= this->GetDimensions()) { vtkErrorMacro(<< "Dimension out-of-bounds."); return std::vector(); } std::vector results(this->Coordinates[dimension]); std::sort(results.begin(), results.end()); results.erase(std::unique(results.begin(), results.end()), results.end()); return results; } template const typename vtkSparseArray::CoordinateT* vtkSparseArray::GetCoordinateStorage( DimensionT dimension) const { if (dimension < 0 || dimension >= this->GetDimensions()) { vtkErrorMacro(<< "Dimension out-of-bounds."); return nullptr; } return &this->Coordinates[dimension][0]; } template typename vtkSparseArray::CoordinateT* vtkSparseArray::GetCoordinateStorage( DimensionT dimension) { if (dimension < 0 || dimension >= this->GetDimensions()) { vtkErrorMacro(<< "Dimension out-of-bounds."); return nullptr; } return &this->Coordinates[dimension][0]; } template const T* vtkSparseArray::GetValueStorage() const { return &(this->Values[0]); } template T* vtkSparseArray::GetValueStorage() { return &this->Values[0]; } template void vtkSparseArray::ReserveStorage(SizeT value_count) { for (DimensionT dimension = 0; dimension != this->GetDimensions(); ++dimension) this->Coordinates[dimension].resize(value_count); this->Values.resize(value_count); } template void vtkSparseArray::SetExtentsFromContents() { vtkArrayExtents new_extents; const vtkIdType row_begin = 0; const vtkIdType row_end = row_begin + static_cast(this->Values.size()); const DimensionT dimension_count = this->GetDimensions(); for (DimensionT dimension = 0; dimension != dimension_count; ++dimension) { vtkIdType range_begin = std::numeric_limits::max(); vtkIdType range_end = -std::numeric_limits::max(); for (vtkIdType row = row_begin; row != row_end; ++row) { range_begin = std::min(range_begin, this->Coordinates[dimension][row]); range_end = std::max(range_end, this->Coordinates[dimension][row] + 1); } new_extents.Append(vtkArrayRange(range_begin, range_end)); } this->Extents = new_extents; } template void vtkSparseArray::SetExtents(const vtkArrayExtents& extents) { if (extents.GetDimensions() != this->GetDimensions()) { vtkErrorMacro(<< "Extent-array dimension mismatch."); return; } this->Extents = extents; } template void vtkSparseArray::AddValue(CoordinateT i, const T& value) { this->AddValue(vtkArrayCoordinates(i), value); } template void vtkSparseArray::AddValue(CoordinateT i, CoordinateT j, const T& value) { this->AddValue(vtkArrayCoordinates(i, j), value); } template void vtkSparseArray::AddValue(CoordinateT i, CoordinateT j, CoordinateT k, const T& value) { this->AddValue(vtkArrayCoordinates(i, j, k), value); } template void vtkSparseArray::AddValue(const vtkArrayCoordinates& coordinates, const T& value) { if (coordinates.GetDimensions() != this->GetDimensions()) { vtkErrorMacro(<< "Index-array dimension mismatch."); return; } this->Values.push_back(value); for (DimensionT i = 0; i != coordinates.GetDimensions(); ++i) this->Coordinates[i].push_back(coordinates[i]); } template bool vtkSparseArray::Validate() { vtkIdType duplicate_count = 0; vtkIdType out_of_bound_count = 0; const vtkIdType dimensions = this->GetDimensions(); const vtkIdType count = this->GetNonNullSize(); // Create an arbitrary sorted order for our coordinates ... vtkArraySort sort; sort.SetDimensions(dimensions); for (vtkIdType i = 0; i != dimensions; ++i) sort[i] = i; std::vector sort_order(count); for (vtkIdType i = 0; i != count; ++i) sort_order[i] = i; std::sort(sort_order.begin(), sort_order.end(), SortCoordinates(sort, this->Coordinates)); // Now, look for duplicates ... for (vtkIdType i = 0; i + 1 < count; ++i) { vtkIdType j; for (j = 0; j != dimensions; ++j) { if (this->Coordinates[j][sort_order[i]] != this->Coordinates[j][sort_order[i + 1]]) break; } if (j == dimensions) { duplicate_count += 1; } } // Look for out-of-bound coordinates ... for (vtkIdType i = 0; i != count; ++i) { for (vtkIdType j = 0; j != dimensions; ++j) { if (this->Coordinates[j][i] < this->Extents[j].GetBegin() || this->Coordinates[j][i] >= this->Extents[j].GetEnd()) { ++out_of_bound_count; break; } } } if (duplicate_count) { vtkErrorMacro(<< "Array contains " << duplicate_count << " duplicate coordinates."); } if (out_of_bound_count) { vtkErrorMacro(<< "Array contains " << out_of_bound_count << " out-of-bound coordinates."); } return (0 == duplicate_count) && (0 == out_of_bound_count); } template vtkSparseArray::vtkSparseArray() : NullValue(T()) { } template vtkSparseArray::~vtkSparseArray() = default; template void vtkSparseArray::InternalResize(const vtkArrayExtents& extents) { this->Extents = extents; this->DimensionLabels.resize(extents.GetDimensions(), {}); this->Coordinates.resize(extents.GetDimensions()); this->Values.resize(0); } template void vtkSparseArray::InternalSetDimensionLabel(DimensionT i, const vtkStdString& label) { this->DimensionLabels[i] = label; } template vtkStdString vtkSparseArray::InternalGetDimensionLabel(DimensionT i) { return this->DimensionLabels[i]; } VTK_ABI_NAMESPACE_END #endif ================================================ FILE: samples/C++/wrapper_inner.cpp ================================================ /* Generated by Cython 0.14.1 on Mon Jun 27 13:03:43 2011 */ #define PY_SSIZE_T_CLEAN #include "Python.h" #ifndef Py_PYTHON_H #error Python headers needed to compile C extensions, please install development version of Python. #else #include /* For offsetof */ #ifndef offsetof #define offsetof(type, member) ( (size_t) & ((type*)0) -> member ) #endif #if !defined(WIN32) && !defined(MS_WINDOWS) #ifndef __stdcall #define __stdcall #endif #ifndef __cdecl #define __cdecl #endif #ifndef __fastcall #define __fastcall #endif #endif #ifndef DL_IMPORT #define DL_IMPORT(t) t #endif #ifndef DL_EXPORT #define DL_EXPORT(t) t #endif #ifndef PY_LONG_LONG #define PY_LONG_LONG LONG_LONG #endif #if PY_VERSION_HEX < 0x02040000 #define METH_COEXIST 0 #define PyDict_CheckExact(op) (Py_TYPE(op) == &PyDict_Type) #define PyDict_Contains(d,o) PySequence_Contains(d,o) #endif #if PY_VERSION_HEX < 0x02050000 typedef int Py_ssize_t; #define PY_SSIZE_T_MAX INT_MAX #define PY_SSIZE_T_MIN INT_MIN #define PY_FORMAT_SIZE_T "" #define PyInt_FromSsize_t(z) PyInt_FromLong(z) #define PyInt_AsSsize_t(o) PyInt_AsLong(o) #define PyNumber_Index(o) PyNumber_Int(o) #define PyIndex_Check(o) PyNumber_Check(o) #define PyErr_WarnEx(category, message, stacklevel) PyErr_Warn(category, message) #endif #if PY_VERSION_HEX < 0x02060000 #define Py_REFCNT(ob) (((PyObject*)(ob))->ob_refcnt) #define Py_TYPE(ob) (((PyObject*)(ob))->ob_type) #define Py_SIZE(ob) (((PyVarObject*)(ob))->ob_size) #define PyVarObject_HEAD_INIT(type, size) \ PyObject_HEAD_INIT(type) size, #define PyType_Modified(t) typedef struct { void *buf; PyObject *obj; Py_ssize_t len; Py_ssize_t itemsize; int readonly; int ndim; char *format; Py_ssize_t *shape; Py_ssize_t *strides; Py_ssize_t *suboffsets; void *internal; } Py_buffer; #define PyBUF_SIMPLE 0 #define PyBUF_WRITABLE 0x0001 #define PyBUF_FORMAT 0x0004 #define PyBUF_ND 0x0008 #define PyBUF_STRIDES (0x0010 | PyBUF_ND) #define PyBUF_C_CONTIGUOUS (0x0020 | PyBUF_STRIDES) #define PyBUF_F_CONTIGUOUS (0x0040 | PyBUF_STRIDES) #define PyBUF_ANY_CONTIGUOUS (0x0080 | PyBUF_STRIDES) #define PyBUF_INDIRECT (0x0100 | PyBUF_STRIDES) #endif #if PY_MAJOR_VERSION < 3 #define __Pyx_BUILTIN_MODULE_NAME "__builtin__" #else #define __Pyx_BUILTIN_MODULE_NAME "builtins" #endif #if PY_MAJOR_VERSION >= 3 #define Py_TPFLAGS_CHECKTYPES 0 #define Py_TPFLAGS_HAVE_INDEX 0 #endif #if (PY_VERSION_HEX < 0x02060000) || (PY_MAJOR_VERSION >= 3) #define Py_TPFLAGS_HAVE_NEWBUFFER 0 #endif #if PY_MAJOR_VERSION >= 3 #define PyBaseString_Type PyUnicode_Type #define PyStringObject PyUnicodeObject #define PyString_Type PyUnicode_Type #define PyString_Check PyUnicode_Check #define PyString_CheckExact PyUnicode_CheckExact #endif #if PY_VERSION_HEX < 0x02060000 #define PyBytesObject PyStringObject #define PyBytes_Type PyString_Type #define PyBytes_Check PyString_Check #define PyBytes_CheckExact PyString_CheckExact #define PyBytes_FromString PyString_FromString #define PyBytes_FromStringAndSize PyString_FromStringAndSize #define PyBytes_FromFormat PyString_FromFormat #define PyBytes_DecodeEscape PyString_DecodeEscape #define PyBytes_AsString PyString_AsString #define PyBytes_AsStringAndSize PyString_AsStringAndSize #define PyBytes_Size PyString_Size #define PyBytes_AS_STRING PyString_AS_STRING #define PyBytes_GET_SIZE PyString_GET_SIZE #define PyBytes_Repr PyString_Repr #define PyBytes_Concat PyString_Concat #define PyBytes_ConcatAndDel PyString_ConcatAndDel #endif #if PY_VERSION_HEX < 0x02060000 #define PySet_Check(obj) PyObject_TypeCheck(obj, &PySet_Type) #define PyFrozenSet_Check(obj) PyObject_TypeCheck(obj, &PyFrozenSet_Type) #endif #ifndef PySet_CheckExact #define PySet_CheckExact(obj) (Py_TYPE(obj) == &PySet_Type) #endif #define __Pyx_TypeCheck(obj, type) PyObject_TypeCheck(obj, (PyTypeObject *)type) #if PY_MAJOR_VERSION >= 3 #define PyIntObject PyLongObject #define PyInt_Type PyLong_Type #define PyInt_Check(op) PyLong_Check(op) #define PyInt_CheckExact(op) PyLong_CheckExact(op) #define PyInt_FromString PyLong_FromString #define PyInt_FromUnicode PyLong_FromUnicode #define PyInt_FromLong PyLong_FromLong #define PyInt_FromSize_t PyLong_FromSize_t #define PyInt_FromSsize_t PyLong_FromSsize_t #define PyInt_AsLong PyLong_AsLong #define PyInt_AS_LONG PyLong_AS_LONG #define PyInt_AsSsize_t PyLong_AsSsize_t #define PyInt_AsUnsignedLongMask PyLong_AsUnsignedLongMask #define PyInt_AsUnsignedLongLongMask PyLong_AsUnsignedLongLongMask #endif #if PY_MAJOR_VERSION >= 3 #define PyBoolObject PyLongObject #endif #if PY_MAJOR_VERSION >= 3 #define __Pyx_PyNumber_Divide(x,y) PyNumber_TrueDivide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceTrueDivide(x,y) #else #define __Pyx_PyNumber_Divide(x,y) PyNumber_Divide(x,y) #define __Pyx_PyNumber_InPlaceDivide(x,y) PyNumber_InPlaceDivide(x,y) #endif #if (PY_MAJOR_VERSION < 3) || (PY_VERSION_HEX >= 0x03010300) #define __Pyx_PySequence_GetSlice(obj, a, b) PySequence_GetSlice(obj, a, b) #define __Pyx_PySequence_SetSlice(obj, a, b, value) PySequence_SetSlice(obj, a, b, value) #define __Pyx_PySequence_DelSlice(obj, a, b) PySequence_DelSlice(obj, a, b) #else #define __Pyx_PySequence_GetSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), (PyObject*)0) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_GetSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object is unsliceable", (obj)->ob_type->tp_name), (PyObject*)0))) #define __Pyx_PySequence_SetSlice(obj, a, b, value) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_SetSlice(obj, a, b, value)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice assignment", (obj)->ob_type->tp_name), -1))) #define __Pyx_PySequence_DelSlice(obj, a, b) (unlikely(!(obj)) ? \ (PyErr_SetString(PyExc_SystemError, "null argument to internal routine"), -1) : \ (likely((obj)->ob_type->tp_as_mapping) ? (PySequence_DelSlice(obj, a, b)) : \ (PyErr_Format(PyExc_TypeError, "'%.200s' object doesn't support slice deletion", (obj)->ob_type->tp_name), -1))) #endif #if PY_MAJOR_VERSION >= 3 #define PyMethod_New(func, self, klass) ((self) ? PyMethod_New(func, self) : PyInstanceMethod_New(func)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),((char *)(n))) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),((char *)(n)),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),((char *)(n))) #else #define __Pyx_GetAttrString(o,n) PyObject_GetAttrString((o),(n)) #define __Pyx_SetAttrString(o,n,a) PyObject_SetAttrString((o),(n),(a)) #define __Pyx_DelAttrString(o,n) PyObject_DelAttrString((o),(n)) #endif #if PY_VERSION_HEX < 0x02050000 #define __Pyx_NAMESTR(n) ((char *)(n)) #define __Pyx_DOCSTR(n) ((char *)(n)) #else #define __Pyx_NAMESTR(n) (n) #define __Pyx_DOCSTR(n) (n) #endif #ifdef __cplusplus #define __PYX_EXTERN_C extern "C" #else #define __PYX_EXTERN_C extern #endif #if defined(WIN32) || defined(MS_WINDOWS) #define _USE_MATH_DEFINES #endif #include #define __PYX_HAVE_API__wrapper_inner #include "stdio.h" #include "stdlib.h" #include "numpy/arrayobject.h" #include "numpy/ufuncobject.h" #include #ifdef PYREX_WITHOUT_ASSERTIONS #define CYTHON_WITHOUT_ASSERTIONS #endif /* inline attribute */ #ifndef CYTHON_INLINE #if defined(__GNUC__) #define CYTHON_INLINE __inline__ #elif defined(_MSC_VER) #define CYTHON_INLINE __inline #elif defined (__STDC_VERSION__) && __STDC_VERSION__ >= 199901L #define CYTHON_INLINE inline #else #define CYTHON_INLINE #endif #endif /* unused attribute */ #ifndef CYTHON_UNUSED # if defined(__GNUC__) # if !(defined(__cplusplus)) || (__GNUC__ > 3 || (__GNUC__ == 3 && __GNUC_MINOR__ >= 4)) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif # elif defined(__ICC) || defined(__INTEL_COMPILER) # define CYTHON_UNUSED __attribute__ ((__unused__)) # else # define CYTHON_UNUSED # endif #endif typedef struct {PyObject **p; char *s; const long n; const char* encoding; const char is_unicode; const char is_str; const char intern; } __Pyx_StringTabEntry; /*proto*/ /* Type Conversion Predeclarations */ #define __Pyx_PyBytes_FromUString(s) PyBytes_FromString((char*)s) #define __Pyx_PyBytes_AsUString(s) ((unsigned char*) PyBytes_AsString(s)) #define __Pyx_PyBool_FromLong(b) ((b) ? (Py_INCREF(Py_True), Py_True) : (Py_INCREF(Py_False), Py_False)) static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject*); static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x); static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject*); static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t); static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject*); #define __pyx_PyFloat_AsDouble(x) (PyFloat_CheckExact(x) ? PyFloat_AS_DOUBLE(x) : PyFloat_AsDouble(x)) #ifdef __GNUC__ /* Test for GCC > 2.95 */ #if __GNUC__ > 2 || (__GNUC__ == 2 && (__GNUC_MINOR__ > 95)) #define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0) #else /* __GNUC__ > 2 ... */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ > 2 ... */ #else /* __GNUC__ */ #define likely(x) (x) #define unlikely(x) (x) #endif /* __GNUC__ */ static PyObject *__pyx_m; static PyObject *__pyx_b; static PyObject *__pyx_empty_tuple; static PyObject *__pyx_empty_bytes; static int __pyx_lineno; static int __pyx_clineno = 0; static const char * __pyx_cfilenm= __FILE__; static const char *__pyx_filename; #if !defined(CYTHON_CCOMPLEX) #if defined(__cplusplus) #define CYTHON_CCOMPLEX 1 #elif defined(_Complex_I) #define CYTHON_CCOMPLEX 1 #else #define CYTHON_CCOMPLEX 0 #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus #include #else #include #endif #endif #if CYTHON_CCOMPLEX && !defined(__cplusplus) && defined(__sun__) && defined(__GNUC__) #undef _Complex_I #define _Complex_I 1.0fj #endif static const char *__pyx_f[] = { "wrapper_inner.pyx", "numpy.pxd", }; typedef npy_int8 __pyx_t_5numpy_int8_t; typedef npy_int16 __pyx_t_5numpy_int16_t; typedef npy_int32 __pyx_t_5numpy_int32_t; typedef npy_int64 __pyx_t_5numpy_int64_t; typedef npy_uint8 __pyx_t_5numpy_uint8_t; typedef npy_uint16 __pyx_t_5numpy_uint16_t; typedef npy_uint32 __pyx_t_5numpy_uint32_t; typedef npy_uint64 __pyx_t_5numpy_uint64_t; typedef npy_float32 __pyx_t_5numpy_float32_t; typedef npy_float64 __pyx_t_5numpy_float64_t; typedef npy_long __pyx_t_5numpy_int_t; typedef npy_longlong __pyx_t_5numpy_long_t; typedef npy_intp __pyx_t_5numpy_intp_t; typedef npy_uintp __pyx_t_5numpy_uintp_t; typedef npy_ulong __pyx_t_5numpy_uint_t; typedef npy_ulonglong __pyx_t_5numpy_ulong_t; typedef npy_double __pyx_t_5numpy_float_t; typedef npy_double __pyx_t_5numpy_double_t; typedef npy_longdouble __pyx_t_5numpy_longdouble_t; #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< float > __pyx_t_float_complex; #else typedef float _Complex __pyx_t_float_complex; #endif #else typedef struct { float real, imag; } __pyx_t_float_complex; #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus typedef ::std::complex< double > __pyx_t_double_complex; #else typedef double _Complex __pyx_t_double_complex; #endif #else typedef struct { double real, imag; } __pyx_t_double_complex; #endif /* Type declarations */ typedef npy_cfloat __pyx_t_5numpy_cfloat_t; typedef npy_cdouble __pyx_t_5numpy_cdouble_t; typedef npy_clongdouble __pyx_t_5numpy_clongdouble_t; typedef npy_cdouble __pyx_t_5numpy_complex_t; #ifndef CYTHON_REFNANNY #define CYTHON_REFNANNY 0 #endif #if CYTHON_REFNANNY typedef struct { void (*INCREF)(void*, PyObject*, int); void (*DECREF)(void*, PyObject*, int); void (*GOTREF)(void*, PyObject*, int); void (*GIVEREF)(void*, PyObject*, int); void* (*SetupContext)(const char*, int, const char*); void (*FinishContext)(void**); } __Pyx_RefNannyAPIStruct; static __Pyx_RefNannyAPIStruct *__Pyx_RefNanny = NULL; static __Pyx_RefNannyAPIStruct * __Pyx_RefNannyImportAPI(const char *modname) { PyObject *m = NULL, *p = NULL; void *r = NULL; m = PyImport_ImportModule((char *)modname); if (!m) goto end; p = PyObject_GetAttrString(m, (char *)"RefNannyAPI"); if (!p) goto end; r = PyLong_AsVoidPtr(p); end: Py_XDECREF(p); Py_XDECREF(m); return (__Pyx_RefNannyAPIStruct *)r; } #define __Pyx_RefNannySetupContext(name) void *__pyx_refnanny = __Pyx_RefNanny->SetupContext((name), __LINE__, __FILE__) #define __Pyx_RefNannyFinishContext() __Pyx_RefNanny->FinishContext(&__pyx_refnanny) #define __Pyx_INCREF(r) __Pyx_RefNanny->INCREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_DECREF(r) __Pyx_RefNanny->DECREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GOTREF(r) __Pyx_RefNanny->GOTREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_GIVEREF(r) __Pyx_RefNanny->GIVEREF(__pyx_refnanny, (PyObject *)(r), __LINE__) #define __Pyx_XDECREF(r) do { if((r) != NULL) {__Pyx_DECREF(r);} } while(0) #else #define __Pyx_RefNannySetupContext(name) #define __Pyx_RefNannyFinishContext() #define __Pyx_INCREF(r) Py_INCREF(r) #define __Pyx_DECREF(r) Py_DECREF(r) #define __Pyx_GOTREF(r) #define __Pyx_GIVEREF(r) #define __Pyx_XDECREF(r) Py_XDECREF(r) #endif /* CYTHON_REFNANNY */ #define __Pyx_XGIVEREF(r) do { if((r) != NULL) {__Pyx_GIVEREF(r);} } while(0) #define __Pyx_XGOTREF(r) do { if((r) != NULL) {__Pyx_GOTREF(r);} } while(0) static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type); /*proto*/ static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name); /*proto*/ static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb); /*proto*/ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb); /*proto*/ static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void); static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index); static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected); static void __Pyx_UnpackTupleError(PyObject *, Py_ssize_t index); /*proto*/ static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list); /*proto*/ static int __Pyx_Print(PyObject*, PyObject *, int); /*proto*/ #if PY_MAJOR_VERSION >= 3 static PyObject* __pyx_print = 0; static PyObject* __pyx_print_kwargs = 0; #endif static int __Pyx_PrintOne(PyObject* stream, PyObject *o); /*proto*/ static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_Py_intptr_t(Py_intptr_t); #if CYTHON_CCOMPLEX #ifdef __cplusplus #define __Pyx_CREAL(z) ((z).real()) #define __Pyx_CIMAG(z) ((z).imag()) #else #define __Pyx_CREAL(z) (__real__(z)) #define __Pyx_CIMAG(z) (__imag__(z)) #endif #else #define __Pyx_CREAL(z) ((z).real) #define __Pyx_CIMAG(z) ((z).imag) #endif #if defined(_WIN32) && defined(__cplusplus) && CYTHON_CCOMPLEX #define __Pyx_SET_CREAL(z,x) ((z).real(x)) #define __Pyx_SET_CIMAG(z,y) ((z).imag(y)) #else #define __Pyx_SET_CREAL(z,x) __Pyx_CREAL(z) = (x) #define __Pyx_SET_CIMAG(z,y) __Pyx_CIMAG(z) = (y) #endif static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float, float); #if CYTHON_CCOMPLEX #define __Pyx_c_eqf(a, b) ((a)==(b)) #define __Pyx_c_sumf(a, b) ((a)+(b)) #define __Pyx_c_difff(a, b) ((a)-(b)) #define __Pyx_c_prodf(a, b) ((a)*(b)) #define __Pyx_c_quotf(a, b) ((a)/(b)) #define __Pyx_c_negf(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zerof(z) ((z)==(float)0) #define __Pyx_c_conjf(z) (::std::conj(z)) #if 1 #define __Pyx_c_absf(z) (::std::abs(z)) #define __Pyx_c_powf(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zerof(z) ((z)==0) #define __Pyx_c_conjf(z) (conjf(z)) #if 1 #define __Pyx_c_absf(z) (cabsf(z)) #define __Pyx_c_powf(a, b) (cpowf(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex, __pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex); static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex); #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex); static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex, __pyx_t_float_complex); #endif #endif static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double, double); #if CYTHON_CCOMPLEX #define __Pyx_c_eq(a, b) ((a)==(b)) #define __Pyx_c_sum(a, b) ((a)+(b)) #define __Pyx_c_diff(a, b) ((a)-(b)) #define __Pyx_c_prod(a, b) ((a)*(b)) #define __Pyx_c_quot(a, b) ((a)/(b)) #define __Pyx_c_neg(a) (-(a)) #ifdef __cplusplus #define __Pyx_c_is_zero(z) ((z)==(double)0) #define __Pyx_c_conj(z) (::std::conj(z)) #if 1 #define __Pyx_c_abs(z) (::std::abs(z)) #define __Pyx_c_pow(a, b) (::std::pow(a, b)) #endif #else #define __Pyx_c_is_zero(z) ((z)==0) #define __Pyx_c_conj(z) (conj(z)) #if 1 #define __Pyx_c_abs(z) (cabs(z)) #define __Pyx_c_pow(a, b) (cpow(a, b)) #endif #endif #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex, __pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex); static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex); #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex); static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex, __pyx_t_double_complex); #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject *); static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject *); static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject *); static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject *); static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject *); static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject *); static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject *); static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject *); static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject *); static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject *); static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject *); static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject *); static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject *); static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject *); static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject *); static void __Pyx_WriteUnraisable(const char *name); /*proto*/ static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig); /*proto*/ static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict); /*proto*/ static PyObject *__Pyx_ImportModule(const char *name); /*proto*/ static void __Pyx_AddTraceback(const char *funcname); /*proto*/ static int __Pyx_InitStrings(__Pyx_StringTabEntry *t); /*proto*/ /* Module declarations from cpython.buffer */ /* Module declarations from cpython.ref */ /* Module declarations from libc.stdio */ /* Module declarations from cpython.object */ /* Module declarations from libc.stdlib */ /* Module declarations from numpy */ /* Module declarations from numpy */ static PyTypeObject *__pyx_ptype_5numpy_dtype = 0; static PyTypeObject *__pyx_ptype_5numpy_flatiter = 0; static PyTypeObject *__pyx_ptype_5numpy_broadcast = 0; static PyTypeObject *__pyx_ptype_5numpy_ndarray = 0; static PyTypeObject *__pyx_ptype_5numpy_ufunc = 0; static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *, PyObject *); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *, PyObject *, PyObject *); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *, PyObject *, PyObject *, PyObject *, PyObject *); /*proto*/ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *, char *, char *, int *); /*proto*/ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *, PyObject *); /*proto*/ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *); /*proto*/ /* Module declarations from libcpp.vector */ /* Module declarations from wrapper_inner */ static void inner_work_1d(int, double *, double *); /*proto*/ static void inner_work_2d(int, int, double *, double *); /*proto*/ #define __Pyx_MODULE_NAME "wrapper_inner" static int __pyx_module_is_main_wrapper_inner = 0; /* Implementation of wrapper_inner */ static PyObject *__pyx_builtin_ValueError; static PyObject *__pyx_builtin_range; static PyObject *__pyx_builtin_RuntimeError; static char __pyx_k_1[] = "\nHello from Cython inner_work_1d!"; static char __pyx_k_2[] = "\nHello from Cython inner_work_2d!"; static char __pyx_k_3[] = "\nHello from a pure Python function inside the Cython module."; static char __pyx_k_5[] = "ndarray is not C contiguous"; static char __pyx_k_7[] = "ndarray is not Fortran contiguous"; static char __pyx_k_9[] = "Non-native byte order not supported"; static char __pyx_k_11[] = "unknown dtype code in numpy.pxd (%d)"; static char __pyx_k_12[] = "Format string allocated too short, see comment in numpy.pxd"; static char __pyx_k_15[] = "Format string allocated too short."; static char __pyx_k__B[] = "B"; static char __pyx_k__H[] = "H"; static char __pyx_k__I[] = "I"; static char __pyx_k__L[] = "L"; static char __pyx_k__O[] = "O"; static char __pyx_k__Q[] = "Q"; static char __pyx_k__b[] = "b"; static char __pyx_k__d[] = "d"; static char __pyx_k__f[] = "f"; static char __pyx_k__g[] = "g"; static char __pyx_k__h[] = "h"; static char __pyx_k__i[] = "i"; static char __pyx_k__l[] = "l"; static char __pyx_k__q[] = "q"; static char __pyx_k__Zd[] = "Zd"; static char __pyx_k__Zf[] = "Zf"; static char __pyx_k__Zg[] = "Zg"; static char __pyx_k__np[] = "np"; static char __pyx_k__buf[] = "buf"; static char __pyx_k__obj[] = "obj"; static char __pyx_k__base[] = "base"; static char __pyx_k__ndim[] = "ndim"; static char __pyx_k__ones[] = "ones"; static char __pyx_k__descr[] = "descr"; static char __pyx_k__names[] = "names"; static char __pyx_k__numpy[] = "numpy"; static char __pyx_k__range[] = "range"; static char __pyx_k__shape[] = "shape"; static char __pyx_k__fields[] = "fields"; static char __pyx_k__format[] = "format"; static char __pyx_k__strides[] = "strides"; static char __pyx_k____main__[] = "__main__"; static char __pyx_k____test__[] = "__test__"; static char __pyx_k__itemsize[] = "itemsize"; static char __pyx_k__readonly[] = "readonly"; static char __pyx_k__type_num[] = "type_num"; static char __pyx_k__byteorder[] = "byteorder"; static char __pyx_k__ValueError[] = "ValueError"; static char __pyx_k__suboffsets[] = "suboffsets"; static char __pyx_k__work_module[] = "work_module"; static char __pyx_k__RuntimeError[] = "RuntimeError"; static char __pyx_k__pure_py_test[] = "pure_py_test"; static char __pyx_k__wrapper_inner[] = "wrapper_inner"; static char __pyx_k__do_awesome_work[] = "do_awesome_work"; static PyObject *__pyx_kp_s_1; static PyObject *__pyx_kp_u_11; static PyObject *__pyx_kp_u_12; static PyObject *__pyx_kp_u_15; static PyObject *__pyx_kp_s_2; static PyObject *__pyx_kp_s_3; static PyObject *__pyx_kp_u_5; static PyObject *__pyx_kp_u_7; static PyObject *__pyx_kp_u_9; static PyObject *__pyx_n_s__RuntimeError; static PyObject *__pyx_n_s__ValueError; static PyObject *__pyx_n_s____main__; static PyObject *__pyx_n_s____test__; static PyObject *__pyx_n_s__base; static PyObject *__pyx_n_s__buf; static PyObject *__pyx_n_s__byteorder; static PyObject *__pyx_n_s__descr; static PyObject *__pyx_n_s__do_awesome_work; static PyObject *__pyx_n_s__fields; static PyObject *__pyx_n_s__format; static PyObject *__pyx_n_s__itemsize; static PyObject *__pyx_n_s__names; static PyObject *__pyx_n_s__ndim; static PyObject *__pyx_n_s__np; static PyObject *__pyx_n_s__numpy; static PyObject *__pyx_n_s__obj; static PyObject *__pyx_n_s__ones; static PyObject *__pyx_n_s__pure_py_test; static PyObject *__pyx_n_s__range; static PyObject *__pyx_n_s__readonly; static PyObject *__pyx_n_s__shape; static PyObject *__pyx_n_s__strides; static PyObject *__pyx_n_s__suboffsets; static PyObject *__pyx_n_s__type_num; static PyObject *__pyx_n_s__work_module; static PyObject *__pyx_n_s__wrapper_inner; static PyObject *__pyx_int_5; static PyObject *__pyx_int_15; static PyObject *__pyx_k_tuple_4; static PyObject *__pyx_k_tuple_6; static PyObject *__pyx_k_tuple_8; static PyObject *__pyx_k_tuple_10; static PyObject *__pyx_k_tuple_13; static PyObject *__pyx_k_tuple_14; static PyObject *__pyx_k_tuple_16; /* "wrapper_inner.pyx":18 * # Here is the Cython portion of the wrapper. * # Important: this function must be declared with "api" keyword! * cdef api void inner_work_1d(int num_x, double* data_ptr, double* answer_ptr): # <<<<<<<<<<<<<< * * print('\nHello from Cython inner_work_1d!') */ static void inner_work_1d(int __pyx_v_num_x, double *__pyx_v_data_ptr, double *__pyx_v_answer_ptr) { int __pyx_v_nd; npy_intp *__pyx_v_dims; int __pyx_v_typenum; PyArrayObject *__pyx_v_data_np = 0; double __pyx_v_sum; npy_intp __pyx_t_1[1]; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; __Pyx_RefNannySetupContext("inner_work_1d"); /* "wrapper_inner.pyx":20 * cdef api void inner_work_1d(int num_x, double* data_ptr, double* answer_ptr): * * print('\nHello from Cython inner_work_1d!') # <<<<<<<<<<<<<< * * # Convert input data into form useable by Python, with lots of help from Numpy. */ if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 20; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "wrapper_inner.pyx":25 * * # http://www.mail-archive.com/cython-dev@codespeak.net/msg05823.html * cdef int nd = 1 # <<<<<<<<<<<<<< * cdef np.npy_intp* dims = [num_x] # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1} * cdef int typenum = np.NPY_DOUBLE */ __pyx_v_nd = 1; /* "wrapper_inner.pyx":26 * # http://www.mail-archive.com/cython-dev@codespeak.net/msg05823.html * cdef int nd = 1 * cdef np.npy_intp* dims = [num_x] # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1} # <<<<<<<<<<<<<< * cdef int typenum = np.NPY_DOUBLE * */ __pyx_t_1[0] = ((npy_intp)__pyx_v_num_x); __pyx_v_dims = __pyx_t_1; /* "wrapper_inner.pyx":27 * cdef int nd = 1 * cdef np.npy_intp* dims = [num_x] # analogous to: double a[4] = {0.5, 0.3, 0.1, 0.1} * cdef int typenum = np.NPY_DOUBLE # <<<<<<<<<<<<<< * * cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, data_ptr) */ __pyx_v_typenum = NPY_DOUBLE; /* "wrapper_inner.pyx":29 * cdef int typenum = np.NPY_DOUBLE * * cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, data_ptr) # <<<<<<<<<<<<<< * * # Do the work. */ __pyx_t_2 = PyArray_SimpleNewFromData(__pyx_v_nd, __pyx_v_dims, __pyx_v_typenum, ((void *)__pyx_v_data_ptr)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 29; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_data_np = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; /* "wrapper_inner.pyx":32 * * # Do the work. * cdef double sum = work_module.do_awesome_work(data_np) # <<<<<<<<<<<<<< * * # # Convert work results into a form useable by the calling C++ application. */ __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_INCREF(((PyObject *)__pyx_v_data_np)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_data_np)); __Pyx_GIVEREF(((PyObject *)__pyx_v_data_np)); __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 32; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_sum = __pyx_t_5; /* "wrapper_inner.pyx":35 * * # # Convert work results into a form useable by the calling C++ application. * answer_ptr[0] = sum # <<<<<<<<<<<<<< * * # Done. */ (__pyx_v_answer_ptr[0]) = __pyx_v_sum; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("wrapper_inner.inner_work_1d"); __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_data_np); __Pyx_RefNannyFinishContext(); } /* "wrapper_inner.pyx":40 * * * cdef api void inner_work_2d(int num_x, int num_y, double* data_ptr, double* answer_ptr): # <<<<<<<<<<<<<< * * print('\nHello from Cython inner_work_2d!') */ static void inner_work_2d(int __pyx_v_num_x, int __pyx_v_num_y, double *__pyx_v_data_ptr, double *__pyx_v_answer_ptr) { int __pyx_v_nd; npy_intp *__pyx_v_dims; int __pyx_v_typenum; PyArrayObject *__pyx_v_data_np = 0; double __pyx_v_sum; npy_intp __pyx_t_1[2]; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; double __pyx_t_5; __Pyx_RefNannySetupContext("inner_work_2d"); /* "wrapper_inner.pyx":42 * cdef api void inner_work_2d(int num_x, int num_y, double* data_ptr, double* answer_ptr): * * print('\nHello from Cython inner_work_2d!') # <<<<<<<<<<<<<< * * # Convert input data into form useable by Python, with lots of help from Numpy. */ if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_2)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 42; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "wrapper_inner.pyx":45 * * # Convert input data into form useable by Python, with lots of help from Numpy. * cdef int nd = 2 # <<<<<<<<<<<<<< * cdef np.npy_intp* dims = [num_x, num_y] * cdef int typenum = np.NPY_DOUBLE */ __pyx_v_nd = 2; /* "wrapper_inner.pyx":46 * # Convert input data into form useable by Python, with lots of help from Numpy. * cdef int nd = 2 * cdef np.npy_intp* dims = [num_x, num_y] # <<<<<<<<<<<<<< * cdef int typenum = np.NPY_DOUBLE * */ __pyx_t_1[0] = ((npy_intp)__pyx_v_num_x); __pyx_t_1[1] = ((npy_intp)__pyx_v_num_y); __pyx_v_dims = __pyx_t_1; /* "wrapper_inner.pyx":47 * cdef int nd = 2 * cdef np.npy_intp* dims = [num_x, num_y] * cdef int typenum = np.NPY_DOUBLE # <<<<<<<<<<<<<< * * cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, data_ptr) */ __pyx_v_typenum = NPY_DOUBLE; /* "wrapper_inner.pyx":49 * cdef int typenum = np.NPY_DOUBLE * * cdef np.ndarray data_np = PyArray_SimpleNewFromData(nd, dims, typenum, data_ptr) # <<<<<<<<<<<<<< * * # Do the work. */ __pyx_t_2 = PyArray_SimpleNewFromData(__pyx_v_nd, __pyx_v_dims, __pyx_v_typenum, ((void *)__pyx_v_data_ptr)); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); if (!(likely(((__pyx_t_2) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_2, __pyx_ptype_5numpy_ndarray))))) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 49; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_data_np = ((PyArrayObject *)__pyx_t_2); __pyx_t_2 = 0; /* "wrapper_inner.pyx":52 * * # Do the work. * cdef double sum = work_module.do_awesome_work(data_np) # <<<<<<<<<<<<<< * * # # Convert work results into a form useable by the calling C++ application. */ __pyx_t_2 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __pyx_t_3 = PyObject_GetAttr(__pyx_t_2, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __pyx_t_2 = PyTuple_New(1); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_2)); __Pyx_INCREF(((PyObject *)__pyx_v_data_np)); PyTuple_SET_ITEM(__pyx_t_2, 0, ((PyObject *)__pyx_v_data_np)); __Pyx_GIVEREF(((PyObject *)__pyx_v_data_np)); __pyx_t_4 = PyObject_Call(__pyx_t_3, ((PyObject *)__pyx_t_2), NULL); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_2)); __pyx_t_2 = 0; __pyx_t_5 = __pyx_PyFloat_AsDouble(__pyx_t_4); if (unlikely((__pyx_t_5 == (double)-1) && PyErr_Occurred())) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 52; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __pyx_v_sum = __pyx_t_5; /* "wrapper_inner.pyx":55 * * # # Convert work results into a form useable by the calling C++ application. * answer_ptr[0] = sum # <<<<<<<<<<<<<< * * */ (__pyx_v_answer_ptr[0]) = __pyx_v_sum; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_WriteUnraisable("wrapper_inner.inner_work_2d"); __pyx_L0:; __Pyx_XDECREF((PyObject *)__pyx_v_data_np); __Pyx_RefNannyFinishContext(); } /* "wrapper_inner.pyx":64 * * * def pure_py_test(): # <<<<<<<<<<<<<< * * print('\nHello from a pure Python function inside the Cython module.') */ static PyObject *__pyx_pf_13wrapper_inner_pure_py_test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused); /*proto*/ static PyMethodDef __pyx_mdef_13wrapper_inner_pure_py_test = {__Pyx_NAMESTR("pure_py_test"), (PyCFunction)__pyx_pf_13wrapper_inner_pure_py_test, METH_NOARGS, __Pyx_DOCSTR(0)}; static PyObject *__pyx_pf_13wrapper_inner_pure_py_test(PyObject *__pyx_self, CYTHON_UNUSED PyObject *unused) { PyObject *__pyx_v_data; PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; __Pyx_RefNannySetupContext("pure_py_test"); __pyx_self = __pyx_self; __pyx_v_data = Py_None; __Pyx_INCREF(Py_None); /* "wrapper_inner.pyx":66 * def pure_py_test(): * * print('\nHello from a pure Python function inside the Cython module.') # <<<<<<<<<<<<<< * * data = np.ones(5) */ if (__Pyx_PrintOne(0, ((PyObject *)__pyx_kp_s_3)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 66; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /* "wrapper_inner.pyx":68 * print('\nHello from a pure Python function inside the Cython module.') * * data = np.ones(5) # <<<<<<<<<<<<<< * work_module.do_awesome_work(data) */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__np); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__ones); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_k_tuple_4), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(__pyx_v_data); __pyx_v_data = __pyx_t_1; __pyx_t_1 = 0; /* "wrapper_inner.pyx":69 * * data = np.ones(5) * work_module.do_awesome_work(data) # <<<<<<<<<<<<<< */ __pyx_t_1 = __Pyx_GetName(__pyx_m, __pyx_n_s__work_module); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_2 = PyObject_GetAttr(__pyx_t_1, __pyx_n_s__do_awesome_work); if (unlikely(!__pyx_t_2)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); __Pyx_INCREF(__pyx_v_data); PyTuple_SET_ITEM(__pyx_t_1, 0, __pyx_v_data); __Pyx_GIVEREF(__pyx_v_data); __pyx_t_3 = PyObject_Call(__pyx_t_2, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 69; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_AddTraceback("wrapper_inner.pure_py_test"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF(__pyx_v_data); __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":188 * # experimental exception made for __getbuffer__ and __releasebuffer__ * # -- the details of this may change. * def __getbuffer__(ndarray self, Py_buffer* info, int flags): # <<<<<<<<<<<<<< * # This implementation of getbuffer is geared towards Cython * # requirements, and does not yet fullfill the PEP. */ static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags); /*proto*/ static CYTHON_UNUSED int __pyx_pf_5numpy_7ndarray___getbuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info, int __pyx_v_flags) { int __pyx_v_copy_shape; int __pyx_v_i; int __pyx_v_ndim; int __pyx_v_endian_detector; int __pyx_v_little_endian; int __pyx_v_t; char *__pyx_v_f; PyArray_Descr *__pyx_v_descr = 0; int __pyx_v_offset; int __pyx_v_hasfields; int __pyx_r; PyObject *__pyx_t_1 = NULL; int __pyx_t_2; int __pyx_t_3; int __pyx_t_4; int __pyx_t_5; int __pyx_t_6; int __pyx_t_7; PyObject *__pyx_t_8 = NULL; char *__pyx_t_9; __Pyx_RefNannySetupContext("__getbuffer__"); if (__pyx_v_info == NULL) return 0; __pyx_v_info->obj = Py_None; __Pyx_INCREF(Py_None); __Pyx_GIVEREF(__pyx_v_info->obj); /* "numpy.pxd":194 * # of flags * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * */ __pyx_v_endian_detector = 1; /* "numpy.pxd":195 * cdef int copy_shape, i, ndim * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * * ndim = PyArray_NDIM(self) */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":197 * cdef bint little_endian = ((&endian_detector)[0] != 0) * * ndim = PyArray_NDIM(self) # <<<<<<<<<<<<<< * * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_v_ndim = PyArray_NDIM(((PyArrayObject *)__pyx_t_1)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":199 * ndim = PyArray_NDIM(self) * * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * copy_shape = 1 * else: */ __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_2) { /* "numpy.pxd":200 * * if sizeof(npy_intp) != sizeof(Py_ssize_t): * copy_shape = 1 # <<<<<<<<<<<<<< * else: * copy_shape = 0 */ __pyx_v_copy_shape = 1; goto __pyx_L5; } /*else*/ { /* "numpy.pxd":202 * copy_shape = 1 * else: * copy_shape = 0 # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) */ __pyx_v_copy_shape = 0; } __pyx_L5:; /* "numpy.pxd":204 * copy_shape = 0 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") */ __pyx_t_2 = ((__pyx_v_flags & PyBUF_C_CONTIGUOUS) == PyBUF_C_CONTIGUOUS); if (__pyx_t_2) { /* "numpy.pxd":205 * * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not C contiguous") * */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_3 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_t_1), NPY_C_CONTIGUOUS)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_4 = __pyx_t_3; } else { __pyx_t_4 = __pyx_t_2; } if (__pyx_t_4) { /* "numpy.pxd":206 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_6), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "numpy.pxd":208 * raise ValueError(u"ndarray is not C contiguous") * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) # <<<<<<<<<<<<<< * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") */ __pyx_t_4 = ((__pyx_v_flags & PyBUF_F_CONTIGUOUS) == PyBUF_F_CONTIGUOUS); if (__pyx_t_4) { /* "numpy.pxd":209 * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): # <<<<<<<<<<<<<< * raise ValueError(u"ndarray is not Fortran contiguous") * */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = (!PyArray_CHKFLAGS(((PyArrayObject *)__pyx_t_1), NPY_F_CONTIGUOUS)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_3 = __pyx_t_2; } else { __pyx_t_3 = __pyx_t_4; } if (__pyx_t_3) { /* "numpy.pxd":210 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_8), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L7; } __pyx_L7:; /* "numpy.pxd":212 * raise ValueError(u"ndarray is not Fortran contiguous") * * info.buf = PyArray_DATA(self) # <<<<<<<<<<<<<< * info.ndim = ndim * if copy_shape: */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_v_info->buf = PyArray_DATA(((PyArrayObject *)__pyx_t_1)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":213 * * info.buf = PyArray_DATA(self) * info.ndim = ndim # <<<<<<<<<<<<<< * if copy_shape: * # Allocate new buffer for strides and shape info. This is allocated */ __pyx_v_info->ndim = __pyx_v_ndim; /* "numpy.pxd":214 * info.buf = PyArray_DATA(self) * info.ndim = ndim * if copy_shape: # <<<<<<<<<<<<<< * # Allocate new buffer for strides and shape info. This is allocated * # as one block, strides first. */ if (__pyx_v_copy_shape) { /* "numpy.pxd":217 * # Allocate new buffer for strides and shape info. This is allocated * # as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) # <<<<<<<<<<<<<< * info.shape = info.strides + ndim * for i in range(ndim): */ __pyx_v_info->strides = ((Py_ssize_t *)malloc((((sizeof(Py_ssize_t)) * __pyx_v_ndim) * 2))); /* "numpy.pxd":218 * # as one block, strides first. * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim # <<<<<<<<<<<<<< * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] */ __pyx_v_info->shape = (__pyx_v_info->strides + __pyx_v_ndim); /* "numpy.pxd":219 * info.strides = stdlib.malloc(sizeof(Py_ssize_t) * ndim * 2) * info.shape = info.strides + ndim * for i in range(ndim): # <<<<<<<<<<<<<< * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] */ __pyx_t_5 = __pyx_v_ndim; for (__pyx_t_6 = 0; __pyx_t_6 < __pyx_t_5; __pyx_t_6+=1) { __pyx_v_i = __pyx_t_6; /* "numpy.pxd":220 * info.shape = info.strides + ndim * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] # <<<<<<<<<<<<<< * info.shape[i] = PyArray_DIMS(self)[i] * else: */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); (__pyx_v_info->strides[__pyx_v_i]) = (PyArray_STRIDES(((PyArrayObject *)__pyx_t_1))[__pyx_v_i]); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":221 * for i in range(ndim): * info.strides[i] = PyArray_STRIDES(self)[i] * info.shape[i] = PyArray_DIMS(self)[i] # <<<<<<<<<<<<<< * else: * info.strides = PyArray_STRIDES(self) */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); (__pyx_v_info->shape[__pyx_v_i]) = (PyArray_DIMS(((PyArrayObject *)__pyx_t_1))[__pyx_v_i]); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } goto __pyx_L8; } /*else*/ { /* "numpy.pxd":223 * info.shape[i] = PyArray_DIMS(self)[i] * else: * info.strides = PyArray_STRIDES(self) # <<<<<<<<<<<<<< * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_v_info->strides = ((Py_ssize_t *)PyArray_STRIDES(((PyArrayObject *)__pyx_t_1))); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":224 * else: * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) # <<<<<<<<<<<<<< * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_v_info->shape = ((Py_ssize_t *)PyArray_DIMS(((PyArrayObject *)__pyx_t_1))); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; } __pyx_L8:; /* "numpy.pxd":225 * info.strides = PyArray_STRIDES(self) * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL # <<<<<<<<<<<<<< * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) */ __pyx_v_info->suboffsets = NULL; /* "numpy.pxd":226 * info.shape = PyArray_DIMS(self) * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) # <<<<<<<<<<<<<< * info.readonly = not PyArray_ISWRITEABLE(self) * */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_v_info->itemsize = PyArray_ITEMSIZE(((PyArrayObject *)__pyx_t_1)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":227 * info.suboffsets = NULL * info.itemsize = PyArray_ITEMSIZE(self) * info.readonly = not PyArray_ISWRITEABLE(self) # <<<<<<<<<<<<<< * * cdef int t */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_v_info->readonly = (!PyArray_ISWRITEABLE(((PyArrayObject *)__pyx_t_1))); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "numpy.pxd":230 * * cdef int t * cdef char* f = NULL # <<<<<<<<<<<<<< * cdef dtype descr = self.descr * cdef list stack */ __pyx_v_f = NULL; /* "numpy.pxd":231 * cdef int t * cdef char* f = NULL * cdef dtype descr = self.descr # <<<<<<<<<<<<<< * cdef list stack * cdef int offset */ __Pyx_INCREF(((PyObject *)((PyArrayObject *)__pyx_v_self)->descr)); __pyx_v_descr = ((PyArrayObject *)__pyx_v_self)->descr; /* "numpy.pxd":235 * cdef int offset * * cdef bint hasfields = PyDataType_HASFIELDS(descr) # <<<<<<<<<<<<<< * * if not hasfields and not copy_shape: */ __pyx_v_hasfields = PyDataType_HASFIELDS(__pyx_v_descr); /* "numpy.pxd":237 * cdef bint hasfields = PyDataType_HASFIELDS(descr) * * if not hasfields and not copy_shape: # <<<<<<<<<<<<<< * # do not call releasebuffer * info.obj = None */ __pyx_t_3 = (!__pyx_v_hasfields); if (__pyx_t_3) { __pyx_t_4 = (!__pyx_v_copy_shape); __pyx_t_2 = __pyx_t_4; } else { __pyx_t_2 = __pyx_t_3; } if (__pyx_t_2) { /* "numpy.pxd":239 * if not hasfields and not copy_shape: * # do not call releasebuffer * info.obj = None # <<<<<<<<<<<<<< * else: * # need to call releasebuffer */ __Pyx_INCREF(Py_None); __Pyx_GIVEREF(Py_None); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = Py_None; goto __pyx_L11; } /*else*/ { /* "numpy.pxd":242 * else: * # need to call releasebuffer * info.obj = self # <<<<<<<<<<<<<< * * if not hasfields: */ __Pyx_INCREF(__pyx_v_self); __Pyx_GIVEREF(__pyx_v_self); __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = __pyx_v_self; } __pyx_L11:; /* "numpy.pxd":244 * info.obj = self * * if not hasfields: # <<<<<<<<<<<<<< * t = descr.type_num * if ((descr.byteorder == '>' and little_endian) or */ __pyx_t_2 = (!__pyx_v_hasfields); if (__pyx_t_2) { /* "numpy.pxd":245 * * if not hasfields: * t = descr.type_num # <<<<<<<<<<<<<< * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): */ __pyx_v_t = __pyx_v_descr->type_num; /* "numpy.pxd":246 * if not hasfields: * t = descr.type_num * if ((descr.byteorder == '>' and little_endian) or # <<<<<<<<<<<<<< * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_2 = (__pyx_v_descr->byteorder == '>'); if (__pyx_t_2) { __pyx_t_3 = __pyx_v_little_endian; } else { __pyx_t_3 = __pyx_t_2; } if (!__pyx_t_3) { /* "numpy.pxd":247 * t = descr.type_num * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" */ __pyx_t_2 = (__pyx_v_descr->byteorder == '<'); if (__pyx_t_2) { __pyx_t_4 = (!__pyx_v_little_endian); __pyx_t_7 = __pyx_t_4; } else { __pyx_t_7 = __pyx_t_2; } __pyx_t_2 = __pyx_t_7; } else { __pyx_t_2 = __pyx_t_3; } if (__pyx_t_2) { /* "numpy.pxd":248 * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_t_1 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_10), NULL); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __Pyx_Raise(__pyx_t_1, 0, 0); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L13; } __pyx_L13:; /* "numpy.pxd":249 * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" */ __pyx_t_2 = (__pyx_v_t == NPY_BYTE); if (__pyx_t_2) { __pyx_v_f = __pyx_k__b; goto __pyx_L14; } /* "numpy.pxd":250 * raise ValueError(u"Non-native byte order not supported") * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" */ __pyx_t_2 = (__pyx_v_t == NPY_UBYTE); if (__pyx_t_2) { __pyx_v_f = __pyx_k__B; goto __pyx_L14; } /* "numpy.pxd":251 * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" */ __pyx_t_2 = (__pyx_v_t == NPY_SHORT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__h; goto __pyx_L14; } /* "numpy.pxd":252 * elif t == NPY_UBYTE: f = "B" * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" */ __pyx_t_2 = (__pyx_v_t == NPY_USHORT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__H; goto __pyx_L14; } /* "numpy.pxd":253 * elif t == NPY_SHORT: f = "h" * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" */ __pyx_t_2 = (__pyx_v_t == NPY_INT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__i; goto __pyx_L14; } /* "numpy.pxd":254 * elif t == NPY_USHORT: f = "H" * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" */ __pyx_t_2 = (__pyx_v_t == NPY_UINT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__I; goto __pyx_L14; } /* "numpy.pxd":255 * elif t == NPY_INT: f = "i" * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" */ __pyx_t_2 = (__pyx_v_t == NPY_LONG); if (__pyx_t_2) { __pyx_v_f = __pyx_k__l; goto __pyx_L14; } /* "numpy.pxd":256 * elif t == NPY_UINT: f = "I" * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" */ __pyx_t_2 = (__pyx_v_t == NPY_ULONG); if (__pyx_t_2) { __pyx_v_f = __pyx_k__L; goto __pyx_L14; } /* "numpy.pxd":257 * elif t == NPY_LONG: f = "l" * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" */ __pyx_t_2 = (__pyx_v_t == NPY_LONGLONG); if (__pyx_t_2) { __pyx_v_f = __pyx_k__q; goto __pyx_L14; } /* "numpy.pxd":258 * elif t == NPY_ULONG: f = "L" * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" */ __pyx_t_2 = (__pyx_v_t == NPY_ULONGLONG); if (__pyx_t_2) { __pyx_v_f = __pyx_k__Q; goto __pyx_L14; } /* "numpy.pxd":259 * elif t == NPY_LONGLONG: f = "q" * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" */ __pyx_t_2 = (__pyx_v_t == NPY_FLOAT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__f; goto __pyx_L14; } /* "numpy.pxd":260 * elif t == NPY_ULONGLONG: f = "Q" * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" */ __pyx_t_2 = (__pyx_v_t == NPY_DOUBLE); if (__pyx_t_2) { __pyx_v_f = __pyx_k__d; goto __pyx_L14; } /* "numpy.pxd":261 * elif t == NPY_FLOAT: f = "f" * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" */ __pyx_t_2 = (__pyx_v_t == NPY_LONGDOUBLE); if (__pyx_t_2) { __pyx_v_f = __pyx_k__g; goto __pyx_L14; } /* "numpy.pxd":262 * elif t == NPY_DOUBLE: f = "d" * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" */ __pyx_t_2 = (__pyx_v_t == NPY_CFLOAT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__Zf; goto __pyx_L14; } /* "numpy.pxd":263 * elif t == NPY_LONGDOUBLE: f = "g" * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" */ __pyx_t_2 = (__pyx_v_t == NPY_CDOUBLE); if (__pyx_t_2) { __pyx_v_f = __pyx_k__Zd; goto __pyx_L14; } /* "numpy.pxd":264 * elif t == NPY_CFLOAT: f = "Zf" * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f = "O" * else: */ __pyx_t_2 = (__pyx_v_t == NPY_CLONGDOUBLE); if (__pyx_t_2) { __pyx_v_f = __pyx_k__Zg; goto __pyx_L14; } /* "numpy.pxd":265 * elif t == NPY_CDOUBLE: f = "Zd" * elif t == NPY_CLONGDOUBLE: f = "Zg" * elif t == NPY_OBJECT: f = "O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_2 = (__pyx_v_t == NPY_OBJECT); if (__pyx_t_2) { __pyx_v_f = __pyx_k__O; goto __pyx_L14; } /*else*/ { /* "numpy.pxd":267 * elif t == NPY_OBJECT: f = "O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * info.format = f * return */ __pyx_t_1 = PyInt_FromLong(__pyx_v_t); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_t_8 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_11), __pyx_t_1); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_8)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; __pyx_t_1 = PyTuple_New(1); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); PyTuple_SET_ITEM(__pyx_t_1, 0, ((PyObject *)__pyx_t_8)); __Pyx_GIVEREF(((PyObject *)__pyx_t_8)); __pyx_t_8 = 0; __pyx_t_8 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_1), NULL); if (unlikely(!__pyx_t_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_8); __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; __Pyx_Raise(__pyx_t_8, 0, 0); __Pyx_DECREF(__pyx_t_8); __pyx_t_8 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 267; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L14:; /* "numpy.pxd":268 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f # <<<<<<<<<<<<<< * return * else: */ __pyx_v_info->format = __pyx_v_f; /* "numpy.pxd":269 * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * info.format = f * return # <<<<<<<<<<<<<< * else: * info.format = stdlib.malloc(_buffer_format_string_len) */ __pyx_r = 0; goto __pyx_L0; goto __pyx_L12; } /*else*/ { /* "numpy.pxd":271 * return * else: * info.format = stdlib.malloc(_buffer_format_string_len) # <<<<<<<<<<<<<< * info.format[0] = '^' # Native data types, manual alignment * offset = 0 */ __pyx_v_info->format = ((char *)malloc(255)); /* "numpy.pxd":272 * else: * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = '^' # Native data types, manual alignment # <<<<<<<<<<<<<< * offset = 0 * f = _util_dtypestring(descr, info.format + 1, */ (__pyx_v_info->format[0]) = '^'; /* "numpy.pxd":273 * info.format = stdlib.malloc(_buffer_format_string_len) * info.format[0] = '^' # Native data types, manual alignment * offset = 0 # <<<<<<<<<<<<<< * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, */ __pyx_v_offset = 0; /* "numpy.pxd":276 * f = _util_dtypestring(descr, info.format + 1, * info.format + _buffer_format_string_len, * &offset) # <<<<<<<<<<<<<< * f[0] = 0 # Terminate format string * */ __pyx_t_9 = __pyx_f_5numpy__util_dtypestring(__pyx_v_descr, (__pyx_v_info->format + 1), (__pyx_v_info->format + 255), (&__pyx_v_offset)); if (unlikely(__pyx_t_9 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 274; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_9; /* "numpy.pxd":277 * info.format + _buffer_format_string_len, * &offset) * f[0] = 0 # Terminate format string # <<<<<<<<<<<<<< * * def __releasebuffer__(ndarray self, Py_buffer* info): */ (__pyx_v_f[0]) = 0; } __pyx_L12:; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_XDECREF(__pyx_t_8); __Pyx_AddTraceback("numpy.ndarray.__getbuffer__"); __pyx_r = -1; __Pyx_GOTREF(__pyx_v_info->obj); __Pyx_DECREF(__pyx_v_info->obj); __pyx_v_info->obj = NULL; goto __pyx_L2; __pyx_L0:; if (__pyx_v_info->obj == Py_None) { __Pyx_GOTREF(Py_None); __Pyx_DECREF(Py_None); __pyx_v_info->obj = NULL; } __pyx_L2:; __Pyx_XDECREF((PyObject *)__pyx_v_descr); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":279 * f[0] = 0 # Terminate format string * * def __releasebuffer__(ndarray self, Py_buffer* info): # <<<<<<<<<<<<<< * if PyArray_HASFIELDS(self): * stdlib.free(info.format) */ static CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info); /*proto*/ static CYTHON_UNUSED void __pyx_pf_5numpy_7ndarray_1__releasebuffer__(PyObject *__pyx_v_self, Py_buffer *__pyx_v_info) { PyObject *__pyx_t_1 = NULL; int __pyx_t_2; __Pyx_RefNannySetupContext("__releasebuffer__"); /* "numpy.pxd":280 * * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): # <<<<<<<<<<<<<< * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): */ __pyx_t_1 = __pyx_v_self; __Pyx_INCREF(__pyx_t_1); __pyx_t_2 = PyArray_HASFIELDS(((PyArrayObject *)__pyx_t_1)); __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; if (__pyx_t_2) { /* "numpy.pxd":281 * def __releasebuffer__(ndarray self, Py_buffer* info): * if PyArray_HASFIELDS(self): * stdlib.free(info.format) # <<<<<<<<<<<<<< * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) */ free(__pyx_v_info->format); goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":282 * if PyArray_HASFIELDS(self): * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): # <<<<<<<<<<<<<< * stdlib.free(info.strides) * # info.shape was stored after info.strides in the same block */ __pyx_t_2 = ((sizeof(npy_intp)) != (sizeof(Py_ssize_t))); if (__pyx_t_2) { /* "numpy.pxd":283 * stdlib.free(info.format) * if sizeof(npy_intp) != sizeof(Py_ssize_t): * stdlib.free(info.strides) # <<<<<<<<<<<<<< * # info.shape was stored after info.strides in the same block * */ free(__pyx_v_info->strides); goto __pyx_L6; } __pyx_L6:; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":756 * ctypedef npy_cdouble complex_t * * cdef inline object PyArray_MultiIterNew1(a): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(1, a) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew1(PyObject *__pyx_v_a) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew1"); /* "numpy.pxd":757 * * cdef inline object PyArray_MultiIterNew1(a): * return PyArray_MultiIterNew(1, a) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew2(a, b): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(1, ((void *)__pyx_v_a)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 757; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew1"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":759 * return PyArray_MultiIterNew(1, a) * * cdef inline object PyArray_MultiIterNew2(a, b): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(2, a, b) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew2(PyObject *__pyx_v_a, PyObject *__pyx_v_b) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew2"); /* "numpy.pxd":760 * * cdef inline object PyArray_MultiIterNew2(a, b): * return PyArray_MultiIterNew(2, a, b) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew3(a, b, c): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(2, ((void *)__pyx_v_a), ((void *)__pyx_v_b)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 760; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew2"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":762 * return PyArray_MultiIterNew(2, a, b) * * cdef inline object PyArray_MultiIterNew3(a, b, c): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(3, a, b, c) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew3(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew3"); /* "numpy.pxd":763 * * cdef inline object PyArray_MultiIterNew3(a, b, c): * return PyArray_MultiIterNew(3, a, b, c) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(3, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 763; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew3"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":765 * return PyArray_MultiIterNew(3, a, b, c) * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(4, a, b, c, d) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew4(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew4"); /* "numpy.pxd":766 * * cdef inline object PyArray_MultiIterNew4(a, b, c, d): * return PyArray_MultiIterNew(4, a, b, c, d) # <<<<<<<<<<<<<< * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(4, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 766; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew4"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":768 * return PyArray_MultiIterNew(4, a, b, c, d) * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): # <<<<<<<<<<<<<< * return PyArray_MultiIterNew(5, a, b, c, d, e) * */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_PyArray_MultiIterNew5(PyObject *__pyx_v_a, PyObject *__pyx_v_b, PyObject *__pyx_v_c, PyObject *__pyx_v_d, PyObject *__pyx_v_e) { PyObject *__pyx_r = NULL; PyObject *__pyx_t_1 = NULL; __Pyx_RefNannySetupContext("PyArray_MultiIterNew5"); /* "numpy.pxd":769 * * cdef inline object PyArray_MultiIterNew5(a, b, c, d, e): * return PyArray_MultiIterNew(5, a, b, c, d, e) # <<<<<<<<<<<<<< * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: */ __Pyx_XDECREF(__pyx_r); __pyx_t_1 = PyArray_MultiIterNew(5, ((void *)__pyx_v_a), ((void *)__pyx_v_b), ((void *)__pyx_v_c), ((void *)__pyx_v_d), ((void *)__pyx_v_e)); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 769; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); __pyx_r = __pyx_t_1; __pyx_t_1 = 0; goto __pyx_L0; __pyx_r = Py_None; __Pyx_INCREF(Py_None); goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); __Pyx_AddTraceback("numpy.PyArray_MultiIterNew5"); __pyx_r = 0; __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":771 * return PyArray_MultiIterNew(5, a, b, c, d, e) * * cdef inline char* _util_dtypestring(dtype descr, char* f, char* end, int* offset) except NULL: # <<<<<<<<<<<<<< * # Recursive utility function used in __getbuffer__ to get format * # string. The new location in the format string is returned. */ static CYTHON_INLINE char *__pyx_f_5numpy__util_dtypestring(PyArray_Descr *__pyx_v_descr, char *__pyx_v_f, char *__pyx_v_end, int *__pyx_v_offset) { PyArray_Descr *__pyx_v_child; int __pyx_v_endian_detector; int __pyx_v_little_endian; PyObject *__pyx_v_fields; PyObject *__pyx_v_childname; PyObject *__pyx_v_new_offset; PyObject *__pyx_v_t; char *__pyx_r; Py_ssize_t __pyx_t_1; PyObject *__pyx_t_2 = NULL; PyObject *__pyx_t_3 = NULL; PyObject *__pyx_t_4 = NULL; PyObject *__pyx_t_5 = NULL; int __pyx_t_6; int __pyx_t_7; int __pyx_t_8; int __pyx_t_9; long __pyx_t_10; char *__pyx_t_11; __Pyx_RefNannySetupContext("_util_dtypestring"); __pyx_v_child = ((PyArray_Descr *)Py_None); __Pyx_INCREF(Py_None); __pyx_v_fields = ((PyObject*)Py_None); __Pyx_INCREF(Py_None); __pyx_v_childname = Py_None; __Pyx_INCREF(Py_None); __pyx_v_new_offset = Py_None; __Pyx_INCREF(Py_None); __pyx_v_t = Py_None; __Pyx_INCREF(Py_None); /* "numpy.pxd":778 * cdef int delta_offset * cdef tuple i * cdef int endian_detector = 1 # <<<<<<<<<<<<<< * cdef bint little_endian = ((&endian_detector)[0] != 0) * cdef tuple fields */ __pyx_v_endian_detector = 1; /* "numpy.pxd":779 * cdef tuple i * cdef int endian_detector = 1 * cdef bint little_endian = ((&endian_detector)[0] != 0) # <<<<<<<<<<<<<< * cdef tuple fields * */ __pyx_v_little_endian = ((((char *)(&__pyx_v_endian_detector))[0]) != 0); /* "numpy.pxd":782 * cdef tuple fields * * for childname in descr.names: # <<<<<<<<<<<<<< * fields = descr.fields[childname] * child, new_offset = fields */ if (unlikely(__pyx_v_descr->names == Py_None)) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 782; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_t_1 = 0; __pyx_t_2 = ((PyObject *)__pyx_v_descr->names); __Pyx_INCREF(__pyx_t_2); for (;;) { if (__pyx_t_1 >= PyTuple_GET_SIZE(__pyx_t_2)) break; __pyx_t_3 = PyTuple_GET_ITEM(__pyx_t_2, __pyx_t_1); __Pyx_INCREF(__pyx_t_3); __pyx_t_1++; __Pyx_DECREF(__pyx_v_childname); __pyx_v_childname = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":783 * * for childname in descr.names: * fields = descr.fields[childname] # <<<<<<<<<<<<<< * child, new_offset = fields * */ __pyx_t_3 = PyObject_GetItem(__pyx_v_descr->fields, __pyx_v_childname); if (!__pyx_t_3) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); if (!(likely(PyTuple_CheckExact(__pyx_t_3))||((__pyx_t_3) == Py_None)||(PyErr_Format(PyExc_TypeError, "Expected tuple, got %.200s", Py_TYPE(__pyx_t_3)->tp_name), 0))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 783; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_v_fields)); __pyx_v_fields = ((PyObject*)__pyx_t_3); __pyx_t_3 = 0; /* "numpy.pxd":784 * for childname in descr.names: * fields = descr.fields[childname] * child, new_offset = fields # <<<<<<<<<<<<<< * * if (end - f) - (new_offset - offset[0]) < 15: */ if (likely(((PyObject *)__pyx_v_fields) != Py_None) && likely(PyTuple_GET_SIZE(((PyObject *)__pyx_v_fields)) == 2)) { PyObject* tuple = ((PyObject *)__pyx_v_fields); __pyx_t_3 = PyTuple_GET_ITEM(tuple, 0); __Pyx_INCREF(__pyx_t_3); if (!(likely(((__pyx_t_3) == Py_None) || likely(__Pyx_TypeTest(__pyx_t_3, __pyx_ptype_5numpy_dtype))))) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_t_4 = PyTuple_GET_ITEM(tuple, 1); __Pyx_INCREF(__pyx_t_4); __Pyx_DECREF(((PyObject *)__pyx_v_child)); __pyx_v_child = ((PyArray_Descr *)__pyx_t_3); __pyx_t_3 = 0; __Pyx_DECREF(__pyx_v_new_offset); __pyx_v_new_offset = __pyx_t_4; __pyx_t_4 = 0; } else { __Pyx_UnpackTupleError(((PyObject *)__pyx_v_fields), 2); {__pyx_filename = __pyx_f[1]; __pyx_lineno = 784; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } /* "numpy.pxd":786 * child, new_offset = fields * * if (end - f) - (new_offset - offset[0]) < 15: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * */ __pyx_t_4 = PyInt_FromLong((__pyx_v_end - __pyx_v_f)); if (unlikely(!__pyx_t_4)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_4); __pyx_t_3 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyNumber_Subtract(__pyx_v_new_offset, __pyx_t_3); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_3 = PyNumber_Subtract(__pyx_t_4, __pyx_t_5); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_4); __pyx_t_4 = 0; __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_5 = PyObject_RichCompare(__pyx_t_3, __pyx_int_15, Py_LT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 786; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { /* "numpy.pxd":787 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == '>' and little_endian) or */ __pyx_t_5 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_13), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L5; } __pyx_L5:; /* "numpy.pxd":789 * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") * * if ((child.byteorder == '>' and little_endian) or # <<<<<<<<<<<<<< * (child.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") */ __pyx_t_6 = (__pyx_v_child->byteorder == '>'); if (__pyx_t_6) { __pyx_t_7 = __pyx_v_little_endian; } else { __pyx_t_7 = __pyx_t_6; } if (!__pyx_t_7) { /* "numpy.pxd":790 * * if ((child.byteorder == '>' and little_endian) or * (child.byteorder == '<' and not little_endian)): # <<<<<<<<<<<<<< * raise ValueError(u"Non-native byte order not supported") * # One could encode it in the format string and have Cython */ __pyx_t_6 = (__pyx_v_child->byteorder == '<'); if (__pyx_t_6) { __pyx_t_8 = (!__pyx_v_little_endian); __pyx_t_9 = __pyx_t_8; } else { __pyx_t_9 = __pyx_t_6; } __pyx_t_6 = __pyx_t_9; } else { __pyx_t_6 = __pyx_t_7; } if (__pyx_t_6) { /* "numpy.pxd":791 * if ((child.byteorder == '>' and little_endian) or * (child.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_k_tuple_14), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_Raise(__pyx_t_5, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L6; } __pyx_L6:; /* "numpy.pxd":801 * * # Output padding bytes * while offset[0] < new_offset: # <<<<<<<<<<<<<< * f[0] = 120 # "x"; pad byte * f += 1 */ while (1) { __pyx_t_5 = PyInt_FromLong((__pyx_v_offset[0])); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_t_5, __pyx_v_new_offset, Py_LT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 801; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (!__pyx_t_6) break; /* "numpy.pxd":802 * # Output padding bytes * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte # <<<<<<<<<<<<<< * f += 1 * offset[0] += 1 */ (__pyx_v_f[0]) = 120; /* "numpy.pxd":803 * while offset[0] < new_offset: * f[0] = 120 # "x"; pad byte * f += 1 # <<<<<<<<<<<<<< * offset[0] += 1 * */ __pyx_v_f = (__pyx_v_f + 1); /* "numpy.pxd":804 * f[0] = 120 # "x"; pad byte * f += 1 * offset[0] += 1 # <<<<<<<<<<<<<< * * offset[0] += child.itemsize */ __pyx_t_10 = 0; (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + 1); } /* "numpy.pxd":806 * offset[0] += 1 * * offset[0] += child.itemsize # <<<<<<<<<<<<<< * * if not PyDataType_HASFIELDS(child): */ __pyx_t_10 = 0; (__pyx_v_offset[__pyx_t_10]) = ((__pyx_v_offset[__pyx_t_10]) + __pyx_v_child->elsize); /* "numpy.pxd":808 * offset[0] += child.itemsize * * if not PyDataType_HASFIELDS(child): # <<<<<<<<<<<<<< * t = child.type_num * if end - f < 5: */ __pyx_t_6 = (!PyDataType_HASFIELDS(__pyx_v_child)); if (__pyx_t_6) { /* "numpy.pxd":809 * * if not PyDataType_HASFIELDS(child): * t = child.type_num # <<<<<<<<<<<<<< * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") */ __pyx_t_3 = PyInt_FromLong(__pyx_v_child->type_num); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 809; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_v_t); __pyx_v_t = __pyx_t_3; __pyx_t_3 = 0; /* "numpy.pxd":810 * if not PyDataType_HASFIELDS(child): * t = child.type_num * if end - f < 5: # <<<<<<<<<<<<<< * raise RuntimeError(u"Format string allocated too short.") * */ __pyx_t_6 = ((__pyx_v_end - __pyx_v_f) < 5); if (__pyx_t_6) { /* "numpy.pxd":811 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_t_3 = PyObject_Call(__pyx_builtin_RuntimeError, ((PyObject *)__pyx_k_tuple_16), NULL); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_Raise(__pyx_t_3, 0, 0); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;} goto __pyx_L10; } __pyx_L10:; /* "numpy.pxd":814 * * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" # <<<<<<<<<<<<<< * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" */ __pyx_t_3 = PyInt_FromLong(NPY_BYTE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 814; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 98; goto __pyx_L11; } /* "numpy.pxd":815 * # Until ticket #99 is fixed, use integers to avoid warnings * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" # <<<<<<<<<<<<<< * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" */ __pyx_t_5 = PyInt_FromLong(NPY_UBYTE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 815; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 66; goto __pyx_L11; } /* "numpy.pxd":816 * if t == NPY_BYTE: f[0] = 98 #"b" * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" # <<<<<<<<<<<<<< * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" */ __pyx_t_3 = PyInt_FromLong(NPY_SHORT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 816; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 104; goto __pyx_L11; } /* "numpy.pxd":817 * elif t == NPY_UBYTE: f[0] = 66 #"B" * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" # <<<<<<<<<<<<<< * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" */ __pyx_t_5 = PyInt_FromLong(NPY_USHORT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 817; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 72; goto __pyx_L11; } /* "numpy.pxd":818 * elif t == NPY_SHORT: f[0] = 104 #"h" * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" # <<<<<<<<<<<<<< * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" */ __pyx_t_3 = PyInt_FromLong(NPY_INT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 818; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 105; goto __pyx_L11; } /* "numpy.pxd":819 * elif t == NPY_USHORT: f[0] = 72 #"H" * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" # <<<<<<<<<<<<<< * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" */ __pyx_t_5 = PyInt_FromLong(NPY_UINT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 819; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 73; goto __pyx_L11; } /* "numpy.pxd":820 * elif t == NPY_INT: f[0] = 105 #"i" * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" # <<<<<<<<<<<<<< * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" */ __pyx_t_3 = PyInt_FromLong(NPY_LONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 820; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 108; goto __pyx_L11; } /* "numpy.pxd":821 * elif t == NPY_UINT: f[0] = 73 #"I" * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" # <<<<<<<<<<<<<< * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 821; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 76; goto __pyx_L11; } /* "numpy.pxd":822 * elif t == NPY_LONG: f[0] = 108 #"l" * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" # <<<<<<<<<<<<<< * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" */ __pyx_t_3 = PyInt_FromLong(NPY_LONGLONG); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 822; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 113; goto __pyx_L11; } /* "numpy.pxd":823 * elif t == NPY_ULONG: f[0] = 76 #"L" * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" # <<<<<<<<<<<<<< * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" */ __pyx_t_5 = PyInt_FromLong(NPY_ULONGLONG); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 823; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 81; goto __pyx_L11; } /* "numpy.pxd":824 * elif t == NPY_LONGLONG: f[0] = 113 #"q" * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" # <<<<<<<<<<<<<< * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" */ __pyx_t_3 = PyInt_FromLong(NPY_FLOAT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 824; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 102; goto __pyx_L11; } /* "numpy.pxd":825 * elif t == NPY_ULONGLONG: f[0] = 81 #"Q" * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" # <<<<<<<<<<<<<< * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf */ __pyx_t_5 = PyInt_FromLong(NPY_DOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 825; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 100; goto __pyx_L11; } /* "numpy.pxd":826 * elif t == NPY_FLOAT: f[0] = 102 #"f" * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" # <<<<<<<<<<<<<< * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd */ __pyx_t_3 = PyInt_FromLong(NPY_LONGDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 826; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 103; goto __pyx_L11; } /* "numpy.pxd":827 * elif t == NPY_DOUBLE: f[0] = 100 #"d" * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf # <<<<<<<<<<<<<< * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg */ __pyx_t_5 = PyInt_FromLong(NPY_CFLOAT); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 827; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 102; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /* "numpy.pxd":828 * elif t == NPY_LONGDOUBLE: f[0] = 103 #"g" * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd # <<<<<<<<<<<<<< * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" */ __pyx_t_3 = PyInt_FromLong(NPY_CDOUBLE); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 828; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 100; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /* "numpy.pxd":829 * elif t == NPY_CFLOAT: f[0] = 90; f[1] = 102; f += 1 # Zf * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg # <<<<<<<<<<<<<< * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: */ __pyx_t_5 = PyInt_FromLong(NPY_CLONGDOUBLE); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __pyx_t_3 = PyObject_RichCompare(__pyx_v_t, __pyx_t_5, Py_EQ); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_3); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 829; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 90; (__pyx_v_f[1]) = 103; __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L11; } /* "numpy.pxd":830 * elif t == NPY_CDOUBLE: f[0] = 90; f[1] = 100; f += 1 # Zd * elif t == NPY_CLONGDOUBLE: f[0] = 90; f[1] = 103; f += 1 # Zg * elif t == NPY_OBJECT: f[0] = 79 #"O" # <<<<<<<<<<<<<< * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) */ __pyx_t_3 = PyInt_FromLong(NPY_OBJECT); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_3); __pyx_t_5 = PyObject_RichCompare(__pyx_v_t, __pyx_t_3, Py_EQ); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(__pyx_t_3); __pyx_t_3 = 0; __pyx_t_6 = __Pyx_PyObject_IsTrue(__pyx_t_5); if (unlikely(__pyx_t_6 < 0)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 830; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; if (__pyx_t_6) { (__pyx_v_f[0]) = 79; goto __pyx_L11; } /*else*/ { /* "numpy.pxd":832 * elif t == NPY_OBJECT: f[0] = 79 #"O" * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) # <<<<<<<<<<<<<< * f += 1 * else: */ __pyx_t_5 = PyNumber_Remainder(((PyObject *)__pyx_kp_u_11), __pyx_v_t); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_5)); __pyx_t_3 = PyTuple_New(1); if (unlikely(!__pyx_t_3)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_3)); PyTuple_SET_ITEM(__pyx_t_3, 0, ((PyObject *)__pyx_t_5)); __Pyx_GIVEREF(((PyObject *)__pyx_t_5)); __pyx_t_5 = 0; __pyx_t_5 = PyObject_Call(__pyx_builtin_ValueError, ((PyObject *)__pyx_t_3), NULL); if (unlikely(!__pyx_t_5)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_5); __Pyx_DECREF(((PyObject *)__pyx_t_3)); __pyx_t_3 = 0; __Pyx_Raise(__pyx_t_5, 0, 0); __Pyx_DECREF(__pyx_t_5); __pyx_t_5 = 0; {__pyx_filename = __pyx_f[1]; __pyx_lineno = 832; __pyx_clineno = __LINE__; goto __pyx_L1_error;} } __pyx_L11:; /* "numpy.pxd":833 * else: * raise ValueError(u"unknown dtype code in numpy.pxd (%d)" % t) * f += 1 # <<<<<<<<<<<<<< * else: * # Cython ignores struct boundary information ("T{...}"), */ __pyx_v_f = (__pyx_v_f + 1); goto __pyx_L9; } /*else*/ { /* "numpy.pxd":837 * # Cython ignores struct boundary information ("T{...}"), * # so don't output it * f = _util_dtypestring(child, f, end, offset) # <<<<<<<<<<<<<< * return f * */ __pyx_t_11 = __pyx_f_5numpy__util_dtypestring(__pyx_v_child, __pyx_v_f, __pyx_v_end, __pyx_v_offset); if (unlikely(__pyx_t_11 == NULL)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 837; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_v_f = __pyx_t_11; } __pyx_L9:; } __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "numpy.pxd":838 * # so don't output it * f = _util_dtypestring(child, f, end, offset) * return f # <<<<<<<<<<<<<< * * */ __pyx_r = __pyx_v_f; goto __pyx_L0; __pyx_r = 0; goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_2); __Pyx_XDECREF(__pyx_t_3); __Pyx_XDECREF(__pyx_t_4); __Pyx_XDECREF(__pyx_t_5); __Pyx_AddTraceback("numpy._util_dtypestring"); __pyx_r = NULL; __pyx_L0:; __Pyx_DECREF((PyObject *)__pyx_v_child); __Pyx_DECREF(__pyx_v_fields); __Pyx_DECREF(__pyx_v_childname); __Pyx_DECREF(__pyx_v_new_offset); __Pyx_DECREF(__pyx_v_t); __Pyx_RefNannyFinishContext(); return __pyx_r; } /* "numpy.pxd":953 * * * cdef inline void set_array_base(ndarray arr, object base): # <<<<<<<<<<<<<< * cdef PyObject* baseptr * if base is None: */ static CYTHON_INLINE void __pyx_f_5numpy_set_array_base(PyArrayObject *__pyx_v_arr, PyObject *__pyx_v_base) { PyObject *__pyx_v_baseptr; int __pyx_t_1; PyObject *__pyx_t_2 = NULL; __Pyx_RefNannySetupContext("set_array_base"); /* "numpy.pxd":955 * cdef inline void set_array_base(ndarray arr, object base): * cdef PyObject* baseptr * if base is None: # <<<<<<<<<<<<<< * baseptr = NULL * else: */ __pyx_t_1 = (__pyx_v_base == Py_None); if (__pyx_t_1) { /* "numpy.pxd":956 * cdef PyObject* baseptr * if base is None: * baseptr = NULL # <<<<<<<<<<<<<< * else: * Py_INCREF(base) # important to do this before decref below! */ __pyx_v_baseptr = NULL; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":958 * baseptr = NULL * else: * Py_INCREF(base) # important to do this before decref below! # <<<<<<<<<<<<<< * baseptr = base * Py_XDECREF(arr.base) */ __pyx_t_2 = __pyx_v_base; __Pyx_INCREF(__pyx_t_2); Py_INCREF(__pyx_t_2); __Pyx_DECREF(__pyx_t_2); __pyx_t_2 = 0; /* "numpy.pxd":959 * else: * Py_INCREF(base) # important to do this before decref below! * baseptr = base # <<<<<<<<<<<<<< * Py_XDECREF(arr.base) * arr.base = baseptr */ __pyx_v_baseptr = ((PyObject *)__pyx_v_base); } __pyx_L3:; /* "numpy.pxd":960 * Py_INCREF(base) # important to do this before decref below! * baseptr = base * Py_XDECREF(arr.base) # <<<<<<<<<<<<<< * arr.base = baseptr * */ Py_XDECREF(__pyx_v_arr->base); /* "numpy.pxd":961 * baseptr = base * Py_XDECREF(arr.base) * arr.base = baseptr # <<<<<<<<<<<<<< * * cdef inline object get_array_base(ndarray arr): */ __pyx_v_arr->base = __pyx_v_baseptr; __Pyx_RefNannyFinishContext(); } /* "numpy.pxd":963 * arr.base = baseptr * * cdef inline object get_array_base(ndarray arr): # <<<<<<<<<<<<<< * if arr.base is NULL: * return None */ static CYTHON_INLINE PyObject *__pyx_f_5numpy_get_array_base(PyArrayObject *__pyx_v_arr) { PyObject *__pyx_r = NULL; int __pyx_t_1; __Pyx_RefNannySetupContext("get_array_base"); /* "numpy.pxd":964 * * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: # <<<<<<<<<<<<<< * return None * else: */ __pyx_t_1 = (__pyx_v_arr->base == NULL); if (__pyx_t_1) { /* "numpy.pxd":965 * cdef inline object get_array_base(ndarray arr): * if arr.base is NULL: * return None # <<<<<<<<<<<<<< * else: * return arr.base */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(Py_None); __pyx_r = Py_None; goto __pyx_L0; goto __pyx_L3; } /*else*/ { /* "numpy.pxd":967 * return None * else: * return arr.base # <<<<<<<<<<<<<< */ __Pyx_XDECREF(__pyx_r); __Pyx_INCREF(((PyObject *)__pyx_v_arr->base)); __pyx_r = ((PyObject *)__pyx_v_arr->base); goto __pyx_L0; } __pyx_L3:; __pyx_r = Py_None; __Pyx_INCREF(Py_None); __pyx_L0:; __Pyx_XGIVEREF(__pyx_r); __Pyx_RefNannyFinishContext(); return __pyx_r; } static PyMethodDef __pyx_methods[] = { {0, 0, 0, 0} }; #if PY_MAJOR_VERSION >= 3 static struct PyModuleDef __pyx_moduledef = { PyModuleDef_HEAD_INIT, __Pyx_NAMESTR("wrapper_inner"), 0, /* m_doc */ -1, /* m_size */ __pyx_methods /* m_methods */, NULL, /* m_reload */ NULL, /* m_traverse */ NULL, /* m_clear */ NULL /* m_free */ }; #endif static __Pyx_StringTabEntry __pyx_string_tab[] = { {&__pyx_kp_s_1, __pyx_k_1, sizeof(__pyx_k_1), 0, 0, 1, 0}, {&__pyx_kp_u_11, __pyx_k_11, sizeof(__pyx_k_11), 0, 1, 0, 0}, {&__pyx_kp_u_12, __pyx_k_12, sizeof(__pyx_k_12), 0, 1, 0, 0}, {&__pyx_kp_u_15, __pyx_k_15, sizeof(__pyx_k_15), 0, 1, 0, 0}, {&__pyx_kp_s_2, __pyx_k_2, sizeof(__pyx_k_2), 0, 0, 1, 0}, {&__pyx_kp_s_3, __pyx_k_3, sizeof(__pyx_k_3), 0, 0, 1, 0}, {&__pyx_kp_u_5, __pyx_k_5, sizeof(__pyx_k_5), 0, 1, 0, 0}, {&__pyx_kp_u_7, __pyx_k_7, sizeof(__pyx_k_7), 0, 1, 0, 0}, {&__pyx_kp_u_9, __pyx_k_9, sizeof(__pyx_k_9), 0, 1, 0, 0}, {&__pyx_n_s__RuntimeError, __pyx_k__RuntimeError, sizeof(__pyx_k__RuntimeError), 0, 0, 1, 1}, {&__pyx_n_s__ValueError, __pyx_k__ValueError, sizeof(__pyx_k__ValueError), 0, 0, 1, 1}, {&__pyx_n_s____main__, __pyx_k____main__, sizeof(__pyx_k____main__), 0, 0, 1, 1}, {&__pyx_n_s____test__, __pyx_k____test__, sizeof(__pyx_k____test__), 0, 0, 1, 1}, {&__pyx_n_s__base, __pyx_k__base, sizeof(__pyx_k__base), 0, 0, 1, 1}, {&__pyx_n_s__buf, __pyx_k__buf, sizeof(__pyx_k__buf), 0, 0, 1, 1}, {&__pyx_n_s__byteorder, __pyx_k__byteorder, sizeof(__pyx_k__byteorder), 0, 0, 1, 1}, {&__pyx_n_s__descr, __pyx_k__descr, sizeof(__pyx_k__descr), 0, 0, 1, 1}, {&__pyx_n_s__do_awesome_work, __pyx_k__do_awesome_work, sizeof(__pyx_k__do_awesome_work), 0, 0, 1, 1}, {&__pyx_n_s__fields, __pyx_k__fields, sizeof(__pyx_k__fields), 0, 0, 1, 1}, {&__pyx_n_s__format, __pyx_k__format, sizeof(__pyx_k__format), 0, 0, 1, 1}, {&__pyx_n_s__itemsize, __pyx_k__itemsize, sizeof(__pyx_k__itemsize), 0, 0, 1, 1}, {&__pyx_n_s__names, __pyx_k__names, sizeof(__pyx_k__names), 0, 0, 1, 1}, {&__pyx_n_s__ndim, __pyx_k__ndim, sizeof(__pyx_k__ndim), 0, 0, 1, 1}, {&__pyx_n_s__np, __pyx_k__np, sizeof(__pyx_k__np), 0, 0, 1, 1}, {&__pyx_n_s__numpy, __pyx_k__numpy, sizeof(__pyx_k__numpy), 0, 0, 1, 1}, {&__pyx_n_s__obj, __pyx_k__obj, sizeof(__pyx_k__obj), 0, 0, 1, 1}, {&__pyx_n_s__ones, __pyx_k__ones, sizeof(__pyx_k__ones), 0, 0, 1, 1}, {&__pyx_n_s__pure_py_test, __pyx_k__pure_py_test, sizeof(__pyx_k__pure_py_test), 0, 0, 1, 1}, {&__pyx_n_s__range, __pyx_k__range, sizeof(__pyx_k__range), 0, 0, 1, 1}, {&__pyx_n_s__readonly, __pyx_k__readonly, sizeof(__pyx_k__readonly), 0, 0, 1, 1}, {&__pyx_n_s__shape, __pyx_k__shape, sizeof(__pyx_k__shape), 0, 0, 1, 1}, {&__pyx_n_s__strides, __pyx_k__strides, sizeof(__pyx_k__strides), 0, 0, 1, 1}, {&__pyx_n_s__suboffsets, __pyx_k__suboffsets, sizeof(__pyx_k__suboffsets), 0, 0, 1, 1}, {&__pyx_n_s__type_num, __pyx_k__type_num, sizeof(__pyx_k__type_num), 0, 0, 1, 1}, {&__pyx_n_s__work_module, __pyx_k__work_module, sizeof(__pyx_k__work_module), 0, 0, 1, 1}, {&__pyx_n_s__wrapper_inner, __pyx_k__wrapper_inner, sizeof(__pyx_k__wrapper_inner), 0, 0, 1, 1}, {0, 0, 0, 0, 0, 0, 0} }; static int __Pyx_InitCachedBuiltins(void) { __pyx_builtin_ValueError = __Pyx_GetName(__pyx_b, __pyx_n_s__ValueError); if (!__pyx_builtin_ValueError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_range = __Pyx_GetName(__pyx_b, __pyx_n_s__range); if (!__pyx_builtin_range) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 219; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_builtin_RuntimeError = __Pyx_GetName(__pyx_b, __pyx_n_s__RuntimeError); if (!__pyx_builtin_RuntimeError) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;} return 0; __pyx_L1_error:; return -1; } static int __Pyx_InitCachedConstants(void) { __Pyx_RefNannySetupContext("__Pyx_InitCachedConstants"); /* "wrapper_inner.pyx":68 * print('\nHello from a pure Python function inside the Cython module.') * * data = np.ones(5) # <<<<<<<<<<<<<< * work_module.do_awesome_work(data) */ __pyx_k_tuple_4 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_4)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 68; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_4)); __Pyx_INCREF(__pyx_int_5); PyTuple_SET_ITEM(__pyx_k_tuple_4, 0, __pyx_int_5); __Pyx_GIVEREF(__pyx_int_5); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_4)); /* "numpy.pxd":206 * if ((flags & pybuf.PyBUF_C_CONTIGUOUS == pybuf.PyBUF_C_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_C_CONTIGUOUS)): * raise ValueError(u"ndarray is not C contiguous") # <<<<<<<<<<<<<< * * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) */ __pyx_k_tuple_6 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_6)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 206; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_6)); __Pyx_INCREF(((PyObject *)__pyx_kp_u_5)); PyTuple_SET_ITEM(__pyx_k_tuple_6, 0, ((PyObject *)__pyx_kp_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_5)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_6)); /* "numpy.pxd":210 * if ((flags & pybuf.PyBUF_F_CONTIGUOUS == pybuf.PyBUF_F_CONTIGUOUS) * and not PyArray_CHKFLAGS(self, NPY_F_CONTIGUOUS)): * raise ValueError(u"ndarray is not Fortran contiguous") # <<<<<<<<<<<<<< * * info.buf = PyArray_DATA(self) */ __pyx_k_tuple_8 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_8)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 210; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_8)); __Pyx_INCREF(((PyObject *)__pyx_kp_u_7)); PyTuple_SET_ITEM(__pyx_k_tuple_8, 0, ((PyObject *)__pyx_kp_u_7)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_7)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_8)); /* "numpy.pxd":248 * if ((descr.byteorder == '>' and little_endian) or * (descr.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * if t == NPY_BYTE: f = "b" * elif t == NPY_UBYTE: f = "B" */ __pyx_k_tuple_10 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_10)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 248; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_10)); __Pyx_INCREF(((PyObject *)__pyx_kp_u_9)); PyTuple_SET_ITEM(__pyx_k_tuple_10, 0, ((PyObject *)__pyx_kp_u_9)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_10)); /* "numpy.pxd":787 * * if (end - f) - (new_offset - offset[0]) < 15: * raise RuntimeError(u"Format string allocated too short, see comment in numpy.pxd") # <<<<<<<<<<<<<< * * if ((child.byteorder == '>' and little_endian) or */ __pyx_k_tuple_13 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_13)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 787; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_13)); __Pyx_INCREF(((PyObject *)__pyx_kp_u_12)); PyTuple_SET_ITEM(__pyx_k_tuple_13, 0, ((PyObject *)__pyx_kp_u_12)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_12)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_13)); /* "numpy.pxd":791 * if ((child.byteorder == '>' and little_endian) or * (child.byteorder == '<' and not little_endian)): * raise ValueError(u"Non-native byte order not supported") # <<<<<<<<<<<<<< * # One could encode it in the format string and have Cython * # complain instead, BUT: < and > in format strings also imply */ __pyx_k_tuple_14 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_14)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 791; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_14)); __Pyx_INCREF(((PyObject *)__pyx_kp_u_9)); PyTuple_SET_ITEM(__pyx_k_tuple_14, 0, ((PyObject *)__pyx_kp_u_9)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_9)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_14)); /* "numpy.pxd":811 * t = child.type_num * if end - f < 5: * raise RuntimeError(u"Format string allocated too short.") # <<<<<<<<<<<<<< * * # Until ticket #99 is fixed, use integers to avoid warnings */ __pyx_k_tuple_16 = PyTuple_New(1); if (unlikely(!__pyx_k_tuple_16)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 811; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_k_tuple_16)); __Pyx_INCREF(((PyObject *)__pyx_kp_u_15)); PyTuple_SET_ITEM(__pyx_k_tuple_16, 0, ((PyObject *)__pyx_kp_u_15)); __Pyx_GIVEREF(((PyObject *)__pyx_kp_u_15)); __Pyx_GIVEREF(((PyObject *)__pyx_k_tuple_16)); __Pyx_RefNannyFinishContext(); return 0; __pyx_L1_error:; __Pyx_RefNannyFinishContext(); return -1; } static int __Pyx_InitGlobals(void) { if (__Pyx_InitStrings(__pyx_string_tab) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_5 = PyInt_FromLong(5); if (unlikely(!__pyx_int_5)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; __pyx_int_15 = PyInt_FromLong(15); if (unlikely(!__pyx_int_15)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; return 0; __pyx_L1_error:; return -1; } #if PY_MAJOR_VERSION < 3 PyMODINIT_FUNC initwrapper_inner(void); /*proto*/ PyMODINIT_FUNC initwrapper_inner(void) #else PyMODINIT_FUNC PyInit_wrapper_inner(void); /*proto*/ PyMODINIT_FUNC PyInit_wrapper_inner(void) #endif { PyObject *__pyx_t_1 = NULL; #if CYTHON_REFNANNY void* __pyx_refnanny = NULL; __Pyx_RefNanny = __Pyx_RefNannyImportAPI("refnanny"); if (!__Pyx_RefNanny) { PyErr_Clear(); __Pyx_RefNanny = __Pyx_RefNannyImportAPI("Cython.Runtime.refnanny"); if (!__Pyx_RefNanny) Py_FatalError("failed to import 'refnanny' module"); } __pyx_refnanny = __Pyx_RefNanny->SetupContext("PyMODINIT_FUNC PyInit_wrapper_inner(void)", __LINE__, __FILE__); #endif __pyx_empty_tuple = PyTuple_New(0); if (unlikely(!__pyx_empty_tuple)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_empty_bytes = PyBytes_FromStringAndSize("", 0); if (unlikely(!__pyx_empty_bytes)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #ifdef __pyx_binding_PyCFunctionType_USED if (__pyx_binding_PyCFunctionType_init() < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} #endif /*--- Library function declarations ---*/ /*--- Threads initialization code ---*/ #if defined(__PYX_FORCE_INIT_THREADS) && __PYX_FORCE_INIT_THREADS #ifdef WITH_THREAD /* Python build with threading support? */ PyEval_InitThreads(); #endif #endif /*--- Module creation code ---*/ #if PY_MAJOR_VERSION < 3 __pyx_m = Py_InitModule4(__Pyx_NAMESTR("wrapper_inner"), __pyx_methods, 0, 0, PYTHON_API_VERSION); #else __pyx_m = PyModule_Create(&__pyx_moduledef); #endif if (!__pyx_m) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; #if PY_MAJOR_VERSION < 3 Py_INCREF(__pyx_m); #endif __pyx_b = PyImport_AddModule(__Pyx_NAMESTR(__Pyx_BUILTIN_MODULE_NAME)); if (!__pyx_b) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; if (__Pyx_SetAttrString(__pyx_m, "__builtins__", __pyx_b) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; /*--- Initialize various global constants etc. ---*/ if (unlikely(__Pyx_InitGlobals() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__pyx_module_is_main_wrapper_inner) { if (__Pyx_SetAttrString(__pyx_m, "__name__", __pyx_n_s____main__) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;}; } /*--- Builtin init code ---*/ if (unlikely(__Pyx_InitCachedBuiltins() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Constants init code ---*/ if (unlikely(__Pyx_InitCachedConstants() < 0)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Global init code ---*/ /*--- Function export code ---*/ if (__Pyx_ExportFunction("inner_work_1d", (void (*)(void))inner_work_1d, "void (int, double *, double *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} if (__Pyx_ExportFunction("inner_work_2d", (void (*)(void))inner_work_2d, "void (int, int, double *, double *)") < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Type init code ---*/ /*--- Type import code ---*/ __pyx_ptype_5numpy_dtype = __Pyx_ImportType("numpy", "dtype", sizeof(PyArray_Descr), 0); if (unlikely(!__pyx_ptype_5numpy_dtype)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 149; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_flatiter = __Pyx_ImportType("numpy", "flatiter", sizeof(PyArrayIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_flatiter)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 159; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_broadcast = __Pyx_ImportType("numpy", "broadcast", sizeof(PyArrayMultiIterObject), 0); if (unlikely(!__pyx_ptype_5numpy_broadcast)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 163; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ndarray = __Pyx_ImportType("numpy", "ndarray", sizeof(PyArrayObject), 0); if (unlikely(!__pyx_ptype_5numpy_ndarray)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 172; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __pyx_ptype_5numpy_ufunc = __Pyx_ImportType("numpy", "ufunc", sizeof(PyUFuncObject), 0); if (unlikely(!__pyx_ptype_5numpy_ufunc)) {__pyx_filename = __pyx_f[1]; __pyx_lineno = 849; __pyx_clineno = __LINE__; goto __pyx_L1_error;} /*--- Function import code ---*/ /*--- Execution code ---*/ /* "wrapper_inner.pyx":2 * * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np * */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__numpy), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__np, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "wrapper_inner.pyx":5 * cimport numpy as np * * np.import_array() # <<<<<<<<<<<<<< * * from libcpp.vector cimport vector */ import_array(); /* "wrapper_inner.pyx":9 * from libcpp.vector cimport vector * * import work_module # <<<<<<<<<<<<<< * * # Declare any Numpy C-API functions that I want to use. */ __pyx_t_1 = __Pyx_Import(((PyObject *)__pyx_n_s__work_module), 0); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__work_module, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 9; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "wrapper_inner.pyx":64 * * * def pure_py_test(): # <<<<<<<<<<<<<< * * print('\nHello from a pure Python function inside the Cython module.') */ __pyx_t_1 = PyCFunction_NewEx(&__pyx_mdef_13wrapper_inner_pure_py_test, NULL, __pyx_n_s__wrapper_inner); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(__pyx_t_1); if (PyObject_SetAttr(__pyx_m, __pyx_n_s__pure_py_test, __pyx_t_1) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 64; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(__pyx_t_1); __pyx_t_1 = 0; /* "wrapper_inner.pyx":2 * * import numpy as np # <<<<<<<<<<<<<< * cimport numpy as np * */ __pyx_t_1 = PyDict_New(); if (unlikely(!__pyx_t_1)) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_GOTREF(((PyObject *)__pyx_t_1)); if (PyObject_SetAttr(__pyx_m, __pyx_n_s____test__, ((PyObject *)__pyx_t_1)) < 0) {__pyx_filename = __pyx_f[0]; __pyx_lineno = 2; __pyx_clineno = __LINE__; goto __pyx_L1_error;} __Pyx_DECREF(((PyObject *)__pyx_t_1)); __pyx_t_1 = 0; /* "libc\stdio.pxd":1 * # 7.19 Input/output # <<<<<<<<<<<<<< * * cdef extern from *: */ goto __pyx_L0; __pyx_L1_error:; __Pyx_XDECREF(__pyx_t_1); if (__pyx_m) { __Pyx_AddTraceback("init wrapper_inner"); Py_DECREF(__pyx_m); __pyx_m = 0; } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_ImportError, "init wrapper_inner"); } __pyx_L0:; __Pyx_RefNannyFinishContext(); #if PY_MAJOR_VERSION < 3 return; #else return __pyx_m; #endif } /* Runtime support code */ static CYTHON_INLINE int __Pyx_TypeTest(PyObject *obj, PyTypeObject *type) { if (unlikely(!type)) { PyErr_Format(PyExc_SystemError, "Missing type object"); return 0; } if (likely(PyObject_TypeCheck(obj, type))) return 1; PyErr_Format(PyExc_TypeError, "Cannot convert %.200s to %.200s", Py_TYPE(obj)->tp_name, type->tp_name); return 0; } static PyObject *__Pyx_GetName(PyObject *dict, PyObject *name) { PyObject *result; result = PyObject_GetAttr(dict, name); if (!result) PyErr_SetObject(PyExc_NameError, name); return result; } static CYTHON_INLINE void __Pyx_ErrRestore(PyObject *type, PyObject *value, PyObject *tb) { PyObject *tmp_type, *tmp_value, *tmp_tb; PyThreadState *tstate = PyThreadState_GET(); tmp_type = tstate->curexc_type; tmp_value = tstate->curexc_value; tmp_tb = tstate->curexc_traceback; tstate->curexc_type = type; tstate->curexc_value = value; tstate->curexc_traceback = tb; Py_XDECREF(tmp_type); Py_XDECREF(tmp_value); Py_XDECREF(tmp_tb); } static CYTHON_INLINE void __Pyx_ErrFetch(PyObject **type, PyObject **value, PyObject **tb) { PyThreadState *tstate = PyThreadState_GET(); *type = tstate->curexc_type; *value = tstate->curexc_value; *tb = tstate->curexc_traceback; tstate->curexc_type = 0; tstate->curexc_value = 0; tstate->curexc_traceback = 0; } #if PY_MAJOR_VERSION < 3 static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { Py_XINCREF(type); Py_XINCREF(value); Py_XINCREF(tb); /* First, check the traceback argument, replacing None with NULL. */ if (tb == Py_None) { Py_DECREF(tb); tb = 0; } else if (tb != NULL && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto raise_error; } /* Next, replace a missing value with None */ if (value == NULL) { value = Py_None; Py_INCREF(value); } #if PY_VERSION_HEX < 0x02050000 if (!PyClass_Check(type)) #else if (!PyType_Check(type)) #endif { /* Raising an instance. The value should be a dummy. */ if (value != Py_None) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto raise_error; } /* Normalize to raise , */ Py_DECREF(value); value = type; #if PY_VERSION_HEX < 0x02050000 if (PyInstance_Check(type)) { type = (PyObject*) ((PyInstanceObject*)type)->in_class; Py_INCREF(type); } else { type = 0; PyErr_SetString(PyExc_TypeError, "raise: exception must be an old-style class or instance"); goto raise_error; } #else type = (PyObject*) Py_TYPE(type); Py_INCREF(type); if (!PyType_IsSubtype((PyTypeObject *)type, (PyTypeObject *)PyExc_BaseException)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto raise_error; } #endif } __Pyx_ErrRestore(type, value, tb); return; raise_error: Py_XDECREF(value); Py_XDECREF(type); Py_XDECREF(tb); return; } #else /* Python 3+ */ static void __Pyx_Raise(PyObject *type, PyObject *value, PyObject *tb) { if (tb == Py_None) { tb = 0; } else if (tb && !PyTraceBack_Check(tb)) { PyErr_SetString(PyExc_TypeError, "raise: arg 3 must be a traceback or None"); goto bad; } if (value == Py_None) value = 0; if (PyExceptionInstance_Check(type)) { if (value) { PyErr_SetString(PyExc_TypeError, "instance exception may not have a separate value"); goto bad; } value = type; type = (PyObject*) Py_TYPE(value); } else if (!PyExceptionClass_Check(type)) { PyErr_SetString(PyExc_TypeError, "raise: exception class must be a subclass of BaseException"); goto bad; } PyErr_SetObject(type, value); if (tb) { PyThreadState *tstate = PyThreadState_GET(); PyObject* tmp_tb = tstate->curexc_traceback; if (tb != tmp_tb) { Py_INCREF(tb); tstate->curexc_traceback = tb; Py_XDECREF(tmp_tb); } } bad: return; } #endif static CYTHON_INLINE void __Pyx_RaiseNoneNotIterableError(void) { PyErr_SetString(PyExc_TypeError, "'NoneType' object is not iterable"); } static CYTHON_INLINE void __Pyx_RaiseNeedMoreValuesError(Py_ssize_t index) { PyErr_Format(PyExc_ValueError, #if PY_VERSION_HEX < 0x02050000 "need more than %d value%s to unpack", (int)index, #else "need more than %zd value%s to unpack", index, #endif (index == 1) ? "" : "s"); } static CYTHON_INLINE void __Pyx_RaiseTooManyValuesError(Py_ssize_t expected) { PyErr_Format(PyExc_ValueError, #if PY_VERSION_HEX < 0x02050000 "too many values to unpack (expected %d)", (int)expected); #else "too many values to unpack (expected %zd)", expected); #endif } static void __Pyx_UnpackTupleError(PyObject *t, Py_ssize_t index) { if (t == Py_None) { __Pyx_RaiseNoneNotIterableError(); } else if (PyTuple_GET_SIZE(t) < index) { __Pyx_RaiseNeedMoreValuesError(PyTuple_GET_SIZE(t)); } else { __Pyx_RaiseTooManyValuesError(index); } } static PyObject *__Pyx_Import(PyObject *name, PyObject *from_list) { PyObject *py_import = 0; PyObject *empty_list = 0; PyObject *module = 0; PyObject *global_dict = 0; PyObject *empty_dict = 0; PyObject *list; py_import = __Pyx_GetAttrString(__pyx_b, "__import__"); if (!py_import) goto bad; if (from_list) list = from_list; else { empty_list = PyList_New(0); if (!empty_list) goto bad; list = empty_list; } global_dict = PyModule_GetDict(__pyx_m); if (!global_dict) goto bad; empty_dict = PyDict_New(); if (!empty_dict) goto bad; module = PyObject_CallFunctionObjArgs(py_import, name, global_dict, empty_dict, list, NULL); bad: Py_XDECREF(empty_list); Py_XDECREF(py_import); Py_XDECREF(empty_dict); return module; } #if PY_MAJOR_VERSION < 3 static PyObject *__Pyx_GetStdout(void) { PyObject *f = PySys_GetObject((char *)"stdout"); if (!f) { PyErr_SetString(PyExc_RuntimeError, "lost sys.stdout"); } return f; } static int __Pyx_Print(PyObject* f, PyObject *arg_tuple, int newline) { PyObject* v; int i; if (!f) { if (!(f = __Pyx_GetStdout())) return -1; } for (i=0; i < PyTuple_GET_SIZE(arg_tuple); i++) { if (PyFile_SoftSpace(f, 1)) { if (PyFile_WriteString(" ", f) < 0) return -1; } v = PyTuple_GET_ITEM(arg_tuple, i); if (PyFile_WriteObject(v, f, Py_PRINT_RAW) < 0) return -1; if (PyString_Check(v)) { char *s = PyString_AsString(v); Py_ssize_t len = PyString_Size(v); if (len > 0 && isspace(Py_CHARMASK(s[len-1])) && s[len-1] != ' ') PyFile_SoftSpace(f, 0); } } if (newline) { if (PyFile_WriteString("\n", f) < 0) return -1; PyFile_SoftSpace(f, 0); } return 0; } #else /* Python 3 has a print function */ static int __Pyx_Print(PyObject* stream, PyObject *arg_tuple, int newline) { PyObject* kwargs = 0; PyObject* result = 0; PyObject* end_string; if (unlikely(!__pyx_print)) { __pyx_print = __Pyx_GetAttrString(__pyx_b, "print"); if (!__pyx_print) return -1; } if (stream) { kwargs = PyDict_New(); if (unlikely(!kwargs)) return -1; if (unlikely(PyDict_SetItemString(kwargs, "file", stream) < 0)) goto bad; if (!newline) { end_string = PyUnicode_FromStringAndSize(" ", 1); if (unlikely(!end_string)) goto bad; if (PyDict_SetItemString(kwargs, "end", end_string) < 0) { Py_DECREF(end_string); goto bad; } Py_DECREF(end_string); } } else if (!newline) { if (unlikely(!__pyx_print_kwargs)) { __pyx_print_kwargs = PyDict_New(); if (unlikely(!__pyx_print_kwargs)) return -1; end_string = PyUnicode_FromStringAndSize(" ", 1); if (unlikely(!end_string)) return -1; if (PyDict_SetItemString(__pyx_print_kwargs, "end", end_string) < 0) { Py_DECREF(end_string); return -1; } Py_DECREF(end_string); } kwargs = __pyx_print_kwargs; } result = PyObject_Call(__pyx_print, arg_tuple, kwargs); if (unlikely(kwargs) && (kwargs != __pyx_print_kwargs)) Py_DECREF(kwargs); if (!result) return -1; Py_DECREF(result); return 0; bad: if (kwargs != __pyx_print_kwargs) Py_XDECREF(kwargs); return -1; } #endif #if PY_MAJOR_VERSION < 3 static int __Pyx_PrintOne(PyObject* f, PyObject *o) { if (!f) { if (!(f = __Pyx_GetStdout())) return -1; } if (PyFile_SoftSpace(f, 0)) { if (PyFile_WriteString(" ", f) < 0) return -1; } if (PyFile_WriteObject(o, f, Py_PRINT_RAW) < 0) return -1; if (PyFile_WriteString("\n", f) < 0) return -1; return 0; /* the line below is just to avoid compiler * compiler warnings about unused functions */ return __Pyx_Print(f, NULL, 0); } #else /* Python 3 has a print function */ static int __Pyx_PrintOne(PyObject* stream, PyObject *o) { int res; PyObject* arg_tuple = PyTuple_New(1); if (unlikely(!arg_tuple)) return -1; Py_INCREF(o); PyTuple_SET_ITEM(arg_tuple, 0, o); res = __Pyx_Print(stream, arg_tuple, 1); Py_DECREF(arg_tuple); return res; } #endif static CYTHON_INLINE PyObject *__Pyx_PyInt_to_py_Py_intptr_t(Py_intptr_t val) { const Py_intptr_t neg_one = (Py_intptr_t)-1, const_zero = (Py_intptr_t)0; const int is_unsigned = const_zero < neg_one; if ((sizeof(Py_intptr_t) == sizeof(char)) || (sizeof(Py_intptr_t) == sizeof(short))) { return PyInt_FromLong((long)val); } else if ((sizeof(Py_intptr_t) == sizeof(int)) || (sizeof(Py_intptr_t) == sizeof(long))) { if (is_unsigned) return PyLong_FromUnsignedLong((unsigned long)val); else return PyInt_FromLong((long)val); } else if (sizeof(Py_intptr_t) == sizeof(PY_LONG_LONG)) { if (is_unsigned) return PyLong_FromUnsignedLongLong((unsigned PY_LONG_LONG)val); else return PyLong_FromLongLong((PY_LONG_LONG)val); } else { int one = 1; int little = (int)*(unsigned char *)&one; unsigned char *bytes = (unsigned char *)&val; return _PyLong_FromByteArray(bytes, sizeof(Py_intptr_t), little, !is_unsigned); } } #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return ::std::complex< float >(x, y); } #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { return x + y*(__pyx_t_float_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_float_complex __pyx_t_float_complex_from_parts(float x, float y) { __pyx_t_float_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eqf(__pyx_t_float_complex a, __pyx_t_float_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_sumf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_difff(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_prodf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_quotf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_negf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zerof(__pyx_t_float_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_conjf(__pyx_t_float_complex a) { __pyx_t_float_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE float __Pyx_c_absf(__pyx_t_float_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrtf(z.real*z.real + z.imag*z.imag); #else return hypotf(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_float_complex __Pyx_c_powf(__pyx_t_float_complex a, __pyx_t_float_complex b) { __pyx_t_float_complex z; float r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { float denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(a, a); case 3: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, a); case 4: z = __Pyx_c_prodf(a, a); return __Pyx_c_prodf(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_absf(a); theta = atan2f(a.imag, a.real); } lnr = logf(r); z_r = expf(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cosf(z_theta); z.imag = z_r * sinf(z_theta); return z; } #endif #endif #if CYTHON_CCOMPLEX #ifdef __cplusplus static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return ::std::complex< double >(x, y); } #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { return x + y*(__pyx_t_double_complex)_Complex_I; } #endif #else static CYTHON_INLINE __pyx_t_double_complex __pyx_t_double_complex_from_parts(double x, double y) { __pyx_t_double_complex z; z.real = x; z.imag = y; return z; } #endif #if CYTHON_CCOMPLEX #else static CYTHON_INLINE int __Pyx_c_eq(__pyx_t_double_complex a, __pyx_t_double_complex b) { return (a.real == b.real) && (a.imag == b.imag); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_sum(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real + b.real; z.imag = a.imag + b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_diff(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real - b.real; z.imag = a.imag - b.imag; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_prod(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; z.real = a.real * b.real - a.imag * b.imag; z.imag = a.real * b.imag + a.imag * b.real; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_quot(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double denom = b.real * b.real + b.imag * b.imag; z.real = (a.real * b.real + a.imag * b.imag) / denom; z.imag = (a.imag * b.real - a.real * b.imag) / denom; return z; } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_neg(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = -a.real; z.imag = -a.imag; return z; } static CYTHON_INLINE int __Pyx_c_is_zero(__pyx_t_double_complex a) { return (a.real == 0) && (a.imag == 0); } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_conj(__pyx_t_double_complex a) { __pyx_t_double_complex z; z.real = a.real; z.imag = -a.imag; return z; } #if 1 static CYTHON_INLINE double __Pyx_c_abs(__pyx_t_double_complex z) { #if !defined(HAVE_HYPOT) || defined(_MSC_VER) return sqrt(z.real*z.real + z.imag*z.imag); #else return hypot(z.real, z.imag); #endif } static CYTHON_INLINE __pyx_t_double_complex __Pyx_c_pow(__pyx_t_double_complex a, __pyx_t_double_complex b) { __pyx_t_double_complex z; double r, lnr, theta, z_r, z_theta; if (b.imag == 0 && b.real == (int)b.real) { if (b.real < 0) { double denom = a.real * a.real + a.imag * a.imag; a.real = a.real / denom; a.imag = -a.imag / denom; b.real = -b.real; } switch ((int)b.real) { case 0: z.real = 1; z.imag = 0; return z; case 1: return a; case 2: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(a, a); case 3: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, a); case 4: z = __Pyx_c_prod(a, a); return __Pyx_c_prod(z, z); } } if (a.imag == 0) { if (a.real == 0) { return a; } r = a.real; theta = 0; } else { r = __Pyx_c_abs(a); theta = atan2(a.imag, a.real); } lnr = log(r); z_r = exp(lnr * b.real - theta * b.imag); z_theta = theta * b.real + lnr * b.imag; z.real = z_r * cos(z_theta); z.imag = z_r * sin(z_theta); return z; } #endif #endif static CYTHON_INLINE unsigned char __Pyx_PyInt_AsUnsignedChar(PyObject* x) { const unsigned char neg_one = (unsigned char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned char" : "value too large to convert to unsigned char"); } return (unsigned char)-1; } return (unsigned char)val; } return (unsigned char)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned short __Pyx_PyInt_AsUnsignedShort(PyObject* x) { const unsigned short neg_one = (unsigned short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned short" : "value too large to convert to unsigned short"); } return (unsigned short)-1; } return (unsigned short)val; } return (unsigned short)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE unsigned int __Pyx_PyInt_AsUnsignedInt(PyObject* x) { const unsigned int neg_one = (unsigned int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(unsigned int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(unsigned int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to unsigned int" : "value too large to convert to unsigned int"); } return (unsigned int)-1; } return (unsigned int)val; } return (unsigned int)__Pyx_PyInt_AsUnsignedLong(x); } static CYTHON_INLINE char __Pyx_PyInt_AsChar(PyObject* x) { const char neg_one = (char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to char" : "value too large to convert to char"); } return (char)-1; } return (char)val; } return (char)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE short __Pyx_PyInt_AsShort(PyObject* x) { const short neg_one = (short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to short" : "value too large to convert to short"); } return (short)-1; } return (short)val; } return (short)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsInt(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE signed char __Pyx_PyInt_AsSignedChar(PyObject* x) { const signed char neg_one = (signed char)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed char) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed char)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed char" : "value too large to convert to signed char"); } return (signed char)-1; } return (signed char)val; } return (signed char)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed short __Pyx_PyInt_AsSignedShort(PyObject* x) { const signed short neg_one = (signed short)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed short) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed short)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed short" : "value too large to convert to signed short"); } return (signed short)-1; } return (signed short)val; } return (signed short)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE signed int __Pyx_PyInt_AsSignedInt(PyObject* x) { const signed int neg_one = (signed int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(signed int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(signed int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to signed int" : "value too large to convert to signed int"); } return (signed int)-1; } return (signed int)val; } return (signed int)__Pyx_PyInt_AsSignedLong(x); } static CYTHON_INLINE int __Pyx_PyInt_AsLongDouble(PyObject* x) { const int neg_one = (int)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; if (sizeof(int) < sizeof(long)) { long val = __Pyx_PyInt_AsLong(x); if (unlikely(val != (long)(int)val)) { if (!unlikely(val == -1 && PyErr_Occurred())) { PyErr_SetString(PyExc_OverflowError, (is_unsigned && unlikely(val < 0)) ? "can't convert negative value to int" : "value too large to convert to int"); } return (int)-1; } return (int)val; } return (int)__Pyx_PyInt_AsLong(x); } static CYTHON_INLINE unsigned long __Pyx_PyInt_AsUnsignedLong(PyObject* x) { const unsigned long neg_one = (unsigned long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return (unsigned long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned long"); return (unsigned long)-1; } return PyLong_AsUnsignedLong(x); } else { return PyLong_AsLong(x); } } else { unsigned long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned long)-1; val = __Pyx_PyInt_AsUnsignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE unsigned PY_LONG_LONG __Pyx_PyInt_AsUnsignedLongLong(PyObject* x) { const unsigned PY_LONG_LONG neg_one = (unsigned PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return (unsigned PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to unsigned PY_LONG_LONG"); return (unsigned PY_LONG_LONG)-1; } return PyLong_AsUnsignedLongLong(x); } else { return PyLong_AsLongLong(x); } } else { unsigned PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (unsigned PY_LONG_LONG)-1; val = __Pyx_PyInt_AsUnsignedLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE long __Pyx_PyInt_AsLong(PyObject* x) { const long neg_one = (long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return (long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to long"); return (long)-1; } return PyLong_AsUnsignedLong(x); } else { return PyLong_AsLong(x); } } else { long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (long)-1; val = __Pyx_PyInt_AsLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE PY_LONG_LONG __Pyx_PyInt_AsLongLong(PyObject* x) { const PY_LONG_LONG neg_one = (PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return (PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to PY_LONG_LONG"); return (PY_LONG_LONG)-1; } return PyLong_AsUnsignedLongLong(x); } else { return PyLong_AsLongLong(x); } } else { PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (PY_LONG_LONG)-1; val = __Pyx_PyInt_AsLongLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed long __Pyx_PyInt_AsSignedLong(PyObject* x) { const signed long neg_one = (signed long)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return (signed long)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed long"); return (signed long)-1; } return PyLong_AsUnsignedLong(x); } else { return PyLong_AsLong(x); } } else { signed long val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed long)-1; val = __Pyx_PyInt_AsSignedLong(tmp); Py_DECREF(tmp); return val; } } static CYTHON_INLINE signed PY_LONG_LONG __Pyx_PyInt_AsSignedLongLong(PyObject* x) { const signed PY_LONG_LONG neg_one = (signed PY_LONG_LONG)-1, const_zero = 0; const int is_unsigned = neg_one > const_zero; #if PY_VERSION_HEX < 0x03000000 if (likely(PyInt_Check(x))) { long val = PyInt_AS_LONG(x); if (is_unsigned && unlikely(val < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return (signed PY_LONG_LONG)val; } else #endif if (likely(PyLong_Check(x))) { if (is_unsigned) { if (unlikely(Py_SIZE(x) < 0)) { PyErr_SetString(PyExc_OverflowError, "can't convert negative value to signed PY_LONG_LONG"); return (signed PY_LONG_LONG)-1; } return PyLong_AsUnsignedLongLong(x); } else { return PyLong_AsLongLong(x); } } else { signed PY_LONG_LONG val; PyObject *tmp = __Pyx_PyNumber_Int(x); if (!tmp) return (signed PY_LONG_LONG)-1; val = __Pyx_PyInt_AsSignedLongLong(tmp); Py_DECREF(tmp); return val; } } static void __Pyx_WriteUnraisable(const char *name) { PyObject *old_exc, *old_val, *old_tb; PyObject *ctx; __Pyx_ErrFetch(&old_exc, &old_val, &old_tb); #if PY_MAJOR_VERSION < 3 ctx = PyString_FromString(name); #else ctx = PyUnicode_FromString(name); #endif __Pyx_ErrRestore(old_exc, old_val, old_tb); if (!ctx) { PyErr_WriteUnraisable(Py_None); } else { PyErr_WriteUnraisable(ctx); Py_DECREF(ctx); } } static int __Pyx_ExportFunction(const char *name, void (*f)(void), const char *sig) { PyObject *d = 0; PyObject *cobj = 0; union { void (*fp)(void); void *p; } tmp; d = PyObject_GetAttrString(__pyx_m, (char *)"__pyx_capi__"); if (!d) { PyErr_Clear(); d = PyDict_New(); if (!d) goto bad; Py_INCREF(d); if (PyModule_AddObject(__pyx_m, (char *)"__pyx_capi__", d) < 0) goto bad; } tmp.fp = f; #if PY_VERSION_HEX >= 0x02070000 && !(PY_MAJOR_VERSION==3&&PY_MINOR_VERSION==0) cobj = PyCapsule_New(tmp.p, sig, 0); #else cobj = PyCObject_FromVoidPtrAndDesc(tmp.p, (void *)sig, 0); #endif if (!cobj) goto bad; if (PyDict_SetItemString(d, name, cobj) < 0) goto bad; Py_DECREF(cobj); Py_DECREF(d); return 0; bad: Py_XDECREF(cobj); Py_XDECREF(d); return -1; } #ifndef __PYX_HAVE_RT_ImportType #define __PYX_HAVE_RT_ImportType static PyTypeObject *__Pyx_ImportType(const char *module_name, const char *class_name, long size, int strict) { PyObject *py_module = 0; PyObject *result = 0; PyObject *py_name = 0; char warning[200]; py_module = __Pyx_ImportModule(module_name); if (!py_module) goto bad; #if PY_MAJOR_VERSION < 3 py_name = PyString_FromString(class_name); #else py_name = PyUnicode_FromString(class_name); #endif if (!py_name) goto bad; result = PyObject_GetAttr(py_module, py_name); Py_DECREF(py_name); py_name = 0; Py_DECREF(py_module); py_module = 0; if (!result) goto bad; if (!PyType_Check(result)) { PyErr_Format(PyExc_TypeError, "%s.%s is not a type object", module_name, class_name); goto bad; } if (!strict && ((PyTypeObject *)result)->tp_basicsize > size) { PyOS_snprintf(warning, sizeof(warning), "%s.%s size changed, may indicate binary incompatibility", module_name, class_name); #if PY_VERSION_HEX < 0x02050000 PyErr_Warn(NULL, warning); #else PyErr_WarnEx(NULL, warning, 0); #endif } else if (((PyTypeObject *)result)->tp_basicsize != size) { PyErr_Format(PyExc_ValueError, "%s.%s has the wrong size, try recompiling", module_name, class_name); goto bad; } return (PyTypeObject *)result; bad: Py_XDECREF(py_module); Py_XDECREF(result); return 0; } #endif #ifndef __PYX_HAVE_RT_ImportModule #define __PYX_HAVE_RT_ImportModule static PyObject *__Pyx_ImportModule(const char *name) { PyObject *py_name = 0; PyObject *py_module = 0; #if PY_MAJOR_VERSION < 3 py_name = PyString_FromString(name); #else py_name = PyUnicode_FromString(name); #endif if (!py_name) goto bad; py_module = PyImport_Import(py_name); Py_DECREF(py_name); return py_module; bad: Py_XDECREF(py_name); return 0; } #endif #include "compile.h" #include "frameobject.h" #include "traceback.h" static void __Pyx_AddTraceback(const char *funcname) { PyObject *py_srcfile = 0; PyObject *py_funcname = 0; PyObject *py_globals = 0; PyCodeObject *py_code = 0; PyFrameObject *py_frame = 0; #if PY_MAJOR_VERSION < 3 py_srcfile = PyString_FromString(__pyx_filename); #else py_srcfile = PyUnicode_FromString(__pyx_filename); #endif if (!py_srcfile) goto bad; if (__pyx_clineno) { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); #else py_funcname = PyUnicode_FromFormat( "%s (%s:%d)", funcname, __pyx_cfilenm, __pyx_clineno); #endif } else { #if PY_MAJOR_VERSION < 3 py_funcname = PyString_FromString(funcname); #else py_funcname = PyUnicode_FromString(funcname); #endif } if (!py_funcname) goto bad; py_globals = PyModule_GetDict(__pyx_m); if (!py_globals) goto bad; py_code = PyCode_New( 0, /*int argcount,*/ #if PY_MAJOR_VERSION >= 3 0, /*int kwonlyargcount,*/ #endif 0, /*int nlocals,*/ 0, /*int stacksize,*/ 0, /*int flags,*/ __pyx_empty_bytes, /*PyObject *code,*/ __pyx_empty_tuple, /*PyObject *consts,*/ __pyx_empty_tuple, /*PyObject *names,*/ __pyx_empty_tuple, /*PyObject *varnames,*/ __pyx_empty_tuple, /*PyObject *freevars,*/ __pyx_empty_tuple, /*PyObject *cellvars,*/ py_srcfile, /*PyObject *filename,*/ py_funcname, /*PyObject *name,*/ __pyx_lineno, /*int firstlineno,*/ __pyx_empty_bytes /*PyObject *lnotab*/ ); if (!py_code) goto bad; py_frame = PyFrame_New( PyThreadState_GET(), /*PyThreadState *tstate,*/ py_code, /*PyCodeObject *code,*/ py_globals, /*PyObject *globals,*/ 0 /*PyObject *locals*/ ); if (!py_frame) goto bad; py_frame->f_lineno = __pyx_lineno; PyTraceBack_Here(py_frame); bad: Py_XDECREF(py_srcfile); Py_XDECREF(py_funcname); Py_XDECREF(py_code); Py_XDECREF(py_frame); } static int __Pyx_InitStrings(__Pyx_StringTabEntry *t) { while (t->p) { #if PY_MAJOR_VERSION < 3 if (t->is_unicode) { *t->p = PyUnicode_DecodeUTF8(t->s, t->n - 1, NULL); } else if (t->intern) { *t->p = PyString_InternFromString(t->s); } else { *t->p = PyString_FromStringAndSize(t->s, t->n - 1); } #else /* Python 3+ has unicode identifiers */ if (t->is_unicode | t->is_str) { if (t->intern) { *t->p = PyUnicode_InternFromString(t->s); } else if (t->encoding) { *t->p = PyUnicode_Decode(t->s, t->n - 1, t->encoding, NULL); } else { *t->p = PyUnicode_FromStringAndSize(t->s, t->n - 1); } } else { *t->p = PyBytes_FromStringAndSize(t->s, t->n - 1); } #endif if (!*t->p) return -1; ++t; } return 0; } /* Type Conversion Functions */ static CYTHON_INLINE int __Pyx_PyObject_IsTrue(PyObject* x) { int is_true = x == Py_True; if (is_true | (x == Py_False) | (x == Py_None)) return is_true; else return PyObject_IsTrue(x); } static CYTHON_INLINE PyObject* __Pyx_PyNumber_Int(PyObject* x) { PyNumberMethods *m; const char *name = NULL; PyObject *res = NULL; #if PY_VERSION_HEX < 0x03000000 if (PyInt_Check(x) || PyLong_Check(x)) #else if (PyLong_Check(x)) #endif return Py_INCREF(x), x; m = Py_TYPE(x)->tp_as_number; #if PY_VERSION_HEX < 0x03000000 if (m && m->nb_int) { name = "int"; res = PyNumber_Int(x); } else if (m && m->nb_long) { name = "long"; res = PyNumber_Long(x); } #else if (m && m->nb_int) { name = "int"; res = PyNumber_Long(x); } #endif if (res) { #if PY_VERSION_HEX < 0x03000000 if (!PyInt_Check(res) && !PyLong_Check(res)) { #else if (!PyLong_Check(res)) { #endif PyErr_Format(PyExc_TypeError, "__%s__ returned non-%s (type %.200s)", name, name, Py_TYPE(res)->tp_name); Py_DECREF(res); return NULL; } } else if (!PyErr_Occurred()) { PyErr_SetString(PyExc_TypeError, "an integer is required"); } return res; } static CYTHON_INLINE Py_ssize_t __Pyx_PyIndex_AsSsize_t(PyObject* b) { Py_ssize_t ival; PyObject* x = PyNumber_Index(b); if (!x) return -1; ival = PyInt_AsSsize_t(x); Py_DECREF(x); return ival; } static CYTHON_INLINE PyObject * __Pyx_PyInt_FromSize_t(size_t ival) { #if PY_VERSION_HEX < 0x02050000 if (ival <= LONG_MAX) return PyInt_FromLong((long)ival); else { unsigned char *bytes = (unsigned char *) &ival; int one = 1; int little = (int)*(unsigned char*)&one; return _PyLong_FromByteArray(bytes, sizeof(size_t), little, 0); } #else return PyInt_FromSize_t(ival); #endif } static CYTHON_INLINE size_t __Pyx_PyInt_AsSize_t(PyObject* x) { unsigned PY_LONG_LONG val = __Pyx_PyInt_AsUnsignedLongLong(x); if (unlikely(val == (unsigned PY_LONG_LONG)-1 && PyErr_Occurred())) { return (size_t)-1; } else if (unlikely(val != (unsigned PY_LONG_LONG)(size_t)val)) { PyErr_SetString(PyExc_OverflowError, "value too large to convert to size_t"); return (size_t)-1; } return (size_t)val; } #endif /* Py_PYTHON_H */ ================================================ FILE: samples/C3/example.c3 ================================================ /* MIT License Copyright (c) 2025 Josh Ring Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. Source: https://github.com/joshring/argparse/blob/main/src/example.c3 */ module main; import std::io; import args; import args::testutil; // Call with arguments // --required true -d "description here" fn void main(String[] args) { io::printfn( "\nArgs provided to the program\n" "=============================" ); foreach(arg : args) { io::printn(arg); } Option[]? options_read = args::parse( args: args, arg_sep: " ", // arg_sep: "=", options: { // A long and short name, with a required associated value { .valid_values={"true", "false"}, .short_name="r", .long_name="required", .description="required arg", .example_value="EXAMPLE", .is_required=true, .is_value_required=true, }, // An optional, long and short name, with a required associated value (when provided) { .valid_values={}, .short_name="d", .long_name="description", .description="optional description", .example_value=`"description here"`, .is_required=false, .is_value_required=true, }, // A single value toggle without an associated value { .short_name="n", .long_name="not_required", .description="optional arg", .example_value="", .is_required=false, .is_value_required=false, }, } ); if(catch err = options_read) { io::printn(err); return; } io::printfn( "\nOptions parsed by the program\n" "=============================" ); foreach(option : options_read) { io::printn(option); io::printn(); } } fn void test_parse() @test { String[] args = {"./build/argparse", "--required", "true", "-n", "-v", "88"}; Option[]? options = args::parse( args: args, arg_sep: " ", options: { // Value required and has valid values { .valid_values={"true", "false"}, .short_name="r", .long_name="required", .description="required arg", .example_value="EXAMPLE", .is_required=true, .is_value_required=true, }, // Flag without a value { .short_name="n", .long_name="not_required", .description="flag argument without a value", .example_value="", .is_required=false, .is_value_required=false, }, // Optional value, value required and has no valid values { .valid_values={}, .short_name="v", .long_name="value", .description="optional, requires value if defined", .example_value="88", .is_required=false, .is_value_required=true, }, } ); if(catch err = options) { io::printn(err); return; } Option[] options_expected = { { .is_found=true, .value_read="true", .valid_values={"true", "false"}, .short_name="r", .long_name="required", .description="required arg", .example_value="EXAMPLE", .is_required=true, .is_value_required=true, }, { .is_found=true, .value_read="true", .valid_values={}, .short_name="n", .long_name="not_required", .description="flag argument without a value", .example_value="", .is_required=false, .is_value_required=false, }, { .is_found=true, .value_read="88", .valid_values={}, .short_name="v", .long_name="value", .description="optional, requires value if defined", .example_value="88", .is_required=false, .is_value_required=true, } }; assert(testutil::equal_value_io(options, options_expected)!! == true); } ================================================ FILE: samples/CAP CDS/admin-service.cds ================================================ using { sap.capire.bookshop as my } from '../db/schema'; service AdminService @(requires:'admin') { entity Books as projection on my.Books; entity Authors as projection on my.Authors; } ================================================ FILE: samples/CAP CDS/cat-service.cds ================================================ using { sap.capire.bookshop as my } from '../db/schema'; service CatalogService @(path:'/browse') { /** For displaying lists of Books */ @readonly entity ListOfBooks as projection on Books excluding { descr }; /** For display in details pages */ @readonly entity Books as projection on my.Books { *, author.name as author } excluding { createdBy, modifiedBy }; @requires: 'authenticated-user' action submitOrder ( book: Books:ID, quantity: Integer ) returns { stock: Integer }; event OrderedBook : { book: Books:ID; quantity: Integer; buyer: String }; } ================================================ FILE: samples/CAP CDS/common.cds ================================================ type Language : Association to sap.common.Languages; type Currency : Association to sap.common.Currencies; type Country : Association to sap.common.Countries; /** * Entities to serve the reuse types with extensible code lists * including built-in support for value lists in Fiori. */ context sap.common { entity Languages : CodeList { key code : String(14) @(title : '{i18n>LanguageCode}'); //> length=14 is to accommodate values like these: // en_US_x_saptrc - (1Q) used as a technical SAP language code // en_US_x_sappsd - (2Q) used as a technical SAP language code } entity Countries : CodeList { key code : String(3) @(title : '{i18n>CountryCode}'); } entity Currencies : CodeList { key code : String(3) @(title : '{i18n>CurrencyCode}'); symbol : String(5) @(title : '{i18n>CurrencySymbol}'); } aspect CodeList @( cds.autoexpose, cds.persistence.skip : 'if-unused' ) { name : localized String(255) @title : '{i18n>Name}'; descr : localized String(1000) @title : '{i18n>Description}'; } } /* * Aspect for entities with canonical universal IDs. */ aspect cuid { key ID : UUID; //> automatically filled in } /* * Aspect to capture changes by user and name. */ aspect managed { createdAt : Timestamp @cds.on.insert : $now; createdBy : User @cds.on.insert : $user; modifiedAt : Timestamp @cds.on.insert : $now @cds.on.update : $now; modifiedBy : User @cds.on.insert : $user @cds.on.update : $user; } /* * Aspects for entities with temporal data. */ aspect temporal { validFrom : Timestamp @cds.valid.from; validTo : Timestamp @cds.valid.to; } /** * Canonical user ID */ type User : String(255); /* * Aspects for extensible entities. */ aspect extensible { @cds.api.ignore extensions__ : String }; //--------------------------------------------------------------------------- // Annotations for Fiori UIs... annotate sap.common.CodeList with @UI.Identification : [{Value:name}]; annotate sap.common.CodeList with @cds.odata.valuelist; annotate managed with { createdAt @UI.HiddenFilter; createdBy @UI.HiddenFilter; modifiedAt @UI.HiddenFilter; modifiedBy @UI.HiddenFilter; } annotate managed with { createdAt @Core.Immutable; createdBy @Core.Immutable; } annotate sap.common.Countries with { code @Common.Text:name; } annotate sap.common.Currencies with { code @Common.Text:name; } annotate sap.common.Languages with { code @Common.Text:name; } //--------------------------------------------------------------------------- // Common Annotations... annotate Language with @( title : '{i18n>Language}', description : '{i18n>LanguageCode.Description}' ); annotate Currency with @( title : '{i18n>Currency}', description : '{i18n>CurrencyCode.Description}' ); annotate Country with @( title : '{i18n>Country}', description : '{i18n>CountryCode.Description}' ); annotate User with @( title : '{i18n>UserID}', description : '{i18n>UserID.Description}' ); annotate managed with { createdAt @title : '{i18n>CreatedAt}'; createdBy @title : '{i18n>CreatedBy}'; modifiedAt @title : '{i18n>ChangedAt}'; modifiedBy @title : '{i18n>ChangedBy}'; } //--------------------------------------------------------------------------- // Temporary Workarounds... // REVISIT: @cds.on... should automatically result in @readonly @Core.Computed annotate managed with { modifiedAt @readonly; createdAt @readonly; createdBy @readonly; modifiedBy @readonly; } //--------------------------------------------------------------------------- ================================================ FILE: samples/CAP CDS/schema.cds ================================================ using { Currency, managed, sap } from '@sap/cds/common'; namespace sap.capire.bookshop; entity Books : managed { key ID : Integer; title : localized String(111); descr : localized String(1111); author : Association to Authors; genre : Association to Genres; stock : Integer; price : Decimal; currency : Currency; image : LargeBinary @Core.MediaType : 'image/png'; } entity Authors : managed { key ID : Integer; name : String(111); dateOfBirth : Date; dateOfDeath : Date; placeOfBirth : String; placeOfDeath : String; books : Association to many Books on books.author = $self; } /** Hierarchically organized Code List for Genres */ entity Genres : sap.common.CodeList { key ID : Integer; parent : Association to Genres; children : Composition of many Genres on children.parent = $self; } ================================================ FILE: samples/CAP CDS/user-service.cds ================================================ /** * Exposes user information */ @requires: 'authenticated-user' service UserService { /** * The current user */ @odata.singleton entity me { id : String; // user id locale : String; tenant : String; } } ================================================ FILE: samples/CIL/certfile.cil ================================================ ;; -*- mode: CIL; fill-column: 79; indent-tabs-mode: nil; -*- ;; SPDX-FileCopyrightText: © 2021 Dominick Grift ;; SPDX-License-Identifier: Unlicense (in .file (block cert ;; ;; Policy ;; (blockinherit file.obj_all_macro_template) (call file.obj_type (obj_typeattr)) (call .xattr.associate_filesystems (obj_typeattr)) ;; ;; Templates ;; (block obj_base_template ;; ;; Contexts ;; (context certfile_file_context (.u .r certfile (systemlow systemlow))) ;; ;; Policy ;; (blockabstract obj_base_template) (type certfile) (call .file.cert.obj_type (certfile))) (block obj_macro_template ;; ;; Macros ;; (macro addname_certfile_dirs ((type ARG1)) (allow ARG1 certfile addname_dir)) (macro append_certfile_blk_files ((type ARG1)) (allow ARG1 certfile append_blk_file)) (macro append_certfile_chr_files ((type ARG1)) (allow ARG1 certfile append_chr_file)) (macro append_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile append_fifo_file)) (macro append_certfile_files ((type ARG1)) (allow ARG1 certfile append_file)) (macro appendinherited_certfile_blk_files ((type ARG1)) (allow ARG1 certfile appendinherited_blk_file)) (macro appendinherited_certfile_chr_files ((type ARG1)) (allow ARG1 certfile appendinherited_chr_file)) (macro appendinherited_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile appendinherited_fifo_file)) (macro appendinherited_certfile_files ((type ARG1)) (allow ARG1 certfile appendinherited_file)) (macro certfile_obj_type_transition ((type ARG1)(type ARG2)(class ARG3)(name ARG4)) (typetransition ARG1 certfile ARG3 ARG4 ARG2) (call addname_certfile_dirs (ARG1))) (macro create_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (create)))) (macro create_certfile_blk_files ((type ARG1)) (allow ARG1 certfile create_blk_file)) (macro create_certfile_chr_files ((type ARG1)) (allow ARG1 certfile create_chr_file)) (macro create_certfile_dirs ((type ARG1)) (allow ARG1 certfile create_dir)) (macro create_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile create_fifo_file)) (macro create_certfile_files ((type ARG1)) (allow ARG1 certfile create_file)) (macro create_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile create_lnk_file)) (macro create_certfile_sock_files ((type ARG1)) (allow ARG1 certfile create_sock_file)) (macro deletename_certfile_dirs ((type ARG1)) (allow ARG1 certfile deletename_dir)) (macro delete_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (delete)))) (macro delete_certfile_blk_files ((type ARG1)) (allow ARG1 certfile delete_blk_file)) (macro delete_certfile_chr_files ((type ARG1)) (allow ARG1 certfile delete_chr_file)) (macro delete_certfile_dirs ((type ARG1)) (allow ARG1 certfile delete_dir)) (macro delete_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile delete_fifo_file)) (macro delete_certfile_files ((type ARG1)) (allow ARG1 certfile delete_file)) (macro delete_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile delete_lnk_file)) (macro delete_certfile_sock_files ((type ARG1)) (allow ARG1 certfile delete_sock_file)) (macro execute_certfile_files ((type ARG1)) (allow ARG1 certfile execute_file)) (macro list_certfile_dirs ((type ARG1)) (allow ARG1 certfile list_dir)) (macro listinherited_certfile_dirs ((type ARG1)) (allow ARG1 certfile listinherited_dir)) (macro load_certfile_files ((type ARG1)) (allow ARG1 certfile (system (module_load)))) (macro manage_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (manage)))) (macro manage_certfile_blk_files ((type ARG1)) (allow ARG1 certfile manage_blk_file)) (macro manage_certfile_chr_files ((type ARG1)) (allow ARG1 certfile manage_chr_file)) (macro manage_certfile_dirs ((type ARG1)) (allow ARG1 certfile manage_dir)) (macro manage_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile manage_fifo_file)) (macro manage_certfile_files ((type ARG1)) (allow ARG1 certfile manage_file)) (macro manage_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile manage_lnk_file)) (macro manage_certfile_sock_files ((type ARG1)) (allow ARG1 certfile manage_sock_file)) (macro mapexecute_certfile_chr_files ((type ARG1)) (allow ARG1 certfile mapexecute_chr_file)) (macro mapexecute_certfile_files ((type ARG1)) (allow ARG1 certfile mapexecute_file)) (macro mounton_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (mounton)))) (macro mounton_certfile_blk_files ((type ARG1)) (allow ARG1 certfile mounton_blk_file)) (macro mounton_certfile_chr_files ((type ARG1)) (allow ARG1 certfile mounton_chr_file)) (macro mounton_certfile_dirs ((type ARG1)) (allow ARG1 certfile mounton_dir)) (macro mounton_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile mounton_fifo_file)) (macro mounton_certfile_files ((type ARG1)) (allow ARG1 certfile mounton_file)) (macro mounton_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile mounton_lnk_file)) (macro mounton_certfile_sock_files ((type ARG1)) (allow ARG1 certfile mounton_sock_file)) (macro read_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (read)))) (macro read_certfile_blk_files ((type ARG1)) (allow ARG1 certfile read_blk_file)) (macro read_certfile_chr_files ((type ARG1)) (allow ARG1 certfile read_chr_file)) (macro read_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile read_fifo_file)) (macro read_certfile_files ((type ARG1)) (allow ARG1 certfile read_file)) (macro readinherited_certfile_blk_files ((type ARG1)) (allow ARG1 certfile readinherited_blk_file)) (macro readinherited_certfile_chr_files ((type ARG1)) (allow ARG1 certfile readinherited_chr_file)) (macro readinherited_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile readinherited_fifo_file)) (macro readinherited_certfile_files ((type ARG1)) (allow ARG1 certfile readinherited_file)) (macro readinherited_certfile_sock_files ((type ARG1)) (allow ARG1 certfile readinherited_sock_file)) (macro read_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile read_lnk_file)) (macro read_certfile_sock_files ((type ARG1)) (allow ARG1 certfile read_sock_file)) (macro readwrite_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (readwrite)))) (macro readwrite_certfile_blk_files ((type ARG1)) (allow ARG1 certfile readwrite_blk_file)) (macro readwrite_certfile_chr_files ((type ARG1)) (allow ARG1 certfile readwrite_chr_file)) (macro readwrite_certfile_dirs ((type ARG1)) (allow ARG1 certfile readwrite_dir)) (macro readwrite_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile readwrite_fifo_file)) (macro readwrite_certfile_files ((type ARG1)) (allow ARG1 certfile readwrite_file)) (macro readwriteinherited_certfile_blk_files ((type ARG1)) (allow ARG1 certfile readwriteinherited_blk_file)) (macro readwriteinherited_certfile_chr_files ((type ARG1)) (allow ARG1 certfile readwriteinherited_chr_file)) (macro readwriteinherited_certfile_dirs ((type ARG1)) (allow ARG1 certfile readwriteinherited_dir)) (macro readwriteinherited_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile readwriteinherited_fifo_file)) (macro readwriteinherited_certfile_files ((type ARG1)) (allow ARG1 certfile readwriteinherited_file)) (macro readwriteinherited_certfile_sock_files ((type ARG1)) (allow ARG1 certfile readwriteinherited_sock_file)) (macro readwrite_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile readwrite_lnk_file)) (macro readwrite_certfile_sock_files ((type ARG1)) (allow ARG1 certfile readwrite_sock_file)) (macro relabel_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (relabel)))) (macro relabel_certfile_blk_files ((type ARG1)) (allow ARG1 certfile relabel_blk_file)) (macro relabel_certfile_chr_files ((type ARG1)) (allow ARG1 certfile relabel_chr_file)) (macro relabel_certfile_dirs ((type ARG1)) (allow ARG1 certfile relabel_dir)) (macro relabel_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile relabel_fifo_file)) (macro relabel_certfile_files ((type ARG1)) (allow ARG1 certfile relabel_file)) (macro relabel_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile relabel_lnk_file)) (macro relabel_certfile_sock_files ((type ARG1)) (allow ARG1 certfile relabel_sock_file)) (macro relabelfrom_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (relabelfrom)))) (macro relabelfrom_certfile_blk_files ((type ARG1)) (allow ARG1 certfile relabelfrom_blk_file)) (macro relabelfrom_certfile_chr_files ((type ARG1)) (allow ARG1 certfile relabelfrom_chr_file)) (macro relabelfrom_certfile_dirs ((type ARG1)) (allow ARG1 certfile relabelfrom_dir)) (macro relabelfrom_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile relabelfrom_fifo_file)) (macro relabelfrom_certfile_files ((type ARG1)) (allow ARG1 certfile relabelfrom_file)) (macro relabelfrom_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile relabelfrom_lnk_file)) (macro relabelfrom_certfile_sock_files ((type ARG1)) (allow ARG1 certfile relabelfrom_sock_file)) (macro relabelto_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (relabelto)))) (macro relabelto_certfile_blk_files ((type ARG1)) (allow ARG1 certfile relabelto_blk_file)) (macro relabelto_certfile_chr_files ((type ARG1)) (allow ARG1 certfile relabelto_chr_file)) (macro relabelto_certfile_dirs ((type ARG1)) (allow ARG1 certfile relabelto_dir)) (macro relabelto_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile relabelto_fifo_file)) (macro relabelto_certfile_files ((type ARG1)) (allow ARG1 certfile relabelto_file)) (macro relabelto_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile relabelto_lnk_file)) (macro relabelto_certfile_sock_files ((type ARG1)) (allow ARG1 certfile relabelto_sock_file)) (macro rename_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (rename)))) (macro rename_certfile_blk_files ((type ARG1)) (allow ARG1 certfile rename_blk_file)) (macro rename_certfile_chr_files ((type ARG1)) (allow ARG1 certfile rename_chr_file)) (macro rename_certfile_dirs ((type ARG1)) (allow ARG1 certfile rename_dir)) (macro rename_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile rename_fifo_file)) (macro rename_certfile_files ((type ARG1)) (allow ARG1 certfile rename_file)) (macro rename_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile rename_lnk_file)) (macro rename_certfile_sock_files ((type ARG1)) (allow ARG1 certfile rename_sock_file)) (macro search_certfile_dirs ((type ARG1)) (allow ARG1 certfile search_dir)) (macro write_certfile ((type ARG1)) (allow ARG1 certfile (allfiles (write)))) (macro write_certfile_blk_files ((type ARG1)) (allow ARG1 certfile write_blk_file)) (macro write_certfile_chr_files ((type ARG1)) (allow ARG1 certfile write_chr_file)) (macro write_certfile_dirs ((type ARG1)) (allow ARG1 certfile write_dir)) (macro write_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile write_fifo_file)) (macro write_certfile_files ((type ARG1)) (allow ARG1 certfile write_file)) (macro writeinherited_certfile_blk_files ((type ARG1)) (allow ARG1 certfile writeinherited_blk_file)) (macro writeinherited_certfile_chr_files ((type ARG1)) (allow ARG1 certfile writeinherited_chr_file)) (macro writeinherited_certfile_dirs ((type ARG1)) (allow ARG1 certfile writeinherited_dir)) (macro writeinherited_certfile_fifo_files ((type ARG1)) (allow ARG1 certfile writeinherited_fifo_file)) (macro writeinherited_certfile_files ((type ARG1)) (allow ARG1 certfile writeinherited_file)) (macro writeinherited_certfile_sock_files ((type ARG1)) (allow ARG1 certfile writeinherited_sock_file)) (macro write_certfile_lnk_files ((type ARG1)) (allow ARG1 certfile write_lnk_file)) (macro write_certfile_sock_files ((type ARG1)) (allow ARG1 certfile write_sock_file)) ;; ;; Policy ;; (blockabstract obj_macro_template)) (block obj_template ;; ;; Policy ;; (blockabstract obj_template) (blockinherit .file.cert.obj_base_template) (blockinherit .file.cert.obj_macro_template)) (block except ;; ;; Policy ;; (blockinherit obj_all_macro_template) (typeattributeset obj_typeattr (and cert.obj_typeattr (not (exception.obj_typeattr)))) (optional certfile_opt_sandbox (call .file.sandboxexception.obj_type (obj_typeattr)))) (block exception ;; ;; Policy ;; (blockinherit obj_all_macro_template)))) ================================================ FILE: samples/CIL/guix-daemon.cil ================================================ ;;; GNU Guix --- Functional package management for GNU ;;; Copyright © 2018 Ricardo Wurmus ;;; ;;; This file is part of GNU Guix. ;;; ;;; GNU Guix is free software; you can redistribute it and/or modify it ;;; under the terms of the GNU General Public License as published by ;;; the Free Software Foundation; either version 3 of the License, or (at ;;; your option) any later version. ;;; ;;; GNU Guix is distributed in the hope that it will be useful, but ;;; WITHOUT ANY WARRANTY; without even the implied warranty of ;;; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the ;;; GNU General Public License for more details. ;;; ;;; You should have received a copy of the GNU General Public License ;;; along with GNU Guix. If not, see . ;; This is a specification for SELinux 2.7 written in the SELinux Common ;; Intermediate Language (CIL). It refers to types that must be defined in ;; the system's base policy. (block guix_daemon ;; Require existing types (typeattributeset cil_gen_require init_t) (typeattributeset cil_gen_require tmp_t) (typeattributeset cil_gen_require nscd_var_run_t) (typeattributeset cil_gen_require var_log_t) (typeattributeset cil_gen_require domain) ;; Declare own types (type guix_daemon_t) (roletype object_r guix_daemon_t) (type guix_daemon_conf_t) (roletype object_r guix_daemon_conf_t) (type guix_daemon_exec_t) (roletype object_r guix_daemon_exec_t) (type guix_daemon_socket_t) (roletype object_r guix_daemon_socket_t) (type guix_store_content_t) (roletype object_r guix_store_content_t) (type guix_profiles_t) (roletype object_r guix_profiles_t) ;; These types are domains, thereby allowing process rules (typeattributeset domain (guix_daemon_t guix_daemon_exec_t)) (level low (s0)) ;; When a process in init_t or guix_store_content_t spawns a ;; guix_daemon_exec_t process, let it run in the guix_daemon_t context (typetransition init_t guix_daemon_exec_t process guix_daemon_t) (typetransition guix_store_content_t guix_daemon_exec_t process guix_daemon_t) ;; Permit communication with NSCD (allow guix_daemon_t nscd_var_run_t (file (map read))) (allow guix_daemon_t nscd_var_run_t (dir (search))) (allow guix_daemon_t nscd_var_run_t (sock_file (write))) (allow guix_daemon_t nscd_t (fd (use))) (allow guix_daemon_t nscd_t (unix_stream_socket (connectto))) ;; Permit logging and temp file access (allow guix_daemon_t tmp_t (lnk_file (setattr unlink))) (allow guix_daemon_t tmp_t (dir (create rmdir add_name remove_name open read write getattr setattr search))) (allow guix_daemon_t var_log_t (file (create getattr open write))) (allow guix_daemon_t var_log_t (dir (getattr write add_name))) (allow guix_daemon_t var_run_t (lnk_file (read))) (allow guix_daemon_t var_run_t (dir (search))) ;; Spawning processes, execute helpers (allow guix_daemon_t self (process (fork))) (allow guix_daemon_t guix_daemon_exec_t (file (execute execute_no_trans read open))) ;; TODO: unknown (allow guix_daemon_t root_t (dir (mounton))) (allow guix_daemon_t fs_t (filesystem (getattr))) (allow guix_daemon_conf_t fs_t (filesystem (associate))) ;; Build isolation (allow guix_daemon_t guix_store_content_t (file (mounton))) (allow guix_store_content_t fs_t (filesystem (associate))) (allow guix_daemon_t guix_store_content_t (dir (mounton))) (allow guix_daemon_t guix_daemon_t (capability (net_admin fsetid fowner chown setuid setgid dac_override dac_read_search sys_chroot))) (allow guix_daemon_t fs_t (filesystem (unmount))) (allow guix_daemon_t devpts_t (filesystem (mount))) (allow guix_daemon_t devpts_t (chr_file (setattr getattr))) (allow guix_daemon_t tmpfs_t (filesystem (mount))) (allow guix_daemon_t tmpfs_t (dir (getattr))) (allow guix_daemon_t proc_t (filesystem (mount))) (allow guix_daemon_t null_device_t (chr_file (getattr open read write))) (allow guix_daemon_t kvm_device_t (chr_file (getattr))) (allow guix_daemon_t zero_device_t (chr_file (getattr))) (allow guix_daemon_t urandom_device_t (chr_file (getattr))) (allow guix_daemon_t random_device_t (chr_file (getattr))) (allow guix_daemon_t devtty_t (chr_file (getattr))) ;; Access to store items (allow guix_daemon_t guix_store_content_t (dir (reparent create getattr setattr search rename add_name remove_name open write rmdir))) (allow guix_daemon_t guix_store_content_t (file (create lock setattr getattr execute execute_no_trans link unlink map rename open read write))) (allow guix_daemon_t guix_store_content_t (lnk_file (create getattr setattr link unlink read rename))) ;; Access to configuration files and directories (allow guix_daemon_t guix_daemon_conf_t (dir (search setattr getattr add_name remove_name open read write))) (allow guix_daemon_t guix_daemon_conf_t (file (create lock map getattr setattr unlink open read write))) (allow guix_daemon_t guix_daemon_conf_t (lnk_file (create getattr rename unlink))) ;; Access to profiles (allow guix_daemon_t guix_profiles_t (dir (getattr setattr read open))) (allow guix_daemon_t guix_profiles_t (lnk_file (read getattr))) ;; Access to profile links in the home directory ;; TODO: allow access to profile links *anywhere* on the filesystem (allow guix_daemon_t user_home_t (lnk_file (read getattr))) (allow guix_daemon_t user_home_t (dir (search))) ;; Socket operations (allow guix_daemon_t init_t (fd (use))) (allow guix_daemon_t init_t (unix_stream_socket (write))) (allow guix_daemon_t guix_daemon_conf_t (unix_stream_socket (listen))) (allow guix_daemon_t guix_daemon_conf_t (sock_file (create unlink))) (allow guix_daemon_t self (unix_stream_socket (create read write connect bind accept getopt setopt))) (allow guix_daemon_t self (fifo_file (write read))) (allow guix_daemon_t self (udp_socket (ioctl create))) ;; Label file system (filecon "/usr/local/etc/guix(/.*)?" any (system_u object_r guix_daemon_conf_t (low low))) (filecon "/var/guix(/.*)?" any (system_u object_r guix_daemon_conf_t (low low))) (filecon "/var/guix/profiles(/.*)?" any (system_u object_r guix_profiles_t (low low))) (filecon "/gnu" dir (unconfined_u object_r guix_store_content_t (low low))) (filecon "/gnu/store(/.+)?" any (unconfined_u object_r guix_store_content_t (low low))) (filecon "/gnu/store/[^/]+/.+" any (unconfined_u object_r guix_store_content_t (low low))) (filecon "/usr/local/bin/guix-daemon" file (system_u object_r guix_daemon_exec_t (low low))) (filecon "/gnu/store/.+-(guix-.+|profile)/bin/guix-daemon" file (system_u object_r guix_daemon_exec_t (low low))) (filecon "/var/guix/daemon-socket/socket" any (system_u object_r guix_daemon_socket_t (low low)))) ================================================ FILE: samples/CLIPS/demo.clp ================================================ ;;;*************************** ;;;* DEFFACTS KNOWLEDGE BASE * ;;;*************************** (deffacts MAIN::knowledge-base (welcome (message WelcomeMessage)) (goal (variable type.animal)) (legalanswers (values yes no)) (displayanswers (values "Yes" "No")) (rule (if backbone is yes) (then superphylum is backbone)) (rule (if backbone is no) (then superphylum is jellyback)) (question (variable backbone) (query backbone.query)) (rule (if superphylum is backbone and warm.blooded is yes) (then phylum is warm)) (rule (if superphylum is backbone and warm.blooded is no) (then phylum is cold)) (question (variable warm.blooded) (query warm.blooded.query)) (rule (if superphylum is jellyback and live.prime.in.soil is yes) (then phylum is soil)) (rule (if superphylum is jellyback and live.prime.in.soil is no) (then phylum is elsewhere)) (question (variable live.prime.in.soil) (query live.prime.in.soil.query)) (rule (if phylum is warm and has.breasts is yes) (then class is breasts)) (rule (if phylum is warm and has.breasts is no) (then type.animal is bird)) (question (variable has.breasts) (query has.breasts.query)) (rule (if phylum is cold and always.in.water is yes) (then class is water)) (rule (if phylum is cold and always.in.water is no) (then class is dry)) (question (variable always.in.water) (query always.in.water.query)) (rule (if phylum is soil and flat.bodied is yes) (then type.animal is flatworm)) (rule (if phylum is soil and flat.bodied is no) (then type.animal is worm.leech)) (question (variable flat.bodied) (query flat.bodied.query)) (rule (if phylum is elsewhere and body.in.segments is yes) (then class is segments)) (rule (if phylum is elsewhere and body.in.segments is no) (then class is unified)) (question (variable body.in.segments) (query body.in.segments.query)) (rule (if class is breasts and can.eat.meat is yes) (then order is meat)) (rule (if class is breasts and can.eat.meat is no) (then order is vegy)) (question (variable can.eat.meat) (query can.eat.meat.query)) (rule (if class is water and boney is yes) (then type.animal is fish)) (rule (if class is water and boney is no) (then type.animal is shark.ray)) (question (variable boney) (query boney.query)) (rule (if class is dry and scaly is yes) (then order is scales)) (rule (if class is dry and scaly is no) (then order is soft)) (question (variable scaly) (query scaly.query)) (rule (if class is segments and shell is yes) (then order is shell)) (rule (if class is segments and shell is no) (then type.animal is centipede.millipede.insect)) (question (variable shell) (query shell.query)) (rule (if class is unified and digest.cells is yes) (then order is cells)) (rule (if class is unified and digest.cells is no) (then order is stomach)) (question (variable digest.cells) (query digest.cells.query)) (rule (if order is meat and fly is yes) (then type.animal is bat)) (rule (if order is meat and fly is no) (then family is nowings)) (question (variable fly) (query fly.query)) (rule (if order is vegy and hooves is yes) (then family is hooves)) (rule (if order is vegy and hooves is no) (then family is feet)) (question (variable hooves) (query hooves.query)) (rule (if order is scales and rounded.shell is yes) (then type.animal is turtle)) (rule (if order is scales and rounded.shell is no) (then family is noshell)) (question (variable rounded.shell) (query rounded.shell.query)) (rule (if order is soft and jump is yes) (then type.animal is frog)) (rule (if order is soft and jump is no) (then type.animal is salamander)) (question (variable jump) (query jump.query)) (rule (if order is shell and tail is yes) (then type.animal is lobster)) (rule (if order is shell and tail is no) (then type.animal is crab)) (question (variable tail) (query tail.query)) (rule (if order is cells and stationary is yes) (then family is stationary)) (rule (if order is cells and stationary is no) (then type.animal is jellyfish)) (question (variable stationary) (query stationary.query)) (rule (if order is stomach and multicelled is yes) (then family is multicelled)) (rule (if order is stomach and multicelled is no) (then type.animal is protozoa)) (question (variable multicelled) (query multicelled.query)) (rule (if family is nowings and opposing.thumb is yes) (then genus is thumb)) (rule (if family is nowings and opposing.thumb is no) (then genus is nothumb)) (question (variable opposing.thumb) (query opposing.thumb.query)) (rule (if family is hooves and two.toes is yes) (then genus is twotoes)) (rule (if family is hooves and two.toes is no) (then genus is onetoe)) (question (variable two.toes) (query two.toes.query)) (rule (if family is feet and live.in.water is yes) (then genus is water)) (rule (if family is feet and live.in.water is no) (then genus is dry)) (question (variable live.in.water) (query live.in.water.query)) (rule (if family is noshell and limbs is yes) (then type.animal is crocodile.alligator)) (rule (if family is noshell and limbs is no) (then type.animal is snake)) (question (variable limbs) (query limbs.query)) (rule (if family is stationary and spikes is yes) (then type.animal is sea.anemone)) (rule (if family is stationary and spikes is no) (then type.animal is coral.sponge)) (question (variable spikes) (query spikes.query)) (rule (if family is multicelled and spiral.shell is yes) (then type.animal is snail)) (rule (if family is multicelled and spiral.shell is no) (then genus is noshell)) (question (variable spiral.shell) (query spiral.shell.query)) (rule (if genus is thumb and prehensile.tail is yes) (then type.animal is monkey)) (rule (if genus is thumb and prehensile.tail is no) (then species is notail)) (question (variable prehensile.tail) (query prehensile.tail.query)) (rule (if genus is nothumb and over.400 is yes) (then species is 400)) (rule (if genus is nothumb and over.400 is no) (then species is under400)) (question (variable over.400) (query over.400.query)) (rule (if genus is twotoes and horns is yes) (then species is horns)) (rule (if genus is twotoes and horns is no) (then species is nohorns)) (question (variable horns) (query horns.query)) (rule (if genus is onetoe and plating is yes) (then type.animal is rhinoceros)) (rule (if genus is onetoe and plating is no) (then type.animal is horse.zebra)) (question (variable plating) (query plating.query)) (rule (if genus is water and hunted is yes) (then type.animal is whale)) (rule (if genus is water and hunted is no) (then type.animal is dolphin.porpoise)) (question (variable hunted) (query hunted.query)) (rule (if genus is dry and front.teeth is yes) (then species is teeth)) (rule (if genus is dry and front.teeth is no) (then species is noteeth)) (question (variable front.teeth) (query front.teeth.query)) (rule (if genus is noshell and bivalve is yes) (then type.animal is clam.oyster)) (rule (if genus is noshell and bivalve is no) (then type.animal is squid.octopus)) (question (variable bivalve) (query bivalve.query)) (rule (if species is notail and nearly.hairless is yes) (then type.animal is man)) (rule (if species is notail and nearly.hairless is no) (then subspecies is hair)) (question (variable nearly.hairless) (query nearly.hairless.query)) (rule (if species is 400 and land.based is yes) (then type.animal is bear.tiger.lion)) (rule (if species is 400 and land.based is no) (then type.animal is walrus)) (question (variable land.based) (query land.based.query)) (rule (if species is under400 and thintail is yes) (then type.animal is cat)) (rule (if species is under400 and thintail is no) (then type.animal is coyote.wolf.fox.dog)) (question (variable thintail) (query thintail.query)) (rule (if species is nohorns and lives.in.desert is yes) (then type.animal is camel)) (rule (if species is nohorns and lives.in.desert is no and semi.aquatic is no) (then type.animal is giraffe)) (rule (if species is nohorns and lives.in.desert is no and semi.aquatic is yes) (then type.animal is hippopotamus)) (question (variable lives.in.desert) (query lives.in.desert.query)) (question (variable semi.aquatic) (query semi.aquatic.query)) (rule (if species is teeth and large.ears is yes) (then type.animal is rabbit)) (rule (if species is teeth and large.ears is no) (then type.animal is rat.mouse.squirrel.beaver.porcupine)) (question (variable large.ears) (query large.ears.query)) (rule (if species is noteeth and pouch is yes) (then type.animal is kangaroo.koala.bear)) (rule (if species is noteeth and pouch is no) (then type.animal is mole.shrew.elephant)) (question (variable pouch) (query pouch.query)) (rule (if subspecies is hair and long.powerful.arms is yes) (then type.animal is orangutan.gorilla.chimpanzee)) (rule (if subspecies is hair and long.powerful.arms is no) (then type.animal is baboon)) (question (variable long.powerful.arms) (query long.powerful.arms.query)) (rule (if species is horns and fleece is yes) (then type.animal is sheep.goat)) (rule (if species is horns and fleece is no) (then subsubspecies is nofleece)) (question (variable fleece) (query fleece.query)) (rule (if subsubspecies is nofleece and domesticated is yes) (then type.animal is cow)) (rule (if subsubspecies is nofleece and domesticated is no) (then type.animal is deer.moose.antelope)) (question (variable domesticated) (query domesticated.query)) (answer (prefix "I think your animal is a ") (variable type.animal) (postfix "."))) ================================================ FILE: samples/CLIPS/sudoku.clp ================================================ ;;; http://www.angusj.com/sudoku/hints ;;; http://www.scanraid.com/BasicStrategies.htm ;;; http://www.sudokuoftheday.com/pages/techniques-overview ;;; http://www.sudokuonline.us/sudoku_solving_techniques ;;; http://www.sadmansoftware.com/sudoku/techniques.htm ;;; http://www.krazydad.com/blog/2005/09/29/an-index-of-sudoku-strategies/ ;;; ####################### ;;; DEFTEMPLATES & DEFFACTS ;;; ####################### (deftemplate possible (slot row) (slot column) (slot value) (slot group) (slot id)) (deftemplate impossible (slot id) (slot value) (slot priority) (slot reason)) (deftemplate technique-employed (slot reason) (slot priority)) (deftemplate technique (slot name) (slot priority)) (deffacts startup (phase grid-values)) (deftemplate size-value (slot size) (slot value)) (deffacts values (size-value (size 1) (value 1)) (size-value (size 2) (value 2)) (size-value (size 2) (value 3)) (size-value (size 2) (value 4)) (size-value (size 3) (value 5)) (size-value (size 3) (value 6)) (size-value (size 3) (value 7)) (size-value (size 3) (value 8)) (size-value (size 3) (value 9)) (size-value (size 4) (value 10)) (size-value (size 4) (value 11)) (size-value (size 4) (value 12)) (size-value (size 4) (value 13)) (size-value (size 4) (value 14)) (size-value (size 4) (value 15)) (size-value (size 4) (value 16)) (size-value (size 5) (value 17)) (size-value (size 5) (value 18)) (size-value (size 5) (value 19)) (size-value (size 5) (value 20)) (size-value (size 5) (value 21)) (size-value (size 5) (value 22)) (size-value (size 5) (value 23)) (size-value (size 5) (value 24)) (size-value (size 5) (value 25))) ;;; ########### ;;; SETUP RULES ;;; ########### ;;; *********** ;;; stress-test ;;; *********** (defrule stress-test (declare (salience 10)) (phase match) (stress-test) (priority ?last) (not (priority ?p&:(> ?p ?last))) (technique (priority ?next&:(> ?next ?last))) (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next)))) => (assert (priority ?next))) ;;; ***************** ;;; enable-techniques ;;; ***************** (defrule enable-techniques (declare (salience 10)) (phase match) (size ?) (not (possible (value any))) => (assert (priority 1))) ;;; ********** ;;; expand-any ;;; ********** (defrule expand-any (declare (salience 10)) (phase expand-any) ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id)) (not (possible (value any) (id ?id2&:(< ?id2 ?id)))) (size ?s) (size-value (size ?as&:(<= ?as ?s)) (value ?v)) (not (possible (row ?r) (column ?c) (value ?v))) (not (and (size-value (value ?v2&:(< ?v2 ?v))) (not (possible (row ?r) (column ?c) (value ?v2))))) => (assert (possible (row ?r) (column ?c) (value ?v) (group ?g) (id ?id)))) ;;; ***************** ;;; position-expanded ;;; ***************** (defrule position-expanded (declare (salience 10)) (phase expand-any) ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id)) (size ?s) (not (and (size-value (size ?as&:(<= ?as ?s)) (value ?v)) (not (possible (row ?r) (column ?c) (value ?v))))) => (retract ?f)) ;;; ########### ;;; PHASE RULES ;;; ########### ;;; *************** ;;; expand-any-done ;;; *************** (defrule expand-any-done (declare (salience 10)) ?f <- (phase expand-any) (not (possible (value any))) => (retract ?f) (assert (phase initial-output)) (assert (print-position 1 1))) ;;; *********** ;;; begin-match ;;; *********** (defrule begin-match (declare (salience -20)) ?f <- (phase initial-output) => (retract ?f) (assert (phase match))) ;;; ***************** ;;; begin-elimination ;;; ***************** (defrule begin-elimination (declare (salience -20)) ?f <- (phase match) (not (not (impossible))) => (retract ?f) (assert (phase elimination))) ;;; ************* ;;; next-priority ;;; ************* (defrule next-priority (declare (salience -20)) (phase match) (not (impossible)) (priority ?last) (not (priority ?p&:(> ?p ?last))) (technique (priority ?next&:(> ?next ?last))) (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next)))) => (assert (priority ?next))) ;;; ************ ;;; begin-output ;;; ************ (defrule begin-output (declare (salience -20)) ?f <- (phase match) (not (impossible)) (priority ?last) (not (priority ?p&:(> ?p ?last))) (not (technique (priority ?next&:(> ?next ?last)))) => (retract ?f) (assert (phase final-output)) (assert (print-position 1 1))) ================================================ FILE: samples/CMake/filenames/CMakeLists.txt ================================================ cmake_minimum_required(VERSION 2.8) project(Foo) set(CMAKE_SKIP_RPATH TRUE) set(CMAKE_INSTALL_PREFIX "/usr/local") add_subdirectory(bar) add_executable(foo foo.c) target_link_libraries(foo pthread) install(TARGETS foo DESTINATION bin) ================================================ FILE: samples/CMake/sample1.cmake ================================================ cmake_minimum_required(VERSION 2.6) enable_testing() set(CMAKE_BUILD_TYPE debug) include_directories("/usr/local/include") find_library(ssl_LIBRARY NAMES ssl PATHS "/usr/local/lib") add_custom_command(OUTPUT "ver.c" "ver.h" COMMAND ./ver.sh) add_executable(foo foo.c bar.c baz.c ver.c) target_link_libraries(foo ${ssl_LIBRARY}) ================================================ FILE: samples/CMake/sample2.cmake ================================================ cmake_minimum_required(VERSION 2.8 FATAL_ERROR) project(PCLVisualizer) target_link_libraries (PCLVisualizer ${PCL_LIBRARIES}) #it seems it's needed only on OS X 10.9 find_package(GLEW REQUIRED) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -I/usr/include -v") find_package(PCL 1.7 REQUIRED) include_directories(${PCL_INCLUDE_DIRS}) link_directories(${PCL_LIBRARY_DIRS}) add_definitions(${PCL_DEFINITIONS}) set(PCL_BUILD_TYPE Release) file(GLOB PCL_openni_viewer_SRC "src/*.h" "src/*.cpp" ) add_executable(PCLVisualizer ${PCL_openni_viewer_SRC}) #add this line to solve probem in mac os x 10.9 target_link_libraries(PCLVisualizer ${PCL_COMMON_LIBRARIES} ${PCL_IO_LIBRARIES} ${PCL_VISUALIZATION_LIBRARIES} ${PCL_FEATURES_LIBRARIES}) ================================================ FILE: samples/CMake/sample3.cmake ================================================ # Specifications for building user and development documentation. # # ==================================================================== # Copyright (c) 2009 Ian Blumel. All rights reserved. # # This software is licensed as described in the file LICENSE, which # you should have received as part of this distribution. # ==================================================================== CMAKE_MINIMUM_REQUIRED(VERSION 2.6) FIND_FILE( SPHINX sphinx-build.exe) # If we are windows call to the make.bat file, otherwise rely on the Makefile # to handle the processing. IF(WIN32) SET(SPHINX_MAKE make.bat) ELSE(WIN32) SET(SPHINX_MAKE make) ENDIF(WIN32) ADD_CUSTOM_TARGET( doc_usr COMMAND ${SPHINX_MAKE} html WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/usr ) ADD_CUSTOM_TARGET( doc_dev COMMAND ${SPHINX_MAKE} html WORKING_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR}/dev ) ================================================ FILE: samples/CMake/sample4.cmake ================================================ cmake_minimum_required (VERSION 2.6) set (CMAKE_RUNTIME_OUTPUT_DIRECTORY "bin") list(APPEND CMAKE_MODULE_PATH ${CMAKE_SOURCE_DIR}/cmake/vala) find_package(Vala REQUIRED) include(ValaPrecompile) include(ValaVersion) ensure_vala_version("0.11.0" MINIMUM) project (template C) find_package(PkgConfig) pkg_check_modules(GOBJECT REQUIRED gobject-2.0) add_definitions(${GOBJECT_CFLAGS} ${GOBJECT_CFLAGS_OTHER}) link_libraries(${GOBJECT_LIBRARIES}) link_directories(${GOBJECT_LIBRARY_DIRS}) vala_precompile(VALA_C src/template.vala PACKAGES OPTIONS --thread CUSTOM_VAPIS GENERATE_VAPI GENERATE_HEADER DIRECTORY gen ) add_executable("template" ${VALA_C}) ================================================ FILE: samples/CMake/sample5.cmake ================================================ # - Check if the STDCALL function exists. # This works for non-cdecl functions (kernel32 functions, for example) # CHECK_STDCALL_FUNCTION_EXISTS(FUNCTION FUNCTION_DUMMY_ARGS VARIABLE) # - macro which checks if the stdcall function exists # FUNCTION_DECLARATION - the definition of the function ( e.g.: Sleep(500) ) # VARIABLE - variable to store the result # # The following variables may be set before calling this macro to # modify the way the check is run: # # CMAKE_REQUIRED_FLAGS = string of compile command line flags # CMAKE_REQUIRED_DEFINITIONS = list of macros to define (-DFOO=bar) # CMAKE_REQUIRED_INCLUDES = list of include directories # CMAKE_REQUIRED_LIBRARIES = list of libraries to link # CMAKE_EXTRA_INCLUDE_FILES = list of extra includes to check in MACRO(CHECK_STDCALL_FUNCTION_EXISTS FUNCTION_DECLARATION VARIABLE) IF("${VARIABLE}" MATCHES "^${VARIABLE}$") #get includes SET(CHECK_STDCALL_FUNCTION_PREMAIN) FOREACH(def ${CMAKE_EXTRA_INCLUDE_FILES}) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"${def}\"\n") ENDFOREACH(def) #add some default includes IF ( HAVE_WINDOWS_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"windows.h\"\n") ENDIF ( HAVE_WINDOWS_H ) IF ( HAVE_UNISTD_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"unistd.h\"\n") ENDIF ( HAVE_UNISTD_H ) IF ( HAVE_DIRECT_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"direct.h\"\n") ENDIF ( HAVE_DIRECT_H ) IF ( HAVE_IO_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"io.h\"\n") ENDIF ( HAVE_IO_H ) IF ( HAVE_SYS_TIMEB_H ) SET(CHECK_STDCALL_FUNCTION_PREMAIN "${CHECK_STDCALL_FUNCTION_PREMAIN}#include \"sys/timeb.h\"\n") ENDIF ( HAVE_SYS_TIMEB_H ) STRING(REGEX REPLACE "(\\(.*\\))" "" CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION ${FUNCTION_DECLARATION} ) SET(MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS "${CMAKE_REQUIRED_FLAGS}") MESSAGE(STATUS "Looking for ${CHECK_STDCALL_FUNCTION_EXISTS_FUNCTION}") IF(CMAKE_REQUIRED_LIBRARIES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES "-DLINK_LIBRARIES:STRING=${CMAKE_REQUIRED_LIBRARIES}") ELSE(CMAKE_REQUIRED_LIBRARIES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES) ENDIF(CMAKE_REQUIRED_LIBRARIES) IF(CMAKE_REQUIRED_INCLUDES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES "-DINCLUDE_DIRECTORIES:STRING=${CMAKE_REQUIRED_INCLUDES}") ELSE(CMAKE_REQUIRED_INCLUDES) SET(CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES) ENDIF(CMAKE_REQUIRED_INCLUDES) SET(CHECK_STDCALL_FUNCTION_DECLARATION ${FUNCTION_DECLARATION}) CONFIGURE_FILE("${clucene-shared_SOURCE_DIR}/cmake/CheckStdCallFunctionExists.cpp.in" "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" IMMEDIATE @ONLY) FILE(READ "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" CHECK_STDCALL_FUNCTION_CONTENT) TRY_COMPILE(${VARIABLE} ${CMAKE_BINARY_DIR} "${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeTmp/CheckStdCallFunctionExists.cpp" COMPILE_DEFINITIONS ${CMAKE_REQUIRED_DEFINITIONS} CMAKE_FLAGS -DCOMPILE_DEFINITIONS:STRING=${MACRO_CHECK_STDCALL_FUNCTION_DEFINITIONS} "${CHECK_STDCALL_FUNCTION_EXISTS_ADD_LIBRARIES}" "${CHECK_STDCALL_FUNCTION_EXISTS_ADD_INCLUDES}" OUTPUT_VARIABLE OUTPUT) IF(${VARIABLE}) SET(${VARIABLE} 1 CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}") MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - found") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeOutput.log "Determining if the stdcall function ${FUNCTION_DECLARATION} exists passed with the following output:\n" "${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n") ELSE(${VARIABLE}) MESSAGE(STATUS "Looking for ${FUNCTION_DECLARATION} - not found") SET(${VARIABLE} "" CACHE INTERNAL "Have function ${FUNCTION_DECLARATION}") FILE(APPEND ${CMAKE_BINARY_DIR}${CMAKE_FILES_DIRECTORY}/CMakeError.log "Determining if the stdcall function ${FUNCTION_DECLARATION} exists failed with the following output:\n" "${OUTPUT}\nCheckStdCallFunctionExists.cpp:\n${CHECK_STDCALL_FUNCTION_CONTENT}\n\n") ENDIF(${VARIABLE}) ENDIF("${VARIABLE}" MATCHES "^${VARIABLE}$") ENDMACRO(CHECK_STDCALL_FUNCTION_EXISTS) ================================================ FILE: samples/CMake/uninstall.cmake.in ================================================ IF (NOT EXISTS "@PROJECT_BINARY_DIR@/install_manifest.txt") MESSAGE (FATAL_ERROR "Cannot find install manifest: \"@PROJECT_BINARY_DIR@/install_manifest.txt\"") ENDIF (NOT EXISTS "@PROJECT_BINARY_DIR@/install_manifest.txt") FILE (READ "@PROJECT_BINARY_DIR@/install_manifest.txt" files) STRING (REGEX REPLACE "\n" ";" files "${files}") FOREACH (file ${files}) MESSAGE (STATUS "Uninstalling \"$ENV{DESTDIR}${file}\"") IF (EXISTS "$ENV{DESTDIR}${file}") EXEC_PROGRAM ( "@CMAKE_COMMAND@" ARGS "-E remove \"$ENV{DESTDIR}${file}\"" OUTPUT_VARIABLE rm_out RETURN_VALUE rm_retval ) IF (NOT "${rm_retval}" STREQUAL 0) MESSAGE (FATAL_ERROR "Problem when removing \"$ENV{DESTDIR}${file}\"") ENDIF (NOT "${rm_retval}" STREQUAL 0) ELSE (EXISTS "$ENV{DESTDIR}${file}") MESSAGE (STATUS "File \"$ENV{DESTDIR}${file}\" does not exist.") ENDIF (EXISTS "$ENV{DESTDIR}${file}") ENDFOREACH (file) ================================================ FILE: samples/COBOL/hello_world.cbl ================================================ program-id. hello. procedure division. display "Hello, World!". stop run. ================================================ FILE: samples/COBOL/hello_world.ccp ================================================ IDENTIFICATION DIVISION. PROGRAM-ID. hello. PROCEDURE DIVISION. DISPLAY "Hello World, yet again.". STOP RUN. ================================================ FILE: samples/COBOL/hello_world.cob ================================================ IDENTIFICATION DIVISION. PROGRAM-ID. hello. PROCEDURE DIVISION. DISPLAY "Hello World!". STOP RUN. ================================================ FILE: samples/COBOL/simple.cpy ================================================ 01 COBOL-TEST-RECORD. 05 COBOL-TEST-USAGES. 10 COBOL-4-COMP PIC S9(4) COMP. 10 COBOL-8-COMP PIC S9(8) COMP. 10 COBOL-9-COMP PIC S9(9) COMP. 10 COBOL-4-COMP2 PIC S9(4) COMP-2. 10 COBOL-7-COMP2 PIC 9(7) COMP-2. ================================================ FILE: samples/CODEOWNERS/filenames/CODEOWNERS ================================================ # Lines starting with '#' are comments. # Each line is a file pattern followed by one or more owners. # More details are here: https://help.github.com/articles/about-codeowners/ # The '*' pattern is global owners. # Order is important. The last matching pattern has the most precedence. # The folders are ordered as follows: # In each subsection folders are ordered first by depth, then alphabetically. # This should make it easy to add new rules without breaking existing ones. # Global rule: * @dotnet/docs # C# samples: /csharp/** @BillWagner # ML.NET samples: /machine-learning/** @luisquintanilla # WPF folders: /wpf/** @adegeo # Windows forms areas: /windowsforms/** @adegeo @dotnet/dotnet-winforms #-------------------------------------------------------# # https://github.com/dotnet/samples/blob/master/LICENSE # # CC Attribution 4.0 International # #-------------------------------------------------------# ================================================ FILE: samples/CQL/alter_materialized_view.cql ================================================ ALTER MATERIALIZED VIEW cycling.cyclist_by_age WITH comment = 'A most excellent and useful view' AND bloom_filter_fp_chance = 0.02; ALTER MATERIALIZED VIEW cycling.cyclist_by_age WITH compression = { 'sstable_compression' : 'DeflateCompressor', 'chunk_length_kb' : 64 } AND compaction = { 'class' : 'SizeTieredCompactionStrategy', 'max_threshold' : 64 }; ALTER MATERIALIZED VIEW cycling.cyclist_by_age WITH caching = { 'keys' : 'NONE', 'rows_per_partition' : '15' }; ================================================ FILE: samples/CQL/alter_role.cql ================================================ ALTER ROLE sandy WITH PASSWORD = 'bestTeam'; ALTER ROLE sandy WITH SUPERUSER=true; ALTER ROLE team_manager WITH LOGIN=true; ================================================ FILE: samples/CQL/alter_table.cql ================================================ ALTER TABLE cycling.cyclist_races ADD manager UUID; ALTER TABLE cycling.cyclist_races ADD completed list; ALTER TABLE cycling.cyclist_races; DROP manager; ALTER TABLE cycling.race_times RENAME race_date TO date; ALTER TABLE food_cql_conversion.person WITH VERTEX LABEL "person"; ALTER TABLE food_cql_conversion.person_authored_book WITH EDGE LABEL "authored" FROM person(person_name, person_id) TO book(book_name, book_id); ALTER TABLE food.person RENAME VERTEX LABEL TO "personX"; ALTER TABLE food."person_authored_book" RENAME EDGE LABEL TO "authoredX"; ALTER TABLE food.person WITHOUT VERTEX LABEL "personX"; ALTER TABLE food."person_authored_book" WITHOUT EDGE LABEL "authoredX"; ALTER TABLE cycling.cyclist_base WITH comment = 'basic cyclist information'; ALTER TABLE cycling.comments WITH caching = { 'keys' : 'NONE', 'rows_per_partition' : 10 }; ALTER TABLE cycling.cyclist_base WITH speculative_retry = '95percentile'; ALTER TABLE cycling.cyclist_base WITH speculative_retry = '10ms'; ALTER TABLE cycling.comments WITH COMPACTION = { 'class' : 'SizeTieredCompactionStrategy', 'enabled' : 'false' }; ================================================ FILE: samples/CQL/alter_type.cql ================================================ ALTER TYPE cycling.fullname ADD middlename text; ALTER TYPE cycling.fullname RENAME middlename TO middle AND lastname TO last AND firstname TO first; ================================================ FILE: samples/CQL/comments.cql ================================================ // @xx -- @xx /* This is the first line of of a comment that spans multiple lines */ CREATE ROLE IF NOT EXISTS coach -- End of line comment WITH LOGIN = true AND PASSWORD = 'All4One2day!'; CREATE ROLE IF NOT EXISTS sys_admin // End of line comment WITH LOGIN = true AND PASSWORD = 'changeme' AND SUPERUSER = true; /* @name some block */ ================================================ FILE: samples/CQL/create_keyspace.cql ================================================ CREATE KEYSPACE IF NOT EXISTS cycling WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; CREATE KEYSPACE food_cql WITH REPLICATION = { 'class': 'SimpleStrategy', 'replication_factor': 1 } AND graph_engine = 'Core'; CREATE KEYSPACE cycling WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'dc1' : 1 }; CREATE KEYSPACE IF NOT EXISTS cycling WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1': '3', 'datacenter2': '3' }; CREATE KEYSPACE cycling WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'datacenter1' : 3 } AND DURABLE_WRITES = false; ================================================ FILE: samples/CQL/videodb.cql ================================================ CREATE KEYSPACE videod WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 }; use videodb; // Basic entity table // Object mapping ? CREATE TABLE users ( username varchar, firstname varchar, lastname varchar, email varchar, password varchar, created_date timestamp, total_credits int, credit_change_date timeuuid, PRIMARY KEY (username) ); // One-to-many entity table CREATE TABLE videos ( videoid uuid, videoname varchar, username varchar, description varchar, tags list, upload_date timestamp, PRIMARY KEY (videoid) ); // One-to-many from the user point of view // Also know as a lookup table CREATE TABLE username_video_index ( username varchar, videoid uuid, upload_date timestamp, videoname varchar, PRIMARY KEY (username, videoid) ); // Counter table CREATE TABLE video_rating ( videoid uuid, rating_counter counter, rating_total counter, PRIMARY KEY (videoid) ); // Creating index tables for tab keywords CREATE TABLE tag_index ( tag varchar, videoid uuid, timestamp timestamp, PRIMARY KEY (tag, videoid) ); // Comments as a many-to-many // Looking from the video side to many users CREATE TABLE comments_by_video ( videoid uuid, username varchar, comment_ts timestamp, comment varchar, PRIMARY KEY (videoid, comment_ts, username) ) WITH CLUSTERING ORDER BY (comment_ts DESC, username ASC); // looking from the user side to many videos CREATE TABLE comments_by_user ( username varchar, videoid uuid, comment_ts timestamp, comment varchar, PRIMARY KEY (username, comment_ts, videoid) ) WITH CLUSTERING ORDER BY (comment_ts DESC, videoid ASC); // Time series wide row with reverse comparator CREATE TABLE video_event ( videoid uuid, username varchar, event varchar, event_timestamp timeuuid, video_timestamp bigint, PRIMARY KEY ((videoid, username), event_timestamp, event) ) WITH CLUSTERING ORDER BY (event_timestamp DESC, event ASC); ================================================ FILE: samples/CSON/base.cson ================================================ 'atom-text-editor': # Platform Bindings 'home': 'editor:move-to-first-character-of-line' 'end': 'editor:move-to-end-of-screen-line' 'shift-home': 'editor:select-to-first-character-of-line' 'shift-end': 'editor:select-to-end-of-line' 'atom-text-editor:not([mini])': # Atom Specific 'ctrl-C': 'editor:copy-path' # Sublime Parity 'tab': 'editor:indent' 'enter': 'editor:newline' 'shift-tab': 'editor:outdent-selected-rows' 'ctrl-K': 'editor:delete-line' '.select-list atom-text-editor[mini]': 'enter': 'core:confirm' '.tool-panel.panel-left, .tool-panel.panel-right': 'escape': 'tool-panel:unfocus' 'atom-text-editor !important, atom-text-editor[mini] !important': 'escape': 'editor:consolidate-selections' # allow standard input fields to work correctly 'body .native-key-bindings': 'tab': 'core:focus-next' 'shift-tab': 'core:focus-previous' 'enter': 'native!' 'backspace': 'native!' 'shift-backspace': 'native!' 'delete': 'native!' 'up': 'native!' 'down': 'native!' 'shift-up': 'native!' 'shift-down': 'native!' 'alt-up': 'native!' 'alt-down': 'native!' 'alt-shift-up': 'native!' 'alt-shift-down': 'native!' 'cmd-up': 'native!' 'cmd-down': 'native!' 'cmd-shift-up': 'native!' 'cmd-shift-down': 'native!' 'ctrl-up': 'native!' 'ctrl-down': 'native!' 'ctrl-shift-up': 'native!' 'ctrl-shift-down': 'native!' 'left': 'native!' 'right': 'native!' 'shift-left': 'native!' 'shift-right': 'native!' 'alt-left': 'native!' 'alt-right': 'native!' 'alt-shift-left': 'native!' 'alt-shift-right': 'native!' 'cmd-left': 'native!' 'cmd-right': 'native!' 'cmd-shift-left': 'native!' 'cmd-shift-right': 'native!' 'ctrl-left': 'native!' 'ctrl-right': 'native!' 'ctrl-shift-left': 'native!' 'ctrl-shift-right': 'native!' 'ctrl-b': 'native!' 'ctrl-f': 'native!' 'ctrl-F': 'native!' 'ctrl-B': 'native!' 'ctrl-h': 'native!' 'ctrl-d': 'native!' ================================================ FILE: samples/CSON/config.cson ================================================ directoryIcons: Atom: icon: "atom" match: /^\.atom$/ colour: "dark-green" Bower: icon: "bower" match: /^bower[-_]components$/ colour: "bower" Dropbox: icon: "dropbox" match: /^(?:Dropbox|\.dropbox\.cache)$/ colour: "medium-blue" Git: icon: "git" match: /^\.git$/ GitHub: icon: "github" match: /^\.github$/ Meteor: icon: "meteor" match: /^\.meteor$/ NodeJS: icon: "node" match: /^node_modules$/ colour: "medium-green" Package: icon: "package" match: /^\.bundle$/i TextMate: icon: "textmate" match: ".tmBundle" fileIcons: ABAP: icon: "abap" scope: "abp" match: ".abap" colour: "medium-orange" ActionScript: # Or Flash-related icon: "as" match: [ [".swf", "medium-blue"] [".as", "medium-red", scope: /\.(?:flex-config|actionscript(?:\.\d+)?)$/i, alias: /ActionScript\s?3|as3/i] [".jsfl", "auto-yellow"] [".swc", "dark-red"] ] ================================================ FILE: samples/CSON/ff-sfd.cson ================================================ name: "Spline Font Database" scopeName: "text.sfd" fileTypes: ["sfd"] firstLineMatch: "^SplineFontDB: [\\d.]+" patterns: [include: "#main"] repository: main: patterns: [ {include: "#punctuation"} {include: "#private"} {include: "#image"} {include: "#pickleData"} {include: "#sections"} {include: "#copyright"} {include: "#property"} {include: "#control"} {include: "#address"} {include: "#encoding"} {include: "source.fontforge#shared"} {include: "#colour"} ] punctuation: patterns: [ {match: "<|>", name: "punctuation.definition.brackets.angle.sfd"} {match: "[{}]", name: "punctuation.definition.brackets.curly.sfd"} ] private: name: "meta.section.private.sfd" begin: "^BeginPrivate(?=:)" end: "^EndPrivate\\b" beginCaptures: 0: name: "keyword.control.begin.private.sfd" endCaptures: 0: name: "keyword.control.end.private.sfd" patterns: [ {match: "^\\S+", name: "entity.name.private.property.sfd"} {include: "$self"} ] image: name: "meta.image.sfd" begin: "^(Image)(?=:)(.+)$" end: "^(EndImage)\\b" contentName: "string.unquoted.raw.data.sfd" beginCaptures: 1: name: "keyword.control.begin.image.sfd" 2: patterns: [include: "$self"] endCaptures: 1: name: "keyword.control.end.image.sfd" pickleData: name: "meta.pickle-data.sfd" begin: "^(PickledData)(:)\\s*(\")" end: '"' beginCaptures: 1: name: "entity.name.property.sfd" 2: name: "punctuation.separator.dictionary.key-value.sfd" 3: name: "punctuation.definition.string.begin.sfd" endCaptures: 0: name: "punctuation.definition.string.end.sfd" patterns: [match: "\\\\.", name: "constant.character.escape.sfd"] sections: name: "meta.section.${2:/downcase}.sfd" begin: "^(Start|Begin)([A-Z]\\w+)(?=:)" end: "^(End\\2)\\b" beginCaptures: 0: name: "keyword.control.begin.${2:/downcase}.sfd" endCaptures: 0: name: "keyword.control.end.${2:/downcase}.sfd" patterns: [include: "$self"] control: name: "keyword.control.${1:/downcase}.sfd" match: "\\b(Fore|Back|SplineSet|^End\\w+)\\b" colour: name: "constant.other.hex.colour.sfd" match: "(#)[A-Fa-f0-9]{3,}|(?<=\\s)[A-Fa-f0-9]{6,8}" captures: 1: name: "punctuation.definition.colour.sfd" encoding: name: "constant.language.encoding.sfd" match: "(?i)\\b(ISO[-\\w]+)(?<=\\d)(?=\\s|$)" # Don't highlight numbers in freeform strings (years/version strings) copyright: name: "meta.${1:/downcase}-string.sfd" begin: "^(Copyright|U?Comments?|\\w+Name)(:)" end: "$" beginCaptures: 1: name: "entity.name.property.sfd" 2: name: "punctuation.separator.dictionary.key-value.sfd" patterns: [include: "source.fontforge#stringEscapes"] # No idea what this is, but it looks distracting without a fix # Assuming it's referring to a memory register or something. address: match: "\\d+[xX][A-Fa-f0-9]+" name: "constant.numeric.hexadecimal.sfd" property: match: "^([^:]+)(:)" name: "meta.dictionary.key-value.sfd" captures: 1: name: "entity.name.property.sfd" 2: name: "punctuation.separator.dictionary.key-value.sfd" ================================================ FILE: samples/CSON/wercker-status.cson ================================================ 'menu': [ { 'label': 'Packages' 'submenu': [ 'label': 'Wercker Status' 'submenu': [ { 'label': 'Check now!', 'command': 'wercker-status:checknow' } ] ] } ] ================================================ FILE: samples/CSS/bootstrap.css ================================================ /*! * Bootstrap v2.3.1 * * Copyright 2012 Twitter, Inc * Licensed under the Apache License v2.0 * http://www.apache.org/licenses/LICENSE-2.0 * * Designed and built with all the love in the world @twitter by @mdo and @fat. */ .clearfix { *zoom: 1; } .clearfix:before, .clearfix:after { display: table; content: ""; line-height: 0; } .clearfix:after { clear: both; } .hide-text { font: 0/0 a; color: transparent; text-shadow: none; background-color: transparent; border: 0; } .input-block-level { display: block; width: 100%; min-height: 30px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } article, aside, details, figcaption, figure, footer, header, hgroup, nav, section { display: block; } audio, canvas, video { display: inline-block; *display: inline; *zoom: 1; } audio:not([controls]) { display: none; } html { font-size: 100%; -webkit-text-size-adjust: 100%; -ms-text-size-adjust: 100%; } a:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } a:hover, a:active { outline: 0; } sub, sup { position: relative; font-size: 75%; line-height: 0; vertical-align: baseline; } sup { top: -0.5em; } sub { bottom: -0.25em; } img { /* Responsive images (ensure images don't scale beyond their parents) */ max-width: 100%; /* Part 1: Set a maxium relative to the parent */ width: auto\9; /* IE7-8 need help adjusting responsive images */ height: auto; /* Part 2: Scale the height according to the width, otherwise you get stretching */ vertical-align: middle; border: 0; -ms-interpolation-mode: bicubic; } #map_canvas img, .google-maps img { max-width: none; } button, input, select, textarea { margin: 0; font-size: 100%; vertical-align: middle; } button, input { *overflow: visible; line-height: normal; } button::-moz-focus-inner, input::-moz-focus-inner { padding: 0; border: 0; } button, html input[type="button"], input[type="reset"], input[type="submit"] { -webkit-appearance: button; cursor: pointer; } label, select, button, input[type="button"], input[type="reset"], input[type="submit"], input[type="radio"], input[type="checkbox"] { cursor: pointer; } input[type="search"] { -webkit-box-sizing: content-box; -moz-box-sizing: content-box; box-sizing: content-box; -webkit-appearance: textfield; } input[type="search"]::-webkit-search-decoration, input[type="search"]::-webkit-search-cancel-button { -webkit-appearance: none; } textarea { overflow: auto; vertical-align: top; } @media print { * { text-shadow: none !important; color: #000 !important; background: transparent !important; box-shadow: none !important; } a, a:visited { text-decoration: underline; } a[href]:after { content: " (" attr(href) ")"; } abbr[title]:after { content: " (" attr(title) ")"; } .ir a:after, a[href^="javascript:"]:after, a[href^="#"]:after { content: ""; } pre, blockquote { border: 1px solid #999; page-break-inside: avoid; } thead { display: table-header-group; } tr, img { page-break-inside: avoid; } img { max-width: 100% !important; } @page { margin: 0.5cm; } p, h2, h3 { orphans: 3; widows: 3; } h2, h3 { page-break-after: avoid; } } body { margin: 0; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 14px; line-height: 20px; color: #333333; background-color: #ffffff; } a { color: #0088cc; text-decoration: none; } a:hover, a:focus { color: #005580; text-decoration: underline; } .img-rounded { -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .img-polaroid { padding: 4px; background-color: #fff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .img-circle { -webkit-border-radius: 500px; -moz-border-radius: 500px; border-radius: 500px; } .row { margin-left: -20px; *zoom: 1; } .row:before, .row:after { display: table; content: ""; line-height: 0; } .row:after { clear: both; } [class*="span"] { float: left; min-height: 1px; margin-left: 20px; } .container, .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { width: 940px; } .span12 { width: 940px; } .span11 { width: 860px; } .span10 { width: 780px; } .span9 { width: 700px; } .span8 { width: 620px; } .span7 { width: 540px; } .span6 { width: 460px; } .span5 { width: 380px; } .span4 { width: 300px; } .span3 { width: 220px; } .span2 { width: 140px; } .span1 { width: 60px; } .offset12 { margin-left: 980px; } .offset11 { margin-left: 900px; } .offset10 { margin-left: 820px; } .offset9 { margin-left: 740px; } .offset8 { margin-left: 660px; } .offset7 { margin-left: 580px; } .offset6 { margin-left: 500px; } .offset5 { margin-left: 420px; } .offset4 { margin-left: 340px; } .offset3 { margin-left: 260px; } .offset2 { margin-left: 180px; } .offset1 { margin-left: 100px; } .row-fluid { width: 100%; *zoom: 1; } .row-fluid:before, .row-fluid:after { display: table; content: ""; line-height: 0; } .row-fluid:after { clear: both; } .row-fluid [class*="span"] { display: block; width: 100%; min-height: 30px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; float: left; margin-left: 2.127659574468085%; *margin-left: 2.074468085106383%; } .row-fluid [class*="span"]:first-child { margin-left: 0; } .row-fluid .controls-row [class*="span"] + [class*="span"] { margin-left: 2.127659574468085%; } .row-fluid .span12 { width: 100%; *width: 99.94680851063829%; } .row-fluid .span11 { width: 91.48936170212765%; *width: 91.43617021276594%; } .row-fluid .span10 { width: 82.97872340425532%; *width: 82.92553191489361%; } .row-fluid .span9 { width: 74.46808510638297%; *width: 74.41489361702126%; } .row-fluid .span8 { width: 65.95744680851064%; *width: 65.90425531914893%; } .row-fluid .span7 { width: 57.44680851063829%; *width: 57.39361702127659%; } .row-fluid .span6 { width: 48.93617021276595%; *width: 48.88297872340425%; } .row-fluid .span5 { width: 40.42553191489362%; *width: 40.37234042553192%; } .row-fluid .span4 { width: 31.914893617021278%; *width: 31.861702127659576%; } .row-fluid .span3 { width: 23.404255319148934%; *width: 23.351063829787233%; } .row-fluid .span2 { width: 14.893617021276595%; *width: 14.840425531914894%; } .row-fluid .span1 { width: 6.382978723404255%; *width: 6.329787234042553%; } .row-fluid .offset12 { margin-left: 104.25531914893617%; *margin-left: 104.14893617021275%; } .row-fluid .offset12:first-child { margin-left: 102.12765957446808%; *margin-left: 102.02127659574467%; } .row-fluid .offset11 { margin-left: 95.74468085106382%; *margin-left: 95.6382978723404%; } .row-fluid .offset11:first-child { margin-left: 93.61702127659574%; *margin-left: 93.51063829787232%; } .row-fluid .offset10 { margin-left: 87.23404255319149%; *margin-left: 87.12765957446807%; } .row-fluid .offset10:first-child { margin-left: 85.1063829787234%; *margin-left: 84.99999999999999%; } .row-fluid .offset9 { margin-left: 78.72340425531914%; *margin-left: 78.61702127659572%; } .row-fluid .offset9:first-child { margin-left: 76.59574468085106%; *margin-left: 76.48936170212764%; } .row-fluid .offset8 { margin-left: 70.2127659574468%; *margin-left: 70.10638297872339%; } .row-fluid .offset8:first-child { margin-left: 68.08510638297872%; *margin-left: 67.9787234042553%; } .row-fluid .offset7 { margin-left: 61.70212765957446%; *margin-left: 61.59574468085106%; } .row-fluid .offset7:first-child { margin-left: 59.574468085106375%; *margin-left: 59.46808510638297%; } .row-fluid .offset6 { margin-left: 53.191489361702125%; *margin-left: 53.085106382978715%; } .row-fluid .offset6:first-child { margin-left: 51.063829787234035%; *margin-left: 50.95744680851063%; } .row-fluid .offset5 { margin-left: 44.68085106382979%; *margin-left: 44.57446808510638%; } .row-fluid .offset5:first-child { margin-left: 42.5531914893617%; *margin-left: 42.4468085106383%; } .row-fluid .offset4 { margin-left: 36.170212765957444%; *margin-left: 36.06382978723405%; } .row-fluid .offset4:first-child { margin-left: 34.04255319148936%; *margin-left: 33.93617021276596%; } .row-fluid .offset3 { margin-left: 27.659574468085104%; *margin-left: 27.5531914893617%; } .row-fluid .offset3:first-child { margin-left: 25.53191489361702%; *margin-left: 25.425531914893618%; } .row-fluid .offset2 { margin-left: 19.148936170212764%; *margin-left: 19.04255319148936%; } .row-fluid .offset2:first-child { margin-left: 17.02127659574468%; *margin-left: 16.914893617021278%; } .row-fluid .offset1 { margin-left: 10.638297872340425%; *margin-left: 10.53191489361702%; } .row-fluid .offset1:first-child { margin-left: 8.51063829787234%; *margin-left: 8.404255319148938%; } [class*="span"].hide, .row-fluid [class*="span"].hide { display: none; } [class*="span"].pull-right, .row-fluid [class*="span"].pull-right { float: right; } .container { margin-right: auto; margin-left: auto; *zoom: 1; } .container:before, .container:after { display: table; content: ""; line-height: 0; } .container:after { clear: both; } .container-fluid { padding-right: 20px; padding-left: 20px; *zoom: 1; } .container-fluid:before, .container-fluid:after { display: table; content: ""; line-height: 0; } .container-fluid:after { clear: both; } p { margin: 0 0 10px; } .lead { margin-bottom: 20px; font-size: 21px; font-weight: 200; line-height: 30px; } small { font-size: 85%; } strong { font-weight: bold; } em { font-style: italic; } cite { font-style: normal; } .muted { color: #999999; } a.muted:hover, a.muted:focus { color: #808080; } .text-warning { color: #c09853; } a.text-warning:hover, a.text-warning:focus { color: #a47e3c; } .text-error { color: #b94a48; } a.text-error:hover, a.text-error:focus { color: #953b39; } .text-info { color: #3a87ad; } a.text-info:hover, a.text-info:focus { color: #2d6987; } .text-success { color: #468847; } a.text-success:hover, a.text-success:focus { color: #356635; } .text-left { text-align: left; } .text-right { text-align: right; } .text-center { text-align: center; } h1, h2, h3, h4, h5, h6 { margin: 10px 0; font-family: inherit; font-weight: bold; line-height: 20px; color: inherit; text-rendering: optimizelegibility; } h1 small, h2 small, h3 small, h4 small, h5 small, h6 small { font-weight: normal; line-height: 1; color: #999999; } h1, h2, h3 { line-height: 40px; } h1 { font-size: 38.5px; } h2 { font-size: 31.5px; } h3 { font-size: 24.5px; } h4 { font-size: 17.5px; } h5 { font-size: 14px; } h6 { font-size: 11.9px; } h1 small { font-size: 24.5px; } h2 small { font-size: 17.5px; } h3 small { font-size: 14px; } h4 small { font-size: 14px; } .page-header { padding-bottom: 9px; margin: 20px 0 30px; border-bottom: 1px solid #eeeeee; } ul, ol { padding: 0; margin: 0 0 10px 25px; } ul ul, ul ol, ol ol, ol ul { margin-bottom: 0; } li { line-height: 20px; } ul.unstyled, ol.unstyled { margin-left: 0; list-style: none; } ul.inline, ol.inline { margin-left: 0; list-style: none; } ul.inline > li, ol.inline > li { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; padding-left: 5px; padding-right: 5px; } dl { margin-bottom: 20px; } dt, dd { line-height: 20px; } dt { font-weight: bold; } dd { margin-left: 10px; } .dl-horizontal { *zoom: 1; } .dl-horizontal:before, .dl-horizontal:after { display: table; content: ""; line-height: 0; } .dl-horizontal:after { clear: both; } .dl-horizontal dt { float: left; width: 160px; clear: left; text-align: right; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; } .dl-horizontal dd { margin-left: 180px; } hr { margin: 20px 0; border: 0; border-top: 1px solid #eeeeee; border-bottom: 1px solid #ffffff; } abbr[title], abbr[data-original-title] { cursor: help; border-bottom: 1px dotted #999999; } abbr.initialism { font-size: 90%; text-transform: uppercase; } blockquote { padding: 0 0 0 15px; margin: 0 0 20px; border-left: 5px solid #eeeeee; } blockquote p { margin-bottom: 0; font-size: 17.5px; font-weight: 300; line-height: 1.25; } blockquote small { display: block; line-height: 20px; color: #999999; } blockquote small:before { content: '\2014 \00A0'; } blockquote.pull-right { float: right; padding-right: 15px; padding-left: 0; border-right: 5px solid #eeeeee; border-left: 0; } blockquote.pull-right p, blockquote.pull-right small { text-align: right; } blockquote.pull-right small:before { content: ''; } blockquote.pull-right small:after { content: '\00A0 \2014'; } q:before, q:after, blockquote:before, blockquote:after { content: ""; } address { display: block; margin-bottom: 20px; font-style: normal; line-height: 20px; } code, pre { padding: 0 3px 2px; font-family: Monaco, Menlo, Consolas, "Courier New", monospace; font-size: 12px; color: #333333; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } code { padding: 2px 4px; color: #d14; background-color: #f7f7f9; border: 1px solid #e1e1e8; white-space: nowrap; } pre { display: block; padding: 9.5px; margin: 0 0 10px; font-size: 13px; line-height: 20px; word-break: break-all; word-wrap: break-word; white-space: pre; white-space: pre-wrap; background-color: #f5f5f5; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.15); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } pre.prettyprint { margin-bottom: 20px; } pre code { padding: 0; color: inherit; white-space: pre; white-space: pre-wrap; background-color: transparent; border: 0; } .pre-scrollable { max-height: 340px; overflow-y: scroll; } .label, .badge { display: inline-block; padding: 2px 4px; font-size: 11.844px; font-weight: bold; line-height: 14px; color: #ffffff; vertical-align: baseline; white-space: nowrap; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #999999; } .label { -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .badge { padding-left: 9px; padding-right: 9px; -webkit-border-radius: 9px; -moz-border-radius: 9px; border-radius: 9px; } .label:empty, .badge:empty { display: none; } a.label:hover, a.label:focus, a.badge:hover, a.badge:focus { color: #ffffff; text-decoration: none; cursor: pointer; } .label-important, .badge-important { background-color: #b94a48; } .label-important[href], .badge-important[href] { background-color: #953b39; } .label-warning, .badge-warning { background-color: #f89406; } .label-warning[href], .badge-warning[href] { background-color: #c67605; } .label-success, .badge-success { background-color: #468847; } .label-success[href], .badge-success[href] { background-color: #356635; } .label-info, .badge-info { background-color: #3a87ad; } .label-info[href], .badge-info[href] { background-color: #2d6987; } .label-inverse, .badge-inverse { background-color: #333333; } .label-inverse[href], .badge-inverse[href] { background-color: #1a1a1a; } .btn .label, .btn .badge { position: relative; top: -1px; } .btn-mini .label, .btn-mini .badge { top: 0; } table { max-width: 100%; background-color: transparent; border-collapse: collapse; border-spacing: 0; } .table { width: 100%; margin-bottom: 20px; } .table th, .table td { padding: 8px; line-height: 20px; text-align: left; vertical-align: top; border-top: 1px solid #dddddd; } .table th { font-weight: bold; } .table thead th { vertical-align: bottom; } .table caption + thead tr:first-child th, .table caption + thead tr:first-child td, .table colgroup + thead tr:first-child th, .table colgroup + thead tr:first-child td, .table thead:first-child tr:first-child th, .table thead:first-child tr:first-child td { border-top: 0; } .table tbody + tbody { border-top: 2px solid #dddddd; } .table .table { background-color: #ffffff; } .table-condensed th, .table-condensed td { padding: 4px 5px; } .table-bordered { border: 1px solid #dddddd; border-collapse: separate; *border-collapse: collapse; border-left: 0; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .table-bordered th, .table-bordered td { border-left: 1px solid #dddddd; } .table-bordered caption + thead tr:first-child th, .table-bordered caption + tbody tr:first-child th, .table-bordered caption + tbody tr:first-child td, .table-bordered colgroup + thead tr:first-child th, .table-bordered colgroup + tbody tr:first-child th, .table-bordered colgroup + tbody tr:first-child td, .table-bordered thead:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child th, .table-bordered tbody:first-child tr:first-child td { border-top: 0; } .table-bordered thead:first-child tr:first-child > th:first-child, .table-bordered tbody:first-child tr:first-child > td:first-child, .table-bordered tbody:first-child tr:first-child > th:first-child { -webkit-border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; border-top-left-radius: 4px; } .table-bordered thead:first-child tr:first-child > th:last-child, .table-bordered tbody:first-child tr:first-child > td:last-child, .table-bordered tbody:first-child tr:first-child > th:last-child { -webkit-border-top-right-radius: 4px; -moz-border-radius-topright: 4px; border-top-right-radius: 4px; } .table-bordered thead:last-child tr:last-child > th:first-child, .table-bordered tbody:last-child tr:last-child > td:first-child, .table-bordered tbody:last-child tr:last-child > th:first-child, .table-bordered tfoot:last-child tr:last-child > td:first-child, .table-bordered tfoot:last-child tr:last-child > th:first-child { -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; border-bottom-left-radius: 4px; } .table-bordered thead:last-child tr:last-child > th:last-child, .table-bordered tbody:last-child tr:last-child > td:last-child, .table-bordered tbody:last-child tr:last-child > th:last-child, .table-bordered tfoot:last-child tr:last-child > td:last-child, .table-bordered tfoot:last-child tr:last-child > th:last-child { -webkit-border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; border-bottom-right-radius: 4px; } .table-bordered tfoot + tbody:last-child tr:last-child td:first-child { -webkit-border-bottom-left-radius: 0; -moz-border-radius-bottomleft: 0; border-bottom-left-radius: 0; } .table-bordered tfoot + tbody:last-child tr:last-child td:last-child { -webkit-border-bottom-right-radius: 0; -moz-border-radius-bottomright: 0; border-bottom-right-radius: 0; } .table-bordered caption + thead tr:first-child th:first-child, .table-bordered caption + tbody tr:first-child td:first-child, .table-bordered colgroup + thead tr:first-child th:first-child, .table-bordered colgroup + tbody tr:first-child td:first-child { -webkit-border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; border-top-left-radius: 4px; } .table-bordered caption + thead tr:first-child th:last-child, .table-bordered caption + tbody tr:first-child td:last-child, .table-bordered colgroup + thead tr:first-child th:last-child, .table-bordered colgroup + tbody tr:first-child td:last-child { -webkit-border-top-right-radius: 4px; -moz-border-radius-topright: 4px; border-top-right-radius: 4px; } .table-striped tbody > tr:nth-child(odd) > td, .table-striped tbody > tr:nth-child(odd) > th { background-color: #f9f9f9; } .table-hover tbody tr:hover > td, .table-hover tbody tr:hover > th { background-color: #f5f5f5; } table td[class*="span"], table th[class*="span"], .row-fluid table td[class*="span"], .row-fluid table th[class*="span"] { display: table-cell; float: none; margin-left: 0; } .table td.span1, .table th.span1 { float: none; width: 44px; margin-left: 0; } .table td.span2, .table th.span2 { float: none; width: 124px; margin-left: 0; } .table td.span3, .table th.span3 { float: none; width: 204px; margin-left: 0; } .table td.span4, .table th.span4 { float: none; width: 284px; margin-left: 0; } .table td.span5, .table th.span5 { float: none; width: 364px; margin-left: 0; } .table td.span6, .table th.span6 { float: none; width: 444px; margin-left: 0; } .table td.span7, .table th.span7 { float: none; width: 524px; margin-left: 0; } .table td.span8, .table th.span8 { float: none; width: 604px; margin-left: 0; } .table td.span9, .table th.span9 { float: none; width: 684px; margin-left: 0; } .table td.span10, .table th.span10 { float: none; width: 764px; margin-left: 0; } .table td.span11, .table th.span11 { float: none; width: 844px; margin-left: 0; } .table td.span12, .table th.span12 { float: none; width: 924px; margin-left: 0; } .table tbody tr.success > td { background-color: #dff0d8; } .table tbody tr.error > td { background-color: #f2dede; } .table tbody tr.warning > td { background-color: #fcf8e3; } .table tbody tr.info > td { background-color: #d9edf7; } .table-hover tbody tr.success:hover > td { background-color: #d0e9c6; } .table-hover tbody tr.error:hover > td { background-color: #ebcccc; } .table-hover tbody tr.warning:hover > td { background-color: #faf2cc; } .table-hover tbody tr.info:hover > td { background-color: #c4e3f3; } form { margin: 0 0 20px; } fieldset { padding: 0; margin: 0; border: 0; } legend { display: block; width: 100%; padding: 0; margin-bottom: 20px; font-size: 21px; line-height: 40px; color: #333333; border: 0; border-bottom: 1px solid #e5e5e5; } legend small { font-size: 15px; color: #999999; } label, input, button, select, textarea { font-size: 14px; font-weight: normal; line-height: 20px; } input, button, select, textarea { font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; } label { display: block; margin-bottom: 5px; } select, textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input { display: inline-block; height: 20px; padding: 4px 6px; margin-bottom: 10px; font-size: 14px; line-height: 20px; color: #555555; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; vertical-align: middle; } input, textarea, .uneditable-input { width: 206px; } textarea { height: auto; } textarea, input[type="text"], input[type="password"], input[type="datetime"], input[type="datetime-local"], input[type="date"], input[type="month"], input[type="time"], input[type="week"], input[type="number"], input[type="email"], input[type="url"], input[type="search"], input[type="tel"], input[type="color"], .uneditable-input { background-color: #ffffff; border: 1px solid #cccccc; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -webkit-transition: border linear .2s, box-shadow linear .2s; -moz-transition: border linear .2s, box-shadow linear .2s; -o-transition: border linear .2s, box-shadow linear .2s; transition: border linear .2s, box-shadow linear .2s; } textarea:focus, input[type="text"]:focus, input[type="password"]:focus, input[type="datetime"]:focus, input[type="datetime-local"]:focus, input[type="date"]:focus, input[type="month"]:focus, input[type="time"]:focus, input[type="week"]:focus, input[type="number"]:focus, input[type="email"]:focus, input[type="url"]:focus, input[type="search"]:focus, input[type="tel"]:focus, input[type="color"]:focus, .uneditable-input:focus { border-color: rgba(82, 168, 236, 0.8); outline: 0; outline: thin dotted \9; /* IE6-9 */ -webkit-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); -moz-box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); box-shadow: inset 0 1px 1px rgba(0,0,0,.075), 0 0 8px rgba(82,168,236,.6); } input[type="radio"], input[type="checkbox"] { margin: 4px 0 0; *margin-top: 0; /* IE7 */ margin-top: 1px \9; /* IE8-9 */ line-height: normal; } input[type="file"], input[type="image"], input[type="submit"], input[type="reset"], input[type="button"], input[type="radio"], input[type="checkbox"] { width: auto; } select, input[type="file"] { height: 30px; /* In IE7, the height of the select element cannot be changed by height, only font-size */ *margin-top: 4px; /* For IE7, add top margin to align select with labels */ line-height: 30px; } select { width: 220px; border: 1px solid #cccccc; background-color: #ffffff; } select[multiple], select[size] { height: auto; } select:focus, input[type="file"]:focus, input[type="radio"]:focus, input[type="checkbox"]:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .uneditable-input, .uneditable-textarea { color: #999999; background-color: #fcfcfc; border-color: #cccccc; -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.025); cursor: not-allowed; } .uneditable-input { overflow: hidden; white-space: nowrap; } .uneditable-textarea { width: auto; height: auto; } input:-moz-placeholder, textarea:-moz-placeholder { color: #999999; } input:-ms-input-placeholder, textarea:-ms-input-placeholder { color: #999999; } input::-webkit-input-placeholder, textarea::-webkit-input-placeholder { color: #999999; } .radio, .checkbox { min-height: 20px; padding-left: 20px; } .radio input[type="radio"], .checkbox input[type="checkbox"] { float: left; margin-left: -20px; } .controls > .radio:first-child, .controls > .checkbox:first-child { padding-top: 5px; } .radio.inline, .checkbox.inline { display: inline-block; padding-top: 5px; margin-bottom: 0; vertical-align: middle; } .radio.inline + .radio.inline, .checkbox.inline + .checkbox.inline { margin-left: 10px; } .input-mini { width: 60px; } .input-small { width: 90px; } .input-medium { width: 150px; } .input-large { width: 210px; } .input-xlarge { width: 270px; } .input-xxlarge { width: 530px; } input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input[class*="span"], .row-fluid input[class*="span"], .row-fluid select[class*="span"], .row-fluid textarea[class*="span"], .row-fluid .uneditable-input[class*="span"] { float: none; margin-left: 0; } .input-append input[class*="span"], .input-append .uneditable-input[class*="span"], .input-prepend input[class*="span"], .input-prepend .uneditable-input[class*="span"], .row-fluid input[class*="span"], .row-fluid select[class*="span"], .row-fluid textarea[class*="span"], .row-fluid .uneditable-input[class*="span"], .row-fluid .input-prepend [class*="span"], .row-fluid .input-append [class*="span"] { display: inline-block; } input, textarea, .uneditable-input { margin-left: 0; } .controls-row [class*="span"] + [class*="span"] { margin-left: 20px; } input.span12, textarea.span12, .uneditable-input.span12 { width: 926px; } input.span11, textarea.span11, .uneditable-input.span11 { width: 846px; } input.span10, textarea.span10, .uneditable-input.span10 { width: 766px; } input.span9, textarea.span9, .uneditable-input.span9 { width: 686px; } input.span8, textarea.span8, .uneditable-input.span8 { width: 606px; } input.span7, textarea.span7, .uneditable-input.span7 { width: 526px; } input.span6, textarea.span6, .uneditable-input.span6 { width: 446px; } input.span5, textarea.span5, .uneditable-input.span5 { width: 366px; } input.span4, textarea.span4, .uneditable-input.span4 { width: 286px; } input.span3, textarea.span3, .uneditable-input.span3 { width: 206px; } input.span2, textarea.span2, .uneditable-input.span2 { width: 126px; } input.span1, textarea.span1, .uneditable-input.span1 { width: 46px; } .controls-row { *zoom: 1; } .controls-row:before, .controls-row:after { display: table; content: ""; line-height: 0; } .controls-row:after { clear: both; } .controls-row [class*="span"], .row-fluid .controls-row [class*="span"] { float: left; } .controls-row .checkbox[class*="span"], .controls-row .radio[class*="span"] { padding-top: 5px; } input[disabled], select[disabled], textarea[disabled], input[readonly], select[readonly], textarea[readonly] { cursor: not-allowed; background-color: #eeeeee; } input[type="radio"][disabled], input[type="checkbox"][disabled], input[type="radio"][readonly], input[type="checkbox"][readonly] { background-color: transparent; } .control-group.warning .control-label, .control-group.warning .help-block, .control-group.warning .help-inline { color: #c09853; } .control-group.warning .checkbox, .control-group.warning .radio, .control-group.warning input, .control-group.warning select, .control-group.warning textarea { color: #c09853; } .control-group.warning input, .control-group.warning select, .control-group.warning textarea { border-color: #c09853; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .control-group.warning input:focus, .control-group.warning select:focus, .control-group.warning textarea:focus { border-color: #a47e3c; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #dbc59e; } .control-group.warning .input-prepend .add-on, .control-group.warning .input-append .add-on { color: #c09853; background-color: #fcf8e3; border-color: #c09853; } .control-group.error .control-label, .control-group.error .help-block, .control-group.error .help-inline { color: #b94a48; } .control-group.error .checkbox, .control-group.error .radio, .control-group.error input, .control-group.error select, .control-group.error textarea { color: #b94a48; } .control-group.error input, .control-group.error select, .control-group.error textarea { border-color: #b94a48; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .control-group.error input:focus, .control-group.error select:focus, .control-group.error textarea:focus { border-color: #953b39; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #d59392; } .control-group.error .input-prepend .add-on, .control-group.error .input-append .add-on { color: #b94a48; background-color: #f2dede; border-color: #b94a48; } .control-group.success .control-label, .control-group.success .help-block, .control-group.success .help-inline { color: #468847; } .control-group.success .checkbox, .control-group.success .radio, .control-group.success input, .control-group.success select, .control-group.success textarea { color: #468847; } .control-group.success input, .control-group.success select, .control-group.success textarea { border-color: #468847; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .control-group.success input:focus, .control-group.success select:focus, .control-group.success textarea:focus { border-color: #356635; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7aba7b; } .control-group.success .input-prepend .add-on, .control-group.success .input-append .add-on { color: #468847; background-color: #dff0d8; border-color: #468847; } .control-group.info .control-label, .control-group.info .help-block, .control-group.info .help-inline { color: #3a87ad; } .control-group.info .checkbox, .control-group.info .radio, .control-group.info input, .control-group.info select, .control-group.info textarea { color: #3a87ad; } .control-group.info input, .control-group.info select, .control-group.info textarea { border-color: #3a87ad; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075); } .control-group.info input:focus, .control-group.info select:focus, .control-group.info textarea:focus { border-color: #2d6987; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.075), 0 0 6px #7ab5d3; } .control-group.info .input-prepend .add-on, .control-group.info .input-append .add-on { color: #3a87ad; background-color: #d9edf7; border-color: #3a87ad; } input:focus:invalid, textarea:focus:invalid, select:focus:invalid { color: #b94a48; border-color: #ee5f5b; } input:focus:invalid:focus, textarea:focus:invalid:focus, select:focus:invalid:focus { border-color: #e9322d; -webkit-box-shadow: 0 0 6px #f8b9b7; -moz-box-shadow: 0 0 6px #f8b9b7; box-shadow: 0 0 6px #f8b9b7; } .form-actions { padding: 19px 20px 20px; margin-top: 20px; margin-bottom: 20px; background-color: #f5f5f5; border-top: 1px solid #e5e5e5; *zoom: 1; } .form-actions:before, .form-actions:after { display: table; content: ""; line-height: 0; } .form-actions:after { clear: both; } .help-block, .help-inline { color: #595959; } .help-block { display: block; margin-bottom: 10px; } .help-inline { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; vertical-align: middle; padding-left: 5px; } .input-append, .input-prepend { display: inline-block; margin-bottom: 10px; vertical-align: middle; font-size: 0; white-space: nowrap; } .input-append input, .input-prepend input, .input-append select, .input-prepend select, .input-append .uneditable-input, .input-prepend .uneditable-input, .input-append .dropdown-menu, .input-prepend .dropdown-menu, .input-append .popover, .input-prepend .popover { font-size: 14px; } .input-append input, .input-prepend input, .input-append select, .input-prepend select, .input-append .uneditable-input, .input-prepend .uneditable-input { position: relative; margin-bottom: 0; *margin-left: 0; vertical-align: top; -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .input-append input:focus, .input-prepend input:focus, .input-append select:focus, .input-prepend select:focus, .input-append .uneditable-input:focus, .input-prepend .uneditable-input:focus { z-index: 2; } .input-append .add-on, .input-prepend .add-on { display: inline-block; width: auto; height: 20px; min-width: 16px; padding: 4px 5px; font-size: 14px; font-weight: normal; line-height: 20px; text-align: center; text-shadow: 0 1px 0 #ffffff; background-color: #eeeeee; border: 1px solid #ccc; } .input-append .add-on, .input-prepend .add-on, .input-append .btn, .input-prepend .btn, .input-append .btn-group > .dropdown-toggle, .input-prepend .btn-group > .dropdown-toggle { vertical-align: top; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .input-append .active, .input-prepend .active { background-color: #a9dba9; border-color: #46a546; } .input-prepend .add-on, .input-prepend .btn { margin-right: -1px; } .input-prepend .add-on:first-child, .input-prepend .btn:first-child { -webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px; } .input-append input, .input-append select, .input-append .uneditable-input { -webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px; } .input-append input + .btn-group .btn:last-child, .input-append select + .btn-group .btn:last-child, .input-append .uneditable-input + .btn-group .btn:last-child { -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .input-append .add-on, .input-append .btn, .input-append .btn-group { margin-left: -1px; } .input-append .add-on:last-child, .input-append .btn:last-child, .input-append .btn-group:last-child > .dropdown-toggle { -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .input-prepend.input-append input, .input-prepend.input-append select, .input-prepend.input-append .uneditable-input { -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .input-prepend.input-append input + .btn-group .btn, .input-prepend.input-append select + .btn-group .btn, .input-prepend.input-append .uneditable-input + .btn-group .btn { -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .input-prepend.input-append .add-on:first-child, .input-prepend.input-append .btn:first-child { margin-right: -1px; -webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px; } .input-prepend.input-append .add-on:last-child, .input-prepend.input-append .btn:last-child { margin-left: -1px; -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .input-prepend.input-append .btn-group:first-child { margin-left: 0; } input.search-query { padding-right: 14px; padding-right: 4px \9; padding-left: 14px; padding-left: 4px \9; /* IE7-8 doesn't have border-radius, so don't indent the padding */ margin-bottom: 0; -webkit-border-radius: 15px; -moz-border-radius: 15px; border-radius: 15px; } /* Allow for input prepend/append in search forms */ .form-search .input-append .search-query, .form-search .input-prepend .search-query { -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .form-search .input-append .search-query { -webkit-border-radius: 14px 0 0 14px; -moz-border-radius: 14px 0 0 14px; border-radius: 14px 0 0 14px; } .form-search .input-append .btn { -webkit-border-radius: 0 14px 14px 0; -moz-border-radius: 0 14px 14px 0; border-radius: 0 14px 14px 0; } .form-search .input-prepend .search-query { -webkit-border-radius: 0 14px 14px 0; -moz-border-radius: 0 14px 14px 0; border-radius: 0 14px 14px 0; } .form-search .input-prepend .btn { -webkit-border-radius: 14px 0 0 14px; -moz-border-radius: 14px 0 0 14px; border-radius: 14px 0 0 14px; } .form-search input, .form-inline input, .form-horizontal input, .form-search textarea, .form-inline textarea, .form-horizontal textarea, .form-search select, .form-inline select, .form-horizontal select, .form-search .help-inline, .form-inline .help-inline, .form-horizontal .help-inline, .form-search .uneditable-input, .form-inline .uneditable-input, .form-horizontal .uneditable-input, .form-search .input-prepend, .form-inline .input-prepend, .form-horizontal .input-prepend, .form-search .input-append, .form-inline .input-append, .form-horizontal .input-append { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; margin-bottom: 0; vertical-align: middle; } .form-search .hide, .form-inline .hide, .form-horizontal .hide { display: none; } .form-search label, .form-inline label, .form-search .btn-group, .form-inline .btn-group { display: inline-block; } .form-search .input-append, .form-inline .input-append, .form-search .input-prepend, .form-inline .input-prepend { margin-bottom: 0; } .form-search .radio, .form-search .checkbox, .form-inline .radio, .form-inline .checkbox { padding-left: 0; margin-bottom: 0; vertical-align: middle; } .form-search .radio input[type="radio"], .form-search .checkbox input[type="checkbox"], .form-inline .radio input[type="radio"], .form-inline .checkbox input[type="checkbox"] { float: left; margin-right: 3px; margin-left: 0; } .control-group { margin-bottom: 10px; } legend + .control-group { margin-top: 20px; -webkit-margin-top-collapse: separate; } .form-horizontal .control-group { margin-bottom: 20px; *zoom: 1; } .form-horizontal .control-group:before, .form-horizontal .control-group:after { display: table; content: ""; line-height: 0; } .form-horizontal .control-group:after { clear: both; } .form-horizontal .control-label { float: left; width: 160px; padding-top: 5px; text-align: right; } .form-horizontal .controls { *display: inline-block; *padding-left: 20px; margin-left: 180px; *margin-left: 0; } .form-horizontal .controls:first-child { *padding-left: 180px; } .form-horizontal .help-block { margin-bottom: 0; } .form-horizontal input + .help-block, .form-horizontal select + .help-block, .form-horizontal textarea + .help-block, .form-horizontal .uneditable-input + .help-block, .form-horizontal .input-prepend + .help-block, .form-horizontal .input-append + .help-block { margin-top: 10px; } .form-horizontal .form-actions { padding-left: 180px; } .btn { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; padding: 4px 12px; margin-bottom: 0; font-size: 14px; line-height: 20px; text-align: center; vertical-align: middle; cursor: pointer; color: #333333; text-shadow: 0 1px 1px rgba(255, 255, 255, 0.75); background-color: #f5f5f5; background-image: -moz-linear-gradient(top, #ffffff, #e6e6e6); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#e6e6e6)); background-image: -webkit-linear-gradient(top, #ffffff, #e6e6e6); background-image: -o-linear-gradient(top, #ffffff, #e6e6e6); background-image: linear-gradient(to bottom, #ffffff, #e6e6e6); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#ffe6e6e6', GradientType=0); border-color: #e6e6e6 #e6e6e6 #bfbfbf; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #e6e6e6; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); border: 1px solid #cccccc; *border: 0; border-bottom-color: #b3b3b3; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; *margin-left: .3em; -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); box-shadow: inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); } .btn:hover, .btn:focus, .btn:active, .btn.active, .btn.disabled, .btn[disabled] { color: #333333; background-color: #e6e6e6; *background-color: #d9d9d9; } .btn:active, .btn.active { background-color: #cccccc \9; } .btn:first-child { *margin-left: 0; } .btn:hover, .btn:focus { color: #333333; text-decoration: none; background-position: 0 -15px; -webkit-transition: background-position 0.1s linear; -moz-transition: background-position 0.1s linear; -o-transition: background-position 0.1s linear; transition: background-position 0.1s linear; } .btn:focus { outline: thin dotted #333; outline: 5px auto -webkit-focus-ring-color; outline-offset: -2px; } .btn.active, .btn:active { background-image: none; outline: 0; -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); } .btn.disabled, .btn[disabled] { cursor: default; background-image: none; opacity: 0.65; filter: alpha(opacity=65); -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } .btn-large { padding: 11px 19px; font-size: 17.5px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .btn-large [class^="icon-"], .btn-large [class*=" icon-"] { margin-top: 4px; } .btn-small { padding: 2px 10px; font-size: 11.9px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .btn-small [class^="icon-"], .btn-small [class*=" icon-"] { margin-top: 0; } .btn-mini [class^="icon-"], .btn-mini [class*=" icon-"] { margin-top: -1px; } .btn-mini { padding: 0 6px; font-size: 10.5px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .btn-block { display: block; width: 100%; padding-left: 0; padding-right: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .btn-block + .btn-block { margin-top: 5px; } input[type="submit"].btn-block, input[type="reset"].btn-block, input[type="button"].btn-block { width: 100%; } .btn-primary.active, .btn-warning.active, .btn-danger.active, .btn-success.active, .btn-info.active, .btn-inverse.active { color: rgba(255, 255, 255, 0.75); } .btn-primary { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #006dcc; background-image: -moz-linear-gradient(top, #0088cc, #0044cc); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0044cc)); background-image: -webkit-linear-gradient(top, #0088cc, #0044cc); background-image: -o-linear-gradient(top, #0088cc, #0044cc); background-image: linear-gradient(to bottom, #0088cc, #0044cc); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0044cc', GradientType=0); border-color: #0044cc #0044cc #002a80; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #0044cc; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .btn-primary:hover, .btn-primary:focus, .btn-primary:active, .btn-primary.active, .btn-primary.disabled, .btn-primary[disabled] { color: #ffffff; background-color: #0044cc; *background-color: #003bb3; } .btn-primary:active, .btn-primary.active { background-color: #003399 \9; } .btn-warning { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #faa732; background-image: -moz-linear-gradient(top, #fbb450, #f89406); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); background-image: -webkit-linear-gradient(top, #fbb450, #f89406); background-image: -o-linear-gradient(top, #fbb450, #f89406); background-image: linear-gradient(to bottom, #fbb450, #f89406); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); border-color: #f89406 #f89406 #ad6704; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #f89406; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .btn-warning:hover, .btn-warning:focus, .btn-warning:active, .btn-warning.active, .btn-warning.disabled, .btn-warning[disabled] { color: #ffffff; background-color: #f89406; *background-color: #df8505; } .btn-warning:active, .btn-warning.active { background-color: #c67605 \9; } .btn-danger { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #da4f49; background-image: -moz-linear-gradient(top, #ee5f5b, #bd362f); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#bd362f)); background-image: -webkit-linear-gradient(top, #ee5f5b, #bd362f); background-image: -o-linear-gradient(top, #ee5f5b, #bd362f); background-image: linear-gradient(to bottom, #ee5f5b, #bd362f); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffbd362f', GradientType=0); border-color: #bd362f #bd362f #802420; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #bd362f; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .btn-danger:hover, .btn-danger:focus, .btn-danger:active, .btn-danger.active, .btn-danger.disabled, .btn-danger[disabled] { color: #ffffff; background-color: #bd362f; *background-color: #a9302a; } .btn-danger:active, .btn-danger.active { background-color: #942a25 \9; } .btn-success { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #5bb75b; background-image: -moz-linear-gradient(top, #62c462, #51a351); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#51a351)); background-image: -webkit-linear-gradient(top, #62c462, #51a351); background-image: -o-linear-gradient(top, #62c462, #51a351); background-image: linear-gradient(to bottom, #62c462, #51a351); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff51a351', GradientType=0); border-color: #51a351 #51a351 #387038; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #51a351; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .btn-success:hover, .btn-success:focus, .btn-success:active, .btn-success.active, .btn-success.disabled, .btn-success[disabled] { color: #ffffff; background-color: #51a351; *background-color: #499249; } .btn-success:active, .btn-success.active { background-color: #408140 \9; } .btn-info { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #49afcd; background-image: -moz-linear-gradient(top, #5bc0de, #2f96b4); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#2f96b4)); background-image: -webkit-linear-gradient(top, #5bc0de, #2f96b4); background-image: -o-linear-gradient(top, #5bc0de, #2f96b4); background-image: linear-gradient(to bottom, #5bc0de, #2f96b4); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff2f96b4', GradientType=0); border-color: #2f96b4 #2f96b4 #1f6377; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #2f96b4; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .btn-info:hover, .btn-info:focus, .btn-info:active, .btn-info.active, .btn-info.disabled, .btn-info[disabled] { color: #ffffff; background-color: #2f96b4; *background-color: #2a85a0; } .btn-info:active, .btn-info.active { background-color: #24748c \9; } .btn-inverse { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #363636; background-image: -moz-linear-gradient(top, #444444, #222222); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#444444), to(#222222)); background-image: -webkit-linear-gradient(top, #444444, #222222); background-image: -o-linear-gradient(top, #444444, #222222); background-image: linear-gradient(to bottom, #444444, #222222); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff444444', endColorstr='#ff222222', GradientType=0); border-color: #222222 #222222 #000000; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #222222; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .btn-inverse:hover, .btn-inverse:focus, .btn-inverse:active, .btn-inverse.active, .btn-inverse.disabled, .btn-inverse[disabled] { color: #ffffff; background-color: #222222; *background-color: #151515; } .btn-inverse:active, .btn-inverse.active { background-color: #080808 \9; } button.btn, input[type="submit"].btn { *padding-top: 3px; *padding-bottom: 3px; } button.btn::-moz-focus-inner, input[type="submit"].btn::-moz-focus-inner { padding: 0; border: 0; } button.btn.btn-large, input[type="submit"].btn.btn-large { *padding-top: 7px; *padding-bottom: 7px; } button.btn.btn-small, input[type="submit"].btn.btn-small { *padding-top: 3px; *padding-bottom: 3px; } button.btn.btn-mini, input[type="submit"].btn.btn-mini { *padding-top: 1px; *padding-bottom: 1px; } .btn-link, .btn-link:active, .btn-link[disabled] { background-color: transparent; background-image: none; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } .btn-link { border-color: transparent; cursor: pointer; color: #0088cc; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .btn-link:hover, .btn-link:focus { color: #005580; text-decoration: underline; background-color: transparent; } .btn-link[disabled]:hover, .btn-link[disabled]:focus { color: #333333; text-decoration: none; } [class^="icon-"], [class*=" icon-"] { display: inline-block; width: 14px; height: 14px; *margin-right: .3em; line-height: 14px; vertical-align: text-top; background-image: url("../img/glyphicons-halflings.png"); background-position: 14px 14px; background-repeat: no-repeat; margin-top: 1px; } /* White icons with optional class, or on hover/focus/active states of certain elements */ .icon-white, .nav-pills > .active > a > [class^="icon-"], .nav-pills > .active > a > [class*=" icon-"], .nav-list > .active > a > [class^="icon-"], .nav-list > .active > a > [class*=" icon-"], .navbar-inverse .nav > .active > a > [class^="icon-"], .navbar-inverse .nav > .active > a > [class*=" icon-"], .dropdown-menu > li > a:hover > [class^="icon-"], .dropdown-menu > li > a:focus > [class^="icon-"], .dropdown-menu > li > a:hover > [class*=" icon-"], .dropdown-menu > li > a:focus > [class*=" icon-"], .dropdown-menu > .active > a > [class^="icon-"], .dropdown-menu > .active > a > [class*=" icon-"], .dropdown-submenu:hover > a > [class^="icon-"], .dropdown-submenu:focus > a > [class^="icon-"], .dropdown-submenu:hover > a > [class*=" icon-"], .dropdown-submenu:focus > a > [class*=" icon-"] { background-image: url("../img/glyphicons-halflings-white.png"); } .icon-glass { background-position: 0 0; } .icon-music { background-position: -24px 0; } .icon-search { background-position: -48px 0; } .icon-envelope { background-position: -72px 0; } .icon-heart { background-position: -96px 0; } .icon-star { background-position: -120px 0; } .icon-star-empty { background-position: -144px 0; } .icon-user { background-position: -168px 0; } .icon-film { background-position: -192px 0; } .icon-th-large { background-position: -216px 0; } .icon-th { background-position: -240px 0; } .icon-th-list { background-position: -264px 0; } .icon-ok { background-position: -288px 0; } .icon-remove { background-position: -312px 0; } .icon-zoom-in { background-position: -336px 0; } .icon-zoom-out { background-position: -360px 0; } .icon-off { background-position: -384px 0; } .icon-signal { background-position: -408px 0; } .icon-cog { background-position: -432px 0; } .icon-trash { background-position: -456px 0; } .icon-home { background-position: 0 -24px; } .icon-file { background-position: -24px -24px; } .icon-time { background-position: -48px -24px; } .icon-road { background-position: -72px -24px; } .icon-download-alt { background-position: -96px -24px; } .icon-download { background-position: -120px -24px; } .icon-upload { background-position: -144px -24px; } .icon-inbox { background-position: -168px -24px; } .icon-play-circle { background-position: -192px -24px; } .icon-repeat { background-position: -216px -24px; } .icon-refresh { background-position: -240px -24px; } .icon-list-alt { background-position: -264px -24px; } .icon-lock { background-position: -287px -24px; } .icon-flag { background-position: -312px -24px; } .icon-headphones { background-position: -336px -24px; } .icon-volume-off { background-position: -360px -24px; } .icon-volume-down { background-position: -384px -24px; } .icon-volume-up { background-position: -408px -24px; } .icon-qrcode { background-position: -432px -24px; } .icon-barcode { background-position: -456px -24px; } .icon-tag { background-position: 0 -48px; } .icon-tags { background-position: -25px -48px; } .icon-book { background-position: -48px -48px; } .icon-bookmark { background-position: -72px -48px; } .icon-print { background-position: -96px -48px; } .icon-camera { background-position: -120px -48px; } .icon-font { background-position: -144px -48px; } .icon-bold { background-position: -167px -48px; } .icon-italic { background-position: -192px -48px; } .icon-text-height { background-position: -216px -48px; } .icon-text-width { background-position: -240px -48px; } .icon-align-left { background-position: -264px -48px; } .icon-align-center { background-position: -288px -48px; } .icon-align-right { background-position: -312px -48px; } .icon-align-justify { background-position: -336px -48px; } .icon-list { background-position: -360px -48px; } .icon-indent-left { background-position: -384px -48px; } .icon-indent-right { background-position: -408px -48px; } .icon-facetime-video { background-position: -432px -48px; } .icon-picture { background-position: -456px -48px; } .icon-pencil { background-position: 0 -72px; } .icon-map-marker { background-position: -24px -72px; } .icon-adjust { background-position: -48px -72px; } .icon-tint { background-position: -72px -72px; } .icon-edit { background-position: -96px -72px; } .icon-share { background-position: -120px -72px; } .icon-check { background-position: -144px -72px; } .icon-move { background-position: -168px -72px; } .icon-step-backward { background-position: -192px -72px; } .icon-fast-backward { background-position: -216px -72px; } .icon-backward { background-position: -240px -72px; } .icon-play { background-position: -264px -72px; } .icon-pause { background-position: -288px -72px; } .icon-stop { background-position: -312px -72px; } .icon-forward { background-position: -336px -72px; } .icon-fast-forward { background-position: -360px -72px; } .icon-step-forward { background-position: -384px -72px; } .icon-eject { background-position: -408px -72px; } .icon-chevron-left { background-position: -432px -72px; } .icon-chevron-right { background-position: -456px -72px; } .icon-plus-sign { background-position: 0 -96px; } .icon-minus-sign { background-position: -24px -96px; } .icon-remove-sign { background-position: -48px -96px; } .icon-ok-sign { background-position: -72px -96px; } .icon-question-sign { background-position: -96px -96px; } .icon-info-sign { background-position: -120px -96px; } .icon-screenshot { background-position: -144px -96px; } .icon-remove-circle { background-position: -168px -96px; } .icon-ok-circle { background-position: -192px -96px; } .icon-ban-circle { background-position: -216px -96px; } .icon-arrow-left { background-position: -240px -96px; } .icon-arrow-right { background-position: -264px -96px; } .icon-arrow-up { background-position: -289px -96px; } .icon-arrow-down { background-position: -312px -96px; } .icon-share-alt { background-position: -336px -96px; } .icon-resize-full { background-position: -360px -96px; } .icon-resize-small { background-position: -384px -96px; } .icon-plus { background-position: -408px -96px; } .icon-minus { background-position: -433px -96px; } .icon-asterisk { background-position: -456px -96px; } .icon-exclamation-sign { background-position: 0 -120px; } .icon-gift { background-position: -24px -120px; } .icon-leaf { background-position: -48px -120px; } .icon-fire { background-position: -72px -120px; } .icon-eye-open { background-position: -96px -120px; } .icon-eye-close { background-position: -120px -120px; } .icon-warning-sign { background-position: -144px -120px; } .icon-plane { background-position: -168px -120px; } .icon-calendar { background-position: -192px -120px; } .icon-random { background-position: -216px -120px; width: 16px; } .icon-comment { background-position: -240px -120px; } .icon-magnet { background-position: -264px -120px; } .icon-chevron-up { background-position: -288px -120px; } .icon-chevron-down { background-position: -313px -119px; } .icon-retweet { background-position: -336px -120px; } .icon-shopping-cart { background-position: -360px -120px; } .icon-folder-close { background-position: -384px -120px; width: 16px; } .icon-folder-open { background-position: -408px -120px; width: 16px; } .icon-resize-vertical { background-position: -432px -119px; } .icon-resize-horizontal { background-position: -456px -118px; } .icon-hdd { background-position: 0 -144px; } .icon-bullhorn { background-position: -24px -144px; } .icon-bell { background-position: -48px -144px; } .icon-certificate { background-position: -72px -144px; } .icon-thumbs-up { background-position: -96px -144px; } .icon-thumbs-down { background-position: -120px -144px; } .icon-hand-right { background-position: -144px -144px; } .icon-hand-left { background-position: -168px -144px; } .icon-hand-up { background-position: -192px -144px; } .icon-hand-down { background-position: -216px -144px; } .icon-circle-arrow-right { background-position: -240px -144px; } .icon-circle-arrow-left { background-position: -264px -144px; } .icon-circle-arrow-up { background-position: -288px -144px; } .icon-circle-arrow-down { background-position: -312px -144px; } .icon-globe { background-position: -336px -144px; } .icon-wrench { background-position: -360px -144px; } .icon-tasks { background-position: -384px -144px; } .icon-filter { background-position: -408px -144px; } .icon-briefcase { background-position: -432px -144px; } .icon-fullscreen { background-position: -456px -144px; } .btn-group { position: relative; display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; font-size: 0; vertical-align: middle; white-space: nowrap; *margin-left: .3em; } .btn-group:first-child { *margin-left: 0; } .btn-group + .btn-group { margin-left: 5px; } .btn-toolbar { font-size: 0; margin-top: 10px; margin-bottom: 10px; } .btn-toolbar > .btn + .btn, .btn-toolbar > .btn-group + .btn, .btn-toolbar > .btn + .btn-group { margin-left: 5px; } .btn-group > .btn { position: relative; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .btn-group > .btn + .btn { margin-left: -1px; } .btn-group > .btn, .btn-group > .dropdown-menu, .btn-group > .popover { font-size: 14px; } .btn-group > .btn-mini { font-size: 10.5px; } .btn-group > .btn-small { font-size: 11.9px; } .btn-group > .btn-large { font-size: 17.5px; } .btn-group > .btn:first-child { margin-left: 0; -webkit-border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; border-top-left-radius: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; border-bottom-left-radius: 4px; } .btn-group > .btn:last-child, .btn-group > .dropdown-toggle { -webkit-border-top-right-radius: 4px; -moz-border-radius-topright: 4px; border-top-right-radius: 4px; -webkit-border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; border-bottom-right-radius: 4px; } .btn-group > .btn.large:first-child { margin-left: 0; -webkit-border-top-left-radius: 6px; -moz-border-radius-topleft: 6px; border-top-left-radius: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomleft: 6px; border-bottom-left-radius: 6px; } .btn-group > .btn.large:last-child, .btn-group > .large.dropdown-toggle { -webkit-border-top-right-radius: 6px; -moz-border-radius-topright: 6px; border-top-right-radius: 6px; -webkit-border-bottom-right-radius: 6px; -moz-border-radius-bottomright: 6px; border-bottom-right-radius: 6px; } .btn-group > .btn:hover, .btn-group > .btn:focus, .btn-group > .btn:active, .btn-group > .btn.active { z-index: 2; } .btn-group .dropdown-toggle:active, .btn-group.open .dropdown-toggle { outline: 0; } .btn-group > .btn + .dropdown-toggle { padding-left: 8px; padding-right: 8px; -webkit-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); box-shadow: inset 1px 0 0 rgba(255,255,255,.125), inset 0 1px 0 rgba(255,255,255,.2), 0 1px 2px rgba(0,0,0,.05); *padding-top: 5px; *padding-bottom: 5px; } .btn-group > .btn-mini + .dropdown-toggle { padding-left: 5px; padding-right: 5px; *padding-top: 2px; *padding-bottom: 2px; } .btn-group > .btn-small + .dropdown-toggle { *padding-top: 5px; *padding-bottom: 4px; } .btn-group > .btn-large + .dropdown-toggle { padding-left: 12px; padding-right: 12px; *padding-top: 7px; *padding-bottom: 7px; } .btn-group.open .dropdown-toggle { background-image: none; -webkit-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); -moz-box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); box-shadow: inset 0 2px 4px rgba(0,0,0,.15), 0 1px 2px rgba(0,0,0,.05); } .btn-group.open .btn.dropdown-toggle { background-color: #e6e6e6; } .btn-group.open .btn-primary.dropdown-toggle { background-color: #0044cc; } .btn-group.open .btn-warning.dropdown-toggle { background-color: #f89406; } .btn-group.open .btn-danger.dropdown-toggle { background-color: #bd362f; } .btn-group.open .btn-success.dropdown-toggle { background-color: #51a351; } .btn-group.open .btn-info.dropdown-toggle { background-color: #2f96b4; } .btn-group.open .btn-inverse.dropdown-toggle { background-color: #222222; } .btn .caret { margin-top: 8px; margin-left: 0; } .btn-large .caret { margin-top: 6px; } .btn-large .caret { border-left-width: 5px; border-right-width: 5px; border-top-width: 5px; } .btn-mini .caret, .btn-small .caret { margin-top: 8px; } .dropup .btn-large .caret { border-bottom-width: 5px; } .btn-primary .caret, .btn-warning .caret, .btn-danger .caret, .btn-info .caret, .btn-success .caret, .btn-inverse .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .btn-group-vertical { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; } .btn-group-vertical > .btn { display: block; float: none; max-width: 100%; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .btn-group-vertical > .btn + .btn { margin-left: 0; margin-top: -1px; } .btn-group-vertical > .btn:first-child { -webkit-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } .btn-group-vertical > .btn:last-child { -webkit-border-radius: 0 0 4px 4px; -moz-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; } .btn-group-vertical > .btn-large:first-child { -webkit-border-radius: 6px 6px 0 0; -moz-border-radius: 6px 6px 0 0; border-radius: 6px 6px 0 0; } .btn-group-vertical > .btn-large:last-child { -webkit-border-radius: 0 0 6px 6px; -moz-border-radius: 0 0 6px 6px; border-radius: 0 0 6px 6px; } .nav { margin-left: 0; margin-bottom: 20px; list-style: none; } .nav > li > a { display: block; } .nav > li > a:hover, .nav > li > a:focus { text-decoration: none; background-color: #eeeeee; } .nav > li > a > img { max-width: none; } .nav > .pull-right { float: right; } .nav-header { display: block; padding: 3px 15px; font-size: 11px; font-weight: bold; line-height: 20px; color: #999999; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); text-transform: uppercase; } .nav li + .nav-header { margin-top: 9px; } .nav-list { padding-left: 15px; padding-right: 15px; margin-bottom: 0; } .nav-list > li > a, .nav-list .nav-header { margin-left: -15px; margin-right: -15px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); } .nav-list > li > a { padding: 3px 15px; } .nav-list > .active > a, .nav-list > .active > a:hover, .nav-list > .active > a:focus { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.2); background-color: #0088cc; } .nav-list [class^="icon-"], .nav-list [class*=" icon-"] { margin-right: 2px; } .nav-list .divider { *width: 100%; height: 1px; margin: 9px 1px; *margin: -5px 0 5px; overflow: hidden; background-color: #e5e5e5; border-bottom: 1px solid #ffffff; } .nav-tabs, .nav-pills { *zoom: 1; } .nav-tabs:before, .nav-pills:before, .nav-tabs:after, .nav-pills:after { display: table; content: ""; line-height: 0; } .nav-tabs:after, .nav-pills:after { clear: both; } .nav-tabs > li, .nav-pills > li { float: left; } .nav-tabs > li > a, .nav-pills > li > a { padding-right: 12px; padding-left: 12px; margin-right: 2px; line-height: 14px; } .nav-tabs { border-bottom: 1px solid #ddd; } .nav-tabs > li { margin-bottom: -1px; } .nav-tabs > li > a { padding-top: 8px; padding-bottom: 8px; line-height: 20px; border: 1px solid transparent; -webkit-border-radius: 4px 4px 0 0; -moz-border-radius: 4px 4px 0 0; border-radius: 4px 4px 0 0; } .nav-tabs > li > a:hover, .nav-tabs > li > a:focus { border-color: #eeeeee #eeeeee #dddddd; } .nav-tabs > .active > a, .nav-tabs > .active > a:hover, .nav-tabs > .active > a:focus { color: #555555; background-color: #ffffff; border: 1px solid #ddd; border-bottom-color: transparent; cursor: default; } .nav-pills > li > a { padding-top: 8px; padding-bottom: 8px; margin-top: 2px; margin-bottom: 2px; -webkit-border-radius: 5px; -moz-border-radius: 5px; border-radius: 5px; } .nav-pills > .active > a, .nav-pills > .active > a:hover, .nav-pills > .active > a:focus { color: #ffffff; background-color: #0088cc; } .nav-stacked > li { float: none; } .nav-stacked > li > a { margin-right: 0; } .nav-tabs.nav-stacked { border-bottom: 0; } .nav-tabs.nav-stacked > li > a { border: 1px solid #ddd; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .nav-tabs.nav-stacked > li:first-child > a { -webkit-border-top-right-radius: 4px; -moz-border-radius-topright: 4px; border-top-right-radius: 4px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; border-top-left-radius: 4px; } .nav-tabs.nav-stacked > li:last-child > a { -webkit-border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; border-bottom-right-radius: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; border-bottom-left-radius: 4px; } .nav-tabs.nav-stacked > li > a:hover, .nav-tabs.nav-stacked > li > a:focus { border-color: #ddd; z-index: 2; } .nav-pills.nav-stacked > li > a { margin-bottom: 3px; } .nav-pills.nav-stacked > li:last-child > a { margin-bottom: 1px; } .nav-tabs .dropdown-menu { -webkit-border-radius: 0 0 6px 6px; -moz-border-radius: 0 0 6px 6px; border-radius: 0 0 6px 6px; } .nav-pills .dropdown-menu { -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .nav .dropdown-toggle .caret { border-top-color: #0088cc; border-bottom-color: #0088cc; margin-top: 6px; } .nav .dropdown-toggle:hover .caret, .nav .dropdown-toggle:focus .caret { border-top-color: #005580; border-bottom-color: #005580; } /* move down carets for tabs */ .nav-tabs .dropdown-toggle .caret { margin-top: 8px; } .nav .active .dropdown-toggle .caret { border-top-color: #fff; border-bottom-color: #fff; } .nav-tabs .active .dropdown-toggle .caret { border-top-color: #555555; border-bottom-color: #555555; } .nav > .dropdown.active > a:hover, .nav > .dropdown.active > a:focus { cursor: pointer; } .nav-tabs .open .dropdown-toggle, .nav-pills .open .dropdown-toggle, .nav > li.dropdown.open.active > a:hover, .nav > li.dropdown.open.active > a:focus { color: #ffffff; background-color: #999999; border-color: #999999; } .nav li.dropdown.open .caret, .nav li.dropdown.open.active .caret, .nav li.dropdown.open a:hover .caret, .nav li.dropdown.open a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; opacity: 1; filter: alpha(opacity=100); } .tabs-stacked .open > a:hover, .tabs-stacked .open > a:focus { border-color: #999999; } .tabbable { *zoom: 1; } .tabbable:before, .tabbable:after { display: table; content: ""; line-height: 0; } .tabbable:after { clear: both; } .tab-content { overflow: auto; } .tabs-below > .nav-tabs, .tabs-right > .nav-tabs, .tabs-left > .nav-tabs { border-bottom: 0; } .tab-content > .tab-pane, .pill-content > .pill-pane { display: none; } .tab-content > .active, .pill-content > .active { display: block; } .tabs-below > .nav-tabs { border-top: 1px solid #ddd; } .tabs-below > .nav-tabs > li { margin-top: -1px; margin-bottom: 0; } .tabs-below > .nav-tabs > li > a { -webkit-border-radius: 0 0 4px 4px; -moz-border-radius: 0 0 4px 4px; border-radius: 0 0 4px 4px; } .tabs-below > .nav-tabs > li > a:hover, .tabs-below > .nav-tabs > li > a:focus { border-bottom-color: transparent; border-top-color: #ddd; } .tabs-below > .nav-tabs > .active > a, .tabs-below > .nav-tabs > .active > a:hover, .tabs-below > .nav-tabs > .active > a:focus { border-color: transparent #ddd #ddd #ddd; } .tabs-left > .nav-tabs > li, .tabs-right > .nav-tabs > li { float: none; } .tabs-left > .nav-tabs > li > a, .tabs-right > .nav-tabs > li > a { min-width: 74px; margin-right: 0; margin-bottom: 3px; } .tabs-left > .nav-tabs { float: left; margin-right: 19px; border-right: 1px solid #ddd; } .tabs-left > .nav-tabs > li > a { margin-right: -1px; -webkit-border-radius: 4px 0 0 4px; -moz-border-radius: 4px 0 0 4px; border-radius: 4px 0 0 4px; } .tabs-left > .nav-tabs > li > a:hover, .tabs-left > .nav-tabs > li > a:focus { border-color: #eeeeee #dddddd #eeeeee #eeeeee; } .tabs-left > .nav-tabs .active > a, .tabs-left > .nav-tabs .active > a:hover, .tabs-left > .nav-tabs .active > a:focus { border-color: #ddd transparent #ddd #ddd; *border-right-color: #ffffff; } .tabs-right > .nav-tabs { float: right; margin-left: 19px; border-left: 1px solid #ddd; } .tabs-right > .nav-tabs > li > a { margin-left: -1px; -webkit-border-radius: 0 4px 4px 0; -moz-border-radius: 0 4px 4px 0; border-radius: 0 4px 4px 0; } .tabs-right > .nav-tabs > li > a:hover, .tabs-right > .nav-tabs > li > a:focus { border-color: #eeeeee #eeeeee #eeeeee #dddddd; } .tabs-right > .nav-tabs .active > a, .tabs-right > .nav-tabs .active > a:hover, .tabs-right > .nav-tabs .active > a:focus { border-color: #ddd #ddd #ddd transparent; *border-left-color: #ffffff; } .nav > .disabled > a { color: #999999; } .nav > .disabled > a:hover, .nav > .disabled > a:focus { text-decoration: none; background-color: transparent; cursor: default; } .navbar { overflow: visible; margin-bottom: 20px; *position: relative; *z-index: 2; } .navbar-inner { min-height: 40px; padding-left: 20px; padding-right: 20px; background-color: #fafafa; background-image: -moz-linear-gradient(top, #ffffff, #f2f2f2); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ffffff), to(#f2f2f2)); background-image: -webkit-linear-gradient(top, #ffffff, #f2f2f2); background-image: -o-linear-gradient(top, #ffffff, #f2f2f2); background-image: linear-gradient(to bottom, #ffffff, #f2f2f2); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffffff', endColorstr='#fff2f2f2', GradientType=0); border: 1px solid #d4d4d4; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); -moz-box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); box-shadow: 0 1px 4px rgba(0, 0, 0, 0.065); *zoom: 1; } .navbar-inner:before, .navbar-inner:after { display: table; content: ""; line-height: 0; } .navbar-inner:after { clear: both; } .navbar .container { width: auto; } .nav-collapse.collapse { height: auto; overflow: visible; } .navbar .brand { float: left; display: block; padding: 10px 20px 10px; margin-left: -20px; font-size: 20px; font-weight: 200; color: #777777; text-shadow: 0 1px 0 #ffffff; } .navbar .brand:hover, .navbar .brand:focus { text-decoration: none; } .navbar-text { margin-bottom: 0; line-height: 40px; color: #777777; } .navbar-link { color: #777777; } .navbar-link:hover, .navbar-link:focus { color: #333333; } .navbar .divider-vertical { height: 40px; margin: 0 9px; border-left: 1px solid #f2f2f2; border-right: 1px solid #ffffff; } .navbar .btn, .navbar .btn-group { margin-top: 5px; } .navbar .btn-group .btn, .navbar .input-prepend .btn, .navbar .input-append .btn, .navbar .input-prepend .btn-group, .navbar .input-append .btn-group { margin-top: 0; } .navbar-form { margin-bottom: 0; *zoom: 1; } .navbar-form:before, .navbar-form:after { display: table; content: ""; line-height: 0; } .navbar-form:after { clear: both; } .navbar-form input, .navbar-form select, .navbar-form .radio, .navbar-form .checkbox { margin-top: 5px; } .navbar-form input, .navbar-form select, .navbar-form .btn { display: inline-block; margin-bottom: 0; } .navbar-form input[type="image"], .navbar-form input[type="checkbox"], .navbar-form input[type="radio"] { margin-top: 3px; } .navbar-form .input-append, .navbar-form .input-prepend { margin-top: 5px; white-space: nowrap; } .navbar-form .input-append input, .navbar-form .input-prepend input { margin-top: 0; } .navbar-search { position: relative; float: left; margin-top: 5px; margin-bottom: 0; } .navbar-search .search-query { margin-bottom: 0; padding: 4px 14px; font-family: "Helvetica Neue", Helvetica, Arial, sans-serif; font-size: 13px; font-weight: normal; line-height: 1; -webkit-border-radius: 15px; -moz-border-radius: 15px; border-radius: 15px; } .navbar-static-top { position: static; margin-bottom: 0; } .navbar-static-top .navbar-inner { -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .navbar-fixed-top, .navbar-fixed-bottom { position: fixed; right: 0; left: 0; z-index: 1030; margin-bottom: 0; } .navbar-fixed-top .navbar-inner, .navbar-static-top .navbar-inner { border-width: 0 0 1px; } .navbar-fixed-bottom .navbar-inner { border-width: 1px 0 0; } .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner { padding-left: 0; padding-right: 0; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; } .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { width: 940px; } .navbar-fixed-top { top: 0; } .navbar-fixed-top .navbar-inner, .navbar-static-top .navbar-inner { -webkit-box-shadow: 0 1px 10px rgba(0,0,0,.1); -moz-box-shadow: 0 1px 10px rgba(0,0,0,.1); box-shadow: 0 1px 10px rgba(0,0,0,.1); } .navbar-fixed-bottom { bottom: 0; } .navbar-fixed-bottom .navbar-inner { -webkit-box-shadow: 0 -1px 10px rgba(0,0,0,.1); -moz-box-shadow: 0 -1px 10px rgba(0,0,0,.1); box-shadow: 0 -1px 10px rgba(0,0,0,.1); } .navbar .nav { position: relative; left: 0; display: block; float: left; margin: 0 10px 0 0; } .navbar .nav.pull-right { float: right; margin-right: 0; } .navbar .nav > li { float: left; } .navbar .nav > li > a { float: none; padding: 10px 15px 10px; color: #777777; text-decoration: none; text-shadow: 0 1px 0 #ffffff; } .navbar .nav .dropdown-toggle .caret { margin-top: 8px; } .navbar .nav > li > a:focus, .navbar .nav > li > a:hover { background-color: transparent; color: #333333; text-decoration: none; } .navbar .nav > .active > a, .navbar .nav > .active > a:hover, .navbar .nav > .active > a:focus { color: #555555; text-decoration: none; background-color: #e5e5e5; -webkit-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); -moz-box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); box-shadow: inset 0 3px 8px rgba(0, 0, 0, 0.125); } .navbar .btn-navbar { display: none; float: right; padding: 7px 10px; margin-left: 5px; margin-right: 5px; color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #ededed; background-image: -moz-linear-gradient(top, #f2f2f2, #e5e5e5); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f2f2f2), to(#e5e5e5)); background-image: -webkit-linear-gradient(top, #f2f2f2, #e5e5e5); background-image: -o-linear-gradient(top, #f2f2f2, #e5e5e5); background-image: linear-gradient(to bottom, #f2f2f2, #e5e5e5); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff2f2f2', endColorstr='#ffe5e5e5', GradientType=0); border-color: #e5e5e5 #e5e5e5 #bfbfbf; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #e5e5e5; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.075); } .navbar .btn-navbar:hover, .navbar .btn-navbar:focus, .navbar .btn-navbar:active, .navbar .btn-navbar.active, .navbar .btn-navbar.disabled, .navbar .btn-navbar[disabled] { color: #ffffff; background-color: #e5e5e5; *background-color: #d9d9d9; } .navbar .btn-navbar:active, .navbar .btn-navbar.active { background-color: #cccccc \9; } .navbar .btn-navbar .icon-bar { display: block; width: 18px; height: 2px; background-color: #f5f5f5; -webkit-border-radius: 1px; -moz-border-radius: 1px; border-radius: 1px; -webkit-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); -moz-box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); box-shadow: 0 1px 0 rgba(0, 0, 0, 0.25); } .btn-navbar .icon-bar + .icon-bar { margin-top: 3px; } .navbar .nav > li > .dropdown-menu:before { content: ''; display: inline-block; border-left: 7px solid transparent; border-right: 7px solid transparent; border-bottom: 7px solid #ccc; border-bottom-color: rgba(0, 0, 0, 0.2); position: absolute; top: -7px; left: 9px; } .navbar .nav > li > .dropdown-menu:after { content: ''; display: inline-block; border-left: 6px solid transparent; border-right: 6px solid transparent; border-bottom: 6px solid #ffffff; position: absolute; top: -6px; left: 10px; } .navbar-fixed-bottom .nav > li > .dropdown-menu:before { border-top: 7px solid #ccc; border-top-color: rgba(0, 0, 0, 0.2); border-bottom: 0; bottom: -7px; top: auto; } .navbar-fixed-bottom .nav > li > .dropdown-menu:after { border-top: 6px solid #ffffff; border-bottom: 0; bottom: -6px; top: auto; } .navbar .nav li.dropdown > a:hover .caret, .navbar .nav li.dropdown > a:focus .caret { border-top-color: #333333; border-bottom-color: #333333; } .navbar .nav li.dropdown.open > .dropdown-toggle, .navbar .nav li.dropdown.active > .dropdown-toggle, .navbar .nav li.dropdown.open.active > .dropdown-toggle { background-color: #e5e5e5; color: #555555; } .navbar .nav li.dropdown > .dropdown-toggle .caret { border-top-color: #777777; border-bottom-color: #777777; } .navbar .nav li.dropdown.open > .dropdown-toggle .caret, .navbar .nav li.dropdown.active > .dropdown-toggle .caret, .navbar .nav li.dropdown.open.active > .dropdown-toggle .caret { border-top-color: #555555; border-bottom-color: #555555; } .navbar .pull-right > li > .dropdown-menu, .navbar .nav > li > .dropdown-menu.pull-right { left: auto; right: 0; } .navbar .pull-right > li > .dropdown-menu:before, .navbar .nav > li > .dropdown-menu.pull-right:before { left: auto; right: 12px; } .navbar .pull-right > li > .dropdown-menu:after, .navbar .nav > li > .dropdown-menu.pull-right:after { left: auto; right: 13px; } .navbar .pull-right > li > .dropdown-menu .dropdown-menu, .navbar .nav > li > .dropdown-menu.pull-right .dropdown-menu { left: auto; right: 100%; margin-left: 0; margin-right: -1px; -webkit-border-radius: 6px 0 6px 6px; -moz-border-radius: 6px 0 6px 6px; border-radius: 6px 0 6px 6px; } .navbar-inverse .navbar-inner { background-color: #1b1b1b; background-image: -moz-linear-gradient(top, #222222, #111111); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#222222), to(#111111)); background-image: -webkit-linear-gradient(top, #222222, #111111); background-image: -o-linear-gradient(top, #222222, #111111); background-image: linear-gradient(to bottom, #222222, #111111); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff222222', endColorstr='#ff111111', GradientType=0); border-color: #252525; } .navbar-inverse .brand, .navbar-inverse .nav > li > a { color: #999999; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); } .navbar-inverse .brand:hover, .navbar-inverse .nav > li > a:hover, .navbar-inverse .brand:focus, .navbar-inverse .nav > li > a:focus { color: #ffffff; } .navbar-inverse .brand { color: #999999; } .navbar-inverse .navbar-text { color: #999999; } .navbar-inverse .nav > li > a:focus, .navbar-inverse .nav > li > a:hover { background-color: transparent; color: #ffffff; } .navbar-inverse .nav .active > a, .navbar-inverse .nav .active > a:hover, .navbar-inverse .nav .active > a:focus { color: #ffffff; background-color: #111111; } .navbar-inverse .navbar-link { color: #999999; } .navbar-inverse .navbar-link:hover, .navbar-inverse .navbar-link:focus { color: #ffffff; } .navbar-inverse .divider-vertical { border-left-color: #111111; border-right-color: #222222; } .navbar-inverse .nav li.dropdown.open > .dropdown-toggle, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle { background-color: #111111; color: #ffffff; } .navbar-inverse .nav li.dropdown > a:hover .caret, .navbar-inverse .nav li.dropdown > a:focus .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .nav li.dropdown > .dropdown-toggle .caret { border-top-color: #999999; border-bottom-color: #999999; } .navbar-inverse .nav li.dropdown.open > .dropdown-toggle .caret, .navbar-inverse .nav li.dropdown.active > .dropdown-toggle .caret, .navbar-inverse .nav li.dropdown.open.active > .dropdown-toggle .caret { border-top-color: #ffffff; border-bottom-color: #ffffff; } .navbar-inverse .navbar-search .search-query { color: #ffffff; background-color: #515151; border-color: #111111; -webkit-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); -moz-box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); box-shadow: inset 0 1px 2px rgba(0,0,0,.1), 0 1px 0 rgba(255,255,255,.15); -webkit-transition: none; -moz-transition: none; -o-transition: none; transition: none; } .navbar-inverse .navbar-search .search-query:-moz-placeholder { color: #cccccc; } .navbar-inverse .navbar-search .search-query:-ms-input-placeholder { color: #cccccc; } .navbar-inverse .navbar-search .search-query::-webkit-input-placeholder { color: #cccccc; } .navbar-inverse .navbar-search .search-query:focus, .navbar-inverse .navbar-search .search-query.focused { padding: 5px 15px; color: #333333; text-shadow: 0 1px 0 #ffffff; background-color: #ffffff; border: 0; -webkit-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); -moz-box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); box-shadow: 0 0 3px rgba(0, 0, 0, 0.15); outline: 0; } .navbar-inverse .btn-navbar { color: #ffffff; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #0e0e0e; background-image: -moz-linear-gradient(top, #151515, #040404); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#151515), to(#040404)); background-image: -webkit-linear-gradient(top, #151515, #040404); background-image: -o-linear-gradient(top, #151515, #040404); background-image: linear-gradient(to bottom, #151515, #040404); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff151515', endColorstr='#ff040404', GradientType=0); border-color: #040404 #040404 #000000; border-color: rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.1) rgba(0, 0, 0, 0.25); *background-color: #040404; /* Darken IE7 buttons by default so they stand out more given they won't have borders */ filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); } .navbar-inverse .btn-navbar:hover, .navbar-inverse .btn-navbar:focus, .navbar-inverse .btn-navbar:active, .navbar-inverse .btn-navbar.active, .navbar-inverse .btn-navbar.disabled, .navbar-inverse .btn-navbar[disabled] { color: #ffffff; background-color: #040404; *background-color: #000000; } .navbar-inverse .btn-navbar:active, .navbar-inverse .btn-navbar.active { background-color: #000000 \9; } .breadcrumb { padding: 8px 15px; margin: 0 0 20px; list-style: none; background-color: #f5f5f5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .breadcrumb > li { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; text-shadow: 0 1px 0 #ffffff; } .breadcrumb > li > .divider { padding: 0 5px; color: #ccc; } .breadcrumb > .active { color: #999999; } .pagination { margin: 20px 0; } .pagination ul { display: inline-block; *display: inline; /* IE7 inline-block hack */ *zoom: 1; margin-left: 0; margin-bottom: 0; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); -moz-box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); box-shadow: 0 1px 2px rgba(0, 0, 0, 0.05); } .pagination ul > li { display: inline; } .pagination ul > li > a, .pagination ul > li > span { float: left; padding: 4px 12px; line-height: 20px; text-decoration: none; background-color: #ffffff; border: 1px solid #dddddd; border-left-width: 0; } .pagination ul > li > a:hover, .pagination ul > li > a:focus, .pagination ul > .active > a, .pagination ul > .active > span { background-color: #f5f5f5; } .pagination ul > .active > a, .pagination ul > .active > span { color: #999999; cursor: default; } .pagination ul > .disabled > span, .pagination ul > .disabled > a, .pagination ul > .disabled > a:hover, .pagination ul > .disabled > a:focus { color: #999999; background-color: transparent; cursor: default; } .pagination ul > li:first-child > a, .pagination ul > li:first-child > span { border-left-width: 1px; -webkit-border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; border-top-left-radius: 4px; -webkit-border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; border-bottom-left-radius: 4px; } .pagination ul > li:last-child > a, .pagination ul > li:last-child > span { -webkit-border-top-right-radius: 4px; -moz-border-radius-topright: 4px; border-top-right-radius: 4px; -webkit-border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; border-bottom-right-radius: 4px; } .pagination-centered { text-align: center; } .pagination-right { text-align: right; } .pagination-large ul > li > a, .pagination-large ul > li > span { padding: 11px 19px; font-size: 17.5px; } .pagination-large ul > li:first-child > a, .pagination-large ul > li:first-child > span { -webkit-border-top-left-radius: 6px; -moz-border-radius-topleft: 6px; border-top-left-radius: 6px; -webkit-border-bottom-left-radius: 6px; -moz-border-radius-bottomleft: 6px; border-bottom-left-radius: 6px; } .pagination-large ul > li:last-child > a, .pagination-large ul > li:last-child > span { -webkit-border-top-right-radius: 6px; -moz-border-radius-topright: 6px; border-top-right-radius: 6px; -webkit-border-bottom-right-radius: 6px; -moz-border-radius-bottomright: 6px; border-bottom-right-radius: 6px; } .pagination-mini ul > li:first-child > a, .pagination-small ul > li:first-child > a, .pagination-mini ul > li:first-child > span, .pagination-small ul > li:first-child > span { -webkit-border-top-left-radius: 3px; -moz-border-radius-topleft: 3px; border-top-left-radius: 3px; -webkit-border-bottom-left-radius: 3px; -moz-border-radius-bottomleft: 3px; border-bottom-left-radius: 3px; } .pagination-mini ul > li:last-child > a, .pagination-small ul > li:last-child > a, .pagination-mini ul > li:last-child > span, .pagination-small ul > li:last-child > span { -webkit-border-top-right-radius: 3px; -moz-border-radius-topright: 3px; border-top-right-radius: 3px; -webkit-border-bottom-right-radius: 3px; -moz-border-radius-bottomright: 3px; border-bottom-right-radius: 3px; } .pagination-small ul > li > a, .pagination-small ul > li > span { padding: 2px 10px; font-size: 11.9px; } .pagination-mini ul > li > a, .pagination-mini ul > li > span { padding: 0 6px; font-size: 10.5px; } .pager { margin: 20px 0; list-style: none; text-align: center; *zoom: 1; } .pager:before, .pager:after { display: table; content: ""; line-height: 0; } .pager:after { clear: both; } .pager li { display: inline; } .pager li > a, .pager li > span { display: inline-block; padding: 5px 14px; background-color: #fff; border: 1px solid #ddd; -webkit-border-radius: 15px; -moz-border-radius: 15px; border-radius: 15px; } .pager li > a:hover, .pager li > a:focus { text-decoration: none; background-color: #f5f5f5; } .pager .next > a, .pager .next > span { float: right; } .pager .previous > a, .pager .previous > span { float: left; } .pager .disabled > a, .pager .disabled > a:hover, .pager .disabled > a:focus, .pager .disabled > span { color: #999999; background-color: #fff; cursor: default; } .thumbnails { margin-left: -20px; list-style: none; *zoom: 1; } .thumbnails:before, .thumbnails:after { display: table; content: ""; line-height: 0; } .thumbnails:after { clear: both; } .row-fluid .thumbnails { margin-left: 0; } .thumbnails > li { float: left; margin-bottom: 20px; margin-left: 20px; } .thumbnail { display: block; padding: 4px; line-height: 20px; border: 1px solid #ddd; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); -moz-box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); box-shadow: 0 1px 3px rgba(0, 0, 0, 0.055); -webkit-transition: all 0.2s ease-in-out; -moz-transition: all 0.2s ease-in-out; -o-transition: all 0.2s ease-in-out; transition: all 0.2s ease-in-out; } a.thumbnail:hover, a.thumbnail:focus { border-color: #0088cc; -webkit-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); -moz-box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); box-shadow: 0 1px 4px rgba(0, 105, 214, 0.25); } .thumbnail > img { display: block; max-width: 100%; margin-left: auto; margin-right: auto; } .thumbnail .caption { padding: 9px; color: #555555; } .alert { padding: 8px 35px 8px 14px; margin-bottom: 20px; text-shadow: 0 1px 0 rgba(255, 255, 255, 0.5); background-color: #fcf8e3; border: 1px solid #fbeed5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .alert, .alert h4 { color: #c09853; } .alert h4 { margin: 0; } .alert .close { position: relative; top: -2px; right: -21px; line-height: 20px; } .alert-success { background-color: #dff0d8; border-color: #d6e9c6; color: #468847; } .alert-success h4 { color: #468847; } .alert-danger, .alert-error { background-color: #f2dede; border-color: #eed3d7; color: #b94a48; } .alert-danger h4, .alert-error h4 { color: #b94a48; } .alert-info { background-color: #d9edf7; border-color: #bce8f1; color: #3a87ad; } .alert-info h4 { color: #3a87ad; } .alert-block { padding-top: 14px; padding-bottom: 14px; } .alert-block > p, .alert-block > ul { margin-bottom: 0; } .alert-block p + p { margin-top: 5px; } @-webkit-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-moz-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-ms-keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } @-o-keyframes progress-bar-stripes { from { background-position: 0 0; } to { background-position: 40px 0; } } @keyframes progress-bar-stripes { from { background-position: 40px 0; } to { background-position: 0 0; } } .progress { overflow: hidden; height: 20px; margin-bottom: 20px; background-color: #f7f7f7; background-image: -moz-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#f5f5f5), to(#f9f9f9)); background-image: -webkit-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: -o-linear-gradient(top, #f5f5f5, #f9f9f9); background-image: linear-gradient(to bottom, #f5f5f5, #f9f9f9); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fff5f5f5', endColorstr='#fff9f9f9', GradientType=0); -webkit-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -moz-box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); box-shadow: inset 0 1px 2px rgba(0, 0, 0, 0.1); -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .progress .bar { width: 0%; height: 100%; color: #ffffff; float: left; font-size: 12px; text-align: center; text-shadow: 0 -1px 0 rgba(0, 0, 0, 0.25); background-color: #0e90d2; background-image: -moz-linear-gradient(top, #149bdf, #0480be); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#149bdf), to(#0480be)); background-image: -webkit-linear-gradient(top, #149bdf, #0480be); background-image: -o-linear-gradient(top, #149bdf, #0480be); background-image: linear-gradient(to bottom, #149bdf, #0480be); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff149bdf', endColorstr='#ff0480be', GradientType=0); -webkit-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -moz-box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); box-shadow: inset 0 -1px 0 rgba(0, 0, 0, 0.15); -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; -webkit-transition: width 0.6s ease; -moz-transition: width 0.6s ease; -o-transition: width 0.6s ease; transition: width 0.6s ease; } .progress .bar + .bar { -webkit-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); -moz-box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); box-shadow: inset 1px 0 0 rgba(0,0,0,.15), inset 0 -1px 0 rgba(0,0,0,.15); } .progress-striped .bar { background-color: #149bdf; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); -webkit-background-size: 40px 40px; -moz-background-size: 40px 40px; -o-background-size: 40px 40px; background-size: 40px 40px; } .progress.active .bar { -webkit-animation: progress-bar-stripes 2s linear infinite; -moz-animation: progress-bar-stripes 2s linear infinite; -ms-animation: progress-bar-stripes 2s linear infinite; -o-animation: progress-bar-stripes 2s linear infinite; animation: progress-bar-stripes 2s linear infinite; } .progress-danger .bar, .progress .bar-danger { background-color: #dd514c; background-image: -moz-linear-gradient(top, #ee5f5b, #c43c35); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#ee5f5b), to(#c43c35)); background-image: -webkit-linear-gradient(top, #ee5f5b, #c43c35); background-image: -o-linear-gradient(top, #ee5f5b, #c43c35); background-image: linear-gradient(to bottom, #ee5f5b, #c43c35); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffee5f5b', endColorstr='#ffc43c35', GradientType=0); } .progress-danger.progress-striped .bar, .progress-striped .bar-danger { background-color: #ee5f5b; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-success .bar, .progress .bar-success { background-color: #5eb95e; background-image: -moz-linear-gradient(top, #62c462, #57a957); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#62c462), to(#57a957)); background-image: -webkit-linear-gradient(top, #62c462, #57a957); background-image: -o-linear-gradient(top, #62c462, #57a957); background-image: linear-gradient(to bottom, #62c462, #57a957); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff62c462', endColorstr='#ff57a957', GradientType=0); } .progress-success.progress-striped .bar, .progress-striped .bar-success { background-color: #62c462; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-info .bar, .progress .bar-info { background-color: #4bb1cf; background-image: -moz-linear-gradient(top, #5bc0de, #339bb9); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#5bc0de), to(#339bb9)); background-image: -webkit-linear-gradient(top, #5bc0de, #339bb9); background-image: -o-linear-gradient(top, #5bc0de, #339bb9); background-image: linear-gradient(to bottom, #5bc0de, #339bb9); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff5bc0de', endColorstr='#ff339bb9', GradientType=0); } .progress-info.progress-striped .bar, .progress-striped .bar-info { background-color: #5bc0de; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .progress-warning .bar, .progress .bar-warning { background-color: #faa732; background-image: -moz-linear-gradient(top, #fbb450, #f89406); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#fbb450), to(#f89406)); background-image: -webkit-linear-gradient(top, #fbb450, #f89406); background-image: -o-linear-gradient(top, #fbb450, #f89406); background-image: linear-gradient(to bottom, #fbb450, #f89406); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#fffbb450', endColorstr='#fff89406', GradientType=0); } .progress-warning.progress-striped .bar, .progress-striped .bar-warning { background-color: #fbb450; background-image: -webkit-gradient(linear, 0 100%, 100% 0, color-stop(0.25, rgba(255, 255, 255, 0.15)), color-stop(0.25, transparent), color-stop(0.5, transparent), color-stop(0.5, rgba(255, 255, 255, 0.15)), color-stop(0.75, rgba(255, 255, 255, 0.15)), color-stop(0.75, transparent), to(transparent)); background-image: -webkit-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -moz-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: -o-linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); background-image: linear-gradient(45deg, rgba(255, 255, 255, 0.15) 25%, transparent 25%, transparent 50%, rgba(255, 255, 255, 0.15) 50%, rgba(255, 255, 255, 0.15) 75%, transparent 75%, transparent); } .hero-unit { padding: 60px; margin-bottom: 30px; font-size: 18px; font-weight: 200; line-height: 30px; color: inherit; background-color: #eeeeee; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .hero-unit h1 { margin-bottom: 0; font-size: 60px; line-height: 1; color: inherit; letter-spacing: -1px; } .hero-unit li { line-height: 30px; } .media, .media-body { overflow: hidden; *overflow: visible; zoom: 1; } .media, .media .media { margin-top: 15px; } .media:first-child { margin-top: 0; } .media-object { display: block; } .media-heading { margin: 0 0 5px; } .media > .pull-left { margin-right: 10px; } .media > .pull-right { margin-left: 10px; } .media-list { margin-left: 0; list-style: none; } .tooltip { position: absolute; z-index: 1030; display: block; visibility: visible; font-size: 11px; line-height: 1.4; opacity: 0; filter: alpha(opacity=0); } .tooltip.in { opacity: 0.8; filter: alpha(opacity=80); } .tooltip.top { margin-top: -3px; padding: 5px 0; } .tooltip.right { margin-left: 3px; padding: 0 5px; } .tooltip.bottom { margin-top: 3px; padding: 5px 0; } .tooltip.left { margin-left: -3px; padding: 0 5px; } .tooltip-inner { max-width: 200px; padding: 8px; color: #ffffff; text-align: center; text-decoration: none; background-color: #000000; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .tooltip-arrow { position: absolute; width: 0; height: 0; border-color: transparent; border-style: solid; } .tooltip.top .tooltip-arrow { bottom: 0; left: 50%; margin-left: -5px; border-width: 5px 5px 0; border-top-color: #000000; } .tooltip.right .tooltip-arrow { top: 50%; left: 0; margin-top: -5px; border-width: 5px 5px 5px 0; border-right-color: #000000; } .tooltip.left .tooltip-arrow { top: 50%; right: 0; margin-top: -5px; border-width: 5px 0 5px 5px; border-left-color: #000000; } .tooltip.bottom .tooltip-arrow { top: 0; left: 50%; margin-left: -5px; border-width: 0 5px 5px; border-bottom-color: #000000; } .popover { position: absolute; top: 0; left: 0; z-index: 1010; display: none; max-width: 276px; padding: 1px; text-align: left; background-color: #ffffff; -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); white-space: normal; } .popover.top { margin-top: -10px; } .popover.right { margin-left: 10px; } .popover.bottom { margin-top: 10px; } .popover.left { margin-left: -10px; } .popover-title { margin: 0; padding: 8px 14px; font-size: 14px; font-weight: normal; line-height: 18px; background-color: #f7f7f7; border-bottom: 1px solid #ebebeb; -webkit-border-radius: 5px 5px 0 0; -moz-border-radius: 5px 5px 0 0; border-radius: 5px 5px 0 0; } .popover-title:empty { display: none; } .popover-content { padding: 9px 14px; } .popover .arrow, .popover .arrow:after { position: absolute; display: block; width: 0; height: 0; border-color: transparent; border-style: solid; } .popover .arrow { border-width: 11px; } .popover .arrow:after { border-width: 10px; content: ""; } .popover.top .arrow { left: 50%; margin-left: -11px; border-bottom-width: 0; border-top-color: #999; border-top-color: rgba(0, 0, 0, 0.25); bottom: -11px; } .popover.top .arrow:after { bottom: 1px; margin-left: -10px; border-bottom-width: 0; border-top-color: #ffffff; } .popover.right .arrow { top: 50%; left: -11px; margin-top: -11px; border-left-width: 0; border-right-color: #999; border-right-color: rgba(0, 0, 0, 0.25); } .popover.right .arrow:after { left: 1px; bottom: -10px; border-left-width: 0; border-right-color: #ffffff; } .popover.bottom .arrow { left: 50%; margin-left: -11px; border-top-width: 0; border-bottom-color: #999; border-bottom-color: rgba(0, 0, 0, 0.25); top: -11px; } .popover.bottom .arrow:after { top: 1px; margin-left: -10px; border-top-width: 0; border-bottom-color: #ffffff; } .popover.left .arrow { top: 50%; right: -11px; margin-top: -11px; border-right-width: 0; border-left-color: #999; border-left-color: rgba(0, 0, 0, 0.25); } .popover.left .arrow:after { right: 1px; border-right-width: 0; border-left-color: #ffffff; bottom: -10px; } .modal-backdrop { position: fixed; top: 0; right: 0; bottom: 0; left: 0; z-index: 1040; background-color: #000000; } .modal-backdrop.fade { opacity: 0; } .modal-backdrop, .modal-backdrop.fade.in { opacity: 0.8; filter: alpha(opacity=80); } .modal { position: fixed; top: 10%; left: 50%; z-index: 1050; width: 560px; margin-left: -280px; background-color: #ffffff; border: 1px solid #999; border: 1px solid rgba(0, 0, 0, 0.3); *border: 1px solid #999; /* IE6-7 */ -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -moz-box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); box-shadow: 0 3px 7px rgba(0, 0, 0, 0.3); -webkit-background-clip: padding-box; -moz-background-clip: padding-box; background-clip: padding-box; outline: none; } .modal.fade { -webkit-transition: opacity .3s linear, top .3s ease-out; -moz-transition: opacity .3s linear, top .3s ease-out; -o-transition: opacity .3s linear, top .3s ease-out; transition: opacity .3s linear, top .3s ease-out; top: -25%; } .modal.fade.in { top: 10%; } .modal-header { padding: 9px 15px; border-bottom: 1px solid #eee; } .modal-header .close { margin-top: 2px; } .modal-header h3 { margin: 0; line-height: 30px; } .modal-body { position: relative; overflow-y: auto; max-height: 400px; padding: 15px; } .modal-form { margin-bottom: 0; } .modal-footer { padding: 14px 15px 15px; margin-bottom: 0; text-align: right; background-color: #f5f5f5; border-top: 1px solid #ddd; -webkit-border-radius: 0 0 6px 6px; -moz-border-radius: 0 0 6px 6px; border-radius: 0 0 6px 6px; -webkit-box-shadow: inset 0 1px 0 #ffffff; -moz-box-shadow: inset 0 1px 0 #ffffff; box-shadow: inset 0 1px 0 #ffffff; *zoom: 1; } .modal-footer:before, .modal-footer:after { display: table; content: ""; line-height: 0; } .modal-footer:after { clear: both; } .modal-footer .btn + .btn { margin-left: 5px; margin-bottom: 0; } .modal-footer .btn-group .btn + .btn { margin-left: -1px; } .modal-footer .btn-block + .btn-block { margin-left: 0; } .dropup, .dropdown { position: relative; } .dropdown-toggle { *margin-bottom: -3px; } .dropdown-toggle:active, .open .dropdown-toggle { outline: 0; } .caret { display: inline-block; width: 0; height: 0; vertical-align: top; border-top: 4px solid #000000; border-right: 4px solid transparent; border-left: 4px solid transparent; content: ""; } .dropdown .caret { margin-top: 8px; margin-left: 2px; } .dropdown-menu { position: absolute; top: 100%; left: 0; z-index: 1000; display: none; float: left; min-width: 160px; padding: 5px 0; margin: 2px 0 0; list-style: none; background-color: #ffffff; border: 1px solid #ccc; border: 1px solid rgba(0, 0, 0, 0.2); *border-right-width: 2px; *border-bottom-width: 2px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -moz-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); box-shadow: 0 5px 10px rgba(0, 0, 0, 0.2); -webkit-background-clip: padding-box; -moz-background-clip: padding; background-clip: padding-box; } .dropdown-menu.pull-right { right: 0; left: auto; } .dropdown-menu .divider { *width: 100%; height: 1px; margin: 9px 1px; *margin: -5px 0 5px; overflow: hidden; background-color: #e5e5e5; border-bottom: 1px solid #ffffff; } .dropdown-menu > li > a { display: block; padding: 3px 20px; clear: both; font-weight: normal; line-height: 20px; color: #333333; white-space: nowrap; } .dropdown-menu > li > a:hover, .dropdown-menu > li > a:focus, .dropdown-submenu:hover > a, .dropdown-submenu:focus > a { text-decoration: none; color: #ffffff; background-color: #0081c2; background-image: -moz-linear-gradient(top, #0088cc, #0077b3); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); background-image: -o-linear-gradient(top, #0088cc, #0077b3); background-image: linear-gradient(to bottom, #0088cc, #0077b3); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); } .dropdown-menu > .active > a, .dropdown-menu > .active > a:hover, .dropdown-menu > .active > a:focus { color: #ffffff; text-decoration: none; outline: 0; background-color: #0081c2; background-image: -moz-linear-gradient(top, #0088cc, #0077b3); background-image: -webkit-gradient(linear, 0 0, 0 100%, from(#0088cc), to(#0077b3)); background-image: -webkit-linear-gradient(top, #0088cc, #0077b3); background-image: -o-linear-gradient(top, #0088cc, #0077b3); background-image: linear-gradient(to bottom, #0088cc, #0077b3); background-repeat: repeat-x; filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ff0088cc', endColorstr='#ff0077b3', GradientType=0); } .dropdown-menu > .disabled > a, .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { color: #999999; } .dropdown-menu > .disabled > a:hover, .dropdown-menu > .disabled > a:focus { text-decoration: none; background-color: transparent; background-image: none; filter: progid:DXImageTransform.Microsoft.gradient(enabled = false); cursor: default; } .open { *z-index: 1000; } .open > .dropdown-menu { display: block; } .pull-right > .dropdown-menu { right: 0; left: auto; } .dropup .caret, .navbar-fixed-bottom .dropdown .caret { border-top: 0; border-bottom: 4px solid #000000; content: ""; } .dropup .dropdown-menu, .navbar-fixed-bottom .dropdown .dropdown-menu { top: auto; bottom: 100%; margin-bottom: 1px; } .dropdown-submenu { position: relative; } .dropdown-submenu > .dropdown-menu { top: 0; left: 100%; margin-top: -6px; margin-left: -1px; -webkit-border-radius: 0 6px 6px 6px; -moz-border-radius: 0 6px 6px 6px; border-radius: 0 6px 6px 6px; } .dropdown-submenu:hover > .dropdown-menu { display: block; } .dropup .dropdown-submenu > .dropdown-menu { top: auto; bottom: 0; margin-top: 0; margin-bottom: -2px; -webkit-border-radius: 5px 5px 5px 0; -moz-border-radius: 5px 5px 5px 0; border-radius: 5px 5px 5px 0; } .dropdown-submenu > a:after { display: block; content: " "; float: right; width: 0; height: 0; border-color: transparent; border-style: solid; border-width: 5px 0 5px 5px; border-left-color: #cccccc; margin-top: 5px; margin-right: -10px; } .dropdown-submenu:hover > a:after { border-left-color: #ffffff; } .dropdown-submenu.pull-left { float: none; } .dropdown-submenu.pull-left > .dropdown-menu { left: -100%; margin-left: 10px; -webkit-border-radius: 6px 0 6px 6px; -moz-border-radius: 6px 0 6px 6px; border-radius: 6px 0 6px 6px; } .dropdown .dropdown-menu .nav-header { padding-left: 20px; padding-right: 20px; } .typeahead { z-index: 1051; margin-top: 2px; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .accordion { margin-bottom: 20px; } .accordion-group { margin-bottom: 2px; border: 1px solid #e5e5e5; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .accordion-heading { border-bottom: 0; } .accordion-heading .accordion-toggle { display: block; padding: 8px 15px; } .accordion-toggle { cursor: pointer; } .accordion-inner { padding: 9px 15px; border-top: 1px solid #e5e5e5; } .carousel { position: relative; margin-bottom: 20px; line-height: 1; } .carousel-inner { overflow: hidden; width: 100%; position: relative; } .carousel-inner > .item { display: none; position: relative; -webkit-transition: 0.6s ease-in-out left; -moz-transition: 0.6s ease-in-out left; -o-transition: 0.6s ease-in-out left; transition: 0.6s ease-in-out left; } .carousel-inner > .item > img, .carousel-inner > .item > a > img { display: block; line-height: 1; } .carousel-inner > .active, .carousel-inner > .next, .carousel-inner > .prev { display: block; } .carousel-inner > .active { left: 0; } .carousel-inner > .next, .carousel-inner > .prev { position: absolute; top: 0; width: 100%; } .carousel-inner > .next { left: 100%; } .carousel-inner > .prev { left: -100%; } .carousel-inner > .next.left, .carousel-inner > .prev.right { left: 0; } .carousel-inner > .active.left { left: -100%; } .carousel-inner > .active.right { left: 100%; } .carousel-control { position: absolute; top: 40%; left: 15px; width: 40px; height: 40px; margin-top: -20px; font-size: 60px; font-weight: 100; line-height: 30px; color: #ffffff; text-align: center; background: #222222; border: 3px solid #ffffff; -webkit-border-radius: 23px; -moz-border-radius: 23px; border-radius: 23px; opacity: 0.5; filter: alpha(opacity=50); } .carousel-control.right { left: auto; right: 15px; } .carousel-control:hover, .carousel-control:focus { color: #ffffff; text-decoration: none; opacity: 0.9; filter: alpha(opacity=90); } .carousel-indicators { position: absolute; top: 15px; right: 15px; z-index: 5; margin: 0; list-style: none; } .carousel-indicators li { display: block; float: left; width: 10px; height: 10px; margin-left: 5px; text-indent: -999px; background-color: #ccc; background-color: rgba(255, 255, 255, 0.25); border-radius: 5px; } .carousel-indicators .active { background-color: #fff; } .carousel-caption { position: absolute; left: 0; right: 0; bottom: 0; padding: 15px; background: #333333; background: rgba(0, 0, 0, 0.75); } .carousel-caption h4, .carousel-caption p { color: #ffffff; line-height: 20px; } .carousel-caption h4 { margin: 0 0 5px; } .carousel-caption p { margin-bottom: 0; } .well { min-height: 20px; padding: 19px; margin-bottom: 20px; background-color: #f5f5f5; border: 1px solid #e3e3e3; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; -webkit-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); -moz-box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); box-shadow: inset 0 1px 1px rgba(0, 0, 0, 0.05); } .well blockquote { border-color: #ddd; border-color: rgba(0, 0, 0, 0.15); } .well-large { padding: 24px; -webkit-border-radius: 6px; -moz-border-radius: 6px; border-radius: 6px; } .well-small { padding: 9px; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .close { float: right; font-size: 20px; font-weight: bold; line-height: 20px; color: #000000; text-shadow: 0 1px 0 #ffffff; opacity: 0.2; filter: alpha(opacity=20); } .close:hover, .close:focus { color: #000000; text-decoration: none; cursor: pointer; opacity: 0.4; filter: alpha(opacity=40); } button.close { padding: 0; cursor: pointer; background: transparent; border: 0; -webkit-appearance: none; } .pull-right { float: right; } .pull-left { float: left; } .hide { display: none; } .show { display: block; } .invisible { visibility: hidden; } .affix { position: fixed; } .fade { opacity: 0; -webkit-transition: opacity 0.15s linear; -moz-transition: opacity 0.15s linear; -o-transition: opacity 0.15s linear; transition: opacity 0.15s linear; } .fade.in { opacity: 1; } .collapse { position: relative; height: 0; overflow: hidden; -webkit-transition: height 0.35s ease; -moz-transition: height 0.35s ease; -o-transition: height 0.35s ease; transition: height 0.35s ease; } .collapse.in { height: auto; } @-ms-viewport { width: device-width; } .hidden { display: none; visibility: hidden; } .visible-phone { display: none !important; } .visible-tablet { display: none !important; } .hidden-desktop { display: none !important; } .visible-desktop { display: inherit !important; } @media (min-width: 768px) and (max-width: 979px) { .hidden-desktop { display: inherit !important; } .visible-desktop { display: none !important ; } .visible-tablet { display: inherit !important; } .hidden-tablet { display: none !important; } } @media (max-width: 767px) { .hidden-desktop { display: inherit !important; } .visible-desktop { display: none !important; } .visible-phone { display: inherit !important; } .hidden-phone { display: none !important; } } .visible-print { display: none !important; } @media print { .visible-print { display: inherit !important; } .hidden-print { display: none !important; } } @media (max-width: 767px) { body { padding-left: 20px; padding-right: 20px; } .navbar-fixed-top, .navbar-fixed-bottom, .navbar-static-top { margin-left: -20px; margin-right: -20px; } .container-fluid { padding: 0; } .dl-horizontal dt { float: none; clear: none; width: auto; text-align: left; } .dl-horizontal dd { margin-left: 0; } .container { width: auto; } .row-fluid { width: 100%; } .row, .thumbnails { margin-left: 0; } .thumbnails > li { float: none; margin-left: 0; } [class*="span"], .uneditable-input[class*="span"], .row-fluid [class*="span"] { float: none; display: block; width: 100%; margin-left: 0; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .span12, .row-fluid .span12 { width: 100%; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .row-fluid [class*="offset"]:first-child { margin-left: 0; } .input-large, .input-xlarge, .input-xxlarge, input[class*="span"], select[class*="span"], textarea[class*="span"], .uneditable-input { display: block; width: 100%; min-height: 30px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; } .input-prepend input, .input-append input, .input-prepend input[class*="span"], .input-append input[class*="span"] { display: inline-block; width: auto; } .controls-row [class*="span"] + [class*="span"] { margin-left: 0; } .modal { position: fixed; top: 20px; left: 20px; right: 20px; width: auto; margin: 0; } .modal.fade { top: -100px; } .modal.fade.in { top: 20px; } } @media (max-width: 480px) { .nav-collapse { -webkit-transform: translate3d(0, 0, 0); } .page-header h1 small { display: block; line-height: 20px; } input[type="checkbox"], input[type="radio"] { border: 1px solid #ccc; } .form-horizontal .control-label { float: none; width: auto; padding-top: 0; text-align: left; } .form-horizontal .controls { margin-left: 0; } .form-horizontal .control-list { padding-top: 0; } .form-horizontal .form-actions { padding-left: 10px; padding-right: 10px; } .media .pull-left, .media .pull-right { float: none; display: block; margin-bottom: 10px; } .media-object { margin-right: 0; margin-left: 0; } .modal { top: 10px; left: 10px; right: 10px; } .modal-header .close { padding: 10px; margin: -10px; } .carousel-caption { position: static; } } @media (min-width: 768px) and (max-width: 979px) { .row { margin-left: -20px; *zoom: 1; } .row:before, .row:after { display: table; content: ""; line-height: 0; } .row:after { clear: both; } [class*="span"] { float: left; min-height: 1px; margin-left: 20px; } .container, .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { width: 724px; } .span12 { width: 724px; } .span11 { width: 662px; } .span10 { width: 600px; } .span9 { width: 538px; } .span8 { width: 476px; } .span7 { width: 414px; } .span6 { width: 352px; } .span5 { width: 290px; } .span4 { width: 228px; } .span3 { width: 166px; } .span2 { width: 104px; } .span1 { width: 42px; } .offset12 { margin-left: 764px; } .offset11 { margin-left: 702px; } .offset10 { margin-left: 640px; } .offset9 { margin-left: 578px; } .offset8 { margin-left: 516px; } .offset7 { margin-left: 454px; } .offset6 { margin-left: 392px; } .offset5 { margin-left: 330px; } .offset4 { margin-left: 268px; } .offset3 { margin-left: 206px; } .offset2 { margin-left: 144px; } .offset1 { margin-left: 82px; } .row-fluid { width: 100%; *zoom: 1; } .row-fluid:before, .row-fluid:after { display: table; content: ""; line-height: 0; } .row-fluid:after { clear: both; } .row-fluid [class*="span"] { display: block; width: 100%; min-height: 30px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; float: left; margin-left: 2.7624309392265194%; *margin-left: 2.709239449864817%; } .row-fluid [class*="span"]:first-child { margin-left: 0; } .row-fluid .controls-row [class*="span"] + [class*="span"] { margin-left: 2.7624309392265194%; } .row-fluid .span12 { width: 100%; *width: 99.94680851063829%; } .row-fluid .span11 { width: 91.43646408839778%; *width: 91.38327259903608%; } .row-fluid .span10 { width: 82.87292817679558%; *width: 82.81973668743387%; } .row-fluid .span9 { width: 74.30939226519337%; *width: 74.25620077583166%; } .row-fluid .span8 { width: 65.74585635359117%; *width: 65.69266486422946%; } .row-fluid .span7 { width: 57.18232044198895%; *width: 57.12912895262725%; } .row-fluid .span6 { width: 48.61878453038674%; *width: 48.56559304102504%; } .row-fluid .span5 { width: 40.05524861878453%; *width: 40.00205712942283%; } .row-fluid .span4 { width: 31.491712707182323%; *width: 31.43852121782062%; } .row-fluid .span3 { width: 22.92817679558011%; *width: 22.87498530621841%; } .row-fluid .span2 { width: 14.3646408839779%; *width: 14.311449394616199%; } .row-fluid .span1 { width: 5.801104972375691%; *width: 5.747913483013988%; } .row-fluid .offset12 { margin-left: 105.52486187845304%; *margin-left: 105.41847889972962%; } .row-fluid .offset12:first-child { margin-left: 102.76243093922652%; *margin-left: 102.6560479605031%; } .row-fluid .offset11 { margin-left: 96.96132596685082%; *margin-left: 96.8549429881274%; } .row-fluid .offset11:first-child { margin-left: 94.1988950276243%; *margin-left: 94.09251204890089%; } .row-fluid .offset10 { margin-left: 88.39779005524862%; *margin-left: 88.2914070765252%; } .row-fluid .offset10:first-child { margin-left: 85.6353591160221%; *margin-left: 85.52897613729868%; } .row-fluid .offset9 { margin-left: 79.8342541436464%; *margin-left: 79.72787116492299%; } .row-fluid .offset9:first-child { margin-left: 77.07182320441989%; *margin-left: 76.96544022569647%; } .row-fluid .offset8 { margin-left: 71.2707182320442%; *margin-left: 71.16433525332079%; } .row-fluid .offset8:first-child { margin-left: 68.50828729281768%; *margin-left: 68.40190431409427%; } .row-fluid .offset7 { margin-left: 62.70718232044199%; *margin-left: 62.600799341718584%; } .row-fluid .offset7:first-child { margin-left: 59.94475138121547%; *margin-left: 59.838368402492065%; } .row-fluid .offset6 { margin-left: 54.14364640883978%; *margin-left: 54.037263430116376%; } .row-fluid .offset6:first-child { margin-left: 51.38121546961326%; *margin-left: 51.27483249088986%; } .row-fluid .offset5 { margin-left: 45.58011049723757%; *margin-left: 45.47372751851417%; } .row-fluid .offset5:first-child { margin-left: 42.81767955801105%; *margin-left: 42.71129657928765%; } .row-fluid .offset4 { margin-left: 37.01657458563536%; *margin-left: 36.91019160691196%; } .row-fluid .offset4:first-child { margin-left: 34.25414364640884%; *margin-left: 34.14776066768544%; } .row-fluid .offset3 { margin-left: 28.45303867403315%; *margin-left: 28.346655695309746%; } .row-fluid .offset3:first-child { margin-left: 25.69060773480663%; *margin-left: 25.584224756083227%; } .row-fluid .offset2 { margin-left: 19.88950276243094%; *margin-left: 19.783119783707537%; } .row-fluid .offset2:first-child { margin-left: 17.12707182320442%; *margin-left: 17.02068884448102%; } .row-fluid .offset1 { margin-left: 11.32596685082873%; *margin-left: 11.219583872105325%; } .row-fluid .offset1:first-child { margin-left: 8.56353591160221%; *margin-left: 8.457152932878806%; } input, textarea, .uneditable-input { margin-left: 0; } .controls-row [class*="span"] + [class*="span"] { margin-left: 20px; } input.span12, textarea.span12, .uneditable-input.span12 { width: 710px; } input.span11, textarea.span11, .uneditable-input.span11 { width: 648px; } input.span10, textarea.span10, .uneditable-input.span10 { width: 586px; } input.span9, textarea.span9, .uneditable-input.span9 { width: 524px; } input.span8, textarea.span8, .uneditable-input.span8 { width: 462px; } input.span7, textarea.span7, .uneditable-input.span7 { width: 400px; } input.span6, textarea.span6, .uneditable-input.span6 { width: 338px; } input.span5, textarea.span5, .uneditable-input.span5 { width: 276px; } input.span4, textarea.span4, .uneditable-input.span4 { width: 214px; } input.span3, textarea.span3, .uneditable-input.span3 { width: 152px; } input.span2, textarea.span2, .uneditable-input.span2 { width: 90px; } input.span1, textarea.span1, .uneditable-input.span1 { width: 28px; } } @media (min-width: 1200px) { .row { margin-left: -30px; *zoom: 1; } .row:before, .row:after { display: table; content: ""; line-height: 0; } .row:after { clear: both; } [class*="span"] { float: left; min-height: 1px; margin-left: 30px; } .container, .navbar-static-top .container, .navbar-fixed-top .container, .navbar-fixed-bottom .container { width: 1170px; } .span12 { width: 1170px; } .span11 { width: 1070px; } .span10 { width: 970px; } .span9 { width: 870px; } .span8 { width: 770px; } .span7 { width: 670px; } .span6 { width: 570px; } .span5 { width: 470px; } .span4 { width: 370px; } .span3 { width: 270px; } .span2 { width: 170px; } .span1 { width: 70px; } .offset12 { margin-left: 1230px; } .offset11 { margin-left: 1130px; } .offset10 { margin-left: 1030px; } .offset9 { margin-left: 930px; } .offset8 { margin-left: 830px; } .offset7 { margin-left: 730px; } .offset6 { margin-left: 630px; } .offset5 { margin-left: 530px; } .offset4 { margin-left: 430px; } .offset3 { margin-left: 330px; } .offset2 { margin-left: 230px; } .offset1 { margin-left: 130px; } .row-fluid { width: 100%; *zoom: 1; } .row-fluid:before, .row-fluid:after { display: table; content: ""; line-height: 0; } .row-fluid:after { clear: both; } .row-fluid [class*="span"] { display: block; width: 100%; min-height: 30px; -webkit-box-sizing: border-box; -moz-box-sizing: border-box; box-sizing: border-box; float: left; margin-left: 2.564102564102564%; *margin-left: 2.5109110747408616%; } .row-fluid [class*="span"]:first-child { margin-left: 0; } .row-fluid .controls-row [class*="span"] + [class*="span"] { margin-left: 2.564102564102564%; } .row-fluid .span12 { width: 100%; *width: 99.94680851063829%; } .row-fluid .span11 { width: 91.45299145299145%; *width: 91.39979996362975%; } .row-fluid .span10 { width: 82.90598290598291%; *width: 82.8527914166212%; } .row-fluid .span9 { width: 74.35897435897436%; *width: 74.30578286961266%; } .row-fluid .span8 { width: 65.81196581196582%; *width: 65.75877432260411%; } .row-fluid .span7 { width: 57.26495726495726%; *width: 57.21176577559556%; } .row-fluid .span6 { width: 48.717948717948715%; *width: 48.664757228587014%; } .row-fluid .span5 { width: 40.17094017094017%; *width: 40.11774868157847%; } .row-fluid .span4 { width: 31.623931623931625%; *width: 31.570740134569924%; } .row-fluid .span3 { width: 23.076923076923077%; *width: 23.023731587561375%; } .row-fluid .span2 { width: 14.52991452991453%; *width: 14.476723040552828%; } .row-fluid .span1 { width: 5.982905982905983%; *width: 5.929714493544281%; } .row-fluid .offset12 { margin-left: 105.12820512820512%; *margin-left: 105.02182214948171%; } .row-fluid .offset12:first-child { margin-left: 102.56410256410257%; *margin-left: 102.45771958537915%; } .row-fluid .offset11 { margin-left: 96.58119658119658%; *margin-left: 96.47481360247316%; } .row-fluid .offset11:first-child { margin-left: 94.01709401709402%; *margin-left: 93.91071103837061%; } .row-fluid .offset10 { margin-left: 88.03418803418803%; *margin-left: 87.92780505546462%; } .row-fluid .offset10:first-child { margin-left: 85.47008547008548%; *margin-left: 85.36370249136206%; } .row-fluid .offset9 { margin-left: 79.48717948717949%; *margin-left: 79.38079650845607%; } .row-fluid .offset9:first-child { margin-left: 76.92307692307693%; *margin-left: 76.81669394435352%; } .row-fluid .offset8 { margin-left: 70.94017094017094%; *margin-left: 70.83378796144753%; } .row-fluid .offset8:first-child { margin-left: 68.37606837606839%; *margin-left: 68.26968539734497%; } .row-fluid .offset7 { margin-left: 62.393162393162385%; *margin-left: 62.28677941443899%; } .row-fluid .offset7:first-child { margin-left: 59.82905982905982%; *margin-left: 59.72267685033642%; } .row-fluid .offset6 { margin-left: 53.84615384615384%; *margin-left: 53.739770867430444%; } .row-fluid .offset6:first-child { margin-left: 51.28205128205128%; *margin-left: 51.175668303327875%; } .row-fluid .offset5 { margin-left: 45.299145299145295%; *margin-left: 45.1927623204219%; } .row-fluid .offset5:first-child { margin-left: 42.73504273504273%; *margin-left: 42.62865975631933%; } .row-fluid .offset4 { margin-left: 36.75213675213675%; *margin-left: 36.645753773413354%; } .row-fluid .offset4:first-child { margin-left: 34.18803418803419%; *margin-left: 34.081651209310785%; } .row-fluid .offset3 { margin-left: 28.205128205128204%; *margin-left: 28.0987452264048%; } .row-fluid .offset3:first-child { margin-left: 25.641025641025642%; *margin-left: 25.53464266230224%; } .row-fluid .offset2 { margin-left: 19.65811965811966%; *margin-left: 19.551736679396257%; } .row-fluid .offset2:first-child { margin-left: 17.094017094017094%; *margin-left: 16.98763411529369%; } .row-fluid .offset1 { margin-left: 11.11111111111111%; *margin-left: 11.004728132387708%; } .row-fluid .offset1:first-child { margin-left: 8.547008547008547%; *margin-left: 8.440625568285142%; } input, textarea, .uneditable-input { margin-left: 0; } .controls-row [class*="span"] + [class*="span"] { margin-left: 30px; } input.span12, textarea.span12, .uneditable-input.span12 { width: 1156px; } input.span11, textarea.span11, .uneditable-input.span11 { width: 1056px; } input.span10, textarea.span10, .uneditable-input.span10 { width: 956px; } input.span9, textarea.span9, .uneditable-input.span9 { width: 856px; } input.span8, textarea.span8, .uneditable-input.span8 { width: 756px; } input.span7, textarea.span7, .uneditable-input.span7 { width: 656px; } input.span6, textarea.span6, .uneditable-input.span6 { width: 556px; } input.span5, textarea.span5, .uneditable-input.span5 { width: 456px; } input.span4, textarea.span4, .uneditable-input.span4 { width: 356px; } input.span3, textarea.span3, .uneditable-input.span3 { width: 256px; } input.span2, textarea.span2, .uneditable-input.span2 { width: 156px; } input.span1, textarea.span1, .uneditable-input.span1 { width: 56px; } .thumbnails { margin-left: -30px; } .thumbnails > li { margin-left: 30px; } .row-fluid .thumbnails { margin-left: 0; } } @media (max-width: 979px) { body { padding-top: 0; } .navbar-fixed-top, .navbar-fixed-bottom { position: static; } .navbar-fixed-top { margin-bottom: 20px; } .navbar-fixed-bottom { margin-top: 20px; } .navbar-fixed-top .navbar-inner, .navbar-fixed-bottom .navbar-inner { padding: 5px; } .navbar .container { width: auto; padding: 0; } .navbar .brand { padding-left: 10px; padding-right: 10px; margin: 0 0 0 -5px; } .nav-collapse { clear: both; } .nav-collapse .nav { float: none; margin: 0 0 10px; } .nav-collapse .nav > li { float: none; } .nav-collapse .nav > li > a { margin-bottom: 2px; } .nav-collapse .nav > .divider-vertical { display: none; } .nav-collapse .nav .nav-header { color: #777777; text-shadow: none; } .nav-collapse .nav > li > a, .nav-collapse .dropdown-menu a { padding: 9px 15px; font-weight: bold; color: #777777; -webkit-border-radius: 3px; -moz-border-radius: 3px; border-radius: 3px; } .nav-collapse .btn { padding: 4px 10px 4px; font-weight: normal; -webkit-border-radius: 4px; -moz-border-radius: 4px; border-radius: 4px; } .nav-collapse .dropdown-menu li + li a { margin-bottom: 2px; } .nav-collapse .nav > li > a:hover, .nav-collapse .nav > li > a:focus, .nav-collapse .dropdown-menu a:hover, .nav-collapse .dropdown-menu a:focus { background-color: #f2f2f2; } .navbar-inverse .nav-collapse .nav > li > a, .navbar-inverse .nav-collapse .dropdown-menu a { color: #999999; } .navbar-inverse .nav-collapse .nav > li > a:hover, .navbar-inverse .nav-collapse .nav > li > a:focus, .navbar-inverse .nav-collapse .dropdown-menu a:hover, .navbar-inverse .nav-collapse .dropdown-menu a:focus { background-color: #111111; } .nav-collapse.in .btn-group { margin-top: 5px; padding: 0; } .nav-collapse .dropdown-menu { position: static; top: auto; left: auto; float: none; display: none; max-width: none; margin: 0 15px; padding: 0; background-color: transparent; border: none; -webkit-border-radius: 0; -moz-border-radius: 0; border-radius: 0; -webkit-box-shadow: none; -moz-box-shadow: none; box-shadow: none; } .nav-collapse .open > .dropdown-menu { display: block; } .nav-collapse .dropdown-menu:before, .nav-collapse .dropdown-menu:after { display: none; } .nav-collapse .dropdown-menu .divider { display: none; } .nav-collapse .nav > li > .dropdown-menu:before, .nav-collapse .nav > li > .dropdown-menu:after { display: none; } .nav-collapse .navbar-form, .nav-collapse .navbar-search { float: none; padding: 10px 15px; margin: 10px 0; border-top: 1px solid #f2f2f2; border-bottom: 1px solid #f2f2f2; -webkit-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); -moz-box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); box-shadow: inset 0 1px 0 rgba(255,255,255,.1), 0 1px 0 rgba(255,255,255,.1); } .navbar-inverse .nav-collapse .navbar-form, .navbar-inverse .nav-collapse .navbar-search { border-top-color: #111111; border-bottom-color: #111111; } .navbar .nav-collapse .nav.pull-right { float: none; margin-left: 0; } .nav-collapse, .nav-collapse.collapse { overflow: hidden; height: 0; } .navbar .btn-navbar { display: block; } .navbar-static .navbar-inner { padding-left: 10px; padding-right: 10px; } } @media (min-width: 980px) { .nav-collapse.collapse { height: auto !important; overflow: visible !important; } } ================================================ FILE: samples/CSV/cars.csv ================================================ Year,Make,Model,Length 1997,Ford,E350,2.34 2000,Mercury,Cougar,2.38 ================================================ FILE: samples/CUE/github-workflow.cue ================================================ package json import "strings" #Workflow: { @jsonschema(schema="http://json-schema.org/draft-07/schema") null | bool | number | string | [...] | { // The name of your workflow. GitHub displays the names of your // workflows on your repository's actions page. If you omit this // field, GitHub sets the name to the workflow's filename. name?: string // The name of the GitHub event that triggers the workflow. You // can provide a single event string, array of events, array of // event types, or an event configuration map that schedules a // workflow or restricts the execution of a workflow to specific // files, tags, or branch changes. For a list of available // events, see // https://help.github.com/en/github/automating-your-workflow-with-github-actions/events-that-trigger-workflows. on: #event | [...#event] & [_, ...] | { // Runs your workflow anytime the check_run event occurs. More // than one activity type triggers this event. For information // about the REST API, see // https://developer.github.com/v3/checks/runs. check_run?: #eventObject & { types?: #types & [..."created" | "rerequested" | "completed" | "requested_action"] | *["created", "rerequested", "completed", "requested_action"] ... } // Runs your workflow anytime the check_suite event occurs. More // than one activity type triggers this event. For information // about the REST API, see // https://developer.github.com/v3/checks/suites/. check_suite?: #eventObject & { types?: #types & [..."completed" | "requested" | "rerequested"] | *["completed", "requested", "rerequested"] ... } // Runs your workflow anytime someone creates a branch or tag, // which triggers the create event. For information about the // REST API, see // https://developer.github.com/v3/git/refs/#create-a-reference. create?: #eventObject // Runs your workflow anytime someone deletes a branch or tag, // which triggers the delete event. For information about the // REST API, see // https://developer.github.com/v3/git/refs/#delete-a-reference. delete?: #eventObject // Runs your workflow anytime someone creates a deployment, which // triggers the deployment event. Deployments created with a // commit SHA may not have a Git ref. For information about the // REST API, see // https://developer.github.com/v3/repos/deployments/. deployment?: #eventObject // Runs your workflow anytime a third party provides a deployment // status, which triggers the deployment_status event. // Deployments created with a commit SHA may not have a Git ref. // For information about the REST API, see // https://developer.github.com/v3/repos/deployments/#create-a-deployment-status. deployment_status?: #eventObject // Runs your workflow anytime when someone forks a repository, // which triggers the fork event. For information about the REST // API, see // https://developer.github.com/v3/repos/forks/#create-a-fork. fork?: #eventObject // Runs your workflow when someone creates or updates a Wiki page, // which triggers the gollum event. gollum?: #eventObject // Runs your workflow anytime the issue_comment event occurs. More // than one activity type triggers this event. For information // about the REST API, see // https://developer.github.com/v3/issues/comments/. issue_comment?: #eventObject & { types?: #types & [..."created" | "edited" | "deleted"] | *["created", "edited", "deleted"] ... } // Runs your workflow anytime the issues event occurs. More than // one activity type triggers this event. For information about // the REST API, see https://developer.github.com/v3/issues. issues?: #eventObject & { types?: #types & [..."opened" | "edited" | "deleted" | "transferred" | "pinned" | "unpinned" | "closed" | "reopened" | "assigned" | "unassigned" | "labeled" | "unlabeled" | "locked" | "unlocked" | "milestoned" | "demilestoned"] | *["opened", "edited", "deleted", "transferred", "pinned", "unpinned", "closed", "reopened", "assigned", "unassigned", "labeled", "unlabeled", "locked", "unlocked", "milestoned", "demilestoned"] ... } // Runs your workflow anytime the label event occurs. More than // one activity type triggers this event. For information about // the REST API, see // https://developer.github.com/v3/issues/labels/. label?: #eventObject & { types?: #types & [..."created" | "edited" | "deleted"] | *["created", "edited", "deleted"] ... } // Runs your workflow anytime the member event occurs. More than // one activity type triggers this event. For information about // the REST API, see // https://developer.github.com/v3/repos/collaborators/. member?: #eventObject & { types?: #types & [..."added" | "edited" | "deleted"] | *["added", "edited", "deleted"] ... } // Runs your workflow anytime the milestone event occurs. More // than one activity type triggers this event. For information // about the REST API, see // https://developer.github.com/v3/issues/milestones/. milestone?: #eventObject & { types?: #types & [..."created" | "closed" | "opened" | "edited" | "deleted"] | *["created", "closed", "opened", "edited", "deleted"] ... } // Runs your workflow anytime someone pushes to a GitHub // Pages-enabled branch, which triggers the page_build event. For // information about the REST API, see // https://developer.github.com/v3/repos/pages/. page_build?: #eventObject // Runs your workflow anytime the project event occurs. More than // one activity type triggers this event. For information about // the REST API, see https://developer.github.com/v3/projects/. project?: #eventObject & { types?: #types & [..."created" | "updated" | "closed" | "reopened" | "edited" | "deleted"] | *["created", "updated", "closed", "reopened", "edited", "deleted"] ... } // Runs your workflow anytime the project_card event occurs. More // than one activity type triggers this event. For information // about the REST API, see // https://developer.github.com/v3/projects/cards. project_card?: #eventObject & { types?: #types & [..."created" | "moved" | "converted" | "edited" | "deleted"] | *["created", "moved", "converted", "edited", "deleted"] ... } // Runs your workflow anytime the project_column event occurs. // More than one activity type triggers this event. For // information about the REST API, see // https://developer.github.com/v3/projects/columns. project_column?: #eventObject & { types?: #types & [..."created" | "updated" | "moved" | "deleted"] | *["created", "updated", "moved", "deleted"] ... } // Runs your workflow anytime someone makes a private repository // public, which triggers the public event. For information about // the REST API, see https://developer.github.com/v3/repos/#edit. public?: #eventObject // Runs your workflow anytime the pull_request event occurs. More // than one activity type triggers this event. For information // about the REST API, see https://developer.github.com/v3/pulls. // Note: Workflows do not run on private base repositories when // you open a pull request from a forked repository. // When you create a pull request from a forked repository to the // base repository, GitHub sends the pull_request event to the // base repository and no pull request events occur on the forked // repository. // Workflows don't run on forked repositories by default. You must // enable GitHub Actions in the Actions tab of the forked // repository. // The permissions for the GITHUB_TOKEN in forked repositories is // read-only. For more information about the GITHUB_TOKEN, see // https://help.github.com/en/articles/virtual-environments-for-github-actions. pull_request?: #ref & { types?: #types & [..."assigned" | "unassigned" | "labeled" | "unlabeled" | "opened" | "edited" | "closed" | "reopened" | "synchronize" | "ready_for_review" | "locked" | "unlocked" | "review_requested" | "review_request_removed"] | *["opened", "synchronize", "reopened"] {[=~"^(branche|tag|path)s(-ignore)?$" & !~"^(types)$"]: _} } // Runs your workflow anytime the pull_request_review event // occurs. More than one activity type triggers this event. For // information about the REST API, see // https://developer.github.com/v3/pulls/reviews. // Note: Workflows do not run on private base repositories when // you open a pull request from a forked repository. // When you create a pull request from a forked repository to the // base repository, GitHub sends the pull_request event to the // base repository and no pull request events occur on the forked // repository. // Workflows don't run on forked repositories by default. You must // enable GitHub Actions in the Actions tab of the forked // repository. // The permissions for the GITHUB_TOKEN in forked repositories is // read-only. For more information about the GITHUB_TOKEN, see // https://help.github.com/en/articles/virtual-environments-for-github-actions. pull_request_review?: #eventObject & { types?: #types & [..."submitted" | "edited" | "dismissed"] | *["submitted", "edited", "dismissed"] ... } // Runs your workflow anytime a comment on a pull request's // unified diff is modified, which triggers the // pull_request_review_comment event. More than one activity type // triggers this event. For information about the REST API, see // https://developer.github.com/v3/pulls/comments. // Note: Workflows do not run on private base repositories when // you open a pull request from a forked repository. // When you create a pull request from a forked repository to the // base repository, GitHub sends the pull_request event to the // base repository and no pull request events occur on the forked // repository. // Workflows don't run on forked repositories by default. You must // enable GitHub Actions in the Actions tab of the forked // repository. // The permissions for the GITHUB_TOKEN in forked repositories is // read-only. For more information about the GITHUB_TOKEN, see // https://help.github.com/en/articles/virtual-environments-for-github-actions. pull_request_review_comment?: #eventObject & { types?: #types & [..."created" | "edited" | "deleted"] | *["created", "edited", "deleted"] ... } // This event is similar to pull_request, except that it runs in // the context of the base repository of the pull request, rather // than in the merge commit. This means that you can more safely // make your secrets available to the workflows triggered by the // pull request, because only workflows defined in the commit on // the base repository are run. For example, this event allows // you to create workflows that label and comment on pull // requests, based on the contents of the event payload. pull_request_target?: #ref & { types?: #types & [..."assigned" | "unassigned" | "labeled" | "unlabeled" | "opened" | "edited" | "closed" | "reopened" | "synchronize" | "ready_for_review" | "locked" | "unlocked" | "review_requested" | "review_request_removed"] | *["opened", "synchronize", "reopened"] {[=~"^(branche|tag|path)s(-ignore)?$" & !~"^(types)$"]: _} } // Runs your workflow when someone pushes to a repository branch, // which triggers the push event. // Note: The webhook payload available to GitHub Actions does not // include the added, removed, and modified attributes in the // commit object. You can retrieve the full commit object using // the REST API. For more information, see // https://developer.github.com/v3/repos/commits/#get-a-single-commit. push?: #ref & { {[=~"^(branche|tag|path)s(-ignore)?$" & !~"^()$"]: _} } // Runs your workflow anytime a package is published or updated. // For more information, see // https://help.github.com/en/github/managing-packages-with-github-packages. registry_package?: #eventObject & { types?: #types & [..."published" | "updated"] | *["published", "updated"] ... } // Runs your workflow anytime the release event occurs. More than // one activity type triggers this event. For information about // the REST API, see // https://developer.github.com/v3/repos/releases/ in the GitHub // Developer documentation. release?: #eventObject & { types?: #types & [..."published" | "unpublished" | "created" | "edited" | "deleted" | "prereleased" | "released"] | *["published", "unpublished", "created", "edited", "deleted", "prereleased", "released"] ... } // Runs your workflow anytime the status of a Git commit changes, // which triggers the status event. For information about the // REST API, see https://developer.github.com/v3/repos/statuses/. status?: #eventObject // Runs your workflow anytime the watch event occurs. More than // one activity type triggers this event. For information about // the REST API, see // https://developer.github.com/v3/activity/starring/. watch?: #eventObject // You can now create workflows that are manually triggered with // the new workflow_dispatch event. You will then see a 'Run // workflow' button on the Actions tab, enabling you to easily // trigger a run. workflow_dispatch?: null | bool | number | string | [...] | { // Input parameters allow you to specify data that the action // expects to use during runtime. GitHub stores input parameters // as environment variables. Input ids with uppercase letters are // converted to lowercase during runtime. We recommended using // lowercase input ids. inputs?: { {[=~"^[_a-zA-Z][a-zA-Z0-9_-]*$" & !~"^()$"]: { // A string description of the input parameter. description: string // A string shown to users using the deprecated input. deprecationMessage?: string // A boolean to indicate whether the action requires the input // parameter. Set to true when the parameter is required. required: bool // A string representing the default value. The default value is // used when an input parameter isn't specified in a workflow // file. default?: string }} } ... } // This event occurs when a workflow run is requested or // completed, and allows you to execute a workflow based on the // finished result of another workflow. For example, if your // pull_request workflow generates build artifacts, you can // create a new workflow that uses workflow_run to analyze the // results and add a comment to the original pull request. workflow_run?: #eventObject & { types?: #types & [..."requested" | "completed"] | *["requested", "completed"] workflows?: [...string] & [_, ...] {[=~"^branches(-ignore)?$" & !~"^(types|workflows)$"]: _} ... } // You can use the GitHub API to trigger a webhook event called // repository_dispatch when you want to trigger a workflow for // activity that happens outside of GitHub. For more information, // see // https://developer.github.com/v3/repos/#create-a-repository-dispatch-event. // To trigger the custom repository_dispatch webhook event, you // must send a POST request to a GitHub API endpoint and provide // an event_type name to describe the activity type. To trigger a // workflow run, you must also configure your workflow to use the // repository_dispatch event. repository_dispatch?: #eventObject // You can schedule a workflow to run at specific UTC times using // POSIX cron syntax // (https://pubs.opengroup.org/onlinepubs/9699919799/utilities/crontab.html#tag_20_25_07). // Scheduled workflows run on the latest commit on the default or // base branch. The shortest interval you can run scheduled // workflows is once every 5 minutes. // Note: GitHub Actions does not support the non-standard syntax // @yearly, @monthly, @weekly, @daily, @hourly, and @reboot. // You can use crontab guru (https://crontab.guru/). to help // generate your cron syntax and confirm what time it will run. // To help you get started, there is also a list of crontab guru // examples (https://crontab.guru/examples.html). schedule?: [...null | bool | number | string | [...] | { cron?: =~"^(((\\d+,)+\\d+|((\\d+|\\*)\\/\\d+|JAN|FEB|MAR|APR|MAY|JUN|JUL|AUG|SEP|OCT|NOV|DEC)|(\\d+-\\d+)|\\d+|\\*|MON|TUE|WED|THU|FRI|SAT|SUN) ?){5,7}$" }] & [_, ...] } // A map of environment variables that are available to all jobs // and steps in the workflow. env?: #env // A map of default settings that will apply to all jobs in the // workflow. defaults?: #defaults // A workflow run is made up of one or more jobs. Jobs run in // parallel by default. To run jobs sequentially, you can define // dependencies on other jobs using the jobs..needs // keyword. // Each job runs in a fresh instance of the virtual environment // specified by runs-on. // You can run an unlimited number of jobs as long as you are // within the workflow usage limits. For more information, see // https://help.github.com/en/github/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#usage-limits. jobs: { {[=~"^[_a-zA-Z][a-zA-Z0-9_-]*$" & !~"^()$"]: { // The name of the job displayed on GitHub. name?: string // Identifies any jobs that must complete successfully before this // job will run. It can be a string or array of strings. If a job // fails, all jobs that need it are skipped unless the jobs use a // conditional statement that causes the job to continue. needs?: [...#name] & [_, ...] | #name // The type of machine to run the job on. The machine can be // either a GitHub-hosted runner, or a self-hosted runner. "runs-on": "macos-10.15" | "macos-11.0" | "macos-latest" | "self-hosted" | "ubuntu-16.04" | "ubuntu-18.04" | "ubuntu-20.04" | "ubuntu-latest" | "windows-2016" | "windows-2019" | "windows-latest" | (["self-hosted"] | ["self-hosted", #machine] | ["self-hosted", #architecture] | ["self-hosted", #machine, #architecture] | ["self-hosted", #architecture, #machine]) & [...] | #expressionSyntax // The environment that the job references. environment?: string | #environment // A map of outputs for a job. Job outputs are available to all // downstream jobs that depend on this job. outputs?: { [string]: string } // A map of environment variables that are available to all steps // in the job. env?: #env // A map of default settings that will apply to all steps in the // job. defaults?: #defaults // You can use the if conditional to prevent a job from running // unless a condition is met. You can use any supported context // and expression to create a conditional. // Expressions in an if conditional do not require the ${{ }} // syntax. For more information, see // https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions. if?: string // A job contains a sequence of tasks called steps. Steps can run // commands, run setup tasks, or run an action in your // repository, a public repository, or an action published in a // Docker registry. Not all steps run actions, but all actions // run as a step. Each step runs in its own process in the // virtual environment and has access to the workspace and // filesystem. Because steps run in their own process, changes to // environment variables are not preserved between steps. GitHub // provides built-in steps to set up and complete a job. steps?: [...{ // A unique identifier for the step. You can use the id to // reference the step in contexts. For more information, see // https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions. id?: string // You can use the if conditional to prevent a step from running // unless a condition is met. You can use any supported context // and expression to create a conditional. // Expressions in an if conditional do not require the ${{ }} // syntax. For more information, see // https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions. if?: string // A name for your step to display on GitHub. name?: string // Selects an action to run as part of a step in your job. An // action is a reusable unit of code. You can use an action // defined in the same repository as the workflow, a public // repository, or in a published Docker container image // (https://hub.docker.com/). // We strongly recommend that you include the version of the // action you are using by specifying a Git ref, SHA, or Docker // tag number. If you don't specify a version, it could break // your workflows or cause unexpected behavior when the action // owner publishes an update. // - Using the commit SHA of a released action version is the // safest for stability and security. // - Using the specific major action version allows you to receive // critical fixes and security patches while still maintaining // compatibility. It also assures that your workflow should still // work. // - Using the master branch of an action may be convenient, but // if someone releases a new major version with a breaking // change, your workflow could break. // Some actions require inputs that you must set using the with // keyword. Review the action's README file to determine the // inputs required. // Actions are either JavaScript files or Docker containers. If // the action you're using is a Docker container you must run the // job in a Linux virtual environment. For more details, see // https://help.github.com/en/articles/virtual-environments-for-github-actions. uses?: string // Runs command-line programs using the operating system's shell. // If you do not provide a name, the step name will default to // the text specified in the run command. // Commands run using non-login shells by default. You can choose // a different shell and customize the shell used to run // commands. For more information, see // https://help.github.com/en/actions/automating-your-workflow-with-github-actions/workflow-syntax-for-github-actions#using-a-specific-shell. // Each run keyword represents a new process and shell in the // virtual environment. When you provide multi-line commands, // each line runs in the same shell. run?: string, "working-directory"?: #["working-directory"], shell?: #shell // A map of the input parameters defined by the action. Each input // parameter is a key/value pair. Input parameters are set as // environment variables. The variable is prefixed with INPUT_ // and converted to upper case. with?: #env & { args?: string, entrypoint?: string, ... } // Sets environment variables for steps to use in the virtual // environment. You can also set environment variables for the // entire workflow or a job. env?: #env // Prevents a job from failing when a step fails. Set to true to // allow a job to pass when this step fails. "continue-on-error"?: bool | #expressionSyntax | *false // The maximum number of minutes to run the step before killing // the process. "timeout-minutes"?: number }] & [_, ...] // The maximum number of minutes to let a workflow run before // GitHub automatically cancels it. Default: 360 "timeout-minutes"?: number | *360 // A strategy creates a build matrix for your jobs. You can define // different variations of an environment to run each job in. strategy?: { // A build matrix is a set of different configurations of the // virtual environment. For example you might run a job against // more than one supported version of a language, operating // system, or tool. Each configuration is a copy of the job that // runs and reports a status. // You can specify a matrix by supplying an array for the // configuration options. For example, if the GitHub virtual // environment supports Node.js versions 6, 8, and 10 you could // specify an array of those versions in the matrix. // When you define a matrix of operating systems, you must set the // required runs-on keyword to the operating system of the // current job, rather than hard-coding the operating system // name. To access the operating system name, you can use the // matrix.os context parameter to set runs-on. For more // information, see // https://help.github.com/en/articles/contexts-and-expression-syntax-for-github-actions. matrix: ({ ... } | #expressionSyntax) & { {[=~"^(in|ex)clude$" & !~"^()$"]: [...{ [string]: #configuration }] & [_, ...]} {[!~"^(in|ex)clude$" & !~"^()$"]: [...#configuration] & [_, ...]} } // When set to true, GitHub cancels all in-progress jobs if any // matrix job fails. Default: true "fail-fast"?: bool | *true // The maximum number of jobs that can run simultaneously when // using a matrix job strategy. By default, GitHub will maximize // the number of jobs run in parallel depending on the available // runners on GitHub-hosted virtual machines. "max-parallel"?: number } // Prevents a workflow run from failing when a job fails. Set to // true to allow a workflow run to pass when this job fails. "continue-on-error"?: bool | #expressionSyntax // A container to run any steps in a job that don't already // specify a container. If you have steps that use both script // and container actions, the container actions will run as // sibling containers on the same network with the same volume // mounts. // If you do not set a container, all steps will run directly on // the host specified by runs-on unless a step refers to an // action configured to run in a container. container?: string | #container // Additional containers to host services for a job in a workflow. // These are useful for creating databases or cache services like // redis. The runner on the virtual machine will automatically // create a network and manage the life cycle of the service // containers. // When you use a service container for a job or your step uses // container actions, you don't need to set port information to // access the service. Docker automatically exposes all ports // between containers on the same network. // When both the job and the action run in a container, you can // directly reference the container by its hostname. The hostname // is automatically mapped to the service name. // When a step does not use a container action, you must access // the service using localhost and bind the ports. services?: { [string]: #container } }} } } #architecture: "ARM32" | "x64" | "x86" #branch: #globs #configuration: string | number | bool | { [string]: #configuration } | [...#configuration] #container: { // The Docker image to use as the container to run the action. The // value can be the Docker Hub image name or a registry name. image: string // If the image's container registry requires authentication to // pull the image, you can use credentials to set a map of the // username and password. The credentials are the same values // that you would provide to the `docker login` command. credentials?: { username?: string password?: string ... } // Sets an array of environment variables in the container. env?: #env // Sets an array of ports to expose on the container. ports?: [...number | string] & [_, ...] // Sets an array of volumes for the container to use. You can use // volumes to share data between services or other steps in a // job. You can specify named Docker volumes, anonymous Docker // volumes, or bind mounts on the host. // To specify a volume, you specify the source and destination // path: : // The is a volume name or an absolute path on the host // machine, and is an absolute path in the // container. volumes?: [...=~"^[^:]+:[^:]+$"] & [_, ...] // Additional Docker container resource options. For a list of // options, see // https://docs.docker.com/engine/reference/commandline/create/#options. options?: string } #defaults: run?: { shell?: #shell "working-directory"?: #["working-directory"] } #env: [string]: bool | number | string #environment: { // The name of the environment configured in the repo. name: string // A deployment URL url?: string } #event: "check_run" | "check_suite" | "create" | "delete" | "deployment" | "deployment_status" | "fork" | "gollum" | "issue_comment" | "issues" | "label" | "member" | "milestone" | "page_build" | "project" | "project_card" | "project_column" | "public" | "pull_request" | "pull_request_review" | "pull_request_review_comment" | "pull_request_target" | "push" | "registry_package" | "release" | "status" | "watch" | "workflow_dispatch" | "workflow_run" | "repository_dispatch" #eventObject: null | { ... } #expressionSyntax: =~"^\\$\\{\\{.*\\}\\}$" #globs: [...strings.MinRunes(1)] & [_, ...] #machine: "linux" | "macos" | "windows" #name: =~"^[_a-zA-Z][a-zA-Z0-9_-]*$" #path: #globs #ref: null | { branches?: #branch "branches-ignore"?: #branch tags?: #branch "tags-ignore"?: #branch paths?: #path "paths-ignore"?: #path ... } #shell: (string | ("bash" | "pwsh" | "python" | "sh" | "cmd" | "powershell")) & string #types: [_, ...] #: "working-directory": string } ================================================ FILE: samples/CUE/kube.cue ================================================ package kube service: [ID=_]: { apiVersion: "v1" kind: "Service" metadata: { name: ID labels: { app: ID // by convention domain: "prod" // always the same in the given files component: #Component // varies per directory } } spec: { // Any port has the following properties. ports: [...{ port: int protocol: *"TCP" | "UDP" // from the Kubernetes definition name: string | *"client" }] selector: metadata.labels // we want those to be the same } } deployment: [ID=_]: { apiVersion: "apps/v1" kind: "Deployment" metadata: name: ID spec: { // 1 is the default, but we allow any number replicas: *1 | int template: { metadata: labels: { app: ID domain: "prod" component: #Component } // we always have one namesake container spec: containers: [{name: ID}] } } } #Component: string daemonSet: [ID=_]: _spec & { apiVersion: "apps/v1" kind: "DaemonSet" _name: ID } statefulSet: [ID=_]: _spec & { apiVersion: "apps/v1" kind: "StatefulSet" _name: ID } deployment: [ID=_]: _spec & { apiVersion: "apps/v1" kind: "Deployment" _name: ID spec: replicas: *1 | int } configMap: [ID=_]: { metadata: name: ID metadata: labels: component: #Component } _spec: { _name: string metadata: name: _name metadata: labels: component: #Component spec: selector: {} spec: template: { metadata: labels: { app: _name component: #Component domain: "prod" } spec: containers: [{name: _name}] } } // Define the _export option and set the default to true // for all ports defined in all containers. _spec: spec: template: spec: containers: [...{ ports: [...{ _export: *true | false // include the port in the service }] }] for x in [deployment, daemonSet, statefulSet] for k, v in x { service: "\(k)": { spec: selector: v.spec.template.metadata.labels spec: ports: [ for c in v.spec.template.spec.containers for p in c.ports if p._export { let Port = p.containerPort // Port is an alias port: *Port | int targetPort: *Port | int }, ] } } ================================================ FILE: samples/CWeb/mpmathdouble.w ================================================ % $Id: mpmathdouble.w 2070 2015-10-06 10:35:23Z luigi $ % % This file is part of MetaPost; % the MetaPost program is in the public domain. % See the code in mpost.w for more info. % Here is TeX material that gets inserted after \input webmac \font\tenlogo=logo10 % font used for the METAFONT logo \font\logos=logosl10 \def\MF{{\tenlogo META}\-{\tenlogo FONT}} \def\MP{{\tenlogo META}\-{\tenlogo POST}} \def\title{Math support functions for IEEE double based math} \pdfoutput=1 @ Introduction. @c #include #include #include #include #include #include "mpmathdouble.h" /* internal header */ #define ROUND(a) floor((a)+0.5) @h @ @c @; @ @(mpmathdouble.h@>= #ifndef MPMATHDOUBLE_H #define MPMATHDOUBLE_H 1 #include "mplib.h" #include "mpmp.h" /* internal header */ @; #endif @* Math initialization. First, here are some very important constants. @d PI 3.1415926535897932384626433832795028841971 @d fraction_multiplier 4096.0 @d angle_multiplier 16.0 @ Here are the functions that are static as they are not used elsewhere @= static void mp_double_scan_fractional_token (MP mp, int n); static void mp_double_scan_numeric_token (MP mp, int n); static void mp_ab_vs_cd (MP mp, mp_number *ret, mp_number a, mp_number b, mp_number c, mp_number d); static void mp_double_ab_vs_cd (MP mp, mp_number *ret, mp_number a, mp_number b, mp_number c, mp_number d); static void mp_double_crossing_point (MP mp, mp_number *ret, mp_number a, mp_number b, mp_number c); static void mp_number_modulo (mp_number *a, mp_number b); static void mp_double_print_number (MP mp, mp_number n); static char * mp_double_number_tostring (MP mp, mp_number n); static void mp_double_slow_add (MP mp, mp_number *ret, mp_number x_orig, mp_number y_orig); static void mp_double_square_rt (MP mp, mp_number *ret, mp_number x_orig); static void mp_double_sin_cos (MP mp, mp_number z_orig, mp_number *n_cos, mp_number *n_sin); static void mp_init_randoms (MP mp, int seed); static void mp_number_angle_to_scaled (mp_number *A); static void mp_number_fraction_to_scaled (mp_number *A); static void mp_number_scaled_to_fraction (mp_number *A); static void mp_number_scaled_to_angle (mp_number *A); static void mp_double_m_unif_rand (MP mp, mp_number *ret, mp_number x_orig); static void mp_double_m_norm_rand (MP mp, mp_number *ret); static void mp_double_m_exp (MP mp, mp_number *ret, mp_number x_orig); static void mp_double_m_log (MP mp, mp_number *ret, mp_number x_orig); static void mp_double_pyth_sub (MP mp, mp_number *r, mp_number a, mp_number b); static void mp_double_pyth_add (MP mp, mp_number *r, mp_number a, mp_number b); static void mp_double_n_arg (MP mp, mp_number *ret, mp_number x, mp_number y); static void mp_double_velocity (MP mp, mp_number *ret, mp_number st, mp_number ct, mp_number sf, mp_number cf, mp_number t); static void mp_set_double_from_int(mp_number *A, int B); static void mp_set_double_from_boolean(mp_number *A, int B); static void mp_set_double_from_scaled(mp_number *A, int B); static void mp_set_double_from_addition(mp_number *A, mp_number B, mp_number C); static void mp_set_double_from_substraction (mp_number *A, mp_number B, mp_number C); static void mp_set_double_from_div(mp_number *A, mp_number B, mp_number C); static void mp_set_double_from_mul(mp_number *A, mp_number B, mp_number C); static void mp_set_double_from_int_div(mp_number *A, mp_number B, int C); static void mp_set_double_from_int_mul(mp_number *A, mp_number B, int C); static void mp_set_double_from_of_the_way(MP mp, mp_number *A, mp_number t, mp_number B, mp_number C); static void mp_number_negate(mp_number *A); static void mp_number_add(mp_number *A, mp_number B); static void mp_number_substract(mp_number *A, mp_number B); static void mp_number_half(mp_number *A); static void mp_number_halfp(mp_number *A); static void mp_number_double(mp_number *A); static void mp_number_add_scaled(mp_number *A, int B); /* also for negative B */ static void mp_number_multiply_int(mp_number *A, int B); static void mp_number_divide_int(mp_number *A, int B); static void mp_double_abs(mp_number *A); static void mp_number_clone(mp_number *A, mp_number B); static void mp_number_swap(mp_number *A, mp_number *B); static int mp_round_unscaled(mp_number x_orig); static int mp_number_to_int(mp_number A); static int mp_number_to_scaled(mp_number A); static int mp_number_to_boolean(mp_number A); static double mp_number_to_double(mp_number A); static int mp_number_odd(mp_number A); static int mp_number_equal(mp_number A, mp_number B); static int mp_number_greater(mp_number A, mp_number B); static int mp_number_less(mp_number A, mp_number B); static int mp_number_nonequalabs(mp_number A, mp_number B); static void mp_number_floor (mp_number *i); static void mp_double_fraction_to_round_scaled (mp_number *x); static void mp_double_number_make_scaled (MP mp, mp_number *r, mp_number p, mp_number q); static void mp_double_number_make_fraction (MP mp, mp_number *r, mp_number p, mp_number q); static void mp_double_number_take_fraction (MP mp, mp_number *r, mp_number p, mp_number q); static void mp_double_number_take_scaled (MP mp, mp_number *r, mp_number p, mp_number q); static void mp_new_number (MP mp, mp_number *n, mp_number_type t) ; static void mp_free_number (MP mp, mp_number *n) ; static void mp_set_double_from_double(mp_number *A, double B); static void mp_free_double_math (MP mp); static void mp_double_set_precision (MP mp); @ And these are the ones that {\it are} used elsewhere @= void * mp_initialize_double_math (MP mp); @ @d coef_bound ((7.0/3.0)*fraction_multiplier) /* |fraction| approximation to 7/3 */ @d fraction_threshold 0.04096 /* a |fraction| coefficient less than this is zeroed */ @d half_fraction_threshold (fraction_threshold/2) /* half of |fraction_threshold| */ @d scaled_threshold 0.000122 /* a |scaled| coefficient less than this is zeroed */ @d half_scaled_threshold (scaled_threshold/2) /* half of |scaled_threshold| */ @d near_zero_angle (0.0256*angle_multiplier) /* an angle of about 0.0256 */ @d p_over_v_threshold 0x80000 /* TODO */ @d equation_threshold 0.001 @d tfm_warn_threshold 0.0625 @d warning_limit pow(2.0,52.0) /* this is a large value that can just be expressed without loss of precision */ @d epsilon pow(2.0,-52.0) @c void * mp_initialize_double_math (MP mp) { math_data *math = (math_data *)mp_xmalloc(mp,1,sizeof(math_data)); /* alloc */ math->allocate = mp_new_number; math->free = mp_free_number; mp_new_number (mp, &math->precision_default, mp_scaled_type); math->precision_default.data.dval = 16 * unity; mp_new_number (mp, &math->precision_max, mp_scaled_type); math->precision_max.data.dval = 16 * unity; mp_new_number (mp, &math->precision_min, mp_scaled_type); math->precision_min.data.dval = 16 * unity; /* here are the constants for |scaled| objects */ mp_new_number (mp, &math->epsilon_t, mp_scaled_type); math->epsilon_t.data.dval = epsilon; mp_new_number (mp, &math->inf_t, mp_scaled_type); math->inf_t.data.dval = EL_GORDO; mp_new_number (mp, &math->warning_limit_t, mp_scaled_type); math->warning_limit_t.data.dval = warning_limit; mp_new_number (mp, &math->one_third_inf_t, mp_scaled_type); math->one_third_inf_t.data.dval = one_third_EL_GORDO; mp_new_number (mp, &math->unity_t, mp_scaled_type); math->unity_t.data.dval = unity; mp_new_number (mp, &math->two_t, mp_scaled_type); math->two_t.data.dval = two; mp_new_number (mp, &math->three_t, mp_scaled_type); math->three_t.data.dval = three; mp_new_number (mp, &math->half_unit_t, mp_scaled_type); math->half_unit_t.data.dval = half_unit; mp_new_number (mp, &math->three_quarter_unit_t, mp_scaled_type); math->three_quarter_unit_t.data.dval = three_quarter_unit; mp_new_number (mp, &math->zero_t, mp_scaled_type); /* |fractions| */ mp_new_number (mp, &math->arc_tol_k, mp_fraction_type); math->arc_tol_k.data.dval = (unity/4096); /* quit when change in arc length estimate reaches this */ mp_new_number (mp, &math->fraction_one_t, mp_fraction_type); math->fraction_one_t.data.dval = fraction_one; mp_new_number (mp, &math->fraction_half_t, mp_fraction_type); math->fraction_half_t.data.dval = fraction_half; mp_new_number (mp, &math->fraction_three_t, mp_fraction_type); math->fraction_three_t.data.dval = fraction_three; mp_new_number (mp, &math->fraction_four_t, mp_fraction_type); math->fraction_four_t.data.dval = fraction_four; /* |angles| */ mp_new_number (mp, &math->three_sixty_deg_t, mp_angle_type); math->three_sixty_deg_t.data.dval = three_sixty_deg; mp_new_number (mp, &math->one_eighty_deg_t, mp_angle_type); math->one_eighty_deg_t.data.dval = one_eighty_deg; /* various approximations */ mp_new_number (mp, &math->one_k, mp_scaled_type); math->one_k.data.dval = 1.0/64 ; mp_new_number (mp, &math->sqrt_8_e_k, mp_scaled_type); math->sqrt_8_e_k.data.dval = 1.71552776992141359295 ; /* $2^{16}\sqrt{8/e}\approx 112428.82793$ */ mp_new_number (mp, &math->twelve_ln_2_k, mp_fraction_type); math->twelve_ln_2_k.data.dval = 8.31776616671934371292 *256; /* $2^{24}\cdot12\ln2\approx139548959.6165$ */ mp_new_number (mp, &math->coef_bound_k, mp_fraction_type); math->coef_bound_k.data.dval = coef_bound; mp_new_number (mp, &math->coef_bound_minus_1, mp_fraction_type); math->coef_bound_minus_1.data.dval = coef_bound - 1/65536.0; mp_new_number (mp, &math->twelvebits_3, mp_scaled_type); math->twelvebits_3.data.dval = 1365 / 65536.0; /* $1365\approx 2^{12}/3$ */ mp_new_number (mp, &math->twentysixbits_sqrt2_t, mp_fraction_type); math->twentysixbits_sqrt2_t.data.dval = 94906266 / 65536.0; /* $2^{26}\sqrt2\approx94906265.62$ */ mp_new_number (mp, &math->twentyeightbits_d_t, mp_fraction_type); math->twentyeightbits_d_t.data.dval = 35596755 / 65536.0; /* $2^{28}d\approx35596754.69$ */ mp_new_number (mp, &math->twentysevenbits_sqrt2_d_t, mp_fraction_type); math->twentysevenbits_sqrt2_d_t.data.dval = 25170707 / 65536.0; /* $2^{27}\sqrt2\,d\approx25170706.63$ */ /* thresholds */ mp_new_number (mp, &math->fraction_threshold_t, mp_fraction_type); math->fraction_threshold_t.data.dval = fraction_threshold; mp_new_number (mp, &math->half_fraction_threshold_t, mp_fraction_type); math->half_fraction_threshold_t.data.dval = half_fraction_threshold; mp_new_number (mp, &math->scaled_threshold_t, mp_scaled_type); math->scaled_threshold_t.data.dval = scaled_threshold; mp_new_number (mp, &math->half_scaled_threshold_t, mp_scaled_type); math->half_scaled_threshold_t.data.dval = half_scaled_threshold; mp_new_number (mp, &math->near_zero_angle_t, mp_angle_type); math->near_zero_angle_t.data.dval = near_zero_angle; mp_new_number (mp, &math->p_over_v_threshold_t, mp_fraction_type); math->p_over_v_threshold_t.data.dval = p_over_v_threshold; mp_new_number (mp, &math->equation_threshold_t, mp_scaled_type); math->equation_threshold_t.data.dval = equation_threshold; mp_new_number (mp, &math->tfm_warn_threshold_t, mp_scaled_type); math->tfm_warn_threshold_t.data.dval = tfm_warn_threshold; /* functions */ math->from_int = mp_set_double_from_int; math->from_boolean = mp_set_double_from_boolean; math->from_scaled = mp_set_double_from_scaled; math->from_double = mp_set_double_from_double; math->from_addition = mp_set_double_from_addition; math->from_substraction = mp_set_double_from_substraction; math->from_oftheway = mp_set_double_from_of_the_way; math->from_div = mp_set_double_from_div; math->from_mul = mp_set_double_from_mul; math->from_int_div = mp_set_double_from_int_div; math->from_int_mul = mp_set_double_from_int_mul; math->negate = mp_number_negate; math->add = mp_number_add; math->substract = mp_number_substract; math->half = mp_number_half; math->halfp = mp_number_halfp; math->do_double = mp_number_double; math->abs = mp_double_abs; math->clone = mp_number_clone; math->swap = mp_number_swap; math->add_scaled = mp_number_add_scaled; math->multiply_int = mp_number_multiply_int; math->divide_int = mp_number_divide_int; math->to_boolean = mp_number_to_boolean; math->to_scaled = mp_number_to_scaled; math->to_double = mp_number_to_double; math->to_int = mp_number_to_int; math->odd = mp_number_odd; math->equal = mp_number_equal; math->less = mp_number_less; math->greater = mp_number_greater; math->nonequalabs = mp_number_nonequalabs; math->round_unscaled = mp_round_unscaled; math->floor_scaled = mp_number_floor; math->fraction_to_round_scaled = mp_double_fraction_to_round_scaled; math->make_scaled = mp_double_number_make_scaled; math->make_fraction = mp_double_number_make_fraction; math->take_fraction = mp_double_number_take_fraction; math->take_scaled = mp_double_number_take_scaled; math->velocity = mp_double_velocity; math->n_arg = mp_double_n_arg; math->m_log = mp_double_m_log; math->m_exp = mp_double_m_exp; math->m_unif_rand = mp_double_m_unif_rand; math->m_norm_rand = mp_double_m_norm_rand; math->pyth_add = mp_double_pyth_add; math->pyth_sub = mp_double_pyth_sub; math->fraction_to_scaled = mp_number_fraction_to_scaled; math->scaled_to_fraction = mp_number_scaled_to_fraction; math->scaled_to_angle = mp_number_scaled_to_angle; math->angle_to_scaled = mp_number_angle_to_scaled; math->init_randoms = mp_init_randoms; math->sin_cos = mp_double_sin_cos; math->slow_add = mp_double_slow_add; math->sqrt = mp_double_square_rt; math->print = mp_double_print_number; math->tostring = mp_double_number_tostring; math->modulo = mp_number_modulo; math->ab_vs_cd = mp_ab_vs_cd; math->crossing_point = mp_double_crossing_point; math->scan_numeric = mp_double_scan_numeric_token; math->scan_fractional = mp_double_scan_fractional_token; math->free_math = mp_free_double_math; math->set_precision = mp_double_set_precision; return (void *)math; } void mp_double_set_precision (MP mp) { } void mp_free_double_math (MP mp) { free_number (((math_data *)mp->math)->three_sixty_deg_t); free_number (((math_data *)mp->math)->one_eighty_deg_t); free_number (((math_data *)mp->math)->fraction_one_t); free_number (((math_data *)mp->math)->zero_t); free_number (((math_data *)mp->math)->half_unit_t); free_number (((math_data *)mp->math)->three_quarter_unit_t); free_number (((math_data *)mp->math)->unity_t); free_number (((math_data *)mp->math)->two_t); free_number (((math_data *)mp->math)->three_t); free_number (((math_data *)mp->math)->one_third_inf_t); free_number (((math_data *)mp->math)->inf_t); free_number (((math_data *)mp->math)->warning_limit_t); free_number (((math_data *)mp->math)->one_k); free_number (((math_data *)mp->math)->sqrt_8_e_k); free_number (((math_data *)mp->math)->twelve_ln_2_k); free_number (((math_data *)mp->math)->coef_bound_k); free_number (((math_data *)mp->math)->coef_bound_minus_1); free_number (((math_data *)mp->math)->fraction_threshold_t); free_number (((math_data *)mp->math)->half_fraction_threshold_t); free_number (((math_data *)mp->math)->scaled_threshold_t); free_number (((math_data *)mp->math)->half_scaled_threshold_t); free_number (((math_data *)mp->math)->near_zero_angle_t); free_number (((math_data *)mp->math)->p_over_v_threshold_t); free_number (((math_data *)mp->math)->equation_threshold_t); free_number (((math_data *)mp->math)->tfm_warn_threshold_t); free(mp->math); } @ Creating an destroying |mp_number| objects @ @c void mp_new_number (MP mp, mp_number *n, mp_number_type t) { (void)mp; n->data.dval = 0.0; n->type = t; } @ @c void mp_free_number (MP mp, mp_number *n) { (void)mp; n->type = mp_nan_type; } @ Here are the low-level functions on |mp_number| items, setters first. @c void mp_set_double_from_int(mp_number *A, int B) { A->data.dval = B; } void mp_set_double_from_boolean(mp_number *A, int B) { A->data.dval = B; } void mp_set_double_from_scaled(mp_number *A, int B) { A->data.dval = B / 65536.0; } void mp_set_double_from_double(mp_number *A, double B) { A->data.dval = B; } void mp_set_double_from_addition(mp_number *A, mp_number B, mp_number C) { A->data.dval = B.data.dval+C.data.dval; } void mp_set_double_from_substraction (mp_number *A, mp_number B, mp_number C) { A->data.dval = B.data.dval-C.data.dval; } void mp_set_double_from_div(mp_number *A, mp_number B, mp_number C) { A->data.dval = B.data.dval / C.data.dval; } void mp_set_double_from_mul(mp_number *A, mp_number B, mp_number C) { A->data.dval = B.data.dval * C.data.dval; } void mp_set_double_from_int_div(mp_number *A, mp_number B, int C) { A->data.dval = B.data.dval / C; } void mp_set_double_from_int_mul(mp_number *A, mp_number B, int C) { A->data.dval = B.data.dval * C; } void mp_set_double_from_of_the_way(MP mp, mp_number *A, mp_number t, mp_number B, mp_number C) { A->data.dval = B.data.dval - mp_double_take_fraction(mp, (B.data.dval - C.data.dval), t.data.dval); } void mp_number_negate(mp_number *A) { A->data.dval = -A->data.dval; if (A->data.dval == -0.0) A->data.dval = 0.0; } void mp_number_add(mp_number *A, mp_number B) { A->data.dval = A->data.dval + B.data.dval; } void mp_number_substract(mp_number *A, mp_number B) { A->data.dval = A->data.dval - B.data.dval; } void mp_number_half(mp_number *A) { A->data.dval = A->data.dval/2.0; } void mp_number_halfp(mp_number *A) { A->data.dval = (A->data.dval/2.0); } void mp_number_double(mp_number *A) { A->data.dval = A->data.dval * 2.0; } void mp_number_add_scaled(mp_number *A, int B) { /* also for negative B */ A->data.dval = A->data.dval + (B/65536.0); } void mp_number_multiply_int(mp_number *A, int B) { A->data.dval = (double)(A->data.dval * B); } void mp_number_divide_int(mp_number *A, int B) { A->data.dval = A->data.dval / (double)B; } void mp_double_abs(mp_number *A) { A->data.dval = fabs(A->data.dval); } void mp_number_clone(mp_number *A, mp_number B) { A->data.dval = B.data.dval; } void mp_number_swap(mp_number *A, mp_number *B) { double swap_tmp = A->data.dval; A->data.dval = B->data.dval; B->data.dval = swap_tmp; } void mp_number_fraction_to_scaled (mp_number *A) { A->type = mp_scaled_type; A->data.dval = A->data.dval / fraction_multiplier; } void mp_number_angle_to_scaled (mp_number *A) { A->type = mp_scaled_type; A->data.dval = A->data.dval / angle_multiplier; } void mp_number_scaled_to_fraction (mp_number *A) { A->type = mp_fraction_type; A->data.dval = A->data.dval * fraction_multiplier; } void mp_number_scaled_to_angle (mp_number *A) { A->type = mp_angle_type; A->data.dval = A->data.dval * angle_multiplier; } @ Query functions @c int mp_number_to_scaled(mp_number A) { return (int)ROUND(A.data.dval * 65536.0); } int mp_number_to_int(mp_number A) { return (int)(A.data.dval); } int mp_number_to_boolean(mp_number A) { return (int)(A.data.dval); } double mp_number_to_double(mp_number A) { return A.data.dval; } int mp_number_odd(mp_number A) { return odd((int)ROUND(A.data.dval * 65536.0)); } int mp_number_equal(mp_number A, mp_number B) { return (A.data.dval==B.data.dval); } int mp_number_greater(mp_number A, mp_number B) { return (A.data.dval>B.data.dval); } int mp_number_less(mp_number A, mp_number B) { return (A.data.dval>1|'. Therefore the midpoint operation will always be denoted by `|half(a+b)|' in this program. If \MP\ is being implemented with languages that permit binary shifting, the |half| macro should be changed to make this operation as efficient as possible. Since some systems have shift operators that can only be trusted to work on positive numbers, there is also a macro |halfp| that is used only when the quantity being halved is known to be positive or zero. @ Here is a procedure analogous to |print_int|. The current version is fairly stupid, and it is not round-trip safe, but this is good enough for a beta test. @c char * mp_double_number_tostring (MP mp, mp_number n) { static char set[64]; int l = 0; char *ret = mp_xmalloc(mp, 64, 1); snprintf(set, 64, "%.17g", n.data.dval); while (set[l] == ' ') l++; strcpy(ret, set+l); return ret; } @ @c void mp_double_print_number (MP mp, mp_number n) { char *str = mp_double_number_tostring(mp, n); mp_print (mp, str); free (str); } @ Addition is not always checked to make sure that it doesn't overflow, but in places where overflow isn't too unlikely the |slow_add| routine is used. @c void mp_double_slow_add (MP mp, mp_number *ret, mp_number x_orig, mp_number y_orig) { double x, y; x = x_orig.data.dval; y = y_orig.data.dval; if (x >= 0) { if (y <= EL_GORDO - x) { ret->data.dval = x + y; } else { mp->arith_error = true; ret->data.dval = EL_GORDO; } } else if (-y <= EL_GORDO + x) { ret->data.dval = x + y; } else { mp->arith_error = true; ret->data.dval = -EL_GORDO; } } @ The |make_fraction| routine produces the |fraction| equivalent of |p/q|, given integers |p| and~|q|; it computes the integer $f=\lfloor2^{28}p/q+{1\over2}\rfloor$, when $p$ and $q$ are positive. If |p| and |q| are both of the same scaled type |t|, the ``type relation'' |make_fraction(t,t)=fraction| is valid; and it's also possible to use the subroutine ``backwards,'' using the relation |make_fraction(t,fraction)=t| between scaled types. If the result would have magnitude $2^{31}$ or more, |make_fraction| sets |arith_error:=true|. Most of \MP's internal computations have been designed to avoid this sort of error. If this subroutine were programmed in assembly language on a typical machine, we could simply compute |(@t$2^{28}$@>*p)div q|, since a double-precision product can often be input to a fixed-point division instruction. But when we are restricted to int-eger arithmetic it is necessary either to resort to multiple-precision maneuvering or to use a simple but slow iteration. The multiple-precision technique would be about three times faster than the code adopted here, but it would be comparatively long and tricky, involving about sixteen additional multiplications and divisions. This operation is part of \MP's ``inner loop''; indeed, it will consume nearly 10\pct! of the running time (exclusive of input and output) if the code below is left unchanged. A machine-dependent recoding will therefore make \MP\ run faster. The present implementation is highly portable, but slow; it avoids multiplication and division except in the initial stage. System wizards should be careful to replace it with a routine that is guaranteed to produce identical results in all cases. @^system dependencies@> As noted below, a few more routines should also be replaced by machine-dependent code, for efficiency. But when a procedure is not part of the ``inner loop,'' such changes aren't advisable; simplicity and robustness are preferable to trickery, unless the cost is too high. @^inner loop@> @c double mp_double_make_fraction (MP mp, double p, double q) { return ((p / q) * fraction_multiplier); } void mp_double_number_make_fraction (MP mp, mp_number *ret, mp_number p, mp_number q) { ret->data.dval = mp_double_make_fraction (mp, p.data.dval, q.data.dval); } @ @= double mp_double_make_fraction (MP mp, double p, double q); @ The dual of |make_fraction| is |take_fraction|, which multiplies a given integer~|q| by a fraction~|f|. When the operands are positive, it computes $p=\lfloor qf/2^{28}+{1\over2}\rfloor$, a symmetric function of |q| and~|f|. This routine is even more ``inner loopy'' than |make_fraction|; the present implementation consumes almost 20\pct! of \MP's computation time during typical jobs, so a machine-language substitute is advisable. @^inner loop@> @^system dependencies@> @c double mp_double_take_fraction (MP mp, double p, double q) { return ((p * q) / fraction_multiplier); } void mp_double_number_take_fraction (MP mp, mp_number *ret, mp_number p, mp_number q) { ret->data.dval = mp_double_take_fraction (mp, p.data.dval, q.data.dval); } @ @= double mp_double_take_fraction (MP mp, double p, double q); @ When we want to multiply something by a |scaled| quantity, we use a scheme analogous to |take_fraction| but with a different scaling. Given positive operands, |take_scaled| computes the quantity $p=\lfloor qf/2^{16}+{1\over2}\rfloor$. Once again it is a good idea to use a machine-language replacement if possible; otherwise |take_scaled| will use more than 2\pct! of the running time when the Computer Modern fonts are being generated. @^inner loop@> @c void mp_double_number_take_scaled (MP mp, mp_number *ret, mp_number p_orig, mp_number q_orig) { ret->data.dval = p_orig.data.dval * q_orig.data.dval; } @ For completeness, there's also |make_scaled|, which computes a quotient as a |scaled| number instead of as a |fraction|. In other words, the result is $\lfloor2^{16}p/q+{1\over2}\rfloor$, if the operands are positive. \ (This procedure is not used especially often, so it is not part of \MP's inner loop.) @c double mp_double_make_scaled (MP mp, double p, double q) { return p / q; } void mp_double_number_make_scaled (MP mp, mp_number *ret, mp_number p_orig, mp_number q_orig) { ret->data.dval = p_orig.data.dval / q_orig.data.dval; } @ @= double mp_double_make_scaled (MP mp, double p, double q); @ @d halfp(A) (integer)((unsigned)(A) >> 1) @* Scanning numbers in the input The definitions below are temporarily here @d set_cur_cmd(A) mp->cur_mod_->type=(A) @d set_cur_mod(A) mp->cur_mod_->data.n.data.dval=(A) @= static void mp_wrapup_numeric_token(MP mp, unsigned char *start, unsigned char *stop); @ @c void mp_wrapup_numeric_token(MP mp, unsigned char *start, unsigned char *stop) { double result; char *end = (char *)stop; errno = 0; result = strtod ((char *)start, &end); if (errno == 0) { set_cur_mod(result); if (result >= warning_limit) { if (internal_value (mp_warning_check).data.dval > 0 && (mp->scanner_status != tex_flushing)) { char msg[256]; const char *hlp[] = {"Continue and I'll try to cope", "with that big value; but it might be dangerous.", "(Set warningcheck:=0 to suppress this message.)", NULL }; mp_snprintf (msg, 256, "Number is too large (%g)", result); @.Number is too large@>; mp_error (mp, msg, hlp, true); } } } else if (mp->scanner_status != tex_flushing) { const char *hlp[] = {"I could not handle this number specification", "probably because it is out of range. Error:", "", NULL }; hlp[2] = strerror(errno); mp_error (mp, "Enormous number has been reduced.", hlp, false); @.Enormous number...@>; set_cur_mod(EL_GORDO); } set_cur_cmd((mp_variable_type)mp_numeric_token); } @ @c static void find_exponent (MP mp) { if (mp->buffer[mp->cur_input.loc_field] == 'e' || mp->buffer[mp->cur_input.loc_field] == 'E') { mp->cur_input.loc_field++; if (!(mp->buffer[mp->cur_input.loc_field] == '+' || mp->buffer[mp->cur_input.loc_field] == '-' || mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class)) { mp->cur_input.loc_field--; return; } if (mp->buffer[mp->cur_input.loc_field] == '+' || mp->buffer[mp->cur_input.loc_field] == '-') { mp->cur_input.loc_field++; } while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) { mp->cur_input.loc_field++; } } } void mp_double_scan_fractional_token (MP mp, int n) { /* n: scaled */ unsigned char *start = &mp->buffer[mp->cur_input.loc_field -1]; unsigned char *stop; while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) { mp->cur_input.loc_field++; } find_exponent(mp); stop = &mp->buffer[mp->cur_input.loc_field-1]; mp_wrapup_numeric_token (mp, start, stop); } @ Input format is the same as for the C language, so we just collect valid bytes in the buffer, then call |strtod()| @c void mp_double_scan_numeric_token (MP mp, int n) { /* n: scaled */ unsigned char *start = &mp->buffer[mp->cur_input.loc_field -1]; unsigned char *stop; while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) { mp->cur_input.loc_field++; } if (mp->buffer[mp->cur_input.loc_field] == '.' && mp->buffer[mp->cur_input.loc_field+1] != '.') { mp->cur_input.loc_field++; while (mp->char_class[mp->buffer[mp->cur_input.loc_field]] == digit_class) { mp->cur_input.loc_field++; } } find_exponent(mp); stop = &mp->buffer[mp->cur_input.loc_field-1]; mp_wrapup_numeric_token (mp, start, stop); } @ The |scaled| quantities in \MP\ programs are generally supposed to be less than $2^{12}$ in absolute value, so \MP\ does much of its internal arithmetic with 28~significant bits of precision. A |fraction| denotes a scaled integer whose binary point is assumed to be 28 bit positions from the right. @d fraction_half (0.5*fraction_multiplier) @d fraction_one (1.0*fraction_multiplier) @d fraction_two (2.0*fraction_multiplier) @d fraction_three (3.0*fraction_multiplier) @d fraction_four (4.0*fraction_multiplier) @ Here is a typical example of how the routines above can be used. It computes the function $${1\over3\tau}f(\theta,\phi)= {\tau^{-1}\bigl(2+\sqrt2\,(\sin\theta-{1\over16}\sin\phi) (\sin\phi-{1\over16}\sin\theta)(\cos\theta-\cos\phi)\bigr)\over 3\,\bigl(1+{1\over2}(\sqrt5-1)\cos\theta+{1\over2}(3-\sqrt5\,)\cos\phi\bigr)},$$ where $\tau$ is a |scaled| ``tension'' parameter. This is \MP's magic fudge factor for placing the first control point of a curve that starts at an angle $\theta$ and ends at an angle $\phi$ from the straight path. (Actually, if the stated quantity exceeds 4, \MP\ reduces it to~4.) The trigonometric quantity to be multiplied by $\sqrt2$ is less than $\sqrt2$. (It's a sum of eight terms whose absolute values can be bounded using relations such as $\sin\theta\cos\theta\L{1\over2}$.) Thus the numerator is positive; and since the tension $\tau$ is constrained to be at least $3\over4$, the numerator is less than $16\over3$. The denominator is nonnegative and at most~6. The angles $\theta$ and $\phi$ are given implicitly in terms of |fraction| arguments |st|, |ct|, |sf|, and |cf|, representing $\sin\theta$, $\cos\theta$, $\sin\phi$, and $\cos\phi$, respectively. @c void mp_double_velocity (MP mp, mp_number *ret, mp_number st, mp_number ct, mp_number sf, mp_number cf, mp_number t) { double acc, num, denom; /* registers for intermediate calculations */ acc = mp_double_take_fraction (mp, st.data.dval - (sf.data.dval / 16.0), sf.data.dval - (st.data.dval / 16.0)); acc = mp_double_take_fraction (mp, acc, ct.data.dval - cf.data.dval); num = fraction_two + mp_double_take_fraction (mp, acc, sqrt(2)*fraction_one); denom = fraction_three + mp_double_take_fraction (mp, ct.data.dval, 3*fraction_half*(sqrt(5.0)-1.0)) + mp_double_take_fraction (mp, cf.data.dval, 3*fraction_half*(3.0-sqrt(5.0))); if (t.data.dval != unity) num = mp_double_make_scaled (mp, num, t.data.dval); if (num / 4 >= denom) { ret->data.dval = fraction_four; } else { ret->data.dval = mp_double_make_fraction (mp, num, denom); } #if DEBUG fprintf(stdout, "\n%f = velocity(%f,%f,%f,%f,%f)", mp_number_to_double(*ret), mp_number_to_double(st),mp_number_to_double(ct), mp_number_to_double(sf),mp_number_to_double(cf), mp_number_to_double(t)); #endif } @ The following somewhat different subroutine tests rigorously if $ab$ is greater than, equal to, or less than~$cd$, given integers $(a,b,c,d)$. In most cases a quick decision is reached. The result is $+1$, 0, or~$-1$ in the three respective cases. @c void mp_ab_vs_cd (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig, mp_number c_orig, mp_number d_orig) { integer q, r; /* temporary registers */ integer a, b, c, d; (void)mp; a = a_orig.data.dval; b = b_orig.data.dval; c = c_orig.data.dval; d = d_orig.data.dval; @=0|, |b,d>0|@>; while (1) { q = a / d; r = c / b; if (q != r) { ret->data.dval = (q > r ? 1 : -1); goto RETURN; } q = a % d; r = c % b; if (r == 0) { ret->data.dval = (q ? 1 : 0); goto RETURN; } if (q == 0) { ret->data.dval = -1; goto RETURN; } a = b; b = q; c = d; d = r; } /* now |a>d>0| and |c>b>0| */ RETURN: #if DEBUG fprintf(stdout, "\n%f = ab_vs_cd(%f,%f,%f,%f)", mp_number_to_double(*ret), mp_number_to_double(a_orig),mp_number_to_double(b_orig), mp_number_to_double(c_orig),mp_number_to_double(d_orig)); #endif return; } @ @= if (a < 0) { a = -a; b = -b; } if (c < 0) { c = -c; d = -d; } if (d <= 0) { if (b >= 0) { if ((a == 0 || b == 0) && (c == 0 || d == 0)) ret->data.dval = 0; else ret->data.dval = 1; goto RETURN; } if (d == 0) { ret->data.dval = (a == 0 ? 0 : -1); goto RETURN; } q = a; a = c; c = q; q = -b; b = -d; d = q; } else if (b <= 0) { if (b < 0 && a > 0) { ret->data.dval = -1; return; } ret->data.dval = (c == 0 ? 0 : -1); goto RETURN; } @ Now here's a subroutine that's handy for all sorts of path computations: Given a quadratic polynomial $B(a,b,c;t)$, the |crossing_point| function returns the unique |fraction| value |t| between 0 and~1 at which $B(a,b,c;t)$ changes from positive to negative, or returns |t=fraction_one+1| if no such value exists. If |a<0| (so that $B(a,b,c;t)$ is already negative at |t=0|), |crossing_point| returns the value zero. The general bisection method is quite simple when $n=2$, hence |crossing_point| does not take much time. At each stage in the recursion we have a subinterval defined by |l| and~|j| such that $B(a,b,c;2^{-l}(j+t))=B(x_0,x_1,x_2;t)$, and we want to ``zero in'' on the subinterval where $x_0\G0$ and $\min(x_1,x_2)<0$. It is convenient for purposes of calculation to combine the values of |l| and~|j| in a single variable $d=2^l+j$, because the operation of bisection then corresponds simply to doubling $d$ and possibly adding~1. Furthermore it proves to be convenient to modify our previous conventions for bisection slightly, maintaining the variables $X_0=2^lx_0$, $X_1=2^l(x_0-x_1)$, and $X_2=2^l(x_1-x_2)$. With these variables the conditions $x_0\ge0$ and $\min(x_1,x_2)<0$ are equivalent to $\max(X_1,X_1+X_2)>X_0\ge0$. The following code maintains the invariant relations $0\L|x0|<\max(|x1|,|x1|+|x2|)$, $\vert|x1|\vert<2^{30}$, $\vert|x2|\vert<2^{30}$; it has been constructed in such a way that no arithmetic overflow will occur if the inputs satisfy $a<2^{30}$, $\vert a-b\vert<2^{30}$, and $\vert b-c\vert<2^{30}$. @d no_crossing { ret->data.dval = fraction_one + 1; goto RETURN; } @d one_crossing { ret->data.dval = fraction_one; goto RETURN; } @d zero_crossing { ret->data.dval = 0; goto RETURN; } @c static void mp_double_crossing_point (MP mp, mp_number *ret, mp_number aa, mp_number bb, mp_number cc) { double a,b,c; double d; /* recursive counter */ double x, xx, x0, x1, x2; /* temporary registers for bisection */ a = aa.data.dval; b = bb.data.dval; c = cc.data.dval; if (a < 0) zero_crossing; if (c >= 0) { if (b >= 0) { if (c > 0) { no_crossing; } else if ((a == 0) && (b == 0)) { no_crossing; } else { one_crossing; } } if (a == 0) zero_crossing; } else if (a == 0) { if (b <= 0) zero_crossing; } /* Use bisection to find the crossing point... */ d = epsilon; x0 = a; x1 = a - b; x2 = b - c; do { /* not sure why the error correction has to be >= 1E-12 */ x = (x1 + x2) / 2 + 1E-12; if (x1 - x0 > x0) { x2 = x; x0 += x0; d += d; } else { xx = x1 + x - x0; if (xx > x0) { x2 = x; x0 += x0; d += d; } else { x0 = x0 - xx; if (x <= x0) { if (x + x2 <= x0) no_crossing; } x1 = x; d = d + d + epsilon; } } } while (d < fraction_one); ret->data.dval = (d - fraction_one); RETURN: #if DEBUG fprintf(stdout, "\n%f = crossing_point(%f,%f,%f)", mp_number_to_double(*ret), mp_number_to_double(aa),mp_number_to_double(bb),mp_number_to_double(cc)); #endif return; } @ We conclude this set of elementary routines with some simple rounding and truncation operations. @ |round_unscaled| rounds a |scaled| and converts it to |int| @c int mp_round_unscaled(mp_number x_orig) { int x = (int)ROUND(x_orig.data.dval); return x; } @ |number_floor| floors a number @c void mp_number_floor (mp_number *i) { i->data.dval = floor(i->data.dval); } @ |fraction_to_scaled| rounds a |fraction| and converts it to |scaled| @c void mp_double_fraction_to_round_scaled (mp_number *x_orig) { double x = x_orig->data.dval; x_orig->type = mp_scaled_type; x_orig->data.dval = x/fraction_multiplier; } @* Algebraic and transcendental functions. \MP\ computes all of the necessary special functions from scratch, without relying on |real| arithmetic or system subroutines for sines, cosines, etc. @ @c void mp_double_square_rt (MP mp, mp_number *ret, mp_number x_orig) { /* return, x: scaled */ double x; x = x_orig.data.dval; if (x <= 0) { @; } else { ret->data.dval = sqrt(x); } } @ @= { if (x < 0) { char msg[256]; const char *hlp[] = { "Since I don't take square roots of negative numbers,", "I'm zeroing this one. Proceed, with fingers crossed.", NULL }; char *xstr = mp_double_number_tostring (mp, x_orig); mp_snprintf(msg, 256, "Square root of %s has been replaced by 0", xstr); free(xstr); @.Square root...replaced by 0@>; mp_error (mp, msg, hlp, true); } ret->data.dval = 0; return; } @ Pythagorean addition $\psqrt{a^2+b^2}$ is implemented by a quick hack @c void mp_double_pyth_add (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig) { double a, b; /* a,b : scaled */ a = fabs (a_orig.data.dval); b = fabs (b_orig.data.dval); errno = 0; ret->data.dval = sqrt(a*a + b*b); if (errno) { mp->arith_error = true; ret->data.dval = EL_GORDO; } } @ Here is a similar algorithm for $\psqrt{a^2-b^2}$. Same quick hack, also. @c void mp_double_pyth_sub (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig) { double a, b; a = fabs (a_orig.data.dval); b = fabs (b_orig.data.dval); if (a <= b) { @; } else { a = sqrt(a*a - b*b); } ret->data.dval = a; } @ @= { if (a < b) { char msg[256]; const char *hlp[] = { "Since I don't take square roots of negative numbers,", "I'm zeroing this one. Proceed, with fingers crossed.", NULL }; char *astr = mp_double_number_tostring (mp, a_orig); char *bstr = mp_double_number_tostring (mp, b_orig); mp_snprintf (msg, 256, "Pythagorean subtraction %s+-+%s has been replaced by 0", astr, bstr); free(astr); free(bstr); @.Pythagorean...@>; mp_error (mp, msg, hlp, true); } a = 0; } @ The subroutines for logarithm and exponential involve two tables. The first is simple: |two_to_the[k]| equals $2^k$. @d two_to_the(A) (1<<(unsigned)(A)) @ Here is the routine that calculates $2^8$ times the natural logarithm of a |scaled| quantity; it is an integer approximation to $2^{24}\ln(x/2^{16})$, when |x| is a given positive integer. @c void mp_double_m_log (MP mp, mp_number *ret, mp_number x_orig) { if (x_orig.data.dval <= 0) { @; } else { ret->data.dval = log (x_orig.data.dval)*256.0; } } @ @= { char msg[256]; const char *hlp[] = { "Since I don't take logs of non-positive numbers,", "I'm zeroing this one. Proceed, with fingers crossed.", NULL }; char *xstr = mp_double_number_tostring (mp, x_orig); mp_snprintf (msg, 256, "Logarithm of %s has been replaced by 0", xstr); free (xstr); @.Logarithm...replaced by 0@>; mp_error (mp, msg, hlp, true); ret->data.dval = 0; } @ Conversely, the exponential routine calculates $\exp(x/2^8)$, when |x| is |scaled|. @c void mp_double_m_exp (MP mp, mp_number *ret, mp_number x_orig) { errno = 0; ret->data.dval = exp(x_orig.data.dval/256.0); if (errno) { if (x_orig.data.dval > 0) { mp->arith_error = true; ret->data.dval = EL_GORDO; } else { ret->data.dval = 0; } } } @ Given integers |x| and |y|, not both zero, the |n_arg| function returns the |angle| whose tangent points in the direction $(x,y)$. @c void mp_double_n_arg (MP mp, mp_number *ret, mp_number x_orig, mp_number y_orig) { if (x_orig.data.dval == 0.0 && y_orig.data.dval == 0.0) { @; } else { ret->type = mp_angle_type; ret->data.dval = atan2 (y_orig.data.dval, x_orig.data.dval) * (180.0 / PI) * angle_multiplier; if (ret->data.dval == -0.0) ret->data.dval = 0.0; #if DEBUG fprintf(stdout, "\nn_arg(%g,%g,%g)", mp_number_to_double(*ret), mp_number_to_double(x_orig),mp_number_to_double(y_orig)); #endif } } @ @= { const char *hlp[] = { "The `angle' between two identical points is undefined.", "I'm zeroing this one. Proceed, with fingers crossed.", NULL }; mp_error (mp, "angle(0,0) is taken as zero", hlp, true); @.angle(0,0)...zero@>; ret->data.dval = 0; } @ Conversely, the |n_sin_cos| routine takes an |angle| and produces the sine and cosine of that angle. The results of this routine are stored in global integer variables |n_sin| and |n_cos|. @ Given an integer |z| that is $2^{20}$ times an angle $\theta$ in degrees, the purpose of |n_sin_cos(z)| is to set |x=@t$r\cos\theta$@>| and |y=@t$r\sin\theta$@>| (approximately), for some rather large number~|r|. The maximum of |x| and |y| will be between $2^{28}$ and $2^{30}$, so that there will be hardly any loss of accuracy. Then |x| and~|y| are divided by~|r|. @d one_eighty_deg (180.0*angle_multiplier) @d three_sixty_deg (360.0*angle_multiplier) @d odd(A) (abs(A)%2==1) @ Compute a multiple of the sine and cosine @c void mp_double_sin_cos (MP mp, mp_number z_orig, mp_number *n_cos, mp_number *n_sin) { double rad; rad = (z_orig.data.dval / angle_multiplier) * PI/180.0; n_cos->data.dval = cos(rad) * fraction_multiplier; n_sin->data.dval = sin(rad) * fraction_multiplier; #if DEBUG fprintf(stdout, "\nsin_cos(%f,%f,%f)", mp_number_to_double(z_orig), mp_number_to_double(*n_cos), mp_number_to_double(*n_sin)); #endif } @ This is the http://www-cs-faculty.stanford.edu/~uno/programs/rng.c with small cosmetic modifications. @c #define KK 100 /* the long lag */ #define LL 37 /* the short lag */ #define MM (1L<<30) /* the modulus */ #define mod_diff(x,y) (((x)-(y))&(MM-1)) /* subtraction mod MM */ /* */ static long ran_x[KK]; /* the generator state */ /* */ static void ran_array(long aa[],int n) /* put n new random numbers in aa */ /* long aa[] destination */ /* int n array length (must be at least KK) */ { register int i,j; for (j=0;j=MM) ss-=MM-2; /* cyclic shift 29 bits */ } x[1]++; /* make x[1] (and only x[1]) odd */ for (ss=seed&(MM-1),t=TT-1; t; ) { for (j=KK-1;j>0;j--) x[j+j]=x[j], x[j+j-1]=0; /* "square" */ for (j=KK+KK-2;j>=KK;j--) x[j-(KK-LL)]=mod_diff(x[j-(KK-LL)],x[j]), x[j-KK]=mod_diff(x[j-KK],x[j]); if (is_odd(ss)) { /* "multiply by z" */ for (j=KK;j>0;j--) x[j]=x[j-1]; x[0]=x[KK]; /* shift the buffer cyclically */ x[LL]=mod_diff(x[LL],x[KK]); } if (ss) ss>>=1; else t--; } for (j=0;j=0? *ran_arr_ptr++: ran_arr_cycle()) static long ran_arr_cycle(void) { if (ran_arr_ptr==&ran_arr_dummy) ran_start(314159L); /* the user forgot to initialize */ ran_array(ran_arr_buf,QUALITY); ran_arr_buf[KK]=-1; ran_arr_ptr=ran_arr_buf+1; return ran_arr_buf[0]; } @ To initialize the |randoms| table, we call the following routine. @c void mp_init_randoms (MP mp, int seed) { int j, jj, k; /* more or less random integers */ int i; /* index into |randoms| */ j = abs (seed); while (j >= fraction_one) { j = j/2; } k = 1; for (i = 0; i <= 54; i++) { jj = k; k = j - k; j = jj; if (k<0) k += fraction_one; mp->randoms[(i * 21) % 55].data.dval = j; } mp_new_randoms (mp); mp_new_randoms (mp); mp_new_randoms (mp); /* ``warm up'' the array */ ran_start((unsigned long) seed); } @ @c static double modulus(double left, double right); double modulus(double left, double right) { double quota = left / right; double frac,tmp; frac = modf(quota,&tmp); /* frac contains what's beyond the '.' */ frac *= right; return frac; } void mp_number_modulo (mp_number *a, mp_number b) { a->data.dval = modulus (a->data.dval, b.data.dval); } @ To consume a random integer for the uniform generator, the program below will say `|next_unif_random|'. @c static void mp_next_unif_random (MP mp, mp_number *ret) { double a; unsigned long int op; (void)mp; op = (unsigned)ran_arr_next(); a = op/(MM*1.0); ret->data.dval = a; } @ To consume a random fraction, the program below will say `|next_random|'. @c static void mp_next_random (MP mp, mp_number *ret) { if ( mp->j_random==0 ) mp_new_randoms(mp); else mp->j_random = mp->j_random-1; mp_number_clone (ret, mp->randoms[mp->j_random]); } @ To produce a uniform random number in the range |0<=u=u>x| or |0=u=x|, given a |scaled| value~|x|, we proceed as shown here. Note that the call of |take_fraction| will produce the values 0 and~|x| with about half the probability that it will produce any other particular values between 0 and~|x|, because it rounds its answers. @c static void mp_double_m_unif_rand (MP mp, mp_number *ret, mp_number x_orig) { mp_number y; /* trial value */ mp_number x, abs_x; mp_number u; new_fraction (y); new_number (x); new_number (abs_x); new_number (u); mp_number_clone (&x, x_orig); mp_number_clone (&abs_x, x); mp_double_abs (&abs_x); mp_next_unif_random(mp, &u); y.data.dval = abs_x.data.dval * u.data.dval; free_number (u); if (mp_number_equal(y, abs_x)) { mp_number_clone (ret, ((math_data *)mp->math)->zero_t); } else if (mp_number_greater(x, ((math_data *)mp->math)->zero_t)) { mp_number_clone (ret, y); } else { mp_number_clone (ret, y); mp_number_negate (ret); } free_number (abs_x); free_number (x); free_number (y); } @ Finally, a normal deviate with mean zero and unit standard deviation can readily be obtained with the ratio method (Algorithm 3.4.1R in {\sl The Art of Computer Programming\/}). @c static void mp_double_m_norm_rand (MP mp, mp_number *ret) { mp_number ab_vs_cd; mp_number abs_x; mp_number u; mp_number r; mp_number la, xa; new_number (ab_vs_cd); new_number (la); new_number (xa); new_number (abs_x); new_number (u); new_number (r); do { do { mp_number v; new_number (v); mp_next_random(mp, &v); mp_number_substract (&v, ((math_data *)mp->math)->fraction_half_t); mp_double_number_take_fraction (mp,&xa, ((math_data *)mp->math)->sqrt_8_e_k, v); free_number (v); mp_next_random(mp, &u); mp_number_clone (&abs_x, xa); mp_double_abs (&abs_x); } while (!mp_number_less(abs_x, u)); mp_double_number_make_fraction (mp, &r, xa, u); mp_number_clone (&xa, r); mp_double_m_log (mp,&la, u); mp_set_double_from_substraction(&la, ((math_data *)mp->math)->twelve_ln_2_k, la); mp_double_ab_vs_cd (mp,&ab_vs_cd, ((math_data *)mp->math)->one_k, la, xa, xa); } while (mp_number_less(ab_vs_cd,((math_data *)mp->math)->zero_t)); mp_number_clone (ret, xa); free_number (ab_vs_cd); free_number (r); free_number (abs_x); free_number (la); free_number (xa); free_number (u); } @ The following subroutine is used only in norm_rand and tests if $ab$ is greater than, equal to, or less than~$cd$. The result is $+1$, 0, or~$-1$ in the three respective cases. @c void mp_double_ab_vs_cd (MP mp, mp_number *ret, mp_number a_orig, mp_number b_orig, mp_number c_orig, mp_number d_orig) { double ab, cd; (void)mp; ret->data.dval = 0 ; ab = a_orig.data.dval*b_orig.data.dval; cd = c_orig.data.dval*d_orig.data.dval; if (ab > cd ) ret->data.dval = 1 ; else if (ab < cd ) ret->data.dval = -1 ; return ; } ================================================ FILE: samples/CWeb/sat-life.w ================================================ \datethis @*Intro. This program generates clauses for the transition relation from time $t$ to time $t+1$ in Conway's Game of Life, assuming that all of the potentially live cells at time $t$ belong to a pattern that's specified in |stdin|. The pattern is defined by one or more lines representing rows of cells, where each line has `\..' in a cell that's guaranteed to be dead at time~$t$, otherwise it has `\.*'. The time is specified separately as a command-line parameter. The Boolean variable for cell $(x,y)$ at time $t$ is named by its so-called ``xty code,'' namely by the decimal value of~$x$, followed by a code letter for~$t$, followed by the decimal value of~$y$. For example, if $x=10$ and $y=11$ and $t=0$, the variable that indicates liveness of the cell is \.{10a11}; and the corresponding variable for $t=1$ is \.{10b11}. Up to 19 auxiliary variables are used together with each xty code, in order to construct clauses that define the successor state. The names of these variables are obtained by appending one of the following two-character combinations to the xty code: \.{A2}, \.{A3}, \.{A4}, \.{B1}, \.{B2}, \.{B3}, \.{B4}, \.{C1}, \.{C2}, \.{C3}, \.{C4}, \.{D1}, \.{D2}, \.{E1}, \.{E2}, \.{F1}, \.{F2}, \.{G1}, \.{G2}. These variables are derived from the Bailleux--Boufkhad method of encoding cardinality constraints: The auxiliary variable \.{A$k$} stands for the condition ``at least $k$ of the eight neighbors are alive.'' Similarly, \.{B$k$} stands for ``at least $k$ of the first four neighbors are alive,'' and \.{C$k$} accounts for the other four neighbors. Codes \.D, \.E, \.F, and~\.G refer to pairs of neighbors. Thus, for instance, \.{10a11C2} means that at least two of the last four neighbors of cell $(10,11)$ are alive. Those auxiliary variables receive values by means of up to 77 clauses per cell. For example, if $u$ and~$v$ are the neighbors of cell~$z$ that correspond to a pairing of type~\.D, there are six clauses $$\bar u d_1,\quad \bar v d_1,\quad \bar u\bar v d_2,\quad u v\bar d_1,\quad u\bar d_2,\quad v\bar d_2.$$ The sixteen clauses $$\displaylines{\hfill \bar d_1b_1,\quad \bar e_1b_1,\quad \bar d_2b_2,\quad \bar d_1\bar e_1b_2,\quad \bar e_2b_2,\quad \bar d_2\bar e_1b_3,\quad \bar d_1\bar e_2b_3,\quad \bar d_2\bar e_2b_4, \hfill\cr\hfill d_1e_1\bar b_1,\quad d_1e_2\bar b_2,\quad d_2e_1\bar b_2,\quad d_1\bar b_3,\quad d_2e_2\bar b_3,\quad e_1\bar b_3,\quad d_2\bar b_4,\quad e_2\bar b_4 \hfill}$$ define $b$ variables from $d$'s and $e$'s; and another sixteen define $c$'s from $f$'s and $g$'s in the same fashion. A similar set of 21 clauses will define the $a$'s from the $b$'s and $c$'s. Once the $a$'s are defined, thus essentially counting the live neighbors of cell $z$, the next state~$z'$ is defined by five further clauses $$\bar a_4\bar z',\quad a_2\bar z',\quad a_3z\bar z',\quad \bar a_3a_4z',\quad \bar a_2a_4\bar zz'.$$ For example, the last of these states that $z'$ will be true (i.e., that cell $z$ will be alive at time $t+1$) if $z$ is alive at time~$t$ and has $\ge2$ live neighbors but not $\ge4$. Nearby cells can share auxiliary variables, according to a tricky scheme that is worked out below. In consequence, the actual number of auxiliary variables and clauses per cell is reduced from 19 and $77+5$ to 13 and $57+5$, respectively, except at the boundaries. @ So here's the overall outline of the program. @d maxx 50 /* maximum number of lines in the pattern supplied by |stdin| */ @d maxy 50 /* maximum number of columns per line in |stdin| */ @c #include #include char p[maxx+2][maxy+2]; /* is cell $(x,y)$ potentially alive? */ char have_b[maxx+2][maxy+2]; /* did we already generate $b(x,y)$? */ char have_d[maxx+2][maxy+2]; /* did we already generate $d(x,y)$? */ char have_e[maxx+2][maxy+4]; /* did we already generate $e(x,y)$? */ char have_f[maxx+4][maxy+2]; /* did we already generate $f(x-2,y)$? */ int tt; /* time as given on the command line */ int xmax,ymax; /* the number of rows and columns in the input pattern */ int xmin=maxx,ymin=maxy; /* limits in the other direction */ char timecode[]="abcdefghijklmnopqrstuvwxyz"@| "ABCDEFGHIJKLMNOPQRSTUVWXYZ"@| "!\"#$%&'()*+,-./:;<=>?@@[\\]^_`{|}~"; /* codes for $0\le t\le83$ */ @q$@> char buf[maxy+2]; /* input buffer */ unsigned int clause[4]; /* clauses are assembled here */ int clauseptr; /* this many literals are in the current clause */ @@; main(int argc,char*argv[]) { register int j,k,x,y; @; @; for (x=xmin-1;x<=xmax+1;x++) for (y=ymin-1;y<=ymax+1;y++) { @; a(x,y); zprime(x,y); } } @ @= if (argc!=2 || sscanf(argv[1],"%d",&tt)!=1) { fprintf(stderr,"Usage: %s t\n",argv[0]); exit(-1); } if (tt<0 || tt>82) { fprintf(stderr,"The time should be between 0 and 82 (not %d)!\n",tt); exit(-2); } @ @= for (x=1;;x++) { if (!fgets(buf,maxy+2,stdin)) break; if (x>maxx) { fprintf(stderr,"Sorry, the pattern should have at most %d rows!\n",maxx); exit(-3); } for (y=1;buf[y-1]!='\n';y++) { if (y>maxy) { fprintf(stderr,"Sorry, the pattern should have at most %d columns!\n", maxy); exit(-4); } if (buf[y-1]=='*') { p[x][y]=1; if (y>ymax) ymax=y; if (yxmax) xmax=x; if (x=0 && (yy)>=0? p[xx][yy]: 0) @= if (pp(x-1,y-1)+pp(x-1,y)+pp(x-1,y+1)+ pp(x,y-1)+p[x][y]+p[x][y+1]+ pp(x+1,y-1)+p[x+1][y]+p[x+1][y+1]<3) continue; @ Clauses are assembled in the |clause| array (surprise), where we put encoded literals. The code for a literal is an unsigned 32-bit quantity, where the leading bit is 1 if the literal should be complemented. The next three bits specify the type of the literal (0 thru 7 for plain and \.A--\.G); the next three bits specify an integer~$k$; and the next bit is zero. That leaves room for two 12-bit fields, which specify $x$ and $y$. Type 0 literals have $k=0$ for the ordinary xty code. However, the value $k=1$ indicates that the time code should be for $t+1$ instead of~$t$. And $k=2$ denotes a special ``tautology'' literal, which is always true. If the tautology literal is complemented, we omit it from the clause; otherwise we omit the entire clause. Finally, $k=7$ denotes an auxiliary literal, used to avoid clauses of length~4. Here's a subroutine that outputs the current clause and resets the |clause| array. @d taut (2<<25) @d sign (1U<<31) @= void outclause(void) { register int c,k,x,y,p; for (p=0;p>31) printf(" ~");@+else printf(" "); c=(clause[p]>>28)&0x7; k=(clause[p]>>25)&0x7; x=(clause[p]>>12)&0xfff; y=clause[p]&0xfff; if (c) printf("%d%c%d%c%d", x,timecode[tt],y,c+'@@',k); else if (k==7) printf("%d%c%dx", x,timecode[tt],y); else printf("%d%c%d", x,timecode[tt+k],y); } printf("\n"); done: clauseptr=0; } @ And here's another, which puts a type-0 literal into |clause|. @= void applit(int x,int y,int bar,int k) { if (k==0 && (xxmax || yymax || p[x][y]==0)) clause[clauseptr++]=(bar? 0: sign)+taut; else clause[clauseptr++]=(bar? sign:0)+(k<<25)+(x<<12)+y; } @ The |d| and |e| subroutines are called for only one-fourth of all cell addresses $(x,y)$. Indeed, one can show that $x$ is always odd, and that $y\bmod4<2$. Therefore we remember if we've seen $(x,y)$ before. Slight trick: If |yy| is not in range, we avoid generating the clause $\bar d_k$ twice. @d newlit(x,y,c,k) clause[clauseptr++]=((c)<<28)+((k)<<25)+((x)<<12)+(y) @d newcomplit(x,y,c,k) clause[clauseptr++]=sign+((c)<<28)+((k)<<25)+((x)<<12)+(y) @= void d(int x,int y) { register x1=x-1,x2=x,yy=y+1; if (have_d[x][y]!=tt+1) { applit(x1,yy,1,0),newlit(x,y,4,1),outclause(); applit(x2,yy,1,0),newlit(x,y,4,1),outclause(); applit(x1,yy,1,0),applit(x2,yy,1,0),newlit(x,y,4,2),outclause(); applit(x1,yy,0,0),applit(x2,yy,0,0),newcomplit(x,y,4,1),outclause(); applit(x1,yy,0,0),newcomplit(x,y,4,2),outclause(); if (yy>=ymin && yy<=ymax) applit(x2,yy,0,0),newcomplit(x,y,4,2),outclause(); have_d[x][y]=tt+1; } } @# void e(int x,int y) { register x1=x-1,x2=x,yy=y-1; if (have_e[x][y]!=tt+1) { applit(x1,yy,1,0),newlit(x,y,5,1),outclause(); applit(x2,yy,1,0),newlit(x,y,5,1),outclause(); applit(x1,yy,1,0),applit(x2,yy,1,0),newlit(x,y,5,2),outclause(); applit(x1,yy,0,0),applit(x2,yy,0,0),newcomplit(x,y,5,1),outclause(); applit(x1,yy,0,0),newcomplit(x,y,5,2),outclause(); if (yy>=ymin && yy<=ymax) applit(x2,yy,0,0),newcomplit(x,y,5,2),outclause(); have_e[x][y]=tt+1; } } @ The |f| subroutine can't be shared quite so often. But we do save a factor of~2, because $x+y$ is always even. @= void f(int x,int y) { register xx=x-1,y1=y,y2=y+1; if (have_f[x][y]!=tt+1) { applit(xx,y1,1,0),newlit(x,y,6,1),outclause(); applit(xx,y2,1,0),newlit(x,y,6,1),outclause(); applit(xx,y1,1,0),applit(xx,y2,1,0),newlit(x,y,6,2),outclause(); applit(xx,y1,0,0),applit(xx,y2,0,0),newcomplit(x,y,6,1),outclause(); applit(xx,y1,0,0),newcomplit(x,y,6,2),outclause(); if (xx>=xmin && xx<=xmax) applit(xx,y2,0,0),newcomplit(x,y,6,2),outclause(); have_f[x][y]=tt+1; } } @ The |g| subroutine cleans up the dregs, by somewhat tediously locating the two neighbors that weren't handled by |d|, |e|, or~|f|. No sharing is possible here. @= void g(int x,int y) { register x1,x2,y1,y2; if (x&1) x1=x-1,y1=y,x2=x+1,y2=y^1; else x1=x+1,y1=y,x2=x-1,y2=y-1+((y&1)<<1); applit(x1,y1,1,0),newlit(x,y,7,1),outclause(); applit(x2,y2,1,0),newlit(x,y,7,1),outclause(); applit(x1,y1,1,0),applit(x2,y2,1,0),newlit(x,y,7,2),outclause(); applit(x1,y1,0,0),applit(x2,y2,0,0),newcomplit(x,y,7,1),outclause(); applit(x1,y1,0,0),newcomplit(x,y,7,2),outclause(); applit(x2,y2,0,0),newcomplit(x,y,7,2),outclause(); } @ Fortunately the |b| subroutine {\it can\/} be shared (since |x| is always odd), thus saving half of the sixteen clauses generated. @= void b(int x,int y) { register j,k,xx=x,y1=y-(y&2),y2=y+(y&2); if (have_b[x][y]!=tt+1) { d(xx,y1); e(xx,y2); for (j=0;j<3;j++) for (k=0;k<3;k++) if (j+k) { if (j) newcomplit(xx,y1,4,j); /* $\bar d_j$ */ if (k) newcomplit(xx,y2,5,k); /* $\bar e_k$ */ newlit(x,y,2,j+k); /* $b_{j+k}$ */ outclause(); if (j) newlit(xx,y1,4,3-j); /* $d_{3-j}$ */ if (k) newlit(xx,y2,5,3-k); /* $e_{3-k}$ */ newcomplit(x,y,2,5-j-k); /* $\bar b_{5-j-k}$ */ outclause(); } have_b[x][y]=tt+1; } } @ The (unshared) |c| subroutine handles the other four neighbors, by working with |f| and |g| instead of |d| and~|e|. If |y=0|, the overlap rules set |y1=-1|, which can be problematic. I've decided to avoid this case by omitting |f| when it is guaranteed to be zero. @= void c(int x,int y) { register j,k,x1,y1; if (x&1) x1=x+2,y1=(y-1)|1; else x1=x,y1=y&-2; g(x,y); if (x1-1xmax || y1+1ymax) @@; else { f(x1,y1); for (j=0;j<3;j++) for (k=0;k<3;k++) if (j+k) { if (j) newcomplit(x1,y1,6,j); /* $\bar f_j$ */ if (k) newcomplit(x,y,7,k); /* $\bar g_k$ */ newlit(x,y,3,j+k); /* $c_{j+k}$ */ outclause(); if (j) newlit(x1,y1,6,3-j); /* $f_{3-j}$ */ if (k) newlit(x,y,7,3-k); /* $g_{3-k}$ */ newcomplit(x,y,3,5-j-k); /* $\bar c_{5-j-k}$ */ outclause(); } } } @ @= { for (k=1;k<3;k++) { newcomplit(x,y,7,k),newlit(x,y,3,k),outclause(); /* $\bar g_k\lor c_k$ */ newlit(x,y,7,k),newcomplit(x,y,3,k),outclause(); /* $g_k\lor\bar c_k$ */ } newcomplit(x,y,3,3),outclause(); /* $\bar c_3$ */ newcomplit(x,y,3,4),outclause(); /* $\bar c_4$ */ } @ Totals over all eight neighbors are then deduced by the |a| subroutine. @= void a(int x,int y) { register j,k,xx=x|1; b(xx,y); c(x,y); for (j=0;j<5;j++) for (k=0;k<5;k++) if (j+k>1 && j+k<5) { if (j) newcomplit(xx,y,2,j); /* $\bar b_j$ */ if (k) newcomplit(x,y,3,k); /* $\bar c_k$ */ newlit(x,y,1,j+k); /* $a_{j+k}$ */ outclause(); } for (j=0;j<5;j++) for (k=0;k<5;k++) if (j+k>2 && j+k<6 && j*k) { if (j) newlit(xx,y,2,j); /* $b_j$ */ if (k) newlit(x,y,3,k); /* $c_k$ */ newcomplit(x,y,1,j+k-1); /* $\bar a_{j+k-1}$ */ outclause(); } } @ Finally, as mentioned at the beginning, $z'$ is determined from $z$, $a_2$, $a_3$, and $a_4$. I actually generate six clauses, not five, in order to stick to {\mc 3SAT}. @= void zprime(int x,int y) { newcomplit(x,y,1,4),applit(x,y,1,1),outclause(); /* $\bar a_4\bar z'$ */ newlit(x,y,1,2),applit(x,y,1,1),outclause(); /* $a_2\bar z'$ */ newlit(x,y,1,3),applit(x,y,0,0),applit(x,y,1,1),outclause(); /* $a_3z\bar z'$ */ newcomplit(x,y,1,3),newlit(x,y,1,4),applit(x,y,0,1),outclause(); /* $\bar a_3a_4z'$ */ applit(x,y,0,7),newcomplit(x,y,1,2),newlit(x,y,1,4),outclause(); /* $x\bar a_2a_4$ */ applit(x,y,1,7),applit(x,y,1,0),applit(x,y,0,1),outclause(); /* $\bar x\bar zz'$ */ } @*Index. ================================================ FILE: samples/Cabal Config/defaults.cabal ================================================ cabal-version: 2.4 name: linguist-sample version: 0.1.1.0 synopsis: Example of a Cabal configuration file for GitHub Linguist homepage: https://github.com/github/linguist -- A longer description of the package. -- description: license: ISC license-file: LICENSE author: Alhadis maintainer: foo@bar.com category: Language extra-source-files: CHANGELOG.md library build-depends: base ^>=4.11.1.0 hs-source-dirs: src default-language: Haskell2010 executable linguist-sample main-is: Main.hs build-depends: base ^>=4.11.1.0 hs-source-dirs: src default-language: Haskell2010 ================================================ FILE: samples/Cabal Config/filenames/cabal.config ================================================ constraints: DRBG ==0.5.4, HTTP ==4000.2.19, HUnit ==1.2.5.2, MissingH ==1.3.0.1, MonadRandom ==0.3.0.2, StateVar ==1.1.0.0, aeson ==0.7.0.4, ansi-terminal ==0.6.2.1, ansi-wl-pprint ==0.6.7.2, appar ==0.1.4, array ==0.4.0.1, attoparsec ==0.10.4.0, auto-update ==0.1.2.1, base ==4.6.0.1, base16-bytestring ==0.1.1.6, base64-bytestring ==1.0.0.1, bifunctors ==4.2.1, binary ==0.5.1.1, blaze-builder ==0.4.0.1, byteable ==0.1.1, byteorder ==1.0.4, bytestring ==0.10.0.2, bytestring-builder ==0.10.4.1.2, case-insensitive ==1.1.0.2, cereal ==0.4.1.1, cipher-aes ==0.2.10, cipher-aes128 ==0.6.4, comonad ==4.2.5, containers ==0.5.0.0, contravariant ==1.3.1, crypto-api ==0.13.2, crypto-cipher-types ==0.0.9, cryptohash ==0.11.6, cryptohash-cryptoapi ==0.1.3, data-default ==0.5.3, data-default-class ==0.0.1, data-default-instances-base ==0.0.1, data-default-instances-containers ==0.0.1, data-default-instances-dlist ==0.0.1, data-default-instances-old-locale ==0.0.1, deepseq ==1.3.0.1, directory ==1.2.0.1, distributive ==0.4.4, dlist ==0.7.1.1, easy-file ==0.2.0, either ==4.3.3.2, entropy ==0.3.6, exceptions ==0.8.0.2, fast-logger ==2.3.1, filepath ==1.3.0.1, free ==4.11, ghc-prim ==0.3.0.0, hashable ==1.2.1.0, hslogger ==1.2.8, http-date ==0.0.6, http-types ==0.8.6, integer-gmp ==0.5.0.0, iproute ==1.3.2, lifted-base ==0.2.3.6, mmorph ==1.0.4, monad-control ==1.0.0.4, mtl ==2.2.1, nats ==1, network ==2.6.0.2, network-uri ==2.6.0.1, old-locale ==1.0.0.5, old-time ==1.1.0.1, optparse-applicative ==0.11.0.2, parallel ==3.2.0.3, parsec ==3.1.9, prelude-extras ==0.4, pretty ==1.1.1.0, prettyclass ==1.0.0.0, primitive ==0.5.0.1, process ==1.1.0.2, profunctors ==4.4.1, random ==1.0.1.1, regex-base ==0.93.2, regex-compat ==0.95.1, regex-posix ==0.95.2, resourcet ==1.1.4.1, rts ==1.0, scientific ==0.2.0.2, scotty ==0.9.1, securemem ==0.1.7, semigroupoids ==4.3, semigroups ==0.16.2.2, simple-sendfile ==0.2.18, split ==0.2.2, stm ==2.4.2, streaming-commons ==0.1.10.0, stringsearch ==0.3.6.6, syb ==0.4.0, system-fileio ==0.3.16.2, system-filepath ==0.4.13.2, tagged ==0.7.3, template-haskell ==2.8.0.0, temporary ==1.2.0.3, text ==0.11.3.1, time ==1.4.0.1, transformers ==0.4.3.0, transformers-base ==0.4.4, transformers-compat ==0.4.0.4, unix ==2.6.0.1, unix-compat ==0.4.1.4, unix-time ==0.3.5, unordered-containers ==0.2.3.0, vault ==0.3.0.4, vector ==0.10.0.1, void ==0.7, wai ==3.0.2.3, wai-extra ==3.0.5, wai-logger ==2.2.4, wai-middleware-static ==0.6.0.1, warp ==3.0.10.1, word8 ==0.1.2, zlib ==0.5.4.1 ================================================ FILE: samples/Cabal Config/filenames/cabal.project ================================================ flags: -overloaded-methods -overloaded-signals -overloaded-properties optional-packages: * -- Needed for ios -- package reflex -- flags: -use-template-haskell -- package reflex-dom-core -- flags: -use-template-haskell -- package wai-websockets -- flags: -example -- package semigroupoids -- flags: -doctests -- package text -- flags: +integer-simple -- package scientific -- flags: +integer-simple -- package hashable -- flags: -integer-gmp package gi-atk flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-cairo flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gdk flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gdkpixbuf flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gio flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-glib flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gobject flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gtk flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gtk-hs flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gtkosxapplication flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-gtksource flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-javascriptcore flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-pango flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-pangocairo flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-soup flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-webkit flags: -overloaded-methods -overloaded-signals -overloaded-properties package gi-webkit2 flags: -overloaded-methods -overloaded-signals -overloaded-properties ================================================ FILE: samples/Cabal Config/line2pdf.cabal ================================================ name: line2pdf version: 0.0.7 copyright: 2008 Audrey Tang license: BSD3 license-file: LICENSE author: Audrey Tang maintainer: Audrey Tang synopsis: Simple command-line utility to convert text into PDF description: Simple command-line utility to convert text into PDF stability: experimental build-type: Simple cabal-version: >= 1.2 category: Text extra-source-files: README flag small_base description: Choose the new smaller, split-up base package. library exposed-modules: Text.LineToPDF Text.LineToPDF.Internals extensions: ImplicitParams, ExistentialQuantification if flag(small_base) build-depends: base >= 3, containers, bytestring else build-depends: base < 3 hs-source-dirs: src executable line2pdf main-is: line2pdf.hs extensions: ImplicitParams, ExistentialQuantification if flag(small_base) build-depends: base >= 3, containers, bytestring else build-depends: base < 3 hs-source-dirs: . src ================================================ FILE: samples/Caddyfile/acmeserver.Caddyfile ================================================ { pki { ca internal { name "Internal" root_cn "Internal Root Cert" intermediate_cn "Internal Intermediate Cert" } ca internal-long-lived { name "Long-lived" root_cn "Internal Root Cert 2" intermediate_cn "Internal Intermediate Cert 2" } } } acme-internal.example.com { acme_server { ca internal } } acme-long-lived.example.com { acme_server { ca internal-long-lived lifetime 7d } } ================================================ FILE: samples/Caddyfile/reverseproxy.caddyfile ================================================ :8884 reverse_proxy 127.0.0.1:65535 { @500 status 500 replace_status @500 400 @all status 2xx 3xx 4xx 5xx replace_status @all {http.error.status_code} replace_status {http.error.status_code} @accel header X-Accel-Redirect * handle_response @accel { respond "Header X-Accel-Redirect!" } @another { header X-Another * } handle_response @another { respond "Header X-Another!" } @401 status 401 handle_response @401 { respond "Status 401!" } handle_response { respond "Any! This should be last in the JSON!" } @403 { status 403 } handle_response @403 { respond "Status 403!" } @multi { status 401 403 status 404 header Foo * header Bar * } handle_response @multi { respond "Headers Foo, Bar AND statuses 401, 403 and 404!" } @200 status 200 handle_response @200 { copy_response_headers { include Foo Bar } respond "Copied headers from the response" } @201 status 201 handle_response @201 { header Foo "Copying the response" copy_response 404 } } ================================================ FILE: samples/Cadence/FlowFees.cdc ================================================ import FungibleToken from 0xFUNGIBLETOKENADDRESS import FlowToken from 0xFLOWTOKENADDRESS pub contract FlowFees { // Event that is emitted when tokens are deposited to the fee vault pub event TokensDeposited(amount: UFix64) // Event that is emitted when tokens are withdrawn from the fee vault pub event TokensWithdrawn(amount: UFix64) // Event that is emitted when fees are deducted pub event FeesDeducted(amount: UFix64, inclusionEffort: UFix64, executionEffort: UFix64) // Event that is emitted when fee parameters change pub event FeeParametersChanged(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64) // Private vault with public deposit function access(self) var vault: @FlowToken.Vault pub fun deposit(from: @FungibleToken.Vault) { let from <- from as! @FlowToken.Vault let balance = from.balance self.vault.deposit(from: <-from) emit TokensDeposited(amount: balance) } /// Get the balance of the Fees Vault pub fun getFeeBalance(): UFix64 { return self.vault.balance } pub resource Administrator { // withdraw // // Allows the administrator to withdraw tokens from the fee vault pub fun withdrawTokensFromFeeVault(amount: UFix64): @FungibleToken.Vault { let vault <- FlowFees.vault.withdraw(amount: amount) emit TokensWithdrawn(amount: amount) return <-vault } /// Allows the administrator to change all the fee parameters at once pub fun setFeeParameters(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64) { let newParameters = FeeParameters(surgeFactor: surgeFactor, inclusionEffortCost: inclusionEffortCost, executionEffortCost: executionEffortCost) FlowFees.setFeeParameters(newParameters) } /// Allows the administrator to change the fee surge factor pub fun setFeeSurgeFactor(_ surgeFactor: UFix64) { let oldParameters = FlowFees.getFeeParameters() let newParameters = FeeParameters(surgeFactor: surgeFactor, inclusionEffortCost: oldParameters.inclusionEffortCost, executionEffortCost: oldParameters.executionEffortCost) FlowFees.setFeeParameters(newParameters) } } /// A struct holding the fee parameters needed to calculate the fees pub struct FeeParameters { /// The surge factor is used to make transaction fees respond to high loads on the network pub var surgeFactor: UFix64 /// The FLOW cost of one unit of inclusion effort. The FVM is responsible for metering inclusion effort. pub var inclusionEffortCost: UFix64 /// The FLOW cost of one unit of execution effort. The FVM is responsible for metering execution effort. pub var executionEffortCost: UFix64 init(surgeFactor: UFix64, inclusionEffortCost: UFix64, executionEffortCost: UFix64){ self.surgeFactor = surgeFactor self.inclusionEffortCost = inclusionEffortCost self.executionEffortCost = executionEffortCost } } /// Called when a transaction is submitted to deduct the fee /// from the AuthAccount that submitted it pub fun deductTransactionFee(_ acct: AuthAccount, inclusionEffort: UFix64, executionEffort: UFix64) { var feeAmount = self.computeFees(inclusionEffort: inclusionEffort, executionEffort: executionEffort) if feeAmount == UFix64(0) { // If there are no fees to deduct, do not continue, // so that there are no unnecessarily emitted events return } let tokenVault = acct.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault) ?? panic("Unable to borrow reference to the default token vault") if feeAmount > tokenVault.balance { // In the future this code path will never be reached, // as payers that are under account minimum balance will not have their transactions included in a collection // // Currently this is not used to fail the transaction (as that is the responsibility of the minimum account balance logic), // But is used to reduce the balance of the vault to 0.0, if the vault has less available balance than the transaction fees. feeAmount = tokenVault.balance } let feeVault <- tokenVault.withdraw(amount: feeAmount) self.vault.deposit(from: <-feeVault) // The fee calculation can be reconstructed using the data from this event and the FeeParameters at the block when the event happened emit FeesDeducted(amount: feeAmount, inclusionEffort: inclusionEffort, executionEffort: executionEffort) } pub fun getFeeParameters(): FeeParameters { return self.account.copy(from: /storage/FlowTxFeeParameters) ?? panic("Error getting tx fee parameters. They need to be initialized first!") } access(self) fun setFeeParameters(_ feeParameters: FeeParameters) { // empty storage before writing new FeeParameters to it self.account.load(from: /storage/FlowTxFeeParameters) self.account.save(feeParameters,to: /storage/FlowTxFeeParameters) emit FeeParametersChanged(surgeFactor: feeParameters.surgeFactor, inclusionEffortCost: feeParameters.inclusionEffortCost, executionEffortCost: feeParameters.executionEffortCost) } // compute the transaction fees with the current fee parameters and the given inclusionEffort and executionEffort pub fun computeFees(inclusionEffort: UFix64, executionEffort: UFix64): UFix64 { let params = self.getFeeParameters() let totalFees = params.surgeFactor * ( inclusionEffort * params.inclusionEffortCost + executionEffort * params.executionEffortCost ) return totalFees } init(adminAccount: AuthAccount) { // Create a new FlowToken Vault and save it in storage self.vault <- FlowToken.createEmptyVault() as! @FlowToken.Vault let admin <- create Administrator() adminAccount.save(<-admin, to: /storage/flowFeesAdmin) } } ================================================ FILE: samples/Cadence/FlowToken.cdc ================================================ import FungibleToken from 0xFUNGIBLETOKENADDRESS pub contract FlowToken: FungibleToken { // Total supply of Flow tokens in existence pub var totalSupply: UFix64 // Event that is emitted when the contract is created pub event TokensInitialized(initialSupply: UFix64) // Event that is emitted when tokens are withdrawn from a Vault pub event TokensWithdrawn(amount: UFix64, from: Address?) // Event that is emitted when tokens are deposited to a Vault pub event TokensDeposited(amount: UFix64, to: Address?) // Event that is emitted when new tokens are minted pub event TokensMinted(amount: UFix64) // Event that is emitted when tokens are destroyed pub event TokensBurned(amount: UFix64) // Event that is emitted when a new minter resource is created pub event MinterCreated(allowedAmount: UFix64) // Event that is emitted when a new burner resource is created pub event BurnerCreated() // Vault // // Each user stores an instance of only the Vault in their storage // The functions in the Vault and governed by the pre and post conditions // in FungibleToken when they are called. // The checks happen at runtime whenever a function is called. // // Resources can only be created in the context of the contract that they // are defined in, so there is no way for a malicious user to create Vaults // out of thin air. A special Minter resource needs to be defined to mint // new tokens. // pub resource Vault: FungibleToken.Provider, FungibleToken.Receiver, FungibleToken.Balance { // holds the balance of a users tokens pub var balance: UFix64 // initialize the balance at resource creation time init(balance: UFix64) { self.balance = balance } // withdraw // // Function that takes an integer amount as an argument // and withdraws that amount from the Vault. // It creates a new temporary Vault that is used to hold // the money that is being transferred. It returns the newly // created Vault to the context that called so it can be deposited // elsewhere. // pub fun withdraw(amount: UFix64): @FungibleToken.Vault { self.balance = self.balance - amount emit TokensWithdrawn(amount: amount, from: self.owner?.address) return <-create Vault(balance: amount) } // deposit // // Function that takes a Vault object as an argument and adds // its balance to the balance of the owners Vault. // It is allowed to destroy the sent Vault because the Vault // was a temporary holder of the tokens. The Vault's balance has // been consumed and therefore can be destroyed. pub fun deposit(from: @FungibleToken.Vault) { let vault <- from as! @FlowToken.Vault self.balance = self.balance + vault.balance emit TokensDeposited(amount: vault.balance, to: self.owner?.address) vault.balance = 0.0 destroy vault } destroy() { FlowToken.totalSupply = FlowToken.totalSupply - self.balance } } // createEmptyVault // // Function that creates a new Vault with a balance of zero // and returns it to the calling context. A user must call this function // and store the returned Vault in their storage in order to allow their // account to be able to receive deposits of this token type. // pub fun createEmptyVault(): @FungibleToken.Vault { return <-create Vault(balance: 0.0) } pub resource Administrator { // createNewMinter // // Function that creates and returns a new minter resource // pub fun createNewMinter(allowedAmount: UFix64): @Minter { emit MinterCreated(allowedAmount: allowedAmount) return <-create Minter(allowedAmount: allowedAmount) } // createNewBurner // // Function that creates and returns a new burner resource // pub fun createNewBurner(): @Burner { emit BurnerCreated() return <-create Burner() } } // Minter // // Resource object that token admin accounts can hold to mint new tokens. // pub resource Minter { // the amount of tokens that the minter is allowed to mint pub var allowedAmount: UFix64 // mintTokens // // Function that mints new tokens, adds them to the total supply, // and returns them to the calling context. // pub fun mintTokens(amount: UFix64): @FlowToken.Vault { pre { amount > UFix64(0): "Amount minted must be greater than zero" amount <= self.allowedAmount: "Amount minted must be less than the allowed amount" } FlowToken.totalSupply = FlowToken.totalSupply + amount self.allowedAmount = self.allowedAmount - amount emit TokensMinted(amount: amount) return <-create Vault(balance: amount) } init(allowedAmount: UFix64) { self.allowedAmount = allowedAmount } } // Burner // // Resource object that token admin accounts can hold to burn tokens. // pub resource Burner { // burnTokens // // Function that destroys a Vault instance, effectively burning the tokens. // // Note: the burned tokens are automatically subtracted from the // total supply in the Vault destructor. // pub fun burnTokens(from: @FungibleToken.Vault) { let vault <- from as! @FlowToken.Vault let amount = vault.balance destroy vault emit TokensBurned(amount: amount) } } init(adminAccount: AuthAccount) { self.totalSupply = 0.0 // Create the Vault with the total supply of tokens and save it in storage // let vault <- create Vault(balance: self.totalSupply) adminAccount.save(<-vault, to: /storage/flowTokenVault) // Create a public capability to the stored Vault that only exposes // the `deposit` method through the `Receiver` interface // adminAccount.link<&FlowToken.Vault{FungibleToken.Receiver}>( /public/flowTokenReceiver, target: /storage/flowTokenVault ) // Create a public capability to the stored Vault that only exposes // the `balance` field through the `Balance` interface // adminAccount.link<&FlowToken.Vault{FungibleToken.Balance}>( /public/flowTokenBalance, target: /storage/flowTokenVault ) let admin <- create Administrator() adminAccount.save(<-admin, to: /storage/flowTokenAdmin) // Emit an event that shows that the contract was initialized emit TokensInitialized(initialSupply: self.totalSupply) } } ================================================ FILE: samples/Cadence/get_balance.cdc ================================================ // This script reads the balance field of an account's FlowToken Balance import FungibleToken from 0xFUNGIBLETOKENADDRESS import FlowToken from 0xFLOWTOKENADDRESS pub fun main(account: Address): UFix64 { let vaultRef = getAccount(account) .getCapability(/public/flowTokenBalance) .borrow<&FlowToken.Vault{FungibleToken.Balance}>() ?? panic("Could not borrow Balance reference to the Vault") return vaultRef.balance } ================================================ FILE: samples/Cadence/mint_tokens.cdc ================================================ import FungibleToken from 0xFUNGIBLETOKENADDRESS import FlowToken from 0xTOKENADDRESS transaction(recipient: Address, amount: UFix64) { let tokenAdmin: &FlowToken.Administrator let tokenReceiver: &{FungibleToken.Receiver} prepare(signer: AuthAccount) { self.tokenAdmin = signer .borrow<&FlowToken.Administrator>(from: /storage/flowTokenAdmin) ?? panic("Signer is not the token admin") self.tokenReceiver = getAccount(recipient) .getCapability(/public/flowTokenReceiver) .borrow<&{FungibleToken.Receiver}>() ?? panic("Unable to borrow receiver reference") } execute { let minter <- self.tokenAdmin.createNewMinter(allowedAmount: amount) let mintedVault <- minter.mintTokens(amount: amount) self.tokenReceiver.deposit(from: <-mintedVault) destroy minter } } ================================================ FILE: samples/Cadence/read_profile.cdc ================================================ import Profile from 0xProfile pub fun main(address: Address): Profile.ReadOnly? { return Profile.read(address) } ================================================ FILE: samples/Cadence/setup_account.cdc ================================================ // This transaction is a template for a transaction // to add a Vault resource to their account // so that they can use the flowToken import FungibleToken from 0xFUNGIBLETOKENADDRESS import FlowToken from 0xTOKENADDRESS transaction { prepare(signer: AuthAccount) { if signer.borrow<&FlowToken.Vault>(from: /storage/flowTokenVault) == nil { // Create a new flowToken Vault and put it in storage signer.save(<-FlowToken.createEmptyVault(), to: /storage/flowTokenVault) // Create a public capability to the Vault that only exposes // the deposit function through the Receiver interface signer.link<&FlowToken.Vault{FungibleToken.Receiver}>( /public/flowTokenReceiver, target: /storage/flowTokenVault ) // Create a public capability to the Vault that only exposes // the balance field through the Balance interface signer.link<&FlowToken.Vault{FungibleToken.Balance}>( /public/flowTokenBalance, target: /storage/flowTokenVault ) } } } ================================================ FILE: samples/Cairo/boolean.cairo ================================================ #[generate_trait] pub impl BoolImpl> of BoolTrait { /// Returns `Some(t)` if the `bool` is `true`, or `None` otherwise. /// /// # Examples /// /// ``` /// assert!(false.then_some(0) == Option::None); /// assert!(true.then_some(0) == Option::Some(0)); /// ``` #[inline(always)] fn then_some(self: bool, t: T) -> Option nopanic { if self { Option::Some(t) } else { Option::None } } } ================================================ FILE: samples/Cairo/cust_struct_vect.cairo ================================================ use core::dict::Felt252DictTrait; use core::nullable::{match_nullable, FromNullableResult, NullableTrait}; use core::integer; trait VecTrait { fn new() -> V; fn get(ref self: V, index: usize) -> Option; fn at(ref self: V, index: usize) -> T; fn push(ref self: V, value: T) -> (); fn set(ref self: V, index: usize, value: T); fn len(self: @V) -> usize; } struct NullableVec { data: Felt252Dict>, len: usize } impl DestructNullableVec> of Destruct> { fn destruct(self: NullableVec) nopanic { self.data.squash(); } } impl NullableVecImpl, +Copy> of VecTrait, T> { fn new() -> NullableVec { NullableVec { data: Default::default(), len: 0 } } fn get(ref self: NullableVec, index: usize) -> Option { if index < self.len() { Option::Some(self.data.get(index.into()).deref()) } else { Option::None } } fn at(ref self: NullableVec, index: usize) -> T { assert!(index < self.len(), "Index out of bounds"); self.data.get(index.into()).deref() } fn push(ref self: NullableVec, value: T) -> () { self.data.insert(self.len.into(), NullableTrait::new(value)); self.len = core::integer::u32_wrapping_add(self.len, 1_usize); } fn set(ref self: NullableVec, index: usize, value: T) { assert!(index < self.len(), "Index out of bounds"); self.data.insert(index.into(), NullableTrait::new(value)); } fn len(self: @NullableVec) -> usize { *self.len } } ================================================ FILE: samples/Cairo/merkle_tree_test.cairo ================================================ // Internal imports use alexandria_merkle_tree::merkle_tree::{ Hasher, MerkleTree, pedersen::PedersenHasherImpl, poseidon::PoseidonHasherImpl, MerkleTreeTrait, MerkleTreeImpl }; mod regular_call_merkle_tree_pedersen { // Internal imports use alexandria_merkle_tree::merkle_tree::{ Hasher, MerkleTree, pedersen::PedersenHasherImpl, MerkleTreeTrait, }; #[test] #[available_gas(2000000)] fn regular_call_merkle_tree_pedersen_test() { // [Setup] Merkle tree. let mut merkle_tree: MerkleTree = MerkleTreeTrait::new(); let root = 0x15ac9e457789ef0c56e5d559809e7336a909c14ee2511503fa7af69be1ba639; let leaf = 0x1; let valid_proof = array![ 0x2, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc ] .span(); let leaves = array![0x1, 0x2, 0x3]; // [Assert] Compute merkle root. let computed_root = merkle_tree.compute_root(leaf, valid_proof); assert_eq!(computed_root, root, "compute valid root failed"); // [Assert] Compute merkle proof. let mut input_leaves = leaves; let index = 0; let computed_proof = merkle_tree.compute_proof(input_leaves, index); assert_eq!(computed_proof, valid_proof, "compute valid proof failed"); // [Assert] Verify a valid proof. let result = merkle_tree.verify(root, leaf, valid_proof); assert!(result, "verify valid proof failed"); // [Assert] Verify an invalid proof. let invalid_proof = array![ 0x2 + 1, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc ] .span(); let result = merkle_tree.verify(root, leaf, invalid_proof); assert!(!result, "verify invalid proof failed"); // [Assert] Verify a valid proof with an invalid leaf. let invalid_leaf = 0x1 + 1; let result = merkle_tree.verify(root, invalid_leaf, valid_proof); assert!(!result, "wrong result"); } } #[test] #[available_gas(2000000)] fn merkle_tree_pedersen_test() { // [Setup] Merkle tree. let mut merkle_tree: MerkleTree = MerkleTreeImpl::<_, PedersenHasherImpl>::new(); let root = 0x15ac9e457789ef0c56e5d559809e7336a909c14ee2511503fa7af69be1ba639; let leaf = 0x1; let valid_proof = array![0x2, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc] .span(); let leaves = array![0x1, 0x2, 0x3]; // [Assert] Compute merkle root. let computed_root = MerkleTreeImpl::< _, PedersenHasherImpl >::compute_root(ref merkle_tree, leaf, valid_proof); assert_eq!(computed_root, root, "compute valid root failed"); // [Assert] Compute merkle proof. let mut input_leaves = leaves; let index = 0; let computed_proof = MerkleTreeImpl::< _, PedersenHasherImpl >::compute_proof(ref merkle_tree, input_leaves, index); assert_eq!(computed_proof, valid_proof, "compute valid proof failed"); // [Assert] Verify a valid proof. let result = MerkleTreeImpl::< _, PedersenHasherImpl >::verify(ref merkle_tree, root, leaf, valid_proof); assert!(result, "verify valid proof failed"); // [Assert] Verify an invalid proof. let invalid_proof = array![ 0x2 + 1, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc ] .span(); let result = MerkleTreeImpl::< _, PedersenHasherImpl >::verify(ref merkle_tree, root, leaf, invalid_proof); assert!(!result, "verify invalid proof failed"); // [Assert] Verify a valid proof with an invalid leaf. let invalid_leaf = 0x1 + 1; let result = MerkleTreeImpl::< _, PedersenHasherImpl >::verify(ref merkle_tree, root, invalid_leaf, valid_proof); assert!(!result, "wrong result"); } #[test] #[available_gas(50000000000)] fn merkle_tree_poseidon_test() { // [Setup] Merkle tree. let mut merkle_tree: MerkleTree = MerkleTreeImpl::<_, PoseidonHasherImpl>::new(); let root = 0x48924a3b2a7a7b7cc1c9371357e95e322899880a6534bdfe24e96a828b9d780; let leaf = 0x1; let valid_proof = array![0x2, 0x338eb608d7e48306d01f5a8d4275dd85a52ba79aaf7a1a7b35808ba573c3669] .span(); let leaves = array![0x1, 0x2, 0x3]; // [Assert] Compute merkle root. let computed_root = MerkleTreeImpl::< _, PoseidonHasherImpl >::compute_root(ref merkle_tree, leaf, valid_proof); assert_eq!(computed_root, root, "compute valid root failed"); // [Assert] Compute merkle proof. let mut input_leaves = leaves; let index = 0; let computed_proof = MerkleTreeImpl::< _, PoseidonHasherImpl >::compute_proof(ref merkle_tree, input_leaves, index); assert_eq!(computed_proof, valid_proof, "compute valid proof failed"); // [Assert] Verify a valid proof. let result = MerkleTreeImpl::< _, PoseidonHasherImpl >::verify(ref merkle_tree, root, leaf, valid_proof); assert!(result, "verify valid proof failed"); // [Assert] Verify an invalid proof. let invalid_proof = array![ 0x2 + 1, 0x68ba2a188dd231112c1cb5aaa5d18be6d84f6c8683e5c3a6638dee83e727acc ] .span(); let result = MerkleTreeImpl::< _, PoseidonHasherImpl >::verify(ref merkle_tree, root, leaf, invalid_proof); assert!(!result, "verify invalid proof failed"); // [Assert] Verify a valid proof with an invalid leaf. let invalid_leaf = 0x1 + 1; let result = MerkleTreeImpl::< _, PoseidonHasherImpl >::verify(ref merkle_tree, root, invalid_leaf, valid_proof); assert!(!result, "wrong result"); } ================================================ FILE: samples/Cairo/pizza_factory.cairo ================================================ use starknet::ContractAddress; #[starknet::interface] pub trait IPizzaFactory { fn increase_pepperoni(ref self: TContractState, amount: u32); fn increase_pineapple(ref self: TContractState, amount: u32); fn get_owner(self: @TContractState) -> ContractAddress; fn change_owner(ref self: TContractState, new_owner: ContractAddress); fn make_pizza(ref self: TContractState); fn count_pizza(self: @TContractState) -> u32; } #[starknet::contract] pub mod PizzaFactory { use super::IPizzaFactory; use starknet::ContractAddress; use starknet::get_caller_address; #[storage] pub struct Storage { pepperoni: u32, pineapple: u32, owner: ContractAddress, pizzas: u32 } #[constructor] fn constructor(ref self: ContractState, owner: ContractAddress) { self.pepperoni.write(10); self.pineapple.write(10); self.owner.write(owner); } #[event] #[derive(Drop, starknet::Event)] pub enum Event { PizzaEmission: PizzaEmission } #[derive(Drop, starknet::Event)] pub struct PizzaEmission { pub counter: u32 } #[abi(embed_v0)] impl PizzaFactoryimpl of super::IPizzaFactory { fn increase_pepperoni(ref self: ContractState, amount: u32) { assert!(amount != 0, "Amount cannot be 0"); self.pepperoni.write(self.pepperoni.read() + amount); } fn increase_pineapple(ref self: ContractState, amount: u32) { assert!(amount != 0, "Amount cannot be 0"); self.pineapple.write(self.pineapple.read() + amount); } fn make_pizza(ref self: ContractState) { assert!(self.pepperoni.read() > 0, "Not enough pepperoni"); assert!(self.pineapple.read() > 0, "Not enough pineapple"); let caller: ContractAddress = get_caller_address(); let owner: ContractAddress = self.get_owner(); assert!(caller == owner, "Only the owner can make pizza"); self.pepperoni.write(self.pepperoni.read() - 1); self.pineapple.write(self.pineapple.read() - 1); self.pizzas.write(self.pizzas.read() + 1); self.emit(PizzaEmission { counter: self.pizzas.read() }); } fn get_owner(self: @ContractState) -> ContractAddress { self.owner.read() } fn change_owner(ref self: ContractState, new_owner: ContractAddress) { self.set_owner(new_owner); } fn count_pizza(self: @ContractState) -> u32 { self.pizzas.read() } } #[generate_trait] pub impl InternalImpl of InternalTrait { fn set_owner(ref self: ContractState, new_owner: ContractAddress) { let caller: ContractAddress = get_caller_address(); assert!(caller == self.get_owner(), "Only the owner can set ownership"); self.owner.write(new_owner); } } } ================================================ FILE: samples/Cairo/rlp.cairo ================================================ use cairo_lib::utils::types::words64::{Words64, Words64Trait, reverse_endianness_u64, pow2}; use cairo_lib::utils::types::byte::Byte; use cairo_lib::utils::array::span_contains; // @notice Enum with all possible RLP types // For more info: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ #[derive(Drop, PartialEq)] enum RLPType { String: (), StringShort: (), StringLong: (), ListShort: (), ListLong: (), } #[generate_trait] impl RLPTypeImpl of RLPTypeTrait { // @notice Returns RLPType from the leading byte // For more info: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ // @param byte Leading byte // @return Result with RLPType fn from_byte(byte: Byte) -> Result { if byte <= 0x7f { Result::Ok(RLPType::String(())) } else if byte <= 0xb7 { Result::Ok(RLPType::StringShort(())) } else if byte <= 0xbf { Result::Ok(RLPType::StringLong(())) } else if byte <= 0xf7 { Result::Ok(RLPType::ListShort(())) } else if byte <= 0xff { Result::Ok(RLPType::ListLong(())) } else { Result::Err('Invalid byte') } } } // @notice Represent a RLP item #[derive(Drop, PartialEq)] enum RLPItem { Bytes: (Words64, usize), // Should be Span to allow for any depth/recursion, not yet supported by the compiler List: Span<(Words64, usize)> } // @notice RLP decodes a rlp encoded byte array // For more info: https://ethereum.org/en/developers/docs/data-structures-and-encoding/rlp/ // @param input RLP encoded input, in little endian 64 bits words // @return Result with RLPItem and size of the encoded item fn rlp_decode(input: Words64) -> Result<(RLPItem, usize), felt252> { // It's guaranteed to fid in 32 bits, as we are masking with 0xff let prefix: u32 = (*input.at(0) & 0xff).try_into().unwrap(); // It's guaranteed to be a valid RLPType, as we are masking with 0xff let rlp_type = RLPTypeTrait::from_byte(prefix.try_into().unwrap()).unwrap(); match rlp_type { RLPType::String(()) => { let mut arr = array![prefix.into()]; Result::Ok((RLPItem::Bytes((arr.span(), 1)), 1)) }, RLPType::StringShort(()) => { let len = prefix.into() - 0x80; let res = input.slice_le(6, len); Result::Ok((RLPItem::Bytes((res, len)), 1 + len)) }, RLPType::StringLong(()) => { let len_len = prefix - 0xb7; let len_span = input.slice_le(6, len_len); // Enough to store 4.29 GB (fits in u32) assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big'); // len fits in 32 bits, confirmed by previous assertion let len: u32 = reverse_endianness_u64(*len_span.at(0), Option::Some(len_len.into())) .try_into() .unwrap(); let res = input.slice_le(6 - len_len, len); Result::Ok((RLPItem::Bytes((res, len)), 1 + len_len + len)) }, RLPType::ListShort(()) => { let mut len = prefix - 0xc0; let mut in = input.slice_le(6, len); let res = rlp_decode_list(ref in, len)?; Result::Ok((RLPItem::List(res), 1 + len)) }, RLPType::ListLong(()) => { let len_len = prefix - 0xf7; let len_span = input.slice_le(6, len_len); // Enough to store 4.29 GB (fits in u32) assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big'); // len fits in 32 bits, confirmed by previous assertion let len: u32 = reverse_endianness_u64(*len_span.at(0), Option::Some(len_len.into())) .try_into() .unwrap(); let mut in = input.slice_le(6 - len_len, len); let res = rlp_decode_list(ref in, len)?; Result::Ok((RLPItem::List(res), 1 + len_len + len)) } } } // @notice RLP decodes into RLPItem::List // @param input RLP encoded input, in little endian 64 bits words // @param len Length of the input // @return Result with a span of the decoded items and the decoded size of each fn rlp_decode_list(ref input: Words64, len: usize) -> Result, felt252> { let mut i = 0; let mut output = ArrayTrait::new(); let mut total_len = len; loop { if i >= len { break Result::Ok(output.span()); } let (decoded, decoded_len) = match rlp_decode(input) { Result::Ok((d, dl)) => (d, dl), Result::Err(e) => { break Result::Err(e); } }; match decoded { RLPItem::Bytes(b) => { output.append(b); let word = decoded_len / 8; let reversed = 7 - (decoded_len % 8); let next_start = word * 8 + reversed; if (total_len - decoded_len != 0) { input = input.slice_le(next_start, total_len - decoded_len); } total_len -= decoded_len; }, RLPItem::List(_) => { panic_with_felt252('Recursive list not supported'); } } i += decoded_len; } } fn rlp_decode_list_lazy(input: Words64, lazy: Span) -> Result<(RLPItem, usize), felt252> { let mut output = ArrayTrait::new(); let mut lazy_index = 0; let list_prefix: u32 = (*input.at(0) & 0xff).try_into().unwrap(); let list_type = RLPTypeTrait::from_byte(list_prefix.try_into().unwrap()).unwrap(); let (mut current_input_index, len) = match list_type { RLPType::String(()) => { return Result::Err('Not a list'); }, RLPType::StringShort(()) => { return Result::Err('Not a list'); }, RLPType::StringLong(()) => { return Result::Err('Not a list'); }, RLPType::ListShort(()) => (1, list_prefix - 0xc0), RLPType::ListLong(()) => { let len_len = list_prefix - 0xf7; let len_span = input.slice_le(6, len_len); // Enough to store 4.29 GB (fits in u32) assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big'); // len fits in 32 bits, confirmed by previous assertion let len = reverse_endianness_u64(*len_span.at(0), Option::Some(len_len.into())) .try_into() .unwrap(); (1 + len_len, len) } }; let rlp_byte_len = current_input_index + len; loop { if output.len() == lazy.len() { break Result::Ok((RLPItem::List(output.span()), rlp_byte_len)); } if current_input_index >= rlp_byte_len { break Result::Err('Too many items to decode'); } let current_word = current_input_index / 8; let pow2_shift = pow2((current_input_index % 8) * 8); let prefix = (*input.at(current_word) / pow2_shift) & 0xff; let rlp_type = RLPTypeTrait::from_byte(prefix.try_into().unwrap()).unwrap(); let (item_start_skip, item_len) = match rlp_type { RLPType::String(()) => { (0, 1) }, RLPType::StringShort(()) => { let len = prefix - 0x80; (1, len) }, RLPType::StringLong(()) => { let len_len = prefix - 0xb7; let current_word = (current_input_index + 1) / 8; let current_word_offset = 7 - ((current_input_index + 1) % 8); let len_span = input .slice_le(current_word * 8 + current_word_offset, len_len.try_into().unwrap()); // Enough to store 4.29 GB (fits in u32) assert(len_span.len() == 1 && *len_span.at(0) <= 0xffffffff, 'Len of len too big'); // len fits in 32 bits, confirmed by previous assertion let len: u32 = reverse_endianness_u64( *len_span.at(0), Option::Some(len_len.try_into().unwrap()) ) .try_into() .unwrap(); (1 + len_len, len.into()) }, RLPType::ListShort(()) => { panic_with_felt252('Recursive list not supported') }, RLPType::ListLong(()) => { panic_with_felt252('Recursive list not supported') } }; current_input_index += item_start_skip.try_into().unwrap(); if span_contains(lazy, lazy_index) { let current_word = current_input_index / 8; let current_word_offset = 7 - (current_input_index % 8); let start = current_word * 8 + current_word_offset; let item_len = item_len.try_into().unwrap(); let decoded = input.slice_le(start, item_len); output.append((decoded, item_len)); } current_input_index += item_len.try_into().unwrap(); lazy_index += 1; } } ================================================ FILE: samples/Cairo Zero/casm.cairo ================================================ jmp rel 4 if [fp + -3] != 0; [ap + 0] = [fp + -5], ap++; ret; [ap + 0] = [fp + -4], ap++; [ap + 0] = [fp + -5] + [fp + -4], ap++; [fp + -3] = [ap + 0] + 1, ap++; call rel -8; ret; ================================================ FILE: samples/Cairo Zero/concat_arr.cairo ================================================ from starkware.cairo.common.memcpy import memcpy from starkware.cairo.common.alloc import alloc func concat_arr{range_check_ptr}( acc: felt*, acc_len: felt, arr: felt*, arr_len: felt ) -> (res: felt*, res_len: felt): alloc_locals let (local acc_cpy: felt*) = alloc() memcpy(acc_cpy, acc, acc_len) memcpy(acc_cpy + acc_len, arr, arr_len) return (acc_cpy, acc_len + arr_len) end ================================================ FILE: samples/Cairo Zero/contract.cairo ================================================ # Declare this file as a StarkNet contract and set the required # builtins. %lang starknet %builtins pedersen range_check ecdsa from starkware.cairo.common.cairo_builtins import HashBuiltin from starkware.cairo.common.hash import hash2 from starkware.cairo.common.math import assert_lt_felt from starkware.starknet.common.storage import Storage from starkware.cairo.common.cairo_builtins import SignatureBuiltin from starkware.cairo.common.signature import verify_ecdsa_signature from starkware.cairo.common.alloc import alloc # Phases: # * 0 - coordinator initializes # * 1 - users send drop commitments and coordinator disables sending # * 2 - coordinator submits key # * 3 - users cast votes # * 4 - voting period ends @storage_var func coordinator() -> (res : felt): end @storage_var func phase() -> (res : felt): end @storage_var func ayes() -> (res : felt): end @storage_var func nays() -> (res : felt): end @storage_var func commitments(user : felt) -> (res : felt): end @storage_var func voprf_key() -> (res : felt): end @storage_var func paid(user : felt) -> (res : felt): end @storage_var func voprf_key_bits(bit : felt) -> (res : felt): end @external func initialize{storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr}(user : felt): let (current_phase) = phase.read() assert current_phase = 0 phase.write(1) coordinator.write(user) return () end @external func commit{ storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*, range_check_ptr}(user : felt, commitment : felt, sig_r : felt, sig_s : felt): let (current_phase) = phase.read() assert current_phase = 1 verify_ecdsa_signature( message=commitment, public_key=user, signature_r=sig_r, signature_s=sig_s) commitments.write(user, commitment) return () end @external func end_commitment_phase{ storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*, range_check_ptr}(sig_r : felt, sig_s : felt): let (current_phase) = phase.read() assert current_phase = 1 let (the_coordinator) = coordinator.read() verify_ecdsa_signature( message=current_phase, public_key=the_coordinator, signature_r=sig_r, signature_s=sig_s) phase.write(2) return () end @external func submit_key{ storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*, range_check_ptr}(key : felt, sig_r : felt, sig_s : felt): let (current_phase) = phase.read() assert current_phase = 2 let (the_coordinator) = coordinator.read() verify_ecdsa_signature( message=key, public_key=the_coordinator, signature_r=sig_r, signature_s=sig_s) phase.write(3) voprf_key.write(key) return () end @external func end_voting_phase{ storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, ecdsa_ptr : SignatureBuiltin*, range_check_ptr}(sig_r : felt, sig_s : felt): let (current_phase) = phase.read() assert current_phase = 3 let (the_coordinator) = coordinator.read() verify_ecdsa_signature( message=current_phase, public_key=the_coordinator, signature_r=sig_r, signature_s=sig_s) phase.write(4) return () end func double_and_add_2_128(arr : felt*, index : felt) -> (res : felt): if index == 128: return (0) else: assert arr[index] * (1 - arr[index]) = 0 let (res) = double_and_add_2_128(arr, index + 1) return (arr[index] + 2 * res) end end func double_ec(x_in, y_in) -> (x_out : felt, y_out : felt): let lambda = (3 * x_in * x_in + 1) / (2 * y_in) let x = lambda * lambda - 2 * x_in let y = lambda * (x_in - x) - y_in return (x, y) end func double_and_add_ec( x_in : felt, y_in : felt, x_base : felt, y_base : felt, infinity_in : felt, arr : felt*, index : felt) -> (res : felt): alloc_locals local x local y local infinity if arr[index] == 1: if x_base == x_in: if y_base == y_in: infinity = 0 let (x_ret, y_ret) = double_ec(x_in, y_in) x = x_ret y = y_ret else: infinity = 1 x = 0 y = 0 end else: if infinity_in == 1: infinity = 0 x = x_base y = y_base else: infinity = 0 local lambda = (y_base - y_in) / (x_base - x_in) local x_tmp = lambda * lambda - x_in - x_base local y_tmp = lambda * (x_in - x_tmp) - y_in x = x_tmp y = y_tmp end end else: infinity = infinity_in x = x_in y = y_in end if index == 0: return (x) else: local x_double local y_double if infinity == 0: let (x_ret, y_ret) = double_ec(x, y) x_double = x_ret y_double = y_ret else: x_double = 0 y_double = 0 end return double_and_add_ec(x_double, y_double, x_base, y_base, infinity, arr, index - 1) end end @external func cast_vote{ storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr, ecdsa_ptr : SignatureBuiltin*}( user : felt, vote : felt, t_hash_y : felt, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15, a16, a17, a18, a19, a20, a21, a22, a23, a24, a25, a26, a27, a28, a29, a30, a31, a32, a33, a34, a35, a36, a37, a38, a39, a40, a41, a42, a43, a44, a45, a46, a47, a48, a49, a50, a51, a52, a53, a54, a55, a56, a57, a58, a59, a60, a61, a62, a63, a64, a65, a66, a67, a68, a69, a70, a71, a72, a73, a74, a75, a76, a77, a78, a79, a80, a81, a82, a83, a84, a85, a86, a87, a88, a89, a90, a91, a92, a93, a94, a95, a96, a97, a98, a99, a100, a101, a102, a103, a104, a105, a106, a107, a108, a109, a110, a111, a112, a113, a114, a115, a116, a117, a118, a119, a120, a121, a122, a123, a124, a125, a126, a127): alloc_locals let (current_phase) = phase.read() assert current_phase = 3 let (local key) = voprf_key.read() let (commitment) = commitments.read(user) local commitment = commitment let (local t_hash) = hash2{hash_ptr=pedersen_ptr}(user, 0) assert t_hash_y * t_hash_y = t_hash * t_hash * t_hash + t_hash + 3141592653589793238462643383279502884197169399375105820974944592307816406665 let (paid_commitment) = paid.read(user) assert paid_commitment = 0 paid.write(user, 1) # Make sure vote is either 0 (No) or 1 (Yes) assert vote * (1 - vote) = 0 if vote == 1: let (num_yes) = ayes.read() ayes.write(num_yes + 1) tempvar storage_ptr : Storage* = storage_ptr tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr tempvar range_check_ptr = range_check_ptr else: if vote == 0: let (num_no) = nays.read() nays.write(num_no + 1) tempvar storage_ptr : Storage* = storage_ptr tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr tempvar range_check_ptr = range_check_ptr else: tempvar storage_ptr : Storage* = storage_ptr tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr tempvar range_check_ptr = range_check_ptr end tempvar storage_ptr : Storage* = storage_ptr tempvar pedersen_ptr : HashBuiltin* = pedersen_ptr tempvar range_check_ptr = range_check_ptr end local storage_ptr : Storage* = storage_ptr local pedersen_ptr : HashBuiltin* = pedersen_ptr local range_check_ptr = range_check_ptr let (local key_bits : felt*) = alloc() key_bits[0] = a0 key_bits[1] = a1 key_bits[2] = a2 key_bits[3] = a3 key_bits[4] = a4 key_bits[5] = a5 key_bits[6] = a6 key_bits[7] = a7 key_bits[8] = a8 key_bits[9] = a9 key_bits[10] = a10 key_bits[11] = a11 key_bits[12] = a12 key_bits[13] = a13 key_bits[14] = a14 key_bits[15] = a15 key_bits[16] = a16 key_bits[17] = a17 key_bits[18] = a18 key_bits[19] = a19 key_bits[20] = a20 key_bits[21] = a21 key_bits[22] = a22 key_bits[23] = a23 key_bits[24] = a24 key_bits[25] = a25 key_bits[26] = a26 key_bits[27] = a27 key_bits[28] = a28 key_bits[29] = a29 key_bits[30] = a30 key_bits[31] = a31 key_bits[32] = a32 key_bits[33] = a33 key_bits[34] = a34 key_bits[35] = a35 key_bits[36] = a36 key_bits[37] = a37 key_bits[38] = a38 key_bits[39] = a39 key_bits[40] = a40 key_bits[41] = a41 key_bits[42] = a42 key_bits[43] = a43 key_bits[44] = a44 key_bits[45] = a45 key_bits[46] = a46 key_bits[47] = a47 key_bits[48] = a48 key_bits[49] = a49 key_bits[50] = a50 key_bits[51] = a51 key_bits[52] = a52 key_bits[53] = a53 key_bits[54] = a54 key_bits[55] = a55 key_bits[56] = a56 key_bits[57] = a57 key_bits[58] = a58 key_bits[59] = a59 key_bits[60] = a60 key_bits[61] = a61 key_bits[62] = a62 key_bits[63] = a63 key_bits[64] = a64 key_bits[65] = a65 key_bits[66] = a66 key_bits[67] = a67 key_bits[68] = a68 key_bits[69] = a69 key_bits[70] = a70 key_bits[71] = a71 key_bits[72] = a72 key_bits[73] = a73 key_bits[74] = a74 key_bits[75] = a75 key_bits[76] = a76 key_bits[77] = a77 key_bits[78] = a78 key_bits[79] = a79 key_bits[80] = a80 key_bits[81] = a81 key_bits[82] = a82 key_bits[83] = a83 key_bits[84] = a84 key_bits[85] = a85 key_bits[86] = a86 key_bits[87] = a87 key_bits[88] = a88 key_bits[89] = a89 key_bits[90] = a90 key_bits[91] = a91 key_bits[92] = a92 key_bits[93] = a93 key_bits[94] = a94 key_bits[95] = a95 key_bits[96] = a96 key_bits[97] = a97 key_bits[98] = a98 key_bits[99] = a99 key_bits[100] = a100 key_bits[101] = a101 key_bits[102] = a102 key_bits[103] = a103 key_bits[104] = a104 key_bits[105] = a105 key_bits[106] = a106 key_bits[107] = a107 key_bits[108] = a108 key_bits[109] = a109 key_bits[110] = a110 key_bits[111] = a111 key_bits[112] = a112 key_bits[113] = a113 key_bits[114] = a114 key_bits[115] = a115 key_bits[116] = a116 key_bits[117] = a117 key_bits[118] = a118 key_bits[119] = a119 key_bits[120] = a120 key_bits[121] = a121 key_bits[122] = a122 key_bits[123] = a123 key_bits[124] = a124 key_bits[125] = a125 key_bits[126] = a126 key_bits[127] = a127 let (key_computed) = double_and_add_2_128(key_bits, 0) assert key_computed = key let (commitment_computed) = double_and_add_ec(0, 0, t_hash, t_hash_y, 1, key_bits, 127) assert commitment_computed = commitment return () end @view func get_result{storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> ( num_yes : felt, num_no : felt): let (current_phase) = phase.read() assert current_phase = 4 let (num_yes) = ayes.read() let (num_no) = nays.read() return (num_yes, num_no) end @view func get_phase{storage_ptr : Storage*, pedersen_ptr : HashBuiltin*, range_check_ptr}() -> ( res : felt): let (res) = phase.read() return (res) end ================================================ FILE: samples/Cairo Zero/safemath.cairo ================================================ %lang starknet from starkware.cairo.common.cairo_builtins import HashBuiltin, SignatureBuiltin from starkware.cairo.common.math import assert_not_zero from starkware.cairo.common.uint256 import ( Uint256, uint256_check, uint256_add, uint256_sub, uint256_le, uint256_lt ) # Adds two integers. # Reverts if the sum overflows. func uint256_checked_add{ syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr } (a: Uint256, b: Uint256) -> (c: Uint256): uint256_check(a) uint256_check(b) let (c: Uint256, is_overflow) = uint256_add(a, b) assert (is_overflow) = 0 return (c) end # Subtracts two integers. # Reverts if minuend (`b`) is greater than subtrahend (`a`). func uint256_checked_sub_le{ syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr } (a: Uint256, b: Uint256) -> (c: Uint256): alloc_locals uint256_check(a) uint256_check(b) let (is_le) = uint256_le(b, a) assert_not_zero(is_le) let (c: Uint256) = uint256_sub(a, b) return (c) end # Subtracts two integers. # Reverts if minuend (`b`) is greater than or equal to subtrahend (`a`). func uint256_checked_sub_lt{ syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr } (a: Uint256, b: Uint256) -> (c: Uint256): alloc_locals uint256_check(a) uint256_check(b) let (is_lt) = uint256_lt(b, a) assert_not_zero(is_lt) let (c: Uint256) = uint256_sub(a, b) return (c) end ================================================ FILE: samples/Cairo Zero/sha256.cairo ================================================ %lang starknet // Starkware dependencies from starkware.cairo.common.alloc import alloc from starkware.cairo.common.registers import get_fp_and_pc from starkware.cairo.common.cairo_builtins import HashBuiltin, BitwiseBuiltin from starkware.cairo.common.math import assert_nn_le, unsigned_div_rem from starkware.cairo.common.math_cmp import is_le_felt from starkware.cairo.common.memcpy import memcpy from starkware.cairo.common.memset import memset from starkware.cairo.common.pow import pow from starkware.cairo.common.bool import FALSE // Internal dependencies from utils.sha_256.packed_sha256 import ( BLOCK_SIZE, compute_message_schedule, sha2_compress, get_round_constants, ) from utils.utils import Helpers // @title SHA2-256 Precompile related functions. // @notice This file contains the logic required to run the SHA2-256 precompile // @author @ftupas // @custom:namespace PrecompileSHA256 namespace PrecompileSHA256 { const PRECOMPILE_ADDRESS = 0x02; const GAS_COST_SHA256 = 60; // @notice Run the precompile. // @param input_len The length of input array. // @param input The input array. // @return output_len The output length. // @return output The output array. // @return gas_used The gas usage of precompile. func run{ syscall_ptr: felt*, pedersen_ptr: HashBuiltin*, range_check_ptr, bitwise_ptr: BitwiseBuiltin*, }(_address: felt, input_len: felt, input: felt*) -> ( output_len: felt, output: felt*, gas_used: felt, reverted: felt ) { alloc_locals; // Copy input array let (arr: felt*) = alloc(); memcpy(arr, input, input_len); // Zero-pad bytes array // ex. 'rld\x00' let (q: felt, r: felt) = unsigned_div_rem(input_len, 4); if (r != 0) { // Append zero elements at the end of array memset(arr + input_len, 0, 4 - r); tempvar arr_len = (q + 1) * 4; } else { tempvar arr_len = q * 4; } // Prepare input bytes array to words of 32 bits (big endian). let (prepared_input: felt*) = alloc(); let (prepared_input_len, prepared_input: felt*) = Helpers.bytes_to_bytes4_array( arr_len, arr, 0, prepared_input ); // Compute hash, use input_len for number of bytes let (local sha256_ptr: felt*) = alloc(); let sha256_ptr_start = sha256_ptr; let (hash) = SHA256.sha256{sha256_ptr=sha256_ptr}(prepared_input, input_len); // Finalize hash SHA256.finalize_sha256(sha256_ptr_start=sha256_ptr_start, sha256_ptr_end=sha256_ptr); // Split words and return bytes hash code. let (hash_bytes_array: felt*) = alloc(); let (_, hash_bytes_array: felt*) = Helpers.bytes4_array_to_bytes( 8, hash, 0, hash_bytes_array ); let (minimum_word_size) = Helpers.minimum_word_count(input_len); return (32, hash_bytes_array, 12 * minimum_word_size + GAS_COST_SHA256, 0); } } namespace SHA256 { const SHA256_INPUT_CHUNK_SIZE_FELTS = 16; const SHA256_INPUT_CHUNK_SIZE_BYTES = 64; const SHA256_STATE_SIZE_FELTS = 8; // Each instance consists of 16 words of message, 8 words for the input state and 8 words // for the output state. const SHA256_INSTANCE_SIZE = SHA256_INPUT_CHUNK_SIZE_FELTS + 2 * SHA256_STATE_SIZE_FELTS; // Computes SHA256 of 'input'. Inputs of arbitrary length are supported. // To use this function, split the input into (up to) 14 words of 32 bits (big endian). // For example, to compute sha256('Hello world'), use: // input = [1214606444, 1864398703, 1919706112] // where: // 1214606444 == int.from_bytes(b'Hell', 'big') // 1864398703 == int.from_bytes(b'o wo', 'big') // 1919706112 == int.from_bytes(b'rld\x00', 'big') # Note the '\x00' padding. // // block layout: // 0 - 15: Message // 16 - 23: Input State // 24 - 32: Output // // output is an array of 8 32-bit words (big endian). // // Note: You must call finalize_sha2() at the end of the program. Otherwise, this function // is not sound and a malicious prover may return a wrong result. // Note: the interface of this function may change in the future. func sha256{range_check_ptr, sha256_ptr: felt*}(data: felt*, n_bytes: felt) -> (output: felt*) { alloc_locals; // Set the initial input state to IV. assert sha256_ptr[16] = 0x6A09E667; assert sha256_ptr[17] = 0xBB67AE85; assert sha256_ptr[18] = 0x3C6EF372; assert sha256_ptr[19] = 0xA54FF53A; assert sha256_ptr[20] = 0x510E527F; assert sha256_ptr[21] = 0x9B05688C; assert sha256_ptr[22] = 0x1F83D9AB; assert sha256_ptr[23] = 0x5BE0CD19; sha256_inner(data=data, n_bytes=n_bytes, total_bytes=n_bytes); // Set `output` to the start of the final state. let output = sha256_ptr; // Set `sha256_ptr` to the end of the output state. let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS; return (output,); } // Computes the sha256 hash of the input chunk from `message` to `message + SHA256_INPUT_CHUNK_SIZE_FELTS` func _sha256_chunk{range_check_ptr, sha256_start: felt*, state: felt*, output: felt*}() { %{ from starkware.cairo.common.cairo_sha256.sha256_utils import ( compute_message_schedule, sha2_compress_function) _sha256_input_chunk_size_felts = int(ids.SHA256_INPUT_CHUNK_SIZE_FELTS) assert 0 <= _sha256_input_chunk_size_felts < 100 _sha256_state_size_felts = int(ids.SHA256_STATE_SIZE_FELTS) assert 0 <= _sha256_state_size_felts < 100 w = compute_message_schedule(memory.get_range( ids.sha256_start, _sha256_input_chunk_size_felts)) new_state = sha2_compress_function(memory.get_range(ids.state, _sha256_state_size_felts), w) segments.write_arg(ids.output, new_state) %} return (); } // Inner loop for sha256. `sha256_ptr` points to the start of the block. func sha256_inner{range_check_ptr, sha256_ptr: felt*}( data: felt*, n_bytes: felt, total_bytes: felt ) { alloc_locals; let message = sha256_ptr; let state = sha256_ptr + SHA256_INPUT_CHUNK_SIZE_FELTS; let output = state + SHA256_STATE_SIZE_FELTS; let zero_bytes = is_le_felt(n_bytes, 0); let zero_total_bytes = is_le_felt(total_bytes, 0); // If the previous message block was full we are still missing "1" at the end of the message let (_, r_div_by_64) = unsigned_div_rem(total_bytes, 64); let missing_bit_one = is_le_felt(r_div_by_64, 0); // This works for 0 total bytes too, because zero_chunk will be -1 and, therefore, not 0. let zero_chunk = zero_bytes - zero_total_bytes - missing_bit_one; let is_last_block = is_le_felt(n_bytes, 55); if (is_last_block == FALSE) { let (q, r) = unsigned_div_rem(n_bytes, SHA256_INPUT_CHUNK_SIZE_BYTES); let is_remainder_block = is_le_felt(q, 0); if (is_remainder_block == FALSE) { _sha256_input( data, SHA256_INPUT_CHUNK_SIZE_BYTES, SHA256_INPUT_CHUNK_SIZE_FELTS, 0 ); _sha256_chunk{sha256_start=message, state=state, output=output}(); let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS; memcpy( output + SHA256_STATE_SIZE_FELTS + SHA256_INPUT_CHUNK_SIZE_FELTS, output, SHA256_STATE_SIZE_FELTS, ); let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS; return sha256_inner( data=data + SHA256_INPUT_CHUNK_SIZE_FELTS, n_bytes=n_bytes - SHA256_INPUT_CHUNK_SIZE_BYTES, total_bytes=total_bytes, ); } else { _sha256_input(data, r, SHA256_INPUT_CHUNK_SIZE_FELTS, 0); _sha256_chunk{sha256_start=message, state=state, output=output}(); let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS; memcpy( output + SHA256_STATE_SIZE_FELTS + SHA256_INPUT_CHUNK_SIZE_FELTS, output, SHA256_STATE_SIZE_FELTS, ); let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS; return sha256_inner(data=data, n_bytes=n_bytes - r, total_bytes=total_bytes); } } _sha256_input(data, n_bytes, SHA256_INPUT_CHUNK_SIZE_FELTS - 2, zero_chunk); // Append the original message length at the end of the message block as a 64-bit big-endian integer. assert sha256_ptr[0] = 0; assert sha256_ptr[1] = total_bytes * 8; let sha256_ptr = sha256_ptr + 2; _sha256_chunk{sha256_start=message, state=state, output=output}(); let sha256_ptr = sha256_ptr + SHA256_STATE_SIZE_FELTS; return (); } // 1. Encode the input to binary using UTF-8 and append a single '1' to it. // 2. Prepend that binary to the message block. func _sha256_input{range_check_ptr, sha256_ptr: felt*}( input: felt*, n_bytes: felt, n_words: felt, pad_chunk: felt ) { alloc_locals; local full_word; %{ ids.full_word = int(ids.n_bytes >= 4) %} if (full_word != 0) { assert sha256_ptr[0] = input[0]; let sha256_ptr = sha256_ptr + 1; return _sha256_input( input=input + 1, n_bytes=n_bytes - 4, n_words=n_words - 1, pad_chunk=pad_chunk ); } if (n_words == 0) { return (); } if (n_bytes == 0 and pad_chunk == 1) { // Add zeros between the encoded message and the length integer so that the message block is a multiple of 512. memset(dst=sha256_ptr, value=0, n=n_words); let sha256_ptr = sha256_ptr + n_words; return (); } if (n_bytes == 0) { // This is the last input word, so we should add a byte '0x80' at the end and fill the rest with zeros. assert sha256_ptr[0] = 0x80000000; // Add zeros between the encoded message and the length integer so that the message block is a multiple of 512. memset(dst=sha256_ptr + 1, value=0, n=n_words - 1); let sha256_ptr = sha256_ptr + n_words; return (); } assert_nn_le(n_bytes, 3); let (padding) = pow(256, 3 - n_bytes); local range_check_ptr = range_check_ptr; assert sha256_ptr[0] = input[0] + padding * 0x80; memset(dst=sha256_ptr + 1, value=0, n=n_words - 1); let sha256_ptr = sha256_ptr + n_words; return (); } // Handles n blocks of BLOCK_SIZE SHA256 instances. // Taken from: https://github.com/starkware-libs/cairo-examples/blob/0d88b41bffe3de112d98986b8b0afa795f9d67a0/sha256/sha256.cairo#L102 func _finalize_sha256_inner{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}( sha256_ptr: felt*, n: felt, round_constants: felt* ) { if (n == 0) { return (); } alloc_locals; local MAX_VALUE = 2 ** 32 - 1; let sha256_start = sha256_ptr; let (local message_start: felt*) = alloc(); let (local input_state_start: felt*) = alloc(); // Handle message. tempvar message = message_start; tempvar sha256_ptr = sha256_ptr; tempvar range_check_ptr = range_check_ptr; tempvar m = SHA256_INPUT_CHUNK_SIZE_FELTS; message_loop: tempvar x0 = sha256_ptr[0 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 0] = x0; assert [range_check_ptr + 1] = MAX_VALUE - x0; tempvar x1 = sha256_ptr[1 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 2] = x1; assert [range_check_ptr + 3] = MAX_VALUE - x1; tempvar x2 = sha256_ptr[2 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 4] = x2; assert [range_check_ptr + 5] = MAX_VALUE - x2; tempvar x3 = sha256_ptr[3 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 6] = x3; assert [range_check_ptr + 7] = MAX_VALUE - x3; tempvar x4 = sha256_ptr[4 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 8] = x4; assert [range_check_ptr + 9] = MAX_VALUE - x4; tempvar x5 = sha256_ptr[5 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 10] = x5; assert [range_check_ptr + 11] = MAX_VALUE - x5; tempvar x6 = sha256_ptr[6 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 12] = x6; assert [range_check_ptr + 13] = MAX_VALUE - x6; assert message[0] = x0 + 2 ** 35 * x1 + 2 ** (35 * 2) * x2 + 2 ** (35 * 3) * x3 + 2 ** ( 35 * 4 ) * x4 + 2 ** (35 * 5) * x5 + 2 ** (35 * 6) * x6; tempvar message = message + 1; tempvar sha256_ptr = sha256_ptr + 1; tempvar range_check_ptr = range_check_ptr + 14; tempvar m = m - 1; jmp message_loop if m != 0; // Handle input state. tempvar input_state = input_state_start; tempvar sha256_ptr = sha256_ptr; tempvar range_check_ptr = range_check_ptr; tempvar m = SHA256_STATE_SIZE_FELTS; input_state_loop: tempvar x0 = sha256_ptr[0 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 0] = x0; assert [range_check_ptr + 1] = MAX_VALUE - x0; tempvar x1 = sha256_ptr[1 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 2] = x1; assert [range_check_ptr + 3] = MAX_VALUE - x1; tempvar x2 = sha256_ptr[2 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 4] = x2; assert [range_check_ptr + 5] = MAX_VALUE - x2; tempvar x3 = sha256_ptr[3 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 6] = x3; assert [range_check_ptr + 7] = MAX_VALUE - x3; tempvar x4 = sha256_ptr[4 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 8] = x4; assert [range_check_ptr + 9] = MAX_VALUE - x4; tempvar x5 = sha256_ptr[5 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 10] = x5; assert [range_check_ptr + 11] = MAX_VALUE - x5; tempvar x6 = sha256_ptr[6 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 12] = x6; assert [range_check_ptr + 13] = MAX_VALUE - x6; assert input_state[0] = x0 + 2 ** 35 * x1 + 2 ** (35 * 2) * x2 + 2 ** (35 * 3) * x3 + 2 ** ( 35 * 4 ) * x4 + 2 ** (35 * 5) * x5 + 2 ** (35 * 6) * x6; tempvar input_state = input_state + 1; tempvar sha256_ptr = sha256_ptr + 1; tempvar range_check_ptr = range_check_ptr + 14; tempvar m = m - 1; jmp input_state_loop if m != 0; // Run sha256 on the 7 instances. local sha256_ptr: felt* = sha256_ptr; local range_check_ptr = range_check_ptr; compute_message_schedule(message_start); let (outputs) = sha2_compress(input_state_start, message_start, round_constants); local bitwise_ptr: BitwiseBuiltin* = bitwise_ptr; // Handle outputs. tempvar outputs = outputs; tempvar sha256_ptr = sha256_ptr; tempvar range_check_ptr = range_check_ptr; tempvar m = SHA256_STATE_SIZE_FELTS; output_loop: tempvar x0 = sha256_ptr[0 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr] = x0; assert [range_check_ptr + 1] = MAX_VALUE - x0; tempvar x1 = sha256_ptr[1 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 2] = x1; assert [range_check_ptr + 3] = MAX_VALUE - x1; tempvar x2 = sha256_ptr[2 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 4] = x2; assert [range_check_ptr + 5] = MAX_VALUE - x2; tempvar x3 = sha256_ptr[3 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 6] = x3; assert [range_check_ptr + 7] = MAX_VALUE - x3; tempvar x4 = sha256_ptr[4 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 8] = x4; assert [range_check_ptr + 9] = MAX_VALUE - x4; tempvar x5 = sha256_ptr[5 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 10] = x5; assert [range_check_ptr + 11] = MAX_VALUE - x5; tempvar x6 = sha256_ptr[6 * SHA256_INSTANCE_SIZE]; assert [range_check_ptr + 12] = x6; assert [range_check_ptr + 13] = MAX_VALUE - x6; assert outputs[0] = x0 + 2 ** 35 * x1 + 2 ** (35 * 2) * x2 + 2 ** (35 * 3) * x3 + 2 ** ( 35 * 4 ) * x4 + 2 ** (35 * 5) * x5 + 2 ** (35 * 6) * x6; tempvar outputs = outputs + 1; tempvar sha256_ptr = sha256_ptr + 1; tempvar range_check_ptr = range_check_ptr + 14; tempvar m = m - 1; jmp output_loop if m != 0; return _finalize_sha256_inner( sha256_ptr=sha256_start + SHA256_INSTANCE_SIZE * BLOCK_SIZE, n=n - 1, round_constants=round_constants, ); } // Verifies that the results of sha256() are valid. // Taken from: https://github.com/starkware-libs/cairo-examples/blob/0d88b41bffe3de112d98986b8b0afa795f9d67a0/sha256/sha256.cairo#L246 func finalize_sha256{range_check_ptr, bitwise_ptr: BitwiseBuiltin*}( sha256_ptr_start: felt*, sha256_ptr_end: felt* ) { alloc_locals; let (__fp__, _) = get_fp_and_pc(); let (round_constants) = get_round_constants(); // We reuse the output state of the previous chunk as input to the next. tempvar n = (sha256_ptr_end - sha256_ptr_start) / SHA256_INSTANCE_SIZE; if (n == 0) { return (); } %{ # Add dummy pairs of input and output. from starkware.cairo.common.cairo_sha256.sha256_utils import ( IV, compute_message_schedule, sha2_compress_function) _block_size = int(ids.BLOCK_SIZE) assert 0 <= _block_size < 20 _sha256_input_chunk_size_felts = int(ids.SHA256_INPUT_CHUNK_SIZE_FELTS) assert 0 <= _sha256_input_chunk_size_felts < 100 message = [0] * _sha256_input_chunk_size_felts w = compute_message_schedule(message) output = sha2_compress_function(IV, w) padding = (message + IV + output) * (_block_size - 1) segments.write_arg(ids.sha256_ptr_end, padding) %} // Compute the amount of blocks (rounded up). let (local q, r) = unsigned_div_rem(n + BLOCK_SIZE - 1, BLOCK_SIZE); _finalize_sha256_inner(sha256_ptr_start, n=q, round_constants=round_constants); return (); } } ================================================ FILE: samples/CameLIGO/FA1.2.mligo ================================================ (** This file implements the TZIP-7 protocol (a.k.a FA1.2) copyright Wulfman Corporation 2022 *) (* Errors *) module Errors = struct let notEnoughBalance = "NotEnoughBalance" let notEnoughAllowance = "NotEnoughAllowance" (* Extra error, see: https://docs.google.com/document/d/1YLPtQxZu1UAvO9cZ1O2RPXBbT0mooh4DYKjA_jp-RLM/edit *) let vulnerable_operation = "Switching allowances from N to M is a vulnerability" end module Allowance = struct type spender = address type allowed_amount = nat type t = (spender, allowed_amount) map let get_allowed_amount (a:t) (spender:spender) = match Map.find_opt spender a with Some v -> v | None -> 0n let set_allowed_amount (a:t) (spender:spender) (allowed_amount:allowed_amount) = if allowed_amount > 0n then Map.add spender allowed_amount a else a end module Ledger = struct type owner = address type spender = address type amount_ = nat type t = (owner, amount_ * Allowance.t) big_map let get_for_user (ledger:t) (owner: owner) : amount_ * Allowance.t = match Big_map.find_opt owner ledger with Some (tokens) -> tokens | None -> 0n,(Map.empty : Allowance.t) let update_for_user (ledger:t) (owner: owner) (amount_ : amount_) (allowances : Allowance.t) : t = Big_map.update owner (Some (amount_,allowances)) ledger let set_approval (ledger:t) (owner: owner) (spender : spender) (allowed_amount: amount_) = let tokens,allowances = get_for_user ledger owner in let previous_allowances = Allowance.get_allowed_amount allowances spender in let () = assert_with_error (previous_allowances = 0n || allowed_amount = 0n) Errors.vulnerable_operation in let allowances = Allowance.set_allowed_amount allowances spender allowed_amount in let ledger = update_for_user ledger owner tokens allowances in ledger let decrease_token_amount_for_user (ledger : t) (spender : spender) (from_ : owner) (amount_ : amount_) : t = let tokens,allowances = get_for_user ledger from_ in let allowed_amount = if spender = from_ then tokens else Allowance.get_allowed_amount allowances spender in let () = assert_with_error (allowed_amount >= amount_) Errors.notEnoughAllowance in let () = assert_with_error (tokens >= amount_) Errors.notEnoughBalance in let tokens = abs(tokens - amount_) in let ledger = update_for_user ledger from_ tokens allowances in ledger let increase_token_amount_for_user (ledger : t) (to_ : owner) (amount_ : amount_) : t = let tokens,allowances = get_for_user ledger to_ in let tokens = tokens + amount_ in let ledger = update_for_user ledger to_ tokens allowances in ledger end module TokenMetadata = struct (** This should be initialized at origination, conforming to either TZIP-12 : https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-12/tzip-12.md#token-metadata or TZIP-16 : https://gitlab.com/tezos/tzip/-/blob/master/proposals/tzip-12/tzip-12.md#contract-metadata-tzip-016 *) type data = {token_id:nat;token_info:(string,bytes)map} type t = data end module Storage = struct type t = { ledger : Ledger.t; token_metadata : TokenMetadata.t; totalSupply : nat; (* Note: memoizing the sum of all participant balance reduce the cost of getTotalSupply entrypoint. However, with this pattern the value has to be manually set at origination which can lead to consistency issues. *) } let get_amount_for_owner (s:t) (owner : address) = let amount_,_ = Ledger.get_for_user s.ledger owner in amount_ let get_allowances_for_owner (s:t) (owner : address) = let _,allowances = Ledger.get_for_user s.ledger owner in allowances let get_ledger (s:t) = s.ledger let set_ledger (s:t) (ledger:Ledger.t) = {s with ledger = ledger} end type storage = Storage.t (** transfer entrypoint *) type transfer = address * (address * nat) let transfer (from_,(to_,value):transfer) (s:storage) = let ledger = Storage.get_ledger s in let ledger = Ledger.decrease_token_amount_for_user ledger Tezos.sender from_ value in let ledger = Ledger.increase_token_amount_for_user ledger to_ value in let s = Storage.set_ledger s ledger in ([]: operation list),s (** approve *) type approve = (address * nat) let approve (spender,value : approve) (s:storage) = let ledger = Storage.get_ledger s in let ledger = Ledger.set_approval ledger Tezos.sender spender value in let s = Storage.set_ledger s ledger in ([]: operation list),s (** getBalance entrypoint *) type getAllowance = (address * address) * nat contract let getAllowance (((owner,spender),callback): getAllowance) (s: storage) = let a = Storage.get_allowances_for_owner s owner in let allowed_amount = Allowance.get_allowed_amount a spender in let operation = Tezos.transaction allowed_amount 0tez callback in ([operation]: operation list),s (** getBalance entrypoint *) type getBalance = address * nat contract let getBalance ((owner,callback): getBalance) (s: storage) = let balance_ = Storage.get_amount_for_owner s owner in let operation = Tezos.transaction balance_ 0tez callback in ([operation]: operation list),s (** getTotalSupply entrypoint *) type getTotalSupply = unit * nat contract let getTotalSupply ((),callback : getTotalSupply) (s:storage) = let operation = Tezos.transaction s.totalSupply 0tez callback in ([operation]: operation list),s type parameter = Transfer of transfer | Approve of approve | GetAllowance of getAllowance | GetBalance of getBalance | GetTotalSupply of getTotalSupply let main ((p,s):(parameter * storage)) = match p with Transfer p -> transfer p s | Approve p -> approve p s | GetAllowance p -> getAllowance p s | GetBalance p -> getBalance p s | GetTotalSupply p -> getTotalSupply p s ================================================ FILE: samples/Cangjie/cube.cj ================================================ package cangjie import std.collection.* enum Rotation <: ToString & Hashable & Equatable { F | B | L | R | U | D | X(Rotation, Rotation) | I(Rotation) public operator func *(that: Rotation): Rotation { match (this) { case X(x1, x2) => X(x1, X(x2, that)) case _ => X(this, that) } } public operator func **(exp: UInt32): Rotation { var result = this for (_ in 0..(exp - 1)) { result = result * this } return result } private func text(inv: Bool): String { let exp = if (inv) { "⁻¹" } else { "" } match (this) { case F => "F${exp}" case B => "B${exp}" case L => "L${exp}" case R => "R${exp}" case U => "U${exp}" case D => "D${exp}" case I(r) => r.text(!inv) case X(x1, x2) => if (inv) { x2.text(inv) + x1.text(inv) } else { x1.text(inv) + x2.text(inv) } } } public func toString(): String { text(false) } public func hashCode(): Int64 { this.toString().hashCode() } public operator func ==(that: Rotation): Bool { this.toString() == that.toString() } public operator func !=(that: Rotation): Bool { this.toString() != that.toString() } } type Face = Rotation type Vector = Array<(Face, Int64)> type Matrix = Array enum Index { Row(Int64) | Col(Int64) | Inv(Index) public operator func -(): Index { match (this) { case Inv(v) => v case _ => Inv(this) } } public func value(): Index { match (this) { case Inv(v) => v case _ => this } } } extend Matrix { public static func create(face: Face) { Matrix( 3, { i => Vector(3, {j => (face, 3 * i + j + 1)}) } ) } public operator func [](index: Index): Vector { match (index) { case Row(r) => this[r].clone() case Col(c) => Vector(this.size, {i => this[i][c]}) case Inv(i) => this[i] } } public func set(index: Index, value: Vector): Unit { match (index) { case Row(r) => this[r] = value case Col(c) => for (i in 0..value.size) { this[i][c] = value[i] } case Inv(i) => value.reverse() this.set(i, value) } } public func print(row: Int64) { for ((face, id) in this[row]) { print("${face}${id} ") } } public func print() { for (row in 0..this.size) { print(" ") print(row) println() } } } extend Int64 { public prop r: Index { get() { Index.Row(this) } } public prop c: Index { get() { Index.Col(this) } } } type Permutation = Array<(Face, Index)> extend Permutation { public func inverse() { let perm = this.clone() for (i in 0..perm.size) { let j = (i + 1) % perm.size let (face, index) = this[i] if (let Inv(_) <- this[j][1]) { perm[i] = (face, -(index.value())) } else { perm[i] = (face, index.value()) } } perm.reverse() return perm } } class Cube { public let data = HashMap() private var history = ArrayList() private static let permutation = HashMap() public init() { reset() } static init() { permutation[F] = [(L, 2.c), (U, -2.r), (R, 0.c), (D, -0.r)] permutation[B] = [(L, -0.c), (D, 2.r), (R, -2.c), (U, 0.r)] permutation[L] = [(U, 0.c), (F, 0.c), (D, 0.c), (B, 0.c)] permutation[R] = [(B, 2.c), (D, 2.c), (F, 2.c), (U, 2.c)] permutation[U] = [(L, 0.r), (B, -2.r), (R, -0.r), (F, 0.r)] permutation[D] = [(R, 2.r), (B, -0.r), (L, -2.r), (F, 2.r)] } public func reset() { history = ArrayList() for (face in [F, B, L, R, U, D]) { data[face] = Matrix.create(face) } } private func rotate(face: Face, inverse: Bool) { const N = 3 let matrix = Matrix.create(face) let map = if (inverse) { {i: Int64, j: Int64 => (N - 1 - j, i)} } else { {i: Int64, j: Int64 => (j, N - 1 - i)} } for (i in 0..N) { for (j in 0..N) { let (u, v) = map(i, j) matrix[u][v] = data[face][i][j] } } data[face] = matrix } private func permute(perm: Permutation, inverse: Bool) { let p = if (inverse) { perm.inverse() } else { perm.clone() } p.reverse() var (lastFace, lastIndex) = p[0] let vector = data[lastFace][lastIndex] for (i in 1..p.size) { let (face, index) = p[i] data[lastFace].set(lastIndex, data[face][index]) (lastFace, lastIndex) = (face, index) } data[lastFace].set(lastIndex, vector) } private func transform(rotation: Rotation, inverse: Bool): Unit { match (rotation) { case I(r) => transform(r, !inverse) case X(r1, r2) => if (inverse) { transform(r2, inverse) transform(r1, inverse) } else { transform(r1, inverse) transform(r2, inverse) } case _ => rotate(rotation, inverse) permute(permutation[rotation], inverse) } } public func transform(rotation: Rotation) { transform(rotation, false) history.add(rotation) print() } public func print() { var prompt = ">> " for (rotation in history) { prompt += rotation.toString() } println(prompt) data[U].print() for (i in 0..3) { for (face in [L, F, R]) { data[face].print(i) } println() } data[D].print() data[B].print() println() } } main() { let cube = Cube() cube.print() for (r in [F, B, L, R, U, D]) { cube.transform(r) } Cube().transform(F * R * I(F * R)) Cube().transform((F * F * R * R) ** 6) Cube().transform((F * U * L * L * R) ** 36) Cube().transform((F * F * L * L * B * R) ** 90) let G = I(R) * D * R * F * D * I(F) Cube().transform(G) let H = U * G * I(U) Cube().transform(H) let M = R * I(L) * F * F * L * I(R) * I(D) * R * I(L) * F * L * I(R) Cube().transform(M) let N = M * I(U) * I(M) * U Cube().transform(N) let P = N * U * I(N) * I(U) Cube().transform(P) } ================================================ FILE: samples/Cangjie/tree.cj ================================================ package cangjie struct Node where T <: ToString { public Node(var value: T, let left!: ?Node = None, let right!: ?Node = None) {} public func traverse(): Unit { left?.traverse() print(value) right?.traverse() } public mut func set(value: T) { this.value = value } } main() { var tree1 = Node(r'X', left: Node(r'B', left: Node(r'C', right: Node(r'D'))), right: Node(r'E', left: Node(r'F'), right: Node(r'G'))) tree1.set(r'A') tree1.traverse() println() var tree2 = Node(0, left: Node(2, left: Node(3, right: Node(4))), right: Node(5, left: Node(6), right: Node(7))) tree2.set(1) tree2.traverse() } ================================================ FILE: samples/Carbon/Shapes.carbon ================================================ package Shapes api; import Math; // Circle class Circle { var Radius: f32 = 1; const var Diameter: f32 = self.Radius * 2; const var Pi: f32 = Math.Pi; fn Area() -> self; fn Circumference() -> self; } fn Circle.Area() -> self { return Math.Pi * .Radius ^ 2 } fn Circle.Circumference() -> self { return 2 * Math.Pi * .Radius } // Rectangle class Rectangle { var Width: f32 = 3; var Height: f32 = 1; fn Area() -> self; } fn Rectangle.Area() -> self { return .Width * .Height; } // Square (Note: Provides same functions as "Rectangle" class.) class Square { var Width: f32 = 3; var Height: f32 = 1; fn Area() -> self; } fn Square.Area() -> self { return .Width * .Height; } // Triangle class Triangle { var Width: f32 = 3; var Height: f32 = 3; fn Area() -> self; } fn Triangle.Area() -> self { return (.Width * .Height) / 2; } // Hexagon class Hexagon { var Side: f32 = 5; fn Area() -> self; } fn Hexagon.Area() -> self { return ((3 * 1.732) / 2) * .Side ^ 2 } ================================================ FILE: samples/Carbon/main.carbon ================================================ // Part of linguist/samples import Shapes; import "some/graphics/library"; // This does not exist (read below) fn main() -> i32 { // This sample does not show the usage of a real graphics library since there is no major usable graphics library for Carbon. // As the language grows, some UI library will emerge for it and this sample can be updated. var newGraphicRectangle: Shapes.Rectangle = {Width = 500, Height = 1250 }; var graphicsWindow: auto = Graphics.Window(newGraphicRectangle, "Window Name"); graphicsWindow.Show(true); return 0; } ================================================ FILE: samples/CartoCSS/amenity-points.mss ================================================ @marina-text: #576ddf; // also swimming_pool @wetland-text: darken(#017fff, 10%); /* Also for marsh */ @mud-text: darken(#aea397, 20%); @shop-icon: #ac39ac; @transportation-icon: #0092da; @transportation-text: #0066ff; @airtransport: #8461C4; @landcover-font-size: 10; @landcover-font-size-big: 12; @landcover-font-size-bigger: 15; @landcover-wrap-width-size: 25; @landcover-wrap-width-size-big: 35; @landcover-wrap-width-size-bigger: 45; @landcover-face-name: @oblique-fonts; @standard-wrap-width: 30; .points { [feature = 'tourism_alpine_hut'][zoom >= 13] { point-file: url('symbols/alpinehut.p.16.png'); point-placement: interior; } [feature = 'amenity_shelter'][zoom >= 16] { point-file: url('symbols/shelter2.p.16.png'); point-placement: interior; } [feature = 'amenity_atm'][zoom >= 17] { point-file: url('symbols/atm2.p.16.png'); point-placement: interior; } [feature = 'amenity_bank'][zoom >= 17] { point-file: url('symbols/bank2.p.16.png'); point-placement: interior; } [feature = 'amenity_bar'][zoom >= 17] { point-file: url('symbols/bar.p.20.png'); point-placement: interior; } [feature = 'amenity_bicycle_rental'][zoom >= 17] { point-file: url('symbols/rental_bicycle.p.20.png'); point-placement: interior; } [feature = 'highway_bus_stop'] { [zoom >= 16] { marker-file: url('symbols/square.svg'); marker-fill: @transportation-icon; marker-placement: interior; marker-width: 6; } [zoom >= 17] { marker-file: url('symbols/bus_stop.p.12.png'); marker-width: 12; } } [feature = 'amenity_bus_station'][zoom >= 16] { point-file: url('symbols/bus_station.n.16.png'); point-placement: interior; } [feature = 'highway_traffic_signals'][zoom >= 17] { marker-file: url('symbols/traffic_light.svg'); marker-fill: #0a0a0a; marker-placement: interior; } [feature = 'amenity_cafe'][zoom >= 17] { point-file: url('symbols/cafe.p.16.png'); point-placement: interior; } [feature = 'tourism_camp_site'][zoom >= 16] { point-file: url('symbols/camping.n.16.png'); point-placement: interior; } [feature = 'highway_ford'][zoom >= 16] { point-file: url('symbols/transport_ford.p.16.png'); point-placement: interior; } [feature = 'tourism_caravan_site'][zoom >= 16] { point-file: url('symbols/caravan_park.p.24.png'); point-placement: interior; } [feature = 'amenity_car_sharing'][zoom >= 16] { point-file: url('symbols/car_share.p.16.png'); point-placement: interior; } [feature = 'tourism_chalet'][zoom >= 17] { point-file: url('symbols/chalet.p.16.png'); point-placement: interior; } [feature = 'amenity_cinema'][zoom >= 16] { point-file: url('symbols/cinema.p.24.png'); point-placement: interior; } [feature = 'amenity_fire_station'][zoom >= 16] { point-file: url('symbols/firestation.p.16.png'); point-placement: interior; } [feature = 'amenity_fuel'][zoom >= 17] { point-file: url('symbols/fuel.p.16.png'); point-placement: interior; } [feature = 'tourism_guest_house'][zoom >= 17] { point-file: url('symbols/guest_house.p.16.png'); point-placement: interior; } [feature = 'amenity_hospital'][zoom >= 15] { point-file: url('symbols/hospital.p.16.png'); point-placement: interior; } [feature = 'tourism_hostel'][zoom >= 17] { point-file: url('symbols/hostel.p.20.png'); point-placement: interior; } [feature = 'tourism_hotel'][zoom >= 17] { point-file: url('symbols/hotel2.p.20.png'); point-placement: interior; } [feature = 'tourism_motel'][zoom >= 17] { point-file: url('symbols/motel.p.20.png'); point-placement: interior; } [feature = 'tourism_information'][zoom >= 17] { point-file: url('symbols/information.p.16.png'); point-placement: interior; } [feature = 'amenity_embassy'][zoom >= 17] { point-file: url('symbols/embassy.png'); point-placement: interior; } [feature = 'amenity_library'][zoom >= 16] { point-file: url('symbols/library.p.20.png'); point-placement: interior; } [feature = 'amenity_courthouse'][zoom > 16] { point-file: url('symbols/amenity_court.p.20.png'); point-placement: interior; } [feature = 'waterway_lock'], [feature = 'lock_yes'] { [zoom >= 15] { marker-fill: #969494; marker-width: 9; marker-line-width: 0; marker-placement: interior; } } [feature = 'man_made_mast'][zoom >= 17] { point-file: url('symbols/communications.p.20.png'); point-placement: interior; } [feature = 'tourism_museum'][zoom >= 16] { point-file: url('symbols/museum.p.16.png'); point-placement: interior; } [feature = 'amenity_parking'][zoom >= 16] { marker-file: url('symbols/parking.svg'); marker-placement: interior; marker-clip: false; marker-fill: @transportation-icon; [access != ''][access != 'public'][access != 'yes'] { marker-opacity: 0.33; } } [feature = 'amenity_pharmacy'][zoom >= 17] { point-file: url('symbols/pharmacy.p.16.png'); point-placement: interior; } [feature = 'amenity_place_of_worship'][zoom >= 16] { point-file: url('symbols/place_of_worship3.p.16.png'); point-placement: interior; [religion = 'christian'] { point-file: url('symbols/christian3.p.14.png'); [denomination = 'jehovahs_witness']{ point-file: url('symbols/place_of_worship3.p.16.png'); } } [religion = 'muslim'] { point-file: url('symbols/islamic3.p.16.png'); } [religion = 'sikh'] { point-file: url('symbols/sikh3.p.16.png'); } [religion = 'jewish'] { point-file: url('symbols/jewish3.p.16.png'); } [religion = 'hindu'] { point-file: url('symbols/hindu.png'); } [religion = 'buddhist'] { point-file: url('symbols/buddhist.png'); } [religion = 'shinto'] { point-file: url('symbols/shinto.png'); } [religion = 'taoist'] { point-file: url('symbols/taoist.png'); } } [feature = 'amenity_police'][zoom >= 16] { point-file: url('symbols/police.p.16.png'); point-placement: interior; } [feature = 'amenity_post_box'][zoom >= 17] { point-file: url('symbols/post_box.p.16.png'); point-placement: interior; } [feature = 'amenity_post_office'][zoom >= 17] { point-file: url('symbols/post_office.p.16.png'); point-placement: interior; } [feature = 'amenity_pub'][zoom >= 17] { point-file: url('symbols/pub.p.16.png'); point-placement: interior; } [feature = 'amenity_biergarten'][zoom >= 17] { point-file: url('symbols/biergarten.p.16.png'); point-placement: interior; } [feature = 'amenity_recycling'][zoom >= 16] { point-file: url('symbols/recycling.p.16.png'); point-placement: interior; } [feature = 'amenity_restaurant'][zoom >= 17] { point-file: url('symbols/restaurant.p.16.png'); point-placement: interior; } [feature = 'amenity_fast_food'][zoom >= 17] { point-file: url('symbols/fast_food.png'); point-placement: interior; } [feature = 'amenity_telephone'][zoom >= 17] { point-file: url('symbols/telephone.p.16.png'); point-placement: interior; } [feature = 'amenity_emergency_phone'][zoom >= 17] { point-file: url('symbols/sosphone.png'); point-placement: interior; } [feature = 'amenity_theatre'][zoom >= 16] { point-file: url('symbols/theatre.p.20.png'); point-placement: interior; } [feature = 'amenity_toilets'][zoom >= 17] { point-file: url('symbols/toilets.p.20.png'); point-placement: interior; } [feature = 'amenity_drinking_water'][zoom >= 17] { point-file: url('symbols/food_drinkingtap.p.20.png'); point-placement: interior; } [feature = 'amenity_prison'][zoom >= 17] { point-file: url('symbols/amenity_prison.p.20.png'); point-placement: interior; } [feature = 'tourism_viewpoint'][zoom >= 16] { point-file: url('symbols/view_point.p.16.png'); point-placement: interior; } [feature = 'man_made_water_tower'][zoom >= 17] { point-file: url('symbols/tower_water.p.20.png'); point-placement: interior; } [feature = 'historic_memorial'][zoom >= 17] { point-file: url('symbols/tourist_memorial.p.20.png'); point-placement: interior; } [feature = 'historic_archaeological_site'][zoom >= 16] { point-file: url('symbols/tourist_archaeological2.glow.24.png'); point-placement: interior; } [feature = 'shop_other'][zoom >= 17] { marker-fill: @shop-icon; marker-width: 6; marker-line-width: 0; marker-placement: interior; marker-clip: false; } [feature = 'shop_supermarket'][zoom >= 16] { marker-file: url('symbols/shop_supermarket.svg'); marker-placement: interior; marker-clip: false; marker-fill: @shop-icon; } [feature = 'shop_bakery'][zoom >= 17] { marker-file: url('symbols/shop_bakery.p.16.png'); marker-placement: interior; marker-clip: false; } [feature = 'shop_butcher'][zoom >= 17] { marker-file: url('symbols/shop_butcher.png'); marker-placement: interior; marker-clip: false; } [feature = 'shop_clothes'], [feature = 'shop_fashion'] { [zoom >= 17] { marker-file: url('symbols/shop_clothes.svg'); marker-placement: interior; marker-clip: false; marker-fill: @shop-icon; } } [feature = 'shop_convenience'][zoom >= 17] { marker-file: url('symbols/shop_convenience.svg'); marker-placement: interior; marker-clip: false; marker-fill: @shop-icon; } [feature = 'shop_department_store'][zoom >= 16] { point-file: url('symbols/department_store.p.16.png'); point-placement: interior; } [feature = 'shop_doityourself'][zoom >= 17] { marker-file: url('symbols/shop_diy.p.16.png'); marker-placement: interior; marker-clip: false; } [feature = 'shop_florist'][zoom >= 17] { marker-file: url('symbols/florist.p.16.png'); marker-placement: interior; marker-clip: false; } [feature = 'shop_hairdresser'][zoom >= 17] { marker-file: url('symbols/shop_hairdresser.p.16.png'); marker-placement: interior; marker-clip: false; } [feature = 'shop_car'][zoom >= 17] { marker-file: url('symbols/shop_car.svg'); marker-placement: interior; marker-clip: false; marker-fill: @shop-icon; } [feature = 'shop_car_repair'][zoom >= 17] { marker-file: url('symbols/shopping_car_repair.p.16.png'); marker-placement: interior; marker-clip: false; } [feature = 'shop_bicycle'][zoom >= 17] { marker-file: url('symbols/shopping_bicycle.p.16.png'); marker-placement: interior; marker-clip: false; } [feature = 'leisure_playground'][zoom >= 17] { point-file: url('symbols/playground.p.20.png'); point-placement: interior; } [feature = 'tourism_picnic_site'][zoom >= 16] { point-file: url('symbols/picnic.p.16.png'); point-placement: interior; } [feature = 'leisure_picnic_table'][zoom >= 17] { point-file: url('symbols/picnic.p.16.png'); point-placement: interior; } [feature = 'leisure_slipway'][zoom >= 17] { point-file: url('symbols/transport_slipway.p.20.png'); point-placement: interior; } [feature = 'aeroway_helipad'][zoom >= 16]::aeroway { marker-file: url('symbols/helipad.svg'); marker-clip: false; marker-fill: @airtransport; } [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway { marker-file: url('symbols/aerodrome.svg'); marker-clip: false; marker-fill: @airtransport; } [feature = 'man_made_lighthouse'][zoom >= 15]::man_made { point-file: url('symbols/lighthouse.p.20.png'); point-placement: interior; } [feature = 'natural_peak'][zoom >= 11]::natural { marker-file: url('symbols/peak.svg'); marker-fill: #d08f55; marker-placement: interior; } [feature = 'natural_volcano'][zoom >= 11]::natural { marker-file: url('symbols/peak.svg'); marker-fill: #d40000; marker-placement: interior; } [feature = 'natural_saddle'][zoom >= 15]::natural { marker-file: url('symbols/saddle.svg'); marker-fill: #d08f55; marker-placement: interior; } [feature = 'natural_cave_entrance'][zoom >= 15]::natural { point-file: url('symbols/poi_cave.p.16.png'); point-placement: interior; } [feature = 'natural_spring'][zoom >= 14]::natural { marker-file: url('symbols/spring.svg'); marker-placement: interior; } [feature = 'natural_tree'][zoom >= 16]::natural { marker-placement: interior; marker-ignore-placement: true; marker-line-width: 0; marker-width: 3; marker-fill: #239c45; [zoom >= 17] { marker-line-width: 1; marker-line-color: #8ef2ab; marker-width: 4; } } [feature = 'power_generator']['generator:source' = 'wind']::power, [feature = 'power_generator'][power_source = 'wind']::power { [zoom >= 15] { point-file: url('symbols/power_wind.png'); point-placement: interior; } } [feature = 'man_made_windmill'][zoom >= 16]::man_made { point-file: url('symbols/windmill.png'); point-placement: interior; } [feature = 'man_made_mast'][zoom >= 17]::man_made { point-file: url('symbols/communications.p.20.png'); point-placement: interior; } } .amenity-low-priority { [railway = 'level_crossing'][zoom >= 14]::railway { point-file: url('symbols/level_crossing.svg'); point-placement: interior; [zoom >= 16] { point-file: url('symbols/level_crossing2.svg'); } } [highway = 'mini_roundabout'][zoom >= 16]::highway { marker-file: url('symbols/mini_roundabout.svg'); marker-placement: interior; } [barrier = 'gate']::barrier { [zoom >= 16] { marker-file: url('symbols/gate.svg'); marker-placement: interior; } } [barrier = 'lift_gate'][zoom >= 16]::barrier { marker-file: url('symbols/liftgate.svg'); marker-fill: #3f3f3f; marker-placement: interior } [barrier = 'bollard'], [barrier = 'block'] { [zoom >= 16] { marker-width: 3; marker-line-width: 0; marker-fill: #7d7c7c; marker-placement: interior; [zoom >= 18] { marker-width: 4; } } } } .text-low-zoom[zoom < 10], .text[zoom >= 10] { [feature = 'place_island'][zoom >= 7][way_pixels > 3000], [feature = 'place_island'][zoom >= 16], [feature = 'place_islet'][zoom >= 14][way_pixels > 3000], [feature = 'place_islet'][zoom >= 17] { text-name: "[name]"; text-fill: #000; text-size: 10; [way_pixels > 12000] { text-size: 12; } [way_pixels > 48000] { text-size: 15; } text-face-name: @oblique-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'amenity_pub'], [feature = 'amenity_restaurant'], [feature = 'amenity_cafe'], [feature = 'amenity_fast_food'], [feature = 'amenity_biergarten'], [feature = 'amenity_bar'] { [zoom >= 17] { text-name: "[name]"; text-fill: #734a08; text-size: 10; text-dy: 11; text-face-name: @bold-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [feature = 'amenity_bar']{ text-dy: 13; } } } [feature = 'amenity_library'], [feature = 'amenity_theatre'], [feature = 'amenity_courthouse'], [feature = 'amenity_cinema'] { [zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #734a08; text-dy: 13; text-face-name: @bold-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [feature = 'amenity_cinema'] { text-dy: 15; } } } [feature = 'amenity_parking'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: @transportation-text; text-dy: 9; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [access != ''][access != 'public'][access != 'yes'] { text-fill: #66ccaf; } } [feature = 'amenity_police'][zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #734a08; text-dy: 11; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'amenity_fire_station'][zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #734a08; text-dy: 11; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'amenity_place_of_worship'][zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #000033; text-dy: 12; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'natural_wood'][is_building = 'no'] { [zoom >= 8][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@wood, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_peak'], [feature = 'natural_volcano'] { [zoom >= 13] { text-name: "[name]"; text-size: 10; text-fill: brown; text-dy: 7; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; ele/text-name: "[ele]"; ele/text-size: 9; ele/text-fill: brown; ele/text-dy: 6; ele/text-face-name: @oblique-fonts; ele/text-halo-radius: 1; ele/text-placement: interior; [name != ''] { ele/text-dy: 19; } } } [feature = 'natural_saddle'] { [zoom >= 15] { text-name: "[name]"; text-size: 10; text-fill: brown; text-dy: 7; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; ele/text-name: "[ele]"; ele/text-size: 9; ele/text-fill: brown; ele/text-dy: 6; ele/text-face-name: @oblique-fonts; ele/text-halo-radius: 1; ele/text-placement: interior; [name != ''] { ele/text-dy: 19; } } } [feature = 'natural_cave_entrance'][zoom >= 15] { text-name: "[name]"; text-size: 10; text-fill: brown; text-dy: 11; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'historic_memorial'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: brown; text-dy: 13; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'historic_archaeological_site'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: brown; text-dy: 15; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'natural_water'], [feature = 'natural_lake'], [feature = 'landuse_reservoir'], [feature = 'landuse_basin'] { [way_area >= 40000000][zoom >= 10], [way_area >= 10000000][zoom >= 11], [way_area >= 2400000][zoom >= 12], [way_area >= 600000][zoom >= 13], [way_area >= 150000][zoom >= 14], [way_area >= 80000][zoom >= 15], [way_area >= 20000][zoom >= 16], [zoom >= 17] { text-name: "[name]"; text-size: 12; text-fill: @water-text; text-face-name: @oblique-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } } [feature = 'natural_mud'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: @mud-text; text-face-name: @landcover-face-name; text-halo-radius: 1; text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_wetland'][is_building = 'no'], [feature = 'natural_marsh'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: @wetland-text; text-face-name: @landcover-face-name; text-halo-radius: 1; text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'leisure_swimming_pool'][is_building = 'no'] { [zoom >= 14][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: @marina-text; text-face-name: @landcover-face-name; text-halo-radius: 1; text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'leisure_sports_centre'][is_building = 'no'], [feature = 'leisure_stadium'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@stadium, 30%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'leisure_track'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@track, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'leisure_pitch'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@pitch, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'leisure_playground'] { [way_area >= 150000][zoom >= 14], [way_area >= 80000][zoom >= 15], [way_area >= 20000][zoom >= 16], [zoom >= 17] { text-name: "[name]"; text-size: 11; text-dy: 13; text-fill: darken(@park, 60%); text-face-name: @book-fonts; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @standard-wrap-width; text-placement: interior; } } [feature = 'leisure_park'][is_building = 'no'], [feature = 'leisure_recreation_ground'][is_building = 'no'], [feature = 'landuse_recreation_ground'][is_building = 'no'], [feature = 'landuse_conservation'][is_building = 'no'], [feature = 'landuse_village_green'][is_building = 'no'], [feature = 'leisure_common'][is_building = 'no'], [feature = 'leisure_garden'][is_building = 'no'], [feature = 'leisure_golf_course'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@park, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'boundary_national_park'][is_building = 'no'], [feature = 'leisure_nature_reserve'][is_building = 'no'] { [zoom >= 8][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@park, 70%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_quarry'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@quarry, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_vineyard'][is_building = 'no'], [feature = 'landuse_orchard'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@vineyard, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1.5; /* extra halo needed to overpower the vineyard polygon pattern */ text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_cemetery'][is_building = 'no'], [feature = 'amenity_grave_yard'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@cemetery, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1.5; /* extra halo needed to overpower the cemetery polygon pattern */ text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_residential'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@residential, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_garages'][is_building = 'no'] { [zoom >= 13][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@garages, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_field'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@field, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_meadow'][is_building = 'no'], [feature = 'landuse_grass'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@grass, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_allotments'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@allotments, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_forest'][is_building = 'no'] { [zoom >= 8][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@forest, 30%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_farmyard'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@farmyard, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_farm'][is_building = 'no'], [feature = 'landuse_farmland'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@farmland, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'shop_mall'], [feature = 'landuse_retail'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@retail, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_industrial'][is_building = 'no'], [feature = 'landuse_railway'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@industrial, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_commercial'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@commercial, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_brownfield'][is_building = 'no'], [feature = 'landuse_landfill'][is_building = 'no'], [feature = 'landuse_construction'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@construction, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_bay'][zoom >= 14] { text-name: "[name]"; text-size: 10; text-fill: #6699cc; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'natural_spring'][zoom >= 16] { text-name: "[name]"; text-size: 10; text-fill: #6699cc; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; text-dy: 6; } [feature = 'tourism_alpine_hut'][zoom >= 15] { text-name: "[name]"; text-size: 9; text-fill: #6699cc; text-dy: 11; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [zoom >= 16] { ele/text-name: "[ele]"; ele/text-size: 8; ele/text-fill: #6699cc; ele/text-dy: 23; ele/text-face-name: @oblique-fonts; ele/text-halo-radius: 1; ele/text-placement: interior; } } [feature = 'amenity_shelter'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: #6699cc; text-dy: 11; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; ele/text-name: "[ele]"; ele/text-size: 8; ele/text-fill: #6699cc; ele/text-dy: 23; ele/text-face-name: @oblique-fonts; ele/text-halo-radius: 1; ele/text-placement: interior; } [feature = 'amenity_bank'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: black; text-dy: 12; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; text-face-name: @book-fonts; } [feature = 'tourism_hotel'], [feature = 'tourism_motel'], [feature = 'tourism_hostel'], [feature = 'tourism_chalet'] { [zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #0066ff; text-dy: 13; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [feature = 'tourism_chalet'] { text-dy: 11; } } } [feature = 'amenity_embassy'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: #0066ff; text-dy: 9; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'tourism_guest_house'][zoom >= 17] { text-name: "[name]"; text-size: 8; text-fill: #0066ff; text-dy: 10; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'highway_bus_stop'], [feature = 'amenity_fuel'], [feature = 'amenity_bus_station'] { [zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: @transportation-text; text-dy: 11; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [feature = 'highway_bus_stop'] { text-dy: 9; } } } [feature = 'tourism_camp_site'][zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #0066ff; text-dy: 15; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'tourism_caravan_site'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@campsite, 50%); text-dy: 15; text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'waterway_lock'][zoom >= 15] { text-name: "[name]"; text-size: 9; text-dy: 10; text-fill: #0066ff; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'leisure_marina'][zoom >= 15] { text-name: "[name]"; text-size: 8; text-fill: @marina-text; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; [zoom >= 17] { text-size: 10; } } [feature = 'tourism_theme_park'][is_building = 'no'] { [zoom >= 13][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: @theme_park; text-face-name: @bold-fonts; /*rendered bold to improve visibility since theme parks tend to have crowded backgrounds*/ text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'tourism_museum'][zoom >= 17] { text-name: "[name]"; text-size: 10; text-dy: 11; text-fill: #734a08; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'amenity_prison'][zoom >= 17] { text-name: "[name]"; text-size: 10; text-fill: #734a08; text-dy: 16; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'tourism_attraction'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: #660033; text-face-name: @book-fonts; text-halo-radius: 2; text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'amenity_university'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@school, 70%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'amenity_school'][is_building = 'no'], [feature = 'amenity_college'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@school, 70%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'amenity_kindergarten'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@school, 65%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'man_made_lighthouse'][zoom >= 15] { text-name: "[name]"; text-size: 9; text-fill: #000033; text-dy: 16; text-face-name: @book-fonts; text-halo-radius: 2; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'man_made_windmill'][zoom >= 17] { text-name: "[name]"; text-size: 9; text-fill: #734a08; text-dy: 12; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'amenity_hospital'][zoom >= 16] { text-name: "[name]"; text-fill: #da0092; text-size: 8; text-dy: 10; text-face-name: @book-fonts; text-halo-radius: 2; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'amenity_pharmacy'][zoom >= 17] { text-name: "[name]"; text-size: 8; text-dy: 10; text-fill: #da0092; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'shop_bakery'], [feature = 'shop_clothes'], [feature = 'shop_fashion'], [feature = 'shop_convenience'], [feature = 'shop_doityourself'], [feature = 'shop_hairdresser'], [feature = 'shop_butcher'], [feature = 'shop_car'], [feature = 'shop_car_repair'], [feature = 'shop_bicycle'], [feature = 'shop_florist'], [feature = 'shop_other']{ [zoom >= 17] { text-name: "[name]"; text-size: 10; text-dy: 12; text-fill: #939; text-face-name: @book-fonts; text-halo-radius: 1.5; text-halo-fill: rgba(255, 255, 255, 0.8); text-wrap-width: @standard-wrap-width; text-placement: interior; } } [feature = 'shop_supermarket'], [feature = 'shop_department_store'] { [zoom >= 16] { text-name: "[name]"; text-size: 10; text-dy: 12; text-fill: #939; text-face-name: @book-fonts; text-halo-radius: 1.5; text-halo-fill: rgba(255, 255, 255, 0.8); text-wrap-width: @standard-wrap-width; text-placement: interior; } } [feature = 'military_danger_area'][is_building = 'no'] { [zoom >= 9][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@danger_area, 40%); text-face-name: @bold-fonts; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'landuse_military'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@military, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'aeroway_gate'][zoom >= 17] { text-name: "[ref]"; text-size: 10; text-fill: #aa66cc; text-face-name: @book-fonts; text-halo-radius: 1; text-wrap-width: @standard-wrap-width; text-placement: interior; } [feature = 'military_barracks'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@barracks, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'tourism_zoo'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@zoo, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'power_station'][is_building = 'no'][zoom >= 10], [feature = 'power_generator'][is_building = 'no'][zoom >= 10], [feature = 'power_sub_station'][is_building = 'no'][zoom >= 13], [feature = 'power_substation'][is_building = 'no'][zoom >= 13]{ [way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@power, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_desert'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@desert, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_sand'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@sand, 50%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_heath'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@heath, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_grassland'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@grassland, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_scrub'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@scrub, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'aeroway_apron'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@apron, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'natural_beach'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@beach, 60%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } text-placement: interior; } } [feature = 'highway_services'][is_building = 'no'], [feature = 'highway_rest_area'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@rest_area, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } } } [feature = 'natural_glacier'][is_building = 'no'] { [zoom >= 10][way_pixels > 3000], [zoom >= 17] { text-name: "[name]"; text-size: @landcover-font-size; [way_pixels > 12000] { text-size: @landcover-font-size-big; } [way_pixels > 48000] { text-size: @landcover-font-size-bigger; } text-fill: darken(@glacier, 40%); text-face-name: @landcover-face-name; text-halo-radius: 1; text-halo-fill: rgba(255,255,255,0.6); text-wrap-width: @landcover-wrap-width-size; [way_pixels > 12000] {text-wrap-width: @landcover-wrap-width-size-big; } [way_pixels > 48000] {text-wrap-width: @landcover-wrap-width-size-bigger; } } } [feature = 'aeroway_helipad'][zoom >= 16]::aeroway { text-name: "[name]"; text-size: 8; text-fill: @airtransport; text-dy: -10; text-face-name: @bold-fonts; text-halo-radius: 1; text-placement: interior; text-wrap-width: 30; } [feature = 'aeroway_aerodrome'][zoom >= 10][zoom < 14]::aeroway { text-name: "[name]"; text-size: 8; text-fill: darken(@airtransport, 15%); text-dy: -10; text-face-name: @oblique-fonts; text-halo-radius: 1; text-placement: interior; text-wrap-width: 30; } } ================================================ FILE: samples/Ceylon/Foo.ceylon ================================================ "Test function for Ceylon" by ("Enrique") shared void test() { print("test"); } "Test class for Ceylon" shared class Test(name) satisfies Comparable { shared String name; shared actual String string = "Test ``name``."; shared actual Comparison compare(Test other) { return name<=>other.name; } } ================================================ FILE: samples/Chapel/distributions.chpl ================================================ // // Distributions Primer // // This primer demonstrates uses of some of Chapel's standard // distributions. To use these distributions in a Chapel program, // the respective module must be used: // use BlockDist, CyclicDist, BlockCycDist, ReplicatedDist; use DimensionalDist2D, ReplicatedDim, BlockCycDim; // // For each distribution, we'll create a distributed domain and array // and then initialize it just to give a brief flavor of how the // distribution maps across locales. Running this example on 6 // locales does a nice job of illustrating the distribution // characteristics. // // All of these distributions support options to map to a different // virtual locale grid than the one used by default (a // multidimensional factoring of the built-in Locales array), as well // as to control the amount of parallelism used in data parallel // loops. See the Standard Distributions chapter of the language spec // for more details. // // // Make the program size configurable from the command line. // config const n = 8; // // Declare a 2-dimensional domain Space that we will later use to // initialize the distributed domains. // const Space = {1..n, 1..n}; // // The Block distribution distributes a bounding box from // n-dimensional space across the target locale array viewed as an // n-dimensional virtual locale grid. The bounding box is blocked // into roughly equal portions across the locales. Note that domains // declared over a Block distribution can also store indices outside // of the bounding box; the bounding box is merely used to compute // the blocking of space. // // In this example, we declare a 2-dimensional Block-distributed // domain BlockSpace and a Block-distributed array BA declared over // the domain. // const BlockSpace = Space dmapped Block(boundingBox=Space); var BA: [BlockSpace] int; // // To illustrate how the index set is distributed across locales, // we'll use a forall loop to initialize each array element to the // locale ID that stores that index/element/iteration. // forall ba in BA do ba = here.id; // // The 'hasSingleLocalSubdomain' method on arrays will return true if the // index set for a locale can be represented by a single domain. // if !BA.hasSingleLocalSubdomain() then halt("For a Block distribution, the index set per locale should be \ represented by a single domain"); // // If the distribution's subdomains can be represented as single subdomain, // we can use the 'localSubdomain' method to get the index set for the // current locale. // // Below, we'll use the index set to confirm that the array elements have the // correct locale id. // for L in Locales { on L { const indices = BA.localSubdomain(); for i in indices { if BA[i] != L.id then halt("Error: incorrect locale id"); } } } // // Output the Block-distributed array to visually see how the elements // are partitioned across the locales. // writeln("Block Array Index Map"); writeln(BA); writeln(); // // Most of Chapel's standard distributions support an optional // targetLocales argument that permits you to pass in your own // array of locales to be targeted. In general, the targetLocales // argument should match the rank of the distribution. So for // example, to map a Block to a [numLocales x 1] view of the // locale set, one could do something like this: // // We start by creating our own array of the locale values. Here // we use the standard array reshape function for convenience, // but more generally, this array could be accessed/assigned like any // other. // var MyLocaleView = {0..#numLocales, 1..1}; var MyLocales: [MyLocaleView] locale = reshape(Locales, MyLocaleView); // // Then we'll declare a distributed domain/array that targets // this view of the locales: // const BlockSpace2 = Space dmapped Block(boundingBox=Space, targetLocales=MyLocales); var BA2: [BlockSpace2] int; // // Then we'll do a similar computation as before to verify where // everything ended up: // forall ba in BA2 do ba = here.id; writeln("Block Array Index Map"); writeln(BA2); writeln(); // // We can use the 'targetLocales' method available on an array to get the // locales array used as targets. // for (L, ML) in zip(BA2.targetLocales(), MyLocales) do if L != ML then halt("Error: BA2.targetLocales() should equal MyLocales"); // // Next, we'll perform a similar computation for the Cyclic distribution. // Cyclic distributions start at a designated n-dimensional index and // distribute the n-dimensional space across an n-dimensional array // of locales in a round-robin fashion (in each dimension). As with // the Block distribution, domains may be declared using the // distribution who have lower indices that the starting index; that // value should just be considered a parameterization of how the // distribution is defined. // const CyclicSpace = Space dmapped Cyclic(startIdx=Space.low); var CA: [CyclicSpace] int; forall ca in CA do ca = here.id; writeln("Cyclic Array Index Map"); writeln(CA); writeln(); // // The domain returned by 'localSubdomain' need not be a dense block, as is // the case for the Cyclic Distribution. // on Locales[0] { const indices = CA.localSubdomain(); for i in indices { if CA[i] != 0 then halt("Error: Cyclic array values on Locale 0 should be zero"); } } // // Next, we'll declare a Block-Cyclic distribution. These // distributions also deal out indices in a round-robin fashion, // but rather than dealing out singleton indices, they deal out blocks // of indices. Thus, the BlockCyclic distribution is parameterized // by a starting index (as with Cyclic) and a block size (per // dimension) specifying how large the chunks to be dealt out are. // const BlkCycSpace = Space dmapped BlockCyclic(startIdx=Space.low, blocksize=(2, 3)); var BCA: [BlkCycSpace] int; forall bca in BCA do bca = here.id; writeln("Block-Cyclic Array Index Map"); writeln(BCA); writeln(); // // A locale's index set for a Block-Cyclic distribution cannot be represented // by a single subdomain. // if BCA.hasSingleLocalSubdomain() then halt("A Block-Cyclic index set cannot be represented by a single subdomain"); // // If the local index set cannot be represented by a single subdomain, // we can use the 'localSubdomains' iterator to yield a number of domains // that represent the whole index set. // // Let's write a function that will use 'localSubdomains' to verify the // correctness of the array values. // proc verifyID(Data: []) { for L in Locales { on L { for indices in Data.localSubdomains() { for i in indices { if Data[i] != L.id then halt("Error: incorrect locale id"); } } } } } verifyID(BCA); // // The 'localSubdomains' iterator is also available on distributions that // can represent a locale's index set with a single domain. This allows us to // write more general code that will work for all distributions. // // This means that we can call the 'verifyID' function on any array, like the // 'BA' array from earlier. // verifyID(BA); // // The ReplicatedDist distribution is different: each of the // original domain's indices - and the corresponding array elements - // is replicated onto each locale. (Note: consistency among these // array replicands is NOT maintained automatically.) // // This replication is observable in some cases but not others, // as shown below. Note: this behavior may change in the future. // const ReplicatedSpace = Space dmapped ReplicatedDist(); var RA: [ReplicatedSpace] int; // The replication is observable - this visits each replicand. forall ra in RA do ra = here.id; writeln("Replicated Array Index Map, ", RA.numElements, " elements total"); writeln(RA); writeln(); // // The replication is observable when the replicated array is // on the left-hand side. If the right-hand side is not replicated, // it is copied into each replicand. // We illustrate this using a non-distributed array. // var A: [Space] int = [(i,j) in Space] i*100 + j; RA = A; writeln("Replicated Array after being array-assigned into"); writeln(RA); writeln(); // // Analogously, each replicand will be visited and // other participated expressions will be computed on each locale // (a) when the replicated array is assigned a scalar: // RA = 5; // (b) when it appears first in a zippered forall loop: // forall (ra, a) in zip(RA, A) do ...; // (c) when it appears in a for loop: // for ra in RA do ...; // // Zippering (RA,A) or (A,RA) in a 'for' loop will generate // an error due to their different number of elements. // Let RA store the Index Map again, for the examples below. forall ra in RA do ra = here.id; // // Only the local replicand is accessed - replication is NOT observable // and consistency is NOT maintained - when: // (a) the replicated array is indexed - an individual element is read... // on Locales(0) do writeln("on ", here, ": ", RA(Space.low)); on Locales(LocaleSpace.high) do writeln("on ", here, ": ", RA(Space.low)); writeln(); // ...or an individual element is written; on Locales(LocaleSpace.high) do RA(Space.low) = 7777; writeln("Replicated Array after being indexed into"); writeln(RA); writeln(); // // (b) the replicated array is on the right-hand side of an assignment... // on Locales(LocaleSpace.high) do A = RA + 4; writeln("Non-Replicated Array after assignment from Replicated Array + 4"); writeln(A); writeln(); // // (c) ...or, generally, the replicated array or domain participates // in a zippered forall loop, but not in the first position. // The loop could look like: // // forall (a, (i,j), ra) in (A, ReplicatedSpace, RA) do ...; // // // The DimensionalDist2D distribution lets us build a 2D distribution // as a composition of specifiers for individual dimensions. // Under such a "dimensional" distribution each dimension is handled // independently of the other. // // The dimension specifiers are similar to the corresponding multi-dimensional // distributions in constructor arguments and index-to-locale mapping rules. // However, instead of an array of locales, a specifier constructor // accepts just the number of locales that the indices in the corresponding // dimension will be distributed across. // // The DimensionalDist2D constructor requires: // * an [0..nl1-1, 0..nl2-1] array of locales, where // nl1 and nl2 are the number of locales in each dimension, and // * two dimension specifiers, created for nl1 and nl2 locale counts, resp. // // Presently, the following dimension specifiers are available // (shown here with their constructor arguments): // // * ReplicatedDim(numLocales) // * BlockDim(numLocales, boundingBoxLow, boundingBoxHigh) // * BlockCyclicDim(lowIdx, blockSize, numLocales) // // // The following example creates a dimensional distribution that // replicates over 2 locales (when available) in the first dimemsion // and distributes using block-cyclic distribution in the second dimension. // The example computes nl1 and nl2 and reshapes MyLocales correspondingly. // var (nl1, nl2) = if numLocales == 1 then (1, 1) else (2, numLocales/2); MyLocaleView = {0..#nl1, 0..#nl2}; MyLocales = reshape(Locales[0..#nl1*nl2], MyLocaleView); const DimReplicatedBlockcyclicSpace = Space dmapped DimensionalDist2D(MyLocales, new ReplicatedDim(numLocales = nl1), new BlockCyclicDim(numLocales = nl2, lowIdx = 1, blockSize = 2)); var DRBA: [DimReplicatedBlockcyclicSpace] int; // The ReplicatedDim specifier always accesses the local replicand. // (This differs from how the ReplicatedDist distribution works.) // // This example visits each replicand. The behavior is the same // regardless of the second index into MyLocales below. for locId1 in 0..#nl1 do on MyLocales[locId1, 0] { forall drba in DRBA do drba = here.id; writeln("Dimensional2D(Replicated,BlockCyclic) Array Index Map", " from ", here); // Technicality: 'writeln(DRBA)' would read DRBA always on Locale 0. // Since we want to see what DRBA contains on the current locale, // we use 'Helper' that is mapped using the default distribution. // 'Helper = DRBA' captures the view of DRBA on the current locale, // which we then print out. const Helper: [Space] int = DRBA; writeln(Helper); writeln(); } ================================================ FILE: samples/Chapel/hello.chpl ================================================ writeln("Hello, world!"); // print 'Hello, world!' to the console ================================================ FILE: samples/Chapel/lulesh.chpl ================================================ /* Derived from the DARPA/Livermore Unstructured Lagrangian Explicit Shock Hydrodynamics (LULESH) https://computation.llnl.gov/casc/ShockHydro/ Original port to Chapel by Brandon Holt (8/2011). Further improvements for the sake of performance and/or generality made by Sung-Eun Choi (12/2011, 11/2012), Jeff Keasler (3/2012), and Brad Chamberlain (3-4,9-11/2012, 2/2013). Notes on the Initial Implementation ----------------------------------- This implementation was designed to mirror the overall structure of the C++ Lulesh but use Chapel constructs where they can help make the code more readable, easier to maintain, or more 'elegant'. Function names are preserved for the most part, with some additional helper functions, and original comments from the C++ code are interspersed approximately where they belong to give an idea of how the two codes line up. One major difference for this Chapel version is the use of a number of module-level variables and constants. Status: This code remains a work-in-progress as we gain further experience with it. Proposed improvements are noted in the README in this directory and (in some cases) in TODO comments in the code. */ use Time, // to get timing routines for benchmarking BlockDist; // for block-distributed arrays use luleshInit; // initialization code for data set /* The configuration parameters for lulesh. These can be set on the compiler command line using -s=. For example, chpl -suseBlockDist=true useBlockDist : says whether or not to block-distribute the arrays. The default is based on the value of CHPL_COMM, as an indication of whether this is a single- or multi- locale execution. use3DRepresentation : indicates whether the element node arrays should be stored using a 3D representation (limiting the execution to cube inputs) or the more general 1D representation (supporting arbitrary data sets). useSparseMaterials : indicates whether sparse domains/arrays should be used to represent the materials. Sparse domains are more realistic in that they permit an arbitrary subset of the problem space to store a material. Dense domains are sufficient for LULESH since there's an assumption that the material spans all cells. printWarnings : prints performance-oriented warnings to prevent surprises. */ config param useBlockDist = (CHPL_COMM != "none"), use3DRepresentation = false, useSparseMaterials = true, printWarnings = true; // // Sanity check to ensure that input files aren't used with the 3D // representation // if (use3DRepresentation && (luleshInit.filename != "")) then halt("The 3D representation does not support reading input from files"); /* Configuration constants: Override defaults on executable's command-line */ config const initialEnergy = 3.948746e+7; // initial energy value config const showProgress = false, // print time and dt values on each step debug = false, // print various debug info doTiming = true, // time the main timestep loop printCoords = true; // print the final computed coordinates /* Compile-time constants */ param XI_M = 0x003, XI_M_SYMM = 0x001, XI_M_FREE = 0x002, XI_P = 0x00c, XI_P_SYMM = 0x004, XI_P_FREE = 0x008, ETA_M = 0x030, ETA_M_SYMM = 0x010, ETA_M_FREE = 0x020, ETA_P = 0x0c0, ETA_P_SYMM = 0x040, ETA_P_FREE = 0x080, ZETA_M = 0x300, ZETA_M_SYMM = 0x100, ZETA_M_FREE = 0x200, ZETA_P = 0xc00, ZETA_P_SYMM = 0x400, ZETA_P_FREE = 0x800; /* Set up the problem size */ const (numElems, numNodes) = initProblemSize(); /* Declare abstract problem domains */ const ElemSpace = if use3DRepresentation then {0..#elemsPerEdge, 0..#elemsPerEdge, 0..#elemsPerEdge} else {0..#numElems}, NodeSpace = if use3DRepresentation then {0..#nodesPerEdge, 0..#nodesPerEdge, 0..#nodesPerEdge} else {0..#numNodes}; /* Declare the (potentially distributed) problem domains */ const Elems = if useBlockDist then ElemSpace dmapped Block(ElemSpace) else ElemSpace, Nodes = if useBlockDist then NodeSpace dmapped Block(NodeSpace) else NodeSpace; /* The coordinates */ var x, y, z: [Nodes] real; /* The number of nodes per element. In a rank-independent version, this could be written 2**rank */ param nodesPerElem = 8; // We could name this, but chose not to since it doesn't add that much clarity // // const elemNeighbors = 1..nodesPerElem; /* The element-to-node mapping */ var elemToNode: [Elems] nodesPerElem*index(Nodes); /* the Greek variables */ var lxim, lxip, letam, letap, lzetam, lzetap: [Elems] index(Elems); /* the X, Y, Z Symmetry values */ var XSym, YSym, ZSym: sparse subdomain(Nodes); /* Constants */ const u_cut = 1.0e-7, /* velocity tolerance */ hgcoef = 3.0, /* hourglass control */ qstop = 1.0e+12, /* excessive q indicator */ monoq_max_slope = 1.0, monoq_limiter_mult = 2.0, e_cut = 1.0e-7, /* energy tolerance */ p_cut = 1.0e-7, /* pressure tolerance */ ss4o3 = 4.0/3.0, q_cut = 1.0e-7, /* q tolerance */ v_cut = 1.0e-10, /* relative volume tolerance */ qlc_monoq = 0.5, /* linear term coef for q */ qqc_monoq = 2.0/3.0, /* quadratic term coef for q */ qqc = 2.0, qqc2 = 64.0 * qqc**2, eosvmax = 1.0e+9, eosvmin = 1.0e-9, pmin = 0.0, /* pressure floor */ emin = -1.0e+15, /* energy floor */ dvovmax = 0.1, /* maximum allowable volume change */ refdens = 1.0, /* reference density */ deltatimemultlb = 1.1, deltatimemultub = 1.2, dtmax = 1.0e-2; /* maximum allowable time increment */ config const stoptime = 1.0e-2, /* end time for simulation */ maxcycles = max(int), /* max number of cycles to simulate */ dtfixed = -1.0e-7; /* fixed time increment */ /* The list of material elements */ const MatElems: MatElemsType = if useSparseMaterials then enumerateMatElems() else Elems; proc MatElemsType type { if useSparseMaterials { if (printWarnings && useBlockDist && numLocales > 1) then writeln("WARNING: The LULESH Material Elements (MatElems) are not yet\n", " distributed, so result in excessive memory use on,\n", " and communication with, locale 0\n"); return sparse subdomain(Elems); } else return Elems.type; } iter enumerateMatElems() { if (printWarnings && useBlockDist && numLocales > 1) then writeln("WARNING: generation of matrix elements is serial and\n", " unlikely to scale"); for i in Elems do yield i; } /* Element fields */ var elemBC: [Elems] int, e: [Elems] real, // energy p: [Elems] real, // pressure q: [Elems] real, // q ql: [Elems] real, // linear term for q qq: [Elems] real, // quadratic term for q v: [Elems] real = 1.0, //relative volume vnew: [Elems] real, volo: [Elems] real, // reference volume delv: [Elems] real, // m_vnew - m_v vdov: [Elems] real, // volume derivative over volume arealg: [Elems] real, // elem characteristic length ss: [Elems] real, // "sound speed" elemMass: [Elems] real; // mass /* Nodal fields */ var xd, yd, zd: [Nodes] real, // velocities xdd, ydd, zdd: [Nodes] real, // acceleration fx, fy, fz: [Nodes] atomic real, // forces nodalMass: [Nodes] real; // mass /* Parameters */ var time = 0.0, // current time deltatime = 1.0e-7, // variable time increment dtcourant = 1.0e20, // courant constraint dthydro = 1.0e20, // volume change constraint cycle = 0; // iteration count for simulation proc main() { if debug then writeln("Lulesh -- Problem Size = ", numElems); initLulesh(); var st: real; if doTiming then st = getCurrentTime(); while (time < stoptime && cycle < maxcycles) { const iterTime = if showProgress then getCurrentTime() else 0.0; TimeIncrement(); LagrangeLeapFrog(); if debug { deprintatomic("[[ Forces ]]", fx, fy, fz); deprint("[[ Positions ]]", x, y, z); deprint("[[ p, e, q ]]", p, e, q); } if showProgress then writef("time = %er, dt=%er, %s", time, deltatime, if doTiming then ", elapsed = " + (getCurrentTime()-iterTime) +"\n" else "\n"); } if (cycle == maxcycles) { writeln("Stopped early due to reaching maxnumsteps"); } if doTiming { const et = getCurrentTime(); writeln("Total Time: ", et-st); writeln("Time/Cycle: ", (et-st)/cycle); } writeln("Number of cycles: ", cycle); if printCoords { var outfile = open("coords.out", iomode.cw); var writer = outfile.writer(); var fmtstr = if debug then "%1.9re %1.9er %1.9er\n" else "%1.4er %1.4er %1.4er\n"; for i in Nodes do writer.writef(fmtstr, x[i], y[i], z[i]); writer.close(); outfile.close(); } } /* Initialization functions */ proc initLulesh() { // initialize the coordinates initCoordinates(x,y,z); // initialize the element to node mapping initElemToNodeMapping(elemToNode); // initialize the greek symbols initGreekVars(lxim, lxip, letam, letap, lzetam, lzetap); // initialize the symmetry plane locations initXSyms(XSym); initYSyms(YSym); initZSyms(ZSym); /* embed hexehedral elements in nodal point lattice */ //calculated on the fly using: elemToNodes(i: index(Elems)): index(Nodes) // initialize the masses initMasses(); // initialize the boundary conditions const octantCorner = initBoundaryConditions(); // deposit the energy for Sedov Problem e[octantCorner] = initialEnergy; } proc initMasses() { // This is a temporary array used to accumulate masses in parallel // without losing updates by using 'atomic' variables var massAccum: [Nodes] atomic real; forall eli in Elems { var x_local, y_local, z_local: 8*real; localizeNeighborNodes(eli, x, x_local, y, y_local, z, z_local); const volume = CalcElemVolume(x_local, y_local, z_local); volo[eli] = volume; elemMass[eli] = volume; for neighbor in elemToNodes[eli] do massAccum[neighbor].add(volume); } // When we're done, copy the accumulated masses into nodalMass, at // which point the massAccum array can go away (and will at the // procedure's return forall i in Nodes do nodalMass[i] = massAccum[i].read() / 8.0; if debug { writeln("ElemMass:"); for mass in elemMass do writeln(mass); writeln("NodalMass:"); for mass in nodalMass do writeln(mass); } } proc initBoundaryConditions() { var surfaceNode: [Nodes] int; forall n in XSym do surfaceNode[n] = 1; forall n in YSym do surfaceNode[n] = 1; forall n in ZSym do surfaceNode[n] = 1; forall e in Elems do { var mask: int; for i in 1..nodesPerElem do mask += surfaceNode[elemToNode[e][i]] << (i-1); // TODO: make an inlined function for this little idiom? (and below) if ((mask & 0x0f) == 0x0f) then elemBC[e] |= ZETA_M_SYMM; if ((mask & 0xf0) == 0xf0) then elemBC[e] |= ZETA_P_SYMM; if ((mask & 0x33) == 0x33) then elemBC[e] |= ETA_M_SYMM; if ((mask & 0xcc) == 0xcc) then elemBC[e] |= ETA_P_SYMM; if ((mask & 0x99) == 0x99) then elemBC[e] |= XI_M_SYMM; if ((mask & 0x66) == 0x66) then elemBC[e] |= XI_P_SYMM; } // // We find the octant corner by looking for the element with // all three SYMM flags set, which will have the largest // integral value. Thus, we can use a maxloc to identify it. // const (check, loc) = maxloc reduce zip(elemBC, Elems); if debug then writeln("Found the octant corner at: ", loc); if (check != (XI_M_SYMM | ETA_M_SYMM | ZETA_M_SYMM)) then halt("maxloc got a value of ", check, " at loc ", loc); // TODO: This is an example of an array that, in a distributed // memory code, would typically be completely local and only storing // the local nodes owned by the locale -- noting that some nodes // are logically owned by multiple locales and therefore would // redundantly be stored in both locales' surfaceNode arrays -- it's // essentially local scratchspace that does not need to be communicated // or kept coherent across locales. // surfaceNode = 0; /* the free surfaces */ var freeSurface: sparse subdomain(Nodes); // initialize the free surface initFreeSurface(freeSurface); forall n in freeSurface do surfaceNode[n] = 1; forall e in Elems do { var mask: int; for i in 1..nodesPerElem do mask += surfaceNode[elemToNode[e][i]] << (i-1); if ((mask & 0x0f) == 0x0f) then elemBC[e] |= ZETA_M_FREE; if ((mask & 0xf0) == 0xf0) then elemBC[e] |= ZETA_P_FREE; if ((mask & 0x33) == 0x33) then elemBC[e] |= ETA_M_FREE; if ((mask & 0xcc) == 0xcc) then elemBC[e] |= ETA_P_FREE; if ((mask & 0x99) == 0x99) then elemBC[e] |= XI_M_FREE; if ((mask & 0x66) == 0x66) then elemBC[e] |= XI_P_FREE; } if debug { writeln("elemBC:"); for b in elemBC do writeln(b); } return loc; } /* Helper functions */ inline proc localizeNeighborNodes(eli: index(Elems), x: [] real, ref x_local: 8*real, y: [] real, ref y_local: 8*real, z: [] real, ref z_local: 8*real) { for i in 1..nodesPerElem { const noi = elemToNode[eli][i]; x_local[i] = x[noi]; y_local[i] = y[noi]; z_local[i] = z[noi]; } } inline proc TripleProduct(x1, y1, z1, x2, y2, z2, x3, y3, z3) { return x1*(y2*z3 - z2*y3) + x2*(z1*y3 - y1*z3) + x3*(y1*z2 - z1*y2); } proc CalcElemVolume(x, y, z) { const dx61 = x[7] - x[2], dy61 = y[7] - y[2], dz61 = z[7] - z[2], dx70 = x[8] - x[1], dy70 = y[8] - y[1], dz70 = z[8] - z[1], dx63 = x[7] - x[4], dy63 = y[7] - y[4], dz63 = z[7] - z[4], dx20 = x[3] - x[1], dy20 = y[3] - y[1], dz20 = z[3] - z[1], dx50 = x[6] - x[1], dy50 = y[6] - y[1], dz50 = z[6] - z[1], dx64 = x[7] - x[5], dy64 = y[7] - y[5], dz64 = z[7] - z[5], dx31 = x[4] - x[2], dy31 = y[4] - y[2], dz31 = z[4] - z[2], dx72 = x[8] - x[3], dy72 = y[8] - y[3], dz72 = z[8] - z[3], dx43 = x[5] - x[4], dy43 = y[5] - y[4], dz43 = z[5] - z[4], dx57 = x[6] - x[8], dy57 = y[6] - y[8], dz57 = z[6] - z[8], dx14 = x[2] - x[5], dy14 = y[2] - y[5], dz14 = z[2] - z[5], dx25 = x[3] - x[6], dy25 = y[3] - y[6], dz25 = z[3] - z[6]; const volume = TripleProduct(dx31 + dx72, dx63, dx20, dy31 + dy72, dy63, dy20, dz31 + dz72, dz63, dz20) + TripleProduct(dx43 + dx57, dx64, dx70, dy43 + dy57, dy64, dy70, dz43 + dz57, dz64, dz70) + TripleProduct(dx14 + dx25, dx61, dx50, dy14 + dy25, dy61, dy50, dz14 + dz25, dz61, dz50); return volume / 12.0; } proc InitStressTermsForElems(p, q, sigxx, sigyy, sigzz: [?D] real) { forall i in D { sigxx[i] = -p[i] - q[i]; sigyy[i] = -p[i] - q[i]; sigzz[i] = -p[i] - q[i]; } } proc CalcElemShapeFunctionDerivatives(x: 8*real, y: 8*real, z: 8*real, ref b_x: 8*real, ref b_y: 8*real, ref b_z: 8*real, ref volume: real) { const fjxxi = .125 * ((x[7]-x[1]) + (x[6]-x[4]) - (x[8]-x[2]) - (x[5]-x[3])), fjxet = .125 * ((x[7]-x[1]) - (x[6]-x[4]) + (x[8]-x[2]) - (x[5]-x[3])), fjxze = .125 * ((x[7]-x[1]) + (x[6]-x[4]) + (x[8]-x[2]) + (x[5]-x[3])), fjyxi = .125 * ((y[7]-y[1]) + (y[6]-y[4]) - (y[8]-y[2]) - (y[5]-y[3])), fjyet = .125 * ((y[7]-y[1]) - (y[6]-y[4]) + (y[8]-y[2]) - (y[5]-y[3])), fjyze = .125 * ((y[7]-y[1]) + (y[6]-y[4]) + (y[8]-y[2]) + (y[5]-y[3])), fjzxi = .125 * ((z[7]-z[1]) + (z[6]-z[4]) - (z[8]-z[2]) - (z[5]-z[3])), fjzet = .125 * ((z[7]-z[1]) - (z[6]-z[4]) + (z[8]-z[2]) - (z[5]-z[3])), fjzze = .125 * ((z[7]-z[1]) + (z[6]-z[4]) + (z[8]-z[2]) + (z[5]-z[3])); /* compute cofactors */ const cjxxi = (fjyet * fjzze) - (fjzet * fjyze), cjxet = - (fjyxi * fjzze) + (fjzxi * fjyze), cjxze = (fjyxi * fjzet) - (fjzxi * fjyet), cjyxi = - (fjxet * fjzze) + (fjzet * fjxze), cjyet = (fjxxi * fjzze) - (fjzxi * fjxze), cjyze = - (fjxxi * fjzet) + (fjzxi * fjxet), cjzxi = (fjxet * fjyze) - (fjyet * fjxze), cjzet = - (fjxxi * fjyze) + (fjyxi * fjxze), cjzze = (fjxxi * fjyet) - (fjyxi * fjxet); /* calculate partials : this need only be done for l = 0,1,2,3 since , by symmetry , (6,7,4,5) = - (0,1,2,3) . */ b_x[1] = - cjxxi - cjxet - cjxze; b_x[2] = cjxxi - cjxet - cjxze; b_x[3] = cjxxi + cjxet - cjxze; b_x[4] = - cjxxi + cjxet - cjxze; b_x[5] = -b_x[3]; b_x[6] = -b_x[4]; b_x[7] = -b_x[1]; b_x[8] = -b_x[2]; b_y[1] = - cjyxi - cjyet - cjyze; b_y[2] = cjyxi - cjyet - cjyze; b_y[3] = cjyxi + cjyet - cjyze; b_y[4] = - cjyxi + cjyet - cjyze; b_y[5] = -b_y[3]; b_y[6] = -b_y[4]; b_y[7] = -b_y[1]; b_y[8] = -b_y[2]; b_z[1] = - cjzxi - cjzet - cjzze; b_z[2] = cjzxi - cjzet - cjzze; b_z[3] = cjzxi + cjzet - cjzze; b_z[4] = - cjzxi + cjzet - cjzze; b_z[5] = -b_z[3]; b_z[6] = -b_z[4]; b_z[7] = -b_z[1]; b_z[8] = -b_z[2]; /* calculate jacobian determinant (volume) */ volume = 8.0 * ( fjxet * cjxet + fjyet * cjyet + fjzet * cjzet); } proc CalcElemNodeNormals(ref pfx: 8*real, ref pfy: 8*real, ref pfz: 8*real, x: 8*real, y: 8*real, z: 8*real) { proc ElemFaceNormal(param n1, param n2, param n3, param n4) { const bisectX0 = 0.5 * (x[n4] + x[n3] - x[n2] - x[n1]), bisectY0 = 0.5 * (y[n4] + y[n3] - y[n2] - y[n1]), bisectZ0 = 0.5 * (z[n4] + z[n3] - z[n2] - z[n1]), bisectX1 = 0.5 * (x[n3] + x[n2] - x[n4] - x[n1]), bisectY1 = 0.5 * (y[n3] + y[n2] - y[n4] - y[n1]), bisectZ1 = 0.5 * (z[n3] + z[n2] - z[n4] - z[n1]), areaX = 0.25 * (bisectY0 * bisectZ1 - bisectZ0 * bisectY1), areaY = 0.25 * (bisectZ0 * bisectX1 - bisectX0 * bisectZ1), areaZ = 0.25 * (bisectX0 * bisectY1 - bisectY0 * bisectX1); var rx, ry, rz: 8*real; //results (rx[n1], rx[n2], rx[n3], rx[n4]) = (areaX, areaX, areaX, areaX); (ry[n1], ry[n2], ry[n3], ry[n4]) = (areaY, areaY, areaY, areaY); (rz[n1], rz[n2], rz[n3], rz[n4]) = (areaZ, areaZ, areaZ, areaZ); return (rx, ry, rz); } // calculate total normal from each face (faces are made up of // combinations of nodes) (pfx, pfy, pfz) = ElemFaceNormal(1,2,3,4) + ElemFaceNormal(1,5,6,2) + ElemFaceNormal(2,6,7,3) + ElemFaceNormal(3,7,8,4) + ElemFaceNormal(4,8,5,1) + ElemFaceNormal(5,8,7,6); } proc SumElemStressesToNodeForces(b_x: 8*real, b_y: 8*real, b_z: 8*real, stress_xx:real, stress_yy:real, stress_zz: real, ref fx: 8*real, ref fy: 8*real, ref fz: 8*real) { for i in 1..8 { fx[i] = -(stress_xx * b_x[i]); fy[i] = -(stress_yy * b_y[i]); fz[i] = -(stress_zz * b_z[i]); } } proc CalcElemVolumeDerivative(x: 8*real, y: 8*real, z: 8*real) { proc VoluDer(param n0, param n1, param n2, param n3, param n4, param n5) { const ox = (y[n1] + y[n2]) * (z[n0] + z[n1]) - (y[n0] + y[n1]) * (z[n1] + z[n2]) + (y[n0] + y[n4]) * (z[n3] + z[n4]) - (y[n3] + y[n4]) * (z[n0] + z[n4]) - (y[n2] + y[n5]) * (z[n3] + z[n5]) + (y[n3] + y[n5]) * (z[n2] + z[n5]), oy = - (x[n1] + x[n2]) * (z[n0] + z[n1]) + (x[n0] + x[n1]) * (z[n1] + z[n2]) - (x[n0] + x[n4]) * (z[n3] + z[n4]) + (x[n3] + x[n4]) * (z[n0] + z[n4]) + (x[n2] + x[n5]) * (z[n3] + z[n5]) - (x[n3] + x[n5]) * (z[n2] + z[n5]), oz = - (y[n1] + y[n2]) * (x[n0] + x[n1]) + (y[n0] + y[n1]) * (x[n1] + x[n2]) - (y[n0] + y[n4]) * (x[n3] + x[n4]) + (y[n3] + y[n4]) * (x[n0] + x[n4]) + (y[n2] + y[n5]) * (x[n3] + x[n5]) - (y[n3] + y[n5]) * (x[n2] + x[n5]); return (ox/12.0, oy/12.0, oz/12.0); } var dvdx, dvdy, dvdz: 8*real; (dvdx[1], dvdy[1], dvdz[1]) = VoluDer(2,3,4,5,6,8); (dvdx[4], dvdy[4], dvdz[4]) = VoluDer(1,2,3,8,5,7); (dvdx[3], dvdy[3], dvdz[3]) = VoluDer(4,1,2,7,8,6); (dvdx[2], dvdy[2], dvdz[2]) = VoluDer(3,4,1,6,7,5); (dvdx[5], dvdy[5], dvdz[5]) = VoluDer(8,7,6,1,4,2); (dvdx[6], dvdy[6], dvdz[6]) = VoluDer(5,8,7,2,1,3); (dvdx[7], dvdy[7], dvdz[7]) = VoluDer(6,5,8,3,2,4); (dvdx[8], dvdy[8], dvdz[8]) = VoluDer(7,6,5,4,3,1); return (dvdx, dvdy, dvdz); } inline proc CalcElemFBHourglassForce(xd: 8*real, yd: 8*real, zd: 8*real, hourgam: 8*(4*real), coefficient: real, ref hgfx: 8*real, ref hgfy: 8*real, ref hgfz: 8*real) { var hx, hy, hz: 4*real; // reduction for i in 1..4 { for j in 1..8 { hx[i] += hourgam[j][i] * xd[j]; hy[i] += hourgam[j][i] * yd[j]; hz[i] += hourgam[j][i] * zd[j]; } } for i in 1..8 { var shx, shy, shz: real; for j in 1..4 { shx += hourgam[i][j] * hx[j]; shy += hourgam[i][j] * hy[j]; shz += hourgam[i][j] * hz[j]; } hgfx[i] = coefficient * shx; hgfy[i] = coefficient * shy; hgfz[i] = coefficient * shz; } } proc CalcElemCharacteristicLength(x, y, z, volume) { proc AreaFace(param p0, param p1, param p2, param p3) { const fx = (x[p2] - x[p0]) - (x[p3] - x[p1]), fy = (y[p2] - y[p0]) - (y[p3] - y[p1]), fz = (z[p2] - z[p0]) - (z[p3] - z[p1]), gx = (x[p2] - x[p0]) + (x[p3] - x[p1]), gy = (y[p2] - y[p0]) + (y[p3] - y[p1]), gz = (z[p2] - z[p0]) + (z[p3] - z[p1]), area = (fx * fx + fy * fy + fz * fz) * (gx * gx + gy * gy + gz * gz) - (fx * gx + fy * gy + fz * gz) * (fx * gx + fy * gy + fz * gz); return area ; } const charLength = max(AreaFace(1, 2, 3, 4), AreaFace(5, 6, 7, 8), AreaFace(1, 2, 6, 5), AreaFace(2, 3, 7, 6), AreaFace(3, 4, 8, 7), AreaFace(4, 1, 5, 8)); return 4.0 * volume / sqrt(charLength); } proc CalcElemVelocityGradient(xvel, yvel, zvel, pfx, pfy, pfz, detJ, ref d: 6*real) { const inv_detJ = 1.0 / detJ; d[1] = inv_detJ * ( pfx[1] * (xvel[1]-xvel[7]) + pfx[2] * (xvel[2]-xvel[8]) + pfx[3] * (xvel[3]-xvel[5]) + pfx[4] * (xvel[4]-xvel[6]) ); d[2] = inv_detJ * ( pfy[1] * (yvel[1]-yvel[7]) + pfy[2] * (yvel[2]-yvel[8]) + pfy[3] * (yvel[3]-yvel[5]) + pfy[4] * (yvel[4]-yvel[6]) ); d[3] = inv_detJ * ( pfz[1] * (zvel[1]-zvel[7]) + pfz[2] * (zvel[2]-zvel[8]) + pfz[3] * (zvel[3]-zvel[5]) + pfz[4] * (zvel[4]-zvel[6]) ); const dyddx = inv_detJ * ( pfx[1] * (yvel[1]-yvel[7]) + pfx[2] * (yvel[2]-yvel[8]) + pfx[3] * (yvel[3]-yvel[5]) + pfx[4] * (yvel[4]-yvel[6]) ), dxddy = inv_detJ * ( pfy[1] * (xvel[1]-xvel[7]) + pfy[2] * (xvel[2]-xvel[8]) + pfy[3] * (xvel[3]-xvel[5]) + pfy[4] * (xvel[4]-xvel[6]) ), dzddx = inv_detJ * ( pfx[1] * (zvel[1]-zvel[7]) + pfx[2] * (zvel[2]-zvel[8]) + pfx[3] * (zvel[3]-zvel[5]) + pfx[4] * (zvel[4]-zvel[6]) ), dxddz = inv_detJ * ( pfz[1] * (xvel[1]-xvel[7]) + pfz[2] * (xvel[2]-xvel[8]) + pfz[3] * (xvel[3]-xvel[5]) + pfz[4] * (xvel[4]-xvel[6]) ), dzddy = inv_detJ * ( pfy[1] * (zvel[1]-zvel[7]) + pfy[2] * (zvel[2]-zvel[8]) + pfy[3] * (zvel[3]-zvel[5]) + pfy[4] * (zvel[4]-zvel[6]) ), dyddz = inv_detJ * ( pfz[1] * (yvel[1]-yvel[7]) + pfz[2] * (yvel[2]-yvel[8]) + pfz[3] * (yvel[3]-yvel[5]) + pfz[4] * (yvel[4]-yvel[6]) ); d[6] = 0.5 * ( dxddy + dyddx ); d[5] = 0.5 * ( dxddz + dzddx ); d[4] = 0.5 * ( dzddy + dyddz ); } proc CalcPressureForElems(p_new: [?D] real, bvc, pbvc, e_old, compression, vnewc, pmin: real, p_cut: real, eosvmax: real) { // // TODO: Uncomment local once sparse domain is distributed // forall i in D /* do local */ { const c1s = 2.0 / 3.0; bvc[i] = c1s * (compression[i] + 1.0); pbvc[i] = c1s; } forall i in D { p_new[i] = bvc[i] * e_old[i]; if abs(p_new[i]) < p_cut then p_new[i] = 0.0; if vnewc[i] >= eosvmax then p_new[i] = 0.0; //impossible? if p_new[i] < pmin then p_new[i] = pmin; } } proc TimeIncrement() { var targetdt = stoptime - time; if dtfixed <= 0.0 && cycle != 0 { //don't do this the first cycle var olddt = deltatime, newdt = 1.0e20; if dtcourant < newdt then newdt = dtcourant / 2.0; if dthydro < newdt then newdt = 2.0/3.0 * dthydro; const ratio = newdt / olddt; if ratio >= 1.0 { if ratio < deltatimemultlb then newdt = olddt; else if ratio > deltatimemultub then newdt = olddt * deltatimemultub; } if newdt > dtmax then newdt = dtmax; deltatime = newdt; } /* TRY TO PREVENT VERY SMALL SCALING ON THE NEXT CYCLE */ if targetdt > deltatime && targetdt < (4.0/3.0 * deltatime) { targetdt = 2.0/3.0 * deltatime; } if targetdt < deltatime then deltatime = targetdt; time += deltatime; cycle += 1; } inline proc LagrangeLeapFrog() { /* calculate nodal forces, accelerations, velocities, positions, with * applied boundary conditions and slide surface considerations */ LagrangeNodal(); /* calculate element quantities (i.e. velocity gradient & q), and update * material states */ LagrangeElements(); CalcTimeConstraintsForElems(); } inline proc LagrangeNodal() { CalcForceForNodes(); CalcAccelerationForNodes(); ApplyAccelerationBoundaryConditionsForNodes(); CalcVelocityForNodes(deltatime, u_cut); CalcPositionForNodes(deltatime); } inline proc LagrangeElements() { CalcLagrangeElements(); /* Calculate Q. (Monotonic q option requires communication) */ CalcQForElems(); ApplyMaterialPropertiesForElems(); UpdateVolumesForElems(); } inline proc CalcTimeConstraintsForElems() { /* evaluate time constraint */ CalcCourantConstraintForElems(); /* check hydro constraint */ CalcHydroConstraintForElems(); } inline proc computeDTF(indx) { const myvdov = vdov[indx]; if myvdov == 0.0 then return max(real); const myarealg = arealg[indx]; var dtf = ss[indx]**2; if myvdov < 0.0 then dtf += qqc2 * myarealg**2 * myvdov**2; dtf = sqrt(dtf); dtf = myarealg / dtf; return dtf; } proc CalcCourantConstraintForElems() { const val = min reduce [indx in MatElems] computeDTF(indx); if (val != max(real)) then dtcourant = val; } inline proc calcDtHydroTmp(indx) { const myvdov = vdov[indx]; if (myvdov == 0.0) then return max(real); else return dvovmax / (abs(myvdov)+1.0e-20); } proc CalcHydroConstraintForElems() { const val = min reduce [indx in MatElems] calcDtHydroTmp(indx); if (val != max(real)) then dthydro = val; } /* calculate nodal forces, accelerations, velocities, positions, with * applied boundary conditions and slide surface considerations */ proc CalcForceForNodes() { //zero out all forces forall x in fx do x.write(0); forall y in fy do y.write(0); forall z in fz do z.write(0); /* Calcforce calls partial, force, hourq */ CalcVolumeForceForElems(); /* Calculate Nodal Forces at domain boundaries */ // this was commented out in C++ code, so left out here } proc CalcVolumeForceForElems() { var sigxx, sigyy, sigzz, determ: [Elems] real; /* Sum contributions to total stress tensor */ InitStressTermsForElems(p, q, sigxx, sigyy, sigzz); /* call elemlib stress integration loop to produce nodal forces from material stresses. */ IntegrateStressForElems(sigxx, sigyy, sigzz, determ); /* check for negative element volume */ forall e in Elems { if determ[e] <= 0.0 then halt("can't have negative volume (determ[", e, "]=", determ[e], ")"); } CalcHourglassControlForElems(determ); } proc IntegrateStressForElems(sigxx, sigyy, sigzz, determ) { forall k in Elems { var b_x, b_y, b_z: 8*real; var x_local, y_local, z_local: 8*real; localizeNeighborNodes(k, x, x_local, y, y_local, z, z_local); var fx_local, fy_local, fz_local: 8*real; local { /* Volume calculation involves extra work for numerical consistency. */ CalcElemShapeFunctionDerivatives(x_local, y_local, z_local, b_x, b_y, b_z, determ[k]); CalcElemNodeNormals(b_x, b_y, b_z, x_local, y_local, z_local); SumElemStressesToNodeForces(b_x, b_y, b_z, sigxx[k], sigyy[k], sigzz[k], fx_local, fy_local, fz_local); } for (noi, t) in elemToNodesTuple(k) { fx[noi].add(fx_local[t]); fy[noi].add(fy_local[t]); fz[noi].add(fz_local[t]); } } } proc CalcHourglassControlForElems(determ) { var dvdx, dvdy, dvdz, x8n, y8n, z8n: [Elems] 8*real; forall eli in Elems { /* Collect domain nodes to elem nodes */ var x1, y1, z1: 8*real; localizeNeighborNodes(eli, x, x1, y, y1, z, z1); var pfx, pfy, pfz: 8*real; local { /* load into temporary storage for FB Hour Glass control */ (dvdx[eli], dvdy[eli], dvdz[eli]) = CalcElemVolumeDerivative(x1, y1, z1); } x8n[eli] = x1; y8n[eli] = y1; z8n[eli] = z1; determ[eli] = volo[eli] * v[eli]; } /* Do a check for negative volumes */ forall e in Elems { if v[e] <= 0.0 then halt("can't have negative (or zero) volume. (in Hourglass, v[", e, "]=", v[e], ")"); } if hgcoef > 0.0 { CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz); } } const gammaCoef: 4*(8*real) = // WAS: [1..4, 1..8] real = (( 1.0, 1.0, -1.0, -1.0, -1.0, -1.0, 1.0, 1.0), ( 1.0, -1.0, -1.0, 1.0, -1.0, 1.0, 1.0, -1.0), ( 1.0, -1.0, 1.0, -1.0, 1.0, -1.0, 1.0, -1.0), (-1.0, 1.0, -1.0, 1.0, 1.0, -1.0, 1.0, -1.0)); /* Calculates the Flanagan-Belytschko anti-hourglass force. */ proc CalcFBHourglassForceForElems(determ, x8n, y8n, z8n, dvdx, dvdy, dvdz) { /* compute the hourglass modes */ forall eli in Elems { var hourgam: 8*(4*real); const volinv = 1.0 / determ[eli]; var ss1, mass1, volume13: real; var hgfx, hgfy, hgfz: 8*real; var coefficient: real; var xd1, yd1, zd1: 8*real; localizeNeighborNodes(eli, xd, xd1, yd, yd1, zd, zd1); /* TODO: Can we enable this local block? */ // local { for i in 1..4 { var hourmodx, hourmody, hourmodz: real; // reduction for j in 1..8 { hourmodx += x8n[eli][j] * gammaCoef[i][j]; hourmody += y8n[eli][j] * gammaCoef[i][j]; hourmodz += z8n[eli][j] * gammaCoef[i][j]; } for j in 1..8 { hourgam[j][i] = gammaCoef[i][j] - volinv * (dvdx[eli][j] * hourmodx + dvdy[eli][j] * hourmody + dvdz[eli][j] * hourmodz); } } /* compute forces */ /* store forces into h arrays (force arrays) */ ss1 = ss[eli]; mass1 = elemMass[eli]; volume13 = cbrt(determ[eli]); coefficient = - hgcoef * 0.01 * ss1 * mass1 / volume13; CalcElemFBHourglassForce(xd1, yd1, zd1, hourgam, coefficient, hgfx, hgfy, hgfz); // } // end local for (noi,i) in elemToNodesTuple(eli) { fx[noi].add(hgfx[i]); fy[noi].add(hgfy[i]); fz[noi].add(hgfz[i]); } } } proc CalcAccelerationForNodes() { forall noi in Nodes do local { xdd[noi] = fx[noi].read() / nodalMass[noi]; ydd[noi] = fy[noi].read() / nodalMass[noi]; zdd[noi] = fz[noi].read() / nodalMass[noi]; } } proc ApplyAccelerationBoundaryConditionsForNodes() { // TODO: Shouldn't we be able to write these as follows? // // xdd[XSym] = 0.0; // ydd[YSym] = 0.0; // zdd[ZSym] = 0.0; forall x in XSym do xdd[x] = 0.0; forall y in YSym do ydd[y] = 0.0; forall z in ZSym do zdd[z] = 0.0; } proc CalcVelocityForNodes(dt: real, u_cut: real) { forall i in Nodes do local { var xdtmp = xd[i] + xdd[i] * dt, ydtmp = yd[i] + ydd[i] * dt, zdtmp = zd[i] + zdd[i] * dt; if abs(xdtmp) < u_cut then xdtmp = 0.0; if abs(ydtmp) < u_cut then ydtmp = 0.0; if abs(zdtmp) < u_cut then zdtmp = 0.0; xd[i] = xdtmp; yd[i] = ydtmp; zd[i] = zdtmp; } } proc CalcPositionForNodes(dt: real) { forall ijk in Nodes { x[ijk] += xd[ijk] * dt; y[ijk] += yd[ijk] * dt; z[ijk] += zd[ijk] * dt; } } // sungeun: Temporary array reused throughout proc CalcLagrangeElements() { var dxx, dyy, dzz: [Elems] real; CalcKinematicsForElems(dxx, dyy, dzz, deltatime); // element loop to do some stuff not included in the elemlib function. forall k in Elems do local { vdov[k] = dxx[k] + dyy[k] + dzz[k]; var vdovthird = vdov[k] / 3.0; dxx[k] -= vdovthird; dyy[k] -= vdovthird; dzz[k] -= vdovthird; } // See if any volumes are negative, and take appropriate action. forall e in Elems { if vnew[e] <= 0.0 then halt("can't have negative volume (vnew[", e, "]=", vnew[e], ")"); } } proc CalcKinematicsForElems(dxx, dyy, dzz, const dt: real) { // loop over all elements forall k in Elems { var b_x, b_y, b_z: 8*real, d: 6*real, detJ: real; //get nodal coordinates from global arrays and copy into local arrays var x_local, y_local, z_local: 8*real; localizeNeighborNodes(k, x, x_local, y, y_local, z, z_local); //get nodal velocities from global arrays and copy into local arrays var xd_local, yd_local, zd_local: 8*real; localizeNeighborNodes(k, xd, xd_local, yd, yd_local, zd, zd_local); var dt2 = 0.5 * dt; //wish this was local, too... local { //volume calculations const volume = CalcElemVolume(x_local, y_local, z_local); const relativeVolume = volume / volo[k]; vnew[k] = relativeVolume; delv[k] = relativeVolume - v[k]; //set characteristic length arealg[k] = CalcElemCharacteristicLength(x_local, y_local, z_local, volume); for i in 1..8 { x_local[i] -= dt2 * xd_local[i]; y_local[i] -= dt2 * yd_local[i]; z_local[i] -= dt2 * zd_local[i]; } CalcElemShapeFunctionDerivatives(x_local, y_local, z_local, b_x, b_y, b_z, detJ); CalcElemVelocityGradient(xd_local, yd_local, zd_local, b_x, b_y, b_z, detJ, d); } // put velocity gradient quantities into their global arrays. dxx[k] = d[1]; dyy[k] = d[2]; dzz[k] = d[3]; } } // sungeun: Temporary array reused throughout /* velocity gradient */ var delv_xi, delv_eta, delv_zeta: [Elems] real; /* position gradient */ var delx_xi, delx_eta, delx_zeta: [Elems] real; proc CalcQForElems() { // MONOTONIC Q option /* Calculate velocity gradients */ CalcMonotonicQGradientsForElems(delv_xi, delv_eta, delv_zeta, delx_xi, delx_eta, delx_zeta); /* Transfer veloctiy gradients in the first order elements */ /* problem->commElements->Transfer(CommElements::monoQ) ; */ CalcMonotonicQForElems(delv_xi, delv_eta, delv_zeta, delx_xi, delx_eta, delx_zeta); /* Don't allow excessive artificial viscosity */ forall e in Elems { if q[e] > qstop then halt("Excessive artificial viscosity! (q[", e, "]=", q[e], ")"); } } // sungeun: Temporary array reused throughout var vnewc: [MatElems] real; /* Expose all of the variables needed for material evaluation */ proc ApplyMaterialPropertiesForElems() { forall i in MatElems do vnewc[i] = vnew[i]; if eosvmin != 0.0 then [c in vnewc] if c < eosvmin then c = eosvmin; if eosvmax != 0.0 then [c in vnewc] if c > eosvmax then c = eosvmax; // old comment: The following loop should compute min/max reductions; // currently, race-y forall matelm in MatElems { var vc = v[matelm]; if eosvmin != 0.0 && vc < eosvmin then vc = eosvmin; if eosvmax != 0.0 && vc > eosvmax then vc = eosvmax; if vc <= 0.0 { writeln("Volume error (in ApplyMaterialProperiesForElems)."); exit(1); } } EvalEOSForElems(vnewc); } proc UpdateVolumesForElems() { forall i in Elems do local { var tmpV = vnew[i]; if abs(tmpV-1.0) < v_cut then tmpV = 1.0; v[i] = tmpV; } } proc CalcMonotonicQGradientsForElems(delv_xi, delv_eta, delv_zeta, delx_xi, delx_eta, delx_zeta) { forall eli in Elems { const ptiny = 1.0e-36; var xl, yl, zl: 8*real; localizeNeighborNodes(eli, x, xl, y, yl, z, zl); var xvl, yvl, zvl: 8*real; localizeNeighborNodes(eli, xd, xvl, yd, yvl, zd, zvl); local { const vol = volo[eli] * vnew[eli], norm = 1.0 / (vol + ptiny); var ax, ay, az, dxv, dyv, dzv: real; const dxj = -0.25*((xl[1]+xl[2]+xl[6]+xl[5])-(xl[4]+xl[3]+xl[7]+xl[8])), dyj = -0.25*((yl[1]+yl[2]+yl[6]+yl[5])-(yl[4]+yl[3]+yl[7]+yl[8])), dzj = -0.25*((zl[1]+zl[2]+zl[6]+zl[5])-(zl[4]+zl[3]+zl[7]+zl[8])), dxi = 0.25*((xl[2]+xl[3]+xl[7]+xl[6])-(xl[1]+xl[4]+xl[8]+xl[5])), dyi = 0.25*((yl[2]+yl[3]+yl[7]+yl[6])-(yl[1]+yl[4]+yl[8]+yl[5])), dzi = 0.25*((zl[2]+zl[3]+zl[7]+zl[6])-(zl[1]+zl[4]+zl[8]+zl[5])), dxk = 0.25*((xl[5]+xl[6]+xl[7]+xl[8])-(xl[1]+xl[2]+xl[3]+xl[4])), dyk = 0.25*((yl[5]+yl[6]+yl[7]+yl[8])-(yl[1]+yl[2]+yl[3]+yl[4])), dzk = 0.25*((zl[5]+zl[6]+zl[7]+zl[8])-(zl[1]+zl[2]+zl[3]+zl[4])); /* find delvk and delxk ( i cross j ) */ ax = dyi*dzj - dzi*dyj; ay = dzi*dxj - dxi*dzj; az = dxi*dyj - dyi*dxj; delx_zeta[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny); ax *= norm; ay *= norm; az *= norm; dxv = 0.25*((xvl[5]+xvl[6]+xvl[7]+xvl[8])-(xvl[1]+xvl[2]+xvl[3]+xvl[4])); dyv = 0.25*((yvl[5]+yvl[6]+yvl[7]+yvl[8])-(yvl[1]+yvl[2]+yvl[3]+yvl[4])); dzv = 0.25*((zvl[5]+zvl[6]+zvl[7]+zvl[8])-(zvl[1]+zvl[2]+zvl[3]+zvl[4])); delv_zeta[eli] = ax*dxv + ay*dyv + az*dzv; /* find delxi and delvi ( j cross k ) */ ax = dyj*dzk - dzj*dyk; ay = dzj*dxk - dxj*dzk; az = dxj*dyk - dyj*dxk; delx_xi[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny) ; ax *= norm; ay *= norm; az *= norm; dxv = 0.25*((xvl[2]+xvl[3]+xvl[7]+xvl[6])-(xvl[1]+xvl[4]+xvl[8]+xvl[5])); dyv = 0.25*((yvl[2]+yvl[3]+yvl[7]+yvl[6])-(yvl[1]+yvl[4]+yvl[8]+yvl[5])); dzv = 0.25*((zvl[2]+zvl[3]+zvl[7]+zvl[6])-(zvl[1]+zvl[4]+zvl[8]+zvl[5])); delv_xi[eli] = ax*dxv + ay*dyv + az*dzv ; /* find delxj and delvj ( k cross i ) */ ax = dyk*dzi - dzk*dyi; ay = dzk*dxi - dxk*dzi; az = dxk*dyi - dyk*dxi; delx_eta[eli] = vol / sqrt(ax*ax + ay*ay + az*az + ptiny) ; ax *= norm; ay *= norm; az *= norm; dxv= -0.25*((xvl[1]+xvl[2]+xvl[6]+xvl[5])-(xvl[4]+xvl[3]+xvl[7]+xvl[8])); dyv= -0.25*((yvl[1]+yvl[2]+yvl[6]+yvl[5])-(yvl[4]+yvl[3]+yvl[7]+yvl[8])); dzv= -0.25*((zvl[1]+zvl[2]+zvl[6]+zvl[5])-(zvl[4]+zvl[3]+zvl[7]+zvl[8])); delv_eta[eli] = ax*dxv + ay*dyv + az*dzv ; } /* local */ } /* forall eli */ } proc CalcMonotonicQForElems(delv_xi, delv_eta, delv_zeta, delx_xi, delx_eta, delx_zeta) { //got rid of call through to "CalcMonotonicQRegionForElems" forall i in MatElems { const ptiny = 1.0e-36; const bcMask = elemBC[i]; var norm, delvm, delvp: real; /* phixi */ norm = 1.0 / (delv_xi[i] + ptiny); select bcMask & XI_M { when 0 do delvm = delv_xi[lxim(i)]; when XI_M_SYMM do delvm = delv_xi[i]; when XI_M_FREE do delvm = 0.0; } select bcMask & XI_P { when 0 do delvp = delv_xi[lxip(i)]; when XI_P_SYMM do delvp = delv_xi[i]; when XI_P_FREE do delvp = 0.0; } delvm *= norm; delvp *= norm; var phixi = 0.5 * (delvm + delvp); delvm *= monoq_limiter_mult; delvp *= monoq_limiter_mult; if delvm < phixi then phixi = delvm; if delvp < phixi then phixi = delvp; if phixi < 0 then phixi = 0.0; if phixi > monoq_max_slope then phixi = monoq_max_slope; /* phieta */ norm = 1.0 / (delv_eta[i] + ptiny); select bcMask & ETA_M { when 0 do delvm = delv_eta[letam[i]]; when ETA_M_SYMM do delvm = delv_eta[i]; when ETA_M_FREE do delvm = 0.0; } select bcMask & ETA_P { when 0 do delvp = delv_eta[letap[i]]; when ETA_P_SYMM do delvp = delv_eta[i]; when ETA_P_FREE do delvp = 0.0; } delvm = delvm * norm; delvp = delvp * norm; var phieta = 0.5 * (delvm + delvp); delvm *= monoq_limiter_mult; delvp *= monoq_limiter_mult; if delvm < phieta then phieta = delvm; if delvp < phieta then phieta = delvp; if phieta < 0.0 then phieta = 0.0; if phieta > monoq_max_slope then phieta = monoq_max_slope; /* phizeta */ norm = 1.0 / (delv_zeta[i] + ptiny); select bcMask & ZETA_M { when 0 do delvm = delv_zeta[lzetam[i]]; when ZETA_M_SYMM do delvm = delv_zeta[i]; when ZETA_M_FREE do delvm = 0.0; } select bcMask & ZETA_P { when 0 do delvp = delv_zeta[lzetap[i]]; when ZETA_P_SYMM do delvp = delv_zeta[i]; when ZETA_P_FREE do delvp = 0.0; } delvm = delvm * norm; delvp = delvp * norm; var phizeta = 0.5 * (delvm + delvp); delvm *= monoq_limiter_mult; delvp *= monoq_limiter_mult; if delvm < phizeta then phizeta = delvm; if delvp < phizeta then phizeta = delvp; if phizeta < 0.0 then phizeta = 0.0; if phizeta > monoq_max_slope then phizeta = monoq_max_slope; /* Remove length scale */ var qlin, qquad: real; if vdov[i] > 0.0 { qlin = 0.0; qquad = 0.0; } else { var delvxxi = delv_xi[i] * delx_xi[i], delvxeta = delv_eta[i] * delx_eta[i], delvxzeta = delv_zeta[i] * delx_zeta[i]; if delvxxi > 0.0 then delvxxi = 0.0; if delvxeta > 0.0 then delvxeta = 0.0; if delvxzeta > 0.0 then delvxzeta = 0.0; const rho = elemMass[i] / (volo[i] * vnew[i]); qlin = -qlc_monoq * rho * ( delvxxi * (1.0 - phixi) + delvxeta * (1.0 - phieta) + delvxzeta * (1.0 - phizeta)); qquad = qqc_monoq * rho * ( delvxxi**2 * (1.0 - phixi**2) + delvxeta**2 * (1.0 - phieta**2) + delvxzeta**2 * (1.0 - phizeta**2)); } qq[i] = qquad; ql[i] = qlin; } } proc EvalEOSForElems(vnewc) { const rho0 = refdens; var e_old, delvc, p_old, q_old, compression, compHalfStep, qq_old, ql_old, work, p_new, e_new, q_new, bvc, pbvc: [Elems] real; /* compress data, minimal set */ forall i in MatElems { e_old[i] = e[i]; delvc[i] = delv[i]; p_old[i] = p[i]; q_old[i] = q[i]; qq_old[i] = qq[i]; ql_old[i] = ql[i]; } // // TODO: Uncomment local once sparse domain is distributed // forall i in Elems /* do local */ { compression[i] = 1.0 / vnewc[i] - 1.0; const vchalf = vnewc[i] - delvc[i] * 0.5; compHalfStep[i] = 1.0 / vchalf - 1.0; } /* Check for v > eosvmax or v < eosvmin */ // (note: I think this was already checked for in calling function!) if eosvmin != 0.0 { forall i in Elems { if vnewc[i] <= eosvmin then compHalfStep[i] = compression[i]; } } if eosvmax != 0.0 { forall i in Elems { if vnewc[i] >= eosvmax { p_old[i] = 0.0; compression[i] = 0.0; compHalfStep[i] = 0.0; } } } CalcEnergyForElems(p_new, e_new, q_new, bvc, pbvc, p_old, e_old, q_old, compression, compHalfStep, vnewc, work, delvc, qq_old, ql_old); forall i in MatElems { p[i] = p_new[i]; e[i] = e_new[i]; q[i] = q_new[i]; } CalcSoundSpeedForElems(vnewc, rho0, e_new, p_new, pbvc, bvc); } proc CalcEnergyForElems(p_new, e_new, q_new, bvc, pbvc, p_old, e_old, q_old, compression, compHalfStep, vnewc, work, delvc, qq_old, ql_old) { // TODO: might need to move these consts into foralls or global // Otherwise, they live on Locale0 and everyone else has to do // remote reads. OR: Check if they're remote value forwarded. const rho0 = refdens; const sixth = 1.0 / 6.0; var pHalfStep: [MatElems] real; forall i in Elems { e_new[i] = e_old[i] - 0.5 * delvc[i] * (p_old[i] + q_old[i]) + 0.5 * work[i]; if e_new[i] < emin then e_new[i] = emin; } CalcPressureForElems(pHalfStep, bvc, pbvc, e_new, compHalfStep, vnewc, pmin, p_cut, eosvmax); forall i in Elems { const vhalf = 1.0 / (1.0 + compHalfStep[i]); if delvc[i] > 0.0 { q_new[i] = 0.0; } else { var ssc = (pbvc[i] * e_new[i] + vhalf**2 * bvc[i] * pHalfStep[i]) / rho0; if ssc <= 0.0 then ssc = 0.333333e-36; else ssc = sqrt(ssc); q_new[i] = ssc * ql_old[i] + qq_old[i]; } e_new[i] += 0.5 * delvc[i] * (3.0*(p_old[i] + q_old[i]) - 4.0*(pHalfStep[i] + q_new[i])); } forall i in Elems { e_new[i] += 0.5 * work[i]; if abs(e_new[i] < e_cut) then e_new[i] = 0.0; if e_new[i] < emin then e_new[i] = emin; } CalcPressureForElems(p_new, bvc, pbvc, e_new, compression, vnewc, pmin, p_cut, eosvmax); forall i in Elems { var q_tilde:real; if delvc[i] > 0.0 { q_tilde = 0.0; } else { var ssc = (pbvc[i] * e_new[i] + vnewc[i]**2 * bvc[i] * p_new[i] ) / rho0; if ssc <= 0.0 then ssc = 0.333333e-36; else ssc = sqrt(ssc); q_tilde = ssc * ql_old[i] + qq_old[i]; } e_new[i] -= (7.0*(p_old[i] + q_old[i]) - 8.0*(pHalfStep[i] + q_new[i]) + (p_new[i] + q_tilde)) * delvc[i] * sixth; if abs(e_new[i]) < e_cut then e_new[i] = 0.0; if e_new[i] < emin then e_new[i] = emin; } CalcPressureForElems(p_new, bvc, pbvc, e_new, compression, vnewc, pmin, p_cut, eosvmax); // // TODO: Uncomment local once sparse domain is distributed // forall i in Elems /* do local */ { if delvc[i] <= 0.0 { var ssc = (pbvc[i] * e_new[i] + vnewc[i]**2 * bvc[i] * p_new[i] ) / rho0; if ssc <= 0.0 then ssc = 0.333333e-36; else ssc = sqrt(ssc); q_new[i] = ssc * ql_old[i] + qq_old[i]; if abs(q_new[i]) < q_cut then q_new[i] = 0.0; } } } proc CalcSoundSpeedForElems(vnewc, rho0:real, enewc, pnewc, pbvc, bvc) { // TODO: Open question: If we had multiple materials, should (a) ss // be zeroed and accumulated into, and (b) updated atomically to // avoid losing updates? (Jeff will go back and think on this) // forall i in MatElems { var ssTmp = (pbvc[i] * enewc[i] + vnewc[i]**2 * bvc[i] * pnewc[i]) / rho0; if ssTmp <= 1.111111e-36 then ssTmp = 1.111111e-36; ss[i] = sqrt(ssTmp); } } iter elemToNodes(elem) { for i in 1..nodesPerElem do yield elemToNode[elem][i]; } iter elemToNodesTuple(e) { for i in 1..nodesPerElem do yield (elemToNode[e][i], i); } proc deprint(title:string, x:[?D] real, y:[D] real, z:[D] real) { writeln(title); for i in D do writef("%3i: %3.4er %3.4er %3.4er\n", if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i, x[i], y[i], z[i]); } proc deprintatomic(title:string, x:[?D] atomic real, y:[] atomic real, z:[] atomic real) { writeln(title); for i in D do writef("%3i: %3.4er %3.4er %3.4er\n", if use3DRepresentation then idx3DTo1D(i, D.dim(1).size) else i, x[i].peek(), y[i].peek(), z[i].peek()); } ================================================ FILE: samples/Chapel/nbody.chpl ================================================ /* The Computer Language Benchmarks Game http://benchmarksgame.alioth.debian.org/ contributed by Albert Sidelnik modified by Brad Chamberlain */ // // The number of timesteps to simulate; may be set via the command-line // config const n = 10000; // // Constants representing pi, the solar mass, and the number of days per year // const pi = 3.141592653589793, solarMass = 4 * pi**2, daysPerYear = 365.24; // // a record representing one of the bodies in the solar system // record body { var pos: 3*real; var v: 3*real; var mass: real; // does not change after it is set up } // // the array of bodies that we'll be simulating // var bodies = [/* sun */ new body(mass = solarMass), /* jupiter */ new body(pos = ( 4.84143144246472090e+00, -1.16032004402742839e+00, -1.03622044471123109e-01), v = ( 1.66007664274403694e-03 * daysPerYear, 7.69901118419740425e-03 * daysPerYear, -6.90460016972063023e-05 * daysPerYear), mass = 9.54791938424326609e-04 * solarMass), /* saturn */ new body(pos = ( 8.34336671824457987e+00, 4.12479856412430479e+00, -4.03523417114321381e-01), v = (-2.76742510726862411e-03 * daysPerYear, 4.99852801234917238e-03 * daysPerYear, 2.30417297573763929e-05 * daysPerYear), mass = 2.85885980666130812e-04 * solarMass), /* uranus */ new body(pos = ( 1.28943695621391310e+01, -1.51111514016986312e+01, -2.23307578892655734e-01), v = ( 2.96460137564761618e-03 * daysPerYear, 2.37847173959480950e-03 * daysPerYear, -2.96589568540237556e-05 * daysPerYear), mass = 4.36624404335156298e-05 * solarMass), /* neptune */ new body(pos = ( 1.53796971148509165e+01, -2.59193146099879641e+01, 1.79258772950371181e-01), v = ( 2.68067772490389322e-03 * daysPerYear, 1.62824170038242295e-03 * daysPerYear, -9.51592254519715870e-05 * daysPerYear), mass = 5.15138902046611451e-05 * solarMass) ]; // // the number of bodies to be simulated // const numbodies = bodies.numElements; // // The computation involves initializing the sun's velocity, // writing the initial energy, advancing the system through 'n' // timesteps, and writing the final energy. // proc main() { initSun(); writef("%.9r\n", energy()); for 1..n do advance(0.01); writef("%.9r\n", energy()); } // // compute the sun's initial velocity // proc initSun() { const p = + reduce (for b in bodies do (b.v * b.mass)); bodies[1].v = -p / solarMass; } // // advance the positions and velocities of all the bodies // proc advance(dt) { for i in 1..numbodies { for j in i+1..numbodies { updateVelocities(bodies[i], bodies[j]); inline proc updateVelocities(ref b1, ref b2) { const dpos = b1.pos - b2.pos, mag = dt / sqrt(sumOfSquares(dpos))**3; b1.v -= dpos * b2.mass * mag; b2.v += dpos * b1.mass * mag; } } } for b in bodies do b.pos += dt * b.v; } // // compute the energy of the bodies // proc energy() { var e = 0.0; for i in 1..numbodies { const b1 = bodies[i]; e += 0.5 * b1.mass * sumOfSquares(b1.v); for j in i+1..numbodies { const b2 = bodies[j]; e -= (b1.mass * b2.mass) / sqrt(sumOfSquares(b1.pos - b2.pos)); } } return e; } // // a helper routine to compute the sum of squares of a 3-tuple's components // inline proc sumOfSquares(x) return x(1)**2 + x(2)**2 + x(3)**2; ================================================ FILE: samples/Chapel/quicksort.chpl ================================================ // // An example of a parallel quick sort implementation that uses // "cobegin" to make each recursive call in parallel and "serial" to // limit the number of threads. // use Random, Time; // for random number generation and the Timer class var timer: Timer; // to time the sort config var n: int = 2**15; // the size of the array to be sorted config var thresh: int = 1; // the recursive depth to serialize config var verbose: int = 0; // print out this many elements in array config var timing: bool = true; // set timing to false to disable timer var A: [1..n] real; // array of real numbers // // initialize array with random numbers // fillRandom(A); // // print out front of array if verbose flag is set // if verbose > 0 then writeln("A[1..", verbose, "] = ", A[1..verbose]); // // start timer, call parallel quick sort routine, stop timer // if timing then timer.start(); pqsort(A, thresh); if timing then timer.stop(); // // report sort time // if timing then writeln("sorted in ", timer.elapsed(), " seconds"); // // print out front of array if verbose flag is set // values should now be in sorted order // if verbose > 0 then writeln("A[1..", verbose, "] = ", A[1..verbose]); // // verify that array is sorted or halt // for i in 2..n do if A(i) < A(i-1) then halt("A(", i-1, ") == ", A(i-1), " > A(", i, ") == ", A(i)); writeln("verification success"); // // pqsort -- parallel quick sort // // arr: generic 1D array of values (real, int, ...) // thresh: number of recursive calls to make before serializing // low: lower bound of array to start sort at, defaults to whole array // high: upper bound of array to stop sort at, defaults to whole array // proc pqsort(arr: [], thresh: int, low: int = arr.domain.low, high: int = arr.domain.high) where arr.rank == 1 { // // base case: arr[low..high] is small enough to bubble sort // if high - low < 8 { bubbleSort(arr, low, high); return; } // // determine pivot and partition arr[low..high] // const pivotVal = findPivot(); const pivotLoc = partition(pivotVal); // // make recursive calls to parallel quick sort each unsorted half of // the array; if thresh is 0 or less, start executing conquer tasks // serially // serial thresh <= 0 do cobegin { pqsort(arr, thresh-1, low, pivotLoc-1); pqsort(arr, thresh-1, pivotLoc+1, high); } // // findPivot -- helper routine to find pivot value using simple // median-of-3 method, returns pivot value // proc findPivot() { const mid = low + (high-low+1) / 2; if arr(mid) < arr(low) then arr(mid) <=> arr(low); if arr(high) < arr(low) then arr(high) <=> arr(low); if arr(high) < arr(mid) then arr(high) <=> arr(mid); const pivotVal = arr(mid); arr(mid) = arr(high-1); arr(high-1) = pivotVal; return pivotVal; } // // partition -- helper routine to partition array such that all // values less than pivot are to its left and all // values greater than pivot are to its right, returns // pivot location // proc partition(pivotVal) { var ilo = low, ihi = high-1; while (ilo < ihi) { do { ilo += 1; } while arr(ilo) < pivotVal; do { ihi -= 1; } while pivotVal < arr(ihi); if (ilo < ihi) { arr(ilo) <=> arr(ihi); } } arr(high-1) = arr(ilo); arr(ilo) = pivotVal; return ilo; } } // // bubbleSort -- bubble sort for base case of quick sort // // arr: generic 1D array of values (real, int, ...) // low: lower bound of array to start sort at // high: upper bound of array to stop sort at // proc bubbleSort(arr: [], low: int, high: int) where arr.rank == 1 { for i in low..high do for j in low..high-1 do if arr(j) > arr(j+1) then arr(j) <=> arr(j+1); } ================================================ FILE: samples/Charity/example.ch ================================================ % % Some very badly written Charity % data LA(A) -> D = ss: A -> D | ff: -> D. ================================================ FILE: samples/Checksums/bsd-style.sha256 ================================================ SHA256 (empty) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 SHA256 (file0) = 0000000000000000000000000000000000000000000000000000000000000000 SHA256 (file1) = 0000000000000000000000000000000000000000000000000000000000000001 ================================================ FILE: samples/Checksums/filenames/SHA256SUMS ================================================ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *empty_binary_file 0000000000000000000000000000000000000000000000000000000000000000 *file0 0000000000000000000000000000000000000000000000000000000000000001 *file1 ================================================ FILE: samples/Checksums/filenames/SHA256SUMS.txt ================================================ SHA256 (empty) = e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 SHA256 (file0) = 0000000000000000000000000000000000000000000000000000000000000000 SHA256 (file1) = 0000000000000000000000000000000000000000000000000000000000000001 ================================================ FILE: samples/Checksums/gnu-style-text.sha256 ================================================ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 empty_text_file ================================================ FILE: samples/Checksums/gnu-style.sha256 ================================================ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 *empty_binary_file 0000000000000000000000000000000000000000000000000000000000000000 *file0 0000000000000000000000000000000000000000000000000000000000000001 *file1 ================================================ FILE: samples/Checksums/single_hash.crc32 ================================================ ffffffff ================================================ FILE: samples/Checksums/single_hash.md2 ================================================ 8350e5a3e24c153df2275c9f80692773 ================================================ FILE: samples/Checksums/single_hash.md4 ================================================ 31d6cfe0d16ae931b73c59d7e0c089c0 ================================================ FILE: samples/Checksums/single_hash.md5 ================================================ d41d8cd98f00b204e9800998ecf8427e ================================================ FILE: samples/Checksums/single_hash.sha1 ================================================ da39a3ee5e6b4b0d3255bfef95601890afd80709 ================================================ FILE: samples/Checksums/single_hash.sha224 ================================================ d14a028c2a3a2bc9476102bb288234c415a2b01f828ea62ac5b3e42f ================================================ FILE: samples/Checksums/single_hash.sha256 ================================================ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ================================================ FILE: samples/Checksums/single_hash.sha384 ================================================ 38b060a751ac96384cd9327eb1b1e36a21fdb71114be07434c0cc7bf63f6e1da274edebfe76f65fbd51ad2f14898b95b ================================================ FILE: samples/Checksums/single_hash.sha512 ================================================ cf83e1357eefb8bdf1542850d66d8007d620e4050b5715dc83f4a921d36ce9ce47d0d13c5d85f2b0ff8318d2877eec2f63b931bd47417a81a538327af927da3e ================================================ FILE: samples/Checksums/single_hash_dec.crc32 ================================================ 4294967295 ================================================ FILE: samples/Checksums/single_hash_no_trailing_newline.sha256 ================================================ e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855 ================================================ FILE: samples/Checksums/zero.sha2 ================================================ 0000000000000000000000000000000000000000000000000000000000000000 ================================================ FILE: samples/Checksums/zero.sha3 ================================================ 00000000000000000000000000000000000000000000000000000000 ================================================ FILE: samples/Circom/binsum.circom ================================================ /* Copyright 2018 0KIMS association. This file is part of circom (Zero Knowledge Circuit Compiler). circom is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. circom is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with circom. If not, see . */ /* Binary Sum ========== This component creates a binary sum componet of ops operands and n bits each operand. e is Number of carries: Depends on the number of operands in the input. Main Constraint: in[0][0] * 2^0 + in[0][1] * 2^1 + ..... + in[0][n-1] * 2^(n-1) + + in[1][0] * 2^0 + in[1][1] * 2^1 + ..... + in[1][n-1] * 2^(n-1) + + .. + in[ops-1][0] * 2^0 + in[ops-1][1] * 2^1 + ..... + in[ops-1][n-1] * 2^(n-1) + === out[0] * 2^0 + out[1] * 2^1 + + out[n+e-1] *2(n+e-1) To waranty binary outputs: out[0] * (out[0] - 1) === 0 out[1] * (out[0] - 1) === 0 . . . out[n+e-1] * (out[n+e-1] - 1) == 0 */ /* This function calculates the number of extra bits in the output to do the full sum. */ pragma circom 2.0.0; function nbits(a) { var n = 1; var r = 0; while (n-1> k) & 1; // Ensure out is binary out[k] * (out[k] - 1) === 0; lout += out[k] * e2; e2 = e2+e2; } // Ensure the sum; lin === lout; } ================================================ FILE: samples/Circom/switcher.circom ================================================ /* Copyright 2018 0KIMS association. This file is part of circom (Zero Knowledge Circuit Compiler). circom is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. circom is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with circom. If not, see . */ /* Assume sel is binary. If sel == 0 then outL = L and outR=R If sel == 1 then outL = R and outR=L */ pragma circom 2.0.0; template Switcher() { signal input sel; signal input L; signal input R; signal output outL; signal output outR; signal aux; aux <== (R-L)*sel; // We create aux in order to have only one multiplication outL <== aux + L; outR <== -aux + R; } ================================================ FILE: samples/Circom/xor3.circom ================================================ /* Copyright 2018 0KIMS association. This file is part of circom (Zero Knowledge Circuit Compiler). circom is a free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version. circom is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with circom. If not, see . */ /* Xor3 function for sha256 out = a ^ b ^ c => out = a+b+c - 2*a*b - 2*a*c - 2*b*c + 4*a*b*c => out = a*( 1 - 2*b - 2*c + 4*b*c ) + b + c - 2*b*c => mid = b*c out = a*( 1 - 2*b -2*c + 4*mid ) + b + c - 2 * mid */ pragma circom 2.0.0; template Xor3(n) { signal input a[n]; signal input b[n]; signal input c[n]; signal output out[n]; signal mid[n]; for (var k=0; k) (:id |r1h_OBKNncW) (:by |root) (:at 1504777353661) |t $ {} (:type :leaf) (:text |list->) (:id |SkeLXDDlbf) (:by |root) (:at 1512236830915) |v $ {} (:type :leaf) (:text |span) (:id |ry6uuBY4h9Z) (:by |root) (:at 1504777353661) |x $ {} (:type :leaf) (:text |div) (:id |S1AuOrYEncZ) (:by |root) (:at 1504777353661) |y $ {} (:type :leaf) (:text |a) (:id |r11t_HK435Z) (:by |root) (:at 1504777353661) |yT $ {} (:type :expr) (:id |S1ksOSKEn9-) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |[]) (:id |rkei_SFV39W) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |respo.comp.space) (:id |rJbsdBFEncZ) (:by |root) (:at 1504777353661) |r $ {} (:type :leaf) (:text |:refer) (:id |BJzjOBYNh9W) (:by |root) (:at 1504777353661) |v $ {} (:type :expr) (:id |HJ7iuHtN3qb) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |[]) (:id |HkEsOrFV39b) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |=<) (:id |r1BouSYV39Z) (:by |root) (:at 1504777353661) |yj $ {} (:type :expr) (:by |S1lNv50FW) (:at 1550076422286) (:id |RWcAq7jGbe) :data $ {} |T $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076422664) (:text |[]) (:id |aauVImKdc) |j $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076423285) (:text "|\"url-parse") (:id |oSXAyVtQXl) |r $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076423983) (:text |:as) (:id |Ph_pMR_iX) |v $ {} (:type :leaf) (:by |S1lNv50FW) (:at 1550076428729) (:text |url-parse) (:id |FPv0anxaXD) :defs $ {} |comp-page-members $ {} (:type :expr) (:id |SkPj_HY43cZ) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |defcomp) (:id |r1_oOSY43c-) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |comp-page-members) (:id |SktiOrtN2q-) (:by |root) (:at 1504777353661) |r $ {} (:type :expr) (:id |S19idBYN29Z) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |router-data) (:id |rJosuHFN25b) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |session-id) (:id |BJnjOHKV39Z) (:by |root) (:at 1504777353661) |v $ {} (:type :expr) (:id |S1aoOBFN25W) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |div) (:id |ByAjdrYV2qW) (:by |root) (:at 1504777353661) |j $ {} (:type :expr) (:id |SyJnOSFEn5W) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |{}) (:id |ByenOHFNh9Z) (:by |root) (:at 1504777353661) |j $ {} (:type :expr) (:id |r1-3_BFN25Z) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |:style) (:id |rJznuSKEhcZ) (:by |root) (:at 1504777353661) |j $ {} (:type :expr) (:id |SyQn_StEn5W) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |merge) (:id |Sy42OBtEnqW) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |ui/flex) (:id |HJSnOSKN2qZ) (:by |root) (:at 1504777353661) |r $ {} (:type :leaf) (:text |style-members) (:id |BkL3_HFN3qZ) (:by |root) (:at 1504777353661) |style-bookmark $ {} (:type :expr) (:id |SketBt429Z) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |def) (:id |rkZYBKV39-) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |style-bookmark) (:id |ByGYBK4h5Z) (:by |root) (:at 1504777353661) |r $ {} (:type :expr) (:id |BJmtrFN35W) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |{}) (:id |HyVYHKNhc-) (:by |root) (:at 1504777353661) |j $ {} (:type :expr) (:id |rkHtHKNn5W) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |:font-family) (:id |BJItBtVnq-) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text ||Menlo,monospace) (:id |SJwtBFN35-) (:by |root) (:at 1504777353661) |r $ {} (:type :expr) (:id |H1dFrF439W) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |:min-width) (:id |rJFFStE2qZ) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |200) (:id |S1cFBY42cW) (:by |root) (:at 1504777353661) |v $ {} (:type :expr) (:id |HysKrF43qZ) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |:display) (:id |Sk3tBtEh9W) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |:inline-block) (:id |H1TFBFN29-) (:by |root) (:at 1504777353661) |style-row $ {} (:type :expr) (:id |H1hWFSYN3cb) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |def) (:id |SJpWKrKEn9W) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |style-row) (:id |BkAWFHFV25-) (:by |root) (:at 1504777353661) |r $ {} (:type :expr) (:id |BJJzKSFVh9-) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |{}) (:id |ByeztHYEncZ) (:by |root) (:at 1504777353661) |j $ {} (:type :expr) (:id |B1-GYBtEhqb) (:by nil) (:at 1504777353661) :data $ {} |T $ {} (:type :leaf) (:text |:cursor) (:id |SkzMtSKN39Z) (:by |root) (:at 1504777353661) |j $ {} (:type :leaf) (:text |:pointer) (:id |HJmGtHtVn9-) (:by |root) (:at 1504777353661) :proc $ {} (:type :expr) (:id |S1Li_rF4n9Z) (:by nil) (:at 1504777353661) (:data $ {}) ================================================ FILE: samples/Cirru/comma.cirru ================================================ print (, a) a , b , c (, d) ================================================ FILE: samples/Cirru/demo.cirru ================================================ define a (read cd) $ if (> a cd) print demo print "not demo" say $ print a $ save $ b $ x $ c 8 print fun ================================================ FILE: samples/Cirru/folded-beginning.cirru ================================================ a b ================================================ FILE: samples/Cirru/folding.cirru ================================================ a $ b $ c d $ e $ f g $ h $ i j $ k $ ================================================ FILE: samples/Cirru/html.cirru ================================================ doctype html head title $ = a link (:rel a) $ :href b link (:rel icon) $ :href a meta $ :charset utf-8 body #about .line a (:href a) $ = b span $ = " " a (:href a) $ = b .line $ span $ = a #list .year $ = 2014 .month $ = May .post $ a.link (:href) $ = .month $ = Apr .post $ a.link (:href a) $ = b ================================================ FILE: samples/Cirru/indent.cirru ================================================ a $ b $ c e f (g) h ================================================ FILE: samples/Cirru/line.cirru ================================================ line 1 line 2 line-3 line 4 ================================================ FILE: samples/Cirru/parentheses.cirru ================================================ 3 4 (1) 4 ((((1)))) x ================================================ FILE: samples/Cirru/quote.cirru ================================================ a b c d "a b c d" "a b \" c d" ================================================ FILE: samples/Cirru/spaces.cirru ================================================ "a b" "c d" ================================================ FILE: samples/Cirru/template.cirru ================================================ doctype html head title "From Java to Kotlin" meta (:charset utf-8) link (:rel stylesheet) (:href css/style.css) link (:rel stylesheet) (:href css/highlightjs-github.css) script (:src js/highlight.9.4.0.js) script "hljs.initHighlightingOnLoad();" body a :href = https://github.com/fabiomsr/from-java-to-kotlin :class = github-corner :aria-label = View source on Github style = ".github-corner:hover .octo-arm{animation:octocat-wave 560ms ease-in-out}@keyframes octocat-wave{0%,100%{transform:rotate(0)}20%,60%{transform:rotate(-25deg)}40%,80%{transform:rotate(10deg)}}@media (max-width:500px){.github-corner:hover .octo-arm{animation:none}.github-corner .octo-arm{animation:octocat-wave 560ms ease-in-out}}" #note = "From Java to Kotlin" ul li a :class = selected :href = index.html = Basic li a :href = functions.html = Functions li a :href = classes.html = Classes .section .title BASICS .case (.name "Print") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/print.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/print.kt) .case (.name "Variables I") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/variables-i.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/variables-i.kt) .case (.name "Variables II") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/variables-ii.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/variables-ii.kt) .case (.name "Null I") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/null-i.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/null-i.kt) .section .title BASICS .case (.name "Bits Operations") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/bits-operations.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/bits-operations.kt) .case (.name "Is As In") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/operations.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/operations.kt) .case (.name "Smart Cast") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/cast.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/cast.kt) .case (.name "Switch / When") $ .pair .card (.lang Java) $ pre.code $ code (@insert ../code/java/basic/switch.java) .card (.lang Kotlin) $ pre.code $ code (@insert ../code/kotlin/basic/when.kt) ================================================ FILE: samples/Cirru/unfolding.cirru ================================================ set add 1 $ , x y add 5 $ add 2 ================================================ FILE: samples/Cirru/webpack.config.cirru ================================================ var fs $ require :fs path $ require :path webpack $ require :webpack = module.exports {} :mode :development :entry $ {} :main $ [] :webpack-hud :./src/main :output $ {} :path $ path.join __dirname :dist/ :filename :[name].js :devtool :cheap-source-map :resolve $ {} :extensions $ [] :.js :.cirru :.json :module $ {} :rules $ [] {} (:test /\.cirru$) (:exclude /node_modules) :use :cirru-script-loader {} (:test "/\\.(png|jpg|gif)$") :loader :url-loader :query $ {} (:limit 100) {} (:test /\.css$) $ :use [] {} (:loader :style-loader) {} (:loader :css-loader) :devServer $ {} :publicPath :/ :hot true :compress true :clientLogLevel :info :disableHostCheck true :host :0.0.0.0 :stats $ {} :all false :colors true :errors true :errorDetails true :performance true :reasons true :timings true :warnings true :plugins $ [] new webpack.NamedModulesPlugin ================================================ FILE: samples/Clarion/CStringClass.clw ================================================ Member() omit('***$***',_VER_C55) _ABCDllMode_ EQUATE(0) _ABCLinkMode_ EQUATE(1) ***$*** Include('Equates.CLW'),ONCE Include('Keycodes.CLW'),ONCE Include('Errors.CLW'),ONCE Map End ! map Include('CStringClass.inc'),ONCE CStringClass.Construct PROCEDURE ! Declare Procedure CODE SELF.bufferSize = DEFAULT_CS_BUFFER_SIZE SELF.CS &= New(CSTRING(SELF.bufferSize)) CStringClass.Destruct PROCEDURE ! Declare Procedure CODE Dispose(SELF.cs) CStringClass.Cat PROCEDURE (STRING pStr) !,*CSTRING,PROC ! Declare Procedure newLen LONG,AUTO oldCS &CSTRING CODE newLen = Len(pStr) IF (newLen+SELF.strLength+2) > SELF.newStrSize ! Only grow the internal string if the result of the cat will be larger than the string currently is. ! The reason for the "+2" is because this is used in the string slicing outside this IF. Without this matching +2 there is potential for an out of bounds slice which would be bad! ! Save a temporary copy of the old string so we can us it in the concatination after we have grown it! oldCS &= New(CSTRING(SELF.strLength+1)) oldCS = SELF.CS Dispose(SELF.CS) SELF.newStrSize = newLen + SELF.strLength + 1 + SELF.bufferSize SELF.CS &= New(CSTRING(SELF.newStrSize)) SELF.CS = oldCS Dispose(oldCS) END ! Append the new string directly to the end of the old one. SELF.CS[SELF.strLength+1 : SELF.strLength+newLen] = pStr ! And terminate the CSTRING manually SELF.CS[SELF.strLength+newLen+1] = '<0>' ! This is the same as doing "SELF.strLength = Len(SELF.CS)" but the Len() is _really_ slow on large strings. This is much faster! SELF.strLength += newLen ! This is what it used to be: ! SELF.Str(SELF.Str() & s) ! It is a nice and neat solution but performance, especially on large strings was terrible! RETURN SELF.Str() CStringClass.Str PROCEDURE (STRING pStr) !,*CSTRING, PROC ! Declare Procedure CODE IF Len(pStr) > SELF.newStrSize ! Only Dispose/New the internal string if the new one requires it. ! This might be slightly innefficient in terms of memory usage when the string gets smaller ! But it is _vasty_ better for performance when the string gets added to a lot. Dispose(SELF.CS) SELF.newStrSize = Len(pStr) + 1 + SELF.bufferSize SELF.CS &= New(CSTRING(SELF.newStrSize)) END SELF.CS = pStr SELF.strLength = Len(SELF.CS) RETURN SELF.CS CStringClass.Len PROCEDURE !,LONG ! Declare Procedure CODE RETURN SELF.strLength CStringClass.Replace PROCEDURE (STRING pFind, STRING pReplace) !,*CSTRING,PROC ! Declare Procedure ! FindString , ReplaceWith locate LONG,AUTO lastLocate LONG CODE LOOP locate = InString(Upper(pFind), Upper(SELF.Str()), 1, lastLocate+1) IF ~locate BREAK END ! So we dont end up having recursive replacement. lastLocate = locate + Len(pReplace)-1 SELF.Str(Sub(SELF.Str(), 1, locate-1) & | pReplace & | Sub(SELF.Str(), locate+Len(pFind), SELF.Len()) | ) END RETURN SELF.Str() CStringClass.Str PROCEDURE () !,*CSTRING ! Declare Procedure 3 CODE RETURN SELF.CS !------------------------------------------------------------------------------ CStringClass.Contains PROCEDURE (STRING pFind, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure ! Returns a value (TRUE) indicating whether the specified String occurs within this string. ! Second parameter defaults to a case sensitive search. CODE IF pCaseSensitive = TRUE IF InString(pFind, SELF.Str(), 1 , 1) > 0 RETURN TRUE END ELSE IF InString(Lower(pFind), SELF.Lower(), 1 , 1) > 0 RETURN TRUE END END RETURN FALSE CStringClass.Lower PROCEDURE () !,STRING ! Declare Procedure ! Returns a "Lowered" version of the self.cs doesnt change the self.cs CODE RETURN Lower(SELF.CS) CStringClass.SubString PROCEDURE (LONG pPosition, LONG pLength) !,STRING,PROC ! Declare Procedure CODE RETURN Sub(SELF.Str(), pPosition, pLength) CStringClass.ToLower PROCEDURE () !,*CSTRING,PROC ! Declare Procedure ! Converts this string to lowercase and returns the converted string CODE RETURN SELF.Str(SELF.Lower()) CStringClass.ToUpper PROCEDURE () !,*CSTRING,PROC ! Declare Procedure ! Converts this string to uppercase and returns the converted string CODE RETURN SELF.Str(SELF.Upper()) CStringClass.Trim PROCEDURE () !,*CSTRING,PROC ! Declare Procedure CODE SELF.Str(Left(SELF.Str())) SELF.Str(Clip(SELF.Str())) RETURN SELF.Str() CStringClass.Upper PROCEDURE () !,STRING ! Declare Procedure CODE RETURN Upper(SELF.Str()) CStringClass.IndexOf PROCEDURE (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,LONG ! Declare Procedure ! Returns the index of the first parameter (pLookIn) is found within the SELF.CS ! zero if it is not found CODE IF pCaseSensitive = TRUE RETURN InString(SELF.Str(), pLookIn, 1 , 1) ELSE RETURN InString(SELF.Lower(), Lower(pLookIn), 1 , 1) END CStringClass.FoundIn PROCEDURE (STRING pLookIn, BYTE pCaseSensitive=TRUE) !,BYTE ! Declare Procedure ! Returns TRUE if the first parameter (pLookIn) is found within the SELF.CS ! FALSE if it is no CODE IF SELF.IndexOf(pLookIn, pCaseSensitive) > 0 RETURN TRUE ELSE RETURN FALSE END CStringClass.SetBuffer PROCEDURE (LONG pNewBuffer) ! Declare Procedure CODE SELF.bufferSize = pNewBuffer CStringClass.EscapeXml PROCEDURE () !,STRING ! Declare Procedure CS CStringClass CODE IF Omitted(pStr)=FALSE CS.Str(pStr) ELSE ! Make a copy so we don't alter the original CS.Str(SELF.Str()) END CS.Replace('&', '&') CS.Replace('<', '<') CS.Replace('>', '>') CS.Replace('"', '"') CS.Replace('''', ''') RETURN CS.Str() ================================================ FILE: samples/Clarion/ConsoleSupport.clw ================================================ Member() Include('ConsoleSupport.inc'),ONCE Map MODULE('32-bit Windows API') ! General functions GetLastError(),DWORD,PASCAL ! Console functions GetStdHandle(DWORD),HANDLE,PASCAL,PROC,RAW WriteConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('WriteConsoleA') ReadConsole(Handle,Long,Dword,long,long),bool,Raw,Pascal,name('ReadConsoleA') SetConsoleTitle(Long),Bool,Raw,Pascal,name('SetConsoleTitleA') GetConsoleTitle(Long,dword),Bool,Raw,Pascal,name('GetConsoleTitleA') SetConsoleMode(Handle,dWord),BOOL,RAW,PASCAL GetConsoleMode(Handle,Long),BOOL,RAW,PASCAL End End ConsoleSupport.Construct PROCEDURE CODE ConsoleSupport.Destruct PROCEDURE CODE ConsoleSupport.Init PROCEDURE () !,BYTE,VIRTUAL CODE SELF.OutputHandle = GetStdHandle(STD_OUTPUT_HANDLE) If SELF.OutputHandle = INVALID_HANDLE_VALUE Halt(1,'Unable to get output handle (' & GetLastError() & ')') RETURN INVALID_HANDLE_VALUE End SELF.InputHandle = GetStdHandle(STD_INPUT_HANDLE) if SELF.InputHandle = INVALID_HANDLE_VALUE Halt(2,'Unable to get console input handle (' & GetLastError() & ')') RETURN INVALID_HANDLE_VALUE End If ~SetConsoleMode(SELF.InputHandle,ENABLE_PROCESSED_INPUT ) Halt(3,'Unable to set console mode (' & GetLastError() & ')') RETURN INVALID_OTHER End RETURN FALSE ConsoleSupport.WriteLine PROCEDURE (STRING pText) !,BYTE,PROC,VIRTUAL CODE SELF.TextBuffer = SELF.Prefix & pText & '<13,10>' If WriteConsole(SELF.OutputHandle, ADDRESS(SELF.TextBuffer), LEN(SELF.TextBuffer),ADDRESS(SELF.BytesWritten), NULL) = 0 Halt(4,'WriteConsoleError (' & GetLastError() & ')') RETURN -1 End RETURN FALSE Consolesupport.ReadKey PROCEDURE () !,STRING,PROC,VIRTUAL CODE SELF.WriteLine('Press any key to continue...') Clear(SELF.InBuffer) Loop IF ReadConsole(SELF.InputHandle,Address(SELF.InBuffer),100,Address(SELF.BytesRead),NULL) = 0 THEN Halt(5,'Error on read console (' & GetLastError() & ')') Break End Until SELF.BytesRead > 0 RETURN SELF.InBuffer ================================================ FILE: samples/Clarion/HelloWorld.clw ================================================ PROGRAM MAP END CODE MESSAGE('Hello World!') RETURN ================================================ FILE: samples/Clarion/hello.clw ================================================ MEMBER() INCLUDE('HelloClass.inc'),ONCE MAP END HelloClass.Construct PROCEDURE CODE HelloClass.Destruct PROCEDURE() !,VIRTUAL CODE HelloClass.SayHello PROCEDURE CODE MESSAGE('Hello World!') ================================================ FILE: samples/Clarity/bns.clar ================================================ ;;;; Errors (define-constant ERR_PANIC 0) (define-constant ERR_NAMESPACE_PREORDER_NOT_FOUND 1001) (define-constant ERR_NAMESPACE_PREORDER_EXPIRED 1002) (define-constant ERR_NAMESPACE_PREORDER_ALREADY_EXISTS 1003) (define-constant ERR_NAMESPACE_UNAVAILABLE 1004) (define-constant ERR_NAMESPACE_NOT_FOUND 1005) (define-constant ERR_NAMESPACE_ALREADY_EXISTS 1006) (define-constant ERR_NAMESPACE_NOT_LAUNCHED 1007) (define-constant ERR_NAMESPACE_PRICE_FUNCTION_INVALID 1008) (define-constant ERR_NAMESPACE_PREORDER_CLAIMABILITY_EXPIRED 1009) (define-constant ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED 1010) (define-constant ERR_NAMESPACE_OPERATION_UNAUTHORIZED 1011) (define-constant ERR_NAMESPACE_STX_BURNT_INSUFFICIENT 1012) (define-constant ERR_NAMESPACE_BLANK 1013) (define-constant ERR_NAMESPACE_ALREADY_LAUNCHED 1014) (define-constant ERR_NAMESPACE_HASH_MALFORMED 1015) (define-constant ERR_NAMESPACE_CHARSET_INVALID 1016) (define-constant ERR_NAME_PREORDER_NOT_FOUND 2001) (define-constant ERR_NAME_PREORDER_EXPIRED 2002) (define-constant ERR_NAME_PREORDER_FUNDS_INSUFFICIENT 2003) (define-constant ERR_NAME_UNAVAILABLE 2004) (define-constant ERR_NAME_OPERATION_UNAUTHORIZED 2006) (define-constant ERR_NAME_STX_BURNT_INSUFFICIENT 2007) (define-constant ERR_NAME_EXPIRED 2008) (define-constant ERR_NAME_GRACE_PERIOD 2009) (define-constant ERR_NAME_BLANK 2010) (define-constant ERR_NAME_ALREADY_CLAIMED 2011) (define-constant ERR_NAME_CLAIMABILITY_EXPIRED 2012) (define-constant ERR_NAME_NOT_FOUND 2013) (define-constant ERR_NAME_REVOKED 2014) (define-constant ERR_NAME_TRANSFER_FAILED 2015) (define-constant ERR_NAME_PREORDER_ALREADY_EXISTS 2016) (define-constant ERR_NAME_HASH_MALFORMED 2017) (define-constant ERR_NAME_PREORDERED_BEFORE_NAMESPACE_LAUNCH 2018) (define-constant ERR_NAME_NOT_RESOLVABLE 2019) (define-constant ERR_NAME_COULD_NOT_BE_MINTED 2020) (define-constant ERR_NAME_COULD_NOT_BE_TRANSFERED 2021) (define-constant ERR_NAME_CHARSET_INVALID 2022) (define-constant ERR_PRINCIPAL_ALREADY_ASSOCIATED 3001) (define-constant ERR_INSUFFICIENT_FUNDS 4001) (define-constant NAMESPACE_PREORDER_CLAIMABILITY_TTL u144) (define-constant NAMESPACE_LAUNCHABILITY_TTL u52595) (define-constant NAME_PREORDER_CLAIMABILITY_TTL u144) (define-constant NAME_GRACE_PERIOD_DURATION u5000) (define-data-var attachment-index uint u0) ;; Price tables (define-constant NAMESPACE_PRICE_TIERS (list u640000000000 u64000000000 u64000000000 u6400000000 u6400000000 u6400000000 u6400000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000 u640000000)) ;;;; Data (define-map namespaces (buff 20) { namespace-import: principal, revealed-at: uint, launched-at: (optional uint), lifetime: uint, can-update-price-function: bool, price-function: { buckets: (list 16 uint), base: uint, coeff: uint, nonalpha-discount: uint, no-vowel-discount: uint } }) (define-map namespace-preorders { hashed-salted-namespace: (buff 20), buyer: principal } { created-at: uint, claimed: bool, stx-burned: uint }) (define-non-fungible-token names { name: (buff 48), namespace: (buff 20) }) ;; Rule 1-1 -> 1 principal, 1 name (define-map owner-name principal { name: (buff 48), namespace: (buff 20) }) ;; Only applies to non-revoked, non-expired names. ;; A principal can own many expired names (but they will be transferred away once someone re-registers them), ;; and can own many revoked names (but they do not resolve and cannot be transferred or updated). (define-map name-properties { name: (buff 48), namespace: (buff 20) } { registered-at: (optional uint), imported-at: (optional uint), revoked-at: (optional uint), zonefile-hash: (buff 20) }) (define-map name-preorders { hashed-salted-fqn: (buff 20), buyer: principal } { created-at: uint, claimed: bool, stx-burned: uint }) (define-private (min (a uint) (b uint)) (if (<= a b) a b)) (define-private (max (a uint) (b uint)) (if (> a b) a b)) (define-private (get-exp-at-index (buckets (list 16 uint)) (index uint)) (unwrap-panic (element-at buckets index))) (define-private (is-digit (char (buff 1))) (or (is-eq char 0x30) ;; 0 (is-eq char 0x31) ;; 1 (is-eq char 0x32) ;; 2 (is-eq char 0x33) ;; 3 (is-eq char 0x34) ;; 4 (is-eq char 0x35) ;; 5 (is-eq char 0x36) ;; 6 (is-eq char 0x37) ;; 7 (is-eq char 0x38) ;; 8 (is-eq char 0x39))) ;; 9 (define-private (is-lowercase-alpha (char (buff 1))) (or (is-eq char 0x61) ;; a (is-eq char 0x62) ;; b (is-eq char 0x63) ;; c (is-eq char 0x64) ;; d (is-eq char 0x65) ;; e (is-eq char 0x66) ;; f (is-eq char 0x67) ;; g (is-eq char 0x68) ;; h (is-eq char 0x69) ;; i (is-eq char 0x6a) ;; j (is-eq char 0x6b) ;; k (is-eq char 0x6c) ;; l (is-eq char 0x6d) ;; m (is-eq char 0x6e) ;; n (is-eq char 0x6f) ;; o (is-eq char 0x70) ;; p (is-eq char 0x71) ;; q (is-eq char 0x72) ;; r (is-eq char 0x73) ;; s (is-eq char 0x74) ;; t (is-eq char 0x75) ;; u (is-eq char 0x76) ;; v (is-eq char 0x77) ;; w (is-eq char 0x78) ;; x (is-eq char 0x79) ;; y (is-eq char 0x7a))) ;; z (define-private (is-vowel (char (buff 1))) (or (is-eq char 0x61) ;; a (is-eq char 0x65) ;; e (is-eq char 0x69) ;; i (is-eq char 0x6f) ;; o (is-eq char 0x75) ;; u (is-eq char 0x79))) ;; y (define-private (is-special-char (char (buff 1))) (or (is-eq char 0x2d) ;; - (is-eq char 0x5f))) ;; _ (define-private (is-char-valid (char (buff 1))) (or (is-lowercase-alpha char) (is-digit char) (is-special-char char))) (define-private (is-nonalpha (char (buff 1))) (or (is-digit char) (is-special-char char))) (define-private (has-vowels-chars (name (buff 48))) (> (len (filter is-vowel name)) u0)) (define-private (has-nonalpha-chars (name (buff 48))) (> (len (filter is-nonalpha name)) u0)) (define-private (has-invalid-chars (name (buff 48))) (< (len (filter is-char-valid name)) (len name))) (define-private (name-lease-started-at? (namespace-launched-at (optional uint)) (namespace-revealed-at uint) (name-props (tuple (registered-at (optional uint)) (imported-at (optional uint)) (revoked-at (optional uint)) (zonefile-hash (buff 20))))) (let ((registered-at (get registered-at name-props)) (imported-at (get imported-at name-props))) (if (is-none namespace-launched-at) (begin ;; The namespace must not be expired (asserts! (> (+ namespace-revealed-at NAMESPACE_LAUNCHABILITY_TTL) block-height) (err ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED)) (ok (unwrap-panic imported-at))) (begin ;; The namespace must be launched (asserts! (is-some namespace-launched-at) (err ERR_NAMESPACE_NOT_LAUNCHED)) ;; Sanity check: the name must have been either be registered or imported (asserts! (is-eq (xor (match registered-at res 1 0) (match imported-at res 1 0)) 1) (err ERR_PANIC)) ;; If the name was launched, then started-at will come from registered-at (if (is-some registered-at) ;; The name was registered - We return the registration block height (ok (unwrap-panic registered-at)) ;; The name was imported (if (and (>= (unwrap-panic imported-at) namespace-revealed-at) (<= (unwrap-panic imported-at) (unwrap-panic namespace-launched-at))) ;; The name was imported after revealing the namespace and before launching the namespace - We return the launch block height (ok (unwrap-panic namespace-launched-at)) (ok u0))))))) ;; Note: the following method is used in name-import and name-register. The latter ensure that the name ;; can be registered, the former does not. (define-private (mint-or-transfer-name? (namespace (buff 20)) (name (buff 48)) (beneficiary principal)) (let ( (current-owner (nft-get-owner? names (tuple (name name) (namespace namespace))))) ;; The principal can register a name (asserts! (try! (can-receive-name beneficiary)) (err ERR_PRINCIPAL_ALREADY_ASSOCIATED)) (if (is-none current-owner) ;; This is a new name, let's mint it (begin (unwrap! (nft-mint? names { name: name, namespace: namespace } beneficiary) (err ERR_NAME_COULD_NOT_BE_MINTED)) (map-set owner-name beneficiary { name: name, namespace: namespace }) (ok true)) (update-name-ownership? namespace name (unwrap-panic current-owner) beneficiary)))) (define-private (update-name-ownership? (namespace (buff 20)) (name (buff 48)) (from principal) (to principal)) (if (is-eq from to) (ok true) (begin (unwrap! (nft-transfer? names { name: name, namespace: namespace } from to) (err ERR_NAME_COULD_NOT_BE_TRANSFERED)) (map-delete owner-name from) (map-set owner-name to { name: name, namespace: namespace }) (ok true)))) (define-private (update-zonefile-and-props (namespace (buff 20)) (name (buff 48)) (registered-at (optional uint)) (imported-at (optional uint)) (revoked-at (optional uint)) (zonefile-hash (buff 20)) (op (string-ascii 16))) (let ((current-index (var-get attachment-index))) ;; Emit event used as a system hinter (print { attachment: { hash: zonefile-hash, attachment-index: current-index, metadata: { name: name, namespace: namespace, tx-sender: tx-sender, op: op } }}) ;; Update cursor (var-set attachment-index (+ u1 current-index)) (map-set name-properties { name: name, namespace: namespace } { registered-at: registered-at, imported-at: imported-at, revoked-at: revoked-at, zonefile-hash: zonefile-hash }))) (define-private (is-namespace-available (namespace (buff 20))) (match (map-get? namespaces namespace) namespace-props (begin ;; Is the namespace launched? (if (is-some (get launched-at namespace-props)) false (> block-height (+ (get revealed-at namespace-props) NAMESPACE_LAUNCHABILITY_TTL)))) ;; Is the namespace expired? true)) (define-private (compute-name-price (name (buff 48)) (price-function (tuple (buckets (list 16 uint)) (base uint) (coeff uint) (nonalpha-discount uint) (no-vowel-discount uint)))) (let ( (exponent (get-exp-at-index (get buckets price-function) (min u15 (- (len name) u1)))) (no-vowel-discount (if (not (has-vowels-chars name)) (get no-vowel-discount price-function) u1)) (nonalpha-discount (if (has-nonalpha-chars name) (get nonalpha-discount price-function) u1))) (* (/ (* (get coeff price-function) (pow (get base price-function) exponent)) (max nonalpha-discount no-vowel-discount)) u10))) ;;;; NAMESPACES ;; NAMESPACE_PREORDER ;; This step registers the salted hash of the namespace with BNS nodes, and burns the requisite amount of cryptocurrency. ;; Additionally, this step proves to the BNS nodes that user has honored the BNS consensus rules by including a recent ;; consensus hash in the transaction. ;; Returns pre-order's expiration date (in blocks). (define-public (namespace-preorder (hashed-salted-namespace (buff 20)) (stx-to-burn uint)) (let ((former-preorder (map-get? namespace-preorders { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender }))) ;; Ensure eventual former pre-order expired (asserts! (if (is-none former-preorder) true (>= block-height (+ NAMESPACE_PREORDER_CLAIMABILITY_TTL (unwrap-panic (get created-at former-preorder))))) (err ERR_NAMESPACE_PREORDER_ALREADY_EXISTS)) ;; Ensure that the hashed namespace is 20 bytes long (asserts! (is-eq (len hashed-salted-namespace) u20) (err ERR_NAMESPACE_HASH_MALFORMED)) ;; Ensure that user will be burning a positive amount of tokens (asserts! (> stx-to-burn u0) (err ERR_NAMESPACE_STX_BURNT_INSUFFICIENT)) ;; Burn the tokens (unwrap! (stx-burn? stx-to-burn tx-sender) (err ERR_INSUFFICIENT_FUNDS)) ;; Register the preorder (map-set namespace-preorders { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender } { created-at: block-height, claimed: false, stx-burned: stx-to-burn }) (ok (+ block-height NAMESPACE_PREORDER_CLAIMABILITY_TTL)))) ;; NAMESPACE_REVEAL ;; This second step reveals the salt and the namespace ID (pairing it with its NAMESPACE_PREORDER). It reveals how long ;; names last in this namespace before they expire or must be renewed, and it sets a price function for the namespace ;; that determines how cheap or expensive names its will be. (define-public (namespace-reveal (namespace (buff 20)) (namespace-salt (buff 20)) (p-func-base uint) (p-func-coeff uint) (p-func-b1 uint) (p-func-b2 uint) (p-func-b3 uint) (p-func-b4 uint) (p-func-b5 uint) (p-func-b6 uint) (p-func-b7 uint) (p-func-b8 uint) (p-func-b9 uint) (p-func-b10 uint) (p-func-b11 uint) (p-func-b12 uint) (p-func-b13 uint) (p-func-b14 uint) (p-func-b15 uint) (p-func-b16 uint) (p-func-non-alpha-discount uint) (p-func-no-vowel-discount uint) (lifetime uint) (namespace-import principal)) ;; The salt and namespace must hash to a preorder entry in the `namespace_preorders` table. ;; The sender must match the principal in the preorder entry (implied) (let ( (hashed-salted-namespace (hash160 (concat namespace namespace-salt))) (price-function (tuple (buckets (list p-func-b1 p-func-b2 p-func-b3 p-func-b4 p-func-b5 p-func-b6 p-func-b7 p-func-b8 p-func-b9 p-func-b10 p-func-b11 p-func-b12 p-func-b13 p-func-b14 p-func-b15 p-func-b16)) (base p-func-base) (coeff p-func-coeff) (nonalpha-discount p-func-non-alpha-discount) (no-vowel-discount p-func-no-vowel-discount))) (preorder (unwrap! (map-get? namespace-preorders { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender }) (err ERR_NAMESPACE_PREORDER_NOT_FOUND))) (namespace-price (try! (get-namespace-price namespace)))) ;; The namespace must only have valid chars (asserts! (not (has-invalid-chars namespace)) (err ERR_NAMESPACE_CHARSET_INVALID)) ;; The namespace must not exist in the `namespaces` table, or be expired (asserts! (is-namespace-available namespace) (err ERR_NAMESPACE_ALREADY_EXISTS)) ;; The amount burnt must be equal to or greater than the cost of the namespace (asserts! (>= (get stx-burned preorder) namespace-price) (err ERR_NAMESPACE_STX_BURNT_INSUFFICIENT)) ;; This transaction must arrive within 24 hours of its `NAMESPACE_PREORDER` (asserts! (< block-height (+ (get created-at preorder) NAMESPACE_PREORDER_CLAIMABILITY_TTL)) (err ERR_NAMESPACE_PREORDER_CLAIMABILITY_EXPIRED)) ;; The preorder record for this namespace will be marked as "claimed" (map-set namespace-preorders { hashed-salted-namespace: hashed-salted-namespace, buyer: tx-sender } { created-at: (get created-at preorder), claimed: true, stx-burned: (get stx-burned preorder) }) ;; The namespace will be set as "revealed" but not "launched", its price function, its renewal rules, its version, ;; and its import principal will be written to the `namespaces` table. (map-set namespaces namespace { namespace-import: namespace-import, revealed-at: block-height, launched-at: none, lifetime: lifetime, can-update-price-function: true, price-function: price-function }) (ok true))) ;; NAME_IMPORT ;; Once a namespace is revealed, the user has the option to populate it with a set of names. Each imported name is given ;; both an owner and some off-chain state. This step is optional; Namespace creators are not required to import names. (define-public (name-import (namespace (buff 20)) (name (buff 48)) (beneficiary principal) (zonefile-hash (buff 20))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND)))) ;; The name must only have valid chars (asserts! (not (has-invalid-chars name)) (err ERR_NAME_CHARSET_INVALID)) ;; The sender principal must match the namespace's import principal (asserts! (is-eq (get namespace-import namespace-props) tx-sender) (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED)) ;; The name's namespace must not be launched (asserts! (is-none (get launched-at namespace-props)) (err ERR_NAMESPACE_ALREADY_LAUNCHED)) ;; Less than 1 year must have passed since the namespace was "revealed" (asserts! (< block-height (+ (get revealed-at namespace-props) NAMESPACE_LAUNCHABILITY_TTL)) (err ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED)) ;; Mint the new name (try! (mint-or-transfer-name? namespace name beneficiary)) ;; Update zonefile and props (update-zonefile-and-props namespace name none (some block-height) ;; Set imported-at none zonefile-hash "name-import") (ok true))) ;; NAMESPACE_READY ;; The final step of the process launches the namespace and makes the namespace available to the public. Once a namespace ;; is launched, anyone can register a name in it if they pay the appropriate amount of cryptocurrency. (define-public (namespace-ready (namespace (buff 20))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND)))) ;; The sender principal must match the namespace's import principal (asserts! (is-eq (get namespace-import namespace-props) tx-sender) (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED)) ;; The name's namespace must not be launched (asserts! (is-none (get launched-at namespace-props)) (err ERR_NAMESPACE_ALREADY_LAUNCHED)) ;; Less than 1 year must have passed since the namespace was "revealed" (asserts! (< block-height (+ (get revealed-at namespace-props) NAMESPACE_LAUNCHABILITY_TTL)) (err ERR_NAMESPACE_PREORDER_LAUNCHABILITY_EXPIRED)) (let ((namespace-props-updated (merge namespace-props { launched-at: (some block-height) }))) ;; The namespace will be set to "launched" (map-set namespaces namespace namespace-props-updated) ;; Emit an event (print { namespace: namespace, status: "ready", properties: namespace-props-updated }) (ok true)))) ;; NAMESPACE_UPDATE_FUNCTION_PRICE (define-public (namespace-update-function-price (namespace (buff 20)) (p-func-base uint) (p-func-coeff uint) (p-func-b1 uint) (p-func-b2 uint) (p-func-b3 uint) (p-func-b4 uint) (p-func-b5 uint) (p-func-b6 uint) (p-func-b7 uint) (p-func-b8 uint) (p-func-b9 uint) (p-func-b10 uint) (p-func-b11 uint) (p-func-b12 uint) (p-func-b13 uint) (p-func-b14 uint) (p-func-b15 uint) (p-func-b16 uint) (p-func-non-alpha-discount uint) (p-func-no-vowel-discount uint)) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND))) (price-function (tuple (buckets (list p-func-b1 p-func-b2 p-func-b3 p-func-b4 p-func-b5 p-func-b6 p-func-b7 p-func-b8 p-func-b9 p-func-b10 p-func-b11 p-func-b12 p-func-b13 p-func-b14 p-func-b15 p-func-b16)) (base p-func-base) (coeff p-func-coeff) (nonalpha-discount p-func-non-alpha-discount) (no-vowel-discount p-func-no-vowel-discount)))) ;; The sender principal must match the namespace's import principal (asserts! (is-eq (get namespace-import namespace-props) tx-sender) (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED)) ;; The namespace price function must still be editable (asserts! (get can-update-price-function namespace-props) (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED)) (map-set namespaces namespace (merge namespace-props { price-function: price-function })) (ok true))) ;; NAMESPACE_REVOKE_PRICE_EDITION (define-public (namespace-revoke-function-price-edition (namespace (buff 20))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND)))) ;; The sender principal must match the namespace's import principal (asserts! (is-eq (get namespace-import namespace-props) tx-sender) (err ERR_NAMESPACE_OPERATION_UNAUTHORIZED)) (map-set namespaces namespace (merge namespace-props { can-update-price-function: false })) (ok true))) ;; NAME_PREORDER ;; This is the first transaction to be sent. It tells all BNS nodes the salted hash of the BNS name, ;; and it burns the registration fee. (define-public (name-preorder (hashed-salted-fqn (buff 20)) (stx-to-burn uint)) (let ((former-preorder (map-get? name-preorders { hashed-salted-fqn: hashed-salted-fqn, buyer: tx-sender }))) ;; Ensure eventual former pre-order expired (asserts! (if (is-none former-preorder) true (>= block-height (+ NAME_PREORDER_CLAIMABILITY_TTL (unwrap-panic (get created-at former-preorder))))) (err ERR_NAME_PREORDER_ALREADY_EXISTS)) (asserts! (> stx-to-burn u0) (err ERR_NAMESPACE_STX_BURNT_INSUFFICIENT)) ;; Ensure that the hashed fqn is 20 bytes long (asserts! (is-eq (len hashed-salted-fqn) u20) (err ERR_NAME_HASH_MALFORMED)) ;; Ensure that user will be burning a positive amount of tokens (asserts! (> stx-to-burn u0) (err ERR_NAME_STX_BURNT_INSUFFICIENT)) ;; Burn the tokens (unwrap! (stx-burn? stx-to-burn tx-sender) (err ERR_INSUFFICIENT_FUNDS)) ;; Register the pre-order (map-set name-preorders { hashed-salted-fqn: hashed-salted-fqn, buyer: tx-sender } { created-at: block-height, stx-burned: stx-to-burn, claimed: false }) (ok (+ block-height NAME_PREORDER_CLAIMABILITY_TTL)))) ;; NAME_REGISTRATION ;; This is the second transaction to be sent. It reveals the salt and the name to all BNS nodes, ;; and assigns the name an initial public key hash and zone file hash (define-public (name-register (namespace (buff 20)) (name (buff 48)) (salt (buff 20)) (zonefile-hash (buff 20))) (let ( (hashed-salted-fqn (hash160 (concat (concat (concat name 0x2e) namespace) salt))) (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND))) (preorder (unwrap! (map-get? name-preorders { hashed-salted-fqn: hashed-salted-fqn, buyer: tx-sender }) (err ERR_NAME_PREORDER_NOT_FOUND)))) ;; The name can be registered (asserts! (try! (can-name-be-registered namespace name)) (err ERR_NAME_UNAVAILABLE)) ;; The preorder must have been created after the launch of the namespace (asserts! (> (get created-at preorder) (unwrap-panic (get launched-at namespace-props))) (err ERR_NAME_PREORDERED_BEFORE_NAMESPACE_LAUNCH)) ;; The preorder entry must be unclaimed (asserts! (is-eq (get claimed preorder) false) (err ERR_NAME_ALREADY_CLAIMED)) ;; Less than 24 hours must have passed since the name was preordered (asserts! (< block-height (+ (get created-at preorder) NAME_PREORDER_CLAIMABILITY_TTL)) (err ERR_NAME_CLAIMABILITY_EXPIRED)) ;; The amount burnt must be equal to or greater than the cost of the name (asserts! (>= (get stx-burned preorder) (compute-name-price name (get price-function namespace-props))) (err ERR_NAME_STX_BURNT_INSUFFICIENT)) ;; Mint the name if new, transfer the name otherwise. (try! (mint-or-transfer-name? namespace name tx-sender)) ;; Update name's metadata / properties (update-zonefile-and-props namespace name (some block-height) none none zonefile-hash "name-register") (ok true))) ;; NAME_UPDATE ;; A NAME_UPDATE transaction changes the name's zone file hash. You would send one of these transactions ;; if you wanted to change the name's zone file contents. ;; For example, you would do this if you want to deploy your own Gaia hub and want other people to read from it. (define-public (name-update (namespace (buff 20)) (name (buff 48)) (zonefile-hash (buff 20))) (let ( (data (try! (check-name-ops-preconditions namespace name)))) ;; Update the zonefile (update-zonefile-and-props namespace name (get registered-at (get name-props data)) (get imported-at (get name-props data)) none zonefile-hash "name-update") (ok true))) ;; NAME_TRANSFER ;; A NAME_TRANSFER transaction changes the name's public key hash. You would send one of these transactions if you wanted to: ;; - Change your private key ;; - Send the name to someone else ;; When transferring a name, you have the option to also clear the name's zone file hash (i.e. set it to null). ;; This is useful for when you send the name to someone else, so the recipient's name does not resolve to your zone file. (define-public (name-transfer (namespace (buff 20)) (name (buff 48)) (new-owner principal) (zonefile-hash (optional (buff 20)))) (let ( (data (try! (check-name-ops-preconditions namespace name))) (can-new-owner-get-name (try! (can-receive-name new-owner)))) ;; The new owner does not own a name (asserts! can-new-owner-get-name (err ERR_PRINCIPAL_ALREADY_ASSOCIATED)) ;; Transfer the name (unwrap! (update-name-ownership? namespace name tx-sender new-owner) (err ERR_NAME_TRANSFER_FAILED)) ;; Update or clear the zonefile (update-zonefile-and-props namespace name (get registered-at (get name-props data)) (get imported-at (get name-props data)) none (if (is-none zonefile-hash) 0x (unwrap-panic zonefile-hash)) "name-transfer") (ok true))) ;; NAME_REVOKE ;; A NAME_REVOKE transaction makes a name unresolvable. The BNS consensus rules stipulate that once a name ;; is revoked, no one can change its public key hash or its zone file hash. ;; The name's zone file hash is set to null to prevent it from resolving. ;; You should only do this if your private key is compromised, or if you want to render your name unusable for whatever reason. (define-public (name-revoke (namespace (buff 20)) (name (buff 48))) (let ( (data (try! (check-name-ops-preconditions namespace name)))) ;; Clear the zonefile (update-zonefile-and-props namespace name (get registered-at (get name-props data)) (get imported-at (get name-props data)) (some block-height) 0x "name-revoke") (ok true))) ;; NAME_RENEWAL ;; Depending in the namespace rules, a name can expire. For example, names in the .id namespace expire after 2 years. ;; You need to send a NAME_RENEWAL every so often to keep your name. ;; You will pay the registration cost of your name to the namespace's designated burn address when you renew it. ;; When a name expires, it enters a month-long "grace period" (5000 blocks). ;; It will stop resolving in the grace period, and all of the above operations will cease to be honored by the BNS consensus rules. ;; You may, however, send a NAME_RENEWAL during this grace period to preserve your name. ;; If your name is in a namespace where names do not expire, then you never need to use this transaction. (define-public (name-renewal (namespace (buff 20)) (name (buff 48)) (stx-to-burn uint) (new-owner (optional principal)) (zonefile-hash (optional (buff 20)))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND))) (owner (unwrap! (nft-get-owner? names { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND))) ;; The name must exist (name-props (unwrap! (map-get? name-properties { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND)))) ;; The name must exist ;; The namespace must be launched (asserts! (is-some (get launched-at namespace-props)) (err ERR_NAMESPACE_NOT_LAUNCHED)) ;; The namespace should require renewals (asserts! (> (get lifetime namespace-props) u0) (err ERR_NAME_OPERATION_UNAUTHORIZED)) ;; The sender must match the name's current owner (asserts! (is-eq owner tx-sender) (err ERR_NAME_OPERATION_UNAUTHORIZED)) ;; If expired, the name must be in the renewal grace period. (if (try! (is-name-lease-expired namespace name)) (asserts! (is-eq (try! (is-name-in-grace-period namespace name)) true) (err ERR_NAME_EXPIRED)) true) ;; The amount burnt must be equal to or greater than the cost of the namespace (asserts! (>= stx-to-burn (compute-name-price name (get price-function namespace-props))) (err ERR_NAME_STX_BURNT_INSUFFICIENT)) ;; The name must not be revoked (asserts! (is-none (get revoked-at name-props)) (err ERR_NAME_REVOKED)) ;; Transfer the name, if any new-owner (if (is-none new-owner) true (try! (can-receive-name (unwrap-panic new-owner)))) ;; Update the zonefile, if any. (if (is-none zonefile-hash) (map-set name-properties { name: name, namespace: namespace } { registered-at: (some block-height), imported-at: none, revoked-at: none, zonefile-hash: (get zonefile-hash name-props) }) (update-zonefile-and-props namespace name (some block-height) none none (unwrap-panic zonefile-hash) "name-renewal")) (ok true))) ;; Additionals public methods (define-read-only (get-namespace-price (namespace (buff 20))) (let ((namespace-len (len namespace))) (asserts! (> namespace-len u0) (err ERR_NAMESPACE_BLANK)) (ok (unwrap-panic (element-at NAMESPACE_PRICE_TIERS (min u7 (- namespace-len u1))))))) (define-read-only (get-name-price (namespace (buff 20)) (name (buff 48))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND)))) (ok (compute-name-price name (get price-function namespace-props))))) (define-read-only (check-name-ops-preconditions (namespace (buff 20)) (name (buff 48))) (let ( (owner (unwrap! (nft-get-owner? names { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND))) ;; The name must exist (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND))) (name-props (unwrap! (map-get? name-properties { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND)))) ;; The name must exist ;; The namespace must be launched (asserts! (is-some (get launched-at namespace-props)) (err ERR_NAMESPACE_NOT_LAUNCHED)) ;; The sender must match the name's current owner (asserts! (is-eq owner tx-sender) (err ERR_NAME_OPERATION_UNAUTHORIZED)) ;; The name must not be in the renewal grace period (asserts! (is-eq (try! (is-name-in-grace-period namespace name)) false) (err ERR_NAME_GRACE_PERIOD)) ;; The name must not be expired (asserts! (is-eq (try! (is-name-lease-expired namespace name)) false) (err ERR_NAME_EXPIRED)) ;; The name must not be revoked (asserts! (is-none (get revoked-at name-props)) (err ERR_NAME_REVOKED)) (ok { namespace-props: namespace-props, name-props: name-props, owner: owner }))) (define-read-only (can-namespace-be-registered (namespace (buff 20))) (ok (is-namespace-available namespace))) (define-read-only (is-name-lease-expired (namespace (buff 20)) (name (buff 48))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND))) (name-props (unwrap! (map-get? name-properties { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND))) (lease-started-at (try! (name-lease-started-at? (get launched-at namespace-props) (get revealed-at namespace-props) name-props))) (lifetime (get lifetime namespace-props))) (if (is-eq lifetime u0) (ok false) (ok (> block-height (+ lifetime lease-started-at)))))) (define-read-only (is-name-in-grace-period (namespace (buff 20)) (name (buff 48))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND))) (name-props (unwrap! (map-get? name-properties { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND))) (lease-started-at (try! (name-lease-started-at? (get launched-at namespace-props) (get revealed-at namespace-props) name-props))) (lifetime (get lifetime namespace-props))) (if (is-eq lifetime u0) (ok false) (ok (and (> block-height (+ lifetime lease-started-at)) (<= block-height (+ (+ lifetime lease-started-at) NAME_GRACE_PERIOD_DURATION))))))) (define-read-only (resolve-principal (owner principal)) (match (map-get? owner-name owner) name (match (name-resolve (get namespace name) (get name name)) resolved-name (ok name) error (err {code: error, name: (some name)})) (err {code: ERR_NAME_NOT_FOUND, name: none}))) (define-read-only (can-receive-name (owner principal)) (let ((current-owned-name (map-get? owner-name owner))) (if (is-none current-owned-name) (ok true) (let ( (namespace (unwrap-panic (get namespace current-owned-name))) (name (unwrap-panic (get name current-owned-name)))) (if (is-namespace-available namespace) (ok true) (begin ;; Early return if lease is expired (asserts! (not (try! (is-name-lease-expired namespace name))) (ok true)) (let ( (name-props (unwrap-panic (map-get? name-properties { name: name, namespace: namespace })))) ;; Has name been revoked? (asserts! (is-some (get revoked-at name-props)) (ok false)) (ok true)))))))) (define-read-only (can-name-be-registered (namespace (buff 20)) (name (buff 48))) (let ( (wrapped-name-props (map-get? name-properties { name: name, namespace: namespace })) (namespace-props (unwrap! (map-get? namespaces namespace) (ok false)))) ;; The name must only have valid chars (asserts! (not (has-invalid-chars name)) (err ERR_NAME_CHARSET_INVALID)) ;; Ensure that namespace has been launched (unwrap! (get launched-at namespace-props) (ok false)) ;; Early return - Name has never be minted (asserts! (is-some (nft-get-owner? names { name: name, namespace: namespace })) (ok true)) (let ((name-props (unwrap-panic wrapped-name-props))) ;; Integrity check - Ensure that the name was either "imported" or "registered". (asserts! (is-eq (xor (match (get registered-at name-props) res 1 0) (match (get imported-at name-props) res 1 0)) 1) (err ERR_PANIC)) ;; Is lease expired? (is-name-lease-expired namespace name)))) (define-read-only (name-resolve (namespace (buff 20)) (name (buff 48))) (let ( (owner (unwrap! (nft-get-owner? names { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND))) ;; The name must exist (name-props (unwrap! (map-get? name-properties { name: name, namespace: namespace }) (err ERR_NAME_NOT_FOUND))) (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND)))) ;; The name must not be in grace period (asserts! (not (try! (is-name-in-grace-period namespace name))) (err ERR_NAME_GRACE_PERIOD)) ;; The name must not be expired (asserts! (not (try! (is-name-lease-expired namespace name))) (err ERR_NAME_EXPIRED)) ;; The name must not be revoked (asserts! (is-none (get revoked-at name-props)) (err ERR_NAME_REVOKED)) ;; Get the zonefile (let ( (lease-started-at (try! (name-lease-started-at? (get launched-at namespace-props) (get revealed-at namespace-props) name-props)))) (ok { zonefile-hash: (get zonefile-hash name-props), owner: owner, lease-started-at: lease-started-at, lease-ending-at: (if (is-eq (get lifetime namespace-props) u0) none (some (+ lease-started-at (get lifetime namespace-props)))) })))) (define-read-only (get-namespace-properties (namespace (buff 20))) (let ( (namespace-props (unwrap! (map-get? namespaces namespace) (err ERR_NAMESPACE_NOT_FOUND)))) (ok { namespace: namespace, properties: namespace-props }))) ================================================ FILE: samples/Clarity/cost-voting.clar ================================================ ;; The .cost-voting contract ;; error codes (define-constant ERR_NO_SUCH_PROPOSAL 1) (define-constant ERR_AMOUNT_NOT_POSITIVE 2) (define-constant ERR_PROPOSAL_EXPIRED 3) (define-constant ERR_VOTE_ENDED 4) (define-constant ERR_INSUFFICIENT_FUNDS 5) (define-constant ERR_FT_TRANSFER 6) (define-constant ERR_STX_TRANSFER 7) (define-constant ERR_VOTE_NOT_CONFIRMED 8) (define-constant ERR_ALREADY_VETOED 9) (define-constant ERR_NOT_LAST_MINER 10) (define-constant ERR_INSUFFICIENT_VOTES 11) (define-constant ERR_VETO_PERIOD_OVER 12) (define-constant ERR_VETO_PERIOD_NOT_OVER 13) (define-constant ERR_PROPOSAL_VETOED 14) (define-constant ERR_PROPOSAL_CONFIRMED 15) (define-constant ERR_FETCHING_BLOCK_INFO 16) (define-constant ERR_TOO_MANY_CONFIRMED 17) (define-constant ERR_UNREACHABLE 255) (define-constant VOTE_LENGTH u2016) (define-constant VETO_LENGTH u1008) (define-constant REQUIRED_PERCENT_STX_VOTE u20) (define-constant REQUIRED_VETOES u500) (define-constant MAX_CONFIRMED_PER_BLOCK u10) ;; cost vote token (define-fungible-token cost-vote-token) ;; proposal counters (define-data-var proposal-count uint u0) (define-data-var confirmed-proposal-count uint u0) ;; cost-function proposals (define-map proposals { proposal-id: uint } { cost-function-contract: principal, cost-function-name: (string-ascii 128), function-contract: principal, function-name: (string-ascii 128), expiration-block-height: uint } ) ;; vote confirmed cost-function proposals (define-map vote-confirmed-proposals { proposal-id: uint } { expiration-block-height: uint } ) ;; miner confirmed cost-function proposals (define-map confirmed-proposals { confirmed-id: uint } { function-contract: principal, function-name: (string-ascii 128), cost-function-contract: principal, cost-function-name: (string-ascii 128), confirmed-height: uint } ) ;; limit the number of miner confirmed-proposals ;; that can be introduced per block ;; track the # of proposals confirmed at a given block-height (define-map confirmed-count-at-block uint uint) (define-map proposal-confirmed-id { proposal-id: uint } { confirmed-id: uint } ) (define-map functions-to-confirmed-ids { function-contract: principal, function-name: (string-ascii 128) } { proposal-id: uint } ) ;; cost-function proposal votes (define-map proposal-votes { proposal-id: uint } { votes: uint }) ;; cost-function proposal vetos (define-map proposal-vetos { proposal-id: uint } { vetos: uint }) ;; proposal vetos per block (define-map exercised-veto { proposal-id: uint, veto-height: uint } { vetoed: bool }) ;; the number of votes a specific principal has committed to a proposal (define-map principal-proposal-votes { address: principal, proposal-id: uint } { votes: uint }) ;; getter for cost-function proposals (define-read-only (get-proposal (proposal-id uint)) (map-get? proposals { proposal-id: proposal-id })) ;; getter for confirmed cost-function proposals (define-read-only (get-confirmed-proposal (confirmed-id uint)) (map-get? confirmed-proposals { confirmed-id: confirmed-id })) ;; getter for cost-function proposal votes (define-read-only (get-proposal-votes (proposal-id uint)) (get votes (map-get? proposal-votes { proposal-id: proposal-id }))) ;; getter for cost-function proposal vetos (define-read-only (get-proposal-vetos (proposal-id uint)) (get vetos (map-get? proposal-vetos { proposal-id: proposal-id }))) ;; getter for cost-function proposal votes, for specific principal (define-read-only (get-principal-votes (address principal) (proposal-id uint)) (get votes (map-get? principal-proposal-votes { address: address, proposal-id: proposal-id }))) ;; Propose cost-functions (define-public (submit-proposal (function-contract principal) (function-name (string-ascii 128)) (cost-function-contract principal) (cost-function-name (string-ascii 128))) (begin (map-insert proposals { proposal-id: (var-get proposal-count) } { cost-function-contract: cost-function-contract, cost-function-name: cost-function-name, function-contract: function-contract, function-name: function-name, expiration-block-height: (+ block-height VOTE_LENGTH) }) (map-insert proposal-votes { proposal-id: (var-get proposal-count) } { votes: u0 }) (var-set proposal-count (+ (var-get proposal-count) u1)) (ok (- (var-get proposal-count) u1)))) ;; Vote on a proposal (define-public (vote-proposal (proposal-id uint) (amount uint)) (let ( (expiration-block-height (get expiration-block-height (unwrap! (map-get? proposals { proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL)))) (cur-votes (default-to u0 (get votes (map-get? proposal-votes { proposal-id: proposal-id })))) (cur-principal-votes (default-to u0 (get votes (map-get? principal-proposal-votes { address: tx-sender, proposal-id: proposal-id }))))) ;; a vote must have a positive amount (asserts! (> amount u0) (err ERR_AMOUNT_NOT_POSITIVE)) ;; the vote must occur before the expiration (asserts! (< block-height expiration-block-height) (err ERR_PROPOSAL_EXPIRED)) ;; the proposal must not already be voter confirmed (asserts! (is-none (map-get? vote-confirmed-proposals { proposal-id: proposal-id })) (err ERR_VOTE_ENDED)) (unwrap! (stx-transfer? amount tx-sender (as-contract tx-sender)) (err ERR_INSUFFICIENT_FUNDS)) (unwrap! (ft-mint? cost-vote-token amount tx-sender) (err ERR_UNREACHABLE)) (map-set proposal-votes { proposal-id: proposal-id } { votes: (+ amount cur-votes) }) (map-set principal-proposal-votes { address: tx-sender, proposal-id: proposal-id} { votes: (+ amount cur-principal-votes)}) (ok true))) ;; Withdraw votes (define-public (withdraw-votes (proposal-id uint) (amount uint)) (let ( (cur-votes (default-to u0 (get votes (map-get? proposal-votes { proposal-id: proposal-id })))) (cur-principal-votes (default-to u0 (get votes (map-get? principal-proposal-votes { address: tx-sender, proposal-id: proposal-id })))) (sender tx-sender)) (asserts! (> amount u0) (err ERR_AMOUNT_NOT_POSITIVE)) (asserts! (>= cur-principal-votes amount) (err ERR_INSUFFICIENT_FUNDS)) (unwrap! (as-contract (stx-transfer? amount tx-sender sender)) (err ERR_STX_TRANSFER)) (unwrap! (as-contract (ft-transfer? cost-vote-token amount sender tx-sender)) (err ERR_FT_TRANSFER)) (map-set proposal-votes { proposal-id: proposal-id } { votes: (- cur-votes amount) }) (map-set principal-proposal-votes { address: tx-sender, proposal-id: proposal-id } { votes: (- cur-principal-votes amount) }) (ok true))) ;; Miner veto (define-public (veto (proposal-id uint)) (let ( (cur-vetos (default-to u0 (get vetos (map-get? proposal-vetos { proposal-id: proposal-id })))) (expiration-block-height (get expiration-block-height (unwrap! (map-get? vote-confirmed-proposals { proposal-id: proposal-id }) (err ERR_VOTE_NOT_CONFIRMED)))) (vetoed (default-to false (get vetoed (map-get? exercised-veto { proposal-id: proposal-id, veto-height: block-height })))) (last-miner (unwrap! (get-block-info? miner-address (- block-height u1)) (err ERR_FETCHING_BLOCK_INFO)))) ;; a miner can only veto once per block (asserts! (not vetoed) (err ERR_ALREADY_VETOED)) ;; vetoes must be cast within the veto period (asserts! (< block-height expiration-block-height) (err ERR_VETO_PERIOD_OVER)) ;; a miner can only veto if they mined the previous block (asserts! (is-eq contract-caller last-miner) (err ERR_NOT_LAST_MINER)) ;; a veto cannot be cast if a proposal has already been miner confirmed (asserts! (is-none (map-get? proposal-confirmed-id { proposal-id: proposal-id })) (err ERR_PROPOSAL_CONFIRMED)) (map-set proposal-vetos { proposal-id: proposal-id } { vetos: (+ u1 cur-vetos) }) (map-set exercised-veto { proposal-id: proposal-id, veto-height: block-height } { vetoed: true }) (ok true))) ;; Confirm proposal has reached required vote count (define-public (confirm-votes (proposal-id uint)) (let ( (votes (default-to u0 (get votes (map-get? proposal-votes { proposal-id: proposal-id })))) (proposal (unwrap! (map-get? proposals { proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL))) (confirmed-count (var-get confirmed-proposal-count)) (expiration-block-height (get expiration-block-height proposal))) ;; confirmation fails if invoked after proposal has expired (asserts! (< block-height expiration-block-height) (err ERR_PROPOSAL_EXPIRED)) ;; confirmation fails if the required threshold of votes is not met (asserts! (>= (/ (* votes u100) stx-liquid-supply) REQUIRED_PERCENT_STX_VOTE) (err ERR_INSUFFICIENT_VOTES)) (map-insert vote-confirmed-proposals { proposal-id: proposal-id } { expiration-block-height: (+ VETO_LENGTH block-height) }) (ok true))) ;; Confirm proposal hasn't been vetoed (define-public (confirm-miners (proposal-id uint)) (let ((vetos (default-to u0 (get vetos (map-get? proposal-vetos { proposal-id: proposal-id })))) (vote-confirmed-proposal (unwrap! (map-get? vote-confirmed-proposals { proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL))) (proposal (unwrap! (map-get? proposals { proposal-id: proposal-id }) (err ERR_NO_SUCH_PROPOSAL))) (confirmed-count (var-get confirmed-proposal-count)) (expiration-block-height (get expiration-block-height vote-confirmed-proposal)) (confirmed-this-block (default-to u0 (map-get? confirmed-count-at-block block-height)))) ;; have we already confirmed too many proposals in this block (asserts! (< confirmed-this-block MAX_CONFIRMED_PER_BLOCK) (err ERR_TOO_MANY_CONFIRMED)) (map-set confirmed-count-at-block block-height (+ u1 confirmed-this-block)) ;; miner confirmation will fail if invoked before the expiration (asserts! (>= block-height expiration-block-height) (err ERR_VETO_PERIOD_NOT_OVER)) ;; miner confirmation will fail if there are enough vetos (asserts! (< vetos REQUIRED_VETOES) (err ERR_PROPOSAL_VETOED)) (map-insert confirmed-proposals { confirmed-id: confirmed-count } { function-contract: (get function-contract proposal), function-name: (get function-name proposal), cost-function-contract: (get cost-function-contract proposal), cost-function-name: (get cost-function-name proposal), confirmed-height: block-height }) (map-insert proposal-confirmed-id { proposal-id: proposal-id } { confirmed-id: confirmed-count }) (var-set confirmed-proposal-count (+ confirmed-count u1)) (ok true))) ================================================ FILE: samples/Clarity/pox.clar ================================================ ;; The .pox contract ;; Error codes (define-constant ERR_STACKING_UNREACHABLE 255) (define-constant ERR_STACKING_INSUFFICIENT_FUNDS 1) (define-constant ERR_STACKING_INVALID_LOCK_PERIOD 2) (define-constant ERR_STACKING_ALREADY_STACKED 3) (define-constant ERR_STACKING_NO_SUCH_PRINCIPAL 4) (define-constant ERR_STACKING_EXPIRED 5) (define-constant ERR_STACKING_STX_LOCKED 6) (define-constant ERR_STACKING_PERMISSION_DENIED 9) (define-constant ERR_STACKING_THRESHOLD_NOT_MET 11) (define-constant ERR_STACKING_POX_ADDRESS_IN_USE 12) (define-constant ERR_STACKING_INVALID_POX_ADDRESS 13) (define-constant ERR_STACKING_ALREADY_REJECTED 17) (define-constant ERR_STACKING_INVALID_AMOUNT 18) (define-constant ERR_NOT_ALLOWED 19) (define-constant ERR_STACKING_ALREADY_DELEGATED 20) (define-constant ERR_DELEGATION_EXPIRES_DURING_LOCK 21) (define-constant ERR_DELEGATION_TOO_MUCH_LOCKED 22) (define-constant ERR_DELEGATION_POX_ADDR_REQUIRED 23) (define-constant ERR_INVALID_START_BURN_HEIGHT 24) ;; PoX disabling threshold (a percent) (define-constant POX_REJECTION_FRACTION u25) ;; Data vars that store a copy of the burnchain configuration. ;; Implemented as data-vars, so that different configurations can be ;; used in e.g. test harnesses. (define-data-var pox-prepare-cycle-length uint PREPARE_CYCLE_LENGTH) (define-data-var pox-reward-cycle-length uint REWARD_CYCLE_LENGTH) (define-data-var pox-rejection-fraction uint POX_REJECTION_FRACTION) (define-data-var first-burnchain-block-height uint u0) (define-data-var configured bool false) ;; This function can only be called once, when it boots up (define-public (set-burnchain-parameters (first-burn-height uint) (prepare-cycle-length uint) (reward-cycle-length uint) (rejection-fraction uint)) (begin (asserts! (not (var-get configured)) (err ERR_NOT_ALLOWED)) (var-set first-burnchain-block-height first-burn-height) (var-set pox-prepare-cycle-length prepare-cycle-length) (var-set pox-reward-cycle-length reward-cycle-length) (var-set pox-rejection-fraction rejection-fraction) (var-set configured true) (ok true)) ) ;; The Stacking lock-up state and associated metadata. ;; Records can be inserted into this map via one of two ways: ;; * via contract-call? to the (stack-stx) method, or ;; * via a transaction in the underlying burnchain that encodes the same data. ;; In the latter case, this map will be updated by the Stacks ;; node itself, and transactions in the burnchain will take priority ;; over transactions in the Stacks chain when processing this block. (define-map stacking-state { stacker: principal } { ;; how many uSTX locked? amount-ustx: uint, ;; Description of the underlying burnchain address that will ;; receive PoX'ed tokens. Translating this into an address ;; depends on the burnchain being used. When Bitcoin is ;; the burnchain, this gets translated into a p2pkh, p2sh, ;; p2wpkh-p2sh, or p2wsh-p2sh UTXO, depending on the version. pox-addr: { version: (buff 1), hashbytes: (buff 20) }, ;; how long the uSTX are locked, in reward cycles. lock-period: uint, ;; reward cycle when rewards begin first-reward-cycle: uint } ) ;; Delegation relationships (define-map delegation-state { stacker: principal } { amount-ustx: uint, ;; how many uSTX delegated? delegated-to: principal, ;; who are we delegating? until-burn-ht: (optional uint), ;; how long does the delegation last? ;; does the delegate _need_ to use a specific ;; pox recipient address? pox-addr: (optional { version: (buff 1), hashbytes: (buff 20) }) } ) ;; allowed contract-callers (define-map allowance-contract-callers { sender: principal, contract-caller: principal } { until-burn-ht: (optional uint) }) ;; How many uSTX are stacked in a given reward cycle. ;; Updated when a new PoX address is registered, or when more STX are granted ;; to it. (define-map reward-cycle-total-stacked { reward-cycle: uint } { total-ustx: uint } ) ;; Internal map read by the Stacks node to iterate through the list of ;; PoX reward addresses on a per-reward-cycle basis. (define-map reward-cycle-pox-address-list { reward-cycle: uint, index: uint } { pox-addr: { version: (buff 1), hashbytes: (buff 20) }, total-ustx: uint } ) (define-map reward-cycle-pox-address-list-len { reward-cycle: uint } { len: uint } ) ;; how much has been locked up for this address before ;; committing? ;; this map allows stackers to stack amounts < minimum ;; by paying the cost of aggregation during the commit (define-map partial-stacked-by-cycle { pox-addr: { version: (buff 1), hashbytes: (buff 20) }, reward-cycle: uint, sender: principal } { stacked-amount: uint } ) ;; Amount of uSTX that reject PoX, by reward cycle (define-map stacking-rejection { reward-cycle: uint } { amount: uint } ) ;; Who rejected in which reward cycle (define-map stacking-rejectors { stacker: principal, reward-cycle: uint } { amount: uint } ) ;; Getter for stacking-rejectors (define-read-only (get-pox-rejection (stacker principal) (reward-cycle uint)) (map-get? stacking-rejectors { stacker: stacker, reward-cycle: reward-cycle })) ;; Has PoX been rejected in the given reward cycle? (define-read-only (is-pox-active (reward-cycle uint)) (let ( (reject-votes (default-to u0 (get amount (map-get? stacking-rejection { reward-cycle: reward-cycle })))) ) ;; (100 * reject-votes) / stx-liquid-supply < pox-rejection-fraction (< (* u100 reject-votes) (* (var-get pox-rejection-fraction) stx-liquid-supply))) ) ;; What's the reward cycle number of the burnchain block height? ;; Will runtime-abort if height is less than the first burnchain block (this is intentional) (define-private (burn-height-to-reward-cycle (height uint)) (/ (- height (var-get first-burnchain-block-height)) (var-get pox-reward-cycle-length))) ;; What's the block height at the start of a given reward cycle? (define-private (reward-cycle-to-burn-height (cycle uint)) (+ (var-get first-burnchain-block-height) (* cycle (var-get pox-reward-cycle-length)))) ;; What's the current PoX reward cycle? (define-private (current-pox-reward-cycle) (burn-height-to-reward-cycle burn-block-height)) ;; Get the _current_ PoX stacking principal information. If the information ;; is expired, or if there's never been such a stacker, then returns none. (define-read-only (get-stacker-info (stacker principal)) (match (map-get? stacking-state { stacker: stacker }) stacking-info (if (<= (+ (get first-reward-cycle stacking-info) (get lock-period stacking-info)) (current-pox-reward-cycle)) ;; present, but lock has expired none ;; present, and lock has not expired (some stacking-info) ) ;; no state at all none )) (define-private (check-caller-allowed) (or (is-eq tx-sender contract-caller) (let ((caller-allowed ;; if not in the caller map, return false (unwrap! (map-get? allowance-contract-callers { sender: tx-sender, contract-caller: contract-caller }) false))) ;; is the caller allowance expired? (if (< burn-block-height (unwrap! (get until-burn-ht caller-allowed) true)) false true)))) (define-private (get-check-delegation (stacker principal)) (let ((delegation-info (try! (map-get? delegation-state { stacker: stacker })))) ;; did the existing delegation expire? (if (match (get until-burn-ht delegation-info) until-burn-ht (> burn-block-height until-burn-ht) false) ;; it expired, return none none ;; delegation is active (some delegation-info)))) ;; Get the size of the reward set for a reward cycle. ;; Note that this does _not_ return duplicate PoX addresses. ;; Note that this also _will_ return PoX addresses that are beneath ;; the minimum threshold -- i.e. the threshold can increase after insertion. ;; Used internally by the Stacks node, which filters out the entries ;; in this map to select PoX addresses with enough STX. (define-read-only (get-reward-set-size (reward-cycle uint)) (default-to u0 (get len (map-get? reward-cycle-pox-address-list-len { reward-cycle: reward-cycle })))) ;; How many rejection votes have we been accumulating for the next block (define-private (next-cycle-rejection-votes) (default-to u0 (get amount (map-get? stacking-rejection { reward-cycle: (+ u1 (current-pox-reward-cycle)) })))) ;; Add a single PoX address to a single reward cycle. ;; Used to build up a set of per-reward-cycle PoX addresses. ;; No checking will be done -- don't call if this PoX address is already registered in this reward cycle! (define-private (append-reward-cycle-pox-addr (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (reward-cycle uint) (amount-ustx uint)) (let ( (sz (get-reward-set-size reward-cycle)) ) (map-set reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: sz } { pox-addr: pox-addr, total-ustx: amount-ustx }) (map-set reward-cycle-pox-address-list-len { reward-cycle: reward-cycle } { len: (+ u1 sz) }) (+ u1 sz)) ) ;; How many uSTX are stacked? (define-read-only (get-total-ustx-stacked (reward-cycle uint)) (default-to u0 (get total-ustx (map-get? reward-cycle-total-stacked { reward-cycle: reward-cycle }))) ) ;; Called internally by the node to iterate through the list of PoX addresses in this reward cycle. ;; Returns (optional (tuple (pox-addr ) (total-ustx ))) (define-read-only (get-reward-set-pox-address (reward-cycle uint) (index uint)) (map-get? reward-cycle-pox-address-list { reward-cycle: reward-cycle, index: index })) ;; Add a PoX address to the ith reward cycle, if i is between 0 and the given num-cycles (exclusive). ;; Arguments are given as a tuple, so this function can be (map ..)'ed onto a list of its arguments. ;; Used by add-pox-addr-to-reward-cycles. ;; No checking is done. ;; Returns 1 if added. ;; Returns 0 if not added. (define-private (add-pox-addr-to-ith-reward-cycle (cycle-index uint) (params (tuple (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (first-reward-cycle uint) (num-cycles uint) (amount-ustx uint) (i uint)))) (let ((reward-cycle (+ (get first-reward-cycle params) (get i params))) (num-cycles (get num-cycles params)) (i (get i params))) { pox-addr: (get pox-addr params), first-reward-cycle: (get first-reward-cycle params), num-cycles: num-cycles, amount-ustx: (get amount-ustx params), i: (if (< i num-cycles) (let ((total-ustx (get-total-ustx-stacked reward-cycle))) ;; record how many uSTX this pox-addr will stack for in the given reward cycle (append-reward-cycle-pox-addr (get pox-addr params) reward-cycle (get amount-ustx params)) ;; update running total (map-set reward-cycle-total-stacked { reward-cycle: reward-cycle } { total-ustx: (+ (get amount-ustx params) total-ustx) }) ;; updated _this_ reward cycle (+ i u1)) (+ i u0)) })) ;; Add a PoX address to a given sequence of reward cycle lists. ;; A PoX address can be added to at most 12 consecutive cycles. ;; No checking is done. (define-private (add-pox-addr-to-reward-cycles (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (first-reward-cycle uint) (num-cycles uint) (amount-ustx uint)) (let ((cycle-indexes (list u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11))) ;; For safety, add up the number of times (add-principal-to-ith-reward-cycle) returns 1. ;; It _should_ be equal to num-cycles. (asserts! (is-eq num-cycles (get i (fold add-pox-addr-to-ith-reward-cycle cycle-indexes { pox-addr: pox-addr, first-reward-cycle: first-reward-cycle, num-cycles: num-cycles, amount-ustx: amount-ustx, i: u0 }))) (err ERR_STACKING_UNREACHABLE)) (ok true))) (define-private (add-pox-partial-stacked-to-ith-cycle (cycle-index uint) (params { pox-addr: { version: (buff 1), hashbytes: (buff 20) }, reward-cycle: uint, num-cycles: uint, amount-ustx: uint })) (let ((pox-addr (get pox-addr params)) (num-cycles (get num-cycles params)) (reward-cycle (get reward-cycle params)) (amount-ustx (get amount-ustx params))) (let ((current-amount (default-to u0 (get stacked-amount (map-get? partial-stacked-by-cycle { sender: tx-sender, pox-addr: pox-addr, reward-cycle: reward-cycle }))))) (if (>= cycle-index num-cycles) ;; do not add to cycles >= cycle-index false ;; otherwise, add to the partial-stacked-by-cycle (map-set partial-stacked-by-cycle { sender: tx-sender, pox-addr: pox-addr, reward-cycle: reward-cycle } { stacked-amount: (+ amount-ustx current-amount) })) ;; produce the next params tuple { pox-addr: pox-addr, reward-cycle: (+ u1 reward-cycle), num-cycles: num-cycles, amount-ustx: amount-ustx }))) ;; Add a PoX address to a given sequence of partial reward cycle lists. ;; A PoX address can be added to at most 12 consecutive cycles. ;; No checking is done. (define-private (add-pox-partial-stacked (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (first-reward-cycle uint) (num-cycles uint) (amount-ustx uint)) (let ((cycle-indexes (list u0 u1 u2 u3 u4 u5 u6 u7 u8 u9 u10 u11))) (fold add-pox-partial-stacked-to-ith-cycle cycle-indexes { pox-addr: pox-addr, reward-cycle: first-reward-cycle, num-cycles: num-cycles, amount-ustx: amount-ustx }) true)) ;; What is the minimum number of uSTX to be stacked in the given reward cycle? ;; Used internally by the Stacks node, and visible publicly. (define-read-only (get-stacking-minimum) (/ stx-liquid-supply STACKING_THRESHOLD_25)) ;; Is the address mode valid for a PoX burn address? (define-private (check-pox-addr-version (version (buff 1))) (or (is-eq version ADDRESS_VERSION_P2PKH) (is-eq version ADDRESS_VERSION_P2SH) (is-eq version ADDRESS_VERSION_P2WPKH) (is-eq version ADDRESS_VERSION_P2WSH))) ;; Is the given lock period valid? (define-private (check-pox-lock-period (lock-period uint)) (and (>= lock-period MIN_POX_REWARD_CYCLES) (<= lock-period MAX_POX_REWARD_CYCLES))) ;; Evaluate if a participant can stack an amount of STX for a given period. ;; This method is designed as a read-only method so that it can be used as ;; a set of guard conditions and also as a read-only RPC call that can be ;; performed beforehand. (define-read-only (can-stack-stx (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (amount-ustx uint) (first-reward-cycle uint) (num-cycles uint)) (begin ;; minimum uSTX must be met (asserts! (<= (print (get-stacking-minimum)) amount-ustx) (err ERR_STACKING_THRESHOLD_NOT_MET)) (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle num-cycles))) ;; Evaluate if a participant can stack an amount of STX for a given period. ;; This method is designed as a read-only method so that it can be used as ;; a set of guard conditions and also as a read-only RPC call that can be ;; performed beforehand. (define-read-only (minimal-can-stack-stx (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (amount-ustx uint) (first-reward-cycle uint) (num-cycles uint)) (begin ;; amount must be valid (asserts! (> amount-ustx u0) (err ERR_STACKING_INVALID_AMOUNT)) ;; sender principal must not have rejected in this upcoming reward cycle (asserts! (is-none (get-pox-rejection tx-sender first-reward-cycle)) (err ERR_STACKING_ALREADY_REJECTED)) ;; lock period must be in acceptable range. (asserts! (check-pox-lock-period num-cycles) (err ERR_STACKING_INVALID_LOCK_PERIOD)) ;; address version must be valid (asserts! (check-pox-addr-version (get version pox-addr)) (err ERR_STACKING_INVALID_POX_ADDRESS)) (ok true))) ;; Revoke contract-caller authorization to call stacking methods (define-public (disallow-contract-caller (caller principal)) (begin (asserts! (is-eq tx-sender contract-caller) (err ERR_STACKING_PERMISSION_DENIED)) (ok (map-delete allowance-contract-callers { sender: tx-sender, contract-caller: caller })))) ;; Give a contract-caller authorization to call stacking methods ;; normally, stacking methods may only be invoked by _direct_ transactions ;; (i.e., the tx-sender issues a direct contract-call to the stacking methods) ;; by issuing an allowance, the tx-sender may call through the allowed contract (define-public (allow-contract-caller (caller principal) (until-burn-ht (optional uint))) (begin (asserts! (is-eq tx-sender contract-caller) (err ERR_STACKING_PERMISSION_DENIED)) (ok (map-set allowance-contract-callers { sender: tx-sender, contract-caller: caller } { until-burn-ht: until-burn-ht })))) ;; Lock up some uSTX for stacking! Note that the given amount here is in micro-STX (uSTX). ;; The STX will be locked for the given number of reward cycles (lock-period). ;; This is the self-service interface. tx-sender will be the Stacker. ;; ;; * The given stacker cannot currently be stacking. ;; * You will need the minimum uSTX threshold. This will be determined by (get-stacking-minimum) ;; at the time this method is called. ;; * You may need to increase the amount of uSTX locked up later, since the minimum uSTX threshold ;; may increase between reward cycles. ;; * The Stacker will receive rewards in the reward cycle following `start-burn-ht`. ;; Importantly, `start-burn-ht` may not be further into the future than the next reward cycle, ;; and in most cases should be set to the current burn block height. ;; ;; The tokens will unlock and be returned to the Stacker (tx-sender) automatically. (define-public (stack-stx (amount-ustx uint) (pox-addr (tuple (version (buff 1)) (hashbytes (buff 20)))) (start-burn-ht uint) (lock-period uint)) ;; this stacker's first reward cycle is the _next_ reward cycle (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle))) (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht)))) ;; the start-burn-ht must result in the next reward cycle, do not allow stackers ;; to "post-date" their `stack-stx` transaction (asserts! (is-eq first-reward-cycle specified-reward-cycle) (err ERR_INVALID_START_BURN_HEIGHT)) ;; must be called directly by the tx-sender or by an allowed contract-caller (asserts! (check-caller-allowed) (err ERR_STACKING_PERMISSION_DENIED)) ;; tx-sender principal must not be stacking (asserts! (is-none (get-stacker-info tx-sender)) (err ERR_STACKING_ALREADY_STACKED)) ;; tx-sender must not be delegating (asserts! (is-none (get-check-delegation tx-sender)) (err ERR_STACKING_ALREADY_DELEGATED)) ;; the Stacker must have sufficient unlocked funds (asserts! (>= (stx-get-balance tx-sender) amount-ustx) (err ERR_STACKING_INSUFFICIENT_FUNDS)) ;; ensure that stacking can be performed (try! (can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period)) ;; register the PoX address with the amount stacked (try! (add-pox-addr-to-reward-cycles pox-addr first-reward-cycle lock-period amount-ustx)) ;; add stacker record (map-set stacking-state { stacker: tx-sender } { amount-ustx: amount-ustx, pox-addr: pox-addr, first-reward-cycle: first-reward-cycle, lock-period: lock-period }) ;; return the lock-up information, so the node can actually carry out the lock. (ok { stacker: tx-sender, lock-amount: amount-ustx, unlock-burn-height: (reward-cycle-to-burn-height (+ first-reward-cycle lock-period)) })) ) (define-public (revoke-delegate-stx) (begin ;; must be called directly by the tx-sender or by an allowed contract-caller (asserts! (check-caller-allowed) (err ERR_STACKING_PERMISSION_DENIED)) (ok (map-delete delegation-state { stacker: tx-sender })))) ;; Delegate to `delegate-to` the ability to stack from a given address. ;; This method _does not_ lock the funds, rather, it allows the delegate ;; to issue the stacking lock. ;; The caller specifies: ;; * amount-ustx: the total amount of ustx the delegate may be allowed to lock ;; * until-burn-ht: an optional burn height at which this delegation expiration ;; * pox-addr: an optional address to which any rewards *must* be sent (define-public (delegate-stx (amount-ustx uint) (delegate-to principal) (until-burn-ht (optional uint)) (pox-addr (optional { version: (buff 1), hashbytes: (buff 20) }))) (begin ;; must be called directly by the tx-sender or by an allowed contract-caller (asserts! (check-caller-allowed) (err ERR_STACKING_PERMISSION_DENIED)) ;; tx-sender principal must not be stacking (asserts! (is-none (get-stacker-info tx-sender)) (err ERR_STACKING_ALREADY_STACKED)) ;; tx-sender must not be delegating (asserts! (is-none (get-check-delegation tx-sender)) (err ERR_STACKING_ALREADY_DELEGATED)) ;; add delegation record (map-set delegation-state { stacker: tx-sender } { amount-ustx: amount-ustx, delegated-to: delegate-to, until-burn-ht: until-burn-ht, pox-addr: pox-addr }) (ok true))) ;; Commit partially stacked STX. ;; This allows a stacker/delegate to lock fewer STX than the minimal threshold in multiple transactions, ;; so long as: 1. The pox-addr is the same. ;; 2. This "commit" transaction is called _before_ the PoX anchor block. ;; This ensures that each entry in the reward set returned to the stacks-node is greater than the threshold, ;; but does not require it be all locked up within a single transaction (define-public (stack-aggregation-commit (pox-addr { version: (buff 1), hashbytes: (buff 20) }) (reward-cycle uint)) (let ((partial-stacked ;; fetch the partial commitments (unwrap! (map-get? partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle }) (err ERR_STACKING_NO_SUCH_PRINCIPAL)))) ;; must be called directly by the tx-sender or by an allowed contract-caller (asserts! (check-caller-allowed) (err ERR_STACKING_PERMISSION_DENIED)) (let ((amount-ustx (get stacked-amount partial-stacked))) (try! (can-stack-stx pox-addr amount-ustx reward-cycle u1)) ;; add the pox addr to the reward cycle (add-pox-addr-to-ith-reward-cycle u0 { pox-addr: pox-addr, first-reward-cycle: reward-cycle, num-cycles: u1, amount-ustx: amount-ustx, i: u0 }) ;; don't update the stacking-state map, ;; because it _already has_ this stacker's state ;; don't lock the STX, because the STX is already locked ;; ;; clear the partial-stacked state (map-delete partial-stacked-by-cycle { pox-addr: pox-addr, sender: tx-sender, reward-cycle: reward-cycle }) (ok true)))) ;; As a delegate, stack the given principal's STX using partial-stacked-by-cycle ;; Once the delegate has stacked > minimum, the delegate should call stack-aggregation-commit (define-public (delegate-stack-stx (stacker principal) (amount-ustx uint) (pox-addr { version: (buff 1), hashbytes: (buff 20) }) (start-burn-ht uint) (lock-period uint)) ;; this stacker's first reward cycle is the _next_ reward cycle (let ((first-reward-cycle (+ u1 (current-pox-reward-cycle))) (specified-reward-cycle (+ u1 (burn-height-to-reward-cycle start-burn-ht))) (unlock-burn-height (reward-cycle-to-burn-height (+ (current-pox-reward-cycle) u1 lock-period)))) ;; the start-burn-ht must result in the next reward cycle, do not allow stackers ;; to "post-date" their `stack-stx` transaction (asserts! (is-eq first-reward-cycle specified-reward-cycle) (err ERR_INVALID_START_BURN_HEIGHT)) ;; must be called directly by the tx-sender or by an allowed contract-caller (asserts! (check-caller-allowed) (err ERR_STACKING_PERMISSION_DENIED)) ;; stacker must have delegated to the caller (let ((delegation-info (unwrap! (get-check-delegation stacker) (err ERR_STACKING_PERMISSION_DENIED)))) ;; must have delegated to tx-sender (asserts! (is-eq (get delegated-to delegation-info) tx-sender) (err ERR_STACKING_PERMISSION_DENIED)) ;; must have delegated enough stx (asserts! (>= (get amount-ustx delegation-info) amount-ustx) (err ERR_DELEGATION_TOO_MUCH_LOCKED)) ;; if pox-addr is set, must be equal to pox-addr (asserts! (match (get pox-addr delegation-info) specified-pox-addr (is-eq pox-addr specified-pox-addr) true) (err ERR_DELEGATION_POX_ADDR_REQUIRED)) ;; delegation must not expire before lock period (asserts! (match (get until-burn-ht delegation-info) until-burn-ht (>= until-burn-ht unlock-burn-height) true) (err ERR_DELEGATION_EXPIRES_DURING_LOCK))) ;; stacker principal must not be stacking (asserts! (is-none (get-stacker-info stacker)) (err ERR_STACKING_ALREADY_STACKED)) ;; the Stacker must have sufficient unlocked funds (asserts! (>= (stx-get-balance stacker) amount-ustx) (err ERR_STACKING_INSUFFICIENT_FUNDS)) ;; ensure that stacking can be performed (try! (minimal-can-stack-stx pox-addr amount-ustx first-reward-cycle lock-period)) ;; register the PoX address with the amount stacked via partial stacking ;; before it can be included in the reward set, this must be committed! (add-pox-partial-stacked pox-addr first-reward-cycle lock-period amount-ustx) ;; add stacker record (map-set stacking-state { stacker: stacker } { amount-ustx: amount-ustx, pox-addr: pox-addr, first-reward-cycle: first-reward-cycle, lock-period: lock-period }) ;; return the lock-up information, so the node can actually carry out the lock. (ok { stacker: stacker, lock-amount: amount-ustx, unlock-burn-height: unlock-burn-height }))) ;; Reject Stacking for this reward cycle. ;; tx-sender votes all its uSTX for rejection. ;; Note that unlike PoX, rejecting PoX does not lock the tx-sender's ;; tokens. PoX rejection acts like a coin vote. (define-public (reject-pox) (let ( (balance (stx-get-balance tx-sender)) (vote-reward-cycle (+ u1 (current-pox-reward-cycle))) ) ;; tx-sender principal must not have rejected in this upcoming reward cycle (asserts! (is-none (get-pox-rejection tx-sender vote-reward-cycle)) (err ERR_STACKING_ALREADY_REJECTED)) ;; tx-sender can't be a stacker (asserts! (is-none (get-stacker-info tx-sender)) (err ERR_STACKING_ALREADY_STACKED)) ;; vote for rejection (map-set stacking-rejection { reward-cycle: vote-reward-cycle } { amount: (+ (next-cycle-rejection-votes) balance) } ) ;; mark voted (map-set stacking-rejectors { stacker: tx-sender, reward-cycle: vote-reward-cycle } { amount: balance } ) (ok true)) ) ;; Used for PoX parameters discovery (define-read-only (get-pox-info) (ok { min-amount-ustx: (get-stacking-minimum), reward-cycle-id: (current-pox-reward-cycle), prepare-cycle-length: (var-get pox-prepare-cycle-length), first-burnchain-block-height: (var-get first-burnchain-block-height), reward-cycle-length: (var-get pox-reward-cycle-length), rejection-fraction: (var-get pox-rejection-fraction), current-rejection-votes: (next-cycle-rejection-votes), total-liquid-supply-ustx: stx-liquid-supply, }) ) ================================================ FILE: samples/Classic ASP/ASPUnitRunner.asp ================================================ <% Option Explicit %> <% Dim objLifecycle Set objLifecycle = ASPUnit.CreateLifeCycle("Setup", "Teardown") Call ASPUnit.AddModule( _ ASPUnit.CreateModule( _ "ASPUnitRunner AddPage Tests", _ Array( _ ASPUnit.CreateTest("ASPUnitRunnerAddPage"), _ ASPUnit.CreateTest("ASPUnitRunnerAddPages") _ ), _ objLifecycle _ ) _ ) Call ASPUnit.AddModule( _ ASPUnit.CreateModule( _ "ASPUnitRunner Run Tests", _ Array( _ ASPUnit.CreateTest("ASPUnitRunnerRunAddsCurrentPage"), _ ASPUnit.CreateTest("ASPUnitRunnerPassesToRenderer") _ ), _ objLifecycle _ ) _ ) Call ASPUnit.Run() ' Create a global instance of ASPUnitRunner for testing Sub Setup() Call ExecuteGlobal("Dim objService") Set objService = New ASPUnitRunner End Sub Sub Teardown() Set objService = Nothing End Sub ' Create a mock theme service that sets a global variable to indicate Render method executed Class ASPUnitUIRendererMockTheme Public Sub Render(objValue) Call ExecuteGlobal("Dim blnRendererRan") blnRendererRan = True End Sub End Class ' Test that ASPUnitRunner adds specified pages Sub ASPUnitRunnerAddPage() Call objService.AddPage(Nothing) Call ASPUnit.Equal(objService.Pages.Count, 1, "AddPage method should add page to collection") End Sub Sub ASPUnitRunnerAddPages() Call objService.AddPages(Array(Nothing, Nothing)) Call ASPUnit.Equal(objService.Pages.Count, 2, "AddPages method should add pages to collection") End Sub ' Test that ASPUnitRunner adds current page if no pages are specified Sub ASPUnitRunnerRunAddsCurrentPage() Set objService.Theme = New ASPUnitUIRendererMockTheme Call objService.Run() Call ASPUnit.Equal(objService.Pages.Count, 1, "Run method should add current page if no pages are specified") End Sub ' Test that ASPUnitRunner implments renderer on Run Sub ASPUnitRunnerPassesToRenderer() Set objService.Theme = New ASPUnitUIRendererMockTheme Call objService.Run() Call ASPUnit.Equal(blnRendererRan, True, "Run method should execute renderer render method") End Sub %> ================================================ FILE: samples/Classic ASP/sendingcontent-xml.asp ================================================ <% ' to set content type we can use Response.ContentType ' sample XML taken from http://json.org/example.html Response.ContentType = "text/xml" %> example glossary S Standard Generalized Markup Language SGML ISO 8879:1986 A meta-markup language, used to create markup languages such as DocBook. ================================================ FILE: samples/Clean/GenHylo.dcl ================================================ definition module GenHylo import StdGeneric, GenMap :: Fix f = In (f .(Fix f)) Out :: !u:(Fix v:a) -> v:(a w:(Fix v:a)), [u <= w] hylo :: ((.f .b) -> .b) (.a -> (.f .a)) -> (.a -> .b) | gMap{|*->*|} f cata :: (u:(f .a) -> .a) -> (Fix u:f) -> .a | gMap{|*->*|} f ana :: (.a -> u:(f .a)) -> .a -> (Fix u:f) | gMap{|*->*|} f ================================================ FILE: samples/Clean/GenMap.dcl ================================================ definition module GenMap import StdGeneric generic gMap a b :: .a -> .b derive gMap c, UNIT, PAIR, EITHER, CONS, FIELD, OBJECT, {}, {!} derive gMap [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,) ================================================ FILE: samples/Clean/GenMap.icl ================================================ implementation module GenMap import StdClass, StdArray, StdInt, StdFunc import StdGeneric, _Array generic gMap a b :: .a -> .b gMap{|c|} x = x gMap{|UNIT|} x = x gMap{|PAIR|} fx fy (PAIR x y) = PAIR (fx x) (fy y) gMap{|EITHER|} fl fr (LEFT x) = LEFT (fl x) gMap{|EITHER|} fl fr (RIGHT x) = RIGHT (fr x) gMap{|CONS|} f (CONS x) = CONS (f x) gMap{|FIELD|} f (FIELD x) = FIELD (f x) gMap{|OBJECT|} f (OBJECT x) = OBJECT (f x) gMap{|{}|} f xs = mapArray f xs gMap{|{!}|} f xs = mapArray f xs derive gMap [], (,), (,,), (,,,), (,,,,), (,,,,,), (,,,,,,), (,,,,,,,) ================================================ FILE: samples/Clean/fsieve.icl ================================================ module fsieve /* The Fast Sieve of Eratosthenes. A sequential and optimized version of the sieve of Eratosthenes. The program calculates a list of the first NrOfPrime primes. The result of the program is the NrOfPrimes'th prime. Strictness annotations have been added because the strictness analyser is not able to deduce all strictness information. Removal of these !'s will make the program about 20% slower. On a machine without a math coprocessor the execution of this program might take a (very) long time. Set NrOfPrimes to a smaller value. */ import StdClass; // RWS import StdInt, StdReal NrOfPrimes :== 3000 // The sieve algorithm: generate an infinite list of all primes. Primes::[Int] Primes = pr where pr = [5 : Sieve 7 4 pr] Sieve::Int !Int [Int] -> [Int] Sieve g i prs | IsPrime prs g (toInt (sqrt (toReal g))) = [g : Sieve` g i prs] = Sieve (g + i) (6 - i) prs Sieve`::Int Int [Int] -> [Int] Sieve` g i prs = Sieve (g + i) (6 - i) prs IsPrime::[Int] !Int Int -> Bool IsPrime [f:r] pr bd | f>bd = True | pr rem f==0 = False = IsPrime r pr bd // Select is used to get the NrOfPrimes'th prime from the infinite list. Select::[x] Int -> x Select [f:r] 1 = f Select [f:r] n = Select r (n - 1) /* The Start rule: Select the NrOfPrimes'th prime from the list of primes generated by Primes. */ Start::Int Start = Select [2, 3 : Primes] NrOfPrimes ================================================ FILE: samples/Clean/sem.icl ================================================ module monadicSemantics import StdEnv, StdGeneric, GenMap, GenHylo /* For fun I implemented the recursive datastructre Exp and Stm as fixpoints This helps us define recursive functions on them (only a little bit though) However deriving gMap for Fix did not works out of the box I had to remove some uniqueness typing in GenMap and GenHylo */ :: Op = Plus | Minus | Times | Rem | Equal | LessThan :: Var :== String :: ExpP a = Int Int | Var Var | Op Op a a :: Exp :== Fix ExpP :: StmP a = Assign Var Exp | If Exp a a | While Exp a | Seq a a | Cont :: Stm :== Fix StmP derive gMap ExpP, StmP, Fix // Environment. Semantics is basically Env -> Env :: Env :== Var -> Int :: Sem :== Env -> (Int, Env) empty = \v . 0 // return rtn :: Int -> Sem rtn i = \e. (i, e) // the usual bind (>>=) infixl 1 :: Sem (Int->Sem) -> Sem (>>=) x y = \e. (\(i,e2).y i e2) (x e) (>>|) infixl 1 :: Sem Sem -> Sem (>>|) x y = x >>= \_. y // read variable from environment read :: Var -> Sem read v = \e. (e v, e) // assign value to give variable in environment write :: Var Int -> Sem write v i = \e. (i, \w. if (w==v) i (e w)) // semantics class sem a :: a -> Sem operator :: Op -> Int -> Int -> Int operator Plus = (+) operator Minus = (-) operator Times = (*) operator Rem = rem operator Equal = \x y . if (x==y) 1 0 operator LessThan = \x y . if (x< y) 1 0 // semantics of expressions instance sem Exp where sem x = cata phi x where phi (Int n) = rtn n phi (Var v) = read v phi (Op op x y) = x >>= \v1. y >>= return o (operator op v1) // semantics of statments // NOTE: while will always return 0, as it might not even be executed instance sem Stm where sem x = cata phi x where phi (Assign v e) = sem e >>= write v phi (If e s1 s2) = sem e >>= \b . if (b<>0) s1 s2 phi stm=:(While e s) = sem e >>= \b . if (b<>0) (s >>| phi stm) (phi Cont) phi (Seq s1 s2) = s1 >>| s2 // Here the cata *finally* pays off :D phi Cont = rtn 0 // convenience functions int = In o Int var = In o Var op o = In o2 (Op o) assign = In o2 Assign ifte e = In o2 (If e) while = In o2 While seq = In o2 Seq cont = In Cont // test case, also testing the new operator < pEuclides = while (op LessThan (int 0) (var "b"))( seq (assign "r" (op Rem (var "a") (var "b"))) (seq (assign "a" (var "b")) ( (assign "b" (var "r"))) ) ) Start = fst (program start) where program = sem pEuclides >>| read "a" start "a" = 9 start "b" = 12 start _ = 0 // Helper (o2) infixr 9 (o2) f g x :== f o (g x) ================================================ FILE: samples/Clean/stack.dcl ================================================ definition module stack :: Stack a newStack :: (Stack a) push :: a (Stack a) -> Stack a pushes :: [a] (Stack a) -> Stack a pop :: (Stack a) -> Stack a popn :: Int (Stack a) -> Stack a top :: (Stack a) -> a topn :: Int (Stack a) -> [a] elements :: (Stack a) -> [a] count :: (Stack a) -> Int ================================================ FILE: samples/Clean/stack.icl ================================================ implementation module stack import StdEnv :: Stack a :== [a] newStack :: (Stack a) newStack = [] push :: a (Stack a) -> Stack a push x s = [x:s] pushes :: [a] (Stack a) -> Stack a pushes x s = x ++ s pop :: (Stack a) -> Stack a pop [] = abort "Cannot use pop on an empty stack" pop [e:s] = s popn :: Int (Stack a) -> Stack a popn n s = drop n s top :: (Stack a) -> a top [] = abort "Cannot use top on an empty stack" top [e:s] = e topn :: Int (Stack a) -> [a] topn n s = take n s elements :: (Stack a) -> [a] elements s = s count :: (Stack a) -> Int count s = length s ================================================ FILE: samples/Clean/streams.dcl ================================================ definition module streams import StdEnv instance zero [Real] instance one [Real] instance + [Real] instance - [Real] instance * [Real] instance / [Real] X :: [Real] invert :: [Real] -> [Real] pow :: [Real] Int -> [Real] (shuffle) infixl 7 :: [Real] [Real] -> [Real] ================================================ FILE: samples/Clean/streams.icl ================================================ implementation module streams import StdEnv instance zero [Real] where zero = [] //Infinite row of zeroes represented as empty list to ease computation instance one [Real] where one = [1.0:zero] instance + [Real] where (+) [s:s`] [t:t`] = [s+t:s`+t`] (+) [s:s`] [] = [s:s`] (+) [] [t:t`] = [t:t`] (+) [] [] = [] instance - [Real] where (-) [s:s`] [t:t`] = [s-t:s`-t`] (-) [s:s`] [] = [s:s`] (-) [] [t:t`] = [-1.0] * [t:t`] (-) [] [] = [] instance * [Real] where (*) [s:s`] [t:t`] = [s*t:s`*[t:t`]+[s]*t`] (*) _ _ = [] instance / [Real] where (/) s t = s * (invert t) X :: [Real] X = [0.0:one] invert :: [Real] -> [Real] invert [s:s`] = [1.0/s:(invert [s:s`]) * s` * [-1.0/s]] pow :: [Real] Int -> [Real] pow s 0 = one pow s n = s * pow s (n-1) (shuffle) infixl 7 :: [Real] [Real] -> [Real] (shuffle) [s:s`] [t:t`] = [s*t:s` shuffle [t:t`] + [s:s`] shuffle t`] (shuffle) _ _ = [] ================================================ FILE: samples/Click/sr2.click ================================================ rates :: AvailableRates elementclass sr2 { $sr2_ip, $sr2_nm, $wireless_mac, $gateway, $probes| arp :: ARPTable(); lt :: LinkTable(IP $sr2_ip); gw :: SR2GatewaySelector(ETHTYPE 0x062c, IP $sr2_ip, ETH $wireless_mac, LT lt, ARP arp, PERIOD 15, GW $gateway); gw -> SR2SetChecksum -> [0] output; set_gw :: SR2SetGateway(SEL gw); es :: SR2ETTStat(ETHTYPE 0x0641, ETH $wireless_mac, IP $sr2_ip, PERIOD 30000, TAU 300000, ARP arp, PROBES $probes, ETT metric, RT rates); metric :: SR2ETTMetric(LT lt); forwarder :: SR2Forwarder(ETHTYPE 0x0643, IP $sr2_ip, ETH $wireless_mac, ARP arp, LT lt); querier :: SR2Querier(ETH $wireless_mac, SR forwarder, LT lt, ROUTE_DAMPENING true, TIME_BEFORE_SWITCH 5, DEBUG true); query_forwarder :: SR2MetricFlood(ETHTYPE 0x0644, IP $sr2_ip, ETH $wireless_mac, LT lt, ARP arp, DEBUG false); query_responder :: SR2QueryResponder(ETHTYPE 0x0645, IP $sr2_ip, ETH $wireless_mac, LT lt, ARP arp, DEBUG true); query_responder -> SR2SetChecksum -> [0] output; query_forwarder -> SR2SetChecksum -> SR2Print(forwarding) -> [0] output; query_forwarder [1] -> query_responder; data_ck :: SR2SetChecksum() input [1] -> host_cl :: IPClassifier(dst net $sr2_ip mask $sr2_nm, -) -> querier -> data_ck; host_cl [1] -> [0] set_gw [0] -> querier; forwarder[0] -> dt ::DecIPTTL -> data_ck -> [2] output; dt[1] -> Print(ttl-error) -> ICMPError($sr2_ip, timeexceeded, 0) -> querier; // queries querier [1] -> [1] query_forwarder; es -> SetTimestamp() -> [1] output; forwarder[1] //ip packets to me -> SR2StripHeader() -> CheckIPHeader() -> from_gw_cl :: IPClassifier(src net $sr2_ip mask $sr2_nm, -) -> [3] output; from_gw_cl [1] -> [1] set_gw [1] -> [3] output; input [0] -> ncl :: Classifier( 12/0643 , //sr2_forwarder 12/0644 , //sr2 12/0645 , //replies 12/0641 , //sr2_es 12/062c , //sr2_gw ); ncl[0] -> SR2CheckHeader() -> [0] forwarder; ncl[1] -> SR2CheckHeader() -> PrintSR(query) -> query_forwarder ncl[2] -> SR2CheckHeader() -> query_responder; ncl[3] -> es; ncl[4] -> SR2CheckHeader() -> gw; } Idle -> s :: sr2(2.0.0.1, 255.0.0.0, 00:00:00:00:00:01, false, "12 60 12 1500") -> Discard; Idle -> [1] s; s[1] -> Discard; s[2] -> Discard; s[3] -> Discard; ================================================ FILE: samples/Click/thomer-nat.click ================================================ // This Click configuration implements a firewall and NAT, roughly based on the // mazu-nat.click example. // // This example assumes there is one interface that is IP-aliased. In this // example, eth0 and eth0:0 have IP addresses 66.68.65.90 and 192.168.1.1, // respectively. There is a local network, 192.168.1.0/24, and an upstream // gateway, 66.58.65.89. Traffic from the local network is NATed. // // Connections can be initiated from the NAT box itself, also. // // For bugs, suggestions, and, corrections, please email me. // // Author: Thomer M. Gil (click@thomer.com) AddressInfo( eth0-in 192.168.1.1 192.168.1.0/24 00:0d:87:9d:1c:e9, eth0-ex 66.58.65.90 00:0d:87:9d:1c:e9, gw-addr 66.58.65.89 00:20:6f:14:54:c2 ); elementclass SniffGatewayDevice { $device | from :: FromDevice($device) -> t1 :: Tee -> output; input -> q :: Queue(1024) -> t2 :: PullTee -> to :: ToDevice($device); t1[1] -> ToHostSniffers; t2[1] -> ToHostSniffers($device); ScheduleInfo(from .1, to 1); } device :: SniffGatewayDevice(eth0); arpq_in :: ARPQuerier(eth0-in) -> device; ip_to_extern :: GetIPAddress(16) -> CheckIPHeader -> EtherEncap(0x800, eth0-ex, gw-addr) -> device; ip_to_host :: EtherEncap(0x800, gw-addr, eth0-ex) -> ToHost; ip_to_intern :: GetIPAddress(16) -> CheckIPHeader -> arpq_in; arp_class :: Classifier( 12/0806 20/0001, // [0] ARP requests 12/0806 20/0002, // [1] ARP replies to host 12/0800); // [2] IP packets device -> arp_class; // ARP crap arp_class[0] -> ARPResponder(eth0-in, eth0-ex) -> device; arp_class[1] -> arp_t :: Tee; arp_t[0] -> ToHost; arp_t[1] -> [1]arpq_in; // IP packets arp_class[2] -> Strip(14) -> CheckIPHeader -> ipclass :: IPClassifier(dst host eth0-ex, dst host eth0-in, src net eth0-in); // Define pattern NAT iprw :: IPRewriterPatterns(NAT eth0-ex 50000-65535 - -); // Rewriting rules for UDP/TCP packets // output[0] rewritten to go into the wild // output[1] rewritten to come back from the wild or no match rw :: IPRewriter(pattern NAT 0 1, pass 1); // Rewriting rules for ICMP packets irw :: ICMPPingRewriter(eth0-ex, -); irw[0] -> ip_to_extern; irw[1] -> icmp_me_or_intern :: IPClassifier(dst host eth0-ex, -); icmp_me_or_intern[0] -> ip_to_host; icmp_me_or_intern[1] -> ip_to_intern; // Rewriting rules for ICMP error packets ierw :: ICMPRewriter(rw irw); ierw[0] -> icmp_me_or_intern; ierw[1] -> icmp_me_or_intern; // Packets directed at eth0-ex. // Send it through IPRewriter(pass). If there was a mapping, it will be // rewritten such that dst is eth0-in:net, otherwise dst will still be for // eth0-ex. ipclass[0] -> [1]rw; // packets that were rewritten, heading into the wild world. rw[0] -> ip_to_extern; // packets that come back from the wild or are not part of an established // connection. rw[1] -> established_class :: IPClassifier(dst host eth0-ex, dst net eth0-in); // not established yet or returning packets for a connection that was // established from this host itself. established_class[0] -> firewall :: IPClassifier(dst tcp port ssh, dst tcp port smtp, dst tcp port domain, dst udp port domain, icmp type echo-reply, proto icmp, port > 4095, -); firewall[0] -> ip_to_host; // ssh firewall[1] -> ip_to_host; // smtp firewall[2] -> ip_to_host; // domain (t) firewall[3] -> ip_to_host; // domain (u) firewall[4] -> [0]irw; // icmp reply firewall[5] -> [0]ierw; // other icmp firewall[6] -> ip_to_host; // port > 4095, probably for connection // originating from host itself firewall[7] -> Discard; // don't allow incoming for port <= 4095 // established connection established_class[1] -> ip_to_intern; // To eth0-in. Only accept from inside network. ipclass[1] -> IPClassifier(src net eth0-in) -> ip_to_host; // Packets from eth0-in:net either stay on local network or go to the wild. // Those that go into the wild need to go through the appropriate rewriting // element. (Either UDP/TCP rewriter or ICMP rewriter.) ipclass[2] -> inter_class :: IPClassifier(dst net eth0-in, -); inter_class[0] -> ip_to_intern; inter_class[1] -> ip_udp_class :: IPClassifier(tcp or udp, icmp type echo); ip_udp_class[0] -> [0]rw; ip_udp_class[1] -> [0]irw; ================================================ FILE: samples/Clojure/build.boot ================================================ ;; from: https://github.com/boot-clj/boot#configure-task-options (set-env! :source-paths #{"src"} :dependencies '[[me.raynes/conch "0.8.0"]]) (task-options! pom {:project 'my-project :version "0.1.0"} jar {:manifest {"Foo" "bar"}}) (deftask build "Build my project." [] (comp (pom) (jar) (install))) ================================================ FILE: samples/Clojure/for.clj ================================================ (defn prime? [n] (not-any? zero? (map #(rem n %) (range 2 n)))) (range 3 33 2) '(3 5 7 9 11 13 15 17 19 21 23 25 27 29 31) ;; :when continues through the collection even if some have the ;; condition evaluate to false, like filter (for [x (range 3 33 2) :when (prime? x)] x) '(3 5 7 11 13 17 19 23 29 31) ;; :while stops at the first collection element that evaluates to ;; false, like take-while (for [x (range 3 33 2) :while (prime? x)] x) '(3 5 7) ================================================ FILE: samples/Clojure/hiccup.hic ================================================ [:html [:head [:meta {:charset "utf-8"}] [:link {:rel "stylesheet" :href "css/bootstrap.min.css"}] [:script {:src "app.js"}]] [:body [:div.nav [:p "Hello world!"]]]] ================================================ FILE: samples/Clojure/index.cljs.hl ================================================ ;; Copyright (c) Alan Dipert and Micha Niskin. All rights reserved. ;; The use and distribution terms for this software are covered by the ;; Eclipse Public License 1.0 (http://opensource.org/licenses/eclipse-1.0.php) ;; which can be found in the file epl-v10.html at the root of this distribution. ;; By using this software in any fashion, you are agreeing to be bound by ;; the terms of this license. ;; You must not remove this notice, or any other, from this software. (page "index.html" (:refer-clojure :exclude [nth]) (:require [tailrecursion.hoplon.reload :refer [reload-all]] [tailrecursion.hoplon.util :refer [nth name pluralize]] [tailrecursion.hoplon.storage-atom :refer [local-storage]])) ;; utility functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (declare route state editing) (reload-all) (def mapvi (comp vec map-indexed)) (defn dissocv [v i] (let [z (- (dec (count v)) i)] (cond (neg? z) v (zero? z) (pop v) (pos? z) (into (subvec v 0 i) (subvec v (inc i)))))) (defn decorate [todo route editing i] (let [{done? :completed text :text} todo] (-> todo (assoc :editing (= editing i) :visible (and (not (empty? text)) (or (= "#/" route) (and (= "#/active" route) (not done?)) (and (= "#/completed" route) done?))))))) ;; persisted state cell (AKA: stem cell) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (def state (-> (cell []) (local-storage ::store))) ;; local state cells ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defc loaded? false) (defc editing nil) (def route (route-cell "#/")) ;; formula cells (computed state) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defc= completed (filter :completed state)) (defc= active (remove :completed state)) (defc= plural-item (pluralize "item" (count active))) (defc= todos (mapvi #(list %1 (decorate %2 route editing %1)) state)) ;; state transition functions ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (defn todo [t] {:completed false :text t}) (defn destroy! [i] (swap! state dissocv i)) (defn done! [i v] (swap! state assoc-in [i :completed] v)) (defn clear-done! [& _] (swap! state #(vec (remove :completed %)))) (defn new! [t] (when (not (empty? t)) (swap! state conj (todo t)))) (defn all-done! [v] (swap! state #(mapv (fn [x] (assoc x :completed v)) %))) (defn editing! [i v] (reset! editing (if v i nil))) (defn text! [i v] (if (empty? v) (destroy! i) (swap! state assoc-in [i :text] v))) ;; page ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (html :lang "en" (head (meta :charset "utf-8") (meta :http-equiv "X-UA-Compatible" :content "IE=edge,chrome=1") (link :rel "stylesheet" :href "base.css") (title "Hoplon • TodoMVC")) (body (noscript (div :id "noscript" (p "JavaScript is required to view this page."))) (div (section :id "todoapp" (header :id "header" (h1 "todos") (form :on-submit #(do (new! (val-id :new-todo)) (do! (by-id :new-todo) :value "")) (input :id "new-todo" :type "text" :autofocus true :placeholder "What needs to be done?" :on-blur #(do! (by-id :new-todo) :value "")))) (section :id "main" :do-toggle (cell= (not (and (empty? active) (empty? completed)))) (input :id "toggle-all" :type "checkbox" :do-attr (cell= {:checked (empty? active)}) :on-click #(all-done! (val-id :toggle-all))) (label :for "toggle-all" "Mark all as complete") (ul :id "todo-list" (loop-tpl :reverse true :bind-ids [done# edit#] :bindings [[i {edit? :editing done? :completed todo-text :text show? :visible}] todos] (li :do-class (cell= {:completed done? :editing edit?}) :do-toggle show? (div :class "view" :on-dblclick #(editing! @i true) (input :id done# :type "checkbox" :class "toggle" :do-attr (cell= {:checked done?}) :on-click #(done! @i (val-id done#))) (label (text "~{todo-text}")) (button :type "submit" :class "destroy" :on-click #(destroy! @i))) (form :on-submit #(editing! @i false) (input :id edit# :type "text" :class "edit" :do-value todo-text :do-focus edit? :on-blur #(when @edit? (editing! @i false)) :on-change #(when @edit? (text! @i (val-id edit#))))))))) (footer :id "footer" :do-toggle (cell= (not (and (empty? active) (empty? completed)))) (span :id "todo-count" (strong (text "~(count active) ")) (span (text "~{plural-item} left"))) (ul :id "filters" (li (a :href "#/" :do-class (cell= {:selected (= "#/" route)}) "All")) (li (a :href "#/active" :do-class (cell= {:selected (= "#/active" route)}) "Active")) (li (a :href "#/completed" :do-class (cell= {:selected (= "#/completed" route)}) "Completed"))) (button :type "submit" :id "clear-completed" :on-click #(clear-done!) (text "Clear completed (~(count completed))")))) (footer :id "info" (p "Double-click to edit a todo") (p "Part of " (a :href "http://github.com/tailrecursion/hoplon-demos/" "hoplon-demos")))))) ================================================ FILE: samples/Clojure/into-array.cljc ================================================ (defn into-array ([aseq] (into-array nil aseq)) ([type aseq] (let [n (count aseq) a (make-array n)] (loop [aseq (seq aseq) i 0] (if (< i n) (do (aset a i (first aseq)) (recur (next aseq) (inc i))) a))))) ================================================ FILE: samples/Clojure/protocol.cljs ================================================ (defprotocol ISound (sound [])) (deftype Cat [] ISound (sound [_] "Meow!")) (deftype Dog [] ISound (sound [_] "Woof!")) (extend-type default ISound (sound [_] "... silence ...")) (sound 1) ;; => "... silence ..." ================================================ FILE: samples/Clojure/rand.cljscm ================================================ (defn rand "Returns a random floating point number between 0 (inclusive) and n (default 1) (exclusive)." ([] (scm* [n] (random-real))) ([n] (* (rand) n))) ================================================ FILE: samples/Clojure/svg.cljx ================================================ ^:clj (ns c2.svg (:use [c2.core :only [unify]] [c2.maths :only [Pi Tau radians-per-degree sin cos mean]])) ^:cljs (ns c2.svg (:use [c2.core :only [unify]] [c2.maths :only [Pi Tau radians-per-degree sin cos mean]]) (:require [c2.dom :as dom])) ;;Stub for float fn, which does not exist on cljs runtime ^:cljs (def float identity) (defn ->xy "Convert coordinates (potentially map of `{:x :y}`) to 2-vector." [coordinates] (cond (and (vector? coordinates) (= 2 (count coordinates))) coordinates (map? coordinates) [(:x coordinates) (:y coordinates)])) ================================================ FILE: samples/Clojure/unit-test.cl2 ================================================ (deftest function-tests (is (= 3 (count [1 2 3]))) (is (= false (not true))) (is (= true (contains? {:foo 1 :bar 2} :foo))) (is (= {"foo" 1, "baz" 3} (select-keys {:foo 1 :bar 2 :baz 3} [:foo :baz]))) (is (= [1 2 3] (vals {:foo 1 :bar 2 :baz 3}))) (is (= ["foo" "bar" "baz"] (keys {:foo 1 :bar 2 :baz 3}))) (is (= [2 4 6] (filter (fn [x] (=== (rem x 2) 0)) [1 2 3 4 5 6])))) ================================================ FILE: samples/Clojure/validate-and-format.bb ================================================ #!/usr/bin/env bb (def filter-regex "\\.(clj\\|cljs\\|cljc)$") (defn clojure-source? [path] (re-find #"\.(clj|cljs|cljc)$" path)) (defn modified-files [] (-> (shell/sh "git" "diff" "--cached" "--name-only" "--diff-filter=ACMR") :out (str/split #"\n"))) (defn lint-valid? [paths] (apply shell/sh "clj-kondo" "--lint" paths)) (defn native-cljstyle? [] (-> (shell/sh "which" "cljstyle") :exit zero?)) (defn format-files [paths] (if (native-cljstyle?) (do (println "Using native cljstyle...") (apply shell/sh "cljstyle" "fix" paths)) (do (println "Using cljstyle from clojure deps...") (apply shell/sh "clojure" "-A:format" "fix" paths)))) (defn update-file-index "Add unstaged modifications to git, so they get to be part of the current commit." [path] (let [hash (:out (shell/sh "git" "hash-object" "-w" path))] (shell/sh "git" "update-index" "--add" "--cacheinfo" "100644" hash path))) (let [paths (->> (modified-files) (filter clojure-source?))] (when (seq paths) (format-files paths) (doseq [path paths] (update-file-index path)) (let [{:keys [exit out]} (lint-valid? paths)] (when-not (= 0 exit) (println "Lint failed.\n" out) (System/exit 1))))) ================================================ FILE: samples/Closure Templates/example.soy ================================================ {namespace Exmaple} /** * Example */ {template .foo} {@param count: string} {@param? name: int} {if isNonnull($name)}

    {$name}

    {/if}
    {switch count} {case 0} {call Empty.view} {param count: $count /} {/call} {default}

    Wow, so many!

    {/switch}
    {/template} ================================================ FILE: samples/Cloud Firestore Security Rules/filenames/firestore.rules ================================================ service cloud.firestore { match /databases/{database}/documents { match /activities/{activity} { allow create: if isSignedIn() && isOwner(incomingData().authorId) && isValidActivity(incomingData()) && hasAllowedActivityFieldsForCreate(incomingData()); allow read, delete: if isSignedIn() && isOwner(existingData().authorId); allow update: if isSignedIn() && isOwner(existingData().authorId) && isValidActivity(incomingData()) && hasAllowedActivityFieldsForUpdate(incomingData()); } match /skills/{skill} { allow create: if isSignedIn() && isOwner(incomingData().authorId) && isValidSkill(incomingData()) && hasAllowedSkillFieldsForCreate(incomingData()); allow read, delete: if isSignedIn() && isOwner(existingData().authorId); allow update: if isSignedIn() && isOwner(existingData().authorId) && isValidSkill(incomingData()) && hasAllowedSkillFieldsForUpdate(incomingData()); } match /activities-skills/{activitySkill} { allow create: if isSignedIn() && isOwner(incomingData().authorId) && isValidActivitySkill(incomingData()) && hasAllowedActivitySkillFieldsForCreate(incomingData()); allow read, delete: if isSignedIn() && isOwner(existingData().authorId); allow update: if isSignedIn() && isOwner(existingData().authorId) && isValidActivitySkill(incomingData()) && hasAllowedActivitySkillFieldsForUpdate(incomingData()); } /// Functions /// function isSignedIn() { return request.auth != null; } function isOwner(userId) { return request.auth.uid == userId; } function existingData() { return resource.data; } function incomingData() { return request.resource.data; } function isValidActivity(activity) { return activity.title is string && activity.title.size() > 3 && activity.title.size() < 250 && activity.summary is string && (activity.audienceCountMin is int || activity.audienceCountMin == null) && (activity.audienceCountMax is int || activity.audienceCountMax == null) && (activity.audienceAgeMin is int || activity.audienceAgeMin == null) && (activity.audienceAgeMax is int || activity.audienceAgeMax == null) && activity.lastUpdateDate.date() is timestamp; } function hasAllowedActivityFieldsForUpdate(activity) { return activity.keys().size() == 9 && activity.keys().hasAll(['authorId', 'title', 'summary', 'audienceCountMin', 'audienceCountMax', 'audienceAgeMin', 'audienceAgeMax', 'lastUpdateDate']); } function hasAllowedActivityFieldsForCreate(activity) { return activity.keys().size() == 8 && activity.keys().hasAll(['authorId', 'title', 'summary', 'audienceCountMin', 'audienceCountMax', 'audienceAgeMin', 'audienceAgeMax', 'lastUpdateDate']); } function isValidSkill(skill) { return skill.title is string && skill.title.size() > 3 && skill.title.size() < 250 && skill.summary is string && skill.lastUpdateDate.date() is timestamp; } function hasAllowedSkillFieldsForUpdate(skill) { return skill.keys().size() == 5 && skill.keys().hasAll(['authorId', 'title', 'summary', 'lastUpdateDate']); } function hasAllowedSkillFieldsForCreate(skill) { return skill.keys().size() == 4 && skill.keys().hasAll(['authorId', 'title', 'summary', 'lastUpdateDate']); } function isValidActivitySkill(activitySkill) { return activitySkill.skillId is string && activitySkill.activityId is string; } function hasAllowedActivitySkillFieldsForUpdate(activitySkill) { return activitySkill.keys().size() == 4 && activitySkill.keys().hasAll(['authorId', 'skillId', 'activityId']); } function hasAllowedActivitySkillFieldsForCreate(activitySkill) { return activitySkill.keys().size() == 3 && activitySkill.keys().hasAll(['authorId', 'skillId', 'activityId']); } } } ================================================ FILE: samples/Clue/game.clue ================================================ static score, mistakes = 0, 1 static hackamount, hacked = 0.5 local terminal = import("terminal") local names = {} local i = 1 for name with love.filesystem.lines("assets/names.txt") { names[i] = name i += 1 } local commands local seed2 = love.math.random(10, 10000) local fn EntryCode(seed) { local rng = love.math.newRandomGenerator((seed2 + math.floor(leveltime / 30)) * 10 + seed) local code = "" for _ = 1, 20 { code ..= string.char(rng::random(33, 122)) } return code } local fn GenerateIP(hacker) { return math.ceil(math.abs(love.math.randomNormal(75, 128)) % (hacker ? 256 : 1000)) } local user = { new = fn(self) { local hacker = love.math.random() > 0.8 self.ip1 = GenerateIP(hacker) self.ip2 = GenerateIP(hacker) self.ip3 = GenerateIP(hacker) self.ip4 = GenerateIP(hacker) self.glitch = self.ip1 > 255 || self.ip2 > 255 || self.ip3 > 255 || self.ip4 > 255 self.name = names[love.math.random(6000)] self.age = math.floor((hacker || self.glitch) ? love.math.random(14, 79) : love.math.random(9, 145)) self.code = hacker ? love.math.random(-20, -1) : love.math.random(0, 9) self.time = leveltime self.hacker = hacker } next = fn(self) { commands.score.code() terminal::write("Reading next user's information...", 15) self::new() commands.user.code(4) } } user::new() local fn AwardScore(amount) { if amount < 0 { amount = math.ceil($ * mistakes) terminal::write(string.format("(%d points)", amount), 60, 1, 0, 0) mistakes += 0.5 } else { terminal::write(string.format("(+%d points)", amount), 60, 1, 1, 0) } score += amount } commands = { score = { desc = "Display current score." code = fn { terminal::write("Score: " .. score, nil, 1, 0, 1) local mistakes = (mistakes - 1) * 2 if mistakes == 0 { terminal::write("You never messed up so far.", nil, 1, 0, 1) } else { terminal::write("You messed up " .. mistakes .. " times.", nil, 1, 0, 1) } } } user = { desc = "Display the info of the user trying to connect." code = fn(s = 0) { terminal::write("Name: " .. user.name, 60, 1, 1, 0) terminal::write("Age: " .. user.age, 60, 1, 1, 0) terminal::write(string.format("IP: %d.%d.%d.%d", user.ip1, user.ip2, user.ip3, user.ip4), 60, 1, 1, 0) terminal::write(string.format( "Entry Code: %s (changes in %d seconds)", EntryCode(user.code), math.max(29 - math.floor(leveltime % 30) - s, 0) ), 60, 1, 1, 0) } } codes = { desc = "Display the 10 currently valid codes." code = fn { terminal::write("Currently valid codes:") for i = 0, 9 { terminal::write(EntryCode(i), 60, 1, 1, 0) } terminal::write(string.format( "The codes will change in %d seconds.", 29 - math.floor(leveltime % 30) )) } } allow = { desc = "Allow the current user." code = fn { terminal::write(user.name .. " was allowed connection...", 10) if user.hacker { terminal::write("But they were an hacker!", 60, 1, 0, 0) hacked = leveltime + 0.5 mistakes += 0.5 errors = 2 user::new() return } elseif user.glitch { terminal::write("But they were a glitch!", 60, 1, 0, 0) AwardScore(math.min(score / -2.5, -500)) errors = 1 } elseif user.age < 14 { terminal::write("But they were too young to join.", 60, 1, 0, 0) AwardScore(-300) } elseif user.age >= 80 { terminal::write("But they were a troll.", 60, 1, 0, 0) AwardScore(-200) } else { terminal::write("And that was the correct choice!", 60, 1, 1, 0) AwardScore(math.max(500 + math.floor((user.time - leveltime) * 20), 10)) } user::next() } } deny = { desc = "Deny the current user." code = fn { terminal::write(user.name .. " was denied connection...", 10) if !user.hacker && !user.glitch && user.age >= 14 && user.age < 80 { terminal::write("But they had no bad intentions.", 60, 1, 0, 0) AwardScore(-500) } else { terminal::write("And that was the correct choice!", 60, 1, 1, 0) AwardScore(math.max(300 + math.floor((user.time - leveltime) * 20), 10)) } user::next() } } } return commands ================================================ FILE: samples/Clue/graph.clue ================================================ io.stdout::setvbuf("no"); import("line"); method love.draw() { love.graphics.print(formula, 0, 0, 0, 2); love.graphics.translate(150, 450); love.graphics.setColor(0.3, 0.3, 0.3); for x = -150, 650, 10 { if x == 0 {continue} love.graphics.line(x, 150, x, -450); } for y = -450, 150, 10 { if y == 0 {continue} love.graphics.line(-150, y, 650, y); } love.graphics.setColor(1, 1, 1); love.graphics.line(0, 150, 0, -450); love.graphics.line(-150, 0, 650, 0); if dots { love.graphics.line(dots); } else { love.graphics.origin() love.graphics.setColor(1, 0, 0); love.graphics.printf(errormsg, 0, 300, 400, "center", 0, 2); } } ================================================ FILE: samples/Clue/line.clue ================================================ static dots, formula, errormsg; dots = {0, 0, 0, 0}; formula = "y="; errormsg = ""; local utf8 = require("utf8"); local env = {x = 0, y = 0}; for k, v of math { env[k] = v; } method love.textinput(key) { formula ..= key; dots = {}; try { local formula, errormsg = loadstring(formula); if !formula {error(errormsg);} setfenv(formula, env); for x = -150, 650 { env.x = x; formula(); table.insert(dots, env.x || 0); table.insert(dots, -(env.y || 0)); } } catch error { dots = nil; errormsg = error; } } method love.keypressed(key) { if key == "backspace" && utf8.len(formula) > 0 { formula = ($)::sub(1, utf8.len($)-1); } } ================================================ FILE: samples/Clue/main.clue ================================================ static font = love.graphics.newFont("assets/clacon2.ttf", 24, "mono") static fontheight = 23 //force it to 23 cause windows and linux use different sizes... static screenheight = love.graphics.getHeight() - 10 static leveltime = 0 io.stdout::setvbuf("no") local utf8 = require("utf8") local terminal = import("terminal") import("player") local screen = love.graphics.newCanvas() local hum = love.audio.newSource("assets/hum.ogg", "stream") local win = love.audio.newSource("assets/win.ogg", "static") local wrong = love.audio.newSource("assets/wrong.ogg", "static") love.graphics.setFont(font) love.keyboard.setKeyRepeat(true) love.graphics.setShader(love.graphics.newShader("assets/shader.glsl")) local start_command = commands.start method love.load() { terminal::write("╔═╗ ╔═════╗ ╔═════╗ ╔═╗ ╔═════╗ ╔═════╗ ╔═════╗ ╔═════╗", 400) terminal::write("║ ║ ║ ╔═╗ ║ ║ ╔═╗ ║ ║ ║ ║ ╔═══╝ ║ ╔═╗ ║ ║ ╔═══╝ ║ ╔═══╝", 400) terminal::write("║ ║ ║ ╚═╝ ║ ║ ╚═╝ ║ ║ ║ ║ ╚═══╗ ║ ╚═╝ ║ ║ ╚═══╗ ║ ╚═══╗", 400) terminal::write("║ ║ ║ ╔═══╝ ║ ╔═══╝ ║ ║ ║ ╔═══╝ ║ ╔═╗ ║ ╚═══╗ ║ ║ ╔═══╝", 400) terminal::write("║ ║ ║ ║ ║ ║ ║ ╚═══╗ ║ ╚═══╗ ║ ║ ║ ║ ╔═══╝ ║ ║ ╚═══╗", 400) terminal::write("╚═╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═════╝", 400) terminal::write("A game for the LÖVE Jam 2023 - Created by Maiori") terminal::write("(Type 'guide' for instructions)") hum::setLooping(true) hum::setVolume(0.10) hum::play() } method love.update(dt) { leveltime += dt local unfinished = terminal.unfinished[pointer] if unfinished { unfinished.progress += dt * unfinished.speed * 2 if unfinished.progress >= #unfinished.text { unfinished.progress = nil table.remove(terminal.unfinished, 1) love.wheelmoved(0, -fontheight) match unfinished.text::sub(-7) { //this is a hacky way to do this... "glitch!" => { terminal::corrupt() } "choice!" => { win::play() } "o join." || " troll." || "ntions." => { wrong::play() } } } } elseif hacked && leveltime > hacked { terminal::corrupt() hacked = leveltime + hackamount hackamount /= 1.22 if hackamount < 0.00000000000001 { hacked = nil hackamount = 0.5 commands.clear.code() setmetatable(commands, {}) commands.restart = start_command terminal::write("GAME OVER", 1, 1, 0, 0) terminal::write("Your server was destroyed...will you try again?", 15, 1, 0, 0) terminal::write("Final Score: " .. score, nil, 1, 0, 0) terminal::write("You messed up " .. ((mistakes - 1) * 2) .. " times.", nil, 1, 0, 0) terminal::write("(Type 'restart' to try again)", nil, 1, 0, 0) score = 0 mistakes = 1 } } } global fn UpdateCanvas() { love.graphics.clear() local y = terminal::draw() if terminal::finished() && !hacked { love.graphics.setColor(0.125490196, 0.760784314, 0.054901961) local text = "$ " .. terminal.input[1] love.graphics.print(text, 5, y) if math.floor(leveltime) % 2 == 0 { love.graphics.print("_", 5 + font::getWidth(text), y) } } } method love.draw() { screen::renderTo(UpdateCanvas) love.graphics.setColor(1, 1, 1) love.graphics.draw(screen) } method love.resize(_, height) { screenheight = height - 10 screen = love.graphics.newCanvas() love.wheelmoved(0, 0) } ================================================ FILE: samples/Clue/msgpack.clue ================================================ /* MessagePack encoder / decoder written in Clue Originally written in Lua by Sebastian Steinhauer Forked and ported to Clue by Felice D'Angelo This is free and unencumbered software released into the public domain. Anyone is free to copy, modify, publish, use, compile, sell, or distribute this software, either in source code form or as a compiled binary, for any purpose, commercial or non-commercial, and by any means. In jurisdictions that recognize copyright laws, the author or authors of this software dedicate any and all copyright interest in the software to the public domain. We make this dedication for the benefit of the public at large and to the detriment of our heirs and successors. We intend this dedication to be an overt act of relinquishment in perpetuity of all present and future rights to this software under copyright law. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. For more information, please refer to */ @iflua jit { local fn pack(...) { return love.data.pack("string", ...) } local fn unpack(...) { return love.data.unpack(...) } local fn mtype(x) { if type(x) != "number" { return } elseif x == math.floor(x) { return "integer" } else { return "float" } } local utf8len = require("utf8").len local tconcat, tunpack = table.concat, _G.unpack local ssub = string.sub local type, pcall, pairs, select = type, pcall, pairs, select } @else { @if all(not(lua(5.4)), not(lua(5.3))) { @print "Warning: Lua version not specified, defaulting to Lua5.4" } local {pack, unpack} = string local mtype, utf8len = math.type, utf8.len local tconcat, tunpack = table.concat, table.unpack local ssub = string.sub local type, pcall, pairs, select = type, pcall, pairs, select } //ENCODER local encode_value //forward declaration local fn is_an_array(value) { local expected = 1 for k of value { if k != expected { return false } expected += 1 } return true } local encoder_functions = { ["nil"] = fn { return pack("B", 0xc0) }, ["boolean"] = fn(value) { if value { return pack("B", 0xc3) } else { return pack("B", 0xc2) } }, ["number"] = fn(value) { if mtype(value) == "integer" { if value >= 0 { if value < 128 { return pack("B", value) } elseif value <= 0xff { return pack("BB", 0xcc, value) } elseif value <= 0xffff { return pack(">BI2", 0xcd, value) } elseif value <= 0xffffffff { return pack(">BI4", 0xce, value) } else { return pack(">BI8", 0xcf, value) } } else { if value >= -32 { return pack("B", 0xe0 + (value + 32)) } elseif value >= -128 { return pack("Bb", 0xd0, value) } elseif value >= -32768 { return pack(">Bi2", 0xd1, value) } elseif value >= -2147483648 { return pack(">Bi4", 0xd2, value) } else { return pack(">Bi8", 0xd3, value) } } } else { local test = unpack("f", pack("f", value)) if test == value { //check if we can use float return pack(">Bf", 0xca, value) } else { return pack(">Bd", 0xcb, value) } } }, ["string"] = fn(value) { local len = #value if utf8len(value) { //check if it is a real utf8 string or just byte junk if len < 32 { return pack("B", 0xa0 + len) .. value } elseif len < 256 { return pack(">Bs1", 0xd9, value) } elseif len < 65536 { return pack(">Bs2", 0xda, value) } else { return pack(">Bs4", 0xdb, value) } } else { //encode it as byte-junk :) if len < 256 { return pack(">Bs1", 0xc4, value) } elseif len < 65536 { return pack(">Bs2", 0xc5, value) } else { return pack(">Bs4", 0xc6, value) } } }, ["table"] = fn(value) { if is_an_array(value) { //it seems to be a proper Lua array local elements = {} for i, v of value { elements[i] = encode_value(v) } local length = #elements if length < 16 { return pack(">B", 0x90 + length) .. tconcat(elements) } elseif length < 65536 { return pack(">BI2", 0xdc, length) .. tconcat(elements) } else { return pack(">BI4", 0xdd, length) .. tconcat(elements) } } else { //encode as a map local elements = {} for k, v of value { if type(v) != "function" { elements[#elements + 1] = encode_value(k) elements[#elements + 1] = encode_value(v) } } local length = #elements /_ 2 if length < 16 { return pack(">B", 0x80 + length) .. tconcat(elements) } elseif length < 65536 { return pack(">BI2", 0xde, length) .. tconcat(elements) } else { return pack(">BI4", 0xdf, length) .. tconcat(elements) } } }, ["function"] = fn { return pack("B", 0xc0) } } encode_value = fn(value) { return encoder_functions[type(value)](value) } local fn encode(...) { local data = {} for i = 1, select("#", ...) { data[#data + 1] = encode_value(select(i, ...)) } return tconcat(data) } //DECODER local decode_value //forward declaration local fn decode_array(data, position, length) { local elements, value = {} for i = 1, length { value, position = decode_value(data, position) elements[i] = value } return elements, position } local fn decode_map(data, position, length) { local elements, key, value = {} for i = 1, length { key, position = decode_value(data, position) value, position = decode_value(data, position) elements[key] = value } return elements, position } local decoder_functions = { [0xc0] = fn(data, position) { return nil, position }, [0xc2] = fn(data, position) { return false, position }, [0xc3] = fn(data, position) { return true, position }, [0xc4] = fn(data, position) { return unpack(">s1", data, position) }, [0xc5] = fn(data, position) { return unpack(">s2", data, position) }, [0xc6] = fn(data, position) { return unpack(">s4", data, position) }, [0xca] = fn(data, position) { return unpack(">f", data, position) }, [0xcb] = fn(data, position) { return unpack(">d", data, position) }, [0xcc] = fn(data, position) { return unpack(">B", data, position) }, [0xcd] = fn(data, position) { return unpack(">I2", data, position) }, [0xce] = fn(data, position) { return unpack(">I4", data, position) }, [0xcf] = fn(data, position) { return unpack(">I8", data, position) }, [0xd0] = fn(data, position) { return unpack(">b", data, position) }, [0xd1] = fn(data, position) { return unpack(">i2", data, position) }, [0xd2] = fn(data, position) { return unpack(">i4", data, position) }, [0xd3] = fn(data, position) { return unpack(">i8", data, position) }, [0xd9] = fn(data, position) { return unpack(">s1", data, position) }, [0xda] = fn(data, position) { return unpack(">s2", data, position) }, [0xdb] = fn(data, position) { return unpack(">s4", data, position) }, [0xdc] = fn(data, position) { local length length, position = unpack(">I2", data, position) return decode_array(data, position, length) }, [0xdd] = fn(data, position) { local length length, position = unpack(">I4", data, position) return decode_array(data, position, length) }, [0xde] = fn(data, position) { local length length, position = unpack(">I2", data, position) return decode_map(data, position, length) }, [0xdf] = fn(data, position) { local length length, position = unpack(">I4", data, position) return decode_map(data, position, length) }, } //add fix-array, fix-map, fix-string, fix-int stuff for i = 0x00, 0x7f { decoder_functions[i] = fn(data, position) { return i, position } } for i = 0x80, 0x8f { decoder_functions[i] = fn(data, position) { return decode_map(data, position, i - 0x80) } } for i = 0x90, 0x9f { decoder_functions[i] = fn(data, position) { return decode_array(data, position, i - 0x90) } } for i = 0xa0, 0xbf { decoder_functions[i] = fn(data, position) { local length = i - 0xa0 return ssub(data, position, position + length - 1), position + length } } for i = 0xe0, 0xff { decoder_functions[i] = fn(data, position) { return -32 + (i - 0xe0), position } } decode_value = fn(data, position) { local byte, value byte, position = unpack("B", data, position) value, position = decoder_functions[byte](data, position) return value, position } //INTERFACE return { _AUTHOR = "Felice D'Angelo ", _VERSION = "0.2.1", //primary encode function encode = fn(...) { local data, ok = {} for i = 1, select("#", ...) { ok, data[i] = pcall(encode_value, select(i, ...)) if !ok { return nil, "cannot encode MessagePack" } } return tconcat(data) }, //encode just one value encode_one = fn(value) { local ok, data = pcall(encode_value, value) if ok { return data } else { return nil, "cannot encode MessagePack" } }, //primary decode function decode = fn(data, position) { local values, value, ok = {} position ||= 1 while position <= #data { ok, value, position = pcall(decode_value, data, position) if ok { values[#values + 1] = value } else { return nil, "cannot decode MessagePack" } } return tunpack(values) }, //decode just one value decode_one = fn(data, position) { local value, ok ok, value, position = pcall(decode_value, data, position || 1) if ok { return value, position } else { return nil, "cannot decode MessagePack" } }, } ================================================ FILE: samples/Clue/player.clue ================================================ static commands static offset = 0 static pointer = 1 local utf8 = require("utf8") local terminal = import("terminal") local exiting = false local beep = love.audio.newSource("assets/beep.ogg", "static") local key_press = love.audio.newSource("assets/key.ogg", "static") commands = { exit = { desc = "Quit the game." code = fn { if exiting { love.event.quit() } else { exiting = true terminal::write("Are you sure?", nil, 1, 0, 0) terminal::write("(Type 'exit' again to confirm)") } } } help = { desc = "Display this message." code = fn { terminal::write("List of currently available commands:") for k, v of commands { terminal::write(string.format("%s - %s", k::upper(), v.desc)) } local game_commands = getmetatable(commands)?.__index if game_commands { for k, v of game_commands { terminal::write(string.format("%s - %s", k::upper(), v.desc)) } } } } fps = { desc = "Display the game's FPS." code = fn { local fps = love.timer.getFPS() terminal::write("FPS: " .. tostring(fps), 30, (1 - fps / 60) * 2, fps / 60, 0) } } memory = { desc = "Display the amount of memory in use." code = fn { terminal::write(string.format("Used memory: %dkb", collectgarbage("count"))) } } clear = { desc = "Clears the terminal." code = fn { for k, _ in terminal { terminal[k] = nil } love.wheelmoved(0, 0) collectgarbage("collect") } } guide = { desc = "Explains how to play the game." code = fn { terminal::write("Welcome to IP Please!") terminal::write("You are the admin of a private server.") terminal::write("Many people want to join, your job is to let them in.") terminal::write("(Type 'allow' to let a user in)") terminal::write("Hackers may try to infiltrate, do not let them in.") terminal::write("(Type 'deny' to not let a user in)") terminal::write("Hackers will use older entry codes that are no longer valid.") terminal::write("Valid codes change every 30 seconds.") terminal::write("(Type 'codes' to get a list of currently valid codes.)") terminal::write("Trolls will try to join with high ages (80+), deny them.") terminal::write("Also, deny anyone younger than 14.") terminal::write("Lastly, the server may glitch, you have to prevent that.") terminal::write("To do that, deny any user with a number above 255 in their IP.") terminal::write("Allowing and denying users correctly will grant you points.") terminal::write("(The faster you are the more points you get)") terminal::write("Messing up may lead to the end of the server.") terminal::write("Good luck, and thanks for playing!", 60, 1, 1, 0) terminal::write("(Type 'start' to begin)") } } start = { desc = "Starts the game." code = fn { beep::play() leveltime = 0 terminal::write("Starting server...", 5) terminal::write("Done!") terminal::write("Reading first user's information...", 15) commands.start = nil commands.restart = nil setmetatable(commands, { __index = import("game") }) commands.user.code(3) } } } method love.keypressed(key, _, isrepeat) { if hacked { return } if !isrepeat { key_press::seek(0) key_press::play() } love.wheelmoved(0, -math.huge) if terminal::finished() { local input = terminal.input[1]::gsub("%s+", "") match key { "up" if pointer < #terminal.input => { pointer += 1 terminal.input[1] = terminal.input[pointer] } "down" if pointer > 1 => { pointer -= 1 terminal.input[1] = terminal.input[pointer] } "backspace" => { local byteoffset = utf8.offset(input, -1) if byteoffset { terminal.input[1] = $::sub(1, byteoffset - 1) } } "return" => { pointer = 1 if input == "" { terminal.input[1] = "" return } local command = commands[input::lower()]?.code if command { command() } else { terminal::write(input .. ": command not found", nil, 1, 0, 0) } if input != "exit" { exiting = false } table.insert(terminal.input, 1, "") } } } } method love.textinput(t) { terminal.input[1] ..= t love.wheelmoved(0, -math.huge) } method love.wheelmoved(_, y) { if hackamount < 0.5 { return } local terminal_size = -(((#terminal - #terminal.unfinished) + 1) * fontheight - screenheight) offset = math.min(math.max($ + y * fontheight, math.min(terminal_size, 0)), 0) } ================================================ FILE: samples/Clue/terminal.clue ================================================ static errors = 0 local utf8 = require("utf8") local error = love.audio.newSource("assets/error.ogg", "static") return { input = {""} unfinished = {} write = fn(self, text, speed = 120, r = 0.125490196, g = 0.760784314, b = 0.054901961) { local text = { progress = 0 speed = $ text = $ r = $ g = $ b = $ } table.insert(self, text) table.insert(self.unfinished, text) } corrupt = fn(self) { if !error::isPlaying() && errors > 0 { error::play() errors -= 1 } local y = 5 + offset - fontheight for _, line in self { y += fontheight if y < -fontheight || y > screenheight + fontheight { continue } local len = utf8.len(line.text) local i = love.math.random(len) local corrupted = "" for p, c with utf8.codes(line.text) { corrupted ..= p == i || p == love.math.random(len) ? (hackamount > 0.00005 ? string.char(love.math.random(33, 122)) : " ") : utf8.char(c) } line.text = corrupted line.r = love.math.random() line.g = love.math.random() line.b = love.math.random() } } finished = fn(self) { return #self.unfinished == 0 } draw = fn(self) { local y = 5 + offset - fontheight for i, line in self { y += fontheight if y < -fontheight || y > screenheight + fontheight { continue } local {progress, text, r, g, b} = line love.graphics.setColor(r, g, b) if !progress { love.graphics.print(text, 5, y) } elseif progress > 0 { local toprint = "" local progress = math.ceil(progress) for p, c with utf8.codes(text) { toprint ..= utf8.char(c) if p >= progress { break } } love.graphics.print(toprint .. "▇", 5, y) } } return y + fontheight } } ================================================ FILE: samples/CoNLL-U/CF1.conllu ================================================ # text = PT no governo # source = CETENFolha n=1 cad=Opinião sec=opi sem=94a # sent_id = CF1-1 # id = 1 1 PT PT PROPN PROP|M|S|@NPHR Gender=Masc|Number=Sing 0 root _ _ 2-3 no _ _ _ _ _ _ _ _ 2 em em ADP |PRP|@N< _ 4 case _ _ 3 o o DET <-sam>||ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 4 det _ _ 4 governo governo NOUN |N|M|S|@P< Gender=Masc|Number=Sing 1 nmod _ _ # text = BRASÍLIA Pesquisa Datafolha publicada hoje revela um dado supreendente: recusando uma postura radical, a esmagadora maioria (77%) dos eleitores quer o PT participando do Governo Fernando Henrique Cardoso. # source = CETENFolha n=1 cad=Opinião sec=opi sem=94a &W # sent_id = CF1-3 # id = 2 1 BRASÍLIA Brasília PROPN PROP|F|S|@ADVL> Gender=Fem|Number=Sing 6 dep _ _ 2 Pesquisa Pesquisa PROPN _ Gender=Fem|Number=Sing 6 nsubj _ ChangedBy=Issue119|MWE=Pesquisa_Datafolha|MWEPOS=PROPN 3 Datafolha Datafolha PROPN _ Number=Sing 2 flat:name _ ChangedBy=Issue119 4 publicada publicar VERB |V|PCP|F|S|@ICL-N< Gender=Fem|Number=Sing|VerbForm=Part 2 acl _ _ 5 hoje hoje ADV ADV|@|V|PR|3S|IND|@FS-STA Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 0 root _ _ 7 um um DET |ART|M|S|@>N Definite=Ind|Gender=Masc|Number=Sing|PronType=Art 8 det _ _ 8 dado dado NOUN |N|M|S|@|V|GER|@ICL-ADVL> VerbForm=Ger 26 advcl _ _ 12 uma um DET |ART|F|S|@>N Definite=Ind|Gender=Fem|Number=Sing|PronType=Art 13 det _ _ 13 postura postura NOUN |N|F|S|@|ART|F|S|@>N Definite=Def|Gender=Fem|Number=Sing|PronType=Art 18 det _ _ 17 esmagadora esmagador ADJ ADJ|F|S|@>N Gender=Fem|Number=Sing 18 amod _ _ 18 maioria maioria NOUN |N|F|S|@SUBJ> Gender=Fem|Number=Sing 26 nsubj _ _ 19 ( ( PUNCT PU|@PU _ 21 punct _ ChangedBy=Issue165|SpaceAfter=No 20 77 77 NUM |NUM|M|P|@>N NumType=Card 21 nummod _ ChangedBy=Issue165|ChangedBy=Issue168|SpaceAfter=No 21 % % SYM |N|M|P|@N|PRP|@N< _ 25 case _ _ 24 os o DET <-sam>||ART|M|P|@>N Definite=Def|Gender=Masc|Number=Plur|PronType=Art 25 det _ _ 25 eleitores eleitor NOUN |N|M|P|@P< Gender=Masc|Number=Plur 18 nmod _ _ 26 quer querer VERB |V|PR|3S|IND|@FS-N|ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 28 det _ _ 28 PT PT PROPN PROP|M|S|@|V|GER|@ICL-|PRP|@||ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 32 det _ _ 32 Governo governo NOUN ||N|M|S|@P< Gender=Masc|Number=Sing 29 obl _ _ 33 Fernando Fernando PROPN _ Gender=Masc|Number=Sing 32 nmod _ ChangedBy=Issue119|MWE=Fernando_Henrique_Cardoso|MWEPOS=PROPN 34 Henrique Henrique PROPN _ Number=Sing 33 flat:name _ ChangedBy=Issue119 35 Cardoso Cardoso PROPN _ Number=Sing 33 flat:name _ SpaceAfter=No 36 . . PUNCT PU|@PU _ 6 punct _ _ # text = Tem sentido -- aliás, muitíssimo sentido. # source = CETENFolha n=1 cad=Opinião sec=opi sem=94a &D # sent_id = CF1-4 # id = 3 1 Tem ter VERB |V|PR|3S|IND|@FS-STA Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 0 root _ _ 2 sentido sentido NOUN |N|M|S|@|ADV|@||DET|M|S|@>N Gender=Masc|Number=Sing|PronType=Ind 7 det _ _ 7 sentido sentido NOUN |N|M|S|@N|ADV|@>A _ 2 advmod _ _ 2 mais mais ADV |||ADV|@ADVL> _ 22 advmod _ _ 3-4 do _ _ _ _ _ _ _ _ 3 de de ADP |PRP|@COM _ 8 case _ _ 4 o o PRON |<-sam>|DET|M|S|@P< Gender=Masc|Number=Sing|PronType=Dem 3 fixed _ _ 5 que que PRON |INDP|M|S|@N< Gender=Masc|Number=Sing|PronType=Rel 3 fixed _ _ 6-7 nos _ _ _ _ _ _ _ _ 6 em em ADP ||PRP|@KOMP< _ 8 case _ _ 7 os o DET <-sam>||ART|M|P|@>N Definite=Def|Gender=Masc|Number=Plur|PronType=Art 8 det _ _ 8 tempos tempo NOUN ||N|M|P|@P< Gender=Masc|Number=Plur 2 obl _ _ 9-10 na _ _ _ _ _ _ _ _ 9 em em ADP |PRP|@N< _ 11 case _ _ 10 a o DET <-sam>||ART|F|S|@>N Definite=Def|Gender=Fem|Number=Sing|PronType=Art 11 det _ _ 11 ditadura ditadura NOUN |N|F|S|@P< Gender=Fem|Number=Sing 8 nmod _ ChangedBy=Issue165|SpaceAfter=No 12 , , PUNCT PU|@PU _ 2 punct _ _ 13 a o DET |ART|F|S|@>N Definite=Def|Gender=Fem|Number=Sing|PronType=Art 14 det _ _ 14 solidez solidez NOUN |N|F|S|@SUBJ> Gender=Fem|Number=Sing 22 nsubj _ _ 15-16 do _ _ _ _ _ _ _ _ 15 de de ADP |PRP|@N< _ 17 case _ _ 16 o o DET <-sam>||ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 17 det _ _ 17 PT PT PROPN PROP|M|S|@P< Gender=Masc|Number=Sing 14 nmod _ _ 18 está estar AUX |V|PR|3S|IND|@FS-STA Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 22 cop _ ChangedBy=Issue165|ChangedBy=Issue167|SpaceAfter=No 19 , , PUNCT PU|@PU _ 20 punct _ _ 20 agora agora ADV |ADV|@|V|PCP|F|S|@ICL-|KC|@CO _ 2 cc _ _ 2 Lula Lula PROPN |PROP|M|S|@SUBJ> Gender=Masc|Number=Sing 7 nsubj _ _ 3 nem nem CCONJ ||KC|@CO _ 5 cc _ _ 4 o o DET |ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 5 det _ _ 5 partido partido NOUN ||N|M|S|@SUBJ> Gender=Masc|Number=Sing 2 conj _ _ 6 ainda ainda ADV ADV|@ADVL> _ 7 advmod _ _ 7 encontraram encontrar VERB |V|PS/MQP|3P|IND|@FS-STA Mood=Ind|Number=Plur|Person=3|VerbForm=Fin 0 root _ _ 8 um um DET _ Definite=Ind|Gender=Masc|Number=Sing|PronType=Art 9 det _ _ 9 discurso discurso NOUN |N|M|S|@-PASS Case=Acc|Gender=Masc|Number=Sing|Person=3|PronType=Prs 12 expl _ ChangedBy=Issue135 12 diferenciar diferenciar VERB _ VerbForm=Inf 9 acl _ ChangedBy=Issue165|SpaceAfter=No 13 . . PUNCT PU|@PU _ 7 punct _ _ # text = Eles se dizem oposição, mas ainda não informaram o que vão combater. # source = CETENFolha n=1 cad=Opinião sec=opi sem=94a # sent_id = CF1-7 # id = 6 1 Eles eles PRON PERS|M|3P|NOM|@SUBJ> Case=Nom|Gender=Masc|Number=Plur|Person=3|PronType=Prs 3 nsubj _ _ 2 se se PRON PERS|M|3P|ACC|@ACC>-PASS Case=Acc|Gender=Masc|Number=Plur|Person=3|PronType=Prs 3 expl _ ChangedBy=Issue135 3 dizem dizer VERB |||V|PR|3P|IND|@FS-STA Mood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin 0 root _ _ 4 oposição oposição NOUN |N|F|S|@|KC|@CO _ 9 cc _ _ 7 ainda ainda ADV ADV|@>A _ 8 advmod _ _ 8 não não ADV _ Polarity=Neg 9 advmod _ _ 9 informaram informar VERB ||V|PS/MQP|3P|IND|@FS-STA Mood=Ind|Number=Plur|Person=3|VerbForm=Fin 3 conj _ _ 10 o o PRON _ Gender=Masc|Number=Sing|PronType=Dem 11 det _ _ 11 que que PRON |INDP|M|S|@ACC> Gender=Masc|Number=Sing|PronType=Int 13 obj _ _ 12 vão ir AUX |V|PR|3P|IND|@FS-|V|INF|@ICL-AUX< VerbForm=Inf 9 ccomp _ ChangedBy=Issue165|SpaceAfter=No 14 . . PUNCT PU|@PU _ 3 punct _ _ # text = Muitas das prioridades do novo governo coincidem com as prioridades do PT. # source = CETENFolha n=1 cad=Opinião sec=opi sem=94a # sent_id = CF1-8 # id = 7 1 Muitas muito PRON |DET|F|P|@SUBJ> Gender=Fem|Number=Plur|PronType=Ind 9 nsubj _ _ 2-3 das _ _ _ _ _ _ _ _ 2 de de ADP |PRP|@N< _ 4 case _ _ 3 as o DET <-sam>||ART|F|P|@>N Definite=Def|Gender=Fem|Number=Plur|PronType=Art 4 det _ _ 4 prioridades prioridade NOUN |N|F|P|@P< Gender=Fem|Number=Plur 1 nmod _ _ 5-6 do _ _ _ _ _ _ _ _ 5 de de ADP |PRP|@N< _ 8 case _ _ 6 o o DET <-sam>||ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 8 det _ _ 7 novo novo ADJ ADJ|M|S|@>N Gender=Masc|Number=Sing 8 amod _ _ 8 governo governo NOUN |N|M|S|@P< Gender=Masc|Number=Sing 4 nmod _ _ 9 coincidem coincidir VERB |V|PR|3P|IND|@FS-STA Mood=Ind|Number=Plur|Person=3|Tense=Pres|VerbForm=Fin 0 root _ _ 10 com com ADP PRP|@|ART|F|P|@>N Definite=Def|Gender=Fem|Number=Plur|PronType=Art 12 det _ _ 12 prioridades prioridade NOUN |N|F|P|@P< Gender=Fem|Number=Plur 9 obj _ _ 13-14 do _ _ _ _ _ _ _ _ 13 de de ADP |PRP|@N< _ 15 case _ _ 14 o o DET <-sam>||ART|M|S|@>N Definite=Def|Gender=Masc|Number=Sing|PronType=Art 15 det _ _ 15 PT PT PROPN PROP|M|S|@P< Gender=Masc|Number=Sing 12 nmod _ ChangedBy=Issue165|SpaceAfter=No 16 . . PUNCT PU|@PU _ 9 punct _ _ ================================================ FILE: samples/CoNLL-U/en-ud-test-abridged.conllu ================================================ # newdoc id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200 # sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0001 # text = What if Google Morphed Into GoogleOS? 1 What what PRON WP PronType=Int 0 root 0:root _ 2 if if SCONJ IN _ 4 mark 4:mark _ 3 Google Google PROPN NNP Number=Sing 4 nsubj 4:nsubj _ 4 Morphed morph VERB VBD Mood=Ind|Tense=Past|VerbForm=Fin 1 advcl 1:advcl _ 5 Into into ADP IN _ 6 case 6:case _ 6 GoogleOS GoogleOS PROPN NNP Number=Sing 4 obl 4:obl SpaceAfter=No 7 ? ? PUNCT . _ 4 punct 4:punct _ # sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0002 # text = What if Google expanded on its search-engine (and now e-mail) wares into a full-fledged operating system? 1 What what PRON WP PronType=Int 0 root 0:root _ 2 if if SCONJ IN _ 4 mark 4:mark _ 3 Google Google PROPN NNP Number=Sing 4 nsubj 4:nsubj _ 4 expanded expand VERB VBD Mood=Ind|Tense=Past|VerbForm=Fin 1 advcl 1:advcl _ 5 on on ADP IN _ 15 case 15:case _ 6 its its PRON PRP$ Gender=Neut|Number=Sing|Person=3|Poss=Yes|PronType=Prs 15 nmod:poss 15:nmod:poss _ 7 search search NOUN NN Number=Sing 9 compound 9:compound SpaceAfter=No 8 - - PUNCT HYPH _ 9 punct 9:punct SpaceAfter=No 9 engine engine NOUN NN Number=Sing 15 compound 15:compound _ 10 ( ( PUNCT -LRB- _ 9 punct 9:punct SpaceAfter=No 11 and and CCONJ CC _ 13 cc 13:cc _ 12 now now ADV RB _ 13 advmod 13:advmod _ 13 e-mail e-mail NOUN NN Number=Sing 9 conj 9:conj SpaceAfter=No 14 ) ) PUNCT -RRB- _ 15 punct 15:punct _ 15 wares wares NOUN NNS Number=Plur 4 obl 4:obl _ 16 into into ADP IN _ 22 case 22:case _ 17 a a DET DT Definite=Ind|PronType=Art 22 det 22:det _ 18 full full ADV RB _ 20 advmod 20:advmod SpaceAfter=No 19 - - PUNCT HYPH _ 20 punct 20:punct SpaceAfter=No 20 fledged fledged ADJ JJ Degree=Pos 22 amod 22:amod _ 21 operating operating NOUN NN Number=Sing 22 compound 22:compound _ 22 system system NOUN NN Number=Sing 4 obl 4:obl SpaceAfter=No 23 ? ? PUNCT . _ 4 punct 4:punct _ # sent_id = weblog-blogspot.com_zentelligence_20040423000200_ENG_20040423_000200-0003 # text = [via Microsoft Watch from Mary Jo Foley ] 1 [ [ PUNCT -LRB- _ 4 punct 4:punct SpaceAfter=No 2 via via ADP IN _ 4 case 4:case _ 3 Microsoft Microsoft PROPN NNP Number=Sing 4 compound 4:compound _ 4 Watch Watch PROPN NNP Number=Sing 0 root 0:root _ 5 from from ADP IN _ 6 case 6:case _ 6 Mary Mary PROPN NNP Number=Sing 4 nmod 4:nmod _ 7 Jo Jo PROPN NNP Number=Sing 6 flat 6:flat _ 8 Foley Foley PROPN NNP Number=Sing 6 flat 6:flat _ 9 ] ] PUNCT -RRB- _ 4 punct 4:punct _ # newdoc id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700 # sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0001 # text = (And, by the way, is anybody else just a little nostalgic for the days when that was a good thing?) 1 ( ( PUNCT -LRB- _ 14 punct 14:punct SpaceAfter=No 2 And and CCONJ CC _ 14 cc 14:cc SpaceAfter=No 3 , , PUNCT , _ 14 punct 14:punct _ 4 by by ADP IN _ 6 case 6:case _ 5 the the DET DT Definite=Def|PronType=Art 6 det 6:det _ 6 way way NOUN NN Number=Sing 14 obl 14:obl SpaceAfter=No 7 , , PUNCT , _ 14 punct 14:punct _ 8 is be AUX VBZ Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 14 cop 14:cop _ 9 anybody anybody PRON NN Number=Sing 14 nsubj 14:nsubj _ 10 else else ADJ JJ Degree=Pos 9 amod 9:amod _ 11 just just ADV RB _ 13 advmod 13:advmod _ 12 a a DET DT Definite=Ind|PronType=Art 13 det 13:det _ 13 little little ADJ JJ Degree=Pos 14 obl:npmod 14:obl:npmod _ 14 nostalgic nostalgic NOUN NN Number=Sing 0 root 0:root _ 15 for for ADP IN _ 17 case 17:case _ 16 the the DET DT Definite=Def|PronType=Art 17 det 17:det _ 17 days day NOUN NNS Number=Plur 14 nmod 14:nmod _ 18 when when ADV WRB PronType=Rel 23 advmod 23:advmod _ 19 that that PRON DT Number=Sing|PronType=Dem 23 nsubj 23:nsubj _ 20 was be AUX VBD Mood=Ind|Number=Sing|Person=3|Tense=Past|VerbForm=Fin 23 cop 23:cop _ 21 a a DET DT Definite=Ind|PronType=Art 23 det 23:det _ 22 good good ADJ JJ Degree=Pos 23 amod 23:amod _ 23 thing thing NOUN NN Number=Sing 17 acl:relcl 17:acl:relcl SpaceAfter=No 24 ? ? PUNCT . _ 14 punct 14:punct SpaceAfter=No 25 ) ) PUNCT -RRB- _ 14 punct 14:punct _ # sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0002 # text = This BuzzMachine post argues that Google's rush toward ubiquity might backfire -- which we've all heard before, but it's particularly well-put in this post. 1 This this DET DT Number=Sing|PronType=Dem 3 det 3:det _ 2 BuzzMachine BuzzMachine PROPN NNP Number=Sing 3 compound 3:compound _ 3 post post NOUN NN Number=Sing 4 nsubj 4:nsubj _ 4 argues argue VERB VBZ Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 0 root 0:root _ 5 that that SCONJ IN _ 12 mark 12:mark _ 6 Google Google PROPN NNP Number=Sing 8 nmod:poss 8:nmod:poss SpaceAfter=No 7 's 's PART POS _ 6 case 6:case _ 8 rush rush NOUN NN Number=Sing 12 nsubj 12:nsubj _ 9 toward toward ADP IN _ 10 case 10:case _ 10 ubiquity ubiquity NOUN NN Number=Sing 8 nmod 8:nmod _ 11 might might AUX MD VerbForm=Fin 12 aux 12:aux _ 12 backfire backfire VERB VB VerbForm=Inf 4 ccomp 4:ccomp _ 13 -- -- PUNCT , _ 12 punct 12:punct _ 14 which which PRON WDT PronType=Rel 18 obj 18:obj _ 15 we we PRON PRP Case=Nom|Number=Plur|Person=1|PronType=Prs 18 nsubj 18:nsubj SpaceAfter=No 16 've have AUX VBP Mood=Ind|Tense=Pres|VerbForm=Fin 18 aux 18:aux _ 17 all all ADV RB _ 18 advmod 18:advmod _ 18 heard hear VERB VBN Tense=Past|VerbForm=Part 12 acl:relcl 12:acl:relcl _ 19 before before ADV RB _ 18 advmod 18:advmod SpaceAfter=No 20 , , PUNCT , _ 27 punct 27:punct _ 21 but but CCONJ CC _ 27 cc 27:cc _ 22 it it PRON PRP Case=Nom|Gender=Neut|Number=Sing|Person=3|PronType=Prs 27 nsubj:pass 27:nsubj:pass SpaceAfter=No 23 's be VERB VBZ Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 27 aux:pass 27:aux:pass _ 24 particularly particularly ADV RB _ 27 advmod 27:advmod _ 25 well well ADV RB Degree=Pos 27 advmod 27:advmod SpaceAfter=No 26 - - PUNCT HYPH _ 27 punct 27:punct SpaceAfter=No 27 put put VERB VBN Tense=Past|VerbForm=Part 4 conj 4:conj _ 28 in in ADP IN _ 30 case 30:case _ 29 this this DET DT Number=Sing|PronType=Dem 30 det 30:det _ 30 post post NOUN NN Number=Sing 27 obl 27:obl SpaceAfter=No 31 . . PUNCT . _ 4 punct 4:punct _ # sent_id = weblog-blogspot.com_marketview_20050511222700_ENG_20050511_222700-0003 # text = Google is a nice search engine. 1 Google Google PROPN NNP Number=Sing 6 nsubj 6:nsubj _ 2 is be AUX VBZ Mood=Ind|Number=Sing|Person=3|Tense=Pres|VerbForm=Fin 6 cop 6:cop _ 3 a a DET DT Definite=Ind|PronType=Art 6 det 6:det _ 4 nice nice ADJ JJ Degree=Pos 6 amod 6:amod _ 5 search search NOUN NN Number=Sing 6 compound 6:compound _ 6 engine engine NOUN NN Number=Sing 0 root 0:root SpaceAfter=No 7 . . PUNCT . _ 6 punct 6:punct _ ================================================ FILE: samples/CoNLL-U/ug-ud-test-abridged.conllu ================================================ # sent_id = s1 # text = ئاسماننى كۆپكۈك، دەريا، كۆل سۇلىرىنى سۈپسۈزۈك تۇرۇشقا، دەل - دەرەخلەرنى بۈك - باراقسان بولۇشقا، ھايۋانلارنى ئەركىن ئازادە ياشاشقا ئىگە قىلىش... بىزنىڭ ئورتاق ئارزۇيىمىز. 1 ئاسماننى _ NOUN N _ 30 csubj _ Translit=asmanni 2 كۆپكۈك _ VERB V _ 1 orphan _ SpaceAfter=No|Translit=köpkük 3 ، _ PUNCT Y _ 2 punct _ Translit=, 4 دەريا _ NOUN N _ 7 nmod:poss _ SpaceAfter=No|Translit=derya 5 ، _ PUNCT Y _ 4 punct _ Translit=, 6 كۆل _ NOUN N _ 4 conj _ Translit=köl 7 سۇلىرىنى _ NOUN N _ 9 obj _ Translit=sulirini 8 سۈپسۈزۈك _ ADJ A _ 9 advmod _ Translit=süpsüzük 9 تۇرۇشقا _ VERB V _ 1 conj _ SpaceAfter=No|Translit=turushqa 10 ، _ PUNCT Y _ 1 punct _ Translit=, 11 دەل _ ADV D _ 13 compound:redup _ Translit=del 12 - _ PUNCT Y _ 11 punct _ Translit=- 13 دەرەخلەرنى _ NOUN N _ 17 obj _ Translit=derexlerni 14 بۈك _ ADJ A _ 16 compound _ Translit=bük 15 - _ PUNCT Y _ 14 punct _ Translit=- 16 باراقسان _ ADJ A _ 17 advmod _ Translit=baraqsan 17 بولۇشقا _ VERB V _ 9 orphan _ SpaceAfter=No|Translit=bolushqa 18 ، _ PUNCT Y _ 17 punct _ Translit=, 19 ھايۋانلارنى _ NOUN N _ 24 obj _ Translit=haywanlarni 20 ئەركىن _ ADJ A _ 21 compound:redup _ Translit=erkin 21 ئازادە _ ADJ A _ 22 advmod _ Translit=azade 22 ياشاشقا _ NOUN N _ 24 advcl _ Translit=yashashqa 23 ئىگە _ NOUN N _ 24 compound _ Translit=ige 24 قىلىش _ VERB V _ 1 conj _ SpaceAfter=No|Translit=qilish 25 . _ PUNCT Y _ 1 punct _ SpaceAfter=No|Translit=. 26 . _ PUNCT Y _ 1 punct _ SpaceAfter=No|Translit=. 27 . _ PUNCT Y _ 1 punct _ Translit=. 28 بىزنىڭ _ PRON P _ 30 nmod:poss _ Translit=bizning 29 ئورتاق _ ADJ A _ 30 amod _ Translit=ortaq 30 ئارزۇيىمىز _ NOUN N _ 0 root _ SpaceAfter=No|Translit=arzuyimiz 31 . _ PUNCT Y _ 30 punct _ Translit=. # sent_id = s2 # text = بۇ بۆلەكتىكى تېكىستلەرنى ئوقۇش ئارقىلىق، كىشىلەرنىڭ ھايۋانلار ۋە ئۆسۈملۈكلەرگە قانداق مۇئامىلە قىلغانلىقى، ئاقىۋىتىنىڭ قانداق بولغانلىقىنى كۆرۈپ باقايلى، 1 بۇ _ PRON P _ 2 det _ Translit=bu 2 بۆلەكتىكى _ NOUN N _ 3 nmod _ Translit=bölektiki 3 تېكىستلەرنى _ NOUN N _ 4 obj _ Translit=tëkistlerni 4 ئوقۇش _ VERB V _ 18 advcl _ Translit=oqush 5 ئارقىلىق _ ADP R _ 4 case _ SpaceAfter=No|Translit=arqiliq 6 ، _ PUNCT Y _ 5 punct _ Translit=, 7 كىشىلەرنىڭ _ NOUN N _ 13 nsubj _ Translit=kishilerning 8 ھايۋانلار _ NOUN N _ 13 obl _ Translit=haywanlar 9 ۋە _ CCONJ C _ 10 cc _ Translit=we 10 ئۆسۈملۈكلەرگە _ NOUN N _ 8 conj _ Translit=ösümlüklerge 11 قانداق _ PRON P _ 13 advmod _ Translit=qandaq 12 مۇئامىلە _ NOUN N _ 13 compound _ Translit=muamile 13 قىلغانلىقى _ VERB V _ 18 conj _ SpaceAfter=No|Translit=qilghanliqi 14 ، _ PUNCT Y _ 13 punct _ Translit=, 15 ئاقىۋىتىنىڭ _ NOUN N _ 17 nsubj _ Translit=aqiwitining 16 قانداق _ PRON P _ 17 advmod _ Translit=qandaq 17 بولغانلىقىنى _ VERB V _ 18 obj _ Translit=bolghanliqini 18 كۆرۈپ _ VERB V _ 0 root _ Translit=körüp 19 باقايلى _ VERB V _ 18 aux _ SpaceAfter=No|Translit=baqayli 20 ، _ PUNCT Y _ 19 punct _ Translit=, # sent_id = s3 # text = يەنە ئەتراپىمىزدىكى مۇھىتنى ياخشى كۆزىتىپ، مۇھىتنى قوغداش ئۈچۈن نېمىلەرنى قىلالايدىغانلىقىمىز توغرۇلۇق ئويلىنىپ باقايلى. 1 يەنە _ ADV D _ 13 cc _ Translit=yene 2 ئەتراپىمىزدىكى _ NOUN N _ 3 amod _ Translit=etrapimizdiki 3 مۇھىتنى _ NOUN N _ 5 obj _ Translit=muhitni 4 ياخشى _ ADJ A _ 5 advmod _ Translit=yaxshi 5 كۆزىتىپ _ VERB V _ 13 advcl _ SpaceAfter=No|Translit=közitip 6 ، _ PUNCT Y _ 5 punct _ Translit=, 7 مۇھىتنى _ NOUN N _ 8 obj _ Translit=muhitni 8 قوغداش _ VERB V _ 11 advcl _ Translit=qoghdash 9 ئۈچۈن _ CCONJ C _ 8 case _ Translit=üchün 10 نېمىلەرنى _ PRON P _ 11 obj _ Translit=nëmilerni 11 قىلالايدىغانلىقىمىز _ VERB V _ 13 obj _ Translit=qilalaydighanliqimiz 12 توغرۇلۇق _ ADP R _ 11 case _ Translit=toghruluq 13 ئويلىنىپ _ VERB V _ 0 root _ Translit=oylinip 14 باقايلى _ VERB V _ 13 aux _ SpaceAfter=No|Translit=baqayli 15 . _ PUNCT Y _ 14 punct _ Translit=. # sent_id = s4 # text = بىر يىلى باھار كۈنلىرىنىڭ بىرىدە، شىۋېتسارىيىنىڭ بىر ۋوگزالىدا ھاۋا تەڭشىگۈچ ئورنىتىلغان چىرايلىق، ئازادە بىر پويىز قوزغىلىش ئالدىدا تۇراتتى. 1 بىر _ NUM M _ 2 nummod _ Translit=bir 2 يىلى _ NOUN N _ 20 nmod:tmod _ Translit=yili 3 باھار _ NOUN N _ 4 nmod:poss _ Translit=bahar 4 كۈنلىرىنىڭ _ NOUN N _ 5 nmod:part _ Translit=künlirining 5 بىرىدە _ NUM M _ 20 nmod:tmod _ SpaceAfter=No|Translit=biride 6 ، _ PUNCT Y _ 5 punct _ Translit=, 7 شىۋېتسارىيىنىڭ _ NOUN N _ 9 nmod:poss _ Translit=shiwëtsariyining 8 بىر _ NUM M _ 9 det _ Translit=bir 9 ۋوگزالىدا _ NOUN N _ 20 obl _ Translit=wogzalida 10 ھاۋا _ NOUN N _ 11 compound _ Translit=hawa 11 تەڭشىگۈچ _ NOUN N _ 12 nsubj _ Translit=tengshigüch 12 ئورنىتىلغان _ NOUN N _ 17 amod _ Translit=ornitilghan 13 چىرايلىق _ ADJ A _ 17 amod _ SpaceAfter=No|Translit=chirayliq 14 ، _ PUNCT Y _ 13 punct _ Translit=, 15 ئازادە _ ADJ A _ 13 conj _ Translit=azade 16 بىر _ NUM M _ 17 det _ Translit=bir 17 پويىز _ NOUN N _ 20 nsubj _ Translit=poyiz 18 قوزغىلىش _ VERB V _ 19 nmod:poss _ Translit=qozghilish 19 ئالدىدا _ NOUN N _ 20 obl _ Translit=aldida 20 تۇراتتى _ VERB V _ 0 root _ SpaceAfter=No|Translit=turatti 21 . _ PUNCT Y _ 20 punct _ Translit=. # sent_id = s5 # text = ۋوگزال سۇپىسى ئۇزاتقۇچىلار بىلەن تولۇپ كەتكەنىدى. 1 ۋوگزال _ NOUN N _ 2 nmod:poss _ Translit=wogzal 2 سۇپىسى _ NOUN N _ 5 nsubj _ Translit=supisi 3 ئۇزاتقۇچىلار _ NOUN N _ 5 obl _ Translit=uzatquchilar 4 بىلەن _ ADP R _ 3 case _ Translit=bilen 5 تولۇپ _ VERB V _ 0 root _ Translit=tolup 6 كەتكەنىدى _ VERB V _ 5 aux _ SpaceAfter=No|Translit=ketkenidi 7 . _ PUNCT Y _ 6 punct _ Translit=. # sent_id = s6 # text = ئۇلارنىڭ ئۇزاتماقچى بولغىنى ئۆزگىچە مىھمان - قارلىغاچلار ئىدى. 1 ئۇلارنىڭ _ PRON P _ 2 nsubj _ Translit=ularning 2 ئۇزاتماقچى _ NOUN N _ 5 acl _ Translit=uzatmaqchi 3 بولغىنى _ AUX V _ 2 cop _ Translit=bolghini 4 ئۆزگىچە _ ADJ A _ 5 amod _ Translit=özgiche 5 مىھمان _ NOUN N _ 7 appos _ Translit=mihman 6 - _ PUNCT Y _ 5 punct _ Translit=- 7 قارلىغاچلار _ NOUN N _ 0 root _ Translit=qarlighachlar 8 ئىدى _ AUX V _ 7 cop _ SpaceAfter=No|Translit=idi 9 . _ PUNCT Y _ 8 punct _ Translit=. ================================================ FILE: samples/CodeQL/ql-cobol-sample.ql ================================================ /** * Source: https://github.com/krisds/cobol-codeql/blob/9373a45da534889cb5d3ae1841a5233a38abceee/queries/semmlecode-cobol-queries/SQL/SpecifyWhereClauseOnSelect.ql * Lisence: MIT */ import cobol from SqlSelectStmt stmt where not exists (stmt.getWhere()) // Make sure we're selecting from an actual table. and exists ( SqlTableReference ref | ref = stmt.getFrom().getATarget() and not ref.(SqlTableName).getName().toUpperCase() = "DUAL" ) select stmt, "Unconditional selection of data." ================================================ FILE: samples/CodeQL/ql-sample.ql ================================================ /** * Source: https://github.com/Semmle/ql/blob/bd9a2d71bacfa94cc93ce6ab33dd4c7f8ce71050/csharp/ql/src/Linq/RedundantSelect.ql * License: Apache License 2.0 */ import csharp import Helpers predicate isIdentityFunction(AnonymousFunctionExpr afe) { afe.getNumberOfParameters() = 1 and afe.getExpressionBody() = afe.getParameter(0).getAnAccess() } from SelectCall sc where isIdentityFunction(sc.getFunctionExpr()) select sc, "This LINQ selection is redundant and can be removed." ================================================ FILE: samples/CodeQL/qll-sample1.qll ================================================ /** * Source: https://github.com/github/rasmuswl-temp-ql-clone/blob/5e1c8fe8c9c3505c35f7e032169bf56d71ea2bc7/cpp/ql/src/semmle/code/cpp/models/implementations/Inet.qll * License: Apache License 2.0 */ import semmle.code.cpp.models.interfaces.Taint import semmle.code.cpp.models.interfaces.ArrayFunction class InetNtoa extends TaintFunction { InetNtoa() { hasGlobalName("inet_ntoa") } override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { input.isParameter(0) and output.isReturnValueDeref() } } class InetAton extends TaintFunction, ArrayFunction { InetAton() { hasGlobalName("inet_aton") } override predicate hasTaintFlow(FunctionInput input, FunctionOutput output) { input.isParameterDeref(0) and output.isParameterDeref(1) } override predicate hasArrayInput(int bufParam) { bufParam = 0 } override predicate hasArrayOutput(int bufParam) { bufParam = 1 } override predicate hasArrayWithNullTerminator(int bufParam) { bufParam = 0 } override predicate hasArrayWithFixedSize(int bufParam, int elemCount) { bufParam = 1 and elemCount = 1 } } ================================================ FILE: samples/CodeQL/qll-sample2.qll ================================================ /** * Source: https://github.com/github/rasmuswl-temp-ql-clone/blob/5e1c8fe8c9c3505c35f7e032169bf56d71ea2bc7/python/ql/src/semmle/python/objects/Classes.qll * License: Apache License 2.0 */ import python private import semmle.python.objects.TObject private import semmle.python.objects.ObjectInternal private import semmle.python.pointsto.PointsTo private import semmle.python.pointsto.PointsToContext private import semmle.python.pointsto.MRO private import semmle.python.types.Builtins /** Class representing classes */ abstract class ClassObjectInternal extends ObjectInternal { override string getName() { result = this.getClassDeclaration().getName() } /** Holds if this is a class whose instances we treat specially, rather than as a generic instance. * For example, `type` or `int`. */ boolean isSpecial() { result = Types::getMro(this).containsSpecial() } /** Looks up the attribute `name` on this class. * Note that this may be different from `this.attr(name)`. * For example given the class: * ```class C: * @classmethod * def f(cls): pass * ``` * `this.lookup("f")` is equivalent to `C.__dict__['f']`, which is the class-method * whereas * `this.attr("f") is equivalent to `C.f`, which is a bound-method. */ abstract predicate lookup(string name, ObjectInternal value, CfgOrigin origin); /** Holds if this is a subclass of the `Iterable` abstract base class. */ boolean isIterableSubclass() { this = ObjectInternal::builtin("list") and result = true or this = ObjectInternal::builtin("set") and result = true or this = ObjectInternal::builtin("dict") and result = true or this != ObjectInternal::builtin("list") and this != ObjectInternal::builtin("set") and this != ObjectInternal::builtin("dict") and result = false } override boolean isDescriptor() { result = false } pragma [noinline] override predicate descriptorGetClass(ObjectInternal cls, ObjectInternal value, CfgOrigin origin) { none() } pragma [noinline] override predicate descriptorGetInstance(ObjectInternal instance, ObjectInternal value, CfgOrigin origin) { none() } pragma [noinline] override predicate binds(ObjectInternal instance, string name, ObjectInternal descriptor) { instance = this and PointsToInternal::attributeRequired(this, name) and this.lookup(name, descriptor, _) and descriptor.isDescriptor() = true } /** Approximation to descriptor protocol, skipping meta-descriptor protocol */ pragma [noinline] override predicate attribute(string name, ObjectInternal value, CfgOrigin origin) { exists(ObjectInternal descriptor, CfgOrigin desc_origin | this.lookup(name, descriptor, desc_origin) | descriptor.isDescriptor() = false and value = descriptor and origin = desc_origin or descriptor.isDescriptor() = true and descriptor.descriptorGetClass(this, value, origin) ) } override int length() { none() } override boolean booleanValue() { result = true } override boolean isClass() { result = true } override int intValue() { none() } override string strValue() { none() } override predicate subscriptUnknown() { none() } override predicate contextSensitiveCallee() { none() } override predicate useOriginAsLegacyObject() { none() } /* Classes aren't usually iterable, but can e.g. Enums */ override ObjectInternal getIterNext() { result = ObjectInternal::unknown() } override predicate hasAttribute(string name) { this.getClassDeclaration().declaresAttribute(name) or Types::getBase(this, _).hasAttribute(name) } override predicate isNotSubscriptedType() { any() } } ================================================ FILE: samples/CodeQL/qll-sample3.qll ================================================ /** * Source: https://github.com/github/rasmuswl-temp-ql-clone/blob/5e1c8fe8c9c3505c35f7e032169bf56d71ea2bc7/python/ql/src/semmle/python/objects/Descriptors.qll * License: Apache License 2.0 */ private class PropertySetterOrDeleter extends ObjectInternal, TPropertySetterOrDeleter { override string toString() { result = this.getProperty().toString() + "." + this.getName() } override string getName() { this = TPropertySetterOrDeleter(_, result) } PropertyInternal getProperty() { this = TPropertySetterOrDeleter(result, _) } override predicate callResult(ObjectInternal obj, CfgOrigin origin) { exists(ControlFlowNode call | obj = this.getProperty() and obj = TProperty(call, _, _) and origin = CfgOrigin::fromCfgNode(call) ) } override predicate introducedAt(ControlFlowNode node, PointsToContext context) { none() } override ClassDecl getClassDeclaration() { none() } override boolean isClass() { result = false } override ObjectInternal getClass() { result = TBuiltinClassObject(Builtin::special("MethodType")) } override predicate notTestableForEquality() { none() } override Builtin getBuiltin() { none() } override ControlFlowNode getOrigin() { none() } override predicate callResult(PointsToContext callee, ObjectInternal obj, CfgOrigin origin) { none() } override int intValue() { none() } override string strValue() { none() } override boolean booleanValue() { result = true } override predicate calleeAndOffset(Function scope, int paramOffset) { none() } override predicate attribute(string name, ObjectInternal value, CfgOrigin origin) { none() } override predicate attributesUnknown() { none() } override predicate subscriptUnknown() { none() } override boolean isDescriptor() { result = true } override int length() { none() } override predicate binds(ObjectInternal cls, string name, ObjectInternal descriptor) { none() } override predicate contextSensitiveCallee() { none() } override ObjectInternal getIterNext() { none() } override predicate descriptorGetClass(ObjectInternal cls, ObjectInternal value, CfgOrigin origin) { none() } override predicate descriptorGetInstance(ObjectInternal instance, ObjectInternal value, CfgOrigin origin) { none() } override predicate useOriginAsLegacyObject() { none() } override predicate isNotSubscriptedType() { any() } } ================================================ FILE: samples/CodeQL/tree-sitter-sample.ql ================================================ /** * Sample taken from a tree-sitter-ql example. * Source: https://github.com/tree-sitter/tree-sitter-ql/blob/updated-ql-grammar/examples/002.ql * License: MIT */ private predicate foo(F f){ f = f } int predicateWithResult(){ result = 43 } class A extends int { A() { this = -1 } } select (A)-1 ================================================ FILE: samples/CoffeeScript/browser.coffee ================================================ # Override exported methods for non-Node.js engines. CoffeeScript = require './coffee-script' CoffeeScript.require = require # Use standard JavaScript `eval` to eval code. CoffeeScript.eval = (code, options = {}) -> options.bare ?= on eval CoffeeScript.compile code, options # Running code does not provide access to this scope. CoffeeScript.run = (code, options = {}) -> options.bare = on Function(CoffeeScript.compile code, options)() # If we're not in a browser environment, we're finished with the public API. return unless window? # Load a remote script from the current domain via XHR. CoffeeScript.load = (url, callback) -> xhr = new (window.ActiveXObject or XMLHttpRequest)('Microsoft.XMLHTTP') xhr.open 'GET', url, true xhr.overrideMimeType 'text/plain' if 'overrideMimeType' of xhr xhr.onreadystatechange = -> if xhr.readyState is 4 if xhr.status in [0, 200] CoffeeScript.run xhr.responseText else throw new Error "Could not load #{url}" callback() if callback xhr.send null # Activate CoffeeScript in the browser by having it compile and evaluate # all script tags with a content-type of `text/coffeescript`. # This happens on page load. runScripts = -> scripts = document.getElementsByTagName 'script' coffees = (s for s in scripts when s.type is 'text/coffeescript') index = 0 length = coffees.length do execute = -> script = coffees[index++] if script?.type is 'text/coffeescript' if script.src CoffeeScript.load script.src, execute else CoffeeScript.run script.innerHTML execute() null # Listen for window load, both in browsers and in IE. if window.addEventListener addEventListener 'DOMContentLoaded', runScripts, no else attachEvent 'onload', runScripts ================================================ FILE: samples/CoffeeScript/build.cake ================================================ fs = require 'fs' {print} = require 'sys' {spawn} = require 'child_process' build = (callback) -> coffee = spawn 'coffee', ['-c', '-o', '.', '.'] coffee.stderr.on 'data', (data) -> process.stderr.write data.toString() coffee.stdout.on 'data', (data) -> print data.toString() coffee.on 'exit', (code) -> callback?() if code is 0 task 'build', 'Build from source', -> build() ================================================ FILE: samples/CoffeeScript/classes.coffee ================================================ class Animal constructor: (@name) -> move: (meters) -> alert @name + " moved " + meters + "m." class Snake extends Animal move: -> alert "Slithering..." super 5 class Horse extends Animal move: -> alert "Galloping..." super 45 sam = new Snake "Sammy the Python" tom = new Horse "Tommy the Palomino" sam.move() tom.move() ================================================ FILE: samples/CoffeeScript/coffee-script.coffee ================================================ # CoffeeScript can be used both on the server, as a command-line compiler based # on Node.js/V8, or to run CoffeeScripts directly in the browser. This module # contains the main entry functions for tokenizing, parsing, and compiling # source CoffeeScript into JavaScript. # # If included on a webpage, it will automatically sniff out, compile, and # execute all scripts present in `text/coffeescript` tags. fs = require 'fs' path = require 'path' {Lexer,RESERVED} = require './lexer' {parser} = require './parser' vm = require 'vm' # TODO: Remove registerExtension when fully deprecated. if require.extensions require.extensions['.coffee'] = (module, filename) -> content = compile fs.readFileSync(filename, 'utf8'), {filename} module._compile content, filename else if require.registerExtension require.registerExtension '.coffee', (content) -> compile content # The current CoffeeScript version number. exports.VERSION = '1.3.3' # Words that cannot be used as identifiers in CoffeeScript code exports.RESERVED = RESERVED # Expose helpers for testing. exports.helpers = require './helpers' # Compile a string of CoffeeScript code to JavaScript, using the Coffee/Jison # compiler. exports.compile = compile = (code, options = {}) -> {merge} = exports.helpers try js = (parser.parse lexer.tokenize code).compile options return js unless options.header catch err err.message = "In #{options.filename}, #{err.message}" if options.filename throw err header = "Generated by CoffeeScript #{@VERSION}" "// #{header}\n#{js}" # Tokenize a string of CoffeeScript code, and return the array of tokens. exports.tokens = (code, options) -> lexer.tokenize code, options # Parse a string of CoffeeScript code or an array of lexed tokens, and # return the AST. You can then compile it by calling `.compile()` on the root, # or traverse it by using `.traverseChildren()` with a callback. exports.nodes = (source, options) -> if typeof source is 'string' parser.parse lexer.tokenize source, options else parser.parse source # Compile and execute a string of CoffeeScript (on the server), correctly # setting `__filename`, `__dirname`, and relative `require()`. exports.run = (code, options = {}) -> mainModule = require.main # Set the filename. mainModule.filename = process.argv[1] = if options.filename then fs.realpathSync(options.filename) else '.' # Clear the module cache. mainModule.moduleCache and= {} # Assign paths for node_modules loading mainModule.paths = require('module')._nodeModulePaths path.dirname fs.realpathSync options.filename # Compile. if path.extname(mainModule.filename) isnt '.coffee' or require.extensions mainModule._compile compile(code, options), mainModule.filename else mainModule._compile code, mainModule.filename # Compile and evaluate a string of CoffeeScript (in a Node.js-like environment). # The CoffeeScript REPL uses this to run the input. exports.eval = (code, options = {}) -> return unless code = code.trim() Script = vm.Script if Script if options.sandbox? if options.sandbox instanceof Script.createContext().constructor sandbox = options.sandbox else sandbox = Script.createContext() sandbox[k] = v for own k, v of options.sandbox sandbox.global = sandbox.root = sandbox.GLOBAL = sandbox else sandbox = global sandbox.__filename = options.filename || 'eval' sandbox.__dirname = path.dirname sandbox.__filename # define module/require only if they chose not to specify their own unless sandbox isnt global or sandbox.module or sandbox.require Module = require 'module' sandbox.module = _module = new Module(options.modulename || 'eval') sandbox.require = _require = (path) -> Module._load path, _module, true _module.filename = sandbox.__filename _require[r] = require[r] for r in Object.getOwnPropertyNames require when r isnt 'paths' # use the same hack node currently uses for their own REPL _require.paths = _module.paths = Module._nodeModulePaths process.cwd() _require.resolve = (request) -> Module._resolveFilename request, _module o = {} o[k] = v for own k, v of options o.bare = on # ensure return value js = compile code, o if sandbox is global vm.runInThisContext js else vm.runInContext js, sandbox # Instantiate a Lexer for our use here. lexer = new Lexer # The real Lexer produces a generic stream of tokens. This object provides a # thin wrapper around it, compatible with the Jison API. We can then pass it # directly as a "Jison lexer". parser.lexer = lex: -> [tag, @yytext, @yylineno] = @tokens[@pos++] or [''] tag setInput: (@tokens) -> @pos = 0 upcomingInput: -> "" parser.yy = require './nodes' ================================================ FILE: samples/CoffeeScript/example.cjsx ================================================ ###* @cjsx React.DOM ### define 'myProject.ReactExampleComponent', [ 'React' 'myProject.ExampleStore' 'myProject.ExampleActions' 'myProject.ReactExampleTable' ], (React, ExampleStore, ExampleActions, ReactExampleTable ) -> ReactExampleComponent = React.createClass mixins: [ListenMixin] getInitialState: -> rows: ExampleStore.getRows() meta: ExampleStore.getMeta() componentWillMount: -> @listenTo ExampleStore componentDidMount: -> ExampleActions.getExampleData() onStoreChange: -> if this.isMounted() @setState rows: ExampleStore.getRows() meta: ExampleStore.getMeta() componentWillUnmount: -> @stopListening ExampleStore render: ->
    {@state.title}
    ================================================ FILE: samples/CoffeeScript/hello.coffee ================================================ console.log "Hello, World!" ================================================ FILE: samples/CoffeeScript/intro.coffee ================================================ # Assignment: number = 42 opposite = true # Conditions: number = -42 if opposite # Functions: square = (x) -> x * x # Arrays: list = [1, 2, 3, 4, 5] # Objects: math = root: Math.sqrt square: square cube: (x) -> x * square x # Splats: race = (winner, runners...) -> print winner, runners # Existence: alert "I knew it!" if elvis? # Array comprehensions: cubes = (math.cube num for num in list) ================================================ FILE: samples/CoffeeScript/lexer.coffee ================================================ # The CoffeeScript Lexer. Uses a series of token-matching regexes to attempt # matches against the beginning of the source code. When a match is found, # a token is produced, we consume the match, and start again. Tokens are in the # form: # # [tag, value, lineNumber] # # Which is a format that can be fed directly into [Jison](http://github.com/zaach/jison). {Rewriter, INVERSES} = require './rewriter' # Import the helpers we need. {count, starts, compact, last} = require './helpers' # The Lexer Class # --------------- # The Lexer class reads a stream of CoffeeScript and divvies it up into tagged # tokens. Some potential ambiguity in the grammar has been avoided by # pushing some extra smarts into the Lexer. exports.Lexer = class Lexer # **tokenize** is the Lexer's main method. Scan by attempting to match tokens # one at a time, using a regular expression anchored at the start of the # remaining code, or a custom recursive token-matching method # (for interpolations). When the next token has been recorded, we move forward # within the code past the token, and begin again. # # Each tokenizing method is responsible for returning the number of characters # it has consumed. # # Before returning the token stream, run it through the [Rewriter](rewriter.html) # unless explicitly asked not to. tokenize: (code, opts = {}) -> code = "\n#{code}" if WHITESPACE.test code code = code.replace(/\r/g, '').replace TRAILING_SPACES, '' @code = code # The remainder of the source code. @line = opts.line or 0 # The current line. @indent = 0 # The current indentation level. @indebt = 0 # The over-indentation at the current level. @outdebt = 0 # The under-outdentation at the current level. @indents = [] # The stack of all current indentation levels. @ends = [] # The stack for pairing up tokens. @tokens = [] # Stream of parsed tokens in the form `['TYPE', value, line]`. # At every position, run through this list of attempted matches, # short-circuiting if any of them succeed. Their order determines precedence: # `@literalToken` is the fallback catch-all. i = 0 while @chunk = code[i..] i += @identifierToken() or @commentToken() or @whitespaceToken() or @lineToken() or @heredocToken() or @stringToken() or @numberToken() or @regexToken() or @jsToken() or @literalToken() @closeIndentation() @error "missing #{tag}" if tag = @ends.pop() return @tokens if opts.rewrite is off (new Rewriter).rewrite @tokens # Tokenizers # ---------- # Matches identifying literals: variables, keywords, method names, etc. # Check to ensure that JavaScript reserved words aren't being used as # identifiers. Because CoffeeScript reserves a handful of keywords that are # allowed in JavaScript, we're careful not to tag them as keywords when # referenced as property names here, so you can still do `jQuery.is()` even # though `is` means `===` otherwise. identifierToken: -> return 0 unless match = IDENTIFIER.exec @chunk [input, id, colon] = match if id is 'own' and @tag() is 'FOR' @token 'OWN', id return id.length forcedIdentifier = colon or (prev = last @tokens) and (prev[0] in ['.', '?.', '::'] or not prev.spaced and prev[0] is '@') tag = 'IDENTIFIER' if not forcedIdentifier and (id in JS_KEYWORDS or id in COFFEE_KEYWORDS) tag = id.toUpperCase() if tag is 'WHEN' and @tag() in LINE_BREAK tag = 'LEADING_WHEN' else if tag is 'FOR' @seenFor = yes else if tag is 'UNLESS' tag = 'IF' else if tag in UNARY tag = 'UNARY' else if tag in RELATION if tag isnt 'INSTANCEOF' and @seenFor tag = 'FOR' + tag @seenFor = no else tag = 'RELATION' if @value() is '!' @tokens.pop() id = '!' + id if id in JS_FORBIDDEN if forcedIdentifier tag = 'IDENTIFIER' id = new String id id.reserved = yes else if id in RESERVED @error "reserved word \"#{id}\"" unless forcedIdentifier id = COFFEE_ALIAS_MAP[id] if id in COFFEE_ALIASES tag = switch id when '!' then 'UNARY' when '==', '!=' then 'COMPARE' when '&&', '||' then 'LOGIC' when 'true', 'false' then 'BOOL' when 'break', 'continue' then 'STATEMENT' else tag @token tag, id @token ':', ':' if colon input.length # Matches numbers, including decimals, hex, and exponential notation. # Be careful not to interfere with ranges-in-progress. numberToken: -> return 0 unless match = NUMBER.exec @chunk number = match[0] if /^0[BOX]/.test number @error "radix prefix '#{number}' must be lowercase" else if /E/.test(number) and not /^0x/.test number @error "exponential notation '#{number}' must be indicated with a lowercase 'e'" else if /^0\d*[89]/.test number @error "decimal literal '#{number}' must not be prefixed with '0'" else if /^0\d+/.test number @error "octal literal '#{number}' must be prefixed with '0o'" lexedLength = number.length if octalLiteral = /^0o([0-7]+)/.exec number number = '0x' + (parseInt octalLiteral[1], 8).toString 16 if binaryLiteral = /^0b([01]+)/.exec number number = '0x' + (parseInt binaryLiteral[1], 2).toString 16 @token 'NUMBER', number lexedLength # Matches strings, including multi-line strings. Ensures that quotation marks # are balanced within the string's contents, and within nested interpolations. stringToken: -> switch @chunk.charAt 0 when "'" return 0 unless match = SIMPLESTR.exec @chunk @token 'STRING', (string = match[0]).replace MULTILINER, '\\\n' when '"' return 0 unless string = @balancedString @chunk, '"' if 0 < string.indexOf '#{', 1 @interpolateString string[1...-1] else @token 'STRING', @escapeLines string else return 0 if octalEsc = /^(?:\\.|[^\\])*\\(?:0[0-7]|[1-7])/.test string @error "octal escape sequences #{string} are not allowed" @line += count string, '\n' string.length # Matches heredocs, adjusting indentation to the correct level, as heredocs # preserve whitespace, but ignore indentation to the left. heredocToken: -> return 0 unless match = HEREDOC.exec @chunk heredoc = match[0] quote = heredoc.charAt 0 doc = @sanitizeHeredoc match[2], quote: quote, indent: null if quote is '"' and 0 <= doc.indexOf '#{' @interpolateString doc, heredoc: yes else @token 'STRING', @makeString doc, quote, yes @line += count heredoc, '\n' heredoc.length # Matches and consumes comments. commentToken: -> return 0 unless match = @chunk.match COMMENT [comment, here] = match if here @token 'HERECOMMENT', @sanitizeHeredoc here, herecomment: true, indent: Array(@indent + 1).join(' ') @line += count comment, '\n' comment.length # Matches JavaScript interpolated directly into the source via backticks. jsToken: -> return 0 unless @chunk.charAt(0) is '`' and match = JSTOKEN.exec @chunk @token 'JS', (script = match[0])[1...-1] script.length # Matches regular expression literals. Lexing regular expressions is difficult # to distinguish from division, so we borrow some basic heuristics from # JavaScript and Ruby. regexToken: -> return 0 if @chunk.charAt(0) isnt '/' if match = HEREGEX.exec @chunk length = @heregexToken match @line += count match[0], '\n' return length prev = last @tokens return 0 if prev and (prev[0] in (if prev.spaced then NOT_REGEX else NOT_SPACED_REGEX)) return 0 unless match = REGEX.exec @chunk [match, regex, flags] = match if regex[..1] is '/*' then @error 'regular expressions cannot begin with `*`' if regex is '//' then regex = '/(?:)/' @token 'REGEX', "#{regex}#{flags}" match.length # Matches multiline extended regular expressions. heregexToken: (match) -> [heregex, body, flags] = match if 0 > body.indexOf '#{' re = body.replace(HEREGEX_OMIT, '').replace(/\//g, '\\/') if re.match /^\*/ then @error 'regular expressions cannot begin with `*`' @token 'REGEX', "/#{ re or '(?:)' }/#{flags}" return heregex.length @token 'IDENTIFIER', 'RegExp' @tokens.push ['CALL_START', '('] tokens = [] for [tag, value] in @interpolateString(body, regex: yes) if tag is 'TOKENS' tokens.push value... else continue unless value = value.replace HEREGEX_OMIT, '' value = value.replace /\\/g, '\\\\' tokens.push ['STRING', @makeString(value, '"', yes)] tokens.push ['+', '+'] tokens.pop() @tokens.push ['STRING', '""'], ['+', '+'] unless tokens[0]?[0] is 'STRING' @tokens.push tokens... @tokens.push [',', ','], ['STRING', '"' + flags + '"'] if flags @token ')', ')' heregex.length # Matches newlines, indents, and outdents, and determines which is which. # If we can detect that the current line is continued onto the the next line, # then the newline is suppressed: # # elements # .each( ... ) # .map( ... ) # # Keeps track of the level of indentation, because a single outdent token # can close multiple indents, so we need to know how far in we happen to be. lineToken: -> return 0 unless match = MULTI_DENT.exec @chunk indent = match[0] @line += count indent, '\n' @seenFor = no size = indent.length - 1 - indent.lastIndexOf '\n' noNewlines = @unfinished() if size - @indebt is @indent if noNewlines then @suppressNewlines() else @newlineToken() return indent.length if size > @indent if noNewlines @indebt = size - @indent @suppressNewlines() return indent.length diff = size - @indent + @outdebt @token 'INDENT', diff @indents.push diff @ends.push 'OUTDENT' @outdebt = @indebt = 0 else @indebt = 0 @outdentToken @indent - size, noNewlines @indent = size indent.length # Record an outdent token or multiple tokens, if we happen to be moving back # inwards past several recorded indents. outdentToken: (moveOut, noNewlines) -> while moveOut > 0 len = @indents.length - 1 if @indents[len] is undefined moveOut = 0 else if @indents[len] is @outdebt moveOut -= @outdebt @outdebt = 0 else if @indents[len] < @outdebt @outdebt -= @indents[len] moveOut -= @indents[len] else dent = @indents.pop() - @outdebt moveOut -= dent @outdebt = 0 @pair 'OUTDENT' @token 'OUTDENT', dent @outdebt -= moveOut if dent @tokens.pop() while @value() is ';' @token 'TERMINATOR', '\n' unless @tag() is 'TERMINATOR' or noNewlines this # Matches and consumes non-meaningful whitespace. Tag the previous token # as being "spaced", because there are some cases where it makes a difference. whitespaceToken: -> return 0 unless (match = WHITESPACE.exec @chunk) or (nline = @chunk.charAt(0) is '\n') prev = last @tokens prev[if match then 'spaced' else 'newLine'] = true if prev if match then match[0].length else 0 # Generate a newline token. Consecutive newlines get merged together. newlineToken: -> @tokens.pop() while @value() is ';' @token 'TERMINATOR', '\n' unless @tag() is 'TERMINATOR' this # Use a `\` at a line-ending to suppress the newline. # The slash is removed here once its job is done. suppressNewlines: -> @tokens.pop() if @value() is '\\' this # We treat all other single characters as a token. E.g.: `( ) , . !` # Multi-character operators are also literal tokens, so that Jison can assign # the proper order of operations. There are some symbols that we tag specially # here. `;` and newlines are both treated as a `TERMINATOR`, we distinguish # parentheses that indicate a method call from regular parentheses, and so on. literalToken: -> if match = OPERATOR.exec @chunk [value] = match @tagParameters() if CODE.test value else value = @chunk.charAt 0 tag = value prev = last @tokens if value is '=' and prev if not prev[1].reserved and prev[1] in JS_FORBIDDEN @error "reserved word \"#{@value()}\" can't be assigned" if prev[1] in ['||', '&&'] prev[0] = 'COMPOUND_ASSIGN' prev[1] += '=' return value.length if value is ';' @seenFor = no tag = 'TERMINATOR' else if value in MATH then tag = 'MATH' else if value in COMPARE then tag = 'COMPARE' else if value in COMPOUND_ASSIGN then tag = 'COMPOUND_ASSIGN' else if value in UNARY then tag = 'UNARY' else if value in SHIFT then tag = 'SHIFT' else if value in LOGIC or value is '?' and prev?.spaced then tag = 'LOGIC' else if prev and not prev.spaced if value is '(' and prev[0] in CALLABLE prev[0] = 'FUNC_EXIST' if prev[0] is '?' tag = 'CALL_START' else if value is '[' and prev[0] in INDEXABLE tag = 'INDEX_START' switch prev[0] when '?' then prev[0] = 'INDEX_SOAK' switch value when '(', '{', '[' then @ends.push INVERSES[value] when ')', '}', ']' then @pair value @token tag, value value.length # Token Manipulators # ------------------ # Sanitize a heredoc or herecomment by # erasing all external indentation on the left-hand side. sanitizeHeredoc: (doc, options) -> {indent, herecomment} = options if herecomment if HEREDOC_ILLEGAL.test doc @error "block comment cannot contain \"*/\", starting" return doc if doc.indexOf('\n') <= 0 else while match = HEREDOC_INDENT.exec doc attempt = match[1] indent = attempt if indent is null or 0 < attempt.length < indent.length doc = doc.replace /// \n #{indent} ///g, '\n' if indent doc = doc.replace /^\n/, '' unless herecomment doc # A source of ambiguity in our grammar used to be parameter lists in function # definitions versus argument lists in function calls. Walk backwards, tagging # parameters specially in order to make things easier for the parser. tagParameters: -> return this if @tag() isnt ')' stack = [] {tokens} = this i = tokens.length tokens[--i][0] = 'PARAM_END' while tok = tokens[--i] switch tok[0] when ')' stack.push tok when '(', 'CALL_START' if stack.length then stack.pop() else if tok[0] is '(' tok[0] = 'PARAM_START' return this else return this this # Close up all remaining open blocks at the end of the file. closeIndentation: -> @outdentToken @indent # Matches a balanced group such as a single or double-quoted string. Pass in # a series of delimiters, all of which must be nested correctly within the # contents of the string. This method allows us to have strings within # interpolations within strings, ad infinitum. balancedString: (str, end) -> continueCount = 0 stack = [end] for i in [1...str.length] if continueCount --continueCount continue switch letter = str.charAt i when '\\' ++continueCount continue when end stack.pop() unless stack.length return str[0..i] end = stack[stack.length - 1] continue if end is '}' and letter in ['"', "'"] stack.push end = letter else if end is '}' and letter is '/' and match = (HEREGEX.exec(str[i..]) or REGEX.exec(str[i..])) continueCount += match[0].length - 1 else if end is '}' and letter is '{' stack.push end = '}' else if end is '"' and prev is '#' and letter is '{' stack.push end = '}' prev = letter @error "missing #{ stack.pop() }, starting" # Expand variables and expressions inside double-quoted strings using # Ruby-like notation for substitution of arbitrary expressions. # # "Hello #{name.capitalize()}." # # If it encounters an interpolation, this method will recursively create a # new Lexer, tokenize the interpolated contents, and merge them into the # token stream. interpolateString: (str, options = {}) -> {heredoc, regex} = options tokens = [] pi = 0 i = -1 while letter = str.charAt i += 1 if letter is '\\' i += 1 continue unless letter is '#' and str.charAt(i+1) is '{' and (expr = @balancedString str[i + 1..], '}') continue tokens.push ['NEOSTRING', str[pi...i]] if pi < i inner = expr[1...-1] if inner.length nested = new Lexer().tokenize inner, line: @line, rewrite: off nested.pop() nested.shift() if nested[0]?[0] is 'TERMINATOR' if len = nested.length if len > 1 nested.unshift ['(', '(', @line] nested.push [')', ')', @line] tokens.push ['TOKENS', nested] i += expr.length pi = i + 1 tokens.push ['NEOSTRING', str[pi..]] if i > pi < str.length return tokens if regex return @token 'STRING', '""' unless tokens.length tokens.unshift ['', ''] unless tokens[0][0] is 'NEOSTRING' @token '(', '(' if interpolated = tokens.length > 1 for [tag, value], i in tokens @token '+', '+' if i if tag is 'TOKENS' @tokens.push value... else @token 'STRING', @makeString value, '"', heredoc @token ')', ')' if interpolated tokens # Pairs up a closing token, ensuring that all listed pairs of tokens are # correctly balanced throughout the course of the token stream. pair: (tag) -> unless tag is wanted = last @ends @error "unmatched #{tag}" unless 'OUTDENT' is wanted # Auto-close INDENT to support syntax like this: # # el.click((event) -> # el.hide()) # @indent -= size = last @indents @outdentToken size, true return @pair tag @ends.pop() # Helpers # ------- # Add a token to the results, taking note of the line number. token: (tag, value) -> @tokens.push [tag, value, @line] # Peek at a tag in the current token stream. tag: (index, tag) -> (tok = last @tokens, index) and if tag then tok[0] = tag else tok[0] # Peek at a value in the current token stream. value: (index, val) -> (tok = last @tokens, index) and if val then tok[1] = val else tok[1] # Are we in the midst of an unfinished expression? unfinished: -> LINE_CONTINUER.test(@chunk) or @tag() in ['\\', '.', '?.', 'UNARY', 'MATH', '+', '-', 'SHIFT', 'RELATION' 'COMPARE', 'LOGIC', 'THROW', 'EXTENDS'] # Converts newlines for string literals. escapeLines: (str, heredoc) -> str.replace MULTILINER, if heredoc then '\\n' else '' # Constructs a string token by escaping quotes and newlines. makeString: (body, quote, heredoc) -> return quote + quote unless body body = body.replace /\\([\s\S])/g, (match, contents) -> if contents in ['\n', quote] then contents else match body = body.replace /// #{quote} ///g, '\\$&' quote + @escapeLines(body, heredoc) + quote # Throws a syntax error on the current `@line`. error: (message) -> throw SyntaxError "#{message} on line #{ @line + 1}" # Constants # --------- # Keywords that CoffeeScript shares in common with JavaScript. JS_KEYWORDS = [ 'true', 'false', 'null', 'this' 'new', 'delete', 'typeof', 'in', 'instanceof' 'return', 'throw', 'break', 'continue', 'debugger' 'if', 'else', 'switch', 'for', 'while', 'do', 'try', 'catch', 'finally' 'class', 'extends', 'super' ] # CoffeeScript-only keywords. COFFEE_KEYWORDS = ['undefined', 'then', 'unless', 'until', 'loop', 'of', 'by', 'when'] COFFEE_ALIAS_MAP = and : '&&' or : '||' is : '==' isnt : '!=' not : '!' yes : 'true' no : 'false' on : 'true' off : 'false' COFFEE_ALIASES = (key for key of COFFEE_ALIAS_MAP) COFFEE_KEYWORDS = COFFEE_KEYWORDS.concat COFFEE_ALIASES # The list of keywords that are reserved by JavaScript, but not used, or are # used by CoffeeScript internally. We throw an error when these are encountered, # to avoid having a JavaScript error at runtime. RESERVED = [ 'case', 'default', 'function', 'var', 'void', 'with' 'const', 'let', 'enum', 'export', 'import', 'native' '__hasProp', '__extends', '__slice', '__bind', '__indexOf' 'implements', 'interface', 'let', 'package', 'private', 'protected', 'public', 'static', 'yield' ] STRICT_PROSCRIBED = ['arguments', 'eval'] # The superset of both JavaScript keywords and reserved words, none of which may # be used as identifiers or properties. JS_FORBIDDEN = JS_KEYWORDS.concat(RESERVED).concat(STRICT_PROSCRIBED) exports.RESERVED = RESERVED.concat(JS_KEYWORDS).concat(COFFEE_KEYWORDS).concat(STRICT_PROSCRIBED) exports.STRICT_PROSCRIBED = STRICT_PROSCRIBED # Token matching regexes. IDENTIFIER = /// ^ ( [$A-Za-z_\x7f-\uffff][$\w\x7f-\uffff]* ) ( [^\n\S]* : (?!:) )? # Is this a property name? /// NUMBER = /// ^ 0b[01]+ | # binary ^ 0o[0-7]+ | # octal ^ 0x[\da-f]+ | # hex ^ \d*\.?\d+ (?:e[+-]?\d+)? # decimal ///i HEREDOC = /// ^ ("""|''') ([\s\S]*?) (?:\n[^\n\S]*)? \1 /// OPERATOR = /// ^ ( ?: [-=]> # function | [-+*/%<>&|^!?=]= # compound assign / compare | >>>=? # zero-fill right shift | ([-+:])\1 # doubles | ([&|<>])\2=? # logic / shift | \?\. # soak access | \.{2,3} # range or splat ) /// WHITESPACE = /^[^\n\S]+/ COMMENT = /^###([^#][\s\S]*?)(?:###[^\n\S]*|(?:###)?$)|^(?:\s*#(?!##[^#]).*)+/ CODE = /^[-=]>/ MULTI_DENT = /^(?:\n[^\n\S]*)+/ SIMPLESTR = /^'[^\\']*(?:\\.[^\\']*)*'/ JSTOKEN = /^`[^\\`]*(?:\\.[^\\`]*)*`/ # Regex-matching-regexes. REGEX = /// ^ (/ (?! [\s=] ) # disallow leading whitespace or equals signs [^ [ / \n \\ ]* # every other thing (?: (?: \\[\s\S] # anything escaped | \[ # character class [^ \] \n \\ ]* (?: \\[\s\S] [^ \] \n \\ ]* )* ] ) [^ [ / \n \\ ]* )* /) ([imgy]{0,4}) (?!\w) /// HEREGEX = /// ^ /{3} ([\s\S]+?) /{3} ([imgy]{0,4}) (?!\w) /// HEREGEX_OMIT = /\s+(?:#.*)?/g # Token cleaning regexes. MULTILINER = /\n/g HEREDOC_INDENT = /\n+([^\n\S]*)/g HEREDOC_ILLEGAL = /\*\// LINE_CONTINUER = /// ^ \s* (?: , | \??\.(?![.\d]) | :: ) /// TRAILING_SPACES = /\s+$/ # Compound assignment tokens. COMPOUND_ASSIGN = [ '-=', '+=', '/=', '*=', '%=', '||=', '&&=', '?=', '<<=', '>>=', '>>>=', '&=', '^=', '|=' ] # Unary tokens. UNARY = ['!', '~', 'NEW', 'TYPEOF', 'DELETE', 'DO'] # Logical tokens. LOGIC = ['&&', '||', '&', '|', '^'] # Bit-shifting tokens. SHIFT = ['<<', '>>', '>>>'] # Comparison tokens. COMPARE = ['==', '!=', '<', '>', '<=', '>='] # Mathematical tokens. MATH = ['*', '/', '%'] # Relational tokens that are negatable with `not` prefix. RELATION = ['IN', 'OF', 'INSTANCEOF'] # Boolean tokens. BOOL = ['TRUE', 'FALSE'] # Tokens which a regular expression will never immediately follow, but which # a division operator might. # # See: http://www.mozilla.org/js/language/js20-2002-04/rationale/syntax.html#regular-expressions # # Our list is shorter, due to sans-parentheses method calls. NOT_REGEX = ['NUMBER', 'REGEX', 'BOOL', 'NULL', 'UNDEFINED', '++', '--', ']'] # If the previous token is not spaced, there are more preceding tokens that # force a division parse: NOT_SPACED_REGEX = NOT_REGEX.concat ')', '}', 'THIS', 'IDENTIFIER', 'STRING' # Tokens which could legitimately be invoked or indexed. An opening # parentheses or bracket following these tokens will be recorded as the start # of a function invocation or indexing operation. CALLABLE = ['IDENTIFIER', 'STRING', 'REGEX', ')', ']', '}', '?', '::', '@', 'THIS', 'SUPER'] INDEXABLE = CALLABLE.concat 'NUMBER', 'BOOL', 'NULL', 'UNDEFINED' # Tokens that, when immediately preceding a `WHEN`, indicate that the `WHEN` # occurs at the start of a line. We disambiguate these from trailing whens to # avoid an ambiguity in the grammar. LINE_BREAK = ['INDENT', 'OUTDENT', 'TERMINATOR'] ================================================ FILE: samples/CoffeeScript/rack_application.coffee ================================================ # The `RackApplication` class is responsible for managing a # [Nack](http://josh.github.com/nack/) pool for a given Rack # application. Incoming HTTP requests are dispatched to # `RackApplication` instances by an `HttpServer`, where they are # subsequently handled by a pool of Nack worker processes. By default, # Pow tells Nack to use a maximum of two worker processes per # application, but this can be overridden with the configuration's # `workers` option. # # Before creating the Nack pool, Pow executes the `.powrc` and # `.powenv` scripts if they're present in the application root, # captures their environment variables, and passes them along to the # Nack worker processes. This lets you modify your `RUBYOPT` to use # different Ruby options, for example. # # If [rvm](http://rvm.beginrescueend.com/) is installed and an # `.rvmrc` file is present in the application's root, Pow will load # both before creating the Nack pool. This makes it easy to run an # app with a specific version of Ruby. # # Nack workers remain running until they're killed, restarted (by # touching the `tmp/restart.txt` file in the application root), or # until the application has not served requests for the length of time # specified in the configuration's `timeout` option (15 minutes by # default). async = require "async" fs = require "fs" nack = require "nack" {bufferLines, pause, sourceScriptEnv} = require "./util" {join, exists, basename, resolve} = require "path" module.exports = class RackApplication # Create a `RackApplication` for the given configuration and # root path. The application begins life in the uninitialized # state. constructor: (@configuration, @root, @firstHost) -> @logger = @configuration.getLogger join "apps", basename @root @readyCallbacks = [] @quitCallbacks = [] @statCallbacks = [] # Queue `callback` to be invoked when the application becomes ready, # then start the initialization process. If the application's state # is ready, the callback is invoked immediately. ready: (callback) -> if @state is "ready" callback() else @readyCallbacks.push callback @initialize() # Tell the application to quit and queue `callback` to be invoked # when all workers have exited. If the application has already quit, # the callback is invoked immediately. quit: (callback) -> if @state @quitCallbacks.push callback if callback @terminate() else callback?() # Stat `tmp/restart.txt` in the application root and invoke the # given callback with a single argument indicating whether or not # the file has been touched since the last call to # `queryRestartFile`. queryRestartFile: (callback) -> fs.stat join(@root, "tmp/restart.txt"), (err, stats) => if err @mtime = null callback false else lastMtime = @mtime @mtime = stats.mtime.getTime() callback lastMtime isnt @mtime # Check to see if `tmp/always_restart.txt` is present in the # application root, and set the pool's `runOnce` option # accordingly. Invoke `callback` when the existence check has # finished. (Multiple calls to this method are aggregated.) setPoolRunOnceFlag: (callback) -> unless @statCallbacks.length exists join(@root, "tmp/always_restart.txt"), (alwaysRestart) => @pool.runOnce = alwaysRestart statCallback() for statCallback in @statCallbacks @statCallbacks = [] @statCallbacks.push callback # Collect environment variables from `.powrc` and `.powenv`, in that # order, if present. The idea is that `.powrc` files can be checked # into a source code repository for global configuration, leaving # `.powenv` free for any necessary local overrides. loadScriptEnvironment: (env, callback) -> async.reduce [".powrc", ".envrc", ".powenv"], env, (env, filename, callback) => exists script = join(@root, filename), (scriptExists) -> if scriptExists sourceScriptEnv script, env, callback else callback null, env , callback # If `.rvmrc` and `$HOME/.rvm/scripts/rvm` are present, load rvm, # source `.rvmrc`, and invoke `callback` with the resulting # environment variables. If `.rvmrc` is present but rvm is not # installed, invoke `callback` without sourcing `.rvmrc`. # Before loading rvm, Pow invokes a helper script that shows a # deprecation notice if it has not yet been displayed. loadRvmEnvironment: (env, callback) -> exists script = join(@root, ".rvmrc"), (rvmrcExists) => if rvmrcExists exists rvm = @configuration.rvmPath, (rvmExists) => if rvmExists libexecPath = resolve "#{__dirname}/../libexec" before = """ '#{libexecPath}/pow_rvm_deprecation_notice' '#{[@firstHost]}' source '#{rvm}' > /dev/null """.trim() sourceScriptEnv script, env, {before}, callback else callback null, env else callback null, env # Stat `tmp/restart.txt` to cache its mtime, then load the # application's full environment from `.powrc`, `.powenv`, and # `.rvmrc`. loadEnvironment: (callback) -> @queryRestartFile => @loadScriptEnvironment @configuration.env, (err, env) => if err then callback err else @loadRvmEnvironment env, (err, env) => if err then callback err else callback null, env # Begin the initialization process if the application is in the # uninitialized state. (If the application is terminating, queue a # call to `initialize` after all workers have exited.) initialize: -> if @state if @state is "terminating" @quit => @initialize() return @state = "initializing" # Load the application's environment. If an error is raised or # either of the environment scripts exits with a non-zero status, # reset the application's state and log the error. @loadEnvironment (err, env) => if err @state = null @logger.error err.message @logger.error "stdout: #{err.stdout}" @logger.error "stderr: #{err.stderr}" # Set the application's state to ready. Then create the Nack # pool instance using the `workers` and `timeout` options from # the application's environment or the global configuration. else @state = "ready" @pool = nack.createPool join(@root, "config.ru"), env: env size: env?.POW_WORKERS ? @configuration.workers idle: (env?.POW_TIMEOUT ? @configuration.timeout) * 1000 # Log the workers' stderr and stdout, and log each worker's # PID as it spawns and exits. bufferLines @pool.stdout, (line) => @logger.info line bufferLines @pool.stderr, (line) => @logger.warning line @pool.on "worker:spawn", (process) => @logger.debug "nack worker #{process.child.pid} spawned" @pool.on "worker:exit", (process) => @logger.debug "nack worker exited" # Invoke and remove all queued callbacks, passing along the # error, if any. readyCallback err for readyCallback in @readyCallbacks @readyCallbacks = [] # Begin the termination process. (If the application is initializing, # wait until it is ready before shutting down.) terminate: -> if @state is "initializing" @ready => @terminate() else if @state is "ready" @state = "terminating" # Instruct all workers to exit. After the processes have # terminated, reset the application's state, then invoke and # remove all queued callbacks. @pool.quit => @state = null @mtime = null @pool = null quitCallback() for quitCallback in @quitCallbacks @quitCallbacks = [] # Handle an incoming HTTP request. Wait until the application is in # the ready state, restart the workers if necessary, then pass the # request along to the Nack pool. If the Nack worker raises an # exception handling the request, reset the application. handle: (req, res, next, callback) -> resume = pause req @ready (err) => return next err if err @setPoolRunOnceFlag => @restartIfNecessary => req.proxyMetaVariables = SERVER_PORT: @configuration.dstPort.toString() try @pool.proxy req, res, (err) => @quit() if err next err finally resume() callback?() # Terminate the application, re-initialize it, and invoke the given # callback when the application's state becomes ready. restart: (callback) -> @quit => @ready callback # Restart the application if `tmp/restart.txt` has been touched # since the last call to this function. restartIfNecessary: (callback) -> @queryRestartFile (mtimeChanged) => if mtimeChanged @restart callback else callback() # Append RVM autoload boilerplate to the application's `.powrc` # file. This is called by the RVM deprecation notice mini-app. writeRvmBoilerplate: -> powrc = join @root, ".powrc" boilerplate = @constructor.rvmBoilerplate fs.readFile powrc, "utf8", (err, contents) -> contents ?= "" if contents.indexOf(boilerplate) is -1 fs.writeFile powrc, "#{boilerplate}\n#{contents}" @rvmBoilerplate: """ if [ -f "$rvm_path/scripts/rvm" ] && [ -f ".rvmrc" ]; then source "$rvm_path/scripts/rvm" source ".rvmrc" fi """ ================================================ FILE: samples/CoffeeScript/xipd.coffee ================================================ dnsserver = require "dnsserver" exports.Server = class Server extends dnsserver.Server NS_T_A = 1 NS_T_NS = 2 NS_T_CNAME = 5 NS_T_SOA = 6 NS_C_IN = 1 NS_RCODE_NXDOMAIN = 3 constructor: (domain, @rootAddress) -> super @domain = domain.toLowerCase() @soa = createSOA @domain @on "request", @handleRequest handleRequest: (req, res) => question = req.question subdomain = @extractSubdomain question.name if subdomain? and isARequest question res.addRR question.name, NS_T_A, NS_C_IN, 600, subdomain.getAddress() else if subdomain?.isEmpty() and isNSRequest question res.addRR question.name, NS_T_SOA, NS_C_IN, 600, @soa, true else res.header.rcode = NS_RCODE_NXDOMAIN res.send() extractSubdomain: (name) -> Subdomain.extract name, @domain, @rootAddress isARequest = (question) -> question.type is NS_T_A and question.class is NS_C_IN isNSRequest = (question) -> question.type is NS_T_NS and question.class is NS_C_IN createSOA = (domain) -> mname = "ns-1.#{domain}" rname = "hostmaster.#{domain}" serial = parseInt new Date().getTime() / 1000 refresh = 28800 retry = 7200 expire = 604800 minimum = 3600 dnsserver.createSOA mname, rname, serial, refresh, retry, expire, minimum exports.createServer = (domain, address = "127.0.0.1") -> new Server domain, address exports.Subdomain = class Subdomain @extract: (name, domain, address) -> return unless name name = name.toLowerCase() offset = name.length - domain.length if domain is name.slice offset subdomain = if 0 >= offset then null else name.slice 0, offset - 1 new constructor subdomain, address if constructor = @for subdomain @for: (subdomain = "") -> if IPAddressSubdomain.pattern.test subdomain IPAddressSubdomain else if EncodedSubdomain.pattern.test subdomain EncodedSubdomain else Subdomain constructor: (@subdomain, @address) -> @labels = subdomain?.split(".") ? [] @length = @labels.length isEmpty: -> @length is 0 getAddress: -> @address class IPAddressSubdomain extends Subdomain @pattern = /// (^|\.) ((25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3} (25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?) $ /// getAddress: -> @labels.slice(-4).join "." class EncodedSubdomain extends Subdomain @pattern = /(^|\.)[a-z0-9]{1,7}$/ getAddress: -> decode @labels[@length - 1] exports.encode = encode = (ip) -> value = 0 for byte, index in ip.split "." value += parseInt(byte, 10) << (index * 8) (value >>> 0).toString 36 PATTERN = /^[a-z0-9]{1,7}$/ exports.decode = decode = (string) -> return unless PATTERN.test string value = parseInt string, 36 ip = [] for i in [1..4] ip.push value & 0xFF value >>= 8 ip.join "." ================================================ FILE: samples/ColdFusion/example.cfm ================================================ ---> ---> Date Functions #RightNow#
    #DateFormat(RightNow)#
    #DateFormat(RightNow,"mm/dd/yy")#
    #TimeFormat(RightNow)#
    #TimeFormat(RightNow,"hh:mm tt")#
    #IsDate(RightNow)#
    #IsDate("January 31, 2007")#
    #IsDate("foo")#
    #DaysInMonth(RightNow)#
    #x# #y# #z# ---> comment ---> ================================================ FILE: samples/ColdFusion CFC/exampleScript.cfc ================================================ /** ******************************************************************************** ContentBox - A Modular Content Platform Copyright 2012 by Luis Majano and Ortus Solutions, Corp www.gocontentbox.org | www.luismajano.com | www.ortussolutions.com ******************************************************************************** Apache License, Version 2.0 Copyright Since [2012] [Luis Majano and Ortus Solutions,Corp] Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. ******************************************************************************** * A generic content service for content objects */ component extends="coldbox.system.orm.hibernate.VirtualEntityService" singleton{ // DI property name="settingService" inject="id:settingService@cb"; property name="cacheBox" inject="cachebox"; property name="log" inject="logbox:logger:{this}"; property name="customFieldService" inject="customFieldService@cb"; property name="categoryService" inject="categoryService@cb"; property name="commentService" inject="commentService@cb"; property name="contentVersionService" inject="contentVersionService@cb"; property name="authorService" inject="authorService@cb"; property name="populator" inject="wirebox:populator"; property name="systemUtil" inject="SystemUtil@cb"; /* * Constructor * @entityName.hint The content entity name to bind this service to. */ ContentService function init(entityName="cbContent"){ // init it super.init(entityName=arguments.entityName, useQueryCaching=true); // Test scope coloring in pygments this.colorTestVar = "Just for testing pygments!"; cookie.colorTestVar = ""; client.colorTestVar = "" session.colorTestVar = ""; application.colorTestVar = ""; return this; } /** * Clear all content caches * @async.hint Run it asynchronously or not, defaults to false */ function clearAllCaches(boolean async=false){ var settings = settingService.getAllSettings(asStruct=true); // Get appropriate cache provider var cache = cacheBox.getCache( settings.cb_content_cacheName ); cache.clearByKeySnippet(keySnippet="cb-content",async=arguments.async); return this; } /** * Clear all page wrapper caches * @async.hint Run it asynchronously or not, defaults to false */ function clearAllPageWrapperCaches(boolean async=false){ var settings = settingService.getAllSettings(asStruct=true); // Get appropriate cache provider var cache = cacheBox.getCache( settings.cb_content_cacheName ); cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper",async=arguments.async); return this; } /** * Clear all page wrapper caches * @slug.hint The slug partial to clean on * @async.hint Run it asynchronously or not, defaults to false */ function clearPageWrapperCaches(required any slug, boolean async=false){ var settings = settingService.getAllSettings(asStruct=true); // Get appropriate cache provider var cache = cacheBox.getCache( settings.cb_content_cacheName ); cache.clearByKeySnippet(keySnippet="cb-content-pagewrapper-#arguments.slug#",async=arguments.async); return this; } /** * Clear a page wrapper cache * @slug.hint The slug to clean * @async.hint Run it asynchronously or not, defaults to false */ function clearPageWrapper(required any slug, boolean async=false){ var settings = settingService.getAllSettings(asStruct=true); // Get appropriate cache provider var cache = cacheBox.getCache( settings.cb_content_cacheName ); cache.clear("cb-content-pagewrapper-#arguments.slug#/"); return this; } /** * Searches published content with cool paramters, remember published content only * @searchTerm.hint The search term to search * @max.hint The maximum number of records to paginate * @offset.hint The offset in the pagination * @asQuery.hint Return as query or array of objects, defaults to array of objects * @sortOrder.hint The sorting of the search results, defaults to publishedDate DESC * @isPublished.hint Search for published, non-published or both content objects [true, false, 'all'] * @searchActiveContent.hint Search only content titles or both title and active content. Defaults to both. */ function searchContent( any searchTerm="", numeric max=0, numeric offset=0, boolean asQuery=false, any sortOrder="publishedDate DESC", any isPublished=true, boolean searchActiveContent=true){ var results = {}; var c = newCriteria(); // only published content if( isBoolean( arguments.isPublished ) ){ // Published bit c.isEq( "isPublished", javaCast( "Boolean", arguments.isPublished ) ); // Published eq true evaluate other params if( arguments.isPublished ){ c.isLt("publishedDate", now() ) .$or( c.restrictions.isNull("expireDate"), c.restrictions.isGT("expireDate", now() ) ) .isEq("passwordProtection",""); } } // Search Criteria if( len( arguments.searchTerm ) ){ // like disjunctions c.createAlias("activeContent","ac"); // Do we search title and active content or just title? if( arguments.searchActiveContent ){ c.$or( c.restrictions.like("title","%#arguments.searchTerm#%"), c.restrictions.like("ac.content", "%#arguments.searchTerm#%") ); } else{ c.like( "title", "%#arguments.searchTerm#%" ); } } // run criteria query and projections count results.count = c.count( "contentID" ); results.content = c.resultTransformer( c.DISTINCT_ROOT_ENTITY ) .list(offset=arguments.offset, max=arguments.max, sortOrder=arguments.sortOrder, asQuery=arguments.asQuery); return results; } /********************************************* PRIVATE *********************************************/ /** * Update the content hits * @contentID.hint The content id to update */ private function syncUpdateHits(required contentID){ var q = new Query(sql="UPDATE cb_content SET hits = hits + 1 WHERE contentID = #arguments.contentID#").execute(); return this; } private function closureTest(){ methodCall( param1, function( arg1, required arg2 ){ var settings = settingService.getAllSettings(asStruct=true); // Get appropriate cache provider var cache = cacheBox.getCache( settings.cb_content_cacheName ); cache.clear("cb-content-pagewrapper-#arguments.slug#/"); return this; }, param1 ); } private function StructliteralTest(){ return { foo = bar, brad = 'Wood', func = function( arg1, required arg2 ){ var settings = settingService.getAllSettings(asStruct=true); // Get appropriate cache provider var cache = cacheBox.getCache( settings.cb_content_cacheName ); cache.clear("cb-content-pagewrapper-#arguments.slug#/"); return this; }, array = [ 1, 2, 3, 4, 5, 'test', 'testing', 'testerton', { foo = true, brad = false, wood = null } ], last = "final" }; } private function arrayliteralTest(){ return [ 1, 2, 3, 4, 5, 'test', 'testing', 'testerton', { foo = true, brad = false, wood = null }, 'testy-von-testavich' ]; } } ================================================ FILE: samples/ColdFusion CFC/exampleTag.cfc ================================================ ================================================ FILE: samples/Common Lisp/array.l ================================================ ;;; -*- Mode: Lisp; Package: LISP -*- ;;; ;;; This file is part of xyzzy. ;;; (provide "array") (in-package "lisp") (export '(make-vector make-array vector array-dimensions array-in-bounds-p upgraded-array-element-type adjust-array)) (defun upgraded-array-element-type (type) (cond ((or (eq type 't) (null type)) 't) ((member type '(character base-character standard-char extended-character) :test #'eq) 'character) (t (setq type (car (si:canonicalize-type type))) (cond ((or (eq type 't) (null type)) 't) ((member type '(character base-character standard-char extended-character) :test #'eq) 'character) (t 't))))) (defun check-array-initialize-option (ies-p ics-p displaced-to) (let ((x 0)) (and ies-p (incf x)) (and ics-p (incf x)) (and displaced-to (incf x)) (when (> x 1) (error ":initial-element, :initial-contents, :displaced-to")))) (defun make-vector (length &key (element-type t) (initial-element nil ies-p) (initial-contents nil ics-p) fill-pointer adjustable displaced-to (displaced-index-offset 0)) (setq element-type (upgraded-array-element-type element-type)) (check-array-initialize-option ies-p ics-p displaced-to) (let ((vector (si:*make-vector length element-type initial-element adjustable fill-pointer displaced-to displaced-index-offset))) (when ics-p (si:*copy-into-seq vector initial-contents)) vector)) (defun make-array (dimensions &rest rest &key (element-type t) (initial-element nil ies-p) (initial-contents nil ics-p) fill-pointer adjustable displaced-to (displaced-index-offset 0)) (cond ((integerp dimensions) (apply #'make-vector dimensions rest)) ((= (length dimensions) 1) (apply #'make-vector (car dimensions) rest)) (t (setq element-type (upgraded-array-element-type element-type)) (check-array-initialize-option ies-p ics-p displaced-to) (when fill-pointer (error ":fill-pointer")) (let ((array (si:*make-array dimensions element-type initial-element adjustable displaced-to displaced-index-offset))) (when ics-p (let ((dims (make-list (array-rank array) :initial-element 0)) (stack (list initial-contents)) (rank (1- (array-rank array)))) (dolist (x dims) (push (elt (car stack) 0) stack)) (dotimes (i (array-total-size array)) (setf (row-major-aref array i) (car stack)) (do ((x dims (cdr x)) (j rank (1- j))) ((null x)) (pop stack) (incf (car x)) (when (< (car x) (array-dimension array j)) (do ((r (- rank j) (1- r))) ((< r 0)) (push (elt (car stack) (nth r dims)) stack)) (return)) (setf (car x) 0))))) array)))) (defun vector (&rest list) (make-vector (length list) :element-type t :initial-contents list)) (defun array-dimensions (array) (do ((i (1- (array-rank array)) (1- i)) (dims '())) ((minusp i) dims) (push (array-dimension array i) dims))) (defun array-in-bounds-p (array &rest subscripts) (let ((r (array-rank array))) (when (/= r (length subscripts)) (error "subscripts: ~S" subscripts)) (do ((i 0 (1+ i)) (s subscripts (cdr s))) ((= i r) t) (unless (<= 0 (car s) (1- (array-dimension array i))) (return nil))))) (defun adjust-array (old-array dimensions &rest rest &key (element-type nil ets-p) initial-element (initial-contents nil ics-p) (fill-pointer nil fps-p) displaced-to displaced-index-offset) (when (/= (length dimensions) (array-rank old-array)) (error "?")) (unless ets-p (push (array-element-type old-array) rest) (push :element-type rest)) (when (adjustable-array-p old-array) (push t rest) (push :adjustable rest)) (cond (fps-p (unless (array-has-fill-pointer-p old-array) (error "?"))) (t (when (array-has-fill-pointer-p old-array) (push (fill-pointer old-array) rest) (push :fill-pointer rest)))) (when (eq old-array displaced-to) (error "?")) (let ((new-array (apply #'make-array dimensions rest))) (or ics-p displaced-to (copy-array-partially old-array new-array)) (cond ((adjustable-array-p old-array) (si:*replace-array old-array new-array) old-array) (t new-array)))) (defun copy-array-partially (src dst) (let* ((dims (mapcar #'min (array-dimensions src) (array-dimensions dst))) (r (array-rank src)) (s (make-list r :initial-element 0))) (setq r (1- r)) (dotimes (x (apply #'* dims)) (setf (apply #'aref dst s) (apply #'aref src s)) (do ((i r (1- i))) ((minusp i)) (incf (nth i s)) (when (< (nth i s) (nth i dims)) (return)) (setf (nth i s) 0))))) ================================================ FILE: samples/Common Lisp/common.l ================================================ ;;; common.l ;;; commonLisp features for eus ;;; ;;; Copyright(c)1988, Toshihiro MATSUI, Electrotechnical Laboratory ;;; 1986-Aug ;;; 1987-Feb ;;; 1988-Jun defclass, setf (in-package "LISP") (list "@(#)$Id: common.l,v 1.1.1.1 2003/11/20 07:46:30 eus Exp $") (export '(lisp-implementation-type lisp-implementation-version)) (export '(macroexpand prog1 loop unless until pop push pushnew inc dec incf decf)) (export '(defvar defparameter defconstant deflocal dotimes dolist do-symbols do-external-symbols do-all-symbols psetq do do* prog prog* case classcase otherwise string alias caaar caadr cadar cdaar cdadr cddar cdddr fourth fifth sixth seventh eighth cadddr cddddr cadddr caaddr cdaddr caddddr flatten list-insert list-delete adjoin union intersection set-difference set-exclusive-or rotate-list last copy-tree copy-list nreconc rassoc acons member assoc subsetp maplist mapcon)) (export '(find find-if find-if-not position position-if position-if-not count count-if count-if-not member-if member-if-not pairlis make-list make-sequence fill replace transpose-list remove remove-if remove-if-not delete delete-if delete-if-not substitute substitute-if substitute-if-not nsubstitute nsubstitute-if nsubstitute-if-not unique remove-duplicates extream send-super-lexpr send-lexpr send-super send-all resend send-super* send* instance instance* make-instance defclassmethod delete-method make-class defstruct defclass readtablep copy-readtable set-syntax-from-char collect-if collect-instances )) (export '(keywordp constantp functionp vector-class-p compiled-function-p input-stream-p output-stream-p io-stream-p special-form-p macro-function)) (export '(zerop plusp minusp oddp evenp /= logandc1 logandc2 ecase every some reduce merge-list merge expt signum defsetf define-setf-method setf multiple-value-bind multiple-value-setq pop push)) (export '(get-internal-run-time list-length values first second third bye)) (export '(rad2deg deg2rad )) ;; version (defun lisp-implementation-type () "EusLisp") (defun lisp-implementation-version () (format nil "EusLisp ~A~A for ~A created on ~A(~A)" (car lisp-implementation-version) (cdddr lisp-implementation-version) *OS-VERSION* (cadr lisp-implementation-version) (caddr lisp-implementation-version) )) (setq euserror nil) ;;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; basic macros ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; (eval-when (load eval) (defun macroexpand (form) (let ((r (macroexpand2 form))) (while (and (listp r) (macro-function (car r))) (setq r (macroexpand2 r))) r)) ;(defmacro defun (fname &rest fdef) ; `(progn ; (setq (',fname . function) (cons 'lambda ',fdef)) ; (remprop ',fname 'builtin-function-entry) ; ',fname)) (defmacro prog1 (&rest args) (let ((first (gensym "PROG1"))) `(let ((,first ,(car args))) (progn . ,(cdr args)) ,first))) (defmacro loop (&rest forms) (let ((tag (gensym "LOOP"))) `(block nil (tagbody ,tag ,@forms (go ,tag))))) (defmacro unless (pred &rest form) `(when (not ,pred) . ,form)) (defmacro until (condition &rest forms) `(while (not ,condition) ,@forms)) (defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s)))) (defmacro push (item place) `(setf ,place (cons ,item ,place))) (defmacro pushnew (item place &key test test-not key) `(progn (if (not (member ,item ,place :test ,test :test-not ,test-not :key ,key)) (setf ,place (cons ,item ,place))) nil)) (defmacro inc (var &optional h) (if h (setq h (list '+ var h)) (setq h (list '1+ var))) (list 'setq var h)) (defmacro dec (var &optional h) (if h (setq h (list '- var h)) (setq h (list '1- var))) (list 'setq var h)) (defmacro incf (var &optional h) (if h (setq h (list '+ var h)) (setq h (list '1+ var))) (list 'setf var h)) (defmacro decf (var &optional h) (if h (setq h (list '- var h)) (setq h (list '1- var))) (list 'setf var h)) (defmacro defvar (var &optional (init nil) (doc nil)) (unless (symbolp var) (error 20)) `(when (eql (send ',var :vtype) 1) (send ',var :vtype 2) (if (not (boundp ',var)) (send ',var :global ,init ,doc )) ',var)) (defmacro deflocal (var &optional (init nil) (doc nil)) (unless (symbolp var) (error 20)) `(progn (send ',var :special ,init ,doc) ',var)) (defmacro defparameter (var init &optional (doc nil)) (unless (symbolp var) (error 20)) `(send ',var :global ,init ,doc)) (defmacro defconstant (sym val &optional doc) (unless (symbolp sym) (error 20)) `(send ',sym :constant ,val ,doc) ) (defmacro dotimes (vars &rest forms) (let ((endvar (gensym "DOTIMES"))) `(let ((,(car vars) 0) (,endvar ,(cadr vars))) (declare (integer ,(car vars) ,endvar)) (while (< ,(car vars) ,endvar) ,@forms (setq ,(car vars) (1+ ,(car vars)))) ,(caddr vars)))) (defmacro dolist (vars &rest forms) (let ((lists (gensym "DOLIST")) (decl (car forms))) (if (and (consp decl) (eq (car decl) 'declare)) (setq forms (cdr forms)) (setq decl nil)) `(let ((,(car vars) nil) (,lists ,(cadr vars))) ,decl (while ,lists (setq ,(car vars) (pop ,lists)) ,@forms) ,(caddr vars)))) (defmacro do-symbols (vars &rest forms) (let* ((symbols (gensym "DOSYM")) (v (car vars)) (pkg (if (cadr vars) (cadr vars) '*package*)) (pkgv (gensym)) (i (gensym)) (size (gensym)) (svec (gensym)) ) `(let* ((,v nil) (,pkgv (find-package ,pkg)) (,i 0) (,svec (,pkgv . intsymvector)) (,size (length ,svec))) (while (< ,i ,size) (setq ,v (elt ,svec ,i)) (inc ,i) (when (symbolp ,v) . ,forms)) ,(caddr vars)))) (defmacro do-external-symbols (vars &rest forms) (let* ((symbols (gensym "DOEXTSYM")) (v (car vars)) (pkg (if (cadr vars) (cadr vars) '*package*)) (pkgv (gensym)) (i (gensym)) (size (gensym)) (svec (gensym)) ) `(let* ((,v nil) (,pkgv (find-package ,pkg)) (,i 0) (,svec (,pkgv . symvector)) (,size (length ,svec))) (while (< ,i ,size) (setq ,v (elt ,svec ,i)) (inc ,i) (when (symbolp ,v) . ,forms)) ,(caddr vars)))) (defmacro do-all-symbols (var &rest forms) (let ((apackage (gensym "DOALLSYM"))) `(dolist (,apackage (list-all-packages) ,(cadr var)) (do-symbols (,(car var) ,apackage) . ,forms) ) )) (defmacro psetq (&rest varvals) (let* (vars vals gvars) (while varvals (push (pop varvals) vars) (push (pop varvals) vals) (push (gensym "PSETQ") gvars)) (setq vars (nreverse vars) vals (nreverse vals) gvars (nreverse gvars)) `(let* ,(mapcar #'list gvars vals) (setq . ,(mapcan #'list vars gvars)) nil))) (defmacro do (vars endtest &rest body) (let ((decl (car body)) (tag (gensym "DO"))) (if (and (consp decl) (eq (car decl) 'declare)) (setq body (cdr body)) (setq decl nil)) `(block nil (let ,(mapcar #'(lambda (v) (list (car v) (cadr v))) vars) ,decl (tagbody ,tag (if ,(car endtest) (return (progn . ,(cdr endtest)))) ,@body (psetq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v)))) vars)) (go ,tag))) ))) (defmacro do* (vars endtest &rest body) (let ((decl (car body)) (tag (gensym "DO*"))) (if (and (consp decl) (eq (car decl) 'declare)) (setq body (cdr body)) (setq decl nil)) `(block nil (let* ,(mapcar #'(lambda (v) (list (car v) (cadr v))) vars) ,decl (tagbody ,tag (if ,(car endtest) (return (progn . ,(cdr endtest)))) ,@body (setq . ,(mapcan #'(lambda (v) (if (cddr v) (list (car v) (caddr v)))) vars)) (go ,tag))) ))) (defmacro prog (vars &rest body) `(block nil (let ,vars (tagbody ,@body)))) (defmacro prog* (vars &rest body) `(block nil (let* ,vars (tagbody ,@body)))) ) ;; ;; case ;; (eval-when (load eval) (defun casebody (body) (if (cdr body) (cons 'progn body) (car body))) (defun casehead (keyvar head) (if (atom head) (if (memq head '(t otherwise)) t (list 'eq keyvar (list 'quote head))) (list 'memq keyvar (list 'quote head)) )) (defun case1 (keyvar clauses) (if (atom clauses) nil (list 'if (casehead keyvar (caar clauses)) (casebody (cdar clauses)) (case1 keyvar (cdr clauses)) nil))) (defmacro case (key &rest clauses) (let ((keyvar (gensym "CASE")) (result nil)) (list 'let (list (list keyvar key)) (case1 keyvar clauses)) )) (defun classcasehead (keyvar head) (if (memq head '(t otherwise)) t (if (atom head) `(derivedp ,keyvar ,head) `(or . ,(mapcar #'(lambda (x) `(derivedp ,keyvar ,x)) head))))) (defun classcase1 (keyvar clauses) (if (atom clauses) nil (list 'if (classcasehead keyvar (caar clauses)) (casebody (cdar clauses)) (classcase1 keyvar (cdr clauses)) nil))) (defmacro classcase (key &rest clauses) (let ((kv (gensym "CCASE"))) `(let ((,kv ,key)) ,(classcase1 kv clauses)))) ) ;; string (defun string (x) (if (stringp x) x (if (symbolp x) (copy-seq (x . pname)) (if (numberp x) (format nil "~d" x) (error x))))) ; ; more list functions ; (eval-when (load eval) (defun alias (new old) (setslot new symbol 'function (symbol-function old))) (alias 'list-length 'length) (alias 'values 'list) ) (eval-when (load eval) (defun caaar (x) (car (caar x))) (defun caadr (x) (car (cadr x))) (defun cadar (x) (car (cdar x))) (defun cdaar (x) (cdr (caar x))) (defun cdadr (x) (cdr (cadr x))) (defun cddar (x) (cdr (cdar x))) (defun cdddr (x) (cdr (cddr x))) (alias 'first 'car) (alias 'second 'cadr) (alias 'third 'caddr) (defun fourth (x) (cadr (cddr x))) (defun fifth (x) (caddr (cddr x))) (defun sixth (x) (caddr (cdddr x))) (defun seventh (x) (caddr (cddddr x))) (defun eighth (x) (cadddr (cddddr x))) #| (defun cadddr (x) (car (cdddr x))) |# (defun cddddr (x) (cddr (cddr x))) (defun cadddr (x) (cadr (cddr x))) (defun caaddr (x) (caar (cddr x))) (defun cdaddr (x) (cdar (cddr x))) (defun caddddr (x) (cadr (cdddr x))) (defun flatten (l &optional accumulator) (cond ((null l) accumulator) ((atom l) (cons l accumulator)) (t (flatten (car l) (flatten (cdr l) accumulator)))) ) (defun list-insert (item pos list) "insert item as the pos'th element in list. if pos is bigger than the length of list, item is nconc'ed at the tail" (cond ((null list) (list item)) ((>= pos (length list)) (nconc list (list item))) ((= pos 0) (cons item list)) (t (let ((tail (cons item (nthcdr pos list)))) (rplacd (nthcdr (1- pos) list) tail) list)))) (defun list-delete (lst n) "(lst n) delete nth element of lst" (if (= n 0) (setq lst (cdr lst)) (rplacd (nthcdr (1- n) lst) (nthcdr (1+ n) lst)) ) lst) (defun adjoin (item list &key (test #'eq) (test-not) (key #'identity)) (if (member item list :test test :test-not test-not :key key) list (cons item list))) (defun union (list1 list2 &key (test #'eq) (test-not) (key #'identity)) (let (result) (dolist (item list1) (unless (member (funcall key item) result :test test :test-not test-not :key key) (setq result (cons item result)))) (dolist (item list2) (unless (member (funcall key item) result :test test :test-not test-not :key key) (setq result (cons item result)))) (reverse result))) (defun intersection (list1 list2 &key (test #'eq) (test-not) (key #'identity)) (let (r) (dolist (item list1) (if (member (funcall key item) list2 :test test :test-not test-not :key key) (setq r (cons item r)))) r)) (defun set-difference (list1 list2 &key (test #'eq) (test-not) (key #'identity)) (let (result) (dolist (l1 list1) (unless (member (funcall key l1) list2 :test test :test-not test-not :key key) (push l1 result))) (nreverse result))) (defun set-exclusive-or (list1 list2 &key (test #'eq) (test-not) (key #'identity)) (let (result1 result2) (dolist (l1 list1) (setq l1 (funcall key l1)) (unless (member l1 list2 :test test :test-not test-not :key key) (push l1 result1))) (dolist (l2 list2) (setq l2 (funcall key l2)) (unless (member l2 list1 :test test :test-not test-not :key key) (push l2 result2))) (nconc result1 result2))) (defun rotate-list (l) (append (cdr l) (list (car l)))) (defun last (x) (while (consp (cdr x)) (setq x (cdr x))) x) (defun copy-tree (x) (subst t t x)) (defun copy-list (x) (nreverse (reverse x))) (defun nreconc (x y) (nconc (nreverse x) y)) (defun rassoc (item alist) (dolist (a alist) (if (equal item (cdr a)) (return-from rassoc a)))) (defun acons (key datum alist) (cons (cons key datum) alist)) (defun member (item list &key key test test-not) (supermember item list key test test-not)) (defun assoc (item alist &key key test test-not) (superassoc item alist key test test-not)) (defun subsetp (sub super &key key test test-not) (every #'(lambda (s) (member s super :key key :test test :test-not test-not)) sub)) (defun maplist (func arg &rest more-args &aux result) (if more-args (let (arglist margs) (while arg (setq arglist nil) (push arg arglist) (setq arg (cdr arg)) (setq margs more-args) (while margs (push (car margs) arglist) (setf (car margs) (cdar margs)) (setq margs (cdr margs)) ) (push (apply func (nreverse arglist)) result) )) (while arg (push (funcall func arg) result) (setq arg (cdr arg)))) (nreverse result)) (defun mapcon (func arg &rest more-args &aux result) (if more-args (let (arglist margs) (while arg (setq arglist nil) (push arg arglist) (setq arg (cdr arg)) (setq margs more-args) (while margs (push (car margs) arglist) (setf (car margs) (cdar margs)) (setq margs (cdr margs)) ) (setq result (nconc (apply func (nreverse arglist)) result) )) ) (while arg (setq result (nconc (funcall func arg) result)) (setq arg (cdr arg)))) (nreverse result)) (defun find (item seq &key (start 0) (end (length seq)) (test #'eq) (test-not nil) (key #'identity)) (system::raw-find item seq test test-not key nil nil start end)) (defun find-if (pred seq &key (start 0) (end (length seq)) (key #'identity)) (system::raw-find nil seq nil nil key pred nil start end)) (defun find-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity)) (system::raw-find nil seq nil nil key nil pred start end)) (defun position (item seq &key (start 0) (end (length seq)) (count 1) (test #'eq) (test-not nil) (key #'identity)) (system::raw-position item seq test test-not key nil nil start end count)) (defun position-if (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity)) (system::raw-position nil seq nil nil key pred nil start end count)) (defun position-if-not (pred seq &key (start 0) (end (length seq)) (count 1) (key #'identity)) (system::raw-position nil seq nil nil key nil pred start end count)) (defun count (item seq &key (start 0) (end (length seq)) (test #'eq) (test-not nil) (key #'identity)) (system::raw-count item seq test test-not key nil nil start end)) (defun count-if (pred seq &key (start 0) (end (length seq)) (key #'identity)) (system::raw-count nil seq nil nil key pred nil start end)) (defun count-if-not (pred seq &key (start 0) (end (length seq)) (key #'identity)) (system::raw-count nil seq nil nil key nil pred start end)) (defun member-if (test list &key (key #'identity)) (while list (if (funcall test (funcall key (car list))) (return-from member-if list) (setq list (cdr list))))) (defun member-if-not (test list &key (key #'identity)) (while list (if (not (funcall test (funcall key (car list))) ) (return-from member-if-not list) (setq list (cdr list))))) (defun collect-if (func seq &aux r) (dolist (s seq) (if (funcall func s) (push s r)) ) (nreverse r) ) (defun collect-instances (klass list) (collect-if #'(lambda (i) (derivedp i klass)) (flatten list))) (defun pairlis (l1 l2 &optional alist) (if l1 (cons (cons (car l1) (car l2)) (pairlis (cdr l1) (cdr l2) alist)) alist)) (defun transpose-list (dlist) (let (r) (dotimes (i (length (car dlist))) (push (mapcar #'(lambda (x) (nth i x)) dlist) r)) (nreverse r))) (defun make-list (leng &key initial-element) (let (r) (unless (integerp leng) (error "integer required for length of make-list")) (dotimes (i leng r) (push initial-element r)))) (defun make-sequence (type size &key initial-element) (if (or (memq type '(cons list)) (eq type cons)) (make-list size :initial-element initial-element) (make-array size :element-type type :initial-element initial-element))) (defun fill (seq item &key (start 0) (end (length seq))) (system::raw-fill seq item start end)) (defun replace (dest src &key (start1 0) (end1 (length dest)) (start2 0) (end2 (length src))) (let ((result dest) (count (min (- end1 start1) (- end2 start2)))) (cond ((listp dest) (setq dest (nthcdr start1 dest)) (cond ((listp src) (setq src (nthcdr start2 src)) (dotimes (c count) (setq (dest . car) (pop src)) (pop dest))) (t (dotimes (c count) (setq (dest . car) (aref src start2)) (inc start2) (pop dest))))) ((listp src) ; list --> vector (setq src (nthcdr start2 src)) (dotimes (c count) (aset dest start1 (pop src)) (inc start1))) (t (system::vector-replace dest src start1 end1 start2 end2))) result)) (defun remove (item seq &key (start 0) (end (length seq)) (test #'eq) (test-not nil) (count 1000000) (key #'identity)) (system::universal-remove item seq test test-not key nil nil start end count)) (defun remove-if (pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::universal-remove nil seq nil nil key pred nil start end count)) (defun remove-if-not (pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::universal-remove nil seq nil nil key nil pred start end count)) (defun delete (item seq &key (start 0) (end (length seq)) (test #'eq) (test-not nil) (count 1000000) (key #'identity)) (system::raw-delete item seq test test-not key nil nil start end count)) (defun delete-if (pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::raw-delete nil seq nil nil key pred nil start end count)) (defun delete-if-not (pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::raw-delete nil seq nil nil key nil pred start end count)) (defun substitute (newitem olditem seq &key (start 0) (end (length seq)) (test #'eq) (test-not nil) (count 1000000) (key #'identity)) (system::raw-substitute newitem olditem seq test test-not key nil nil start end count)) (defun substitute-if (newitem pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::raw-substitute newitem nil seq nil nil key pred nil start end count)) (defun substitute-if-not (newitem pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::raw-substitute newitem nil seq nil nil key nil pred start end count)) (defun nsubstitute (newitem olditem seq &key (start 0) (end (length seq)) (test #'eq) (test-not nil) (count 1000000) (key #'identity)) (system::raw-nsubstitute newitem olditem seq test test-not key nil nil start end count)) (defun nsubstitute-if (newitem pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::raw-nsubstitute newitem nil seq nil nil key pred nil start end count)) (defun nsubstitute-if-not (newitem pred seq &key (start 0) (end (length seq)) (count 1000000) (key #'identity)) (system::raw-nsubstitute newitem nil seq nil nil key nil pred start end count)) (defun unique (l) (cond ((atom (cdr l)) l) ((memq (car l) (cdr l)) (unique (cdr l))) (t (cons (car l) (unique (cdr l)))))) (defun remove-duplicates (seq &key (test #'eq) (test-not) (key #'identity) (start 0) (end 1000000)) (system::raw-remove-duplicates seq test test-not key start end)) (defun extream (seq test &optional (key #'identity)) (if (null seq) nil (let* ((ext (elt seq 0)) (p (funcall key ext)) x) (if (consp seq) (dolist (v (cdr seq)) (when (funcall test (funcall key v) p) (setq ext v p (funcall key ext))) ) (dotimes (i (length seq)) (when (funcall test (funcall key (setq x (aref seq i))) p) (setq ext x p (funcall key ext)))) ) ext)) ) ) ;eval-when ;;; ;;; equivalent pairs from WINSTON ;;; #| (eval-when (load eval) (defun coalesce (pairs) (coalesce-aux pairs nil)) (defun coalesce-aux (pairs classes) (cond ((null pairs) classes) (t (coalesce-aux (cdr pairs) (absorb (car pairs) classes))))) (defun stick-in (new classes) (cond ((member new (car classes)) classes) (t (cons (cons new (car classes)) (cdr classes))))) (defun absorb (pair classes) (cond ((null classes) (list pair)) ((member (car pair) (car classes)) (stick-in (cadr pair) classes)) ((member (cadr pair) (car classes)) (stick-in (car pair) classes)) (t (cons (car classes) (absorb pair (cdr classes)))))) ) ;eval-when ; end of more list functions |# ;;; ;;; LEO functions ;;; (eval-when (load eval) (defmacro send-super-lexpr (selector &rest msgs) (declare (type metaclass class)) `(apply #'send-message self (class . super) ,selector . ,msgs) ) (defmacro send-super* (&rest msgs) (declare (type metaclass class)) `(apply #'send-message self (class . super) . ,msgs) ) (defmacro send-lexpr (target selector &rest msgs) `(apply #'send ,target ,selector . ,msgs) ) (defmacro send* (&rest msgs) `(apply #'send . ,msgs) ) (defmacro send-super (selector &rest msgs) (declare (type metaclass class)) `(send-message self (class . super) ,selector ,@msgs)) (defun send-all (receivers &rest mesg) (mapcar #'(lambda (r) (apply 'send r mesg)) receivers)) (defun resend (obj mesg) (eval (cons 'send (cons obj mesg)))) (defmacro instance (cls &rest message) (if message (let ((v (gensym "INST"))) `(let ((,v (instantiate ,cls))) (send ,v ,@message) ,v)) `(instantiate ,cls))) (defmacro instance* (cls &rest message) (if message (let ((v (gensym "INST"))) `(let ((,v (instantiate ,cls))) (send* ,v ,@message) ,v)) `(instantiate ,cls))) (defun make-instance (klass &rest args) (let ((inst (instantiate klass))) (while args (setslot inst klass (string (pop args)) (pop args))) inst)) (defmacro defclassmethod (classname &rest methods) `(defmethod ,(metaclass-name (class (symbol-value classname))) . ,methods)) (defun delete-method (classobj methodname) (setf (metaclass-methods classobj) (delete methodname (metaclass-methods classobj) :key #'car)) (system::method-cache t)) ;;; ;;; defclass macro (T.Matsui 1988-Jun) ;;; (defun make-class (name &key (super object) (include object) (printer nil) (constructor nil) (predicate nil) (copier nil) ((:metaclass metaklass) nil) (element-type nil) (size -1) ((:slots varlist) nil) (documentation nil)) (if (symbolp super) (setq super (symbol-value super))) (let ((classobj (if (boundp name) (symbol-value name))) (variables) (types) (forwards) (etype) (index 0) (accessor) (p)) (cond ((null (classp classobj)) (cond (metaklass) ((classp metaklass)) (super (setq metaklass (class super))) (t (setq metaklass (symbol-value 'metaclass)))) (setq classobj (instantiate metaklass))) (t (setq metaklass (class classobj)))) (setq variables (nreverse (coerce (super . vars) cons)) types (nreverse (coerce (super . types) cons)) forwards (nreverse (coerce (super . forwards) cons))) (dolist (v varlist) (cond ((consp v) (if (member (car v) variables) (error "duplicated object variable name")) (push (car v) variables) (setq p (position :type v)) (push (if p (elt v (1+ p)) t) types) (setq p (position :forward v)) (push (if p (elt v (1+ p)) nil) forwards)) ((symbolp v) (if (member v variables) (error "duplicated object variable name")) (push v variables) (push t types) (push nil forwards)) (t (error "variable name expected for :slots")))) (setq variables (coerce (nreverse variables) vector) types (coerce (nreverse types) vector) forwards (coerce (nreverse forwards) vector)) (setq etype (cdr (assq element-type '((:BIT . 1) (:CHAR . 2) (:BYTE . 3) (:INTEGER . 4) (:FLOAT . 5) (:FOREIGN . 6))))) (if (null etype) (setq etype (if (subclassp metaklass vectorclass) (vectorclass-element-type super) 0))) (setq (classobj . name) name (classobj . vars) variables (classobj . types) types (classobj . forwards) forwards (classobj . super) super) (if (subclassp metaklass vectorclass) (setq (classobj . element-type) etype (classobj . size) size)) (if (null (classobj . cix)) (enter-class classobj)) ;;;??? ;;; (proclaim (list 'special name)) ;; (set name classobj) ;; (send name :global classobj) (putprop name documentation :class-documentation) ;; define slot access functions and setf methods for all variables (setq variables (coerce variables cons)) (dolist (v variables) (setq accessor (intern (concatenate string (string name) "-" (string v)))) (setf (symbol-function accessor) `(macro (obj) (list 'slot obj ',name ,index))) (incf index)) classobj )) (defmacro defstruct (name &rest slots) `(progn (send ',name :global (make-class ',name :slots ',slots)) ',name)) (defmacro defclass (name &key slots (super 'object) (size -1) ((:metaclass metaklass) nil) element-type documentation (doc documentation)) `(progn (send ',name :global (make-class ',name :super ,super :slots ',slots :metaclass ,metaklass :element-type ,element-type :size ,size :documentation ,doc) ) ',name)) ;;; ;;; READTABLES ;;; (eval-when (load eval) (defun readtablep (x) (derivedp x readtable)) (defun copy-readtable (&optional (from *readtable*) (to nil)) (when (null from) (setq from *default-readtable*)) (when (null to) (setq to (instantiate readtable)) (setf (readtable-syntax to) (instantiate string 256) (readtable-macro to) (instantiate vector 256) (readtable-dispatch-macro to) (instantiate vector 256))) (if (or (null (readtablep from)) (null (readtablep to))) (error "readtable expected")) (replace (readtable-syntax to) (readtable-syntax from)) (replace (readtable-macro to) (readtable-macro from)) (replace (readtable-dispatch-macro to) (readtable-dispatch-macro from)) (setf (readtable-case to) (readtable-case from)) to) (defun set-syntax-from-char (to-char from-char &optional (to-readtable *readtable*) (from-readtable *default-readtable*)) (let (syn) (setq syn (aref (readtable-syntax from-readtable) from-char)) (aset (readtable-syntax to-readtable) to-char syn) (if (or (eq syn 7) (eq syn 8)) (aset (readtable-macro to-readtable) to-char (aref (readtable-macro from-readtable) from-char))) syn)) ) ;; ;; predicates ;; (eval-when (load eval) (defun keywordp (sym) (declare (type symbol sym)) (and (symbolp sym) (eq (sym . homepkg) *keyword-package*))) (defun constantp (obj) (declare (type symbol obj)) (if (symbolp obj) (if (or (keywordp obj) (eq (obj . vtype) 0)) t nil) (if (listp obj) (if (eq (car obj) 'quote) t nil) (if (atom obj) t nil)))) (defun functionp (obj) (cond ((numberp obj) nil) ((listp obj) (if (or (memq (car obj) '(lambda lambda-closure))) t nil)) ((derivedp obj compiled-code) (eq (compiled-code-type obj) 0)) ((and (symbolp obj) (fboundp obj)) (functionp (symbol-function obj))) (t nil))) (defun vector-class-p (p) (derivedp p vectorclass)) (defun compiled-function-p (x) (derivedp x compiled-code)) (defun input-stream-p (obj) (declare (stream obj)) (or (and (derivedp obj stream) (eq (obj . direction) :input)) (derivedp obj io-stream))) (defun output-stream-p (obj) (declare (stream obj)) (or (and (derivedp obj stream) (eq (obj . direction) :output)) (derivedp obj io-stream))) (defun io-stream-p (obj) (derivedp obj io-stream)) (defun special-form-p (s) (and (symbolp s) (fboundp s) (setq s (symbol-function s)) (compiled-function-p s) (eq (s . type) 2))) (defun macro-function (s) (and (symbolp s) (fboundp s) (setq s (symbol-function s)) (if (and (compiled-function-p s) (eq (s . type) 1)) s (if (and (listp s) (eq (car s) 'macro)) s nil) ))) (defun zerop (n) (= n 0)) (defun plusp (n) (> n 0)) (defun minusp (n) (< n 0)) (defun oddp (n) (logbitp 0 n)) (defun evenp (n) (not (logbitp 0 n))) (defun /= (n1 n2) (not (= n1 n2))) (defun logandc1 (x y) (logand (lognot x) y)) (defun logandc2 (x y) (logand x (lognot y))) (defmacro ecase (&rest x) (cons 'case x)) (defun every (pred arg &rest more-args) (cond ((and (null more-args) (listp arg)) (while arg (unless (funcall pred (pop arg)) (return-from every nil)))) (t (setq arg (cons arg more-args)) (dotimes (i (length (car arg))) (unless (apply pred (mapcar #'(lambda (x) (elt x i)) arg)) (return-from every nil))))) t) (defun some (pred arg &rest more-args &aux result) (setq arg (cons arg more-args)) (dotimes (i (length (car arg))) (if (setq result (apply pred (mapcar #'(lambda (x) (elt x i)) arg))) (return-from some result))) nil) ) (eval-when (load eval) (defun reduce (func seq &key (start 0) (end (length seq)) from-end initial-value) (let ((length (- end start))) (when from-end (setq seq (reverse seq))) (cond ((and (= length 1) (null initial-value)) (elt seq start)) ((= length 0) (if initial-value initial-value (funcall func))) (t (unless initial-value (setq initial-value (funcall func (elt seq start) (elt seq (inc start)))) (dec length 2) (inc start)) (dotimes (i length) (setq initial-value (funcall func initial-value (elt seq (+ start i))))) initial-value)))) (defun merge-list (list1 list2 pred key &aux result p1 e1 e2 pp1 pp2) (while (and list2 (not (funcall pred (funcall key (car list1)) (funcall key (car list2))))) (push (pop list2) result)) (setq result (nreverse result)) (setq p1 list1) (while (and list2 (cdr p1)) (setq e2 (funcall key (car list2))) (while (and p1 (funcall pred (funcall key (cadr p1)) e2)) (pop p1)) (when p1 (setf pp1 (cdr p1) pp2 (cdr list2) (cdr p1) list2 (cdr list2) pp1 p1 list2 list2 pp2)) ) (nconc result list1 list2)) (defun merge (result-class seq1 seq2 pred &key (key #'identity)) (if (and (eq result-class cons) (listp seq1) (listp seq2)) (merge-list seq1 seq2 pred key) (let* ((l1 (length seq1)) (l2 (length seq2)) (l (+ l1 l2)) (result (make-sequence result-class l)) (i1 0) (i2 0) (j 0) (e1) (e2) (e)) (while (< j l) (cond ((>= i1 l1) (setq e (elt seq2 i2)) (inc i2)) ((>= i2 l2) (setq e (elt seq1 i1)) (inc i1)) (t (setq e1 (elt seq1 i1) e2 (elt seq2 i2)) (if (funcall pred (funcall key e1) (funcall key e2)) (progn (inc i1) (setq e e1)) (progn (inc i2) (setq e e2))))) (setf (elt result j) e) (inc j)) result))) ) ;; ;; arithmetics aux ;; (defun expt (a x) (cond ((and (integerp x) (>= x 0)) (if (zerop x) 1 (let ((b a) (y 1) (ix (1- x))) (declare (integer y ix)) (while (> ix 0) (cond ((> ix y) (setq b (* b b) ix (- ix y) y (ash y 1))) (t (setq b (* b a) ix (1- ix))))) b))) (t (exp (* x (log a)))))) (defun signum (x) (if (zerop x) x (/ x (abs x)))) (defun rad2deg (rad) (/ (* 360.0 rad) 2pi)) (defun deg2rad (deg) (/ (* 2pi deg) 360.0)) ) ;;;; (C) Copyright Taiichi Yuasa and Masami Hagiya, 1984. All rights reserved. ;;;; ;;;; setf routines ;;;; Modified by T.Matsui to be run on euslisp ;;;; 1988-Jun-27 ;;; DEFSETF macro. (defmacro defsetf (access-fn &rest rest) (cond ((and (car rest) (or (symbolp (car rest)) (functionp (car rest)))) `(progn (putprop ',access-fn ',(car rest) 'setf-update-fn) (remprop ',access-fn 'setf-lambda) (remprop ',access-fn 'setf-method) (putprop ',access-fn ,(when (not (endp (cdr rest))) (unless (stringp (cadr rest)) (error "A doc-string expected.")) (unless (endp (cddr rest)) (error "Extra arguments.")) (cadr rest)) 'setf-documentation) ',access-fn)) (t (unless (= (list-length (cadr rest)) 1) (error "(store-variable) expected.")) `(progn (putprop ',access-fn ',rest 'setf-lambda) (remprop ',access-fn 'setf-update-fn) (remprop ',access-fn 'setf-method) ; (putprop ',access-fn ; ,(find-documentation (cddr rest)) ; 'setf-documentation) ',access-fn)))) ;;; DEFINE-SETF-METHOD macro. (defmacro define-setf-method (access-fn &rest rest) `(progn (putprop ',access-fn #'(lambda ,@rest) 'setf-method) (remprop ',access-fn 'setf-lambda) (remprop ',access-fn 'setf-update-fn) ; (putprop ',access-fn ; ,(find-documentation (cdr rest)) ; 'setf-documentation) ',access-fn)) ;;; The expansion function for SETF. (defun setf-expand-1 (place newvalue) (let (g) (setq place (macroexpand place)) (cond ((and (consp place) (eq (car place) 'the)) (setf-expand-1 (caddr place) `(the ,(cadr place) ,newvalue))) ((symbolp place) `(setq ,place ,newvalue)) ((and (symbolp (car place)) (setq g (get (car place) 'setf-update-fn))) `(,g ,@(cdr place) ,newvalue)) ((and (symbolp (car place)) (setq g (get (car place) 'structure-access)) (get (car place) 'setf-lambda) (not (eq (car g) 'list)) (not (eq (car g) 'vector))) `(system::structure-set ,(cadr place) ',(car g) ,(cdr g) ,newvalue)) ((macro-function (car place)) (setf-expand-1 (macroexpand place) newvalue)) ((setq g (get (car place) 'setf-lambda)) (apply (append '(lambda) (list (append (cadr g) (car g))) (cddr g)) newvalue (cdr place))) ; ((get (car place) 'setf-method) ; (apply (get (car form) 'setf-method) (cdr place))) (t (error "SETF?"))))) (defun setf-expand (l) (cond ((endp l) nil) ((endp (cdr l)) (error "~S is an illegal SETF form." l)) (t (cons (setf-expand-1 (car l) (cadr l)) (setf-expand (cddr l)))))) ;;; SETF macro. (defmacro setf (&rest rest) (cond ((endp rest) nil) ((endp (cdr rest)) (error "~S is an illegal SETF form." rest)) ((endp (cddr rest)) (setf-expand-1 (car rest) (cadr rest))) (t (cons 'progn (setf-expand rest))))) ;(defmacro incf (form &optional (d 1)) ; `(setf ,form (+ ,form ,d))) ;(defmacro decf (form &optional (d 1)) ; `(setf ,form (- ,form ,d))) ;;; ;;; MULTI-VALUE simulation macros ;;; (defmacro multiple-value-bind (vlist init &rest forms) (let* ((inits (gensym "MULT")) (vilist) (count 0)) (dolist (v vlist) (push (list v `(elt ,inits ,count)) vilist) (inc count)) `(let* ((,inits ,init) . ,vilist) . ,forms))) (defmacro multiple-value-setq (vlist form) (let ((i 0) (tempvar (gensym "MULT")) setq-forms) (dolist (v vlist) (push (list (second (assoc i '((0 first) (1 second) (2 third) (3 fourth)(4 fifth) (5 sixth) (6 seventh)))) tempvar) setq-forms) (push v setq-forms) (incf i)) `(let ((,tempvar ,form)) (setq . ,setq-forms)))) (alias 'values 'list) #| (defun quick-sort (sequence start end predicate key &aux (j 0) (k 0) exch) (declare (fixnum start end j k)) (when (<= end (the fixnum (1+ start))) (return-from quick-sort sequence)) (setq j start) (setq k (1- end)) (do ((d (aref sequence start))) ((> j k)) (do () ((or (> j k) (funcall predicate (funcall key (aref sequence k)) (funcall key d)))) (decf k)) (when (< k start) (quick-sort sequence (1+ start) end predicate key) (return-from quick-sort sequence)) (do () ((or (> j k) (not (funcall predicate (funcall key (aref sequence j)) (funcall key d))))) (incf j)) (when (> j k) (return)) (setf exch (aref sequence k) (aref sequence k) (aref sequence j) (aref sequence j) exch) (incf j) (decf k)) (quick-sort sequence start j predicate key) (quick-sort sequence j end predicate key) sequence) (defun qsort (seq test &optional (key #'identity) &aux (vec nil) (s nil)) (cond ((null seq) nil) ((listp seq) (setq vec (coerce seq vector)) (quick-sort vec 0 (length seq) test key) (setq s seq) (dotimes (i (length vec)) (rplaca s (aref vec i)) (setq s (cdr s))) seq) ((vectorp seq) (quick-sort seq 0 (length seq) test key) seq) )) |# #| (eval-when (load eval) (defmacro pop (s) `(prog1 (car ,s) (setf ,s (cdr ,s)))) (defmacro push (item place) `(setf ,place (cons ,item ,place))) ) |# ================================================ FILE: samples/Common Lisp/config.sexp ================================================ ((exe_name hello) (link_order (world hello))) ================================================ FILE: samples/Common Lisp/hello.lisp ================================================ (DEFUN HELLO () (PRINT 'HELLO)) ================================================ FILE: samples/Common Lisp/macros-advanced.cl ================================================ ;; @file macros-advanced.cl ;; ;; @breif Advanced macro practices - defining your own macros ;; ;; Macro definition skeleton: ;; (defmacro name (parameter*) ;; "Optional documentation string" ;; body-form*) ;; ;; Note that backquote expression is most often used in the `body-form` ;; ; `primep` test a number for prime (defun primep (n) "test a number for prime" (if (< n 2) (return-from primep)) (do ((i 2 (1+ i)) (p t (not (zerop (mod n i))))) ((> i (sqrt n)) p) (when (not p) (return)))) ; `next-prime` return the next prime bigger than the specified number (defun next-prime (n) "return the next prime bigger than the speicified number" (do ((i (1+ n) (1+ i))) ((primep i) i))) ; ; The recommended procedures to writting a new macro are as follows: ; 1. Write a sample call to the macro and the code it should expand into (do-primes (p 0 19) (format t "~d " p)) ; Expected expanded codes (do ((p (next-prime (- 0 1)) (next-prime p))) ((> p 19)) (format t "~d " p)) ; 2. Write code that generate the hardwritten expansion from the arguments in ; the sample call (defmacro do-primes (var-and-range &rest body) (let ((var (first var-and-range)) (start (second var-and-range)) (end (third var-and-range))) `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))) ((> ,var ,end)) ,@body))) ; 2-1. More concise implementations with the 'parameter list destructuring' and ; '&body' synonym, it also emits more friendly messages on incorrent input. (defmacro do-primes ((var start end) &body body) `(do ((,var (next-prime (- ,start 1)) (next-prime ,var))) ((> ,var ,end)) ,@body)) ; 2-2. Test the result of macro expansion with the `macroexpand-1` function (macroexpand-1 '(do-primes (p 0 19) (format t "~d " p))) ; 3. Make sure the macro abstraction does not "leak" (defmacro do-primes ((var start end) &body body) (let ((end-value-name (gensym))) `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)) (,end-value-name ,end)) ((> ,var ,end-value-name)) ,@body))) ; 3-1. Rules to observe to avoid common and possible leaks ; a. include any subforms in the expansion in positions that will be evaluated ; in the same order as the subforms appear in the macro call ; b. make sure subforms are evaluated only once by creating a variable in the ; expansion to hold the value of evaluating the argument form, and then ; using that variable anywhere else the value is needed in the expansion ; c. use `gensym` at macro expansion time to create variable names used in the ; expansion ; ; Appendix I. Macro-writting macros, 'with-gensyms', to guranttee that rule c ; gets observed. ; Example usage of `with-gensyms` (defmacro do-primes-a ((var start end) &body body) "do-primes implementation with macro-writting macro 'with-gensyms'" (with-gensyms (end-value-name) `(do ((,var (next-prime (- ,start 1)) (next-prime ,var)) (,end-value-name ,end)) ((> ,var ,end-value-name)) ,@body))) ; Define the macro, note how comma is used to interpolate the value of the loop ; expression (defmacro with-gensyms ((&rest names) &body body) `(let ,(loop for n in names collect `(,n (gensym))) ,@body) ) ================================================ FILE: samples/Common Lisp/motor-inferencia.cl ================================================ #| ESCUELA POLITECNICA SUPERIOR - UNIVERSIDAD AUTONOMA DE MADRID INTELIGENCIA ARTIFICIAL Motor de inferencia Basado en parte en "Paradigms of AI Programming: Case Studies in Common Lisp", de Peter Norvig, 1992 |# ;;;;;;;;;;;;;;;;;;;;; ;;;; Global variables ;;;;;;;;;;;;;;;;;;;;; (defvar *hypothesis-list*) (defvar *rule-list*) (defvar *fact-list*) ;;;;;;;;;;;;;;;;;;;;; ;;;; Constants ;;;;;;;;;;;;;;;;;;;;; (defconstant +fail+ nil "Indicates unification failure") (defconstant +no-bindings+ '((nil)) "Indicates unification success, with no variables.") (defconstant *mundo-abierto* nil) ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Functions for the user ;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Resets *fact-list* to NIL (defun erase-facts () (setq *fact-list* nil)) (defun set-hypothesis-list (h) (setq *hypothesis-list* h)) ;; Returns a list of solutions, each one satisfying all the hypothesis contained ;; in *hypothesis-list* (defun motor-inferencia () (consulta *hypothesis-list*)) ;;;;;;;;;;;;;;;;;;;;;;;; ;;;; Auxiliary functions ;;;;;;;;;;;;;;;;;;;;;;;; #|____________________________________________________________________________ FUNCTION: CONSULTA COMMENTS: CONSULTA receives a list of hypothesis (variable ), and returns a list of binding lists (each binding list being a solution). EXAMPLES: hypotheses is: ((brothers ?x ?y) (neighbours juan ?x)). That is, we are searching the brothers of the possible neighbors of Juan. The function can return in this case: (((?x . sergio) (?y . javier)) ((?x . julian) (?y . mario)) ((?x . julian) (?y . pedro))). That is, the neighbors of Juan (Sergio and Julian) have 3 brothers in total(Javier, Mario, Pedro) ____________________________________________________________________________|# (defun consulta (hypotheses) (if (null hypotheses) (list +no-bindings+) (mapcan #'(lambda (b) (mapcar #'(lambda (x) (une-bindings-con-bindings b x)) (consulta (subst-bindings b (rest hypotheses))))) (find-hypothesis-value (first hypotheses))))) #|____________________________________________________________________________ FUNCTION: FIND-HYPOTHESIS-VALUE COMMENTS: This function manages the query a single query (only one hypothesis) given a binding list. It tries (in the following order) to: - Answer the query from *fact-list* - Answer the query from the rules in *rule-list* - Ask the user The function returns a list of solutions (list of binding lists). EXAMPLES: If hypothesis is (brothers ?x ?y) and the function returns: (((?x . sergio) (?y . javier)) ((?x . julian) (?y . maria)) ((?x . alberto) (?y . pedro))). Means that Sergio and Javier and brothers, Julian and Mario are brothers, and Alberto and Pedro are brothers. ____________________________________________________________________________|# (defun find-hypothesis-value (hypothesis) (let (rules) (cond ((equality? hypothesis) (value-from-equality hypothesis)) ((value-from-facts hypothesis)) ((setq good-rules (find-rules hypothesis)) (value-from-rules hypothesis good-rules)) (t (ask-user hypothesis))))) ; une-bindings-con-bindings takes two binding lists and returns a binding list ; Assumes that b1 and b2 are not +fail+ (defun une-bindings-con-bindings (b1 b2) (cond ((equal b1 +no-bindings+) b2) ((equal b2 +no-bindings+) b1) (T (append b1 b2)))) #|____________________________________________________________________________ FUNCTION: VALUE-FROM-FACTS COMMENTS: Returns all the solutions of obtained directly from *fact-list* EXAMPLES: > (setf *fact-list* '((man luis) (man pedro)(woman mart)(man daniel)(woman laura))) > (value-from-facts '(man ?x)) returns: (((?X . LUIS)) ((?X . PEDRO)) ((?X . DANIEL))) ____________________________________________________________________________|# (defun value-from-facts (hypothesis) (mapcan #'(lambda(x) (let ((aux (unify hypothesis x))) (when aux (list aux)))) *fact-list*)) #|____________________________________________________________________________ FUNCTION: FIND-RULES COMMENTS: Returns the rules in *rule-list* whose THENs unify with the term given in The variables in the rules that satisfy this requirement are renamed. EXAMPLES: > (setq *rule-list* '((R1 (pertenece ?E (?E . ?_))) (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs))))) Then: > (FIND-RULES (PERTENECE 1 (2 5))) returns: ((R2 (PERTENECE ?E.1 (?_ . ?XS.2)) :- ((PERTENECE ?E.1 ?XS.2)))) That is, only the THEN of rule R2 unify with However, > (FIND-RULES (PERTENECE 1 (1 6 7))) returns: ((R1 (PERTENECE ?E.6 (?E.6 . ?_))) (R2 (PERTENECE ?E.7 (?_ . ?XS.8)) :- ((PERTENECE ?E.7 ?XS.8)))) So the THEN of both rules unify with ____________________________________________________________________________|# (defun find-rules (hypothesis) (mapcan #'(lambda(b) (let ((renamed-rule (rename-variables b))) (when (in-then? hypothesis renamed-rule) (list renamed-rule)))) *rule-list*)) (defun in-then? (hypothesis rule) (unless (null (rule-then rule)) (not (equal +fail+ (unify hypothesis (rule-then rule)))))) #|____________________________________________________________________________ FUNCTION: VALUE-FROM-RULES COMMENTS: Returns all the solutions to found using all the rules given in the list . Note that a single rule can have multiple solutions. ____________________________________________________________________________|# (defun value-from-rules (hypothesis rules) (mapcan #'(lambda (r) (eval-rule hypothesis r)) rules)) (defun limpia-vinculos (termino bindings) (unify termino (subst-bindings bindings termino))) #|____________________________________________________________________________ FUNCTION: EVAL-RULE COMMENTS: Returns all the solutions found using the rule given as input argument. EXAMPLES: > (setq *rule-list* '((R1 (pertenece ?E (?E . ?_))) (R2 (pertenece ?E (?_ . ?Xs)) :- ((pertenece ?E ?Xs))))) Then: > (EVAL-RULE (PERTENECE 1 (1 6 7)) (R1 (PERTENECE ?E.42 (?E.42 . ?_)))) returns: (((NIL))) That is, the query (PERTENECE 1 (1 6 7)) can be proven from the given rule, and no binding in the variables in the query is necessary (in fact, the query has no variables). On the other hand: > (EVAL-RULE (PERTENECE 1 (7)) (R2 (PERTENECE ?E.49 (?_ . ?XS.50)) :- ((PERTENECE ?E.49 ?XS.50)))) returns: NIL That is, the query can not be proven from the rule R2. ____________________________________________________________________________|# (defun eval-rule (hypothesis rule) (let ((bindings-then (unify (rule-then rule) hypothesis))) (unless (equal +fail+ bindings-then) (if (rule-ifs rule) (mapcar #'(lambda(b) (limpia-vinculos hypothesis (append bindings-then b))) (consulta (subst-bindings bindings-then (rule-ifs rule)))) (list (limpia-vinculos hypothesis bindings-then)))))) (defun ask-user (hypothesis) (let ((question hypothesis)) (cond ((variables-in question) +fail+) ((not-in-fact-list? question) +fail+) (*mundo-abierto* (format t "~%Es cierto el hecho ~S? (T/nil)" question) (cond ((read) (add-fact question) +no-bindings+) (T (add-fact (list 'NOT question)) +fail+))) (T +fail+)))) ; value-from-equality: (defun value-from-equality (hypothesis) (let ((new-bindings (unify (second hypothesis) (third hypothesis)))) (if (not (equal +fail+ new-bindings)) (list new-bindings)))) #|____________________________________________________________________________ FUNCTION: UNIFY COMMENTS: Finds the most general unifier of two input expressions, taking into account the bindings specified in the input In case the two expressions can unify, the function returns the total bindings necessary for that unification. Otherwise, returns +fail+ EXAMPLES: > (unify '1 '1) ((NIL)) ;; which is the constant +no-bindings+ > (unify 1 '2) nil ;; which is the constant +fail+ > (unify '?x 1) ((?x . 1)) > (unify '(1 1) ?x) ((? x 1 1)) > (unify '?_ '?x) ((NIL)) > (unify '(p ?x 1 2) '(p ?y ?_ ?_)) ((?x . ?y)) > (unify '(?a . ?_) '(1 2 3)) ((?a . 1)) > (unify '(?_ ?_) '(1 2)) ((nil)) > (unify '(?a . ?b) '(1 2 3)) ((?b 2 3) (?a . 1)) > (unify '(?a . ?b) '(?v . ?d)) ((?b . ?d) (?a . ?v)) > (unify '(?eval (+ 1 1)) '1) nil > (unify '(?eval (+ 1 1)) '2) (nil)) ____________________________________________________________________________|# (defun unify (x y &optional (bindings +no-bindings+)) "See if x and y match with given bindings. If they do, return a binding list that would make them equal [p 303]." (cond ((eq bindings +fail+) +fail+) ((eql x y) bindings) ((eval? x) (unify-eval x y bindings)) ((eval? y) (unify-eval y x bindings)) ((variable? x) (unify-var x y bindings)) ((variable? y) (unify-var y x bindings)) ((and (consp x) (consp y)) (unify (rest x) (rest y) (unify (first x) (first y) bindings))) (t +fail+))) ;; rename-variables: renombra ?X por ?X.1, ?Y por ?Y.2 etc. salvo ?_ que no se renombra (defun rename-variables (x) "Replace all variables in x with new ones. Excepto ?_" (sublis (mapcar #'(lambda (var) (if (anonymous-var? var) (make-binding var var) (make-binding var (new-variable var)))) (variables-in x)) x)) ;;;; Auxiliary Functions (defun unify-var (var x bindings) "Unify var with x, using (and maybe extending) bindings [p 303]." (cond ((or (anonymous-var? var)(anonymous-var? x)) bindings) ((get-binding var bindings) (unify (lookup var bindings) x bindings)) ((and (variable? x) (get-binding x bindings)) (unify var (lookup x bindings) bindings)) ((occurs-in? var x bindings) +fail+) (t (extend-bindings var x bindings)))) (defun variable? (x) "Is x a variable (a symbol starting with ?)?" (and (symbolp x) (eql (char (symbol-name x) 0) #\?))) (defun get-binding (var bindings) "Find a (variable . value) pair in a binding list." (assoc var bindings)) (defun binding-var (binding) "Get the variable part of a single binding." (car binding)) (defun binding-val (binding) "Get the value part of a single binding." (cdr binding)) (defun make-binding (var val) (cons var val)) (defun lookup (var bindings) "Get the value part (for var) from a binding list." (binding-val (get-binding var bindings))) (defun extend-bindings (var val bindings) "Add a (var . value) pair to a binding list." (append (unless (eq bindings +no-bindings+) bindings) (list (make-binding var val)))) (defun occurs-in? (var x bindings) "Does var occur anywhere inside x?" (cond ((eq var x) t) ((and (variable? x) (get-binding x bindings)) (occurs-in? var (lookup x bindings) bindings)) ((consp x) (or (occurs-in? var (first x) bindings) (occurs-in? var (rest x) bindings))) (t nil))) (defun subst-bindings (bindings x) "Substitute the value of variables in bindings into x, taking recursively bound variables into account." (cond ((eq bindings +fail+) +fail+) ((eq bindings +no-bindings+) x) ((and (listp x) (eq '?eval (car x))) (subst-bindings-quote bindings x)) ((and (variable? x) (get-binding x bindings)) (subst-bindings bindings (lookup x bindings))) ((atom x) x) (t (cons (subst-bindings bindings (car x)) ;; s/reuse-cons/cons (subst-bindings bindings (cdr x)))))) (defun unifier (x y) "Return something that unifies with both x and y (or fail)." (subst-bindings (unify x y) x)) (defun variables-in (exp) "Return a list of all the variables in EXP." (unique-find-anywhere-if #'variable? exp)) (defun unique-find-anywhere-if (predicate tree &optional found-so-far) "Return a list of leaves of tree satisfying predicate, with duplicates removed." (if (atom tree) (if (funcall predicate tree) (pushnew tree found-so-far) found-so-far) (unique-find-anywhere-if predicate (first tree) (unique-find-anywhere-if predicate (rest tree) found-so-far)))) (defun find-anywhere-if (predicate tree) "Does predicate apply to any atom in the tree?" (if (atom tree) (funcall predicate tree) (or (find-anywhere-if predicate (first tree)) (find-anywhere-if predicate (rest tree))))) (defun new-variable (var) "Create a new variable. Assumes user never types variables of form ?X.9" (gentemp (format nil "~S." var))) ; (gentemp "?") ) ;;; (defun anonymous-var? (x) (eq x '?_)) (defun subst-bindings-quote (bindings x) "Substitute the value of variables in bindings into x, taking recursively bound variables into account." (cond ((eq bindings +fail+) +fail+) ((eq bindings +no-bindings+) x) ((and (variable? x) (get-binding x bindings)) (if (variable? (lookup x bindings)) (subst-bindings-quote bindings (lookup x bindings)) (subst-bindings-quote bindings (list 'quote (lookup x bindings))) ) ) ((atom x) x) (t (cons (subst-bindings-quote bindings (car x)) ;; s/reuse-cons/cons (subst-bindings-quote bindings (cdr x)))))) (defun eval? (x) (and (consp x) (eq (first x) '?eval))) (defun unify-eval (x y bindings) (let ((exp (subst-bindings-quote bindings (second x)))) (if (variables-in exp) +fail+ (unify (eval exp) y bindings)))) (defun rule-ifs (rule) (fourth rule)) (defun rule-then (rule) (second rule)) (defun equality? (term) (and (consp term) (eql (first term) '?=))) (defun in-fact-list? (expresion) (some #'(lambda(x) (equal x expresion)) *fact-list*)) (defun not-in-fact-list? (expresion) (if (eq (car expresion) 'NOT) (in-fact-list? (second expresion)) (in-fact-list? (list 'NOT expresion)))) ;; add-fact: (defun add-fact (fact) (setq *fact-list* (cons fact *fact-list*))) (defun variable? (x) "Is x a variable (a symbol starting with ?) except ?eval and ?=" (and (not (equal x '?eval)) (not (equal x '?=)) (symbolp x) (eql (char (symbol-name x) 0) #\?))) ;; EOF ================================================ FILE: samples/Common Lisp/rss.sexp ================================================ (:TURTLE (:@PREFIX "rdf:" "") (:@PREFIX "owl:" "") (:@PREFIX "dc:" "") (:@PREFIX "xsd:" "") (:@PREFIX "rdfs:" "") (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1="") (:OBJECTS (:QNAME "rdfs:Class"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS information channel."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Channel")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "A short text description of the subject."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Description"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:description")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdfs:Class"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS image."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Image")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdfs:Class"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS item."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Item")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "Points to a list of rss:item elements that are members of the subject channel."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Items")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "The URL to which an HTML rendering of the subject will link."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Link"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:identifier")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "The text input field's (variable) name."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Name")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdfs:Class"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "An RSS text input."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Text Input")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "A descriptive title for the channel."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "Title"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:title")))) (:TRIPLES (:URIREF "") (:PREDICATE-OBJECT-LIST (:URIREF #1#) (:OBJECTS (:QNAME "rdf:Property"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:comment") (:OBJECTS (:STRING "The URL of the image to used in the 'src' attribute of the channel's image tag when rendered as HTML."))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:isDefinedBy") (:OBJECTS (:URIREF ""))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:label") (:OBJECTS (:STRING "URL"))) (:PREDICATE-OBJECT-LIST (:QNAME "rdfs:subPropertyOf") (:OBJECTS (:QNAME "dc:identifier"))))) ================================================ FILE: samples/Common Lisp/sample.lisp ================================================ ;;;; -*- lisp -*- (in-package :foo) ;;; Header comment. (defvar *foo*) (eval-when (:execute :compile-toplevel :load-toplevel) (defun add (x &optional y &key z) (declare (ignore z)) ;; Inline comment. (+ x (or y 1)))) #| Multi-line comment. |# (defmacro foo (x &body b) (if x `(1+ ,x) ;After-line comment. 42)) ================================================ FILE: samples/Common Lisp/sample.lsp ================================================ ;;;; -*- lisp -*- (in-package :foo) ;;; Header comment. (defvar *foo*) (eval-when (:execute :compile-toplevel :load-toplevel) (defun add (x &optional y &key z) (declare (ignore z)) ;; Inline comment. (+ x (or y 1)))) #| Multi-line comment. |# (defmacro foo (x &body b) (if x `(1+ ,x) ;After-line comment. 42)) ================================================ FILE: samples/Common Workflow Language/trunk-peak-score.cwl ================================================ #!/usr/bin/env cwl-runner # Originally from # https://github.com/Duke-GCB/GGR-cwl/blob/54e897263a702ff1074c8ac814b4bf7205d140dd/utils/trunk-peak-score.cwl # Released under the MIT License: # https://github.com/Duke-GCB/GGR-cwl/blob/54e897263a702ff1074c8ac814b4bf7205d140dd/LICENSE # Converted to CWL v1.0 syntax using # https://github.com/common-workflow-language/cwl-upgrader # and polished by Michael R. Crusoe # All modifications also released under the MIT License cwlVersion: v1.0 class: CommandLineTool doc: Trunk scores in ENCODE bed6+4 files hints: DockerRequirement: dockerPull: dukegcb/workflow-utils inputs: peaks: type: File sep: type: string default: \t outputs: trunked_scores_peaks: type: stdout baseCommand: awk arguments: - -F $(inputs.sep) - BEGIN{OFS=FS}$5>1000{$5=1000}{print} - $(inputs.peaks.path) stdout: $(inputs.peaks.nameroot).trunked_scores$(inputs.peaks.nameext) ================================================ FILE: samples/Component Pascal/Example.cp ================================================ MODULE ObxControls; (** project = "BlackBox" organization = "www.oberon.ch" contributors = "Oberon microsystems" version = "System/Rsrc/About" copyright = "System/Rsrc/About" license = "Docu/BB-License" changes = "" issues = "" **) IMPORT Dialog, Ports, Properties, Views; CONST beginner = 0; advanced = 1; expert = 2; guru = 3; (* user classes *) TYPE View = POINTER TO RECORD (Views.View) size: INTEGER (* border size in mm *) END; VAR data*: RECORD class*: INTEGER; (* current user class *) list*: Dialog.List; (* list of currently available sizes, derived from class *) width*: INTEGER (* width of next view to be opened. Derived from class, or entered through a text entry field *) END; predef: ARRAY 6 OF INTEGER; (* table of predefined sizes *) PROCEDURE SetList; BEGIN IF data.class = beginner THEN data.list.SetLen(1); data.list.SetItem(0, "default") ELSIF data.class = advanced THEN data.list.SetLen(4); data.list.SetItem(0, "default"); data.list.SetItem(1, "small"); data.list.SetItem(2, "medium"); data.list.SetItem(3, "large"); ELSE data.list.SetLen(6); data.list.SetItem(0, "default"); data.list.SetItem(1, "small"); data.list.SetItem(2, "medium"); data.list.SetItem(3, "large"); data.list.SetItem(4, "tiny"); data.list.SetItem(5, "huge"); END END SetList; (* View *) PROCEDURE (v: View) CopyFromSimpleView (source: Views.View); BEGIN v.size := source(View).size END CopyFromSimpleView; PROCEDURE (v: View) Restore (f: Views.Frame; l, t, r, b: INTEGER); BEGIN (* fill view with a red square of size v.size *) IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) f.DrawRect(0, 0, v.size, v.size, Ports.fill, Ports.red) END Restore; PROCEDURE (v: View) HandlePropMsg (VAR msg: Views.PropMessage); BEGIN WITH msg: Properties.SizePref DO IF v.size = 0 THEN v.size := predef[0] END; (* lazy initialization of size *) msg.w := v.size; msg.h := v.size (* tell environment about desired width and height *) ELSE (* ignore other messages *) END END HandlePropMsg; (* notifiers *) PROCEDURE ClassNotify* (op, from, to: INTEGER); BEGIN (* react to change in data.class *) IF op = Dialog.changed THEN IF (to = beginner) OR (to = advanced) & (data.list.index > 3) THEN (* if class is reduced, make sure that selection contains legal elements *) data.list.index := 0; data.width := predef[0]; (* modify interactor *) Dialog.Update(data) (* redraw controls where necessary *) END; SetList; Dialog.UpdateList(data.list) (* reconstruct list box contents *) END END ClassNotify; PROCEDURE ListNotify* (op, from, to: INTEGER); BEGIN (* reacto to change in data.list (index to was selected) *) IF op = Dialog.changed THEN data.width := predef[to]; (* modify interactor *) Dialog.Update(data) (* redraw controls where necessary *) END END ListNotify; (* guards *) PROCEDURE ListGuard* (VAR par: Dialog.Par); BEGIN (* disable list box for a beginner *) par.disabled := data.class = beginner END ListGuard; PROCEDURE WidthGuard* (VAR par: Dialog.Par); BEGIN (* make text entry field read-only if user is not guru *) par.readOnly := data.class # guru END WidthGuard; (* commands *) PROCEDURE Open*; VAR v: View; BEGIN NEW(v); (* create and initialize a new view *) v.size := data.width * Ports.mm; (* define view's size in function of class *) Views.OpenAux(v, "Example") (* open the view in a window *) END Open; BEGIN (* initialization of global variables *) predef[0] := 40; predef[1] := 30; predef[2] := 50; (* predefined sizes *) predef[3] := 70; predef[4] := 20; predef[5] := 100; data.class := beginner; (* default values *) data.list.index := 0; data.width := predef[0]; SetList END ObxControls. ================================================ FILE: samples/Component Pascal/Example2.cps ================================================ MODULE ObxFact; (** project = "BlackBox" organization = "www.oberon.ch" contributors = "Oberon microsystems" version = "System/Rsrc/About" copyright = "System/Rsrc/About" license = "Docu/BB-License" changes = "" issues = "" **) IMPORT Stores, Models, TextModels, TextControllers, Integers; PROCEDURE Read(r: TextModels.Reader; VAR x: Integers.Integer); VAR i, len, beg: INTEGER; ch: CHAR; buf: POINTER TO ARRAY OF CHAR; BEGIN r.ReadChar(ch); WHILE ~r.eot & (ch <= " ") DO r.ReadChar(ch) END; ASSERT(~r.eot & (((ch >= "0") & (ch <= "9")) OR (ch = "-"))); beg := r.Pos() - 1; len := 0; REPEAT INC(len); r.ReadChar(ch) UNTIL r.eot OR (ch < "0") OR (ch > "9"); NEW(buf, len + 1); i := 0; r.SetPos(beg); REPEAT r.ReadChar(buf[i]); INC(i) UNTIL i = len; buf[i] := 0X; Integers.ConvertFromString(buf^, x) END Read; PROCEDURE Write(w: TextModels.Writer; x: Integers.Integer); VAR i: INTEGER; BEGIN IF Integers.Sign(x) < 0 THEN w.WriteChar("-") END; i := Integers.Digits10Of(x); IF i # 0 THEN REPEAT DEC(i); w.WriteChar(Integers.ThisDigit10(x, i)) UNTIL i = 0 ELSE w.WriteChar("0") END END Write; PROCEDURE Compute*; VAR beg, end, i, n: INTEGER; ch: CHAR; s: Stores.Operation; r: TextModels.Reader; w: TextModels.Writer; attr: TextModels.Attributes; c: TextControllers.Controller; x: Integers.Integer; BEGIN c := TextControllers.Focus(); IF (c # NIL) & c.HasSelection() THEN c.GetSelection(beg, end); r := c.text.NewReader(NIL); r.SetPos(beg); r.ReadChar(ch); WHILE ~r.eot & (beg < end) & (ch <= " ") DO r.ReadChar(ch); INC(beg) END; IF ~r.eot & (beg < end) THEN r.ReadPrev; Read(r, x); end := r.Pos(); r.ReadPrev; attr :=r.attr; IF (Integers.Sign(x) > 0) & (Integers.Compare(x, Integers.Long(MAX(LONGINT))) <= 0) THEN n := SHORT(Integers.Short(x)); i := 2; x := Integers.Long(1); WHILE i <= n DO x := Integers.Product(x, Integers.Long(i)); INC(i) END; Models.BeginScript(c.text, "computation", s); c.text.Delete(beg, end); w := c.text.NewWriter(NIL); w.SetPos(beg); w.SetAttr(attr); Write(w, x); Models.EndScript(c.text, s) END END END END Compute; END ObxFact. ================================================ FILE: samples/Cooklang/advanced_recipe.cook ================================================ --- time required: 90 minutes --- ===== Nut roll ====== Add @sugar{1%tbsp} and @yeast{15%g} to the warm @milk{250%ml}. Mix well until the yeast is fully dissolved. > This recipe is reconstruction of my grandma's recipes, > I tried to reduce sugar amount though. Add @flour{5%tbsp} from the total amount and whisk the mixture into a batter-like consistency, similar to pancake batter. Cover with a #towel{} and place in a warm place for ~{30%minutes}. The dough should rise, and bubbles will form on the surface. Add @egg{1}, @sugar{100%g}, @vanilla sugar{1%packet}, and melted @butter{50%g} to the mixture. Whisk thoroughly. Gradually add the rest of the @flour{495%g} in two stages and knead the dough. Knead for ~{10-15%minutes}. Cover the dough and place it in a warm place for ~{1.5%hours} == Fillings == Grind the stuff. Mix them together. == Assembly == Divide the dough into two equal pieces. Dust the surface with flour and roll the dough into a rectangle about 0.5 cm thick. Generously spread the nut filling over the dough, distributing it evenly. Leave an empty space along the edges so the roll seals properly. Carefully roll the dough into a log, pressing it firmly to avoid air pockets. Place it on a baking sheet lined with parchment paper. Roll out the second piece of dough and form another roll in the same way. Cover the rolls with a towel and let them rest for 20 minutes. Then brush them with @egg yolk{1} and bake in a preheated oven at 170°C for ~{50-60%minutes}. ================================================ FILE: samples/Cooklang/simple_recipe.cook ================================================ --- quick: true servings: 4 prep time: 10 minutes cook time: 15 minutes --- Crack the @eggs{3} into a blender, then add the @plain flour{125%g}, @milk{250%ml} and @sea salt{1%pinch}, and blitz until smooth. Pour into a #bowl and leave to stand for ~{20%minutes}. Melt the butter in a large non-stick #frying pan{} on a medium heat, then tilt the pan so the butter coats the surface. Pour in 1 ladle of batter and tilt again, so that the batter spreads all over the base, then cook for 1 to 2 minutes, or until it starts to come away from the sides. Once golden underneath, flip the pancake over and cook for 1 further minute, or until cooked through. Serve straightaway, topping with @smoked salmon{} or your favorite topping. ================================================ FILE: samples/Cool/list.cl ================================================ (* This simple example of a list class is adapted from an example in the Cool distribution. *) class List { isNil() : Bool { true }; head() : Int { { abort(); 0; } }; tail() : List { { abort(); self; } }; cons(i : Int) : List { (new Cons).init(i, self) }; }; class Cons inherits List { car : Int; -- The element in this list cell cdr : List; -- The rest of the list isNil() : Bool { false }; head() : Int { car }; tail() : List { cdr }; init(i : Int, rest : List) : List { { car <- i; cdr <- rest; self; } }; }; ================================================ FILE: samples/Cool/sample.cl ================================================ (* Refer to Alex Aiken, "The Cool Reference Manual": http://theory.stanford.edu/~aiken/software/cool/cool-manual.pdf for language specification. *) -- Exhibit various language constructs class Sample { testCondition(x: Int): Bool { if x = 0 then false else if x < (1 + 2) * 3 then true else false fi fi }; testLoop(y: Int): Bool { while y > 0 loop { if not condition(y) then y <- y / 2 else y <- y - 1; } pool }; testAssign(z: Int): Bool { i : Int; i <- ~z; }; testCase(var: Sample): SELF_TYPE { io : IO <- new IO; case var of a : A => io.out_string("Class type is A\n"); b : B => io.out_string("Class type is B\n"); s : Sample => io.out_string("Class type is Sample\n"); o : Object => io.out_string("Class type is object\n"); esac }; testLet(i: Int): Int { let (a: Int in let(b: Int <- 3, c: Int <- 4 in { a <- 2; a * b * 2 / c; } ) ) }; }; -- Used to test subclasses class A inherits Sample {}; class B inherits A {}; class C { main() : Int { (new Sample).testLet(1) }; }; -- "Hello, world" example class Main inherits IO { main(): SELF_TYPE { out_string("Hello, World.\n") }; }; ================================================ FILE: samples/Creole/creole.creole ================================================ = Creole Creole is a Creole-to-HTML converter for Creole, the lightweight markup language (http://wikicreole.org/). Github uses this converter to render *.creole files. Project page on github: * http://github.com/minad/creole Travis-CI: * https://travis-ci.org/minad/creole RDOC: * http://rdoc.info/projects/minad/creole == INSTALLATION {{{ gem install creole }}} == SYNOPSIS {{{ require 'creole' html = Creole.creolize('== Creole text') }}} == BUGS If you found a bug, please report it at the Creole project's tracker on GitHub: http://github.com/minad/creole/issues == AUTHORS * Lars Christensen (larsch) * Daniel Mendler (minad) == LICENSE Creole is Copyright (c) 2008 - 2013 Lars Christensen, Daniel Mendler. It is free software, and may be redistributed under the terms specified in the README file of the Ruby distribution. ================================================ FILE: samples/Crystal/const_spec.cr ================================================ #!/usr/bin/env bin/crystal --run require "../../spec_helper" describe "Codegen: const" do it "define a constant" do run("A = 1; A").to_i.should eq(1) end it "support nested constant" do run("class B; A = 1; end; B::A").to_i.should eq(1) end it "support constant inside a def" do run(" class Foo A = 1 def foo A end end Foo.new.foo ").to_i.should eq(1) end it "finds nearest constant first" do run(" A = 1 class Foo A = 2.5_f32 def foo A end end Foo.new.foo ").to_f32.should eq(2.5) end it "allows constants with same name" do run(" A = 1 class Foo A = 2.5_f32 def foo A end end A Foo.new.foo ").to_f32.should eq(2.5) end it "constants with expression" do run(" A = 1 + 1 A ").to_i.should eq(2) end it "finds global constant" do run(" A = 1 class Foo def foo A end end Foo.new.foo ").to_i.should eq(1) end it "define a constant in lib" do run("lib Foo; A = 1; end; Foo::A").to_i.should eq(1) end it "invokes block in const" do run("require \"prelude\"; A = [\"1\"].map { |x| x.to_i }; A[0]").to_i.should eq(1) end it "declare constants in right order" do run("A = 1 + 1; B = true ? A : 0; B").to_i.should eq(2) end it "uses correct types lookup" do run(" module A class B def foo 1 end end C = B.new; end def foo A::C.foo end foo ").to_i.should eq(1) end it "codegens variable assignment in const" do run(" class Foo def initialize(@x) end def x @x end end A = begin f = Foo.new(1) f end def foo A.x end foo ").to_i.should eq(1) end it "declaring var" do run(" BAR = begin a = 1 while 1 == 2 b = 2 end a end class Foo def compile BAR end end Foo.new.compile ").to_i.should eq(1) end it "initialize const that might raise an exception" do run(" require \"prelude\" CONST = (raise \"OH NO\" if 1 == 2) def doit CONST rescue end doit.nil? ").to_b.should be_true end end ================================================ FILE: samples/Crystal/declare_var_spec.cr ================================================ #!/usr/bin/env bin/crystal --run require "../../spec_helper" describe "Type inference: declare var" do it "types declare var" do assert_type("a :: Int32") { int32 } end it "types declare var and reads it" do assert_type("a :: Int32; a") { int32 } end it "types declare var and changes its type" do assert_type("a :: Int32; while 1 == 2; a = 'a'; end; a") { union_of(int32, char) } end it "declares instance var which appears in initialize" do result = assert_type(" class Foo @x :: Int32 end Foo.new") { types["Foo"] } mod = result.program foo = mod.types["Foo"] as NonGenericClassType foo.instance_vars["@x"].type.should eq(mod.int32) end it "declares instance var of generic class" do result = assert_type(" class Foo(T) @x :: T end Foo(Int32).new") do foo = types["Foo"] as GenericClassType foo_i32 = foo.instantiate([int32] of Type | ASTNode) foo_i32.lookup_instance_var("@x").type.should eq(int32) foo_i32 end end it "declares instance var of generic class after reopen" do result = assert_type(" class Foo(T) end f = Foo(Int32).new class Foo(T) @x :: T end f") do foo = types["Foo"] as GenericClassType foo_i32 = foo.instantiate([int32] of Type | ASTNode) foo_i32.lookup_instance_var("@x").type.should eq(int32) foo_i32 end end it "declares an instance variable in initialize" do assert_type(" class Foo def initialize @x :: Int32 end def x @x end end Foo.new.x ") { int32 } end end ================================================ FILE: samples/Crystal/transformer.cr ================================================ module Crystal class ASTNode def transform(transformer) transformer.before_transform self node = transformer.transform self transformer.after_transform self node end end class Transformer def before_transform(node) end def after_transform(node) end def transform(node : Expressions) exps = [] of ASTNode node.expressions.each do |exp| new_exp = exp.transform(self) if new_exp if new_exp.is_a?(Expressions) exps.concat new_exp.expressions else exps << new_exp end end end if exps.length == 1 exps[0] else node.expressions = exps node end end def transform(node : Call) if node_obj = node.obj node.obj = node_obj.transform(self) end transform_many node.args if node_block = node.block node.block = node_block.transform(self) end if node_block_arg = node.block_arg node.block_arg = node_block_arg.transform(self) end node end def transform(node : And) node.left = node.left.transform(self) node.right = node.right.transform(self) node end def transform(node : Or) node.left = node.left.transform(self) node.right = node.right.transform(self) node end def transform(node : StringInterpolation) transform_many node.expressions node end def transform(node : ArrayLiteral) transform_many node.elements if node_of = node.of node.of = node_of.transform(self) end node end def transform(node : HashLiteral) transform_many node.keys transform_many node.values if of_key = node.of_key node.of_key = of_key.transform(self) end if of_value = node.of_value node.of_value = of_value.transform(self) end node end def transform(node : If) node.cond = node.cond.transform(self) node.then = node.then.transform(self) node.else = node.else.transform(self) node end def transform(node : Unless) node.cond = node.cond.transform(self) node.then = node.then.transform(self) node.else = node.else.transform(self) node end def transform(node : IfDef) node.cond = node.cond.transform(self) node.then = node.then.transform(self) node.else = node.else.transform(self) node end def transform(node : MultiAssign) transform_many node.targets transform_many node.values node end def transform(node : SimpleOr) node.left = node.left.transform(self) node.right = node.right.transform(self) node end def transform(node : Def) transform_many node.args node.body = node.body.transform(self) if receiver = node.receiver node.receiver = receiver.transform(self) end if block_arg = node.block_arg node.block_arg = block_arg.transform(self) end node end def transform(node : Macro) transform_many node.args node.body = node.body.transform(self) if receiver = node.receiver node.receiver = receiver.transform(self) end if block_arg = node.block_arg node.block_arg = block_arg.transform(self) end node end def transform(node : PointerOf) node.exp = node.exp.transform(self) node end def transform(node : SizeOf) node.exp = node.exp.transform(self) node end def transform(node : InstanceSizeOf) node.exp = node.exp.transform(self) node end def transform(node : IsA) node.obj = node.obj.transform(self) node.const = node.const.transform(self) node end def transform(node : RespondsTo) node.obj = node.obj.transform(self) node end def transform(node : Case) node.cond = node.cond.transform(self) transform_many node.whens if node_else = node.else node.else = node_else.transform(self) end node end def transform(node : When) transform_many node.conds node.body = node.body.transform(self) node end def transform(node : ImplicitObj) node end def transform(node : ClassDef) node.body = node.body.transform(self) if superclass = node.superclass node.superclass = superclass.transform(self) end node end def transform(node : ModuleDef) node.body = node.body.transform(self) node end def transform(node : While) node.cond = node.cond.transform(self) node.body = node.body.transform(self) node end def transform(node : Generic) node.name = node.name.transform(self) transform_many node.type_vars node end def transform(node : ExceptionHandler) node.body = node.body.transform(self) transform_many node.rescues if node_ensure = node.ensure node.ensure = node_ensure.transform(self) end node end def transform(node : Rescue) node.body = node.body.transform(self) transform_many node.types node end def transform(node : Union) transform_many node.types node end def transform(node : Hierarchy) node.name = node.name.transform(self) node end def transform(node : Metaclass) node.name = node.name.transform(self) node end def transform(node : Arg) if default_value = node.default_value node.default_value = default_value.transform(self) end if restriction = node.restriction node.restriction = restriction.transform(self) end node end def transform(node : BlockArg) node.fun = node.fun.transform(self) node end def transform(node : Fun) transform_many node.inputs if output = node.output node.output = output.transform(self) end node end def transform(node : Block) node.args.map! { |exp| exp.transform(self) as Var } node.body = node.body.transform(self) node end def transform(node : FunLiteral) node.def.body = node.def.body.transform(self) node end def transform(node : FunPointer) if obj = node.obj node.obj = obj.transform(self) end node end def transform(node : Return) transform_many node.exps node end def transform(node : Break) transform_many node.exps node end def transform(node : Next) transform_many node.exps node end def transform(node : Yield) if scope = node.scope node.scope = scope.transform(self) end transform_many node.exps node end def transform(node : Include) node.name = node.name.transform(self) node end def transform(node : Extend) node.name = node.name.transform(self) node end def transform(node : RangeLiteral) node.from = node.from.transform(self) node.to = node.to.transform(self) node end def transform(node : Assign) node.target = node.target.transform(self) node.value = node.value.transform(self) node end def transform(node : Nop) node end def transform(node : NilLiteral) node end def transform(node : BoolLiteral) node end def transform(node : NumberLiteral) node end def transform(node : CharLiteral) node end def transform(node : StringLiteral) node end def transform(node : SymbolLiteral) node end def transform(node : RegexLiteral) node end def transform(node : Var) node end def transform(node : MetaVar) node end def transform(node : InstanceVar) node end def transform(node : ClassVar) node end def transform(node : Global) node end def transform(node : Require) node end def transform(node : Path) node end def transform(node : Self) node end def transform(node : LibDef) node.body = node.body.transform(self) node end def transform(node : FunDef) if body = node.body node.body = body.transform(self) end node end def transform(node : TypeDef) node end def transform(node : StructDef) node end def transform(node : UnionDef) node end def transform(node : EnumDef) node end def transform(node : ExternalVar) node end def transform(node : IndirectRead) node.obj = node.obj.transform(self) node end def transform(node : IndirectWrite) node.obj = node.obj.transform(self) node.value = node.value.transform(self) node end def transform(node : TypeOf) transform_many node.expressions node end def transform(node : Primitive) node end def transform(node : Not) node end def transform(node : TypeFilteredNode) node end def transform(node : TupleLiteral) transform_many node.exps node end def transform(node : Cast) node.obj = node.obj.transform(self) node.to = node.to.transform(self) node end def transform(node : DeclareVar) node.var = node.var.transform(self) node.declared_type = node.declared_type.transform(self) node end def transform(node : Alias) node.value = node.value.transform(self) node end def transform(node : TupleIndexer) node end def transform(node : Attribute) node end def transform_many(exps) exps.map! { |exp| exp.transform(self) } if exps end end end ================================================ FILE: samples/Csound/allglass.orc ================================================ sr = 44100 kr = 44100 ksmps = 1 nchnls = 2 ; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc ; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc instr 1 ktime line 0, p3, 17.5018 arL pvoc ktime, 1, "allglass1-L.pvc" arR pvoc ktime, 1, "allglass1-R.pvc" out arL, arR endin ================================================ FILE: samples/Csound/interp.orc ================================================ sr = 44100 kr = 44100 ksmps = 1 nchnls = 2 ; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc ; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc ; pvanal -n 1024 -w 2 partB.wav partB.pvc instr 1 iscale = 1 ktimpnt1 line 0, iscale*(82196/44100), 82196/44100 ktimpnt2 linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100 kfreqscale linseg 1, iscale*0.5, 1, iscale*1.6, 0.8 kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1 kampinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1 kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1 kampinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1 pvbufread ktimpnt1, "partB.pvc" apvcL pvinterp ktimpnt2, 1, "partA-L.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL pvbufread ktimpnt1, "partB.pvc" apvcR pvinterp ktimpnt2, 1, "partA-R.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR outs apvcL*0.8, apvcR*0.8 endin ================================================ FILE: samples/Csound/test.orc ================================================ // Csound single-line comments can be preceded by a pair of forward slashes... ; ...or a semicolon. /* Block comments begin with /* and end with */ // Orchestras begin with a header of audio parameters. nchnls = 1 nchnls_i = 1 sr = 44100 0dbfs = 1 ksmps = 10 // The control rate kr = sr / ksmps can be omitted when the number of audio // samples in a control period (ksmps) is set, but kr may appear in older // orchestras. kr = 4410 // Orchestras contain instruments. These begin with the keyword instr followed // by a comma-separated list of numbers or names of the instrument. Instruments // end at the endin keyword and cannot be nested. instr 1, N_a_M_e_, +Name // Instruments contain statements. Here is a typical statement: aSignal oscil 0dbfs, 440, 1 // Statements are terminated with a newline (possibly preceded by a comment). // To write a statement on several lines, precede the newline with a // backslash. prints \ "hello, world\n";comment // Csound 6 introduced function syntax for opcodes with one or zero outputs. // The oscil statement above is the same as aSignal = oscil(0dbfs, 440, 1) // Instruments can contain control structures. kNote = p3 if (kNote == 0) then kFrequency = 220 elseif kNote == 1 then // Parentheses around binary expressions are optional. kFrequency = 440 endif // Csound 6 introduced looping structures. iIndex = 0 while iIndex < 5 do print iIndex iIndex += 1 od iIndex = 0 until iIndex >= 5 do print iIndex iIndex += 1 enduntil // Both kinds of loops can be terminated by either od or enduntil. // Single-line strings are enclosed in double-quotes. prints "string\\\r\n\t\"" // Multi-line strings are enclosed in pairs of curly braces. prints {{ hello, world }} // Instruments often end with a statement containing an output opcode. outc aSignal endin // Orchestras can also contain user-defined opcodes (UDOs). Here is an // oscillator with one audio-rate output and two control-rate inputs: opcode anOscillator, a, kk kAmplitude, kFrequency xin aSignal vco2 kAmplitude, kFrequency xout aSignal endop instr TestOscillator outc(anOscillator(0dbfs, 110)) endin // Python can be executed in Csound // . So can Lua // . pyruni {{ import random pool = [(1 + i / 10.0) ** 1.2 for i in range(100)] def get_number_from_pool(n, p): if random.random() < p: i = int(random.random() * len(pool)) pool[i] = n; return random.choice(pool) }} // The Csound preprocessor supports conditional compilation and including files. #ifdef DEBUG #undef DEBUG #include "filename.orc" #endif // The preprocessor also supports object- and function-like macros. This is an // object-like macro that defines a number: #define A_HZ #440# // This is a function-like macro: #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# // Bodies of macros are enclosed in # and can contain newlines. The arguments of // function-like macros are separated by single-quotes. Uses of macros are // prefixed with a dollar sign. instr TestMacro aSignal $OSCIL_MACRO(1'$A_HZ'1) // Not unlike PHP, macros expand in double-quoted strings. prints "The frequency of the oscillator is $A_HZ Hz.\n" out aSignal endin // Here are other things to note about Csound. // There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common // on keyboards in the United Kingdom // . instr TestBitwiseNOT print ~42 print ¬42 endin // Csound uses # for bitwise XOR, which the Csound manual calls bitwise // non-equivalence . instr TestBitwiseXOR print 0 # 0 print 0 # 1 print 1 # 0 print 1 # 1 endin // Loops and if-then statements are relatively recent additions to Csound. There // are many flow-control opcodes that involve goto and labels. instr TestGoto // This... if p3 > 0 goto if_label goto else_label if_label: prints "if branch\n" goto endif_label else_label: prints "else branch\n" endif_label: // ...is the same as this. if p3 > 0 then prints "if branch\n" else prints "else branch\n" endif // This... iIndex = 0 loop_label: print iIndex iIndex += 1 if iIndex < 10 goto loop_label // ...is the same as this... iIndex = 0 loop_lt_label: print iIndex loop_lt iIndex, 1, 10, loop_lt_label // ...and this. iIndex = 0 while iIndex < 10 do print iIndex iIndex += 1 od endin // The prints and printks opcodes // , arguably // the primary methods of logging output, treat certain sequences of characters // different from printf in C. instr TestPrints // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character // (U+005E). ^^ prints a CIRCUMFLEX ACCENT. prints "^^\n" // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE // character (U+007E). ~~ prints a TILDE. prints "~~\n" // \A, \B, \N, \R, and \T correspond to the escaped lowercase characters (that // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN // (U+000D), and tab (U+0009)). prints "\T\R\N" // %n, %r, and %t are the same as \n, \r, and \t, as are %N, %R, and %T. prints "%t%r%n" // %! prints a semicolon. This is a hold-over from old versions of Csound that // allowed comments to begin in strings. prints "; %!\n" endin // The arguments of function-like macros can be separated by # instead of '. // These two lines define the same macro. #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# #define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# // Uses of macros can optionally be suffixed with a period. instr TestMacroPeriodSuffix aSignal $OSCIL_MACRO.(1'$A_HZ'1) prints "The frequency of the oscillator is $A_HZ.Hz.\n" out aSignal endin // Csound has @ and @@ operator-like macros that, when followed by a literal // non-negative integer, expand to the next power of 2 and the next power of 2 // plus 1: // @x = 2^(ceil(log2(x + 1))), x >= 0 // @@0 = 2 // @@x = 2^(ceil(log2(x))) + 1, x > 0 instr TestAt prints "%d %2d %2d\n", 0, @0, @@0 prints "%d %2d %2d\n", 1, @1, @@1 prints "%d %2d %2d\n", 2, @2, @@2 prints "%d %2d %2d\n", 3, @3, @@3 prints "%d %2d %2d\n", 4, @4, @@4 prints "%d %2d %2d\n", 5, @5, @@5 prints "%d %2d %2d\n", 6, @6, @@6 prints "%d %2d %2d\n", 7, @7, @@7 prints "%d %2d %2d\n", 8, @8, @@8 prints "%d %2d %2d\n", 9, @9, @@9 endin // Including newlines in macros can lead to confusing code. instr MacroAbuse if 1 == 1 then prints "on\n" #define FOO# BAR #endif // This ends the if block. It is not a preprocessor directive. endin scoreline_i {{ f 1 0 16384 10 1 i "N_a_M_e_" 0 2 i "TestOscillator" 2 2 i "TestBitwiseNOT" 0 1 i "TestBitwiseXOR" 0 1 i "TestGoto" 0 1 i "TestMacroPeriodSuffix" 4 1 i "TestAt" 0 1 i "MacroAbuse" 0 1 e }} ================================================ FILE: samples/Csound Document/allglass.csd ================================================ sr = 44100 kr = 44100 ksmps = 1 nchnls = 2 ; pvanal -n 512 -w 8 allglass1-L.wav allglass1-L.pvc ; pvanal -n 512 -w 8 allglass1-R.wav allglass1-R.pvc instr 1 ktime line 0, p3, 17.5018 arL pvoc ktime, 1, "allglass1-L.pvc" arR pvoc ktime, 1, "allglass1-R.pvc" out arL, arR endin i 1 0 70.0073 e ================================================ FILE: samples/Csound Document/interp.csd ================================================ sr = 44100 kr = 44100 ksmps = 1 nchnls = 2 ; pvanal -n 1024 -w 2 partA-L.wav partA-L.pvc ; pvanal -n 1024 -w 2 partA-R.wav partA-R.pvc ; pvanal -n 1024 -w 2 partB.wav partB.pvc instr 1 iscale = 1 ktimpnt1 line 0, iscale*(82196/44100), 82196/44100 ktimpnt2 linseg 0, iscale*1.25, 0, iscale*(103518/44100), 103518/44100 kfreqscale linseg 1, iscale*0.5, 1, iscale*1.6, 0.8 kfreqinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1 kampinterpL linseg 0, iscale*0.25, 0, iscale*1.6, 1 kfreqinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1 kampinterpR linseg 0, iscale*0.5, 0, iscale*1.2, 1 pvbufread ktimpnt1, "partB.pvc" apvcL pvinterp ktimpnt2, 1, "partA-L.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpL, 1-kampinterpL pvbufread ktimpnt1, "partB.pvc" apvcR pvinterp ktimpnt2, 1, "partA-R.pvc", kfreqscale, 1, 1, 1, 1-kfreqinterpR, 1-kampinterpR outs apvcL*0.8, apvcR*0.8 endin i 1 0 7 e ================================================ FILE: samples/Csound Document/test.csd ================================================ // Csound single-line comments can be preceded by a pair of forward slashes... ; ...or a semicolon. /* Block comments begin with /* and end with */ // Orchestras begin with a header of audio parameters. nchnls = 1 nchnls_i = 1 sr = 44100 0dbfs = 1 ksmps = 10 // The control rate kr = sr / ksmps can be omitted when the number of audio // samples in a control period (ksmps) is set, but kr may appear in older // orchestras. kr = 4410 // Orchestras contain instruments. These begin with the keyword instr followed // by a comma-separated list of numbers or names of the instrument. Instruments // end at the endin keyword and cannot be nested. instr 1, N_a_M_e_, +Name // Instruments contain statements. Here is a typical statement: aSignal oscil 0dbfs, 440, 1 // Statements are terminated with a newline (possibly preceded by a comment). // To write a statement on several lines, precede the newline with a // backslash. prints \ "hello, world\n";comment // Csound 6 introduced function syntax for opcodes with one or zero outputs. // The oscil statement above is the same as aSignal = oscil(0dbfs, 440, 1) // Instruments can contain control structures. kNote = p3 if (kNote == 0) then kFrequency = 220 elseif kNote == 1 then // Parentheses around binary expressions are optional. kFrequency = 440 endif // Csound 6 introduced looping structures. iIndex = 0 while iIndex < 5 do print iIndex iIndex += 1 od iIndex = 0 until iIndex >= 5 do print iIndex iIndex += 1 enduntil // Both kinds of loops can be terminated by either od or enduntil. // Single-line strings are enclosed in double-quotes. prints "string\\\r\n\t\"" // Multi-line strings are enclosed in pairs of curly braces. prints {{ hello, world }} // Instruments often end with a statement containing an output opcode. outc aSignal endin // Orchestras can also contain user-defined opcodes (UDOs). Here is an // oscillator with one audio-rate output and two control-rate inputs: opcode anOscillator, a, kk kAmplitude, kFrequency xin aSignal vco2 kAmplitude, kFrequency xout aSignal endop instr TestOscillator outc(anOscillator(0dbfs, 110)) endin // Python can be executed in Csound // . So can Lua // . pyruni {{ import random pool = [(1 + i / 10.0) ** 1.2 for i in range(100)] def get_number_from_pool(n, p): if random.random() < p: i = int(random.random() * len(pool)) pool[i] = n; return random.choice(pool) }} // The Csound preprocessor supports conditional compilation and including files. #ifdef DEBUG #undef DEBUG #include "filename.orc" #endif // The preprocessor also supports object- and function-like macros. This is an // object-like macro that defines a number: #define A_HZ #440# // This is a function-like macro: #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# // Bodies of macros are enclosed in # and can contain newlines. The arguments of // function-like macros are separated by single-quotes. Uses of macros are // prefixed with a dollar sign. instr TestMacro aSignal $OSCIL_MACRO(1'$A_HZ'1) // Not unlike PHP, macros expand in double-quoted strings. prints "The frequency of the oscillator is $A_HZ Hz.\n" out aSignal endin // Here are other things to note about Csound. // There are two bitwise NOT operators, ~ and ¬ (U+00AC). The latter is common // on keyboards in the United Kingdom // . instr TestBitwiseNOT print ~42 print ¬42 endin // Csound uses # for bitwise XOR, which the Csound manual calls bitwise // non-equivalence . instr TestBitwiseXOR print 0 # 0 print 0 # 1 print 1 # 0 print 1 # 1 endin // Loops and if-then statements are relatively recent additions to Csound. There // are many flow-control opcodes that involve goto and labels. instr TestGoto // This... if p3 > 0 goto if_label goto else_label if_label: prints "if branch\n" goto endif_label else_label: prints "else branch\n" endif_label: // ...is the same as this. if p3 > 0 then prints "if branch\n" else prints "else branch\n" endif // This... iIndex = 0 loop_label: print iIndex iIndex += 1 if iIndex < 10 goto loop_label // ...is the same as this... iIndex = 0 loop_lt_label: print iIndex loop_lt iIndex, 1, 10, loop_lt_label // ...and this. iIndex = 0 while iIndex < 10 do print iIndex iIndex += 1 od endin // The prints and printks opcodes // , arguably // the primary methods of logging output, treat certain sequences of characters // different from printf in C. instr TestPrints // ^ prints an ESCAPE character (U+001B), not a CIRCUMFLEX ACCENT character // (U+005E). ^^ prints a CIRCUMFLEX ACCENT. prints "^^\n" // ~ prints an ESCAPE character (U+001B) followed by a [, not a TILDE // character (U+007E). ~~ prints a TILDE. prints "~~\n" // \A, \B, \N, \R, and \T correspond to the escaped lowercase characters (that // is, BELL (U+0007), BACKSPACE (U+0008), new line (U+000A), CARRIAGE RETURN // (U+000D), and tab (U+0009)). prints "\T\R\N" // %n, %r, and %t are the same as \n, \r, and \t, as are %N, %R, and %T. prints "%t%r%n" // %! prints a semicolon. This is a hold-over from old versions of Csound that // allowed comments to begin in strings. prints "; %!\n" endin // The arguments of function-like macros can be separated by # instead of '. // These two lines define the same macro. #define OSCIL_MACRO(VOLUME'FREQUENCY'TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# #define OSCIL_MACRO(VOLUME#FREQUENCY#TABLE) #oscil $VOLUME, $FREQUENCY, $TABLE# // Uses of macros can optionally be suffixed with a period. instr TestMacroPeriodSuffix aSignal $OSCIL_MACRO.(1'$A_HZ'1) prints "The frequency of the oscillator is $A_HZ.Hz.\n" out aSignal endin // Csound has @ and @@ operator-like macros that, when followed by a literal // non-negative integer, expand to the next power of 2 and the next power of 2 // plus 1: // @x = 2^(ceil(log2(x + 1))), x >= 0 // @@0 = 2 // @@x = 2^(ceil(log2(x))) + 1, x > 0 instr TestAt prints "%d %2d %2d\n", 0, @0, @@0 prints "%d %2d %2d\n", 1, @1, @@1 prints "%d %2d %2d\n", 2, @2, @@2 prints "%d %2d %2d\n", 3, @3, @@3 prints "%d %2d %2d\n", 4, @4, @@4 prints "%d %2d %2d\n", 5, @5, @@5 prints "%d %2d %2d\n", 6, @6, @@6 prints "%d %2d %2d\n", 7, @7, @@7 prints "%d %2d %2d\n", 8, @8, @@8 prints "%d %2d %2d\n", 9, @9, @@9 endin // Including newlines in macros can lead to confusing code. instr MacroAbuse if 1 == 1 then prints "on\n" #define FOO# BAR #endif // This ends the if block. It is not a preprocessor directive. endin f 1 0 16384 10 1 i "N_a_M_e_" 0 2 i "TestOscillator" 2 2 i "TestBitwiseNOT" 0 1 i "TestBitwiseXOR" 0 1 i "TestGoto" 0 1 i "TestMacroPeriodSuffix" 4 1 i "TestAt" 0 1 i "MacroAbuse" 0 1 e ================================================ FILE: samples/Csound Score/allglass.sco ================================================ i 1 0 70.0073 e ================================================ FILE: samples/Csound Score/interp.sco ================================================ i 1 0 7 e ================================================ FILE: samples/Csound Score/test.sco ================================================ f 1 0 16384 10 1 i "N_a_M_e_" 0 2 i "TestOscillator" 2 2 i "TestBitwiseNOT" 0 1 i "TestBitwiseXOR" 0 1 i "TestGoto" 0 1 i "TestMacroPeriodSuffix" 4 1 i "TestAt" 0 1 i "MacroAbuse" 0 1 e ================================================ FILE: samples/Cuda/scalarProd_kernel.cuh ================================================ __global__ void scalarProdGPU( float *d_C, float *d_A, float *d_B, int vectorN, int elementN ) { //Accumulators cache __shared__ float accumResult[ACCUM_N]; //////////////////////////////////////////////////////////////////////////// // Cycle through every pair of vectors, // taking into account that vector counts can be different // from total number of thread blocks //////////////////////////////////////////////////////////////////////////// for (int vec = blockIdx.x; vec < vectorN; vec += gridDim.x) { int vectorBase = IMUL(elementN, vec); int vectorEnd = vectorBase + elementN; //////////////////////////////////////////////////////////////////////// // Each accumulator cycles through vectors with // stride equal to number of total number of accumulators ACCUM_N // At this stage ACCUM_N is only preferred be a multiple of warp size // to meet memory coalescing alignment constraints. //////////////////////////////////////////////////////////////////////// for (int iAccum = threadIdx.x; iAccum < ACCUM_N; iAccum += blockDim.x) { float sum = 0; for (int pos = vectorBase + iAccum; pos < vectorEnd; pos += ACCUM_N) sum += d_A[pos] * d_B[pos]; accumResult[iAccum] = sum; } //////////////////////////////////////////////////////////////////////// // Perform tree-like reduction of accumulators' results. // ACCUM_N has to be power of two at this stage //////////////////////////////////////////////////////////////////////// for (int stride = ACCUM_N / 2; stride > 0; stride >>= 1) { __syncthreads(); for (int iAccum = threadIdx.x; iAccum < stride; iAccum += blockDim.x) accumResult[iAccum] += accumResult[stride + iAccum]; } if (threadIdx.x == 0) d_C[vec] = accumResult[0]; } } ================================================ FILE: samples/Cuda/vectorAdd.cu ================================================ #include #include /** * CUDA Kernel Device code * * Computes the vector addition of A and B into C. The 3 vectors have the same * number of elements numElements. */ __global__ void vectorAdd(const float *A, const float *B, float *C, int numElements) { int i = blockDim.x * blockIdx.x + threadIdx.x; if (i < numElements) { C[i] = A[i] + B[i]; } } /** * Host main routine */ int main(void) { // Error code to check return values for CUDA calls cudaError_t err = cudaSuccess; // Launch the Vector Add CUDA Kernel int threadsPerBlock = 256; int blocksPerGrid =(numElements + threadsPerBlock - 1) / threadsPerBlock; vectorAdd<<>>(d_A, d_B, d_C, numElements); err = cudaGetLastError(); if (err != cudaSuccess) { fprintf(stderr, "Failed to launch vectorAdd kernel (error code %s)!\n", cudaGetErrorString(err)); exit(EXIT_FAILURE); } // Reset the device and exit err = cudaDeviceReset(); return 0; } ================================================ FILE: samples/Cue Sheet/sample1.cue ================================================ REM GENRE Electronica REM DATE 1998 PERFORMER "Faithless" TITLE "Live in Berlin" FILE "Faithless - Live in Berlin.mp3" MP3 TRACK 01 AUDIO TITLE "Reverence" PERFORMER "Faithless" INDEX 01 00:00:00 TRACK 02 AUDIO TITLE "She's My Baby" PERFORMER "Faithless" INDEX 01 06:42:00 TRACK 03 AUDIO TITLE "Take the Long Way Home" PERFORMER "Faithless" INDEX 01 10:54:00 TRACK 04 AUDIO TITLE "Insomnia" PERFORMER "Faithless" INDEX 01 17:04:00 TRACK 05 AUDIO TITLE "Bring the Family Back" PERFORMER "Faithless" INDEX 01 25:44:00 TRACK 06 AUDIO TITLE "Salva Mea" PERFORMER "Faithless" INDEX 01 30:50:00 TRACK 07 AUDIO TITLE "Dirty Old Man" PERFORMER "Faithless" INDEX 01 38:24:00 TRACK 08 AUDIO TITLE "God Is a DJ" PERFORMER "Faithless" INDEX 01 42:35:00 ================================================ FILE: samples/Cue Sheet/sample2.cue ================================================ FILE "sampleimage.bin" BINARY TRACK 01 MODE1/2352 INDEX 01 00:00:00 ================================================ FILE: samples/Curry/Nat.curry ================================================ ------------------------------------------------------------------------------ --- Library defining natural numbers in Peano representation and --- some operations on this representation. --- --- @author Michael Hanus --- @version January 2019 ------------------------------------------------------------------------------ module Data.Nat ( Nat(..), fromNat, toNat, add, sub, mul, leq ) where import Test.Prop --- Natural numbers defined in Peano representation. --- Thus, each natural number is constructor by a `Z` (zero) --- or `S` (successor) constructor. data Nat = Z | S Nat deriving (Eq,Show) --- Transforms a natural number into a standard integer. fromNat :: Nat -> Int fromNat Z = 0 fromNat (S n) = 1 + fromNat n -- Postcondition: the result of `fromNat` is not negative fromNat'post :: Nat -> Int -> Bool fromNat'post _ n = n >= 0 --- Transforms a standard integer into a natural number. toNat :: Int -> Nat toNat n | n == 0 = Z | n > 0 = S (toNat (n-1)) -- Precondition: `toNat` must be called with non-negative numbers toNat'pre :: Int -> Bool toNat'pre n = n >= 0 -- Property: transforming natural numbers into integers and back is the identity fromToNat :: Nat -> Prop fromToNat n = toNat (fromNat n) -=- n toFromNat :: Int -> Prop toFromNat n = n>=0 ==> fromNat (toNat n) -=- n --- Addition on natural numbers. add :: Nat -> Nat -> Nat add Z n = n add (S m) n = S(add m n) -- Property: addition is commutative addIsCommutative :: Nat -> Nat -> Prop addIsCommutative x y = add x y -=- add y x -- Property: addition is associative addIsAssociative :: Nat -> Nat -> Nat -> Prop addIsAssociative x y z = add (add x y) z -=- add x (add y z) --- Subtraction defined by reversing addition. sub :: Nat -> Nat -> Nat sub x y | add y z == x = z where z free -- Properties: subtracting a value which was added yields the same value subAddL :: Nat -> Nat -> Prop subAddL x y = sub (add x y) x -=- y subAddR :: Nat -> Nat -> Prop subAddR x y = sub (add x y) y -=- x --- Multiplication on natural numbers. mul :: Nat -> Nat -> Nat mul Z _ = Z mul (S m) n = add n (mul m n) -- Property: multiplication is commutative mulIsCommutative :: Nat -> Nat -> Prop mulIsCommutative x y = mul x y -=- mul y x -- Property: multiplication is associative mulIsAssociative :: Nat -> Nat -> Nat -> Prop mulIsAssociative x y z = mul (mul x y) z -=- mul x (mul y z) -- Properties: multiplication is distributive over addition distMulAddL :: Nat -> Nat -> Nat -> Prop distMulAddL x y z = mul x (add y z) -=- add (mul x y) (mul x z) distMulAddR :: Nat -> Nat -> Nat -> Prop distMulAddR x y z = mul (add y z) x -=- add (mul y x) (mul z x) -- less-or-equal predicated on natural numbers: leq :: Nat -> Nat -> Bool leq Z _ = True leq (S _) Z = False leq (S x) (S y) = leq x y -- Property: adding a number yields always a greater-or-equal number leqAdd :: Nat -> Nat -> Prop leqAdd x y = always $ leq x (add x y) ------------------------------------------------------------------------------ ================================================ FILE: samples/Curry/Prelude.curry ================================================ -------------------------------------------------------------------------------- --- The standard prelude of Curry with type classes. --- All exported functions, data types, type classes --- and methods defined in this module are always --- available in any Curry program. -------------------------------------------------------------------------------- {-# LANGUAGE CPP #-} {-# OPTIONS_FRONTEND -Wno-incomplete-patterns -Wno-overlapping #-} module Prelude ( -- * Basic Datatypes Char (..), Int (..), Float (..) --++ , () (..), (,) (..), (,,) (..), (,,,) (..), (,,,,) (..) --++ , [] (..), (->) (..) , Bool (..), Ordering (..), Maybe (..), Either (..) -- * Type Classes , Data(..), Eq (..) , Ord (..) , Show (..), ShowS, shows, showChar, showString, showParen , Read (..), ReadS, reads, readParen, read, lex , Bounded (..), Enum (..) -- ** Numerical Typeclasses , Num (..), Fractional (..), Real (..) , Integral (..), even, odd, fromIntegral, realToFrac, (^) , RealFrac (..), Floating (..), Monoid (..) -- Type Constructor Classes , Functor (..), Applicative (..), Alternative (..) , Monad (..), MonadFail(..) , liftM2, sequence, sequence_, mapM, mapM_ -- * Operations on Characters , isUpper, isLower, isAlpha, isDigit, isAlphaNum , isBinDigit, isOctDigit, isHexDigit, isSpace , ord, chr , String, lines, unlines, words, unwords -- * Operations on Lists , head, tail, null, (++), length, (!!), map, foldl, foldl1, foldr, foldr1 , filter, zip, zip3, zipWith, zipWith3, unzip, unzip3, concat, concatMap , iterate, repeat, replicate, take, drop, splitAt, takeWhile, dropWhile , span, break, reverse, and, or, any, all, elem, notElem, lookup, (<$>) -- * Evaluation , ($), ($!), ($!!), ($#), ($##), seq, ensureNotFree, ensureSpine , normalForm, groundNormalForm -- * Other Functions , (.), id, const, asTypeOf, curry, uncurry, flip, until , (&&), (||), not, otherwise, ifThenElse, maybe, either, fst, snd , failed, error -- * IO-Type and Operations , IO, getChar, getLine, putChar, putStr, putStrLn, print , FilePath, readFile, writeFile, appendFile , IOError (..), userError, ioError, catch -- * Constraint Programming , Success, success, solve, doSolve, (=:=), (=:<=) #ifdef __PAKCS__ , (=:<<=) #endif , (&), (&>) -- * Non-determinism , (?), anyOf, unknown -- * Internal Functions , apply, cond #ifdef __PAKCS__ , letrec, failure #endif ) where infixr 9 . infixl 9 !! infixl 7 *, /, `div`, `mod`, `quot`, `rem` infixl 6 +, - infixr 5 ++ --++ The (:) operator is built-in syntax with the following fixity: --++ infixr 5 : infix 4 ==, /=, <, >, <=, >= infix 4 =:=, =:<=, === #ifdef __PAKCS__ infix 4 =:<<= #endif infix 4 `elem`, `notElem` infixl 4 <$, <$>, <*>, <*, *> infixl 3 <|> infixr 3 && infixr 2 || infixl 1 >>, >>= infixr 0 ?, $, $!, $!!, $#, $##, `seq`, &, &> external data Char external data Int external data Float data Bool = False | True data Ordering = LT | EQ | GT ------------------------------------------------------------------------------ --++ data () = () --++ data (a, b) = (a, b) --++ data (a, b, c) = (a, b, c) --++ data (a, b, c, d) = (a, b, c, d) --++ data (a, b, c, d, e) = (a, b, c, d, e) --++ ... --++ data [a] = [] | a : [a] --++ data (->) a b class Data a where (===) :: a -> a -> Bool aValue :: a instance Data Char where (===) = (==) aValue = aValueChar instance Data Int where (===) = (==) aValue = aValueInt instance Data Float where (===) = (==) aValue = aValueFloat instance Data a => Data [a] where [] === [] = True [] === (_:_) = False (_:_) === [] = False (x:xs) === (y:ys) = x === y && xs === ys aValue = [] ? (aValue:aValue) instance Data () where () === () = True aValue = () instance (Data a, Data b) => Data (a, b) where (a1, b1) === (a2, b2) = a1 === a2 && b1 === b2 aValue = (aValue, aValue) instance (Data a, Data b, Data c) => Data (a, b, c) where (a1, b1, c1) === (a2, b2, c2) = a1 === a2 && b1 === b2 && c1 === c2 aValue = (aValue, aValue, aValue) instance (Data a, Data b, Data c, Data d) => Data (a, b, c, d) where (a1, b1, c1, d1) === (a2, b2, c2, d2) = a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 aValue = (aValue, aValue, aValue, aValue) instance (Data a, Data b, Data c, Data d, Data e) => Data (a, b, c, d, e) where (a1, b1, c1, d1, e1) === (a2, b2, c2, d2, e2) = a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 && e1 === e2 aValue = (aValue, aValue, aValue, aValue, aValue) instance (Data a, Data b, Data c, Data d, Data e, Data f) => Data (a, b, c, d, e, f) where (a1, b1, c1, d1, e1, f1) === (a2, b2, c2, d2, e2, f2) = a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 && e1 === e2 && f1 === f2 aValue = (aValue, aValue, aValue, aValue, aValue, aValue) instance (Data a, Data b, Data c, Data d, Data e, Data f, Data g) => Data (a, b, c, d, e, f, g) where (a1, b1, c1, d1, e1, f1, g1) === (a2, b2, c2, d2, e2, f2, g2) = a1 === a2 && b1 === b2 && c1 === c2 && d1 === d2 && e1 === e2 && f1 === f2 && g1 === g2 aValue = (aValue, aValue, aValue, aValue, aValue, aValue, aValue) -- Value generator for integers. aValueInt :: Int aValueInt = genPos 1 ? 0 ? 0 - genPos 1 where genPos n = n ? genPos (2 * n) ? genPos (2 * n + 1) -- Value generator for chars. aValueChar :: Char aValueChar = foldr1 (?) [minBound .. maxBound] -- Value generator for floats. -- Since there is no good way to enumerate floats, a free variable -- is returned. aValueFloat :: Float aValueFloat = x where x free ------------------------------------------------------------------------------ class Eq a where (==), (/=) :: a -> a -> Bool x == y = not (x /= y) x /= y = not (x == y) instance Eq Char where c == c' = c `eqChar` c' instance Eq Int where i == i' = i `eqInt` i' instance Eq Float where f == f' = f `eqFloat` f' instance Eq () where () == () = True instance (Eq a, Eq b) => Eq (a, b) where (a, b) == (a', b') = a == a' && b == b' instance (Eq a, Eq b, Eq c) => Eq (a, b, c) where (a, b, c) == (a', b', c') = a == a' && b == b' && c == c' instance (Eq a, Eq b, Eq c, Eq d) => Eq (a, b, c, d) where (a, b, c, d) == (a', b', c', d') = a == a' && b == b' && c == c' && d == d' instance (Eq a, Eq b, Eq c, Eq d, Eq e) => Eq (a, b, c, d, e) where (a, b, c, d, e) == (a', b', c', d', e') = a == a' && b == b' && c == c' && d == d' && e == e' instance Eq a => Eq [a] where [] == [] = True [] == (_:_) = False (_:_) == [] = False (x:xs) == (y:ys) = x == y && xs == ys instance Eq Bool where False == False = True False == True = False True == False = False True == True = True instance Eq Ordering where LT == LT = True LT == EQ = False LT == GT = False EQ == LT = False EQ == EQ = True EQ == GT = False GT == LT = False GT == EQ = False GT == GT = True -- Equality on characters. eqChar :: Char -> Char -> Bool #ifdef __KICS2__ eqChar external #elif defined(__PAKCS__) eqChar x y = (prim_eqChar $# y) $# x prim_eqChar :: Char -> Char -> Bool prim_eqChar external #endif -- Equality on integers. eqInt :: Int -> Int -> Bool #ifdef __KICS2__ eqInt external #elif defined(__PAKCS__) eqInt x y = (prim_eqInt $# y) $# x prim_eqInt :: Int -> Int -> Bool prim_eqInt external #endif -- Equality on floating point numbers. eqFloat :: Float -> Float -> Bool #ifdef __KICS2__ eqFloat external #elif defined(__PAKCS__) eqFloat x y = (prim_eqFloat $# y) $# x prim_eqFloat :: Float -> Float -> Bool prim_eqFloat external #endif class Eq a => Ord a where compare :: a -> a -> Ordering (<), (>), (<=), (>=) :: a -> a -> Bool min, max :: a -> a -> a compare x y | x == y = EQ | x <= y = LT | otherwise = GT x < y = x <= y && x /= y x > y = not (x <= y) x <= y = compare x y == EQ || compare x y == LT x >= y = y <= x min x y | x <= y = x | otherwise = y max x y | x >= y = x | otherwise = y instance Ord Char where c1 <= c2 = c1 `ltEqChar` c2 instance Ord Int where i1 <= i2 = i1 `ltEqInt` i2 instance Ord Float where f1 <= f2 = f1 `ltEqFloat` f2 instance Ord () where () <= () = True instance (Ord a, Ord b) => Ord (a, b) where (a, b) <= (a', b') = a < a' || (a == a' && b <= b') instance (Ord a, Ord b, Ord c) => Ord (a, b, c) where (a, b, c) <= (a', b', c') = a < a' || (a == a' && b < b') || (a == a' && b == b' && c <= c') instance (Ord a, Ord b, Ord c, Ord d) => Ord (a, b, c, d) where (a, b, c, d) <= (a', b', c', d') = a < a' || (a == a' && b < b') || (a == a' && b == b' && c < c') || (a == a' && b == b' && c == c' && d <= d') instance (Ord a, Ord b, Ord c, Ord d, Ord e) => Ord (a, b, c, d, e) where (a, b, c, d, e) <= (a', b', c', d', e') = a < a' || (a == a' && b < b') || (a == a' && b == b' && c < c') || (a == a' && b == b' && c == c' && d < d') || (a == a' && b == b' && c == c' && d == d' && e <= e') instance Ord a => Ord [a] where [] <= [] = True (_:_) <= [] = False [] <= (_:_) = True (x:xs) <= (y:ys) | x == y = xs <= ys | otherwise = x < y instance Ord Bool where False <= False = True False <= True = True True <= False = False True <= True = True instance Ord Ordering where LT <= LT = True LT <= EQ = True LT <= GT = True EQ <= LT = False EQ <= EQ = True EQ <= GT = True GT <= LT = False GT <= EQ = False GT <= GT = True -- Compares two characters. ltEqChar :: Char -> Char -> Bool #ifdef __KICS2__ ltEqChar external #elif defined(__PAKCS__) ltEqChar x y = (prim_ltEqChar $# y) $# x prim_ltEqChar :: Char -> Char -> Bool prim_ltEqChar external #endif -- Compares two integers. ltEqInt :: Int -> Int -> Bool #ifdef __KICS2__ ltEqInt external #elif defined(__PAKCS__) ltEqInt x y = (prim_ltEqInt $# y) $# x prim_ltEqInt :: Int -> Int -> Bool prim_ltEqInt external #endif -- Compares two floating point numbers. ltEqFloat :: Float -> Float -> Bool #ifdef __KICS2__ ltEqFloat external #elif defined(__PAKCS__) ltEqFloat x y = (prim_ltEqFloat $# y) $# x prim_ltEqFloat :: Float -> Float -> Bool prim_ltEqFloat external #endif type ShowS = String -> String class Show a where show :: a -> String showsPrec :: Int -> a -> ShowS showList :: [a] -> ShowS show x = shows x "" showsPrec _ x s = show x ++ s showList = showListDefault instance Show Char where showsPrec _ c = showString (showCharLiteral c) showList cs | null cs = showString "\"\"" | otherwise = showString (showStringLiteral cs) instance Show Int where showsPrec = showSigned (showString . showIntLiteral) instance Show Float where showsPrec = showSigned (showString . showFloatLiteral) instance Show () where showsPrec _ () = showString "()" instance (Show a, Show b) => Show (a, b) where showsPrec _ (a, b) = showTuple [shows a, shows b] instance (Show a, Show b, Show c) => Show (a, b, c) where showsPrec _ (a, b, c) = showTuple [shows a, shows b, shows c] instance (Show a, Show b, Show c, Show d) => Show (a, b, c, d) where showsPrec _ (a, b, c, d) = showTuple [shows a, shows b, shows c, shows d] instance (Show a, Show b, Show c, Show d, Show e) => Show (a, b, c, d, e) where showsPrec _ (a, b, c, d, e) = showTuple [shows a, shows b, shows c, shows d, shows e] instance Show a => Show [a] where showsPrec _ = showList instance Show Bool where showsPrec _ False = showString "False" showsPrec _ True = showString "True" instance Show Ordering where showsPrec _ LT = showString "LT" showsPrec _ EQ = showString "EQ" showsPrec _ GT = showString "GT" shows :: Show a => a -> ShowS shows = showsPrec 0 showChar :: Char -> ShowS showChar = (:) showString :: String -> ShowS showString str s = foldr showChar s str showListDefault :: Show a => [a] -> ShowS showListDefault [] s = "[]" ++ s showListDefault (x:xs) s = '[' : shows x (showl xs) where showl [] = ']' : s showl (y:ys) = ',' : shows y (showl ys) showParen :: Bool -> ShowS -> ShowS showParen b s = if b then showChar '(' . s . showChar ')' else s showSigned :: Real a => (a -> ShowS) -> Int -> a -> ShowS showSigned showPos p x | x < 0 = showParen (p > 6) (showChar '-' . showPos (-x)) | otherwise = showPos x showTuple :: [ShowS] -> ShowS showTuple ss = showChar '(' . foldr1 (\s r -> s . showChar ',' . r) ss . showChar ')' -- Returns the string representation of a character. showCharLiteral :: Char -> String showCharLiteral x = prim_showCharLiteral $## x prim_showCharLiteral :: Char -> String prim_showCharLiteral external -- Returns the string representation of a string. showStringLiteral :: String -> String showStringLiteral x = prim_showStringLiteral $## x prim_showStringLiteral :: String -> String prim_showStringLiteral external -- Returns the string representation of an integer. showIntLiteral :: Int -> String showIntLiteral x = prim_showIntLiteral $## x prim_showIntLiteral :: Int -> String prim_showIntLiteral external -- Returns the string representation of a floating point number. showFloatLiteral :: Float -> String showFloatLiteral x = prim_showFloatLiteral $## x prim_showFloatLiteral :: Float -> String prim_showFloatLiteral external type ReadS a = String -> [(a, String)] class Read a where readsPrec :: Int -> ReadS a readList :: ReadS [a] readList = readListDefault instance Read Char where readsPrec _ = readParen False (\s -> [ (c, t) | (x, t) <- lex s, not (null x) , head x == '\'' , (c, []) <- readCharLiteral x ]) readList xs = readParen False (\s -> [ (cs, t) | (x, t) <- lex s, not (null x) , head x == '"' , (cs, []) <- readStringLiteral x ]) xs ++ readListDefault xs instance Read Int where readsPrec _ = readSigned (\s -> [ (i, t) | (x, t) <- lexDigits s , (i, []) <- readNatLiteral x ]) instance Read Float where readsPrec _ = readSigned (\s -> [ (f, t) | (x, t) <- lex s, not (null x) , isDigit (head x), (f, []) <- readFloat x ]) where readFloat x = if all isDigit x then [(fromInt i, t) | (i, t) <- readNatLiteral x] else readFloatLiteral x instance Read () where readsPrec _ = readParen False (\r -> [ ((), t) | ("(", s) <- lex r , (")", t) <- lex s ]) instance (Read a, Read b) => Read (a, b) where readsPrec _ = readParen False (\r -> [ ((a, b), w) | ("(", s) <- lex r , (a, t) <- reads s , (",", u) <- lex t , (b, v) <- reads u , (")", w) <- lex v ]) instance (Read a, Read b, Read c) => Read (a, b, c) where readsPrec _ = readParen False (\r -> [ ((a, b, c), y) | ("(", s) <- lex r , (a, t) <- reads s , (",", u) <- lex t , (b, v) <- reads u , (",", w) <- lex v , (c, x) <- reads w , (")", y) <- lex x ]) instance (Read a, Read b, Read c, Read d) => Read (a, b, c, d) where readsPrec _ = readParen False (\q -> [ ((a, b, c, d), z) | ("(", r) <- lex q , (a, s) <- reads r , (",", t) <- lex s , (b, u) <- reads t , (",", v) <- lex u , (c, w) <- reads v , (",", x) <- lex w , (d, y) <- reads x , (")", z) <- lex y ]) instance (Read a, Read b, Read c, Read d, Read e) => Read (a, b, c, d, e) where readsPrec _ = readParen False (\o -> [ ((a, b, c, d, e), z) | ("(", p) <- lex o , (a, q) <- reads p , (",", r) <- lex q , (b, s) <- reads r , (",", t) <- lex s , (c, u) <- reads t , (",", v) <- lex u , (d, w) <- reads v , (",", x) <- lex w , (e, y) <- reads x , (")", z) <- lex y ]) instance Read a => Read [a] where readsPrec _ = readList instance Read Bool where readsPrec _ r = readParen False (\s -> [(False, t) | ("False", t) <- lex s]) r ++ readParen False (\s -> [(True, t) | ("True", t) <- lex s]) r instance Read Ordering where readsPrec _ r = readParen False (\s -> [(LT, t) | ("LT", t) <- lex s]) r ++ readParen False (\s -> [(EQ, t) | ("EQ", t) <- lex s]) r ++ readParen False (\s -> [(GT, t) | ("GT", t) <- lex s]) r reads :: Read a => ReadS a reads = readsPrec 0 readListDefault :: Read a => ReadS [a] readListDefault = readParen False (\r -> [pr | ("[",s) <- lex r, pr <- readl s]) where readl s = [([], t) | ("]", t) <- lex s] ++ [(x : xs, u) | (x, t) <- reads s, (xs, u) <- readl' t] readl' s = [([], t) | ("]", t) <- lex s] ++ [ (x : xs, v) | (",", t) <- lex s, (x, u) <- reads t , (xs,v) <- readl' u ] readParen :: Bool -> ReadS a -> ReadS a readParen b g = if b then mandatory else optional where optional r = g r ++ mandatory r mandatory r = [(x, u) | ("(", s) <- lex r, (x, t) <- optional s, (")", u) <- lex t] readSigned :: Real a => ReadS a -> ReadS a readSigned p = readParen False read' where read' r = read'' r ++ [(-x, t) | ("-", s) <- lex r, (x, t) <- read'' s] read'' r = [(n, s) | (str, s) <- lex r, (n, "") <- p str] read :: Read a => String -> a read s = case [x | (x, t) <- reads s, ("", "") <- lex t] of [x] -> x lex :: ReadS String lex xs = case xs of "" -> [("", "")] (c:cs) | isSpace c -> lex $ dropWhile isSpace cs ('\'':s) -> [('\'' : ch ++ "'", t) | (ch, '\'' : t) <- lexCharLiteral s, ch /= "'"] ('"':s) -> [('"' : str, t) | (str, t) <- lexString s] (c:cs) | isSingle c -> [([c], cs)] | isSymbol c -> [(c : sym, t) | (sym, t) <- [span isSymbol cs]] | isAlpha c -> [(c : nam, t) | (nam, t) <- [span isIdChar cs]] | isDigit c -> [ (c : ds ++ fe, t) | (ds, s) <- [span isDigit cs] , (fe, t) <- lexFracExp s ] | otherwise -> [] where isSingle c = c `elem` ",;()[]{}_`" isSymbol c = c `elem` "!@#$%&*+./<=>?\\^|:-~" isIdChar c = isAlphaNum c || c `elem` "_'" lexFracExp s = case s of ('.':c:cs) | isDigit c -> [('.' : ds ++ e, u) | (ds, t) <- lexDigits (c : cs), (e, u) <- lexExp t] _ -> lexExp s lexExp s = case s of (e:cs) | e `elem` "eE" -> [ (e : c : ds, u) | (c:t) <- [cs], c `elem` "+-" , (ds, u) <- lexDigits t ] ++ [(e : ds, t) | (ds, t) <- lexDigits cs] _ -> [("", s)] lexString s = case s of ('"':cs) -> [("\"", cs)] _ -> [ (ch ++ str, u) | (ch, t) <- lexStringItem s , (str, u) <- lexString t ] lexStringItem s = case s of ('\\':'&':cs) -> [("\\&", cs)] ('\\':c:cs) | isSpace c -> [("\\&", t) | '\\':t <- [dropWhile isSpace cs]] _ -> lexCharLiteral s lexCharLiteral :: ReadS String lexCharLiteral xs = case xs of "" -> [] ('\\':cs) -> map (prefix '\\') (lexEsc cs) (c:cs) -> [([c], cs)] where lexEsc s = case s of (c:cs) | c `elem` "abfnrtv\\\"'" -> [([c], cs)] ('^':c:cs) | c >= '@' && c <= '_' -> [(['^', c], cs)] ('b':cs) -> [prefix 'b' (span isBinDigit cs)] ('o':cs) -> [prefix 'o' (span isOctDigit cs)] ('x':cs) -> [prefix 'x' (span isHexDigit cs)] cs@(d:_) | isDigit d -> [span isDigit cs] cs@(c:_) | isUpper c -> [span isCharName cs] _ -> [] isCharName c = isUpper c || isDigit c prefix c (t, cs) = (c : t, cs) lexDigits :: ReadS String lexDigits s = [(cs, t) | (cs@(_:_), t) <- [span isDigit s]] readCharLiteral :: ReadS Char readCharLiteral s = prim_readCharLiteral $## s prim_readCharLiteral :: String -> [(Char, String)] prim_readCharLiteral external readStringLiteral :: ReadS String readStringLiteral s = prim_readStringLiteral $## s prim_readStringLiteral :: String -> [(String, String)] prim_readStringLiteral external readNatLiteral :: ReadS Int readNatLiteral s = prim_readNatLiteral $## s prim_readNatLiteral :: String -> [(Int, String)] prim_readNatLiteral external readFloatLiteral :: ReadS Float readFloatLiteral s = prim_readFloatLiteral $## s prim_readFloatLiteral :: String -> [(Float, String)] prim_readFloatLiteral external class Bounded a where minBound, maxBound :: a instance Bounded Char where minBound = chr 0 maxBound = chr 0x10FFFF instance Bounded () where minBound = () maxBound = () instance (Bounded a, Bounded b) => Bounded (a, b) where minBound = (minBound, minBound) maxBound = (maxBound, maxBound) instance (Bounded a, Bounded b, Bounded c) => Bounded (a, b, c) where minBound = (minBound, minBound, minBound) maxBound = (maxBound, maxBound, maxBound) instance (Bounded a, Bounded b, Bounded c, Bounded d) => Bounded (a, b, c, d) where minBound = (minBound, minBound, minBound, minBound) maxBound = (maxBound, maxBound, maxBound, maxBound) instance (Bounded a, Bounded b, Bounded c, Bounded d, Bounded e) => Bounded (a, b, c, d, e) where minBound = (minBound, minBound, minBound, minBound, minBound) maxBound = (maxBound, maxBound, maxBound, maxBound, maxBound) instance Bounded Bool where maxBound = False minBound = True instance Bounded Ordering where maxBound = LT minBound = GT class Enum a where succ :: a -> a pred :: a -> a toEnum :: Int -> a fromEnum :: a -> Int enumFrom :: a -> [a] enumFromThen :: a -> a -> [a] enumFromTo :: a -> a -> [a] enumFromThenTo :: a -> a -> a -> [a] succ = toEnum . (+ 1) . fromEnum pred = toEnum . (\x -> x - 1) . fromEnum enumFrom x = map toEnum [fromEnum x ..] enumFromThen x y = map toEnum [fromEnum x, fromEnum y ..] enumFromTo x y = map toEnum [fromEnum x .. fromEnum y] enumFromThenTo x y z = map toEnum [fromEnum x, fromEnum y .. fromEnum z] instance Enum Char where succ c | c < maxBound = chr $ ord c + 1 pred c | c > minBound = chr $ ord c - 1 toEnum = chr fromEnum = ord enumFrom x = [x .. maxBound] enumFromThen x y | y >= x = [x, y .. maxBound] | otherwise = [x, y .. minBound] instance Enum Int where succ x = x + 1 pred x = x - 1 toEnum n = n fromEnum n = n enumFrom x = x : enumFrom (x + 1) enumFromTo x y | x > y = [] | otherwise = x : enumFromTo (x + 1) y enumFromThen x y = iterate ((y - x) +) x enumFromThenTo x y z = takeWhile p (enumFromThen x y) where p x' | y >= x = x' <= z | otherwise = x' >= z instance Enum () where succ _ = failed pred _ = failed toEnum 0 = () fromEnum () = 0 enumFrom () = [()] enumFromThen () () = let units = () : units in units enumFromTo () () = [()] enumFromThenTo () () () = let units = () : units in units instance Enum Bool where succ False = True pred True = False toEnum 0 = False toEnum 1 = True fromEnum False = 0 fromEnum True = 1 enumFrom x = enumFromTo x True enumFromThen x y = enumFromThenTo x y (x <= y) instance Enum Ordering where succ LT = EQ succ EQ = GT pred EQ = LT pred GT = EQ toEnum 0 = LT toEnum 1 = EQ toEnum 2 = GT fromEnum LT = 0 fromEnum EQ = 1 fromEnum GT = 2 enumFrom x = enumFromTo x GT enumFromThen x y = enumFromThenTo x y (if x <= y then GT else LT) class Num a where (+), (-), (*) :: a -> a -> a negate :: a -> a abs :: a -> a signum :: a -> a fromInt :: Int -> a x - y = x + negate y negate x = 0 - x instance Num Int where x + y = x `plusInt` y x - y = x `minusInt` y x * y = x `timesInt` y negate x = 0 - x abs x | x >= 0 = x | otherwise = negate x signum x | x > 0 = 1 | x == 0 = 0 | otherwise = -1 fromInt x = x instance Num Float where x + y = x `plusFloat` y x - y = x `minusFloat` y x * y = x `timesFloat` y negate x = negateFloat x abs x | x >= 0 = x | otherwise = negate x signum x | x > 0 = 1 | x == 0 = 0 | otherwise = -1 fromInt x = intToFloat x -- Adds two integers. plusInt :: Int -> Int -> Int #ifdef __KICS2__ plusInt external #elif defined(__PAKCS__) x `plusInt` y = (prim_plusInt $# y) $# x prim_plusInt :: Int -> Int -> Int prim_plusInt external #endif -- Subtracts two integers. minusInt :: Int -> Int -> Int #ifdef __KICS2__ minusInt external #elif defined(__PAKCS__) x `minusInt` y = (prim_minusInt $# y) $# x prim_minusInt :: Int -> Int -> Int prim_minusInt external #endif -- Multiplies two integers. timesInt :: Int -> Int -> Int #ifdef __KICS2__ timesInt external #elif defined(__PAKCS__) x `timesInt` y = (prim_timesInt $# y) $# x prim_timesInt :: Int -> Int -> Int prim_timesInt external #endif -- Adds two floating point numbers. plusFloat :: Float -> Float -> Float x `plusFloat` y = (prim_plusFloat $# y) $# x prim_plusFloat :: Float -> Float -> Float prim_plusFloat external -- Subtracts two floating point numbers. minusFloat :: Float -> Float -> Float x `minusFloat` y = (prim_minusFloat $# y) $# x prim_minusFloat :: Float -> Float -> Float prim_minusFloat external -- Multiplies two floating point numbers. timesFloat :: Float -> Float -> Float x `timesFloat` y = (prim_timesFloat $# y) $# x prim_timesFloat :: Float -> Float -> Float prim_timesFloat external -- Negates a floating point number. negateFloat :: Float -> Float #ifdef __KICS2__ negateFloat external #elif defined(__PAKCS__) negateFloat x = prim_negateFloat $# x prim_negateFloat :: Float -> Float prim_negateFloat external #endif -- Converts from integers to floating point numbers. intToFloat :: Int -> Float intToFloat x = prim_intToFloat $# x prim_intToFloat :: Int -> Float prim_intToFloat external class Num a => Fractional a where (/) :: a -> a -> a recip :: a -> a fromFloat :: Float -> a recip x = 1.0 / x x / y = x * recip y instance Fractional Float where x / y = x `divFloat` y fromFloat x = x -- Division on floating point numbers. divFloat :: Float -> Float -> Float x `divFloat` y = (prim_divFloat $# y) $# x prim_divFloat :: Float -> Float -> Float prim_divFloat external class (Num a, Ord a) => Real a where toFloat :: a -> Float instance Real Int where toFloat x = fromInt x instance Real Float where toFloat x = x class (Real a, Enum a) => Integral a where div, mod :: a -> a -> a quot, rem :: a -> a -> a divMod :: a -> a -> (a, a) quotRem :: a -> a -> (a, a) toInt :: a -> Int n `div` d = q where (q, _) = divMod n d n `mod` d = r where (_, r) = divMod n d n `quot` d = q where (q, _) = quotRem n d n `rem` d = r where (_, r) = quotRem n d instance Integral Int where divMod n d = (n `divInt` d, n `modInt` d) quotRem n d = (n `quotInt` d, n `remInt` d) toInt x = x --- Returns whether an integer is even. even :: Integral a => a -> Bool even n = n `rem` 2 == 0 --- Returns whether an integer is odd. odd :: Integral a => a -> Bool odd = not . even --- General coercion from integral types. fromIntegral :: (Integral a, Num b) => a -> b fromIntegral = fromInt . toInt --- General coercion to fractional types. realToFrac :: (Real a, Fractional b) => a -> b realToFrac = fromFloat . toFloat -- Integer division. The value is the integer quotient of its arguments -- and always truncated towards negative infinity. divInt :: Int -> Int -> Int #ifdef __KICS2__ divInt external #elif defined(__PAKCS__) x `divInt` y = (prim_divInt $# y) $# x prim_divInt :: Int -> Int -> Int prim_divInt external #endif -- Integer remainder. The value is the remainder of the integer division -- and it obeys the rule `mod x y = x - y * (div x y)`. modInt :: Int -> Int -> Int #ifdef __KICS2__ modInt external #elif defined(__PAKCS__) x `modInt` y = (prim_modInt $# y) $# x prim_modInt :: Int -> Int -> Int prim_modInt external #endif -- Integer division. The value is the integer quotient of its arguments -- and always truncated towards zero. quotInt :: Int -> Int -> Int #ifdef __KICS2__ quotInt external #elif defined(__PAKCS__) x `quotInt` y = (prim_quotInt $# y) $# x prim_quotInt :: Int -> Int -> Int prim_quotInt external #endif -- Integer remainder. The value is the remainder of the integer division -- and it obeys the rule `rem x y = x - y * (quot x y)`. remInt :: Int -> Int -> Int #ifdef __KICS2__ remInt external #elif defined(__PAKCS__) x `remInt` y = (prim_remInt $# y) $# x prim_remInt :: Int -> Int -> Int prim_remInt external #endif class (Real a, Fractional a) => RealFrac a where properFraction :: Integral b => a -> (b, a) truncate :: Integral b => a -> b round :: Integral b => a -> b ceiling :: Integral b => a -> b floor :: Integral b => a -> b truncate x = m where (m, _) = properFraction x round x = let (n, r) = properFraction x m = if r < 0 then n - 1 else n + 1 in case compare (signum (abs r - 0.5)) 0 of LT -> n EQ -> if even n then n else m GT -> m ceiling x = if r > 0 then n + 1 else n where (n, r) = properFraction x floor x = if r < 0 then n - 1 else n where (n, r) = properFraction x instance RealFrac Float where properFraction x = (n, x - fromIntegral n) where n = truncate x truncate = fromInt . truncateFloat round = fromInt . roundFloat -- Conversion function from floating point numbers to integers. -- The result is the closest integer between the argument and 0. truncateFloat :: Float -> Int truncateFloat x = prim_truncateFloat $# x prim_truncateFloat :: Float -> Int prim_truncateFloat external -- Conversion function from floating point numbers to integers. -- The result is the nearest integer to the argument. -- If the argument is equidistant between two integers, -- it is rounded to the closest even integer value. roundFloat :: Float -> Int roundFloat x = prim_roundFloat $# x prim_roundFloat :: Float -> Int prim_roundFloat external class Fractional a => Floating a where pi :: a exp, log, sqrt :: a -> a (**), logBase :: a -> a -> a sin, cos, tan :: a -> a asin, acos, atan :: a -> a sinh, cosh, tanh :: a -> a asinh, acosh, atanh :: a -> a sqrt x = x ** 0.5 x ** y = exp (log x * y) logBase x y = log y / log x tan x = sin x / cos x tanh x = sinh x / cosh x instance Floating Float where pi = 3.141592653589793238 exp = expFloat log = logFloat sqrt = sqrtFloat sin = sinFloat cos = cosFloat tan = tanFloat asin = asinFloat acos = acosFloat atan = atanFloat sinh = sinhFloat cosh = coshFloat tanh = tanhFloat asinh = asinhFloat acosh = acoshFloat atanh = atanhFloat -- Natural logarithm. logFloat :: Float -> Float logFloat x = prim_logFloat $# x prim_logFloat :: Float -> Float prim_logFloat external -- Natural exponent. expFloat :: Float -> Float expFloat x = prim_expFloat $# x prim_expFloat :: Float -> Float prim_expFloat external -- Square root. sqrtFloat :: Float -> Float sqrtFloat x = prim_sqrtFloat $# x prim_sqrtFloat :: Float -> Float prim_sqrtFloat external -- Sine. sinFloat :: Float -> Float sinFloat x = prim_sinFloat $# x prim_sinFloat :: Float -> Float prim_sinFloat external -- Cosine. cosFloat :: Float -> Float cosFloat x = prim_cosFloat $# x prim_cosFloat :: Float -> Float prim_cosFloat external -- Tangent. tanFloat :: Float -> Float tanFloat x = prim_tanFloat $# x prim_tanFloat :: Float -> Float prim_tanFloat external -- Arcus sine. asinFloat :: Float -> Float asinFloat x = prim_asinFloat $# x prim_asinFloat :: Float -> Float prim_asinFloat external -- Arcus cosine. acosFloat :: Float -> Float acosFloat x = prim_acosFloat $# x prim_acosFloat :: Float -> Float prim_acosFloat external -- Arcus tangent. atanFloat :: Float -> Float atanFloat x = prim_atanFloat $# x prim_atanFloat :: Float -> Float prim_atanFloat external -- Hyperbolic sine. sinhFloat :: Float -> Float sinhFloat x = prim_sinhFloat $# x prim_sinhFloat :: Float -> Float prim_sinhFloat external -- Hyperbolic cosine. coshFloat :: Float -> Float coshFloat x = prim_coshFloat $# x prim_coshFloat :: Float -> Float prim_coshFloat external -- Hyperbolic tangent. tanhFloat :: Float -> Float tanhFloat x = prim_tanhFloat $# x prim_tanhFloat :: Float -> Float prim_tanhFloat external -- Hyperbolic arcus sine. asinhFloat :: Float -> Float asinhFloat x = prim_asinhFloat $# x prim_asinhFloat :: Float -> Float prim_asinhFloat external -- Hyperbolic arcus cosine. acoshFloat :: Float -> Float acoshFloat x = prim_acoshFloat $# x prim_acoshFloat :: Float -> Float prim_acoshFloat external -- Hyperbolic arcus tangent. atanhFloat :: Float -> Float atanhFloat x = prim_atanhFloat $# x prim_atanhFloat :: Float -> Float prim_atanhFloat external (^) :: (Num a, Integral b) => a -> b -> a x0 ^ y0 | y0 < 0 = error "Negative exponent" | y0 == 0 = 1 | otherwise = f x0 y0 where -- f : x0 ^ y0 = x ^ y f x y | even y = f (x * x) (y `quot` 2) | y == 1 = x | otherwise = g (x * x) (y `quot` 2) x -- g : x0 ^ y0 = (x ^ y) * z g x y z | even y = g (x * x) (y `quot` 2) z | y == 1 = x * z | otherwise = g (x * x) (y `quot` 2) (x * z) class Monoid a where mempty :: a mappend :: a -> a -> a mconcat :: [a] -> a mconcat = foldr mappend mempty instance Monoid () where mempty = () _ `mappend` _ = () mconcat _ = () instance (Monoid a, Monoid b) => Monoid (a, b) where mempty = (mempty, mempty) (a1, b1) `mappend` (a2,b2) = (a1 `mappend` a2, b1 `mappend` b2) instance (Monoid a, Monoid b, Monoid c) => Monoid (a, b, c) where mempty = (mempty, mempty, mempty) (a1, b1, c1) `mappend` (a2, b2, c2) = (a1 `mappend` a2, b1 `mappend` b2, c1 `mappend` c2) instance (Monoid a, Monoid b, Monoid c, Monoid d) => Monoid (a, b, c, d) where mempty = (mempty, mempty, mempty, mempty) (a1, b1, c1, d1) `mappend` (a2, b2, c2, d2) = (a1 `mappend` a2, b1 `mappend` b2, c1 `mappend` c2, d1 `mappend` d2) instance (Monoid a, Monoid b, Monoid c, Monoid d, Monoid e) => Monoid (a, b, c, d, e) where mempty = (mempty, mempty, mempty, mempty, mempty) (a1, b1, c1, d1, e1) `mappend` (a2, b2, c2, d2, e2) = (a1 `mappend` a2, b1 `mappend` b2, c1 `mappend` c2, d1 `mappend` d2, e1 `mappend` e2) instance Monoid [a] where mempty = [] mappend = (++) mconcat xss = [x | xs <- xss, x <- xs] instance Monoid b => Monoid (a -> b) where mempty _ = mempty mappend f g x = f x `mappend` g x instance Monoid Ordering where mempty = EQ LT `mappend` _ = LT EQ `mappend` y = y GT `mappend` _ = GT class Functor f where fmap :: (a -> b) -> f a -> f b (<$) :: a -> f b -> f a (<$) = fmap . const instance Functor [] where fmap = map instance Functor ((->) r) where fmap = (.) (<$>) :: Functor f => (a -> b) -> f a -> f b (<$>) = fmap class Functor f => Applicative f where pure :: a -> f a (<*>) :: f (a -> b) -> f a -> f b (*>) :: f a -> f b -> f b (<*) :: f a -> f b -> f a liftA2 :: (a -> b -> c) -> f a -> f b -> f c (<*>) = liftA2 id a1 *> a2 = (id <$ a1) <*> a2 (<*) = liftA2 const liftA2 f x = (<*>) (fmap f x) instance Applicative [] where pure x = [x] fs <*> xs = [f x | f <- fs, x <- xs] xs *> ys = [y | _ <- xs, y <- ys] liftA2 f xs ys = [f x y | x <- xs, y <- ys] instance Applicative ((->) a) where pure = const (<*>) f g x = f x (g x) liftA2 q f g x = q (f x) (g x) -- | A monoid on applicative functors. -- -- If defined, 'some' and 'many' should be the least solutions -- of the equations: -- -- * @'some' v = (:) '<$>' v '<*>' 'many' v@ -- -- * @'many' v = 'some' v '<|>' 'pure' []@ class Applicative f => Alternative f where -- | The identity of '<|>' empty :: f a -- | An associative binary operation (<|>) :: f a -> f a -> f a -- | One or more. some :: f a -> f [a] some v = some_v where many_v = some_v <|> pure [] some_v = (:) <$> v <*> many_v -- | Zero or more. many :: f a -> f [a] many v = many_v where many_v = some_v <|> pure [] some_v = (:) <$> v <*> many_v instance Alternative [] where empty = [] (<|>) = (++) class Applicative m => Monad m where (>>=) :: m a -> (a -> m b) -> m b (>>) :: m a -> m b -> m b return :: a -> m a return = pure m >> k = m >>= \_ -> k instance Monad [] where xs >>= f = [y | x <- xs, y <- f x] (>>) = (*>) instance Monad ((->) r) where f >>= k = \ r -> k (f r) r class Monad m => MonadFail m where fail :: String -> m a instance MonadFail [] where fail _ = [] ap :: Monad m => m (a -> b) -> m a -> m b ap m1 m2 = do x1 <- m1 x2 <- m2 return (x1 x2) liftM2 :: Monad m => (a1 -> a2 -> r) -> m a1 -> m a2 -> m r liftM2 f m1 m2 = do x1 <- m1 x2 <- m2 return (f x1 x2) --- Executes a sequence of monadic actions and collects all results in a list. sequence :: Monad m => [m a] -> m [a] sequence [] = return [] sequence (c:cs) = do x <- c xs <- sequence cs return (x : xs) --- Executes a sequence of monadic actions and ignores the results. sequence_ :: Monad m => [m _] -> m () sequence_ = foldr (>>) (return ()) --- Maps a monadic action function on a list of elements. --- The results of all monadic actions are collected in a list. mapM :: Monad m => (a -> m b) -> [a] -> m [b] mapM f = sequence . map f --- Maps an monadic action function on a list of elements. --- The results of all monadic actions are ignored. mapM_ :: Monad m => (a -> m _) -> [a] -> m () mapM_ f = sequence_ . map f --- Returns true if the argument is an uppercase letter. isUpper :: Char -> Bool isUpper c = c >= 'A' && c <= 'Z' --- Returns true if the argument is an lowercase letter. isLower :: Char -> Bool isLower c = c >= 'a' && c <= 'z' --- Returns true if the argument is a letter. isAlpha :: Char -> Bool isAlpha c = isUpper c || isLower c --- Returns true if the argument is a decimal digit. isDigit :: Char -> Bool isDigit c = c >= '0' && c <= '9' --- Returns true if the argument is a letter or digit. isAlphaNum :: Char -> Bool isAlphaNum c = isAlpha c || isDigit c --- Returns true if the argument is a binary digit. isBinDigit :: Char -> Bool isBinDigit c = c >= '0' || c <= '1' --- Returns true if the argument is an octal digit. isOctDigit :: Char -> Bool isOctDigit c = c >= '0' && c <= '7' --- Returns true if the argument is a hexadecimal digit. isHexDigit :: Char -> Bool isHexDigit c = isDigit c || c >= 'A' && c <= 'F' || c >= 'a' && c <= 'f' --- Returns true if the argument is a white space. isSpace :: Char -> Bool isSpace c = c == ' ' || c == '\t' || c == '\n' || c == '\r' || c == '\f' || c == '\v' || c == '\xa0' || ord c `elem` [5760, 6158, 8192, 8239, 8287, 12288] --- Converts a character into its ASCII value. ord :: Char -> Int ord c = prim_ord $# c prim_ord :: Char -> Int prim_ord external --- Converts a Unicode value into a character. --- The conversion is total, i.e., for out-of-bound values, the smallest --- or largest character is generated. chr :: Int -> Char chr n | n < 0 = prim_chr 0 | n > 1114111 = prim_chr 1114111 | otherwise = prim_chr $# n prim_chr :: Int -> Char prim_chr external type String = [Char] --- Breaks a string into a list of lines where a line is terminated at a --- newline character. The resulting lines do not contain newline characters. lines :: String -> [String] lines [] = [] lines as@(_:_) = let (l, bs) = splitLine as in l : lines bs where splitLine [] = ([], []) splitLine (c:cs) = if c == '\n' then ([], cs) else let (ds, es) = splitLine cs in (c : ds, es) --- Concatenates a list of strings with terminating newlines. unlines :: [String] -> String unlines = concatMap (++ "\n") --- Breaks a string into a list of words where the words are delimited by --- white spaces. words :: String -> [String] words s = let s1 = dropWhile isSpace s in if s1 == "" then [] else let (w, s2) = break isSpace s1 in w : words s2 --- Concatenates a list of strings with a blank between two strings. unwords :: [String] -> String unwords ws = if ws == [] then [] else foldr1 (\w s -> w ++ ' ' : s) ws --- Right-associative application. ($) :: (a -> b) -> a -> b f $ x = f x --- Right-associative application with strict evaluation of its argument --- to head normal form. ($!) :: (a -> b) -> a -> b ($!) external --- Right-associative application with strict evaluation of its argument --- to normal form. ($!!) :: (a -> b) -> a -> b ($!!) external --- Right-associative application with strict evaluation of its argument --- to a non-variable term. ($#) :: (a -> b) -> a -> b f $# x = f $! (ensureNotFree x) --- Right-associative application with strict evaluation of its argument --- to ground normal form. ($##) :: (a -> b) -> a -> b ($##) external --- Evaluates the first argument to head normal form (which could also --- be a free variable) and returns the second argument. seq :: _ -> a -> a x `seq` y = const y $! x --- Evaluates the argument to head normal form and returns it. --- Suspends until the result is bound to a non-variable term. ensureNotFree :: a -> a ensureNotFree external --- Evaluates the argument to spine form and returns it. --- Suspends until the result is bound to a non-variable spine. ensureSpine :: [a] -> [a] ensureSpine l = ensureList (ensureNotFree l) where ensureList [] = [] ensureList (x:xs) = x : ensureSpine xs --- Evaluates the argument to normal form and returns it. normalForm :: a -> a normalForm x = id $!! x --- Evaluates the argument to ground normal form and returns it. --- Suspends as long as the normal form of the argument is not ground. groundNormalForm :: a -> a groundNormalForm x = id $## x --- Function composition. (.) :: (b -> c) -> (a -> b) -> (a -> c) f . g = \x -> f (g x) --- Identity function. id :: a -> a id x = x --- Constant function. const :: a -> _ -> a const x _ = x --- `asTypeOf` is a type-restricted version of `const`. --- It is usually used as an infix operator, and its typing forces its first --- argument (which is usually overloaded) to have the same type as the second. asTypeOf :: a -> a -> a asTypeOf = const --- Converts an uncurried function to a curried function. curry :: ((a, b) -> c) -> a -> b -> c curry f a b = f (a, b) --- Converts an curried function to a function on pairs. uncurry :: (a -> b -> c) -> (a, b) -> c uncurry f (a, b) = f a b --- `flip f` is identical to `f`, but with the order of arguments reversed. flip :: (a -> b -> c) -> b -> a -> c flip f x y = f y x --- Repeats application of a function until a predicate holds. until :: (a -> Bool) -> (a -> a) -> a -> a until p f x = if p x then x else until p f (f x) --- Sequential conjunction on Booleans. (&&) :: Bool -> Bool -> Bool True && x = x False && _ = False --- Sequential disjunction on Booleans. (||) :: Bool -> Bool -> Bool True || _ = True False || x = x --- Negation on Booleans. not :: Bool -> Bool not True = False not False = True --- Useful name for the last condition in a sequence of conditional equations. otherwise :: Bool otherwise = True --- The standard conditional. It suspends if the condition is a free variable. ifThenElse :: Bool -> a -> a -> a ifThenElse b t f = case b of True -> t False -> f --- Selects the first component of a pair. fst :: (a, _) -> a fst (x, _) = x --- Selects the second component of a pair. snd :: (_, b) -> b snd (_, y) = y --- Computes the first element of a list. head :: [a] -> a head (x:_) = x --- Computes the remaining elements of a list. tail :: [a] -> [a] tail (_:xs) = xs --- Is a list empty? null :: [_] -> Bool null [] = True null (_:_) = False --- Concatenates two lists. --- Since it is flexible, it could be also used to split a list --- into two sublists etc. (++) :: [a] -> [a] -> [a] [] ++ ys = ys (x:xs) ++ ys = x : xs ++ ys --- Computes the length of a list. length :: [_] -> Int length [] = 0 length (_:xs) = 1 + length xs --- List index (subscript) operator, head has index 0. (!!) :: [a] -> Int -> a (x:xs) !! n | n == 0 = x | n > 0 = xs !! (n - 1) --- Maps a function on all elements of a list. map :: (a -> b) -> [a] -> [b] map _ [] = [] map f (x:xs) = f x : map f xs --- Accumulates all list elements by applying a binary operator from --- left to right. foldl :: (a -> b -> a) -> a -> [b] -> a foldl _ z [] = z foldl f z (x:xs) = foldl f (f z x) xs --- Accumulates a non-empty list from left to right. foldl1 :: (a -> a -> a) -> [a] -> a foldl1 f (x:xs) = foldl f x xs --- Accumulates all list elements by applying a binary operator from --- right to left. foldr :: (a -> b -> b) -> b -> [a] -> b foldr _ z [] = z foldr f z (x:xs) = f x (foldr f z xs) --- Accumulates a non-empty list from right to left: foldr1 :: (a -> a -> a) -> [a] -> a foldr1 _ [x] = x foldr1 f (x:xs@(_:_)) = f x (foldr1 f xs) --- Filters all elements satisfying a given predicate in a list. filter :: (a -> Bool) -> [a] -> [a] filter _ [] = [] filter p (x:xs) = if p x then x : filter p xs else filter p xs --- Joins two lists into one list of pairs. If one input list is shorter than --- the other, the additional elements of the longer list are discarded. zip :: [a] -> [b] -> [(a, b)] zip [] _ = [] zip (_:_) [] = [] zip (x:xs) (y:ys) = (x, y) : zip xs ys --- Joins three lists into one list of triples. If one input list is shorter --- than the other, the additional elements of the longer lists are discarded. zip3 :: [a] -> [b] -> [c] -> [(a, b, c)] zip3 [] _ _ = [] zip3 (_:_) [] _ = [] zip3 (_:_) (_:_) [] = [] zip3 (x:xs) (y:ys) (z:zs) = (x, y, z) : zip3 xs ys zs --- Joins two lists into one list by applying a combination function to --- corresponding pairs of elements. Thus `zip = zipWith (,)` zipWith :: (a -> b -> c) -> [a] -> [b] -> [c] zipWith _ [] _ = [] zipWith _ (_:_) [] = [] zipWith f (x:xs) (y:ys) = f x y : zipWith f xs ys --- Joins three lists into one list by applying a combination function to --- corresponding triples of elements. Thus `zip3 = zipWith3 (,,)` zipWith3 :: (a -> b -> c -> d) -> [a] -> [b] -> [c] -> [d] zipWith3 _ [] _ _ = [] zipWith3 _ (_:_) [] _ = [] zipWith3 _ (_:_) (_:_) [] = [] zipWith3 f (x:xs) (y:ys) (z:zs) = f x y z : zipWith3 f xs ys zs --- Transforms a list of pairs into a pair of lists. unzip :: [(a, b)] -> ([a], [b]) unzip [] = ([], []) unzip ((x, y):ps) = (x : xs, y : ys) where (xs, ys) = unzip ps --- Transforms a list of triples into a triple of lists. unzip3 :: [(a, b, c)] -> ([a], [b], [c]) unzip3 [] = ([], [], []) unzip3 ((x, y, z):ts) = (x : xs, y : ys, z : zs) where (xs, ys, zs) = unzip3 ts --- Concatenates a list of lists into one list. concat :: [[a]] -> [a] concat = foldr (++) [] --- Maps a function from elements to lists and merges the result into one list. concatMap :: (a -> [b]) -> [a] -> [b] concatMap f = concat . map f --- Infinite list of repeated applications of a function f to an element x. --- Thus, `iterate f x = [x, f x, f (f x), ...]`. iterate :: (a -> a) -> a -> [a] iterate f x = x : iterate f (f x) --- Infinite list where all elements have the same value. --- Thus, `repeat x = [x, x, x, ...]`. repeat :: a -> [a] repeat x = x : repeat x --- List of length n where all elements have the same value. replicate :: Int -> a -> [a] replicate n x = take n (repeat x) --- Returns prefix of length n. take :: Int -> [a] -> [a] take n l = if n <= 0 then [] else takep n l where takep _ [] = [] takep m (x:xs) = x : take (m - 1) xs --- Returns suffix without first n elements. drop :: Int -> [a] -> [a] drop n xs = if n <= 0 then xs else case xs of [] -> [] (_:ys) -> drop (n - 1) ys --- `splitAt n xs` is equivalent to `(take n xs, drop n xs)` splitAt :: Int -> [a] -> ([a], [a]) splitAt n l = if n <= 0 then ([], l) else splitAtp n l where splitAtp _ [] = ([], []) splitAtp m (x:xs) = let (ys, zs) = splitAt (m - 1) xs in (x : ys, zs) --- Returns longest prefix with elements satisfying a predicate. takeWhile :: (a -> Bool) -> [a] -> [a] takeWhile _ [] = [] takeWhile p (x:xs) = if p x then x : takeWhile p xs else [] --- Returns suffix without takeWhile prefix. dropWhile :: (a -> Bool) -> [a] -> [a] dropWhile _ [] = [] dropWhile p (x:xs) = if p x then dropWhile p xs else x : xs --- `span p xs` is equivalent to `(takeWhile p xs, dropWhile p xs)` span :: (a -> Bool) -> [a] -> ([a], [a]) span _ [] = ([], []) span p (x:xs) | p x = let (ys, zs) = span p xs in (x : ys, zs) | otherwise = ([], x : xs) --- `break p xs` is equivalent to --- `(takeWhile (not . p) xs, dropWhile (not . p) xs)`. --- Thus, it breaks a list at the first occurrence of an element satisfying p. break :: (a -> Bool) -> [a] -> ([a], [a]) break p = span (not . p) --- Reverses the order of all elements in a list. reverse :: [a] -> [a] reverse = foldl (flip (:)) [] --- Computes the conjunction of a Boolean list. and :: [Bool] -> Bool and = foldr (&&) True --- Computes the disjunction of a Boolean list. or :: [Bool] -> Bool or = foldr (||) False --- Is there an element in a list satisfying a given predicate? any :: (a -> Bool) -> [a] -> Bool any p = or . map p --- Is a given predicate satisfied by all elements in a list? all :: (a -> Bool) -> [a] -> Bool all p = and . map p --- Element of a list? elem :: Eq a => a -> [a] -> Bool elem x = any (x ==) --- Not element of a list? notElem :: Eq a => a -> [a] -> Bool notElem x = all (x /=) --- Looks up a key in an association list. lookup :: Eq a => a -> [(a, b)] -> Maybe b lookup _ [] = Nothing lookup k ((x,y):xys) | k == x = Just y | otherwise = lookup k xys data Maybe a = Nothing | Just a deriving (Eq, Ord, Show, Read) instance Monoid a => Monoid (Maybe a) where mempty = Nothing Nothing `mappend` m = m Just m1 `mappend` Nothing = Just m1 Just m1 `mappend` Just m2 = Just (m1 `mappend` m2) instance Functor Maybe where fmap _ Nothing = Nothing fmap f (Just x) = Just (f x) instance Applicative Maybe where pure = Just Just f <*> m = fmap f m Nothing <*> _ = Nothing Just _ *> m = m Nothing *> _ = Nothing liftA2 f (Just x) (Just y) = Just (f x y) liftA2 _ (Just _) Nothing = Nothing liftA2 _ Nothing _ = Nothing instance Alternative Maybe where empty = Nothing Nothing <|> r = r Just l <|> _ = Just l instance Monad Maybe where Nothing >>= _ = Nothing Just x >>= k = k x (>>) = (*>) instance MonadFail Maybe where fail _ = Nothing maybe :: b -> (a -> b) -> Maybe a -> b maybe n _ Nothing = n maybe _ f (Just x) = f x data Either a b = Left a | Right b deriving (Eq, Ord, Show, Read) instance Functor (Either a) where fmap _ (Left e) = Left e fmap f (Right x) = Right (f x) instance Applicative (Either a) where pure = Right (<*>) = ap instance Monad (Either a) where return = Right (Left e) >>= _ = Left e (Right x) >>= f = f x either :: (a -> c) -> (b -> c) -> Either a b -> c either left _ (Left a) = left a either _ right (Right b) = right b external data IO _ instance Monoid a => Monoid (IO a) where mempty = pure mempty mappend = liftA2 mappend instance Functor IO where fmap f x = x >>= (pure . f) instance Applicative IO where pure = returnIO #ifdef __PAKCS__ (*>) = seqIO #else m *> k = m >>= \_ -> k #endif (<*>) = ap liftA2 = liftM2 instance Alternative IO where empty = fail "mzero" m <|> n = m `catch` const n instance Monad IO where (>>=) = bindIO (>>) = (*>) instance MonadFail IO where fail s = ioError (userError s) bindIO :: IO a -> (a -> IO b) -> IO b bindIO external seqIO :: IO a -> IO b -> IO b seqIO external returnIO :: a -> IO a returnIO external --- An action that reads a character from standard output and returns it. getChar :: IO Char getChar external --- An action that reads a line from standard input and returns it. getLine :: IO String getLine = do c <- getChar case c of '\n' -> return [] _ -> do cs <- getLine return (c : cs) --- An action that puts its character argument on standard output. putChar :: Char -> IO () putChar c = prim_putChar $# c prim_putChar :: Char -> IO () prim_putChar external --- Action to print a string on standard output. putStr :: String -> IO () putStr [] = return () putStr (c:cs) = putChar c >> putStr cs --- Action to print a string with a newline on standard output. putStrLn :: String -> IO () putStrLn cs = putStr cs >> putChar '\n' --- Converts a term into a string and prints it. print :: Show a => a -> IO () print = putStrLn . show type FilePath = String --- An action that (lazily) reads a file and returns its contents. readFile :: FilePath -> IO String readFile f = prim_readFile $## f prim_readFile :: FilePath -> IO String prim_readFile external #ifdef __PAKCS__ -- Needed for internal implementation of readFile. prim_readFileContents :: FilePath -> String prim_readFileContents external #endif --- An action that writes a file. writeFile :: FilePath -> String -> IO () writeFile f s = (prim_writeFile $## f) s prim_writeFile :: FilePath -> String -> IO () prim_writeFile external --- An action that appends a string to a file. --- It behaves like `writeFile` if the file does not exist. appendFile :: FilePath -> String -> IO () appendFile f s = (prim_appendFile $## f) s prim_appendFile :: FilePath -> String -> IO () prim_appendFile external --- The (abstract) type of error values. --- Currently, it distinguishes between general I/O errors, --- user-generated errors (see 'userError'), failures and non-determinism --- errors during I/O computations. These errors can be caught by 'catch'. --- Each error contains a string shortly explaining the error. --- This type might be extended in the future to distinguish --- further error situations. data IOError = IOError String -- normal IO error | UserError String -- user-specified error | FailError String -- failing computation | NondetError String -- non-deterministic computation deriving Eq instance Show IOError where show (IOError s) = "i/o error: " ++ s show (UserError s) = "user error: " ++ s show (FailError s) = "fail error: " ++ s show (NondetError s) = "nondet error: " ++ s --- A user error value is created by providing a description of the --- error situation as a string. userError :: String -> IOError userError = UserError --- Raises an I/O exception with a given error value. ioError :: IOError -> IO _ #ifdef __PAKCS__ ioError err = error (show err) #else ioError err = prim_ioError $## err prim_ioError :: IOError -> IO _ prim_ioError external #endif --- Catches a possible error or failure during the execution of an --- I/O action. `catch act errfun` executes the I/O action `act`. --- If an exception or failure occurs during this I/O action, the --- function `errfun` is applied to the error value. catch :: IO a -> (IOError -> IO a) -> IO a catch external type Success = Bool --- The always satisfiable constraint. success :: Success success = True --- Enforce a Boolean condition to be true. --- The computation fails if the argument evaluates to `False`. solve :: Bool -> Bool solve True = True --- Solves a constraint as an I/O action. --- Note: The constraint should be always solvable in a deterministic way. doSolve :: Bool -> IO () doSolve b | b = return () --- The equational constraint. --- `(e1 =:= e2)` is satisfiable if both sides `e1` and `e2` can be --- reduced to a unifiable data term (i.e., a term without defined --- function symbols). (=:=) :: Data a => a -> a -> Bool x =:= y = constrEq x y constrEq :: a -> a -> Bool constrEq external --- Non-strict equational constraint. Used to implement functional patterns. (=:<=) :: Data a => a -> a -> Bool x =:<= y = nonstrictEq x y nonstrictEq :: a -> a -> Bool nonstrictEq external #ifdef __PAKCS__ --- Non-strict equational constraint for linear functional patterns. --- Thus, it must be ensured that the first argument is always (after evalutation --- by narrowing) a linear pattern. Experimental. (=:<<=) :: Data a => a -> a -> Bool x =:<<= y = unifEqLinear x y unifEqLinear :: a -> a -> Bool unifEqLinear external --- internal function to implement =:<= ifVar :: _ -> a -> a -> a ifVar external #endif --- Concurrent conjunction. --- An expression like `(c1 & c2)` is evaluated by evaluating --- the `c1` and `c2` in a concurrent manner. (&) :: Bool -> Bool -> Bool (&) external --- Conditional expression. --- An expression like `(c &> e)` is evaluated by evaluating the first --- argument to `True` and then evaluating `e`. --- The expression has no value if the condition does not evaluate to `True`. (&>) :: Bool -> a -> a True &> x = x --- Non-deterministic choice _par excellence_. --- The value of `x ? y` is either `x` or `y`. (?) :: a -> a -> a x ? _ = x _ ? y = y --- Returns non-deterministically any element of a list. anyOf :: [a] -> a anyOf = foldr1 (?) --- Evaluates to a fresh free variable. unknown :: Data a => a unknown = let x free in x --- A non-reducible polymorphic function. --- It is useful to express a failure in a search branch of the execution. failed :: _ failed external --- Aborts the execution with an error message. error :: String -> _ error x = prim_error $## x prim_error :: String -> _ prim_error external -- Representation of higher-order applications in FlatCurry. apply :: (a -> b) -> a -> b apply external -- Representation of conditional rules in FlatCurry. cond :: Bool -> a -> a cond external #ifdef __PAKCS__ -- `letrec ones (1 : ones)` binds `ones` to `1 : ones`. letrec :: a -> a -> Bool letrec external -- Internal operation to implement failure reporting. failure :: _ -> _ -> _ failure external #endif ================================================ FILE: samples/Cycript/utils.cy ================================================ (function(utils) { // Load C functions declared in utils.loadFuncs var shouldLoadCFuncs = true; // Expose the C functions to cycript's global scope var shouldExposeCFuncs = true; // Expose C constants to cycript's global scope var shouldExposeConsts = true; // Expose functions defined here to cycript's global scope var shouldExposeFuncs = true; // Which functions to expose var funcsToExpose = ["exec", "include", "sizeof", "logify", "apply", "str2voidPtr", "voidPtr2str", "double2voidPtr", "voidPtr2double", "isMemoryReadable", "isObject", "makeStruct"]; // C functions that utils.loadFuncs loads var CFuncsDeclarations = [ // "void *calloc(size_t num, size_t size)", // "char *strcpy(char *restrict dst, const char *restrict src)", "char *strdup(const char *s1)", "void* memset(void* dest, int ch, size_t count)", // "FILE *fopen(const char *, const char *)", "int fclose(FILE *)", "size_t fread(void *restrict, size_t, size_t, FILE *restrict)", "size_t fwrite(const void *restrict, size_t, size_t, FILE *restrict)", // "mach_port_t mach_task_self()", "kern_return_t task_for_pid(mach_port_name_t target_tport, int pid, mach_port_name_t *tn)", "kern_return_t mach_vm_protect(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, boolean_t set_maximum, vm_prot_t new_protection)", "kern_return_t mach_vm_write(vm_map_t target_task, mach_vm_address_t address, vm_offset_t data, mach_msg_type_number_t dataCnt)", "kern_return_t mach_vm_read(vm_map_t target_task, mach_vm_address_t address, mach_vm_size_t size, vm_offset_t *data, mach_msg_type_number_t *dataCnt)", ]; /* Replacement for eval that can handle @encode etc. Usage: cy# utils.exec("@encode(void *(int, char))") @encode(void*(int,char)) */ utils.exec = function(str) { var mkdir = @encode(int (const char *, int))(dlsym(RTLD_DEFAULT, "mkdir")); var tempnam = @encode(char *(const char *, const char *))(dlsym(RTLD_DEFAULT, "tempnam")); var fopen = @encode(void *(const char *, const char *))(dlsym(RTLD_DEFAULT, "fopen")); var fclose = @encode(int (void *))(dlsym(RTLD_DEFAULT, "fclose")); var fwrite = @encode(int (const char *, int, int, void *))(dlsym(RTLD_DEFAULT, "fwrite")); var symlink = @encode(int (const char *, const char *))(dlsym(RTLD_DEFAULT, "symlink")); var unlink = @encode(int (const char *))(dlsym(RTLD_DEFAULT, "unlink")); var getenv = @encode(const char *(const char *))(dlsym(RTLD_DEFAULT, "getenv")); var setenv = @encode(int (const char *, const char *, int))(dlsym(RTLD_DEFAULT, "setenv")); var libdir = "/usr/lib/cycript0.9"; var dir = libdir + "/tmp"; mkdir(dir, 0777); // This is needed because tempnam seems to ignore the first argument on i386 var old_tmpdir = getenv("TMPDIR"); setenv("TMPDIR", dir, 1); // No freeing :( var f = tempnam(dir, "exec-"); setenv("TMPDIR", old_tmpdir, 1); if(!f) { return false; } symlink(f, f + ".cy"); str = "exports.result = " + str; var handle = fopen(f, "w"); fwrite(str, str.length, 1, handle); fclose(handle); var r; var except = null; try { r = require(f.replace(libdir + "/", "")); } catch(e) { except = e; } unlink(f + ".cy"); unlink(f); if(except !== null) { throw except; } return r.result; }; /* Applies known typedefs Used in utils.include and utils.makeStruct Usage: cy# utils.applyTypedefs("mach_vm_address_t") "uint64_t" */ utils.applyTypedefs = function(str) { var typedefs = { "struct": "", "restrict": "", "FILE": "void", "size_t": "uint64_t", "uintptr_t": "unsigned long", "kern_return_t": "int", "mach_port_t": "unsigned int", "mach_port_name_t": "unsigned int", "vm_offset_t": "unsigned long", "vm_size_t": "unsigned long", "mach_vm_address_t": "uint64_t", "mach_vm_offset_t": "uint64_t", "mach_vm_size_t": "uint64_t", "vm_map_offset_t": "uint64_t", "vm_map_address_t": "uint64_t", "vm_map_size_t": "uint64_t", "mach_port_context_t": "uint64_t", "vm_map_t": "unsigned int", "boolean_t": "unsigned int", "vm_prot_t": "int", "mach_msg_type_number_t": "unsigned int", "cpu_type_t": "int", "cpu_subtype_t": "int", "cpu_threadtype_t": "int", }; for(var k in typedefs) { str = str.replace(new RegExp("(\\s|\\*|,|\\(|^)" + k + "(\\s|\\*|,|\\)|$)", "g"), "$1" + typedefs[k] + "$2"); } return str; }; /* Parses a C function declaration and returns the function name and cycript type If load is true, tries to load it into cycript using utils.exec Usage: cy# var str = "void *calloc(size_t num, size_t size)"; "void *calloc(size_t num, size_t size)" cy# utils.include(str) ["calloc","@encode(void *(uint64_t num, uint64_t size))(140735674376857)"] cy# var ret = utils.include(str, true) ["calloc",0x7fff93e0e299] cy# ret[1].type @encode(void*(unsigned long long int,unsigned long long int)) cy# ret[1](100, 1) 0x100444100 */ utils.include = function(str, load) { var re = /^\s*([^(]*(?:\s+|\*))(\w*)\s*\(([^)]*)\)\s*;?\s*$/; var match = re.exec(str); if(!match) { return -1; } var rType = utils.applyTypedefs(match[1]); var name = match[2]; var args = match[3]; var argsRe = /([^,]+)(?:,|$)/g; var argsTypes = []; while((match = argsRe.exec(args)) !== null) { var type = utils.applyTypedefs(match[1]); argsTypes.push(type); } var encodeString = "@encode("; encodeString += rType + "("; encodeString += argsTypes.join(", ") + "))"; var fun = dlsym(RTLD_DEFAULT, name); if(fun !== null) { encodeString += "(" + fun + ")"; if(load) { return [name, utils.exec(encodeString)]; } } else if(load) { throw "Function couldn't be found with dlsym!"; } return [name, encodeString]; }; /* Loads the function declaration in the defs array using utils.exec and exposes to cycript's global scope Is automatically called if shouldLoadCFuncs is true */ utils.funcs = {}; utils.loadfuncs = function(expose) { for(var i = 0; i < CFuncsDeclarations.length; i++) { try { var o = utils.include(CFuncsDeclarations[i], true); utils.funcs[o[0]] = o[1]; if(expose) { Cycript.all[o[0]] = o[1]; } } catch(e) { system.print("Failed to load function: " + i); try { system.print(utils.include(CFuncsDeclarations[i])); } catch(e2) { } } } }; /* Calculates the size of a type like the C operator sizeof Usage: cy# utils.sizeof(int) 4 cy# utils.sizeof(@encode(void *)) 8 cy# utils.sizeof("mach_vm_address_t") 8 */ utils.sizeof = function(type) { if(typeof type === "string") { type = utils.applyTypedefs(type); type = utils.exec("@encode(" + type + ")"); } // (const) char * has "infinite" preceision if(type.toString().slice(-1) === "*") { return utils.sizeof(@encode(void *)); } // float and double if(type.toString() === @encode(float).toString()) { return 4; } else if (type.toString() === @encode(double).toString()) { return 8; } var typeInstance = type(0); if(typeInstance instanceof Object) { // Arrays if("length" in typeInstance) { return typeInstance.length * utils.sizeof(typeInstance.type); } // Structs if(typeInstance.toString() === "[object Struct]") { var typeStr = type.toString(); var arrayTypeStr = "[2" + typeStr + "]"; var arrayType = new Type(arrayTypeStr); var arrayInstance = new arrayType; return @encode(void *)(&(arrayInstance[1])) - @encode(void *)(&(arrayInstance[0])); } } for(var i = 0; i < 5; i++) { var maxSigned = Math.pow(2, 8 * Math.pow(2, i) - 1) - 1; if(i === 3) { // Floating point fix ;^) maxSigned /= 1000; } // can't use !== or sizeof(void *) === 0.5 if(type(maxSigned) != maxSigned) { return Math.pow(2, i - 1); } } }; /* Logs a specific message sent to an instance of a class like logify.pl in theos Requires Cydia Substrate (com.saurik.substrate.MS) and NSLog (org.cycript.NSLog) modules Returns the old message returned by MS.hookMessage (Note: this is not just the old message!) Usage: cy# var oldm = utils.logify(objc_getMetaClass(NSNumber), @selector(numberWithDouble:)) ... cy# var n = [NSNumber numberWithDouble:1.5] 2014-07-28 02:26:39.805 cycript[71213:507] +[ numberWithDouble:1.5] 2014-07-28 02:26:39.806 cycript[71213:507] = 1.5 @1.5 */ utils.logify = function(cls, sel) { @import com.saurik.substrate.MS; @import org.cycript.NSLog; var oldm = {}; MS.hookMessage(cls, sel, function() { var args = [].slice.call(arguments); var selFormat = sel.toString().replace(/:/g, ":%@ ").trim(); var logFormat = "%@[<%@: 0x%@> " + selFormat + "]"; var standardArgs = [logFormat, class_isMetaClass(cls)? "+": "-", cls.toString(), (&this).valueOf().toString(16)]; var logArgs = standardArgs.concat(args); NSLog.apply(null, logArgs); var r = oldm->apply(this, arguments); if(r !== undefined) { NSLog(" = %@", r); } return r; }, oldm); return oldm; }; /* Calls a C function by providing its name and arguments Doesn't support structs Return value is always a void pointer Usage: cy# utils.apply("printf", ["%s %.3s, %d -> %c, float: %f\n", "foo", "barrrr", 97, 97, 1.5]) foo bar, 97 -> a, float: 1.500000 0x22 */ utils.apply = function(fun, args) { if(!(args instanceof Array)) { throw "Args needs to be an array!"; } var argc = args.length; var voidPtr = @encode(void *); var argTypes = []; for(var i = 0; i < argc; i++) { var argType = voidPtr; var arg = args[i]; if(typeof arg === "string") { argType = @encode(char *); } if(typeof arg === "number" && arg % 1 !== 0) { argType = @encode(double); } argTypes.push(argType); } var type = voidPtr.functionWith.apply(voidPtr, argTypes); if(typeof fun === "string") { fun = dlsym(RTLD_DEFAULT, fun); } if(!fun) { throw "Function not found!"; } return type(fun).apply(null, args); }; /* Converts a string (char *) to a void pointer (void *) You can't cast to strings to void pointers and vice versa in cycript. Blame saurik. Usage: cy# var voidPtr = utils.str2voidPtr("foobar") 0x100331590 cy# utils.voidPtr2str(voidPtr) "foobar" */ utils.str2voidPtr = function(str) { var strdup = @encode(void *(char *))(dlsym(RTLD_DEFAULT, "strdup")); return strdup(str); }; /* The inverse function of str2voidPtr */ utils.voidPtr2str = function(voidPtr) { var strdup = @encode(char *(void *))(dlsym(RTLD_DEFAULT, "strdup")); return strdup(voidPtr); }; /* Converts a double into a void pointer This can be used to view the binary representation of a floating point number Usage: cy# var n = utils.double2voidPtr(-1.5) 0xbff8000000000000 cy# utils.voidPtr2double(n) -1.5 */ utils.double2voidPtr = function(n) { var doublePtr = new double; *doublePtr = n; var voidPtrPtr = @encode(void **)(doublePtr); return *voidPtrPtr; }; /* The inverse function of double2voidPtr */ utils.voidPtr2double = function(voidPtr) { var voidPtrPtr = new @encode(void **); *voidPtrPtr = voidPtr; var doublePtr = @encode(double *)(voidPtrPtr); return *doublePtr; }; /* Determines in a safe way if a memory location is readable Usage: cy# utils.isMemoryReadable(0) false cy# utils.isMemoryReadable(0x1337) false cy# utils.isMemoryReadable(NSObject) true cy# var a = malloc(100); utils.isMemoryReadable(a) true */ utils.isMemoryReadable = function(ptr) { if(typeof ptr === "string") { return true; } var fds = new @encode(int [2]); utils.apply("pipe", [fds]); var result = utils.apply("write", [fds[1], ptr, 1]) == 1; utils.apply("close", [fds[0]]); utils.apply("close", [fds[1]]); return result; }; /* Determines in a safe way if the memory location contains an Objective-C object Usage: cy# utils.isObject(0) false cy# utils.isObject(0x1337) false cy# utils.isObject(NSObject) true cy# utils.isObject(objc_getMetaClass(NSObject)) true cy# utils.isObject([new NSObject init]) true cy# var a = malloc(100); utils.isObject(a) false cy# *@encode(void **)(a) = NSObject; utils.isObject(a) true */ utils.isObject = function(obj) { obj = @encode(void *)(obj); var lastObj = -1; function objc_isa_ptr(obj) { // See http://www.sealiesoftware.com/blog/archive/2013/09/24/objc_explain_Non-pointer_isa.html var objc_debug_isa_class_mask = 0x00000001fffffffa; obj = (obj & 1)? (obj & objc_debug_isa_class_mask): obj; if((obj & (utils.sizeof(@encode(void *)) - 1)) != 0) { return null; } else { return obj; } } function ptrValue(obj) { return obj? obj.valueOf(): null; } var foundMetaClass = false; for(obj = objc_isa_ptr(obj); utils.isMemoryReadable(obj); ) { obj = *@encode(void **)(obj); if(ptrValue(obj) == ptrValue(lastObj)) { foundMetaClass = true; break; } lastObj = obj; } if(!foundMetaClass) { return false; } if(lastObj === -1 || lastObj === null) { return false; } var obj_class = objc_isa_ptr(@encode(void **)(obj)[1]); if(!utils.isMemoryReadable(obj_class)) { return false; } var metaclass = objc_isa_ptr(@encode(void **)(obj_class)[0]); var superclass = objc_isa_ptr(@encode(void **)(obj_class)[1]); return ptrValue(obj) == ptrValue(metaclass) && superclass == null; }; /* Creates a cycript struct type from a C struct definition Usage: cy# var foo = makeStruct("int a; short b; char c; uint64_t d; double e;", "foo"); @encode(foo) cy# var f = new foo &{a:0,b:0,c:0,d:0,e:0} cy# f->a = 100; f &{a:100,b:0,c:0,d:0,e:0} cy# *@encode(int *)(f) 100 */ utils.makeStruct = function(str, name) { var fieldRe = /(?:\s|\n)*([^;]+\s*(?:\s|\*))([^;]+)\s*;/g; if(!name) { name = "struct" + Math.floor(Math.random() * 100000); } var typeStr = "{" + name + "="; while((match = fieldRe.exec(str)) !== null) { var fieldType = utils.applyTypedefs(match[1]); var fieldName = match[2]; var encodedType = utils.exec("@encode(" + fieldType + ")").toString(); typeStr += '"' + fieldName + '"' + encodedType; } typeStr += "}"; return new Type(typeStr); }; // Various constants utils.constants = { VM_PROT_NONE: 0x0, VM_PROT_READ: 0x1, VM_PROT_WRITE: 0x2, VM_PROT_EXECUTE: 0x4, VM_PROT_NO_CHANGE: 0x8, VM_PROT_COPY: 0x10, VM_PROT_WANTS_COPY: 0x10, VM_PROT_IS_MASK: 0x40, }; var c = utils.constants; c.VM_PROT_DEFAULT = c.VM_PROT_READ | c.VM_PROT_WRITE; c.VM_PROT_ALL = c.VM_PROT_READ | c.VM_PROT_WRITE | c.VM_PROT_EXECUTE; if(shouldExposeConsts) { for(var k in c) { Cycript.all[k] = c[k]; } } if(shouldExposeFuncs) { for(var i = 0; i < funcsToExpose.length; i++) { var name = funcsToExpose[i]; Cycript.all[name] = utils[name]; } } if(shouldLoadCFuncs) { utils.loadfuncs(shouldExposeCFuncs); } })(exports); ================================================ FILE: samples/Cylc/cset-include.cylc ================================================ # Modified code samples from https://github.com/MetOffice/CSET/blob/main/cset-workflow/includes # (Apache 2.0 license) {% if DOMAIN_MEAN_SURFACE_TIME_SERIES %} {% for model_field in SURFACE_MODEL_FIELDS %} [runtime] [[pre_process_domain_mean_surface_time_series_{{model_field}}]] inherit = PARALLEL [[[environment]]] CSET_RECIPE_NAME = "generic_surface_domain_mean_time_series.yaml" CSET_ADDOPTS = "--VARNAME={{model_field}}" [[collate_domain_mean_surface_time_series_{{model_field}}]] inherit = COLLATE [[[environment]]] CSET_RECIPE_NAME = "generic_surface_domain_mean_time_series.yaml" CSET_ADDOPTS = "--VARNAME={{model_field}}" {% endfor %} {% endif %} {% if DETERMINISTIC_PLOT_CAPE_RATIO %} [runtime] [[parallel_plot_cape_ratio]] inherit = PARALLEL [[[environment]]] CSET_RECIPE_NAME = "CAPE_ratio_plot.yaml" [[collate_plot_cape_ratio]] inherit = COLLATE [[[environment]]] CSET_RECIPE_NAME = "CAPE_ratio_plot.yaml" {% endif %} {% if DOMAIN_MEAN_TIME_SERIES_STASH %} {% for stash in STASH_CODES %} [runtime] [[pre_process_stash_surface_domain_mean_time_series_{{stash}}]] inherit = PARALLEL [[[environment]]] CSET_RECIPE_NAME = "stash_surface_domain_mean_time_series.yaml" CSET_ADDOPTS = "--STASH={{stash}}" [[collate_stash_surface_domain_mean_time_series_{{stash}}]] inherit = COLLATE [[[environment]]] CSET_RECIPE_NAME = "stash_surface_domain_mean_time_series.yaml" CSET_ADDOPTS = "--STASH={{stash}}" {% endfor %} {% endif %} {% if LFRIC_DOMAIN_MEAN_SURFACE_TIME_SERIES %} {% for model_field in SURFACE_MODEL_FIELDS %} [runtime] [[pre_process_lfric_domain_mean_surface_time_series_{{model_field}}]] inherit = PARALLEL [[[environment]]] CSET_RECIPE_NAME = "lfric_generic_surface_domain_mean_time_series.yaml" CSET_ADDOPTS = """ --VARNAME={{model_field}} {% if SELECT_SUBAREA %} --SUBAREA_LAT_BOUND_BOTTOM={{SUBAREA_LAT_BOUND_BOTTOM}} --SUBAREA_LAT_BOUND_TOP={{SUBAREA_LAT_BOUND_TOP}} --SUBAREA_LON_BOUND_RIGHT={{SUBAREA_LON_BOUND_RIGHT}} --SUBAREA_LON_BOUND_LEFT={{SUBAREA_LON_BOUND_LEFT}} {% endif %} """ [[collate_lfric_domain_mean_surface_time_series_{{model_field}}]] inherit = COLLATE [[[environment]]] CSET_RECIPE_NAME = "lfric_generic_surface_domain_mean_time_series.yaml" CSET_ADDOPTS = """ --VARNAME={{model_field}} {% if SELECT_SUBAREA %} --SUBAREA_LAT_BOUND_BOTTOM={{SUBAREA_LAT_BOUND_BOTTOM}} --SUBAREA_LAT_BOUND_TOP={{SUBAREA_LAT_BOUND_TOP}} --SUBAREA_LON_BOUND_RIGHT={{SUBAREA_LON_BOUND_RIGHT}} --SUBAREA_LON_BOUND_LEFT={{SUBAREA_LON_BOUND_LEFT}} {% endif %} """ {% endfor %} {% endif %} ================================================ FILE: samples/Cylc/cset.cylc ================================================ # Modified code sample from https://github.com/MetOffice/CSET/blob/main/cset-workflow/flow.cylc # (Apache 2.0 license) [meta] title = CSET description = Workflow for running CSET. URL = https://metoffice.github.io/CSET [scheduler] UTC mode = True [scheduling] runahead limit = P{{CSET_RUNAHEAD_LIMIT}} initial cycle point = {{CSET_INITIAL_CYCLE_POINT}} final cycle point = {{CSET_FINAL_CYCLE_POINT}} [[graph]] # Only runs on the first cycle. R1/^ = """ build_conda => install_website_skeleton build_conda => install_local_cset install_website_skeleton & install_local_cset => FETCH_DATA """ # Only runs on the final cycle. R1/$ = """ process_finish => COLLATE:succeed-all => finish_website => send_email => housekeeping_full """ # Runs every cycle to process the data in parallel. {{CSET_CYCLE_PERIOD}} = """ install_website_skeleton[^] & install_local_cset[^] => FETCH_DATA:succeed-all => PARALLEL:succeed-all => process_finish => housekeeping_raw # Intercycle dependence with this task ensures the collate step waits for # the required data. process_finish[-{{CSET_CYCLE_PERIOD}}] => process_finish """ {% if CSET_INCREMENTAL_OUTPUT %} # Runs every so often to update output plots during runtime. {{CSET_INCREMENTAL_OUTPUT_PERIOD}} = """ COLLATE[-{{CSET_INCREMENTAL_OUTPUT_PERIOD}}]:finish-all & process_finish => COLLATE """ {% endif %} [runtime] [[root]] script = rose task-run -v execution time limit = PT15M [[[environment]]] CSET_ENV_USE_MODULES = {{CSET_ENV_USE_MODULES}} {% if CSET_ENV_USE_MODULES %} MODULES_LIST = {{MODULES_LIST}} MODULES_PURGE = {{MODULES_PURGE}} {% endif %} CSET_ENV_USE_CONDA = {{CSET_ENV_USE_CONDA}} {% if CSET_ENV_USE_CONDA %} CONDA_PATH = {{CONDA_PATH}} CONDA_VENV_LOCATION = {{CONDA_VENV_LOCATION}} {% endif %} CSET_ENV_SEPARATE_MET = {{CSET_ENV_SEPARATE_MET}} {% if CSET_ENV_SEPARATE_MET %} CONDA_METPLUS_VENV_LOCATION = {{CONDA_METPLUS_VENV_LOCATION}} MET_INSTALL_DIR = {{MET_INSTALL_DIR}} MET_BUILD_BASE = {{MET_BUILD_BASE}} METPLUS_BASE = {{METPLUS_BASE}} MET_LIBRARIES = {{MET_LIBRARIES}} {% endif %} LOGLEVEL = {{LOGLEVEL}} WEB_DIR = {{WEB_DIR}} COLORBAR_FILE = {{COLORBAR_FILE}} [[PARALLEL]] script = rose task-run -v --app-key=run_cset_recipe [[[environment]]] CSET_BAKE_MODE = parallel [[COLLATE]] script = rose task-run -v --app-key=run_cset_recipe [[[environment]]] CSET_BAKE_MODE = collate [[FETCH_DATA]] [[process_finish]] # Dummy task needed for workflow scheduling. script = true platform = localhost [[build_conda]] # Create the conda environment if it does not yet exist. execution time limit = PT30M [[[environment]]] CONDA_VENV_CREATE = {{CONDA_VENV_CREATE}} [[install_local_cset]] # Install CSET from source. execution time limit = PT5M [[[environment]]] CSET_ENV_USE_LOCAL_CSET = {{CSET_ENV_USE_LOCAL_CSET}} {% if CSET_ENV_USE_LOCAL_CSET %} CSET_LOCAL_CSET_PATH = {{CSET_LOCAL_CSET_PATH}} {% endif %} [[install_website_skeleton]] # Copies the static files that make up the web interface. [[[environment]]] CLEAN_WEB_DIR = {{CLEAN_WEB_DIR}} [[fetch_fcst]] # Fetch data from disk or a file based archival system. inherit = FETCH_DATA [[[environment]]] ROSE_APP_OPT_CONF_KEYS = {{FETCH_FCST_OPT_CONF}} CSET_INPUT_FILE_PATH = {{CSET_INPUT_FILE_PATH}} {% if CSET_INCREMENTAL_DATA_FETCH %} CSET_FILE_NAME_METADATA_PATTERN = {{CSET_FILE_NAME_METADATA_PATTERN}} CSET_CYCLE_PERIOD = {{CSET_CYCLE_PERIOD}} CSET_TIMES_PER_FILE = {{CSET_TIMES_PER_FILE}} CSET_FILE_TIME_OFFSET = {{CSET_FILE_TIME_OFFSET}} {% endif %} [[housekeeping_raw]] # Housekeep unprocessed data files. script = rose task-run -v --app-key=housekeeping [[[environment]]] HOUSEKEEPING_MODE = {{[HOUSEKEEPING_MODE, 1]|min}} [[housekeeping_full]] # Housekeep processed intermediate files too. script = rose task-run -v --app-key=housekeeping [[[environment]]] HOUSEKEEPING_MODE = {{[HOUSEKEEPING_MODE, 2]|min}} [[finish_website]] # Updates the workflow info in the web interface. platform = localhost [[send_email]] # Send email to notify that the workflow is complete. platform = localhost [[[environment]]] WEB_ADDR = {{WEB_ADDR}} # Include files bring their own graph and runtime sections. {% for include_file in glob("includes/*.cylc") %} {% include include_file %} {% endfor %} {# Site-specific details that add to (or override) the core suite definition #} {% include 'site/' ~ SITE ~ '.cylc' %} ================================================ FILE: samples/Cylc/model.cylc ================================================ {% set BUILD_DIR = "$CYLC_WORKFLOW_RUN_DIR/share/build" {% set initial_cycle_point = initial_cycle_point | default('2000') %} {% set final_cycle_point = final_cycle_point | default('') %} [meta] description = """ A datetime cycling workflow that builds and runs a model in a cyclic manner. """ [task parameters] diagnostic = land, air, water [scheduling] initial cycle point = {{ initial_cycle_point }} final cycle point = {{ final_cycle_point }} runahead limit = P3D [[queues]] [[[housekeep]]] limit = 1 members = housekeep [[special tasks]] clock-triggers = \ fetch(-PT10M), \ bc(PT0H) [[graph]] # startup R1 = """ configure => build => install => run_model recon => bc? # fallback bc:fail? => bc2 """ # daily cycling P1D = """ # wait for spin up bc[^]? | bc2[^] => fetch # run model and processing fetch => run_model => process => housekeep # run_model depends on the previous two runs run_model[-P1D] => run_model run_model[-P2D] => run_model """ # shutdown R1/$ = """ run_model => report => archive => housekeep """ [runtime] [[configure]] script = """ mkdir -p "{{ BUILD_DIR }}" src/configure "{{ BUILD_DIR }}" """ [[build]] platform = hpc-bg # build on login node (same arch) script = rose task-run --app-key=fcm_make [[install]] script = rsync "$SRC" "$DEST" [[[environment]]] SRC = {{ BUILD_DIR }} DEST = $CYLC_WORKFLOW_RUN_DIR/lib/build [[BC]] script = rose task-run --app-key=create_bc [[environment]] OROG = N34 [[bc]] inherit = BC execution time limit = PT10M completion = succeeded or failed [[bc2]] # fallback if bc fails -> shortstep and force override inherit = BC execution time limit = PT15M [[[environment]]] SS = .true. FORCE = .true. [[HPC]] platform = hpc [[[directives]]] --nodes=32 --mem-per-node=128Gb [[run_model]] inherit = HPC pre-script = eval $(rose task-env) script = rose task-run --debug err-script = model-debug # only run if the task fails submission retry delays = 1*PT1M, 5*PT5M execution time limit = PT1H15M [[[environment]]] # strip time off of the cycle point for model use MODEL_TIME = $(isodatetime "${CYLC_TASK_CYCLE_POINT}" --format=CCYYMMDD) [[fetch]] pre-script = eval $(rose task-env) script = rose task-run execution retry delays = 1*PT1M, 2*PT5M, 5*PT10M [[]] # family representing a model diagnostic [[[environment]]] DIAG = fcum_%(diagnostic)s [[process]] inherit = script = rose task-run [[process]] # override the STASH code for the aircraft diagnostic [[[environment]]] STASH = a90d23a10e8500 [[report]] script = make-report && mv report.html "${CYLC_WORKFLOW_SHARE_DIR}" [[archive]] script = rose task-run --app-key=rose_arch [[housekeep]] pre-script = eval $(rose task-env) script = rose task-run --app-key=rose_prune ================================================ FILE: samples/Cypher/db_export_res.cypher ================================================ :begin CREATE CONSTRAINT ON (node:`UNIQUE IMPORT LABEL`) ASSERT (node.`UNIQUE IMPORT ID`) IS UNIQUE; :commit :begin UNWIND [{_id:0, properties:{tagline:"Welcome to the Real World", title:"The Matrix", released:1999}}] AS row CREATE (n:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row._id}) SET n += row.properties SET n:Movie; UNWIND [{_id:1, properties:{born:1964, name:"Keanu Reeves"}}, {_id:2, properties:{born:1967, name:"Carrie-Anne Moss"}}, {_id:3, properties:{born:1961, name:"Laurence Fishburne"}}, {_id:4, properties:{born:1960, name:"Hugo Weaving"}}, {_id:5, properties:{born:1967, name:"Lilly Wachowski"}}, {_id:6, properties:{born:1965, name:"Lana Wachowski"}}, {_id:7, properties:{born:1952, name:"Joel Silver"}}] AS row CREATE (n:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row._id}) SET n += row.properties SET n:Person; :commit :begin UNWIND [{start: {_id:1}, end: {_id:0}, properties:{roles:["Neo"]}}, {start: {_id:2}, end: {_id:0}, properties:{roles:["Trinity"]}}, {start: {_id:3}, end: {_id:0}, properties:{roles:["Morpheus"]}}, {start: {_id:4}, end: {_id:0}, properties:{roles:["Agent Smith"]}}] AS row MATCH (start:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.start._id}) MATCH (end:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.end._id}) CREATE (start)-[r:ACTED_IN]->(end) SET r += row.properties; UNWIND [{start: {_id:7}, end: {_id:0}, properties:{}}] AS row MATCH (start:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.start._id}) MATCH (end:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.end._id}) CREATE (start)-[r:PRODUCED]->(end) SET r += row.properties; UNWIND [{start: {_id:5}, end: {_id:0}, properties:{}}, {start: {_id:6}, end: {_id:0}, properties:{}}] AS row MATCH (start:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.start._id}) MATCH (end:`UNIQUE IMPORT LABEL`{`UNIQUE IMPORT ID`: row.end._id}) CREATE (start)-[r:DIRECTED]->(end) SET r += row.properties; :commit :begin MATCH (n:`UNIQUE IMPORT LABEL`) WITH n LIMIT 20000 REMOVE n:`UNIQUE IMPORT LABEL` REMOVE n.`UNIQUE IMPORT ID`; :commit :begin DROP CONSTRAINT ON (node:`UNIQUE IMPORT LABEL`) ASSERT (node.`UNIQUE IMPORT ID`) IS UNIQUE; :commit ================================================ FILE: samples/Cypher/graphgems.cyp ================================================ // From: https://github.com/neo4j/cypher-shell/blob/4.3/cypher-shell/src/test/resources/org/neo4j/shell/parser/graphgems.cypher //GRAPHGEMS //10 (?) cypher queries that will blow your mind //1. The meta-graph MATCH (a)-[r]->(b) WITH labels(a) AS a_labels,type(r) AS rel_type,labels(b) AS b_labels UNWIND a_labels as l UNWIND b_labels as l2 MERGE (a:Meta_Node {name:l}) MERGE (b:Meta_Node {name:l2}) MERGE (a)-[:META_RELATIONSHIP {name:rel_type}]->(b) RETURN distinct l as first_node, rel_type as connected_by, l2 as second_node //2. Betweenness centrality ftw MATCH p=allShortestPaths((source:Person)-[:KNOWS*]-(target:Person)) WHERE id(source) < id(target) and length(p) > 1 UNWIND nodes(p)[1..-1] as n RETURN n.firstname, n.lastname, count(*) as betweenness ORDER BY betweenness DESC; //3. Pagerank ftw //3.a Graph Theory: calculate the PageRank UNWIND range(1,2) AS round MATCH (n:Person) WHERE rand() < 0.1 MATCH (n:Person)-[:KNOWS*..5]->(m:Person) SET m.rank = coalesce(m.rank,0) + 1 //3.b Graph Theory: Show the PageRank match (n:Person) where n.rank is not null return n.firstname, n.lastname, n.rank order by n.rank desc limit 10; //4. Weighted shortest path START startNode=node:node_auto_index(name="Start"), endNode=node:node_auto_index(name="Finish") MATCH p=(startNode)-[:NAVIGATE_TO*]->(endNode) RETURN p AS shortestPath, reduce(distance=0, r in relationships(p) | distance+r.distance) AS totalDistance ORDER BY totalDistance ASC LIMIT 1; //5. Creating an in-graph index based on ordering node properties match (t:Time)--(d:Day {date: 20150506}) with t order by t.time ASC with collect(t) as times foreach (i in range(0,length(times)-2) | foreach (t1 in [times[i]] | foreach (t2 in [times[i+1]] | merge (t1)-[:FOLLOWED_BY]->(t2)))); //6. Graph Karaoke //create the karaoke graph load csv with headers from "https://docs.google.com/a/neotechnology.com/spreadsheets/d/1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE/export?format=csv&id=1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE&gid=0" as csv with csv.Sequence as seq, csv.Songsentence as row unwind row as text with seq, reduce(t=tolower(text), delim in [",",".","!","?",'"',":",";","'","-"] | replace(t,delim,"")) as normalized with seq, [w in split(normalized," ") | trim(w)] as words unwind range(0,size(words)-2) as idx MERGE (w1:Word {name:words[idx], seq:toInteger(seq)}) MERGE (w2:Word {name:words[idx+1], seq:toInteger(seq)}) MERGE (w1)-[r:NEXT {seq:toInteger(seq)}]->(w2) match (endword:Word), (startword:Word) where not ()-[:NEXT]->(startword) and not (endword)-[:NEXT]->() and startword.seq=endword.seq+1 merge (endword)-[:NEXTSENTENCE]->(startword) //7. The Timetree WITH range(2011, 2014) AS years, range(1,12) as months FOREACH(year IN years | MERGE (y:Year {year: year}) FOREACH(month IN months | CREATE (m:Month {month: month}) MERGE (y)-[:HAS_MONTH]->(m) FOREACH(day IN (CASE WHEN month IN [1,3,5,7,8,10,12] THEN range(1,31) WHEN month = 2 THEN CASE WHEN year % 4 <> 0 THEN range(1,28) WHEN year % 100 <> 0 THEN range(1,29) WHEN year % 400 <> 0 THEN range(1,29) ELSE range(1,28) END ELSE range(1,30) END) | CREATE (d:Day {day: day}) MERGE (m)-[:HAS_DAY]->(d)))) WITH * MATCH (year:Year)-[:HAS_MONTH]->(month)-[:HAS_DAY]->(day) WITH year,month,day ORDER BY year.year, month.month, day.day WITH collect(day) as days FOREACH(i in RANGE(0, length(days)-2) | FOREACH(day1 in [days[i]] | FOREACH(day2 in [days[i+1]] | CREATE UNIQUE (day1)-[:NEXT]->(day2)))) //8. Mark's recommendation query MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend) WITH me, potentialFriend, COUNT(*) AS friendsInCommon WITH me, potentialFriend, SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation, abs( me.age - potentialFriend.age) AS ageDifference, LABELS(me) = LABELS(potentialFriend) AS gender, friendsInCommon WHERE NOT (me)-[:FRIEND_OF]-(potentialFriend) WITH potentialFriend, // 100 -> maxScore, 10 -> eightyPercentLevel, friendsInCommon -> score (from the formula above) 100 * (1 - exp((-1.0 * (log(5.0) / 10)) * friendsInCommon)) AS friendsInCommon, sameLocation * 10 AS sameLocation, -1 * (10 * (1 - exp((-1.0 * (log(5.0) / 20)) * ageDifference))) AS ageDifference, CASE WHEN gender THEN 10 ELSE 0 END as sameGender RETURN potentialFriend, {friendsInCommon: friendsInCommon, sameLocation: sameLocation, ageDifference:ageDifference, sameGender: sameGender} AS parts, friendsInCommon + sameLocation + ageDifference + sameGender AS score ORDER BY score DESC //9. The Daisy! CREATE (a:Middle {name:""}) -[:STALK]-> (b:Root {name:""}) FOREACH (i in RANGE(1,10) | CREATE (a) -[:PETAL]-> (a)) RETURN a, b //10. MERGE on dense nodes // see http://stackoverflow.com/questions/30930311/how-can-i-optimise-a-neo4j-merge-query-on-a-node-with-many-relationships/30932777#30932777 convert this MATCH (from:Node { id: 0 }) UNWIND RANGE(1,10000) AS i MATCH (to:Node { id: i}) MERGE (to)<-[:HAS]-(from); to MATCH (from:Node { id: 0 }) UNWIND RANGE(1,100000) AS i MATCH (to:Node { id: i}) WHERE shortestPath((to)<-[:HAS]-(from)) IS NULL CREATE (from)-[:HAS]->(to); ================================================ FILE: samples/Cypher/graphgems.cypher ================================================ // From: https://github.com/neo4j/cypher-shell/blob/4.3/cypher-shell/src/test/resources/org/neo4j/shell/parser/graphgems.cypher //GRAPHGEMS //10 (?) cypher queries that will blow your mind //1. The meta-graph MATCH (a)-[r]->(b) WITH labels(a) AS a_labels,type(r) AS rel_type,labels(b) AS b_labels UNWIND a_labels as l UNWIND b_labels as l2 MERGE (a:Meta_Node {name:l}) MERGE (b:Meta_Node {name:l2}) MERGE (a)-[:META_RELATIONSHIP {name:rel_type}]->(b) RETURN distinct l as first_node, rel_type as connected_by, l2 as second_node //2. Betweenness centrality ftw MATCH p=allShortestPaths((source:Person)-[:KNOWS*]-(target:Person)) WHERE id(source) < id(target) and length(p) > 1 UNWIND nodes(p)[1..-1] as n RETURN n.firstname, n.lastname, count(*) as betweenness ORDER BY betweenness DESC; //3. Pagerank ftw //3.a Graph Theory: calculate the PageRank UNWIND range(1,2) AS round MATCH (n:Person) WHERE rand() < 0.1 MATCH (n:Person)-[:KNOWS*..5]->(m:Person) SET m.rank = coalesce(m.rank,0) + 1 //3.b Graph Theory: Show the PageRank match (n:Person) where n.rank is not null return n.firstname, n.lastname, n.rank order by n.rank desc limit 10; //4. Weighted shortest path START startNode=node:node_auto_index(name="Start"), endNode=node:node_auto_index(name="Finish") MATCH p=(startNode)-[:NAVIGATE_TO*]->(endNode) RETURN p AS shortestPath, reduce(distance=0, r in relationships(p) | distance+r.distance) AS totalDistance ORDER BY totalDistance ASC LIMIT 1; //5. Creating an in-graph index based on ordering node properties match (t:Time)--(d:Day {date: 20150506}) with t order by t.time ASC with collect(t) as times foreach (i in range(0,length(times)-2) | foreach (t1 in [times[i]] | foreach (t2 in [times[i+1]] | merge (t1)-[:FOLLOWED_BY]->(t2)))); //6. Graph Karaoke //create the karaoke graph load csv with headers from "https://docs.google.com/a/neotechnology.com/spreadsheets/d/1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE/export?format=csv&id=1Q8W7hDOnkXiLanf2K3P85wAhqQG_qm7bTwI36MbB5fE&gid=0" as csv with csv.Sequence as seq, csv.Songsentence as row unwind row as text with seq, reduce(t=tolower(text), delim in [",",".","!","?",'"',":",";","'","-"] | replace(t,delim,"")) as normalized with seq, [w in split(normalized," ") | trim(w)] as words unwind range(0,size(words)-2) as idx MERGE (w1:Word {name:words[idx], seq:toInteger(seq)}) MERGE (w2:Word {name:words[idx+1], seq:toInteger(seq)}) MERGE (w1)-[r:NEXT {seq:toInteger(seq)}]->(w2) match (endword:Word), (startword:Word) where not ()-[:NEXT]->(startword) and not (endword)-[:NEXT]->() and startword.seq=endword.seq+1 merge (endword)-[:NEXTSENTENCE]->(startword) //7. The Timetree WITH range(2011, 2014) AS years, range(1,12) as months FOREACH(year IN years | MERGE (y:Year {year: year}) FOREACH(month IN months | CREATE (m:Month {month: month}) MERGE (y)-[:HAS_MONTH]->(m) FOREACH(day IN (CASE WHEN month IN [1,3,5,7,8,10,12] THEN range(1,31) WHEN month = 2 THEN CASE WHEN year % 4 <> 0 THEN range(1,28) WHEN year % 100 <> 0 THEN range(1,29) WHEN year % 400 <> 0 THEN range(1,29) ELSE range(1,28) END ELSE range(1,30) END) | CREATE (d:Day {day: day}) MERGE (m)-[:HAS_DAY]->(d)))) WITH * MATCH (year:Year)-[:HAS_MONTH]->(month)-[:HAS_DAY]->(day) WITH year,month,day ORDER BY year.year, month.month, day.day WITH collect(day) as days FOREACH(i in RANGE(0, length(days)-2) | FOREACH(day1 in [days[i]] | FOREACH(day2 in [days[i+1]] | CREATE UNIQUE (day1)-[:NEXT]->(day2)))) //8. Mark's recommendation query MATCH (me:Person {name: "Adam"}) MATCH (me)-[:FRIEND_OF]-()-[:FRIEND_OF]-(potentialFriend) WITH me, potentialFriend, COUNT(*) AS friendsInCommon WITH me, potentialFriend, SIZE((potentialFriend)-[:LIVES_IN]->()<-[:LIVES_IN]-(me)) AS sameLocation, abs( me.age - potentialFriend.age) AS ageDifference, LABELS(me) = LABELS(potentialFriend) AS gender, friendsInCommon WHERE NOT (me)-[:FRIEND_OF]-(potentialFriend) WITH potentialFriend, // 100 -> maxScore, 10 -> eightyPercentLevel, friendsInCommon -> score (from the formula above) 100 * (1 - exp((-1.0 * (log(5.0) / 10)) * friendsInCommon)) AS friendsInCommon, sameLocation * 10 AS sameLocation, -1 * (10 * (1 - exp((-1.0 * (log(5.0) / 20)) * ageDifference))) AS ageDifference, CASE WHEN gender THEN 10 ELSE 0 END as sameGender RETURN potentialFriend, {friendsInCommon: friendsInCommon, sameLocation: sameLocation, ageDifference:ageDifference, sameGender: sameGender} AS parts, friendsInCommon + sameLocation + ageDifference + sameGender AS score ORDER BY score DESC //9. The Daisy! CREATE (a:Middle {name:""}) -[:STALK]-> (b:Root {name:""}) FOREACH (i in RANGE(1,10) | CREATE (a) -[:PETAL]-> (a)) RETURN a, b //10. MERGE on dense nodes // see http://stackoverflow.com/questions/30930311/how-can-i-optimise-a-neo4j-merge-query-on-a-node-with-many-relationships/30932777#30932777 convert this MATCH (from:Node { id: 0 }) UNWIND RANGE(1,10000) AS i MATCH (to:Node { id: i}) MERGE (to)<-[:HAS]-(from); to MATCH (from:Node { id: 0 }) UNWIND RANGE(1,100000) AS i MATCH (to:Node { id: i}) WHERE shortestPath((to)<-[:HAS]-(from)) IS NULL CREATE (from)-[:HAS]->(to); ================================================ FILE: samples/Cypher/load_from_json.cypher ================================================ WITH "https://api.stackexchange.com/2.2/questions?pagesize=100&order=desc&sort=creation&tagged=neo4j&site=stackoverflow&filter=!5-i6Zw8Y)4W7vpy91PMYsKM-k9yzEsSC1_Uxlf" AS url CALL apoc.load.json(url,'$.items[?(@.answer_count>0)].answers[*]') YIELD value MERGE (a:Answer {id: value.answer_id}) ON CREATE SET a.accepted = value.is_accepted, a.shareLink = value.share_link, a.lastActivityDate = value.last_activity_date, a.creationDate = value.creation_date, a.title = value.title, a.score = value.score MERGE (q:Question {id: value.question_id}) MERGE (a)-[rel:POSTED_TO]->(q) WITH a as answer, value.owner as value MERGE (u:User {userId: value.user_id}) ON CREATE SET u.displayName = value.display_name, u.userType = value.user_type, u.reputation = value.reputation, u.userLink = value.link MERGE (u)-[rel2:SUBMITTED]->(answer) RETURN count(answer) ================================================ FILE: samples/D/aa.d ================================================ /** * Implementation of associative arrays. * * Copyright: Martin Nowak 2015 -. * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) * Authors: Martin Nowak */ module core.aa; import core.memory : GC; private { // grow threshold enum GROW_NUM = 4; enum GROW_DEN = 5; // shrink threshold enum SHRINK_NUM = 1; enum SHRINK_DEN = 8; // grow factor enum GROW_FAC = 4; // growing the AA doubles it's size, so the shrink threshold must be // smaller than half the grow threshold to have a hysteresis static assert(GROW_FAC * SHRINK_NUM * GROW_DEN < GROW_NUM * SHRINK_DEN); // initial load factor (for literals), mean of both thresholds enum INIT_NUM = (GROW_DEN * SHRINK_NUM + GROW_NUM * SHRINK_DEN) / 2; enum INIT_DEN = SHRINK_DEN * GROW_DEN; // magic hash constants to distinguish empty, deleted, and filled buckets enum HASH_EMPTY = 0; enum HASH_DELETED = 0x1; enum HASH_FILLED_MARK = size_t(1) << 8 * size_t.sizeof - 1; } enum INIT_NUM_BUCKETS = 8; struct AA(Key, Val) { this(size_t sz) { impl = new Impl(nextpow2(sz)); } @property bool empty() const pure nothrow @safe @nogc { return !length; } @property size_t length() const pure nothrow @safe @nogc { return impl is null ? 0 : impl.length; } void opIndexAssign(Val val, in Key key) { // lazily alloc implementation if (impl is null) impl = new Impl(INIT_NUM_BUCKETS); // get hash and bucket for key immutable hash = calcHash(key); // found a value => assignment if (auto p = impl.findSlotLookup(hash, key)) { p.entry.val = val; return; } auto p = findSlotInsert(hash); if (p.deleted) --deleted; // check load factor and possibly grow else if (++used * GROW_DEN > dim * GROW_NUM) { grow(); p = findSlotInsert(hash); assert(p.empty); } // update search cache and allocate entry firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr)); p.hash = hash; p.entry = new Impl.Entry(key, val); // TODO: move return; } ref inout(Val) opIndex(in Key key) inout @trusted { auto p = opIn_r(key); assert(p !is null); return *p; } inout(Val)* opIn_r(in Key key) inout @trusted { if (empty) return null; immutable hash = calcHash(key); if (auto p = findSlotLookup(hash, key)) return &p.entry.val; return null; } bool remove(in Key key) { if (empty) return false; immutable hash = calcHash(key); if (auto p = findSlotLookup(hash, key)) { // clear entry p.hash = HASH_DELETED; p.entry = null; ++deleted; if (length * SHRINK_DEN < dim * SHRINK_NUM) shrink(); return true; } return false; } Val get(in Key key, lazy Val val) { auto p = opIn_r(key); return p is null ? val : *p; } ref Val getOrSet(in Key key, lazy Val val) { // lazily alloc implementation if (impl is null) impl = new Impl(INIT_NUM_BUCKETS); // get hash and bucket for key immutable hash = calcHash(key); // found a value => assignment if (auto p = impl.findSlotLookup(hash, key)) return p.entry.val; auto p = findSlotInsert(hash); if (p.deleted) --deleted; // check load factor and possibly grow else if (++used * GROW_DEN > dim * GROW_NUM) { grow(); p = findSlotInsert(hash); assert(p.empty); } // update search cache and allocate entry firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr)); p.hash = hash; p.entry = new Impl.Entry(key, val); return p.entry.val; } /** Convert the AA to the type of the builtin language AA. */ Val[Key] toBuiltinAA() pure nothrow { return cast(Val[Key]) _aaFromCoreAA(impl, rtInterface); } private: private this(inout(Impl)* impl) inout { this.impl = impl; } ref Val getLValue(in Key key) { // lazily alloc implementation if (impl is null) impl = new Impl(INIT_NUM_BUCKETS); // get hash and bucket for key immutable hash = calcHash(key); // found a value => assignment if (auto p = impl.findSlotLookup(hash, key)) return p.entry.val; auto p = findSlotInsert(hash); if (p.deleted) --deleted; // check load factor and possibly grow else if (++used * GROW_DEN > dim * GROW_NUM) { grow(); p = findSlotInsert(hash); assert(p.empty); } // update search cache and allocate entry firstUsed = min(firstUsed, cast(uint)(p - buckets.ptr)); p.hash = hash; p.entry = new Impl.Entry(key); // TODO: move return p.entry.val; } static struct Impl { this(size_t sz) { buckets = allocBuckets(sz); } @property size_t length() const pure nothrow @nogc { assert(used >= deleted); return used - deleted; } @property size_t dim() const pure nothrow @nogc { return buckets.length; } @property size_t mask() const pure nothrow @nogc { return dim - 1; } // find the first slot to insert a value with hash inout(Bucket)* findSlotInsert(size_t hash) inout pure nothrow @nogc { for (size_t i = hash & mask, j = 1;; ++j) { if (!buckets[i].filled) return &buckets[i]; i = (i + j) & mask; } } // lookup a key inout(Bucket)* findSlotLookup(size_t hash, in Key key) inout { for (size_t i = hash & mask, j = 1;; ++j) { if (buckets[i].hash == hash && key == buckets[i].entry.key) return &buckets[i]; else if (buckets[i].empty) return null; i = (i + j) & mask; } } void grow() { // If there are so many deleted entries, that growing would push us // below the shrink threshold, we just purge deleted entries instead. if (length * SHRINK_DEN < GROW_FAC * dim * SHRINK_NUM) resize(dim); else resize(GROW_FAC * dim); } void shrink() { if (dim > INIT_NUM_BUCKETS) resize(dim / GROW_FAC); } void resize(size_t ndim) pure nothrow { auto obuckets = buckets; buckets = allocBuckets(ndim); foreach (ref b; obuckets) if (b.filled) *findSlotInsert(b.hash) = b; firstUsed = 0; used -= deleted; deleted = 0; GC.free(obuckets.ptr); // safe to free b/c impossible to reference } static struct Entry { Key key; Val val; } static struct Bucket { size_t hash; Entry* entry; @property bool empty() const { return hash == HASH_EMPTY; } @property bool deleted() const { return hash == HASH_DELETED; } @property bool filled() const { return cast(ptrdiff_t) hash < 0; } } Bucket[] allocBuckets(size_t dim) @trusted pure nothrow { enum attr = GC.BlkAttr.NO_INTERIOR; immutable sz = dim * Bucket.sizeof; return (cast(Bucket*) GC.calloc(sz, attr))[0 .. dim]; } Bucket[] buckets; uint used; uint deleted; uint firstUsed; } RTInterface* rtInterface()() pure nothrow @nogc { static size_t aaLen(in void* pimpl) pure nothrow @nogc { auto aa = const(AA)(cast(const(Impl)*) pimpl); return aa.length; } static void* aaGetY(void** pimpl, in void* pkey) { auto aa = AA(cast(Impl*)*pimpl); auto res = &aa.getLValue(*cast(const(Key*)) pkey); *pimpl = aa.impl; // might have changed return res; } static inout(void)* aaInX(inout void* pimpl, in void* pkey) { auto aa = inout(AA)(cast(inout(Impl)*) pimpl); return aa.opIn_r(*cast(const(Key*)) pkey); } static bool aaDelX(void* pimpl, in void* pkey) { auto aa = AA(cast(Impl*) pimpl); return aa.remove(*cast(const(Key*)) pkey); } static immutable vtbl = RTInterface(&aaLen, &aaGetY, &aaInX, &aaDelX); return cast(RTInterface*)&vtbl; } static size_t calcHash(in ref Key key) { return hashOf(key) | HASH_FILLED_MARK; } Impl* impl; alias impl this; } package extern (C) void* _aaFromCoreAA(void* impl, RTInterface* rtIntf) pure nothrow; private: struct RTInterface { alias AA = void*; size_t function(in AA aa) pure nothrow @nogc len; void* function(AA* aa, in void* pkey) getY; inout(void)* function(inout AA aa, in void* pkey) inX; bool function(AA aa, in void* pkey) delX; } unittest { AA!(int, int) aa; assert(aa.length == 0); aa[0] = 1; assert(aa.length == 1 && aa[0] == 1); aa[1] = 2; assert(aa.length == 2 && aa[1] == 2); import core.stdc.stdio; int[int] rtaa = aa.toBuiltinAA(); assert(rtaa.length == 2); puts("length"); assert(rtaa[0] == 1); assert(rtaa[1] == 2); rtaa[2] = 3; assert(aa[2] == 3); } unittest { auto aa = AA!(int, int)(3); aa[0] = 0; aa[1] = 1; aa[2] = 2; assert(aa.length == 3); } //============================================================================== // Helper functions //------------------------------------------------------------------------------ size_t nextpow2(in size_t n) pure nothrow @nogc { import core.bitop : bsr; if (n < 2) return 1; return size_t(1) << bsr(n - 1) + 1; } pure nothrow @nogc unittest { // 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 foreach (const n, const pow2; [1, 1, 2, 4, 4, 8, 8, 8, 8, 16]) assert(nextpow2(n) == pow2); } T min(T)(T a, T b) pure nothrow @nogc { return a < b ? a : b; } T max(T)(T a, T b) pure nothrow @nogc { return b < a ? a : b; } ================================================ FILE: samples/D/arrayops.d ================================================ /** * Benchmark for array ops. * * Copyright: Copyright Martin Nowak 2016 -. * License: $(LINK2 http://www.boost.org/LICENSE_1_0.txt, Boost License 1.0) * Authors: Martin Nowak */ import core.cpuid, std.algorithm, std.datetime, std.meta, std.stdio, std.string, std.range; float[6] getLatencies(T, string op)() { enum N = (64 * (1 << 6) + 64) * T.sizeof; auto a = Array!T(N), b = Array!T(N), c = Array!T(N); float[6] latencies = float.max; foreach (i, ref latency; latencies) { auto len = 1 << i; foreach (_; 1 .. 32) { a[] = 24; b[] = 4; c[] = 2; auto sw = StopWatch(AutoStart.yes); foreach (off; size_t(0) .. size_t(64)) { off = off * len + off; enum op = op.replace("const", "2").replace("a", "a[off .. off + len]").replace("b", "b[off .. off + len]").replace("c", "c[off .. off + len]"); mixin(op ~ ";"); } latency = min(latency, sw.peek.nsecs); } } float[6] res = latencies[] / 1024; return res; } float[4] getThroughput(T, string op)() { enum N = (40 * 1024 * 1024 + 64 * T.sizeof) / T.sizeof; auto a = Array!T(N), b = Array!T(N), c = Array!T(N); float[4] latencies = float.max; size_t[4] lengths = [ 8 * 1024 / T.sizeof, 32 * 1024 / T.sizeof, 512 * 1024 / T.sizeof, 32 * 1024 * 1024 / T .sizeof ]; foreach (i, ref latency; latencies) { auto len = lengths[i] / 64; foreach (_; 1 .. 4) { a[] = 24; b[] = 4; c[] = 2; auto sw = StopWatch(AutoStart.yes); foreach (off; size_t(0) .. size_t(64)) { off = off * len + off; enum op = op.replace("const", "2").replace("a", "a[off .. off + len]").replace("b", "b[off .. off + len]").replace("c", "c[off .. off + len]"); mixin(op ~ ";"); } immutable nsecs = sw.peek.nsecs; runMasked({latency = min(latency, nsecs);}); } } float[4] throughputs = void; runMasked({throughputs = T.sizeof * lengths[] / latencies[];}); return throughputs; } string[] genOps() { string[] ops; foreach (op1; ["+", "-", "*", "/"]) { ops ~= "a " ~ op1 ~ "= b"; ops ~= "a " ~ op1 ~ "= const"; foreach (op2; ["+", "-", "*", "/"]) { ops ~= "a " ~ op1 ~ "= b " ~ op2 ~ " c"; ops ~= "a " ~ op1 ~ "= b " ~ op2 ~ " const"; } } return ops; } void runOp(string op)() { foreach (T; AliasSeq!(ubyte, ushort, uint, ulong, byte, short, int, long, float, double)) writefln("%s, %s, %(%.2f, %), %(%s, %)", T.stringof, op, getLatencies!(T, op), getThroughput!(T, op)); } struct Array(T) { import core.stdc.stdlib : free, malloc; this(size_t n) { ary = (cast(T*) malloc(T.sizeof * n))[0 .. n]; } ~this() { free(ary.ptr); } T[] ary; alias ary this; } version (X86) version = SSE; else version (X86_64) version = SSE; else static assert(0, "unimplemented"); version (SSE) { uint mxcsr() { uint ret = void; asm { stmxcsr ret; } return ret; } void mxcsr(uint val) { asm { ldmxcsr val; } } // http://softpixel.com/~cwright/programming/simd/sse.php enum FPU_EXCEPTION_MASKS = 1 << 12 | 1 << 11 | 1 << 10 | 1 << 9 | 1 << 8 | 1 << 7; enum FPU_EXCEPTION_FLAGS = 1 << 5 | 1 << 4 | 1 << 3 | 1 << 2 | 1 << 1 | 1 << 0; void maskFPUExceptions() { mxcsr = mxcsr | FPU_EXCEPTION_MASKS; } void unmaskFPUExceptions() { mxcsr = mxcsr & ~FPU_EXCEPTION_MASKS; } uint FPUExceptionFlags() { return mxcsr & FPU_EXCEPTION_FLAGS; } void clearFPUExceptionFlags() { mxcsr = mxcsr & ~FPU_EXCEPTION_FLAGS; } } void runMasked(scope void delegate() dg) { assert(FPUExceptionFlags == 0); maskFPUExceptions; dg(); clearFPUExceptionFlags; unmaskFPUExceptions; } void main() { unmaskFPUExceptions; writefln("type, op, %(latency%s, %), %-(throughput%s, %)", iota(6) .map!(i => 1 << i), ["8KB", "32KB", "512KB", "32MB"]); foreach (op; mixin("AliasSeq!(%(%s, %))".format(genOps))) runOp!op; maskFPUExceptions; } ================================================ FILE: samples/D/function.d ================================================ void foo() { } ================================================ FILE: samples/D/hello_world.d ================================================ import std.stdio; void main() { writeln("Hello World"); } ================================================ FILE: samples/D/mpq.d ================================================ /* * mpq.d -- D programming language module for libmpq * * Copyright (c) 2008 Georg Lukas * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * * This module is written to support Phobos. Patches to allow binding to * Tango are welcome. */ module mpq; /* the following pragma does not work on DMD/Linux, generates a warning on * GDC/Linux and has not been tested on Windows. Commented out for now. */ // pragma(lib, "libmpq"); import std.string; // for format() and toStringz() import std.traits; // for ParameterTypeTuple!() /* XXX: this assumes that libmpq is compiled with Large File Support on */ alias long off_t; /* libmpq error return values */ const LIBMPQ_ERROR_OPEN = -1; /* open error on file. */ const LIBMPQ_ERROR_CLOSE = -2; /* close error on file. */ const LIBMPQ_ERROR_SEEK = -3; /* lseek error on file. */ const LIBMPQ_ERROR_READ = -4; /* read error on file. */ const LIBMPQ_ERROR_WRITE = -5; /* write error on file. */ const LIBMPQ_ERROR_MALLOC = -6; /* memory allocation error. */ const LIBMPQ_ERROR_FORMAT = -7; /* format errror. */ const LIBMPQ_ERROR_NOT_INITIALIZED = -8; /* init() wasn't called. */ const LIBMPQ_ERROR_SIZE = -9; /* buffer size is to small. */ const LIBMPQ_ERROR_EXIST = -10; /* file or block does not exist in archive. */ const LIBMPQ_ERROR_DECRYPT = -11; /* we don't know the decryption seed. */ const LIBMPQ_ERROR_UNPACK = -12; /* error on unpacking file. */ /** libmpq internal meta-data for an archive */ extern struct mpq_archive_s; extern(C) { /* libmpq__generic information about library. */ char *libmpq__version(); /* libmpq__generic mpq archive information. */ int libmpq__archive_open(mpq_archive_s **mpq_archive, char *mpq_filename, off_t archive_offset); int libmpq__archive_close(mpq_archive_s *mpq_archive); int libmpq__archive_packed_size(mpq_archive_s *mpq_archive, off_t *packed_size); int libmpq__archive_unpacked_size(mpq_archive_s *mpq_archive, off_t *unpacked_size); int libmpq__archive_offset(mpq_archive_s *mpq_archive, off_t *offset); int libmpq__archive_version(mpq_archive_s *mpq_archive, uint *version_); int libmpq__archive_files(mpq_archive_s *mpq_archive, uint *files); /* libmpq__generic file processing functions. */ int libmpq__file_packed_size(mpq_archive_s *mpq_archive, uint file_number, off_t *packed_size); int libmpq__file_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, off_t *unpacked_size); int libmpq__file_offset(mpq_archive_s *mpq_archive, uint file_number, off_t *offset); int libmpq__file_blocks(mpq_archive_s *mpq_archive, uint file_number, uint *blocks); int libmpq__file_encrypted(mpq_archive_s *mpq_archive, uint file_number, uint *encrypted); int libmpq__file_compressed(mpq_archive_s *mpq_archive, uint file_number, uint *compressed); int libmpq__file_imploded(mpq_archive_s *mpq_archive, uint file_number, uint *imploded); int libmpq__file_number(mpq_archive_s *mpq_archive, char *filename, uint *number); int libmpq__file_read(mpq_archive_s *mpq_archive, uint file_number, ubyte *out_buf, off_t out_size, off_t *transferred); /* libmpq__generic block processing functions. */ int libmpq__block_open_offset(mpq_archive_s *mpq_archive, uint file_number); int libmpq__block_close_offset(mpq_archive_s *mpq_archive, uint file_number); int libmpq__block_unpacked_size(mpq_archive_s *mpq_archive, uint file_number, uint block_number, off_t *unpacked_size); int libmpq__block_read(mpq_archive_s *mpq_archive, uint file_number, uint block_number, ubyte *out_buf, off_t out_size, off_t *transferred); } /** exception class for failed libmpq calls */ class MPQException : Exception { const string[] Errors = [ "unknown error", "open error on file", "close error on file", "lseek error on file", "read error on file", "write error on file", "memory allocation error", "format errror", "init() wasn't called", "buffer size is to small", "file or block does not exist in archive", "we don't know the decryption seed", "error on unpacking file"]; public int errno; this(char[] fnname = "unknown_function", int errno = 0) { this.errno = errno; if (-errno >= Errors.length) errno = 0; super(std.string.format("Error in %s(): %s (%d)", fnname, Errors[-errno], errno)); } } /** template to wrap function calls and throw exceptions in case of error * * thanks for the idea to while(nan) blog, * http://while-nan.blogspot.com/2007/06/wrapping-functions-for-fun-and-profit.html * * use: MPQ_CHECKERR(libmpq__archive_open)(&m, "foo.mpq", -1); * returns the retval of archive_open on success; * throws an MPQException on failure. * * @param Fn libmpq__function reference * @param args libmpq__function parameters * @return return value of libmpq__function on success * @throw MPQException on error */ int MPQ_CHECKERR(alias Fn)(ParameterTypeTuple!(Fn) args) { int result = Fn(args); if (result < 0) { /* XXX: relying on non-specified stringof() behaviour */ throw new MPQException((&Fn).stringof[2..$], result); } return result; } /** mixin alias to wrap library functions into MPQ_CHECKERR. * * alias mpq.func_name(...) to MPQ_CHECKERR(libmpq__func_name)(...) * @param func_name name of the function to be wrapped */ template MPQ_FUNC(char[] func_name) { const char[] MPQ_FUNC = "alias MPQ_CHECKERR!(libmpq__" ~ func_name ~ ") " ~ func_name ~ ";"; } alias libmpq__version libversion; /* must be direct alias because it returns char*, not error int */ mixin(MPQ_FUNC!("archive_open")); mixin(MPQ_FUNC!("archive_close")); mixin(MPQ_FUNC!("archive_packed_size")); mixin(MPQ_FUNC!("archive_unpacked_size")); mixin(MPQ_FUNC!("archive_offset")); mixin(MPQ_FUNC!("archive_version")); mixin(MPQ_FUNC!("archive_files")); mixin(MPQ_FUNC!("file_packed_size")); mixin(MPQ_FUNC!("file_unpacked_size")); mixin(MPQ_FUNC!("file_offset")); mixin(MPQ_FUNC!("file_blocks")); mixin(MPQ_FUNC!("file_encrypted")); mixin(MPQ_FUNC!("file_compressed")); mixin(MPQ_FUNC!("file_imploded")); mixin(MPQ_FUNC!("file_number")); mixin(MPQ_FUNC!("file_read")); mixin(MPQ_FUNC!("block_open_offset")); mixin(MPQ_FUNC!("block_close_offset")); mixin(MPQ_FUNC!("block_unpacked_size")); mixin(MPQ_FUNC!("block_read")); /** getter function named name for returning archive_* single values: * * Archive.() { return libmpq__archive_() } * * @param type return type for the original function reference * @param name name of the original function * @param name2 name for the prototype (defaults to name, used for "version") * @return getter function mixin */ template MPQ_A_GET(char[] type, char[] name, char[] name2 = name) { const char[] MPQ_A_GET = type ~ " " ~ name2 ~ "() { " ~ type ~ " ret; " ~ "archive_" ~ name ~ "(m, &ret); return ret;" ~ "}"; } /** wrapper class for an MPQ Archive * * syntax: auto a = new mpq.Archive("somefile.mpq"); */ class Archive { mpq_archive_s *m; File listfile; char[][] listfiledata; this(char[] archivename, off_t offset = -1) { archive_open(&m, toStringz(archivename), offset); } mixin(MPQ_A_GET!("off_t", "packed_size")); mixin(MPQ_A_GET!("off_t", "unpacked_size")); mixin(MPQ_A_GET!("off_t", "offset")); mixin(MPQ_A_GET!("uint", "version", "version_")); mixin(MPQ_A_GET!("uint", "files")); ~this() { archive_close(m); } mpq_archive_s* archive() { return m; } File opIndex(char[] fname) { return new File(this, fname); } File opIndex(int fno) { return new File(this, fno); } char[][] filelist() { try { if (!listfile) { listfile = this["(listfile)"]; listfiledata = (cast(char[])listfile.read()).splitlines(); } return listfiledata; } catch (MPQException e) { return []; } } /+uint filenumber(char[] filename) { try { if (!listfile) { listfile = this["(listfile)"]; listfiledata = (cast(char[])listfile.read()).splitlines(); } return listfiledata; } catch (MPQException e) { return []; } }+/ } /** getter function named name for returning file_* single values: * * File.() { return libmpq__file_() } * * @param type return type for the original function reference * @param name name of the original function * @param name2 name for the prototype (defaults to name, used for "version") * @return getter function mixin */ template MPQ_F_GET(char[] type, char[] name, char[] name2 = name) { const char[] MPQ_F_GET = type ~ " " ~ name2 ~ "() { " ~ type ~ " ret; " ~ "file_" ~ name ~ "(am, fileno, &ret); " ~ "return ret;" ~ "}"; } /** wrapper class for a single file in an MPQ Archive * * syntax: * auto a = new mpq.Archive("somefile.mpq"); * auto f = a["(listfile)"]; * auto f2 = a[0]; * auto f3 = new File(a, "(listfile)"); */ class File { Archive a; mpq_archive_s* am; char[] filename; uint fileno; this(Archive a, int fileno) { this.a = a; this.am = a.archive(); if (fileno >= a.files) { throw new MPQException(format("File(%d)", fileno), LIBMPQ_ERROR_EXIST); } this.filename = format("file%04d.xxx", fileno); this.fileno = fileno; } this(Archive a, char[] filename) { this.a = a; this.am = a.archive(); this.filename = filename; /* this line will throw an exception when the file is not there */ mpq.file_number(am, toStringz(filename), &this.fileno); } mixin(MPQ_F_GET!("off_t", "packed_size")); mixin(MPQ_F_GET!("off_t", "unpacked_size")); mixin(MPQ_F_GET!("off_t", "offset")); mixin(MPQ_F_GET!("uint", "blocks")); mixin(MPQ_F_GET!("uint", "encrypted")); mixin(MPQ_F_GET!("uint", "compressed")); mixin(MPQ_F_GET!("uint", "imploded")); uint no() { return fileno; } char[] name() { return filename; } ubyte[] read() { ubyte[] content; content.length = this.unpacked_size(); off_t trans; mpq.file_read(am, fileno, content.ptr, content.length, &trans); content.length = trans; return content; } } ================================================ FILE: samples/D/template.d ================================================ template Fib(size_t N) { static if (N < 2) enum Fib = size_t(1); else enum Fib = Fib!(N - 2) + Fib!(N - 1); } ================================================ FILE: samples/D/template_function.d ================================================ void bar(T)(T t) { } ================================================ FILE: samples/D/unittest1.d ================================================ unittest { } ================================================ FILE: samples/D/unittest2.d ================================================ unittest("optional name") { } ================================================ FILE: samples/D2/anthias-diagram-overview.d2 ================================================ direction: down classes: { containers: { shape: rectangle } } user: "User" { shape: person } database: "SQLite3" { shape: cylinder } a { label: null style.fill: transparent style.stroke: transparent } b { label: null style.fill: transparent style.stroke: transparent } b.display: "Display (Monitor or TV)" { style.3d: true } anthias-nginx.class: containers b.anthias-viewer.class: containers a.anthias-server.class: containers a.anthias-websocket.class: containers a.anthias-celery.class: containers a.redis.class: containers user -> anthias-nginx anthias-nginx <-> a.anthias-server anthias-nginx -> a.anthias-websocket a.anthias-server <-> a.anthias-celery a.anthias-websocket <-> a.anthias-server a.anthias-celery -> a.redis: "in-memory data" a.redis <-> a.anthias-server b.anthias-viewer <-> database: "assets data" a.anthias-server <-> b.anthias-viewer: "assets data" a.anthias-server <-> database a.anthias-celery <-> database b.anthias-viewer -> b.display: "current asset" ================================================ FILE: samples/D2/calc_algo.d2 ================================================ cTrnDao: CalcTrnDao { q: Query { ByTime ByCategory ByAccount ByPurpose } sql: "SQL: O(trns.count) time | O(trns.notDel.count) space" { "SELECT amount, currency, type FROM transactions WHERE ..." } trns: "List" { CalcTrn { shape: class amount: Double currency: String type: TransactionType } } q -> sql -> trns } rawStatsFlow: RawStatsFlow { in: Input { shape: class trns: List } p: "Process: O(trns.count) time | O(currs.unique.count) space" { "trns.forEach { aggregate incomes, expense by currencies + count them }" } out: RawStats { shape: class incomes: Map expenses: Map incomesCount: Int expensesCount: Int } in -> p -> out } cTrndao.trns -> rawStatsFlow.in.trns # RatesFlow ratesDao: RatesDao { sql: "SQL: O(rates.count) time | O(rates.baseCurr.count) space" { "SELECT rate, currency FROM exchange_rates WHERE baseCurrency = ?" } out: "List" { Rate { shape: class rate: Double currency: String } } sql -> out } ratesOverrideDao: RateOverrideDao { sql: "SQL: O(rates.override.count) time | O(rates.override.baseCurr.count) space" { "SELECT rate, currency FROM exchange_rates_override WHERE baseCurrency = ? AND sync != $DELETING" } out: "List" { Rate { shape: class rate: Double currency: String } } sql -> out } ratesFlow: RatesFlow { deps: Dependencies { ratesDao ratesOverrideDao baseCurrencyFlow } p: "Process: O(rates.override.count) time | O(1) space" { 1: "baseCurrency.flatMapLatest {}" 2: "combine(rateDao.findByBaseCurr(), ratesOverridedao.findByBaseCurr())" 3: "Override rate with the manual set ones" 1 -> 2 -> 3 } out: "RatesData" { shape: class baseCurrency: String rates: Map } deps.ratesDao -> p: Reacts deps.ratesOverrideDao -> p: Reacts deps.baseCurrencyFlow -> p: Reacts p -> out } ratesDao -> ratesFlow.deps ratesOverrideDao -> ratesFlow.deps # ExchangeStatsFlow exFlow: ExchangeStatsFlow { deps: Dependencies { ratesFlow: "rates: RatesFlow" } in: Input { shape: class rawStats: RawStats outputCurrency: String } p: "Process: O(curr.unique.count) space-time" { incs_loop: "rawStats.incomes.forEach {}" incs_exchange: "exchange to output currency" incs_sum: "sum & count" incs_loop -> incs_exchange -> incs_sum exps_loop: "rawStats.expenses.forEach {}" exps_exchange: "exchange to output currency" exps_sum: "sum & count" exps_loop -> exps_exchange -> exps_sum } out: Stats { shape: class income: Value expense: Value incomesCount: Int expensesCount: Int } deps.ratesFlow -> p: Reacts to rates changes in.rawStats -> p p.incs_sum -> out p.exps_sum -> out } ratesFlow.out -> exFlow.deps.ratesFlow: Reacts rawStatsFlow.out -> exFlow.in.rawStats ================================================ FILE: samples/DIGITAL Command Language/fis_gtm_kitinstal.com ================================================ $!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $! ! $! Copyright 2001, 2011 Fidelity Information Services, Inc ! $! ! $! This source code contains the intellectual property ! $! of its copyright holder(s), and is made available ! $! under a license. If you do not know the terms of ! $! the license, please stop and do not read further. ! $! ! $!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! $! $! $! KITINSTAL.COM PROCEDURE FOR THE GT.M PRODUCT $! $ ON CONTROL_Y THEN VMI$CALLBACK CONTROL_Y $! ON WARNING THEN EXIT $STATUS !! allow warning errors for INSTALL REPLACE $ IF P1 .EQS. "VMI$_INSTALL" THEN GOTO INSTALL $ IF P1 .EQS. "VMI$_POSTINSTALL" THEN GOTO POSTINSTALL $ IF P1 .EQS. "VMI$_IVP" THEN GOTO IVP $ EXIT VMI$_UNSUPPORTED $! $INSTALL: $ TYPE SYS$INPUT GT.M (c) COPYRIGHT 1985 - 2000 by Sanchez Computer Associates ALL RIGHTS RESERVED $! the following 2 lines must be maintained $ GTM$VMS_VERSION :== 072 ! Minimum VMS version required $ ALPHA = (f$getsyi("arch_name") .eqs. "Alpha") $ IF ALPHA $ THEN $ GTM$DISK_SPACE == 28000 ! Minumum disk space on system disk required $ ELSE $ GTM$DISK_SPACE == 16000 ! Minumum disk space on system disk required $ ENDIF $ IF F$ELEMENT(0,",",VMI$VMS_VERSION) .EQS. "RELEASED" $ THEN $ GTM$VMS_IS == F$ELEMENT(1,",",VMI$VMS_VERSION) $ IF GTM$VMS_IS .LTS. GTM$VMS_VERSION $ THEN $ VMI$CALLBACK MESSAGE E VMSMISMATCH "This GT.M kit requires an existing VMS''GTM$VMS_VERSION' system." $ EXIT VMI$_FAILURE $ ENDIF $ ELSE $ GTM$VMS_IS :== $ WRITE SYS$OUTPUT " No VMS version checking performed for field test versions." $ ENDIF $ IF (GTM$VMS_IS .GES. "052") THEN T1 = F$VERIFY(VMI$KIT_DEBUG) $ VMI$CALLBACK CHECK_NET_UTILIZATION GTM$ROOM 'GTM$DISK_SPACE' $ IF .NOT. GTM$ROOM $ THEN $ VMI$CALLBACK MESSAGE E NOSPACE "There is not enough disk space -- GT.M needs ''GTM$DISK_SPACE' blocks." $ EXIT VMI$_FAILURE $ ENDIF $! setup default answers $ GTM$DOPURGE :== YES $ GTM$RUN_IVP :== YES $ GTM$STD_CNF :== YES $ GTM$DST_OWN :== SYSTEM $ IF F$IDENTIFIER(GTM$DST_OWN,"NAME_TO_NUMBER") .EQ. 0 THEN GTM$DST_OWN :== 1,4 $ GTM$SYS_DST :== YES $ GTM$DST_DIR :== GTM_DIST $ GTM$DST_CRE == GTM$DST_DIR $ GTM$DST_DEV :== $ GTM$STARTDB :== YES $ GTM$MGR_COM :== YES $ GTM$HLP_DIR :== NO $ GTM$DEF_DCL :== YES $ GTM$DEF_SYS :== YES $ GTM$LNK_LOG :== YES $ GTM$INSTALL :== YES $ GTM$DEF_GLD :== YES $ GTM$GBL_DIR :== MUMPS.GLD $ GTM$DEF_RTN :== YES $ GTM$RTN_DIR :== [],GTM$DIST: $ GTM$PCT_RTN :== YES $ VMI$CALLBACK ASK GTM$DOPURGE "Do you want to purge files replaced by this installation" 'GTM$DOPURGE' B - "@VMI$KWD:GTMKITHLP HELP_PURGE" $ IF .NOT. GTM$DOPURGE THEN VMI$CALLBACK SET PURGE NO $ VMI$CALLBACK ASK GTM$STD_CNF "Do you want the standard GT.M configuration (performs INSTALL)" 'GTM$STD_CNF' B - "@VMI$KWD:GTMKITHLP HELP_STD_CNF" $ IF GTM$STD_CNF $ THEN $ GTM$SYS_DST == 1 $ GTM$STARTDB == 1 $ GTM$MGR_COM == 1 $ GTM$HLP_DIR == 0 $ GTM$DEF_DCL == 1 $ GTM$DEF_SYS == 1 $ GTM$INSTALL == 1 $ GTM$LNK_LOG == 1 $ GTM$INSTALL == 1 $ GTM$DEF_GLD == 1 $ GTM$DEF_RTN == 1 $ GTM$PCT_RTN == 1 $ GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR'] $ GTM$DIR_TYPE :== COMMON $ ELSE ! Not standard configuration $ VMI$CALLBACK ASK GTM$DST_OWN "What UIC should own the GT.M distribution" 'GTM$DST_OWN' S "@VMI$KWD:GTMKITHLP HELP_DST_OWN" $ GTM$DST_OWN == GTM$DST_OWN - "[" - "]" $ VMI$CALLBACK ASK GTM$SYS_DST "Do you want the GT.M distribution to go into a System Directory" 'GTM$SYS_DST' B - "@VMI$KWD:GTMKITHLP HELP_SYS_DST" $ IF GTM$SYS_DST $ THEN $ VMI$CALLBACK ASK GTM$DST_DIR "In what System Directory do you want to place GT.M" 'GTM$DST_DIR' S - "@VMI$KWD:GTMKITHLP HELP_SYS_DIR" $ GTM$DST_DIR == GTM$DST_DIR - "[" - "]" $ GTM$DST_CRE == GTM$DST_DIR $ GTM$DST_LOG :== SYS$COMMON:['GTM$DST_DIR'] $ GTM$DIR_TYPE :== COMMON $ ELSE ! Not system disk $ VMI$CALLBACK ASK GTM$DST_DEV "On which device do you want to place GT.M" "''GTM$DST_DEV'" S "@VMI$KWD:GTMKITHLP HELP_DST_DEV" $ VMI$CALLBACK ASK GTM$DST_DIR "In what directory on that device do you want to place GT.M" 'GTM$DST_DIR' S - "@VMI$KWD:GTMKITHLP HELP_DST_DIR" $ GTM$DST_DEV == GTM$DST_DEV - ":" $ GTM$DST_DIR == GTM$DST_DIR - "[" - "]" $ GTM$DST_LOG :== 'GTM$DST_DEV':['GTM$DST_DIR'] $ GTM$DST_CRE == GTM$DST_LOG $ GTM$DIR_TYPE :== USER $ ENDIF ! system disk $ VMI$CALLBACK ASK GTM$STARTDB "Do you want GTMSTART.COM in the startup database" 'GTM$STARTDB' B - "@VMI$KWD:GTMKITHLP HELP_STARTDB" $ IF .NOT. GTM$STARTDB $ THEN $ VMI$CALLBACK ASK GTM$MGR_COM "Do you want the GT.M .COM files in SYS$MANAGER" 'GTM$MGR_COM' B - "@VMI$KWD:GTMKITHLP HELP_MGR_COM" $ ENDIF $ VMI$CALLBACK ASK GTM$HLP_DIR "Do you want the GT.M help files in SYS$HELP" 'GTM$HLP_DIR' B "@VMI$KWD:GTMKITHLP HELP_HLP_DIR" $ VMI$CALLBACK ASK GTM$DEF_DCL "Do you want to define GT.M commands to the system" 'GTM$DEF_DCL' B - "@VMI$KWD:GTMKITHLP HELP_DEF_DCL" $ VMI$CALLBACK ASK GTM$DEF_SYS "Do you want to define GT.M logical names in the System Table" 'GTM$DEF_SYS' B - "@VMI$KWD:GTMKITHLP HELP_DEF_SYS" $ VMI$CALLBACK ASK GTM$LNK_LOG "Do you want to define the LNK$LIBRARY logical names" 'GTM$LNK_LOG' B - "@VMI$KWD:GTMKITHLP HELP_LNK_LOG" $ VMI$CALLBACK ASK GTM$RUN_IVP "Do you want to run the IVP (performs INSTALL)" 'GTM$RUN_IVP' B - "@VMI$KWD:GTMKITHLP HELP_RUN_IVP" $ IF GTM$RUN_IVP $ THEN $ GTM$PCT_RTN == 1 $ ELSE $ VMI$CALLBACK ASK GTM$PCT_RTN "Do you want to compile the GT.M percent routines (performs INSTALL)" 'GTM$PCT_RTN' B - "@VMI$KWD:GTMKITHLP HELP_PCT_RTN" $ ENDIF $ IF (GTM$RUN_IVP .OR. GTM$PCT_RTN) $ THEN $ GTM$INSTALL == 1 $ ELSE $ VMI$CALLBACK ASK GTM$INSTALL "Do you want to INSTALL the GT.M shareable images now" 'GTM$INSTALL' B - "@VMI$KWD:GTMKITHLP HELP_INSTALL" $ ENDIF $ VMI$CALLBACK ASK GTM$DEF_RTN "Do you want to have a default definition for GTM$ROUTINES" 'GTM$DEF_RTN' B - "@VMI$KWD:GTMKITHLP HELP_DEF_RTN" $ IF GTM$DEF_RTN $ THEN $ VMI$CALLBACK ASK GTM$RTN_DIR "What is the search specification for GTM$ROUTINES" 'GTM$RTN_DIR' S - "@VMI$KWD:GTMKITHLP HELP_RTN_DIR" $ ENDIF $ VMI$CALLBACK ASK GTM$DEF_GLD "Do you want to have a default definition for GTM$GBLDIR" 'GTM$DEF_GLD' B - "@VMI$KWD:GTMKITHLP HELP_DEF_GLD" $ IF GTM$DEF_GLD $ THEN $ VMI$CALLBACK ASK GTM$GBL_DIR "What is the file specification for GTM$GBLDIR" 'GTM$GBL_DIR' S - "@VMI$KWD:GTMKITHLP HELP_GBL_DIR" $ ENDIF $ ENDIF ! standard configuration $! tell them what's happening $ IF GTM$MGR_COM $ THEN $ WRITE SYS$OUTPUT " The following command files are created and copied to SYS$MANAGER:" $ ELSE $ WRITE SYS$OUTPUT " The following command files are created:" $ ENDIF $ TYPE SYS$INPUT GTMINSTALL.COM GTMLOGICALS.COM GTMLOGIN.COM GTMSTART.COM GTMSTOP.COM Each file contains its own user documentation. All the questions have been asked. Installation now proceeds without your manual intervention for about 10-15 minutes. $ IF GTM$RUN_IVP THEN WRITE SYS$OUTPUT " Finally the Installation Verification Procedure tests the installation." $ WRITE SYS$OUTPUT "" $ VMI$CALLBACK CREATE_DIRECTORY 'GTM$DIR_TYPE' 'GTM$DST_CRE' "/OWNER_UIC=[''GTM$DST_OWN'] /PROTECTION=(WO:RE)" $ VMI$CALLBACK RESTORE_SAVESET B $ VMI$CALLBACK RESTORE_SAVESET C $ WRITE SYS$OUTPUT "" $ VMI$CALLBACK MESSAGE I CRECOM "Creating command files." $! Create GTMINSTALL.COM $ OPEN /WRITE OUFILE VMI$KWD:GTMINSTALL.COM $ WRITE OUFILE "$!" $ WRITE OUFILE "$! GTMINSTALL.COM installs GTMSECSHR and other GT.M images." $ WRITE OUFILE "$! GTMSECSHR is a small protected image and must be installed." $ WRITE OUFILE "$! GTMSHR is the run-time library and is installed for performance." $ WRITE OUFILE "$! GTM$DMOD and MCOMPILE are small images frequently used in development." $ WRITE OUFILE "$!" $ WRITE OUFILE "$ INSTALL" $ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER/PROTECTED GTMSECSHR" $ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER GTMSHR" $ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER GTM$DMOD" $ WRITE OUFILE "REPLACE /OPEN/SHARED/HEADER MCOMPILE" $ WRITE OUFILE "$ EXIT" $ CLOSE OUFILE $! Create GTMLOGICALS.COM $ GTM$HLP_LOG :== GTM$DIST $ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== SYS$HELP $ OPEN /WRITE OUFILE VMI$KWD:GTMLOGICALS.COM $ WRITE OUFILE "$!" $ WRITE OUFILE "$! GTMLOGICALS.COM defines the logical names required to use GT.M." $ WRITE OUFILE "$! By default the definitions are placed in the PROCESS table." $ WRITE OUFILE "$! Parameter 1, if supplied should be the name of a logical name table" $ WRITE OUFILE "$! and/or the mode of definition." $ WRITE OUFILE "$! Assignments in a ""permanent"" table reduce GT.M activation time." $ WRITE OUFILE "$!" $ IF GTM$LNK_LOG THEN WRITE OUFILE "$! The LNK$LIBRARY names many require adjustment to your environment." $ IF GTM$DEF_GLD THEN WRITE OUFILE "$! GTM$GBLDIR is defined to provide default access to a global directory." $ IF GTM$DEF_RTN THEN WRITE OUFILE "$! GTM$ROUTINES is defined to provide access to the GT.M utilities." $ IF GTM$DEF_RTN THEN WRITE OUFILE "$! You may wish to define a different structure for $ZROUTINES." $ WRITE OUFILE "$!" $ WRITE OUFILE "$ IF (P1 .NES. """") .AND. (F$EXTRACT(0,1,P1) .NES. ""/"") THEN P1 := /'P1" $ WRITE OUFILE "$ DEFINE 'P1' GTM$DIST ''GTM$DST_LOG'" $ IF GTM$DEF_GLD THEN WRITE OUFILE "$ DEFINE 'P1' GTM$GBLDIR ''GTM$GBL_DIR'" $ IF GTM$DEF_RTN THEN WRITE OUFILE "$ DEFINE 'P1' GTM$ROUTINES ""''GTM$RTN_DIR'""" $ WRITE OUFILE "$ DEFINE 'P1' GTM$HELP ''GTM$HLP_LOG'" $ WRITE OUFILE "$ DEFINE 'P1' GTMSHR GTM$DIST:GTMSHR.EXE" $ WRITE OUFILE "$ DEFINE 'P1' GTMSECSHR GTM$DIST:GTMSECSHR.EXE" $ WRITE OUFILE "$ DEFINE 'P1' GTM$DMOD GTM$DIST:GTM$DMOD.EXE" $ WRITE OUFILE "$ DEFINE 'P1' MCOMPILE GTM$DIST:MCOMPILE.EXE" $ IF GTM$LNK_LOG $ THEN $ N1 = 0 $ DN = 0 $ T1 = F$TRNLNM("LNK$LIBRARY") $ IF (T1 .EQS. "") .OR. (F$LOCATE("GTMLIB",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE("GTMSHR",T1) .NE. F$LENGTH(T1)) $ THEN $ WRITE OUFILE "$ DEFINE 'P1' LNK$LIBRARY GTM$DIST:GTMLIB.OLB" $ DN = 1 $ ELSE ! lnk$library is in use $LNK_LOOP: $ N1 = N1 + 1 $ T1 = F$TRNLNM("LNK$LIBRARY_''N1'") $ IF (T1 .EQS. "") .OR. (F$LOCATE("GTMLIB",T1) .NE. F$LENGTH(T1)) .OR. (F$LOCATE("GTMSHR",T1) .NE. F$LENGTH(T1)) $ THEN $ WRITE OUFILE "$ DEFINE 'P1' LNK$LIBRARY_''N1' GTM$DIST:GTMLIB.OLB" $ DN = 1 $ ENDIF $ IF (.NOT. DN) .AND. (N1 .LT. 998) THEN GOTO LNK_LOOP $ ENDIF ! gtmlib handling $ IF DN ! placed gtmlib $ THEN $ N1 = N1 + 1 $ WRITE OUFILE "$ DEFINE 'P1' LNK$LIBRARY_''N1' GTM$DIST:GTMSHR.OLB" $ ELSE $ VMI$CALLBACK MESSAGE I NOLNKLOG "No LNK$LIBRARY logical names available" $ ENDIF $ ENDIF ! setting up LNK$LIBRARYs $ WRITE OUFILE "$ EXIT" $ CLOSE OUFILE $! Create GTMLOGIN.COM $ OPEN /WRITE OUFILE VMI$KWD:GTMLOGIN.COM $ WRITE OUFILE "$!" $ WRITE OUFILE "$! GTMLOGIN.COM performs process specific setup for GT.M." $ WRITE OUFILE "$! It calls GTMLOGICALS.COM if the logical names are not" $ WRITE OUFILE "$! in the SYSTEM table." $ WRITE OUFILE "$! It defines symbols to access GT.M images." $ WRITE OUFILE "$! It defines GT.M commands locally if they are not defined to the system." $ WRITE OUFILE "$! When the command and logical names are not defined on a process level," $ WRITE OUFILE "$! a production user may save start-up time by not using GTMLOGIN." $ WRITE OUFILE "$! CCE is infrequently used, but may be defined as a foreign command." $ WRITE OUFILE "$!" $ IF .NOT. GTM$DEF_SYS $ THEN $ WRITE OUFILE "$ dir = F$ENVIRONMENT(""PROCEDURE"")" $ WRITE OUFILE "$ dir = F$PARSE(dir,,,""DEVICE"") + F$PARSE(dir,,,""DIRECTORY"")" $ WRITE OUFILE "$ @'dir'GTMLOGICALS.COM" $ ENDIF $ IF .NOT. GTM$DEF_DCL THEN WRITE OUFILE "$ SET COMMAND GTM$DIST:GTMCOMMANDS.CLD" $ WRITE OUFILE "$ DSE :== $GTM$DIST:DSE.EXE ! Database System Editor" $ WRITE OUFILE "$ GDE :== $GTM$DIST:GDE.EXE ! Global Directory Editor" $ WRITE OUFILE "$ GTM :== MUMPS/DIRECT ! Direct Mode MUMPS" $ WRITE OUFILE "$ LKE :== $GTM$DIST:LKE.EXE ! Lock Editor" $ WRITE OUFILE "$ MUPI*P :== $GTM$DIST:MUPIP.EXE ! MUMPS Peripheral Interchange Program" $ WRITE OUFILE "$ EXIT" $ WRITE OUFILE "$ CCE :== $GTM$DIST:CCE.EXE ! GT.CX Operator Interface Program" $ WRITE OUFILE "$ EXIT" $ CLOSE OUFILE $! Create GTMSTART.COM $ OPEN /WRITE OUFILE VMI$KWD:GTMSTART.COM $ WRITE OUFILE "$!" $ WRITE OUFILE "$! GTMSTART.COM should be placed in the VMS startup database." $ WRITE OUFILE "$! It invokes GTMLOGICALS.COM and GTMINSTALL.COM." $ WRITE OUFILE "$!" $ WRITE OUFILE "$ dir = F$ENVIRONMENT(""PROCEDURE"")" $ WRITE OUFILE "$ dir = F$PARSE(dir,,,""DEVICE"") + F$PARSE(dir,,,""DIRECTORY"")" $ IF GTM$DEF_SYS THEN WRITE OUFILE "$ IF P1 .EQS. """" .OR. (P1 .EQS. ""FULL"") THEN P1 := SYSTEM/EXEC" $ WRITE OUFILE "$ @'dir'GTMLOGICALS 'P1'" $ WRITE OUFILE "$ @'dir'GTMINSTALL" $ WRITE OUFILE "$ EXIT" $ CLOSE OUFILE $! Create GTMSTOP.COM $ OPEN /WRITE OUFILE VMI$KWD:GTMSTOP.COM $ WRITE OUFILE "$!" $ WRITE OUFILE "$! GTMSTOP.COM stops all the active GT.M processes and does a RUNDOWN." $ WRITE OUFILE "$! Place an invocation or copy of this procedure in the site specific" $ WRITE OUFILE "$! shutdown: SYS$MANAGER:SYSHUTDWN to ensure all GT.M databases are" $ WRITE OUFILE "$! properly closed before VMS terminates. GTMSTOP should follow" $ WRITE OUFILE "$! GTCMSTOP and precede GTCXSTOP, if they are used." $ WRITE OUFILE "$! If GTMSTOP is not intended to disable subsequent use of GT.M," $ WRITE OUFILE "$! add a comment (!) before the INSTALL REMOVE GTMSECSHR." $ WRITE OUFILE "$!" $ IF .NOT. GTM$DEF_SYS $ THEN $ WRITE OUFILE "$ dir = F$ENVIRONMENT(""PROCEDURE"")" $ WRITE OUFILE "$ dir = F$PARSE(dir,,,""DEVICE"") + F$PARSE(dir,,,""DIRECTORY"")" $ WRITE OUFILE "$ @'dir'GTMLOGICALS.COM" $ ENDIF $ WRITE OUFILE "$ MUPIP := $GTM$DIST:MUPIP.EXE" $ WRITE OUFILE "$ STOP := $GTM$DIST:GTM$STOP" $ WRITE OUFILE "$ STOP 'P1'" $ WRITE OUFILE "$ MUPIP RUNDOWN" $ WRITE OUFILE "$ INSTALL REMOVE GTMSECSHR" $ WRITE OUFILE "$ EXIT" $ IF GTM$DEF_SYS THEN WRITE OUFILE "$ IF P2 .EQS. """" THEN P2 := /SYSTEM/EXEC" $ WRITE OUFILE "$ DEASSIGN 'P2' GTMSECSHR" $ CLOSE OUFILE $ VMI$CALLBACK MESSAGE I PREINS "Preparing files for installation." $! GTMFILES.KIT must be maintained as kit contents change $ GTM$HLP_LOG == GTM$DST_LOG $ IF GTM$HLP_DIR THEN GTM$HLP_LOG :== VMI$ROOT:[SYSHLP] $ OPEN /WRITE OUFILE VMI$KWD:GTMFILES.KIT $ IF GTM$MGR_COM $ THEN $ WRITE OUFILE "GTM$ GTMINSTALL.COM VMI$ROOT:[SYSMGR] C" $ WRITE OUFILE "GTM$ GTMLOGICALS.COM VMI$ROOT:[SYSMGR] C" $ WRITE OUFILE "GTM$ GTMLOGIN.COM VMI$ROOT:[SYSMGR] C" $ WRITE OUFILE "GTM$ GTMSTART.COM VMI$ROOT:[SYSMGR] C" $ WRITE OUFILE "GTM$ GTMSTOP.COM VMI$ROOT:[SYSMGR] C" $ ENDIF $ WRITE OUFILE "GTM$ GTMINSTALL.COM ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMLOGICALS.COM ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMLOGIN.COM ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMSTART.COM ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMSTOP.COM ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ DSE.HLB ''GTM$HLP_LOG'" $ WRITE OUFILE "GTM$ GDE.HLB ''GTM$HLP_LOG'" $ WRITE OUFILE "GTM$ LKE.HLB ''GTM$HLP_LOG'" $ WRITE OUFILE "GTM$ MUMPS.HLB ''GTM$HLP_LOG'" $ WRITE OUFILE "GTM$ MUPIP.HLB ''GTM$HLP_LOG'" $ WRITE OUFILE "GTM$ GTMLIB.OLB ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMSHR.OLB ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMZCALL.MLB ''GTM$DST_LOG'" $ IF ALPHA $ THEN $ WRITE OUFILE "GTM$ GTM$DEFAULTS.M64 ''GTM$DST_LOG'" $ ELSE $ WRITE OUFILE "GTM$ GTM$DEFAULTS.MAR ''GTM$DST_LOG'" $ ENDIF $ WRITE OUFILE "GTM$ GTM$CE.H ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMCOLLECT.OPT ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMCOMMANDS.CLD ''GTM$DST_LOG' C" $ WRITE OUFILE "GTM$ *.M ''GTM$DST_LOG'" $ CLOSE OUFILE $! GTMIMAGES.KIT must be maintained as kit contents change $ OPEN /WRITE OUFILE VMI$KWD:GTMIMAGES.KIT $ WRITE OUFILE "GTM$ GTMSECSHR.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTMSHR.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ DSE.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GDE.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTM$DMOD.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ LKE.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ MCOMPILE.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ MUPIP.EXE ''GTM$DST_LOG'" $ WRITE OUFILE "GTM$ GTM$STOP.EXE ''GTM$DST_LOG'" $ CLOSE OUFILE $! Provide with file.KITs $ VMI$CALLBACK PROVIDE_FILE "" VMI$KWD:GTMFILES.KIT "" T $ VMI$CALLBACK PROVIDE_IMAGE "" VMI$KWD:GTMIMAGES.KIT "" T $ VMI$CALLBACK MESSAGE I FININS "Finalizing the installation." $ IF GTM$DEF_DCL THEN VMI$CALLBACK PROVIDE_DCL_COMMAND GTMCOMMANDS.CLD $ IF GTM$STARTDB THEN VMI$CALLBACK MODIFY_STARTUP_DB ADD GTMSTART.COM LPMAIN $! GTM$INSTALL is TRUE if GTM$RUN_IVP or GTM$PCT_RTN $ IF GTM$INSTALL THEN VMI$CALLBACK SET POSTINSTALL YES $ IF GTM$RUN_IVP THEN VMI$CALLBACK SET IVP YES $ EXIT VMI$_SUCCESS $! $POSTINSTALL: $ ON CONTROL_Y THEN EXIT VMI$_FAILURE $! remove MUPIP from command tables for change from V2.4 to V2.5 $ SET NOON $ DEFINE /USER_MODE SYS$OUTPUT NL: $ DEFINE /USER_MODE SYS$ERROR NL: $ SET COMMAND /TABLE=SYS$COMMON:[SYSLIB]DCLTABLES /OUTPUT=SYS$COMMON:[SYSLIB]DCLTABLES /DELETE=MUPIP $ DEFINE /USER_MODE SYS$OUTPUT NL: $ DEFINE /USER_MODE SYS$ERROR NL: $ SET COMMAND /DELETE=MUPIP $ SET ON $ IF GTM$MGR_COM $ THEN $ T1 := SYS$MANAGER: $ ELSE $ T1 = GTM$DST_LOG $ ENDIF $ @'T1'GTMSTART $ @'T1'GTMLOGIN $ ON CONTROL_Y THEN EXIT VMI$_FAILURE $ SET DEFAULT GTM$DIST $ T2 = F$ENVIRONMENT("PROTECTION") $ SET PROTECTION=(S=REWD,O=REWD,G=REWD,W=RE)/DEFAULT $ MUMPS GTM$DMOD.M $ IF GTM$LNK_LOG $ THEN $ T1 := $ ELSE $ T1 :=,GTMLIB.OLB/LIB,GTMSHR.OLB/LIB $ ENDIF $ LINK GTM$DMOD.OBJ/NOTRACE'T1 $ IF GTM$PCT_RTN $ THEN $ TYPE SYS$INPUT Compiling the GT.M percent (%) routines. $ MUMPS * $ IF GTM$DOPURGE THEN PURGE *.* $ SET DEFAULT VMI$KWD $ ENDIF ! percent routines $ SET PROTECTION=('T2')/DEFAULT $ EXIT VMI$_SUCCESS $! $IVP: $! The real Installation Verification Procedure. $ TYPE SYS$INPUT GT.M Installation Verification Procedure $! Extract the IVP .COM file from the text library. $ LIBRARIAN /EXTRACT=GTM$IVP /OUTPUT=GTM$IVP.COM GTM$IVP.TLB $ @GTM$IVP $ EXIT $STATUS $! ================================================ FILE: samples/DIGITAL Command Language/ghostpdl_zlib_make_vms.com ================================================ $! make libz under VMS written by $! Martin P.J. Zinser $! $! In case of problems with the install you might contact me at $! zinser@zinser.no-ip.info(preferred) or $! martin.zinser@eurexchange.com (work) $! $! Make procedure history for Zlib $! $!------------------------------------------------------------------------------ $! Version history $! 0.01 20060120 First version to receive a number $! 0.02 20061008 Adapt to new Makefile.in $! 0.03 20091224 Add support for large file check $! 0.04 20100110 Add new gzclose, gzlib, gzread, gzwrite $! 0.05 20100221 Exchange zlibdefs.h by zconf.h.in $! 0.06 20120111 Fix missing amiss_err, update zconf_h.in, fix new exmples $! subdir path, update module search in makefile.in $! 0.07 20120115 Triggered by work done by Alexey Chupahin completly redesigned $! shared image creation $! 0.08 20120219 Make it work on VAX again, pre-load missing symbols to shared $! image $! 0.09 20120305 SMS. P1 sets builder ("MMK", "MMS", " " (built-in)). $! "" -> automatic, preference: MMK, MMS, built-in. $! $ on error then goto err_exit $! $ true = 1 $ false = 0 $ tmpnam = "temp_" + f$getjpi("","pid") $ tt = tmpnam + ".txt" $ tc = tmpnam + ".c" $ th = tmpnam + ".h" $ define/nolog tconfig 'th' $ its_decc = false $ its_vaxc = false $ its_gnuc = false $ s_case = False $! $! Setup variables holding "config" information $! $ Make = "''p1'" $ name = "Zlib" $ version = "?.?.?" $ v_string = "ZLIB_VERSION" $ v_file = "zlib.h" $ ccopt = "/include = []" $ lopts = "" $ dnsrl = "" $ aconf_in_file = "zconf.h.in#zconf.h_in#zconf_h.in" $ conf_check_string = "" $ linkonly = false $ optfile = name + ".opt" $ mapfile = name + ".map" $ libdefs = "" $ vax = f$getsyi("HW_MODEL").lt.1024 $ axp = f$getsyi("HW_MODEL").ge.1024 .and. f$getsyi("HW_MODEL").lt.4096 $ ia64 = f$getsyi("HW_MODEL").ge.4096 $! $! 2012-03-05 SMS. $! Why is this needed? And if it is needed, why not simply ".not. vax"? $! $!!! if axp .or. ia64 then set proc/parse=extended $! $ whoami = f$parse(f$environment("Procedure"),,,,"NO_CONCEAL") $ mydef = F$parse(whoami,,,"DEVICE") $ mydir = f$parse(whoami,,,"DIRECTORY") - "][" $ myproc = f$parse(whoami,,,"Name") + f$parse(whoami,,,"type") $! $! Check for MMK/MMS $! $ if (Make .eqs. "") $ then $ If F$Search ("Sys$System:MMS.EXE") .nes. "" Then Make = "MMS" $ If F$Type (MMK) .eqs. "STRING" Then Make = "MMK" $ else $ Make = f$edit( Make, "trim") $ endif $! $ gosub find_version $! $ open/write topt tmp.opt $ open/write optf 'optfile' $! $ gosub check_opts $! $! Look for the compiler used $! $ gosub check_compiler $ close topt $ close optf $! $ if its_decc $ then $ ccopt = "/prefix=all" + ccopt $ if f$trnlnm("SYS") .eqs. "" $ then $ if axp $ then $ define sys sys$library: $ else $ ccopt = "/decc" + ccopt $ define sys decc$library_include: $ endif $ endif $! $! 2012-03-05 SMS. $! Why /NAMES = AS_IS? Why not simply ".not. vax"? And why not on VAX? $! $ if axp .or. ia64 $ then $ ccopt = ccopt + "/name=as_is/opt=(inline=speed)" $ s_case = true $ endif $ endif $ if its_vaxc .or. its_gnuc $ then $ if f$trnlnm("SYS").eqs."" then define sys sys$library: $ endif $! $! Build a fake configure input header $! $ open/write conf_hin config.hin $ write conf_hin "#undef _LARGEFILE64_SOURCE" $ close conf_hin $! $! $ i = 0 $FIND_ACONF: $ fname = f$element(i,"#",aconf_in_file) $ if fname .eqs. "#" then goto AMISS_ERR $ if f$search(fname) .eqs. "" $ then $ i = i + 1 $ goto find_aconf $ endif $ open/read/err=aconf_err aconf_in 'fname' $ open/write aconf zconf.h $ACONF_LOOP: $ read/end_of_file=aconf_exit aconf_in line $ work = f$edit(line, "compress,trim") $ if f$extract(0,6,work) .nes. "#undef" $ then $ if f$extract(0,12,work) .nes. "#cmakedefine" $ then $ write aconf line $ endif $ else $ cdef = f$element(1," ",work) $ gosub check_config $ endif $ goto aconf_loop $ACONF_EXIT: $ write aconf "" $ write aconf "/* VMS specifics added by make_vms.com: */" $ write aconf "#define VMS 1" $ write aconf "#include " $ write aconf "#include " $ write aconf "#ifdef _LARGEFILE" $ write aconf "# define off64_t __off64_t" $ write aconf "# define fopen64 fopen" $ write aconf "# define fseeko64 fseeko" $ write aconf "# define lseek64 lseek" $ write aconf "# define ftello64 ftell" $ write aconf "#endif" $ write aconf "#if !defined( __VAX) && (__CRTL_VER >= 70312000)" $ write aconf "# define HAVE_VSNPRINTF" $ write aconf "#endif" $ close aconf_in $ close aconf $ if f$search("''th'") .nes. "" then delete 'th';* $! Build the thing plain or with mms $! $ write sys$output "Compiling Zlib sources ..." $ if make.eqs."" $ then $ if (f$search( "example.obj;*") .nes. "") then delete example.obj;* $ if (f$search( "minigzip.obj;*") .nes. "") then delete minigzip.obj;* $ CALL MAKE adler32.OBJ "CC ''CCOPT' adler32" - adler32.c zlib.h zconf.h $ CALL MAKE compress.OBJ "CC ''CCOPT' compress" - compress.c zlib.h zconf.h $ CALL MAKE crc32.OBJ "CC ''CCOPT' crc32" - crc32.c zlib.h zconf.h $ CALL MAKE deflate.OBJ "CC ''CCOPT' deflate" - deflate.c deflate.h zutil.h zlib.h zconf.h $ CALL MAKE gzclose.OBJ "CC ''CCOPT' gzclose" - gzclose.c zutil.h zlib.h zconf.h $ CALL MAKE gzlib.OBJ "CC ''CCOPT' gzlib" - gzlib.c zutil.h zlib.h zconf.h $ CALL MAKE gzread.OBJ "CC ''CCOPT' gzread" - gzread.c zutil.h zlib.h zconf.h $ CALL MAKE gzwrite.OBJ "CC ''CCOPT' gzwrite" - gzwrite.c zutil.h zlib.h zconf.h $ CALL MAKE infback.OBJ "CC ''CCOPT' infback" - infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h $ CALL MAKE inffast.OBJ "CC ''CCOPT' inffast" - inffast.c zutil.h zlib.h zconf.h inffast.h $ CALL MAKE inflate.OBJ "CC ''CCOPT' inflate" - inflate.c zutil.h zlib.h zconf.h infblock.h $ CALL MAKE inftrees.OBJ "CC ''CCOPT' inftrees" - inftrees.c zutil.h zlib.h zconf.h inftrees.h $ CALL MAKE trees.OBJ "CC ''CCOPT' trees" - trees.c deflate.h zutil.h zlib.h zconf.h $ CALL MAKE uncompr.OBJ "CC ''CCOPT' uncompr" - uncompr.c zlib.h zconf.h $ CALL MAKE zutil.OBJ "CC ''CCOPT' zutil" - zutil.c zutil.h zlib.h zconf.h $ write sys$output "Building Zlib ..." $ CALL MAKE libz.OLB "lib/crea libz.olb *.obj" *.OBJ $ write sys$output "Building example..." $ CALL MAKE example.OBJ "CC ''CCOPT' [.test]example" - [.test]example.c zlib.h zconf.h $ call make example.exe "LINK example,libz.olb/lib" example.obj libz.olb $ write sys$output "Building minigzip..." $ CALL MAKE minigzip.OBJ "CC ''CCOPT' [.test]minigzip" - [.test]minigzip.c zlib.h zconf.h $ call make minigzip.exe - "LINK minigzip,libz.olb/lib" - minigzip.obj libz.olb $ else $ gosub crea_mms $ write sys$output "Make ''name' ''version' with ''Make' " $ 'make' $ endif $! $! Create shareable image $! $ gosub crea_olist $ write sys$output "Creating libzshr.exe" $ call map_2_shopt 'mapfile' 'optfile' $ LINK_'lopts'/SHARE=libzshr.exe modules.opt/opt,'optfile'/opt $ write sys$output "Zlib build completed" $ delete/nolog tmp.opt;* $ exit $AMISS_ERR: $ write sys$output "No source for config.hin found." $ write sys$output "Tried any of ''aconf_in_file'" $ goto err_exit $CC_ERR: $ write sys$output "C compiler required to build ''name'" $ goto err_exit $ERR_EXIT: $ set message/facil/ident/sever/text $ close/nolog optf $ close/nolog topt $ close/nolog aconf_in $ close/nolog aconf $ close/nolog out $ close/nolog min $ close/nolog mod $ close/nolog h_in $ write sys$output "Exiting..." $ exit 2 $! $! $MAKE: SUBROUTINE !SUBROUTINE TO CHECK DEPENDENCIES $ V = 'F$Verify(0) $! P1 = What we are trying to make $! P2 = Command to make it $! P3 - P8 What it depends on $ $ If F$Search(P1) .Eqs. "" Then Goto Makeit $ Time = F$CvTime(F$File(P1,"RDT")) $arg=3 $Loop: $ Argument = P'arg $ If Argument .Eqs. "" Then Goto Exit $ El=0 $Loop2: $ File = F$Element(El," ",Argument) $ If File .Eqs. " " Then Goto Endl $ AFile = "" $Loop3: $ OFile = AFile $ AFile = F$Search(File) $ If AFile .Eqs. "" .Or. AFile .Eqs. OFile Then Goto NextEl $ If F$CvTime(F$File(AFile,"RDT")) .Ges. Time Then Goto Makeit $ Goto Loop3 $NextEL: $ El = El + 1 $ Goto Loop2 $EndL: $ arg=arg+1 $ If arg .Le. 8 Then Goto Loop $ Goto Exit $ $Makeit: $ VV=F$VERIFY(0) $ write sys$output P2 $ 'P2 $ VV='F$Verify(VV) $Exit: $ If V Then Set Verify $ENDSUBROUTINE $!------------------------------------------------------------------------------ $! $! Check command line options and set symbols accordingly $! $!------------------------------------------------------------------------------ $! Version history $! 0.01 20041206 First version to receive a number $! 0.02 20060126 Add new "HELP" target $ CHECK_OPTS: $ i = 1 $ OPT_LOOP: $ if i .lt. 9 $ then $ cparm = f$edit(p'i',"upcase") $! $! Check if parameter actually contains something $! $ if f$edit(cparm,"trim") .nes. "" $ then $ if cparm .eqs. "DEBUG" $ then $ ccopt = ccopt + "/noopt/deb" $ lopts = lopts + "/deb" $ endif $ if f$locate("CCOPT=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ ccopt = ccopt + f$extract(start,len,cparm) $ if f$locate("AS_IS",f$edit(ccopt,"UPCASE")) .lt. f$length(ccopt) - then s_case = true $ endif $ if cparm .eqs. "LINK" then linkonly = true $ if f$locate("LOPTS=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ lopts = lopts + f$extract(start,len,cparm) $ endif $ if f$locate("CC=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ cc_com = f$extract(start,len,cparm) if (cc_com .nes. "DECC") .and. - (cc_com .nes. "VAXC") .and. - (cc_com .nes. "GNUC") $ then $ write sys$output "Unsupported compiler choice ''cc_com' ignored" $ write sys$output "Use DECC, VAXC, or GNUC instead" $ else $ if cc_com .eqs. "DECC" then its_decc = true $ if cc_com .eqs. "VAXC" then its_vaxc = true $ if cc_com .eqs. "GNUC" then its_gnuc = true $ endif $ endif $ if f$locate("MAKE=",cparm) .lt. f$length(cparm) $ then $ start = f$locate("=",cparm) + 1 $ len = f$length(cparm) - start $ mmks = f$extract(start,len,cparm) $ if (mmks .eqs. "MMK") .or. (mmks .eqs. "MMS") $ then $ make = mmks $ else $ write sys$output "Unsupported make choice ''mmks' ignored" $ write sys$output "Use MMK or MMS instead" $ endif $ endif $ if cparm .eqs. "HELP" then gosub bhelp $ endif $ i = i + 1 $ goto opt_loop $ endif $ return $!------------------------------------------------------------------------------ $! $! Look for the compiler used $! $! Version history $! 0.01 20040223 First version to receive a number $! 0.02 20040229 Save/set value of decc$no_rooted_search_lists $! 0.03 20060202 Extend handling of GNU C $! 0.04 20090402 Compaq -> hp $CHECK_COMPILER: $ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) $ then $ its_decc = (f$search("SYS$SYSTEM:DECC$COMPILER.EXE") .nes. "") $ its_vaxc = .not. its_decc .and. (F$Search("SYS$System:VAXC.Exe") .nes. "") $ its_gnuc = .not. (its_decc .or. its_vaxc) .and. (f$trnlnm("gnu_cc") .nes. "") $ endif $! $! Exit if no compiler available $! $ if (.not. (its_decc .or. its_vaxc .or. its_gnuc)) $ then goto CC_ERR $ else $ if its_decc $ then $ write sys$output "CC compiler check ... hp C" $ if f$trnlnm("decc$no_rooted_search_lists") .nes. "" $ then $ dnrsl = f$trnlnm("decc$no_rooted_search_lists") $ endif $ define/nolog decc$no_rooted_search_lists 1 $ else $ if its_vaxc then write sys$output "CC compiler check ... VAX C" $ if its_gnuc $ then $ write sys$output "CC compiler check ... GNU C" $ if f$trnlnm(topt) then write topt "gnu_cc:[000000]gcclib.olb/lib" $ if f$trnlnm(optf) then write optf "gnu_cc:[000000]gcclib.olb/lib" $ cc = "gcc" $ endif $ if f$trnlnm(topt) then write topt "sys$share:vaxcrtl.exe/share" $ if f$trnlnm(optf) then write optf "sys$share:vaxcrtl.exe/share" $ endif $ endif $ return $!------------------------------------------------------------------------------ $! $! If MMS/MMK are available dump out the descrip.mms if required $! $CREA_MMS: $ write sys$output "Creating descrip.mms..." $ create descrip.mms $ open/append out descrip.mms $ copy sys$input: out $ deck # descrip.mms: MMS description file for building zlib on VMS # written by Martin P.J. Zinser # OBJS = adler32.obj, compress.obj, crc32.obj, gzclose.obj, gzlib.obj\ gzread.obj, gzwrite.obj, uncompr.obj, infback.obj\ deflate.obj, trees.obj, zutil.obj, inflate.obj, \ inftrees.obj, inffast.obj $ eod $ write out "CFLAGS=", ccopt $ write out "LOPTS=", lopts $ write out "all : example.exe minigzip.exe libz.olb" $ copy sys$input: out $ deck @ write sys$output " Example applications available" libz.olb : libz.olb($(OBJS)) @ write sys$output " libz available" example.exe : example.obj libz.olb link $(LOPTS) example,libz.olb/lib minigzip.exe : minigzip.obj libz.olb link $(LOPTS) minigzip,libz.olb/lib clean : delete *.obj;*,libz.olb;*,*.opt;*,*.exe;* # Other dependencies. adler32.obj : adler32.c zutil.h zlib.h zconf.h compress.obj : compress.c zlib.h zconf.h crc32.obj : crc32.c zutil.h zlib.h zconf.h deflate.obj : deflate.c deflate.h zutil.h zlib.h zconf.h example.obj : [.test]example.c zlib.h zconf.h gzclose.obj : gzclose.c zutil.h zlib.h zconf.h gzlib.obj : gzlib.c zutil.h zlib.h zconf.h gzread.obj : gzread.c zutil.h zlib.h zconf.h gzwrite.obj : gzwrite.c zutil.h zlib.h zconf.h inffast.obj : inffast.c zutil.h zlib.h zconf.h inftrees.h inffast.h inflate.obj : inflate.c zutil.h zlib.h zconf.h inftrees.obj : inftrees.c zutil.h zlib.h zconf.h inftrees.h minigzip.obj : [.test]minigzip.c zlib.h zconf.h trees.obj : trees.c deflate.h zutil.h zlib.h zconf.h uncompr.obj : uncompr.c zlib.h zconf.h zutil.obj : zutil.c zutil.h zlib.h zconf.h infback.obj : infback.c zutil.h inftrees.h inflate.h inffast.h inffixed.h $ eod $ close out $ return $!------------------------------------------------------------------------------ $! $! Read list of core library sources from makefile.in and create options $! needed to build shareable image $! $CREA_OLIST: $ open/read min makefile.in $ open/write mod modules.opt $ src_check_list = "OBJZ =#OBJG =" $MRLOOP: $ read/end=mrdone min rec $ i = 0 $SRC_CHECK_LOOP: $ src_check = f$element(i, "#", src_check_list) $ i = i+1 $ if src_check .eqs. "#" then goto mrloop $ if (f$extract(0,6,rec) .nes. src_check) then goto src_check_loop $ rec = rec - src_check $ gosub extra_filnam $ if (f$element(1,"\",rec) .eqs. "\") then goto mrloop $MRSLOOP: $ read/end=mrdone min rec $ gosub extra_filnam $ if (f$element(1,"\",rec) .nes. "\") then goto mrsloop $MRDONE: $ close min $ close mod $ return $!------------------------------------------------------------------------------ $! $! Take record extracted in crea_olist and split it into single filenames $! $EXTRA_FILNAM: $ myrec = f$edit(rec - "\", "trim,compress") $ i = 0 $FELOOP: $ srcfil = f$element(i," ", myrec) $ if (srcfil .nes. " ") $ then $ write mod f$parse(srcfil,,,"NAME"), ".obj" $ i = i + 1 $ goto feloop $ endif $ return $!------------------------------------------------------------------------------ $! $! Find current Zlib version number $! $FIND_VERSION: $ open/read h_in 'v_file' $hloop: $ read/end=hdone h_in rec $ rec = f$edit(rec,"TRIM") $ if (f$extract(0,1,rec) .nes. "#") then goto hloop $ rec = f$edit(rec - "#", "TRIM") $ if f$element(0," ",rec) .nes. "define" then goto hloop $ if f$element(1," ",rec) .eqs. v_string $ then $ version = 'f$element(2," ",rec)' $ goto hdone $ endif $ goto hloop $hdone: $ close h_in $ return $!------------------------------------------------------------------------------ $! $CHECK_CONFIG: $! $ in_ldef = f$locate(cdef,libdefs) $ if (in_ldef .lt. f$length(libdefs)) $ then $ write aconf "#define ''cdef' 1" $ libdefs = f$extract(0,in_ldef,libdefs) + - f$extract(in_ldef + f$length(cdef) + 1, - f$length(libdefs) - in_ldef - f$length(cdef) - 1, - libdefs) $ else $ if (f$type('cdef') .eqs. "INTEGER") $ then $ write aconf "#define ''cdef' ", 'cdef' $ else $ if (f$type('cdef') .eqs. "STRING") $ then $ write aconf "#define ''cdef' ", """", '''cdef'', """" $ else $ gosub check_cc_def $ endif $ endif $ endif $ return $!------------------------------------------------------------------------------ $! $! Check if this is a define relating to the properties of the C/C++ $! compiler $! $ CHECK_CC_DEF: $ if (cdef .eqs. "_LARGEFILE64_SOURCE") $ then $ copy sys$input: 'tc' $ deck #include "tconfig" #define _LARGEFILE #include int main(){ FILE *fp; fp = fopen("temp.txt","r"); fseeko(fp,1,SEEK_SET); fclose(fp); } $ eod $ test_inv = false $ comm_h = false $ gosub cc_prop_check $ return $ endif $ write aconf "/* ", line, " */" $ return $!------------------------------------------------------------------------------ $! $! Check for properties of C/C++ compiler $! $! Version history $! 0.01 20031020 First version to receive a number $! 0.02 20031022 Added logic for defines with value $! 0.03 20040309 Make sure local config file gets not deleted $! 0.04 20041230 Also write include for configure run $! 0.05 20050103 Add processing of "comment defines" $CC_PROP_CHECK: $ cc_prop = true $ is_need = false $ is_need = (f$extract(0,4,cdef) .eqs. "NEED") .or. (test_inv .eq. true) $ if f$search(th) .eqs. "" then create 'th' $ set message/nofac/noident/nosever/notext $ on error then continue $ cc 'tmpnam' $ if .not. ($status) then cc_prop = false $ on error then continue $! The headers might lie about the capabilities of the RTL $ link 'tmpnam',tmp.opt/opt $ if .not. ($status) then cc_prop = false $ set message/fac/ident/sever/text $ on error then goto err_exit $ delete/nolog 'tmpnam'.*;*/exclude='th' $ if (cc_prop .and. .not. is_need) .or. - (.not. cc_prop .and. is_need) $ then $ write sys$output "Checking for ''cdef'... yes" $ if f$type('cdef_val'_yes) .nes. "" $ then $ if f$type('cdef_val'_yes) .eqs. "INTEGER" - then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_yes) $ if f$type('cdef_val'_yes) .eqs. "STRING" - then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_yes) $ else $ call write_config f$fao("#define !AS 1",cdef) $ endif $ if (cdef .eqs. "HAVE_FSEEKO") .or. (cdef .eqs. "_LARGE_FILES") .or. - (cdef .eqs. "_LARGEFILE64_SOURCE") then - call write_config f$string("#define _LARGEFILE 1") $ else $ write sys$output "Checking for ''cdef'... no" $ if (comm_h) $ then call write_config f$fao("/* !AS */",line) $ else $ if f$type('cdef_val'_no) .nes. "" $ then $ if f$type('cdef_val'_no) .eqs. "INTEGER" - then call write_config f$fao("#define !AS !UL",cdef,'cdef_val'_no) $ if f$type('cdef_val'_no) .eqs. "STRING" - then call write_config f$fao("#define !AS !AS",cdef,'cdef_val'_no) $ else $ call write_config f$fao("#undef !AS",cdef) $ endif $ endif $ endif $ return $!------------------------------------------------------------------------------ $! $! Check for properties of C/C++ compiler with multiple result values $! $! Version history $! 0.01 20040127 First version $! 0.02 20050103 Reconcile changes from cc_prop up to version 0.05 $CC_MPROP_CHECK: $ cc_prop = true $ i = 1 $ idel = 1 $ MT_LOOP: $ if f$type(result_'i') .eqs. "STRING" $ then $ set message/nofac/noident/nosever/notext $ on error then continue $ cc 'tmpnam'_'i' $ if .not. ($status) then cc_prop = false $ on error then continue $! The headers might lie about the capabilities of the RTL $ link 'tmpnam'_'i',tmp.opt/opt $ if .not. ($status) then cc_prop = false $ set message/fac/ident/sever/text $ on error then goto err_exit $ delete/nolog 'tmpnam'_'i'.*;* $ if (cc_prop) $ then $ write sys$output "Checking for ''cdef'... ", mdef_'i' $ if f$type(mdef_'i') .eqs. "INTEGER" - then call write_config f$fao("#define !AS !UL",cdef,mdef_'i') $ if f$type('cdef_val'_yes) .eqs. "STRING" - then call write_config f$fao("#define !AS !AS",cdef,mdef_'i') $ goto msym_clean $ else $ i = i + 1 $ goto mt_loop $ endif $ endif $ write sys$output "Checking for ''cdef'... no" $ call write_config f$fao("#undef !AS",cdef) $ MSYM_CLEAN: $ if (idel .le. msym_max) $ then $ delete/sym mdef_'idel' $ idel = idel + 1 $ goto msym_clean $ endif $ return $!------------------------------------------------------------------------------ $! $! Write configuration to both permanent and temporary config file $! $! Version history $! 0.01 20031029 First version to receive a number $! $WRITE_CONFIG: SUBROUTINE $ write aconf 'p1' $ open/append confh 'th' $ write confh 'p1' $ close confh $ENDSUBROUTINE $!------------------------------------------------------------------------------ $! $! Analyze the project map file and create the symbol vector for a shareable $! image from it $! $! Version history $! 0.01 20120128 First version $! 0.02 20120226 Add pre-load logic $! $ MAP_2_SHOPT: Subroutine $! $ SAY := "WRITE_ SYS$OUTPUT" $! $ IF F$SEARCH("''P1'") .EQS. "" $ THEN $ SAY "MAP_2_SHOPT-E-NOSUCHFILE: Error, inputfile ''p1' not available" $ goto exit_m2s $ ENDIF $ IF "''P2'" .EQS. "" $ THEN $ SAY "MAP_2_SHOPT: Error, no output file provided" $ goto exit_m2s $ ENDIF $! $ module1 = "deflate#deflateEnd#deflateInit_#deflateParams#deflateSetDictionary" $ module2 = "gzclose#gzerror#gzgetc#gzgets#gzopen#gzprintf#gzputc#gzputs#gzread" $ module3 = "gzseek#gztell#inflate#inflateEnd#inflateInit_#inflateSetDictionary" $ module4 = "inflateSync#uncompress#zlibVersion#compress" $ open/read map 'p1 $ if axp .or. ia64 $ then $ open/write aopt a.opt $ open/write bopt b.opt $ write aopt " CASE_SENSITIVE=YES" $ write bopt "SYMBOL_VECTOR= (-" $ mod_sym_num = 1 $ MOD_SYM_LOOP: $ if f$type(module'mod_sym_num') .nes. "" $ then $ mod_in = 0 $ MOD_SYM_IN: $ shared_proc = f$element(mod_in, "#", module'mod_sym_num') $ if shared_proc .nes. "#" $ then $ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- f$edit(shared_proc,"upcase"),shared_proc) $ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) $ mod_in = mod_in + 1 $ goto mod_sym_in $ endif $ mod_sym_num = mod_sym_num + 1 $ goto mod_sym_loop $ endif $MAP_LOOP: $ read/end=map_end map line $ if (f$locate("{",line).lt. f$length(line)) .or. - (f$locate("global:", line) .lt. f$length(line)) $ then $ proc = true $ goto map_loop $ endif $ if f$locate("}",line).lt. f$length(line) then proc = false $ if f$locate("local:", line) .lt. f$length(line) then proc = false $ if proc $ then $ shared_proc = f$edit(line,"collapse") $ chop_semi = f$locate(";", shared_proc) $ if chop_semi .lt. f$length(shared_proc) then - shared_proc = f$extract(0, chop_semi, shared_proc) $ write aopt f$fao(" symbol_vector=(!AS/!AS=PROCEDURE)",- f$edit(shared_proc,"upcase"),shared_proc) $ write bopt f$fao("!AS=PROCEDURE,-",shared_proc) $ endif $ goto map_loop $MAP_END: $ close/nolog aopt $ close/nolog bopt $ open/append libopt 'p2' $ open/read aopt a.opt $ open/read bopt b.opt $ALOOP: $ read/end=aloop_end aopt line $ write libopt line $ goto aloop $ALOOP_END: $ close/nolog aopt $ sv = "" $BLOOP: $ read/end=bloop_end bopt svn $ if (svn.nes."") $ then $ if (sv.nes."") then write libopt sv $ sv = svn $ endif $ goto bloop $BLOOP_END: $ write libopt f$extract(0,f$length(sv)-2,sv), "-" $ write libopt ")" $ close/nolog bopt $ delete/nolog/noconf a.opt;*,b.opt;* $ else $ if vax $ then $ open/append libopt 'p2' $ mod_sym_num = 1 $ VMOD_SYM_LOOP: $ if f$type(module'mod_sym_num') .nes. "" $ then $ mod_in = 0 $ VMOD_SYM_IN: $ shared_proc = f$element(mod_in, "#", module'mod_sym_num') $ if shared_proc .nes. "#" $ then $ write libopt f$fao("UNIVERSAL=!AS",- f$edit(shared_proc,"upcase")) $ mod_in = mod_in + 1 $ goto vmod_sym_in $ endif $ mod_sym_num = mod_sym_num + 1 $ goto vmod_sym_loop $ endif $VMAP_LOOP: $ read/end=vmap_end map line $ if (f$locate("{",line).lt. f$length(line)) .or. - (f$locate("global:", line) .lt. f$length(line)) $ then $ proc = true $ goto vmap_loop $ endif $ if f$locate("}",line).lt. f$length(line) then proc = false $ if f$locate("local:", line) .lt. f$length(line) then proc = false $ if proc $ then $ shared_proc = f$edit(line,"collapse") $ chop_semi = f$locate(";", shared_proc) $ if chop_semi .lt. f$length(shared_proc) then - shared_proc = f$extract(0, chop_semi, shared_proc) $ write libopt f$fao("UNIVERSAL=!AS",- f$edit(shared_proc,"upcase")) $ endif $ goto vmap_loop $VMAP_END: $ else $ write sys$output "Unknown Architecture (Not VAX, AXP, or IA64)" $ write sys$output "No options file created" $ endif $ endif $ EXIT_M2S: $ close/nolog map $ close/nolog libopt $ endsubroutine ================================================ FILE: samples/DIGITAL Command Language/libxslt_build.com ================================================ $! BUILD_XSLT.COM $! $! Build the XSLT library $! $! Arguments: $! $! p1 - "DEBUG" is you want to build with debug $! $! This package requires libxml to have already been installed. You need $! to ensure that the logical name LIBXML is defined and points to the $! directory containing libxml's .h files $! $! This procedure creates the object libraries $! $! XML_LIBDIR:LIBXSLT.OLB $! XML_LIBDIR:LIBEXSLT.OLB $! $! and the program $! $! XSLTPROC $! $! After the library is built, you can link these routines into $! your code with the command $! $! LINK your_modules,XML_LIBDIR:LIBEXSLT/LIB,LIBXSLT/LIBRARY,LIBXML/LIB $! $! Change History $! -------------- $! Command file author : John A Fotheringham (jaf@jafsoft.com) $! Last update : 2 Nov 2001 $! $!- configuration ------------------------------------------------------------- $! $!- compile command. $! $ cc_opts = "/INCLUDE=([],XML_SRCDIR:,[-.libxslt])/NAMES=(SHORTENED)/FLOAT=IEEE/IEEE_MODE=DENORM_RESULTS" $! $ if p1.eqs."DEBUG" $ then $ debug = "Y" $ cc_command = "CC''cc_opts'/DEBUG/NOOPTIMIZE/LIST/SHOW=ALL" $ else $ debug = "N" $ cc_command = "CC''cc_opts'" $ endif $! $!- configure multiple build passes for each library. ------------------------- $! $! For each pass: $! $! "libname" is the name of the library or module being created $! $! "progname" is the name of the program being created $! $! "src" is the list of sources to be built into the library or program $! - This should be compared to the definition of $! "_la_SOURCES" in the MAKEFILE.IN file in $! corresponding directory. $! $ num_passes = 3 ! two libraries and a program $! $!- pass 1 - library LIBXSLT $! $ libname_1 = "LIBXSLT" $ h_file_1 = "xslt.h" $ progname_1 = "" $! $ ! see "libxslt_la_SOURCES" in [.libxslt]makefile.in $ src_1 = "xslt.c xsltutils.c pattern.c templates.c variables.c keys.c" $ src_1 = src_1 + " numbers.c extensions.c extra.c functions.c" $ src_1 = src_1 + " namespaces.c imports.c attributes.c documents.c" $ src_1 = src_1 + " preproc.c transform.c security.c" $! $!- pass 2 - library LIBEXSLT $! $ libname_2 = "LIBEXSLT" $ h_file_2 = "exslt.h" $ progname_2 = "" $! $ ! see "libexslt_la_SOURCES" in [.libexslt]makefile.in $ src_2 = "exslt.c common.c math.c sets.c functions.c strings.c date.c saxon.c dynamic.c" $! $!- pass 3 - program XSLTPROC $! $ libname_3 = "" $ h_file_3 = "" $ progname_3 = "XSLTPROC" $! $ ! see "xsltproc_SOURCES" in [.xsltproc]makefile.in $ src_3 = "xsltproc.c" $! $!- set up and check logicals ----------------------------------------------- $! $! XML_LIBDIR - object library directory $! XML_SRCDIR - top-level build directory of libxml package -- needed for config.h and trio.h $! LIBXML - source directory containing .h files for libxml package $! $ if f$trnlnm("XML_LIBDIR").eqs."" $ then $ on error then continue $ globfile = f$search("[--...]libxml.olb") $ if globfile.eqs."" $ then $ write sys$output "" $ write sys$output " You need to define the XML_LIBDIR logical name to" $ write sys$output " point to the directory containing your object" $ write sys$output " libraries. This should already contain LIBXML.OLB" $ write sys$output " from the libxml package, and will be the directory" $ write sys$output " the new LIBXSLT.OLB library will be placed in" $ write sys$output "" $ exit $ else $ srcdir = f$parse(globfile,,,"DEVICE") + f$parse(globfile,,,"DIRECTORY") $ define/process XML_LIBDIR "''srcdir'" $ write sys$output "Defining XML_LIBDIR as ""''srcdir'""" $ endif $ endif $! $ if f$trnlnm("libxml").eqs."" $ then $ ! look for globals.h in a directory installed paralle to this one $ on error then continue $ globfile = f$search("[--...]globals.h") $ if globfile.eqs."" $ then $ write sys$output "" $ write sys$output " You need to define a LIBXML logical directory to" $ write sys$output " point to the directory containing the .h files" $ write sys$output " for the libxml package" $ write sys$output "" $ exit $ else $ srcdir = f$element(0,"]",globfile)+ "]" $ define/process LIBXML "''srcdir'" $ write sys$output "Defining LIBXML as ""''srcdir'""" $ endif $ endif $! $ if f$trnlnm("XML_SRCDIR").eqs."" $ then $ globfile = f$search("[--...]globals.c") $ if globfile.eqs."" $ then $ write sys$output "Can't locate globals.c. You need to manually define a XML_SRCDIR logical" $ exit $ else $ srcdir = f$parse(globfile,,,"DEVICE") + f$parse(globfile,,,"DIRECTORY") $ define/process XML_SRCDIR "''srcdir'" $ write sys$output "Defining XML_SRCDIR as ""''srcdir'""" $ endif $ endif $! $!- set up some working logicals ------------------- $! $ pass_no = 1 $ set_pass_logical: $! $ if pass_no.le.num_passes $ then $! $ Libname = libname_'pass_no' $ progname = progname_'pass_no' $ if libname.nes."" $ then $ logname = "''libname'_SRCDIR" $ else $ logname = "''progname'_SRCDIR" $ endif $ findfile = f$element(0," ",src_'pass_no') $! $!--- set up a source directory logical $! $ if f$trnlnm("''logname'").eqs."" $ then $ ! look for the target file in a parallel subdirectory $ globfile = f$search("[-...]''findfile'") $ if globfile.eqs."" $ then $ write sys$output "Can't locate ''findfile'. You need to manually define a ''logname' logical" $ exit $ else $ srcdir = f$element(0,"]",globfile)+ "]" $ define/process 'logname' "''srcdir'" $ write sys$output "Defining ''logname' as ""''srcdir'""" $ endif $ endif $! $!--- if it's a library, set up a logical pointing to the .h files $! $ if libname.nes."" $ then $ if f$trnlnm("''libname'").eqs."" $ then $ ! look for the target .h file in a parallel subdirectory $ h_file = h_file_'pass_no' $ globfile = f$search("[-...]''h_file'") $ if globfile.eqs."" $ then $ write sys$output "Can't locate ''h_file'. You need to manually define a ''libname' logical" $ exit $ else $ includedir = f$element(0,"]",globfile)+ "]" $ define/process 'libname' "''includedir'" $ write sys$output "Defining ''libname' as ""''includedir'""" $ endif $ endif $ endif $! $ pass_no = pass_no +1 $ goto set_pass_logical $! $ endif ! for each pass $! $!- set up error handling (such as it is) ------------------------------------- $! $ exit_status = 1 $ saved_default = f$environment("default") $ on error then goto ERROR_OUT $ on control_y then goto ERROR_OUT $! $ goto start_here $ start_here: ! move this line to debug/rerun parts of this command file $! $!- compile modules into the library ------------------------------------------ $! $! $ pass_no = 1 ! make three passes, one for each library, one for XSLTPROC $ pass_loop: $! $ if pass_no.le.num_passes $ then $ Libname = libname_'pass_no' $ progname = progname_'pass_no' $ if libname.nes."" $ then $ logname = "''libname'_SRCDIR" $ pass_description = "the XML_LIBDIR:''libname'.OLB object library" $ else $ logname = "''progname'_SRCDIR" $ pass_description = "the programs in ''progname'" $ endif $ src = src_'pass_no' $! $!- create the library if need $! $ if libname.nes."" $ then $ if f$search("XML_LIBDIR:''libname'.OLB").eqs."" $ then $ write sys$output "Creating new object library XML_LIBDIR:''libname'.OLB..." $ library/create XML_LIBDIR:'libname'.OLB $ endif $ endif $! $!- move to the source directory $! $ set def 'logname' $! $!- define the library and link commands (link command not used as is) $! $ if libname.nes."" $ then $ lib_command = "LIBRARY/REPLACE XML_LIBDIR:''libname'.OLB" $ link_command = "" $ else $ lib_command = "" $ link_command = "LINK" $ endif $! $ write sys$output "" $ write sys$output "Building ''pass_description' $ write sys$output "" $! $ s_no = 0 $ src = f$edit(src,"COMPRESS") $! $ source_loop: $! $ next_source = f$element (S_no," ",src) $ if next_source.nes."" .and. next_source.nes." " $ then $ call build 'next_source' $ s_no = s_no + 1 $ goto source_loop $ endif $! $ pass_no = pass_no + 1 $ goto pass_loop $! $ endif ! for each pass $! $!- Th-th-th-th-th-that's all folks! ------------------------------------------ $! $EXIT_OUT: $! $ set def 'saved_default $ exit 'exit_status $! $ $ERROR_OUT: $ exit_status = $status $ write sys$output "''f$message(exit_status)'" $ goto EXIT_OUT $! $!- the BUILD subroutine. Compile then insert into library or link as required $! $BUILD: subroutine $ on warning then goto EXIT_BUILD $ source_file = p1 $ name = f$element(0,".",source_file) $ object_file = f$fao("XML_LIBDIR:!AS.OBJ",name) $! $!- compile $ write sys$output "Compiling ",p1,p2,"..." $ cc_command /object='object_file 'source_file' 'p2' $! $!- insert into library if command defined $! $ if lib_command.nes."" $ then $ lib_command 'object_file' $ delete/nolog 'object_file';* $ endif $! $!- link module if command defined $! $ if link_command.nes."" $ then $ text = f$element(0,".",p1) ! lose the ".c" $ write sys$output "Linking ",text,"..." $ dbgopts = "" $ if debug then dbgopts = "/DEBUG" $ link_command'dbgopts' 'object_file',- XML_LIBDIR:libexslt/lib,- XML_LIBDIR:libxslt/lib,- XML_LIBDIR:libxml/library $ endif $! $EXIT_BUILD: $ exit $status $! $endsubroutine ================================================ FILE: samples/DIGITAL Command Language/vmsbackup_build.com ================================================ $! Compiling with VAXC is said to work, but it requires the usual cruft $! (vaxcrtl and all), and to avoid hair we don't supply said cruft here. $ CC/DECC/PREFIX=all VMSBACKUP.C/DEFINE=(HAVE_MT_IOCTLS=0,HAVE_UNIXIO_H=1) $ CC/DECC/PREFIX=all DCLMAIN.C $! Probably we don't want match as it probably doesn't implement VMS-style $! matching, but I haven't looking into the issues yet. $ CC/DECC/PREFIX=all match $ LINK/exe=VMSBACKUP.EXE - vmsbackup.obj,dclmain.obj,match.obj,sys$input/opt identification="VMSBACKUP4.1.1" ================================================ FILE: samples/DM/example.dm ================================================ // This is a single line comment. /* This is a multi-line comment */ // Pre-processor keywords #define PI 3.1415 #if PI == 4 #define G 5 #elif PI == 3 #define I 6 #else #define K 7 #endif var/GlobalCounter = 0 var/const/CONST_VARIABLE = 2 var/list/MyList = list("anything", 1, new /datum/entity) var/list/EmptyList[99] // creates a list of 99 null entries var/list/NullList = null /* Entity Class */ /datum/entity var/name = "Entity" var/number = 0 /datum/entity/proc/myFunction() world.log << "Entity has called myFunction" /datum/entity/New() number = GlobalCounter++ /* Unit Class, Extends from Entity */ /datum/entity/unit name = "Unit" /datum/entity/unit/New() ..() // calls the parent's proc; equal to super() and base() in other languages number = rand(1, 99) /datum/entity/unit/myFunction() world.log << "Unit has overriden and called myFunction" // Global Function /proc/ReverseList(var/list/input) var/list/output = list() for(var/i = input.len; i >= 1; i--) // IMPORTANT: List Arrays count from 1. output += input[i] // "+= x" is ".Add(x)" return output // Bitflags /proc/DoStuff() var/bitflag = 0 bitflag |= 8 return bitflag /proc/DoOtherStuff() var/bitflag = 65535 // 16 bits is the maximum amount bitflag &= ~8 return bitflag // Logic /proc/DoNothing() var/pi = PI if(pi == 4) world.log << "PI is 4" else if(pi == CONST_VARIABLE) world.log << "PI is [CONST_VARIABLE]!" else world.log << "PI is approximety [pi]" #undef PI // Undefine PI ================================================ FILE: samples/DNS Zone/sample.arpa ================================================ $ORIGIN 0.0.0.c.2.1.0.3.0.0.2.1.e.f.f.3.ip6.arpa. $TTL 60 @ IN SOA ns root ( 2002042901 ; SERIAL 7200 ; REFRESH 600 ; RETRY 36000000 ; EXPIRE 120 ; MINIMUM ) NS ns.example.com. c.a.7.e.d.7.e.f.f.f.0.2.8.0.a.0 PTR sip01.example.com. ================================================ FILE: samples/DNS Zone/sneaky.net.zone ================================================ $TTL 3d @ IN SOA root.localhost. root.sneaky.net. ( 2015042907 ; serial 3d ; refresh 1h ; retry 12d ; expire 2h ; negative response TTL ) IN NS root.localhost. IN NS localhost. ; secondary name server is preferably externally maintained www IN A 3.141.59.26 ================================================ FILE: samples/DTrace/counts.d ================================================ /* * This software is in the public domain. * * $Id: counts.d 10510 2005-08-15 01:46:19Z kateturner $ */ #pragma D option quiet self int tottime; BEGIN { tottime = timestamp; } php$target:::function-entry @counts[copyinstr(arg0)] = count(); } END { printf("Total time: %dus\n", (timestamp - tottime) / 1000); printf("# calls by function:\n"); printa("%-40s %@d\n", @counts); } ================================================ FILE: samples/DTrace/probes.d ================================================ /* ---------- * DTrace probes for PostgreSQL backend * * Copyright (c) 2006-2009, PostgreSQL Global Development Group * * $PostgreSQL: pgsql/src/backend/utils/probes.d,v 1.11 2009/04/02 20:59:10 momjian Exp $ * ---------- */ /* * Typedefs used in PostgreSQL. * * NOTE: Do not use system-provided typedefs (e.g. uintptr_t, uint32_t, etc) * in probe definitions, as they cause compilation errors on Mac OS X 10.5. */ #define LocalTransactionId unsigned int #define LWLockId int #define LWLockMode int #define LOCKMODE int #define BlockNumber unsigned int #define Oid unsigned int #define ForkNumber int #define bool char provider postgresql { probe transaction__start(LocalTransactionId); probe transaction__commit(LocalTransactionId); probe transaction__abort(LocalTransactionId); probe lwlock__acquire(LWLockId, LWLockMode); probe lwlock__release(LWLockId); probe lwlock__wait__start(LWLockId, LWLockMode); probe lwlock__wait__done(LWLockId, LWLockMode); probe lwlock__condacquire(LWLockId, LWLockMode); probe lwlock__condacquire__fail(LWLockId, LWLockMode); probe lock__wait__start(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE); probe lock__wait__done(unsigned int, unsigned int, unsigned int, unsigned int, unsigned int, LOCKMODE); probe query__parse__start(const char *); probe query__parse__done(const char *); probe query__rewrite__start(const char *); probe query__rewrite__done(const char *); probe query__plan__start(); probe query__plan__done(); probe query__execute__start(); probe query__execute__done(); probe query__start(const char *); probe query__done(const char *); probe statement__status(const char *); probe sort__start(int, bool, int, int, bool); probe sort__done(bool, long); probe buffer__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool); probe buffer__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, bool, bool, bool); probe buffer__flush__start(ForkNumber, BlockNumber, Oid, Oid, Oid); probe buffer__flush__done(ForkNumber, BlockNumber, Oid, Oid, Oid); probe buffer__checkpoint__start(int); probe buffer__checkpoint__sync__start(); probe buffer__checkpoint__done(); probe buffer__sync__start(int, int); probe buffer__sync__written(int); probe buffer__sync__done(int, int, int); probe buffer__write__dirty__start(ForkNumber, BlockNumber, Oid, Oid, Oid); probe buffer__write__dirty__done(ForkNumber, BlockNumber, Oid, Oid, Oid); probe deadlock__found(); probe checkpoint__start(int); probe checkpoint__done(int, int, int, int, int); probe clog__checkpoint__start(bool); probe clog__checkpoint__done(bool); probe subtrans__checkpoint__start(bool); probe subtrans__checkpoint__done(bool); probe multixact__checkpoint__start(bool); probe multixact__checkpoint__done(bool); probe twophase__checkpoint__start(); probe twophase__checkpoint__done(); probe smgr__md__read__start(ForkNumber, BlockNumber, Oid, Oid, Oid); probe smgr__md__read__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int); probe smgr__md__write__start(ForkNumber, BlockNumber, Oid, Oid, Oid); probe smgr__md__write__done(ForkNumber, BlockNumber, Oid, Oid, Oid, int, int); probe xlog__insert(unsigned char, unsigned char); probe xlog__switch(); probe wal__buffer__write__dirty__start(); probe wal__buffer__write__dirty__done(); }; ================================================ FILE: samples/DTrace/trace_futexes.d ================================================ #!/usr/sbin/dtrace -qs // Source: https://github.com/bycn82/freebsd/blob/12a4a4a008eac3cfa71e496b33eaeaf426c374c1/sys/compat/linux/trace_futexes.d /*- * Copyright (c) 2011-2012 Alexander Leidinger * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer * in this position and unchanged. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. * * $FreeBSD$ */ /** * Trace futex operations: * - internal locks * - size of the futex list * - report error conditions (emulation errors, kernel errors, * programming errors) * - execution time (wallclock) of futex related functions */ #pragma D option specsize=32m /* Error conditions */ linuxulator*:futex:futex_get:error, linuxulator*:futex:futex_sleep:requeue_error, linuxulator*:futex:futex_sleep:sleep_error, linuxulator*:futex:futex_wait:copyin_error, linuxulator*:futex:futex_wait:itimerfix_error, linuxulator*:futex:futex_wait:sleep_error, linuxulator*:futex:futex_atomic_op:missing_access_check, linuxulator*:futex:futex_atomic_op:unimplemented_op, linuxulator*:futex:futex_atomic_op:unimplemented_cmp, linuxulator*:futex:linux_sys_futex:unimplemented_clockswitch, linuxulator*:futex:linux_sys_futex:copyin_error, linuxulator*:futex:linux_sys_futex:unhandled_efault, linuxulator*:futex:linux_sys_futex:unimplemented_lock_pi, linuxulator*:futex:linux_sys_futex:unimplemented_unlock_pi, linuxulator*:futex:linux_sys_futex:unimplemented_trylock_pi, linuxulator*:futex:linux_sys_futex:unimplemented_wait_requeue_pi, linuxulator*:futex:linux_sys_futex:unimplemented_cmp_requeue_pi, linuxulator*:futex:linux_sys_futex:unknown_operation, linuxulator*:futex:linux_get_robust_list:copyout_error, linuxulator*:futex:handle_futex_death:copyin_error, linuxulator*:futex:fetch_robust_entry:copyin_error, linuxulator*:futex:release_futexes:copyin_error { printf("ERROR: %s in %s:%s:%s\n", probename, probeprov, probemod, probefunc); stack(); ustack(); } linuxulator*:futex:linux_sys_futex:invalid_cmp_requeue_use, linuxulator*:futex:linux_sys_futex:deprecated_requeue, linuxulator*:futex:linux_set_robust_list:size_error { printf("WARNING: %s:%s:%s:%s in application %s, maybe an application error?\n", probename, probeprov, probemod, probefunc, execname); stack(); ustack(); } /* Per futex checks/statistics */ linuxulator*:futex:futex:create { ++futex_count; @max_futexes = max(futex_count); } linuxulator*:futex:futex:destroy /futex_count == 0/ { printf("ERROR: Request to destroy a futex which was not created,\n"); printf(" or this script was started after some futexes where\n"); printf(" created. Stack trace:\n"); stack(); ustack(); } linuxulator*:futex:futex:destroy { --futex_count; } /* Internal locks */ linuxulator*:locks:futex_mtx:locked { ++check[probefunc, arg0]; @stats[probefunc] = count(); ts[probefunc] = timestamp; spec[probefunc] = speculation(); printf("Stacktrace of last lock operation of the %s:\n", probefunc); stack(); } linuxulator*:locks:futex_mtx:unlock /check[probefunc, arg0] == 0/ { printf("ERROR: unlock attempt of unlocked %s (%p),", probefunc, arg0); printf(" missing SDT probe in kernel, or dtrace program started"); printf(" while the %s was already held (race condition).", probefunc); printf(" Stack trace follows:"); stack(); } linuxulator*:locks:futex_mtx:unlock { discard(spec[probefunc]); spec[probefunc] = 0; --check[probefunc, arg0]; } /* Timeout handling for internal locks */ tick-10s /spec["futex_mtx"] != 0 && timestamp - ts["futex_mtx"] >= 9999999000/ { commit(spec["futex_mtx"]); spec["futex_mtx"] = 0; } /* Timing statistings */ linuxulator*:futex::entry { self->time[probefunc] = timestamp; @calls[probeprov, execname, probefunc] = count(); } linuxulator*:futex::return /self->time[probefunc] != 0/ { this->timediff = self->time[probefunc] - timestamp; @timestats[probeprov, execname, probefunc] = quantize(this->timediff); @longest[probeprov, probefunc] = max(this->timediff); self->time[probefunc] = 0; } /* Statistics */ END { printf("Number of locks per type:"); printa(@stats); printf("Number of maximum number of futexes in the futex list:"); printa(@max_futexes); printf("Number of futexes still existing: %d", futex_count); printf("Number of calls per provider/application/kernel function:"); printa(@calls); printf("Wallclock-timing statistics per provider/application/kernel function (in ns):"); printa(@timestats); printf("Longest running (wallclock!) functions per provider (in ns):"); printa(@longest); } ================================================ FILE: samples/Dafny/Io.s.dfy ================================================ // From: https://github.com/microsoft/Ironclad/blob/b2afa7e3eb65285fd3dba4ffa9dc10c6da593727/ironfleet/src/Dafny/Distributed/Common/Native/Io.s.dfy include "NativeTypes.s.dfy" include "../Framework/Environment.s.dfy" module Native__Io_s { import opened Native__NativeTypes_s import opened Environment_s class HostEnvironment { ghost var constants:HostConstants; ghost var ok:OkState; ghost var now:NowState; ghost var udp:UdpState; ghost var files:FileSystemState; predicate Valid() reads this; { constants != null && ok != null && now != null && udp != null && files != null } } ////////////////////////////////////////////////////////////////////////////// // Per-host constants ////////////////////////////////////////////////////////////////////////////// class HostConstants { constructor{:axiom} () requires false; function{:axiom} LocalAddress():seq reads this; // REVIEW: Do we need this anymore? We now allow different UdpClients to have different addresses anyway. function{:axiom} CommandLineArgs():seq> reads this; // result of C# System.Environment.GetCommandLineArgs(); argument 0 is name of executable static method{:axiom} NumCommandLineArgs(ghost env:HostEnvironment) returns(n:uint32) requires env != null && env.Valid(); ensures int(n) == |env.constants.CommandLineArgs()|; static method{:axiom} GetCommandLineArg(i:uint64, ghost env:HostEnvironment) returns(arg:array) requires env != null && env.Valid(); requires 0 <= int(i) < |env.constants.CommandLineArgs()|; ensures arg != null; ensures fresh(arg); ensures arg[..] == env.constants.CommandLineArgs()[i]; } ////////////////////////////////////////////////////////////////////////////// // Failure ////////////////////////////////////////////////////////////////////////////// // not failed; IO operations only allowed when ok() == true class OkState { constructor{:axiom} () requires false; function{:axiom} ok():bool reads this; } ////////////////////////////////////////////////////////////////////////////// // Time ////////////////////////////////////////////////////////////////////////////// // current local real time in milliseconds // (current actually means "current as of last waiting operation or call to GetTime") class NowState { constructor{:axiom} () requires false; function{:axiom} now():int reads this; } // maximum assumed time taken by any non-waiting code (in milliseconds) function{:axiom} realTimeBound():int predicate AdvanceTime(oldTime:int, newTime:int, delay:int) { oldTime <= newTime < oldTime + delay + realTimeBound() } class Time { static method{:axiom} GetTime(ghost env:HostEnvironment) returns(t:uint64) requires env != null && env.Valid(); modifies env.now; // To avoid contradiction, GetTime must advance time, because successive calls to GetTime can return different values modifies env.udp; ensures int(t) == env.now.now(); ensures AdvanceTime(old(env.now.now()), env.now.now(), 0); ensures env.udp.history() == old(env.udp.history()) + [LIoOpReadClock(int(t))]; // Used for performance debugging static method{:axiom} GetDebugTimeTicks() returns(t:uint64) static method{:axiom} RecordTiming(name:array, time:uint64) } ////////////////////////////////////////////////////////////////////////////// // Networking ////////////////////////////////////////////////////////////////////////////// datatype EndPoint = EndPoint(addr:seq, port:uint16) // UdpPacket_ctor has silly name to ferret out backwards calls type UdpPacket = LPacket> type UdpEvent = LIoOp> class UdpState { constructor{:axiom} () requires false; function{:axiom} history():seq reads this; } class IPEndPoint { ghost var env:HostEnvironment; function{:axiom} Address():seq reads this; function{:axiom} Port():uint16 reads this; function EP():EndPoint reads this; { EndPoint(Address(), Port()) } constructor{:axiom} () requires false; method{:axiom} GetAddress() returns(addr:array) ensures addr != null; ensures fresh(addr); ensures addr[..] == Address(); ensures addr.Length == 4; // Encoding current IPv4 assumption function method{:axiom} GetPort():uint16 reads this; ensures GetPort() == Port(); static method{:axiom} Construct(ipAddress:array, port:uint16, ghost env:HostEnvironment) returns(ok:bool, ep:IPEndPoint) requires env != null && env.Valid(); requires ipAddress != null; modifies env.ok; ensures env.ok.ok() == ok; ensures ok ==> ep != null && fresh(ep) && ep.env == env && ep.Address() == ipAddress[..] && ep.Port() == port; } function MaxPacketSize() : int { 65507 } class UdpClient { ghost var env:HostEnvironment; function{:axiom} LocalEndPoint():EndPoint reads this; function{:axiom} IsOpen():bool reads this; constructor{:axiom} () requires false; static method{:axiom} Construct(localEP:IPEndPoint, ghost env:HostEnvironment) returns(ok:bool, udp:UdpClient) requires env != null && env.Valid(); requires env.ok.ok(); requires localEP != null; modifies env.ok; ensures env.ok.ok() == ok; ensures ok ==> udp != null && fresh(udp) && udp.env == env && udp.IsOpen() && udp.LocalEndPoint() == localEP.EP(); method{:axiom} Close() returns(ok:bool) requires env != null && env.Valid(); requires env.ok.ok(); requires this.IsOpen(); modifies this; modifies env.ok; ensures env == old(env); ensures env.ok.ok() == ok; method{:axiom} Receive(timeLimit:int32) returns(ok:bool, timedOut:bool, remote:IPEndPoint, buffer:array) requires env != null && env.Valid(); requires env.ok.ok(); requires IsOpen(); requires timeLimit >= 0; requires int(timeLimit) * 1000 < 0x80000000; // only needed when the underlying implementation uses Socket.Poll instead of Task.Wait modifies this; modifies env.ok; modifies env.now; modifies env.udp; ensures env == old(env); ensures env.ok.ok() == ok; ensures AdvanceTime(old(env.now.now()), env.now.now(), int(timeLimit)); ensures LocalEndPoint() == old(LocalEndPoint()); ensures ok ==> IsOpen(); ensures ok ==> timedOut ==> env.udp.history() == old(env.udp.history()) + [LIoOpTimeoutReceive()]; ensures ok ==> !timedOut ==> remote != null && buffer != null && fresh(remote) && fresh(buffer) && env.udp.history() == old(env.udp.history()) + [LIoOpReceive(LPacket(LocalEndPoint(), remote.EP(), buffer[..]))] && buffer.Length < 0x1_0000_0000_0000_0000; method{:axiom} Send(remote:IPEndPoint, buffer:array) returns(ok:bool) requires env != null && env.Valid(); requires env.ok.ok(); requires IsOpen(); requires remote != null; requires buffer != null; requires buffer.Length <= MaxPacketSize(); modifies this; modifies env.ok; modifies env.udp; ensures env == old(env); ensures env.ok.ok() == ok; ensures LocalEndPoint() == old(LocalEndPoint()); ensures ok ==> IsOpen(); ensures ok ==> env.udp.history() == old(env.udp.history()) + [LIoOpSend(LPacket(remote.EP(), LocalEndPoint(), buffer[..]))]; } // jonh temporarily neutered this because the opaque type can't be compiled class FileSystemState { } class MutableSet { static function method {:axiom} SetOf(s:MutableSet) : set reads s; static method {:axiom} EmptySet() returns (s:MutableSet) ensures SetOf(s) == {}; ensures fresh(s); constructor{:axiom} () requires false; method {:axiom} Size() returns (size:int) ensures size == |SetOf(this)|; method {:axiom} SizeModest() returns (size:uint64) requires |SetOf(this)| < 0x1_0000_0000_0000_0000; ensures int(size) == |SetOf(this)|; method {:axiom} Contains(x:T) returns (contains:bool) ensures contains == (x in SetOf(this)); method {:axiom} Add(x:T) modifies this; ensures SetOf(this) == old(SetOf(this)) + {x}; method {:axiom} AddSet(s:MutableSet) modifies this; ensures SetOf(this) == old(SetOf(this)) + old(SetOf(s)); method {:axiom} TransferSet(s:MutableSet) modifies this; modifies s; ensures SetOf(this) == old(SetOf(s)); ensures SetOf(s) == {}; method {:axiom} Remove(x:T) modifies this; ensures SetOf(this) == old(SetOf(this)) - {x}; method {:axiom} RemoveAll() modifies this; ensures SetOf(this) == {}; } class MutableMap { static function method {:axiom} MapOf(m:MutableMap) : map reads m; static method {:axiom} EmptyMap() returns (m:MutableMap) ensures MapOf(m) == map []; ensures fresh(m); static method {:axiom} FromMap(dafny_map:map) returns (m:MutableMap) ensures MapOf(m) == dafny_map; ensures fresh(m); constructor{:axiom} () requires false; function method {:axiom} Size() : int reads this; ensures this.Size() == |MapOf(this)|; method {:axiom} SizeModest() returns (size:uint64) requires |MapOf(this)| < 0x1_0000_0000_0000_0000; ensures int(size) == |MapOf(this)|; method {:axiom} Contains(key:K) returns (contains:bool) ensures contains == (key in MapOf(this)); method {:axiom} TryGetValue(key:K) returns (contains:bool, val:V) ensures contains == (key in MapOf(this)); ensures contains ==> val == MapOf(this)[key]; method {:axiom} Set(key:K, val:V) modifies this; ensures MapOf(this) == old(MapOf(this))[key := val]; method {:axiom} Remove(key:K) modifies this; ensures MapOf(this) == map k | k != key && k in old(MapOf(this)) :: old(MapOf(this))[k]; } // Leverage .NET's ability to perform copies faster than one element at a time class Arrays { static method{:axiom} CopySeqIntoArray(src:seq, srcIndex:uint64, dst:array, dstIndex:uint64, len:uint64) requires dst != null; requires int(srcIndex) + int(len) <= |src|; requires int(dstIndex) + int(len) <= dst.Length; modifies dst; ensures forall i :: 0 <= i < dst.Length ==> dst[i] == ( if int(dstIndex) <= i < int(dstIndex) + int(len) then src[i - int(dstIndex) + int(srcIndex)] else old(dst[..])[i]); ensures forall i :: int(srcIndex) <= i < int(srcIndex) + int(len) ==> src[i] == dst[i - int(srcIndex) + int(dstIndex)]; } /* ////////////////////////////////////////////////////////////////////////////// // File System ////////////////////////////////////////////////////////////////////////////// type FileSystem datatype FileOp = FileRead(fileReadOffset:int, fileReadBytes:seq) | FileWrite(fileWriteOffset:int, fileWriteBytes:seq) | FileFlush class FileSystemState { constructor{:axiom} () requires false; function{:axiom} state():FileSystem reads this; } function{:axiom} FileOpRequires(fs:FileSystem, fileName:string, op:FileOp):bool function{:axiom} FileOpEnsures(fsOld:FileSystem, fsNew:FileSystem, fileName:string, op:FileOp):bool class FileStream { ghost var env:HostEnvironment; function{:axiom} Name():string reads this; function{:axiom} IsOpen():bool reads this; constructor{:axiom} () requires false; static method{:axiom} Open(name:array, ghost env:HostEnvironment) returns(ok:bool, f:FileStream) requires env != null && env.Valid(); requires env.ok.ok(); requires name != null; modifies env.ok; ensures env.ok.ok() == ok; ensures ok ==> f != null && fresh(f) && f.env == env && f.IsOpen() && f.Name() == name[..]; method{:axiom} Close() returns(ok:bool) requires env != null && env.Valid(); requires env.ok.ok(); requires IsOpen(); modifies this; modifies env.ok; ensures env == old(env); ensures env.ok.ok() == ok; method{:axiom} Read(fileOffset:nat32, buffer:array, start:int32, end:int32) returns(ok:bool) requires env != null && env.Valid(); requires env.ok.ok(); requires IsOpen(); requires buffer != null; requires 0 <= int(start) <= int(end) <= buffer.Length; requires FileOpRequires(env.files.state(), Name(), FileRead(int(fileOffset), buffer[start..end])); modifies this; modifies env.ok; modifies env.files; modifies buffer; ensures env == old(env); ensures env.ok.ok() == ok; ensures Name() == old(Name()); ensures forall i:int :: 0 <= i < buffer.Length && !(int(start) <= i < int(end)) ==> buffer[i] == old(buffer[i]); ensures ok ==> IsOpen(); ensures ok ==> FileOpEnsures(old(env.files.state()), env.files.state(), Name(), FileRead(int(fileOffset), buffer[start..end])); method{:axiom} Write(fileOffset:nat32, buffer:array, start:int32, end:int32) returns(ok:bool) requires env != null && env.Valid(); requires env.ok.ok(); requires IsOpen(); requires buffer != null; requires 0 <= int(start) <= int(end) <= buffer.Length; requires FileOpRequires(env.files.state(), Name(), FileWrite(int(fileOffset), buffer[start..end])); modifies this; modifies env.ok; modifies env.files; ensures env == old(env); ensures env.ok.ok() == ok; ensures Name() == old(Name()); ensures ok ==> IsOpen(); ensures ok ==> FileOpEnsures(old(env.files.state()), env.files.state(), Name(), FileWrite(int(fileOffset), buffer[start..end])); method{:axiom} Flush() returns(ok:bool) requires env != null && env.Valid(); requires env.ok.ok(); requires IsOpen(); requires FileOpRequires(env.files.state(), Name(), FileFlush); modifies this; modifies env.ok; modifies env.files; ensures env == old(env); ensures env.ok.ok() == ok; ensures Name() == old(Name()); ensures ok ==> IsOpen(); ensures ok ==> FileOpEnsures(old(env.files.state()), env.files.state(), Name(), FileFlush); } */ } ================================================ FILE: samples/Dafny/Node.i.dfy ================================================ // From: https://github.com/microsoft/Ironclad/blob/master/ironfleet/src/Dafny/Distributed/Protocol/Lock/Node.i.dfy include "../../Protocol/Lock/Node.i.dfy" include "Message.i.dfy" include "../Common/UdpClient.i.dfy" include "../../Common/Logic/Option.i.dfy" include "PacketParsing.i.dfy" include "../Common/SeqIsUniqueDef.i.dfy" module Impl_Node_i { import opened Protocol_Node_i import opened Message_i import opened Common__UdpClient_i import opened Logic__Option_i import opened PacketParsing_i import opened Common__SeqIsUniqueDef_i datatype CNode = CNode(held:bool, epoch:uint64, my_index:uint64, config:Config) predicate ValidConfig(c:Config) { 0 < |c| < 0x1_0000_0000_0000_0000 && (forall e :: e in c ==> EndPointIsValidIPV4(e)) && SeqIsUnique(c) } predicate ValidConfigIndex(c:Config, index:uint64) { 0 <= int(index) < |c| } predicate CNodeValid(c:CNode) { ValidConfig(c.config) && ValidConfigIndex(c.config, c.my_index) } function AbstractifyCNode(n:CNode) : Node { Node(n.held, int(n.epoch), int(n.my_index), n.config) } method NodeInitImpl(my_index:uint64, config:Config) returns (node:CNode) requires 0 < |config| < 0x1_0000_0000_0000_0000; requires 0 <= int(my_index) < |config|; requires ValidConfig(config); ensures CNodeValid(node); ensures NodeInit(AbstractifyCNode(node), int(my_index), config); ensures node.my_index == my_index; ensures node.config == config; { node := CNode(my_index == 0, if my_index == 0 then 1 else 0, my_index, config); if node.held { print "I start holding the lock\n"; } } method NodeGrantImpl(s:CNode) returns (s':CNode, packet:Option, ghost ios:seq) requires CNodeValid(s); ensures NodeGrant(AbstractifyCNode(s), AbstractifyCNode(s'), ios); ensures s'.my_index == s.my_index && s'.config == s.config; ensures |ios| == 0 || |ios| == 1; ensures packet.Some? ==> |ios| == 1 && ios[0].LIoOpSend? && ios[0].s == AbstractifyCLockPacket(packet.v); ensures OptionCLockPacketValid(packet) && (packet.Some? ==> packet.v.src == s.config[s.my_index]); ensures packet.None? ==> ios == [] && s' == s; ensures CNodeValid(s'); { if s.held && s.epoch < 0xFFFF_FFFF_FFFF_FFFF { s' := s[held := false]; var dst_index := (s.my_index + 1) % uint64(|s.config|); packet := Some(LPacket(s.config[dst_index], s.config[s.my_index], CTransfer(s.epoch + 1))); ios := [LIoOpSend(AbstractifyCLockPacket(packet.v))]; print "I grant the lock ", s.epoch, "\n"; } else { s' := s; ios := []; packet := None(); } } method NodeAcceptImpl(s:CNode, transfer_packet:CLockPacket) returns (s':CNode, locked_packet:Option, ghost ios:seq) requires CNodeValid(s); ensures NodeAccept(AbstractifyCNode(s), AbstractifyCNode(s'), ios); ensures s'.my_index == s.my_index && s'.config == s.config; ensures |ios| == 1 || |ios| == 2; ensures locked_packet.None? ==> |ios| == 1 && ios[0].LIoOpReceive? && ios[0].r == AbstractifyCLockPacket(transfer_packet); ensures locked_packet.Some? ==> |ios| == 2 && ios == [LIoOpReceive(AbstractifyCLockPacket(transfer_packet)), LIoOpSend(AbstractifyCLockPacket(locked_packet.v))]; ensures OptionCLockPacketValid(locked_packet) && (locked_packet.Some? ==> locked_packet.v.src == s.config[s.my_index]); ensures CNodeValid(s'); { ios := [LIoOpReceive(AbstractifyCLockPacket(transfer_packet))]; if !s.held && transfer_packet.src in s.config && transfer_packet.msg.CTransfer? && transfer_packet.msg.transfer_epoch > s.epoch { s' := s[held := true][epoch := transfer_packet.msg.transfer_epoch]; locked_packet := Some(LPacket(transfer_packet.src, s.config[s.my_index], CLocked(transfer_packet.msg.transfer_epoch))); ios := ios + [LIoOpSend(AbstractifyCLockPacket(locked_packet.v))]; print "I hold the lock!\n"; } else { s' := s; locked_packet := None(); } } } ================================================ FILE: samples/Dart/addressbook.pb.dart ================================================ // // Generated code. Do not modify. // source: addressbook.proto // // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes // ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; import 'addressbook.pbenum.dart'; export 'package:protobuf/protobuf.dart' show GeneratedMessageGenericExtensions; export 'addressbook.pbenum.dart'; class Person_PhoneNumber extends $pb.GeneratedMessage { factory Person_PhoneNumber({ $core.String? number, Person_PhoneType? type, }) { final result = create(); if (number != null) result.number = number; if (type != null) result.type = type; return result; } Person_PhoneNumber._(); factory Person_PhoneNumber.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry); factory Person_PhoneNumber.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Person.PhoneNumber', package: const $pb.PackageName(_omitMessageNames ? '' : 'tutorial'), createEmptyInstance: create) ..aQS(1, _omitFieldNames ? '' : 'number') ..e(2, _omitFieldNames ? '' : 'type', $pb.PbFieldType.OE, defaultOrMaker: Person_PhoneType.HOME, valueOf: Person_PhoneType.valueOf, enumValues: Person_PhoneType.values) ; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') Person_PhoneNumber clone() => Person_PhoneNumber()..mergeFromMessage(this); @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') Person_PhoneNumber copyWith(void Function(Person_PhoneNumber) updates) => super.copyWith((message) => updates(message as Person_PhoneNumber)) as Person_PhoneNumber; @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Person_PhoneNumber create() => Person_PhoneNumber._(); @$core.override Person_PhoneNumber createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Person_PhoneNumber getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Person_PhoneNumber? _defaultInstance; @$pb.TagNumber(1) $core.String get number => $_getSZ(0); @$pb.TagNumber(1) set number($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasNumber() => $_has(0); @$pb.TagNumber(1) void clearNumber() => $_clearField(1); @$pb.TagNumber(2) Person_PhoneType get type => $_getN(1); @$pb.TagNumber(2) set type(Person_PhoneType value) => $_setField(2, value); @$pb.TagNumber(2) $core.bool hasType() => $_has(1); @$pb.TagNumber(2) void clearType() => $_clearField(2); } class Person extends $pb.GeneratedMessage { factory Person({ $core.String? name, $core.int? id, $core.String? email, $core.Iterable? phone, }) { final result = create(); if (name != null) result.name = name; if (id != null) result.id = id; if (email != null) result.email = email; if (phone != null) result.phone.addAll(phone); return result; } Person._(); factory Person.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry); factory Person.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'Person', package: const $pb.PackageName(_omitMessageNames ? '' : 'tutorial'), createEmptyInstance: create) ..aQS(1, _omitFieldNames ? '' : 'name') ..a<$core.int>(2, _omitFieldNames ? '' : 'id', $pb.PbFieldType.Q3) ..aOS(3, _omitFieldNames ? '' : 'email') ..pc(4, _omitFieldNames ? '' : 'phone', $pb.PbFieldType.PM, subBuilder: Person_PhoneNumber.create) ; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') Person clone() => Person()..mergeFromMessage(this); @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') Person copyWith(void Function(Person) updates) => super.copyWith((message) => updates(message as Person)) as Person; @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static Person create() => Person._(); @$core.override Person createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static Person getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static Person? _defaultInstance; @$pb.TagNumber(1) $core.String get name => $_getSZ(0); @$pb.TagNumber(1) set name($core.String value) => $_setString(0, value); @$pb.TagNumber(1) $core.bool hasName() => $_has(0); @$pb.TagNumber(1) void clearName() => $_clearField(1); @$pb.TagNumber(2) $core.int get id => $_getIZ(1); @$pb.TagNumber(2) set id($core.int value) => $_setSignedInt32(1, value); @$pb.TagNumber(2) $core.bool hasId() => $_has(1); @$pb.TagNumber(2) void clearId() => $_clearField(2); @$pb.TagNumber(3) $core.String get email => $_getSZ(2); @$pb.TagNumber(3) set email($core.String value) => $_setString(2, value); @$pb.TagNumber(3) $core.bool hasEmail() => $_has(2); @$pb.TagNumber(3) void clearEmail() => $_clearField(3); @$pb.TagNumber(4) $pb.PbList get phone => $_getList(3); } class AddressBook extends $pb.GeneratedMessage { factory AddressBook({ $core.Iterable? person, }) { final result = create(); if (person != null) result.person.addAll(person); return result; } AddressBook._(); factory AddressBook.fromBuffer($core.List<$core.int> data, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromBuffer(data, registry); factory AddressBook.fromJson($core.String json, [$pb.ExtensionRegistry registry = $pb.ExtensionRegistry.EMPTY]) => create()..mergeFromJson(json, registry); static final $pb.BuilderInfo _i = $pb.BuilderInfo(_omitMessageNames ? '' : 'AddressBook', package: const $pb.PackageName(_omitMessageNames ? '' : 'tutorial'), createEmptyInstance: create) ..pc(1, _omitFieldNames ? '' : 'person', $pb.PbFieldType.PM, subBuilder: Person.create) ; @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') AddressBook clone() => AddressBook()..mergeFromMessage(this); @$core.Deprecated('See https://github.com/google/protobuf.dart/issues/998.') AddressBook copyWith(void Function(AddressBook) updates) => super.copyWith((message) => updates(message as AddressBook)) as AddressBook; @$core.override $pb.BuilderInfo get info_ => _i; @$core.pragma('dart2js:noInline') static AddressBook create() => AddressBook._(); @$core.override AddressBook createEmptyInstance() => create(); static $pb.PbList createRepeated() => $pb.PbList(); @$core.pragma('dart2js:noInline') static AddressBook getDefault() => _defaultInstance ??= $pb.GeneratedMessage.$_defaultFor(create); static AddressBook? _defaultInstance; @$pb.TagNumber(1) $pb.PbList get person => $_getList(0); } const $core.bool _omitFieldNames = $core.bool.fromEnvironment('protobuf.omit_field_names'); const $core.bool _omitMessageNames = $core.bool.fromEnvironment('protobuf.omit_message_names'); ================================================ FILE: samples/Dart/addressbook.pbenum.dart ================================================ // // Generated code. Do not modify. // source: addressbook.proto // // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes // ignore_for_file: non_constant_identifier_names import 'dart:core' as $core; import 'package:protobuf/protobuf.dart' as $pb; class Person_PhoneType extends $pb.ProtobufEnum { static const Person_PhoneType MOBILE = Person_PhoneType._(0, _omitEnumNames ? '' : 'MOBILE'); static const Person_PhoneType HOME = Person_PhoneType._(1, _omitEnumNames ? '' : 'HOME'); static const Person_PhoneType WORK = Person_PhoneType._(2, _omitEnumNames ? '' : 'WORK'); static const $core.List values = [ MOBILE, HOME, WORK, ]; static final $core.List _byValue = $pb.ProtobufEnum.$_initByValueList(values, 2); static Person_PhoneType? valueOf($core.int value) => value < 0 || value >= _byValue.length ? null : _byValue[value]; const Person_PhoneType._(super.value, super.name); } const $core.bool _omitEnumNames = $core.bool.fromEnvironment('protobuf.omit_enum_names'); ================================================ FILE: samples/Dart/addressbook.pbjson.dart ================================================ // // Generated code. Do not modify. // source: addressbook.proto // // @dart = 3.3 // ignore_for_file: annotate_overrides, camel_case_types, comment_references // ignore_for_file: constant_identifier_names // ignore_for_file: curly_braces_in_flow_control_structures // ignore_for_file: deprecated_member_use_from_same_package, library_prefixes // ignore_for_file: non_constant_identifier_names import 'dart:convert' as $convert; import 'dart:core' as $core; import 'dart:typed_data' as $typed_data; @$core.Deprecated('Use personDescriptor instead') const Person$json = { '1': 'Person', '2': [ {'1': 'name', '3': 1, '4': 2, '5': 9, '10': 'name'}, {'1': 'id', '3': 2, '4': 2, '5': 5, '10': 'id'}, {'1': 'email', '3': 3, '4': 1, '5': 9, '10': 'email'}, {'1': 'phone', '3': 4, '4': 3, '5': 11, '6': '.tutorial.Person.PhoneNumber', '10': 'phone'}, ], '3': [Person_PhoneNumber$json], '4': [Person_PhoneType$json], }; @$core.Deprecated('Use personDescriptor instead') const Person_PhoneNumber$json = { '1': 'PhoneNumber', '2': [ {'1': 'number', '3': 1, '4': 2, '5': 9, '10': 'number'}, {'1': 'type', '3': 2, '4': 1, '5': 14, '6': '.tutorial.Person.PhoneType', '7': 'HOME', '10': 'type'}, ], }; @$core.Deprecated('Use personDescriptor instead') const Person_PhoneType$json = { '1': 'PhoneType', '2': [ {'1': 'MOBILE', '2': 0}, {'1': 'HOME', '2': 1}, {'1': 'WORK', '2': 2}, ], }; /// Descriptor for `Person`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List personDescriptor = $convert.base64Decode( 'CgZQZXJzb24SEgoEbmFtZRgBIAIoCVIEbmFtZRIOCgJpZBgCIAIoBVICaWQSFAoFZW1haWwYAy' 'ABKAlSBWVtYWlsEjIKBXBob25lGAQgAygLMhwudHV0b3JpYWwuUGVyc29uLlBob25lTnVtYmVy' 'UgVwaG9uZRpbCgtQaG9uZU51bWJlchIWCgZudW1iZXIYASACKAlSBm51bWJlchI0CgR0eXBlGA' 'IgASgOMhoudHV0b3JpYWwuUGVyc29uLlBob25lVHlwZToESE9NRVIEdHlwZSIrCglQaG9uZVR5' 'cGUSCgoGTU9CSUxFEAASCAoESE9NRRABEggKBFdPUksQAg=='); @$core.Deprecated('Use addressBookDescriptor instead') const AddressBook$json = { '1': 'AddressBook', '2': [ {'1': 'person', '3': 1, '4': 3, '5': 11, '6': '.tutorial.Person', '10': 'person'}, ], }; /// Descriptor for `AddressBook`. Decode as a `google.protobuf.DescriptorProto`. final $typed_data.Uint8List addressBookDescriptor = $convert.base64Decode( 'CgtBZGRyZXNzQm9vaxIoCgZwZXJzb24YASADKAsyEC50dXRvcmlhbC5QZXJzb25SBnBlcnNvbg' '=='); ================================================ FILE: samples/Dart/equals.dart ================================================ import 'package:freezed_annotation/freezed_annotation.dart'; part 'equals.freezed.dart'; @freezed abstract class Equals with _$Equals { Equals._(); factory Equals({String? name, int? age}) = _Equals; @override bool operator ==(Object o) => o is Equals && o.name == name; @override int get hashCode => name.hashCode; } ================================================ FILE: samples/Dart/equals.freezed.dart ================================================ // dart format width=80 // coverage:ignore-file // GENERATED CODE - DO NOT MODIFY BY HAND // ignore_for_file: type=lint // ignore_for_file: unused_element, deprecated_member_use, deprecated_member_use_from_same_package, use_function_type_syntax_for_parameters, unnecessary_const, avoid_init_to_null, invalid_override_different_default_values_named, prefer_expression_function_bodies, annotate_overrides, invalid_annotation_target, unnecessary_question_mark part of 'equals.dart'; // ************************************************************************** // FreezedGenerator // ************************************************************************** // dart format off T _$identity(T value) => value; /// @nodoc mixin _$Equals { String? get name; int? get age; /// Create a copy of Equals /// with the given fields replaced by the non-null parameter values. @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') $EqualsCopyWith get copyWith => _$EqualsCopyWithImpl(this as Equals, _$identity); @override String toString() { return 'Equals(name: $name, age: $age)'; } } /// @nodoc abstract mixin class $EqualsCopyWith<$Res> { factory $EqualsCopyWith(Equals value, $Res Function(Equals) _then) = _$EqualsCopyWithImpl; @useResult $Res call({String? name, int? age}); } /// @nodoc class _$EqualsCopyWithImpl<$Res> implements $EqualsCopyWith<$Res> { _$EqualsCopyWithImpl(this._self, this._then); final Equals _self; final $Res Function(Equals) _then; /// Create a copy of Equals /// with the given fields replaced by the non-null parameter values. @pragma('vm:prefer-inline') @override $Res call({ Object? name = freezed, Object? age = freezed, }) { return _then(_self.copyWith( name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable as String?, age: freezed == age ? _self.age : age // ignore: cast_nullable_to_non_nullable as int?, )); } } /// @nodoc class _Equals extends Equals { _Equals({this.name, this.age}) : super._(); @override final String? name; @override final int? age; /// Create a copy of Equals /// with the given fields replaced by the non-null parameter values. @override @JsonKey(includeFromJson: false, includeToJson: false) @pragma('vm:prefer-inline') _$EqualsCopyWith<_Equals> get copyWith => __$EqualsCopyWithImpl<_Equals>(this, _$identity); @override String toString() { return 'Equals(name: $name, age: $age)'; } } /// @nodoc abstract mixin class _$EqualsCopyWith<$Res> implements $EqualsCopyWith<$Res> { factory _$EqualsCopyWith(_Equals value, $Res Function(_Equals) _then) = __$EqualsCopyWithImpl; @override @useResult $Res call({String? name, int? age}); } /// @nodoc class __$EqualsCopyWithImpl<$Res> implements _$EqualsCopyWith<$Res> { __$EqualsCopyWithImpl(this._self, this._then); final _Equals _self; final $Res Function(_Equals) _then; /// Create a copy of Equals /// with the given fields replaced by the non-null parameter values. @override @pragma('vm:prefer-inline') $Res call({ Object? name = freezed, Object? age = freezed, }) { return _then(_Equals( name: freezed == name ? _self.name : name // ignore: cast_nullable_to_non_nullable as String?, age: freezed == age ? _self.age : age // ignore: cast_nullable_to_non_nullable as int?, )); } } // dart format on ================================================ FILE: samples/Dart/point.dart ================================================ import 'dart:math' as math; class Point { num x, y; Point(this.x, this.y); num distanceTo(Point other) { var dx = x - other.x; var dy = y - other.y; return math.sqrt(dx * dx + dy * dy); } } void main() { var p = new Point(2, 3); var q = new Point(3, 4); print('distance from p to q = ${p.distanceTo(q)}'); } ================================================ FILE: samples/Daslang/ecs.das ================================================ options indenting = 2 options no_unused_block_arguments = false options no_unused_function_arguments = false options multiple_contexts options strict_smart_pointers = true struct EntityId { id: uint; } let INVALID_ENTITY_ID = EntityId(id=0xFFFFFFFFu); def operator == (a: EntityId; b: EntityId): bool { return a.id == b.id; } def operator != (a: EntityId; b: EntityId): bool { return a.id != b.id; } struct Position { x: float; y: float; } struct Velocity { dx: float; dy: float; } struct Health { current: int; max: int; } let MAX_ENTITIES = 10; var entity_id_counter: uint = 0u; var active_entities: int = 0; var positions: array; var velocities: array; var healths: array; var has_position: array; var has_velocity: array; var has_health: array; def create_entity(): EntityId { if (active_entities < MAX_ENTITIES) { let new_id = entity_id_counter; entity_id_counter++; var eid = EntityId(id=new_id); let index = int(eid.id); if (index >= length(has_position)) { let new_size = index + 1; if (length(positions) < new_size) resize(positions, new_size); if (length(velocities) < new_size) resize(velocities, new_size); if (length(healths) < new_size) resize(healths, new_size); if (length(has_position) < new_size) resize(has_position, new_size); if (length(has_velocity) < new_size) resize(has_velocity, new_size); if (length(has_health) < new_size) resize(has_health, new_size); } has_position[index] = false; has_velocity[index] = false; has_health[index] = false; active_entities++; return eid; } else { return EntityId(id=INVALID_ENTITY_ID.id); } } def add_position_component(eid: EntityId; comp: Position) { if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) { let index = int(eid.id); positions[index] = comp; has_position[index] = true; } } def add_velocity_component(eid: EntityId; comp: Velocity) { if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) { let index = int(eid.id); velocities[index] = comp; has_velocity[index] = true; } } def add_health_component(eid: EntityId; comp: Health) { if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) { let index = int(eid.id); healths[index] = comp; has_health[index] = true; } } def remove_position_component(eid: EntityId) { if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) { has_position[int(eid.id)] = false; } } def remove_velocity_component(eid: EntityId) { if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) { has_velocity[int(eid.id)] = false; } } def remove_health_component(eid: EntityId) { if (eid != INVALID_ENTITY_ID && eid.id < entity_id_counter) { has_health[int(eid.id)] = false; } } def movement_system(dt: float) { unsafe { for (i_idx in range(0, int(entity_id_counter))) { if (has_position[i_idx] && has_velocity[i_idx]) { var pos: Position& = positions[i_idx]; let vel: Velocity& = velocities[i_idx]; pos.x += vel.dx * dt; pos.y += vel.dy * dt; } } } } def damage_system(damage_amount: int) { unsafe { for (i_idx in range(0, int(entity_id_counter))) { if (has_health[i_idx] && has_velocity[i_idx]) { var hp: Health& = healths[i_idx]; hp.current -= damage_amount; if (hp.current < 0) { hp.current = 0; } } } } } def cleanup_system() { unsafe { for (i_idx in range(0, int(entity_id_counter))) { if (has_health[i_idx]) { let hp: Health& = healths[i_idx]; if (hp.current <= 0) { let current_eid = EntityId(id=uint(i_idx)); print("Entity {current_eid.id} has run out of health. Removing components.\n"); remove_position_component(current_eid); remove_velocity_component(current_eid); remove_health_component(current_eid); } } } } } def print_entity_status_system() { unsafe { for (i_idx in range(0, int(entity_id_counter))) { let current_eid = EntityId(id=uint(i_idx)); var status_string = "Entity {current_eid.id}:"; var has_any_component_for_this_id = false; if (i_idx < length(has_position) && has_position[i_idx]) { let pos: Position& = positions[i_idx]; status_string += " Pos({pos.x},{pos.y})"; has_any_component_for_this_id = true; } if (i_idx < length(has_velocity) && has_velocity[i_idx]) { let vel: Velocity& = velocities[i_idx]; status_string += " Vel({vel.dx},{vel.dy})"; has_any_component_for_this_id = true; } if (i_idx < length(has_health) && has_health[i_idx]) { let hp: Health& = healths[i_idx]; status_string += " HP({hp.current}/{hp.max})"; has_any_component_for_this_id = true; } if (has_any_component_for_this_id) { print("{status_string}\n"); } } } } [export] def main() { let e1 = create_entity(); if (e1 != INVALID_ENTITY_ID) { add_position_component(e1, Position(x=0.0, y=0.0)); add_velocity_component(e1, Velocity(dx=1.0, dy=0.5)); add_health_component(e1, Health(current=100, max=100)); } let e2 = create_entity(); if (e2 != INVALID_ENTITY_ID) { add_position_component(e2, Position(x=10.0, y=5.0)); add_health_component(e2, Health(current=50, max=50)); } let e3 = create_entity(); if (e3 != INVALID_ENTITY_ID) { add_position_component(e3, Position(x=-5.0, y=-5.0)); add_velocity_component(e3, Velocity(dx=-0.2, dy=1.0)); add_health_component(e3, Health(current=75, max=75)); } let time_step = 1.0; let base_damage = 30; for (i_step in range(0, 5)) { print("--- Simulation Step {i_step} ---\n"); movement_system(time_step); damage_system(base_damage); cleanup_system(); print_entity_status_system(); if (i_step == 1) { let e4 = create_entity(); if (e4 != INVALID_ENTITY_ID) { print("Adding new entity e4 (id {e4.id}) at step {i_step}\n"); add_position_component(e4, Position(x=2.0, y=2.0)); add_velocity_component(e4, Velocity(dx=0.1, dy=-0.1)); add_health_component(e4, Health(current=120, max=120)); } } } } ================================================ FILE: samples/Daslang/terrain.das ================================================ require math struct HeightMap { width: int height: int data: array } def simple_noise(x, y: float): float { let ix = int(x) let iy = int(y) let fx = x - float(ix) let fy = y - float(iy) let hash = (ix * 73856093) ^ (iy * 19349663) let noise = float(hash % 1000) / 500.0f - 1.0f return noise * fx * fy } def generate_terrain(width, height: int) { var heightmap = HeightMap(width = width, height = height) heightmap.data |> resize(width * height) for (y in range(height)) { for (x in range(width)) { let fx = float(x) * 0.1f let fy = float(y) * 0.1f var height_value = 0.0f height_value += simple_noise(fx, fy) * 50.0f height_value += simple_noise(fx * 2.0f, fy * 2.0f) * 25.0f height_value += simple_noise(fx * 4.0f, fy * 4.0f) * 12.5f heightmap.data[y * width + x] = height_value } } return <- heightmap } def smooth_terrain(var heightmap: HeightMap) { var temp_data: array temp_data |> resize(length(heightmap.data)) for (y in range(1, heightmap.height - 1)) { for (x in range(1, heightmap.width - 1)) { let idx = y * heightmap.width + x var sum = 0.0f for (dy in range(-1, 2)) { for (dx in range(-1, 2)) { let neighbor_idx = (y + dy) * heightmap.width + (x + dx) sum += heightmap.data[neighbor_idx] } } temp_data[idx] = sum / 9.0f } } for (i in range(length(heightmap.data))) { heightmap.data[i] = temp_data[i] } } def get_height(heightmap: HeightMap; x, y: int): float { if (x >= 0 && x < heightmap.width && y >= 0 && y < heightmap.height) { return heightmap.data[y * heightmap.width + x] } return 0.0f } def find_spawn_location(heightmap: HeightMap): int2 { for (y in range(heightmap.height)) { for (x in range(heightmap.width)) { let h = get_height(heightmap, x, y) if (h > 5.0f && h < 30.0f) { return int2(x, y) } } } return int2(heightmap.width / 2, heightmap.height / 2) } def calculate_slope(heightmap: HeightMap; x, y: int): float { let center = get_height(heightmap, x, y) let right = get_height(heightmap, x + 1, y) let down = get_height(heightmap, x, y + 1) let dx = right - center let dy = down - center return sqrt(dx * dx + dy * dy) } def print_terrain_section(heightmap: HeightMap; start_x, start_y, size: int) { print("Terrain heights:\n") for (y in range(start_y, start_y + size)) { var line = "" for (x in range(start_x, start_x + size)) { let h = get_height(heightmap, x, y) if (h < 0.0f) { line += "~ " } elif (h < 10.0f) { line += ". " } elif (h < 30.0f) { line += "^ " } else { line += "# " } } print(line) } } [export] def main() { print("Generating 32x32 terrain\n") var terrain <- generate_terrain(32, 32) print("Smoothing terrain...\n") smooth_terrain(terrain) let spawn = find_spawn_location(terrain) let spawn_height = get_height(terrain, spawn.x, spawn.y) print("Spawn location: {spawn.x}, {spawn.y} at height {spawn_height}\n") print_terrain_section(terrain, 10, 10, 12) print("\nSlope analysis around spawn:\n") for (dy in range(-2, 3)) { for (dx in range(-2, 3)) { let x = spawn.x + dx let y = spawn.y + dy let slope = calculate_slope(terrain, x, y) if (slope > 15.0f) { print("Steep slope at {x}, {y}: {slope}\n") } } } } ================================================ FILE: samples/DataWeave/customInterpolator.dwl ================================================ fun SQL(literals, parts) = '' --- [ SQL `SELECT * FROM table WHERE id = $(1) AND name = $('a')`, SQL `$('p')`, SQL `$('a')$('b')`, SQL `$('a')---$('b')`, SQL `---$('a')---$('b')---`, SQL `$('p')bbb`, SQL `aaa$('p')`, SQL `aaa$('p')bbb` ] ================================================ FILE: samples/DataWeave/directives.dwl ================================================ %dw 2.0 var number = 1234 fun foo(func,name="Mariano") = func(name) input payload application/test arg="value" output application/json --- { foo: "bar" } ================================================ FILE: samples/DataWeave/functions.dwl ================================================ %dw 2.0 var x=(param1, param2) -> { "$param1": param2 } var y=(param1, param2 = "c") -> { "$param1": param2 } var toUser = (user) -> { name: user.name, lastName: user.lastName } fun z(param1, param2) = { "$param1": param2 } var a = { name: "Mariano" , toUser: ((param1, param2) -> { "$param1": param2 }) } var applyFirst = (array, func) -> (func(array[0]) ++ array[1 to -1]) var nested = (array, func) -> (a) -> (b) -> (c) -> array map func(a ++ b ++ c) fun f2(a1, a2) = "" fun f3(a1:String, a2:Number):String = a1 fun f4(a1:String, a2:(a:Number) -> Number):String = a1 --- result: { a: x("a", "b"), b: y("a"), c: y("a", "b"), users: { (in1 map ((user) -> { user: (toUser(user) ++ user) })) }, d: z("a", "b"), e: a.toUser("name","Mariano"), f: a.toUser("name","Mariano").name, f: applyFirst("mariano", (s) -> upper(s) ), g: [] map (s) -> upper(s), h: 1 f2 2 } ================================================ FILE: samples/DataWeave/literals.dwl ================================================ %dw 2.0 --- { "boolean":{ "true" : true, "false": false }, "Number": { "int": 123, "decimal": 123.23 }, "string": { "singleQuote" : 'A String', "doubleQuote" : "A String" }, "regex": /foo/, "date": { a: |2003-10-01|, b: |2005-045|, c: |2003-W14-3|, d: |23:57:59|, e: |23:57:30.700|, f: |23:50:30Z|, g: |+13:00|, h: |Z|, i: |-02:00|, j: |2005-06-02T15:10:16|, k: |2005-06-02T15:10:16Z|, l: |2005-06-02T15:10:16+03:00|, m: |P12Y7M11D|, n: |P12Y5M|, o: |P45DT9H20M8S|, p: |PT9H20M8S| } } ================================================ FILE: samples/DataWeave/match.dwl ================================================ { // Regex Pattern Matching (Can be named or unnamed) a: in0.phones map $ match { case matches /\+(\d+)\s\((\d+)\)\s(\d+\-\d+)/ -> { country: $[0], area: $[1], number: $[2] } case matches /\((\d+)\)\s(\d+\-\d+)/ -> { area: $[1], number: $[2] } case phone matches /\((\d+)\)\s(\d+\-\d+)/ -> { area: phone[1], number: phone[2] } }, // Type Pattern Matching (Can be named or unnamed) b: in0.object match { case is Object -> { object: $ } case is Number -> { number: $ } // This is how you name variables if needed case y is Boolean -> { boolean: y } }, // Literal Pattern Matching (Can be named or unnamed) c: in0.value match { case "Emiliano" -> { string: $ } case 123 -> { number: $ } // This is how you name variables if needed case value: "Mariano" -> { name: value } }, // Boolean Expression Pattern Matching (Always named) d: in0.value match { case x if x > 30 -> { biggerThan30: x } case x if x == 9 -> { nine: x } }, // Default matches e: in0.value match { case "Emiliano" -> "string" case 3.14 -> number else -> "1234" } } ================================================ FILE: samples/Debian Package Control File/example1.dsc ================================================ Format: 1.0 Source: libdependable Binary: libdependable, libdependable-dev Architecture: any Version: 1:2.3-4 Maintainer: Test Maintainer Standards-Version: 3.9.2 Build-Depends: debhelper (>= 9) Package-List: libdependable deb misc optional arch=any libdependable-dev deb misc optional arch=any Checksums-Sha1: 5345aec6bad1d7e03f3afaae5cd6d00bc7df5cfe 786 libdependable_2.3-4.tar.gz Checksums-Sha256: 8b770fde1df196e6b0b222f42f5e698ca1fd220a8cc1274ce8b9b63bdada9137 786 libdependable_2.3-4.tar.gz Files: 320a8fe6cf08e6d6bd030182e47effa5 786 libdependable_2.3-4.tar.gz ================================================ FILE: samples/Debian Package Control File/example2.dsc ================================================ Source: e2fsprogs Section: admin Priority: required Maintainer: Ubuntu Developers XSBC-Original-Maintainer: Theodore Y. Ts'o Build-Depends: texi2html (>= 1.76), gettext:any, texinfo, pkg-config, gcc-multilib [mips mipsel], debhelper (>= 7.0), libblkid-dev (>= 2.16), uuid-dev (>= 2.16), m4 Standards-Version: 3.9.2 Homepage: http://e2fsprogs.sourceforge.net Package: e2fsprogs Essential: yes Pre-Depends: ${shlibs:Depends}, ${misc:Depends}, util-linux (>= 2.15~rc1-1) Suggests: gpart, parted, e2fsck-static Conflicts: dump (<< 0.4b4-4), quota (<< 1.55-8.1), initscripts (<< 2.85-4), sysvinit (<< 2.85-4) Replaces: hurd (<= 20040301-1), libblkid1 (<< 1.38+1.39-WIP-2005.12.10-2), libuuid1 (<< 1.38+1.39-WIP-2005.12.10-2) Architecture: any Description: ext2/ext3/ext4 file system utilities The ext2, ext3 and ext4 file systems are successors of the original ext ("extended") file system. They are the main file system types used for hard disks on Debian and other Linux systems. . This package contains programs for creating, checking, and maintaining ext2/3/4-based file systems. ================================================ FILE: samples/DenizenScript/sample1.dsc ================================================ # Main faction task. faction: type: task script: - narrate Claim! format:faction_action_format edit: - narrate Edit! format:faction_action_format invite: - narrate Invite! format:faction_action_format settings: - narrate Settings! format:faction_action_format transfer_ownership: - if !: - inventory open d:faction_action_danger_zone_transfer_ownership_player_list_inventory - else: - narrate "You are still waiting for to accept the ownership!" format:faction_action_format create: - if !: - flag server factions: - flag server "factions.all claims:" - flag server FACTION_IDS:++ - define FACTION_UUID faction_ - flag player FACTION:<[FACTION_UUID]> - definemap default_faction_data: owner: members: ]> name: 's Faction settings: permissions: # This is just place holder stuff ;0 - OwnersGetAllPerms - MembersGetBasicPerms - OutsidersDoNotGetPerms color: display name: 's Faction rivalries: allies: power: 100 claims: ]> - note as:faction_cuboid_<[FACTION_UUID]> - flag server "factions.all claims:->:" - flag server factions.<[FACTION_UUID]>:<[default_faction_data]> - narrate "Faction created! Check it out by using '/faction'!" format:faction_action_format delete: - define FACTION_UUID - define members <[FACTION_UUID].proc[get_members]> - foreach <[members]> as:m: - flag ]> faction:! - foreach as:cl: - flag server "factions.all claims:<-:<[cl]>" - flag server factions:<-:<[FACTION_UUID]> - narrate "<&[success]>Successfully deleted the faction!" format:faction_action_format leave: - define faction - if == <[faction].proc[get_owner]>: - narrate "Sorry, but you are going to have to tranfer ownership of your faction before you can leave it. You can do so in the Danger Zone section of the Faction Action Inventory. (/f)" format:faction_action_format - stop - if <[faction].proc[get_members]> == ]>: - narrate "You have successfully left the faction." format:faction_action_format - inject faction.delete wipe: - foreach ]> as:p: - if <[p].has_flag[FACTION]>: - flag <[p]> FACTION:! - foreach as:i: - flag server factions:<-:<[i]> - flag server "factions:<-:all claims" - flag server factions:! - foreach as:n: - if <[n].advanced_matches_text[*faction_cuboid_*]>: - note remove as:<[n].note_name> - flag server FACTION_IDS:-1 - narrate Wiped. format:faction_action_format ================================================ FILE: samples/DenizenScript/sample2.dsc ================================================ player_chooses_new_owner_of_faction: type: world events: on player clicks item in faction_action_danger_zone_transfer_ownership_player_list_inventory: - define new_owner - define faction - define faction_owner ]>]> - if !: - if <[new_owner].has_flag[faction]>: - if <[new_owner].uuid> == <[faction_owner].uuid>: - narrate "<&color[#1569EA]>You can't transfer ownership to yourself! You are already the owner." format:faction_action_format - inventory close - flag player waiting_for_owner_transfer_request_acceptance:<[new_owner]> expire:10m - inventory close - else: - flag player waiting_for_owner_transfer_request_acceptance:<[new_owner]> expire:10m - inventory close - flag <[new_owner]> has_ownership_offer:<[faction]> expire:10m - runlater out_of_time_for_transfer delay:5s def.new_owner:<[new_owner]> - narrate targets:<[new_owner]> ", wants you to become the new owner of their faction, <[faction].proc[get_display_name]>. To accept, please issue the command: accept. To deny, please issue the command: deny or, do nothing. This request will expire in 10 minutes." format:faction_action_format - else: - narrate "<[new_owner].name> already has a valid offer. Please try again soon." format:faction_action_format player_accepts_or_denies_offer_to_be_new_owner: type: world events: on player chats flagged:has_ownership_offer: - define old_owner ]> - define faction - if == accept: - determine passively cancelled # Removes both the old owner and new owner from their factions to avoid any errors. - if <[old_owner].has_flag[faction]>: - flag server factions.<[old_owner].flag[faction]>.members:<-:<[old_owner].uuid> - flag <[old_owner]> faction:! - if : - flag server factions..members:<-: - flag player faction:! - flag server factions.<[faction]>.owner: - flag server factions.<[faction]>.members:->: - flag player FACTION:<[faction]> # Re-adds the owner to the faction. - flag server factions.<[faction]>.members:->:<[old_owner].uuid> - flag <[old_owner]> faction:<[faction]> - flag has_ownership_offer:! - flag <[old_owner]> waiting_for_owner_transfer_request_acceptance:! - narrate "You are now the owner of !" format:faction_action_format - narrate " has accepted the offer to become owner! You are now no longer the owner of <[faction].proc[get_display_name]>, but are now a regular member." targets:<[old_owner]> format:faction_action_format - else if == deny: - determine passively cancelled - flag has_ownership_offer:! - flag <[old_owner]> waiting_for_owner_transfer_request_acceptance:! - narrate "You have denyed the offer." format:faction_action_format - narrate " has declined your offer to become owner of your faction." targets:<[old_owner]> format:faction_action_format - else: - determine cancelled out_of_time_for_transfer: type: task definitions: new_owner script: - if : - narrate "Sorry, the ownership offer has expired." targets:<[new_owner]> format:faction_action_format - else: - stop ================================================ FILE: samples/Dhall/largeExpressionA.dhall ================================================ λ ( xs : List { cores : Natural , host : Text , key : Text , mandatoryFeatures : List Text , platforms : List < AArch64_Linux : {} | ARMv5tel_Linux : {} | ARMv7l_Linux : {} | I686_Cygwin : {} | I686_Linux : {} | MIPS64el_Linux : {} | PowerPC_Linux : {} | X86_64_Cygwin : {} | X86_64_Darwin : {} | X86_64_FreeBSD : {} | X86_64_Linux : {} | X86_64_Solaris : {} > , speedFactor : Natural , supportedFeatures : List Text , user : Optional Text } ) → List/fold { cores : Natural , host : Text , key : Text , mandatoryFeatures : List Text , platforms : List < AArch64_Linux : {} | ARMv5tel_Linux : {} | ARMv7l_Linux : {} | I686_Cygwin : {} | I686_Linux : {} | MIPS64el_Linux : {} | PowerPC_Linux : {} | X86_64_Cygwin : {} | X86_64_Darwin : {} | X86_64_FreeBSD : {} | X86_64_Linux : {} | X86_64_Solaris : {} > , speedFactor : Natural , supportedFeatures : List Text , user : Optional Text } xs Text ( λ ( x : { cores : Natural , host : Text , key : Text , mandatoryFeatures : List Text , platforms : List < AArch64_Linux : {} | ARMv5tel_Linux : {} | ARMv7l_Linux : {} | I686_Cygwin : {} | I686_Linux : {} | MIPS64el_Linux : {} | PowerPC_Linux : {} | X86_64_Cygwin : {} | X86_64_Darwin : {} | X86_64_FreeBSD : {} | X86_64_Linux : {} | X86_64_Solaris : {} > , speedFactor : Natural , supportedFeatures : List Text , user : Optional Text } ) → λ(y : Text) → ( Optional/fold Text x.user Text (λ(user : Text) → user ++ "@" ++ x.host ++ "") x.host ++ " " ++ ( merge { Empty = λ(_ : {}) → "" , NonEmpty = λ(result : Text) → result } ( List/fold < AArch64_Linux : {} | ARMv5tel_Linux : {} | ARMv7l_Linux : {} | I686_Cygwin : {} | I686_Linux : {} | MIPS64el_Linux : {} | PowerPC_Linux : {} | X86_64_Cygwin : {} | X86_64_Darwin : {} | X86_64_FreeBSD : {} | X86_64_Linux : {} | X86_64_Solaris : {} > x.platforms < Empty : {} | NonEmpty : Text > ( λ ( element : < AArch64_Linux : {} | ARMv5tel_Linux : {} | ARMv7l_Linux : {} | I686_Cygwin : {} | I686_Linux : {} | MIPS64el_Linux : {} | PowerPC_Linux : {} | X86_64_Cygwin : {} | X86_64_Darwin : {} | X86_64_FreeBSD : {} | X86_64_Linux : {} | X86_64_Solaris : {} > ) → λ(status : < Empty : {} | NonEmpty : Text >) → merge { Empty = λ(_ : {}) → < Empty : {} | NonEmpty : Text >.NonEmpty ( merge { AArch64_Linux = λ(_ : {}) → "aarch64-linux" , ARMv5tel_Linux = λ(_ : {}) → "armv5tel-linux" , ARMv7l_Linux = λ(_ : {}) → "armv7l-linux" , I686_Cygwin = λ(_ : {}) → "i686-cygwin" , I686_Linux = λ(_ : {}) → "i686-linux" , MIPS64el_Linux = λ(_ : {}) → "mips64el-linux" , PowerPC_Linux = λ(_ : {}) → "powerpc-linux" , X86_64_Cygwin = λ(_ : {}) → "x86_64-cygwin" , X86_64_Darwin = λ(_ : {}) → "x86_64-darwin" , X86_64_FreeBSD = λ(_ : {}) → "x86_64-freebsd" , X86_64_Linux = λ(_ : {}) → "x86_64-linux" , X86_64_Solaris = λ(_ : {}) → "x86_64-solaris" } element ) , NonEmpty = λ(result : Text) → < Empty : {} | NonEmpty : Text >.NonEmpty ( ( merge { AArch64_Linux = λ(_ : {}) → "aarch64-linux" , ARMv5tel_Linux = λ(_ : {}) → "armv5tel-linux" , ARMv7l_Linux = λ(_ : {}) → "armv7l-linux" , I686_Cygwin = λ(_ : {}) → "i686-cygwin" , I686_Linux = λ(_ : {}) → "i686-linux" , MIPS64el_Linux = λ(_ : {}) → "mips64el-linux" , PowerPC_Linux = λ(_ : {}) → "powerpc-linux" , X86_64_Cygwin = λ(_ : {}) → "x86_64-cygwin" , X86_64_Darwin = λ(_ : {}) → "x86_64-darwin" , X86_64_FreeBSD = λ(_ : {}) → "x86_64-freebsd" , X86_64_Linux = λ(_ : {}) → "x86_64-linux" , X86_64_Solaris = λ(_ : {}) → "x86_64-solaris" } element ) ++ "," ++ result ) } status : < Empty : {} | NonEmpty : Text > ) (< Empty : {} | NonEmpty : Text >.Empty {=}) ) : Text ) ++ " " ++ x.key ++ " " ++ Integer/show (Natural/toInteger x.cores) ++ " " ++ Integer/show (Natural/toInteger x.speedFactor) ++ " " ++ ( merge { Empty = λ(_ : {}) → "" , NonEmpty = λ(result : Text) → result } ( List/fold Text x.supportedFeatures < Empty : {} | NonEmpty : Text > ( λ(element : Text) → λ(status : < Empty : {} | NonEmpty : Text >) → merge { Empty = λ(_ : {}) → (< Empty : {} | NonEmpty : Text >.NonEmpty element) , NonEmpty = λ(result : Text) → < Empty : {} | NonEmpty : Text >.NonEmpty ( element ++ "," ++ result ) } status : < Empty : {} | NonEmpty : Text > ) (< Empty : {} | NonEmpty : Text >.Empty {=}) ) : Text ) ++ " " ++ ( merge { Empty = λ(_ : {}) → "" , NonEmpty = λ(result : Text) → result } ( List/fold Text x.mandatoryFeatures < Empty : {} | NonEmpty : Text > ( λ(element : Text) → λ(status : < Empty : {} | NonEmpty : Text >) → merge { Empty = λ(_ : {}) → < Empty : {} | NonEmpty : Text >.NonEmpty element , NonEmpty = λ(result : Text) → < Empty : {} | NonEmpty : Text >.NonEmpty ( element ++ "," ++ result ) } status : < Empty : {} | NonEmpty : Text > ) (< Empty : {} | NonEmpty : Text >.Empty {=}) ) : Text ) ++ "\n" ) ++ y ) "" ================================================ FILE: samples/Dhall/remoteSystemsA.dhall ================================================ let Text/concatMap = ../../../Prelude/Text/concatMap let Text/concatSep = ../../../Prelude/Text/concatSep let Row = { cores : Natural , host : Text , key : Text , mandatoryFeatures : List Text , platforms : List Text , speedFactor : Natural , supportedFeatures : List Text , user : Optional Text } let renderRow = λ ( row : Row ) → let host = Optional/fold Text row.user Text (λ(user : Text) → "${user}@${row.host}") row.host let platforms = Text/concatSep "," row.platforms let key = row.key let cores = Integer/show (Natural/toInteger row.cores) let speedFactor = Integer/show (Natural/toInteger row.speedFactor) let supportedFeatures = Text/concatSep "," row.supportedFeatures let mandatoryFeatures = Text/concatSep "," row.mandatoryFeatures in '' ${host} ${platforms} ${key} ${cores} ${speedFactor} ${supportedFeatures} ${mandatoryFeatures} '' in Text/concatMap Row renderRow ================================================ FILE: samples/Diff/dude-thing-okay--001.patch ================================================ diff --git a/lib/linguist.rb b/lib/linguist.rb index d472341..8ad9ffb 100644 --- a/lib/linguist.rb +++ b/lib/linguist.rb ================================================ FILE: samples/DirectX 3D File/cube.x ================================================ xof 0303txt 0032 Frame Root { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000,-0.000000, 1.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } Frame Cube { FrameTransformMatrix { 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000, 0.000000, 0.000000, 0.000000, 0.000000, 1.000000;; } Mesh { // Cube mesh 24; -1.000000;-1.000000;-1.000000;, -1.000000;-1.000000; 1.000000;, -1.000000; 1.000000; 1.000000;, -1.000000; 1.000000;-1.000000;, -1.000000; 1.000000;-1.000000;, -1.000000; 1.000000; 1.000000;, 1.000000; 1.000000; 1.000000;, 1.000000; 1.000000;-1.000000;, 1.000000; 1.000000;-1.000000;, 1.000000; 1.000000; 1.000000;, 1.000000;-1.000000; 1.000000;, 1.000000;-1.000000;-1.000000;, 1.000000;-1.000000;-1.000000;, 1.000000;-1.000000; 1.000000;, -1.000000;-1.000000; 1.000000;, -1.000000;-1.000000;-1.000000;, -1.000000; 1.000000;-1.000000;, 1.000000; 1.000000;-1.000000;, 1.000000;-1.000000;-1.000000;, -1.000000;-1.000000;-1.000000;, 1.000000; 1.000000; 1.000000;, -1.000000; 1.000000; 1.000000;, -1.000000;-1.000000; 1.000000;, 1.000000;-1.000000; 1.000000;; 6; 4;3,2,1,0;, 4;7,6,5,4;, 4;11,10,9,8;, 4;15,14,13,12;, 4;19,18,17,16;, 4;23,22,21,20;; MeshNormals { // Cube normals 6; -1.000000;-0.000000; 0.000000;, 0.000000; 1.000000; 0.000000;, 1.000000;-0.000000; 0.000000;, 0.000000;-1.000000; 0.000000;, 0.000000; 0.000000;-1.000000;, 0.000000;-0.000000; 1.000000;; 6; 4;0,0,0,0;, 4;1,1,1,1;, 4;2,2,2,2;, 4;3,3,3,3;, 4;4,4,4,4;, 4;5,5,5,5;; } // End of Cube normals MeshTextureCoords { // Cube UV coordinates 24; 0.666667; 0.666667;, 0.333333; 0.666667;, 0.333333; 1.000000;, 0.666667; 1.000000;, 0.333333; 0.333333;, 0.000000; 0.333333;, 0.000000; 0.666667;, 0.333333; 0.666667;, 0.333333; 0.666667;, 0.000000; 0.666667;, 0.000000; 1.000000;, 0.333333; 1.000000;, 0.333333; 0.333333;, 0.333333; 0.666667;, 0.666667; 0.666667;, 0.666667; 0.333333;, 1.000000; 0.666667;, 0.666667; 0.666667;, 0.666667; 1.000000;, 1.000000; 1.000000;, 0.333333; 0.333333;, 0.333333; 0.000000;, 0.000000; 0.000000;, 0.000000; 0.333333;; } // End of Cube UV coordinates } // End of Cube mesh } // End of Cube } // End of Root ================================================ FILE: samples/Dockerfile/debian-systemd.Containerfile ================================================ FROM debian:bullseye RUN apt-get update && apt-get install -y systemd systemd-sysv && apt-get clean RUN systemctl mask systemd-logind systemd-udevd RUN apt-get install bash-completion RUN echo "source /usr/share/bash-completion/bash_completion" >> /root/.bashrc CMD ["/lib/systemd/systemd"] ================================================ FILE: samples/Dockerfile/filenames/Dockerfile ================================================ # This file describes the standard way to build Docker, using docker docker-version 0.4.2 from ubuntu:12.04 maintainer Solomon Hykes # Build dependencies run apt-get install -y -q curl run apt-get install -y -q git # Install Go run curl -s https://go.googlecode.com/files/go1.1.1.linux-amd64.tar.gz | tar -v -C /usr/local -xz env PATH /usr/local/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin env GOPATH /go env CGO_ENABLED 0 run cd /tmp && echo 'package main' > t.go && go test -a -i -v # Download dependencies run PKG=github.com/kr/pty REV=27435c699; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/context/ REV=708054d61e5; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV run PKG=github.com/gorilla/mux/ REV=9b36453141c; git clone http://$PKG /go/src/$PKG && cd /go/src/$PKG && git checkout -f $REV # Run dependencies run apt-get install -y iptables # lxc requires updating ubuntu sources run echo 'deb http://archive.ubuntu.com/ubuntu precise main universe' > /etc/apt/sources.list run apt-get update run apt-get install -y lxc run apt-get install -y aufs-tools # Upload docker source add . /go/src/github.com/dotcloud/docker # Build the binary run cd /go/src/github.com/dotcloud/docker/docker && go install -ldflags "-X main.GITCOMMIT '??' -d -w" env PATH /usr/local/go/bin:/go/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin cmd ["docker"] ================================================ FILE: samples/Dogescript/example.djs ================================================ quiet wow such language very syntax github recognized wow loud such language much friendly rly friendly is true plz console.loge with 'such friend, very inclusive' but plz console.loge with 'no love for doge' wow wow module.exports is language ================================================ FILE: samples/Dotenv/default.env ================================================ REACT_APP_ENDPOINT=http://localhost:5000/api REACT_APP_DEFAULT_USR= ================================================ FILE: samples/Dune/filenames/dune-project ================================================ (lang dune 2.9) (name reason) (using menhir 2.0) (cram enable) (version 3.8.2) (generate_opam_files true) (source (github reasonml/reason)) (authors "Jordan Walke ") (maintainers "Jordan Walke " "Antonio Nuno Monteiro ") (homepage "https://reasonml.github.io/") (bug_reports "https://github.com/reasonml/reason/issues") (license "MIT") (package (name reason) (synopsis "Reason: Syntax & Toolchain for OCaml") (description "Reason gives OCaml a new syntax that is remniscient of languages like\nJavaScript. It's also the umbrella project for a set of tools for the OCaml &\nJavaScript ecosystem.") (depends (ocaml (and (>= "4.03") (< "5.2"))) (ocamlfind :build) (dune-build-info (>= 2.9.3)) (menhir (>= "20180523")) (merlin-extend (>= "0.6")) fix ppx_derivers (ppxlib (>= "0.28.0")))) (package (name rtop) (synopsis "Reason toplevel") (description "rtop is the toplevel (or REPL) for Reason, based on utop (https://github.com/diml/utop).") (depends (ocaml (and (>= "4.03") (< "5.2"))) (reason (= :version)) (utop (>= "2.0")))) ================================================ FILE: samples/E/Extends.E ================================================ # from # http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions def makeVehicle(self) { def vehicle { to milesTillEmpty() { return self.milesPerGallon() * self.getFuelRemaining() } } return vehicle } def makeCar() { var fuelRemaining := 20 def car extends makeVehicle(car) { to milesPerGallon() {return 19} to getFuelRemaining() {return fuelRemaining} } return car } def makeJet() { var fuelRemaining := 2000 def jet extends makeVehicle(jet) { to milesPerGallon() {return 2} to getFuelRemaining() {return fuelRemaining} } return jet } def car := makeCar() println(`The car can go ${car.milesTillEmpty()} miles.`) ================================================ FILE: samples/E/Functions.E ================================================ # from # http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/Objects_and_Functions def makeCar(var name) { var x := 0 var y := 0 def car { to moveTo(newX,newY) { x := newX y := newY } to getX() {return x} to getY() {return y} to setName(newName) {name := newName} to getName() {return name} } return car } # Now use the makeCar function to make a car, which we will move and print def sportsCar := makeCar("Ferrari") sportsCar.moveTo(10,20) println(`The car ${sportsCar.getName()} is at X location ${sportsCar.getX()}`) ================================================ FILE: samples/E/Guards.E ================================================ # from # http://wiki.erights.org/wiki/Walnut/Advanced_Topics/Build_your_Own_Guards def makeVOCPair(brandName :String) :near { var myTempContents := def none {} def brand { to __printOn(out :TextWriter) :void { out.print(brandName) } } def ProveAuth { to __printOn(out :TextWriter) :void { out.print(`<$brandName prover>`) } to getBrand() :near { return brand } to coerce(specimen, optEjector) :near { def sealedBox { to getBrand() :near { return brand } to offerContent() :void { myTempContents := specimen } } return sealedBox } } def CheckAuth { to __printOn(out :TextWriter) :void { out.print(`<$brandName checker template>`) } to getBrand() :near { return brand } match [`get`, authList :any[]] { def checker { to __printOn(out :TextWriter) :void { out.print(`<$brandName checker>`) } to getBrand() :near { return brand } to coerce(specimenBox, optEjector) :any { myTempContents := null if (specimenBox.__respondsTo("offerContent", 0)) { # XXX Using __respondsTo/2 here is a kludge specimenBox.offerContent() } else { myTempContents := specimenBox } for auth in authList { if (auth == myTempContents) { return auth } } myTempContents := none throw.eject(optEjector, `Unmatched $brandName authorization`) } } } match [`__respondsTo`, [`get`, _]] { true } match [`__respondsTo`, [_, _]] { false } match [`__getAllegedType`, []] { null.__getAllegedType() } } return [ProveAuth, CheckAuth] } ================================================ FILE: samples/E/IO.E ================================================ # E sample from # http://wiki.erights.org/wiki/Walnut/Ordinary_Programming/InputOutput #File objects for hardwired files: def file1 := def file2 := #Using a variable for a file name: def filePath := "c:\\docs\\myFile.txt" def file3 := [filePath] #Using a single character to specify a Windows drive def file4 := def file5 := def file6 := ================================================ FILE: samples/E/Promises.E ================================================ # E snippet from # http://wiki.erights.org/wiki/Walnut/Distributed_Computing/Promises when (tempVow) -> { #...use tempVow } catch prob { #.... report problem } finally { #....log event } ================================================ FILE: samples/E/atomic-updates.E ================================================ #!/usr/bin/env rune pragma.syntax("0.9") def pi := (-1.0).acos() def makeEPainter := def colors := # -------------------------------------------------------------- # --- Definitions /** Execute 'task' repeatedly as long 'indicator' is unresolved. */ def doWhileUnresolved(indicator, task) { def loop() { if (!Ref.isResolved(indicator)) { task() loop <- () } } loop <- () } /** The data structure specified for the task. */ def makeBuckets(size) { def values := ([100] * size).diverge() # storage def buckets { to size() :int { return size } /** get current quantity in bucket 'i' */ to get(i :int) { return values[i] } /** transfer 'amount' units, as much as possible, from bucket 'i' to bucket 'j' or vice versa if 'amount' is negative */ to transfer(i :int, j :int, amount :int) { def amountLim := amount.min(values[i]).max(-(values[j])) values[i] -= amountLim values[j] += amountLim } } return buckets } /** A view of the current state of the buckets. */ def makeDisplayComponent(buckets) { def c := makeEPainter(def paintCallback { to paintComponent(g) { def pixelsW := c.getWidth() def pixelsH := c.getHeight() def bucketsW := buckets.size() g.setColor(colors.getWhite()) g.fillRect(0, 0, pixelsW, pixelsH) g.setColor(colors.getDarkGray()) var sum := 0 for i in 0..!bucketsW { sum += def value := buckets[i] def x0 := (i * pixelsW / bucketsW).floor() def x1 := ((i + 1) * pixelsW / bucketsW).floor() g.fillRect(x0 + 1, pixelsH - value, x1 - x0 - 1, value) } g.setColor(colors.getBlack()) g."drawString(String, int, int)"(`Total: $sum`, 2, 20) } }) c.setPreferredSize((500, 300)) return c } # -------------------------------------------------------------- # --- Application setup def buckets := makeBuckets(100) def done # Promise indicating when the window is closed # Create the window def frame := ("Atomic transfers") frame.setContentPane(def display := makeDisplayComponent(buckets)) frame.addWindowListener(def mainWindowListener { to windowClosing(event) :void { bind done := null } match _ {} }) frame.setLocation(50, 50) frame.pack() # -------------------------------------------------------------- # --- Tasks # Neatens up buckets var ni := 0 doWhileUnresolved(done, fn { def i := ni def j := (ni + 1) %% buckets.size() buckets.transfer(i, j, (buckets[i] - buckets[j]) // 4) ni := j }) # Messes up buckets var mi := 0 doWhileUnresolved(done, fn { def i := (mi + entropy.nextInt(3)) %% buckets.size() def j := (i + entropy.nextInt(3)) %% buckets.size() #entropy.nextInt(buckets.size()) buckets.transfer(i, j, (buckets[i] / pi).floor()) mi := j }) # Updates display at fixed 10 Hz # (Note: tries to catch up; on slow systems slow this down or it will starve the other tasks) def clock := timer.every(100, def _(_) { if (Ref.isResolved(done)) { clock.stop() } else { display.repaint() } }) clock.start() # -------------------------------------------------------------- # --- All ready, go visible and wait frame.show() interp.waitAtTop(done) ================================================ FILE: samples/E/minChat.E ================================================ # from # http://wiki.erights.org/wiki/Walnut/Secure_Distributed_Computing/Auditing_minChat pragma.syntax("0.9") to send(message) { when (friend<-receive(message)) -> { chatUI.showMessage("self", message) } catch prob {chatUI.showMessage("system", "connection lost")} } to receive(message) {chatUI.showMessage("friend", message)} to receiveFriend(friendRcvr) { bind friend := friendRcvr chatUI.showMessage("system", "friend has arrived") } to save(file) {file.setText(makeURIFromObject(chatController))} to load(file) { bind friend := getObjectFromURI(file.getText()) friend <- receiveFriend(chatController) } ================================================ FILE: samples/E-mail/example.eml ================================================ Return-Path: To: Mario Zaizar Subject: Testing Mario Zaizar' MIME E-mail composing and sending PHP class: HTML message From: nobody Reply-To: nobody Sender: nobody@example.org X-Mailer: http://www.phpclasses.org/mimemessage $Revision: 1.63 $ (mail) MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="652b8c4dcb00cdcdda1e16af36781caf" Message-ID: <20050430192829.0489.nobody@example.org> Date: Sat, 30 Apr 2005 19:28:29 -0300 --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable This is an HTML message. Please use an HTML capable mail program to read this message. --69c1683a3ee16ef7cf16edd700694a2f Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable Testing Mario Zaizar' MIME E-mail composing and sending PHP class: H= TML message --69c1683a3ee16ef7cf16edd700694a2f-- --6a82fb459dcaacd40ab3404529e808dc Content-Type: image/gif; name="logo.gif" Content-Transfer-Encoding: base64 Content-Disposition: inline; filename="logo.gif" Content-ID: R0lGODlhlgAjAPMJAAAAAAAA/y8vLz8/P19fX19f339/f4+Pj4+Pz7+/v/////////////////// /////yH5BAEAAAkALAAAAACWACMAQwT+MMlJq7046827/2AoHYChGAChAkBylgKgKClFyEl6xDMg qLFBj3C5uXKplVAxIOxkA8BhdFCpDlMK1urMTrZWbAV8tVS5YsxtxmZHBVOSCcW9zaXyNhslVcto RBp5NQYxLAYGLi8oSwoJBlE+BiSNj5E/PDQsmy4pAJWQLAKJY5+hXhZ2dDYldFWtNSFPiXssXnZR k5+1pjpBiDMJUXG/Jo7DI4eKfMSmxsJ9GAUB1NXW19jZ2tvc3d7f4OHi2AgZN5vom1kk6F7s6u/p m3Ab7AOIiCxOyZuBIv8AOeTJIaYQjiR/kKTr5GQNE3pYSjCJ9mUXClRUsLxaZGciC0X+OlpoOuQo ZKdNJnIoKfnxRUQh6FLG0iLxIoYnJd0JEKISJyAQDodp3EUDC48oDnUY7HFI3wEDRjzycQJVZCQT Ol7NK+G0qgtkAcOKHUu2rNmzYTVqRMt2bB49bHompSchqg6HcGeANSMxr8sEa2y2HexnSEUTuWri SSbkYh7BgGVAnhB1b2REibESYaRoBgqIMYx59tFM9AvQffVG49P5NMZkMlHKhJPJb0knmSKZ6kSX JtbeF3Am7ocok6c7cM7pU5xcXiJJETUz16qPrzEfaFgZpvzn7h86YV5r/1mxXeAUMVyEIpnVUGpN RlG2ka9b3lP3pm2l6u7P+l/YLj3+RlEHbz1C0kRxSITQaAcilVBMEzmkkEQO8oSOBNg9SN+AX6hV z1pjgJiAhwCRsY8ZIp6xj1ruqCgeGeKNGEZwLnIwzTg45qjjjjz2GEA5hAUp5JBEFmnkkSCoWEcZ X8yohZNK1pFGPQS4hx0qNSLJlk9wCQORYu5QiMd7bUzGVyNlRiOHSlpuKdGEItHQ3HZ18beRRyws YSY/waDTiHf/tWlWUBAJiMJ1/Z0XXU7N0FnREpKM4NChCgbyRDq9XYpOplaKopN9NMkDnBbG+UMC QwLWIeaiglES6AjGARcPHCWoVAiatcTnGTABZoLPaPG1phccPv366mEvWEFSLnj+2QaonECwcJt/ e1Zw3lJvVMmftBdVNQS3UngLCA85YHIQOy6JO9N4eZW7KJwtOUZmGwOMWqejwVW6RQzaikRHX3yI osKhDAq8wmnKSmdMwNidSOof9ZG2DoV0RfTVmLFtGmNk+CoZna0HQnPHS3AhRbIeDpqmR09E0bsu soeaw994z+rwQVInvqLenBftYjLOVphLFHhV9qsnez8AEUbQRgO737AxChjmyANxuEFHSGi7hFCV 4jxLst2N8sRJYU+SHiAKjlmCgz2IffbLI5aaQR71hnkxq1ZfHSfKata6YDCJDMAQwY7wOgzhjxgj VFQnKB5uX4mr9qJ79pann+VcfcSzsSCd2mw5scqRRvlQ6TgcUelYhu75iPE4JejrsJOFQAG01277 7bjnrvvuvPfu++/ABy887hfc6OPxyCevPDdAVoDA89BHL/301Fdv/fXYZ6/99tx3Pz0FEQAAOw== --6a82fb459dcaacd40ab3404529e808dc ================================================ FILE: samples/EBNF/grammar.ebnf ================================================ (* Source: https://github.com/sunjay/lion License: MIT *) Statement = ( NamedFunction | AnonymousFunction | Assignment | Expr ) , "\n" ; Expr = AnonymousFunction | Term | "(" , Expr , ")" , { AnonymousFunction | Term | "(" , Expr , ")" } ; Assignment = Symbol , "=" , Expr ; AnonymousFunction = "\" , FunctionRHS ; NamedFunction = Symbol , FunctionRHS ; FunctionRHS = FunctionParams , "=" , FunctionBody ; FunctionParams = FunctionParam , { FunctionParam } ; FunctionParam = Term ; FunctionBody = Expr ; Term = Symbol | Number | SingleWordString ; SingleWordString = '"' , Symbol , '"' ; (* Symbol is a collection of valid symbol characters, not defined here *) (* Number is a valid numeric literal *) ================================================ FILE: samples/EBNF/material.ebnf ================================================ (* Source: https://github.com/io7m/jsom0 License: ISC *) name = "name" , string , ";" ; diffuse = "diffuse" , real , real , real , ";" ; ambient = "ambient" , real , real , real , ";" ; specular = "specular" , real , real , real , real , ";" ; shininess = "shininess" , real , ";" ; alpha = "alpha" , real , ";" ; mapping = "map_chrome" | "map_uv" ; texture = "texture" , string , real , mapping , ";" ; material = "material" , ";" , name , diffuse , ambient , specular , shininess , alpha , [ texture ] , "end" , ";" ; ================================================ FILE: samples/EBNF/object.ebnf ================================================ (* Source: https://github.com/io7m/jsom0 License: ISC *) vertex_p3n3_name = "vertex_p3n3" ; vertex_p3n3t2_name = "vertex_p3n3t2" ; vertex_type = vertex_p3n3_name | vertex_p3n3t2_name ; vertex_position = "position" , real , real , real , ";" ; vertex_normal = "normal" , real , real , real , ";" ; vertex_uv = "uv" , real , real , ";" ; vertex_p3n3 = vertex_p3n3_name , vertex_position , vertex_normal , "end" , ";" ; vertex_p3n3t2 = vertex_p3n3t2_name , vertex_position , vertex_normal , vertex_uv , "end" , ";" ; vertex = vertex_p3n3 | vertex_p3n3t2 ; vertex_array = "array" , positive , vertex_type , { vertex } , "end" , ";" ; vertices = "vertices" , ";" , vertex_array , "end" , ";" ; triangle = "triangle" , natural , natural , natural , ";" ; triangle_array = "array" , positive, "triangle" , { triangle } , "end" , ";" ; triangles = "triangles" , ";" , triangle_array , "end" , ";" ; name = "name" , string , ";" ; material_name = "material_name" , string , ";" ; object = "object" , ";" , name , material_name , vertices , triangles , "end" , ";" ; ================================================ FILE: samples/EBNF/types.ebnf ================================================ (* Source: https://github.com/io7m/jsom0 License: ISC *) digit_without_zero = "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" ; digit = "0" | digit_without_zero ; positive = digit_without_zero , { digit } ; natural = "0" | positive ; real = [ "-" ] , digit , [ "." , { digit } ] ; ================================================ FILE: samples/ECL/sample.ecl ================================================ /* * Multi-line comment */ #option ('slidingJoins', true); namesRecord := RECORD string20 surname; string10 forename; integer2 age; integer2 dadAge; integer2 mumAge; END; namesRecord2 := record string10 extra; namesRecord; end; namesTable := dataset('x',namesRecord,FLAT); namesTable2 := dataset('y',namesRecord2,FLAT); integer2 aveAgeL(namesRecord l) := (l.dadAge+l.mumAge)/2; integer2 aveAgeR(namesRecord2 r) := (r.dadAge+r.mumAge)/2; // Standard join on a function of left and right output(join(namesTable, namesTable2, aveAgeL(left) = aveAgeR(right))); //Several simple examples of sliding join syntax output(join(namesTable, namesTable2, left.age >= right.age - 10 and left.age <= right.age +10)); output(join(namesTable, namesTable2, left.age between right.age - 10 and right.age +10)); output(join(namesTable, namesTable2, left.age between right.age + 10 and right.age +30)); output(join(namesTable, namesTable2, left.age between (right.age + 20) - 10 and (right.age +20) + 10)); output(join(namesTable, namesTable2, aveAgeL(left) between aveAgeR(right)+10 and aveAgeR(right)+40)); //Same, but on strings. Also includes age to ensure sort is done by non-sliding before sliding. output(join(namesTable, namesTable2, left.surname between right.surname[1..10]+'AAAAAAAAAA' and right.surname[1..10]+'ZZZZZZZZZZ' and left.age=right.age)); output(join(namesTable, namesTable2, left.surname between right.surname[1..10]+'AAAAAAAAAA' and right.surname[1..10]+'ZZZZZZZZZZ' and left.age=right.age,all)); //This should not generate a self join output(join(namesTable, namesTable, left.age between right.age - 10 and right.age +10)); ================================================ FILE: samples/ECLiPSe/or-constraint.ecl ================================================ :- lib(ic). /** * Question 1.11 * vabs(?Val, ?AbsVal) */ vabs(Val, AbsVal):- AbsVal #> 0, ( Val #= AbsVal ; Val #= -AbsVal ), labeling([Val, AbsVal]). /** * vabsIC(?Val, ?AbsVal) */ vabsIC(Val, AbsVal):- AbsVal #> 0, Val #= AbsVal or Val #= -AbsVal, labeling([Val, AbsVal]). /** * Question 1.12 */ % X #:: -10..10, vabs(X, Y). % X #:: -10..10, vabsIC(X, Y). /** * Question 1.13 * faitListe(?ListVar, ?Taille, +Min, +Max) */ faitListe([], 0, _, _):-!. faitListe([First|Rest], Taille, Min, Max):- First #:: Min..Max, Taille1 #= Taille - 1, faitListe(Rest, Taille1, Min, Max). /** * Question 1.14 * suite(?ListVar) */ suite([Xi, Xi1, Xi2]):- checkRelation(Xi, Xi1, Xi2). suite([Xi, Xi1, Xi2|Rest]):- checkRelation(Xi, Xi1, Xi2), suite([Xi1, Xi2|Rest]). /** * checkRelation(?Xi, ?Xi1, ?Xi2) */ checkRelation(Xi, Xi1, Xi2):- vabs(Xi1, VabsXi1), Xi2 #= VabsXi1 - Xi. /** * Question 1.15 * checkPeriode(+ListVar). */ % TODO Any better solution? checkPeriode(ListVar):- length(ListVar, Length), Length < 10. checkPeriode([X1, X2, X3, X4, X5, X6, X7, X8, X9, X10|Rest]):- X1 =:= X10, checkPeriode([X2, X3, X4, X5, X6, X7, X8, X9, X10|Rest]). % faitListe(ListVar, 18, -9, 9), suite(ListVar), checkPeriode(ListVar). => 99 solutions /** * Tests */ /* vabs(5, 5). => Yes vabs(5, -5). => No vabs(-5, 5). => Yes vabs(X, 5). vabs(X, AbsX). vabsIC(5, 5). => Yes vabsIC(5, -5). => No vabsIC(-5, 5). => Yes vabsIC(X, 5). vabsIC(X, AbsX). faitListe(ListVar, 5, 1, 3). => 243 solutions faitListe([_, _, _, _, _], Taille, 1, 3). => Taille = 5 !!!!!!!!!!!!!!!! faitListe(ListVar, 18, -9, 9), suite(ListVar). => 99 solutions */ ================================================ FILE: samples/EJS/admin_index.jst ================================================ {{#def.admin_head}}
    {{#def.admin_header}}
    Title
    Author
    Date
    Last Update
    {{var fecha = require('fecha');}} {{~it.posts :post:index}}
    {{=post.author.fullName}}
    {{=fecha.format(post.created_on, 'regular')}}
    {{=fecha.format(post.last_update, 'regular')}}
    {{~}}
    Site Settings
    Active template
    {{=it.site.template}}
    Site Name
    {{=it.site.name}}
    URL
    {{=it.site.url}}
    Description
    {{=it.site.description}}
    Keywords
    {{=it.site.keywords}}
    Google Analytics UID
    {{=it.site.gaUID}}
    Tag
    {{#def.footer}} ================================================ FILE: samples/EJS/dash.ejs ================================================ <% include parts/depend %>
    <% if (user.primaryAccount == "teacher") { %> <% include teacher/sidebar %> <% include teacher/dashboard %> <% } else if (user.primaryAccount == "student") { %> <% include student/sidebar %> <% include student/dashboard %> <% } else { %>

    There seems to be a problem

    <% } %>
    ================================================ FILE: samples/EJS/email_template.ect ================================================ <% include 'layout/header_assets.ect' %> <% include 'layout/header.ect' %>
    <% include 'layout/sidebar.ect' %>
    最終更新日: 15-04-28 14:29
    ================================================ FILE: samples/EJS/modules.ejs.t ================================================ <% const moduleImports = []; modules.forEach(mod => { %> import * as <%- mod.saveName %> from '@<%- mod.packageName %>/<%- mod.name %>'; <% }); %> export const modulePackages = [ <%- modules.map(x => { return ` { moduleName: "${x.name}", module: ${x.saveName}, isEntry: ${x.isEntry}, isLibraryOnly: ${x.isLibraryOnly}, parentGahModule: ${x.parentGahModule ? "\"" + x.parentGahModule + "\"" : null} }`; }).join(',\n') %> ]; export const gahModules = [ <%- modules.filter(x => !x.isLibraryOnly).map(x => ' ' + x.saveName + '.' + x.baseModuleName + x.staticModuleInit).join(',\n') %> ]; ================================================ FILE: samples/EJS/page.ejs ================================================ <% include ../parts/depend %>
    <% include sidebar %>

    Pieces

    <% if (pieces.length == 1) { %>

    You have 1 piece to practice

    <% } else { %>

    You have <%= pieces.length %> pieces to practice

    <% } %>
    <% if (pieces == undefined || pieces.length == 0) { %>

    No Pieces

    You have no Pieces assigned.

    <% } else { %>
    <% if (inProgressPieces == undefined || inProgressPieces.length == 0) { %>

    No Pieces in Progress

    <% } else { %> <% for (var i = 0; i < inProgressPieces.length; i++) { %>

    <%= inProgressPieces[i].title %>

    By <%= inProgressPieces[i].author %>

    Teacher: <%= inProgressPieces[i].teacherName %>

    Average Practice Time: <%= inProgressPieces[i].averagePracticeTime %> mins

    Practice <%= inProgressPieces[i].title %>
    <% } %> <% } %>
    <% } %>
    ================================================ FILE: samples/EQ/HTTPServerVirtualHostListener.eq ================================================ /* * This file is part of Jkop * Copyright (c) 2016 Job and Esther Technologies, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ IFNDEF("target_posix") { public class HTTPServerVirtualHostListener : EventLoopReadListener { public static HTTPServerVirtualHostListener create(String name, HTTPServer server, String prefix = null) { Logger logger; if(server != null) { logger = server.get_logger(); } Log.error("Virtual hosts are not supported on this platform.", logger); return(null); } public void on_read_ready() { } public void close() { } } } ELSE { public class HTTPServerVirtualHostListener : LoggerObject, EventLoopReadListener { class Client : LoggerObject, EventLoopReadListener { HTTPServer server; LocalSocket socket; EventLoopEntry ee; embed "c" {{{ #include #include #include }}} public static Client create(HTTPServer server, LocalSocket socket) { if(server == null || socket == null) { return(null); } var eventloop = server.get_eventloop(); if(eventloop == null) { return(null); } var v = new Client(); v.set_logger(server.get_logger()); v.server = server; v.socket = socket; v.ee = eventloop.entry_for_object(socket); if(v.ee == null) { return(null); } v.ee.set_read_listener(v); return(v); } public void close() { if(ee != null) { ee.remove(); ee = null; } if(socket != null) { socket.close(); socket = null; } server = null; } public void on_read_ready() { receive_fd(); close(); } private void receive_fd() { if(socket is FileDescriptor == false) { return; } int lsfd = ((FileDescriptor)socket).get_fd(); int r; int newfd = -1; embed "c" {{{ char buf[64]; struct msghdr msg; struct iovec iov[1]; ssize_t n; union { struct cmsghdr cm; char control[CMSG_SPACE(sizeof(int))]; } control_un; struct cmsghdr* cmptr; msg.msg_control = control_un.control; msg.msg_controllen = sizeof(control_un.control); msg.msg_name = NULL; msg.msg_namelen = 0; iov[0].iov_base = buf; iov[0].iov_len = 64; msg.msg_iov = iov; msg.msg_iovlen = 1; r = recvmsg(lsfd, &msg, 0); }}} if(r < 0) { log_error("FAILED to recvmsg() from the local socket in virtual host receiver."); return; } embed "c" {{{ if((cmptr = CMSG_FIRSTHDR(&msg)) != NULL && cmptr->cmsg_len == CMSG_LEN(sizeof(int))) { if(cmptr->cmsg_level == SOL_SOCKET && cmptr->cmsg_type == SCM_RIGHTS) { newfd = *((int*)CMSG_DATA(cmptr)); } } }}} if(newfd < 0) { log_warning("No file descriptor was passed through the socket in virtual host receiver."); return; } var newsock = TCPSocket.create(); if(newsock == null) { embed "c" {{{ close(newfd); }}} log_error("FAILED to create a new socket"); return; } var fds = newsock as FileDescriptorSocket; if(fds == null) { embed "c" {{{ close(newfd); }}} log_error("TCPSocket is not a FileDescriptorSocket. Cannot set file descriptor."); return; } fds.set_fd(newfd); server.on_new_client_socket(newsock); } } HTTPServer server; LocalSocket socket; EventLoopEntry ee; String socketprefix; public static HTTPServerVirtualHostListener create(String name, HTTPServer server, String prefix = null) { if(server == null) { return(null); } var v = new HTTPServerVirtualHostListener(); v.server = server; v.socketprefix = prefix; v.set_logger(server.get_logger()); if(v.start(name) == false) { v = null; } return(v); } public bool start(String name) { if(String.is_empty(name) || server == null) { return(false); } socket = LocalSocket.create(); if(socket == null) { log_error("Cannot create local socket"); return(false); } var pp = socketprefix; if(String.is_empty(pp)) { pp = "sympathy_vhost_"; } var socketname = "%s%s".printf().add(pp).add(name).to_string(); if(socket != null) { if(socket.listen(socketname) == false) { socket = null; } } if(socket == null) { log_error("FAILED to listen to local socket `%s'".printf().add(socketname)); return(false); } var event_loop = server.get_eventloop(); if(event_loop == null) { log_error("No eventloop"); return(false); } ee = event_loop.entry_for_object(socket); if(ee == null) { log_error("Failed to register socket with eventloop"); return(false); } ee.set_read_listener(this); log_debug("HTTPServerVirtualHostListener: Listening for virtual host `%s'".printf().add(name)); return(true); } public void close() { if(ee != null) { ee.remove(); ee = null; } if(socket != null) { socket.close(); socket = null; } server = null; } public void on_read_ready() { var ns = socket.accept(); if(ns != null) { Client.create(server, ns); } } } } ================================================ FILE: samples/EQ/SEButtonEntity.eq ================================================ /* * This file is part of Jkop * Copyright (c) 2016 Job and Esther Technologies, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ public class SEButtonEntity : SESpriteEntity, SEPointerListener { class SEImageButtonEntity : SEButtonEntity { property SEImage image_normal; property SEImage image_hover; property SEImage image_pressed; public void update() { if(get_pressed()) { var img = image_pressed; if(img == null) { img = image_hover; } if(img == null) { img = image_normal; } set_image(img); } else if(get_has_pointer()) { var img = image_hover; if(img == null) { img = image_normal; } set_image(img); } else { set_image(image_normal); } } } class SETextButtonEntity : SEButtonEntity { property String button_text; property String normal_font; property String hover_font; property String pressed_font; public void update() { if(get_pressed()) { var ff = pressed_font; if(String.is_empty(ff)) { ff = hover_font; } if(String.is_empty(ff)) { ff = normal_font; } set_text(button_text, ff); } else if(get_has_pointer()) { var ff = hover_font; if(String.is_empty(ff)) { ff = normal_font; } set_text(button_text, ff); } else { set_text(button_text, normal_font); } } } public static SEButtonEntity for_image(SEImage img) { return(SEButtonEntity.for_images(img, null, null)); } public static SEButtonEntity for_images(SEImage normal, SEImage hover, SEImage pressed) { return(new SEImageButtonEntity().set_image_normal(normal).set_image_hover(hover) .set_image_pressed(pressed)); } public static SEButtonEntity for_text(String text, String normal_font = null, String hover_font = null, String pressed_font = null) { return(new SETextButtonEntity().set_button_text(text).set_normal_font(normal_font).set_hover_font(hover_font) .set_pressed_font(pressed_font)); } property SEMessageListener listener; property Object data; bool pressed = false; bool has_pointer = false; public bool get_pressed() { return(pressed); } public bool get_has_pointer() { return(has_pointer); } public void initialize(SEResourceCache rsc) { base.initialize(rsc); update(); } public virtual void update() { } public virtual void on_pointer_enter(SEPointerInfo pi) { if(has_pointer) { return; } has_pointer = true; update(); } public virtual void on_pointer_leave(SEPointerInfo pi) { if(has_pointer == false && pressed == false) { return; } has_pointer = false; pressed = false; update(); } public void on_pointer_move(SEPointerInfo pi) { if(pi.is_inside(get_x(), get_y(), get_width(), get_height())) { if(has_pointer == false) { on_pointer_enter(pi); } } else { if(has_pointer) { on_pointer_leave(pi); } } } public void on_pointer_press(SEPointerInfo pi) { if(pressed) { return; } if(pi.is_inside(get_x(), get_y(), get_width(), get_height()) == false) { return; } pressed = true; update(); } public void on_pointer_release(SEPointerInfo pi) { if(pressed == false) { return; } if(pi.is_inside(get_x(), get_y(), get_width(), get_height()) == false) { return; } on_pointer_click(pi); pressed = false; update(); } public virtual void on_pointer_click(SEPointerInfo pi) { if(listener != null) { listener.on_message(data); } } } ================================================ FILE: samples/EQ/String.eq ================================================ /* * This file is part of Jkop * Copyright (c) 2016 Job and Esther Technologies, Inc. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all * copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ public interface String : Stringable, Integer, Double, Boolean { public static String instance(String o) { if(o == null) { return(""); } return(o); } public static String as_string(Object o) { if(o == null) { return(null); } if(o is String) { return((String)o); } if(o is Stringable) { return(((Stringable)o).to_string()); } return(null); } public static strptr as_strptr(Object o) { var str = as_string(o); if(str == null) { return(null); } return(str.to_strptr()); } public static bool is_in_collection(String str, Collection c) { if(str == null) { return(false); } foreach(String s in c) { if(s.equals(str)) { return(true); } } return(false); } public static bool is_empty(Object o) { if(o == null) { return(true); } var str = o as String; if(str == null && o is Stringable) { str = ((Stringable)o).to_string(); } if(str == null) { return(true); } if(str.get_char(0) < 1) { return(true); } return(false); } public static String for_object(Object o) { if(o is String) { return((String)o); } if(o is Stringable) { return(((Stringable)o).to_string()); } return(null); } public static String for_character(int c) { var sb = StringBuffer.create(); sb.append_c(c); return(sb.to_string()); } public static String for_integer(int av) { IFDEF("target_cs") { strptr v; embed {{{ v = av.ToString(); }}} return(String.for_strptr(v)); } ELSE IFDEF("target_java") { strptr st; embed {{{ st = java.lang.String.valueOf(av); }}} return(String.for_strptr(st)); } ELSE { return("%d".printf().add(av).to_string()); } } public static String for_long(long av) { IFDEF("target_cs") { strptr v; embed {{{ v = av.ToString(); }}} return(String.for_strptr(v)); } ELSE IFDEF("target_java") { strptr st; embed {{{ st = java.lang.String.valueOf(av); }}} return(String.for_strptr(st)); } ELSE { return(for_integer((int)av)); } } public static String for_double(double v) { IFDEF("target_java") { strptr st; embed {{{ st = java.lang.String.valueOf(v); }}} return(String.for_strptr(st)); } ELSE { return("%f".printf().add(v).to_string()); } } public static String for_boolean(bool val) { if(val) { return("true"); } return("false"); } public static String for_strptr(strptr literal) { var v = new StringImpl(); v.set_strptr(literal); return(v); } public static String for_utf8_buffer(Buffer data, bool haszero = true) { var v = new StringImpl(); v.set_utf8_buffer(data, haszero); return(v); } public static String combine(Collection strings, int delim = -1, bool unique = false) { var sb = StringBuffer.create(); HashTable flags; if(unique) { flags = HashTable.create(); } foreach(Object o in strings) { var s = String.as_string(o); if(s == null) { continue; } if(flags != null) { if(flags.get(s) != null) { continue; } flags.set(s, "true"); } if(delim > 0 && sb.count() > 0) { sb.append_c(delim); } sb.append(s); } return(sb.to_string()); } public static String capitalize(String str) { if(str == null) { return(null); } var c0 = str.get_char(0); if(c0 < 1) { return(null); } if(c0 >= 'a' && c0 <= 'z') { var sb = StringBuffer.create(); sb.append_c(c0 - 'a' + 'A'); sb.append(str.substring(1)); return(sb.to_string()); } return(str); } public StringFormatter printf(); public String dup(); public String append(String str); public int get_length(); public int get_char(int n); public String truncate(int len); public String replace(int o, int r); public String replace_char(int o, int r); public String replace_string(String o, String r); public String remove(int start, int len); public String insert(String str, int pos); public String substring(int start, int alength = -1); public String reverse(); public String lowercase(); public String uppercase(); public String strip(); public Iterator split(int delim, int max = -1); public int str(String s); public bool contains(String s); public int rstr(String s); public int chr(int c); public int rchr(int c); public bool has_prefix(String prefix); public bool has_suffix(String suffix); public int compare(Object ao); public int compare_ignore_case(Object ao); public bool equals(Object ao); public bool equals_ptr(strptr str); public bool equals_ignore_case(Object ao); public bool equals_ignore_case_ptr(strptr str); public StringIterator iterate(); public StringIterator iterate_reverse(); public int to_integer_base(int ibase); public strptr to_strptr(); public Buffer to_utf8_buffer(bool zero = true); public int hash(); public EditableString as_editable(); } ================================================ FILE: samples/Eagle/Eagle.brd ================================================ <b>Resistors, Capacitors, Inductors</b><p> Based on the previous libraries: <ul> <li>r.lbr <li>cap.lbr <li>cap-fe.lbr <li>captant.lbr <li>polcap.lbr <li>ipc-smd.lbr </ul> All SMD packages are defined according to the IPC specifications and CECC<p> <author>Created by librarian@cadsoft.de</author><p> <p> for Electrolyt Capacitors see also :<p> www.bccomponents.com <p> www.panasonic.com<p> www.kemet.com<p> http://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf <b>(SANYO)</b> <p> for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> <table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0> <tr valign="top"> <! <td width="10">&nbsp;</td> <td width="90%"> <b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> <P> <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> <TR> <TD COLSPAN=8> <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> </TD> </TR> <TR> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> </B> </TD><TD>&nbsp;</TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > 3005P<BR> 3006P<BR> 3006W<BR> 3006Y<BR> 3009P<BR> 3009W<BR> 3009Y<BR> 3057J<BR> 3057L<BR> 3057P<BR> 3057Y<BR> 3059J<BR> 3059L<BR> 3059P<BR> 3059Y<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 89P<BR> 89W<BR> 89X<BR> 89PH<BR> 76P<BR> 89XH<BR> 78SLT<BR> 78L&nbsp;ALT<BR> 56P&nbsp;ALT<BR> 78P&nbsp;ALT<BR> T8S<BR> 78L<BR> 56P<BR> 78P<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> T18/784<BR> 783<BR> 781<BR> -<BR> -<BR> -<BR> 2199<BR> 1697/1897<BR> 1680/1880<BR> 2187<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 8035EKP/CT20/RJ-20P<BR> -<BR> RJ-20X<BR> -<BR> -<BR> -<BR> 1211L<BR> 8012EKQ&nbsp;ALT<BR> 8012EKR&nbsp;ALT<BR> 1211P<BR> 8012EKJ<BR> 8012EKL<BR> 8012EKQ<BR> 8012EKR<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 2101P<BR> 2101W<BR> 2101Y<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 2102L<BR> 2102S<BR> 2102Y<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> EVMCOG<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 43P<BR> 43W<BR> 43Y<BR> -<BR> -<BR> -<BR> -<BR> 40L<BR> 40P<BR> 40Y<BR> 70Y-T602<BR> 70L<BR> 70P<BR> 70Y<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> RT/RTR12<BR> RT/RTR12<BR> RT/RTR12<BR> -<BR> RJ/RJR12<BR> RJ/RJR12<BR> RJ/RJR12<BR></FONT> </TD> </TR> <TR> <TD COLSPAN=8>&nbsp; </TD> </TR> <TR> <TD COLSPAN=8> <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> </TD> </TR> <TR> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3250L<BR> 3250P<BR> 3250W<BR> 3250X<BR> 3252P<BR> 3252W<BR> 3252X<BR> 3260P<BR> 3260W<BR> 3260X<BR> 3262P<BR> 3262W<BR> 3262X<BR> 3266P<BR> 3266W<BR> 3266X<BR> 3290H<BR> 3290P<BR> 3290W<BR> 3292P<BR> 3292W<BR> 3292X<BR> 3296P<BR> 3296W<BR> 3296X<BR> 3296Y<BR> 3296Z<BR> 3299P<BR> 3299W<BR> 3299X<BR> 3299Y<BR> 3299Z<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 66P&nbsp;ALT<BR> 66W&nbsp;ALT<BR> 66X&nbsp;ALT<BR> 66P&nbsp;ALT<BR> 66W&nbsp;ALT<BR> 66X&nbsp;ALT<BR> -<BR> 64W&nbsp;ALT<BR> -<BR> 64P&nbsp;ALT<BR> 64W&nbsp;ALT<BR> 64X&nbsp;ALT<BR> 64P<BR> 64W<BR> 64X<BR> 66X&nbsp;ALT<BR> 66P&nbsp;ALT<BR> 66W&nbsp;ALT<BR> 66P<BR> 66W<BR> 66X<BR> 67P<BR> 67W<BR> 67X<BR> 67Y<BR> 67Z<BR> 68P<BR> 68W<BR> 68X<BR> 67Y&nbsp;ALT<BR> 67Z&nbsp;ALT<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 5050<BR> 5091<BR> 5080<BR> 5087<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> T63YB<BR> T63XB<BR> -<BR> -<BR> -<BR> 5887<BR> 5891<BR> 5880<BR> -<BR> -<BR> -<BR> T93Z<BR> T93YA<BR> T93XA<BR> T93YB<BR> T93XB<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 8026EKP<BR> 8026EKW<BR> 8026EKM<BR> 8026EKP<BR> 8026EKB<BR> 8026EKM<BR> 1309X<BR> 1309P<BR> 1309W<BR> 8024EKP<BR> 8024EKW<BR> 8024EKN<BR> RJ-9P/CT9P<BR> RJ-9W<BR> RJ-9X<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 3103P<BR> 3103Y<BR> 3103Z<BR> 3103P<BR> 3103Y<BR> 3103Z<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 3105P/3106P<BR> 3105W/3106W<BR> 3105X/3106X<BR> 3105Y/3106Y<BR> 3105Z/3105Z<BR> 3102P<BR> 3102W<BR> 3102X<BR> 3102Y<BR> 3102Z<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> EVMCBG<BR> EVMCCG<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 55-1-X<BR> 55-4-X<BR> 55-3-X<BR> 55-2-X<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 50-2-X<BR> 50-4-X<BR> 50-3-X<BR> -<BR> -<BR> -<BR> 64P<BR> 64W<BR> 64X<BR> 64Y<BR> 64Z<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> RT/RTR22<BR> RT/RTR22<BR> RT/RTR22<BR> RT/RTR22<BR> RJ/RJR22<BR> RJ/RJR22<BR> RJ/RJR22<BR> RT/RTR26<BR> RT/RTR26<BR> RT/RTR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RT/RTR24<BR> RT/RTR24<BR> RT/RTR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> </TR> <TR> <TD COLSPAN=8>&nbsp; </TD> </TR> <TR> <TD COLSPAN=8> <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> </TD> </TR> <TR> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3323P<BR> 3323S<BR> 3323W<BR> 3329H<BR> 3329P<BR> 3329W<BR> 3339H<BR> 3339P<BR> 3339W<BR> 3352E<BR> 3352H<BR> 3352K<BR> 3352P<BR> 3352T<BR> 3352V<BR> 3352W<BR> 3362H<BR> 3362M<BR> 3362P<BR> 3362R<BR> 3362S<BR> 3362U<BR> 3362W<BR> 3362X<BR> 3386B<BR> 3386C<BR> 3386F<BR> 3386H<BR> 3386K<BR> 3386M<BR> 3386P<BR> 3386S<BR> 3386W<BR> 3386X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 25P<BR> 25S<BR> 25RX<BR> 82P<BR> 82M<BR> 82PA<BR> -<BR> -<BR> -<BR> 91E<BR> 91X<BR> 91T<BR> 91B<BR> 91A<BR> 91V<BR> 91W<BR> 25W<BR> 25V<BR> 25P<BR> -<BR> 25S<BR> 25U<BR> 25RX<BR> 25X<BR> 72XW<BR> 72XL<BR> 72PM<BR> 72RX<BR> -<BR> 72PX<BR> 72P<BR> 72RXW<BR> 72RXL<BR> 72X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> T7YB<BR> T7YA<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> TXD<BR> TYA<BR> TYP<BR> -<BR> TYD<BR> TX<BR> -<BR> 150SX<BR> 100SX<BR> 102T<BR> 101S<BR> 190T<BR> 150TX<BR> 101<BR> -<BR> -<BR> 101SX<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> ET6P<BR> ET6S<BR> ET6X<BR> RJ-6W/8014EMW<BR> RJ-6P/8014EMP<BR> RJ-6X/8014EMX<BR> TM7W<BR> TM7P<BR> TM7X<BR> -<BR> 8017SMS<BR> -<BR> 8017SMB<BR> 8017SMA<BR> -<BR> -<BR> CT-6W<BR> CT-6H<BR> CT-6P<BR> CT-6R<BR> -<BR> CT-6V<BR> CT-6X<BR> -<BR> -<BR> 8038EKV<BR> -<BR> 8038EKX<BR> -<BR> -<BR> 8038EKP<BR> 8038EKZ<BR> 8038EKW<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> 3321H<BR> 3321P<BR> 3321N<BR> 1102H<BR> 1102P<BR> 1102T<BR> RVA0911V304A<BR> -<BR> RVA0911H413A<BR> RVG0707V100A<BR> RVA0607V(H)306A<BR> RVA1214H213A<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 3104B<BR> 3104C<BR> 3104F<BR> 3104H<BR> -<BR> 3104M<BR> 3104P<BR> 3104S<BR> 3104W<BR> 3104X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> EVMQ0G<BR> EVMQIG<BR> EVMQ3G<BR> EVMS0G<BR> EVMQ0G<BR> EVMG0G<BR> -<BR> -<BR> -<BR> EVMK4GA00B<BR> EVM30GA00B<BR> EVMK0GA00B<BR> EVM38GA00B<BR> EVMB6<BR> EVLQ0<BR> -<BR> EVMMSG<BR> EVMMBG<BR> EVMMAG<BR> -<BR> -<BR> EVMMCS<BR> -<BR> -<BR> -<BR> -<BR> -<BR> EVMM1<BR> -<BR> -<BR> EVMM0<BR> -<BR> -<BR> EVMM3<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> 62-3-1<BR> 62-1-2<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 67R<BR> -<BR> 67P<BR> -<BR> -<BR> -<BR> -<BR> 67X<BR> 63V<BR> 63S<BR> 63M<BR> -<BR> -<BR> 63H<BR> 63P<BR> -<BR> -<BR> 63X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> RJ/RJR50<BR> RJ/RJR50<BR> RJ/RJR50<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> </TR> </TABLE> <P>&nbsp;<P> <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> <TR> <TD COLSPAN=7> <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> <P> <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> </TD> </TR> <TR> <TD> <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3224G<BR> 3224J<BR> 3224W<BR> 3269P<BR> 3269W<BR> 3269X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 44G<BR> 44J<BR> 44W<BR> 84P<BR> 84W<BR> 84X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> ST63Z<BR> ST63Y<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> ST5P<BR> ST5W<BR> ST5X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> </TR> <TR> <TD COLSPAN=7>&nbsp; </TD> </TR> <TR> <TD COLSPAN=7> <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> </TD> </TR> <TR> <TD> <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3314G<BR> 3314J<BR> 3364A/B<BR> 3364C/D<BR> 3364W/X<BR> 3313G<BR> 3313J<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 23B<BR> 23A<BR> 21X<BR> 21W<BR> -<BR> 22B<BR> 22A<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> ST5YL/ST53YL<BR> ST5YJ/5T53YJ<BR> ST-23A<BR> ST-22B<BR> ST-22<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> ST-4B<BR> ST-4A<BR> -<BR> -<BR> -<BR> ST-3B<BR> ST-3A<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> EVM-6YS<BR> EVM-1E<BR> EVM-1G<BR> EVM-1D<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> G4B<BR> G4A<BR> TR04-3S1<BR> TRG04-2S1<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> DVR-43A<BR> CVR-42C<BR> CVR-42A/C<BR> -<BR> -<BR></FONT> </TD> </TR> </TABLE> <P> <FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> <P> &nbsp; <P> </td> </tr> </table> <b>RESISTOR</b><p> >NAME >VALUE <b>Pin Header Connectors</b><p> <author>Created by librarian@cadsoft.de</author> <b>PIN HEADER</b> >NAME >VALUE <b>EAGLE Design Rules</b> <p> Die Standard-Design-Rules sind so gewählt, dass sie für die meisten Anwendungen passen. Sollte ihre Platine besondere Anforderungen haben, treffen Sie die erforderlichen Einstellungen hier und speichern die Design Rules unter einem neuen Namen ab. <b>EAGLE Design Rules</b> <p> The default Design Rules have been set to cover a wide range of applications. Your particular design may have different requirements, so please make the necessary adjustments and save your customized design rules under a new name. ================================================ FILE: samples/Eagle/Eagle.sch ================================================ <b>Frames for Sheet and Layout</b> >DRAWING_NAME >LAST_DATE_TIME >SHEET Sheet: <b>FRAME</b><p> DIN A4, landscape with location and doc. field <b>Resistors, Capacitors, Inductors</b><p> Based on the previous libraries: <ul> <li>r.lbr <li>cap.lbr <li>cap-fe.lbr <li>captant.lbr <li>polcap.lbr <li>ipc-smd.lbr </ul> All SMD packages are defined according to the IPC specifications and CECC<p> <author>Created by librarian@cadsoft.de</author><p> <p> for Electrolyt Capacitors see also :<p> www.bccomponents.com <p> www.panasonic.com<p> www.kemet.com<p> http://www.secc.co.jp/pdf/os_e/2004/e_os_all.pdf <b>(SANYO)</b> <p> for trimmer refence see : <u>www.electrospec-inc.com/cross_references/trimpotcrossref.asp</u><p> <table border=0 cellspacing=0 cellpadding=0 width="100%" cellpaddding=0> <tr valign="top"> <! <td width="10">&nbsp;</td> <td width="90%"> <b><font color="#0000FF" size="4">TRIM-POT CROSS REFERENCE</font></b> <P> <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=2> <TR> <TD COLSPAN=8> <FONT SIZE=3 FACE=ARIAL><B>RECTANGULAR MULTI-TURN</B></FONT> </TD> </TR> <TR> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">BOURNS</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">BI&nbsp;TECH</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">DALE-VISHAY</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">PHILIPS/MEPCO</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">MURATA</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">PANASONIC</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">SPECTROL</FONT> </B> </TD> <TD ALIGN=CENTER> <B> <FONT SIZE=3 FACE=ARIAL color="#FF0000">MILSPEC</FONT> </B> </TD><TD>&nbsp;</TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3 > 3005P<BR> 3006P<BR> 3006W<BR> 3006Y<BR> 3009P<BR> 3009W<BR> 3009Y<BR> 3057J<BR> 3057L<BR> 3057P<BR> 3057Y<BR> 3059J<BR> 3059L<BR> 3059P<BR> 3059Y<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 89P<BR> 89W<BR> 89X<BR> 89PH<BR> 76P<BR> 89XH<BR> 78SLT<BR> 78L&nbsp;ALT<BR> 56P&nbsp;ALT<BR> 78P&nbsp;ALT<BR> T8S<BR> 78L<BR> 56P<BR> 78P<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> T18/784<BR> 783<BR> 781<BR> -<BR> -<BR> -<BR> 2199<BR> 1697/1897<BR> 1680/1880<BR> 2187<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 8035EKP/CT20/RJ-20P<BR> -<BR> RJ-20X<BR> -<BR> -<BR> -<BR> 1211L<BR> 8012EKQ&nbsp;ALT<BR> 8012EKR&nbsp;ALT<BR> 1211P<BR> 8012EKJ<BR> 8012EKL<BR> 8012EKQ<BR> 8012EKR<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 2101P<BR> 2101W<BR> 2101Y<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 2102L<BR> 2102S<BR> 2102Y<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> EVMCOG<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 43P<BR> 43W<BR> 43Y<BR> -<BR> -<BR> -<BR> -<BR> 40L<BR> 40P<BR> 40Y<BR> 70Y-T602<BR> 70L<BR> 70P<BR> 70Y<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> RT/RTR12<BR> RT/RTR12<BR> RT/RTR12<BR> -<BR> RJ/RJR12<BR> RJ/RJR12<BR> RJ/RJR12<BR></FONT> </TD> </TR> <TR> <TD COLSPAN=8>&nbsp; </TD> </TR> <TR> <TD COLSPAN=8> <FONT SIZE=4 FACE=ARIAL><B>SQUARE MULTI-TURN</B></FONT> </TD> </TR> <TR> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3250L<BR> 3250P<BR> 3250W<BR> 3250X<BR> 3252P<BR> 3252W<BR> 3252X<BR> 3260P<BR> 3260W<BR> 3260X<BR> 3262P<BR> 3262W<BR> 3262X<BR> 3266P<BR> 3266W<BR> 3266X<BR> 3290H<BR> 3290P<BR> 3290W<BR> 3292P<BR> 3292W<BR> 3292X<BR> 3296P<BR> 3296W<BR> 3296X<BR> 3296Y<BR> 3296Z<BR> 3299P<BR> 3299W<BR> 3299X<BR> 3299Y<BR> 3299Z<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> 66P&nbsp;ALT<BR> 66W&nbsp;ALT<BR> 66X&nbsp;ALT<BR> 66P&nbsp;ALT<BR> 66W&nbsp;ALT<BR> 66X&nbsp;ALT<BR> -<BR> 64W&nbsp;ALT<BR> -<BR> 64P&nbsp;ALT<BR> 64W&nbsp;ALT<BR> 64X&nbsp;ALT<BR> 64P<BR> 64W<BR> 64X<BR> 66X&nbsp;ALT<BR> 66P&nbsp;ALT<BR> 66W&nbsp;ALT<BR> 66P<BR> 66W<BR> 66X<BR> 67P<BR> 67W<BR> 67X<BR> 67Y<BR> 67Z<BR> 68P<BR> 68W<BR> 68X<BR> 67Y&nbsp;ALT<BR> 67Z&nbsp;ALT<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 5050<BR> 5091<BR> 5080<BR> 5087<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> T63YB<BR> T63XB<BR> -<BR> -<BR> -<BR> 5887<BR> 5891<BR> 5880<BR> -<BR> -<BR> -<BR> T93Z<BR> T93YA<BR> T93XA<BR> T93YB<BR> T93XB<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 8026EKP<BR> 8026EKW<BR> 8026EKM<BR> 8026EKP<BR> 8026EKB<BR> 8026EKM<BR> 1309X<BR> 1309P<BR> 1309W<BR> 8024EKP<BR> 8024EKW<BR> 8024EKN<BR> RJ-9P/CT9P<BR> RJ-9W<BR> RJ-9X<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 3103P<BR> 3103Y<BR> 3103Z<BR> 3103P<BR> 3103Y<BR> 3103Z<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 3105P/3106P<BR> 3105W/3106W<BR> 3105X/3106X<BR> 3105Y/3106Y<BR> 3105Z/3105Z<BR> 3102P<BR> 3102W<BR> 3102X<BR> 3102Y<BR> 3102Z<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> EVMCBG<BR> EVMCCG<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 55-1-X<BR> 55-4-X<BR> 55-3-X<BR> 55-2-X<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 50-2-X<BR> 50-4-X<BR> 50-3-X<BR> -<BR> -<BR> -<BR> 64P<BR> 64W<BR> 64X<BR> 64Y<BR> 64Z<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> RT/RTR22<BR> RT/RTR22<BR> RT/RTR22<BR> RT/RTR22<BR> RJ/RJR22<BR> RJ/RJR22<BR> RJ/RJR22<BR> RT/RTR26<BR> RT/RTR26<BR> RT/RTR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RJ/RJR26<BR> RT/RTR24<BR> RT/RTR24<BR> RT/RTR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> RJ/RJR24<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> </TR> <TR> <TD COLSPAN=8>&nbsp; </TD> </TR> <TR> <TD COLSPAN=8> <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> </TD> </TR> <TR> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BOURN</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MURATA</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>SPECTROL</B></FONT> </TD> <TD ALIGN=CENTER> <FONT SIZE=3 FACE=ARIAL><B>MILSPEC</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3323P<BR> 3323S<BR> 3323W<BR> 3329H<BR> 3329P<BR> 3329W<BR> 3339H<BR> 3339P<BR> 3339W<BR> 3352E<BR> 3352H<BR> 3352K<BR> 3352P<BR> 3352T<BR> 3352V<BR> 3352W<BR> 3362H<BR> 3362M<BR> 3362P<BR> 3362R<BR> 3362S<BR> 3362U<BR> 3362W<BR> 3362X<BR> 3386B<BR> 3386C<BR> 3386F<BR> 3386H<BR> 3386K<BR> 3386M<BR> 3386P<BR> 3386S<BR> 3386W<BR> 3386X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 25P<BR> 25S<BR> 25RX<BR> 82P<BR> 82M<BR> 82PA<BR> -<BR> -<BR> -<BR> 91E<BR> 91X<BR> 91T<BR> 91B<BR> 91A<BR> 91V<BR> 91W<BR> 25W<BR> 25V<BR> 25P<BR> -<BR> 25S<BR> 25U<BR> 25RX<BR> 25X<BR> 72XW<BR> 72XL<BR> 72PM<BR> 72RX<BR> -<BR> 72PX<BR> 72P<BR> 72RXW<BR> 72RXL<BR> 72X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> T7YB<BR> T7YA<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> TXD<BR> TYA<BR> TYP<BR> -<BR> TYD<BR> TX<BR> -<BR> 150SX<BR> 100SX<BR> 102T<BR> 101S<BR> 190T<BR> 150TX<BR> 101<BR> -<BR> -<BR> 101SX<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> ET6P<BR> ET6S<BR> ET6X<BR> RJ-6W/8014EMW<BR> RJ-6P/8014EMP<BR> RJ-6X/8014EMX<BR> TM7W<BR> TM7P<BR> TM7X<BR> -<BR> 8017SMS<BR> -<BR> 8017SMB<BR> 8017SMA<BR> -<BR> -<BR> CT-6W<BR> CT-6H<BR> CT-6P<BR> CT-6R<BR> -<BR> CT-6V<BR> CT-6X<BR> -<BR> -<BR> 8038EKV<BR> -<BR> 8038EKX<BR> -<BR> -<BR> 8038EKP<BR> 8038EKZ<BR> 8038EKW<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> 3321H<BR> 3321P<BR> 3321N<BR> 1102H<BR> 1102P<BR> 1102T<BR> RVA0911V304A<BR> -<BR> RVA0911H413A<BR> RVG0707V100A<BR> RVA0607V(H)306A<BR> RVA1214H213A<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 3104B<BR> 3104C<BR> 3104F<BR> 3104H<BR> -<BR> 3104M<BR> 3104P<BR> 3104S<BR> 3104W<BR> 3104X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> EVMQ0G<BR> EVMQIG<BR> EVMQ3G<BR> EVMS0G<BR> EVMQ0G<BR> EVMG0G<BR> -<BR> -<BR> -<BR> EVMK4GA00B<BR> EVM30GA00B<BR> EVMK0GA00B<BR> EVM38GA00B<BR> EVMB6<BR> EVLQ0<BR> -<BR> EVMMSG<BR> EVMMBG<BR> EVMMAG<BR> -<BR> -<BR> EVMMCS<BR> -<BR> -<BR> -<BR> -<BR> -<BR> EVMM1<BR> -<BR> -<BR> EVMM0<BR> -<BR> -<BR> EVMM3<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> 62-3-1<BR> 62-1-2<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> 67R<BR> -<BR> 67P<BR> -<BR> -<BR> -<BR> -<BR> 67X<BR> 63V<BR> 63S<BR> 63M<BR> -<BR> -<BR> 63H<BR> 63P<BR> -<BR> -<BR> 63X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> RJ/RJR50<BR> RJ/RJR50<BR> RJ/RJR50<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> </TR> </TABLE> <P>&nbsp;<P> <TABLE BORDER=0 CELLSPACING=1 CELLPADDING=3> <TR> <TD COLSPAN=7> <FONT color="#0000FF" SIZE=4 FACE=ARIAL><B>SMD TRIM-POT CROSS REFERENCE</B></FONT> <P> <FONT SIZE=4 FACE=ARIAL><B>MULTI-TURN</B></FONT> </TD> </TR> <TR> <TD> <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3224G<BR> 3224J<BR> 3224W<BR> 3269P<BR> 3269W<BR> 3269X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 44G<BR> 44J<BR> 44W<BR> 84P<BR> 84W<BR> 84X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> ST63Z<BR> ST63Y<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> ST5P<BR> ST5W<BR> ST5X<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> -<BR> -<BR> -<BR> -<BR></FONT> </TD> </TR> <TR> <TD COLSPAN=7>&nbsp; </TD> </TR> <TR> <TD COLSPAN=7> <FONT SIZE=4 FACE=ARIAL><B>SINGLE TURN</B></FONT> </TD> </TR> <TR> <TD> <FONT SIZE=3 FACE=ARIAL><B>BOURNS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>BI&nbsp;TECH</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>DALE-VISHAY</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PHILIPS/MEPCO</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>PANASONIC</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>TOCOS</B></FONT> </TD> <TD> <FONT SIZE=3 FACE=ARIAL><B>AUX/KYOCERA</B></FONT> </TD> </TR> <TR> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 3314G<BR> 3314J<BR> 3364A/B<BR> 3364C/D<BR> 3364W/X<BR> 3313G<BR> 3313J<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> 23B<BR> 23A<BR> 21X<BR> 21W<BR> -<BR> 22B<BR> 22A<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> ST5YL/ST53YL<BR> ST5YJ/5T53YJ<BR> ST-23A<BR> ST-22B<BR> ST-22<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> ST-4B<BR> ST-4A<BR> -<BR> -<BR> -<BR> ST-3B<BR> ST-3A<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> EVM-6YS<BR> EVM-1E<BR> EVM-1G<BR> EVM-1D<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> G4B<BR> G4A<BR> TR04-3S1<BR> TRG04-2S1<BR> -<BR> -<BR> -<BR></FONT> </TD> <TD BGCOLOR="#cccccc" ALIGN=CENTER><FONT FACE=ARIAL SIZE=3> -<BR> -<BR> DVR-43A<BR> CVR-42C<BR> CVR-42A/C<BR> -<BR> -<BR></FONT> </TD> </TR> </TABLE> <P> <FONT SIZE=4 FACE=ARIAL><B>ALT =&nbsp;ALTERNATE</B></FONT> <P> &nbsp; <P> </td> </tr> </table> <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> >NAME >VALUE <b>RESISTOR</b> wave soldering<p> >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b> >NAME >VALUE <b>RESISTOR</b><p> wave soldering >NAME >VALUE <b>RESISTOR</b><p> Source: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf >NAME >VALUE <b>RESISTOR</b> wave soldering<p> Source: http://download.siliconexpert.com/pdfs/2005/02/24/Semi_Ap/2/VSH/Resistor/dcrcwfre.pdf >NAME >VALUE <b>RESISTOR</b><p> MELF 0.10 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.25 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.12 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.10 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.25 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.25 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.12 W >NAME >VALUE <b>RESISTOR</b><p> MELF 0.25 W >NAME >VALUE <b>RESISTOR</b><p> type 0204, grid 5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0204, grid 7.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0207, grid 10 mm >NAME >VALUE <b>RESISTOR</b><p> type 0207, grid 12 mm >NAME >VALUE <b>RESISTOR</b><p> type 0207, grid 15mm >NAME >VALUE <b>RESISTOR</b><p> type 0207, grid 2.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0207, grid 5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0207, grid 7.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0309, grid 10mm >NAME >VALUE <b>RESISTOR</b><p> type 0309, grid 12.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0411, grid 12.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0411, grid 15 mm >NAME >VALUE <b>RESISTOR</b><p> type 0411, grid 3.81 mm >NAME >VALUE <b>RESISTOR</b><p> type 0414, grid 15 mm >NAME >VALUE <b>RESISTOR</b><p> type 0414, grid 5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0617, grid 17.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0617, grid 22.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0617, grid 5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0922, grid 22.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0613, grid 5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0613, grid 15 mm >NAME >VALUE <b>RESISTOR</b><p> type 0817, grid 22.5 mm >NAME >VALUE 0817 <b>RESISTOR</b><p> type 0817, grid 6.35 mm >NAME >VALUE 0817 <b>RESISTOR</b><p> type V234, grid 12.5 mm >NAME >VALUE <b>RESISTOR</b><p> type V235, grid 17.78 mm >NAME >VALUE <b>RESISTOR</b><p> type V526-0, grid 2.5 mm >NAME >VALUE <b>Mini MELF 0102 Axial</b> >NAME >VALUE <b>RESISTOR</b><p> type 0922, grid 7.5 mm >NAME >VALUE 0922 <b>CECC Size RC2211</b> Reflow Soldering<p> source Beyschlag >NAME >VALUE <b>CECC Size RC2211</b> Wave Soldering<p> source Beyschlag >NAME >VALUE <b>CECC Size RC3715</b> Reflow Soldering<p> source Beyschlag >NAME >VALUE <b>CECC Size RC3715</b> Wave Soldering<p> source Beyschlag >NAME >VALUE <b>CECC Size RC6123</b> Reflow Soldering<p> source Beyschlag >NAME >VALUE <b>CECC Size RC6123</b> Wave Soldering<p> source Beyschlag >NAME >VALUE <b>RESISTOR</b><p> type RDH, grid 15 mm >NAME >VALUE RDH <b>RESISTOR</b><p> type 0204, grid 2.5 mm >NAME >VALUE <b>RESISTOR</b><p> type 0309, grid 2.5 mm >NAME >VALUE <b>RESISTOR</b> chip<p> Source: http://www.vishay.com/docs/20008/dcrcw.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RNC55<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RNC60<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RBR52<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RBR53<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RBR54<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RBR55<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Bulk Metal® Foil Technology</b>, Tubular Axial Lead Resistors, Meets or Exceeds MIL-R-39005 Requirements<p> MIL SIZE RBR56<br> Source: VISHAY .. vta56.pdf >NAME >VALUE <b>Package 4527</b><p> Source: http://www.vishay.com/docs/31059/wsrhigh.pdf >NAME >VALUE <b>Wirewound Resistors, Precision Power</b><p> Source: VISHAY wscwsn.pdf >NAME >VALUE <b>Wirewound Resistors, Precision Power</b><p> Source: VISHAY wscwsn.pdf >NAME >VALUE <b>Wirewound Resistors, Precision Power</b><p> Source: VISHAY wscwsn.pdf >NAME >VALUE <b>Wirewound Resistors, Precision Power</b><p> Source: VISHAY wscwsn.pdf >NAME >VALUE <b>Wirewound Resistors, Precision Power</b><p> Source: VISHAY wscwsn.pdf >NAME >VALUE <b>Wirewound Resistors, Precision Power</b><p> Source: VISHAY wscwsn.pdf >NAME >VALUE <b>CRCW1218 Thick Film, Rectangular Chip Resistors</b><p> Source: http://www.vishay.com .. dcrcw.pdf >NAME >VALUE <b>Chip Monolithic Ceramic Capacitors</b> Medium Voltage High Capacitance for General Use<p> Source: http://www.murata.com .. GRM43DR72E224KW01.pdf >NAME >VALUE >NAME >VALUE <B>RESISTOR</B>, American symbol <b>Pin Header Connectors</b><p> <author>Created by librarian@cadsoft.de</author> <b>PIN HEADER</b> >NAME >VALUE >NAME >VALUE <b>PIN HEADER</b> ================================================ FILE: samples/Earthly/filenames/Earthfile ================================================ FROM openjdk:8-jdk-alpine RUN apk add --update --no-cache gradle WORKDIR /java-example deps: COPY build.gradle ./ RUN gradle build build: FROM +deps COPY src src RUN gradle build RUN gradle install SAVE ARTIFACT build/install/java-example/bin AS LOCAL build/bin SAVE ARTIFACT build/install/java-example/lib AS LOCAL build/lib docker: COPY +build/bin bin COPY +build/lib lib ENTRYPOINT ["/java-example/bin/java-example"] SAVE IMAGE --push earthly/examples:java ================================================ FILE: samples/Easybuild/bzip2-1.0.6-GCC-4.9.2.eb ================================================ # not really (there's an EB_bzip2 easyblock), but fine for use in unit tests easyblock = 'ConfigureMake' name = 'bzip2' version = '1.0.6' homepage = 'http://www.bzip.org/' description = """bzip2 is a freely available, patent free, high-quality data compressor. It typically compresses files to within 10% to 15% of the best available techniques (the PPM family of statistical compressors), whilst being around twice as fast at compression and six times faster at decompression.""" toolchain = {'name': 'GCC', 'version': '4.9.2'} toolchainopts = {'pic': True} sources = [SOURCE_TAR_GZ] source_urls = ['http://www.bzip.org/%(version)s'] builddependencies = [('gzip', '1.6')] moduleclass = 'tools' ================================================ FILE: samples/Ecmarkup/spec.html ================================================

    Introduction

    This is the formal specification for a proposed `Array.fromAsync` factory method in JavaScript. It modifies the original ECMAScript specification with several new or revised clauses. See the proposal's explainer for the proposal's background, motivation, and usage examples.

    Control Abstraction Objects

    Iteration

    Iterator Abstract Operations

    IfAbruptCloseAsyncIterator ( _value_, _iteratorRecord_ )

    IfAbruptCloseAsyncIterator is a shorthand for a sequence of algorithm steps that use an Iterator Record. An algorithm step of the form:

    1. IfAbruptCloseAsyncIterator(_value_, _iteratorRecord_).

    means the same thing as:

    1. If _value_ is an abrupt completion, then 1. Perform ? AsyncIteratorClose(_iteratorRecord_, _value_). 1. Return _value_. 1. Else if _value_ is a Completion Record, set _value_ to _value_.[[Value]].

    AsyncFunction Objects

    Async Functions Abstract Operations

    AsyncBlockStart ( _promiseCapability_: a PromiseCapability Record, _asyncBody_: a Parse Node or an Abstract Closure with no parameters, _asyncContext_: an execution context, )

    1. Assert: _promiseCapability_ is a PromiseCapability Record. 1. Let _runningContext_ be the running execution context. 1. [fence-effects="user-code"] Set the code evaluation state of _asyncContext_ such that when evaluation is resumed for that execution context the following steps will be performed: 1. If _asyncBody_ is a Parse Node, then 1. Let _result_ be the result of evaluating _asyncBody_. 1. Else, 1. Assert: _asyncBody_ is an Abstract Closure with no parameters. 1. Let _result_ be _asyncBody_(). 1. Let _result_ be the result of evaluating _asyncBody_. 1. Assert: If we return here, the async function either threw an exception or performed an implicit or explicit return; all awaiting is done. 1. Remove _asyncContext_ from the execution context stack and restore the execution context that is at the top of the execution context stack as the running execution context. 1. If _result_.[[Type]] is ~normal~, then 1. Perform ! Call(_promiseCapability_.[[Resolve]], *undefined*, « *undefined* »). 1. Else if _result_.[[Type]] is ~return~, then 1. Perform ! Call(_promiseCapability_.[[Resolve]], *undefined*, « _result_.[[Value]] »). 1. Else, 1. Assert: _result_.[[Type]] is ~throw~. 1. Perform ! Call(_promiseCapability_.[[Reject]], *undefined*, « _result_.[[Value]] »). 1. [id="step-asyncblockstart-return-undefined"] Return. 1. Push _asyncContext_ onto the execution context stack; _asyncContext_ is now the running execution context. 1. Resume the suspended evaluation of _asyncContext_. Let _result_ be the value returned by the resumed computation. 1. Assert: When we return here, _asyncContext_ has already been removed from the execution context stack and _runningContext_ is the currently running execution context. 1. Assert: _result_ is a normal completion with a value of *undefined*. The possible sources of completion values are Await or, if the async function doesn't await anything, step above. 1. Return.

    Indexed Collections

    Array Objects

    Properties of the Array Constructor

    Array.fromAsync ( _asyncItems_ [ , _mapfn_ [ , _thisArg_ ] ] )

    This section is a wholly new subsection of the original Properties of the Array Constructor clause, to be inserted before the Array.from clause.

    When the `fromAsync` method is called, the following steps are taken:

    1. Let _C_ be the *this* value. 1. Let _promiseCapability_ be ! NewPromiseCapability(%Promise%). 1. Let _fromAsyncClosure_ be a new Abstract Closure with no parameters that captures _C_, _mapfn_, and _thisArg_ and performs the following steps when called: 1. If _mapfn_ is *undefined*, let _mapping_ be *false*. 1. Else, 1. If IsCallable(_mapfn_) is *false*, throw a *TypeError* exception. 1. Let _mapping_ be *true*. 1. Let _usingAsyncIterator_ be ? GetMethod(_asyncItems_, @@asyncIterator). 1. If _usingAsyncIterator_ is *undefined*, then 1. Let _usingSyncIterator_ be ? GetMethod(_asyncItems_, @@iterator). 1. If IsConstructor(_C_) is *true*, then 1. Let _A_ be ? Construct(_C_). 1. Else, 1. Let _A_ be ! ArrayCreate(0). 1. Let _iteratorRecord_ be *undefined*. 1. If _usingAsyncIterator_ is not *undefined*, then 1. Set _iteratorRecord_ to ? GetIterator(_asyncItems_, ~async~, _usingAsyncIterator_). 1. Else if _usingSyncIterator_ is not *undefined*, then 1. Set _iteratorRecord_ to ? CreateAsyncFromSyncIterator(GetIterator(_asyncItems_, ~sync~, _usingSyncIterator_)). 1. If _iteratorRecord_ is not *undefined*, then 1. Let _k_ be 0. 1. Repeat, 1. If _k_ ≥ 253 - 1, then 1. Let _error_ be ThrowCompletion(a newly created *TypeError* object). 1. Return ? AsyncIteratorClose(_iteratorRecord_, _error_). 1. Let _Pk_ be ! ToString(𝔽(_k_)). 1. Let _next_ be ? Await(IteratorStep(_iteratorRecord_)). 1. If _next_ is *false*, then 1. Perform ? Set(_A_, *"length"*, 𝔽(_k_), *true*). 1. Return Completion Record { [[Type]]: ~return~, [[Value]]: _A_, [[Target]]: ~empty~ }. 1. Let _nextValue_ be ? IteratorValue(_next_). 1. If _mapping_ is *true*, then 1. Let _mappedValue_ be Call(_mapfn_, _thisArg_, « _nextValue_, 𝔽(_k_) »). 1. IfAbruptCloseAsyncIterator(_mappedValue_, _iteratorRecord_). 1. Set _mappedValue_ to Await(_mappedValue_). 1. IfAbruptCloseAsyncIterator(_mappedValue_, _iteratorRecord_). 1. Else, let _mappedValue_ be _nextValue_. 1. Let _defineStatus_ be CreateDataPropertyOrThrow(_A_, _Pk_, _mappedValue_). 1. If _defineStatus_ is an abrupt completion, return ? AsyncIteratorClose(_iteratorRecord_, _defineStatus_). 1. Set _k_ to _k_ + 1. 1. Else, 1. NOTE: _asyncItems_ is neither an AsyncIterable nor an Iterable so assume it is an array-like object. 1. Let _arrayLike_ be ! ToObject(_asyncItems_). 1. Let _len_ be ? LengthOfArrayLike(_arrayLike_). 1. If IsConstructor(_C_) is *true*, then 1. Let _A_ be ? Construct(_C_, « 𝔽(_len_) »). 1. Else, 1. Let _A_ be ? ArrayCreate(_len_). 1. Let _k_ be 0. 1. Repeat, while _k_ < _len_, 1. Let _Pk_ be ! ToString(𝔽(_k_)). 1. Let _kValue_ be ? Get(_arrayLike_, _Pk_). 1. Let _kValue_ be ? Await(_kValue_). 1. If _mapping_ is *true*, then 1. Let _mappedValue_ be ? Call(_mapfn_, _thisArg_, « _kValue_, 𝔽(_k_) »). 1. Let _mappedValue_ be ? Await(_mappedValue_). 1. Else, let _mappedValue_ be _kValue_. 1. Perform ? CreateDataPropertyOrThrow(_A_, _Pk_, _mappedValue_). 1. Set _k_ to _k_ + 1. 1. Perform ? Set(_A_, *"length"*, 𝔽(_len_), *true*). 1. Return Completion Record { [[Type]]: ~return~, [[Value]]: _A_, [[Target]]: ~empty~ }. 1. Perform AsyncFunctionStart(_promiseCapability_, _fromAsyncClosure_). 1. Return _promiseCapability_.[[Promise]].

    The `fromAsync` function is an intentionally generic factory method; it does not require that its *this* value be the Array constructor. Therefore it can be transferred to or inherited by any other constructors that may be called with a single numeric argument.

    ================================================ FILE: samples/Edge/pricing.edge ================================================ @layout({ title: "Your Ultimate Resource for AdonisJS Lessons and Videos", meta: { url: '/pricing', desc: `Take your AdonisJS skills to the next level with Adocasts. Our comprehensive video lessons cover everything from the basics to advanced topics. Join our community today and start learning!`, asset: null, index: true } }) @slot('hero')
    @!pricing.home()
    @endslot @section()
    Adocasts Plus @!heading({ subtitle: 'Features & Perks', class: 'text-center text-slate-base-100', })
    @!pricing.feature.card({ icon: 'ph:lock-open-fill', title: 'Unlock All Content', text: 'Unlock access to all series, lessons, plus any and all other content we release' }) @!pricing.feature.card({ icon: 'ph:clock-countdown-fill', title: '2 Weeks Early Access', text: "When we release free content, it's exclusive to our plus subscribers for two weeks" }) @!pricing.feature.card({ icon: 'ph:share-fat-fill', title: 'Shared Feed Posts', text: 'Recent feed posts are pooled for display across the Adocasts site' }) @pricing.feature.card({ icon: 'ph:barricade-fill', title: 'Ad Free Experience', }) You won't see any ads on the Adocasts site, not even your own (except in our ad portal) @end @!pricing.feature.card({ icon: 'ph:image-square-fill', title: 'Run Ads', text: 'Gain access to our ad portal to run advertisements across the Adocasts site' }) @!pricing.feature.card({ icon: 'ph:currency-dollar-simple-bold', title: 'Cancel Anytime', text: 'Reminders are sent a week prior to renewal, plus you can cancel anytime!' })
    @end @section()
    @!heading({ title: 'Not Ready?', size: 'sm' })

    No worries, we have plenty of free lessons too!

    @button({ variant: 'dark', href: route('auth.signup.create'), 'up-layer': 'new', 'up-size': 'grow' }) Get Started for Free @end
    robot mascot pointing right
    @end @section()
    @!heading({ title: 'Fequently Asked Questions', size: 'sm' })

    Is your question not listed? Feel free to reach out!

    @accordion() @accordion.item({ title: 'How can I cancel my subscription?' })

    You can cancel your subscription at any time within your billing settings. Once canceled you'll still have full access to Adocasts Plus until your current billing period is over. Once your billing period is over, you won't be charged again.

    @end @accordion.item({ title: 'What do I get with Adocasts Plus?' })

    With Adocasts Plus you'll get access to all of our lessons and series.

    Adocasts Plus members also enjoy 2 weeks early access to all our new lessons (excludes contributor lessons), meaning that when we do release a free lesson it'll be exclusive to Adocasts Plus members for the first 2 weeks.

    Additionally, Adocasts Plus is ad free! When you're browsing or watching the Adocasts site, we'll make sure you don't see any ads.

    @end @accordion.item({ title: 'Can I change plans at any time?' })

    Yep! Unless you're already on our forever plan, you can switch between the monthly, annual, or even opt into the forever plan at any time.

    When switching from our monthly to annual plan, any time remaining in your current billing period will be prorated.

    @end @accordion.item({ title: 'Do you offer student, purchase power parity, or other discounts?' })

    Our goal is to try to make learning AdonisJS as affordable as possible. Compared to others, we feel our pricing is already pretty low.

    That said, if you feel {{ plusMonthly.displayPrice }} per month is high for you, whether that's financially or due to unfair conversion rates, send us an email and we'll see what we can do.

    @end @end
    @end @end ================================================ FILE: samples/EdgeQL/default.esdl ================================================ module default { type Task { required property text -> str; required property completed -> bool{ default := false; }; } }; ================================================ FILE: samples/EdgeQL/migration.edgeql ================================================ CREATE MIGRATION m146naaaow4uwgbxpnjq5hyizixicxvg2ccpta24pxebzfn7xeppna ONTO initial { CREATE EXTENSION edgeql_http VERSION '1.0'; CREATE EXTENSION graphql VERSION '1.0'; CREATE TYPE default::Task { CREATE REQUIRED PROPERTY completed -> std::bool { SET default := false; }; CREATE REQUIRED PROPERTY text -> std::str; }; }; ================================================ FILE: samples/EditorConfig/ASP.NET.EditorConfig ================================================ # ASP.NET Core EditorConfig file # NOTE: This file focuses on settings Visual Studio 2017 supports natively. For example, VS does not support insert_final_newline. # We do use it, but it's harder to enforce without a separate VS extension or an editor that supports it. # See https://docs.microsoft.com/en-us/visualstudio/ide/create-portable-custom-editor-options for more # Mark this file as the "root" for everything below this point. This means that editor config files above # this file will be ignored root = true # Default settings [*] indent_style = space indent_size = 4 charset = utf-8 insert_final_newline = true # Unix-only files [*.sh] end_of_line = lf # 2-space files [{*.json,*.yml}] indent_size = 2 # .NET Code Style Settings # See https://docs.microsoft.com/en-us/visualstudio/ide/editorconfig-code-style-settings-reference # REVIEW: Should these be errors? warnings? suggestions? [{*.cs,*.vb}] dotnet_sort_system_directives_first = true # Don't use 'this.'/'Me.' prefix for anything dotnet_style_qualification_for_field = false:error dotnet_style_qualification_for_property = false:error dotnet_style_qualification_for_method = false:error dotnet_style_qualification_for_event = false:error # Use language keywords over framework type names for type references # i.e. prefer 'string' over 'String' dotnet_style_predefined_type_for_locals_parameters_members = true:error dotnet_style_predefined_type_for_member_access = true:error # Prefer object/collection initializers # This is a suggestion because there are cases where this is necessary dotnet_style_object_initializer = true:suggestion dotnet_style_collection_initializer = true:suggestion # C# 7: Prefer using named tuple names over '.Item1', '.Item2', etc. dotnet_style_explicit_tuple_names = true:error # Prefer using 'foo ?? bar' over 'foo != null ? foo : bar' dotnet_style_coalesce_expression = true:error # Prefer using '?.' over ternary null checking where possible dotnet_style_null_propagation = true:error # Use 'var' in all cases where it can be used csharp_style_var_for_built_in_types = true:error csharp_style_var_when_type_is_apparent = true:error csharp_style_var_elsewhere = true:error # C# 7: Prefer using pattern matching over "if(x is T) { var t = (T)x; }" and "var t = x as T; if(t != null) { ... }" # REVIEW: Since this is a new C# 7 feature that replaces an existing pattern, I'm making it a suggestion csharp_style_pattern_matching_over_is_with_cast_check = true:warning csharp_style_pattern_matching_over_as_with_null_check = true:warning # C# 7: Prefer using 'out var' where possible # REVIEW: Since this is a new C# 7 feature that replaces an existing pattern, I'm making it a suggestion csharp_style_inlined_variable_declaration = true:error # C# 7: Use throw expressions when null-checking # @davidfowl hates them :) csharp_style_throw_expression = false:error # Prefer using "func?.Invoke(args)" over "if(func != null) { func(args); }" # REVIEW: Maybe an error? csharp_style_conditional_delegate_call = true:error # Newline settings # Unsure where docs are. Got these from https://github.com/dotnet/roslyn/blob/master/.editorconfig csharp_new_line_before_open_brace = all csharp_new_line_before_else = true csharp_new_line_before_catch = true csharp_new_line_before_finally = true csharp_new_line_before_members_in_object_initializers = true csharp_new_line_before_members_in_anonymous_types = true # Prefer expression-bodied methods, constructors, operators, etc. csharp_style_expression_bodied_methods = true:suggestion csharp_style_expression_bodied_constructors = true:suggestion csharp_style_expression_bodied_operators = true:suggestion csharp_style_expression_bodied_properties = true:suggestion csharp_style_expression_bodied_indexers = true:suggestion csharp_style_expression_bodied_accessors = true:suggestion ================================================ FILE: samples/EditorConfig/IntelliJ.editorconfig ================================================ root = true [*] charset = utf-8 end_of_line = lf indent_style = tab insert_final_newline = true max_line_length = 120 tab_width = 4 ij_continuation_indent_size = 4 ij_formatter_off_tag = @formatter:off ij_formatter_on_tag = @formatter:on ij_formatter_tags_enabled = false ij_smart_tabs = false ij_wrap_on_typing = false [{*.cjs, *.js, *.karma}] ij_continuation_indent_size = 1 ij_javascript_align_imports = false ij_javascript_align_multiline_for = true ij_javascript_align_multiline_parameters = true ij_javascript_align_multiline_parameters_in_calls = false ij_javascript_align_multiline_ternary_operation = false ij_javascript_align_object_properties = 0 ij_javascript_align_union_types = false ij_javascript_align_var_statements = 1 ij_javascript_assignment_wrap = on_every_item ij_javascript_binary_operation_sign_on_next_line = false ij_javascript_binary_operation_wrap = off ij_javascript_blacklist_imports = rxjs/Rx, node_modules/**, **/node_modules/**, @angular/material, @angular/material/typings/** [{*.yaml, *.yml, _algolia_api_key}] indent_size = 2 ij_yaml_keep_indents_on_empty_lines = false ij_yaml_keep_line_breaks = true [{*.htm, *.html, *.sht, *.shtm, *.shtml}] ij_html_do_not_break_if_inline_tags = title, h1, h2, h3, h4, h5, h6, p ij_html_do_not_indent_children_of_tags = html, body, thead, tbody, tfoot ================================================ FILE: samples/EditorConfig/filenames/.editorconfig ================================================ ; editorconfig.org root = true [*] indent_style = space indent_size = 4 end_of_line = lf charset = utf-8 trim_trailing_whitespace = true insert_final_newline = true ================================================ FILE: samples/Edje Data Collection/mild.edc ================================================ // https://raw.githubusercontent.com/billiob/terminology/master/data/themes/mild.edc /* overlay to default to make theme easier on the eyes, less effects */ #ifndef BG_COLOR #define BG_COLOR 48 48 48 255 #endif #ifndef BG_COLOR_TRANSLUCENT #define BG_COLOR_TRANSLUCENT 48 48 48 200 #endif #ifndef BELL_OVERLAY_COLOR #define BELL_OVERLAY_COLOR 220 220 220 16 #endif collections { group { name: "terminology/background"; #ifndef INHERIT_PROVIDE_OWN_COLORS color_classes { #include "default_colors.in.edc" } #endif images { image: "bg_bevel.png" COMP; image: "bg_shine.png" COMP; image: "bg_glint.png" COMP; image: "bg_led_base.png" COMP; image: "bg_led.png" COMP; image: "bg_led_strobe.png" COMP; image: "pm_shadow.png" COMP; image: "pm_overlay.png" COMP; image: "pm_fill.png" COMP; image: "tab_bg_l0.png" COMP; image: "tab_bg_l1.png" COMP; image: "tab_bg_r0.png" COMP; image: "tab_bg_r1.png" COMP; image: "tab_shad_l0.png" COMP; image: "tab_shad_l1.png" COMP; image: "tab_shad_r0.png" COMP; image: "tab_shad_r1.png" COMP; } sounds { sample { name: "bell" LOSSY 64; source: "bell.wav"; } } script { public message(Msg_Type:type, id, ...) { new r, g, b, a, v; if ((type != MSG_INT) || (id != 1)) return; v = (getarg(2) * 255) / 100; custom_state(PART:"base", "default", 0.0); get_state_val(PART:"base", STATE_COLOR, r, g, b, a); set_state_val(PART:"base", STATE_COLOR, r, g, b, v); set_state(PART:"base", "custom", 0.0); custom_state(PART:"fade", "default", 0.0); get_state_val(PART:"fade", STATE_COLOR, r, g, b, a); set_state_val(PART:"fade", STATE_COLOR, r, g, b, v); set_state(PART:"fade", "custom", 0.0); } } parts { //////////////////////////////////////////////////////////////////// // background handling part { name: "focusclip"; type: RECT; clip_to: "bellclip"; description { state: "default" 0.0; } description { state: "unfocused" 0.0; color: 200 200 200 255; } } program { signal: "focus,in"; source: "terminology"; action: STATE_SET "default" 0.0; transition: ACCELERATE 0.1; target: "focusclip"; } program { signal: "focused,set"; source: "terminology"; action: STATE_SET "default" 0.0; target: "focusclip"; } program { signal: "focus,out"; source: "terminology"; action: STATE_SET "unfocused" 0.0; transition: ACCELERATE 0.1; target: "focusclip"; } part { name: "baseclip"; type: RECT; clip_to: "focusclip"; description { state: "default" 0.0; } description { state: "image" 0.0; inherit: "default" 0.0; color: 255 255 255 0; visible: 0; } description { state: "scale" 0.0; inherit: "default" 0.0; color: 255 255 255 0; visible: 0; } description { state: "edje" 0.0; inherit: "default" 0.0; color: 255 255 255 0; visible: 0; } description { state: "movie" 0.0; inherit: "default" 0.0; color: 255 255 255 0; visible: 0; } } part { name: "base"; type: RECT; mouse_events: 1; clip_to: "baseclip"; description { state: "default" 0.0; color: BG_COLOR; } } part { name: "fade"; type: RECT; description { state: "default" 0.0; } } part { name: "terminology.background"; type: SWALLOW; clip_to: "fade"; description { state: "default" 0.0; } description { state: "image" 0.0; inherit: "default" 0.0; } description { state: "scale" 0.0; inherit: "default" 0.0; } description { state: "edje" 0.0; inherit: "default" 0.0; } description { state: "movie" 0.0; inherit: "default" 0.0; } } program { name: "media_off"; signal: "media,off"; source: "terminology"; action: STATE_SET "default" 0.0; target: "terminology.background"; target: "baseclip"; } program { name: "media_img"; signal: "media,image"; source: "terminology"; action: STATE_SET "image" 0.0; target: "terminology.background"; target: "baseclip"; } program { name: "media_scale"; signal: "media,scale"; source: "terminology"; action: STATE_SET "scale" 0.0; target: "terminology.background"; target: "baseclip"; } program { name: "media_edje"; signal: "media,edje"; source: "terminology"; action: STATE_SET "edje" 0.0; target: "terminology.background"; target: "baseclip"; } program { name: "media_mov"; signal: "media,movie"; source: "terminology"; action: STATE_SET "movie" 0.0; target: "terminology.background"; target: "baseclip"; } part { name: "bellclip"; type: RECT; description { state: "default" 0.0; } description { state: "pulse1" 0.0; inherit: "default" 0.0; color: 200 200 200 255; } description { state: "pulse2" 0.0; inherit: "default" 0.0; } } part { name: "belloverlay"; type: RECT; mouse_events: 0; description { state: "default" 0.0; color: 255 255 255 0; visible: 0; } description { state: "pulse1" 0.0; inherit: "default" 0.0; } description { state: "pulse2" 0.0; inherit: "default" 0.0; color: BELL_OVERLAY_COLOR; visible: 1; } } program { signal: "bell,ring"; source: "terminology"; #if (EFL_VERSION_MAJOR > 1) || (EFL_VERSION_MINOR >= 9) action: PLAY_SAMPLE "bell" 1.0 ALERT; #else action: PLAY_SAMPLE "bell" 1.0; #endif } program { signal: "bell"; source: "terminology"; action: STATE_SET "default" 0.0; target: "bellclip"; target: "belloverlay"; after: "bellclip_bell.2"; } program { name: "bellclip_bell.2"; action: STATE_SET "pulse1" 0.0; transition: ACCELERATE 0.2; target: "bellclip"; target: "belloverlay"; after: "bellclip_bell.3"; } program { name: "bellclip_bell.3"; action: STATE_SET "pulse2" 0.0; transition: ACCELERATE 0.2; target: "bellclip"; target: "belloverlay"; after: "bellclip_bell.4"; } program { name: "bellclip_bell.4"; action: STATE_SET "default" 0.0; transition: ACCELERATE 0.2; target: "bellclip"; target: "belloverlay"; } //////////////////////////////////////////////////////////////////// // actual text grid for chars, cursors, selectiond etc. goes here part { name: "terminology.content"; type: SWALLOW; description { state: "default" 0.0; } } //////////////////////////////////////////////////////////////////// // indicator of other tabs and control part { name: "tabcount_clip"; type: RECT; description { state: "default" 0.0; color: 255 255 255 0; visible: 0; } description { state: "on" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; } } part { name: "terminology.tabmissed.label"; type: TEXT; mouse_events: 0; effect: GLOW; scale: 1; clip_to: "tabcount_clip"; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.tabcount.label"; rel2.to: "terminology.tabcount.label"; rel1.offset: -4 0; rel2.relative: 0.0 1.0; rel2.offset: -5 -1; color: 255 153 51 64; align: 1.0 0.5; text { font: "Sans"; size: 8; align: 1.0 0.5; min: 1 1; ellipsis: 0; } } description { state: "over" 0.0; inherit: "default" 0.0; color: 255 255 64 255; } } part { name: "terminology.tabcount.label"; type: TEXT; mouse_events: 0; scale: 1; clip_to: "tabcount_clip"; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.tabcount.control"; rel2.to: "terminology.tabcount.control"; rel1.relative: -0.2 0.0; rel2.relative: -0.2 1.0; color: 255 255 255 64; align: 1.0 0.5; text { font: "Sans"; size: 8; align: 1.0 0.5; min: 1 1; ellipsis: 0; } } description { state: "over" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } part { name: "tabcount_r0"; type: RECT; clip_to: "tabcount_clip"; description { state: "default" 0.0; rel1.to: "terminology.tabcount.control"; rel2.to: "terminology.tabcount.control"; rel1.relative: 0.05 0.05; rel2.relative: 0.45 0.45; color: 255 255 255 32; } description { state: "over" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } part { name: "tabcount_r1"; type: RECT; clip_to: "tabcount_clip"; description { state: "default" 0.0; rel1.to: "terminology.tabcount.control"; rel2.to: "terminology.tabcount.control"; rel1.relative: 0.55 0.05; rel2.relative: 0.95 0.45; color: 255 255 255 32; } description { state: "over" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } part { name: "tabcount_r2"; type: RECT; clip_to: "tabcount_clip"; description { state: "default" 0.0; rel1.to: "terminology.tabcount.control"; rel2.to: "terminology.tabcount.control"; rel1.relative: 0.05 0.55; rel2.relative: 0.45 0.95; color: 255 255 255 32; } description { state: "over" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } part { name: "tabcount_r3"; type: RECT; clip_to: "tabcount_clip"; description { state: "default" 0.0; rel1.to: "terminology.tabcount.control"; rel2.to: "terminology.tabcount.control"; rel1.relative: 0.55 0.55; rel2.relative: 0.95 0.95; color: 255 255 255 32; } description { state: "over" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } part { name: "terminology.tabcount.control"; type: SWALLOW; clip_to: "tabcount_clip"; description { state: "default" 0.0; fixed: 1 1; rel1.relative: 1.0 0.0; rel1.offset: -3 2; rel1.to: "viewregion"; rel2.relative: 1.0 0.0; rel2.offset: -3 2; rel2.to: "viewregion"; align: 1.0 0.0; min: 16 16; } } part { name: "tabcount_ev"; type: RECT; repeat_events: 1; clip_to: "tabcount_clip"; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.tabcount.control"; rel2.to: "terminology.tabcount.control"; color: 0 0 0 0; } } part { name: "terminology.tabregion"; type: SWALLOW; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.content"; rel2.to: "viewregion"; rel2.relative: 1.0 0.0; } } part { name: "viewregion"; type: SWALLOW; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.content"; rel2.to: "terminology.content"; } description { state: "tab" 0.0; inherit: "default" 0.0; rel1.to_y: "tabmiddle"; rel1.relative: 0.0 1.0; } } program { signal: "mouse,in"; source: "tabcount_ev"; action: STATE_SET "over" 0.0; transition: DECELERATE 0.5; target: "tabcount_r0"; target: "tabcount_r1"; target: "tabcount_r2"; target: "tabcount_r3"; target: "terminology.tabcount.label"; target: "terminology.tabmissed.label"; } program { signal: "mouse,out"; source: "tabcount_ev"; action: STATE_SET "default" 0.0; transition: DECELERATE 2.0; target: "tabcount_r0"; target: "tabcount_r1"; target: "tabcount_r2"; target: "tabcount_r3"; target: "terminology.tabcount.label"; target: "terminology.tabmissed.label"; } program { signal: "mouse,clicked,1"; source: "tabcount_ev"; action: SIGNAL_EMIT "tabcount,go" "terminology"; } program { signal: "tabcount,off"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.5; target: "tabcount_clip"; } program { signal: "tabcount,on"; source: "terminology"; action: STATE_SET "on" 0.0; transition: DECELERATE 0.5; target: "tabcount_clip"; } program { signal: "tabmissed,off"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.5; target: "terminology.tabmissed.label"; } program { signal: "tabmissed,on"; source: "terminology"; action: STATE_SET "over" 0.0; transition: DECELERATE 0.2; target: "terminology.tabmissed.label"; after: "tabmissed2"; } program { name: "tabmissed2"; signal: "tabmissed,on"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 3.0; target: "terminology.tabmissed.label"; } //////////////////////////////////////////////////////////////////// // miniview part { name: "terminology.miniview"; type: SWALLOW; description { state: "default" 0.0; rel1.to_x: "terminology.content"; rel1.to_y: "viewregion"; rel2.to: "terminology.content"; //color: 255 255 255 0; visible: 0; fixed: 1 1; } description { state: "on" 0.0; inherit: "default" 0.0; visible: 1; //color: 255 255 255 255; } } program { signal: "miniview,off"; source: "terminology"; action: STATE_SET "default" 0.0; target: "terminology.miniview"; } program { signal: "miniview,on"; source: "terminology"; action: STATE_SET "on" 0.0; target: "terminology.miniview"; } part { name: "tab_bevel_bg0"; mouse_events: 0; description { state: "default" 0.0; rel1.to: "tableft"; rel2.to_y: "tableft"; rel2.to_x: "tab_bevel_bg1"; rel2.relative: 0.0 1.0; image.normal: "tab_bg_l0.png"; image.border: 2 0 4 4; fill.smooth: 0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "tab_bevel_bg1"; mouse_events: 0; description { state: "default" 0.0; rel1.to: "tabmiddle"; rel1.offset: -4 0; rel2.to: "tabmiddle"; align: 0.0 0.0; max: 12 99999; min: 12 0; image.normal: "tab_bg_l1.png"; image.border: 0 0 4 4; fill.smooth: 0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "tab_bevel_bg2"; type: SPACER; description { state: "default" 0.0; rel1.to: "tab_bevel_bg1"; rel1.relative: 1.0 0.0; rel2.to: "tab_bevel_bg3"; rel2.relative: 0.0 1.0; fixed: 1 1; } } part { name: "tab_bevel_bg3"; mouse_events: 0; description { state: "default" 0.0; rel1.to: "tabmiddle"; rel2.to: "tabmiddle"; rel2.offset: 3 -1; align: 1.0 0.0; max: 12 99999; min: 12 0; image.normal: "tab_bg_r1.png"; image.border: 0 0 4 4; fill.smooth: 0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "tab_bevel_bg4"; mouse_events: 0; description { state: "default" 0.0; rel1.to_y: "tabright"; rel1.to_x: "tab_bevel_bg3"; rel1.relative: 1.0 0.0; rel2.to: "tabright"; image.normal: "tab_bg_r0.png"; image.border: 0 2 4 4; fill.smooth: 0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "terminology.tabl.content"; type: SWALLOW; description { state: "default" 0.0; rel1.to: "tableft"; rel2.to: "tableft"; fixed: 1 1; } } part { name: "terminology.tabr.content"; type: SWALLOW; description { state: "default" 0.0; rel1.to: "tabright"; rel2.to: "tabright"; fixed: 1 1; } } //////////////////////////////////////////////////////////////////// // a swallow to hold a finger size rect for min tab size program { signal: "tabbar,on"; source: "terminology"; action: STATE_SET "tab" 0.0; target: "viewregion"; target: "tableft"; target: "tabmiddle"; target: "tabright"; target: "tab_bevel_bg0"; target: "tab_bevel_bg1"; target: "tab_bevel_bg3"; target: "tab_bevel_bg4"; target: "tabtitle"; } program { signal: "tabbar,off"; source: "terminology"; action: STATE_SET "default" 0.0; target: "viewregion"; target: "tableft"; target: "tabmiddle"; target: "tabright"; target: "tab_bevel_bg0"; target: "tab_bevel_bg1"; target: "tab_bevel_bg3"; target: "tab_bevel_bg4"; target: "tabtitle"; } part { name: "terminology.tab"; type: SWALLOW; mouse_events: 0; description { state: "default" 0.0; rel1.relative: 1.0 0.0; rel1.to_x: "terminology.tabl"; rel2.relative: 0.0 0.0; rel2.to_x: "terminology.tabr"; align: 0.5 0.0; visible: 0; fixed: 1 1; } } // some slot for dragable parts to stayt in along top edge of bg part { name: "tabdrag"; type: SPACER; description { state: "default" 0.0; rel2.relative: 1.0 0.0; fixed: 1 1; } } // left boundary of the active tab (ragable 0.0 -> 1.0) part { name: "terminology.tabl"; type: SPACER; dragable.x: 1 1 0; dragable.confine: "tabdrag"; description { state: "default" 0.0; rel2.relative: 1.0 0.0; max: 1 1; fixed: 1 1; } } // right boundary of the active tab (ragable 0.0 -> 1.0) part { name: "terminology.tabr"; type: SPACER; dragable.x: 1 1 0; dragable.confine: "tabdrag"; description { state: "default" 0.0; rel2.relative: 1.0 0.0; max: 1 1; fixed: 1 1; } } part { name: "terminology.tab.title"; type: TEXT; mouse_events: 0; scale: 1; effect: SOFT_SHADOW BOTTOM; mouse_events: 0; description { state: "default" 0.0; color: 255 255 255 255; color3: 0 0 0 18; text { font: "Sans:style=Bold"; size: 10; align: 0.5 0.0; min: 0 1; } align: 0.5 0.0; rel1.to_x: "tab_bevel_bg2"; rel1.offset: 0 2; rel2.to_x: "tab_bevel_bg2"; rel2.offset: -1 2; rel2.relative: 1.0 0.0; visible: 0; fixed: 1 1; } } part { name: "tabtitle"; type: TEXT; mouse_events: 0; scale: 1; mouse_events: 0; description { state: "default" 0.0; color: 255 255 255 255; text { font: "Sans:style=Bold"; size: 10; align: 0.5 0.5; min: 0 1; text_source: "terminology.tab.title"; } align: 0.5 0.5; rel1.to_x: "tab_bevel_bg2"; rel1.to_y: "tabmiddle"; rel2.to_x: "tab_bevel_bg2"; rel2.to_y: "tabmiddle"; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "tablimit0"; type: SPACER; description { state: "default" 0.0; rel1.to_y: "terminology.tab"; rel1.relative: 0.0 1.0; rel2.to_y: "terminology.tab.title"; align: 0.0 0.0; fixed: 1 1; } } part { name: "tableft"; type: RECT; mouse_events: 0; description { state: "default" 0.0; rel2.to_x: "terminology.tab"; rel2.to_y: "tabmiddle"; rel2.relative: 0.0 1.0; color: 0 0 0 0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "tabright"; type: RECT; mouse_events: 0; description { state: "default" 0.0; rel1.to: "terminology.tab"; rel1.relative: 1.0 0.0; rel2.to_y: "tabmiddle"; color: 0 0 0 0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "tabmiddle"; type: RECT; description { state: "default" 0.0; rel1.to: "terminology.tab"; rel2.to_x: "terminology.tab"; rel2.to_y: "tablimit0"; rel2.offset: -1 0; color: 0 0 0 0; align: 0.0 0.0; visible: 0; fixed: 1 1; } description { state: "tab" 0.0; inherit: "default" 0.0; visible: 1; } } //////////////////////////////////////////////////////////////////// // a place terminology will place an entry box for internal commands part { name: "cmdclip"; type: RECT; description { state: "default" 0.0; color: 255 255 255 255; rel1.to: "terminology.cmdbox"; rel1.offset: -100 -100; rel2.to: "terminology.cmdbox"; rel2.offset: 99 99; color: 255 255 255 0; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; color: 255 255 255 255; visible: 1; } } part { name: "cmdback"; type: RECT; clip_to: "cmdclip"; description { state: "default" 0.0; color: 255 255 255 255; rel1.to: "terminology.cmdbox"; rel1.offset: -2 -2; rel2.to: "terminology.cmdbox"; rel2.offset: 1 1; } } part { name: "terminology.cmdbox"; type: SWALLOW; clip_to: "cmdclip"; description { state: "default" 0.0; fixed: 1 1; min: 8 8; rel1.relative: 0.0 1.0; rel1.offset: 8 9; rel2.offset: -9 9; align: 0.5 0.0; } description { state: "visible" 0.0; inherit: "default" 0.0; rel1.offset: 8 -9; rel2.offset: -9 -9; align: 0.5 1.0; } } program { name: "cmdshow0"; signal: "cmdbox,show"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.4; target: "cmdclip"; } program { name: "cmdshow"; signal: "cmdbox,show"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: SPRING 0.4 0.5 4; target: "terminology.cmdbox"; } program { name: "cmdhide"; signal: "cmdbox,hide"; source: "terminology"; action: STATE_SET "default" 0.0; transition: ACCELERATE 0.5; target: "terminology.cmdbox"; target: "cmdclip"; } //////////////////////////////////////////////////////////////////// // visual bell - spinning red siren light part { name: "bell_base"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; min: 32 32; max: 32 32; rel2.offset: -1 -1; align: 1.0 1.0; image.normal: "bg_led_base.png"; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; } } part { name: "bell"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; rel1.to: "bell_base"; rel2.to: "bell_base"; image.normal: "bg_led.png"; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; } } part { name: "bell_strobe"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; rel1.to: "bell"; rel2.to: "bell"; image.normal: "bg_led_strobe.png"; map { on: 1; smooth: 1; rotation.center: "bell"; } } description { state: "spin" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; map.rotation.z: 36.0; } description { state: "spin_done" 0.0; inherit: "default" 0.0; visible: 0; color: 255 255 255 0; map.rotation.z: 684.0; } } program { name: "bell0"; signal: "bell"; source: "terminology"; action: STATE_SET "default" 0.0; target: "bell_base"; target: "bell"; target: "bell_strobe"; after: "bell"; } program { name: "bell"; action: STATE_SET "visible" 0.0; target: "bell_base"; after: "bell2"; } program { name: "bell2"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.1; target: "bell"; after: "bell3"; } program { name: "bell3"; action: STATE_SET "spin" 0.0; transition: LINEAR 0.1; target: "bell_strobe"; after: "bell4.0"; after: "bell4.1"; after: "bell4.2"; } program { name: "bell4.0"; action: STATE_SET "default" 0.0; transition: ACCELERATE 1.2; target: "bell"; } program { name: "bell4.1"; action: STATE_SET "default" 0.0; transition: ACCELERATE 1.6; target: "bell_base"; } program { name: "bell4.2"; action: STATE_SET "spin_done" 0.0; transition: LINEAR 0.9; target: "bell_strobe"; } //////////////////////////////////////////////////////////////////// // popup media over the terminal (until dismissed) part { name: "popmedia_clip"; type: RECT; mouse_events: 1; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; } } part { name: "popmedia_shadow"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1 { to: "terminology.popmedia"; } rel2 { to: "terminology.popmedia"; } image.normal: "pm_shadow.png"; image.border: 64 64 64 64; image.border_scale_by: 0.1; fill.smooth: 0; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; rel1.offset: -32 -32; rel2.offset: 31 31; image.border_scale_by: 1.0; visible: 1; } } part { name: "popmedia_fill"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.popmedia"; rel2.to: "terminology.popmedia"; image.normal: "pm_fill.png"; fill { size.relative: 0.0 0.0; size.offset: 64 64; } } } part { name: "terminology.popmedia"; type: SWALLOW; clip_to: "popmedia_clip"; description { state: "default" 0.0; fixed: 1 1; rel1.relative: 0.5 0.5; rel2.relative: 0.5 0.5; visible: 0; } description { state: "image" 0.0; inherit: "default" 0.0; rel1.relative: 0.1 0.1; rel2.relative: 0.9 0.9; visible: 1; } description { state: "scale" 0.0; inherit: "default" 0.0; rel1.relative: 0.1 0.1; rel2.relative: 0.9 0.9; visible: 1; } description { state: "edje" 0.0; inherit: "default" 0.0; rel1.relative: 0.1 0.1; rel2.relative: 0.9 0.9; visible: 1; } description { state: "movie" 0.0; inherit: "default" 0.0; rel1.relative: 0.1 0.1; rel2.relative: 0.9 0.9; visible: 1; } } part { name: "popmedia_overlay"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.popmedia"; rel2.to: "terminology.popmedia"; image.normal: "pm_overlay.png"; fill.smooth: 0; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "popmedia_bevel"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.popmedia"; rel2.to: "terminology.popmedia"; image.normal: "bg_bevel.png"; image.border: 3 3 5 3; image.middle: 0; fill.smooth: 0; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "popmedia_glintclip"; type: RECT; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "popmedia_glint"; mouse_events: 0; clip_to: "popmedia_glintclip"; description { state: "default" 0.0; fixed: 1 1; min: 79 5; max: 79 5; rel1 { to: "terminology.popmedia"; relative: 0.0 0.0; offset: 0 0; } rel2 { to: "terminology.popmedia"; relative: 1.0 0.0; offset: -1 0; } image.normal: "bg_glint.png"; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "popmedia_shine"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.popmedia"; rel2.to: "terminology.popmedia"; image.normal: "bg_shine.png"; fill.smooth: 0; align: 0.5 0.0; aspect: (255/120) (255/120); aspect_preference: HORIZONTAL; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; } } part { name: "popmedia_dismiss"; type: RECT; mouse_events: 1; description { state: "default" 0.0; fixed: 1 1; color: 0 0 0 0; visible: 0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; } } program { name: "popmedia_dismiss"; signal: "mouse,clicked,*"; source: "popmedia_dismiss"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.5; target: "terminology.popmedia"; target: "popmedia_clip"; target: "popmedia_dismiss"; target: "popmedia_shadow"; target: "popmedia_fill"; target: "popmedia_overlay"; target: "popmedia_bevel"; target: "popmedia_glint"; target: "popmedia_glintclip"; target: "popmedia_shine"; after: "popmedia_dismiss2"; } program { name: "popmedia_dismiss2"; action: SIGNAL_EMIT "popmedia,done" "terminology"; } program { name: "popmedia_off"; signal: "popmedia,off"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.2; target: "terminology.popmedia"; target: "popmedia_clip"; target: "popmedia_dismiss"; target: "popmedia_shadow"; target: "popmedia_fill"; target: "popmedia_overlay"; target: "popmedia_bevel"; target: "popmedia_glint"; target: "popmedia_glintclip"; target: "popmedia_shine"; after: "popmedia_dismiss2"; } program { name: "popmedia_img"; signal: "popmedia,image"; source: "terminology"; action: STATE_SET "image" 0.0; transition: DECELERATE 0.2; target: "terminology.popmedia"; } program { name: "popmedia_scale"; signal: "popmedia,scale"; source: "terminology"; action: STATE_SET "scale" 0.0; transition: DECELERATE 0.2; target: "terminology.popmedia"; } program { name: "popmedia_edje"; signal: "popmedia,edje"; source: "terminology"; action: STATE_SET "edje" 0.0; transition: DECELERATE 0.2; target: "terminology.popmedia"; } program { name: "popmedia_mov"; signal: "popmedia,movie"; source: "terminology"; action: STATE_SET "movie" 0.0; transition: DECELERATE 0.2; target: "terminology.popmedia"; } program { name: "popmedia_img2"; signal: "popmedia,image"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.2; target: "popmedia_clip"; target: "popmedia_dismiss"; target: "popmedia_shadow"; target: "popmedia_fill"; target: "popmedia_overlay"; target: "popmedia_bevel"; target: "popmedia_glint"; target: "popmedia_glintclip"; target: "popmedia_shine"; } program { name: "popmedia_scale2"; signal: "popmedia,scale"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.2; target: "popmedia_clip"; target: "popmedia_dismiss"; target: "popmedia_shadow"; target: "popmedia_fill"; target: "popmedia_overlay"; target: "popmedia_bevel"; target: "popmedia_glint"; target: "popmedia_glintclip"; target: "popmedia_shine"; } program { name: "popmedia_edje2"; signal: "popmedia,edje"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.2; target: "popmedia_clip"; target: "popmedia_dismiss"; target: "popmedia_shadow"; target: "popmedia_fill"; target: "popmedia_overlay"; target: "popmedia_bevel"; target: "popmedia_glint"; target: "popmedia_glintclip"; target: "popmedia_shine"; } program { name: "popmedia_mov2"; signal: "popmedia,movie"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.2; target: "popmedia_clip"; target: "popmedia_dismiss"; target: "popmedia_shadow"; target: "popmedia_fill"; target: "popmedia_overlay"; target: "popmedia_bevel"; target: "popmedia_glint"; target: "popmedia_glintclip"; target: "popmedia_shine"; } //////////////////////////////////////////////////////////////////// // overlayed options and controls part { name: "terminology.about"; type: SWALLOW; scale: 1; description { state: "default" 0.0; fixed: 1 1; min: 198 198; max: 198 198; align: 0.5 0.0; visible: 0; rel1.relative: 0.0 1.0; rel2.relative: 1.0 1.0; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; align: 0.5 0.5; rel1.relative: 0.0 0.0; rel2.relative: 1.0 1.0; } } program { name: "ab_show"; signal: "about,show"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: SPRING 1.2 2.0 6; target: "terminology.about"; } program { name: "ab_hide"; signal: "about,hide"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.6; target: "terminology.about"; } //////////////////////////////////////////////////////////////////// // swallow to hold invisile rect to click on to dismiss things part { name: "terminology.dismiss"; type: SWALLOW; description { state: "default" 0.0; } } //////////////////////////////////////////////////////////////////// // overlayed options and controls part { name: "terminology.optdetails"; type: SWALLOW; scale: 1; description { state: "default" 0.0; fixed: 1 1; min: 40 40; align: 0.0 0.5; visible: 0; rel1 { relative: 1.0 0.02; offset: 2 2; } rel2 { relative: 1.0 0.98; offset: 2 -3; } } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; align: 1.0 0.5; rel1 { relative: 0.1 0.02; offset: 2 2; } rel2 { to_x: "terminology.options"; relative: 0.0 0.98; offset: -3 -3; } } } program { name: "opdt_show"; signal: "optdetails,show"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.4; target: "terminology.optdetails"; } program { name: "opdt_hide"; signal: "optdetails,hide"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.2; target: "terminology.optdetails"; after: "opdt_hide2"; } program { name: "opdt_hide2"; action: SIGNAL_EMIT "optdetails,hide,done" "terminology"; } part { name: "terminology.options"; type: SWALLOW; scale: 1; description { state: "default" 0.0; fixed: 1 1; align: 0.0 0.5; visible: 0; rel1.relative: 1.0 0.02; rel2 { relative: 1.0 0.98; offset: -3 -3; } } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; align: 1.0 0.5; rel1 { offset: -3 2; } rel2 { offset: -3 -3; } } } program { name: "op_show"; signal: "options,show"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.4; target: "terminology.options"; } program { name: "op_hide"; signal: "options,hide"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.6; target: "terminology.options"; } part { name: "terminology.controls"; type: SWALLOW; scale: 1; description { state: "default" 0.0; fixed: 1 1; min: 100 100; align: 0.0 1.0; visible: 0; rel1.relative: 1.0 1.0; rel2.relative: 1.0 1.0; } description { state: "visible" 0.0; inherit: "default" 0.0; align: 1.0 1.0; rel1.offset: -3 -3; rel2.offset: -3 -3; visible: 1; } } program { name: "ct_show"; signal: "controls,show"; source: "terminology"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.3; target: "terminology.controls"; } program { name: "ct_hide"; signal: "controls,hide"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.5; target: "terminology.controls"; } } } group { name: "terminology/tabbar_back"; images { image: "tab_other_l.png" COMP; image: "tab_other_m.png" COMP; image: "tab_other_r.png" COMP; image: "tab_shad_l2.png" COMP; image: "tab_shad_r2.png" COMP; } parts { part { name: "tab_bevel_shad1"; mouse_events: 0; clip_to: "clip"; description { state: "default" 0.0; rel1.to: "tab_base_top1"; rel2.to: "tab_base_top1"; image.normal: "tab_shad_l2.png"; image.border: 0 0 10 10; fill.smooth: 0; } } part { name: "tab_bevel_shad3"; mouse_events: 0; clip_to: "clip"; description { state: "default" 0.0; rel1.to: "tab_base_top3"; rel2.to: "tab_base_top3"; image.normal: "tab_shad_r2.png"; image.border: 0 0 10 10; fill.smooth: 0; } } part { name: "tab_base_top1"; mouse_events: 0; clip_to: "clip"; description { state: "default" 0.0; align: 0.0 0.0; rel1.offset: -4 0; max: 12 99999; min: 12 0; image.normal: "tab_other_l.png"; image.border: 0 0 4 4; fill.smooth: 0; } } part { name: "tab_base_top2"; mouse_events: 0; clip_to: "clip"; description { state: "default" 0.0; rel1.to: "tab_base_top1"; rel1.relative: 1.0 0.0; rel2.to: "tab_base_top3"; rel2.relative: 0.0 1.0; image.normal: "tab_other_m.png"; image.border: 0 0 4 4; fill.smooth: 0; } } part { name: "tab_base_top3"; mouse_events: 0; clip_to: "clip"; description { state: "default" 0.0; align: 1.0 0.0; rel2.offset: 3 -1; max: 12 99999; min: 12 0; image.normal: "tab_base_r1.png"; image.normal: "tab_other_r.png"; image.border: 0 0 4 4; fill.smooth: 0; } } part { name: "terminology.title"; type: TEXT; mouse_events: 0; scale: 1; description { state: "default" 0.0; text { font: "Sans:style=Bold"; size: 10; align: 0.5 0.5; min: 0 1; } align: 0.5 0.5; color: 96 96 96 255; rel1.to: "tab_base_top2"; rel2.to: "tab_base_top2"; } } part { name: "clip"; type: RECT; description { state: "default" 0.0; rel2.offset: -1 -2; } } part { name: "event"; type: RECT; description { state: "default" 0.0; color: 0 0 0 0; } } program { signal: "mouse,clicked,1"; source: "event"; action: SIGNAL_EMIT "tab,activate" "terminology"; } } } ////////////////////////////////////////////////////////////////////////////// //// the cursor to show where text is typed group { name: "terminology/cursor"; images { image: "cr_key.png" COMP; image: "cr_out.png" COMP; } sounds { sample { name: "key-tap1" LOSSY 64; source: "kbd-tap.wav"; } sample { name: "key-tap2" LOSSY 64; source: "kbd-tap2.wav"; } sample { name: "key-tap3" LOSSY 64; source: "kbd-tap3.wav"; } sample { name: "key-tap4" LOSSY 64; source: "kbd-tap4.wav"; } sample { name: "key-tap5" LOSSY 64; source: "kbd-tap5.wav"; } } parts { part { name: "pulsclip"; type: RECT; description { state: "default" 0.0; } description { state: "pulse" 0.0; color: 255 255 255 80; } } part { name: "key"; mouse_events: 0; description { state: "default" 0.0; rel1 { to: "outline"; offset: -5 -5; } rel2 { to: "outline"; offset: 4 4; } image { normal: "cr_key.png"; border: 4 4 4 4; } color: 255 255 255 0; } description { state: "on" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } description { state: "out" 0.0; inherit: "default" 0.0; color: 160 100 255 0; } } part { name: "outline"; mouse_events: 0; clip_to: "pulsclip"; description { state: "default" 0.0; image { normal: "cr_out.png"; border: 3 3 3 3; } color: 255 255 255 64; } description { state: "focused" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } programs { program { name: "focus_in_noblink"; signal: "focus,in,noblink"; source: "terminology"; action: STATE_SET "focused" 0.0; target: "outline"; } program { name: "focus_in"; signal: "focus,in"; source: "terminology"; action: STATE_SET "focused" 0.0; target: "outline"; after: "pulse-prepare"; } program { name: "pulse-prepare"; action: STATE_SET "default" 0.0; target: "pulsclip"; after: "pulse"; } program { name: "pulse"; action: STATE_SET "pulse" 0.0; transition: DECELERATE 0.5; target: "pulsclip"; after: "pulse2"; } program { name: "pulse2"; action: STATE_SET "default" 0.0; in: 1.5 0.0; transition: DECELERATE 0.5; target: "pulsclip"; after: "pulse"; } program { name: "focus_out"; signal: "focus,out"; source: "terminology"; action: ACTION_STOP; target: "focus_in"; target: "pulse"; target: "pulse2"; after: "focus_out2"; } program { name: "focus_out2"; action: STATE_SET "default" 0.0; target: "outline"; target: "pulsclip"; } program { signal: "key,down"; source: "terminology"; script { #if (EFL_VERSION_MAJOR > 1) || (EFL_VERSION_MINOR >= 8) new buf[32]; snprintf(buf, 31, "key-down%i", (rand() % 5) + 1); run_program(get_program_id(buf)); #else run_program(PROGRAM:"key-down4"); // chosen by a fair dice roll // guaranteed to be random. // http://xkcd.com/221/ #endif } } program { name: "key-down1"; action: PLAY_SAMPLE "key-tap1" 1.0; } program { name: "key-down2"; action: PLAY_SAMPLE "key-tap2" 1.0; } program { name: "key-down3"; action: PLAY_SAMPLE "key-tap3" 1.0; } program { name: "key-down4"; action: PLAY_SAMPLE "key-tap4" 1.0; } program { name: "key-down5"; action: PLAY_SAMPLE "key-tap5" 1.0; } program { name: "key"; signal: "key,down"; source: "terminology"; action: STATE_SET "default" 0.0; target: "key"; after: "key2"; } program { name: "key2"; action: STATE_SET "on" 0.0; target: "key"; after: "key3"; } program { name: "key3"; action: STATE_SET "out" 0.0; transition: DECELERATE 0.3; target: "key"; } } } } ////////////////////////////////////////////////////////////////////////////// //// an object to contain the selection tool used for selecting tabs (with //// a glow grid of terms group { name: "terminology/sel/base"; images { image: "pm_fill.png" COMP; } script { public message(Msg_Type:type, id, ...) { if ((type != MSG_INT) || (id != 1)) return; if (getarg(2) < 100) set_state(PART:"fill", "translucent", 0.0); else set_state(PART:"fill", "default", 0.0); } } parts { //////////////////////////////////////////////////////////////////// // background and shadows part { name: "fill"; mouse_events: 0; description { state: "default" 0.0; image.normal: "pm_fill.png"; fill { size.relative: 0.0 0.0; size.offset: 64 64; } } description { state: "translucent" 0.0; inherit: "default" 0.0; visible: 0; } } program { signal: "translucent,on"; source: "terminology"; action: STATE_SET "translucent" 0.0; target: "fill"; } program { signal: "translucent,off"; source: "terminology"; action: STATE_SET "default" 0.0; target: "fill"; } //////////////////////////////////////////////////////////////////// // content (where the grid of terms goes) part { name: "clip"; type: RECT; description { state: "default" 0.0; } } part { name: "terminology.content"; type: SWALLOW; clip_to: "clip"; description { state: "default" 0.0; } } } } group { name: "terminology/sel/item"; images { image: "bg_bevel.png" COMP; image: "pm_shadow.png" COMP; image: "cr_glow.png" COMP; image: "bg_led_base.png" COMP; image: "bg_led.png" COMP; image: "bg_led_strobe.png" COMP; } parts { //////////////////////////////////////////////////////////////////// // base background and selection image part { name: "clip"; type: RECT; description { state: "default" 0.0; rel1.to: "terminology.content"; rel2.to: "terminology.content"; color: 128 128 128 255; } description { state: "selected" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } part { name: "shadow"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.content"; rel2.to: "terminology.content"; rel1.offset: -5 -5; rel2.offset: 4 4; image.normal: "pm_shadow.png"; image.border: 64 64 64 64; image.border_scale_by: 0.1; color: 255 255 255 128; fill.smooth: 0; } description { state: "selected" 0.0; inherit: "default" 0.0; rel1.offset: -40 -40; rel2.offset: 39 39; image.border_scale_by: 1.0; color: 255 255 255 255; } } part { name: "glow"; mouse_events: 0; description { state: "default" 0.0; rel1.to: "terminology.content"; rel2.to: "terminology.content"; rel1.offset: -4 -4; rel2.offset: 3 3; image { normal: "cr_glow.png"; border: 9 9 9 9; } color: 255 255 255 0; } description { state: "selected" 0.0; inherit: "default" 0.0; color: 255 255 255 255; } } //////////////////////////////////////////////////////////////////// // swallowed terminal content + bg inside it part { name: "base"; type: RECT; clip_to: "clip"; description { state: "default" 0.0; color: BG_COLOR; rel1.to: "terminology.content"; rel2.to: "terminology.content"; } } part { name: "terminology.content"; type: SWALLOW; clip_to: "clip"; description { state: "default" 0.0; rel1.relative: 0.1 0.1; rel2.relative: 0.9 0.9; } description { state: "selected" 0.0; inherit: "default" 0.0; rel1.relative: 0.0 0.0; rel2.relative: 1.0 1.0; } } program { signal: "selected"; source: "terminology"; action: STATE_SET "selected" 0.0; transition: DECELERATE 0.2 CURRENT; target: "terminology.content"; target: "terminology.label"; target: "shadow"; target: "clip"; target: "glow"; } program { signal: "selected,start"; source: "terminology"; action: STATE_SET "selected" 0.0; target: "terminology.content"; target: "terminology.label"; target: "shadow"; target: "clip"; target: "glow"; } program { signal: "unselected"; source: "terminology"; action: STATE_SET "default" 0.0; transition: DECELERATE 0.4 CURRENT; target: "terminology.content"; target: "terminology.label"; target: "shadow"; target: "clip"; target: "glow"; } //////////////////////////////////////////////////////////////////// // fancy stuff over the top of the terminal for shading and labelling part { name: "bevel"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; rel1.to: "terminology.content"; rel2.to: "terminology.content"; image.normal: "bg_bevel.png"; image.border: 3 3 5 3; image.middle: 0; fill.smooth: 0; } } part { name: "terminology.label"; type: TEXT; mouse_events: 0; scale: 1; description { state: "default" 0.0; rel1.to: "terminology.content"; rel2.to: "terminology.content"; color: 255 255 255 255; align: 0.5 1.0; text { font: "Sans"; size: 10; align: 0.5 1.0; min: 0 1; } } description { state: "selected" 0.0; inherit: "default" 0.0; color: 255 255 255 255; text { font:"Sans:style=Bold"; } } } //////////////////////////////////////////////////////////////////// // visual bell - spinning red siren light part { name: "bell_base"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; min: 32 32; max: 32 32; rel1.to: "terminology.content"; rel2.to: "terminology.content"; align: 1.0 1.0; image.normal: "bg_led_base.png"; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; } } part { name: "bell"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; rel1.to: "bell_base"; rel2.to: "bell_base"; image.normal: "bg_led.png"; } description { state: "visible" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; } } part { name: "bell_strobe"; mouse_events: 0; description { state: "default" 0.0; fixed: 1 1; visible: 0; color: 255 255 255 0; rel1.to: "bell"; rel2.to: "bell"; image.normal: "bg_led_strobe.png"; map { on: 1; smooth: 1; rotation.center: "bell"; } } description { state: "spin" 0.0; inherit: "default" 0.0; visible: 1; color: 255 255 255 255; map.rotation.z: 36.0; } description { state: "spin_done" 0.0; inherit: "spin" 0.0; map.rotation.z: 720.0; } description { state: "spin_done2" 0.0; inherit: "spin" 0.0; map.rotation.z: 1440.0; } } program { signal: "bell"; source: "terminology"; action: STATE_SET "default" 0.0; target: "bell_base"; target: "bell"; target: "bell_strobe"; after: "bell"; } program { name: "bell"; action: STATE_SET "visible" 0.0; target: "bell_base"; after: "bell2"; } program { name: "bell2"; action: STATE_SET "visible" 0.0; transition: DECELERATE 0.1; target: "bell"; after: "bell3"; } program { name: "bell3"; action: STATE_SET "spin" 0.0; transition: LINEAR 0.1; target: "bell_strobe"; after: "bell4.2"; } program { name: "bell4.2"; action: STATE_SET "spin_done" 0.0; transition: LINEAR 0.9; target: "bell_strobe"; after: "bell4.3"; } program { name: "bell4.3"; action: STATE_SET "spin_done2" 0.0; transition: LINEAR 1.0; target: "bell_strobe"; after: "bell4.4"; } program { name: "bell4.4"; action: STATE_SET "spin_done" 0.0; target: "bell_strobe"; after: "bell4.3"; } } } ////////////////////////////////////////////////////////////////////////////// //// an object overlayd on text that is a link group { name: "terminology/link"; images { image: "lk_bottom.png" COMP; } parts { part { name: "bottom"; mouse_events: 0; description { state: "default" 0.0; image.normal: "lk_bottom.png"; image.border: 9 9 0 0; align: 0.5 1.0; min: 20 8; rel1.offset: -6 0; rel1.relative: 0.0 1.0; rel2.offset: 5 0; color: 100 200 255 255; fill.smooth: 0; } } part { name: "event"; type: RECT; mouse_events: 1; repeat_events: 1; description { state: "default" 0.0; color: 0 0 0 0; } } } } } ================================================ FILE: samples/Eiffel/app_embedded_web_execution.e ================================================ note description: "Summary description for {APP_EMBEDDED_WEB_EXECUTION}." author: "" date: "$Date$" revision: "$Revision$" class APP_EMBEDDED_WEB_EXECUTION inherit EMBEDDED_WEB_EXECUTION redefine initialize end create make feature {NONE} -- Initialization initialize do Precursor create request_exit_operation_actions local_connection_restriction_enabled := True end feature -- Execution request_exit_operation_actions: ACTION_SEQUENCE [TUPLE] execute -- Execute the request -- See `request.input' for input stream -- `request.meta_variables' for the CGI meta variable -- and `response' for output buffer local router: WSF_ROUTER sess: detachable WSF_ROUTER_SESSION m: WSF_HTML_PAGE_RESPONSE b: STRING fs: WSF_FILE_SYSTEM_HANDLER req: like request do req := request create router.make (3) router.handle ("/test/{var}", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_test), Void) router.handle ("/env", create {WSF_URI_AGENT_HANDLER}.make (agent handle_env), Void) router.handle ("/exit", create {WSF_URI_TEMPLATE_AGENT_HANDLER}.make (agent handle_exit), Void) create fs.make_with_path ((create {EXECUTION_ENVIRONMENT}).current_working_path.extended ("files")) router.handle ("/files", fs, Void) create sess router.dispatch (req, response, sess) if not sess.dispatched then create m.make create b.make_from_string ("

    Hello Eiffel desktop user

    ") b.append ("
  • test
  • ") b.append ("
  • env
  • ") b.append ("
  • files
  • ") b.append ("
  • exit
  • ") m.set_body (b) response.send (m) end end handle_test (req: WSF_REQUEST; res: WSF_RESPONSE) local m: WSF_HTML_PAGE_RESPONSE b: STRING l_name: READABLE_STRING_32 do if attached {WSF_STRING} req.item ("var") as p_name then l_name := p_name.value else l_name := {STRING_32} "Embedded web service and web_browser in vision2 application" end create m.make create b.make_from_string ("

    This is a test about "+ m.html_encoded_string (l_name) +"

    ") b.append ("
  • back to home
  • ") if l_name.is_case_insensitive_equal_general ("start") then b.append ("
  • test javascript+ajax
  • ") elseif l_name.is_case_insensitive_equal_general ("js") then b.append ("[

    Let AJAX change this text

    ]") m.add_javascript_content ("[ function loadXMLDoc() { var xmlhttp; if (window.XMLHttpRequest) {// code for IE7+, Firefox, Chrome, Opera, Safari xmlhttp=new XMLHttpRequest(); } else {// code for IE6, IE5 xmlhttp=new ActiveXObject("Microsoft.XMLHTTP"); } xmlhttp.onreadystatechange=function() { if (xmlhttp.readyState==4 && xmlhttp.status==200) { document.getElementById("myDiv").innerHTML=xmlhttp.responseText; } } xmlhttp.open("GET","/test/ajax.txt",true); xmlhttp.send(); } ]") elseif l_name.is_case_insensitive_equal_general ("ajax.txt") then b := "This is AJAX response ... from " + req.absolute_script_url ("") end m.set_body (b) res.send (m) end handle_env (req: WSF_REQUEST; res: WSF_RESPONSE) local s: STRING_8 p: WSF_PAGE_RESPONSE v: STRING_8 do create s.make (2048) s.append ("**DEBUG**%N") req.set_raw_input_data_recorded (True) append_iterable_to ("Meta variables:", req.meta_variables, s) s.append_character ('%N') append_iterable_to ("Path parameters", req.path_parameters, s) s.append_character ('%N') append_iterable_to ("Query parameters", req.query_parameters, s) s.append_character ('%N') append_iterable_to ("Form parameters", req.form_parameters, s) s.append_character ('%N') if attached req.content_type as l_type then s.append ("Content: type=" + l_type.debug_output) s.append (" length=") s.append_natural_64 (req.content_length_value) s.append_character ('%N') create v.make (req.content_length_value.to_integer_32) req.read_input_data_into (v) across v.split ('%N') as v_cursor loop s.append (" |") s.append (v_cursor.item) s.append_character ('%N') end end create p.make_with_body (s) p.header.put_content_type_text_plain res.send (p) end handle_exit (req: WSF_REQUEST; res: WSF_RESPONSE) local m: WSF_HTML_PAGE_RESPONSE b: STRING do create m.make create b.make_from_string ("

    Embedded server is about to shutdown

    ") b.append ("
  • back to home
  • ") b.append ("
  • Click to confirm exit operation
  • ") m.set_body (b) res.send (m) if attached {separate WGI_STANDALONE_CONNECTOR [WGI_EXECUTION]} req.wgi_connector as conn then shutdown_server (conn) end request_exit_operation_actions.call (Void) end shutdown_server (conn: separate WGI_STANDALONE_CONNECTOR [WGI_EXECUTION]) do conn.shutdown_server end feature {NONE} -- Implementation append_iterable_to (a_title: READABLE_STRING_8; it: detachable ITERABLE [WSF_VALUE]; s: STRING_8) local n: INTEGER t: READABLE_STRING_8 v: READABLE_STRING_8 do s.append (a_title) s.append_character (':') if it /= Void then across it as c loop n := n + 1 end if n = 0 then s.append (" empty") s.append_character ('%N') else s.append_character ('%N') across it as c loop s.append (" - ") s.append (c.item.url_encoded_name) t := c.item.generating_type.name if t.same_string ("WSF_STRING") then else s.append_character (' ') s.append_character ('{') s.append (t) s.append_character ('}') end s.append_character ('=') v := c.item.string_representation.as_string_8 if v.has ('%N') then s.append_character ('%N') across v.split ('%N') as v_cursor loop s.append (" |") s.append (v_cursor.item) s.append_character ('%N') end else s.append (v) s.append_character ('%N') end end end else s.append (" none") s.append_character ('%N') end end end ================================================ FILE: samples/Eiffel/app_embedded_web_service.e ================================================ note description: "Summary description for {APP_EMBEDDED_WEB_SERVICE}." author: "" date: "$Date$" revision: "$Revision$" class APP_EMBEDDED_WEB_SERVICE inherit EMBEDDED_WEB_SERVICE [APP_EMBEDDED_WEB_EXECUTION] create make feature {NONE} -- Initialization end ================================================ FILE: samples/Eiffel/application.e ================================================ note description : "nino application root class" date : "$Date$" revision : "$Revision$" class APPLICATION inherit ARGUMENTS HTTP_SERVER_SHARED_CONFIGURATION create make feature {NONE} -- Initialization make -- Run application. local l_server : HTTP_SERVER l_cfg: HTTP_SERVER_CONFIGURATION l_http_handler : HTTP_HANDLER do create l_cfg.make l_cfg.http_server_port := 9_000 l_cfg.document_root := default_document_root set_server_configuration (l_cfg) debug ("nino") l_cfg.set_is_verbose (True) end create l_server.make (l_cfg) create {APPLICATION_CONNECTION_HANDLER} l_http_handler.make (l_server) l_server.setup (l_http_handler) end feature -- Access default_document_root: STRING = "webroot" end ================================================ FILE: samples/Eiffel/book_collection.e ================================================ class BOOK_COLLECTION create make feature {NONE} -- Initialization make (a_name: STRING_32) -- Create a book collection with `a_name' as `name'. do set_name (a_name) create book_index.make (10) ensure name_set: name = a_name end feature -- Access name: STRING_32 -- Name. books: LIST [BOOK] -- collection of book. do create {LINKED_LIST [BOOK]} Result.make across book_index as it loop Result.append (it.item) end end books_by_author (a_author: STRING_32): LIST [BOOK] -- Books wrote by `a_author' in this collection. do if attached book_index [a_author] as l_result then Result := l_result else create {LINKED_LIST [BOOK]} Result.make end end feature -- Change set_name (a_name: STRING_32) -- Set `name' with `a_name'. do name := a_name ensure name_set: name = a_name end add_book (a_book: BOOK) -- Extend collection with `a_book'. local l: detachable LIST [BOOK] do l := book_index.at (a_book.author.name) if l = Void then create {LINKED_LIST [BOOK]} l.make book_index.put (l, a_book.author.name) end l.force (a_book) end add_books (book_list: like books) -- Append collection with `book_list'. do across book_list as it loop add_book (it.item) end end feature {NONE} -- Implementation book_index: HASH_TABLE [LIST [BOOK], STRING_32] -- Association of author name and its books. end -- class BOOK_COLLECTION ================================================ FILE: samples/Eiffel/desktop_app.e ================================================ note description: "Objects that represent the Vision2 application.% %The original version of this class has been generated by EiffelBuild." generator: "EiffelBuild" legal: "See notice at end of class." status: "See notice at end of class." date: "$Date$" revision: "$Revision$" class DESKTOP_APP inherit EV_APPLICATION create make_and_launch feature {NONE} -- Initialization make_and_launch -- Create `Current', build and display `main_window', -- then launch the application. local l_win: like main_window l_embedded_service: separate APP_EMBEDDED_WEB_SERVICE do default_create create l_win.make main_window := l_win l_win.show create l_embedded_service.make setup_and_launch_web_service (l_embedded_service) launch end setup_and_launch_web_service (a_web_service: separate APP_EMBEDDED_WEB_SERVICE) do a_web_service.set_port_number (0) -- Use first available port number a_web_service.set_on_launched_action (agent on_web_service_launched (a_web_service)) a_web_service.launch end on_quit do if attached main_window as win then win.destroy_and_exit_if_last end end on_web_service_launched (a_web_service: separate APP_EMBEDDED_WEB_SERVICE) do if attached main_window as win then add_idle_action_kamikaze (agent wait_for_termination (a_web_service, Void)) add_idle_action_kamikaze (agent win.open_link) end end wait_for_termination (a_web_service: separate APP_EMBEDDED_WEB_SERVICE; a_timeout: detachable EV_TIMEOUT) local t: detachable EV_TIMEOUT do t := a_timeout if t /= Void then t.set_interval (0) end if attached a_web_service.observer as obs and then observer_has_terminaded (obs) then if t /= Void then t.destroy end on_quit else if t = Void then create t t.actions.extend (agent wait_for_termination (a_web_service, t)) else t.set_interval (1_000) end t.set_interval (1_000) end end observer_has_terminaded (obs: separate WGI_STANDALONE_SERVER_OBSERVER): BOOLEAN do Result := obs.terminated end feature {NONE} -- Implementation main_window: detachable MAIN_WINDOW -- Main window of `Current' ;note copyright: "Copyright (c) 1984-2009, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software 356 Storke Road, Goleta, CA 93117 USA Telephone 805-685-1006, Fax 805-685-6869 Website http://www.eiffel.com Customer support http://support.eiffel.com ]" end ================================================ FILE: samples/Eiffel/git_checkout_command.e ================================================ note description: "Git checkout command." author: "Olivier Ligot" class GIT_CHECKOUT_COMMAND inherit GIT_COMMAND create make, make_master feature {NONE} -- Initialization make (a_branch: STRING) -- Checkout the branch `a_branch'. do initialize arguments.force_last (a_branch) branch := a_branch ensure branch_set: branch = a_branch end make_master -- Checkout the master branch. do make ("master") end feature -- Access branch: STRING -- Branch to checkout name: STRING = "checkout" -- Git subcommand name end ================================================ FILE: samples/Eiffel/main_window.e ================================================ note description: "Objects that represent an EV_TITLED_WINDOW.% %The original version of this class was generated by EiffelBuild." generator: "EiffelBuild" legal: "See notice at end of class." status: "See notice at end of class." date: "$Date$" revision: "$Revision$" class MAIN_WINDOW inherit EV_TITLED_WINDOW redefine create_interface_objects, initialize, is_in_default_state end SHARED_EMBEDED_WEB_SERVICE_INFORMATION undefine default_create, copy end create make feature {NONE} -- Initialization make -- Creation method do default_create end initialize -- Initialize `Current'. do Precursor {EV_TITLED_WINDOW} set_title ("Desktop Application (demo embedded EWF+browser)") -- Connect events. -- Close the application when an interface close -- request is received on `Current'. i.e. the cross is clicked. close_request_actions.extend (agent destroy_and_exit_if_last) -- Call `user_initialization'. user_initialization end create_interface_objects -- Create objects do create home_button.make_with_text ("Home") create back_button.make_with_text ("Back") create forth_button.make_with_text ("Forth") create refresh_button.make_with_text ("Refresh") create stop_button.make_with_text ("Stop") create url_text_field.make_with_text ("http://localhost:" + port_number.out) create go_button.make_with_text ("Go") create web_browser end user_initialization -- Called by `initialize'. -- Any custom user initialization that -- could not be performed in `initialize', -- (due to regeneration of implementation class) -- can be added here. local l_browser_box: EV_VERTICAL_BOX l_hor_box: EV_HORIZONTAL_BOX vb: EV_VERTICAL_BOX do set_size (800, 600) create vb extend (vb) vb.set_border_width (3) vb.set_padding_width (3) -- browser part create l_browser_box create l_hor_box l_browser_box.extend (l_hor_box) l_browser_box.disable_item_expand (l_hor_box) home_button.select_actions.force_extend (agent on_home_button_action) l_hor_box.extend (home_button) l_hor_box.disable_item_expand (home_button) back_button.select_actions.force_extend (agent on_back_button_action) l_hor_box.extend (back_button) l_hor_box.disable_item_expand (back_button) forth_button.select_actions.force_extend (agent on_forth_button_action) l_hor_box.extend (forth_button) l_hor_box.disable_item_expand (forth_button) refresh_button.select_actions.force_extend (agent on_refresh_button_action) l_hor_box.extend (refresh_button) l_hor_box.disable_item_expand (refresh_button) stop_button.select_actions.force_extend (agent on_stop_button_action) l_hor_box.extend (stop_button) l_hor_box.disable_item_expand (stop_button) l_hor_box.extend (url_text_field) go_button.select_actions.force_extend (agent on_go_button_action) l_hor_box.extend (go_button) l_hor_box.disable_item_expand (go_button) l_browser_box.extend (web_browser) -------------------- vb.extend (l_browser_box) end is_in_default_state: BOOLEAN do Result := True end feature -- Basic operation open_link do url_text_field.set_text ("http://localhost:" + port_number.out) on_go_button_action end feature {NONE} -- Implementation home_button, go_button, back_button, forth_button, stop_button, refresh_button: EV_BUTTON -- Buttons url_text_field: EV_TEXT_FIELD -- URL text field on_go_button_action -- Action for `go_button' local l_uri: STRING_32 do l_uri := url_text_field.text if l_uri /= Void and then not l_uri.is_empty then web_browser.load_uri (l_uri) else on_home_button_action end end on_home_button_action -- Action for `home_button' do web_browser.load_uri ("http://localhost:" + port_number.out) end on_back_button_action -- Action for `back_button' do web_browser.back end on_forth_button_action -- Action for `forth_button' do web_browser.forth end on_refresh_button_action -- Action for `refresh_button' do web_browser.refresh end on_stop_button_action -- Action for `stop_button' do web_browser.stop end web_browser: EV_WEB_BROWSER -- Web browser widget ;note copyright: "Copyright (c) 1984-2009, Eiffel Software and others" license: "Eiffel Forum License v2 (see http://www.eiffel.com/licensing/forum.txt)" source: "[ Eiffel Software 356 Storke Road, Goleta, CA 93117 USA Telephone 805-685-1006, Fax 805-685-6869 Website http://www.eiffel.com Customer support http://support.eiffel.com ]" end ================================================ FILE: samples/Elixir/atom.ex ================================================ defmodule Atom do @moduledoc """ Atoms are constants whose values are their own name. """ @doc """ Converts an atom to a string. """ @spec to_string(atom) :: String.t() def to_string(atom) do :erlang.atom_to_binary(atom, :utf8) end @doc """ Converts an atom to a charlist. """ @spec to_charlist(atom) :: charlist def to_charlist(atom) do :erlang.atom_to_list(atom) end @doc false @deprecated "Use Atom.to_charlist/1 instead" @spec to_char_list(atom) :: charlist def to_char_list(atom), do: Atom.to_charlist(atom) end ================================================ FILE: samples/Elixir/float.ex ================================================ import Kernel, except: [round: 1] defmodule Float do @moduledoc """ Functions for working with floating-point numbers. """ import Bitwise @power_of_2_to_52 4_503_599_627_370_496 @precision_range 0..15 @type precision_range :: 0..15 @doc """ Computes `base` raised to power of `exponent`. """ @doc since: "1.12.0" @spec pow(float, number) :: float def pow(base, exponent) when is_float(base) and is_number(exponent), do: :math.pow(base, exponent) @doc """ Parses a binary into a float. """ @spec parse(binary) :: {float, binary} | :error def parse("-" <> binary) do case parse_unsigned(binary) do :error -> :error {number, remainder} -> {-number, remainder} end end def parse("+" <> binary) do parse_unsigned(binary) end def parse(binary) do parse_unsigned(binary) end defp parse_unsigned(<>) when digit in ?0..?9, do: parse_unsigned(rest, false, false, <>) defp parse_unsigned(binary) when is_binary(binary), do: :error defp parse_unsigned(<>, dot?, e?, acc) when digit in ?0..?9, do: parse_unsigned(rest, dot?, e?, <>) defp parse_unsigned(<>, false, false, acc) when digit in ?0..?9, do: parse_unsigned(rest, true, false, <>) defp parse_unsigned(<>, dot?, false, acc) when exp_marker in 'eE' and digit in ?0..?9, do: parse_unsigned(rest, true, true, <>) defp parse_unsigned(<>, dot?, false, acc) when exp_marker in 'eE' and sign in '-+' and digit in ?0..?9, do: parse_unsigned(rest, true, true, <>) defp parse_unsigned(rest, dot?, _e?, acc), do: {:erlang.binary_to_float(add_dot(acc, dot?)), rest} defp add_dot(acc, true), do: acc defp add_dot(acc, false), do: acc <> ".0" @doc """ Rounds a float to the largest number less than or equal to `num`. """ @spec floor(float, precision_range) :: float def floor(number, precision \\ 0) def floor(number, 0) when is_float(number) do :math.floor(number) end def floor(number, precision) when is_float(number) and precision in @precision_range do round(number, precision, :floor) end def floor(number, precision) when is_float(number) do raise ArgumentError, invalid_precision_message(precision) end @doc """ Rounds a float to the smallest integer greater than or equal to `num`. """ @spec ceil(float, precision_range) :: float def ceil(number, precision \\ 0) def ceil(number, 0) when is_float(number) do :math.ceil(number) end def ceil(number, precision) when is_float(number) and precision in @precision_range do round(number, precision, :ceil) end def ceil(number, precision) when is_float(number) do raise ArgumentError, invalid_precision_message(precision) end @doc """ Rounds a floating-point value to an arbitrary number of fractional digits (between 0 and 15). """ @spec round(float, precision_range) :: float # This implementation is slow since it relies on big integers. # Faster implementations are available on more recent papers # and could be implemented in the future. def round(float, precision \\ 0) def round(float, 0) when is_float(float) do float |> :erlang.round() |> :erlang.float() end def round(float, precision) when is_float(float) and precision in @precision_range do round(float, precision, :half_up) end def round(float, precision) when is_float(float) do raise ArgumentError, invalid_precision_message(precision) end defp round(0.0 = num, _precision, _rounding), do: num defp round(float, precision, rounding) do <> = <> {num, count} = decompose(significant, 1) count = count - exp + 1023 cond do # Precision beyond 15 digits count >= 104 -> case rounding do :ceil when sign === 0 -> 1 / power_of_10(precision) :floor when sign === 1 -> -1 / power_of_10(precision) _ -> 0.0 end # We are asking more precision than we have count <= precision -> float true -> # Difference in precision between float and asked precision # We subtract 1 because we need to calculate the remainder too diff = count - precision - 1 # Get up to latest so we calculate the remainder power_of_10 = power_of_10(diff) # Convert the numerand to decimal base num = num * power_of_5(count) # Move to the given precision - 1 num = div(num, power_of_10) div = div(num, 10) num = rounding(rounding, sign, num, div) # Convert back to float without loss # https://www.exploringbinary.com/correct-decimal-to-floating-point-using-big-integers/ den = power_of_10(precision) boundary = den <<< 52 cond do num == 0 -> 0.0 num >= boundary -> {den, exp} = scale_down(num, boundary, 52) decimal_to_float(sign, num, den, exp) true -> {num, exp} = scale_up(num, boundary, 52) decimal_to_float(sign, num, den, exp) end end end defp decompose(significant, initial) do decompose(significant, 1, 0, initial) end defp decompose(<<1::1, bits::bitstring>>, count, last_count, acc) do decompose(bits, count + 1, count, (acc <<< (count - last_count)) + 1) end defp decompose(<<0::1, bits::bitstring>>, count, last_count, acc) do decompose(bits, count + 1, last_count, acc) end defp decompose(<<>>, _count, last_count, acc) do {acc, last_count} end defp scale_up(num, boundary, exp) when num >= boundary, do: {num, exp} defp scale_up(num, boundary, exp), do: scale_up(num <<< 1, boundary, exp - 1) defp scale_down(num, den, exp) do new_den = den <<< 1 if num < new_den do {den >>> 52, exp} else scale_down(num, new_den, exp + 1) end end defp decimal_to_float(sign, num, den, exp) do quo = div(num, den) rem = num - quo * den tmp = case den >>> 1 do den when rem > den -> quo + 1 den when rem < den -> quo _ when (quo &&& 1) === 1 -> quo + 1 _ -> quo end tmp = tmp - @power_of_2_to_52 <> = <> tmp end defp rounding(:floor, 1, _num, div), do: div + 1 defp rounding(:ceil, 0, _num, div), do: div + 1 defp rounding(:half_up, _sign, num, div) do case rem(num, 10) do rem when rem < 5 -> div rem when rem >= 5 -> div + 1 end end defp rounding(_, _, _, div), do: div Enum.reduce(0..104, 1, fn x, acc -> defp power_of_10(unquote(x)), do: unquote(acc) acc * 10 end) Enum.reduce(0..104, 1, fn x, acc -> defp power_of_5(unquote(x)), do: unquote(acc) acc * 5 end) @doc """ Returns a pair of integers whose ratio is exactly equal to the original float and with a positive denominator. """ @doc since: "1.4.0" @spec ratio(float) :: {integer, pos_integer} def ratio(0.0), do: {0, 1} def ratio(float) when is_float(float) do <> = <> {num, den_exp} = if exp != 0 do # Floats are expressed like this: # (2**52 + mantissa) * 2**(-52 + exp - 1023) # # We compute the root factors of the mantissa so we have this: # (2**52 + mantissa * 2**count) * 2**(-52 + exp - 1023) {mantissa, count} = root_factors(mantissa, 0) # Now we can move the count around so we have this: # (2**(52-count) + mantissa) * 2**(count + -52 + exp - 1023) if mantissa == 0 do {1, exp - 1023} else num = (1 <<< (52 - count)) + mantissa den_exp = count - 52 + exp - 1023 {num, den_exp} end else # Subnormals are expressed like this: # (mantissa) * 2**(-52 + 1 - 1023) # # So we compute it to this: # (mantissa * 2**(count)) * 2**(-52 + 1 - 1023) # # Which becomes: # mantissa * 2**(count-1074) root_factors(mantissa, -1074) end if den_exp > 0 do {sign(sign, num <<< den_exp), 1} else {sign(sign, num), 1 <<< -den_exp} end end defp root_factors(mantissa, count) when mantissa != 0 and (mantissa &&& 1) == 0, do: root_factors(mantissa >>> 1, count + 1) defp root_factors(mantissa, count), do: {mantissa, count} @compile {:inline, sign: 2} defp sign(0, num), do: num defp sign(1, num), do: -num @doc """ Returns a charlist which corresponds to the text representation of the given float. """ @spec to_charlist(float) :: charlist def to_charlist(float) when is_float(float) do :io_lib_format.fwrite_g(float) end @doc """ Returns a binary which corresponds to the text representation of the given float. """ @spec to_string(float) :: String.t() def to_string(float) when is_float(float) do IO.iodata_to_binary(:io_lib_format.fwrite_g(float)) end @doc false @deprecated "Use Float.to_charlist/1 instead" def to_char_list(float), do: Float.to_charlist(float) @doc false @deprecated "Use :erlang.float_to_list/2 instead" def to_char_list(float, options) do :erlang.float_to_list(float, expand_compact(options)) end @doc false @deprecated "Use :erlang.float_to_binary/2 instead" def to_string(float, options) do :erlang.float_to_binary(float, expand_compact(options)) end defp invalid_precision_message(precision) do "precision #{precision} is out of valid range of #{inspect(@precision_range)}" end defp expand_compact([{:compact, false} | t]), do: expand_compact(t) defp expand_compact([{:compact, true} | t]), do: [:compact | expand_compact(t)] defp expand_compact([h | t]), do: [h | expand_compact(t)] defp expand_compact([]), do: [] end ================================================ FILE: samples/Elixir/function.ex ================================================ defmodule Function do @moduledoc """ A set of functions for working with functions. """ @type information :: :arity | :env | :index | :module | :name | :new_index | :new_uniq | :pid | :type | :uniq @doc """ Captures the given function. """ @doc since: "1.7.0" @spec capture(module, atom, arity) :: fun def capture(module, function_name, arity) do :erlang.make_fun(module, function_name, arity) end @doc """ Returns a keyword list with information about a function. """ @doc since: "1.7.0" @spec info(fun) :: [{information, term}] def info(fun), do: :erlang.fun_info(fun) @doc """ Returns a specific information about the function. """ @doc since: "1.7.0" @spec info(fun, item) :: {item, term} when item: information def info(fun, item), do: :erlang.fun_info(fun, item) @doc """ Returns its input `value`. This function can be passed as an anonymous function to transformation functions. """ @doc since: "1.10.0" @spec identity(value) :: value when value: var def identity(value), do: value end ================================================ FILE: samples/Elixir/integer.ex ================================================ defmodule Integer do @moduledoc """ Functions for working with integers. """ import Bitwise @doc """ Determines if `integer` is odd. """ defguard is_odd(integer) when is_integer(integer) and (integer &&& 1) == 1 @doc """ Determines if an `integer` is even. """ defguard is_even(integer) when is_integer(integer) and (integer &&& 1) == 0 @doc """ Computes `base` raised to power of `exponent`. """ @doc since: "1.12.0" @spec pow(integer, non_neg_integer) :: integer def pow(base, exponent) when is_integer(base) and is_integer(exponent) do if exponent < 0, do: :erlang.error(:badarith, [base, exponent]) guarded_pow(base, exponent) end # https://en.wikipedia.org/wiki/Exponentiation_by_squaring defp guarded_pow(_, 0), do: 1 defp guarded_pow(b, 1), do: b defp guarded_pow(b, e) when (e &&& 1) == 0, do: guarded_pow(b * b, e >>> 1) defp guarded_pow(b, e), do: b * guarded_pow(b * b, e >>> 1) @doc """ Computes the modulo remainder of an integer division. """ @doc since: "1.4.0" @spec mod(integer, neg_integer | pos_integer) :: integer def mod(dividend, divisor) do remainder = rem(dividend, divisor) if remainder * divisor < 0 do remainder + divisor else remainder end end @doc """ Performs a floored integer division. """ @doc since: "1.4.0" @spec floor_div(integer, neg_integer | pos_integer) :: integer def floor_div(dividend, divisor) do if dividend * divisor < 0 and rem(dividend, divisor) != 0 do div(dividend, divisor) - 1 else div(dividend, divisor) end end @doc """ Returns the ordered digits for the given `integer`. """ @spec digits(integer, pos_integer) :: [integer, ...] def digits(integer, base \\ 10) when is_integer(integer) and is_integer(base) and base >= 2 do do_digits(integer, base, []) end defp do_digits(integer, base, acc) when abs(integer) < base, do: [integer | acc] defp do_digits(integer, base, acc), do: do_digits(div(integer, base), base, [rem(integer, base) | acc]) @doc """ Returns the integer represented by the ordered `digits`. """ @spec undigits([integer], pos_integer) :: integer def undigits(digits, base \\ 10) when is_list(digits) and is_integer(base) and base >= 2 do do_undigits(digits, base, 0) end defp do_undigits([], _base, acc), do: acc defp do_undigits([digit | _], base, _) when is_integer(digit) and digit >= base, do: raise(ArgumentError, "invalid digit #{digit} in base #{base}") defp do_undigits([digit | tail], base, acc) when is_integer(digit), do: do_undigits(tail, base, acc * base + digit) @doc """ Parses a text representation of an integer. """ @spec parse(binary, 2..36) :: {integer, binary} | :error def parse(binary, base \\ 10) def parse(_binary, base) when base not in 2..36 do raise ArgumentError, "invalid base #{inspect(base)}" end def parse(binary, base) when is_binary(binary) do case count_digits(binary, base) do 0 -> :error count -> {digits, rem} = :erlang.split_binary(binary, count) {:erlang.binary_to_integer(digits, base), rem} end end defp count_digits(<>, base) when sign in '+-' do case count_digits_nosign(rest, base, 1) do 1 -> 0 count -> count end end defp count_digits(<>, base) do count_digits_nosign(rest, base, 0) end digits = [{?0..?9, -?0}, {?A..?Z, 10 - ?A}, {?a..?z, 10 - ?a}] for {chars, diff} <- digits, char <- chars do digit = char + diff defp count_digits_nosign(<>, base, count) when base > unquote(digit) do count_digits_nosign(rest, base, count + 1) end end defp count_digits_nosign(<<_::bits>>, _, count), do: count # TODO: Remove Integer.to_string/1 once the minimum supported version is # Erlang/OTP 22, since it is covered by the now BIF Integer.to_string/2. # Please reapply commit 2622fd6b0aa419a983a899a1fbdb5deefba3d85d. @doc """ Returns a binary which corresponds to the text representation of `integer`. """ @spec to_string(integer) :: String.t() def to_string(integer) do :erlang.integer_to_binary(integer) end @doc """ Returns a binary which corresponds to the text representation of `integer` in the given `base`. """ @spec to_string(integer, 2..36) :: String.t() def to_string(integer, base) do :erlang.integer_to_binary(integer, base) end # TODO: Remove Integer.to_charlist/1 once the minimum supported version is # Erlang/OTP 22, since it is covered by the now BIF Integer.to_charlist/2. # Please reapply commit 2622fd6b0aa419a983a899a1fbdb5deefba3d85d. @doc """ Returns a charlist which corresponds to the text representation of the given `integer`. """ @spec to_charlist(integer) :: charlist def to_charlist(integer) do :erlang.integer_to_list(integer) end @doc """ Returns a charlist which corresponds to the text representation of `integer` in the given `base`. """ @spec to_charlist(integer, 2..36) :: charlist def to_charlist(integer, base) do :erlang.integer_to_list(integer, base) end @doc """ Returns the greatest common divisor of the two given integers. """ @doc since: "1.5.0" @spec gcd(integer, integer) :: non_neg_integer def gcd(integer1, integer2) when is_integer(integer1) and is_integer(integer2) do gcd_positive(abs(integer1), abs(integer2)) end defp gcd_positive(0, integer2), do: integer2 defp gcd_positive(integer1, 0), do: integer1 defp gcd_positive(integer1, integer2), do: gcd_positive(integer2, rem(integer1, integer2)) @doc false @deprecated "Use Integer.to_charlist/1 instead" def to_char_list(integer), do: Integer.to_charlist(integer) @doc false @deprecated "Use Integer.to_charlist/2 instead" def to_char_list(integer, base), do: Integer.to_charlist(integer, base) end ================================================ FILE: samples/Elixir/regex.ex ================================================ defmodule Regex do @moduledoc ~S""" Provides regular expressions for Elixir. """ defstruct re_pattern: nil, source: "", opts: "", re_version: "" @type t :: %__MODULE__{re_pattern: term, source: binary, opts: binary} defmodule CompileError do defexception message: "regex could not be compiled" end @doc """ Compiles the regular expression. """ @spec compile(binary, binary | [term]) :: {:ok, t} | {:error, any} def compile(source, options \\ "") when is_binary(source) do compile(source, options, version()) end defp compile(source, options, version) when is_binary(options) do case translate_options(options, []) do {:error, rest} -> {:error, {:invalid_option, rest}} translated_options -> compile(source, translated_options, options, version) end end defp compile(source, options, version) when is_list(options) do compile(source, options, "", version) end defp compile(source, opts, doc_opts, version) do case :re.compile(source, opts) do {:ok, re_pattern} -> {:ok, %Regex{re_pattern: re_pattern, re_version: version, source: source, opts: doc_opts}} error -> error end end @doc """ Compiles the regular expression and raises `Regex.CompileError` in case of errors. """ @spec compile!(binary, binary | [term]) :: t def compile!(source, options \\ "") when is_binary(source) do case compile(source, options) do {:ok, regex} -> regex {:error, {reason, at}} -> raise Regex.CompileError, "#{reason} at position #{at}" end end @doc """ Recompiles the existing regular expression if necessary. """ @doc since: "1.4.0" @spec recompile(t) :: {:ok, t} | {:error, any} def recompile(%Regex{} = regex) do version = version() case regex do %{re_version: ^version} -> {:ok, regex} _ -> %{source: source, opts: opts} = regex compile(source, opts, version) end end @doc """ Recompiles the existing regular expression and raises `Regex.CompileError` in case of errors. """ @doc since: "1.4.0" @spec recompile!(t) :: t def recompile!(regex) do case recompile(regex) do {:ok, regex} -> regex {:error, {reason, at}} -> raise Regex.CompileError, "#{reason} at position #{at}" end end @doc """ Returns the version of the underlying Regex engine. """ @doc since: "1.4.0" @spec version :: term() def version do {:re.version(), :erlang.system_info(:endian)} end @doc """ Returns a boolean indicating whether there was a match or not. """ @spec match?(t, String.t()) :: boolean def match?(%Regex{} = regex, string) when is_binary(string) do safe_run(regex, string, [{:capture, :none}]) == :match end @doc """ Returns `true` if the given `term` is a regex. Otherwise returns `false`. """ # TODO: deprecate permanently on Elixir v1.15 @doc deprecated: "Use Kernel.is_struct/2 or pattern match on %Regex{} instead" def regex?(term) def regex?(%Regex{}), do: true def regex?(_), do: false @doc """ Runs the regular expression against the given string until the first match. It returns a list with all captures or `nil` if no match occurred. """ @spec run(t, binary, [term]) :: nil | [binary] | [{integer, integer}] def run(regex, string, options \\ []) def run(%Regex{} = regex, string, options) when is_binary(string) do return = Keyword.get(options, :return, :binary) captures = Keyword.get(options, :capture, :all) offset = Keyword.get(options, :offset, 0) case safe_run(regex, string, [{:capture, captures, return}, {:offset, offset}]) do :nomatch -> nil :match -> [] {:match, results} -> results end end @doc """ Returns the given captures as a map or `nil` if no captures are found. """ @spec named_captures(t, String.t(), [term]) :: map | nil def named_captures(regex, string, options \\ []) when is_binary(string) do names = names(regex) options = Keyword.put(options, :capture, names) results = run(regex, string, options) if results, do: Enum.zip(names, results) |> Enum.into(%{}) end @doc """ Returns the underlying `re_pattern` in the regular expression. """ @spec re_pattern(t) :: term def re_pattern(%Regex{re_pattern: compiled}) do compiled end @doc """ Returns the regex source as a binary. """ @spec source(t) :: String.t() def source(%Regex{source: source}) do source end @doc """ Returns the regex options as a string. """ @spec opts(t) :: String.t() def opts(%Regex{opts: opts}) do opts end @doc """ Returns a list of names in the regex. """ @spec names(t) :: [String.t()] def names(%Regex{re_pattern: compiled, re_version: version, source: source}) do re_pattern = case version() do ^version -> compiled _ -> {:ok, recompiled} = :re.compile(source) recompiled end {:namelist, names} = :re.inspect(re_pattern, :namelist) names end @doc ~S""" Same as `run/3`, but scans the target several times collecting all matches of the regular expression. """ @spec scan(t, String.t(), [term]) :: [[String.t()]] def scan(regex, string, options \\ []) def scan(%Regex{} = regex, string, options) when is_binary(string) do return = Keyword.get(options, :return, :binary) captures = Keyword.get(options, :capture, :all) offset = Keyword.get(options, :offset, 0) options = [{:capture, captures, return}, :global, {:offset, offset}] case safe_run(regex, string, options) do :match -> [] :nomatch -> [] {:match, results} -> results end end defp safe_run( %Regex{re_pattern: compiled, source: source, re_version: version, opts: compile_opts}, string, options ) do case version() do ^version -> :re.run(string, compiled, options) _ -> :re.run(string, source, translate_options(compile_opts, options)) end end @doc """ Splits the given target based on the given pattern and in the given number of parts. """ @spec split(t, String.t(), [term]) :: [String.t()] def split(regex, string, options \\ []) def split(%Regex{}, "", opts) do if Keyword.get(opts, :trim, false) do [] else [""] end end def split(%Regex{} = regex, string, opts) when is_binary(string) and is_list(opts) do on = Keyword.get(opts, :on, :first) case safe_run(regex, string, [:global, capture: on]) do {:match, matches} -> index = parts_to_index(Keyword.get(opts, :parts, :infinity)) trim = Keyword.get(opts, :trim, false) include_captures = Keyword.get(opts, :include_captures, false) do_split(matches, string, 0, index, trim, include_captures) :match -> [string] :nomatch -> [string] end end defp parts_to_index(:infinity), do: 0 defp parts_to_index(n) when is_integer(n) and n > 0, do: n defp do_split(_, string, offset, _counter, true, _with_captures) when byte_size(string) <= offset do [] end defp do_split(_, string, offset, 1, _trim, _with_captures), do: [binary_part(string, offset, byte_size(string) - offset)] defp do_split([], string, offset, _counter, _trim, _with_captures), do: [binary_part(string, offset, byte_size(string) - offset)] defp do_split([[{pos, _} | h] | t], string, offset, counter, trim, with_captures) when pos - offset < 0 do do_split([h | t], string, offset, counter, trim, with_captures) end defp do_split([[] | t], string, offset, counter, trim, with_captures), do: do_split(t, string, offset, counter, trim, with_captures) defp do_split([[{pos, length} | h] | t], string, offset, counter, trim, true) do new_offset = pos + length keep = pos - offset <<_::binary-size(offset), part::binary-size(keep), match::binary-size(length), _::binary>> = string if keep == 0 and trim do [match | do_split([h | t], string, new_offset, counter - 1, trim, true)] else [part, match | do_split([h | t], string, new_offset, counter - 1, trim, true)] end end defp do_split([[{pos, length} | h] | t], string, offset, counter, trim, false) do new_offset = pos + length keep = pos - offset if keep == 0 and trim do do_split([h | t], string, new_offset, counter, trim, false) else <<_::binary-size(offset), part::binary-size(keep), _::binary>> = string [part | do_split([h | t], string, new_offset, counter - 1, trim, false)] end end @doc ~S""" Receives a regex, a binary and a replacement, returns a new binary where all matches are replaced by the replacement. """ @spec replace(t, String.t(), String.t() | (... -> String.t()), [term]) :: String.t() def replace(%Regex{} = regex, string, replacement, options \\ []) when is_binary(string) and is_list(options) do opts = if Keyword.get(options, :global) != false, do: [:global], else: [] opts = [{:capture, :all, :index} | opts] case safe_run(regex, string, opts) do :nomatch -> string {:match, [mlist | t]} when is_list(mlist) -> apply_list(string, precompile_replacement(replacement), [mlist | t]) |> IO.iodata_to_binary() {:match, slist} -> apply_list(string, precompile_replacement(replacement), [slist]) |> IO.iodata_to_binary() end end defp precompile_replacement(replacement) when is_function(replacement) do {:arity, arity} = Function.info(replacement, :arity) {replacement, arity} end defp precompile_replacement(""), do: [] defp precompile_replacement(<>) when byte_size(rest) > 0 do {ns, <>} = pick_int(rest) [List.to_integer(ns) | precompile_replacement(rest)] end defp precompile_replacement(<>) do [<> | precompile_replacement(rest)] end defp precompile_replacement(<>) when x in ?0..?9 do {ns, rest} = pick_int(rest) [List.to_integer([x | ns]) | precompile_replacement(rest)] end defp precompile_replacement(<>) do case precompile_replacement(rest) do [head | t] when is_binary(head) -> [<> | t] other -> [<> | other] end end defp pick_int(<>) when x in ?0..?9 do {found, rest} = pick_int(rest) {[x | found], rest} end defp pick_int(bin) do {[], bin} end defp apply_list(string, replacement, list) do apply_list(string, string, 0, replacement, list) end defp apply_list(_, "", _, _, []) do [] end defp apply_list(_, string, _, _, []) do string end defp apply_list(whole, string, pos, replacement, [[{mpos, _} | _] | _] = list) when mpos > pos do length = mpos - pos <> = string [untouched | apply_list(whole, rest, mpos, replacement, list)] end defp apply_list(whole, string, pos, replacement, [[{pos, length} | _] = head | tail]) do <<_::size(length)-binary, rest::binary>> = string new_data = apply_replace(whole, replacement, head) [new_data | apply_list(whole, rest, pos + length, replacement, tail)] end defp apply_replace(string, {fun, arity}, indexes) do apply(fun, get_indexes(string, indexes, arity)) end defp apply_replace(_, [bin], _) when is_binary(bin) do bin end defp apply_replace(string, repl, indexes) do indexes = List.to_tuple(indexes) for part <- repl do cond do is_binary(part) -> part part >= tuple_size(indexes) -> "" true -> get_index(string, elem(indexes, part)) end end end defp get_index(_string, {pos, _length}) when pos < 0 do "" end defp get_index(string, {pos, length}) do <<_::size(pos)-binary, res::size(length)-binary, _::binary>> = string res end defp get_indexes(_string, _, 0) do [] end defp get_indexes(string, [], arity) do ["" | get_indexes(string, [], arity - 1)] end defp get_indexes(string, [h | t], arity) do [get_index(string, h) | get_indexes(string, t, arity - 1)] end @doc ~S""" Escapes a string to be literally matched in a regex. """ @spec escape(String.t()) :: String.t() def escape(string) when is_binary(string) do string |> escape(_length = 0, string) |> IO.iodata_to_binary() end @escapable '.^$*+?()[]{}|#-\\\t\n\v\f\r\s' defp escape(<>, length, original) when char in @escapable do escape_char(rest, length, original, char) end defp escape(<<_, rest::binary>>, length, original) do escape(rest, length + 1, original) end defp escape(<<>>, _length, original) do original end defp escape_char(<>, 0, _original, char) do [?\\, char | escape(rest, 0, rest)] end defp escape_char(<>, length, original, char) do [binary_part(original, 0, length), ?\\, char | escape(rest, 0, rest)] end # Helpers @doc false # Unescape map function used by Macro.unescape_string. def unescape_map(?f), do: ?\f def unescape_map(?n), do: ?\n def unescape_map(?r), do: ?\r def unescape_map(?t), do: ?\t def unescape_map(?v), do: ?\v def unescape_map(?a), do: ?\a def unescape_map(_), do: false # Private Helpers defp translate_options(<>, acc), do: translate_options(t, [:unicode, :ucp | acc]) defp translate_options(<>, acc), do: translate_options(t, [:caseless | acc]) defp translate_options(<>, acc), do: translate_options(t, [:extended | acc]) defp translate_options(<>, acc), do: translate_options(t, [:firstline | acc]) defp translate_options(<>, acc), do: translate_options(t, [:ungreedy | acc]) defp translate_options(<>, acc), do: translate_options(t, [:dotall, {:newline, :anycrlf} | acc]) defp translate_options(<>, acc), do: translate_options(t, [:multiline | acc]) defp translate_options(<>, acc) do IO.warn("the /r modifier in regular expressions is deprecated, please use /U instead") translate_options(t, [:ungreedy | acc]) end defp translate_options(<<>>, acc), do: acc defp translate_options(rest, _acc), do: {:error, rest} end ================================================ FILE: samples/Elm/Basic.elm ================================================ import List (intercalate,intersperse) import Website.Skeleton import Website.ColorScheme addFolder folder lst = let add (x,y) = (x, folder ++ y ++ ".elm") in let f (n,xs) = (n, map add xs) in map f lst elements = addFolder "Elements/" [ ("Primitives", [ ("Text" , "HelloWorld") , ("Images", "Image") , ("Fitted Images", "FittedImage") , ("Videos", "Video") , ("Markdown", "Markdown") ]) , ("Formatting", [ ("Size" , "Size") , ("Opacity" , "Opacity") , ("Text" , "Text") , ("Typeface", "Typeface") ]) , ("Layout", [ ("Simple Flow", "FlowDown1a") , ("Flow Down" , "FlowDown2") , ("Layers" , "Layers") , ("Positioning", "Position") , ("Spacers" , "Spacer") ]) , ("Collage", [ ("Lines" , "Lines") , ("Shapes" , "Shapes") , ("Sprites" , "Sprite") , ("Elements" , "ToForm") , ("Colors" , "Color") , ("Textures" , "Texture") , ("Transforms", "Transforms") ]) ] functional = addFolder "Functional/" [ ("Recursion", [ ("Factorial" , "Factorial") , ("List Length", "Length") , ("Zip" , "Zip") , ("Quick Sort" , "QuickSort") ]) , ("Functions", [ ("Anonymous Functions", "Anonymous") , ("Application" , "Application") , ("Composition" , "Composition") , ("Infix Operators" , "Infix") ]) , ("Higher-Order", [ ("Map" , "Map") , ("Fold" , "Sum") , ("Filter" , "Filter") , ("ZipWith", "ZipWith") ]) , ("Data Types", [ ("Maybe", "Maybe") , ("Boolean Expressions", "BooleanExpressions") , ("Tree", "Tree") ]) ] reactive = addFolder "Reactive/" [ ("Mouse", [ ("Position", "Position") , ("Presses" , "IsDown") , ("Clicks" , "CountClicks") , ("Position+Image", "ResizeYogi") , ("Position+Collage" , "Transforms") -- , ("Hover" , "IsAbove") ]) ,("Keyboard",[ ("Keys Down" , "KeysDown") , ("Key Presses", "CharPressed") ]) , ("Window", [ ("Size", "ResizePaint") , ("Centering", "Centering") ]) , ("Time", [ ("Before and After", "Between") , ("Every" , "Every") , ("Clock" , "Clock") ]) , ("Input", [ ("Text Fields", "TextField") , ("Passwords" , "Password") , ("Check Boxes", "CheckBox") , ("String Drop Down", "StringDropDown") , ("Drop Down", "DropDown") ]) , ("Random", [ ("Randomize", "Randomize") ]) , ("HTTP", [ ("Zip Codes", "ZipCodes") ]) , ("Filters",[ ("Sample", "SampleOn") , ("Keep If", "KeepIf") , ("Drop Repeats", "DropRepeats") ]) ] example (name, loc) = Text.link ("/edit/examples/" ++ loc) (toText name) toLinks (title, links) = flow right [ width 130 (text $ toText " " ++ italic (toText title)) , text (intercalate (bold . Text.color accent4 $ toText " · ") $ map example links) ] insertSpace lst = case lst of { x:xs -> x : spacer 1 5 : xs ; [] -> [] } subsection w (name,info) = flow down . insertSpace . intersperse (spacer 1 1) . map (width w) $ (text . bold $ toText name) : map toLinks info words = [markdown| ### Basic Examples Each example listed below focuses on a single function or concept. These examples demonstrate all of the basic building blocks of Elm. |] content w = words : map (subsection w) [ ("Display",elements), ("React",reactive), ("Compute",functional) ] exampleSets w = flow down . map (width w) . intersperse (plainText " ") $ content w main = lift (skeleton exampleSets) Window.width ================================================ FILE: samples/Elm/QuickSort.elm ================================================ main = asText (qsort [3,9,1,8,5,4,7]) qsort lst = case lst of x:xs -> qsort (filter ((>=)x) xs) ++ [x] ++ qsort (filter ((<)x) xs) [] -> [] {--------------------- QuickSort works as follows: - Choose a pivot element which be placed in the "middle" of the sorted list. In our case we are choosing the first element as the pivot. - Gather all of the elements less than the pivot (the first filter). We know that these must come before our pivot element in the sorted list. Note: ((>=)x) === (\y -> (>=) x y) === (\y -> x >= y) - Gather all of the elements greater than the pivot (the second filter). We know that these must come after our pivot element in the sorted list. - Run `qsort` on the lesser elements, producing a sorted list that contains only elements less than the pivot. Put these before the pivot. - Run `qsort` on the greater elements, producing a sorted list. Put these after the pivot. Note that choosing a bad pivot can have bad effects. Take a sorted list with N elements. The pivot will always be the lowest member, meaning that it does not divide the list very evenly. The list of lessers has 0 elements and the list of greaters has N-1 elemens. This means qsort will be called N times, each call looking through the entire list. This means, in the worst case, QuickSort will make N^2 comparisons. ----------------------} ================================================ FILE: samples/Elm/Tree.elm ================================================ {----------------------------------------------------------------- Overview: A "Tree" represents a binary tree. A "Node" in a binary tree always has two children. A tree can also be "Empty". Below I have defined "Tree" and a number of useful functions. This example also includes some challenge problems :) -----------------------------------------------------------------} data Tree a = Node a (Tree a) (Tree a) | Empty empty = Empty singleton v = Node v Empty Empty insert x tree = case tree of Empty -> singleton x Node y left right -> if x == y then tree else if x < y then Node y (insert x left) right else Node y left (insert x right) fromList xs = foldl insert empty xs depth tree = case tree of Node v left right -> 1 + max (depth left) (depth right) Empty -> 0 map f tree = case tree of Node v left right -> Node (f v) (map f left) (map f right) Empty -> Empty t1 = fromList [1,2,3] t2 = fromList [2,1,3] main = flow down [ display "depth" depth t1 , display "depth" depth t2 , display "map ((+)1)" (map ((+)1)) t2 ] display name f v = text . monospace . toText $ concat [ show (f v), " ⇐ ", name, " ", show v ] {----------------------------------------------------------------- Exercises: (1) Sum all of the elements of a tree. sum :: Tree Number -> Number (2) Flatten a tree into a list. flatten :: Tree a -> [a] (3) Check to see if an element is in a given tree. isElement :: a -> Tree a -> Bool (4) Write a general fold function that acts on trees. The fold function does not need to guarantee a particular order of traversal. fold :: (a -> b -> b) -> b -> Tree a -> b (5) Use "fold" to do exercises 1-3 in one line each. The best readable versions I have come up have the following length in characters including spaces and function name: sum: 16 flatten: 21 isElement: 46 See if you can match or beat me! Don't forget about currying and partial application! (6) Can "fold" be used to implement "map" or "depth"? (7) Try experimenting with different ways to traverse a tree: pre-order, in-order, post-order, depth-first, etc. More info at: http://en.wikipedia.org/wiki/Tree_traversal -----------------------------------------------------------------} ================================================ FILE: samples/Elvish/epm.elv ================================================ use re use str use platform # Verbosity configuration var debug-mode = $false # Configuration for common domains var -default-domain-config = [ &"github.com"= [ &method= git &protocol= https &levels= 2 ] &"bitbucket.org"= [ &method= git &protocol= https &levels= 2 ] &"gitlab.com"= [ &method= git &protocol= https &levels= 2 ] ] #elvdoc:var managed-dir # # The path of the `epm`-managed directory. var managed-dir = ( if $platform:is-windows { put $E:LocalAppData/elvish/lib } elif (not-eq $E:XDG_DATA_HOME '') { put $E:XDG_DATA_HOME/elvish/lib } else { put ~/.local/share/elvish/lib } ) # General utility functions fn -debug {|text| if $debug-mode { print (styled '=> ' blue) echo $text } } fn -info {|text| print (styled '=> ' green) echo $text } fn -warn {|text| print (styled '=> ' yellow) echo $text } fn -error {|text| print (styled '=> ' red) echo $text } fn dest {|pkg| put $managed-dir/$pkg } #elvdoc:fn is-installed # # ```elvish # epm:is-installed $pkg # ``` # # Returns a boolean value indicating whether the given package is installed. fn is-installed {|pkg| bool ?(test -e (dest $pkg)) } fn -package-domain {|pkg| str:split &max=2 / $pkg | take 1 } fn -package-without-domain {|pkg| str:split &max=2 / $pkg | drop 1 | str:join '' } # Merge two maps fn -merge {|a b| keys $b | each {|k| set a[$k] = $b[$k] } put $a } # Uppercase first letter of a string fn -first-upper {|s| put (echo $s[0] | tr '[:lower:]' '[:upper:]')$s[(count $s[0]):] } # Expand tilde at the beginning of a string to the home dir fn -tilde-expand {|p| re:replace "^~" $E:HOME $p } # Known method handlers. Each entry is indexed by method name (the # value of the "method" key in the domain configs), and must contain # two keys: install and upgrade, each one must be a closure that # receives two arguments: package name and the domain config entry # # - Method 'git' requires the key 'protocol' in the domain config, # which has to be 'http' or 'https' # - Method 'rsync' requires the key 'location' in the domain config, # which has to contain the directory where the domain files are # stored. It can be any source location understood by the rsync # command. var -method-handler set -method-handler = [ &git= [ &src= {|pkg dom-cfg| put $dom-cfg[protocol]"://"$pkg } &install= {|pkg dom-cfg| var dest = (dest $pkg) -info "Installing "$pkg mkdir -p $dest git clone ($-method-handler[git][src] $pkg $dom-cfg) $dest } &upgrade= {|pkg dom-cfg| var dest = (dest $pkg) -info "Updating "$pkg try { git -C $dest pull } catch _ { -error "Something failed, please check error above and retry." } } ] &rsync= [ &src= {|pkg dom-cfg| put (-tilde-expand $dom-cfg[location])/(-package-without-domain $pkg)/ } &install= {|pkg dom-cfg| var dest = (dest $pkg) var pkgd = (-package-without-domain $pkg) -info "Installing "$pkg rsync -av ($-method-handler[rsync][src] $pkg $dom-cfg) $dest } &upgrade= {|pkg dom-cfg| var dest = (dest $pkg) var pkgd = (-package-without-domain $pkg) if (not (is-installed $pkg)) { -error "Package "$pkg" is not installed." return } -info "Updating "$pkg rsync -av ($-method-handler[rsync][src] $pkg $dom-cfg) $dest } ] ] # Return the filename of the domain config file for the given domain # (regardless of whether it exists) fn -domain-config-file {|dom| put $managed-dir/$dom/epm-domain.cfg } # Return the filename of the metadata file for the given package # (regardless of whether it exists) fn -package-metadata-file {|pkg| put (dest $pkg)/metadata.json } fn -write-domain-config {|dom| var cfgfile = (-domain-config-file $dom) mkdir -p (dirname $cfgfile) if (has-key $-default-domain-config $dom) { put $-default-domain-config[$dom] | to-json > $cfgfile } else { -error "No default config exists for domain "$dom"." } } # Returns the domain config for a given domain parsed from JSON. # If the file does not exist but we have a built-in # definition, then we return the default. Otherwise we return $false, # so the result can always be checked with 'if'. fn -domain-config {|dom| var cfgfile = (-domain-config-file $dom) var cfg = $false if ?(test -f $cfgfile) { # If the config file exists, read it... set cfg = (cat $cfgfile | from-json) -debug "Read domain config for "$dom": "(to-string $cfg) } else { # ...otherwise check if we have a default config for the domain, and save it if (has-key $-default-domain-config $dom) { set cfg = $-default-domain-config[$dom] -debug "No existing config for "$dom", using the default: "(to-string $cfg) } else { -debug "No existing config for "$dom" and no default available." } } put $cfg } # Return the method by which a package is installed fn -package-method {|pkg| var dom = (-package-domain $pkg) var cfg = (-domain-config $dom) if $cfg { put $cfg[method] } else { put $false } } # Invoke package operations defined in $-method-handler above fn -package-op {|pkg what| var dom = (-package-domain $pkg) var cfg = (-domain-config $dom) if $cfg { var method = $cfg[method] if (has-key $-method-handler $method) { if (has-key $-method-handler[$method] $what) { $-method-handler[$method][$what] $pkg $cfg } else { fail "Unknown operation '"$what"' for package "$pkg } } else { fail "Unknown method '"$method"', specified in in config file "(-domain-config-file $dom) } } else { -error "No config for domain '"$dom"'." } } # Uninstall a single package by removing its directory fn -uninstall-package {|pkg| if (not (is-installed $pkg)) { -error "Package "$pkg" is not installed." return } var dest = (dest $pkg) -info "Removing package "$pkg rm -rf $dest } ###################################################################### # Main user-facing functions #elvdoc:fn metadata # # ```elvish # epm:metadata $pkg # ``` # # Returns a hash containing the metadata for the given package. Metadata for a # package includes the following base attributes: # # - `name`: name of the package # - `installed`: a boolean indicating whether the package is currently installed # - `method`: method by which it was installed (`git` or `rsync`) # - `src`: source URL of the package # - `dst`: where the package is (or would be) installed. Note that this # attribute is returned even if `installed` is `$false`. # # Additionally, packages can define arbitrary metadata attributes in a file called # `metadata.json` in their top directory. The following attributes are # recommended: # # - `description`: a human-readable description of the package # - `maintainers`: an array containing the package maintainers, in # `Name ` format. # - `homepage`: URL of the homepage for the package, if it has one. # - `dependencies`: an array listing dependencies of the current package. Any # packages listed will be installed automatically by `epm:install` if they are # not yet installed. # Read and parse the package metadata, if it exists fn metadata {|pkg| # Base metadata attributes var res = [ &name= $pkg &method= (-package-method $pkg) &src= (-package-op $pkg src) &dst= (dest $pkg) &installed= (is-installed $pkg) ] # Merge with package-specified attributes, if any var file = (-package-metadata-file $pkg) if (and (is-installed $pkg) ?(test -f $file)) { set res = (-merge (cat $file | from-json) $res) } put $res } #elvdoc:fn query # # ```elvish # epm:query $pkg # ``` # # Pretty print the available metadata of the given package. # Print out information about a package fn query {|pkg| var data = (metadata $pkg) var special-keys = [name method installed src dst] echo (styled "Package "$data[name] cyan) if $data[installed] { echo (styled "Installed at "$data[dst] green) } else { echo (styled "Not installed" red) } echo (styled "Source:" blue) $data[method] $data[src] keys $data | each {|key| if (not (has-value $special-keys $key)) { var val = $data[$key] if (eq (kind-of $val) list) { set val = (str:join ", " $val) } echo (styled (-first-upper $key)":" blue) $val } } } #elvdoc:fn installed # # ```elvish # epm:installed # ``` # # Return an array with all installed packages. `epm:list` can be used as an alias # for `epm:installed`. # List installed packages fn installed { put $managed-dir/*[nomatch-ok] | each {|dir| var dom = (str:replace $managed-dir/ '' $dir) var cfg = (-domain-config $dom) # Only list domains for which we know the config, so that the user # can have his own non-package directories under ~/.elvish/lib # without conflicts. if $cfg { var lvl = $cfg[levels] var pat = '^\Q'$managed-dir'/\E('(repeat (+ $lvl 1) '[^/]+' | str:join '/')')/$' put (each {|d| re:find $pat $d } [ $managed-dir/$dom/**[nomatch-ok]/ ] )[groups][1][text] } } } # epm:list is an alias for epm:installed fn list { installed } #elvdoc:fn install # # ```elvish # epm:install &silent-if-installed=$false $pkg... # ``` # # Install the named packages. By default, if a package is already installed, a # message will be shown. This can be disabled by passing # `&silent-if-installed=$true`, so that already-installed packages are silently # ignored. # Install and upgrade are method-specific, so we call the # corresponding functions using -package-op fn install {|&silent-if-installed=$false @pkgs| if (eq $pkgs []) { -error "You must specify at least one package." return } for pkg $pkgs { if (is-installed $pkg) { if (not $silent-if-installed) { -info "Package "$pkg" is already installed." } } else { -package-op $pkg install # Check if there are any dependencies to install var metadata = (metadata $pkg) if (has-key $metadata dependencies) { var deps = $metadata[dependencies] -info "Installing dependencies: "(str:join " " $deps) # If the installation of dependencies fails, uninstall the # target package (leave any already-installed dependencies in # place) try { install $@deps } catch e { -error "Dependency installation failed. Uninstalling "$pkg", please check the errors above and try again." -uninstall-package $pkg } } } } } #elvdoc:fn upgrade # # ```elvish # epm:upgrade $pkg... # ``` # # Upgrade named packages. If no package name is given, upgrade all installed # packages. fn upgrade {|@pkgs| if (eq $pkgs []) { set pkgs = [(installed)] -info 'Upgrading all installed packages' } for pkg $pkgs { if (not (is-installed $pkg)) { -error "Package "$pkg" is not installed." } else { -package-op $pkg upgrade } } } #elvdoc:fn uninstall # # ```elvish # epm:uninstall $pkg... # ``` # # Uninstall named packages. # Uninstall is the same for everyone, just remove the directory fn uninstall {|@pkgs| if (eq $pkgs []) { -error 'You must specify at least one package.' return } for pkg $pkgs { -uninstall-package $pkg } } ================================================ FILE: samples/Emacs Lisp/.emacs.desktop ================================================ ;; -*- mode: emacs-lisp; coding: emacs-mule; -*- ;; -------------------------------------------------------------------------- ;; Desktop File for Emacs ;; -------------------------------------------------------------------------- ;; Created Sat Jan 3 12:46:35 2015 ;; Desktop file format version 206 ;; Emacs version 24.3.1 ;; Global section: (setq desktop-missing-file-warning nil) (setq tags-file-name nil) (setq tags-table-list nil) (setq search-ring nil) (setq regexp-search-ring nil) (setq register-alist nil) (setq file-name-history nil) ;; Buffer section -- buffers listed in same order as in buffer list: (desktop-create-buffer 206 "/home/foo/bar" "bar" 'fundamental-mode nil 11572 '(11554 nil) nil nil '((buffer-file-coding-system . undecided-unix))) ================================================ FILE: samples/Emacs Lisp/dude.el ================================================ (print "Dude!") ================================================ FILE: samples/Emacs Lisp/ess-julia.el ================================================ ;; ess-julia.el --- ESS julia mode and inferior interaction ;; ;; Copyright (C) 2012 Vitalie Spinu. ;; ;; Filename: ess-julia.el ;; Author: Vitalie Spinu (based on julia-mode.el from julia-lang project) ;; Maintainer: Vitalie Spinu ;; Created: 02-04-2012 (ESS 12.03) ;; Keywords: ESS, julia ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;; This file is *NOT* part of GNU Emacs. ;; This file is part of ESS ;; ;; This program is free software; you can redistribute it and/or ;; modify it under the terms of the GNU General Public License as ;; published by the Free Software Foundation; either version 3, any later version. ;; ;; This program is distributed in the hope that it will be useful, but WITHOUT ;; ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS ;; FOR A PARTICULAR PURPOSE. See the GNU General Public License for more ;; details. ;; ;; You should have received a copy of the GNU General Public License along with ;; this program; see the file COPYING. If not, write to the Free Software ;; Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, ;; USA. ;; ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; ;;; Commentary: ;; customise inferior-julia-program-name to point to your julia-release-basic ;; and start the inferior with M-x julia. ;; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; (require 'compile); for compilation-* below ;;; Code: (defvar julia-mode-hook nil) (add-to-list 'auto-mode-alist '("\\.jl\\'" . julia-mode)) (defvar julia-syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?_ "_" table) ; underscores in words (modify-syntax-entry ?@ "_" table) (modify-syntax-entry ?. "_" table) (modify-syntax-entry ?# "<" table) ; # single-line comment start (modify-syntax-entry ?\n ">" table) ; \n single-line comment end (modify-syntax-entry ?\{ "(} " table) (modify-syntax-entry ?\} "){ " table) (modify-syntax-entry ?\[ "(] " table) (modify-syntax-entry ?\] ")[ " table) (modify-syntax-entry ?\( "() " table) (modify-syntax-entry ?\) ")( " table) ;(modify-syntax-entry ?\\ "." table) ; \ is an operator outside quotes (modify-syntax-entry ?' "." table) ; character quote or transpose (modify-syntax-entry ?\" "\"" table) (modify-syntax-entry ?` "\"" table) ;; (modify-syntax-entry ?\" "." table) (modify-syntax-entry ?? "." table) (modify-syntax-entry ?$ "." table) (modify-syntax-entry ?& "." table) (modify-syntax-entry ?* "." table) (modify-syntax-entry ?+ "." table) (modify-syntax-entry ?- "." table) (modify-syntax-entry ?< "." table) (modify-syntax-entry ?> "." table) (modify-syntax-entry ?= "." table) (modify-syntax-entry ?% "." table) table) "Syntax table for julia-mode") ;; syntax table that holds within strings (defvar julia-mode-string-syntax-table (let ((table (make-syntax-table))) table) "Syntax table for julia-mode") ;; disable " inside char quote (defvar julia-mode-char-syntax-table (let ((table (make-syntax-table))) (modify-syntax-entry ?\" "." table) table) "Syntax table for julia-mode") ;; not used ;; (defconst julia-string-regex ;; "\"[^\"]*?\\(\\(\\\\\\\\\\)*\\\\\"[^\"]*?\\)*\"") (defconst julia-char-regex "\\(\\s(\\|\\s-\\|-\\|[,%=<>\\+*/?&|$!\\^~\\\\;:]\\|^\\)\\('\\(\\([^']*?[^\\\\]\\)\\|\\(\\\\\\\\\\)\\)'\\)") (defconst julia-unquote-regex "\\(\\s(\\|\\s-\\|-\\|[,%=<>\\+*/?&|!\\^~\\\\;:]\\|^\\)\\($[a-zA-Z0-9_]+\\)") (defconst julia-forloop-in-regex "for +[^ ]+ +.*\\(in\\)\\(\\s-\\|$\\)+") (defconst ess-subset-regexp "\\[[0-9:, ]*\\]" ) (defconst julia-font-lock-defaults (list '("\\<\\(\\|Uint\\(8\\|16\\|32\\|64\\)\\|Int\\(8\\|16\\|32\\|64\\)\\|Integer\\|Float\\|Float32\\|Float64\\|Complex128\\|Complex64\\|ComplexNum\\|Bool\\|Char\\|Number\\|Scalar\\|Real\\|Int\\|Uint\\|Array\\|DArray\\|AbstractArray\\|AbstractVector\\|AbstractMatrix\\|SubArray\\|StridedArray\\|StridedVector\\|StridedMatrix\\|VecOrMat\\|StridedVecOrMat\\|Range\\|Range1\\|SparseMatrixCSC\\|Tuple\\|NTuple\\|Buffer\\|Size\\|Index\\|Symbol\\|Function\\|Vector\\|Matrix\\|Union\\|Type\\|Any\\|Complex\\|None\\|String\\|Ptr\\|Void\\|Exception\\|PtrInt\\|Long\\|Ulong\\)\\>" . font-lock-type-face) (cons (concat "\\<\\(" (mapconcat 'identity '("if" "else" "elseif" "while" "for" "begin" "end" "quote" "try" "catch" "return" "local" "abstract" "function" "macro" "ccall" "typealias" "break" "continue" "type" "global" "@\\w+" "module" "import" "export" "const" "let" "bitstype" "using") "\\|") "\\)\\>") 'font-lock-keyword-face) '("\\<\\(true\\|false\\|C_NULL\\|Inf\\|NaN\\|Inf32\\|NaN32\\)\\>" . font-lock-constant-face) (list julia-unquote-regex 2 'font-lock-constant-face) (list julia-char-regex 2 'font-lock-string-face) (list julia-forloop-in-regex 1 'font-lock-keyword-face) ;; (cons ess-subset-regexp 'font-lock-constant-face) (cons "\\(\\sw+\\) ?(" '(1 font-lock-function-name-face keep)) ;(list julia-string-regex 0 'font-lock-string-face) )) (defconst julia-block-start-keywords (list "if" "while" "for" "begin" "try" "function" "type" "let" "macro" "quote")) (defconst julia-block-other-keywords (list "else" "elseif")) (defconst julia-block-end-keywords (list "end" "else" "elseif" "catch")) (defun ess-inside-brackets-p (&optional pos) (save-excursion (let* ((pos (or pos (point))) (beg (re-search-backward "\\[" (max (point-min) (- pos 1000)) t)) (end (re-search-forward "\\]" (min (point-max) (+ pos 1000)) t))) (and beg end (> pos beg) (> end pos))))) (defun julia-at-keyword (kw-list) ; not a keyword if used as a field name, X.word, or quoted, :word (and (or (= (point) 1) (and (not (equal (char-before (point)) ?.)) (not (equal (char-before (point)) ?:)))) (not (ess-inside-string-or-comment-p (point))) (not (ess-inside-brackets-p (point))) (member (current-word) kw-list))) ; get the position of the last open block (defun julia-last-open-block-pos (min) (let ((count 0)) (while (not (or (> count 0) (<= (point) min))) (backward-word 1) (setq count (cond ((julia-at-keyword julia-block-start-keywords) (+ count 1)) ((and (equal (current-word) "end") (not (ess-inside-comment-p)) (not (ess-inside-brackets-p))) (- count 1)) (t count)))) (if (> count 0) (point) nil))) ; get indent for last open block (defun julia-last-open-block (min) (let ((pos (julia-last-open-block-pos min))) (and pos (progn (goto-char pos) (+ julia-basic-offset (current-indentation)))))) ; return indent implied by a special form opening on the previous line, if any (defun julia-form-indent () (forward-line -1) (end-of-line) (backward-sexp) (if (julia-at-keyword julia-block-other-keywords) (+ julia-basic-offset (current-indentation)) (if (char-equal (char-after (point)) ?\() (progn (backward-word 1) (let ((cur (current-indentation))) (if (julia-at-keyword julia-block-start-keywords) (+ julia-basic-offset cur) nil))) nil))) (defun julia-paren-indent () (let* ((p (parse-partial-sexp (save-excursion ;; only indent by paren if the last open ;; paren is closer than the last open ;; block (or (julia-last-open-block-pos (point-min)) (point-min))) (progn (beginning-of-line) (point)))) (pos (cadr p))) (if (or (= 0 (car p)) (null pos)) nil (progn (goto-char pos) (+ 1 (current-column)))))) ; (forward-line -1) ; (end-of-line) ; (let ((pos (condition-case nil ; (scan-lists (point) -1 1) ; (error nil)))) ; (if pos ; (progn (goto-char pos) (+ 1 (current-column))) ; nil))) (defun julia-indent-line () "Indent current line of julia code" (interactive) ; (save-excursion (end-of-line) (indent-line-to (or (and (ess-inside-string-p (point-at-bol)) 0) (save-excursion (ignore-errors (julia-form-indent))) (save-excursion (ignore-errors (julia-paren-indent))) ;; previous line ends in = (save-excursion (beginning-of-line) (skip-chars-backward " \t\n") (when (eql (char-before) ?=) (+ julia-basic-offset (current-indentation)))) (save-excursion (let ((endtok (progn (beginning-of-line) (forward-to-indentation 0) (julia-at-keyword julia-block-end-keywords)))) (ignore-errors (+ (julia-last-open-block (point-min)) (if endtok (- julia-basic-offset) 0))))) ;; take same indentation as previous line (save-excursion (forward-line -1) (current-indentation)) 0)) (when (julia-at-keyword julia-block-end-keywords) (forward-word 1))) (defvar julia-editing-alist '((paragraph-start . (concat "\\s-*$\\|" page-delimiter)) (paragraph-separate . (concat "\\s-*$\\|" page-delimiter)) (paragraph-ignore-fill-prefix . t) (require-final-newline . t) (comment-start . "# ") (comment-add . 1) (comment-start-skip . "#+\\s-*") (comment-column . 40) ;;(comment-indent-function . 'S-comment-indent) ;;(ess-comment-indent . 'S-comment-indent) ;; (ess-indent-line . 'S-indent-line) ;;(ess-calculate-indent . 'ess-calculate-indent) (ess-indent-line-function . 'julia-indent-line) (indent-line-function . 'julia-indent-line) (parse-sexp-ignore-comments . t) (ess-style . ess-default-style) ;; ignored (ess-local-process-name . nil) ;;(ess-keep-dump-files . 'ask) (ess-mode-syntax-table . julia-syntax-table) ;; For Changelog add, require ' ' before <- : "attr<-" is a function name : ;; (add-log-current-defun-header-regexp . "^\\(.+\\)\\s-+=[ \t\n]*function") (add-log-current-defun-header-regexp . "^.*function[ \t]*\\([^ \t(]*\\)[ \t]*(") (font-lock-defaults . '(julia-font-lock-defaults nil nil ((?\_ . "w")))) ) "General options for julia source files.") (autoload 'inferior-ess "ess-inf" "Run an ESS process.") (autoload 'ess-mode "ess-mode" "Edit an ESS process.") (defun julia-send-string-function (process string visibly) (let ((file (concat temporary-file-directory "julia_eval_region.jl"))) (with-temp-file file (insert string)) (process-send-string process (format ess-load-command file)))) (defun julia-get-help-topics (&optional proc) (ess-get-words-from-vector "ESS.all_help_topics()\n")) ;; (ess-command com))) (defvar julia-help-command "help(\"%s\")\n") (defvar ess-julia-error-regexp-alist '(julia-in julia-at) "List of symbols which are looked up in `compilation-error-regexp-alist-alist'.") (add-to-list 'compilation-error-regexp-alist-alist '(julia-in "^\\s-*in [^ \t\n]* \\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1)) (add-to-list 'compilation-error-regexp-alist-alist '(julia-at "^\\S-+\\s-+\\(at \\(.*\\):\\([0-9]+\\)\\)" 2 3 nil 2 1)) (defvar julia-customize-alist '((comint-use-prompt-regexp . t) (ess-eldoc-function . 'ess-julia-eldoc-function) (inferior-ess-primary-prompt . "a> ") ;; from julia> (inferior-ess-secondary-prompt . nil) (inferior-ess-prompt . "\\w*> ") (ess-local-customize-alist . 'julia-customize-alist) (inferior-ess-program . inferior-julia-program-name) (inferior-ess-font-lock-defaults . julia-font-lock-defaults) (ess-get-help-topics-function . 'julia-get-help-topics) (ess-help-web-search-command . "http://docs.julialang.org/en/latest/search/?q=%s") (ess-load-command . "include(\"%s\")\n") (ess-funargs-command . "ESS.fun_args(\"%s\")\n") (ess-dump-error-re . "in \\w* at \\(.*\\):[0-9]+") (ess-error-regexp . "\\(^\\s-*at\\s-*\\(?3:.*\\):\\(?2:[0-9]+\\)\\)") (ess-error-regexp-alist . ess-julia-error-regexp-alist) (ess-send-string-function . nil);'julia-send-string-function) (ess-imenu-generic-expression . julia-imenu-generic-expression) ;; (inferior-ess-objects-command . inferior-R-objects-command) ;; (inferior-ess-search-list-command . "search()\n") (inferior-ess-help-command . julia-help-command) ;; (inferior-ess-help-command . "help(\"%s\")\n") (ess-language . "julia") (ess-dialect . "julia") (ess-suffix . "jl") (ess-dump-filename-template . (ess-replace-regexp-in-string "S$" ess-suffix ; in the one from custom: ess-dump-filename-template-proto)) (ess-mode-syntax-table . julia-syntax-table) (ess-mode-editing-alist . julia-editing-alist) (ess-change-sp-regexp . nil );ess-R-change-sp-regexp) (ess-help-sec-regex . ess-help-R-sec-regex) (ess-help-sec-keys-alist . ess-help-R-sec-keys-alist) (ess-loop-timeout . ess-S-loop-timeout);fixme: dialect spec. (ess-cmd-delay . ess-R-cmd-delay) (ess-function-pattern . ess-R-function-pattern) (ess-object-name-db-file . "ess-r-namedb.el" ) (ess-smart-operators . ess-R-smart-operators) (inferior-ess-help-filetype . nil) (inferior-ess-exit-command . "exit()\n") ;;harmful for shell-mode's C-a: -- but "necessary" for ESS-help? (inferior-ess-start-file . nil) ;; "~/.ess-R" (inferior-ess-start-args . "") (inferior-ess-language-start . nil) (ess-STERM . "iESS") (ess-editor . R-editor) (ess-pager . R-pager) ) "Variables to customize for Julia -- set up later than emacs initialization.") (defvar ess-julia-versions '("julia") "List of partial strings for versions of Julia to access within ESS. Each string specifies the start of a filename. If a filename beginning with one of these strings is found on `exec-path', a M-x command for that version of Julia is made available. ") (defcustom inferior-julia-args "" "String of arguments (see 'julia --help') used when starting julia." ;; These arguments are currently not passed to other versions of julia that have ;; been created using the variable `ess-r-versions'." :group 'ess-julia :type 'string) ;;;###autoload (defun julia-mode (&optional proc-name) "Major mode for editing julia source. See `ess-mode' for more help." (interactive "P") ;; (setq ess-customize-alist julia-customize-alist) (ess-mode julia-customize-alist proc-name) ;; for emacs < 24 ;; (add-hook 'comint-dynamic-complete-functions 'ess-complete-object-name nil 'local) ;; for emacs >= 24 ;; (remove-hook 'completion-at-point-functions 'ess-filename-completion 'local) ;; should be first ;; (add-hook 'completion-at-point-functions 'ess-object-completion nil 'local) ;; (add-hook 'completion-at-point-functions 'ess-filename-completion nil 'local) (if (fboundp 'ess-add-toolbar) (ess-add-toolbar)) (set (make-local-variable 'end-of-defun-function) 'ess-end-of-function) ;; (local-set-key "\t" 'julia-indent-line) ;; temp workaround ;; (set (make-local-variable 'indent-line-function) 'julia-indent-line) (set (make-local-variable 'julia-basic-offset) 4) (setq imenu-generic-expression julia-imenu-generic-expression) (imenu-add-to-menubar "Imenu-jl") (run-hooks 'julia-mode-hook)) (defvar ess-julia-post-run-hook nil "Functions run in process buffer after the initialization of julia process.") ;;;###autoload (defun julia (&optional start-args) "Call 'julia', Optional prefix (C-u) allows to set command line arguments, such as --load=. This should be OS agnostic. If you have certain command line arguments that should always be passed to julia, put them in the variable `inferior-julia-args'." (interactive "P") ;; get settings, notably inferior-julia-program-name : (if (null inferior-julia-program-name) (error "'inferior-julia-program-name' does not point to 'julia-release-basic' executable") (setq ess-customize-alist julia-customize-alist) (ess-write-to-dribble-buffer ;; for debugging only (format "\n(julia): ess-dialect=%s, buf=%s, start-arg=%s\n current-prefix-arg=%s\n" ess-dialect (current-buffer) start-args current-prefix-arg)) (let* ((jl-start-args (concat inferior-julia-args " " ; add space just in case (if start-args (read-string (concat "Starting Args" (if inferior-julia-args (concat " [other than '" inferior-julia-args "']")) " ? ")) nil)))) (inferior-ess jl-start-args) ;; -> .. (ess-multi ...) -> .. (inferior-ess-mode) .. (ess--tb-start) (set (make-local-variable 'julia-basic-offset) 4) ;; remove ` from julia's logo (goto-char (point-min)) (while (re-search-forward "`" nil t) (replace-match "'")) (goto-char (point-max)) (ess--inject-code-from-file (format "%sess-julia.jl" ess-etc-directory)) (with-ess-process-buffer nil (run-mode-hooks 'ess-julia-post-run-hook)) ))) ;;; ELDOC (defun ess-julia-eldoc-function () "Return the doc string, or nil. If an ESS process is not associated with the buffer, do not try to look up any doc strings." (interactive) (when (and (ess-process-live-p) (not (ess-process-get 'busy))) (let ((funname (or (and ess-eldoc-show-on-symbol ;; aggressive completion (symbol-at-point)) (car (ess--funname.start))))) (when funname (let* ((args (copy-sequence (nth 2 (ess-function-arguments funname)))) (W (- (window-width (minibuffer-window)) (+ 4 (length funname)))) (doc (concat (propertize funname 'face font-lock-function-name-face) ": "))) (when args (setq args (sort args (lambda (s1 s2) (< (length s1) (length s2))))) (setq doc (concat doc (pop args))) (while (and args (< (length doc) W)) (setq doc (concat doc " " (pop args)))) (when (and args (< (length doc) W)) (setq doc (concat doc " {--}")))) doc))))) ;;; IMENU (defvar julia-imenu-generic-expression ;; don't use syntax classes, screws egrep '(("Function (_)" "[ \t]*function[ \t]+\\(_[^ \t\n]*\\)" 1) ("Function" "[ \t]*function[ \t]+\\([^_][^\t\n]*\\)" 1) ("Const" "[ \t]*const \\([^ \t\n]*\\)" 1) ("Type" "^[ \t]*[a-zA-Z0-9_]*type[a-zA-Z0-9_]* \\([^ \t\n]*\\)" 1) ("Require" " *\\(\\brequire\\)(\\([^ \t\n)]*\\)" 2) ("Include" " *\\(\\binclude\\)(\\([^ \t\n)]*\\)" 2) ;; ("Classes" "^.*setClass(\\(.*\\)," 1) ;; ("Coercions" "^.*setAs(\\([^,]+,[^,]*\\)," 1) ; show from and to ;; ("Generics" "^.*setGeneric(\\([^,]*\\)," 1) ;; ("Methods" "^.*set\\(Group\\|Replace\\)?Method(\"\\(.+\\)\"," 2) ;; ;;[ ]*\\(signature=\\)?(\\(.*,?\\)*\\)," 1) ;; ;; ;; ;;("Other" "^\\(.+\\)\\s-*<-[ \t\n]*[^\\(function\\|read\\|.*data\.frame\\)]" 1) ;; ("Package" "^.*\\(library\\|require\\)(\\(.*\\)," 2) ;; ("Data" "^\\(.+\\)\\s-*<-[ \t\n]*\\(read\\|.*data\.frame\\).*(" 1))) )) (provide 'ess-julia) ================================================ FILE: samples/Emacs Lisp/filenames/.abbrev_defs ================================================ (define-abbrev-table 'c-mode-abbrev-table '( )) (define-abbrev-table 'fundamental-mode-abbrev-table '( ("TM" "™" nil 0) ("(R)" "®" nil 0) ("C=" "€" nil 0))) ================================================ FILE: samples/Emacs Lisp/filenames/.gnus ================================================ (setq user-full-name "Alhadis") (setq user-mail-address "fake.account@gmail.com") (auto-image-file-mode) (setq mm-inline-large-images t) (add-to-list 'mm-attachment-override-types "image/*") (setq gnus-select-method '(nnimap "gmail" (nnimap-address "imap.gmail.com") (nnimap-server-port 777) (nnimap-stream ssl))) (setq message-send-mail-function 'smtpmail-send-it smtpmail-starttls-credentials '(("smtp.gmail.com" 600 nil nil)) smtpmail-auth-credentials '(("smtp.gmail.com" 700 "me@lisp.com" nil)) smtpmail-default-smtp-server "smtp.gmail.com" smtpmail-smtp-server "smtp.gmail.com" smtpmail-smtp-service 800 setq gnus-ignored-from-addresses "^from\\.Telstra[ \t\r\n]+Thanks") ================================================ FILE: samples/Emacs Lisp/filenames/.spacemacs ================================================ ;; -*- mode: emacs-lisp -*- ;; This file is loaded by Spacemacs at startup. ;; It must be stored in your home directory. (defun dotspacemacs/layers () "Configuration Layers declaration." (setq-default ;; List of additional paths where to look for configuration layers. ;; Paths must have a trailing slash (i.e. `~/.mycontribs/') dotspacemacs-configuration-layer-path '() ;; List of configuration layers to load. If it is the symbol `all' instead ;; of a list then all discovered layers will be installed. dotspacemacs-configuration-layers '( ;; ---------------------------------------------------------------- ;; Example of useful layers you may want to use right away. ;; Uncomment some layer names and press (Vim style) or ;; (Emacs style) to install them. ;; ---------------------------------------------------------------- emacs-lisp charlock_holmes escape_utils mime-types rugged minitest mocha plist pry rake yajl-ruby colour-proximity licensed licensee ;; List of additional packages that will be installed without being ;; wrapped in a layer. If you need some configuration for these ;; packages then consider to create a layer, you can also put the ;; configuration in `dotspacemacs/config'. dotspacemacs-additional-packages '() ;; A list of packages and/or extensions that will not be install and loaded. dotspacemacs-excluded-packages '() ;; If non-nil spacemacs will delete any orphan packages, i.e. packages that ;; are declared in a layer which is not a member of ;; the list `dotspacemacs-configuration-layers' dotspacemacs-delete-orphan-packages t)) (defun dotspacemacs/init () "Initialization function. This function is called at the very startup of Spacemacs initialization before layers configuration." ;; This setq-default sexp is an exhaustive list of all the supported ;; spacemacs settings. (setq-default ;; Either `vim' or `emacs'. Evil is always enabled but if the variable ;; is `emacs' then the `holy-mode' is enabled at startup. dotspacemacs-editing-style 'vim ;; If non nil output loading progress in `*Messages*' buffer. dotspacemacs-verbose-loading nil ;; Specify the startup banner. Default value is `official', it displays ;; the official spacemacs logo. An integer value is the index of text ;; banner, `random' chooses a random text banner in `core/banners' ;; directory. A string value must be a path to an image format supported ;; by your Emacs build. ;; If the value is nil then no banner is displayed. dotspacemacs-startup-banner 'official ;; List of items to show in the startup buffer. If nil it is disabled. ;; Possible values are: `recents' `bookmarks' `projects'." dotspacemacs-startup-lists '(bookmarks projects recents) ;; List of themes, the first of the list is loaded when spacemacs starts. ;; Press T n to cycle to the next theme in the list (works great ;; with 2 themes variants, one dark and one light) dotspacemacs-themes '( spacemacs-dark spacemacs-light solarized-dark solarized-light atom-light-ui atom-dark-ui atom-material-ui zenburn ;; If non nil the cursor colour matches the state colour. dotspacemacs-colorize-cursor-according-to-state t ;; Default font. `powerline-scale' allows to quickly tweak the mode-line ;; size to make separators look not too crappy. dotspacemacs-default-font '("Menloco" :size 11 :weight normal :width normal :powerline-scale 1.1) ;; The leader key dotspacemacs-leader-key "SPC" ;; The leader key accessible in `emacs state' and `insert state' dotspacemacs-emacs-leader-key "M-m" ;; Major mode leader key is a shortcut key which is the equivalent of ;; pressing ` m`. Set it to `nil` to disable it. dotspacemacs-major-mode-leader-key "," ;; Major mode leader key accessible in `emacs state' and `insert state' dotspacemacs-major-mode-emacs-leader-key "C-M-m" ;; The command key used for Evil commands (ex-commands) and ;; Emacs commands (M-x). ;; By default the command key is `:' so ex-commands are executed like in Vim ;; with `:' and Emacs commands are executed with ` :'. dotspacemacs-command-key ":" ;; Location where to auto-save files. Possible values are `original' to ;; auto-save the file in-place, `cache' to auto-save the file to another ;; file stored in the cache directory and `nil' to disable auto-saving. ;; Default value is `cache'. dotspacemacs-auto-save-file-location 'cache ;; If non nil then `ido' replaces `helm' for some commands. For now only ;; `find-files' (SPC f f) is replaced. dotspacemacs-use-ido nil ;; If non nil the paste micro-state is enabled. When enabled pressing `p` ;; several times cycle between the kill ring content. dotspacemacs-enable-paste-micro-state nil ;; Guide-key delay in seconds. The Guide-key is the popup buffer listing ;; the commands bound to the current keystrokes. dotspacemacs-guide-key-delay 0.4 ;; If non nil a progress bar is displayed when spacemacs is loading. This ;; may increase the boot time on some systems and emacs builds, set it to ;; nil ;; to boost the loading time. dotspacemacs-loading-progress-bar t ;; If non nil the frame is fullscreen when Emacs starts up. ;; (Emacs 24.4+ only) dotspacemacs-fullscreen-at-startup nil ;; If non nil `spacemacs/toggle-fullscreen' will not use native fullscreen. ;; Use to disable fullscreen animations in OSX." dotspacemacs-fullscreen-use-non-native nil ;; If non nil the frame is maximized when Emacs starts up. ;; Takes effect only if `dotspacemacs-fullscreen-at-startup' is nil. ;; (Emacs 24.4+ only) dotspacemacs-maximized-at-startup nil ;; A value from the range (0..100), in increasing opacity, which describes ;; the transparency level of a frame when it's active or selected. ;; Transparency can be toggled through `toggle-transparency'. dotspacemacs-active-transparency 90 ;; A value from the range (0..100), in increasing opacity, which describes ;; the transparency level of a frame when it's inactive or deselected. ;; Transparency can be toggled through `toggle-transparency'. dotspacemacs-inactive-transparency 90 ;; If non nil unicode symbols are displayed in the mode line. dotspacemacs-mode-line-unicode-symbols t ;; If non nil smooth scrolling (native-scrolling) is enabled. Smooth ;; scrolling overrides the default behavior of Emacs which recenters the ;; point when it reaches the top or bottom of the screen. dotspacemacs-smooth-scrolling t ;; If non-nil smartparens-strict-mode will be enabled in programming modes. dotspacemacs-smartparens-strict-mode nil ;; Select a scope to highlight delimiters. Possible value is `all', ;; `current' or `nil'. Default is `all' dotspacemacs-highlight-delimiters 'all ;; If non nil advises quit functions to keep server open when quitting. dotspacemacs-persistent-server nil ;; List of search tool executable names. Spacemacs uses the first installed ;; tool of the list. Supported tools are `ag', `pt', `ack' and `grep'. dotspacemacs-search-tools '("ag" "pt" "ack" "grep") ;; The default package repository used if no explicit repository has been ;; specified with an installed package. ;; Not used for now. dotspacemacs-default-package-repository nil ;; If non nil line numbers are turned on in all `prog-mode' and `text-mode' ;; derivatives. If set to `relative', also turns on relative line numbers. ;; (default nil) dotspacemacs-line-numbers 'relative ;; Delete whitespace while saving buffer. Possible values are `all', ;; `trailing', `changed' or `nil'. Default is `changed' (cleanup whitespace ;; on changed lines) (default 'changed) dotspacemacs-whitespace-cleanup 'changed ) ;; User initialization goes here ) (defun dotspacemacs/user-config () "Configuration function. This function is called at the very end of Spacemacs initialization after layers configuration." (add-hook 'alchemist-mode-hook 'company-mode) (add-hook 'projectile-mode-hook 'projectile-rails-on) (setq ruby-insert-encoding-magic-comment nil) (setq web-mode-markup-indent-offset 2) (setq web-mode-code-indent-offset 2) (spacemacs/toggle-golden-ratio-on) (spacemacs/toggle-indent-guide-globally-on) (spacemacs/toggle-centered-point-globally-on) ) ;; Do not write anything past this comment. This is where Emacs will ;; auto-generate custom variable definitions. (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) ================================================ FILE: samples/Emacs Lisp/filenames/.viper ================================================ (setq viper-inhibit-startup-message 't) (setq viper-expert-level '5) ; Key bindings (define-key viper-vi-global-user-map "\C-d" 'end-of-line) ; Return to top of window (defun my-viper-return-to-top () (interactive) (beginning-of-buffer)) ================================================ FILE: samples/Emacs Lisp/filenames/Cask ================================================ (package "composer" "0.0.7" "Interface to PHP Composer") (source "melpa" "https://melpa.org/packages/") (package-file "composer.el") (depends-on "f") (depends-on "s") (depends-on "request") (depends-on "seq") ================================================ FILE: samples/Emacs Lisp/filenames/Eask ================================================ ;; -*- mode: eask; lexical-binding: t -*- (package "composer" "0.2.0" "Interface to PHP Composer") (website-url "https://github.com/emacs-php/composer.el") (keywords "tools" "php" "dependency" "manager") (package-file "composer.el") (script "test" "echo \"Error: no test specified\" && exit 1") (source 'gnu) (source 'melpa) (depends-on "emacs" "25.1") (depends-on "seq") (depends-on "php-runtime") (setq network-security-level 'low) ; see https://github.com/jcs090218/setup-emacs-windows/issues/156#issuecomment-932956432 ================================================ FILE: samples/Emacs Lisp/filenames/Project.ede ================================================ ;; Object EDE (ede-proj-project "Linguist" :name "Linguist" :version "4.9" :file "Project.ede" :targets (list (ede-proj-target-elisp-autoloads "autoloads" :name "autoloads" :path "test/samples/Emacs Lisp" :autoload-file "dude.el" ) (ede-proj-target-elisp "init" :name "init" :path "" :source '("ede-load.el" "wait-what.el") :compiler 'ede-emacs-preload-compiler :pre-load-packages '("sample-names") ) (ede-proj-target-elisp "what" :name "the" :path "" :source '("h.el" "am-i-writing.el") :versionsource '("hell.el") :compiler 'ede-emacs-preload-compiler :aux-packages '("what" "the" "hell-files" "am-i-writing") ) ) :web-site-url "https://github.com/github/linguist" :web-site-directory "../" :web-site-file "CONTRIBUTING.md" :ftp-upload-site "/ftp@git.hub.com:/madeup" :configuration-variables 'nil :metasubproject 't ) ================================================ FILE: samples/Emacs Lisp/filenames/_emacs ================================================ ;; UTF-8 support ;; (set-language-environment "UTF-8") (setenv "LANG" "en_AU.UTF-8") (setenv "LC_ALL" "en_AU.UTF-8") (setq default-tab-width 4) ;;; Function to load all ".el" files in ~/.emacs.d/config (defun load-directory (directory) "Recursively load all Emacs Lisp files in a directory." (dolist (element (directory-files-and-attributes directory nil nil nil)) (let* ((path (car element)) (fullpath (concat directory "/" path)) (isdir (car (cdr element))) (ignore-dir (or (string= path ".") (string= path "..")))) (cond ((and (eq isdir t) (not ignore-dir)) (load-directory fullpath)) ((and (eq isdir nil) (string= (substring path -3) ".el")) (load (file-name-sans-extension fullpath))))))) ;; Tell Emacs we'd like to use Hunspell for spell-checking (setq ispell-program-name (executable-find "hunspell")) ;; Load Homebrew-installed packages (let ((default-directory "/usr/local/share/emacs/site-lisp/")) (normal-top-level-add-subdirs-to-load-path)) (load "aggressive-indent") (add-hook 'emacs-lisp-mode-hook #'aggressive-indent-mode) (autoload 'rust-mode "rust-mode" nil t) (add-to-list 'auto-mode-alist '("\\.rs\\'" . rust-mode)) ;; Load Git-related syntax highlighting (add-to-list 'load-path "~/.emacs.d/lisp/") (load "git-modes") (load "git-commit") ;; Keybindings (global-set-key (kbd "C-u") (lambda () (interactive) (kill-line 0))) ;; Show cursor's current column number (setq column-number-mode t) ;; Disable autosave (setq auto-save-default nil) ;; Use a single directory for storing backup files (setq backup-directory-alist `(("." . "~/.emacs.d/auto-save-list"))) (setq backup-by-copying t) (setq delete-old-versions t kept-new-versions 6 kept-old-versions 2 version-control t) (custom-set-variables ;; custom-set-variables was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. '(blink-cursor-mode nil) '(column-number-mode t) '(show-paren-mode t)) (custom-set-faces ;; custom-set-faces was added by Custom. ;; If you edit it by hand, you could mess it up, so be careful. ;; Your init file should contain only one such instance. ;; If there is more than one, they won't work right. ) ================================================ FILE: samples/Emacs Lisp/filenames/abbrev_defs ================================================ (define-abbrev-table 'fundamental-mode-abbrev-table '( ("cat" "Concatenate" nil 0) ("WTF" "World Trade Federation " nil 0) ("rtbtm" "Read that back to me" nil 0))) (define-abbrev-table 'shell-script-mode-abbrev-table '( ("brake", "bundle rake exec" nil 0) ("pls", "warning: setting Encoding.default_external"))) ================================================ FILE: samples/EmberScript/momentComponent.em ================================================ class App.FromNowView extends Ember.View tagName: 'time' template: Ember.Handlebars.compile '{{view.output}}' output: ~> return moment(@value).fromNow() didInsertElement: -> @tick() tick: -> f = -> @notifyPropertyChange 'output' @tick() nextTick = Ember.run.later(this, f, 1000) @set 'nextTick', nextTick willDestroyElement: -> nextTick = @nextTick Ember.run.cancel nextTick Ember.Handlebars.helper 'fromNow', App.FromNowView ================================================ FILE: samples/Erlang/170-os-daemons.es ================================================ #! /usr/bin/env escript % Licensed under the Apache License, Version 2.0 (the "License"); you may not % use this file except in compliance with the License. You may obtain a copy of % the License at % % http://www.apache.org/licenses/LICENSE-2.0 % % Unless required by applicable law or agreed to in writing, software % distributed under the License is distributed on an "AS IS" BASIS, WITHOUT % WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the % License for the specific language governing permissions and limitations under % the License. loop() -> loop(io:read("")). loop({ok, _}) -> loop(io:read("")); loop(eof) -> stop; loop({error, Reason}) -> throw({error, Reason}). main([]) -> loop(). ================================================ FILE: samples/Erlang/compiler.app ================================================ % This is an -*- erlang -*- file. %% %CopyrightBegin% %% %% Copyright Ericsson AB 1997-2022. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% %CopyrightEnd% {application, compiler, [{description, "ERTS CXC 138 10"}, {vsn, "8.2.2"}, {modules, [ beam_a, beam_asm, beam_bounds, beam_block, beam_call_types, beam_clean, beam_dict, beam_digraph, beam_disasm, beam_flatten, beam_jump, beam_kernel_to_ssa, beam_listing, beam_opcodes, beam_ssa, beam_ssa_bc_size, beam_ssa_bool, beam_ssa_bsm, beam_ssa_codegen, beam_ssa_dead, beam_ssa_lint, beam_ssa_opt, beam_ssa_pp, beam_ssa_pre_codegen, beam_ssa_recv, beam_ssa_share, beam_ssa_throw, beam_ssa_type, beam_trim, beam_types, beam_utils, beam_validator, beam_z, cerl, cerl_clauses, cerl_inline, cerl_trees, compile, core_scan, core_lint, core_parse, core_pp, core_lib, erl_bifs, rec_env, sys_core_alias, sys_core_bsm, sys_core_fold, sys_core_fold_lists, sys_core_inline, sys_core_prepare, sys_messages, sys_pre_attributes, v3_core, v3_kernel, v3_kernel_pp ]}, {registered, []}, {applications, [kernel, stdlib]}, {env, []}, {runtime_dependencies, ["stdlib-4.0","kernel-8.4","erts-13.0", "crypto-5.1"]}]}. ================================================ FILE: samples/Erlang/elixir_parser.yrl ================================================ Nonterminals grammar expr_list expr container_expr block_expr access_expr no_parens_expr no_parens_zero_expr no_parens_one_expr no_parens_one_ambig_expr bracket_expr bracket_at_expr bracket_arg matched_expr unmatched_expr max_expr unmatched_op_expr matched_op_expr no_parens_op_expr no_parens_many_expr comp_op_eol at_op_eol unary_op_eol and_op_eol or_op_eol capture_op_eol add_op_eol mult_op_eol two_op_eol three_op_eol pipe_op_eol stab_op_eol arrow_op_eol match_op_eol when_op_eol in_op_eol in_match_op_eol type_op_eol rel_op_eol open_paren close_paren empty_paren eoe list list_args open_bracket close_bracket tuple open_curly close_curly bit_string open_bit close_bit map map_op map_close map_args map_expr struct_op assoc_op_eol assoc_expr assoc_base assoc_update assoc_update_kw assoc container_args_base container_args call_args_parens_expr call_args_parens_base call_args_parens parens_call call_args_no_parens_one call_args_no_parens_ambig call_args_no_parens_expr call_args_no_parens_comma_expr call_args_no_parens_all call_args_no_parens_many call_args_no_parens_many_strict stab stab_eoe stab_expr stab_op_eol_and_expr stab_parens_many kw_eol kw_base kw call_args_no_parens_kw_expr call_args_no_parens_kw dot_op dot_alias dot_alias_container dot_identifier dot_op_identifier dot_do_identifier dot_paren_identifier dot_bracket_identifier do_block fn_eoe do_eoe end_eoe block_eoe block_item block_list . Terminals identifier kw_identifier kw_identifier_safe kw_identifier_unsafe bracket_identifier paren_identifier do_identifier block_identifier fn 'end' aliases number atom atom_safe atom_unsafe bin_string list_string sigil dot_call_op op_identifier comp_op at_op unary_op and_op or_op arrow_op match_op in_op in_match_op type_op dual_op add_op mult_op two_op three_op pipe_op stab_op when_op assoc_op capture_op rel_op 'true' 'false' 'nil' 'do' eol ';' ',' '.' '(' ')' '[' ']' '{' '}' '<<' '>>' '%{}' '%' . Rootsymbol grammar. %% Two shift/reduce conflicts coming from call_args_parens. Expect 2. %% Changes in ops and precedence should be reflected on lib/elixir/lib/macro.ex %% Note though the operator => in practice has lower precedence than all others, %% its entry in the table is only to support the %{user | foo => bar} syntax. Left 5 do. Right 10 stab_op_eol. %% -> Left 20 ','. Nonassoc 30 capture_op_eol. %% & Left 40 in_match_op_eol. %% <-, \\ (allowed in matches along =) Right 50 when_op_eol. %% when Right 60 type_op_eol. %% :: Right 70 pipe_op_eol. %% | Right 80 assoc_op_eol. %% => Right 90 match_op_eol. %% = Left 130 or_op_eol. %% ||, |||, or Left 140 and_op_eol. %% &&, &&&, and Left 150 comp_op_eol. %% ==, !=, =~, ===, !== Left 160 rel_op_eol. %% <, >, <=, >= Left 170 arrow_op_eol. %% |>, <<<, >>>, ~>>, <<~, ~>, <~, <~>, <|> Left 180 in_op_eol. %% in Left 190 three_op_eol. %% ^^^ Right 200 two_op_eol. %% ++, --, .., <> Left 210 add_op_eol. %% +, - Left 220 mult_op_eol. %% *, / Nonassoc 300 unary_op_eol. %% +, -, !, ^, not, ~~~ Left 310 dot_call_op. Left 310 dot_op. %% . Nonassoc 320 at_op_eol. %% @ Nonassoc 330 dot_identifier. %%% MAIN FLOW OF EXPRESSIONS grammar -> eoe : nil. grammar -> expr_list : to_block('$1'). grammar -> eoe expr_list : to_block('$2'). grammar -> expr_list eoe : to_block('$1'). grammar -> eoe expr_list eoe : to_block('$2'). grammar -> '$empty' : nil. % Note expressions are on reverse order expr_list -> expr : ['$1']. expr_list -> expr_list eoe expr : ['$3'|'$1']. expr -> matched_expr : '$1'. expr -> no_parens_expr : '$1'. expr -> unmatched_expr : '$1'. %% In Elixir we have three main call syntaxes: with parentheses, %% without parentheses and with do blocks. They are represented %% in the AST as matched, no_parens and unmatched. %% %% Calls without parentheses are further divided according to how %% problematic they are: %% %% (a) no_parens_one: a call with one unproblematic argument %% (e.g. `f a` or `f g a` and similar) (includes unary operators) %% %% (b) no_parens_many: a call with several arguments (e.g. `f a, b`) %% %% (c) no_parens_one_ambig: a call with one argument which is %% itself a no_parens_many or no_parens_one_ambig (e.g. `f g a, b` %% or `f g h a, b` and similar) %% %% Note, in particular, that no_parens_one_ambig expressions are %% ambiguous and are interpreted such that the outer function has %% arity 1 (e.g. `f g a, b` is interpreted as `f(g(a, b))` rather %% than `f(g(a), b)`). Hence the name, no_parens_one_ambig. %% %% The distinction is required because we can't, for example, have %% a function call with a do block as argument inside another do %% block call, unless there are parentheses: %% %% if if true do true else false end do #=> invalid %% if(if true do true else false end) do #=> valid %% %% Similarly, it is not possible to nest calls without parentheses %% if their arity is more than 1: %% %% foo a, bar b, c #=> invalid %% foo(a, bar b, c) #=> invalid %% foo bar a, b #=> valid %% foo a, bar(b, c) #=> valid %% %% So the different grammar rules need to take into account %% if calls without parentheses are do blocks in particular %% segments and act accordingly. matched_expr -> matched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). matched_expr -> unary_op_eol matched_expr : build_unary_op('$1', '$2'). matched_expr -> at_op_eol matched_expr : build_unary_op('$1', '$2'). matched_expr -> capture_op_eol matched_expr : build_unary_op('$1', '$2'). matched_expr -> no_parens_one_expr : '$1'. matched_expr -> no_parens_zero_expr : '$1'. matched_expr -> access_expr : '$1'. matched_expr -> access_expr kw_identifier : throw_invalid_kw_identifier('$2'). unmatched_expr -> matched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). unmatched_expr -> unmatched_expr matched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). unmatched_expr -> unmatched_expr unmatched_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). unmatched_expr -> unmatched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). unmatched_expr -> unary_op_eol expr : build_unary_op('$1', '$2'). unmatched_expr -> at_op_eol expr : build_unary_op('$1', '$2'). unmatched_expr -> capture_op_eol expr : build_unary_op('$1', '$2'). unmatched_expr -> block_expr : '$1'. no_parens_expr -> matched_expr no_parens_op_expr : build_op(element(1, '$2'), '$1', element(2, '$2')). no_parens_expr -> unary_op_eol no_parens_expr : build_unary_op('$1', '$2'). no_parens_expr -> at_op_eol no_parens_expr : build_unary_op('$1', '$2'). no_parens_expr -> capture_op_eol no_parens_expr : build_unary_op('$1', '$2'). no_parens_expr -> no_parens_one_ambig_expr : '$1'. no_parens_expr -> no_parens_many_expr : '$1'. block_expr -> parens_call call_args_parens do_block : build_identifier('$1', '$2' ++ '$3'). block_expr -> parens_call call_args_parens call_args_parens do_block : build_nested_parens('$1', '$2', '$3' ++ '$4'). block_expr -> dot_do_identifier do_block : build_identifier('$1', '$2'). block_expr -> dot_identifier call_args_no_parens_all do_block : build_identifier('$1', '$2' ++ '$3'). matched_op_expr -> match_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> add_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> mult_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> two_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> three_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> and_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> or_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> in_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> in_match_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> type_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> when_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> pipe_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> comp_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> rel_op_eol matched_expr : {'$1', '$2'}. matched_op_expr -> arrow_op_eol matched_expr : {'$1', '$2'}. %% Warn for no parens subset matched_op_expr -> arrow_op_eol no_parens_one_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. unmatched_op_expr -> match_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> add_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> mult_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> two_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> three_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> and_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> or_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> in_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> in_match_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> type_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> when_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> pipe_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> comp_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> rel_op_eol unmatched_expr : {'$1', '$2'}. unmatched_op_expr -> arrow_op_eol unmatched_expr : {'$1', '$2'}. no_parens_op_expr -> match_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> add_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> mult_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> two_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> three_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> and_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> or_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> in_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> in_match_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> type_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> when_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> pipe_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> comp_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> rel_op_eol no_parens_expr : {'$1', '$2'}. no_parens_op_expr -> arrow_op_eol no_parens_expr : {'$1', '$2'}. %% Warn for no parens subset no_parens_op_expr -> arrow_op_eol no_parens_one_ambig_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. no_parens_op_expr -> arrow_op_eol no_parens_many_expr : warn_pipe('$1', '$2'), {'$1', '$2'}. %% Allow when (and only when) with keywords no_parens_op_expr -> when_op_eol call_args_no_parens_kw : {'$1', '$2'}. no_parens_one_ambig_expr -> dot_op_identifier call_args_no_parens_ambig : build_identifier('$1', '$2'). no_parens_one_ambig_expr -> dot_identifier call_args_no_parens_ambig : build_identifier('$1', '$2'). no_parens_many_expr -> dot_op_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2'). no_parens_many_expr -> dot_identifier call_args_no_parens_many_strict : build_identifier('$1', '$2'). no_parens_one_expr -> dot_op_identifier call_args_no_parens_one : build_identifier('$1', '$2'). no_parens_one_expr -> dot_identifier call_args_no_parens_one : build_identifier('$1', '$2'). no_parens_zero_expr -> dot_do_identifier : build_identifier('$1', nil). no_parens_zero_expr -> dot_identifier : build_identifier('$1', nil). %% From this point on, we just have constructs that can be %% used with the access syntax. Notice that (dot_)identifier %% is not included in this list simply because the tokenizer %% marks identifiers followed by brackets as bracket_identifier. access_expr -> bracket_at_expr : '$1'. access_expr -> bracket_expr : '$1'. access_expr -> at_op_eol number : build_unary_op('$1', ?exprs('$2')). access_expr -> unary_op_eol number : build_unary_op('$1', ?exprs('$2')). access_expr -> capture_op_eol number : build_unary_op('$1', ?exprs('$2')). access_expr -> fn_eoe stab end_eoe : build_fn('$1', reverse('$2')). access_expr -> open_paren stab close_paren : build_stab(reverse('$2')). access_expr -> open_paren stab ';' close_paren : build_stab(reverse('$2')). access_expr -> open_paren ';' stab ';' close_paren : build_stab(reverse('$3')). access_expr -> open_paren ';' stab close_paren : build_stab(reverse('$3')). access_expr -> open_paren ';' close_paren : build_stab([]). access_expr -> empty_paren : nil. access_expr -> number : ?exprs('$1'). access_expr -> list : element(1, '$1'). access_expr -> map : '$1'. access_expr -> tuple : '$1'. access_expr -> 'true' : ?id('$1'). access_expr -> 'false' : ?id('$1'). access_expr -> 'nil' : ?id('$1'). access_expr -> bin_string : build_bin_string('$1'). access_expr -> list_string : build_list_string('$1'). access_expr -> bit_string : '$1'. access_expr -> sigil : build_sigil('$1'). access_expr -> max_expr : '$1'. %% Aliases and properly formed calls. Used by map_expr. max_expr -> atom : ?exprs('$1'). max_expr -> atom_safe : build_quoted_atom('$1', true). max_expr -> atom_unsafe : build_quoted_atom('$1', false). max_expr -> parens_call call_args_parens : build_identifier('$1', '$2'). max_expr -> parens_call call_args_parens call_args_parens : build_nested_parens('$1', '$2', '$3'). max_expr -> dot_alias : '$1'. bracket_arg -> open_bracket kw close_bracket : build_list('$1', '$2'). bracket_arg -> open_bracket container_expr close_bracket : build_list('$1', '$2'). bracket_arg -> open_bracket container_expr ',' close_bracket : build_list('$1', '$2'). bracket_expr -> dot_bracket_identifier bracket_arg : build_access(build_identifier('$1', nil), '$2'). bracket_expr -> access_expr bracket_arg : build_access('$1', '$2'). bracket_at_expr -> at_op_eol dot_bracket_identifier bracket_arg : build_access(build_unary_op('$1', build_identifier('$2', nil)), '$3'). bracket_at_expr -> at_op_eol access_expr bracket_arg : build_access(build_unary_op('$1', '$2'), '$3'). %% Blocks do_block -> do_eoe 'end' : [[{do, nil}]]. do_block -> do_eoe stab end_eoe : [[{do, build_stab(reverse('$2'))}]]. do_block -> do_eoe block_list 'end' : [[{do, nil}|'$2']]. do_block -> do_eoe stab_eoe block_list 'end' : [[{do, build_stab(reverse('$2'))}|'$3']]. eoe -> eol : '$1'. eoe -> ';' : '$1'. eoe -> eol ';' : '$1'. fn_eoe -> 'fn' : '$1'. fn_eoe -> 'fn' eoe : '$1'. do_eoe -> 'do' : '$1'. do_eoe -> 'do' eoe : '$1'. end_eoe -> 'end' : '$1'. end_eoe -> eoe 'end' : '$2'. block_eoe -> block_identifier : '$1'. block_eoe -> block_identifier eoe : '$1'. stab -> stab_expr : ['$1']. stab -> stab eoe stab_expr : ['$3'|'$1']. stab_eoe -> stab : '$1'. stab_eoe -> stab eoe : '$1'. %% Here, `element(1, Token)` is the stab operator, %% while `element(2, Token)` is the expression. stab_expr -> expr : '$1'. stab_expr -> stab_op_eol_and_expr : build_op(element(1, '$1'), [], element(2, '$1')). stab_expr -> empty_paren stab_op_eol_and_expr : build_op(element(1, '$2'), [], element(2, '$2')). stab_expr -> call_args_no_parens_all stab_op_eol_and_expr : build_op(element(1, '$2'), unwrap_when(unwrap_splice('$1')), element(2, '$2')). stab_expr -> stab_parens_many stab_op_eol_and_expr : build_op(element(1, '$2'), unwrap_splice('$1'), element(2, '$2')). stab_expr -> stab_parens_many when_op expr stab_op_eol_and_expr : build_op(element(1, '$4'), [{'when', meta_from_token('$2'), unwrap_splice('$1') ++ ['$3']}], element(2, '$4')). stab_op_eol_and_expr -> stab_op_eol expr : {'$1', '$2'}. stab_op_eol_and_expr -> stab_op_eol : warn_empty_stab_clause('$1'), {'$1', nil}. block_item -> block_eoe stab_eoe : {?exprs('$1'), build_stab(reverse('$2'))}. block_item -> block_eoe : {?exprs('$1'), nil}. block_list -> block_item : ['$1']. block_list -> block_item block_list : ['$1'|'$2']. %% Helpers open_paren -> '(' : '$1'. open_paren -> '(' eol : '$1'. close_paren -> ')' : '$1'. close_paren -> eol ')' : '$2'. empty_paren -> open_paren ')' : '$1'. open_bracket -> '[' : '$1'. open_bracket -> '[' eol : '$1'. close_bracket -> ']' : '$1'. close_bracket -> eol ']' : '$2'. open_bit -> '<<' : '$1'. open_bit -> '<<' eol : '$1'. close_bit -> '>>' : '$1'. close_bit -> eol '>>' : '$2'. open_curly -> '{' : '$1'. open_curly -> '{' eol : '$1'. close_curly -> '}' : '$1'. close_curly -> eol '}' : '$2'. % Operators add_op_eol -> add_op : '$1'. add_op_eol -> add_op eol : '$1'. add_op_eol -> dual_op : '$1'. add_op_eol -> dual_op eol : '$1'. mult_op_eol -> mult_op : '$1'. mult_op_eol -> mult_op eol : '$1'. two_op_eol -> two_op : '$1'. two_op_eol -> two_op eol : '$1'. three_op_eol -> three_op : '$1'. three_op_eol -> three_op eol : '$1'. pipe_op_eol -> pipe_op : '$1'. pipe_op_eol -> pipe_op eol : '$1'. capture_op_eol -> capture_op : '$1'. capture_op_eol -> capture_op eol : '$1'. unary_op_eol -> unary_op : '$1'. unary_op_eol -> unary_op eol : '$1'. unary_op_eol -> dual_op : '$1'. unary_op_eol -> dual_op eol : '$1'. match_op_eol -> match_op : '$1'. match_op_eol -> match_op eol : '$1'. and_op_eol -> and_op : '$1'. and_op_eol -> and_op eol : '$1'. or_op_eol -> or_op : '$1'. or_op_eol -> or_op eol : '$1'. in_op_eol -> in_op : '$1'. in_op_eol -> in_op eol : '$1'. in_match_op_eol -> in_match_op : '$1'. in_match_op_eol -> in_match_op eol : '$1'. type_op_eol -> type_op : '$1'. type_op_eol -> type_op eol : '$1'. when_op_eol -> when_op : '$1'. when_op_eol -> when_op eol : '$1'. stab_op_eol -> stab_op : '$1'. stab_op_eol -> stab_op eol : '$1'. at_op_eol -> at_op : '$1'. at_op_eol -> at_op eol : '$1'. comp_op_eol -> comp_op : '$1'. comp_op_eol -> comp_op eol : '$1'. rel_op_eol -> rel_op : '$1'. rel_op_eol -> rel_op eol : '$1'. arrow_op_eol -> arrow_op : '$1'. arrow_op_eol -> arrow_op eol : '$1'. % Dot operator dot_op -> '.' : '$1'. dot_op -> '.' eol : '$1'. dot_identifier -> identifier : '$1'. dot_identifier -> matched_expr dot_op identifier : build_dot('$2', '$1', '$3'). dot_alias -> aliases : {'__aliases__', meta_from_token('$1', 0), ?exprs('$1')}. dot_alias -> matched_expr dot_op aliases : build_dot_alias('$2', '$1', '$3'). dot_alias -> matched_expr dot_op dot_alias_container : build_dot_container('$2', '$1', '$3'). dot_alias_container -> open_curly '}' : []. dot_alias_container -> open_curly container_args close_curly : '$2'. dot_op_identifier -> op_identifier : '$1'. dot_op_identifier -> matched_expr dot_op op_identifier : build_dot('$2', '$1', '$3'). dot_do_identifier -> do_identifier : '$1'. dot_do_identifier -> matched_expr dot_op do_identifier : build_dot('$2', '$1', '$3'). dot_bracket_identifier -> bracket_identifier : '$1'. dot_bracket_identifier -> matched_expr dot_op bracket_identifier : build_dot('$2', '$1', '$3'). dot_paren_identifier -> paren_identifier : '$1'. dot_paren_identifier -> matched_expr dot_op paren_identifier : build_dot('$2', '$1', '$3'). parens_call -> dot_paren_identifier : '$1'. parens_call -> matched_expr dot_call_op : {'.', meta_from_token('$2'), ['$1']}. % Fun/local calls % Function calls with no parentheses call_args_no_parens_expr -> matched_expr : '$1'. call_args_no_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1'). call_args_no_parens_comma_expr -> matched_expr ',' call_args_no_parens_expr : ['$3', '$1']. call_args_no_parens_comma_expr -> call_args_no_parens_comma_expr ',' call_args_no_parens_expr : ['$3'|'$1']. call_args_no_parens_all -> call_args_no_parens_one : '$1'. call_args_no_parens_all -> call_args_no_parens_ambig : '$1'. call_args_no_parens_all -> call_args_no_parens_many : '$1'. call_args_no_parens_one -> call_args_no_parens_kw : ['$1']. call_args_no_parens_one -> matched_expr : ['$1']. call_args_no_parens_ambig -> no_parens_expr : ['$1']. call_args_no_parens_many -> matched_expr ',' call_args_no_parens_kw : ['$1', '$3']. call_args_no_parens_many -> call_args_no_parens_comma_expr : reverse('$1'). call_args_no_parens_many -> call_args_no_parens_comma_expr ',' call_args_no_parens_kw : reverse(['$3'|'$1']). call_args_no_parens_many_strict -> call_args_no_parens_many : '$1'. call_args_no_parens_many_strict -> open_paren call_args_no_parens_kw close_paren : throw_no_parens_strict('$1'). call_args_no_parens_many_strict -> open_paren call_args_no_parens_many close_paren : throw_no_parens_strict('$1'). stab_parens_many -> open_paren call_args_no_parens_kw close_paren : ['$2']. stab_parens_many -> open_paren call_args_no_parens_many close_paren : '$2'. % Containers container_expr -> matched_expr : '$1'. container_expr -> unmatched_expr : '$1'. container_expr -> no_parens_expr : throw_no_parens_container_strict('$1'). container_args_base -> container_expr : ['$1']. container_args_base -> container_args_base ',' container_expr : ['$3'|'$1']. container_args -> container_args_base : lists:reverse('$1'). container_args -> container_args_base ',' : lists:reverse('$1'). container_args -> container_args_base ',' kw : lists:reverse(['$3'|'$1']). % Function calls with parentheses call_args_parens_expr -> matched_expr : '$1'. call_args_parens_expr -> unmatched_expr : '$1'. call_args_parens_expr -> no_parens_expr : throw_no_parens_many_strict('$1'). call_args_parens_base -> call_args_parens_expr : ['$1']. call_args_parens_base -> call_args_parens_base ',' call_args_parens_expr : ['$3'|'$1']. call_args_parens -> empty_paren : []. call_args_parens -> open_paren no_parens_expr close_paren : ['$2']. call_args_parens -> open_paren kw close_paren : ['$2']. call_args_parens -> open_paren call_args_parens_base close_paren : reverse('$2'). call_args_parens -> open_paren call_args_parens_base ',' kw close_paren : reverse(['$4'|'$2']). % KV kw_eol -> kw_identifier : ?exprs('$1'). kw_eol -> kw_identifier eol : ?exprs('$1'). kw_eol -> kw_identifier_safe : build_quoted_atom('$1', true). kw_eol -> kw_identifier_safe eol : build_quoted_atom('$1', true). kw_eol -> kw_identifier_unsafe : build_quoted_atom('$1', false). kw_eol -> kw_identifier_unsafe eol : build_quoted_atom('$1', false). kw_base -> kw_eol container_expr : [{'$1', '$2'}]. kw_base -> kw_base ',' kw_eol container_expr : [{'$3', '$4'}|'$1']. kw -> kw_base : reverse('$1'). kw -> kw_base ',' : reverse('$1'). call_args_no_parens_kw_expr -> kw_eol matched_expr : {'$1', '$2'}. call_args_no_parens_kw_expr -> kw_eol no_parens_expr : {'$1', '$2'}. call_args_no_parens_kw -> call_args_no_parens_kw_expr : ['$1']. call_args_no_parens_kw -> call_args_no_parens_kw_expr ',' call_args_no_parens_kw : ['$1'|'$3']. % Lists list_args -> kw : '$1'. list_args -> container_args_base : reverse('$1'). list_args -> container_args_base ',' : reverse('$1'). list_args -> container_args_base ',' kw : reverse('$1', '$3'). list -> open_bracket ']' : build_list('$1', []). list -> open_bracket list_args close_bracket : build_list('$1', '$2'). % Tuple tuple -> open_curly '}' : build_tuple('$1', []). tuple -> open_curly container_args close_curly : build_tuple('$1', '$2'). % Bitstrings bit_string -> open_bit '>>' : build_bit('$1', []). bit_string -> open_bit container_args close_bit : build_bit('$1', '$2'). % Map and structs %% Allow unquote/@something/aliases inside maps and structs. map_expr -> max_expr : '$1'. map_expr -> dot_identifier : build_identifier('$1', nil). map_expr -> at_op_eol map_expr : build_unary_op('$1', '$2'). assoc_op_eol -> assoc_op : '$1'. assoc_op_eol -> assoc_op eol : '$1'. assoc_expr -> matched_expr assoc_op_eol matched_expr : {'$1', '$3'}. assoc_expr -> unmatched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. assoc_expr -> matched_expr assoc_op_eol unmatched_expr : {'$1', '$3'}. assoc_expr -> unmatched_expr assoc_op_eol matched_expr : {'$1', '$3'}. assoc_expr -> map_expr : '$1'. assoc_update -> matched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. assoc_update -> unmatched_expr pipe_op_eol assoc_expr : {'$2', '$1', ['$3']}. assoc_update_kw -> matched_expr pipe_op_eol kw : {'$2', '$1', '$3'}. assoc_update_kw -> unmatched_expr pipe_op_eol kw : {'$2', '$1', '$3'}. assoc_base -> assoc_expr : ['$1']. assoc_base -> assoc_base ',' assoc_expr : ['$3'|'$1']. assoc -> assoc_base : reverse('$1'). assoc -> assoc_base ',' : reverse('$1'). map_op -> '%{}' : '$1'. map_op -> '%{}' eol : '$1'. map_close -> kw close_curly : '$1'. map_close -> assoc close_curly : '$1'. map_close -> assoc_base ',' kw close_curly : reverse('$1', '$3'). map_args -> open_curly '}' : build_map('$1', []). map_args -> open_curly map_close : build_map('$1', '$2'). map_args -> open_curly assoc_update close_curly : build_map_update('$1', '$2', []). map_args -> open_curly assoc_update ',' close_curly : build_map_update('$1', '$2', []). map_args -> open_curly assoc_update ',' map_close : build_map_update('$1', '$2', '$4'). map_args -> open_curly assoc_update_kw close_curly : build_map_update('$1', '$2', []). struct_op -> '%' : '$1'. map -> map_op map_args : '$2'. map -> struct_op map_expr map_args : {'%', meta_from_token('$1'), ['$2', '$3']}. map -> struct_op map_expr eol map_args : {'%', meta_from_token('$1'), ['$2', '$4']}. Erlang code. -define(file(), get(elixir_parser_file)). -define(id(Token), element(1, Token)). -define(location(Token), element(2, Token)). -define(exprs(Token), element(3, Token)). -define(meta(Node), element(2, Node)). -define(rearrange_uop(Op), (Op == 'not' orelse Op == '!')). %% The following directive is needed for (significantly) faster %% compilation of the generated .erl file by the HiPE compiler -compile([{hipe, [{regalloc, linear_scan}]}]). -import(lists, [reverse/1, reverse/2]). meta_from_token(Token, Counter) -> [{counter, Counter}|meta_from_token(Token)]. meta_from_token(Token) -> meta_from_location(?location(Token)). meta_from_location({Line, Column, EndColumn}) when is_integer(Line), is_integer(Column), is_integer(EndColumn) -> [{line, Line}]. %% Operators build_op({_Kind, Location, 'in'}, {UOp, _, [Left]}, Right) when ?rearrange_uop(UOp) -> {UOp, meta_from_location(Location), [{'in', meta_from_location(Location), [Left, Right]}]}; build_op({_Kind, Location, Op}, Left, Right) -> {Op, meta_from_location(Location), [Left, Right]}. build_unary_op({_Kind, Location, Op}, Expr) -> {Op, meta_from_location(Location), [Expr]}. build_list(Marker, Args) -> {Args, ?location(Marker)}. build_tuple(_Marker, [Left, Right]) -> {Left, Right}; build_tuple(Marker, Args) -> {'{}', meta_from_token(Marker), Args}. build_bit(Marker, Args) -> {'<<>>', meta_from_token(Marker), Args}. build_map(Marker, Args) -> {'%{}', meta_from_token(Marker), Args}. build_map_update(Marker, {Pipe, Left, Right}, Extra) -> {'%{}', meta_from_token(Marker), [build_op(Pipe, Left, Right ++ Extra)]}. %% Blocks build_block([{Op, _, [_]}]=Exprs) when ?rearrange_uop(Op) -> {'__block__', [], Exprs}; build_block([{unquote_splicing, _, Args}]=Exprs) when length(Args) =< 2 -> {'__block__', [], Exprs}; build_block([Expr]) -> Expr; build_block(Exprs) -> {'__block__', [], Exprs}. %% Dots build_dot_alias(Dot, {'__aliases__', _, Left}, {'aliases', _, Right}) -> {'__aliases__', meta_from_token(Dot), Left ++ Right}; build_dot_alias(_Dot, Atom, {'aliases', _, _} = Token) when is_atom(Atom) -> throw_bad_atom(Token); build_dot_alias(Dot, Other, {'aliases', _, Right}) -> {'__aliases__', meta_from_token(Dot), [Other|Right]}. build_dot_container(Dot, Left, Right) -> Meta = meta_from_token(Dot), {{'.', Meta, [Left, '{}']}, Meta, Right}. build_dot(Dot, Left, Right) -> {'.', meta_from_token(Dot), [Left, extract_identifier(Right)]}. extract_identifier({Kind, _, Identifier}) when Kind == identifier; Kind == bracket_identifier; Kind == paren_identifier; Kind == do_identifier; Kind == op_identifier -> Identifier. %% Identifiers build_nested_parens(Dot, Args1, Args2) -> Identifier = build_identifier(Dot, Args1), Meta = ?meta(Identifier), {Identifier, Meta, Args2}. build_identifier({'.', Meta, _} = Dot, Args) -> FArgs = case Args of nil -> []; _ -> Args end, {Dot, Meta, FArgs}; build_identifier({op_identifier, Location, Identifier}, [Arg]) -> {Identifier, [{ambiguous_op, nil}|meta_from_location(Location)], [Arg]}; build_identifier({_, Location, Identifier}, Args) -> {Identifier, meta_from_location(Location), Args}. %% Fn build_fn(Op, [{'->', _, [_, _]}|_] = Stab) -> {fn, meta_from_token(Op), build_stab(Stab)}; build_fn(Op, _Stab) -> throw(meta_from_token(Op), "expected clauses to be defined with -> inside: ", "'fn'"). %% Access build_access(Expr, {List, Location}) -> Meta = meta_from_location(Location), {{'.', Meta, ['Elixir.Access', get]}, Meta, [Expr, List]}. %% Interpolation aware build_sigil({sigil, Location, Sigil, Parts, Modifiers}) -> Meta = meta_from_location(Location), {list_to_atom("sigil_" ++ [Sigil]), Meta, [{'<<>>', Meta, string_parts(Parts)}, Modifiers]}. build_bin_string({bin_string, _Location, [H]}) when is_binary(H) -> H; build_bin_string({bin_string, Location, Args}) -> {'<<>>', meta_from_location(Location), string_parts(Args)}. build_list_string({list_string, _Location, [H]}) when is_binary(H) -> elixir_utils:characters_to_list(H); build_list_string({list_string, Location, Args}) -> Meta = meta_from_location(Location), {{'.', Meta, ['Elixir.String', to_char_list]}, Meta, [{'<<>>', Meta, string_parts(Args)}]}. build_quoted_atom({_, _Location, [H]}, Safe) when is_binary(H) -> Op = binary_to_atom_op(Safe), erlang:Op(H, utf8); build_quoted_atom({_, Location, Args}, Safe) -> Meta = meta_from_location(Location), {{'.', Meta, [erlang, binary_to_atom_op(Safe)]}, Meta, [{'<<>>', Meta, string_parts(Args)}, utf8]}. binary_to_atom_op(true) -> binary_to_existing_atom; binary_to_atom_op(false) -> binary_to_atom. string_parts(Parts) -> [string_part(Part) || Part <- Parts]. string_part(Binary) when is_binary(Binary) -> Binary; string_part({Location, Tokens}) -> Form = string_tokens_parse(Tokens), Meta = meta_from_location(Location), {'::', Meta, [{{'.', Meta, ['Elixir.Kernel', to_string]}, Meta, [Form]}, {binary, Meta, nil}]}. string_tokens_parse(Tokens) -> case parse(Tokens) of {ok, Forms} -> Forms; {error, _} = Error -> throw(Error) end. %% Keywords build_stab([{'->', Meta, [Left, Right]}|T]) -> build_stab(Meta, T, Left, [Right], []); build_stab(Else) -> build_block(Else). build_stab(Old, [{'->', New, [Left, Right]}|T], Marker, Temp, Acc) -> H = {'->', Old, [Marker, build_block(reverse(Temp))]}, build_stab(New, T, Left, [Right], [H|Acc]); build_stab(Meta, [H|T], Marker, Temp, Acc) -> build_stab(Meta, T, Marker, [H|Temp], Acc); build_stab(Meta, [], Marker, Temp, Acc) -> H = {'->', Meta, [Marker, build_block(reverse(Temp))]}, reverse([H|Acc]). %% Every time the parser sees a (unquote_splicing()) %% it assumes that a block is being spliced, wrapping %% the splicing in a __block__. But in the stab clause, %% we can have (unquote_splicing(1, 2, 3)) -> :ok, in such %% case, we don't actually want the block, since it is %% an arg style call. unwrap_splice unwraps the splice %% from such blocks. unwrap_splice([{'__block__', [], [{unquote_splicing, _, _}] = Splice}]) -> Splice; unwrap_splice(Other) -> Other. unwrap_when(Args) -> case elixir_utils:split_last(Args) of {Start, {'when', Meta, [_, _] = End}} -> [{'when', Meta, Start ++ End}]; {_, _} -> Args end. to_block([One]) -> One; to_block(Other) -> {'__block__', [], reverse(Other)}. %% Warnings and errors throw(Meta, Error, Token) -> Line = case lists:keyfind(line, 1, Meta) of {line, L} -> L; false -> 0 end, throw({error, {Line, ?MODULE, [Error, Token]}}). throw_bad_atom(Token) -> throw(meta_from_token(Token), "atom cannot be followed by an alias. If the '.' was meant to be " "part of the atom's name, the atom name must be quoted. Syntax error before: ", "'.'"). throw_no_parens_strict(Token) -> throw(meta_from_token(Token), "unexpected parentheses. If you are making a " "function call, do not insert spaces between the function name and the " "opening parentheses. Syntax error before: ", "'('"). throw_no_parens_many_strict(Node) -> throw(?meta(Node), "unexpected comma. Parentheses are required to solve ambiguity in nested calls.\n\n" "This error happens when you have nested function calls without parentheses. " "For example:\n\n" " one a, two b, c, d\n\n" "In the example above, we don't know if the parameters \"c\" and \"d\" apply " "to the function \"one\" or \"two\". You can solve this by explicitly adding " "parentheses:\n\n" " one a, two(b, c, d)\n\n" "Elixir cannot compile otherwise. Syntax error before: ", "','"). throw_no_parens_container_strict(Node) -> throw(?meta(Node), "unexpected comma. Parentheses are required to solve ambiguity inside containers.\n\n" "This error may happen when you forget a comma in a list or other container:\n\n" " [a, b c, d]\n\n" "Or when you have ambiguous calls:\n\n" " [one, two three, four, five]\n\n" "In the example above, we don't know if the parameters \"four\" and \"five\" " "belongs to the list or the function \"two\". You can solve this by explicitly " "adding parentheses:\n\n" " [one, two(three, four), five]\n\n" "Elixir cannot compile otherwise. Syntax error before: ", "','"). throw_invalid_kw_identifier({_, _, do} = Token) -> throw(meta_from_token(Token), elixir_tokenizer:invalid_do_error("unexpected keyword \"do:\""), "'do:'"); throw_invalid_kw_identifier({_, _, KW} = Token) -> throw(meta_from_token(Token), "syntax error before: ", "'" ++ atom_to_list(KW) ++ "':"). %% TODO: Make those warnings errors. warn_empty_stab_clause({stab_op, {Line, _Begin, _End}, '->'}) -> elixir_errors:warn(Line, ?file(), "an expression is always required on the right side of ->. " "Please provide a value after ->"). warn_pipe({arrow_op, {Line, _Begin, _End}, Op}, {_, [_|_], [_|_]}) -> elixir_errors:warn(Line, ?file(), io_lib:format( "you are piping into a function call without parentheses, which may be ambiguous. " "Please wrap the function you are piping into in parentheses. For example:\n\n" " foo 1 ~ts bar 2 ~ts baz 3\n\n" "Should be written as:\n\n" " foo(1) ~ts bar(2) ~ts baz(3)\n", [Op, Op, Op, Op] ) ); warn_pipe(_Token, _) -> ok. ================================================ FILE: samples/Erlang/factorial ================================================ #!/usr/bin/env escript %% -*- erlang -*- %%! -smp enable -sname factorial -mnesia debug verbose main([String]) -> try N = list_to_integer(String), F = fac(N), io:format("factorial ~w = ~w\n", [N,F]) catch _:_ -> usage() end; main(_) -> usage(). usage() -> io:format("usage: factorial integer\n"), halt(1). fac(0) -> 1; fac(N) -> N * fac(N-1). ================================================ FILE: samples/Erlang/filenames/Emakefile ================================================ {"src/*", [ report, verbose, {i, "include"}, {outdir, "ebin"}, debug_info ]}. ================================================ FILE: samples/Erlang/filenames/rebar.config ================================================ %% -*- mode: erlang;erlang-indent-level: 4;indent-tabs-mode: nil -*- %% ex: ts=4 sw=4 ft=erlang et %% This is a sample rebar.conf file that shows examples of some of rebar's %% options. %% == Core == %% Extend list of always recursive commands {recursive_cmds, []}. %% Check required ERTS or OTP release version {require_erts_vsn, ".*"}. {require_otp_vsn, ".*"}. {require_min_otp_vsn, ".*"}. %% Additional library directories to add to the code path {lib_dirs, []}. %% == Erlang Compiler == %% Erlang files to compile before the rest. Rebar automatically compiles %% parse_transforms and custom behaviours before anything other than the files %% in this list. {erl_first_files, ["src/mymib1.erl", "src/mymib2.erl"]}. %% Erlang compiler options {erl_opts, [no_debug_info, {i, "myinclude"}, {src_dirs, ["src", "src2", "src3"]}, {platform_define, "(linux|solaris|freebsd|darwin)", 'HAVE_SENDFILE'}, {platform_define, "(linux|freebsd)", 'BACKLOG', 128}, {platform_define, "R13", 'old_inets'}]}. %% MIB Options? {mib_opts, []}. %% SNMP mibs to compile first? {mib_first_files, []}. %% leex options {xrl_opts, []}. %% leex files to compile first {xrl_first_files, []}. %% yecc options {yrl_opts, []}. %% yecc files to compile first {yrl_first_files, []}. %% == EDoc == %% EDoc options {edoc_opts, []}. %% == Port Compiler == %% Port compilation environment variables. See rebar_port_compiler.erl for %% more info. Default is `[]' {port_env, [{"CFLAGS", "$CFLAGS -Ifoo"}, {"freebsd", "LDFLAGS", "$LDFLAGS -lfoo"}]}. %% port_specs %% List of filenames or wildcards to be compiled. May also contain a tuple %% consisting of a regular expression to be applied against the system %% architecture as a filter. {port_specs, [{"priv/so_name.so", ["c_src/*.c"]}, {"linux", "priv/hello_linux", ["c_src/hello_linux.c"]}, {"linux", "priv/hello_linux", ["c_src/*.c"], [{env, []}]}]}. %% == escriptize == {escript_name, "application"}. {escript_incl_apps, []}. {escript_shebang, "#!/usr/bin/env escript\n"}. {escript_comment, "%%\n"}. {escript_emu_args, "%%! -pa application/application/ebin\n"}. %% == LFE Compiler == %% LFE files to compile before the rest {lfe_first_files, []}. %% Options for the LFE compiler: reuse {erl_opts, []} %% == ErlyDTL Compiler == %% Options for the ErlyDTL compiler {erlydtl_opts, []}. %% == Proto compiler == {proto_opts, [ {compiler, protobuffs}, {src_dirs, ["src"]} ]}. %% Available compilers for protocol buffer files (*.proto): %% protobuffs (default) %% gpb %% Optional src_dirs which is a list of directories where %% to look for .proto files, default is src %% Options for the gpb protocol buffer compiler, %% if selected by the proto_compiler option {gpb_opts, []}. %% == EUnit == %% Options for eunit:test() {eunit_opts, []}. %% Additional compile options for eunit. erl_opts is also used {eunit_compile_opts, []}. %% Same as erl_first_files, but used only when running 'eunit' {eunit_first_files, []}. %% == Cover == %% Whether to enable coverage reporting. Default is `false' {cover_enabled, false}. %% Whether to print coverage report to console. Default is `false' {cover_print_enabled, false}. %% Whether to export coverage report to file. Default is `false' {cover_export_enabled, false}. %% == Common Test == %% Override the default "test" directory in which SUITEs are located {ct_dir, "itest"}. %% Override the default "logs" directory in which SUITEs are logged {ct_log_dir, "test/logs"}. %% Option to pass extra parameters when launching Common Test {ct_extra_params, "-boot start_sasl -s myapp"}. %% Option to use short names (i.e., -sname test) when starting ct {ct_use_short_names, true}. %% == QuickCheck == %% If qc_mod is unspecified, rebar tries to detect Triq or EQC {qc_opts, [{qc_mod, module()}, Options]}. %% Additional compile options for qc. erl_opts is also used {qc_compile_opts, []}. %% Same as erl_first_files, but used only when running 'qc' {qc_first_files, []}. %% == Cleanup == %% Which files to cleanup {clean_files, ["file", "file2"]}. %% == OTP Applications == %% Enable validation of the OTP app module list. Default is 'true' {validate_app_modules, true}. %% == Dependencies == %% Where to put any downloaded dependencies. Default is "deps" {deps_dir, "deps"}. %% What dependencies we have, dependencies can be of 3 forms, an application %% name as an atom, eg. mochiweb, a name and a version (from the .app file), or %% an application name, a version and the SCM details on how to fetch it (SCM %% type, location and revision). %% Rebar currently supports git, hg, bzr, svn, rsync, fossil, and p4. {deps, [app_name, {rebar, "1.0.*"}, {rebar, ".*", {git, "git://github.com/rebar/rebar.git"}}, {rebar, ".*", {git, "git://github.com/rebar/rebar.git", "Rev"}}, {rebar, "1.0.*", {git, "git://github.com/rebar/rebar.git", {branch, "master"}}}, {rebar, "1.0.0", {git, "git://github.com/rebar/rebar.git", {tag, "1.0.0"}}}, %% Dependencies can be marked as 'raw'. Rebar does not require %% such dependencies to have a standard Erlang/OTP layout %% which assumes the presence of either %% "src/dependency_name.app.src" or "ebin/dependency_name.app" %% files. %% %% 'raw' dependencies can still contain 'rebar.config' and %% even can have the proper OTP directory layout, but they %% won't be compiled. %% %% Only a subset of rebar commands will be executed on the %% 'raw' subdirectories: get-deps, update-deps, check-deps, %% list-deps and delete-deps. {rebar, "", {git, "git://github.com/rebar/rebar.git", {branch, "master"}}, [raw]}, {app_name, ".*", {hg, "https://www.example.org/url"}}, {app_name, ".*", {rsync, "Url"}}, {app_name, ".*", {svn, "https://www.example.org/url"}}, {app_name, ".*", {svn, "svn://svn.example.org/url"}}, {app_name, ".*", {bzr, "https://www.example.org/url", "Rev"}}, {app_name, ".*", {fossil, "https://www.example.org/url"}}, {app_name, ".*", {fossil, "https://www.example.org/url", "Vsn"}}, {app_name, ".*", {p4, "//depot/subdir/app_dir"}}]}. %% == Subdirectories == %% Subdirectories? {sub_dirs, ["dir1", "dir2"]}. %% == Plugins == %% Plugins you wish to include. %% These can include any module on the code path, including deps. %% Alternatively, plugins can be placed as source files in the plugin_dir, in %% which case they will be compiled and loaded dynamically at runtime. {plugins, [plugin1, plugin2]}. %% Override the directory in which plugin sources can be found. %% Defaults to ./plugins {plugin_dir, "some_other_directory"}. %% == Pre/Post Command Hooks == {pre_hooks, [{clean, "./prepare_package_files.sh"}, {"linux", compile, "c_src/build_linux.sh"}, {compile, "escript generate_headers"}, {compile, "escript check_headers"}]}. {post_hooks, [{clean, "touch file1.out"}, {"freebsd", compile, "c_src/freebsd_tweaks.sh"}, {eunit, "touch file2.out"}, {compile, "touch postcompile.out"}]}. %% == xref == {xref_warnings, false}. %% optional extra paths to include in xref:set_library_path/2. %% specified relative location of rebar.config. %% e.g. {xref_extra_paths,["../gtknode/src"]} {xref_extra_paths,[]}. %% xref checks to run {xref_checks, [undefined_function_calls, undefined_functions, locals_not_used, exports_not_used, deprecated_function_calls, deprecated_functions]}. %% Optional custom xref queries (xref manual has details) specified as %% {xref_queries, [{query_string(), expected_query_result()},...]} %% The following for example removes all references to mod:*foo/4 %% functions from undefined external function calls as those are in a %% generated module {xref_queries, [{"(XC - UC) || (XU - X - B" " - (\"mod\":\".*foo\"/\"4\"))",[]}]}. ================================================ FILE: samples/Erlang/hello.escript ================================================ #!/usr/bin/env escript -export([main/1]). main([]) -> io:format("Hello, World!~n"). ================================================ FILE: samples/Erlang/kernel.app ================================================ %% %% %CopyrightBegin% %% %% Copyright Ericsson AB 1996-2022. All Rights Reserved. %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% %% %CopyrightEnd% %% %% This is an -*- erlang -*- file. %% {application, kernel, [ {description, "ERTS CXC 138 10"}, {vsn, "8.5.2"}, {modules, [application, application_controller, application_master, application_starter, auth, code, code_server, dist_util, erl_boot_server, erl_compile_server, erl_distribution, erl_erts_errors, erl_reply, erl_kernel_errors, erl_signal_handler, erpc, error_handler, error_logger, file, file_server, file_io_server, global, global_group, global_search, group, group_history, heart, inet6_tcp, inet6_tcp_dist, inet6_udp, inet6_sctp, inet_config, inet_hosts, inet_gethost_native, inet_tcp_dist, kernel, kernel_config, kernel_refc, local_tcp, local_udp, logger, logger_backend, logger_config, logger_disk_log_h, logger_filters, logger_formatter, logger_h_common, logger_handler_watcher, logger_olp, logger_proxy, logger_server, logger_simple_h, logger_std_h, logger_sup, net, net_adm, net_kernel, os, ram_file, rpc, user_drv, user_sup, prim_tty, disk_log, disk_log_1, disk_log_server, disk_log_sup, dist_ac, erl_ddll, erl_epmd, erts_debug, gen_tcp, gen_tcp_socket, gen_udp, gen_udp_socket, gen_sctp, inet, inet_db, inet_dns, inet_parse, inet_res, inet_tcp, inet_udp, inet_sctp, pg, pg2, raw_file_io, raw_file_io_compressed, raw_file_io_deflate, raw_file_io_delayed, raw_file_io_inflate, raw_file_io_list, seq_trace, socket, standard_error, wrap_log_reader]}, {registered, [application_controller, erl_reply, auth, boot_server, code_server, disk_log_server, disk_log_sup, erl_prim_loader, error_logger, file_server_2, fixtable_server, global_group, global_name_server, heart, init, kernel_config, kernel_refc, kernel_sup, logger, logger_handler_watcher, logger_sup, net_kernel, net_sup, rex, user, os_server, ddll_server, erl_epmd, inet_db, pg]}, {applications, []}, {env, [{logger_level, notice}, {logger_sasl_compatible, false}, {net_tickintensity, 4}, {net_ticktime, 60}, {prevent_overlapping_partitions, true}, {shell_docs_ansi,auto} ]}, {mod, {kernel, []}}, {runtime_dependencies, ["erts-@OTP-18248@", "stdlib-@OTP-17932@", "sasl-3.0", "crypto-5.0"]} ] }. ================================================ FILE: samples/Erlang/lfe_scan.xrl ================================================ %% Copyright (c) 2008-2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : lfe_scan.xrl %% Author : Robert Virding %% Purpose : Token definitions for Lisp Flavoured Erlang. Definitions. B = [01] O = [0-7] D = [0-9] H = [0-9a-fA-F] B36 = [0-9a-zA-Z] U = [A-Z] L = [a-z] A = ({U}|{L}) DEL = [][()}{";\000-\s] SYM = [^][()}{";\000-\s\177-\237] SSYM = [^][()}{"|;#`',\000-\s\177-\237] WS = ([\000-\s]|;[^\n]*) Rules. %% Bracketed Comments using #| foo |# #{D}*\|[^\|]*\|+([^#\|][^\|]*\|+)*# : block_comment(string:substr(TokenChars, 3)). %% Separators ' : {token,{'\'',TokenLine}}. ` : {token,{'`',TokenLine}}. , : {token,{',',TokenLine}}. ,@ : {token,{',@',TokenLine}}. \. : {token,{'.',TokenLine}}. [][()}{] : {token,{list_to_atom(TokenChars),TokenLine}}. #{D}*[bB]\( : {token,{'#B(',TokenLine}}. #{D}*[mM]\( : {token,{'#M(',TokenLine}}. #{D}*\( : {token,{'#(',TokenLine}}. #{D}*\. : {token,{'#.',TokenLine}}. #{D}*` : {token,{'#`',TokenLine}}. #{D}*; : {token,{'#;',TokenLine}}. #{D}*, : {token,{'#,',TokenLine}}. #{D}*,@ : {token,{'#,@',TokenLine}}. %% Characters #{D}*\\(x{H}+|.) : char_token(skip_past(TokenChars, $\\, $\\), TokenLine). %% Based numbers #{D}*\*{SYM}+ : base_token(skip_past(TokenChars, $*, $*), 2, TokenLine). #{D}*[bB]{SYM}+ : base_token(skip_past(TokenChars, $b, $B), 2, TokenLine). #{D}*[oO]{SYM}+ : base_token(skip_past(TokenChars, $o, $O), 8, TokenLine). #{D}*[dD]{SYM}+ : base_token(skip_past(TokenChars, $d, $D), 10, TokenLine). #{D}*[xX]{SYM}+ : base_token(skip_past(TokenChars, $x, $X), 16, TokenLine). #{D}*[rR]{SYM}+ : %% Scan over digit chars to get base. {Base,[_|Ds]} = base1(tl(TokenChars), 10, 0), base_token(Ds, Base, TokenLine). %% String "(\\x{H}+;|\\.|[^"\\])*" : %% Strip quotes. S = string:substr(TokenChars, 2, TokenLen - 2), {token,{string,TokenLine,chars(S)}}. %% Binary string #"(\\x{H}+;|\\.|[^"\\])*" : %% Strip quotes. S = string:substr(TokenChars, 3, TokenLen - 3), Bin = unicode:characters_to_binary(chars(S), utf8, utf8), {token,{binary,TokenLine,Bin}}. %% Symbols \|(\\x{H}+;|\\.|[^|\\])*\| : %% Strip quotes. S = string:substr(TokenChars, 2, TokenLen - 2), symbol_token(chars(S), TokenLine). %% Funs #'{SSYM}{SYM}*/{D}+ : %% Strip sharpsign single-quote. FunStr = string:substr(TokenChars,3), {token,{'#\'',TokenLine,FunStr}}. %% Atoms [+-]?{D}+ : case catch {ok,list_to_integer(TokenChars)} of {ok,I} -> {token,{number,TokenLine,I}}; _ -> {error,"illegal integer"} end. [+-]?{D}+\.{D}+([eE][+-]?{D}+)? : case catch {ok,list_to_float(TokenChars)} of {ok,F} -> {token,{number,TokenLine,F}}; _ -> {error,"illegal float"} end. {SSYM}{SYM}* : symbol_token(TokenChars, TokenLine). {WS}+ : skip_token. Erlang code. %% Copyright (c) 2008-2013 Robert Virding %% %% Licensed under the Apache License, Version 2.0 (the "License"); %% you may not use this file except in compliance with the License. %% You may obtain a copy of the License at %% %% http://www.apache.org/licenses/LICENSE-2.0 %% %% Unless required by applicable law or agreed to in writing, software %% distributed under the License is distributed on an "AS IS" BASIS, %% WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. %% See the License for the specific language governing permissions and %% limitations under the License. %% File : lfe_scan.erl %% Author : Robert Virding %% Purpose : Token definitions for Lisp Flavoured Erlang. -export([start_symbol_char/1,symbol_char/1]). -import(string, [substr/2,substr/3]). %% start_symbol_char(Char) -> true | false. %% symbol_char(Char) -> true | false. %% Define start symbol chars and symbol chars. start_symbol_char($#) -> false; start_symbol_char($`) -> false; start_symbol_char($') -> false; %' start_symbol_char($,) -> false; start_symbol_char($|) -> false; %Symbol quote character start_symbol_char(C) -> symbol_char(C). symbol_char($() -> false; symbol_char($)) -> false; symbol_char($[) -> false; symbol_char($]) -> false; symbol_char(${) -> false; symbol_char($}) -> false; symbol_char($") -> false; symbol_char($;) -> false; symbol_char(C) -> ((C > $\s) and (C =< $~)) orelse (C > $\240). %% symbol_token(Chars, Line) -> {token,{symbol,Line,Symbol}} | {error,E}. %% Build a symbol from list of legal characters, else error. symbol_token(Cs, L) -> case catch {ok,list_to_atom(Cs)} of {ok,S} -> {token,{symbol,L,S}}; _ -> {error,"illegal symbol"} end. %% base_token(Chars, Base, Line) -> Integer. %% Convert a string of Base characters into a number. We only allow %% base betqeen 2 and 36, and an optional sign character first. base_token(_, B, _) when B < 2; B > 36 -> {error,"illegal number base"}; base_token([$+|Cs], B, L) -> base_token(Cs, B, +1, L); base_token([$-|Cs], B, L) -> base_token(Cs, B, -1, L); base_token(Cs, B, L) -> base_token(Cs, B, +1, L). base_token(Cs, B, S, L) -> case base1(Cs, B, 0) of {N,[]} -> {token,{number,L,S*N}}; {_,_} -> {error,"illegal based number"} end. base1([C|Cs], Base, SoFar) when C >= $0, C =< $9, C < Base + $0 -> Next = SoFar * Base + (C - $0), base1(Cs, Base, Next); base1([C|Cs], Base, SoFar) when C >= $a, C =< $z, C < Base + $a - 10 -> Next = SoFar * Base + (C - $a + 10), base1(Cs, Base, Next); base1([C|Cs], Base, SoFar) when C >= $A, C =< $Z, C < Base + $A - 10 -> Next = SoFar * Base + (C - $A + 10), base1(Cs, Base, Next); base1([C|Cs], _Base, SoFar) -> {SoFar,[C|Cs]}; base1([], _Base, N) -> {N,[]}. -define(IS_UNICODE(C), ((C >= 0) and (C =< 16#10FFFF))). %% char_token(InputChars, Line) -> {token,{number,L,N}} | {error,E}. %% Convert an input string into the corresponding character. For a %% sequence of hex characters we check resultant is code is in the %% unicode range. char_token([$x,C|Cs], L) -> case base1([C|Cs], 16, 0) of {N,[]} when ?IS_UNICODE(N) -> {token,{number,L,N}}; _ -> {error,"illegal character"} end; char_token([C], L) -> {token,{number,L,C}}. %% chars(InputChars) -> Chars. %% Convert an input string into the corresponding string characters. %% We know that the input string is correct. chars([$\\,$x,C|Cs0]) -> case hex_char(C) of true -> case base1([C|Cs0], 16, 0) of {N,[$;|Cs1]} -> [N|chars(Cs1)]; _Other -> [escape_char($x)|chars([C|Cs0])] end; false -> [escape_char($x)|chars([C|Cs0])] end; chars([$\\,C|Cs]) -> [escape_char(C)|chars(Cs)]; chars([C|Cs]) -> [C|chars(Cs)]; chars([]) -> []. hex_char(C) when C >= $0, C =< $9 -> true; hex_char(C) when C >= $a, C =< $f -> true; hex_char(C) when C >= $A, C =< $F -> true; hex_char(_) -> false. escape_char($b) -> $\b; %\b = BS escape_char($t) -> $\t; %\t = TAB escape_char($n) -> $\n; %\n = LF escape_char($v) -> $\v; %\v = VT escape_char($f) -> $\f; %\f = FF escape_char($r) -> $\r; %\r = CR escape_char($e) -> $\e; %\e = ESC escape_char($s) -> $\s; %\s = SPC escape_char($d) -> $\d; %\d = DEL escape_char(C) -> C. %% Block Comment: %% Provide a sensible error when people attempt to include nested %% comments because currently the parser cannot process them without %% a rebuild. But simply exploding on a '#|' is not going to be that %% helpful. block_comment(TokenChars) -> %% Check we're not opening another comment block. case string:str(TokenChars, "#|") of 0 -> skip_token; %% No nesting found _ -> {error, "illegal nested block comment"} end. %% skip_until(String, Char1, Char2) -> String. %% skip_past(String, Char1, Char2) -> String. %% skip_until([C|_]=Cs, C1, C2) when C =:= C1 ; C =:= C2 -> Cs; %% skip_until([_|Cs], C1, C2) -> skip_until(Cs, C1, C2); %% skip_until([], _, _) -> []. skip_past([C|Cs], C1, C2) when C =:= C1 ; C =:= C2 -> Cs; skip_past([_|Cs], C1, C2) -> skip_past(Cs, C1, C2); skip_past([], _, _) -> []. ================================================ FILE: samples/Erlang/record_helper.erl ================================================ %% For each header file, it scans thru all records and create helper functions %% Helper functions are: %% setters, getters, fields, fields_atom, type -module(record_helper). -export([make/1, make/2]). make(HeaderFiles) -> make([ atom_to_list(X) || X <- HeaderFiles ], "."). %% .hrl file, relative to current dir make(HeaderFiles, OutDir) -> ModuleName = "record_utils", HeaderComment = "%% This is auto generated file. Please don't edit it\n\n", ModuleDeclaration = "-module(" ++ ModuleName ++ ").\n" ++ "-author(\"trung@mdkt.org\").\n" ++ "-compile(export_all).\n" ++ [ "-include(\"" ++ X ++ "\").\n" || X <- HeaderFiles ] ++ "\n", Src = format_src(lists:sort(lists:flatten([read(X) || X <- HeaderFiles] ++ [generate_type_default_function()]))), file:write_file(OutDir++"/" ++ ModuleName ++ ".erl", list_to_binary([HeaderComment, ModuleDeclaration, Src])). read(HeaderFile) -> try epp:parse_file(HeaderFile,[],[]) of {ok, Tree} -> parse(Tree); {error, Error} -> {error, {"Error parsing header file", HeaderFile, Error}} catch _:Error -> {catched_error, {"Error parsing header file", HeaderFile, Error}} end. format_src([{_, _, _, Src}|T]) when length(T) == 0 -> Src ++ ".\n\n"; format_src([{Type, _, _, Src}|[{Type, A, B, NSrc}|T]]) -> Src ++ ";\n\n" ++ format_src([{Type, A, B, NSrc}|T]); format_src([{_Type, _, _, Src}|[{Type1, A, B, NSrc}|T]]) -> Src ++ ".\n\n" ++ format_src([{Type1, A, B, NSrc}|T]); format_src([{_, _, _, Src}|T]) when length(T) > 0 -> Src ++ ";\n\n" ++ format_src(T). parse(Tree) -> [ parse_record(X) || X <- Tree ]. parse_record({attribute, _, record, RecordInfo}) -> {RecordName, RecordFields} = RecordInfo, if length(RecordFields) == 1 -> lists:flatten([ generate_setter_getter_function(RecordName, X) || X <- RecordFields ] ++ [generate_type_function(RecordName)]); true -> lists:flatten([generate_fields_function(RecordName, RecordFields)] ++ [generate_fields_atom_function(RecordName, RecordFields)] ++ [ generate_setter_getter_function(RecordName, X) || X <- RecordFields ] ++ [generate_type_function(RecordName)]) end; parse_record(_) -> []. parse_field_name({record_field, _, {atom, _, FieldName}}) -> {field, "\"" ++ atom_to_list(FieldName) ++ "\""}; parse_field_name({record_field, _, {atom, _, _FieldName}, {record, _, ParentRecordName, _}}) -> {parent_field, "fields(" ++ atom_to_list(ParentRecordName) ++ ")"}; parse_field_name({record_field, _, {atom, _, FieldName}, _}) -> {field, "\"" ++ atom_to_list(FieldName) ++ "\""}. parse_field_name_atom({record_field, _, {atom, _, FieldName}}) -> atom_to_list(FieldName); parse_field_name_atom({record_field, _, {atom, _, _FieldName}, {record, _, ParentRecordName, _}}) -> "fields_atom(" ++ atom_to_list(ParentRecordName) ++ ")"; parse_field_name_atom({record_field, _, {atom, _, FieldName}, _}) -> atom_to_list(FieldName). concat([], _S) -> []; concat([F|T], _S) when length(T) == 0 -> F; concat([F|T], S) -> F ++ S ++ concat(T, S). concat_ext([], _S) -> []; concat_ext([F|T], S) -> F ++ S ++ concat_ext(T, S). parse_field([], AccFields, AccParentFields) -> concat_ext(AccParentFields, " ++ ") ++ "[" ++ concat(AccFields, ", ") ++ "]"; %parse_field([F|T], AccFields, AccParentFields) when length(T) == 0 -> parse_field_name(F); parse_field([F|T], AccFields, AccParentFields) -> case parse_field_name(F) of {field, Field} -> parse_field(T, AccFields ++ [Field], AccParentFields); {parent_field, PField} -> parse_field(T, AccFields, AccParentFields ++ [PField]) end. parse_field_atom([F|T]) when length(T) == 0 -> parse_field_name_atom(F); parse_field_atom([F|T]) -> parse_field_name_atom(F) ++ ", " ++ parse_field_atom(T). generate_type_default_function() -> {type, zzz, 99, "type(_) -> undefined"}. generate_type_function(RecordName) -> {type, RecordName, 0, "type(Obj) when is_record(Obj, " ++ atom_to_list(RecordName) ++ ") -> " ++ atom_to_list(RecordName)}. generate_fields_function(RecordName, RecordFields) -> Fields = parse_field(RecordFields, [], []), {field, RecordName, 1, "fields(" ++ atom_to_list(RecordName) ++ ") -> \n\t" ++ Fields}. generate_fields_atom_function(RecordName, RecordFields) -> Fields = parse_field_atom(RecordFields), {field_atom, RecordName, 1, "fields_atom(" ++ atom_to_list(RecordName) ++ ") -> \n\tlists:flatten([" ++ Fields ++ "])"}. generate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}, {record, _, ParentRecordName, _}}) -> to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName), atom_to_list(ParentRecordName)); generate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}, _}) -> to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName)); generate_setter_getter_function(RecordName, {record_field, _, {atom, _, FieldName}}) -> to_setter_getter_function(atom_to_list(RecordName), atom_to_list(FieldName)). to_setter_getter_function(RecordName, FieldName) -> [{setter, RecordName, 1, "set(Obj, " ++ FieldName ++ ", Value) when is_record(Obj, " ++ RecordName ++ ") -> \n" ++ "\tNewObj = Obj#" ++ RecordName ++ "{" ++ FieldName ++ " = Value},\n" ++ "\t{ok, NewObj, {" ++ FieldName ++ ", Value}}"}, {getter, RecordName, 1, "get(Obj, " ++ FieldName ++ ") when is_record(Obj, " ++ RecordName ++ ") -> \n" ++ "\t{ok, Obj#" ++ RecordName ++ "." ++ FieldName ++ "}"} ]. to_setter_getter_function(RecordName, FieldName, ParentRecordName) -> [{setter, RecordName, 2, "set(Obj, " ++ FieldName ++ ", Value) when is_record(Obj, " ++ RecordName ++ ") and is_record(Value, " ++ ParentRecordName ++ ") -> \n" ++ "\tNewObj = Obj#" ++ RecordName ++ "{" ++ FieldName ++ " = Value},\n" ++ "\t{ok, NewObj, {" ++ FieldName ++ ", Value}};\n\n" ++ "set(Obj, ParentProperty, Value) when is_record(Obj, " ++ RecordName ++ ") and is_atom(ParentProperty) -> \n" ++ "\t{ok, NewParentObject, _} = set(Obj#" ++ RecordName ++ ".parent, ParentProperty, Value),\n" ++ "\tset(Obj, parent, NewParentObject)"}, {getter, RecordName, 2, "get(Obj, " ++ FieldName ++ ") when is_record(Obj, " ++ RecordName ++ ") -> \n" ++ "\t{ok, Obj#" ++ RecordName ++ "." ++ FieldName ++ "};\n\n" ++ "get(Obj, ParentProperty) when is_record(Obj, " ++ RecordName ++ ") and is_atom(ParentProperty) -> \n" ++ "\tget(Obj#" ++ RecordName ++ ".parent, ParentProperty)"} ]. ================================================ FILE: samples/Erlang/record_utils.erl ================================================ %% This is auto generated file. Please don't edit it -module(record_utils). -compile(export_all). -include("messages.hrl"). fields(abstract_message) -> ["clientId", "destination", "messageId", "timestamp", "timeToLive", "headers", "body"]; fields(async_message) -> fields(abstract_message) ++ ["correlationId", "correlationIdBytes"]. fields_atom(abstract_message) -> lists:flatten([clientId, destination, messageId, timestamp, timeToLive, headers, body]); fields_atom(async_message) -> lists:flatten([fields_atom(abstract_message), correlationId, correlationIdBytes]). get(Obj, body) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.body}; get(Obj, clientId) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.clientId}; get(Obj, destination) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.destination}; get(Obj, headers) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.headers}; get(Obj, messageId) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.messageId}; get(Obj, timeToLive) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.timeToLive}; get(Obj, timestamp) when is_record(Obj, abstract_message) -> {ok, Obj#abstract_message.timestamp}; get(Obj, correlationId) when is_record(Obj, async_message) -> {ok, Obj#async_message.correlationId}; get(Obj, correlationIdBytes) when is_record(Obj, async_message) -> {ok, Obj#async_message.correlationIdBytes}; get(Obj, parent) when is_record(Obj, async_message) -> {ok, Obj#async_message.parent}; get(Obj, ParentProperty) when is_record(Obj, async_message) and is_atom(ParentProperty) -> get(Obj#async_message.parent, ParentProperty). set(Obj, body, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{body = Value}, {ok, NewObj, {body, Value}}; set(Obj, clientId, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{clientId = Value}, {ok, NewObj, {clientId, Value}}; set(Obj, destination, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{destination = Value}, {ok, NewObj, {destination, Value}}; set(Obj, headers, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{headers = Value}, {ok, NewObj, {headers, Value}}; set(Obj, messageId, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{messageId = Value}, {ok, NewObj, {messageId, Value}}; set(Obj, timeToLive, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{timeToLive = Value}, {ok, NewObj, {timeToLive, Value}}; set(Obj, timestamp, Value) when is_record(Obj, abstract_message) -> NewObj = Obj#abstract_message{timestamp = Value}, {ok, NewObj, {timestamp, Value}}; set(Obj, correlationId, Value) when is_record(Obj, async_message) -> NewObj = Obj#async_message{correlationId = Value}, {ok, NewObj, {correlationId, Value}}; set(Obj, correlationIdBytes, Value) when is_record(Obj, async_message) -> NewObj = Obj#async_message{correlationIdBytes = Value}, {ok, NewObj, {correlationIdBytes, Value}}; set(Obj, parent, Value) when is_record(Obj, async_message) and is_record(Value, abstract_message) -> NewObj = Obj#async_message{parent = Value}, {ok, NewObj, {parent, Value}}; set(Obj, ParentProperty, Value) when is_record(Obj, async_message) and is_atom(ParentProperty) -> {ok, NewParentObject, _} = set(Obj#async_message.parent, ParentProperty, Value), set(Obj, parent, NewParentObject). type(Obj) when is_record(Obj, abstract_message) -> abstract_message; type(Obj) when is_record(Obj, async_message) -> async_message; type(_) -> undefined. ================================================ FILE: samples/Erlang/release ================================================ #!/usr/bin/env escript %%! %-*-Mode:erlang;coding:utf-8;tab-width:4;c-basic-offset:4;indent-tabs-mode:()-*- % ex: set ft=erlang fenc=utf-8 sts=4 ts=4 sw=4 et: %%% %%%------------------------------------------------------------------------ %%% BSD LICENSE %%% %%% Copyright (c) 2013, Michael Truog %%% All rights reserved. %%% %%% Redistribution and use in source and binary forms, with or without %%% modification, are permitted provided that the following conditions are met: %%% %%% * Redistributions of source code must retain the above copyright %%% notice, this list of conditions and the following disclaimer. %%% * Redistributions in binary form must reproduce the above copyright %%% notice, this list of conditions and the following disclaimer in %%% the documentation and/or other materials provided with the %%% distribution. %%% * All advertising materials mentioning features or use of this %%% software must display the following acknowledgment: %%% This product includes software developed by Michael Truog %%% * The name of the author may not be used to endorse or promote %%% products derived from this software without specific prior %%% written permission %%% %%% THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND %%% CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, %%% INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES %%% OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE %%% DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR %%% CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, %%% SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, %%% BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR %%% SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS %%% INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, %%% WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING %%% NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE %%% OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH %%% DAMAGE. %%%------------------------------------------------------------------------ -author('mjtruog [at] gmail (dot) com'). -mode(compile). main(_) -> {ok, [{sys, _} = RelToolConfig, {target_dir, TargetDir}, {overlay, OverlayConfig}]} = file:consult("reltool.config"), {ok, Spec} = reltool:get_target_spec([RelToolConfig]), case file:make_dir(TargetDir) of ok -> ok; {error, eexist} -> io:format("release already exists? (~p)~n", [TargetDir]), exit_code(1) end, ok = reltool:eval_target_spec(Spec, code:root_dir(), TargetDir), ok = process_overlay(RelToolConfig, TargetDir, OverlayConfig), exit_code(0). shell(Command, Arguments) -> CommandSuffix = " && echo 0 || echo 1", case lists:reverse(os:cmd(lists:flatten( io_lib:format(Command ++ CommandSuffix, Arguments)))) of [_, $0 | _] -> ok; [_, $1 | _] -> io:format("\"~s\" failed!~n", [io_lib:format(Command, Arguments)]), error end. boot_rel_vsn({sys, Config} = _RelToolConfig) -> {rel, _Name, Ver, _} = proplists:lookup(rel, Config), Ver. %% minimal parsing for handling mustache syntax mustache(Body, Context) -> mustache(Body, "", Context). mustache([], Result, _Context) -> lists:reverse(Result); mustache([${, ${ | KeyStr], Result, Context) -> mustache_key(KeyStr, "", Result, Context); mustache([C | Rest], Result, Context) -> mustache(Rest, [C | Result], Context). mustache_key([$}, $} | Rest], KeyStr, Result, Context) -> Key = erlang:list_to_existing_atom(lists:reverse(KeyStr)), {ok, Value} = dict:find(Key, Context), mustache(Rest, lists:reverse(Value) ++ Result, Context); mustache_key([C | Rest], KeyStr, Result, Context) -> mustache_key(Rest, [C | KeyStr], Result, Context). %% support minimal overlay based on rebar overlays process_overlay(RelToolConfig, TargetDir, OverlayConfig) -> BootRelVsn = boot_rel_vsn(RelToolConfig), OverlayVars = dict:from_list([{erts_vsn, "erts-" ++ erlang:system_info(version)}, {rel_vsn, BootRelVsn}, {target_dir, TargetDir}, {hostname, net_adm:localhost()}]), {ok, BaseDir} = file:get_cwd(), execute_overlay(OverlayConfig, OverlayVars, BaseDir, TargetDir). execute_overlay([], _Vars, _BaseDir, _TargetDir) -> ok; execute_overlay([{mkdir, Out} | Rest], Vars, BaseDir, TargetDir) -> OutDir = mustache(filename:join(TargetDir, Out), Vars), ok = shell("mkdir -p ~s", [OutDir]), execute_overlay(Rest, Vars, BaseDir, TargetDir); execute_overlay([{copy, In, Out} | Rest], Vars, BaseDir, TargetDir) -> InFile = mustache(filename:join(BaseDir, In), Vars), OutFile = mustache(filename:join(TargetDir, Out), Vars), true = filelib:is_file(InFile), ok = shell("cp -R ~s ~s", [InFile, OutFile]), execute_overlay(Rest, Vars, BaseDir, TargetDir). exit_code(ExitCode) -> erlang:halt(ExitCode, [{flush, true}]). ================================================ FILE: samples/Erlang/sample.app.src ================================================ {application, sample, [{description, "sample app"}, {vsn, "1.0.0"}, {registered, []}, {mod, {sample_app, []}}, {applications, [kernel, stdlib]}, {env, []}, {modules, []}]}. ================================================ FILE: samples/Erlang/single-context.es ================================================ #! /usr/bin/env escript % This file is part of Emonk released under the MIT license. % See the LICENSE file for more information. main([]) -> start(64, 1000); main([N]) -> start(list_to_integer(N), 1000); main([N, M]) -> start(list_to_integer(N), list_to_integer(M)). start(N, M) -> code:add_pathz("test"), code:add_pathz("ebin"), {ok, Ctx} = emonk:create_ctx(), {ok, undefined} = emonk:eval(Ctx, js()), run(Ctx, N, M), wait(N). run(_, 0, _) -> ok; run(Ctx, N, M) -> Self = self(), Pid = spawn(fun() -> do_js(Self, Ctx, M) end), io:format("Spawned: ~p~n", [Pid]), run(Ctx, N-1, M). wait(0) -> ok; wait(N) -> receive {finished, Pid} -> ok end, io:format("Finished: ~p~n", [Pid]), wait(N-1). do_js(Parent, _, 0) -> Parent ! {finished, self()}; do_js(Parent, Ctx, M) -> io:format("Running: ~p~n", [M]), Test = random_test(), {ok, [Resp]} = emonk:call(Ctx, <<"f">>, [Test]), Sorted = sort(Resp), true = Test == Sorted, do_js(Parent, Ctx, M-1). js() -> <<"var f = function(x) {return [x];};">>. random_test() -> Tests = [ null, true, false, 1, -1, 3.1416, -3.1416, 12.0e10, 1.234E+10, -1.234E-10, 10.0, 123.456, 10.0, <<"foo">>, <<"foo", 5, "bar">>, <<"">>, <<"\n\n\n">>, <<"\" \b\f\r\n\t\"">>, {[]}, {[{<<"foo">>, <<"bar">>}]}, {[{<<"foo">>, <<"bar">>}, {<<"baz">>, 123}]}, [], [[]], [1, <<"foo">>], {[{<<"foo">>, [123]}]}, {[{<<"foo">>, [1, 2, 3]}]}, {[{<<"foo">>, {[{<<"bar">>, true}]}}]}, {[ {<<"foo">>, []}, {<<"bar">>, {[{<<"baz">>, true}]}}, {<<"alice">>, <<"bob">>} ]}, [-123, <<"foo">>, {[{<<"bar">>, []}]}, null] ], {_, [Test | _]} = lists:split(random:uniform(length(Tests)) - 1, Tests), sort(Test). sort({Props}) -> objsort(Props, []); sort(List) when is_list(List) -> lstsort(List, []); sort(Other) -> Other. objsort([], Acc) -> {lists:sort(Acc)}; objsort([{K,V} | Rest], Acc) -> objsort(Rest, [{K, sort(V)} | Acc]). lstsort([], Acc) -> lists:reverse(Acc); lstsort([Val | Rest], Acc) -> lstsort(Rest, [sort(Val) | Acc]). ================================================ FILE: samples/Euphoria/allsorts.ex ================================================ --**** -- === allsorts.ex -- Comparison of different sorting algorithms. without type_check include std/machine.e include std/math.e include std/console.e include std/error.e set_rand(9999) constant MAX = 50000 constant TRUE = 1, FALSE = 0 constant CHECK_RESULTS = TRUE integer hybrid_limit integer iterations sequence data sequence expected file_number printer type natural(integer x) return x >= 0 end type type file_number(integer x) return x >= - 1 end type function simple_sort(sequence x) -- put x into ascending order -- using a very simple sort object temp for i = 1 to length(x) - 1 do for j = i + 1 to length(x) do if compare(x[j], x[i]) < 0 then temp = x[j] x[j] = x[i] x[i] = temp end if end for end for return x end function function bubble_sort(sequence x) -- put x into ascending order -- using bubble sort object temp natural flip, limit flip = length(x) while flip > 0 do limit = flip flip = 0 for i = 1 to limit - 1 do if compare(x[i + 1], x[i]) < 0 then temp = x[i + 1] x[i + 1] = x[i] x[i] = temp flip = i end if end for end while return x end function function insertion_sort(sequence x) -- put x into ascending order -- using insertion sort object temp natural final for i = 2 to length(x) do temp = x[i] final = 1 for j = i - 1 to 1 by - 1 do if compare(temp, x[j]) < 0 then x[j + 1] = x[j] else final = j + 1 exit end if end for x[final] = temp end for return x end function function shell_sort(sequence x) -- Shell sort based on insertion sort integer gap, j, first, last object tempi, tempj last = length(x) gap = floor(last / 10) + 1 while TRUE do first = gap + 1 for i = first to last do tempi = x[i] j = i - gap while TRUE do tempj = x[j] if compare(tempi, tempj) >= 0 then j += gap exit end if x[j + gap] = tempj if j <= gap then exit end if j -= gap end while x[j] = tempi end for if gap = 1 then return x else gap = floor(gap / 3.5) + 1 end if end while end function global function quick_sort(sequence x) -- put x into ascending order -- using recursive quick sort natural n, last, mid object temp, midval n = length(x) if n < 2 then return x -- already sorted (trivial case) end if mid = floor((n + 1) / 2) midval = x[mid] x[mid] = x[1] last = 1 for i = 2 to n do if compare(x[i], midval) < 0 then last += 1 temp = x[last]x[last] = x[i]x[i] = temp end if end for return quick_sort(x[2 .. last]) & { midval } & quick_sort(x[last + 1 .. n]) end function global function hybrid_sort(sequence x) -- put x into ascending order -- using recursive quick sort -- but call insertion sort for short sequences natural n, last, mid object midval, temp n = length(x) if n < hybrid_limit then return insertion_sort(x) end if mid = floor((n + 1) / 2) midval = x[mid] x[mid] = x[1] last = 1 for i = 2 to n do if compare(x[i], midval) < 0 then last += 1 temp = x[last]x[last] = x[i]x[i] = temp end if end for return hybrid_sort(x[2 .. last]) & { midval } & hybrid_sort(x[last + 1 .. n]) end function sequence x procedure g_insertion_sort() -- put global variable x into ascending order -- using insertion sort of general objects object temp natural final for i = 2 to length(x) do temp = x[i] final = 1 for j = i - 1 to 1 by - 1 do if compare(temp, x[j]) < 0 then x[j + 1] = x[j] else final = j + 1 exit end if end for x[final] = temp end for end procedure procedure best_sort(natural m, natural n) -- put x[m..n] into (roughly) ascending order -- using recursive quick sort natural last, mid object midval, temp if n - m < hybrid_limit then return end if mid = floor((m + n) / 2) midval = x[mid] x[mid] = x[m] last = m for i = m + 1 to n do if compare(x[i], midval) < 0 then last += 1 temp = x[last]x[last] = x[i]x[i] = temp end if end for x[m] = x[last] x[last] = midval best_sort(m, last - 1) best_sort(last + 1, n) end procedure global function great_sort(sequence a) -- Avoids dynamic storage allocation - just passes indexes into -- a global sequence. -- Not much better than hybrid_sort which makes full use of dynamic -- storage allocation. -- Note that we only partition down to a certain degree, then do an -- insertion sort which runs fast because things are roughly in order. -- See Knuth for the details. x = a best_sort(1, length(x)) g_insertion_sort() return x end function global function merge_sort(sequence x) -- put x into ascending order -- using recursive merge sort natural n, mid sequence merged, a, b n = length(x) if n < 2 then return x end if mid = floor(n / 2) a = merge_sort(x[1 .. mid]) -- sort the first half b = merge_sort(x[mid + 1 .. n]) -- sort the second half -- merge the two sorted halves into one merged = {} while length(a) > 0 and length(b) > 0 do if compare(a[1], b[1]) < 0 then merged = append(merged, a[1]) a = a[2 .. length(a)] else merged = append(merged, b[1]) b = b[2 .. length(b)] end if end while return merged & a & b -- merged data plus leftovers end function integer min_value, max_value -- for bucket sort function bucket_sort(sequence s) -- Sort s into ascending order. No elements are compared. -- The values of s must be integers from min_value to max_value. sequence count, sorted integer value, k, offset, c count = repeat(0, max_value - min_value + 1) offset = min_value - 1 -- count the number of occurrences of each integer value: for i = 1 to length(s) do value = s[i] - offset count[value] += 1 end for sorted = repeat(0, length(s)) k = 1 -- make the resulting sorted sequence for i = 1 to length(count) do c = count[i] if c then sorted[k .. k + c - 1] = i + offset k += c end if end for return sorted end function procedure check_results(sequence sdata, integer iter, sequence sname) -- compare results with another sort to make sure they are correct if CHECK_RESULTS then if not equal(sdata, expected[iter]) then crash("Output from %s is invalid", { sname }) end if end if end procedure procedure measure(sequence name) -- time one sort integer id atom t0, t sequence sdata integer cntr integer i id = routine_id(name) t0 = time() + 1 cntr = 0 i = 0 while t0 > time() do i += 1 if i > length(data) then i = 1 end if sdata = call_func(id, { data[i] }) check_results(sdata, i, name) cntr += 1 end while t = time() - t0 printf(printer, "%15s %9d\n", { name, cntr }) end procedure procedure all_sorts() -- test all sorting routines over a range of numbers of items natural nitems printer = 1 -- open("PRN", "w") hybrid_limit = 20 nitems = 500 iterations = floor(MAX / nitems) -- get several sets of data of length nitems printf(printer, "\nNumber of completed sorts for %d items\n", nitems) data = rand(repeat(repeat(100, nitems), 17)) expected = data for i = 1 to length(data) do expected[i] = shell_sort(expected[i]) end for min_value = 1 max_value = 100 measure("bubble_sort") measure("simple_sort") measure("insertion_sort") measure("merge_sort") measure("quick_sort") measure("hybrid_sort") measure("great_sort") measure("shell_sort") measure("bucket_sort") end procedure all_sorts() ================================================ FILE: samples/Euphoria/animal.ex ================================================ --**** -- === animal.ex -- Guess the Animal game. It learns as you play. constant node_type = 1, DESCRIPTION = 1, ANIMAL = 2, question = 2, when_true = 3, when_false = 4 constant TRUE = 1, FALSE = 0 constant KEYBOARD = 0, SCREEN = 1 object database, p, prev_p, prev_answer function Yes() -- returns TRUE if the answer is yes object answer answer = '?' while answer = '?' do answer = gets(KEYBOARD) if length(answer) > 0 then if answer[1] = 'y' or answer[1] = 'Y' then answer = TRUE elsif answer[1] = 'n' or answer[1] = 'N' then answer = FALSE else answer = '?' end if else answer = '?' end if if answer = '?' then puts(SCREEN, "\nPlease answer y or n: ") end if end while return answer end function procedure guess() -- narrows it down to one animal while TRUE do if database[p][node_type] = ANIMAL then return end if printf(SCREEN, "\n%s? ", { database[p][question] }) prev_p = p if Yes() then p = database[p][when_true] prev_answer = when_true else p = database[p][when_false] prev_answer = when_false end if end while end procedure global procedure animal() -- updates database of animal information object new, new_question, correct, answer -- initial database: -- record type text Y N database = { { DESCRIPTION, "\tCan it fly", 2, 3 }, { ANIMAL, "an eagle" }, { ANIMAL, "a dog" } } while TRUE do p = 1 printf(SCREEN, "%s\n", { "\nThink of an animal. Hit when you are ready, q to quit" }) answer = gets(KEYBOARD) if length(answer) > 0 then if answer[1] = 'q' then return end if end if guess() printf(SCREEN, "\n\tIs it %s? ", { database[p][question] }) if not Yes() then puts(SCREEN, "\nI give up. What was it? ") correct = gets(KEYBOARD) correct = correct[1 .. length(correct) - 1] database = append(database, { ANIMAL, correct }) new = length(database) printf(SCREEN, "\n%s%s%s%s\n", { "Please give me a question that would distinguish ", database[p][question], " from ", correct }) new_question = '\t' & gets(KEYBOARD) new_question = new_question[1 .. length(new_question) - 1] if new_question[length(new_question)] = '?' then new_question = new_question[1 .. length(new_question) - 1] end if printf(SCREEN, "\nFor %s the answer would be: ", { correct }) if Yes() then database = append(database, { DESCRIPTION, new_question, new, p }) else database = append(database, { DESCRIPTION, new_question, p, new }) end if database[prev_p][prev_answer] = length(database) end if end while end procedure animal() ================================================ FILE: samples/Euphoria/csort.ex ================================================ --**** -- === csort.ex -- Demo of custom_sort(), routine_id() The Euphoria custom_sort routine is passed the -- routine id of the comparison function to be used when sorting. include std/sort.e -- contains custom_sort() include std/console.e constant NAME = 1, POPULATION = 2 constant statistics = { { "Canada", 27.4 }, { "United States", 255.6 }, { "Brazil", 150.8 }, { "Denmark", 5.2 }, { "Sweden", 8.7 }, { "France", 56.9 }, { "Germany", 80.6 }, { "Netherlands", 15.2 }, { "Italy", 58 }, { "New Zealand", 3.4 } } function compare_name(sequence a, sequence b) -- Compare two sequences (records) according to NAME. return compare(a[NAME], b[NAME]) end function function compare_pop(sequence a, sequence b) -- Compare two sequences (records) according to POPULATION. -- Note: comparing b vs. a, rather than a vs. b, makes -- the bigger population come first. return compare(b[POPULATION], a[POPULATION]) end function sequence sorted_by_pop, sorted_by_name integer by_pop, by_name by_pop = routine_id("compare_pop") by_name = routine_id("compare_name") sorted_by_pop = custom_sort(by_pop, statistics) sorted_by_name = custom_sort(by_name, statistics) puts(1, "sorted by population\t\t sorted by name\n\n") for i = 1 to length(sorted_by_pop) do printf(1, "%13s %6.1f\t\t%13s %6.1f\n", sorted_by_pop[i] & sorted_by_name[i]) end for ifdef WINDOWS and GUI then puts(1, "This program must be run from the command-line:\n\n") end ifdef maybe_any_key() ================================================ FILE: samples/Euphoria/debug.e ================================================ --**** -- == Debugging tools namespace debug include std/dll.e include std/machine.e include euphoria/symstruct.e without trace constant M_CALL_STACK = 103 --**** -- === Call Stack Constants public enum CS_ROUTINE_NAME, CS_FILE_NAME, CS_LINE_NO, CS_ROUTINE_SYM, CS_PC, CS_GLINE --**** --=== DEBUG_ROUTINE Enum Type public enum type DEBUG_ROUTINE SHOW_DEBUG, DISPLAY_VAR, UPDATE_GLOBALS, DEBUG_SCREEN, ERASE_PRIVATES, ERASE_SYMBOL end type --**** --=== Debugging Routines --** -- Returns information about the call stack of the code currently running. public function call_stack() return machine_func( M_CALL_STACK, {} ) end function atom symbol_table = 0, slist = 0, op_table = 0, data_buffer = 0, file_name_ptr = 0 -- C routines for interfacing with the interpreter integer read_object_cid = -1, trace_off_cid = -1, disable_trace_cid = -1, step_over_cid = -1, abort_program_cid = -1, RTLookup_cid = -1, get_pc_cid = -1, is_novalue_cid = -1, back_trace_cid = -1, call_stack_cid = -1, break_routine_cid = -1 integer show_debug_rid = -1, display_var_rid = -1, update_globals_rid = -1, debug_screen_rid = -1, erase_privates_rid = -1, erase_symbol_rid = -1 atom showing_line = -1 function show_debug() if show_debug_rid != -1 then showing_line = peek_pointer( data_buffer ) call_proc( show_debug_rid, { showing_line } ) end if return 0 end function function display_var() if display_var_rid != -1 then call_proc( display_var_rid, peek_pointer( data_buffer & 2 ) ) end if return 0 end function function update_globals() if update_globals_rid != -1 then call_proc( update_globals_rid, {} ) end if return 0 end function function debug_screen() if debug_screen_rid != -1 then call_proc( debug_screen_rid, {} ) end if return 0 end function function erase_privates( atom proc_sym ) if erase_privates_rid != -1 then call_proc( erase_privates_rid, { proc_sym } ) end if return 0 end function function erase_symbol( atom sym ) if erase_symbol_rid != -1 then call_proc( erase_symbol_rid, { sym } ) end if return 0 end function public constant M_INIT_DEBUGGER = 104 enum type INIT_ACCESSORS IA_SYMTAB, IA_SLIST, IA_OPS, IA_READ_OBJECT, IA_FILE_NAME, IA_TRACE_OFF, IA_DISABLE_TRACE, IA_STEP_OVER, IA_ABORT_PROGRAM, IA_RTLOOKUP, IA_GET_PC, IA_IS_NOVALUE, IA_CALL_STACK, IA_BREAK_ROUTINE end type enum type INIT_PARAMS IP_BUFFER, IP_SHOW_DEBUG, IP_DISPLAY_VAR, IP_UPDATE_GLOBALS, IP_DEBUG_SCREEN, IP_ERASE_PRIVATE_NAMES, IP_ERASE_SYMBOL, IP_SIZE end type --** -- Initializes an external debugger. It can also be called -- from a debugger compiled into a DLL / SO. public procedure initialize_debugger( atom init_ptr ) -- let the interpreter know that we're using an external debugger data_buffer = allocate( sizeof( C_POINTER ) ) sequence init_params = repeat( 0, IP_SIZE - 1 ) init_params[IP_BUFFER] = data_buffer init_params[IP_SHOW_DEBUG] = call_back( '+' & routine_id("show_debug") ) init_params[IP_DISPLAY_VAR] = call_back( '+' & routine_id("display_var") ) init_params[IP_UPDATE_GLOBALS] = call_back( '+' & routine_id("update_globals") ) init_params[IP_DEBUG_SCREEN] = call_back( '+' & routine_id("debug_screen") ) init_params[IP_ERASE_PRIVATE_NAMES] = call_back( '+' & routine_id("erase_privates") ) init_params[IP_ERASE_SYMBOL] = call_back( '+' & routine_id("erase_symbol") ) sequence init_data = c_func( define_c_func( "", { '+', init_ptr}, { E_SEQUENCE }, E_SEQUENCE ), { init_params } ) symbol_table = init_data[IA_SYMTAB] slist = init_data[IA_SLIST] op_table = init_data[IA_OPS] read_object_cid = define_c_func( "", { '+', init_data[IA_READ_OBJECT] }, { C_POINTER }, E_OBJECT ) file_name_ptr = init_data[IA_FILE_NAME] trace_off_cid = define_c_proc( "", { '+', init_data[IA_TRACE_OFF] }, {} ) disable_trace_cid = define_c_proc( "", { '+', init_data[IA_DISABLE_TRACE] }, {} ) step_over_cid = define_c_proc( "", { '+', init_data[IA_STEP_OVER] }, {} ) abort_program_cid = define_c_proc( "", { '+', init_data[IA_ABORT_PROGRAM] }, {} ) RTLookup_cid = define_c_func( "", { '+', init_data[IA_RTLOOKUP] }, { C_POINTER, C_INT, C_POINTER, C_POINTER, C_INT, C_ULONG}, C_POINTER ) get_pc_cid = define_c_func( "", { '+', init_data[IA_GET_PC] }, {}, C_POINTER ) is_novalue_cid = define_c_func( "", { '+', init_data[IA_IS_NOVALUE] }, { C_POINTER }, C_INT ) call_stack_cid = define_c_func( "", { '+', init_data[IA_CALL_STACK] }, { C_INT }, E_OBJECT ) break_routine_cid = define_c_func( "", { '+', init_data[IA_BREAK_ROUTINE] }, { C_POINTER, C_INT }, C_INT ) end procedure -- ** -- Used to initialize the external debuggers handlers. public procedure set_debug_rid( DEBUG_ROUTINE rtn, integer rid ) switch rtn do case SHOW_DEBUG then show_debug_rid = rid case DISPLAY_VAR then display_var_rid = rid case UPDATE_GLOBALS then update_globals_rid = rid case DEBUG_SCREEN then debug_screen_rid = rid case ERASE_PRIVATES then erase_privates_rid = rid case ERASE_SYMBOL then erase_symbol_rid = rid end switch end procedure public function read_object( atom sym ) return c_func( read_object_cid, { sym } ) end function public procedure trace_off() c_proc( trace_off_cid, {} ) end procedure public procedure disable_trace() c_proc( disable_trace_cid, {} ) end procedure public procedure step_over() c_proc( step_over_cid, {} ) end procedure public procedure abort_program() c_proc( abort_program_cid, {} ) end procedure public function get_current_line() return showing_line end function public function symbol_lookup( sequence name, integer line = get_current_line(), atom pc = get_pc() ) atom name_ptr = allocate_string( name, 1 ) -- symtab_ptr RTLookup(char *name, int file, intptr_t *pc, symtab_ptr routine, int stlen, unsigned long current_line ) return c_func( RTLookup_cid, { name_ptr, get_file_no( line ), pc, 0, peek_pointer( symbol_table) , line } ) end function public function get_pc() return c_func( get_pc_cid, {} ) end function public function is_novalue( atom sym_ptr ) return c_func( is_novalue_cid, { sym_ptr } ) end function public function debugger_call_stack() sequence stack = c_func( call_stack_cid, { 1 } ) ifdef EUI then -- if using an interpreted debugger, strip off debugger junk -- from the top of the stack: for i = 1 to length( stack ) do if length( stack[i][2] ) = 0 then stack = remove( stack, 1, i ) exit end if end for end ifdef return stack end function public function break_routine( atom routine_sym, integer enable ) return c_func( break_routine_cid, { routine_sym, enable } ) end function public function get_name( atom sym ) return peek_string( peek_pointer( sym + ST_NAME ) ) end function public function get_source( integer line ) return peek_string( peek_pointer( slist + SL_SIZE * line + SL_SRC ) ) end function public function get_file_no( integer line ) return peek( slist + line * SL_SIZE + SL_FILE_NO ) end function public function get_file_name( integer file_no ) return peek_string( peek_pointer( file_name_ptr + sizeof( C_POINTER ) * file_no ) ) end function public function get_file_line( integer line ) return peek2u( slist + line * SL_SIZE + SL_LINE ) end function public function get_next( atom sym ) return peek_pointer( sym + ST_NEXT ) end function public function is_variable( atom sym_ptr ) if sym_ptr = 0 then return 0 end if return -100 = peek4s( sym_ptr + ST_TOKEN ) end function public function get_parameter_syms( atom rtn_sym ) integer param_count = peek4u( rtn_sym + ST_NUM_ARGS ) sequence syms = repeat( 0, param_count ) atom next_sym = peek_pointer( rtn_sym + ST_NEXT ) for i = 1 to param_count do while peek( next_sym + ST_SCOPE ) != 3 do -- SC_PRIVATE = 3 next_sym = peek_pointer( next_sym + ST_NEXT ) end while syms[i] = next_sym end for return syms end function public function get_symbol_table() return symbol_table end function ================================================ FILE: samples/Euphoria/dll.e ================================================ --**** -- == Dynamic Linking to External Code namespace dll include std/error.e include std/machine.e include std/types.e --**** -- === C Type Constants -- These C type constants are used when defining external C functions in a shared -- library file. with define NO_CHANDLE public constant C_CHAR = #01000001, C_BYTE = #01000001, C_UCHAR = #02000001, C_UBYTE = #02000001, C_SHORT = #01000002, C_WORD = #01000002, C_USHORT = #02000002, C_INT = #01000004, C_BOOL = C_INT, C_UINT = #02000004, C_LONG = #01000008, C_ULONG = #02000008, C_SIZE_T = C_ULONG, C_POINTER = #03000001, C_LONGLONG = #03000002, C_ULONGLONG = #03000010 ifdef BITS32 then public constant C_LONG_PTR = C_LONG elsedef public constant C_LONG_PTR = C_LONGLONG end ifdef public constant C_DWORD = C_UINT, C_FLOAT = #03000004, C_DOUBLE = #03000008, C_DWORDLONG = C_LONGLONG --**** -- === External Euphoria Type Constants -- These are used for arguments to and the return value from a Euphoria shared -- library file (##.dll##, ##.so##, or ##.dylib##). public constant E_INTEGER = #06000004, E_ATOM = #07000004, E_SEQUENCE= #08000004, E_OBJECT = #09000004 --**** -- === Constants public constant NULL = 0 constant M_OPEN_DLL = 50, M_DEFINE_C = 51, M_DEFINE_VAR = 56 --**** -- === Routines --** -- opens a //Windows// dynamic link library (##.dll##) file, or a //Unix// shared library -- (##.so##) file. public function open_dll(sequence file_name) if length(file_name) > 0 and types:string(file_name) then return machine_func(M_OPEN_DLL, file_name) end if -- We have a list of filenames to try, try each one, when one succeeds -- abort the search and return it's value for idx = 1 to length(file_name) do atom fh = machine_func(M_OPEN_DLL, file_name[idx]) if not fh = 0 then return fh end if end for return 0 end function --** -- gets the address of a symbol in a shared library or in RAM. public function define_c_var(atom lib, sequence variable_name) return machine_func(M_DEFINE_VAR, {lib, variable_name}) end function --** -- defines the characteristics of either a C function, or a machine-code routine that you -- wish to call as a procedure from your Euphoria program. public function define_c_proc(object lib, object routine_name, sequence arg_types) if atom(routine_name) and not machine:safe_address(routine_name, 1, machine:A_EXECUTE) then error:crash("A C function is being defined from Non-executable memory.") end if return machine_func(M_DEFINE_C, {lib, routine_name, arg_types, 0}) end function --** -- defines the characteristics of either a C function, or a machine-code routine that returns -- a value. public function define_c_func(object lib, object routine_name, sequence arg_types, atom return_type) if atom(routine_name) and not machine:safe_address(routine_name, 1, machine:A_EXECUTE) then error:crash("A C function is being defined from Non-executable memory.") end if return machine_func(M_DEFINE_C, {lib, routine_name, arg_types, return_type}) end function constant M_CALL_BACK = 52 --** -- gets a machine address for an Euphoria procedure. public function call_back(object id) return machine_func(M_CALL_BACK, id) end function ifdef EU4_0 then --** -- @nodoc@ public function sizeof(integer x) switch x with fallthru do case C_CHAR, C_BYTE, C_UCHAR, C_UBYTE then return 1 case C_SHORT, C_WORD, C_USHORT then return 2 -- In 4.0 everything is x86-32 case E_OBJECT, E_ATOM, E_SEQUENCE, E_INTEGER then case C_INT, C_LONG, C_ULONG then case C_SIZE_T, C_POINTER, C_FLOAT then return 4 case C_DOUBLE, C_DWORDLONG, C_LONGLONG then return 8 end switch end function end ifdef ================================================ FILE: samples/Euphoria/hash.ex ================================================ --**** -- === hash.ex -- Hash Table Demo written by Junko C. Miura, RDS include std/console.e include std/io.e include std/hash.e include std/map.e include std/types.e include std/convert.e include std/cmdline.e without type_check constant EOF = -1 constant TRUE = 1 constant STRING = 1, COUNT = 2 -- fields for one hash table entry integer hashBuckets -- prime -- With the hash function below, it helps (a little bit) -- to have a prime number here. Don't use a power of 2. -- You'll get better performance by using a -- bigger size of table, but it uses up space. -- This hash table consists of a set of two sequences. One for the -- keys (words) and one for the corresponding word counter. -- Initialize the hash table to a sequence of empty "buckets" sequence table_words sequence table_count integer compares = 0 integer inputHandle sequence vOutPath integer outputHandle integer numZeroBucket, max, items, len, total_words function hash_function(sequence string) return remainder(hash(string, stdhash:HSIEH32 ), hashBuckets) + 1 end function procedure update_table(sequence string) -- If string is not in the table already, add it, with a count of 1, -- otherwise just increment its count. integer hash_val, found sequence bucket sequence counters -- which bucket to search? hash_val = hash_function(string) bucket = table_words[hash_val] found = find(string, bucket) if found then compares += found table_count[hash_val][found] += 1 else bucket = append(bucket, string) table_words[hash_val] = bucket table_count[hash_val] &= 1 end if end procedure function next_word() -- Read to get the next "word". integer c sequence word word = "" while TRUE do c = getc(inputHandle) if t_alpha(c) then word &= c else if length(word) > 0 or c = EOF then exit end if end if end while return word end function procedure build_table() -- build a hash table containing all unique words in standard input object word while length(word) > 0 with entry do update_table(word) entry word = next_word() end while end procedure sequence vOpts = { {"s", "hash", "Hash size", {ONCE, HAS_PARAMETER, NO_CASE}, -1}, {"o", "outfile", "File to receive word list and statistics", {ONCE, NO_CASE, HAS_PARAMETER}, -1}, $ } object vOptMap without warning override procedure abort(integer errcode) maybe_any_key("\nPress Any Key to Continue...") eu:abort(errcode) end procedure procedure main() sequence lDicts object lFileList integer lFileHandle vOptMap = cmd_parse(vOpts) vOutPath = map:get(vOptMap, "outfile", "hash.out") hashBuckets = to_integer(map:get(vOptMap, "hash", "1009")) table_words = repeat({}, hashBuckets) table_count = repeat({}, hashBuckets) outputHandle = open(vOutPath, "w") if outputHandle = -1 then writefln("Cannot open output file") abort(1) end if lFileList = map:get(vOptMap, cmdline:EXTRAS, {}) if length(lFileList) < 1 then puts(2, "You must give the name of an input file") abort(1) end if if length(lFileList) > 1 then puts(2, "You must only give the name of one input file") abort(1) end if inputHandle = open(lFileList[1], "r") if inputHandle = -1 then puts(2, "Cannot open input file.") abort(1) end if atom t t = time() -- Time the table-building process only build_table() t = time() - t -- stop timer writefln("\n[:.2] seconds", t) numZeroBucket = 0 items = 0 max = 0 total_words = 0 for i = 1 to length(table_words) do len = length(table_words[i]) items += len for j = 1 to length(table_count[i]) do total_words += table_count[i][j] end for if len = 0 then numZeroBucket += 1 elsif len > max then max = len end if end for if total_words = 0 then abort(0) end if writefln(outputHandle, "build time ..................... : [:.2]", t) writefln(outputHandle, "number of hash table buckets ... : []", hashBuckets) writefln(outputHandle, "number of words in input stream : []", total_words) writefln(outputHandle, "number of items in hash table .. : []", items) writefln(outputHandle, "number of empty buckets ........ : []", numZeroBucket) writefln(outputHandle, "largest bucket size ............ : []", max) writefln(outputHandle, "average bucket size ............ : [:.2]", items / (hashBuckets - numZeroBucket)) writefln(outputHandle, "compares per lookup ............ : [:.2]", compares/total_words) for i = 1 to length(table_words) do if length(table_words[i]) > 0 then writef(outputHandle, "bucket#[:6]: ", i) for j = 1 to length(table_words[i]) do if j > 1 and remainder(j-1,5) = 0 then writefln(outputHandle, "") writef(outputHandle, " ") end if writef(outputHandle, "[]:[] ", {table_words[i][j], table_count[i][j]}) end for writefln(outputHandle, "") end if end for close(outputHandle) writefln("See '[1]' for statistics and table contents", {vOutPath}) end procedure main() ================================================ FILE: samples/Euphoria/math.e ================================================ --**** -- == Math namespace math public include std/rand.e public include std/mathcons.e include std/error.e type trig_range(object x) -- values passed to arccos and arcsin must be [-1,+1] if atom(x) then return x >= -1 and x <= 1 else for i = 1 to length(x) do if not trig_range(x[i]) then return 0 end if end for return 1 end if end type --**** -- === Sign and Comparisons -- --** -- returns the absolute value of numbers. public function abs(object a) object t if atom(a) then if a >= 0 then return a else return - a end if end if for i = 1 to length(a) do t = a[i] if atom(t) then if t < 0 then a[i] = - t end if else a[i] = abs(t) end if end for return a end function --** -- returns -1, 0 or 1 for each element according to it being negative, zero or positive. public function sign(object a) -- small so normally it will be inlined return (a > 0) - (a < 0) end function --** -- returns the larger of two objects. public function larger_of(object objA, object objB) if compare(objA, objB) > 0 then return objA else return objB end if end function --** -- returns the smaller of two objects. public function smaller_of(object objA, object objB) if compare(objA, objB) < 0 then return objA else return objB end if end function --** -- computes the maximum value among all the argument's elements. public function max(object a) atom b, c if atom(a) then return a end if b = mathcons:MINF for i = 1 to length(a) do c = max(a[i]) if c > b then b = c end if end for return b end function --** -- computes the minimum value among all the argument's elements. public function min(object a) atom b, c if atom(a) then return a end if b = mathcons:PINF for i = 1 to length(a) do c = min(a[i]) if c < b then b = c end if end for return b end function --** -- ensures that the ##item## is in a range of values supplied by inclusive ##range_limits##. public function ensure_in_range(object item, sequence range_limits) if length(range_limits) < 2 then return item end if if eu:compare(item, range_limits[1]) < 0 then return range_limits[1] end if if eu:compare(item, range_limits[$]) > 0 then return range_limits[$] end if return item end function --** -- ensures that the ##item## is in a list of values supplied by ##list##. public function ensure_in_list(object item, sequence list, integer default=1) if length(list) = 0 then return item end if if find(item, list) = 0 then if default>=1 and default<=length(list) then return list[default] else return list[1] end if end if return item end function --**** -- === Roundings and Remainders --** -- computes the remainder of the division of two objects using floored division. public function mod(object x, object y) if equal(sign(x), sign(y)) then return remainder(x,y) end if return x - y * floor(x / y) end function --** -- returns the integer portion of a number. public function trunc(object x) return sign(x) * floor(abs(x)) end function --** -- returns the fractional portion of a number. public function frac(object x) object temp = abs(x) return sign(x) * (temp - floor(temp)) end function --** -- returns an integral division of two objects. public function intdiv(object a, object b) return sign(a)*ceil(abs(a)/abs(b)) end function --** -- computes the next integer equal or greater than the argument. public function ceil(object a) return -floor(-a) end function --** -- returns the argument's elements rounded to some precision. public function round(object a, object precision=1) integer len sequence s object t, u precision = abs(precision) if atom(a) then if atom(precision) then return floor(0.5 + (a * precision )) / precision end if len = length(precision) s = repeat(0, len) for i = 1 to len do t = precision[i] if atom (t) then s[i] = floor( 0.5 + (a * t)) / t else s[i] = round(a, t) end if end for return s elsif atom(precision) then len = length(a) s = repeat(0, len) for i = 1 to len do t = a[i] if atom(t) then s[i] = floor(0.5 + (t * precision)) / precision else s[i] = round(t, precision) end if end for return s end if len = length(a) if len != length(precision) then error:crash("The lengths of the two supplied sequences do not match.") end if s = repeat(0, len) for i = 1 to len do t = precision[i] if atom(t) then u = a[i] if atom(u) then s[i] = floor(0.5 + (u * t)) / t else s[i] = round(u, t) end if else s[i] = round(a[i], t) end if end for return s end function --**** -- === Trigonometry --** -- returns an angle given its cosine. public function arccos(trig_range x) -- returns angle in radians return mathcons:HALFPI - 2 * arctan(x / (1.0 + sqrt(1.0 - x * x))) end function --** -- returns an angle given its sine. public function arcsin(trig_range x) -- returns angle in radians return 2 * arctan(x / (1.0 + sqrt(1.0 - x * x))) end function --** -- calculate the arctangent of a ratio. public function atan2(atom y, atom x) if x > 0 then return arctan(y/x) elsif x < 0 then if y < 0 then return arctan(y/x) - mathcons:PI else return arctan(y/x) + mathcons:PI end if elsif y > 0 then return mathcons:HALFPI elsif y < 0 then return -(mathcons:HALFPI) else return 0 end if end function --** -- converts an angle measured in radians to an angle measured in degrees. public function rad2deg (object x) return x * mathcons:RADIANS_TO_DEGREES end function --** -- converts an angle measured in degrees to an angle measured in radians. public function deg2rad (object x) return x * mathcons:DEGREES_TO_RADIANS end function --**** -- === Logarithms and Powers --** -- returns the base 10 logarithm of a number. public function log10(object x1) return log(x1) * mathcons:INVLN10 end function --** -- computes some power of E. public function exp(atom x) return power( mathcons:E, x) end function --** -- computes the nth Fibonacci Number. public function fib(integer i) return floor((power( mathcons:PHI, i) / mathcons:SQRT5) + 0.5) end function --**** -- === Hyperbolic Trigonometry --** -- computes the hyperbolic cosine of an object. public function cosh(object a) return (exp(a)+exp(-a))/2 end function --** -- computes the hyperbolic sine of an object. public function sinh(object a) return (exp(a)-exp(-a))/2 end function --** -- computes the hyperbolic tangent of an object. public function tanh(object a) return sinh(a)/cosh(a) end function --** -- computes the reverse hyperbolic sine of an object. public function arcsinh(object a) return log(a+sqrt(1+a*a)) end function type not_below_1(object x) if atom(x) then return x>=1.0 end if for i=1 to length(x) do if not not_below_1(x[i]) then return 0 end if end for return 1 end type --** -- computes the reverse hyperbolic cosine of an object. public function arccosh(not_below_1 a) return log(a+sqrt(a*a-1)) end function type abs_below_1(object x) if atom(x) then return x>-1.0 and x<1.0 end if for i=1 to length(x) do if not abs_below_1(x[i]) then return 0 end if end for return 1 end type --** -- computes the reverse hyperbolic tangent of an object. public function arctanh(abs_below_1 a) return log((1+a)/(1-a))/2 end function --**** -- === Accumulation --** -- computes the sum of all atoms in the argument, no matter how deeply nested. public function sum(object a) atom b if atom(a) then return a end if b = 0 for i = 1 to length(a) do if atom(a[i]) then b += a[i] else b += sum(a[i]) end if end for return b end function --** -- computes the product of all the atom in the argument, no matter how deeply nested. public function product(object a) atom b if atom(a) then return a end if b = 1 for i = 1 to length(a) do if atom(a[i]) then b *= a[i] else b *= product(a[i]) end if end for return b end function --** -- or's together all atoms in the argument, no matter how deeply nested. public function or_all (object a) atom b if atom(a) then return a end if b = 0 for i = 1 to length(a) do if atom(a[i]) then b = or_bits(b, a[i]) else b = or_bits(b, or_all(a[i])) end if end for return b end function --**** -- === Bitwise Operations --** -- moves the bits in the input value by the specified distance. public function shift_bits(object source_number, integer shift_distance) if sequence(source_number) then for i = 1 to length(source_number) do source_number[i] = shift_bits(source_number[i], shift_distance) end for return source_number end if source_number = and_bits(source_number, 0xFFFFFFFF) if shift_distance = 0 then return source_number end if if shift_distance < 0 then source_number *= power(2, -shift_distance) else integer lSigned = 0 -- Check for the sign bit so we don't propagate it. if and_bits(source_number, 0x80000000) then lSigned = 1 source_number = and_bits(source_number, 0x7FFFFFFF) end if source_number /= power(2, shift_distance) if lSigned and shift_distance < 32 then -- Put back the sign bit now shifted source_number = or_bits(source_number, power(2, 31-shift_distance)) end if end if return and_bits(source_number, 0xFFFFFFFF) end function --** -- rotates the bits in the input value by the specified distance. public function rotate_bits(object source_number, integer shift_distance) atom lTemp atom lSave integer lRest if sequence(source_number) then for i = 1 to length(source_number) do source_number[i] = rotate_bits(source_number[i], shift_distance) end for return source_number end if source_number = and_bits(source_number, 0xFFFFFFFF) if shift_distance = 0 then return source_number end if if shift_distance < 0 then lSave = not_bits(power(2, 32 + shift_distance) - 1) lRest = 32 + shift_distance else lSave = power(2, shift_distance) - 1 lRest = shift_distance - 32 end if lTemp = shift_bits(and_bits(source_number, lSave), lRest) source_number = shift_bits(source_number, shift_distance) return or_bits(source_number, lTemp) end function --**** -- Arithmetic --** -- Returns the greater common divisor of two atoms public function gcd(atom p, atom q) atom r -- Both arguments must be positive. if p < 0 then p = -p end if if q < 0 then q = -q end if -- Strip off any fractional part. p = floor(p) q = floor(q) -- Ensure that 'p' is not smaller than 'q' if p < q then r = p p = q q = r end if -- Special case. if q = 0 then return p end if -- repeat until I get a remainder less than 2. while r > 1 with entry do -- set up next cycle using denominator and remainder from previous cycle. p = q q = r entry -- get remainder after dividing p by q r = remainder(p, q) end while if r = 1 then return 1 else return q end if end function --**** -- Floating Point --** -- compares two (sets of) numbers based on approximate equality. public function approx(object p, object q, atom epsilon = 0.005) if sequence(p) then if sequence(q) then if length(p) != length(q) then error:crash("approx(): Sequence arguments must be the same length") end if for i = 1 to length(p) do p[i] = approx(p[i], q[i]) end for return p else for i = 1 to length(p) do p[i] = approx(p[i], q) end for return p end if elsif sequence(q) then for i = 1 to length(q) do q[i] = approx(p, q[i]) end for return q else if p > (q + epsilon) then return 1 end if if p < (q - epsilon) then return -1 end if return 0 end if end function --** -- tests for power of 2. public function powof2(object p) return not (and_bits(p, p-1)) end function --** -- tests if the supplied integer is a even or odd number. public function is_even(integer test_integer) return (and_bits(test_integer, 1) = 0) end function --** -- tests if the supplied Euphoria object is even or odd. public function is_even_obj(object test_object) if atom(test_object) then if integer(test_object) then return (and_bits(test_object, 1) = 0) end if return 0 end if for i = 1 to length(test_object) do test_object[i] = is_even_obj(test_object[i]) end for return test_object end function ================================================ FILE: samples/Euphoria/mydata.ex ================================================ --**** -- === mydata.ex -- This program uses the Euphoria Database System (EDS) to create and maintain a simple database. constant FIELDS = { "Phone number", "Last Name", "First name", "Middle Initial" } -- file to store the database in: constant MYNAME = "mydata.edb" include std/eds.e -- Euphoria Database System include std/get.e include std/sort.e include std/text.e constant KEYBOARD = 0, SCREEN = 1, ERROR = 2 constant TRUE = 1 constant WHITE_SPACE = " \t\n" constant FORM_FEED = 12 type file_number(integer x) -- document which vars are used as file numbers return x >= 0 end type procedure myfatal(sequence msg) -- fatal error puts(ERROR, '\n' & "An unexpected error occurred: " & msg & '\n') ? 1/0 -- too see call stack end procedure function user_input() -- get user input from keyboard object line while TRUE do line = gets(KEYBOARD) if sequence(line) then -- delete any leading whitespace while find(line[1], WHITE_SPACE) do line = line[2..length(line)] if length(line) = 0 then exit end if end while if length(line) > 0 then exit end if end if puts(SCREEN, "\n? ") end while -- delete trailing whitespace while find(line[length(line)], WHITE_SPACE) do line = line[1..length(line)-1] end while return line end function procedure show(file_number f, object key, object data) puts(f, "\n" & key & '\n') for i = 2 to length(FIELDS) do puts(f, '\t' & data[i-1] & '\n') end for end procedure procedure add() -- add a new record to the database sequence key, data integer f puts(SCREEN, "\n\t" & FIELDS[1] & ": ") key = user_input() f = db_find_key(key) if f >= 1 then show(SCREEN, db_record_key(f), db_record_data(f)) puts(SCREEN, "Do you want to update this record? (y/n) ") if find('n', gets(0)) then return end if end if data = {} for i = 2 to length(FIELDS) do puts(SCREEN, "\n\t" & FIELDS[i] & ": ") data = append(data, user_input()) end for puts(SCREEN, '\n') if f >= 1 then -- update data part of record db_replace_data(f, data) else -- insert new record if db_insert(key, data) != DB_OK then myfatal("insert failed!\n") end if end if end procedure procedure delete() -- delete a record, given first field sequence name integer d puts(SCREEN, "\n\t" & FIELDS[1] & ": ") name = user_input() d = db_find_key(name) if d < 0 then puts(SCREEN, "\n\tnot found\n") return end if show(SCREEN, db_record_key(d), db_record_data(d)) puts(SCREEN, "Delete? (y/n) ") if find('n', gets(0)) then return end if db_delete_record(d) end procedure procedure find_name() -- find the record that matches the surname sequence name integer f puts(SCREEN, "\n\t" & FIELDS[1] & ": ") name = user_input() f = db_find_key(name) if f < 0 then puts(SCREEN, "\n\tnot found\n") return end if show(SCREEN, db_record_key(f), db_record_data(f)) end procedure procedure list(file_number f) -- list the entire database to a device puts(f, '\n') for rec = 1 to db_table_size() do show(f, db_record_key(rec), db_record_data(rec)) end for end procedure procedure main() sequence command file_number printer -- open or create the database if db_open(MYNAME, DB_LOCK_NO) != DB_OK then if db_create(MYNAME, DB_LOCK_NO) != DB_OK then myfatal("Couldn't create database") end if if db_create_table("phone numbers") != DB_OK then myfatal("couldn't create table") end if end if -- select the (only) table in the database if db_select_table("phone numbers") != DB_OK then myfatal("couldn't select table\n") end if -- prompt the user for his command clear_screen() puts(SCREEN, "\t\tSimple Database\n") while TRUE do puts(SCREEN, "\n(a)dd, (d)elete, (f)ind, (l)ist, (p)rint, (q)uit: ") command = upper(user_input()) if 'A' = command[1] then add() elsif 'D' = command[1] then delete() elsif 'F' = command[1] then find_name() elsif 'Q' = command[1] then exit elsif 'L' = command[1] then list(SCREEN) elsif 'P' = command[1] then printer = open("PRN", "w") if printer = -1 then puts(SCREEN, "Can't open printer device\n") else list(printer) puts(printer, FORM_FEED) close(printer) end if else puts(SCREEN, "\nsay what?\n") end if end while end procedure main() ================================================ FILE: samples/Euphoria/regex.e ================================================ --**** -- == Regular Expressions namespace regex include std/types.e include std/flags.e as flags include std/machine.e include std/math.e include std/search.e include std/text.e enum M_PCRE_COMPILE = 68, M_PCRE_EXEC = 70, M_PCRE_REPLACE = 71, M_PCRE_ERROR_MESSAGE = 95, M_PCRE_GET_OVECTOR_SIZE = 97, $ --**** -- === Option Constants public constant DEFAULT = #00000000, CASELESS = #00000001, MULTILINE = #00000002, DOTALL = #00000004, EXTENDED = #00000008, ANCHORED = #00000010, DOLLAR_ENDONLY = #00000020, EXTRA = #00000040, NOTBOL = #00000080, NOTEOL = #00000100, UNGREEDY = #00000200, NOTEMPTY = #00000400, UTF8 = #00000800, NO_AUTO_CAPTURE = #00001000, NO_UTF8_CHECK = #00002000, AUTO_CALLOUT = #00004000, PARTIAL = #00008000, DFA_SHORTEST = #00010000, DFA_RESTART = #00020000, FIRSTLINE = #00040000, DUPNAMES = #00080000, NEWLINE_CR = #00100000, NEWLINE_LF = #00200000, NEWLINE_CRLF = #00300000, NEWLINE_ANY = #00400000, NEWLINE_ANYCRLF = #00500000, BSR_ANYCRLF = #00800000, BSR_UNICODE = #01000000, STRING_OFFSETS = #0C000000 constant option_names = { {DEFAULT,"DEFAULT"}, {CASELESS,"CASELESS"}, {MULTILINE,"MULTILINE"}, {DOTALL,"DOTALL"}, {EXTENDED,"EXTENDED"}, {ANCHORED,"ANCHORED"}, {DOLLAR_ENDONLY,"DOLLAR_ENDONLY"}, {EXTRA,"EXTRA"}, {NOTBOL,"NOTBOL"}, {NOTEOL,"NOTEOL"}, {UNGREEDY,"UNGREEDY"}, {NOTEMPTY,"NOTEMPTY"}, {UTF8,"UTF8"}, {NO_AUTO_CAPTURE,"NO_AUTO_CAPTURE"}, {NO_UTF8_CHECK,"NO_UTF8_CHECK"}, {AUTO_CALLOUT,"AUTO_CALLOUT"}, {PARTIAL,"PARTIAL"}, {DFA_SHORTEST,"DFA_SHORTEST"}, {DFA_RESTART,"DFA_RESTART"}, {FIRSTLINE,"FIRSTLINE"}, {DUPNAMES,"DUPNAMES"}, {NEWLINE_CR,"NEWLINE_CR"}, {NEWLINE_LF,"NEWLINE_LF"}, {NEWLINE_CRLF,"NEWLINE_CRLF"}, {NEWLINE_ANY,"NEWLINE_ANY"}, {NEWLINE_ANYCRLF,"NEWLINE_ANYCRLF"}, {BSR_ANYCRLF,"BSR_ANYCRLF"}, {BSR_UNICODE,"BSR_UNICODE"}, {STRING_OFFSETS,"STRING_OFFSETS"} } --**** -- === Error Constants public constant ERROR_NOMATCH = (-1), ERROR_NULL = (-2), ERROR_BADOPTION = (-3), ERROR_BADMAGIC = (-4), ERROR_UNKNOWN_OPCODE = (-5), ERROR_UNKNOWN_NODE = (-5), ERROR_NOMEMORY = (-6), ERROR_NOSUBSTRING = (-7), ERROR_MATCHLIMIT = (-8), ERROR_CALLOUT = (-9), ERROR_BADUTF8 = (-10), ERROR_BADUTF8_OFFSET = (-11), ERROR_PARTIAL = (-12), ERROR_BADPARTIAL = (-13), ERROR_INTERNAL = (-14), ERROR_BADCOUNT = (-15), ERROR_DFA_UITEM = (-16), ERROR_DFA_UCOND = (-17), ERROR_DFA_UMLIMIT = (-18), ERROR_DFA_WSSIZE = (-19), ERROR_DFA_RECURSE = (-20), ERROR_RECURSIONLIMIT = (-21), ERROR_NULLWSLIMIT = (-22), ERROR_BADNEWLINE = (-23) public constant error_names = { {ERROR_NOMATCH,"ERROR_NOMATCH"}, {ERROR_NULL,"ERROR_NULL"}, {ERROR_BADOPTION,"ERROR_BADOPTION"}, {ERROR_BADMAGIC,"ERROR_BADMAGIC"}, {ERROR_UNKNOWN_OPCODE,"ERROR_UNKNOWN_OPCODE/NODE"}, {ERROR_UNKNOWN_NODE,"ERROR_UNKNOWN_OPCODE/NODE"}, {ERROR_NOMEMORY,"ERROR_NOMEMORY"}, {ERROR_NOSUBSTRING,"ERROR_NOSUBSTRING"}, {ERROR_MATCHLIMIT,"ERROR_MATCHLIMIT"}, {ERROR_CALLOUT,"ERROR_CALLOUT"}, {ERROR_BADUTF8,"ERROR_BADUTF8"}, {ERROR_BADUTF8_OFFSET,"ERROR_BADUTF8_OFFSET"}, {ERROR_PARTIAL,"ERROR_PARTIAL"}, {ERROR_BADPARTIAL,"ERROR_BADPARTIAL"}, {ERROR_INTERNAL,"ERROR_INTERNAL"}, {ERROR_BADCOUNT,"ERROR_BADCOUNT"}, {ERROR_DFA_UITEM,"ERROR_DFA_UITEM"}, {ERROR_DFA_UCOND,"ERROR_DFA_UCOND"}, {ERROR_DFA_UMLIMIT,"ERROR_DFA_UMLIMIT"}, {ERROR_DFA_WSSIZE,"ERROR_DFA_WSSIZE"}, {ERROR_DFA_RECURSE,"ERROR_DFA_RECURSE"}, {ERROR_RECURSIONLIMIT,"ERROR_RECURSIONLIMIT"}, {ERROR_NULLWSLIMIT,"ERROR_NULLWSLIMIT"}, {ERROR_BADNEWLINE,"ERROR_BADNEWLINE"} } constant all_options = math:or_all({ DEFAULT, CASELESS, MULTILINE, DOTALL, EXTENDED, ANCHORED, DOLLAR_ENDONLY, EXTRA, NOTBOL, NOTEOL, UNGREEDY, NOTEMPTY, UTF8, NO_AUTO_CAPTURE, NO_UTF8_CHECK, AUTO_CALLOUT, PARTIAL, DFA_SHORTEST, DFA_RESTART, FIRSTLINE, DUPNAMES, NEWLINE_CR, NEWLINE_LF, NEWLINE_CRLF, NEWLINE_ANY, NEWLINE_ANYCRLF, BSR_ANYCRLF, BSR_UNICODE, STRING_OFFSETS }) --**** -- === Create and Destroy --** -- Regular expression type public type regex(object o) return sequence(o) end type --** -- Regular expression option specification type public type option_spec(object o) if atom(o) then if not integer(o) then return 0 else if (or_bits(o,all_options) != all_options) then return 0 else return 1 end if end if elsif integer_array(o) then return option_spec( math:or_all(o) ) else return 0 end if end type --** -- converts an option spec to a string. public function option_spec_to_string(option_spec o) return flags:flags_to_string(o, option_names) end function --** -- converts an regex error to a string. public function error_to_string(integer i) if i >= 0 or i < -23 then return sprintf("%d",{i}) else return search:vlookup(i, error_names, 1, 2, "Unknown Error") end if end function --** -- returns an allocated regular expression. public function new(string pattern, option_spec options=DEFAULT) if sequence(options) then options = math:or_all(options) end if -- concatenation ensures we really get a new sequence, and don't just use the -- one passed in, which could be another regex previously created...this may -- be a bug with the refcount/delete_instance/regex code return machine_func(M_PCRE_COMPILE, { pattern, options }) end function --** -- returns a text based error message. public function error_message(object re) return machine_func(M_PCRE_ERROR_MESSAGE, { re }) end function --**** -- === Utility Routines --** public function escape(string s) return text:escape(s, ".\\+*?[^]$(){}=!<>|:-") end function --** -- returns the number of capturing subpatterns (the ovector size) for a regex. public function get_ovector_size(regex ex, integer maxsize=0) integer m = machine_func(M_PCRE_GET_OVECTOR_SIZE, {ex}) if (m > maxsize) then return maxsize end if return m+1 end function --**** -- === Match --** -- returns the first match of ##re## in ##haystack##. You can optionally start at the position -- ##from##. public function find(regex re, string haystack, integer from=1, option_spec options=DEFAULT, integer size = get_ovector_size(re, 30)) if sequence(options) then options = math:or_all(options) end if if size < 0 then size = 0 end if return machine_func(M_PCRE_EXEC, { re, haystack, length(haystack), options, from, size }) end function --** -- returns all matches of ##re## in ##haystack## optionally starting at the sequence position -- ##from##. public function find_all(regex re, string haystack, integer from=1, option_spec options=DEFAULT, integer size = get_ovector_size(re, 30)) if sequence(options) then options = math:or_all(options) end if if size < 0 then size = 0 end if object result sequence results = {} atom pHaystack = machine:allocate_string(haystack) while sequence(result) with entry do results = append(results, result) from = math:max(result) + 1 if from > length(haystack) then exit end if entry result = machine_func(M_PCRE_EXEC, { re, pHaystack, length(haystack), options, from, size }) end while machine:free(pHaystack) return results end function --** -- determines if ##re## matches any portion of ##haystack##. public function has_match(regex re, string haystack, integer from=1, option_spec options=DEFAULT) return sequence(find(re, haystack, from, options)) end function --** -- determines if the entire ##haystack## matches ##re##. public function is_match(regex re, string haystack, integer from=1, option_spec options=DEFAULT) object m = find(re, haystack, from, options) if sequence(m) and length(m) > 0 and m[1][1] = from and m[1][2] = length(haystack) then return 1 end if return 0 end function --** -- gets the matched text only. public function matches(regex re, string haystack, integer from=1, option_spec options=DEFAULT) if sequence(options) then options = math:or_all(options) end if integer str_offsets = and_bits(STRING_OFFSETS, options) object match_data = find(re, haystack, from, and_bits(options, not_bits(STRING_OFFSETS))) if atom(match_data) then return ERROR_NOMATCH end if for i = 1 to length(match_data) do sequence tmp if match_data[i][1] = 0 then tmp = "" else tmp = haystack[match_data[i][1]..match_data[i][2]] end if if str_offsets then match_data[i] = { tmp, match_data[i][1], match_data[i][2] } else match_data[i] = tmp end if end for return match_data end function --** -- gets the text of all matches. public function all_matches(regex re, string haystack, integer from=1, option_spec options=DEFAULT) if sequence(options) then options = math:or_all(options) end if integer str_offsets = and_bits(STRING_OFFSETS, options) object match_data = find_all(re, haystack, from, and_bits(options, not_bits(STRING_OFFSETS))) if length(match_data) = 0 then return ERROR_NOMATCH end if for i = 1 to length(match_data) do for j = 1 to length(match_data[i]) do sequence tmp integer a,b a = match_data[i][j][1] if a = 0 then tmp = "" else b = match_data[i][j][2] tmp = haystack[a..b] end if if str_offsets then match_data[i][j] = { tmp, a, b } else match_data[i][j] = tmp end if end for end for return match_data end function --**** -- === Splitting --** -- splits a string based on a regex as a delimiter. public function split(regex re, string text, integer from=1, option_spec options=DEFAULT) return split_limit(re, text, 0, from, options) end function public function split_limit(regex re, string text, integer limit=0, integer from=1, option_spec options=DEFAULT) if sequence(options) then options = math:or_all(options) end if sequence match_data = find_all(re, text, from, options), result integer last = 1 if limit = 0 or limit > length(match_data) then limit = length(match_data) end if result = repeat(0, limit) for i = 1 to limit do integer a a = match_data[i][1][1] if a = 0 then result[i] = "" else result[i] = text[last..a - 1] last = match_data[i][1][2] + 1 end if end for if last < length(text) then result &= { text[last..$] } end if return result end function --**** -- === Replacement --** -- replaces all matches of a regex with the replacement text. public function find_replace(regex ex, string text, sequence replacement, integer from=1, option_spec options=DEFAULT) return find_replace_limit(ex, text, replacement, -1, from, options) end function --** -- replaces up to ##limit## matches of ##ex## in ##text## except when ##limit## is 0. When -- ##limit## is 0, this routine replaces all of the matches. public function find_replace_limit(regex ex, string text, sequence replacement, integer limit, integer from=1, option_spec options=DEFAULT) if sequence(options) then options = math:or_all(options) end if return machine_func(M_PCRE_REPLACE, { ex, text, replacement, options, from, limit }) end function --** -- finds and then replaces text that is processed by a call back function. public function find_replace_callback(regex ex, string text, integer rid, integer limit=0, integer from=1, option_spec options=DEFAULT) if sequence(options) then options = math:or_all(options) end if sequence match_data = find_all(ex, text, from, options), replace_data if limit = 0 or limit > length(match_data) then limit = length(match_data) end if replace_data = repeat(0, limit) for i = 1 to limit do sequence params = repeat(0, length(match_data[i])) for j = 1 to length(match_data[i]) do if equal(match_data[i][j],{0,0}) then params[j] = 0 else params[j] = text[match_data[i][j][1]..match_data[i][j][2]] end if end for replace_data[i] = call_func(rid, { params }) end for for i = limit to 1 by -1 do text = replace(text, replace_data[i], match_data[i][1][1], match_data[i][1][2]) end for return text end function ================================================ FILE: samples/Euphoria/types.e ================================================ --**** -- == Types - Extended namespace types public constant OBJ_UNASSIGNED = 0 public constant OBJ_INTEGER = 1 public constant OBJ_ATOM = 2 public constant OBJ_SEQUENCE = 3 public constant FALSE = (1=0) public constant TRUE = (1=1) --**** -- === Predefined Character Sets public enum CS_FIRST = 0, CS_Consonant, CS_Vowel, CS_Hexadecimal, CS_Whitespace, CS_Punctuation, CS_Printable, CS_Displayable, CS_Lowercase, CS_Uppercase, CS_Alphanumeric, CS_Identifier, CS_Alphabetic, CS_ASCII, CS_Control, CS_Digit, CS_Graphic, CS_Bytes, CS_SpecWord, CS_Boolean, CS_LAST --**** -- === Support Functions -- --** -- determines whether one or more characters are in a given character set. public function char_test(object test_data, sequence char_set) integer lChr if integer(test_data) then if sequence(char_set[1]) then for j = 1 to length(char_set) do if test_data >= char_set[j][1] and test_data <= char_set[j][2] then return TRUE end if end for return FALSE else return find(test_data, char_set) > 0 end if elsif sequence(test_data) then if length(test_data) = 0 then return FALSE end if for i = 1 to length(test_data) label "NXTCHR" do if sequence(test_data[i]) then return FALSE end if if not integer(test_data[i]) then return FALSE end if lChr = test_data[i] if sequence(char_set[1]) then for j = 1 to length(char_set) do if lChr >= char_set[j][1] and lChr <= char_set[j][2] then continue "NXTCHR" end if end for else if find(lChr, char_set) > 0 then continue "NXTCHR" end if end if return FALSE end for return TRUE else return FALSE end if end function sequence Defined_Sets --** -- sets all the defined character sets to their default definitions. public procedure set_default_charsets() Defined_Sets = repeat(0, CS_LAST - CS_FIRST - 1) Defined_Sets[CS_Alphabetic ] = {{'a', 'z'}, {'A', 'Z'}} Defined_Sets[CS_Alphanumeric] = {{'0', '9'}, {'a', 'z'}, {'A', 'Z'}} Defined_Sets[CS_Identifier] = {{'0', '9'}, {'a', 'z'}, {'A', 'Z'}, {'_', '_'}} Defined_Sets[CS_Uppercase ] = {{'A', 'Z'}} Defined_Sets[CS_Lowercase ] = {{'a', 'z'}} Defined_Sets[CS_Printable ] = {{' ', '~'}} Defined_Sets[CS_Displayable ] = {{' ', '~'}, " ", "\t\t", "\n\n", "\r\r", {8,8}, {7,7} } Defined_Sets[CS_Whitespace ] = " \t\n\r" & 11 & 160 Defined_Sets[CS_Consonant ] = "bcdfghjklmnpqrstvwxyzBCDFGHJKLMNPQRSTVWXYZ" Defined_Sets[CS_Vowel ] = "aeiouAEIOU" Defined_Sets[CS_Hexadecimal ] = {{'0', '9'}, {'A', 'F'},{'a', 'f'}} Defined_Sets[CS_Punctuation ] = {{' ', '/'}, {':', '?'}, {'[', '`'}, {'{', '~'}} Defined_Sets[CS_Control ] = {{0, 31}, {127, 127}} Defined_Sets[CS_ASCII ] = {{0, 127}} Defined_Sets[CS_Digit ] = {{'0', '9'}} Defined_Sets[CS_Graphic ] = {{'!', '~'}} Defined_Sets[CS_Bytes ] = {{0, 255}} Defined_Sets[CS_SpecWord ] = "_" Defined_Sets[CS_Boolean ] = {TRUE,FALSE} end procedure --** -- gets the definition for each of the defined character sets. public function get_charsets() sequence result_ result_ = {} for i = CS_FIRST + 1 to CS_LAST - 1 do result_ = append(result_, {i, Defined_Sets[i]} ) end for return result_ end function --** -- sets the definition for one or more defined character sets. public procedure set_charsets(sequence charset_list) for i = 1 to length(charset_list) do if sequence(charset_list[i]) and length(charset_list[i]) = 2 then if integer(charset_list[i][1]) and charset_list[i][1] > CS_FIRST and charset_list[i][1] < CS_LAST then Defined_Sets[charset_list[i][1]] = charset_list[i][2] end if end if end for end procedure --**** -- === Types --** -- test for an integer boolean. public type boolean(object test_data) -- A boolean is a value that is either zero or one. return find(test_data,{1,0}) != 0 end type --** -- tests elements for boolean. public type t_boolean(object test_data) return char_test(test_data, Defined_Sets[CS_Boolean]) end type --** -- tests for alphanumeric character. public type t_alnum(object test_data) return char_test(test_data, Defined_Sets[CS_Alphanumeric]) end type --** -- tests string if it is an valid identifier. public type t_identifier(object test_data) -- Test to make sure the first character is not a number if t_digit(test_data) then return 0 elsif sequence(test_data) and length(test_data) > 0 and t_digit(test_data[1]) then return 0 end if return char_test(test_data, Defined_Sets[CS_Identifier]) end type --** -- tests for alphabetic characters. public type t_alpha(object test_data) return char_test(test_data, Defined_Sets[CS_Alphabetic]) end type --** -- tests for ASCII characters. public type t_ascii(object test_data) return char_test(test_data, Defined_Sets[CS_ASCII]) end type --** -- tests for control characters. public type t_cntrl(object test_data) return char_test(test_data, Defined_Sets[CS_Control]) end type --** -- tests for digits. public type t_digit(object test_data) return char_test(test_data, Defined_Sets[CS_Digit]) end type --** -- test for glyphs (printable) characters. public type t_graph(object test_data) return char_test(test_data, Defined_Sets[CS_Graphic]) end type --** -- tests for a special word character. public type t_specword(object test_data) return char_test(test_data, Defined_Sets[CS_SpecWord]) end type --** -- tests for bytes. public type t_bytearray(object test_data) return char_test(test_data, Defined_Sets[CS_Bytes]) end type --** -- tests for lowercase characters. public type t_lower(object test_data) return char_test(test_data, Defined_Sets[CS_Lowercase]) end type --** -- tests for ASCII glyph characters. public type t_print(object test_data) return char_test(test_data, Defined_Sets[CS_Printable]) end type --** -- tests for printable characters. public type t_display(object test_data) return char_test(test_data, Defined_Sets[CS_Displayable]) end type --** -- tests for punctuation characters. public type t_punct(object test_data) return char_test(test_data, Defined_Sets[CS_Punctuation]) end type --** -- tests for whitespace characters. public type t_space(object test_data) return char_test(test_data, Defined_Sets[CS_Whitespace]) end type --** -- tests for uppercase characters. public type t_upper(object test_data) return char_test(test_data, Defined_Sets[CS_Uppercase]) end type --** -- tests for hexadecimal characters. public type t_xdigit(object test_data) return char_test(test_data, Defined_Sets[CS_Hexadecimal]) end type --** -- tests for vowel characters. public type t_vowel(object test_data) return char_test(test_data, Defined_Sets[CS_Vowel]) end type --** -- tests for consonant characters. public type t_consonant(object test_data) return char_test(test_data, Defined_Sets[CS_Consonant]) end type set_default_charsets() --** -- tests for integer elements. public type integer_array( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not integer(x[i]) then return 0 end if end for return 1 end type --** -- tests for text characters. public type t_text( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not integer(x[i]) then return 0 end if if x[i] < 0 then return 0 end if end for return 1 end type --** -- tests for atom elements. public type number_array( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not atom(x[i]) then return 0 end if end for return 1 end type --** -- tests for sequence with possible nested sequences. public type sequence_array( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not sequence(x[i]) then return 0 end if end for return 1 end type --** -- tests for ASCII elements. public type ascii_string( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not integer(x[i]) then return 0 end if if x[i] < 0 then return 0 end if if x[i] > 127 then return 0 end if end for return 1 end type --** -- tests for a string sequence. public type string( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not integer(x[i]) then return 0 end if if x[i] < 0 then return 0 end if if x[i] > 255 then return 0 end if end for return 1 end type --** -- tests for a string sequence (that has no null character). public type cstring( object x ) if not sequence(x) then return 0 end if for i = 1 to length(x) do if not integer(x[i]) then return 0 end if if x[i] <= 0 then return 0 end if if x[i] > 255 then return 0 end if end for return 1 end type public constant INVALID_ROUTINE_ID = routine_id("#") public constant NO_ROUTINE_ID = -99999 -- Maximum and minimum values for Euphoria 31-bit integers (as implemented by 32-bit Euphoria) constant MAXSINT31 = power(2,30)-1, MINSINT31 = -power(2,30) --** -- tests for Euphoria integer. public type t_integer32( object o ) ifdef EU32 then return integer( o ) elsedef if integer( o ) and o <= MAXSINT31 and o >= MINSINT31 then return 1 else return 0 end if end ifdef end type ================================================ FILE: samples/F#/Combinators.fs ================================================ namespace Nessos.FsPickler.Combinators open Nessos.FsPickler open Nessos.FsPickler.Json /// Json pickling methods [] module Json = let private jsonSerializer = lazy(FsPickler.CreateJson(omitHeader = true)) /// /// Pickles a value to Json. /// /// utilized pickler. /// input value. let pickle (pickler : Pickler<'T>) (value : 'T) : string = jsonSerializer.Value.PickleToString (pickler, value) /// /// Unpickles a value from Json. /// /// utilized pickler. /// input pickle. let unpickle (pickler : Pickler<'T>) (pickle : string) : 'T = jsonSerializer.Value.UnPickleOfString (pickler, pickle) /// Bson pickling methods [] module Bson = let private bsonPickler = lazy(FsPickler.CreateBson()) /// /// Pickles a value to Bson. /// /// utilized pickler. /// input value. let pickle (pickler : Pickler<'T>) (value : 'T) : byte [] = bsonPickler.Value.Pickle (pickler, value) /// /// Unpickles a value from bson. /// /// utilized pickler. /// input pickle. let unpickle (pickler : Pickler<'T>) (pickle : byte []) : 'T = bsonPickler.Value.UnPickle (pickler, pickle) ================================================ FILE: samples/F#/JsonFormat.fs ================================================ namespace Nessos.FsPickler.Json open System open System.IO open System.Text open Newtonsoft.Json open Nessos.FsPickler /// /// Factory methods for the Json serialization format. /// type JsonPickleFormatProvider internal (indent, omitHeader) as self = let isCustomSeq isTopLevelSequence = isTopLevelSequence && self.OmitHeader && self.UseCustomTopLevelSequenceSeparator let mutable sequenceSeparator = " " member val Indent = indent with get,set member val OmitHeader = omitHeader with get,set member val UseCustomTopLevelSequenceSeparator = false with get,set member __.SequenceSeparator with get () = sequenceSeparator and set sep = if sep <> null && String.IsNullOrWhiteSpace sep then sequenceSeparator <- sep else invalidArg "SequenceSeparator" "should be non-null whitespace." interface ITextPickleFormatProvider with member __.Name = "Json" // see discussion : https://github.com/nessos/FsPickler/issues/17 member __.DefaultEncoding = new UTF8Encoding(false) :> Encoding member __.CreateWriter (stream, encoding, isTopLevelSequence, leaveOpen) = #if NET40 if leaveOpen then raise <| new NotSupportedException("'leaveOpen' not supported in .NET 40.") let sw = new StreamWriter(stream, encoding) #else let sw = new StreamWriter(stream, encoding, 1024, leaveOpen) #endif let jw = new JsonTextWriter(sw) new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _ member __.CreateReader (stream, encoding, isTopLevelSequence, leaveOpen) = #if NET40 if leaveOpen then raise <| new NotSupportedException("'leaveOpen' not supported in .NET 40.") let sr = new StreamReader(stream, encoding) #else let sr = new StreamReader(stream, encoding, true, 1024, leaveOpen) #endif let jr = new JsonTextReader(sr) new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _ member __.CreateWriter (textWriter, isTopLevelSequence, leaveOpen) = let jw = new JsonTextWriter(textWriter) new JsonPickleWriter(jw, __.OmitHeader, __.Indent, isCustomSeq isTopLevelSequence, sequenceSeparator, leaveOpen) :> _ member __.CreateReader (textReader, isTopLevelSequence, leaveOpen) = let jr = new JsonTextReader(textReader) new JsonPickleReader(jr, __.OmitHeader, isCustomSeq isTopLevelSequence, leaveOpen) :> _ ================================================ FILE: samples/F#/JsonReader.fs ================================================ namespace Nessos.FsPickler.Json open System open System.Collections.Generic open System.Globalization open System.IO open System.Numerics open System.Text open Newtonsoft.Json open Nessos.FsPickler /// /// Json format deserializer /// type internal JsonPickleReader (jsonReader : JsonReader, omitHeader, isTopLevelSequence, leaveOpen) = do jsonReader.CloseInput <- not leaveOpen jsonReader.SupportMultipleContent <- isTopLevelSequence let isBsonReader = match jsonReader with :? Bson.BsonReader -> true | _ -> false let mutable depth = 0 let arrayStack = new Stack () do arrayStack.Push Int32.MinValue // do not write tag if omitting header or array element let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1 interface IPickleFormatReader with member __.BeginReadRoot (tag : string) = do jsonReader.Read() |> ignore if omitHeader then () else if jsonReader.TokenType <> JsonToken.StartObject then raise <| new FormatException("invalid json root object.") else do jsonReader.MoveNext() let version = jsonReader.ReadPrimitiveAs false "FsPickler" if version <> jsonFormatVersion then let v = Version(version) raise <| new FormatException(sprintf "Invalid FsPickler format version %O." version) let sTag = jsonReader.ReadPrimitiveAs false "type" if tag <> sTag then raise <| new InvalidPickleTypeException(tag, sTag) member __.EndReadRoot () = if not omitHeader then jsonReader.Read() |> ignore member __.BeginReadObject (tag : string) = if not <| omitTag () then jsonReader.ReadProperty tag jsonReader.MoveNext () if isTopLevelSequence && depth = 0 then arrayStack.Push depth depth <- depth + 1 ObjectFlags.IsSequenceHeader else match jsonReader.TokenType with | JsonToken.Null -> ObjectFlags.IsNull | JsonToken.StartArray -> jsonReader.MoveNext() arrayStack.Push depth depth <- depth + 1 ObjectFlags.IsSequenceHeader | JsonToken.StartObject -> do jsonReader.MoveNext() depth <- depth + 1 if jsonReader.ValueAs () = "_flags" then jsonReader.MoveNext() let csvFlags = jsonReader.ValueAs() jsonReader.MoveNext() parseFlagCsv csvFlags else ObjectFlags.None | token -> raise <| new FormatException(sprintf "expected start of Json object but was '%O'." token) member __.EndReadObject () = if isTopLevelSequence && depth = 1 then arrayStack.Pop () |> ignore depth <- depth - 1 jsonReader.Read() |> ignore else match jsonReader.TokenType with | JsonToken.Null -> () | JsonToken.EndObject -> depth <- depth - 1 | JsonToken.EndArray -> arrayStack.Pop() |> ignore depth <- depth - 1 | token -> raise <| new FormatException(sprintf "expected end of Json object but was '%O'." token) if omitHeader && depth = 0 then () else jsonReader.Read() |> ignore member __.SerializeUnionCaseNames = true member __.PreferLengthPrefixInSequences = false member __.ReadNextSequenceElement () = if isTopLevelSequence && depth = 1 then jsonReader.TokenType <> JsonToken.None else jsonReader.TokenType <> JsonToken.EndArray member __.ReadCachedObjectId () = jsonReader.ReadPrimitiveAs false "id" member __.ReadBoolean tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag member __.ReadByte tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> byte member __.ReadSByte tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> sbyte member __.ReadInt16 tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> int16 member __.ReadInt32 tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> int member __.ReadInt64 tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag member __.ReadUInt16 tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> uint16 member __.ReadUInt32 tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> uint32 member __.ReadUInt64 tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> uint64 member __.ReadSingle tag = if not <| omitTag () then jsonReader.ReadProperty tag jsonReader.MoveNext() let value = match jsonReader.TokenType with | JsonToken.Float -> jsonReader.ValueAs () |> single | JsonToken.String -> Single.Parse(jsonReader.ValueAs(), CultureInfo.InvariantCulture) | _ -> raise <| new FormatException("not a float.") jsonReader.Read() |> ignore value member __.ReadDouble tag = if not <| omitTag () then jsonReader.ReadProperty tag jsonReader.MoveNext() let value = match jsonReader.TokenType with | JsonToken.Float -> jsonReader.ValueAs () | JsonToken.String -> Double.Parse(jsonReader.ValueAs(), CultureInfo.InvariantCulture) | _ -> raise <| new FormatException("not a float.") jsonReader.Read() |> ignore value member __.ReadChar tag = let value = jsonReader.ReadPrimitiveAs (omitTag ()) tag in value.[0] member __.ReadString tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag member __.ReadBigInteger tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> BigInteger.Parse member __.ReadGuid tag = if isBsonReader then jsonReader.ReadPrimitiveAs (omitTag ()) tag else jsonReader.ReadPrimitiveAs (omitTag ()) tag |> Guid.Parse member __.ReadTimeSpan tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> TimeSpan.Parse member __.ReadDecimal tag = jsonReader.ReadPrimitiveAs (omitTag ()) tag |> decimal // BSON spec mandates the use of Unix time; // this has millisecond precision which results in loss of accuracy w.r.t. ticks // since the goal of FsPickler is to offer faithful representations of .NET objects // we choose to override the spec and serialize ticks outright. // see also https://json.codeplex.com/discussions/212067 member __.ReadDate tag = if isBsonReader then let ticks = jsonReader.ReadPrimitiveAs (omitTag ()) tag DateTime(ticks) else jsonReader.ReadPrimitiveAs (omitTag ()) tag member __.ReadBytes tag = if not <| omitTag () then jsonReader.ReadProperty tag jsonReader.Read() |> ignore let bytes = if jsonReader.TokenType = JsonToken.Null then null elif isBsonReader then jsonReader.ValueAs () else let base64 = jsonReader.ValueAs () Convert.FromBase64String base64 jsonReader.Read() |> ignore bytes member __.IsPrimitiveArraySerializationSupported = false member __.ReadPrimitiveArray _ _ = raise <| new NotImplementedException() member __.Dispose () = (jsonReader :> IDisposable).Dispose() ================================================ FILE: samples/F#/JsonSerializer.fs ================================================ namespace Nessos.FsPickler.Json open System open Nessos.FsPickler type internal OAttribute = System.Runtime.InteropServices.OptionalAttribute type internal DAttribute = System.Runtime.InteropServices.DefaultParameterValueAttribute /// /// Json pickler instance. /// type JsonSerializer = inherit FsPicklerTextSerializer val private format : JsonPickleFormatProvider /// /// Initializes a new Json pickler instance. /// /// indent out Json pickles. /// omit FsPickler header in Json pickles. /// specify a custom type name converter. new ([] ?indent, [] ?omitHeader, [] ?typeConverter) = let indent = defaultArg indent false let omitHeader = defaultArg omitHeader false let json = new JsonPickleFormatProvider(indent, omitHeader) { inherit FsPicklerTextSerializer(json, ?typeConverter = typeConverter) format = json } /// /// Gets or sets whether Json output should be indented. /// member x.Indent with get () = x.format.Indent and set b = x.format.Indent <- b /// /// Gets or sets whether FsPickler headers should be ignored in pickle format. /// member x.OmitHeader with get () = x.format.OmitHeader and set b = x.format.OmitHeader <- b /// /// Gets or sets a non-null whitespace string that serves as a custom, top-level sequence separator. /// member x.SequenceSeparator with get () = x.format.SequenceSeparator and set sep = x.format.SequenceSeparator <- sep /// /// Gets or sets whether top-level sequences should be serialized using the custom separator. /// member x.UseCustomTopLevelSequenceSeparator with get () = x.format.UseCustomTopLevelSequenceSeparator and set e = x.format.UseCustomTopLevelSequenceSeparator <- e /// /// BSON pickler instance. /// type BsonSerializer([] ?typeConverter) = inherit FsPicklerSerializer(new BsonPickleFormatProvider(), ?typeConverter = typeConverter) /// FsPickler static methods. type FsPickler = /// /// Initializes a new Json pickler instance. /// /// indent out Json pickles. /// omit FsPickler header in Json pickles. /// specify a custom type name converter. static member CreateJson([] ?indent, [] ?omitHeader, [] ?typeConverter) = new JsonSerializer(?indent = indent, ?omitHeader = omitHeader, ?typeConverter = typeConverter) /// /// Initializes a new Bson pickler instance. /// /// specify a custom type name converter. static member CreateBson([] ?typeConverter) = new BsonSerializer(?typeConverter = typeConverter) ================================================ FILE: samples/F#/JsonWriter.fs ================================================ namespace Nessos.FsPickler.Json open System open System.IO open System.Collections.Generic open Newtonsoft.Json open Nessos.FsPickler /// /// Json format serializer. /// type internal JsonPickleWriter (jsonWriter : JsonWriter, omitHeader, indented, isTopLevelSequence, separator, leaveOpen) = do jsonWriter.Formatting <- if indented then Formatting.Indented else Formatting.None jsonWriter.CloseOutput <- not leaveOpen let isBsonWriter = match jsonWriter with :? Bson.BsonWriter -> true | _ -> false let mutable depth = 0 let mutable isTopLevelSequenceHead = false let mutable currentValueIsNull = false let arrayStack = new Stack () do arrayStack.Push Int32.MinValue // do not write tag if omitting header or array element let omitTag () = (omitHeader && depth = 0) || arrayStack.Peek() = depth - 1 interface IPickleFormatWriter with member __.BeginWriteRoot (tag : string) = if omitHeader then () else jsonWriter.WriteStartObject() writePrimitive jsonWriter false "FsPickler" jsonFormatVersion writePrimitive jsonWriter false "type" tag member __.EndWriteRoot () = if not omitHeader then jsonWriter.WriteEnd() member __.BeginWriteObject (tag : string) (flags : ObjectFlags) = if not <| omitTag () then jsonWriter.WritePropertyName tag if flags.HasFlag ObjectFlags.IsNull then currentValueIsNull <- true jsonWriter.WriteNull() elif flags.HasFlag ObjectFlags.IsSequenceHeader then if isTopLevelSequence && depth = 0 then isTopLevelSequenceHead <- true else jsonWriter.WriteStartArray() arrayStack.Push depth depth <- depth + 1 else jsonWriter.WriteStartObject() depth <- depth + 1 if flags = ObjectFlags.None then () else let flagCsv = mkFlagCsv flags writePrimitive jsonWriter false "_flags" flagCsv member __.EndWriteObject () = if currentValueIsNull then currentValueIsNull <- false else depth <- depth - 1 if arrayStack.Peek () = depth then if isTopLevelSequence && depth = 0 then () else jsonWriter.WriteEndArray() arrayStack.Pop () |> ignore else jsonWriter.WriteEndObject() member __.SerializeUnionCaseNames = true member __.PreferLengthPrefixInSequences = false member __.WriteNextSequenceElement hasNext = if isTopLevelSequence && depth = 1 then if isTopLevelSequenceHead then isTopLevelSequenceHead <- false else jsonWriter.WriteWhitespace separator member __.WriteCachedObjectId id = writePrimitive jsonWriter false "id" id member __.WriteBoolean (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteSByte (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteUInt16 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteUInt32 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteUInt64 (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteSingle (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteDouble (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteDecimal (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value) member __.WriteChar (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteString (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteBigInteger (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value) member __.WriteGuid (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag value member __.WriteTimeSpan (tag : string) value = writePrimitive jsonWriter (omitTag ()) tag (string value) // BSON spec mandates the use of Unix time; // this has millisecond precision which results in loss of accuracy w.r.t. ticks // since the goal of FsPickler is to offer faithful representations of .NET objects // we choose to override the spec and serialize ticks outright. // see also https://json.codeplex.com/discussions/212067 member __.WriteDate (tag : string) value = if isBsonWriter then writePrimitive jsonWriter (omitTag ()) tag value.Ticks else writePrimitive jsonWriter (omitTag ()) tag value member __.WriteBytes (tag : string) (value : byte []) = if not <| omitTag () then jsonWriter.WritePropertyName tag if obj.ReferenceEquals(value, null) then jsonWriter.WriteNull() else jsonWriter.WriteValue value member __.IsPrimitiveArraySerializationSupported = false member __.WritePrimitiveArray _ _ = raise <| NotSupportedException() member __.Dispose () = jsonWriter.Flush() ================================================ FILE: samples/F#/PerformanceTesters.fs ================================================ namespace Nessos.FsPickler.Tests open PerfUtil open PerfUtil.NUnit open NUnit.Framework open Nessos.FsPickler open Nessos.FsPickler.Json [] type PerfTester () = inherit NUnitPerf () let tests = PerfTest.OfModuleMarker () override __.PerfTests = tests type ``Serializer Comparison`` () = inherit PerfTester() let fsp = FsPickler.initBinary() let bfs = new BinaryFormatterSerializer() :> Serializer let ndc = new NetDataContractSerializer() :> Serializer let jdn = new JsonDotNetSerializer() :> Serializer let bdn = new JsonDotNetBsonSerializer () :> Serializer let pbn = new ProtoBufSerializer() :> Serializer let ssj = new ServiceStackJsonSerializer() :> Serializer let sst = new ServiceStackTypeSerializer() :> Serializer let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 1.) let tester = new ImplementationComparer<_>(fsp, [bfs;ndc;jdn;bdn;pbn;ssj;sst], throwOnError = true, warmup = true, comparer = comparer) override __.PerfTester = tester :> _ type ``FsPickler Formats Comparison`` () = inherit PerfTester () let binary = FsPickler.initBinary() let json = FsPickler.initJson() let bson = FsPickler.initBson() let xml = FsPickler.initXml() let tester = new ImplementationComparer<_>(binary, [json ; bson; xml], warmup = true, throwOnError = false) override __.PerfTester = tester :> _ type ``Past FsPickler Versions Comparison`` () = inherit PerfTester () let persistResults = true let persistenceFile = "fspPerf.xml" let fsp = FsPickler.initBinary() let version = typeof.Assembly.GetName().Version let comparer = new WeightedComparer(spaceFactor = 0.2, leastAcceptableImprovementFactor = 0.8) let tester = new PastImplementationComparer( fsp, version, historyFile = persistenceFile, throwOnError = true, warmup = true, comparer = comparer) override __.PerfTester = tester :> _ [] member __.Persist() = if persistResults then tester.PersistCurrentResults () ================================================ FILE: samples/F#/PerformanceTests.fs ================================================ namespace Nessos.FsPickler.Tests open System open System.Collections.Generic open PerfUtil open Nessos.FsPickler open Nessos.FsPickler.Tests.Serializer open Nessos.FsPickler.Tests.TestTypes module PerformanceTests = type Marker = class end let guid = Guid.NewGuid() [] let ``Value: Guid`` s = roundtrip guid s let date = DateTime.Now [] let ``Value: DateTime`` s = roundtrip date s [] let ``Value: String`` s = roundtrip stringValue s let boxed = box ([| 1 .. 1000 |], "lorem ipsum") [] let ``Boxed Object`` s = roundtrip boxed s let fsClass = new Class(42, stringValue) [] let ``Class: Simple F# Class`` s = roundtrip fsClass s let serializableClass = new SerializableClass<_>(42, stringValue, [|1..1000|]) [] let ``Class: ISerializable`` s = roundtrip serializableClass s let boxedClass = box(Some 42) [] let ``Subtype Resolution`` s = roundtrip boxedClass s let floatArray = Array.init 100000 (fun i -> float i) [] let ``Array: Float`` s = roundtrip floatArray s let intArray = Array.init 100000 id [] let ``Array: Int`` s = roundtrip intArray s let stringArray = Array.init 10000 (fun i -> stringValue + string i) [] let ``Array: String`` s = roundtrip stringArray s let kvarr = [|1..10000|] |> Array.map (fun i -> i, string i) [] let ``Array: Key-Value Pairs`` s = roundtrip kvarr s let duArray = [| for i in 1 .. 10000 -> (Something ("asdasdasdas", i)) |] [] let ``Array: Discriminated Unions`` s = roundtrip duArray s let objArray = [| box 2; box 3; box "hello" ; box <| Some 3; box(2,3) ; box <| new Class(2, stringValue) ; box <| new SerializableClass(2, stringValue, Some 12); box stringValue |] [] let ``Array: Objects`` s = roundtrip objArray s let array3D = Array3D.init 100 100 100 (fun i j k -> float (i * j + k)) [] let ``Array: Rank-3 Float`` s = roundtrip array3D s let bclDict = dict [ for i in 1 .. 1000 -> (string i, i)] [] let ``.NET Dictionary`` s = roundtrip bclDict s let bclStack = new Stack([for i in 1 .. 1000 -> string i]) [] let ``.NET Stack`` s = roundtrip bclStack s let bclList = new List([for i in 1 .. 1000 -> string i, i]) [] let ``.NET List`` s = roundtrip bclList s let bclSet = new SortedSet<_>([for i in 1 .. 1000 -> string i]) [] let ``.NET Set`` s = roundtrip bclSet s let smallTuple = (1, DateTime.Now,"hello") [] let ``FSharp: Tuple Small`` s = roundtrip smallTuple s let largeTuple = (stringValue, 1, 2, 3, true, "", Some(3.14, [2]), 3, 2, 1, stringValue) [] let ``FSharp: Tuple Large`` s = roundtrip largeTuple s let intList = [1..1000] [] let ``FSharp: List Int`` s = roundtrip intList s let stringList = [ for i in 1 .. 1000 -> stringValue + string i ] [] let ``FSharp: List String`` s = roundtrip stringList s let pairList = [ for i in 1 .. 1000 -> (string i, i) ] [] let ``FSharp: List Key-Value`` s = roundtrip pairList s let nestedLst = let n = [1..1000] in [for _ in 1 .. 100 -> n] [] let ``FSharp: List Nested`` s = roundtrip nestedLst s let union = SomethingElse(stringValue, 42, box (Some 42)) [] let ``FSharp: Union`` s = roundtrip union s let record = { Int = 42 ; String = stringValue ; Tuple = (13, "") } [] let ``FSharp: Record`` s = roundtrip record s let peano = int2Peano 100 [] let ``FSharp: Peano Rectype`` s = roundtrip peano s let closure = (@) [ Some([1..100], Set.ofList [1..100]) ] [] let ``FSharp: Curried Function`` s = roundtrip closure s let binTree = mkTree 10 [] let ``FSharp: Binary Tree`` s = roundtrip binTree s let intSet = [1..1000] |> List.map string |> set [] let ``FSharp: Set`` s = roundtrip intSet s let fsMap = [1..1000] |> Seq.map (fun i -> (string i,i)) |> Map.ofSeq [] let ``FSharp: Map`` s = roundtrip fsMap s let testType = typeof> [] let ``Reflection: Type`` s = roundtrip testType s let quotationSmall = <@ fun x -> pown 2 x @> let quotationLarge = <@ async { let rec fibAsync n = async { match n with | _ when n < 0 -> return invalidArg "negative" "n" | _ when n < 2 -> return n | n -> let! fn = fibAsync (n-1) let! fnn = fibAsync (n-2) return fn + fnn } let! values = [1..100] |> Seq.map fibAsync |> Async.Parallel return Seq.sum values } @> [] let ``FSharp: Quotation Small`` s = roundtrip quotationSmall s [] let ``FSharp: Quotation Large`` s = roundtrip quotationLarge s ================================================ FILE: samples/F#/sample.fs ================================================ module Sample open System type Foo = { Bar : string } type Baz = interface end let Sample1(xs : int list) : string = xs |> List.map (fun x -> string x) |> String.concat "," ================================================ FILE: samples/FIGlet Font/ivrit.flf ================================================ flf2a$ 6 5 76 15 14 1 16271 39 Ivrit (Hebrew) Unicode font assembled by John Cowan Latin chars from Standard by G. Chappell & Ian Chai Hebrew chars from Jerusalem by Gedaliah Friedenberg Use "ilhebrew.flc" for Hebrew keyboard mapping Use "ushebrew.flc" for U.S.-style keyboard mapping ("febrew" script) Use "8859-8.flc" for ISO 8859-8 text Or use UTF-8 WARNING! FIGfonts aren't bidirectional; this is strictly right-to-left (by default) even for the Latin characters. figlet release 2.2 -- November 1996 Modified by Paul Burton 12/96 to include new parameter supported by FIGlet and FIGWin. May also be slightly modified for better use of new full-width/kern/smush alternatives, but default output is NOT changed. $@ $@ $@ $@ $@ $@@ _ @ | |@ | |@ |_|@ (_)@ @@ _ _ @ ( | )@ V V @ $ @ $ @ @@ _ _ @ _| || |_ @ |_ .. _|@ |_ _|@ |_||_| @ @@ _ @ | | @ / __)@ \__ \@ ( /@ |_| @@ _ __@ (_)/ /@ / / @ / /_ @ /_/(_)@ @@ ___ @ ( _ ) @ / _ \/\@ | (_> <@ \___/\/@ @@ _ @ ( )@ |/ @ $ @ $ @ @@ __@ / /@ | | @ | | @ | | @ \_\@@ __ @ \ \ @ | |@ | |@ | |@ /_/ @@ @ __/\__@ \ /@ /_ _\@ \/ @ @@ @ _ @ _| |_ @ |_ _|@ |_| @ @@ @ @ @ _ @ ( )@ |/ @@ @ @ _____ @ |_____|@ $ @ @@ @ @ @ _ @ (_)@ @@ __@ / /@ / / @ / / @ /_/ @ @@ ___ @ / _ \ @ | | | |@ | |_| |@ \___/ @ @@ _ @ / |@ | |@ | |@ |_|@ @@ ____ @ |___ \ @ __) |@ / __/ @ |_____|@ @@ _____ @ |___ / @ |_ \ @ ___) |@ |____/ @ @@ _ _ @ | || | @ | || |_ @ |__ _|@ |_| @ @@ ____ @ | ___| @ |___ \ @ ___) |@ |____/ @ @@ __ @ / /_ @ | '_ \ @ | (_) |@ \___/ @ @@ _____ @ |___ |@ / / @ / / @ /_/ @ @@ ___ @ ( _ ) @ / _ \ @ | (_) |@ \___/ @ @@ ___ @ / _ \ @ | (_) |@ \__, |@ /_/ @ @@ @ _ @ (_)@ _ @ (_)@ @@ @ _ @ (_)@ _ @ ( )@ |/ @@ __@ / /@ / / @ \ \ @ \_\@ @@ @ _____ @ |_____|@ |_____|@ $ @ @@ __ @ \ \ @ \ \@ / /@ /_/ @ @@ ___ @ |__ \@ / /@ |_| @ (_) @ @@ ____ @ / __ \ @ / / _` |@ | | (_| |@ \ \__,_|@ \____/ @@ _ @ / \ @ / _ \ @ / ___ \ @ /_/ \_\@ @@ ____ @ | __ ) @ | _ \ @ | |_) |@ |____/ @ @@ ____ @ / ___|@ | | @ | |___ @ \____|@ @@ ____ @ | _ \ @ | | | |@ | |_| |@ |____/ @ @@ _____ @ | ____|@ | _| @ | |___ @ |_____|@ @@ _____ @ | ___|@ | |_ @ | _| @ |_| @ @@ ____ @ / ___|@ | | _ @ | |_| |@ \____|@ @@ _ _ @ | | | |@ | |_| |@ | _ |@ |_| |_|@ @@ ___ @ |_ _|@ | | @ | | @ |___|@ @@ _ @ | |@ _ | |@ | |_| |@ \___/ @ @@ _ __@ | |/ /@ | ' / @ | . \ @ |_|\_\@ @@ _ @ | | @ | | @ | |___ @ |_____|@ @@ __ __ @ | \/ |@ | |\/| |@ | | | |@ |_| |_|@ @@ _ _ @ | \ | |@ | \| |@ | |\ |@ |_| \_|@ @@ ___ @ / _ \ @ | | | |@ | |_| |@ \___/ @ @@ ____ @ | _ \ @ | |_) |@ | __/ @ |_| @ @@ ___ @ / _ \ @ | | | |@ | |_| |@ \__\_\@ @@ ____ @ | _ \ @ | |_) |@ | _ < @ |_| \_\@ @@ ____ @ / ___| @ \___ \ @ ___) |@ |____/ @ @@ _____ @ |_ _|@ | | @ | | @ |_| @ @@ _ _ @ | | | |@ | | | |@ | |_| |@ \___/ @ @@ __ __@ \ \ / /@ \ \ / / @ \ V / @ \_/ @ @@ __ __@ \ \ / /@ \ \ /\ / / @ \ V V / @ \_/\_/ @ @@ __ __@ \ \/ /@ \ / @ / \ @ /_/\_\@ @@ __ __@ \ \ / /@ \ V / @ | | @ |_| @ @@ _____@ |__ /@ / / @ / /_ @ /____|@ @@ __ @ | _|@ | | @ | | @ | | @ |__|@@ __ @ \ \ @ \ \ @ \ \ @ \_\@ @@ __ @ |_ |@ | |@ | |@ | |@ |__|@@ /\ @ |/\|@ $ @ $ @ $ @ @@ @ @ @ @ _____ @ |_____|@@ _ @ ( )@ \|@ $ @ $ @ @@ @ __ _ @ / _` |@ | (_| |@ \__,_|@ @@ _ @ | |__ @ | '_ \ @ | |_) |@ |_.__/ @ @@ @ ___ @ / __|@ | (__ @ \___|@ @@ _ @ __| |@ / _` |@ | (_| |@ \__,_|@ @@ @ ___ @ / _ \@ | __/@ \___|@ @@ __ @ / _|@ | |_ @ | _|@ |_| @ @@ @ __ _ @ / _` |@ | (_| |@ \__, |@ |___/ @@ _ @ | |__ @ | '_ \ @ | | | |@ |_| |_|@ @@ _ @ (_)@ | |@ | |@ |_|@ @@ _ @ (_)@ | |@ | |@ _/ |@ |__/ @@ _ @ | | __@ | |/ /@ | < @ |_|\_\@ @@ _ @ | |@ | |@ | |@ |_|@ @@ @ _ __ ___ @ | '_ ` _ \ @ | | | | | |@ |_| |_| |_|@ @@ @ _ __ @ | '_ \ @ | | | |@ |_| |_|@ @@ @ ___ @ / _ \ @ | (_) |@ \___/ @ @@ @ _ __ @ | '_ \ @ | |_) |@ | .__/ @ |_| @@ @ __ _ @ / _` |@ | (_| |@ \__, |@ |_|@@ @ _ __ @ | '__|@ | | @ |_| @ @@ @ ___ @ / __|@ \__ \@ |___/@ @@ _ @ | |_ @ | __|@ | |_ @ \__|@ @@ @ _ _ @ | | | |@ | |_| |@ \__,_|@ @@ @ __ __@ \ \ / /@ \ V / @ \_/ @ @@ @ __ __@ \ \ /\ / /@ \ V V / @ \_/\_/ @ @@ @ __ __@ \ \/ /@ > < @ /_/\_\@ @@ @ _ _ @ | | | |@ | |_| |@ \__, |@ |___/ @@ @ ____@ |_ /@ / / @ /___|@ @@ __@ / /@ | | @ < < @ | | @ \_\@@ _ @ | |@ | |@ | |@ | |@ |_|@@ __ @ \ \ @ | | @ > >@ | | @ /_/ @@ /\/|@ |/\/ @ $ @ $ @ $ @ @@ _ _ @ (_)_(_)@ /_\ @ / _ \ @ /_/ \_\@ @@ _ _ @ (_)_(_)@ / _ \ @ | |_| |@ \___/ @ @@ _ _ @ (_) (_)@ | | | |@ | |_| |@ \___/ @ @@ _ _ @ (_)_(_)@ / _` |@ | (_| |@ \__,_|@ @@ _ _ @ (_)_(_)@ / _ \ @ | (_) |@ \___/ @ @@ _ _ @ (_) (_)@ | | | |@ | |_| |@ \__,_|@ @@ ___ @ / _ \@ | |/ /@ | |\ \@ | ||_/@ |_| @@ 160 NO-BREAK SPACE $@ $@ $@ $@ $@ $@@ 173 SOFT HYPHEN @ @ _____ @ |_____|@ $ @ @@ 196 LATIN CAPITAL LETTER A WITH DIAERESIS _ _ @ (_)_(_)@ /_\ @ / _ \ @ /_/ \_\@ @@ 214 LATIN CAPITAL LETTER O WITH DIAERESIS _ _ @ (_)_(_)@ / _ \ @ | |_| |@ \___/ @ @@ 220 LATIN CAPITAL LETTER U WITH DIAERESIS _ _ @ (_) (_)@ | | | |@ | |_| |@ \___/ @ @@ 223 LATIN SMALL LETTER SHARP S ___ @ / _ \@ | |/ /@ | |\ \@ | ||_/@ |_| @@ 228 LATIN SMALL LETTER A WITH DIAERESIS _ _ @ (_)_(_)@ / _` |@ | (_| |@ \__,_|@ @@ 246 LATIN SMALL LETTER O WITH DIAERESIS _ _ @ (_)_(_)@ / _ \ @ | (_) |@ \___/ @ @@ 252 LATIN SMALL LETTER U WITH DIAERESIS _ _ @ (_) (_)@ | | | |@ | |_| |@ \__,_|@ @@ 0x05D0 HEBREW LETTER ALEF __ __@ \ \ / /@ | V / @ | |\ \ @ |_| \_\@ @@ 0x05D1 HEBREW LETTER BET ______ @ |____ | @ | | @ _____| |_@ /________/@ @@ 0x05D2 HEBREW LETTER GIMEL ____ @ |__ | @ | | @ ____| | @ /____/\_\@ @@ 0x05D3 HEBREW LETTER DALET _______ @ |____ |@ | | @ | | @ |_| @ @@ 0x05D4 HEBREW LETTER HE _______ @ |_____ |@ _ | |@ | | | |@ |_| |_|@ @@ 0x05D5 HEBREW LETTER VAV ___ @ |_ |@ | |@ | |@ |_|@ @@ 0x05D6 HEBREW LETTER ZAYIN ________ @ \__ __\@ | | @ | | @ |_| @ @@ 0x05D7 HEBREW LETTER HET _______ @ |. __ |@ | | | |@ | | | |@ |_| |_|@ @@ 0x05D8 HEBREW LETTER TET __ ___ @ |. | /_ |@ | | | |@ | |___| |@ |_______|@ @@ 0x05D9 HEBREW LETTER YOD ___ @ |_ |@ |_|@ $ @ $ @ @@ 0x05DA HEBREW LETTER FINAL KAF _______ @ |____ .|@ | | @ | | @ | | @ |_| @@ 0x05DB HEBREW LETTER KAF _____ @ |____ \ @ | |@ ____| |@ |_____/ @ @@ 0x05DC HEBREW LETTER LAMED |=|____ @ |____ |@ / / @ / / @ /_/ @ @@ 0x05DD HEBREW LETTER FINAL MEM ________ @ |. ___ |@ | | | |@ | |___| |@ |_______|@ @@ 0x05DE HEBREW LETTER MEM _______ @ |. __ |@ | | | |@ | | _| |@ |_||___|@ @@ 0x05DF HEBREW LETTER FINAL NUN ___ @ |_ |@ | |@ | |@ | |@ |_|@@ 0x05E0 HEBREW LETTER NUN ___ @ |_ |@ | |@ __| |@ |____|@ @@ 0x05E1 HEBREW LETTER SAMEKH _______ @ |. __ |@ | | | |@ | |__/ |@ |_____/ @ @@ 0x05E2 HEBREW LETTER AYIN __ _ @ \ \ | |@ \ \| |@ __\ ` |@ |______|@ @@ 0x05E3 HEBREW LETTER FINAL PE ______ @ | __ |@ | |_ | |@ |___|| |@ | |@ |_|@@ 0x05E4 HEBREW LETTER PE _______ @ | ___ |@ \_\ | |@ _____| |@ |_______|@ @@ 0x05E5 HEBREW LETTER FINAL TSADI __ _ @ |. | | |@ | | // @ | |// @ | | @ |_| @@ 0x05E6 HEBREW LETTER TSADI __ __.@ \ \ / / @ \ V / @ ___\ \ @ |______| @ @@ 0x05E7 HEBREW LETTER QOF ______ @ |____ |@ _ | |@ | | |_|@ | | @ |_| @@ 0x05E8 HEBREW LETTER RESH ______ @ |____ |@ | |@ | |@ |_|@ @@ 0x05E9 HEBREW LETTER SHIN _ _ _ @ | | | | | |@ | | | | | |@ | |/ /_/ / @ |_______/ @ @@ 0x05EA HEBREW LETTER TAV ______ @ | __ |@ | | | |@ _| | | |@ |___| |_|@ @@ 0x2721 STAR OF DAVID @ __/\__@ \ /@ /_ _\@ \/ @ @@ -0x0002 aleph = t, bet/vet = c, gimel = d, dalet = s, he = v, vav = u, zayin = z @ het = j, tet = y, yod = h, kaf/chaf = f, final kaf = l, lamed = k, mem = n@ final mem = o, nun = b, final nun = i, samekh = x, ayin = g, pe/fe = p, @ final pe = ;, tsadi = m, final tsadi = ., qof = e, resh = r, shin/sin = a @ tav = , comma = ', period = /, semicolon = `, slash = q, apostrophe = w @ Star of David = * @@ -0x0003 aleph = a, bet/vet = b, gimel = g, dalet = d, he = h, vav = v, zayin = z @ het = c, tet = t, yod = y, kaf/chaf = k, final kaf = f, lamed = l, mem = m@ final mem = o, nun = n, final nun = i, samekh = e, ayin = _, pe/fe = p, @ final pe = u, tsadi = j, final tsadi = w, qof = q, resh = r, shin/sin = s @ tav = x @ Star of David = * @@ ================================================ FILE: samples/FIRRTL/LFSR.fir ================================================ FIRRTL version 4.0.0 circuit Foo : %[[ { "class": "firrtl.transforms.DontTouchAnnotation", "target": "~Foo|Foo>a" } ]] layer A, bind: module MaxPeriodFibonacciLFSR : @[src/main/scala/chisel3/util/random/FibonacciLFSR.scala 65:7] input clock : Clock @[src/main/scala/chisel3/util/random/FibonacciLFSR.scala 65:7] input reset : Reset @[src/main/scala/chisel3/util/random/FibonacciLFSR.scala 65:7] output io : { flip seed : { valid : UInt<1>, bits : UInt<1>[4]}, flip increment : UInt<1>, out : UInt<1>[4]} @[src/main/scala/chisel3/util/random/PRNG.scala 42:22] wire _state_WIRE : UInt<1>[4] @[src/main/scala/chisel3/util/random/PRNG.scala 46:28] connect _state_WIRE[0], UInt<1>(0h1) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28] connect _state_WIRE[1], UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28] connect _state_WIRE[2], UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28] connect _state_WIRE[3], UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 46:28] regreset state : UInt<1>[4], clock, reset, _state_WIRE @[src/main/scala/chisel3/util/random/PRNG.scala 55:49] when io.increment : @[src/main/scala/chisel3/util/random/PRNG.scala 69:22] node _T = xor(state[3], state[2]) @[src/main/scala/chisel3/util/random/LFSR.scala 15:41] connect state[0], _T @[src/main/scala/chisel3/util/random/PRNG.scala 70:11] connect state[1], state[0] @[src/main/scala/chisel3/util/random/PRNG.scala 70:11] connect state[2], state[1] @[src/main/scala/chisel3/util/random/PRNG.scala 70:11] connect state[3], state[2] @[src/main/scala/chisel3/util/random/PRNG.scala 70:11] when io.seed.valid : @[src/main/scala/chisel3/util/random/PRNG.scala 73:22] connect state[0], io.seed.bits[0] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11] connect state[1], io.seed.bits[1] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11] connect state[2], io.seed.bits[2] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11] connect state[3], io.seed.bits[3] @[src/main/scala/chisel3/util/random/PRNG.scala 74:11] connect io.out, state @[src/main/scala/chisel3/util/random/PRNG.scala 78:10] public module Foo : @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 11:7] input clock : Clock @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 11:7] input reset : UInt<1> @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 11:7] output a : UInt<4> @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 12:13] inst a_prng of MaxPeriodFibonacciLFSR @[src/main/scala/chisel3/util/random/PRNG.scala 91:22] connect a_prng.clock, clock connect a_prng.reset, reset connect a_prng.io.seed.valid, UInt<1>(0h0) @[src/main/scala/chisel3/util/random/PRNG.scala 92:24] invalidate a_prng.io.seed.bits[0] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23] invalidate a_prng.io.seed.bits[1] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23] invalidate a_prng.io.seed.bits[2] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23] invalidate a_prng.io.seed.bits[3] @[src/main/scala/chisel3/util/random/PRNG.scala 93:23] connect a_prng.io.increment, UInt<1>(0h1) @[src/main/scala/chisel3/util/random/PRNG.scala 94:23] node a_lo = cat(a_prng.io.out[1], a_prng.io.out[0]) @[src/main/scala/chisel3/util/random/PRNG.scala 95:17] node a_hi = cat(a_prng.io.out[3], a_prng.io.out[2]) @[src/main/scala/chisel3/util/random/PRNG.scala 95:17] node _a_T = cat(a_hi, a_lo) @[src/main/scala/chisel3/util/random/PRNG.scala 95:17] connect a, _a_T @[Users/user/repos/github.com/seldridge/scala-snippets/LFSR.scala 14:5] printf(clock, UInt<1>(1), "Value of a is %x", a) ================================================ FILE: samples/FIRRTL/Memory.fir ================================================ FIRRTL version 4.0.0 circuit Memory: public module Memory: input clock: Clock input rAddr: UInt<4> input rEn: UInt<1> output rData: UInt<8> input wMask: UInt<1> input wData: UInt<8> mem tbMemoryKind1: data-type => UInt<1> depth => 16 reader => r writer => w read-latency => 1 write-latency => 1 read-under-write => undefined tbMemoryKind1.r.clk <= clock tbMemoryKind1.r.en <= rEn tbMemoryKind1.r.addr <= rAddr rData <= tbMemoryKind1.r.data tbMemoryKind1.w.clk <= clock tbMemoryKind1.w.en <= rEn tbMemoryKind1.w.addr <= rAddr tbMemoryKind1.w.mask <= wMask tbMemoryKind1.w.data <= wData ================================================ FILE: samples/FLUX/gameserver.fx ================================================ typedef engine isEngineMessage; typedef turn isTurnMessage; typedef connect isConnectMessage; typedef disconnect isDisconnectMessage; ClientMessage(char* data) => (); ParseMessage(char* data) => (int type, int client, char* data); ReadMessage(int type, int client, char* data) => (); ParseEngine(int type, int client, char* data) => (int client, int direction); DoEngine(int client, int direction) => (); ParseTurn(int type, int client, char* data) => (int client, int direction); DoTurn(int client, int direction) => (); ParseConnect(int type, int client, char* data) => (int client, char* host, int port); DoConnect(int client, char* host, int port) => (); ParseDisconnect(int type, int client, char* data) => (int client); DoDisconnect(int client) => (); UpdateBoard(ClientList clients) => (ClientList clients); SendData(ClientList clients) => (); DoUpdate(ClientList clients) => (); DataTimer() => (ClientList clients); GetClients() => (ClientList clients); Wait(ClientList clients) => (ClientList clients); Listen () => (char* data); source Listen => ClientMessage; source DataTimer => DoUpdate; DataTimer = GetClients -> Wait; DoUpdate = UpdateBoard -> SendData; ClientMessage=ParseMessage -> ReadMessage; ReadMessage:[engine, _, _] = ParseEngine -> DoEngine; ReadMessage:[turn, _, _] = ParseTurn -> DoTurn; ReadMessage:[connect, _, _] = ParseConnect -> DoConnect; ReadMessage:[disconnect, _, _] = ParseDisconnect -> DoDisconnect; atomic GetClients:{client_lock}; atomic DoConnect:{client_lock}; atomic DoDisconnect:{client_lock}; ================================================ FILE: samples/FLUX/imageserver.fx ================================================ typedef xml TestXML; typedef html TestHTML; typedef inCache TestInCache; Page (int socket) => (); ReadRequest (int socket) => (int socket, bool close, image_tag *request); CheckCache (int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request); Handler (int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request); Complete (int socket, bool close, image_tag *request) => (); ReadInFromDisk (int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request, __u8 *rgb_data); Write (int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request); Compress(int socket, bool close, image_tag *request, __u8 *rgb_data) => (int socket, bool close, image_tag *request); StoreInCache(int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request); Listen () => (int socket); source Listen => Page; Handler:[_, _, inCache]=; Handler:[_, _, _]=ReadInFromDisk -> Compress -> StoreInCache; Page = ReadRequest -> CheckCache-> Handler -> Write -> Complete; atomic CheckCache:{cache}; atomic StoreInCache:{cache}; atomic Complete:{cache}; handle error ReadInFromDisk => FourOhFor; ================================================ FILE: samples/FLUX/mbittorrent.fx ================================================ typedef choke TestChoke; typedef unchoke TestUnchoke; typedef interested TestInterested; typedef uninterested TestUninterested; typedef request TestRequest; typedef cancel TestCancel; typedef piece TestPiece; typedef bitfield TestBitfield; typedef have TestHave; typedef piececomplete TestPieceComplete; CheckinWithTracker (torrent_data_t *tdata) => (); SendRequestToTracker (torrent_data_t *tdata) => (torrent_data_t *tdata, int socket); GetTrackerResponse (torrent_data_t *tdata, int socket) => (); UpdateChokeList (torrent_data_t *tdata) => (); PickChoked (torrent_data_t *tdata) => (torrent_data_t *tdata, chokelist_t clist); SendChokeUnchoke (torrent_data_t *tdata, chokelist_t clist) => (); SetupConnection (torrent_data_t *tdata, int socket) => (); Handshake (torrent_data_t *tdata, int socket) => (torrent_data_t *tdata, client_data_t *client); SendBitfield (torrent_data_t *tdata, client_data_t *client) => (); Message (torrent_data_t *tdata, client_data_t *client) => (); ReadMessage (torrent_data_t *tdata, client_data_t *client) => (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload); HandleMessage (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); MessageDone (client_data_t *client) => (); CompletePiece (torrent_data_t *tdata, client_data_t *client, int piece) => (torrent_data_t *tdata, client_data_t *client); VerifyPiece (torrent_data_t *tdata, client_data_t *client, int piece) => (torrent_data_t *tdata, client_data_t *client, int piece); SendHave (torrent_data_t *tdata, client_data_t *client, int piece) => (torrent_data_t *tdata, client_data_t *client); SendUninterested (torrent_data_t *tdata, client_data_t *client) => (torrent_data_t *tdata, client_data_t *client); Choke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); Cancel (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); Interested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); Uninterested (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); Bitfield (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); Unchoke (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (torrent_data_t *tdata, client_data_t *client); SendRequest (torrent_data_t *tdata, client_data_t *client) => (client_data_t *client); Have (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (torrent_data_t *tdata, client_data_t *client); Piece (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (torrent_data_t *tdata, client_data_t *client, int piece); Request (torrent_data_t *tdata, client_data_t *client, int type, int length, char *payload) => (client_data_t *client); SendKeepAlives (torrent_data_t *tdata) => (); GetClients () => (int maxfd, fd_set *fds); SelectSockets (int maxfd, fd_set *fds) => (fd_set *fds); CheckSockets (fd_set *fds) => (torrent_data_t *tdata, client_data_t *client); TrackerTimer () => (torrent_data_t *tdata); ChokeTimer () => (torrent_data_t *tdata); Connect () => (torrent_data_t *tdata, int socket); KeepAliveTimer () => (torrent_data_t *tdata); Listen () => (torrent_data_t *tdata, client_data_t *client); source TrackerTimer => CheckinWithTracker; source ChokeTimer => UpdateChokeList; source Connect => SetupConnection; source Listen => Message; source KeepAliveTimer => SendKeepAlives; Listen = GetClients -> SelectSockets -> CheckSockets; CheckinWithTracker = SendRequestToTracker -> GetTrackerResponse; UpdateChokeList = PickChoked -> SendChokeUnchoke; SetupConnection = Handshake -> SendBitfield; Message = ReadMessage -> HandleMessage -> MessageDone; CompletePiece:[_, _, piececomplete] = VerifyPiece -> SendHave -> SendUninterested; HandleMessage:[_, _, choke, _, _] = Choke; HandleMessage:[_, _, unchoke, _, _] = Unchoke -> SendRequest; HandleMessage:[_, _, interested, _, _] = Interested; HandleMessage:[_, _, uninterested, _, _] = Uninterested; HandleMessage:[_, _, request, _, _] = Request; HandleMessage:[_, _, cancel, _, _] = Cancel; HandleMessage:[_, _, piece, _, _] = Piece -> CompletePiece -> SendRequest; HandleMessage:[_, _, bitfield, _, _] = Bitfield; HandleMessage:[_, _, have, _, _] = Have -> SendRequest; atomic GetClients:{BigLock}; atomic CheckSockets:{BigLock}; atomic Message:{BigLock}; atomic CheckinWithTracker:{BigLock}; atomic UpdateChokeList:{BigLock}; atomic SetupConnection:{BigLock}; atomic SendKeepAlives:{BigLock}; ================================================ FILE: samples/FLUX/test.fx ================================================ // concrete node signatures Listen () => (int socket); ReadRequest (int socket) => (int socket, bool close, image_tag *request); CheckCache (int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request); // omitted for space: // ReadInFromDisk, StoreInCache Compress (int socket, bool close, image_tag *request, __u8 *rgb_data) => (int socket, bool close, image_tag *request); Write (int socket, bool close, image_tag *request) => (int socket, bool close, image_tag *request); Complete (int socket, bool close, image_tag *request) => (); // source node source Listen => Image; // abstract node Image = ReadRequest -> CheckCache -> Handler -> Write -> Complete; // predicate type & dispatch typedef hit TestInCache; Handler:[_, _, hit] = ; Handler:[_, _, _] = ReadInFromDisk -> Compress -> StoreInCache; // error handler handle error ReadInFromDisk => FourOhFor; // atomicity constraints atomic CheckCache:{cache}; atomic StoreInCache:{cache}; atomic Complete:{cache}; ================================================ FILE: samples/Fantom/sample1.fan ================================================ /* * Author: Robert Koeninger * License: WTFPL (http://www.wtfpl.net/) */ class Spelling { ** Load sample text and offer corrections for input static Void main(Str[] args) { text := File.os("big.txt").readAllStr counts := Str:Int[:] { def = 0 } text.split.each |word| { counts[word] += 1 } args.each |arg| { echo(correction(counts, arg)) } } static const Range letters := Range.makeInclusive(97, 122) ** Most probable spelling correction for `word`. static Str correction(Str:Int counts, Str word) { candidates(counts, word).max |x, y| { counts[x] <=> counts[y] } } ** Generate possible spelling corrections for `word`. static Str[] candidates(Str:Int counts, Str word) { result := known(counts, Str[word]) if (result.size > 0) return result result = known(counts, edits1(word)) if (result.size > 0) return result result = known(counts, edits2(word)) if (result.size > 0) return result return Str[word] } ** The subset of `words` that appear in the map of `counts`. static Str[] known(Str:Int counts, Str[] words) { words.findAll |word, i| { counts[word] > 0 }.unique } ** All edits that are one edit away from `word`. static Str[] edits1(Str word) { edits := Str[,] for (i := 0; i < word.size; ++i) { edits.add(delete(word, i)) if (i < word.size - 2) { edits.add(transpose(word, i)) } edits.addAll(replace(word, i)) edits.addAll(insert(word, i)) } edits = edits.unique edits.remove(word) return edits } ** Word with `i`th letter removed. static Str delete(Str word, Int i) { left := word.getRange(Range.makeExclusive(0, i)) right := word.getRange(Range.makeExclusive(i + 1, word.size)) return left + right } ** Word with `i`th and `i+1`st letter swapped. static Str transpose(Str word, Int i) { left := word.getRange(Range.makeExclusive(0, i)) right := word.getRange(Range.makeExclusive(i, word.size)) first := right.get(0).toChar second := right.get(1).toChar rest := right.getRange(Range.makeExclusive(2, right.size)) return left + second + first + rest } ** Word with `i`th letter replaced with every other letter. static Str[] replace(Str word, Int i) { left := word.getRange(Range.makeExclusive(0, i)) right := word.getRange(Range.makeExclusive(i + 1, word.size)) return letters.map |ch| { left + ch.toChar + right } } ** Word with each letter inserted at `i`. static Str[] insert(Str word, Int i) { left := word.getRange(Range.makeExclusive(0, i)) right := word.getRange(Range.makeExclusive(i, word.size)) return letters.map |ch| { left + ch.toChar + right } } ** All edits that are two edits away from `word`. static Str[] edits2(Str word) { (Str[])(edits1(word).map |w| { edits1(w) }.flatten) } } ================================================ FILE: samples/Fantom/sample2.fan ================================================ /* * Author: Robert Koeninger * License: WTFPL (http://www.wtfpl.net/) */ mixin Expr { abstract Obj? eval() } class Constant : Expr { Obj? value new make(Obj? value) { this.value = value } override Obj? eval() { value } } enum class Op { plus, minus } class Infix : Expr { Op op Expr left Expr right new make(Op op, Expr left, Expr right) { this.op = op this.left = left this.right = right } override Obj? eval() { switch (op) { case Op.plus: return (Int)left.eval() + (Int)right.eval() case Op.minus: return (Int)left.eval() - (Int)right.eval() default: throw Err("undefined Op") } } } ================================================ FILE: samples/Faust/FFT.dsp ================================================ // Radix 2 FFT, decimation in time, real and imag parts interleaved declare name "FFT"; // Faust Fourier Transform :-) declare author "JOS"; declare license "STK-4.3"; import("stdfaust.lib"); N=32; // FFT size (power of 2) // Number of frequency bins (including dc and SR/2) is N/2+1 No2 = N>>1; signal = amp * cosine with { cosine = select2(k==0, select2(k==No2, 2.0*os.oscrc(f(k)), // 2x since negative-frequencies not displayed 1-1':+~*(-1) // Alternating sequence: 1, -1, 1, -1 ), 1.0); // make sure phase is zero (freq jumps around) f(k) = float(k) * ma.SR / float(N); // only test FFT bin frequencies k = hslider("[2] FFT Bin Number",N/4,0,No2,0.001) : int <: _,dpy : attach; dpy = hbargraph("[3] Measured FFT Bin Number",0,No2); amp = hslider("[4] Amplitude",0.1,0,1,0.001); }; process = signal : dm.fft_spectral_level_demo(N) <: _,_; ================================================ FILE: samples/Faust/lowCut.dsp ================================================ // WARNING: This a "legacy example based on a deprecated library". Check filters.lib // for more accurate examples of filter functions declare name "lowcut"; declare version "1.0"; declare author "Grame"; declare license "BSD"; declare copyright "(c)GRAME 2006"; //------------------------------------------------------------------ // DAFX, Digital Audio Effects (Wiley ed.) // chapter 2 : filters // section 2.3 : Equalizers // page 53 : second order shelving filter design //------------------------------------------------------------------ import("stdfaust.lib"); //------------------- low-frequency shelving cut (table 2.3) -------------------- V0(g) = pow(10,g/-20.0); K(fc) = tan(ma.PI*fc/ma.SR); squ(x) = x*x; denom(fc,g) = 1 + sqrt(2*V0(g))*K(fc) + V0(g)*squ(K(fc)); lfcut(fc, g) = fi.TF2((1 + sqrt(2)*K(fc) + squ(K(fc))) / denom(fc,g), 2 * (squ(K(fc)) - 1) / denom(fc,g), (1 - sqrt(2)*K(fc) + squ(K(fc))) / denom(fc,g), 2 * (V0(g)*squ(K(fc)) - 1) / denom(fc,g), (1 - sqrt(2*V0(g))*K(fc) + V0(g)*squ(K(fc))) / denom(fc,g)); //------------------------------ User Interface ----------------------------------- freq = hslider("freq [unit:Hz][style:knob]", 100, 20, 5000, 1); att = hslider("attenuation [unit:dB][style:knob]", 0, -96, 10, 0.1); //----------------------------------- Process ------------------------------------- process = vgroup("low-freq shelving cut", lfcut(freq,att)); ================================================ FILE: samples/Fennel/repl.fnl ================================================ ;; This module is the read/eval/print loop; for coding Fennel interactively. ;; The most complex thing it does is locals-saving, which allows locals to be ;; preserved in between "chunks"; by default Lua throws away all locals after ;; evaluating each piece of input. (local utils (require :fennel.utils)) (local parser (require :fennel.parser)) (local compiler (require :fennel.compiler)) (local specials (require :fennel.specials)) (fn default-read-chunk [parser-state] (io.write (if (< 0 parser-state.stack-size) ".." ">> ")) (io.flush) (let [input (io.read)] (and input (.. input "\n")))) (fn default-on-values [xs] (io.write (table.concat xs "\t")) (io.write "\n")) ;; fnlfmt: skip (fn default-on-error [errtype err lua-source] (io.write (match errtype "Lua Compile" (.. "Bad code generated - likely a bug with the compiler:\n" "--- Generated Lua Start ---\n" lua-source "--- Generated Lua End ---\n") "Runtime" (.. (compiler.traceback (tostring err) 4) "\n") _ (: "%s error: %s\n" :format errtype (tostring err))))) (local save-source (table.concat ["local ___i___ = 1" "while true do" " local name, value = debug.getlocal(1, ___i___)" " if(name and name ~= \"___i___\") then" " ___replLocals___[name] = value" " ___i___ = ___i___ + 1" " else break end end"] "\n")) (fn splice-save-locals [env lua-source] (set env.___replLocals___ (or env.___replLocals___ {})) (let [spliced-source [] bind "local %s = ___replLocals___['%s']"] (each [line (lua-source:gmatch "([^\n]+)\n?")] (table.insert spliced-source line)) (each [name (pairs env.___replLocals___)] (table.insert spliced-source 1 (bind:format name name))) (when (and (< 1 (length spliced-source)) (: (. spliced-source (length spliced-source)) :match "^ *return .*$")) (table.insert spliced-source (length spliced-source) save-source)) (table.concat spliced-source "\n"))) (fn completer [env scope text] (let [matches [] input-fragment (text:gsub ".*[%s)(]+" "")] (var stop-looking? false) (fn add-partials [input tbl prefix] ; add partial key matches in tbl (each [k (utils.allpairs tbl)] (let [k (if (or (= tbl env) (= tbl env.___replLocals___)) (. scope.unmanglings k) k)] (when (and (< (length matches) 2000) ; stop explosion on too many items (= (type k) :string) (= input (k:sub 0 (length input)))) (table.insert matches (.. prefix k)))))) (fn add-matches [input tbl prefix] ; add matches, descending into tbl fields (let [prefix (if prefix (.. prefix ".") "")] (if (not (input:find "%.")) ; no more dots, so add matches (add-partials input tbl prefix) (let [(head tail) (input:match "^([^.]+)%.(.*)") raw-head (if (or (= tbl env) (= tbl env.___replLocals___)) (. scope.manglings head) head)] (when (= (type (. tbl raw-head)) :table) (set stop-looking? true) (add-matches tail (. tbl raw-head) (.. prefix head))))))) (each [_ source (ipairs [scope.specials scope.macros (or env.___replLocals___ []) env env._G])] (add-matches input-fragment source) ;; bootstrap compiler doesn't yet know how to :until (when stop-looking? (lua :break))) matches)) (local commands {}) (fn command? [input] (input:match "^%s*,")) (fn command-docs [] (table.concat (icollect [name f (pairs commands)] (: " ,%s - %s" :format name (or (compiler.metadata:get f :fnl/docstring) :undocumented))) "\n")) ;; fnlfmt: skip (fn commands.help [_ _ on-values] "Show this message." (on-values [(.. "Welcome to Fennel. This is the REPL where you can enter code to be evaluated. You can also run these repl commands: " (command-docs) " ,exit - Leave the repl. Use (doc something) to see descriptions for individual macros and special forms. For more information about the language, see https://fennel-lang.org/reference")])) ;; Can't rely on metadata being enabled at load time for Fennel's own internals. (compiler.metadata:set commands.help :fnl/docstring "Show this message.") (fn reload [module-name env on-values on-error] ;; Sandbox the reload inside the limited environment, if present. (match (pcall (specials.load-code "return require(...)" env) module-name) (true old) (let [_ (tset package.loaded module-name nil) (ok new) (pcall require module-name) ;; keep the old module if reload failed new (if (not ok) (do (on-values [new]) old) new)] ;; if the module isn't a table then we can't make changes ;; which affect already-loaded code, but if it is then we ;; should splice new values into the existing table and ;; remove values that are gone. (when (and (= (type old) :table) (= (type new) :table)) (each [k v (pairs new)] (tset old k v)) (each [k (pairs old)] (when (= nil (. new k)) (tset old k nil))) (tset package.loaded module-name old)) (on-values [:ok])) (false msg) (on-error :Runtime (pick-values 1 (msg:gsub "\n.*" ""))))) (fn commands.reload [env read on-values on-error] (match (pcall read) (true true module-sym) (reload (tostring module-sym) env on-values on-error) (false ?parse-ok ?msg) (on-error :Parse (or ?msg ?parse-ok)))) (compiler.metadata:set commands.reload :fnl/docstring "Reload the specified module.") (fn commands.reset [env _ on-values] (set env.___replLocals___ {}) (on-values [:ok])) (compiler.metadata:set commands.reset :fnl/docstring "Erase all repl-local scope.") (fn commands.complete [env read on-values on-error scope] (match (pcall read) (true true input) (on-values (completer env scope (tostring input))) (_ _ ?msg) (on-error :Parse (or ?msg "Couldn't parse completion input.")))) (compiler.metadata:set commands.complete :fnl/docstring "Print all possible completions for a given input.") (fn load-plugin-commands [] (when (and utils.root utils.root.options utils.root.options.plugins) (each [_ plugin (ipairs utils.root.options.plugins)] (each [name f (pairs plugin)] ;; first function to provide a command should win (match (name:match "^repl%-command%-(.*)") cmd-name (tset commands cmd-name (or (. commands cmd-name) f))))))) (fn run-command [input read loop env on-values on-error scope] (load-plugin-commands) (let [command-name (input:match ",([^%s/]+)")] (match (. commands command-name) command (command env read on-values on-error scope) _ (when (not= :exit command-name) (on-values ["Unknown command" command-name]))) (when (not= :exit command-name) (loop)))) (fn repl [options] (let [old-root-options utils.root.options env (if options.env (specials.wrap-env options.env) (setmetatable {} {:__index (or (rawget _G :_ENV) _G)})) save-locals? (and (not= options.saveLocals false) env.debug env.debug.getlocal) opts {} _ (each [k v (pairs options)] (tset opts k v)) read-chunk (or opts.readChunk default-read-chunk) on-values (or opts.onValues default-on-values) on-error (or opts.onError default-on-error) pp (or opts.pp tostring) ;; make parser (byte-stream clear-stream) (parser.granulate read-chunk) chars [] (read reset) (parser.parser (fn [parser-state] (let [c (byte-stream parser-state)] (table.insert chars c) c))) scope (compiler.make-scope)] ;; use metadata unless we've specifically disabled it (set opts.useMetadata (not= options.useMetadata false)) (when (= opts.allowedGlobals nil) (set opts.allowedGlobals (specials.current-global-names opts.env))) (when opts.registerCompleter (opts.registerCompleter (partial completer env scope))) (fn print-values [...] (let [vals [...] out []] (set (env._ env.__) (values (. vals 1) vals)) ;; utils.map won't work here because of sparse tables (for [i 1 (select "#" ...)] (table.insert out (pp (. vals i)))) (on-values out))) (fn loop [] (each [k (pairs chars)] (tset chars k nil)) (let [(ok parse-ok? x) (pcall read) src-string (string.char ((or table.unpack _G.unpack) chars))] (set utils.root.options opts) (if (not ok) (do (on-error :Parse parse-ok?) (clear-stream) (reset) (loop)) (command? src-string) (run-command src-string read loop env on-values on-error scope) (when parse-ok? ; if this is false, we got eof (match (pcall compiler.compile x {:correlate opts.correlate :source src-string : scope :useMetadata opts.useMetadata :moduleName opts.moduleName :assert-compile opts.assert-compile :parse-error opts.parse-error :useBitLib opts.useBitLib}) (false msg) (do (clear-stream) (on-error :Compile msg)) (true src) (let [src (if save-locals? (splice-save-locals env src) src)] (match (pcall specials.load-code src env) (false msg) (do (clear-stream) (on-error "Lua Compile" msg src)) (_ chunk) (xpcall #(print-values (chunk)) (partial on-error :Runtime))))) (set utils.root.options old-root-options) (loop))))) (loop))) ================================================ FILE: samples/Fennel/utils.fnl ================================================ ;; This module contains mostly general-purpose table-related functionality that ;; you might expect to see in a standard library in most langugaes, as well as ;; the definitions of several core compiler types. It could be split into two ;; distinct modules along those lines. ;;; General-purpose helper functions (fn stablepairs [t] "Like pairs, but gives consistent ordering every time. On 5.1, 5.2, and LuaJIT pairs is already stable, but on 5.3+ every run gives different ordering." (let [keys [] succ []] (each [k (pairs t)] (table.insert keys k)) (table.sort keys #(< (tostring $1) (tostring $2))) (each [i k (ipairs keys)] (tset succ k (. keys (+ i 1)))) (fn stablenext [tbl idx] (let [key (if (= idx nil) (. keys 1) (. succ idx)) value (if (= key nil) nil (. tbl key))] (values key value))) (values stablenext t nil))) ;; Note: the collect/icollect macros mostly make map/kvmap obsolete. (fn map [t f out] "Map function f over sequential table t, removing values where f returns nil. Optionally takes a target table to insert the mapped values into." (let [out (or out []) f (if (= (type f) :function) f #(. $ f))] (each [_ x (ipairs t)] (match (f x) v (table.insert out v))) out)) (fn kvmap [t f out] "Map function f over key/value table t, similar to above, but it can return a sequential table if f returns a single value or a k/v table if f returns two. Optionally takes a target table to insert the mapped values into." (let [out (or out []) f (if (= (type f) :function) f #(. $ f))] (each [k x (stablepairs t)] (match (f k x) (key value) (tset out key value) (value) (table.insert out value))) out)) (fn copy [from to] "Returns a shallow copy of its table argument. Returns an empty table on nil." (let [to (or to [])] (each [k v (pairs (or from []))] (tset to k v)) to)) (fn member? [x tbl n] (match (. tbl (or n 1)) x true nil nil _ (member? x tbl (+ (or n 1) 1)))) (fn allpairs [tbl] "Like pairs, but if the table has an __index metamethod, it will recurisvely traverse upwards, skipping duplicates, to iterate all inherited properties" (assert (= (type tbl) :table) "allpairs expects a table") (var t tbl) (let [seen []] (fn allpairs-next [_ state] (let [(next-state value) (next t state)] (if (. seen next-state) (allpairs-next nil next-state) next-state (do (tset seen next-state true) (values next-state value)) (match (getmetatable t) {: __index} (when (= :table (type __index)) (set t __index) (allpairs-next t)))))) allpairs-next)) ;;; AST functions ;; AST nodes tend to be implemented as tables with specific "marker" metatables ;; set on them; they have constructor functions which set the metatables and ;; predicate functions which check the metatables. The fact that they use ;; metatables should be considered an implementation detail. String and number ;; literals are represented literally, and "regular" key/value tables are ;; represented without a marker metatable since their metatables are needed to ;; store file/line source data. (fn deref [self] "Get the name of a symbol." (. self 1)) ;; haven't defined sym yet; circularity is needed here (var nil-sym nil) ;; the tostring2 argument is passed in by fennelview; this lets us use the same ;; function for regular tostring as for fennelview. when called from fennelview ;; the list's contents will also show as being fennelviewed. (fn list->string [self tostring2] (var (safe max) (values [] 0)) (each [k (pairs self)] (when (and (= (type k) :number) (> k max)) (set max k))) (for [i 1 max] (tset safe i (or (and (= (. self i) nil) nil-sym) (. self i)))) (.. "(" (table.concat (map safe (or tostring2 tostring)) " " 1 max) ")")) (fn comment-view [c] (values c true)) (fn sym= [a b] (and (= (deref a) (deref b)) (= (getmetatable a) (getmetatable b)))) (fn sym< [a b] (< (. a 1) (tostring b))) (local symbol-mt {1 :SYMBOL :__fennelview deref :__tostring deref :__eq sym= :__lt sym<}) (local expr-mt {1 :EXPR :__tostring deref}) (local list-mt {1 :LIST :__fennelview list->string :__tostring list->string}) (local comment-mt {1 :COMMENT :__fennelview comment-view :__tostring deref :__eq sym= :__lt sym<}) (local sequence-marker [:SEQUENCE]) (local vararg (setmetatable ["..."] {1 :VARARG :__fennelview deref :__tostring deref})) (local getenv (or (and os os.getenv) #nil)) (fn debug-on? [flag] (let [level (or (getenv :FENNEL_DEBUG) "")] (or (= level :all) (level:find flag)))) (fn list [...] "Create a new list. Lists are a compile-time construct in Fennel; they are represented as tables with a special marker metatable. They only come from the parser, and they represent code which comes from reading a paren form; they are specifically not cons cells." (setmetatable [...] list-mt)) (fn sym [str ?source ?scope] "Create a new symbol. Symbols are a compile-time construct in Fennel and are not exposed outside the compiler. Second optional argument is a table describing where the symbol came from; should be a table with filename, line, bytestart, and byteend fields." (let [s {: ?scope 1 str}] (each [k v (pairs (or ?source []))] (when (= (type k) :string) (tset s k v))) (setmetatable s symbol-mt))) (set nil-sym (sym :nil)) (fn sequence [...] "Create a new sequence. Sequences are tables that come from the parser when it encounters a form with square brackets. They are treated as regular tables except when certain macros need to look for binding forms, etc specifically." ;; can't use SEQUENCE-MT directly as the sequence metatable like we do with ;; the other types without giving up the ability to set source metadata ;; on a sequence, (which we need for error reporting) so embed a marker ;; value in the metatable instead. (setmetatable [...] {:sequence sequence-marker})) (fn expr [strcode etype] "Create a new expression. etype should be one of: :literal literals like numbers, strings, nil, true, false :expression Complex strings of Lua code, may have side effects, etc but is an expression :statement Same as expression, but is also a valid statement (function calls) :vargs varargs symbol :sym symbol reference" (setmetatable {:type etype 1 strcode} expr-mt)) (fn comment* [contents ?source] (let [{: filename : line} (or ?source [])] (setmetatable {1 contents : filename : line} comment-mt))) (fn varg [] vararg) (fn expr? [x] "Checks if an object is an expression. Returns the object if it is." (and (= (type x) :table) (= (getmetatable x) expr-mt) x)) (fn varg? [x] "Checks if an object is the vararg symbol. Returns the object if is." (and (= x vararg) x)) (fn list? [x] "Checks if an object is a list. Returns the object if is." (and (= (type x) :table) (= (getmetatable x) list-mt) x)) (fn sym? [x] "Checks if an object is a symbol. Returns the object if it is." (and (= (type x) :table) (= (getmetatable x) symbol-mt) x)) (fn sequence? [x] "Checks if an object is a sequence (created with a [] literal)" (let [mt (and (= (type x) :table) (getmetatable x))] (and mt (= mt.sequence sequence-marker) x))) (fn comment? [x] (and (= (type x) :table) (= (getmetatable x) comment-mt) x)) (fn table? [x] "Checks if an object any kind of table, EXCEPT list/symbol/vararg/comment." (and (= (type x) :table) (not= x vararg) (not= (getmetatable x) list-mt) (not= (getmetatable x) symbol-mt) (not (comment? x)) x)) (fn multi-sym? [str] "A multi symbol is a symbol that is actually composed of two or more symbols using dot syntax. The main differences from normal symbols is that they can't be declared local, and they may have side effects on invocation (metatables)." (if (sym? str) (multi-sym? (tostring str)) (not= (type str) :string) false (let [parts []] (each [part (str:gmatch "[^%.%:]+[%.%:]?")] (let [last-char (part:sub (- 1))] (when (= last-char ":") (set parts.multi-sym-method-call true)) (if (or (= last-char ":") (= last-char ".")) (tset parts (+ (length parts) 1) (part:sub 1 (- 2))) (tset parts (+ (length parts) 1) part)))) (and (> (length parts) 0) (or (: str :match "%.") (: str :match ":")) (not (str:match "%.%.")) (not= (str:byte) (string.byte ".")) (not= (str:byte (- 1)) (string.byte ".")) parts)))) (fn quoted? [symbol] symbol.quoted) ;;; Other (fn walk-tree [root f custom-iterator] "Walks a tree (like the AST), invoking f(node, idx, parent) on each node. When f returns a truthy value, recursively walks the children." (fn walk [iterfn parent idx node] (when (f idx node parent) (each [k v (iterfn node)] (walk iterfn node k v)))) (walk (or custom-iterator pairs) nil nil root) root) (local lua-keywords [:and :break :do :else :elseif :end :false :for :function :if :in :local :nil :not :or :repeat :return :then :true :until :while :goto]) (each [i v (ipairs lua-keywords)] (tset lua-keywords v i)) (fn valid-lua-identifier? [str] (and (str:match "^[%a_][%w_]*$") (not (. lua-keywords str)))) (local propagated-options [:allowedGlobals :indent :correlate :useMetadata :env :compiler-env :compilerEnv]) (fn propagate-options [options subopts] "Certain options should always get propagated onwards when a function that has options calls down into compile." (each [_ name (ipairs propagated-options)] (tset subopts name (. options name))) subopts) (local root {:chunk nil :scope nil :options nil :reset (fn [])}) (fn root.set-reset [{: chunk : scope : options : reset}] (fn root.reset [] (set (root.chunk root.scope root.options root.reset) (values chunk scope options reset)))) (fn hook [event ...] (when (and root.options root.options.plugins) (each [_ plugin (ipairs root.options.plugins)] (match (. plugin event) f (f ...))))) {: allpairs : stablepairs : copy : kvmap : map : walk-tree : member? : list : sequence : sym : varg : deref : expr :comment comment* : comment? : expr? : list? : multi-sym? : sequence? : sym? : table? : varg? : quoted? : valid-lua-identifier? : lua-keywords : hook : propagate-options : root : debug-on? :path (table.concat [:./?.fnl :./?/init.fnl (getenv :FENNEL_PATH)] ";") :macro-path (table.concat [:./?.fnl :./?/init-macros.fnl :./?/init.fnl (getenv :FENNEL_MACRO_PATH)] ";")} ================================================ FILE: samples/Filebench WML/copyfiles.f ================================================ # # CDDL HEADER START # # The contents of this file are subject to the terms of the # Common Development and Distribution License (the "License"). # You may not use this file except in compliance with the License. # # You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE # or http://www.opensolaris.org/os/licensing. # See the License for the specific language governing permissions # and limitations under the License. # # When distributing Covered Code, include this CDDL HEADER in each # file and include the License file at usr/src/OPENSOLARIS.LICENSE. # If applicable, add the following below this CDDL HEADER, with the # fields enclosed by brackets "[]" replaced with your own identifying # information: Portions Copyright [yyyy] [name of copyright owner] # # CDDL HEADER END # # # Copyright 2009 Sun Microsystems, Inc. All rights reserved. # Use is subject to license terms. # set $dir=/tmp set $nfiles=1000 set $meandirwidth=20 set $meanfilesize=16k set $iosize=1m set $nthreads=1 set mode quit firstdone define fileset name=bigfileset,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth,prealloc=100,paralloc define fileset name=destfiles,path=$dir,size=$meanfilesize,entries=$nfiles,dirwidth=$meandirwidth define process name=filereader,instances=1 { thread name=filereaderthread,memsize=10m,instances=$nthreads { flowop openfile name=openfile1,filesetname=bigfileset,fd=1 flowop readwholefile name=readfile1,fd=1,iosize=$iosize flowop createfile name=createfile2,filesetname=destfiles,fd=2 flowop writewholefile name=writefile2,fd=2,srcfd=1,iosize=$iosize flowop closefile name=closefile1,fd=1 flowop closefile name=closefile2,fd=2 } } echo "Copyfiles Version 3.0 personality successfully loaded" ================================================ FILE: samples/Filterscript/colormatrix.fs ================================================ /* * Copyright (C) 2012 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include "ip.rsh" static rs_matrix4x4 Mat; void init() { rsMatrixLoadIdentity(&Mat); } void setMatrix(rs_matrix4x4 m) { Mat = m; } uchar4 __attribute__((kernel)) root(uchar4 in) { float4 f = convert_float4(in); f = rsMatrixMultiply(&Mat, f); f = clamp(f, 0.f, 255.f); return convert_uchar4(f); } ================================================ FILE: samples/Filterscript/fs_kernel.fs ================================================ #pragma version(1) #pragma rs java_package_name(foo) int __attribute__((kernel)) root(uint32_t ain) { return 0; } void __attribute__((kernel)) in_only(uint32_t ain) { } int __attribute__((kernel)) out_only() { return 0; } int __attribute__((kernel)) everything(uint32_t ain, uint32_t x, uint32_t y) { return 0; } ================================================ FILE: samples/FlatBuffers/Message.fbs ================================================ // Licensed to the Apache Software Foundation (ASF) under one // or more contributor license agreements. See the NOTICE file // distributed with this work for additional information // regarding copyright ownership. The ASF licenses this file // to you under the Apache License, Version 2.0 (the // "License"); you may not use this file except in compliance // with the License. You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, // software distributed under the License is distributed on an // "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY // KIND, either express or implied. See the License for the // specific language governing permissions and limitations // under the License. include "Schema.fbs"; include "SparseTensor.fbs"; include "Tensor.fbs"; namespace org.apache.arrow.flatbuf; /// ---------------------------------------------------------------------- /// Data structures for describing a table row batch (a collection of /// equal-length Arrow arrays) /// Metadata about a field at some level of a nested type tree (but not /// its children). /// /// For example, a List with values `[[1, 2, 3], null, [4], [5, 6], null]` /// would have {length: 5, null_count: 2} for its List node, and {length: 6, /// null_count: 0} for its Int16 node, as separate FieldNode structs struct FieldNode { /// The number of value slots in the Arrow array at this level of a nested /// tree length: long; /// The number of observed nulls. Fields with null_count == 0 may choose not /// to write their physical validity bitmap out as a materialized buffer, /// instead setting the length of the bitmap buffer to 0. null_count: long; } enum CompressionType: byte { // LZ4 frame format, for portability, as provided by lz4frame.h or wrappers // thereof. Not to be confused with "raw" (also called "block") format // provided by lz4.h LZ4_FRAME, // Zstandard ZSTD } /// Provided for forward compatibility in case we need to support different /// strategies for compressing the IPC message body (like whole-body /// compression rather than buffer-level) in the future enum BodyCompressionMethod: byte { /// Each constituent buffer is first compressed with the indicated /// compressor, and then written with the uncompressed length in the first 8 /// bytes as a 64-bit little-endian signed integer followed by the compressed /// buffer bytes (and then padding as required by the protocol). The /// uncompressed length may be set to -1 to indicate that the data that /// follows is not compressed, which can be useful for cases where /// compression does not yield appreciable savings. /// Also, empty buffers can optionally be written out as 0-byte compressed /// buffers, thereby omitting the 8-bytes length header. BUFFER } /// Optional compression for the memory buffers constituting IPC message /// bodies. Intended for use with RecordBatch but could be used for other /// message types table BodyCompression { /// Compressor library. /// For LZ4_FRAME, each compressed buffer must consist of a single frame. codec: CompressionType = LZ4_FRAME; /// Indicates the way the record batch body was compressed method: BodyCompressionMethod = BUFFER; } /// A data header describing the shared memory layout of a "record" or "row" /// batch. Some systems call this a "row batch" internally and others a "record /// batch". table RecordBatch { /// number of records / rows. The arrays in the batch should all have this /// length length: long; /// Nodes correspond to the pre-ordered flattened logical schema nodes: [FieldNode]; /// Buffers correspond to the pre-ordered flattened buffer tree /// /// The number of buffers appended to this list depends on the schema. For /// example, most primitive arrays will have 2 buffers, 1 for the validity /// bitmap and 1 for the values. For struct arrays, there will only be a /// single buffer for the validity (nulls) bitmap buffers: [Buffer]; /// Optional compression of the message body compression: BodyCompression; /// Some types such as Utf8View are represented using a variable number of buffers. /// For each such Field in the pre-ordered flattened logical schema, there will be /// an entry in variadicBufferCounts to indicate the number of variadic /// buffers which belong to that Field in the current RecordBatch. /// /// For example, the schema /// col1: Struct /// col2: Utf8View /// contains two Fields with variadic buffers so variadicBufferCounts will have /// two entries, the first counting the variadic buffers of `col1.beta` and the /// second counting `col2`'s. /// /// This field may be omitted if and only if the schema contains no Fields with /// a variable number of buffers, such as BinaryView and Utf8View. variadicBufferCounts: [long]; } /// For sending dictionary encoding information. Any Field can be /// dictionary-encoded, but in this case none of its children may be /// dictionary-encoded. /// There is one vector / column per dictionary, but that vector / column /// may be spread across multiple dictionary batches by using the isDelta /// flag table DictionaryBatch { id: long; data: RecordBatch; /// If isDelta is true the values in the dictionary are to be appended to a /// dictionary with the indicated id. If isDelta is false this dictionary /// should replace the existing dictionary. isDelta: bool = false; } /// ---------------------------------------------------------------------- /// The root Message type /// This union enables us to easily send different message types without /// redundant storage, and in the future we can easily add new message types. /// /// Arrow implementations do not need to implement all of the message types, /// which may include experimental metadata types. For maximum compatibility, /// it is best to send data using RecordBatch union MessageHeader { Schema, DictionaryBatch, RecordBatch, Tensor, SparseTensor } table Message { version: org.apache.arrow.flatbuf.MetadataVersion; header: MessageHeader; bodyLength: long; custom_metadata: [ KeyValue ]; } root_type Message; ================================================ FILE: samples/FlatBuffers/reflection.fbs ================================================ // This schema defines objects that represent a parsed schema, like // the binary version of a .fbs file. // This could be used to operate on unknown FlatBuffers at runtime. // It can even ... represent itself (!) namespace reflection; // These must correspond to the enum in idl.h. enum BaseType : byte { None, UType, Bool, Byte, UByte, Short, UShort, Int, UInt, Long, ULong, Float, Double, String, Vector, Obj, // Used for tables & structs. Union, Array, Vector64, // Add any new type above this value. MaxBaseType } table Type { base_type:BaseType; element:BaseType = None; // Only if base_type == Vector // or base_type == Array. index:int = -1; // If base_type == Object, index into "objects" below. // If base_type == Union, UnionType, or integral derived // from an enum, index into "enums" below. // If base_type == Vector && element == Union or UnionType. fixed_length:uint16 = 0; // Only if base_type == Array. /// The size (octets) of the `base_type` field. base_size:uint = 4; // 4 Is a common size due to offsets being that size. /// The size (octets) of the `element` field, if present. element_size:uint = 0; } table KeyValue { key:string (required, key); value:string; } table EnumVal { name:string (required); value:long (key); object:Object (deprecated); union_type:Type; documentation:[string]; attributes:[KeyValue]; } table Enum { name:string (required, key); values:[EnumVal] (required); // In order of their values. is_union:bool = false; underlying_type:Type (required); attributes:[KeyValue]; documentation:[string]; /// File that this Enum is declared in. declaration_file: string; } table Field { name:string (required, key); type:Type (required); id:ushort; offset:ushort; // Offset into the vtable for tables, or into the struct. default_integer:long = 0; default_real:double = 0.0; deprecated:bool = false; required:bool = false; key:bool = false; attributes:[KeyValue]; documentation:[string]; optional:bool = false; /// Number of padding octets to always add after this field. Structs only. padding:uint16 = 0; /// If the field uses 64-bit offsets. offset64:bool = false; } table Object { // Used for both tables and structs. name:string (required, key); fields:[Field] (required); // Sorted. is_struct:bool = false; minalign:int; bytesize:int; // For structs. attributes:[KeyValue]; documentation:[string]; /// File that this Object is declared in. declaration_file: string; } table RPCCall { name:string (required, key); request:Object (required); // must be a table (not a struct) response:Object (required); // must be a table (not a struct) attributes:[KeyValue]; documentation:[string]; } table Service { name:string (required, key); calls:[RPCCall]; attributes:[KeyValue]; documentation:[string]; /// File that this Service is declared in. declaration_file: string; } /// New schema language features that are not supported by old code generators. enum AdvancedFeatures : ulong (bit_flags) { AdvancedArrayFeatures, AdvancedUnionFeatures, OptionalScalars, DefaultVectorsAndStrings, } /// File specific information. /// Symbols declared within a file may be recovered by iterating over all /// symbols and examining the `declaration_file` field. table SchemaFile { /// Filename, relative to project root. filename:string (required, key); /// Names of included files, relative to project root. included_filenames:[string]; } table Schema { objects:[Object] (required); // Sorted. enums:[Enum] (required); // Sorted. file_ident:string; file_ext:string; root_table:Object; services:[Service]; // Sorted. advanced_features:AdvancedFeatures; /// All the files used in this compilation. Files are relative to where /// flatc was invoked. fbs_files:[SchemaFile]; // Sorted. } root_type Schema; file_identifier "BFBS"; file_extension "bfbs"; ================================================ FILE: samples/Flix/GameState.flix ================================================ /* * Copyright 2024 Matthew Lutze * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ mod Flixball.Core.GameState { use Flixball.Core.AiState use Flixball.Core.Coordinates use Flixball.Core.Move use Flixball.Core.MoveLogic use Flixball.Core.PlayerId use Flixball.Core.Position use Flixball.Core.Position.Position use Flixball.Core.rotateDir use Flixball.Core.Rotation use Flixball.Core.Strategy use Flixball.Core.Tile.Person use Flixball.Core.Board.{adjust => boardAdjust} use Flixball.Core.Board.Board use Flixball.Core.Board.get_ use Flixball.Core.Board.set_ use Flixball.Core.Position.{coordinates => posCoords} use Flixball.Core.Position.{direction => posDir} use GameState.GameState type alias PlayerInfo = { state = AiState, ml = MoveLogic, pos = Position } pub enum GameState( Map[PlayerId, PlayerInfo], Board ) //law gamestatea = /// Returns the board of the state. pub def board(s: GameState): Board = { let GameState(_, b) = s; b } /// /// Gets the position of the given player. /// pub def playerPosition(id: PlayerId, s: GameState): Option[Position] = { let GameState(players, _) = s; players |> Map.get(id) |> Option.map(info -> info#pos) } /// Position updates are naively done without care for collisions or inconsistensies. pub def map(f: PlayerInfo -> PlayerInfo, s: GameState): GameState = mapWithId((_, info) -> f(info), s) /// Position updates are naively done without care for collisions or inconsistensies. pub def mapWithId(f: (PlayerId, PlayerInfo) -> PlayerInfo, s: GameState): GameState = region r { let GameState(players0, board0) = s; let board = Ref.fresh(r, board0); let players = players0 |> Map.mapWithKey((id, info0) -> { let info = f(id, info0); if (info#pos != info0#pos) { // remove previous Ref.put(set_(posCoords(info0#pos), None, Ref.get(board)), board); // insert new Ref.put(set_(posCoords(info#pos), Some(Person(id, posDir(info#pos))), Ref.get(board)), board) } else (); info }); GameState(players, Ref.get(board)) } /// Adjusts the playerinfo of player `id`. Position updates are not verified. pub def adjust(id: PlayerId, f: PlayerInfo -> PlayerInfo, s: GameState): GameState = region r { let GameState(players0, board0) = s; let board = Ref.fresh(r, board0); let players = players0 |> Map.adjust(info0 -> { let info = f(info0); if (info#pos != info0#pos) { Ref.put(set_(posCoords(info0#pos), None, Ref.get(board)), board); Ref.put(set_(posCoords(info#pos), Some(Person(id, posDir(info#pos))), Ref.get(board)), board) } else (); info }, id); GameState(players, Ref.get(board)) } /// Computes the logics of all players, returning their map of moves. pub def computeMoveLogics(s: GameState): (Map[PlayerId, Move], GameState) = { let GameState(players0, b0) = s; let (moves, players) = players0 |> Map.mapWithKey((_, info) -> { let (move, state) = (info#ml)(Flixball.Core.AiInfo.fromBoard(b0), info#state); (move, {state = state | info}) }) |> Utils.Map.unzip; (moves, GameState(players, b0)) } /// Removes a player from the game. /// Does nothing if the player does not exist in the game. pub def removePlayer(id: PlayerId, state0: GameState): GameState = { match (playerPosition(id, state0)) { // Case 1: No such player. Do nothing. case None => state0 // Case 2: Found the player. Remove from the map, the board, and the states. case Some(Position(coords, _)) => { let GameState(players0, board0) = state0; let board = board0 |> set_(coords, None); let players = players0 |> Map.remove(id); GameState(players, board) } } } /// Rotates a player with the given rotation. /// Does nothing if the player does not exist in the game. pub def rotatePlayer(id: PlayerId, rot: Rotation, gs: GameState): GameState = gs |> adjust(id, info -> { let pos = Position(posCoords(info#pos), posDir(info#pos) |> rotateDir(rot)); {pos = pos | info} }) /// Moves a player to a new position. /// Does not change the direction of the player. pub def movePlayer(id: PlayerId, coords: Coordinates, gs: GameState): GameState = gs |> adjust(id, info -> { let pos = Position(coords, posDir(info#pos)); {pos = pos | info} }) /// /// Create a gamestate based on a seed (for ais), strategies and a board. /// Precondition: The domain of `strategies` must be `[0,n]` where `n` is /// the number of players on the board. /// pub def mkGameState(seed: Int64, strategies: Map[PlayerId, Strategy], b: Board): GameState = { let playerMap = Flixball.Core.Board.players(b); let ais = strategies |> Map.mapWithKey((id, strat) -> { let (stateGen, ml) = strat(id); // unsafe get is safe per precondition. let pos = Map.get(id, playerMap) |> Utils.Option.unsafeGet; {state = stateGen(seed), ml = ml, pos = pos} }); GameState(ais, b) } } ================================================ FILE: samples/Flix/Parse.flix ================================================ /* * Copyright 2024 Matthew Lutze * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ mod Json.Parse { use Json.JsonElement.{JsonObject, JsonArray, JsonString, JsonNumber, JsonBool, JsonNull} use Json.JsonElement; use Option.flatMap; // Each main rule must start with a key character and consume trailing whitespace type alias ParseMonad[t] = Option[(t, List[Char])] /// /// Parses the given string into a JSON element. /// If the string does not represent a JSON element, None is returned. /// pub def parse(obj: String): Option[JsonElement] = { let in = String.toList(obj); forM ( (_, tail) <- whitespace(in); (o, tail1) <- value(tail); _ <- eoi(tail1) ) yield { o } } def eoi(in: List[Char]): ParseMonad[Unit] = match in { case Nil => Some((), Nil) case _ :: _ => None } def whitespace(in: List[Char]): ParseMonad[Unit] = match in { case ' ' :: tail => whitespace(tail) case '\t' :: tail => whitespace(tail) case '\r' :: tail => whitespace(tail) case '\n' :: tail => whitespace(tail) case _ => Some((), in) } def object_(in: List[Char]): ParseMonad[JsonElement] = { forM ( (_, tail) <- require('{', in); (_, tail1) <- whitespace(tail); (keyVals, tail2) <- keyVals(tail1); (_, tail3) <- require('}', tail2); (_, tail4) <- whitespace(tail3) ) yield { let map = List.toMap(keyVals); (JsonObject(map), tail4) } } def keyVals(in: List[Char]): ParseMonad[List[(String, JsonElement)]] = match in { // Case 1: starting a keyval pair case '\"' :: _ => forM ( (key, tail) <- string(in); (_, tail1) <- whitespace(tail); (_, tail2) <- require(':', tail1); (_, tail3) <- whitespace(tail2); (val, tail4) <- value(tail3); (_, tail5) <- whitespace(tail4); res <- match tail5 { case ',' :: tail6 => forM ( (_, tail7) <- whitespace(tail6); (tailKeyVals, tail8) <- keyVals(tail7) ) yield { let list = (key, val) :: tailKeyVals; (list, tail8) } case '}' :: _ => let list = (key, val) :: Nil; Some(list, tail5) case _ => None } ) yield { res } // Case 2: end of list case '}' :: _ => Some(Nil, in) // Case 3: anything else is an error case _ => None } def array(in: List[Char]): ParseMonad[JsonElement] = { forM ( (_, tail) <- require('[', in); (_, tail1) <- whitespace(tail); (elems, tail2) <- elements(tail1); (_, tail3) <- require(']', tail2) ) yield { (JsonArray(elems), tail3) } } def elements(in: List[Char]): ParseMonad[List[JsonElement]] = match in { case ']' :: _ => Some(Nil, in) case _ => region rc { let lst = MutList.empty(rc); def walk(input) = { let opt = forM( (val, tail) <- value(input); (_, tail1) <- whitespace(tail) ) yield (val, tail1); match opt { case None => None case Some(val, tail1) => MutList.push!(val, lst); match tail1 { case ']' :: _ => Some(tail1) case ',' :: tail2 => match whitespace(tail2) { case None => None case Some(_, tail3) => walk(tail3) } case _ => None } } }; forM(tl <- walk(in)) yield (MutList.toList(lst), tl) } } def value(in: List[Char]): ParseMonad[JsonElement] = match in { case '{' :: _ => object_(in) case '[' :: _ => array(in) case '\"' :: _ => stringValue(in) case 't' :: 'r' :: 'u' :: 'e' :: tail => Some(JsonBool(true), tail) case 'f' :: 'a' :: 'l' :: 's' :: 'e' :: tail => Some(JsonBool(false), tail) case 'n' :: 'u' :: 'l' :: 'l' :: tail => Some(JsonNull, tail) case _ => number(in) } def require(char: Char, in: List[Char]): ParseMonad[Unit] = match in { case head :: tail if char == head => Some((), tail) case _ => None } def stringValue(in: List[Char]): ParseMonad[JsonElement] = { forM ( (str, tail) <- string(in) ) yield { (JsonString(str), tail) } } def string(in: List[Char]): ParseMonad[String] = { forM ( (_, tail) <- require('\"', in); (contents, tail2) <- stringContents(tail); (_, tail3) <- require('\"', tail2) ) yield { let str = listToString(contents); (str, tail3) } } def listToString(list: List[Char]): String = region r { let sb = StringBuilder.empty(r); list |> List.forEach(c -> StringBuilder.append!(c, sb)); StringBuilder.toString(sb) } def stringContents(in: List[Char]): ParseMonad[List[Char]] = stringContentsHelper(Nil, in) def stringContentsHelper(acc: List[Char], in: List[Char]): ParseMonad[List[Char]] = match in { case '\"' :: _ => Some(List.reverse(acc), in) case '\\' :: '\"' :: tail => stringContentsHelper('\"' :: acc, tail) case '\\' :: '\\' :: tail => stringContentsHelper('\\' :: acc, tail) case '\\' :: '/' :: tail => stringContentsHelper('/' :: acc, tail) case '\\' :: 'b' :: tail => stringContentsHelper('\u0008' :: acc, tail) case '\\' :: 'f' :: tail => stringContentsHelper('\u000C' :: acc, tail) case '\\' :: 'n' :: tail => stringContentsHelper('\n' :: acc, tail) case '\\' :: 'r' :: tail => stringContentsHelper('\r' :: acc, tail) case '\\' :: 't' :: tail => stringContentsHelper('\t' :: acc, tail) case '\\' :: 'u' :: c1 :: c2 :: c3 :: c4 :: tail => let charRes = forM ( string <- listToString(c1 :: c2 :: c3 :: c4 :: Nil) |> Some; intVal <- hexToInt(string) ) yield { import static java.lang.Character.toChars(Int32): Array[Char, Static] \ IO; unchecked_cast(toChars(intVal) |> Array.get(0) as _ \ {}) }; match charRes { case None => None case Some(char) => stringContentsHelper(char :: acc, tail) } // illegal escape case '\\' :: _ => None case c :: tail => stringContentsHelper(c :: acc, tail) // unexpected EOI case Nil => None } def hexToInt(hex: String): Option[Int32] = { import static java.lang.Integer.parseInt(String, Int32): Int32 \ IO; unchecked_cast(try { Some(parseInt(hex, 16)) } catch { case _: ##java.lang.NumberFormatException => None } as _ \ {}) } def number(in: List[Char]): ParseMonad[JsonElement] = match in { case c :: tail if isNumberChar(c) => forM ( (chars, tail1) <- numberTail(tail); string <- listToString(c :: chars) |> Some; bigDec <- BigDecimal.fromString(string) ) yield { let number = JsonNumber(bigDec); (number, tail1) } case _ => None } def isNumberChar(c: Char): Bool = Char.isDigit(c) or c == '+' or c == '-' or c == 'e' or c == 'E' or c == '.' def numberTail(in: List[Char]): ParseMonad[List[Char]] = match in { case c :: tail if isNumberChar(c) => forM ( (chars, tail1) <- numberTail(tail) ) yield { (c :: chars, tail1) } case _ => Some(Nil, in) } } ================================================ FILE: samples/Flix/TestDisplay.flix ================================================ /* * Copyright 2024 Matthew Lutze * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ mod TestDisplay { use Flixball.Core.{Strategy, PlayerId}; use Flixball.Core.Board.Board.Board; use Flixball.Core.Board.Board; use Flixball.Core.Direction.{East, North, South, West}; use Flixball.Core.Rotation.{Clockwise, Counterclockwise}; use Flixball.Core.Tile.{Person, Wall}; use Flixball.BoardLibrary.{automataBoard, randomBoard}; use Flixball.Core.GameState.mkGameState; use Flixball.AiLibrary.{ rotate, shoot, walk, spinAndShoot, goAndSpin, naiveSearchAndDestroy, wander, smartSearchAndDestroy }; use Flixball.Display.{runGameState, displayBoard} def testBoard01(): (Board, Map[PlayerId, Strategy]) = let board = match Flixball.BoardLibrary.fromString(String.unlines( " " :: " " :: " v " :: " < " :: Nil )) { case Ok(b) => b case Err(msg) => bug!(msg) }; let moveLogics = Map#{ 0 => walk(), 1 => shoot() }; (board, moveLogics) def testBoard02(): (Board, Map[PlayerId, Strategy]) = let board = match Flixball.BoardLibrary.fromString(String.unlines( " " :: " > ^^^^^^^# < " :: " " :: Nil )) { case Ok(b) => b case Err(msg) => bug!(msg) }; let moveLogics = Map#{ 0 => shoot(), 1 => rotate(Clockwise), 2 => rotate(Counterclockwise), 3 => rotate(Clockwise), 4 => rotate(Counterclockwise), 5 => rotate(Clockwise), 6 => rotate(Counterclockwise), 7 => rotate(Clockwise), 8 => spinAndShoot(Clockwise) }; (board, moveLogics) def testBoard03(): (Board, Map[PlayerId, Strategy]) = let board = match Flixball.BoardLibrary.fromString(String.unlines( "^ # " :: " # " :: " # " :: " # # " :: " # " :: "########< " :: " " :: " ##" :: " " :: " " :: Nil )) { case Ok(b) => b case Err(msg) => bug!(msg) }; let moveLogics = Map#{ 0 => goAndSpin((10, 10)), 1 => walk()}; (board, moveLogics) def testBoard04(): Board = randomBoard(719_657i64, rows=15, 10, 0.3) def testBoard05(): Board = automataBoard(285_041_125i64, rows=25, 40, 0.38, 3) def testBoard06(): (Board, Map[PlayerId, Strategy]) = let board = match Flixball.BoardLibrary.fromString(String.unlines( "^ " :: " v " :: " < " :: " > " :: " < " :: " v " :: " ^ " :: " < " :: " v " :: " >" :: Nil )) { case Ok(b) => b case Err(msg) => bug!(msg) }; let moveLogics = Map#{ 0 => naiveSearchAndDestroy(), 1 => wander(), 2 => wander(), 3 => wander(), 4 => wander(), 5 => wander(), 6 => wander(), 7 => wander(), 8 => wander(), 9 => wander() }; (board, moveLogics) def testBoard07(): (Board, Map[PlayerId, Strategy]) = let board = match Flixball.BoardLibrary.fromString(String.unlines( "^ # <" :: " # ###" :: "# # # " :: "v > " :: " #### ##" :: " ^ " :: "### # # " :: " <### ##" :: " > " :: " ## " :: Nil )) { case Ok(b) => b case Err(msg) => bug!(msg) }; let moveLogics = Map#{ 0 => smartSearchAndDestroy(), 1 => wander(), 2 => wander(), 3 => wander(), 4 => wander(), 5 => wander(), 6 => wander() }; (board, moveLogics) // Test Scenarios pub def testDisplayBoard01(): Unit \ IO = displayBoard(fst(testBoard01())) pub def testRunBoard01(): Unit \ IO = // OBS letbinding is avoided because of bug // https://github.com/flix/flix/issues/4440 testBoard01() |> match (board, strategies) -> runGameState(500i64, mkGameState(42i64, strategies, board)) pub def testDisplayBoard02(): Unit \ IO = displayBoard(fst(testBoard02())) pub def testRunBoard02(): Unit \ IO = testBoard02() |> match (board, strategies) -> runGameState(500i64, mkGameState(42i64, strategies, board)) pub def testDisplayBoard03(): Unit \ IO = displayBoard(fst(testBoard03())) pub def testRunBoard03(): Unit \ IO = testBoard03() |> match (board, strategies) -> runGameState(500i64, mkGameState(42i64, strategies, board)) pub def testDisplayBoard04(): Unit \ IO = displayBoard(testBoard04()) pub def testDisplayBoard05(): Unit \ IO = displayBoard(testBoard05()) pub def testRunBoard06(): Unit \ IO = testBoard06() |> match (board, strategies) -> runGameState(500i64, mkGameState(42i64, strategies, board)) pub def testRunBoard07(): Unit \ IO = testBoard07() |> match (board, strategies) -> runGameState(500i64, mkGameState(42i64, strategies, board)) } ================================================ FILE: samples/Fluent/call_expressions.ftl ================================================ ## Function names valid-func-name-01 = {FUN1()} valid-func-name-02 = {FUN_FUN()} valid-func-name-03 = {FUN-FUN()} # JUNK 0 is not a valid Identifier start invalid-func-name-01 = {0FUN()} # JUNK Function names may not be lowercase invalid-func-name-02 = {fun()} # JUNK Function names may not contain lowercase character invalid-func-name-03 = {Fun()} # JUNK ? is not a valid Identifier character invalid-func-name-04 = {FUN?()} ## Arguments positional-args = {FUN(1, "a", msg)} named-args = {FUN(x: 1, y: "Y")} dense-named-args = {FUN(x:1, y:"Y")} mixed-args = {FUN(1, "a", msg, x: 1, y: "Y")} # ERROR Positional arg must not follow keyword args shuffled-args = {FUN(1, x: 1, "a", y: "Y", msg)} # ERROR Named arguments must be unique duplicate-named-args = {FUN(x: 1, x: "X")} ## Whitespace around arguments sparse-inline-call = {FUN ( "a" , msg, x: 1 )} empty-inline-call = {FUN( )} multiline-call = {FUN( "a", msg, x: 1 )} sparse-multiline-call = {FUN ( "a" , msg , x: 1 )} empty-multiline-call = {FUN( )} unindented-arg-number = {FUN( 1)} unindented-arg-string = {FUN( "a")} unindented-arg-msg-ref = {FUN( msg)} unindented-arg-term-ref = {FUN( -msg)} unindented-arg-var-ref = {FUN( $var)} unindented-arg-call = {FUN( OTHER())} unindented-named-arg = {FUN( x:1)} unindented-closing-paren = {FUN( x )} ## Optional trailing comma one-argument = {FUN(1,)} many-arguments = {FUN(1, 2, 3,)} inline-sparse-args = {FUN( 1, 2, 3, )} mulitline-args = {FUN( 1, 2, )} mulitline-sparse-args = {FUN( 1 , 2 , )} ## Syntax errors for trailing comma one-argument = {FUN(1,,)} missing-arg = {FUN(,)} missing-sparse-arg = {FUN( , )} ## Whitespace in named arguments sparse-named-arg = {FUN( x : 1, y : 2, z : 3 )} unindented-colon = {FUN( x :1)} unindented-value = {FUN( x: 1)} ================================================ FILE: samples/Fluent/callee_expressions.ftl ================================================ ## Callees in placeables. function-callee-placeable = {FUNCTION()} term-callee-placeable = {-term()} # ERROR Messages cannot be parameterized. message-callee-placeable = {message()} # ERROR Equivalent to a MessageReference callee. mixed-case-callee-placeable = {Function()} # ERROR Message attributes cannot be parameterized. message-attr-callee-placeable = {message.attr()} # ERROR Term attributes may not be used in Placeables. term-attr-callee-placeable = {-term.attr()} # ERROR Variables cannot be parameterized. variable-callee-placeable = {$variable()} ## Callees in selectors. function-callee-selector = {FUNCTION() -> *[key] Value } term-attr-callee-selector = {-term.attr() -> *[key] Value } # ERROR Messages cannot be parameterized. message-callee-selector = {message() -> *[key] Value } # ERROR Equivalent to a MessageReference callee. mixed-case-callee-selector = {Function() -> *[key] Value } # ERROR Message attributes cannot be parameterized. message-attr-callee-selector = {message.attr() -> *[key] Value } # ERROR Term values may not be used as selectors. term-callee-selector = {-term() -> *[key] Value } # ERROR Variables cannot be parameterized. variable-callee-selector = {$variable() -> *[key] Value } ================================================ FILE: samples/Fluent/gecko_strings.ftl ================================================ # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. ## Firefox Brand ## ## Firefox must be treated as a brand, and kept in English. ## It cannot be: ## - Declined to adapt to grammatical case. ## - Transliterated. ## - Translated. ## ## Reference: https://www.mozilla.org/styleguide/communications/translation/ -brand-short-name = Firefox -vendor-short-name = Mozilla # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -sync-brand-short-name = Sync # “Sync” can be localized, “Firefox” must be treated as a brand, # and kept in English. -sync-brand-name = Firefox Sync # “Account” can be localized, “Firefox” must be treated as a brand, # and kept in English. -fxaccount-brand-name = Firefox Account # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. app-manager-window = .title = Application details .style = width: 30em; min-height: 20em; app-manager-remove = .label = Remove .accesskey = R app-manager-handle-webfeeds = The following applications can be used to handle Web Feeds. # Variables: # $type (String) - the URI scheme of the link (e.g. mailto:) app-manager-handle-protocol = The following applications can be used to handle { $type } links. # Variables: # $type (String) - the MIME type (e.g. application/binary) app-manager-handle-file = The following applications can be used to handle { $type } content. ## These strings are followed, on a new line, ## by the URL or path of the application. app-manager-web-app-info = This web application is hosted at: app-manager-local-app-info = This application is located at: # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. blocklist-window = .title = Block Lists .style = width: 55em blocklist-desc = You can choose which list { -brand-short-name } will use to block Web elements that may track your browsing activity. blocklist-close-key = .key = w blocklist-treehead-list = .label = List blocklist-button-cancel = .label = Cancel .accesskey = C blocklist-button-ok = .label = Save Changes .accesskey = S # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. clear-site-data-window = .title = Clear Data .style = width: 35em clear-site-data-description = Clearing all cookies and site data stored by { -brand-short-name } may sign you out of websites and remove offline web content. Clearing cache data will not affect your logins. clear-site-data-close-key = .key = w # The parameters in parentheses in this string describe disk usage # in the format ($amount $unit), e.g. "Cookies and Site Data (24 KB)" # Variables: # $amount (Number) - Amount of site data currently stored on disk # $unit (String) - Abbreviation of the unit that $amount is in, e.g. "MB" clear-site-data-cookies-with-data = .label = Cookies and Site Data ({ $amount } { $unit }) .accesskey = S # This string is a placeholder for while the data used to fill # clear-site-data-cookies-with-data is loading. This placeholder is usually # only shown for a very short time (< 1s), so it should be very similar # or the same as clear-site-data-cookies-with-data (except the amount and unit), # to avoid flickering. clear-site-data-cookies-empty = .label = Cookies and Site Data .accesskey = S clear-site-data-cookies-info = You may get signed out of websites if cleared # The parameters in parentheses in this string describe disk usage # in the format ($amount $unit), e.g. "Cached Web Content (24 KB)" # Variables: # $amount (Number) - Amount of cache currently stored on disk # $unit (String) - Abbreviation of the unit that $amount is in, e.g. "MB" clear-site-data-cache-with-data = .label = Cached Web Content ({ $amount } { $unit }) .accesskey = W # This string is a placeholder for while the data used to fill # clear-site-data-cache-with-data is loading. This placeholder is usually # only shown for a very short time (< 1s), so it should be very similar # or the same as clear-site-data-cache-with-data (except the amount and unit), # to avoid flickering. clear-site-data-cache-empty = .label = Cached Web Content .accesskey = W clear-site-data-cache-info = Will require websites to reload images and data clear-site-data-cancel = .label = Cancel .accesskey = C clear-site-data-clear = .label = Clear .accesskey = l # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. colors-window = .title = Colors .style = { PLATFORM() -> [macos] width: 41em *[other] width: 38em } colors-close-key = .key = w colors-page-override = Override the colors specified by the page with your selections above .accesskey = O colors-page-override-option-always = .label = Always colors-page-override-option-auto = .label = Only with High Contrast themes colors-page-override-option-never = .label = Never colors-text-and-background = Text and Background colors-text-header = Text .accesskey = T colors-background = Background .accesskey = B colors-use-system = .label = Use system colors .accesskey = s colors-underline-links = .label = Underline links .accesskey = U colors-links-header = Link Colors colors-unvisited-links = Unvisited Links .accesskey = L colors-visited-links = Visited Links .accesskey = V # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. connection-window = .title = Connection Settings .style = { PLATFORM() -> [macos] width: 44em *[other] width: 49em } connection-close-key = .key = w connection-disable-extension = .label = Disable Extension connection-proxy-configure = Configure Proxy Access to the Internet connection-proxy-option-no = .label = No proxy .accesskey = y connection-proxy-option-system = .label = Use system proxy settings .accesskey = U connection-proxy-option-auto = .label = Auto-detect proxy settings for this network .accesskey = w connection-proxy-option-manual = .label = Manual proxy configuration .accesskey = M connection-proxy-http = HTTP Proxy .accesskey = x connection-proxy-http-port = Port .accesskey = P connection-proxy-http-share = .label = Use this proxy server for all protocols .accesskey = s connection-proxy-ssl = SSL Proxy .accesskey = L connection-proxy-ssl-port = Port .accesskey = o connection-proxy-ftp = FTP Proxy .accesskey = F connection-proxy-ftp-port = Port .accesskey = r connection-proxy-socks = SOCKS Host .accesskey = C connection-proxy-socks-port = Port .accesskey = t connection-proxy-socks4 = .label = SOCKS v4 .accesskey = K connection-proxy-socks5 = .label = SOCKS v5 .accesskey = v connection-proxy-noproxy = No Proxy for .accesskey = N connection-proxy-noproxy-desc = Example: .mozilla.org, .net.nz, 192.168.1.0/24 connection-proxy-autotype = .label = Automatic proxy configuration URL .accesskey = A connection-proxy-reload = .label = Reload .accesskey = e connection-proxy-autologin = .label = Do not prompt for authentication if password is saved .accesskey = i .tooltip = This option silently authenticates you to proxies when you have saved credentials for them. You will be prompted if authentication fails. connection-proxy-socks-remote-dns = .label = Proxy DNS when using SOCKS v5 .accesskey = D # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. containers-window-new = .title = Add New Container .style = width: 45em # Variables # $name (String) - Name of the container containers-window-update = .title = { $name } Container Preferences .style = width: 45em containers-window-close = .key = w # This is a term to store style to be applied # on the three labels in the containers add/edit dialog: # - name # - icon # - color # # Using this term and referencing it in the `.style` attribute # of the three messages ensures that all three labels # will be aligned correctly. -containers-labels-style = min-width: 4rem containers-name-label = Name .accesskey = N .style = { -containers-labels-style } containers-name-text = .placeholder = Enter a container name containers-icon-label = Icon .accesskey = I .style = { -containers-labels-style } containers-color-label = Color .accesskey = o .style = { -containers-labels-style } containers-button-done = .label = Done .accesskey = D containers-color-blue = .label = Blue containers-color-turquoise = .label = Turquoise containers-color-green = .label = Green containers-color-yellow = .label = Yellow containers-color-orange = .label = Orange containers-color-red = .label = Red containers-color-pink = .label = Pink containers-color-purple = .label = Purple containers-icon-fingerprint = .label = Fingerprint containers-icon-briefcase = .label = Briefcase # String represents a money sign but currently uses a dollar sign # so don't change to local currency. See Bug 1291672. containers-icon-dollar = .label = Dollar sign containers-icon-cart = .label = Shopping cart containers-icon-circle = .label = Dot containers-icon-vacation = .label = Vacation containers-icon-gift = .label = Gift containers-icon-food = .label = Food containers-icon-fruit = .label = Fruit containers-icon-pet = .label = Pet containers-icon-tree = .label = Tree containers-icon-chill = .label = Chill # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. fonts-window = .title = Fonts fonts-window-close = .key = w ## Font groups by language fonts-langgroup-header = Fonts for .accesskey = F fonts-langgroup-arabic = .label = Arabic fonts-langgroup-armenian = .label = Armenian fonts-langgroup-bengali = .label = Bengali fonts-langgroup-simpl-chinese = .label = Simplified Chinese fonts-langgroup-trad-chinese-hk = .label = Traditional Chinese (Hong Kong) fonts-langgroup-trad-chinese = .label = Traditional Chinese (Taiwan) fonts-langgroup-cyrillic = .label = Cyrillic fonts-langgroup-devanagari = .label = Devanagari fonts-langgroup-ethiopic = .label = Ethiopic fonts-langgroup-georgian = .label = Georgian fonts-langgroup-el = .label = Greek fonts-langgroup-gujarati = .label = Gujarati fonts-langgroup-gurmukhi = .label = Gurmukhi fonts-langgroup-japanese = .label = Japanese fonts-langgroup-hebrew = .label = Hebrew fonts-langgroup-kannada = .label = Kannada fonts-langgroup-khmer = .label = Khmer fonts-langgroup-korean = .label = Korean # Translate "Latin" as the name of Latin (Roman) script, not as the name of the Latin language. fonts-langgroup-latin = .label = Latin fonts-langgroup-malayalam = .label = Malayalam fonts-langgroup-math = .label = Mathematics fonts-langgroup-odia = .label = Odia fonts-langgroup-sinhala = .label = Sinhala fonts-langgroup-tamil = .label = Tamil fonts-langgroup-telugu = .label = Telugu fonts-langgroup-thai = .label = Thai fonts-langgroup-tibetan = .label = Tibetan fonts-langgroup-canadian = .label = Unified Canadian Syllabary fonts-langgroup-other = .label = Other Writing Systems ## Default fonts and their sizes fonts-proportional-header = Proportional .accesskey = P fonts-default-serif = .label = Serif fonts-default-sans-serif = .label = Sans Serif fonts-proportional-size = Size .accesskey = z fonts-serif = Serif .accesskey = S fonts-sans-serif = Sans-serif .accesskey = n fonts-monospace = Monospace .accesskey = M fonts-monospace-size = Size .accesskey = e fonts-minsize = Minimum font size .accesskey = o fonts-minsize-none = .label = None fonts-allow-own = .label = Allow pages to choose their own fonts, instead of your selections above .accesskey = A ## Text Encodings ## ## Translate the encoding names as adjectives for an encoding, not as the name ## of the language. fonts-languages-fallback-header = Text Encoding for Legacy Content fonts-languages-fallback-desc = This text encoding is used for legacy content that fails to declare its encoding. fonts-languages-fallback-label = Fallback Text Encoding .accesskey = T fonts-languages-fallback-name-auto = .label = Default for Current Locale fonts-languages-fallback-name-arabic = .label = Arabic fonts-languages-fallback-name-baltic = .label = Baltic fonts-languages-fallback-name-ceiso = .label = Central European, ISO fonts-languages-fallback-name-cewindows = .label = Central European, Microsoft fonts-languages-fallback-name-simplified = .label = Chinese, Simplified fonts-languages-fallback-name-traditional = .label = Chinese, Traditional fonts-languages-fallback-name-cyrillic = .label = Cyrillic fonts-languages-fallback-name-greek = .label = Greek fonts-languages-fallback-name-hebrew = .label = Hebrew fonts-languages-fallback-name-japanese = .label = Japanese fonts-languages-fallback-name-korean = .label = Korean fonts-languages-fallback-name-thai = .label = Thai fonts-languages-fallback-name-turkish = .label = Turkish fonts-languages-fallback-name-vietnamese = .label = Vietnamese fonts-languages-fallback-name-other = .label = Other (incl. Western European) # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. languages-window = .title = Languages .style = width: 30em languages-close-key = .key = w languages-description = Web pages are sometimes offered in more than one language. Choose languages for displaying these web pages, in order of preference languages-customize-spoof-english = .label = Request English versions of web pages for enhanced privacy languages-customize-moveup = .label = Move Up .accesskey = U languages-customize-movedown = .label = Move Down .accesskey = D languages-customize-remove = .label = Remove .accesskey = R languages-customize-select-language = .placeholder = Select a language to add… languages-customize-add = .label = Add .accesskey = A # Variables: # $num - default value of the `dom.ipc.processCount` pref. default-content-process-count .label = { $num } (default) # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. permissions-window = .title = Exceptions .style = width: 45em permissions-close-key = .key = w permissions-address = Address of website .accesskey = d permissions-block = .label = Block .accesskey = B permissions-session = .label = Allow for Session .accesskey = S permissions-allow = .label = Allow .accesskey = A permissions-site-name = .label = Website permissions-status = .label = Status permissions-remove = .label = Remove Website .accesskey = R permissions-remove-all = .label = Remove All Websites .accesskey = e permissions-button-cancel = .label = Cancel .accesskey = C permissions-button-ok = .label = Save Changes .accesskey = S permissions-searchbox = .placeholder = Search Website # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. do-not-track-description = Send websites a “Do Not Track” signal that you don’t want to be tracked do-not-track-learn-more = Learn more do-not-track-option-default = .label = Only when using Tracking Protection do-not-track-option-always = .label = Always pref-page = .title = { PLATFORM() -> [windows] Options *[other] Preferences } # This is used to determine the width of the search field in about:preferences, # in order to make the entire placeholder string visible # # Notice: The value of the `.style` attribute is a CSS string, and the `width` # is the name of the CSS property. It is intended only to adjust the element's width. # Do not translate. search-input = .style = width: 15.4em # This is used to determine the width of the search field in about:preferences, # in order to make the entire placeholder string visible # # Please keep the placeholder string short to avoid truncation. # # Notice: The value of the `.style` attribute is a CSS string, and the `width` # is the name of the CSS property. It is intended only to adjust the element's width. # Do not translate. search-input-box = .style = width: 15.4em .placeholder = { PLATFORM() -> [windows] Find in Options *[other] Find in Preferences } policies-notice = { PLATFORM() -> [windows] Your organization has disabled the ability to change some options. *[other] Your organization has disabled the ability to change some preferences. } pane-general-title = General category-general = .tooltiptext = { pane-general-title } pane-home-title = Home category-home = .tooltiptext = { pane-home-title } pane-search-title = Search category-search = .tooltiptext = { pane-search-title } pane-privacy-title = Privacy & Security category-privacy = .tooltiptext = { pane-privacy-title } # The word "account" can be translated, do not translate or transliterate "Firefox". pane-sync-title = Firefox Account category-sync = .tooltiptext = { pane-sync-title } help-button-label = { -brand-short-name } Support focus-search = .key = f close-button = .aria-label = Close ## Browser Restart Dialog feature-enable-requires-restart = { -brand-short-name } must restart to enable this feature. feature-disable-requires-restart = { -brand-short-name } must restart to disable this feature. should-restart-title = Restart { -brand-short-name } should-restart-ok = Restart { -brand-short-name } now cancel-no-restart-button = Cancel restart-later = Restart Later ## Extension Control Notifications ## ## These strings are used to inform the user ## about changes made by extensions to browser settings. ## ## is going to be replaced by the extension icon. ## ## Variables: ## $name (String): name of the extension # This string is shown to notify the user that their home page # is being controlled by an extension. extension-controlled-homepage-override = An extension, { $name }, is controlling your home page. # This string is shown to notify the user that their new tab page # is being controlled by an extension. extension-controlled-new-tab-url = An extension, { $name }, is controlling your New Tab page. # This string is shown to notify the user that the default search engine # is being controlled by an extension. extension-controlled-default-search = An extension, { $name }, has set your default search engine. # This string is shown to notify the user that Container Tabs # are being enabled by an extension. extension-controlled-privacy-containers = An extension, { $name }, requires Container Tabs. # This string is shown to notify the user that their tracking protection preferences # are being controlled by an extension. extension-controlled-websites-tracking-protection-mode = An extension, { $name }, is controlling tracking protection. # This string is shown to notify the user that their proxy configuration preferences # are being controlled by an extension. extension-controlled-proxy-config = An extension, { $name }, is controlling how { -brand-short-name } connects to the internet. # This string is shown after the user disables an extension to notify the user # how to enable an extension that they disabled. # # will be replaced with Add-ons icon # will be replaced with Menu icon extension-controlled-enable = To enable the extension go to Add-ons in the menu. ## Preferences UI Search Results search-results-header = Search Results # `` will be replaced by the search term. search-results-empty-message = { PLATFORM() -> [windows] Sorry! There are no results in Options for “”. *[other] Sorry! There are no results in Preferences for “”. } search-results-help-link = Need help? Visit { -brand-short-name } Support ## General Section startup-header = Startup # { -brand-short-name } will be 'Firefox Developer Edition', # since this setting is only exposed in Firefox Developer Edition separate-profile-mode = .label = Allow { -brand-short-name } and Firefox to run at the same time use-firefox-sync = Tip: This uses separate profiles. Use { -sync-brand-short-name } to share data between them. get-started-not-logged-in = Sign in to { -sync-brand-short-name }… get-started-configured = Open { -sync-brand-short-name } preferences always-check-default = .label = Always check if { -brand-short-name } is your default browser .accesskey = y is-default = { -brand-short-name } is currently your default browser is-not-default = { -brand-short-name } is not your default browser set-as-my-default-browser = .label = Make Default… .accesskey = D startup-page = When { -brand-short-name } starts .accesskey = s startup-user-homepage = .label = Show your home page startup-blank-page = .label = Show a blank page startup-prev-session = .label = Show your windows and tabs from last time startup-restore-previous-session = .label = Restore previous session .accesskey = s disable-extension = .label = Disable Extension home-page-header = Home page tabs-group-header = Tabs ctrl-tab-recently-used-order = .label = Ctrl+Tab cycles through tabs in recently used order .accesskey = T open-new-link-as-tabs = .label = Open links in tabs instead of new windows .accesskey = w warn-on-close-multiple-tabs = .label = Warn you when closing multiple tabs .accesskey = m warn-on-open-many-tabs = .label = Warn you when opening multiple tabs might slow down { -brand-short-name } .accesskey = d switch-links-to-new-tabs = .label = When you open a link in a new tab, switch to it immediately .accesskey = h show-tabs-in-taskbar = .label = Show tab previews in the Windows taskbar .accesskey = k browser-containers-enabled = .label = Enable Container Tabs .accesskey = n browser-containers-learn-more = Learn more browser-containers-settings = .label = Settings… .accesskey = i containers-disable-alert-title = Close All Container Tabs? containers-disable-alert-desc = { $tabCount -> [one] If you disable Container Tabs now, { $tabCount } container tab will be closed. Are you sure you want to disable Container Tabs? *[other] If you disable Container Tabs now, { $tabCount } container tabs will be closed. Are you sure you want to disable Container Tabs? } containers-disable-alert-ok-button = { $tabCount -> [one] Close { $tabCount } Container Tab *[other] Close { $tabCount } Container Tabs } containers-disable-alert-cancel-button = Keep enabled containers-remove-alert-title = Remove This Container? # Variables: # $count (Number) - Number of tabs that will be closed. containers-remove-alert-msg = { $count -> [one] If you remove this Container now, { $count } container tab will be closed. Are you sure you want to remove this Container? *[other] If you remove this Container now, { $count } container tabs will be closed. Are you sure you want to remove this Container? } containers-remove-ok-button = Remove this Container containers-remove-cancel-button = Don’t remove this Container ## General Section - Language & Appearance language-and-appearance-header = Language and Appearance fonts-and-colors-header = Fonts & Colors default-font = Default font .accesskey = D default-font-size = Size .accesskey = S advanced-fonts = .label = Advanced… .accesskey = A colors-settings = .label = Colors… .accesskey = C language-header = Language choose-language-description = Choose your preferred language for displaying pages choose-button = .label = Choose… .accesskey = o translate-web-pages = .label = Translate web content .accesskey = T # The element is replaced by the logo of the provider # used to provide machine translations for web pages. translate-attribution = Translations by translate-exceptions = .label = Exceptions… .accesskey = x check-user-spelling = .label = Check your spelling as you type .accesskey = t ## General Section - Files and Applications files-and-applications-title = Files and Applications download-header = Downloads download-save-to = .label = Save files to .accesskey = v download-choose-folder = .label = { PLATFORM() -> [macos] Choose… *[other] Browse… } .accesskey = { PLATFORM() -> [macos] e *[other] o } download-always-ask-where = .label = Always ask you where to save files .accesskey = A applications-header = Applications applications-description = Choose how { -brand-short-name } handles the files you download from the web or the applications you use while browsing. applications-filter = .placeholder = Search file types or applications applications-type-column = .label = Content Type .accesskey = T applications-action-column = .label = Action .accesskey = A drm-content-header = Digital Rights Management (DRM) Content play-drm-content = .label = Play DRM-controlled content .accesskey = P play-drm-content-learn-more = Learn more update-application-title = { -brand-short-name } Updates update-application-description = Keep { -brand-short-name } up to date for the best performance, stability, and security. update-application-info = Version { $version } What's new update-application-version = Version { $version } What’s new update-history = .label = Show Update History… .accesskey = p update-application-allow-description = Allow { -brand-short-name } to update-application-auto = .label = Automatically install updates (recommended) .accesskey = A update-application-check-choose = .label = Check for updates but let you choose to install them .accesskey = C update-application-manual = .label = Never check for updates (not recommended) .accesskey = N update-application-use-service = .label = Use a background service to install updates .accesskey = b update-enable-search-update = .label = Automatically update search engines .accesskey = e ## General Section - Performance performance-title = Performance performance-use-recommended-settings-checkbox = .label = Use recommended performance settings .accesskey = U performance-use-recommended-settings-desc = These settings are tailored to your computer’s hardware and operating system. performance-settings-learn-more = Learn more performance-allow-hw-accel = .label = Use hardware acceleration when available .accesskey = r performance-limit-content-process-option = Content process limit .accesskey = l performance-limit-content-process-enabled-desc = Additional content processes can improve performance when using multiple tabs, but will also use more memory. performance-limit-content-process-disabled-desc = Modifying the number of content processes is only possible with multiprocess { -brand-short-name }. Learn how to check if multiprocess is enabled performance-limit-content-process-blocked-desc = Modifying the number of content processes is only possible with multiprocess { -brand-short-name }. Learn how to check if multiprocess is enabled # Variables: # $num - default value of the `dom.ipc.processCount` pref. performance-default-content-process-count = .label = { $num } (default) ## General Section - Browsing browsing-title = Browsing browsing-use-autoscroll = .label = Use autoscrolling .accesskey = a browsing-use-smooth-scrolling = .label = Use smooth scrolling .accesskey = m browsing-use-onscreen-keyboard = .label = Show a touch keyboard when necessary .accesskey = c browsing-use-cursor-navigation = .label = Always use the cursor keys to navigate within pages .accesskey = k browsing-search-on-start-typing = .label = Search for text when you start typing .accesskey = x ## General Section - Proxy network-proxy-title = Network Proxy network-proxy-connection-description = Configure how { -brand-short-name } connects to the internet. network-proxy-connection-learn-more = Learn More network-proxy-connection-settings = .label = Settings… .accesskey = e ## Home Section home-new-windows-tabs-header = New Windows and Tabs home-new-windows-tabs-description2 = Choose what you see when you open your homepage, new windows, and new tabs. ## Home Section - Home Page Customization home-homepage-mode-label = Homepage and new windows home-newtabs-mode-label = New tabs home-restore-defaults = .label = Restore Defaults .accesskey = R # "Firefox" should be treated as a brand and kept in English, # while "Home" and "(Default)" can be localized. home-mode-choice-default = .label = Firefox Home (Default) home-mode-choice-custom = .label = Custom URLs… home-mode-choice-blank = .label = Blank Page home-homepage-custom-url = .placeholder = Paste a URL… # This string has a special case for '1' and [other] (default). If necessary for # your language, you can add {$tabCount} to your translations and use the # standard CLDR forms, or only use the form for [other] if both strings should # be identical. use-current-pages = .label = { $tabCount -> [1] Use Current Page *[other] Use Current Pages } .accesskey = C choose-bookmark = .label = Use Bookmark… .accesskey = B restore-default = .label = Restore to Default .accesskey = R ## Search Section search-bar-header = Search Bar search-bar-hidden = .label = Use the address bar for search and navigation search-bar-shown = .label = Add search bar in toolbar search-engine-default-header = Default Search Engine search-engine-default-desc = Choose the default search engine to use in the address bar and search bar. search-suggestions-option = .label = Provide search suggestions .accesskey = s search-show-suggestions-url-bar-option = .label = Show search suggestions in address bar results .accesskey = l # This string describes what the user will observe when the system # prioritizes search suggestions over browsing history in the results # that extend down from the address bar. In the original English string, # "ahead" refers to location (appearing most proximate to), not time # (appearing before). search-show-suggestions-above-history-option = .label = Show search suggestions ahead of browsing history in address bar results search-suggestions-cant-show = Search suggestions will not be shown in location bar results because you have configured { -brand-short-name } to never remember history. search-one-click-header = One-Click Search Engines search-one-click-desc = Choose the alternative search engines that appear below the address bar and search bar when you start to enter a keyword. search-choose-engine-column = .label = Search Engine search-choose-keyword-column = .label = Keyword search-restore-default = .label = Restore Default Search Engines .accesskey = D search-remove-engine = .label = Remove .accesskey = R search-find-more-link = Find more search engines # This warning is displayed when the chosen keyword is already in use # ('Duplicate' is an adjective) search-keyword-warning-title = Duplicate Keyword # Variables: # $name (String) - Name of a search engine. search-keyword-warning-engine = You have chosen a keyword that is currently in use by “{ $name }”. Please select another. search-keyword-warning-bookmark = You have chosen a keyword that is currently in use by a bookmark. Please select another. ## Containers Section containers-back-link = « Go Back containers-header = Container Tabs containers-add-button = .label = Add New Container .accesskey = A containers-preferences-button = .label = Preferences containers-remove-button = .label = Remove ## Sync Section - Signed out sync-signedout-caption = Take Your Web With You sync-signedout-description = Synchronize your bookmarks, history, tabs, passwords, add-ons, and preferences across all your devices. sync-signedout-account-title = Connect with a { -fxaccount-brand-name } sync-signedout-account-create = Don’t have an account? Get started .accesskey = c sync-signedout-account-signin = .label = Sign In… .accesskey = I # This message contains two links and two icon images. # `` - Android logo icon # `` - Link to Android Download # `` - iOS logo icon # `` - Link to iOS Download # # They can be moved within the sentence as needed to adapt # to your language, but should not be changed or translated. sync-mobile-promo = Download Firefox for Android or iOS to sync with your mobile device. ## Sync Section - Signed in sync-profile-picture = .tooltiptext = Change profile picture sync-disconnect = .label = Disconnect… .accesskey = D sync-manage-account = Manage account .accesskey = o sync-signedin-unverified = { $email } is not verified. sync-signedin-login-failure = Please sign in to reconnect { $email } sync-resend-verification = .label = Resend Verification .accesskey = d sync-remove-account = .label = Remove Account .accesskey = R sync-sign-in = .label = Sign in .accesskey = g sync-signedin-settings-header = Sync Settings sync-signedin-settings-desc = Choose what to synchronize on your devices using { -brand-short-name } sync-engine-bookmarks = .label = Bookmarks .accesskey = m sync-engine-history = .label = History .accesskey = r sync-engine-tabs = .label = Open tabs .tooltiptext = A list of what’s open on all synced devices .accesskey = t sync-engine-logins = .label = Logins .tooltiptext = Usernames and passwords you’ve saved .accesskey = L sync-engine-addresses = .label = Addresses .tooltiptext = Postal addresses you’ve saved (desktop only) .accesskey = e sync-engine-creditcards = .label = Credit cards .tooltiptext = Names, numbers and expiry dates (desktop only) .accesskey = C sync-engine-addons = .label = Add-ons .tooltiptext = Extensions and themes for Firefox desktop .accesskey = A sync-engine-prefs = .label = { PLATFORM() -> [windows] Options *[other] Preferences } .tooltiptext = General, Privacy, and Security settings you’ve changed .accesskey = s sync-device-name-header = Device Name sync-device-name-change = .label = Change Device Name… .accesskey = h sync-device-name-cancel = .label = Cancel .accesskey = n sync-device-name-save = .label = Save .accesskey = v sync-mobilepromo-single = Connect another device sync-mobilepromo-multi = Manage devices sync-tos-link = Terms of Service sync-fxa-privacy-notice = Privacy Notice ## Privacy Section privacy-header = Browser Privacy ## Privacy Section - Forms forms-header = Forms & Passwords forms-ask-to-save-logins = .label = Ask to save logins and passwords for websites .accesskey = r forms-exceptions = .label = Exceptions… .accesskey = x forms-saved-logins = .label = Saved Logins… .accesskey = L forms-master-pw-use = .label = Use a master password .accesskey = U forms-master-pw-change = .label = Change Master Password .accesskey = M ## Privacy Section - History history-header = History # This label is followed, on the same line, by a dropdown list of options # (Remember history, etc.). # In English it visually creates a full sentence, e.g. # "Firefox will" + "Remember history". # # If this doesn't work for your language, you can translate this message: # - Simply as "Firefox", moving the verb into each option. # This will result in "Firefox" + "Will remember history", etc. # - As a stand-alone message, for example "Firefox history settings:". history-remember-label = { -brand-short-name } will .accesskey = w history-remember-option-all = .label = Remember history history-remember-option-never = .label = Never remember history history-remember-option-custom = .label = Use custom settings for history history-remember-description = { -brand-short-name } will remember your browsing, download, form and search history. history-dontremember-description = { -brand-short-name } will use the same settings as private browsing, and will not remember any history as you browse the Web. history-private-browsing-permanent = .label = Always use private browsing mode .accesskey = p history-remember-option = .label = Remember my browsing and download history .accesskey = b history-remember-search-option = .label = Remember search and form history .accesskey = f history-clear-on-close-option = .label = Clear history when { -brand-short-name } closes .accesskey = r history-clear-on-close-settings = .label = Settings… .accesskey = t history-clear-button = .label = Clear History… .accesskey = s ## Privacy Section - Site Data sitedata-header = Cookies and Site Data sitedata-learn-more = Learn more sitedata-accept-cookies-option = .label = Accept cookies and site data from websites (recommended) .accesskey = A sitedata-block-cookies-option = .label = Block cookies and site data (may cause websites to break) .accesskey = B sitedata-keep-until = Keep until .accesskey = u sitedata-keep-until-expire = .label = They expire sitedata-keep-until-closed = .label = { -brand-short-name } is closed sitedata-accept-third-party-desc = Accept third-party cookies and site data .accesskey = y sitedata-accept-third-party-always-option = .label = Always sitedata-accept-third-party-visited-option = .label = From visited sitedata-accept-third-party-never-option = .label = Never sitedata-clear = .label = Clear Data… .accesskey = l sitedata-settings = .label = Manage Data… .accesskey = M sitedata-cookies-exceptions = .label = Exceptions… .accesskey = E ## Privacy Section - Address Bar addressbar-header = Address Bar addressbar-suggest = When using the address bar, suggest addressbar-locbar-history-option = .label = Browsing history .accesskey = h addressbar-locbar-bookmarks-option = .label = Bookmarks .accesskey = k addressbar-locbar-openpage-option = .label = Open tabs .accesskey = O addressbar-suggestions-settings = Change preferences for search engine suggestions ## Privacy Section - Tracking tracking-header = Tracking Protection tracking-desc = Tracking Protection blocks online trackers that collect your browsing data across multiple websites. Learn more about Tracking Protection and your privacy tracking-mode-label = Use Tracking Protection to block known trackers tracking-mode-always = .label = Always .accesskey = y tracking-mode-private = .label = Only in private windows .accesskey = l tracking-mode-never = .label = Never .accesskey = N # This string is displayed if privacy.trackingprotection.ui.enabled is set to false. # This currently happens on the release and beta channel. tracking-pbm-label = Use Tracking Protection in Private Browsing to block known trackers .accesskey = v tracking-exceptions = .label = Exceptions… .accesskey = x tracking-change-block-list = .label = Change Block List… .accesskey = C ## Privacy Section - Permissions permissions-header = Permissions permissions-location = Location permissions-location-settings = .label = Settings… .accesskey = t permissions-camera = Camera permissions-camera-settings = .label = Settings… .accesskey = t permissions-microphone = Microphone permissions-microphone-settings = .label = Settings… .accesskey = t permissions-notification = Notifications permissions-notification-settings = .label = Settings… .accesskey = t permissions-notification-link = Learn more permissions-notification-pause = .label = Pause notifications until { -brand-short-name } restarts .accesskey = n permissions-block-popups = .label = Block pop-up windows .accesskey = B permissions-block-popups-exceptions = .label = Exceptions… .accesskey = E permissions-addon-install-warning = .label = Warn you when websites try to install add-ons .accesskey = W permissions-addon-exceptions = .label = Exceptions… .accesskey = E permissions-a11y-privacy-checkbox = .label = Prevent accessibility services from accessing your browser .accesskey = a permissions-a11y-privacy-link = Learn more ## Privacy Section - Data Collection collection-header = { -brand-short-name } Data Collection and Use collection-description = We strive to provide you with choices and collect only what we need to provide and improve { -brand-short-name } for everyone. We always ask permission before receiving personal information. collection-privacy-notice = Privacy Notice collection-health-report = .label = Allow { -brand-short-name } to send technical and interaction data to { -vendor-short-name } .accesskey = r collection-health-report-link = Learn more # This message is displayed above disabled data sharing options in developer builds # or builds with no Telemetry support available. collection-health-report-disabled = Data reporting is disabled for this build configuration collection-browser-errors = .label = Allow { -brand-short-name } to send browser error reports (including error messages) to { -vendor-short-name } .accesskey = b collection-browser-errors-link = Learn more collection-backlogged-crash-reports = .label = Allow { -brand-short-name } to send backlogged crash reports on your behalf .accesskey = c collection-backlogged-crash-reports-link = Learn more ## Privacy Section - Security ## ## It is important that wording follows the guidelines outlined on this page: ## https://developers.google.com/safe-browsing/developers_guide_v2#AcceptableUsage security-header = Security security-browsing-protection = Deceptive Content and Dangerous Software Protection security-enable-safe-browsing = .label = Block dangerous and deceptive content .accesskey = B security-enable-safe-browsing-link = Learn more security-block-downloads = .label = Block dangerous downloads .accesskey = d security-block-uncommon-software = .label = Warn you about unwanted and uncommon software .accesskey = c ## Privacy Section - Certificates certs-header = Certificates certs-personal-label = When a server requests your personal certificate certs-select-auto-option = .label = Select one automatically .accesskey = S certs-select-ask-option = .label = Ask you every time .accesskey = A certs-enable-ocsp = .label = Query OCSP responder servers to confirm the current validity of certificates .accesskey = Q certs-view = .label = View Certificates… .accesskey = C certs-devices = .label = Security Devices… .accesskey = D # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. select-bookmark-window = .title = Set Home Page .style = width: 32em; select-bookmark-desc = Choose a Bookmark to be your Home Page. If you choose a folder, the Bookmarks in that folder will be opened in Tabs. # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. ## Settings site-data-settings-window = .title = Manage Cookies and Site Data site-data-search-textbox = .placeholder = Search websites .accesskey = S site-data-column-host = .label = Site site-data-column-cookies = .label = Cookies site-data-column-storage = .label = Storage site-data-column-last-used = .label = Last Used site-data-remove-selected = .label = Remove Selected .accesskey = R site-data-button-cancel = .label = Cancel .accesskey = C site-data-button-save = .label = Save Changes .accesskey = a ## Removing site-data-removing-window = .title = { site-data-removing-header } site-data-removing-header = Removing Cookies and Site Data site-data-removing-desc = Removing cookies and site data may log you out of websites. Are you sure you want to make the changes? site-data-removing-table = Cookies and site data for the following websites will be removed # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. translation-window = .title = Exceptions - Translation .style = width: 36em translation-close-key = .key = w translation-languages-disabled-desc = Translation will not be offered for the following languages translation-languages-column = .label = Languages translation-languages-button-remove = .label = Remove Language .accesskey = R translation-languages-button-remove-all = .label = Remove All Languages .accesskey = e translation-sites-disabled-desc = Translation will not be offered for the following sites translation-sites-column = .label = Websites translation-sites-button-remove = .label = Remove Site .accesskey = S translation-sites-button-remove-all = .label = Remove All Sites .accesskey = i translation-button-close = .label = Close .accesskey = C ================================================ FILE: samples/Fluent/select_indent.ftl ================================================ select-1tbs-inline = { $selector -> *[key] Value } select-1tbs-newline = { $selector -> *[key] Value } select-1tbs-indent = { $selector -> *[key] Value } select-allman-inline = { $selector -> *[key] Value [other] Other } select-allman-newline = { $selector -> *[key] Value } select-allman-indent = { $selector -> *[key] Value } select-gnu-inline = { $selector -> *[key] Value } select-gnu-newline = { $selector -> *[key] Value } select-gnu-indent = { $selector -> *[key] Value } select-no-indent = { $selector -> *[key] Value [other] Other } select-no-indent-multiline = { $selector -> *[key] Value Continued [other] Other Multiline } # # ERROR (Multiline text must be indented) # select-no-indent-multiline = { $selector -> # *[key] Value # Continued without indent. # } select-flat = { $selector -> *[ key ] Value [ other ] Other } # Each line ends with 5 spaces. select-flat-with-trailing-spaces = { $selector -> *[ key ] Value [ other ] Other } ================================================ FILE: samples/Fluent/simple.ftl ================================================ # Simple things are simple. hello-user = Hello, {$userName}! # Complex things are possible. shared-photos = {$userName} {$photoCount -> [one] added a new photo *[other] added {$photoCount} new photos } to {$userGender -> [male] his stream [female] her stream *[other] their stream }. ================================================ FILE: samples/Formatted/NiAlH_jea.eam.fs ================================================ see James E Angelo, Neville R Moody, Michael I Baskes "Trapping of hydrogen to lattice defects in nickel", Modelling and Simulation in Materials Science & Engineering, vol. 3, pp. 289-307 (1995) 3 Ni Al H 1000 0.1300722995578975E-01 1000 0.5678391959798995E-02 0.5650000000000000E+01 28 58.710 3.5200 fcc 0.0000000000000000E+00 -0.1332662793615358E+00 -0.1452921454581837E+00 -0.1523531912368142E+00 -0.1581862523552362E+00 -0.1639082041116888E+00 -0.1699426545382059E+00 -0.1764570476376752E+00 -0.1835109199136706E+00 -0.1911112227682255E+00 -0.1992425242400153E+00 -0.2078735593152208E+00 -0.2169708161705926E+00 -0.2264981576262208E+00 -0.2364198685383210E+00 -0.2467010212354559E+00 -0.2573089641630046E+00 -0.2682127177172648E+00 -0.2793832876249742E+00 -0.2907936148383499E+00 -0.3024184814336230E+00 -0.3142343948579320E+00 -0.3262194641112117E+00 -0.3383532759151806E+00 -0.3506164751688710E+00 -0.3629930849818281E+00 -0.3754632992578539E+00 -0.3880132539605681E+00 -0.4006282340364624E+00 -0.4132944249954278E+00 -0.4259988342802910E+00 -0.4387292219786865E+00 -0.4514740394367802E+00 -0.4642223746432430E+00 -0.4769639034723383E+00 -0.4896888460377404E+00 -0.5023882063058194E+00 -0.5150514008208491E+00 -0.5276733170954859E+00 -0.5402439685620584E+00 -0.5527559057851690E+00 -0.5652019937956556E+00 -0.5775754037468577E+00 -0.5898697374354533E+00 -0.6020783706550734E+00 -0.6141958187973504E+00 -0.6262163111449786E+00 -0.6381344390125845E+00 -0.6499424015305308E+00 -0.6616382540753616E+00 -0.6731993263249691E+00 -0.6845796030423443E+00 -0.6957060801011892E+00 -0.7064948085245568E+00 -0.7168695757140675E+00 -0.7267732527299753E+00 -0.7361710465584164E+00 -0.7450484575868490E+00 -0.7534069422321110E+00 -0.7612592416825148E+00 -0.7686253227224800E+00 -0.7755292274454266E+00 -0.7819968032841373E+00 -0.7880540868431538E+00 -0.7937266203490037E+00 -0.7990383766649565E+00 -0.8040117767243267E+00 -0.8086674652146524E+00 -0.8130242928279436E+00 -0.8170993717012625E+00 -0.8209081734003210E+00 -0.8244646490459413E+00 -0.8277813583284139E+00 -0.8308695990447905E+00 -0.8337395320876144E+00 -0.8364002989992798E+00 -0.8388601306360481E+00 -0.8411264464017005E+00 -0.8432059440847066E+00 -0.8451046806746021E+00 -0.8468281447278194E+00 -0.8483813209452364E+00 -0.8497687476559737E+00 -0.8509945678935900E+00 -0.8520625747193371E+00 -0.8529762514032520E+00 -0.8537388100896948E+00 -0.8543532100632678E+00 -0.8548222073722460E+00 -0.8551483635456201E+00 -0.8553340719766496E+00 -0.8553815772750362E+00 -0.8552929923971586E+00 -0.8550703138095166E+00 -0.8547151651374190E+00 -0.8542288599579191E+00 -0.8536141001159478E+00 -0.8528770375410186E+00 -0.8520101609408499E+00 -0.8510194840111716E+00 -0.8499064644469634E+00 -0.8486725211340236E+00 -0.8473190381844873E+00 -0.8458473685456269E+00 -0.8442588372306652E+00 -0.8425547442066161E+00 -0.8407363669700096E+00 -0.8388049628370240E+00 -0.8367617709719433E+00 -0.8346080141771175E+00 -0.8323449004663495E+00 -0.8299736244409459E+00 -0.8274953684882504E+00 -0.8249113038193059E+00 -0.8222225913624328E+00 -0.8194312028270083E+00 -0.8165381656110142E+00 -0.8135381986589678E+00 -0.8104430318985472E+00 -0.8072486480744487E+00 -0.8039562298106482E+00 -0.8005669360809051E+00 -0.7970819051712361E+00 -0.7935022573432313E+00 -0.7898290971921718E+00 -0.7860635135890277E+00 -0.7822065375250205E+00 -0.7782588382932190E+00 -0.7742197532367605E+00 -0.7700870580234671E+00 -0.7658477859557991E+00 -0.7614923740747592E+00 -0.7569976237158578E+00 -0.7523403043259940E+00 -0.7474924540260339E+00 -0.7424262490644793E+00 -0.7371152605107092E+00 -0.7315359786377336E+00 -0.7256688371398212E+00 -0.7194997208059100E+00 -0.7130147649374017E+00 -0.7062107830858579E+00 -0.6990840527339586E+00 -0.6916355099263285E+00 -0.6838688833277935E+00 -0.6757902321840703E+00 -0.6674074545321318E+00 -0.6587298477273151E+00 -0.6497677278712075E+00 -0.6405321085533657E+00 -0.6310344355558080E+00 -0.6212863721358168E+00 -0.6112922466782784E+00 -0.6010783652240157E+00 -0.5906465248553197E+00 -0.5800085678384548E+00 -0.5691757383537599E+00 -0.5581582564186043E+00 -0.5469659281367214E+00 -0.5356081318998811E+00 -0.5240938131155666E+00 -0.5124314854938561E+00 -0.5006292372993926E+00 -0.4886947412876452E+00 -0.4766352673015746E+00 -0.4644576967166927E+00 -0.4521685380961173E+00 -0.4397739435565100E+00 -0.4272797254586216E+00 -0.4146913731272406E+00 -0.4020140693777172E+00 -0.3892527066834290E+00 -0.3764119028647137E+00 -0.3634960162151266E+00 -0.3505091600038455E+00 -0.3374552163098947E+00 -0.3243378491869073E+00 -0.3111605171690215E+00 -0.2979264851148429E+00 -0.2846388353950218E+00 -0.2713004784405015E+00 -0.2579141626735364E+00 -0.2444824838465252E+00 -0.2310078938154909E+00 -0.2174927087734169E+00 -0.2039391169721405E+00 -0.1903491859578246E+00 -0.1767248693464794E+00 -0.1630680131652866E+00 -0.1493803617833507E+00 -0.1356635634555516E+00 -0.1219191755016809E+00 -0.1081486691423308E+00 -0.9435343401120377E-01 -0.8054492422289172E-01 -0.6670414857713070E-01 -0.5284236389642416E-01 -0.3896067277847237E-01 -0.2506137114673379E-01 -0.1114505736346416E-01 0.2787869992531000E-02 0.1673649714292225E-01 0.3069995798121283E-01 0.4467743152122949E-01 0.5866813997114662E-01 0.7267134735307934E-01 0.8668635275736136E-01 0.1007124932111410E+00 0.1147491401988674E+00 0.1287956978815430E+00 0.1428516014164529E+00 0.1569163153723068E+00 0.1709893322335105E+00 0.1850701709882827E+00 0.1991583757947666E+00 0.2132535147217212E+00 0.2273551785580352E+00 0.2414629796876397E+00 0.2555765510256194E+00 0.2696955450121337E+00 0.2838196326609008E+00 0.2979485026581798E+00 0.3120818605100766E+00 0.3262194277345074E+00 0.3403609410961295E+00 0.3545061518803436E+00 0.3686548252055175E+00 0.3828067393706931E+00 0.3969616852363487E+00 0.4111194656371424E+00 0.4252798948247261E+00 0.4394427979383266E+00 0.4536080105023714E+00 0.4677753779491880E+00 0.4819447551653937E+00 0.4961160060612713E+00 0.5102890031615175E+00 0.5244636272329899E+00 0.5386397670398893E+00 0.5528173195811590E+00 0.5669961916288884E+00 0.5811763038337503E+00 0.5953575986744184E+00 0.6095400529056221E+00 0.6237236940889446E+00 0.6379086197162707E+00 0.6520950167319981E+00 0.6662831791056405E+00 0.6804735214359070E+00 0.6946665872026117E+00 0.7088630510277696E+00 0.7230637149920511E+00 0.7372694995930971E+00 0.7514814302896511E+00 0.7657006207512822E+00 0.7799282539728765E+00 0.7941655623409360E+00 0.8084138075998624E+00 0.8226742614970703E+00 0.8369481877037046E+00 0.8512368254336948E+00 0.8655413750282932E+00 0.8798629856427098E+00 0.8942027450633461E+00 0.9085616716017455E+00 0.9229407079527192E+00 0.9373407168612360E+00 0.9517624784199370E+00 0.9662066888041991E+00 0.9806739602523891E+00 0.9951648221004206E+00 0.1009679722693299E+01 0.1024219032006336E+01 0.1038783044826459E+01 0.1053371984359273E+01 0.1067986006143130E+01 0.1082625202169261E+01 0.1097289605119975E+01 0.1111979192652043E+01 0.1126693891663521E+01 0.1141433582496241E+01 0.1156198103032580E+01 0.1170987252656857E+01 0.1185800796057570E+01 0.1200638466853661E+01 0.1215499971032784E+01 0.1230384990195972E+01 0.1245293184603845E+01 0.1260224196025355E+01 0.1275177650390923E+01 0.1290153160254313E+01 0.1305150327069121E+01 0.1320168743286779E+01 0.1335207994283188E+01 0.1350267660123350E+01 0.1365347317171768E+01 0.1380446539557269E+01 0.1395564900502009E+01 0.1410701973522016E+01 0.1425857333509093E+01 0.1441030557701353E+01 0.1456221226550525E+01 0.1471428924494518E+01 0.1486653240641253E+01 0.1501893769371186E+01 0.1517150110865678E+01 0.1532421871566029E+01 0.1547708664570152E+01 0.1563010109971501E+01 0.1578325835145321E+01 0.1593655474987493E+01 0.1608998672109891E+01 0.1624371180506387E+01 0.1639740502114151E+01 0.1655122356345302E+01 0.1670516417892671E+01 0.1685922369619611E+01 0.1701339902568634E+01 0.1716768715949499E+01 0.1732208517108212E+01 0.1747659021479414E+01 0.1763119952524256E+01 0.1778591041654877E+01 0.1794072028147745E+01 0.1809562659046684E+01 0.1825062689057695E+01 0.1840571880435753E+01 0.1856090002865933E+01 0.1871616833338670E+01 0.1887152156020591E+01 0.1902695762121880E+01 0.1918247449760493E+01 0.1933807023824201E+01 0.1949374295830467E+01 0.1964949083785456E+01 0.1980531212042564E+01 0.1996120511159695E+01 0.2011716817757780E+01 0.2027319974378536E+01 0.2042929829344224E+01 0.2058546236616969E+01 0.2074169055660697E+01 0.2089798151303690E+01 0.2105433393602993E+01 0.2121074657710956E+01 0.2136721823742874E+01 0.2152374776647946E+01 0.2168033406081115E+01 0.2183697606278244E+01 0.2199367275932566E+01 0.2215042318074360E+01 0.2230722639952553E+01 0.2246408152918789E+01 0.2262098772314182E+01 0.2277794417357875E+01 0.2293495011038814E+01 0.2309200480010006E+01 0.2324910754483760E+01 0.2340625768131687E+01 0.2356345457985135E+01 0.2372069764338704E+01 0.2387798630656611E+01 0.2403532003480336E+01 0.2419269832339658E+01 0.2435012069665014E+01 0.2450758670702946E+01 0.2466509593432718E+01 0.2482264798486547E+01 0.2498024249070006E+01 0.2513787910886542E+01 0.2529555752062322E+01 0.2545327743074537E+01 0.2561103856680077E+01 0.2576884067847857E+01 0.2592668353691494E+01 0.2608456693404804E+01 0.2624249068198495E+01 0.2640045461239012E+01 0.2655845857588801E+01 0.2671650244148466E+01 0.2687458609600455E+01 0.2703270944353804E+01 0.2719087240491504E+01 0.2734907491718758E+01 0.2750731693312261E+01 0.2766559842071786E+01 0.2782391936272532E+01 0.2798227975619128E+01 0.2814067961200806E+01 0.2829911895447779E+01 0.2845759782089161E+01 0.2861611626111980E+01 0.2877467433721947E+01 0.2893327212308449E+01 0.2909190970421690E+01 0.2925058717783131E+01 0.2940930465370343E+01 0.2956806225646105E+01 0.2972686013021615E+01 0.2988569844663630E+01 0.3004457741744432E+01 0.3020349731207816E+01 0.3036245848084562E+01 0.3052146138327856E+01 0.3068050662093938E+01 0.3083959497337403E+01 0.3099872743561932E+01 0.3115790525549542E+01 0.3131712996890727E+01 0.3147640343150343E+01 0.3163572784533585E+01 0.3179510577942580E+01 0.3195454018354155E+01 0.3211403439482311E+01 0.3227359213718501E+01 0.3243321751378190E+01 0.3259291499296893E+01 0.3275268938843027E+01 0.3291254583421065E+01 0.3307248975552397E+01 0.3323252683617341E+01 0.3339266298346260E+01 0.3355290429139160E+01 0.3371325700295216E+01 0.3387372747215409E+01 0.3403432212646379E+01 0.3419504743012368E+01 0.3435590984884243E+01 0.3451691581620338E+01 0.3467807170206726E+01 0.3483938378319635E+01 0.3500085821623841E+01 0.3516250101317652E+01 0.3532431801926151E+01 0.3548631489345226E+01 0.3564849709131778E+01 0.3581086985033565E+01 0.3597344652416893E+01 0.3613622490530517E+01 0.3629920843003930E+01 0.3646240132058665E+01 0.3662580753832387E+01 0.3678943078161282E+01 0.3695327448517830E+01 0.3711734182088804E+01 0.3728163569978022E+01 0.3744615877522165E+01 0.3761091344705235E+01 0.3777590186658585E+01 0.3794112594236921E+01 0.3810658734656357E+01 0.3827228752187168E+01 0.3843822768889325E+01 0.3860440885384449E+01 0.3877083181654072E+01 0.3893749717858398E+01 0.3910440535169144E+01 0.3927155656609344E+01 0.3943895087897474E+01 0.3960658818286859E+01 0.3977446821402751E+01 0.3994259056066866E+01 0.4011095467111076E+01 0.4027955986175584E+01 0.4044840532489744E+01 0.4061749013633730E+01 0.4078681326279053E+01 0.4095637356908441E+01 0.4112616982511369E+01 0.4129620071256468E+01 0.4146646483140302E+01 0.4163696070611252E+01 0.4180768679168807E+01 0.4197864147938219E+01 0.4214982310220819E+01 0.4232122994020187E+01 0.4249286022544283E+01 0.4266471214683492E+01 0.4283678385466899E+01 0.4300907346494270E+01 0.4318157906348262E+01 0.4335429870982637E+01 0.4352723044092500E+01 0.4370037227462390E+01 0.4387372221295607E+01 0.4404727824526063E+01 0.4422103835109979E+01 0.4439500050301689E+01 0.4456916266912927E+01 0.4474352281555639E+01 0.4491807890868955E+01 0.4509282891733321E+01 0.4526777081468666E+01 0.4544290258021121E+01 0.4561822220135298E+01 0.4579372767515736E+01 0.4596941700976757E+01 0.4614528822579842E+01 0.4632133935763207E+01 0.4649756845459109E+01 0.4667397358203146E+01 0.4685055282234032E+01 0.4702730427585877E+01 0.4720422606171269E+01 0.4738131631857456E+01 0.4755857320535952E+01 0.4773599490184296E+01 0.4791357960922696E+01 0.4809132555063428E+01 0.4826923097156268E+01 0.4844729414026645E+01 0.4862551334810888E+01 0.4880388690984844E+01 0.4898241316389871E+01 0.4916109047253045E+01 0.4933991722205747E+01 0.4951889182295560E+01 0.4969801270997834E+01 0.4987727834222142E+01 0.5005668720316748E+01 0.5023623780069656E+01 0.5041592866707418E+01 0.5059575835892119E+01 0.5077572545715171E+01 0.5095582856689347E+01 0.5113606631739316E+01 0.5131643736190284E+01 0.5149694037754543E+01 0.5167757406516841E+01 0.5185833714918900E+01 0.5203922837741345E+01 0.5222024652085636E+01 0.5240139037355135E+01 0.5258265875233761E+01 0.5276405049664660E+01 0.5294556446828821E+01 0.5312719955121622E+01 0.5330895465129331E+01 0.5349083197331439E+01 0.5367282875848076E+01 0.5385494235244209E+01 0.5403717174591350E+01 0.5421951595034059E+01 0.5440197399763505E+01 0.5458454493990288E+01 0.5476722784918579E+01 0.5495002181717851E+01 0.5513292595496480E+01 0.5531593939274245E+01 0.5549906127955438E+01 0.5568229078301286E+01 0.5586562708902733E+01 0.5604906940153441E+01 0.5623261694222876E+01 0.5641626895028466E+01 0.5660002468209782E+01 0.5678388341101183E+01 0.5696784442705152E+01 0.5715190703666806E+01 0.5733607056245972E+01 0.5752033434292926E+01 0.5770469773221294E+01 0.5788916009983083E+01 0.5807372083043617E+01 0.5825837932355000E+01 0.5844313499333083E+01 0.5862798726831699E+01 0.5881293559118404E+01 0.5899797941851205E+01 0.5918311822053070E+01 0.5936835148090665E+01 0.5955367869649308E+01 0.5973909937710687E+01 0.5992461304530181E+01 0.6010993710199870E+01 0.6029563495483089E+01 0.6048142443794930E+01 0.6066730512264272E+01 0.6085327659184557E+01 0.6103933843993559E+01 0.6122549027251964E+01 0.6141173170624000E+01 0.6159806236856411E+01 0.6178448189759933E+01 0.6197098994189034E+01 0.6215758616023336E+01 0.6234427022148239E+01 0.6253104180437035E+01 0.6271790059732240E+01 0.6290484629827574E+01 0.6309187861451164E+01 0.6327899726246912E+01 0.6346620196758565E+01 0.6365349246411810E+01 0.6384086849498459E+01 0.6402832981160216E+01 0.6421587617372310E+01 0.6440350734927804E+01 0.6459122311422306E+01 0.6477902325238560E+01 0.6496690755531631E+01 0.6515487582214305E+01 0.6534292785942100E+01 0.6553106348100002E+01 0.6571928250787252E+01 0.6590758476804609E+01 0.6609597009640567E+01 0.6628443833458164E+01 0.6647298933081430E+01 0.6666162293983589E+01 0.6685033902273446E+01 0.6703913744683604E+01 0.6722801808558643E+01 0.6741698081842145E+01 0.6760602553065809E+01 0.6779515211338037E+01 0.6798436046331943E+01 0.6817365048274937E+01 0.6836302207937280E+01 0.6855247516621816E+01 0.6874200966153282E+01 0.6893162548867991E+01 0.6912132257603389E+01 0.6931110085688530E+01 0.6950096026934304E+01 0.6969090075623598E+01 0.6988092226501735E+01 0.7007102474767507E+01 0.7026120816064235E+01 0.7045147246470421E+01 0.7064181762491003E+01 0.7083224361049062E+01 0.7102275039477362E+01 0.7121333795510111E+01 0.7140400627274076E+01 0.7159475533281437E+01 0.7178558512421901E+01 0.7197649563954585E+01 0.7216748687500626E+01 0.7235855883035654E+01 0.7254971150883136E+01 0.7274094491705881E+01 0.7293225906500751E+01 0.7312365396590522E+01 0.7331512963616746E+01 0.7350668609535120E+01 0.7369832336606407E+01 0.7389004147392185E+01 0.7408184044746747E+01 0.7427372031812411E+01 0.7446568112012670E+01 0.7465772289046285E+01 0.7484984566881565E+01 0.7504204949750658E+01 0.7523433442143897E+01 0.7542670048804212E+01 0.7561914774721672E+01 0.7581167625127947E+01 0.7600428605492169E+01 0.7619697721514100E+01 0.7638974979120491E+01 0.7658260384459254E+01 0.7677553943895177E+01 0.7696855664005213E+01 0.7716165551573454E+01 0.7735483613586325E+01 0.7754812044852841E+01 0.7774146430634772E+01 0.7793489013893222E+01 0.7812839802364948E+01 0.7832198803967884E+01 0.7851566026796888E+01 0.7870941479120802E+01 0.7890325169377391E+01 0.7909717106169680E+01 0.7929117298262355E+01 0.7948525754578284E+01 0.7967942484194026E+01 0.7987367496337072E+01 0.8006800800381754E+01 0.8026242405846276E+01 0.8045692322388845E+01 0.8065150559804493E+01 0.8084617128021762E+01 0.8104092037099576E+01 0.8123575297224079E+01 0.8143066918705415E+01 0.8162566911974665E+01 0.8182075287581299E+01 0.8201592056189469E+01 0.8221117228575778E+01 0.8240650815626054E+01 0.8260192828332890E+01 0.8279743277792548E+01 0.8299302175202868E+01 0.8318869531860187E+01 0.8338445359156225E+01 0.8358029668577160E+01 0.8377622471699610E+01 0.8397223780188767E+01 0.8416833605796000E+01 0.8436451960357047E+01 0.8456078855787993E+01 0.8475714304085500E+01 0.8495358317322456E+01 0.8515010907646797E+01 0.8534672087279333E+01 0.8554341868511301E+01 0.8574020263702693E+01 0.8593707285279649E+01 0.8613402945733171E+01 0.8633107257617183E+01 0.8652820233545668E+01 0.8672541886191894E+01 0.8692272228285830E+01 0.8712011272612585E+01 0.8731759032010899E+01 0.8751515519370983E+01 0.8771280747633298E+01 0.8791054729785913E+01 0.8810837478864300E+01 0.8830629007948218E+01 0.8850429330161134E+01 0.8870238458668837E+01 0.8890056406676365E+01 0.8909883187428321E+01 0.8929718814206822E+01 0.8949563300329515E+01 0.8969416659148337E+01 0.8989278904048760E+01 0.9009150048447722E+01 0.9029030105792657E+01 0.9048919089560115E+01 0.9068817013254048E+01 0.9088723890405547E+01 0.9108639734570488E+01 0.9128564559328495E+01 0.9148498378283008E+01 0.9168441205058130E+01 0.9188393053299251E+01 0.9208353936670647E+01 0.9228323868854844E+01 0.9248302863551771E+01 0.9268290934477903E+01 0.9288288095363413E+01 0.9308294359953749E+01 0.9328309742007235E+01 0.9348334255293310E+01 0.9368367913593602E+01 0.9388410730698894E+01 0.9408462720409801E+01 0.9428523896534983E+01 0.9448594272890006E+01 0.9468673863297340E+01 0.9488762681584802E+01 0.9508860741584925E+01 0.9528968057134250E+01 0.9549084642072614E+01 0.9569210510241618E+01 0.9589345675484282E+01 0.9609490151644962E+01 0.9629643952567108E+01 0.9649807092094022E+01 0.9669979584066937E+01 0.9690161442325262E+01 0.9710352680705284E+01 0.9730553313039422E+01 0.9750763353155946E+01 0.9770982814877840E+01 0.9791211712022829E+01 0.9811450058402528E+01 0.9831697867820566E+01 0.9851955154073806E+01 0.9872221930951270E+01 0.9892498212232454E+01 0.9912784011688075E+01 0.9933079343078646E+01 0.9953384220154447E+01 0.9973698656654562E+01 0.9994022666306762E+01 0.1001435626282665E+02 0.1003470009456882E+02 0.1005505370279354E+02 0.1007541692221616E+02 0.1009578976686720E+02 0.1011617225075480E+02 0.1013656438786407E+02 0.1015696619215623E+02 0.1017737767756941E+02 0.1019779885801728E+02 0.1021822974738978E+02 0.1023867035955192E+02 0.1025912070834428E+02 0.1027958080758259E+02 0.1030005067105711E+02 0.1032053031253292E+02 0.1034101974574955E+02 0.1036151898442014E+02 0.1038202804223235E+02 0.1040254693284723E+02 0.1042307566989899E+02 0.1044361426699570E+02 0.1046416273771851E+02 0.1048472109562067E+02 0.1050528935422884E+02 0.1052586752704187E+02 0.1054645562753072E+02 0.1056705366913900E+02 0.1058766166528144E+02 0.1060827962934513E+02 0.1062890757468810E+02 0.1064950908609077E+02 0.1067015700336870E+02 0.1069081494185409E+02 0.1071148291478914E+02 0.1073216093538781E+02 0.1075284901683381E+02 0.1077354717228192E+02 0.1079425541485676E+02 0.1081497375765323E+02 0.1083570221373617E+02 0.1085644079614013E+02 0.1087718951786965E+02 0.1089794839189827E+02 0.1091871743116957E+02 0.1093949664859596E+02 0.1096028605705928E+02 0.1098108566940994E+02 0.1100189549846826E+02 0.1102271555702228E+02 0.1104354585782909E+02 0.1106438641361461E+02 0.1108523723707299E+02 0.1110609834086651E+02 0.1112696973762601E+02 0.1114785143995061E+02 0.1116874346040703E+02 0.1118964581153000E+02 0.1121055850582263E+02 0.1123148155575473E+02 0.1125241497376490E+02 0.1127335877225852E+02 0.1129431296360895E+02 0.1131527756015691E+02 0.1133625257420954E+02 0.1135723801804252E+02 0.1137823390389772E+02 0.1139924024398471E+02 0.1142025705047962E+02 0.1144128433552578E+02 0.1146232211123331E+02 0.1148337038967921E+02 0.1150442918290690E+02 0.1152549850292635E+02 0.1154657836171509E+02 0.1156766877121638E+02 0.1158876974333961E+02 0.1160988128996192E+02 0.1163100342292520E+02 0.1165213615403900E+02 0.1167327949507859E+02 0.1169443345778498E+02 0.1171559805386622E+02 0.1173677329499617E+02 0.1175795919281455E+02 0.1177915575892700E+02 0.1180036300490579E+02 0.1182158094228856E+02 0.1184280958257915E+02 0.1186404893724685E+02 0.1188529901772762E+02 0.1190655983542237E+02 0.1192783140169806E+02 0.1194911372788769E+02 0.1197040682528970E+02 0.1199171070516803E+02 0.1201302537875296E+02 0.1203435085723962E+02 0.1205568715178919E+02 0.1207703427352811E+02 0.1209839223354848E+02 0.1211976104290818E+02 0.1214114071263091E+02 0.1216253125370503E+02 0.1218393267708453E+02 0.1220534499368958E+02 0.1222676821440496E+02 0.1224820235008141E+02 0.1226964741153520E+02 0.1229110340954733E+02 0.1231257035486524E+02 0.1233404825820068E+02 0.1235553713023114E+02 0.1237703698160018E+02 0.1239854782291576E+02 0.1242006966475194E+02 0.1244160251764720E+02 0.1246314639210712E+02 0.1248470129860064E+02 0.1250626724756299E+02 0.1252784424939512E+02 0.1254943231446288E+02 0.1257103145309731E+02 0.1259264167559508E+02 0.1261426299221796E+02 0.1263589541319379E+02 0.1265753894871477E+02 0.1267919360893930E+02 0.1270085940399096E+02 0.1272253634395807E+02 0.1274422443889557E+02 0.1276592369882235E+02 0.1278763413372411E+02 0.1280935575355105E+02 0.1283108856821895E+02 0.1285283258760953E+02 0.1287458782156935E+02 0.1289635427991064E+02 0.1291813197241135E+02 0.1293992090881460E+02 0.1296172109882920E+02 0.1298353255212942E+02 0.1300535527835513E+02 0.1302718928711147E+02 0.1304903458796954E+02 0.1307089119046614E+02 0.1309275910410295E+02 0.1311463833834799E+02 0.1313652890263444E+02 0.1315843080636154E+02 0.1318034405889441E+02 0.1320226866956276E+02 0.1322420464766316E+02 0.1324615200245751E+02 0.1326811074317337E+02 0.1329008087900448E+02 0.1331206241910968E+02 0.1333405537261467E+02 0.1335605974861005E+02 0.1337807555615254E+02 0.1340010280426523E+02 0.1342214150193681E+02 0.1344419165812167E+02 0.1346625328174062E+02 0.1348832638168022E+02 0.1351041096679353E+02 0.1353250704589885E+02 0.1355461462778115E+02 0.1357673372119115E+02 0.1359886433484638E+02 0.1362100647742997E+02 0.1364316015759144E+02 0.1366532538394614E+02 0.1368750216507624E+02 0.1370969050953028E+02 0.1373189042582217E+02 0.1375410192243334E+02 0.1377632500781127E+02 0.1379855969036910E+02 0.1382080597848685E+02 0.1384306388051198E+02 0.1386533340475719E+02 0.1388761455950183E+02 0.1390990735299232E+02 0.1393221179344152E+02 0.1395452788902909E+02 0.1397685564790063E+02 0.1399919507816944E+02 0.1402154618791462E+02 0.1404390898518284E+02 0.1406628347798727E+02 0.1408866967430708E+02 0.1411106758208999E+02 0.1413347720924909E+02 0.1415589856366520E+02 0.1417833165318584E+02 0.1420077648562560E+02 0.1422323306876623E+02 0.1424570141035628E+02 0.1426818151811159E+02 0.1429067339971510E+02 0.1431317706281675E+02 0.1433569251503422E+02 0.1435821976395167E+02 0.1438075881712129E+02 0.1440330968206166E+02 0.1442587236626011E+02 0.1444844687717011E+02 0.1447103322221295E+02 0.1449363140877790E+02 0.1451624144422053E+02 0.1453886333586524E+02 0.1456149709100336E+02 0.1458414271689378E+02 0.1460680022076286E+02 0.1462946960980574E+02 0.1465215089118382E+02 0.1467483217256191E+02 0.1469751345393999E+02 0.1472019473531807E+02 0.0000000000000000E+00 0.1353993104251454E-10 0.8388292241576100E-09 0.9249073098372293E-08 0.5030460210239372E-07 0.1857568627085415E-06 0.5369197789403567E-06 0.1310591025996369E-05 0.2826805415934704E-05 0.5547382204843158E-05 0.1010438933657199E-04 0.1732779196828242E-04 0.2827168149581216E-04 0.4423859602721504E-04 0.6680154505955162E-04 0.9782344112589946E-04 0.1394737204414197E-03 0.1942420040555485E-03 0.2649487116051849E-03 0.3547525922860875E-03 0.4671551828778767E-03 0.6060022412741116E-03 0.7754822366296253E-03 0.9801220045380374E-03 0.1224779698140599E-02 0.1514635184246249E-02 0.1855178047873591E-02 0.2252193379531577E-02 0.2711745527424523E-02 0.3240160001952968E-02 0.3844003722708506E-02 0.4530063798923195E-02 0.5305325033301281E-02 0.6176946336577127E-02 0.7152236236230247E-02 0.8238627657747143E-02 0.9443652150831976E-02 0.1077491372619769E-01 0.1224006246116400E-01 0.1384676802438050E-01 0.1560269326170134E-01 0.1751546797666743E-01 0.1959266303029807E-01 0.2184176487603834E-01 0.2427015063682662E-01 0.2688506382240104E-01 0.2969359077621229E-01 0.3270263793270082E-01 0.3591890995727141E-01 0.3934888883309312E-01 0.4299881395089809E-01 0.4687466325027261E-01 0.5098213545355013E-01 0.5532663342634311E-01 0.5991324869200370E-01 0.6474674712088738E-01 0.6983155580921956E-01 0.7517175115663279E-01 0.8077104814605506E-01 0.8663279082458433E-01 0.9275994397927995E-01 0.9915508599743368E-01 0.1058204028968442E+00 0.1127576835079031E+00 0.1199683157858993E+00 0.1274532842288529E+00 0.1352131683733934E+00 0.1432481423386811E+00 0.1515579753861312E+00 0.1601420334607315E+00 0.1689992816780165E+00 0.1781282877192849E+00 0.1875272260963912E+00 0.1971938832464155E+00 0.2071256634156783E+00 0.2173195952919433E+00 0.2277723393431911E+00 0.2384801958210745E+00 0.2494391133870441E+00 0.2606446983191641E+00 0.2720922242578070E+00 0.2837766424487163E+00 0.2956925924423432E+00 0.3078344132088888E+00 0.3201961546291090E+00 0.3327715893216590E+00 0.3455542247685515E+00 0.3585373157011766E+00 0.3717138767102711E+00 0.3850766950442213E+00 0.3986183435611380E+00 0.4123311938012285E+00 0.4262074291471305E+00 0.4402390580410298E+00 0.4544179272285823E+00 0.4687357350008659E+00 0.4831840444068136E+00 0.4977542964098284E+00 0.5124378229635098E+00 0.5272258599826819E+00 0.5421095601871498E+00 0.5570800057968556E+00 0.5721282210583372E+00 0.5872451845836121E+00 0.6024218414838124E+00 0.6176491152810919E+00 0.6329179195834939E+00 0.6482191695086116E+00 0.6635437928430084E+00 0.6788827409254566E+00 0.6942269992431367E+00 0.7095675977309721E+00 0.7248956207653083E+00 0.7402022168441228E+00 0.7554786079469059E+00 0.7707160985682907E+00 0.7859060844203938E+00 0.8010400607996875E+00 0.8161096306150647E+00 0.8311065120745426E+00 0.8460225460288135E+00 0.8608497029705907E+00 0.8755800896893798E+00 0.8902059555819789E+00 0.9047196986196469E+00 0.9191138709734521E+00 0.9333811842999254E+00 0.9475145146896305E+00 0.9615069072817952E+00 0.9753515805486259E+00 0.9890419302533513E+00 0.1002571533086473E+01 0.1015934149985090E+01 0.1029123729140496E+01 0.1042134408699634E+01 0.1054960519166231E+01 0.1067596585507774E+01 0.1080037328974709E+01 0.1092277668638490E+01 0.1104312722655314E+01 0.1116137809262549E+01 0.1127748447515049E+01 0.1139140357768670E+01 0.1150309461918440E+01 0.1161251883398932E+01 0.1171963946954482E+01 0.1182442178186937E+01 0.1192683302888721E+01 0.1202684246168965E+01 0.1212442131380551E+01 0.1221954278855855E+01 0.1231218204459002E+01 0.1240231617962418E+01 0.1248992421255417E+01 0.1257498706392534E+01 0.1265748753489242E+01 0.1273741028472617E+01 0.1281474180694483E+01 0.1288947040414400E+01 0.1296158616159860E+01 0.1303108091970871E+01 0.1309794824536052E+01 0.1316218340227214E+01 0.1322378332039313E+01 0.1328274656442483E+01 0.1333907330152773E+01 0.1339276526828055E+01 0.1344382573695405E+01 0.1349225948116168E+01 0.1353807274094698E+01 0.1358127318736686E+01 0.1362186988662762E+01 0.1365987326382977E+01 0.1369529506637536E+01 0.1372814832709058E+01 0.1375844732711431E+01 0.1378620755860210E+01 0.1381144568729309E+01 0.1383417951498597E+01 0.1385442794196838E+01 0.1387221092944273E+01 0.1388754946198940E+01 0.1390046551010727E+01 0.1391098199286932E+01 0.1391912274073011E+01 0.1392491245851972E+01 0.1392837668865793E+01 0.1392954177462024E+01 0.1392843482468616E+01 0.1392508367599889E+01 0.1391951685896345E+01 0.1391176356200982E+01 0.1390185359674514E+01 0.1388981736351864E+01 0.1387568581742103E+01 0.1385949043473885E+01 0.1384126317988323E+01 0.1382103647281089E+01 0.1379884315695416E+01 0.1377471646767576E+01 0.1374869000126249E+01 0.1372079768447110E+01 0.1369107374463862E+01 0.1365955268036790E+01 0.1362626923279866E+01 0.1359125835747256E+01 0.1355455519680076E+01 0.1351619505314043E+01 0.1347621336248676E+01 0.1343464566878517E+01 0.1339152759886839E+01 0.1334689483802160E+01 0.1330078310617843E+01 0.1325322813474955E+01 0.1320426564408511E+01 0.1315393132157122E+01 0.1310226080036051E+01 0.1304928963873535E+01 0.1299505330010257E+01 0.1293958713361729E+01 0.1288292635543297E+01 0.1282510603057466E+01 0.1276616105543136E+01 0.1270612614086314E+01 0.1264503579591840E+01 0.1258292431215576E+01 0.1251982574856509E+01 0.1245577391708143E+01 0.1239080236868539E+01 0.1232494438008325E+01 0.1225823294095955E+01 0.1219070074179471E+01 0.1212238016223985E+01 0.1205330326004104E+01 0.1198350176050432E+01 0.1191300704649328E+01 0.1184185014895046E+01 0.1177006173793340E+01 0.1169767211415667E+01 0.1162471120103017E+01 0.1155120853718478E+01 0.1147719326947540E+01 0.1140269414645216E+01 0.1132773951228974E+01 0.1125235730116526E+01 0.1117657503207466E+01 0.1110041980407784E+01 0.1102391829196240E+01 0.1094709674231619E+01 0.1086998096999836E+01 0.1079259635499933E+01 0.1071496783967914E+01 0.1063711992637463E+01 0.1055907667536516E+01 0.1048086170318704E+01 0.1040249818128692E+01 0.1032400883500383E+01 0.1024541594287072E+01 0.1016674133622509E+01 0.1008800639911969E+01 0.1000923206852306E+01 0.9930438834801176E+00 0.9851646742469989E+00 0.9772875391210279E+00 0.9694143937135093E+00 0.9615471094301068E+00 0.9536875136454389E+00 0.9458373899002650E+00 0.9379984781203971E+00 0.9301724748564474E+00 0.9223610335436100E+00 0.9145657647805825E+00 0.9067882366268739E+00 0.8990299749176214E+00 0.8912924635951891E+00 0.8835771450567167E+00 0.8758854205168844E+00 0.8682186503851309E+00 0.8605781546565948E+00 0.8529652133160540E+00 0.8453810667541574E+00 0.8378269161952663E+00 0.8303039241362116E+00 0.8228132147953376E+00 0.8153558745711390E+00 0.8079329525099168E+00 0.8005454607817869E+00 0.7931943751644794E+00 0.7858806355343143E+00 0.7786051463638074E+00 0.7713687772253328E+00 0.7641723633003079E+00 0.7570167058933844E+00 0.7499025729511121E+00 0.7428306995846062E+00 0.7358017885957079E+00 0.7288165110062022E+00 0.7218755065895981E+00 0.7149793844050807E+00 0.7081287233331618E+00 0.7013240726126531E+00 0.6945659523785421E+00 0.6878548542003931E+00 0.6811912416209033E+00 0.6745755506942478E+00 0.6680081905238785E+00 0.6614895437994238E+00 0.6550199673323996E+00 0.6485997925903795E+00 0.6422293262293763E+00 0.6359088506240991E+00 0.6296386243958603E+00 0.6234188829378302E+00 0.6172498389374158E+00 0.6111316828955082E+00 0.6050645836423746E+00 0.5990486888499783E+00 0.5930841255405085E+00 0.5871710005909401E+00 0.5813094012334057E+00 0.5754993955512363E+00 0.5697410329704640E+00 0.5640343447466610E+00 0.5583793444469337E+00 0.5527760284269526E+00 0.5472243763028636E+00 0.5417243514179740E+00 0.5362759013040796E+00 0.5308789581373305E+00 0.5255334391885358E+00 0.5202392472678002E+00 0.5149962711634282E+00 0.5098043860749818E+00 0.5046634540404551E+00 0.4995733243574682E+00 0.4945338339984403E+00 0.4895448080196743E+00 0.4846060599643165E+00 0.4797173922591353E+00 0.4748785966051021E+00 0.4700894543617143E+00 0.4653497369250721E+00 0.4606592060996474E+00 0.4560176144637674E+00 0.4514247057287724E+00 0.4468802150918596E+00 0.4423838695826035E+00 0.4379353884031551E+00 0.4335344832621323E+00 0.4291808587022021E+00 0.4248742124213836E+00 0.4206142355880688E+00 0.4164006131498095E+00 0.4122330241358657E+00 0.4081111419535712E+00 0.4040346346785266E+00 0.4000031653386660E+00 0.3960163921922264E+00 0.3920739689996687E+00 0.3881755452895829E+00 0.3843207666186236E+00 0.3805092748255328E+00 0.3767407082792822E+00 0.3730147021214013E+00 0.3693308885025316E+00 0.3656888968132757E+00 0.3620883539093817E+00 0.3585288843313358E+00 0.3550101105184098E+00 0.3515316530172374E+00 0.3480931306849715E+00 0.3446941608870878E+00 0.3413343596899074E+00 0.3380133420478924E+00 0.3347307219857906E+00 0.3314861127756896E+00 0.3282791271090590E+00 0.3251093772638369E+00 0.3219764752666408E+00 0.3188800330501668E+00 0.3158196626058555E+00 0.3127949761318864E+00 0.3098055861765790E+00 0.3068511057772733E+00 0.3039311485947566E+00 0.3010453290433147E+00 0.2981932624164749E+00 0.2953745650085209E+00 0.2925888542318437E+00 0.2898357487302072E+00 0.2871148684879984E+00 0.2844258349355381E+00 0.2817682710505188E+00 0.2791418014556485E+00 0.2765460525125659E+00 0.2739806524121053E+00 0.2714452312609780E+00 0.2689394211649400E+00 0.2664628563085241E+00 0.2640151730313972E+00 0.2615960099014194E+00 0.2592050077844695E+00 0.2568418099111116E+00 0.2545060619401636E+00 0.2521974120192415E+00 0.2499155108423418E+00 0.2476600117045342E+00 0.2454305705538249E+00 0.2432268460402566E+00 0.2410484995623153E+00 0.2388951953107000E+00 0.2367666003095238E+00 0.2346623844550057E+00 0.2325822205517195E+00 0.2305257843464541E+00 0.2284927545597522E+00 0.2264828129151803E+00 0.2244956441663966E+00 0.2225309361220672E+00 0.2205883796686914E+00 0.2186676687913947E+00 0.2167685005927387E+00 0.2148905753096101E+00 0.2130335963282359E+00 0.2111972701973850E+00 0.2093813066398013E+00 0.2075854185619259E+00 0.2058093220619543E+00 0.2040527364362842E+00 0.2023153841843948E+00 0.2005969910122156E+00 0.1988972858340233E+00 0.1972160007729189E+00 0.1955528711599284E+00 0.1939076355317738E+00 0.1922800356273561E+00 0.1906698163829959E+00 0.1890767259264730E+00 0.1875005155699057E+00 0.1859409398015150E+00 0.1843977562763068E+00 0.1828707258057186E+00 0.1813596123462640E+00 0.1798641829872162E+00 0.1783842079373634E+00 0.1769194605108787E+00 0.1754697171123329E+00 0.1740347572208903E+00 0.1726143633737163E+00 0.1712083211486371E+00 0.1698164191460766E+00 0.1684384489703060E+00 0.1670742052100373E+00 0.1657234854183902E+00 0.1643860900922608E+00 0.1630618226511230E+00 0.1617504894152905E+00 0.1604518995836656E+00 0.1591658652110027E+00 0.1578922011847117E+00 0.1566307252012296E+00 0.1553812577419816E+00 0.1541436220489565E+00 0.1529176440999246E+00 0.1517031525833137E+00 0.1504999788727721E+00 0.1493079570014363E+00 0.1481269236359270E+00 0.1469567180500930E+00 0.1457971820985229E+00 0.1446481601898438E+00 0.1435094992598286E+00 0.1423810487443264E+00 0.1412626605520352E+00 0.1401541890371375E+00 0.1390554909718100E+00 0.1379664255186285E+00 0.1368868542028802E+00 0.1358166408848024E+00 0.1347556517317591E+00 0.1337037551903719E+00 0.1326608219586172E+00 0.1316267249579071E+00 0.1306013393051614E+00 0.1295845422848884E+00 0.1285762133212826E+00 0.1275762339503552E+00 0.1265844877921041E+00 0.1256008605227379E+00 0.1246252398469633E+00 0.1236575154703454E+00 0.1226975790717512E+00 0.1217453242758857E+00 0.1208006466259300E+00 0.1198634435562893E+00 0.1189336143654594E+00 0.1180110601890202E+00 0.1170956839727626E+00 0.1161873904459593E+00 0.1152860860947805E+00 0.1143916791358692E+00 0.1135040794900743E+00 0.1126231987563555E+00 0.1117489501858582E+00 0.1108812486561707E+00 0.1100200106457653E+00 0.1091651542086276E+00 0.1083165989490820E+00 0.1074742659968154E+00 0.1066380779821052E+00 0.1058079590112519E+00 0.1049838346422265E+00 0.1041656318605295E+00 0.1033532790552702E+00 0.1025467059954647E+00 0.1017458438065610E+00 0.1009506249471885E+00 0.1001609831861390E+00 0.9937685357957692E-01 0.9859817244848566E-01 0.9782487735634983E-01 0.9705690708707349E-01 0.9629420162313919E-01 0.9553670212400750E-01 0.9478435090475915E-01 0.9403709141497944E-01 0.9329486821788784E-01 0.9255762696971309E-01 0.9182531439931366E-01 0.9109787828804443E-01 0.9037526744987140E-01 0.8965743171173354E-01 0.8894432189415159E-01 0.8823588979208480E-01 0.8753208815603555E-01 0.8683287067340226E-01 0.8613819195007733E-01 0.8544800749229453E-01 0.8476227368872161E-01 0.8408094779279952E-01 0.8340398790532604E-01 0.8273135295728512E-01 0.8206300269292026E-01 0.8139889765304979E-01 0.8073899915862499E-01 0.8008326929452908E-01 0.7943167089361686E-01 0.7878416752099129E-01 0.7814072345852002E-01 0.7750130368958605E-01 0.7686587388407512E-01 0.7623440038359473E-01 0.7560685018692687E-01 0.7498319093571042E-01 0.7436339090035288E-01 0.7374741896616860E-01 0.7313524461974377E-01 0.7252683793552536E-01 0.7192216956263091E-01 0.7132121071188088E-01 0.7072393314304767E-01 0.7013030915232332E-01 0.6954031156000041E-01 0.6895391369836718E-01 0.6837108939981353E-01 0.6779181298514624E-01 0.6721605925211059E-01 0.6664380346411826E-01 0.6607502133917825E-01 0.6550968903902774E-01 0.6494778315846379E-01 0.6438928071487048E-01 0.6383415913794230E-01 0.6328239625959906E-01 0.6273397030409252E-01 0.6218885987830131E-01 0.6164704396221248E-01 0.6110850189958664E-01 0.6057321338880634E-01 0.6004115847390429E-01 0.5951231753576908E-01 0.5898667128352685E-01 0.5846420074609691E-01 0.5794488726391903E-01 0.5742871248084910E-01 0.5691565833622340E-01 0.5640570705708669E-01 0.5589884115058460E-01 0.5539504339651542E-01 0.5489429684004177E-01 0.5439658478455860E-01 0.5390189078471544E-01 0.5341019863959112E-01 0.5292149238601910E-01 0.5243575629206128E-01 0.5195297485062703E-01 0.5147313277323774E-01 0.5099621498393213E-01 0.5052220661331305E-01 0.5005109299273101E-01 0.4958285964860470E-01 0.4911749229687554E-01 0.4865497683759399E-01 0.4819529934963621E-01 0.4773844608554897E-01 0.4728440346652141E-01 0.4683315807748007E-01 0.4638469666230777E-01 0.4593900611918208E-01 0.4549607349603369E-01 0.4505588598612064E-01 0.4461843092371864E-01 0.4418369577992455E-01 0.4375166815857148E-01 0.4332233579225347E-01 0.4289568653845881E-01 0.4247170837580991E-01 0.4205038940040735E-01 0.4163171782227736E-01 0.4121568196192090E-01 0.4080227024696274E-01 0.4039147120889799E-01 0.3998327347993617E-01 0.3957766578994016E-01 0.3917463696345855E-01 0.3877417591685010E-01 0.3837627165549899E-01 0.3798091327111933E-01 0.3758808993914695E-01 0.3719779091621782E-01 0.3681000553773126E-01 0.3642472321549702E-01 0.3604193343546399E-01 0.3566162575553031E-01 0.3528378980343305E-01 0.3490841527471608E-01 0.3453549193077510E-01 0.3416500959697864E-01 0.3379695816086406E-01 0.3343132757040658E-01 0.3306810783236118E-01 0.3270728901067565E-01 0.3234886122497425E-01 0.3199281464910996E-01 0.3163913950978563E-01 0.3128782608524168E-01 0.3093886470401072E-01 0.3059224574373675E-01 0.3024795963005924E-01 0.2990599683556058E-01 0.2956634787877624E-01 0.2922900332326631E-01 0.2889395377674870E-01 0.2856118989029233E-01 0.2823070235756949E-01 0.2790248191416771E-01 0.2757651933695894E-01 0.2725280544352705E-01 0.2693133109165141E-01 0.2661208717884729E-01 0.2629506464196176E-01 0.2598025445682497E-01 0.2566764763795566E-01 0.2535723523832159E-01 0.2504900834915327E-01 0.2474295809981158E-01 0.2443907565770799E-01 0.2413735222827780E-01 0.2383777905500606E-01 0.2354034741950517E-01 0.2324504864164501E-01 0.2295187407973472E-01 0.2266081513075604E-01 0.2237186323064830E-01 0.2208500985464502E-01 0.2180024651766184E-01 0.2151756477473634E-01 0.2123695622151859E-01 0.2095841249481422E-01 0.2068192527317876E-01 0.2040748627756411E-01 0.2013508727201714E-01 0.1986472006443057E-01 0.1959637650734679E-01 0.1933004849881481E-01 0.1906572798330038E-01 0.1880340695265023E-01 0.1854307744711091E-01 0.1828473155640220E-01 0.1802836142084625E-01 0.1777395923255295E-01 0.1752151723666215E-01 0.1727102773264334E-01 0.1702248307565384E-01 0.1677587567795624E-01 0.1653119801039607E-01 0.1628844260394024E-01 0.1604760205127793E-01 0.1580866900848456E-01 0.1557163619674996E-01 0.1533649640417201E-01 0.1510324248761716E-01 0.1487186737464884E-01 0.1464236406552526E-01 0.1441472563526792E-01 0.1418894523580252E-01 0.1396501609817369E-01 0.1374293153483488E-01 0.1352268494201562E-01 0.1330426980216726E-01 0.1308767968648953E-01 0.1287290825753935E-01 0.1265994927192371E-01 0.1244879658307933E-01 0.1223944414413996E-01 0.1203188601089432E-01 0.1182611634483635E-01 0.1162212941630988E-01 0.1141991960775031E-01 0.1121948141702494E-01 0.1102080946087490E-01 0.1082389847846042E-01 0.1062874333501194E-01 0.1043533902558977E-01 0.1024368067895393E-01 0.1005376356154735E-01 0.9865583081593922E-02 0.9679134793314684E-02 0.9494414401263529E-02 0.9311417764785166E-02 0.9130140902597625E-02 0.8950579997500882E-02 0.8772731401214267E-02 0.8596591639343950E-02 0.8422157416482423E-02 0.8249425621441884E-02 0.8078393332622082E-02 0.7909057823514530E-02 0.7741416568343256E-02 0.7575467247842871E-02 0.7411207755174127E-02 0.7248636201976184E-02 0.7087750924555473E-02 0.6928550490209059E-02 0.6771033703680868E-02 0.6615199613748215E-02 0.6461047519934641E-02 0.6308576979345235E-02 0.6157787813618597E-02 0.6008680115989046E-02 0.5861254258451652E-02 0.5715510899020261E-02 0.5571450989068522E-02 0.5429075780740853E-02 0.5288386834419521E-02 0.5149386026230897E-02 0.5012075555572173E-02 0.4876457952637328E-02 0.4742536085917297E-02 0.4610313169647435E-02 0.4479792771170533E-02 0.4350978818180493E-02 0.4223875605807347E-02 0.4098487803498918E-02 0.3974820461650163E-02 0.3852879017924298E-02 0.3732669303204216E-02 0.3614197547105479E-02 0.3497470382973937E-02 0.3382494852283408E-02 0.3269278408338597E-02 0.3157828919178777E-02 0.3048154669566634E-02 0.2940264361933685E-02 0.2834167116141327E-02 0.2729872467901025E-02 0.2627390365681719E-02 0.2526731165915232E-02 0.2427905626291050E-02 0.2330924896912227E-02 0.2235800509061165E-02 0.2142544361300639E-02 0.2051168702609613E-02 0.1961686112225166E-02 0.1874109475832896E-02 0.1788451957715710E-02 0.1704726968437611E-02 0.1622948127603452E-02 0.1543129221197582E-02 0.1465284152965789E-02 0.1389426889263572E-02 0.1315571396752711E-02 0.1243731572285281E-02 0.1173921164272465E-02 0.1106153684794404E-02 0.1040442311668004E-02 0.9767997796547971E-03 0.9152382599604941E-03 0.8557692271559906E-03 0.7984033126378760E-03 0.7431501437484684E-03 0.6900181676963877E-03 0.6390144594619438E-03 0.5901445129451447E-03 0.5434120147240581E-03 0.4988185999463610E-03 0.4563635900883120E-03 0.4160437125934487E-03 0.3778528027632167E-03 0.3417814887280997E-03 0.3078168608981688E-03 0.2759421279962239E-03 0.2461362626341978E-03 0.2183736404266527E-03 0.1926236778641105E-03 0.1688504756124491E-03 0.1470124755772384E-03 0.1270621419785909E-03 0.1089456788163143E-03 0.9260279843818645E-04 0.7796655839983218E-04 0.6496328632466781E-04 0.5351261488371726E-04 0.4352765109263255E-04 0.3491530554961739E-04 0.2757680758595959E-04 0.2140843101578471E-04 0.1630245156608879E-04 0.1214835033531085E-04 0.8834266891203550E-05 0.6248690035680286E-05 0.4282353222462611E-05 0.2830275035848309E-05 0.1793853932613698E-05 0.1082893085919590E-05 0.6174003285747537E-06 0.3289872539180627E-06 0.1616905202076728E-06 0.7206870776681014E-07 0.2849911999804606E-07 0.9712198708650968E-08 0.2742442283547959E-08 0.6076172112450161E-09 0.9772731077597771E-10 0.1017048852958432E-10 0.5734341782146348E-12 0.1311491489053561E-13 0.7338688834175233E-16 0.3808514445153469E-19 0.2185032842849075E-24 0.4450194794086531E-34 0.4448435176905321E-58 0.1173305758391880E-217 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.1353993104251454E-10 0.8388292241576100E-09 0.9249073098372293E-08 0.5030460210239372E-07 0.1857568627085415E-06 0.5369197789403567E-06 0.1310591025996369E-05 0.2826805415934704E-05 0.5547382204843158E-05 0.1010438933657199E-04 0.1732779196828242E-04 0.2827168149581216E-04 0.4423859602721504E-04 0.6680154505955162E-04 0.9782344112589946E-04 0.1394737204414197E-03 0.1942420040555485E-03 0.2649487116051849E-03 0.3547525922860875E-03 0.4671551828778767E-03 0.6060022412741116E-03 0.7754822366296253E-03 0.9801220045380374E-03 0.1224779698140599E-02 0.1514635184246249E-02 0.1855178047873591E-02 0.2252193379531577E-02 0.2711745527424523E-02 0.3240160001952968E-02 0.3844003722708506E-02 0.4530063798923195E-02 0.5305325033301281E-02 0.6176946336577127E-02 0.7152236236230247E-02 0.8238627657747143E-02 0.9443652150831976E-02 0.1077491372619769E-01 0.1224006246116400E-01 0.1384676802438050E-01 0.1560269326170134E-01 0.1751546797666743E-01 0.1959266303029807E-01 0.2184176487603834E-01 0.2427015063682662E-01 0.2688506382240104E-01 0.2969359077621229E-01 0.3270263793270082E-01 0.3591890995727141E-01 0.3934888883309312E-01 0.4299881395089809E-01 0.4687466325027261E-01 0.5098213545355013E-01 0.5532663342634311E-01 0.5991324869200370E-01 0.6474674712088738E-01 0.6983155580921956E-01 0.7517175115663279E-01 0.8077104814605506E-01 0.8663279082458433E-01 0.9275994397927995E-01 0.9915508599743368E-01 0.1058204028968442E+00 0.1127576835079031E+00 0.1199683157858993E+00 0.1274532842288529E+00 0.1352131683733934E+00 0.1432481423386811E+00 0.1515579753861312E+00 0.1601420334607315E+00 0.1689992816780165E+00 0.1781282877192849E+00 0.1875272260963912E+00 0.1971938832464155E+00 0.2071256634156783E+00 0.2173195952919433E+00 0.2277723393431911E+00 0.2384801958210745E+00 0.2494391133870441E+00 0.2606446983191641E+00 0.2720922242578070E+00 0.2837766424487163E+00 0.2956925924423432E+00 0.3078344132088888E+00 0.3201961546291090E+00 0.3327715893216590E+00 0.3455542247685515E+00 0.3585373157011766E+00 0.3717138767102711E+00 0.3850766950442213E+00 0.3986183435611380E+00 0.4123311938012285E+00 0.4262074291471305E+00 0.4402390580410298E+00 0.4544179272285823E+00 0.4687357350008659E+00 0.4831840444068136E+00 0.4977542964098284E+00 0.5124378229635098E+00 0.5272258599826819E+00 0.5421095601871498E+00 0.5570800057968556E+00 0.5721282210583372E+00 0.5872451845836121E+00 0.6024218414838124E+00 0.6176491152810919E+00 0.6329179195834939E+00 0.6482191695086116E+00 0.6635437928430084E+00 0.6788827409254566E+00 0.6942269992431367E+00 0.7095675977309721E+00 0.7248956207653083E+00 0.7402022168441228E+00 0.7554786079469059E+00 0.7707160985682907E+00 0.7859060844203938E+00 0.8010400607996875E+00 0.8161096306150647E+00 0.8311065120745426E+00 0.8460225460288135E+00 0.8608497029705907E+00 0.8755800896893798E+00 0.8902059555819789E+00 0.9047196986196469E+00 0.9191138709734521E+00 0.9333811842999254E+00 0.9475145146896305E+00 0.9615069072817952E+00 0.9753515805486259E+00 0.9890419302533513E+00 0.1002571533086473E+01 0.1015934149985090E+01 0.1029123729140496E+01 0.1042134408699634E+01 0.1054960519166231E+01 0.1067596585507774E+01 0.1080037328974709E+01 0.1092277668638490E+01 0.1104312722655314E+01 0.1116137809262549E+01 0.1127748447515049E+01 0.1139140357768670E+01 0.1150309461918440E+01 0.1161251883398932E+01 0.1171963946954482E+01 0.1182442178186937E+01 0.1192683302888721E+01 0.1202684246168965E+01 0.1212442131380551E+01 0.1221954278855855E+01 0.1231218204459002E+01 0.1240231617962418E+01 0.1248992421255417E+01 0.1257498706392534E+01 0.1265748753489242E+01 0.1273741028472617E+01 0.1281474180694483E+01 0.1288947040414400E+01 0.1296158616159860E+01 0.1303108091970871E+01 0.1309794824536052E+01 0.1316218340227214E+01 0.1322378332039313E+01 0.1328274656442483E+01 0.1333907330152773E+01 0.1339276526828055E+01 0.1344382573695405E+01 0.1349225948116168E+01 0.1353807274094698E+01 0.1358127318736686E+01 0.1362186988662762E+01 0.1365987326382977E+01 0.1369529506637536E+01 0.1372814832709058E+01 0.1375844732711431E+01 0.1378620755860210E+01 0.1381144568729309E+01 0.1383417951498597E+01 0.1385442794196838E+01 0.1387221092944273E+01 0.1388754946198940E+01 0.1390046551010727E+01 0.1391098199286932E+01 0.1391912274073011E+01 0.1392491245851972E+01 0.1392837668865793E+01 0.1392954177462024E+01 0.1392843482468616E+01 0.1392508367599889E+01 0.1391951685896345E+01 0.1391176356200982E+01 0.1390185359674514E+01 0.1388981736351864E+01 0.1387568581742103E+01 0.1385949043473885E+01 0.1384126317988323E+01 0.1382103647281089E+01 0.1379884315695416E+01 0.1377471646767576E+01 0.1374869000126249E+01 0.1372079768447110E+01 0.1369107374463862E+01 0.1365955268036790E+01 0.1362626923279866E+01 0.1359125835747256E+01 0.1355455519680076E+01 0.1351619505314043E+01 0.1347621336248676E+01 0.1343464566878517E+01 0.1339152759886839E+01 0.1334689483802160E+01 0.1330078310617843E+01 0.1325322813474955E+01 0.1320426564408511E+01 0.1315393132157122E+01 0.1310226080036051E+01 0.1304928963873535E+01 0.1299505330010257E+01 0.1293958713361729E+01 0.1288292635543297E+01 0.1282510603057466E+01 0.1276616105543136E+01 0.1270612614086314E+01 0.1264503579591840E+01 0.1258292431215576E+01 0.1251982574856509E+01 0.1245577391708143E+01 0.1239080236868539E+01 0.1232494438008325E+01 0.1225823294095955E+01 0.1219070074179471E+01 0.1212238016223985E+01 0.1205330326004104E+01 0.1198350176050432E+01 0.1191300704649328E+01 0.1184185014895046E+01 0.1177006173793340E+01 0.1169767211415667E+01 0.1162471120103017E+01 0.1155120853718478E+01 0.1147719326947540E+01 0.1140269414645216E+01 0.1132773951228974E+01 0.1125235730116526E+01 0.1117657503207466E+01 0.1110041980407784E+01 0.1102391829196240E+01 0.1094709674231619E+01 0.1086998096999836E+01 0.1079259635499933E+01 0.1071496783967914E+01 0.1063711992637463E+01 0.1055907667536516E+01 0.1048086170318704E+01 0.1040249818128692E+01 0.1032400883500383E+01 0.1024541594287072E+01 0.1016674133622509E+01 0.1008800639911969E+01 0.1000923206852306E+01 0.9930438834801176E+00 0.9851646742469989E+00 0.9772875391210279E+00 0.9694143937135093E+00 0.9615471094301068E+00 0.9536875136454389E+00 0.9458373899002650E+00 0.9379984781203971E+00 0.9301724748564474E+00 0.9223610335436100E+00 0.9145657647805825E+00 0.9067882366268739E+00 0.8990299749176214E+00 0.8912924635951891E+00 0.8835771450567167E+00 0.8758854205168844E+00 0.8682186503851309E+00 0.8605781546565948E+00 0.8529652133160540E+00 0.8453810667541574E+00 0.8378269161952663E+00 0.8303039241362116E+00 0.8228132147953376E+00 0.8153558745711390E+00 0.8079329525099168E+00 0.8005454607817869E+00 0.7931943751644794E+00 0.7858806355343143E+00 0.7786051463638074E+00 0.7713687772253328E+00 0.7641723633003079E+00 0.7570167058933844E+00 0.7499025729511121E+00 0.7428306995846062E+00 0.7358017885957079E+00 0.7288165110062022E+00 0.7218755065895981E+00 0.7149793844050807E+00 0.7081287233331618E+00 0.7013240726126531E+00 0.6945659523785421E+00 0.6878548542003931E+00 0.6811912416209033E+00 0.6745755506942478E+00 0.6680081905238785E+00 0.6614895437994238E+00 0.6550199673323996E+00 0.6485997925903795E+00 0.6422293262293763E+00 0.6359088506240991E+00 0.6296386243958603E+00 0.6234188829378302E+00 0.6172498389374158E+00 0.6111316828955082E+00 0.6050645836423746E+00 0.5990486888499783E+00 0.5930841255405085E+00 0.5871710005909401E+00 0.5813094012334057E+00 0.5754993955512363E+00 0.5697410329704640E+00 0.5640343447466610E+00 0.5583793444469337E+00 0.5527760284269526E+00 0.5472243763028636E+00 0.5417243514179740E+00 0.5362759013040796E+00 0.5308789581373305E+00 0.5255334391885358E+00 0.5202392472678002E+00 0.5149962711634282E+00 0.5098043860749818E+00 0.5046634540404551E+00 0.4995733243574682E+00 0.4945338339984403E+00 0.4895448080196743E+00 0.4846060599643165E+00 0.4797173922591353E+00 0.4748785966051021E+00 0.4700894543617143E+00 0.4653497369250721E+00 0.4606592060996474E+00 0.4560176144637674E+00 0.4514247057287724E+00 0.4468802150918596E+00 0.4423838695826035E+00 0.4379353884031551E+00 0.4335344832621323E+00 0.4291808587022021E+00 0.4248742124213836E+00 0.4206142355880688E+00 0.4164006131498095E+00 0.4122330241358657E+00 0.4081111419535712E+00 0.4040346346785266E+00 0.4000031653386660E+00 0.3960163921922264E+00 0.3920739689996687E+00 0.3881755452895829E+00 0.3843207666186236E+00 0.3805092748255328E+00 0.3767407082792822E+00 0.3730147021214013E+00 0.3693308885025316E+00 0.3656888968132757E+00 0.3620883539093817E+00 0.3585288843313358E+00 0.3550101105184098E+00 0.3515316530172374E+00 0.3480931306849715E+00 0.3446941608870878E+00 0.3413343596899074E+00 0.3380133420478924E+00 0.3347307219857906E+00 0.3314861127756896E+00 0.3282791271090590E+00 0.3251093772638369E+00 0.3219764752666408E+00 0.3188800330501668E+00 0.3158196626058555E+00 0.3127949761318864E+00 0.3098055861765790E+00 0.3068511057772733E+00 0.3039311485947566E+00 0.3010453290433147E+00 0.2981932624164749E+00 0.2953745650085209E+00 0.2925888542318437E+00 0.2898357487302072E+00 0.2871148684879984E+00 0.2844258349355381E+00 0.2817682710505188E+00 0.2791418014556485E+00 0.2765460525125659E+00 0.2739806524121053E+00 0.2714452312609780E+00 0.2689394211649400E+00 0.2664628563085241E+00 0.2640151730313972E+00 0.2615960099014194E+00 0.2592050077844695E+00 0.2568418099111116E+00 0.2545060619401636E+00 0.2521974120192415E+00 0.2499155108423418E+00 0.2476600117045342E+00 0.2454305705538249E+00 0.2432268460402566E+00 0.2410484995623153E+00 0.2388951953107000E+00 0.2367666003095238E+00 0.2346623844550057E+00 0.2325822205517195E+00 0.2305257843464541E+00 0.2284927545597522E+00 0.2264828129151803E+00 0.2244956441663966E+00 0.2225309361220672E+00 0.2205883796686914E+00 0.2186676687913947E+00 0.2167685005927387E+00 0.2148905753096101E+00 0.2130335963282359E+00 0.2111972701973850E+00 0.2093813066398013E+00 0.2075854185619259E+00 0.2058093220619543E+00 0.2040527364362842E+00 0.2023153841843948E+00 0.2005969910122156E+00 0.1988972858340233E+00 0.1972160007729189E+00 0.1955528711599284E+00 0.1939076355317738E+00 0.1922800356273561E+00 0.1906698163829959E+00 0.1890767259264730E+00 0.1875005155699057E+00 0.1859409398015150E+00 0.1843977562763068E+00 0.1828707258057186E+00 0.1813596123462640E+00 0.1798641829872162E+00 0.1783842079373634E+00 0.1769194605108787E+00 0.1754697171123329E+00 0.1740347572208903E+00 0.1726143633737163E+00 0.1712083211486371E+00 0.1698164191460766E+00 0.1684384489703060E+00 0.1670742052100373E+00 0.1657234854183902E+00 0.1643860900922608E+00 0.1630618226511230E+00 0.1617504894152905E+00 0.1604518995836656E+00 0.1591658652110027E+00 0.1578922011847117E+00 0.1566307252012296E+00 0.1553812577419816E+00 0.1541436220489565E+00 0.1529176440999246E+00 0.1517031525833137E+00 0.1504999788727721E+00 0.1493079570014363E+00 0.1481269236359270E+00 0.1469567180500930E+00 0.1457971820985229E+00 0.1446481601898438E+00 0.1435094992598286E+00 0.1423810487443264E+00 0.1412626605520352E+00 0.1401541890371375E+00 0.1390554909718100E+00 0.1379664255186285E+00 0.1368868542028802E+00 0.1358166408848024E+00 0.1347556517317591E+00 0.1337037551903719E+00 0.1326608219586172E+00 0.1316267249579071E+00 0.1306013393051614E+00 0.1295845422848884E+00 0.1285762133212826E+00 0.1275762339503552E+00 0.1265844877921041E+00 0.1256008605227379E+00 0.1246252398469633E+00 0.1236575154703454E+00 0.1226975790717512E+00 0.1217453242758857E+00 0.1208006466259300E+00 0.1198634435562893E+00 0.1189336143654594E+00 0.1180110601890202E+00 0.1170956839727626E+00 0.1161873904459593E+00 0.1152860860947805E+00 0.1143916791358692E+00 0.1135040794900743E+00 0.1126231987563555E+00 0.1117489501858582E+00 0.1108812486561707E+00 0.1100200106457653E+00 0.1091651542086276E+00 0.1083165989490820E+00 0.1074742659968154E+00 0.1066380779821052E+00 0.1058079590112519E+00 0.1049838346422265E+00 0.1041656318605295E+00 0.1033532790552702E+00 0.1025467059954647E+00 0.1017458438065610E+00 0.1009506249471885E+00 0.1001609831861390E+00 0.9937685357957692E-01 0.9859817244848566E-01 0.9782487735634983E-01 0.9705690708707349E-01 0.9629420162313919E-01 0.9553670212400750E-01 0.9478435090475915E-01 0.9403709141497944E-01 0.9329486821788784E-01 0.9255762696971309E-01 0.9182531439931366E-01 0.9109787828804443E-01 0.9037526744987140E-01 0.8965743171173354E-01 0.8894432189415159E-01 0.8823588979208480E-01 0.8753208815603555E-01 0.8683287067340226E-01 0.8613819195007733E-01 0.8544800749229453E-01 0.8476227368872161E-01 0.8408094779279952E-01 0.8340398790532604E-01 0.8273135295728512E-01 0.8206300269292026E-01 0.8139889765304979E-01 0.8073899915862499E-01 0.8008326929452908E-01 0.7943167089361686E-01 0.7878416752099129E-01 0.7814072345852002E-01 0.7750130368958605E-01 0.7686587388407512E-01 0.7623440038359473E-01 0.7560685018692687E-01 0.7498319093571042E-01 0.7436339090035288E-01 0.7374741896616860E-01 0.7313524461974377E-01 0.7252683793552536E-01 0.7192216956263091E-01 0.7132121071188088E-01 0.7072393314304767E-01 0.7013030915232332E-01 0.6954031156000041E-01 0.6895391369836718E-01 0.6837108939981353E-01 0.6779181298514624E-01 0.6721605925211059E-01 0.6664380346411826E-01 0.6607502133917825E-01 0.6550968903902774E-01 0.6494778315846379E-01 0.6438928071487048E-01 0.6383415913794230E-01 0.6328239625959906E-01 0.6273397030409252E-01 0.6218885987830131E-01 0.6164704396221248E-01 0.6110850189958664E-01 0.6057321338880634E-01 0.6004115847390429E-01 0.5951231753576908E-01 0.5898667128352685E-01 0.5846420074609691E-01 0.5794488726391903E-01 0.5742871248084910E-01 0.5691565833622340E-01 0.5640570705708669E-01 0.5589884115058460E-01 0.5539504339651542E-01 0.5489429684004177E-01 0.5439658478455860E-01 0.5390189078471544E-01 0.5341019863959112E-01 0.5292149238601910E-01 0.5243575629206128E-01 0.5195297485062703E-01 0.5147313277323774E-01 0.5099621498393213E-01 0.5052220661331305E-01 0.5005109299273101E-01 0.4958285964860470E-01 0.4911749229687554E-01 0.4865497683759399E-01 0.4819529934963621E-01 0.4773844608554897E-01 0.4728440346652141E-01 0.4683315807748007E-01 0.4638469666230777E-01 0.4593900611918208E-01 0.4549607349603369E-01 0.4505588598612064E-01 0.4461843092371864E-01 0.4418369577992455E-01 0.4375166815857148E-01 0.4332233579225347E-01 0.4289568653845881E-01 0.4247170837580991E-01 0.4205038940040735E-01 0.4163171782227736E-01 0.4121568196192090E-01 0.4080227024696274E-01 0.4039147120889799E-01 0.3998327347993617E-01 0.3957766578994016E-01 0.3917463696345855E-01 0.3877417591685010E-01 0.3837627165549899E-01 0.3798091327111933E-01 0.3758808993914695E-01 0.3719779091621782E-01 0.3681000553773126E-01 0.3642472321549702E-01 0.3604193343546399E-01 0.3566162575553031E-01 0.3528378980343305E-01 0.3490841527471608E-01 0.3453549193077510E-01 0.3416500959697864E-01 0.3379695816086406E-01 0.3343132757040658E-01 0.3306810783236118E-01 0.3270728901067565E-01 0.3234886122497425E-01 0.3199281464910996E-01 0.3163913950978563E-01 0.3128782608524168E-01 0.3093886470401072E-01 0.3059224574373675E-01 0.3024795963005924E-01 0.2990599683556058E-01 0.2956634787877624E-01 0.2922900332326631E-01 0.2889395377674870E-01 0.2856118989029233E-01 0.2823070235756949E-01 0.2790248191416771E-01 0.2757651933695894E-01 0.2725280544352705E-01 0.2693133109165141E-01 0.2661208717884729E-01 0.2629506464196176E-01 0.2598025445682497E-01 0.2566764763795566E-01 0.2535723523832159E-01 0.2504900834915327E-01 0.2474295809981158E-01 0.2443907565770799E-01 0.2413735222827780E-01 0.2383777905500606E-01 0.2354034741950517E-01 0.2324504864164501E-01 0.2295187407973472E-01 0.2266081513075604E-01 0.2237186323064830E-01 0.2208500985464502E-01 0.2180024651766184E-01 0.2151756477473634E-01 0.2123695622151859E-01 0.2095841249481422E-01 0.2068192527317876E-01 0.2040748627756411E-01 0.2013508727201714E-01 0.1986472006443057E-01 0.1959637650734679E-01 0.1933004849881481E-01 0.1906572798330038E-01 0.1880340695265023E-01 0.1854307744711091E-01 0.1828473155640220E-01 0.1802836142084625E-01 0.1777395923255295E-01 0.1752151723666215E-01 0.1727102773264334E-01 0.1702248307565384E-01 0.1677587567795624E-01 0.1653119801039607E-01 0.1628844260394024E-01 0.1604760205127793E-01 0.1580866900848456E-01 0.1557163619674996E-01 0.1533649640417201E-01 0.1510324248761716E-01 0.1487186737464884E-01 0.1464236406552526E-01 0.1441472563526792E-01 0.1418894523580252E-01 0.1396501609817369E-01 0.1374293153483488E-01 0.1352268494201562E-01 0.1330426980216726E-01 0.1308767968648953E-01 0.1287290825753935E-01 0.1265994927192371E-01 0.1244879658307933E-01 0.1223944414413996E-01 0.1203188601089432E-01 0.1182611634483635E-01 0.1162212941630988E-01 0.1141991960775031E-01 0.1121948141702494E-01 0.1102080946087490E-01 0.1082389847846042E-01 0.1062874333501194E-01 0.1043533902558977E-01 0.1024368067895393E-01 0.1005376356154735E-01 0.9865583081593922E-02 0.9679134793314684E-02 0.9494414401263529E-02 0.9311417764785166E-02 0.9130140902597625E-02 0.8950579997500882E-02 0.8772731401214267E-02 0.8596591639343950E-02 0.8422157416482423E-02 0.8249425621441884E-02 0.8078393332622082E-02 0.7909057823514530E-02 0.7741416568343256E-02 0.7575467247842871E-02 0.7411207755174127E-02 0.7248636201976184E-02 0.7087750924555473E-02 0.6928550490209059E-02 0.6771033703680868E-02 0.6615199613748215E-02 0.6461047519934641E-02 0.6308576979345235E-02 0.6157787813618597E-02 0.6008680115989046E-02 0.5861254258451652E-02 0.5715510899020261E-02 0.5571450989068522E-02 0.5429075780740853E-02 0.5288386834419521E-02 0.5149386026230897E-02 0.5012075555572173E-02 0.4876457952637328E-02 0.4742536085917297E-02 0.4610313169647435E-02 0.4479792771170533E-02 0.4350978818180493E-02 0.4223875605807347E-02 0.4098487803498918E-02 0.3974820461650163E-02 0.3852879017924298E-02 0.3732669303204216E-02 0.3614197547105479E-02 0.3497470382973937E-02 0.3382494852283408E-02 0.3269278408338597E-02 0.3157828919178777E-02 0.3048154669566634E-02 0.2940264361933685E-02 0.2834167116141327E-02 0.2729872467901025E-02 0.2627390365681719E-02 0.2526731165915232E-02 0.2427905626291050E-02 0.2330924896912227E-02 0.2235800509061165E-02 0.2142544361300639E-02 0.2051168702609613E-02 0.1961686112225166E-02 0.1874109475832896E-02 0.1788451957715710E-02 0.1704726968437611E-02 0.1622948127603452E-02 0.1543129221197582E-02 0.1465284152965789E-02 0.1389426889263572E-02 0.1315571396752711E-02 0.1243731572285281E-02 0.1173921164272465E-02 0.1106153684794404E-02 0.1040442311668004E-02 0.9767997796547971E-03 0.9152382599604941E-03 0.8557692271559906E-03 0.7984033126378760E-03 0.7431501437484684E-03 0.6900181676963877E-03 0.6390144594619438E-03 0.5901445129451447E-03 0.5434120147240581E-03 0.4988185999463610E-03 0.4563635900883120E-03 0.4160437125934487E-03 0.3778528027632167E-03 0.3417814887280997E-03 0.3078168608981688E-03 0.2759421279962239E-03 0.2461362626341978E-03 0.2183736404266527E-03 0.1926236778641105E-03 0.1688504756124491E-03 0.1470124755772384E-03 0.1270621419785909E-03 0.1089456788163143E-03 0.9260279843818645E-04 0.7796655839983218E-04 0.6496328632466781E-04 0.5351261488371726E-04 0.4352765109263255E-04 0.3491530554961739E-04 0.2757680758595959E-04 0.2140843101578471E-04 0.1630245156608879E-04 0.1214835033531085E-04 0.8834266891203550E-05 0.6248690035680286E-05 0.4282353222462611E-05 0.2830275035848309E-05 0.1793853932613698E-05 0.1082893085919590E-05 0.6174003285747537E-06 0.3289872539180627E-06 0.1616905202076728E-06 0.7206870776681014E-07 0.2849911999804606E-07 0.9712198708650968E-08 0.2742442283547959E-08 0.6076172112450161E-09 0.9772731077597771E-10 0.1017048852958432E-10 0.5734341782146348E-12 0.1311491489053561E-13 0.7338688834175233E-16 0.3808514445153469E-19 0.2185032842849075E-24 0.4450194794086531E-34 0.4448435176905321E-58 0.1173305758391880E-217 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.1353993104251454E-10 0.8388292241576100E-09 0.9249073098372293E-08 0.5030460210239372E-07 0.1857568627085415E-06 0.5369197789403567E-06 0.1310591025996369E-05 0.2826805415934704E-05 0.5547382204843158E-05 0.1010438933657199E-04 0.1732779196828242E-04 0.2827168149581216E-04 0.4423859602721504E-04 0.6680154505955162E-04 0.9782344112589946E-04 0.1394737204414197E-03 0.1942420040555485E-03 0.2649487116051849E-03 0.3547525922860875E-03 0.4671551828778767E-03 0.6060022412741116E-03 0.7754822366296253E-03 0.9801220045380374E-03 0.1224779698140599E-02 0.1514635184246249E-02 0.1855178047873591E-02 0.2252193379531577E-02 0.2711745527424523E-02 0.3240160001952968E-02 0.3844003722708506E-02 0.4530063798923195E-02 0.5305325033301281E-02 0.6176946336577127E-02 0.7152236236230247E-02 0.8238627657747143E-02 0.9443652150831976E-02 0.1077491372619769E-01 0.1224006246116400E-01 0.1384676802438050E-01 0.1560269326170134E-01 0.1751546797666743E-01 0.1959266303029807E-01 0.2184176487603834E-01 0.2427015063682662E-01 0.2688506382240104E-01 0.2969359077621229E-01 0.3270263793270082E-01 0.3591890995727141E-01 0.3934888883309312E-01 0.4299881395089809E-01 0.4687466325027261E-01 0.5098213545355013E-01 0.5532663342634311E-01 0.5991324869200370E-01 0.6474674712088738E-01 0.6983155580921956E-01 0.7517175115663279E-01 0.8077104814605506E-01 0.8663279082458433E-01 0.9275994397927995E-01 0.9915508599743368E-01 0.1058204028968442E+00 0.1127576835079031E+00 0.1199683157858993E+00 0.1274532842288529E+00 0.1352131683733934E+00 0.1432481423386811E+00 0.1515579753861312E+00 0.1601420334607315E+00 0.1689992816780165E+00 0.1781282877192849E+00 0.1875272260963912E+00 0.1971938832464155E+00 0.2071256634156783E+00 0.2173195952919433E+00 0.2277723393431911E+00 0.2384801958210745E+00 0.2494391133870441E+00 0.2606446983191641E+00 0.2720922242578070E+00 0.2837766424487163E+00 0.2956925924423432E+00 0.3078344132088888E+00 0.3201961546291090E+00 0.3327715893216590E+00 0.3455542247685515E+00 0.3585373157011766E+00 0.3717138767102711E+00 0.3850766950442213E+00 0.3986183435611380E+00 0.4123311938012285E+00 0.4262074291471305E+00 0.4402390580410298E+00 0.4544179272285823E+00 0.4687357350008659E+00 0.4831840444068136E+00 0.4977542964098284E+00 0.5124378229635098E+00 0.5272258599826819E+00 0.5421095601871498E+00 0.5570800057968556E+00 0.5721282210583372E+00 0.5872451845836121E+00 0.6024218414838124E+00 0.6176491152810919E+00 0.6329179195834939E+00 0.6482191695086116E+00 0.6635437928430084E+00 0.6788827409254566E+00 0.6942269992431367E+00 0.7095675977309721E+00 0.7248956207653083E+00 0.7402022168441228E+00 0.7554786079469059E+00 0.7707160985682907E+00 0.7859060844203938E+00 0.8010400607996875E+00 0.8161096306150647E+00 0.8311065120745426E+00 0.8460225460288135E+00 0.8608497029705907E+00 0.8755800896893798E+00 0.8902059555819789E+00 0.9047196986196469E+00 0.9191138709734521E+00 0.9333811842999254E+00 0.9475145146896305E+00 0.9615069072817952E+00 0.9753515805486259E+00 0.9890419302533513E+00 0.1002571533086473E+01 0.1015934149985090E+01 0.1029123729140496E+01 0.1042134408699634E+01 0.1054960519166231E+01 0.1067596585507774E+01 0.1080037328974709E+01 0.1092277668638490E+01 0.1104312722655314E+01 0.1116137809262549E+01 0.1127748447515049E+01 0.1139140357768670E+01 0.1150309461918440E+01 0.1161251883398932E+01 0.1171963946954482E+01 0.1182442178186937E+01 0.1192683302888721E+01 0.1202684246168965E+01 0.1212442131380551E+01 0.1221954278855855E+01 0.1231218204459002E+01 0.1240231617962418E+01 0.1248992421255417E+01 0.1257498706392534E+01 0.1265748753489242E+01 0.1273741028472617E+01 0.1281474180694483E+01 0.1288947040414400E+01 0.1296158616159860E+01 0.1303108091970871E+01 0.1309794824536052E+01 0.1316218340227214E+01 0.1322378332039313E+01 0.1328274656442483E+01 0.1333907330152773E+01 0.1339276526828055E+01 0.1344382573695405E+01 0.1349225948116168E+01 0.1353807274094698E+01 0.1358127318736686E+01 0.1362186988662762E+01 0.1365987326382977E+01 0.1369529506637536E+01 0.1372814832709058E+01 0.1375844732711431E+01 0.1378620755860210E+01 0.1381144568729309E+01 0.1383417951498597E+01 0.1385442794196838E+01 0.1387221092944273E+01 0.1388754946198940E+01 0.1390046551010727E+01 0.1391098199286932E+01 0.1391912274073011E+01 0.1392491245851972E+01 0.1392837668865793E+01 0.1392954177462024E+01 0.1392843482468616E+01 0.1392508367599889E+01 0.1391951685896345E+01 0.1391176356200982E+01 0.1390185359674514E+01 0.1388981736351864E+01 0.1387568581742103E+01 0.1385949043473885E+01 0.1384126317988323E+01 0.1382103647281089E+01 0.1379884315695416E+01 0.1377471646767576E+01 0.1374869000126249E+01 0.1372079768447110E+01 0.1369107374463862E+01 0.1365955268036790E+01 0.1362626923279866E+01 0.1359125835747256E+01 0.1355455519680076E+01 0.1351619505314043E+01 0.1347621336248676E+01 0.1343464566878517E+01 0.1339152759886839E+01 0.1334689483802160E+01 0.1330078310617843E+01 0.1325322813474955E+01 0.1320426564408511E+01 0.1315393132157122E+01 0.1310226080036051E+01 0.1304928963873535E+01 0.1299505330010257E+01 0.1293958713361729E+01 0.1288292635543297E+01 0.1282510603057466E+01 0.1276616105543136E+01 0.1270612614086314E+01 0.1264503579591840E+01 0.1258292431215576E+01 0.1251982574856509E+01 0.1245577391708143E+01 0.1239080236868539E+01 0.1232494438008325E+01 0.1225823294095955E+01 0.1219070074179471E+01 0.1212238016223985E+01 0.1205330326004104E+01 0.1198350176050432E+01 0.1191300704649328E+01 0.1184185014895046E+01 0.1177006173793340E+01 0.1169767211415667E+01 0.1162471120103017E+01 0.1155120853718478E+01 0.1147719326947540E+01 0.1140269414645216E+01 0.1132773951228974E+01 0.1125235730116526E+01 0.1117657503207466E+01 0.1110041980407784E+01 0.1102391829196240E+01 0.1094709674231619E+01 0.1086998096999836E+01 0.1079259635499933E+01 0.1071496783967914E+01 0.1063711992637463E+01 0.1055907667536516E+01 0.1048086170318704E+01 0.1040249818128692E+01 0.1032400883500383E+01 0.1024541594287072E+01 0.1016674133622509E+01 0.1008800639911969E+01 0.1000923206852306E+01 0.9930438834801176E+00 0.9851646742469989E+00 0.9772875391210279E+00 0.9694143937135093E+00 0.9615471094301068E+00 0.9536875136454389E+00 0.9458373899002650E+00 0.9379984781203971E+00 0.9301724748564474E+00 0.9223610335436100E+00 0.9145657647805825E+00 0.9067882366268739E+00 0.8990299749176214E+00 0.8912924635951891E+00 0.8835771450567167E+00 0.8758854205168844E+00 0.8682186503851309E+00 0.8605781546565948E+00 0.8529652133160540E+00 0.8453810667541574E+00 0.8378269161952663E+00 0.8303039241362116E+00 0.8228132147953376E+00 0.8153558745711390E+00 0.8079329525099168E+00 0.8005454607817869E+00 0.7931943751644794E+00 0.7858806355343143E+00 0.7786051463638074E+00 0.7713687772253328E+00 0.7641723633003079E+00 0.7570167058933844E+00 0.7499025729511121E+00 0.7428306995846062E+00 0.7358017885957079E+00 0.7288165110062022E+00 0.7218755065895981E+00 0.7149793844050807E+00 0.7081287233331618E+00 0.7013240726126531E+00 0.6945659523785421E+00 0.6878548542003931E+00 0.6811912416209033E+00 0.6745755506942478E+00 0.6680081905238785E+00 0.6614895437994238E+00 0.6550199673323996E+00 0.6485997925903795E+00 0.6422293262293763E+00 0.6359088506240991E+00 0.6296386243958603E+00 0.6234188829378302E+00 0.6172498389374158E+00 0.6111316828955082E+00 0.6050645836423746E+00 0.5990486888499783E+00 0.5930841255405085E+00 0.5871710005909401E+00 0.5813094012334057E+00 0.5754993955512363E+00 0.5697410329704640E+00 0.5640343447466610E+00 0.5583793444469337E+00 0.5527760284269526E+00 0.5472243763028636E+00 0.5417243514179740E+00 0.5362759013040796E+00 0.5308789581373305E+00 0.5255334391885358E+00 0.5202392472678002E+00 0.5149962711634282E+00 0.5098043860749818E+00 0.5046634540404551E+00 0.4995733243574682E+00 0.4945338339984403E+00 0.4895448080196743E+00 0.4846060599643165E+00 0.4797173922591353E+00 0.4748785966051021E+00 0.4700894543617143E+00 0.4653497369250721E+00 0.4606592060996474E+00 0.4560176144637674E+00 0.4514247057287724E+00 0.4468802150918596E+00 0.4423838695826035E+00 0.4379353884031551E+00 0.4335344832621323E+00 0.4291808587022021E+00 0.4248742124213836E+00 0.4206142355880688E+00 0.4164006131498095E+00 0.4122330241358657E+00 0.4081111419535712E+00 0.4040346346785266E+00 0.4000031653386660E+00 0.3960163921922264E+00 0.3920739689996687E+00 0.3881755452895829E+00 0.3843207666186236E+00 0.3805092748255328E+00 0.3767407082792822E+00 0.3730147021214013E+00 0.3693308885025316E+00 0.3656888968132757E+00 0.3620883539093817E+00 0.3585288843313358E+00 0.3550101105184098E+00 0.3515316530172374E+00 0.3480931306849715E+00 0.3446941608870878E+00 0.3413343596899074E+00 0.3380133420478924E+00 0.3347307219857906E+00 0.3314861127756896E+00 0.3282791271090590E+00 0.3251093772638369E+00 0.3219764752666408E+00 0.3188800330501668E+00 0.3158196626058555E+00 0.3127949761318864E+00 0.3098055861765790E+00 0.3068511057772733E+00 0.3039311485947566E+00 0.3010453290433147E+00 0.2981932624164749E+00 0.2953745650085209E+00 0.2925888542318437E+00 0.2898357487302072E+00 0.2871148684879984E+00 0.2844258349355381E+00 0.2817682710505188E+00 0.2791418014556485E+00 0.2765460525125659E+00 0.2739806524121053E+00 0.2714452312609780E+00 0.2689394211649400E+00 0.2664628563085241E+00 0.2640151730313972E+00 0.2615960099014194E+00 0.2592050077844695E+00 0.2568418099111116E+00 0.2545060619401636E+00 0.2521974120192415E+00 0.2499155108423418E+00 0.2476600117045342E+00 0.2454305705538249E+00 0.2432268460402566E+00 0.2410484995623153E+00 0.2388951953107000E+00 0.2367666003095238E+00 0.2346623844550057E+00 0.2325822205517195E+00 0.2305257843464541E+00 0.2284927545597522E+00 0.2264828129151803E+00 0.2244956441663966E+00 0.2225309361220672E+00 0.2205883796686914E+00 0.2186676687913947E+00 0.2167685005927387E+00 0.2148905753096101E+00 0.2130335963282359E+00 0.2111972701973850E+00 0.2093813066398013E+00 0.2075854185619259E+00 0.2058093220619543E+00 0.2040527364362842E+00 0.2023153841843948E+00 0.2005969910122156E+00 0.1988972858340233E+00 0.1972160007729189E+00 0.1955528711599284E+00 0.1939076355317738E+00 0.1922800356273561E+00 0.1906698163829959E+00 0.1890767259264730E+00 0.1875005155699057E+00 0.1859409398015150E+00 0.1843977562763068E+00 0.1828707258057186E+00 0.1813596123462640E+00 0.1798641829872162E+00 0.1783842079373634E+00 0.1769194605108787E+00 0.1754697171123329E+00 0.1740347572208903E+00 0.1726143633737163E+00 0.1712083211486371E+00 0.1698164191460766E+00 0.1684384489703060E+00 0.1670742052100373E+00 0.1657234854183902E+00 0.1643860900922608E+00 0.1630618226511230E+00 0.1617504894152905E+00 0.1604518995836656E+00 0.1591658652110027E+00 0.1578922011847117E+00 0.1566307252012296E+00 0.1553812577419816E+00 0.1541436220489565E+00 0.1529176440999246E+00 0.1517031525833137E+00 0.1504999788727721E+00 0.1493079570014363E+00 0.1481269236359270E+00 0.1469567180500930E+00 0.1457971820985229E+00 0.1446481601898438E+00 0.1435094992598286E+00 0.1423810487443264E+00 0.1412626605520352E+00 0.1401541890371375E+00 0.1390554909718100E+00 0.1379664255186285E+00 0.1368868542028802E+00 0.1358166408848024E+00 0.1347556517317591E+00 0.1337037551903719E+00 0.1326608219586172E+00 0.1316267249579071E+00 0.1306013393051614E+00 0.1295845422848884E+00 0.1285762133212826E+00 0.1275762339503552E+00 0.1265844877921041E+00 0.1256008605227379E+00 0.1246252398469633E+00 0.1236575154703454E+00 0.1226975790717512E+00 0.1217453242758857E+00 0.1208006466259300E+00 0.1198634435562893E+00 0.1189336143654594E+00 0.1180110601890202E+00 0.1170956839727626E+00 0.1161873904459593E+00 0.1152860860947805E+00 0.1143916791358692E+00 0.1135040794900743E+00 0.1126231987563555E+00 0.1117489501858582E+00 0.1108812486561707E+00 0.1100200106457653E+00 0.1091651542086276E+00 0.1083165989490820E+00 0.1074742659968154E+00 0.1066380779821052E+00 0.1058079590112519E+00 0.1049838346422265E+00 0.1041656318605295E+00 0.1033532790552702E+00 0.1025467059954647E+00 0.1017458438065610E+00 0.1009506249471885E+00 0.1001609831861390E+00 0.9937685357957692E-01 0.9859817244848566E-01 0.9782487735634983E-01 0.9705690708707349E-01 0.9629420162313919E-01 0.9553670212400750E-01 0.9478435090475915E-01 0.9403709141497944E-01 0.9329486821788784E-01 0.9255762696971309E-01 0.9182531439931366E-01 0.9109787828804443E-01 0.9037526744987140E-01 0.8965743171173354E-01 0.8894432189415159E-01 0.8823588979208480E-01 0.8753208815603555E-01 0.8683287067340226E-01 0.8613819195007733E-01 0.8544800749229453E-01 0.8476227368872161E-01 0.8408094779279952E-01 0.8340398790532604E-01 0.8273135295728512E-01 0.8206300269292026E-01 0.8139889765304979E-01 0.8073899915862499E-01 0.8008326929452908E-01 0.7943167089361686E-01 0.7878416752099129E-01 0.7814072345852002E-01 0.7750130368958605E-01 0.7686587388407512E-01 0.7623440038359473E-01 0.7560685018692687E-01 0.7498319093571042E-01 0.7436339090035288E-01 0.7374741896616860E-01 0.7313524461974377E-01 0.7252683793552536E-01 0.7192216956263091E-01 0.7132121071188088E-01 0.7072393314304767E-01 0.7013030915232332E-01 0.6954031156000041E-01 0.6895391369836718E-01 0.6837108939981353E-01 0.6779181298514624E-01 0.6721605925211059E-01 0.6664380346411826E-01 0.6607502133917825E-01 0.6550968903902774E-01 0.6494778315846379E-01 0.6438928071487048E-01 0.6383415913794230E-01 0.6328239625959906E-01 0.6273397030409252E-01 0.6218885987830131E-01 0.6164704396221248E-01 0.6110850189958664E-01 0.6057321338880634E-01 0.6004115847390429E-01 0.5951231753576908E-01 0.5898667128352685E-01 0.5846420074609691E-01 0.5794488726391903E-01 0.5742871248084910E-01 0.5691565833622340E-01 0.5640570705708669E-01 0.5589884115058460E-01 0.5539504339651542E-01 0.5489429684004177E-01 0.5439658478455860E-01 0.5390189078471544E-01 0.5341019863959112E-01 0.5292149238601910E-01 0.5243575629206128E-01 0.5195297485062703E-01 0.5147313277323774E-01 0.5099621498393213E-01 0.5052220661331305E-01 0.5005109299273101E-01 0.4958285964860470E-01 0.4911749229687554E-01 0.4865497683759399E-01 0.4819529934963621E-01 0.4773844608554897E-01 0.4728440346652141E-01 0.4683315807748007E-01 0.4638469666230777E-01 0.4593900611918208E-01 0.4549607349603369E-01 0.4505588598612064E-01 0.4461843092371864E-01 0.4418369577992455E-01 0.4375166815857148E-01 0.4332233579225347E-01 0.4289568653845881E-01 0.4247170837580991E-01 0.4205038940040735E-01 0.4163171782227736E-01 0.4121568196192090E-01 0.4080227024696274E-01 0.4039147120889799E-01 0.3998327347993617E-01 0.3957766578994016E-01 0.3917463696345855E-01 0.3877417591685010E-01 0.3837627165549899E-01 0.3798091327111933E-01 0.3758808993914695E-01 0.3719779091621782E-01 0.3681000553773126E-01 0.3642472321549702E-01 0.3604193343546399E-01 0.3566162575553031E-01 0.3528378980343305E-01 0.3490841527471608E-01 0.3453549193077510E-01 0.3416500959697864E-01 0.3379695816086406E-01 0.3343132757040658E-01 0.3306810783236118E-01 0.3270728901067565E-01 0.3234886122497425E-01 0.3199281464910996E-01 0.3163913950978563E-01 0.3128782608524168E-01 0.3093886470401072E-01 0.3059224574373675E-01 0.3024795963005924E-01 0.2990599683556058E-01 0.2956634787877624E-01 0.2922900332326631E-01 0.2889395377674870E-01 0.2856118989029233E-01 0.2823070235756949E-01 0.2790248191416771E-01 0.2757651933695894E-01 0.2725280544352705E-01 0.2693133109165141E-01 0.2661208717884729E-01 0.2629506464196176E-01 0.2598025445682497E-01 0.2566764763795566E-01 0.2535723523832159E-01 0.2504900834915327E-01 0.2474295809981158E-01 0.2443907565770799E-01 0.2413735222827780E-01 0.2383777905500606E-01 0.2354034741950517E-01 0.2324504864164501E-01 0.2295187407973472E-01 0.2266081513075604E-01 0.2237186323064830E-01 0.2208500985464502E-01 0.2180024651766184E-01 0.2151756477473634E-01 0.2123695622151859E-01 0.2095841249481422E-01 0.2068192527317876E-01 0.2040748627756411E-01 0.2013508727201714E-01 0.1986472006443057E-01 0.1959637650734679E-01 0.1933004849881481E-01 0.1906572798330038E-01 0.1880340695265023E-01 0.1854307744711091E-01 0.1828473155640220E-01 0.1802836142084625E-01 0.1777395923255295E-01 0.1752151723666215E-01 0.1727102773264334E-01 0.1702248307565384E-01 0.1677587567795624E-01 0.1653119801039607E-01 0.1628844260394024E-01 0.1604760205127793E-01 0.1580866900848456E-01 0.1557163619674996E-01 0.1533649640417201E-01 0.1510324248761716E-01 0.1487186737464884E-01 0.1464236406552526E-01 0.1441472563526792E-01 0.1418894523580252E-01 0.1396501609817369E-01 0.1374293153483488E-01 0.1352268494201562E-01 0.1330426980216726E-01 0.1308767968648953E-01 0.1287290825753935E-01 0.1265994927192371E-01 0.1244879658307933E-01 0.1223944414413996E-01 0.1203188601089432E-01 0.1182611634483635E-01 0.1162212941630988E-01 0.1141991960775031E-01 0.1121948141702494E-01 0.1102080946087490E-01 0.1082389847846042E-01 0.1062874333501194E-01 0.1043533902558977E-01 0.1024368067895393E-01 0.1005376356154735E-01 0.9865583081593922E-02 0.9679134793314684E-02 0.9494414401263529E-02 0.9311417764785166E-02 0.9130140902597625E-02 0.8950579997500882E-02 0.8772731401214267E-02 0.8596591639343950E-02 0.8422157416482423E-02 0.8249425621441884E-02 0.8078393332622082E-02 0.7909057823514530E-02 0.7741416568343256E-02 0.7575467247842871E-02 0.7411207755174127E-02 0.7248636201976184E-02 0.7087750924555473E-02 0.6928550490209059E-02 0.6771033703680868E-02 0.6615199613748215E-02 0.6461047519934641E-02 0.6308576979345235E-02 0.6157787813618597E-02 0.6008680115989046E-02 0.5861254258451652E-02 0.5715510899020261E-02 0.5571450989068522E-02 0.5429075780740853E-02 0.5288386834419521E-02 0.5149386026230897E-02 0.5012075555572173E-02 0.4876457952637328E-02 0.4742536085917297E-02 0.4610313169647435E-02 0.4479792771170533E-02 0.4350978818180493E-02 0.4223875605807347E-02 0.4098487803498918E-02 0.3974820461650163E-02 0.3852879017924298E-02 0.3732669303204216E-02 0.3614197547105479E-02 0.3497470382973937E-02 0.3382494852283408E-02 0.3269278408338597E-02 0.3157828919178777E-02 0.3048154669566634E-02 0.2940264361933685E-02 0.2834167116141327E-02 0.2729872467901025E-02 0.2627390365681719E-02 0.2526731165915232E-02 0.2427905626291050E-02 0.2330924896912227E-02 0.2235800509061165E-02 0.2142544361300639E-02 0.2051168702609613E-02 0.1961686112225166E-02 0.1874109475832896E-02 0.1788451957715710E-02 0.1704726968437611E-02 0.1622948127603452E-02 0.1543129221197582E-02 0.1465284152965789E-02 0.1389426889263572E-02 0.1315571396752711E-02 0.1243731572285281E-02 0.1173921164272465E-02 0.1106153684794404E-02 0.1040442311668004E-02 0.9767997796547971E-03 0.9152382599604941E-03 0.8557692271559906E-03 0.7984033126378760E-03 0.7431501437484684E-03 0.6900181676963877E-03 0.6390144594619438E-03 0.5901445129451447E-03 0.5434120147240581E-03 0.4988185999463610E-03 0.4563635900883120E-03 0.4160437125934487E-03 0.3778528027632167E-03 0.3417814887280997E-03 0.3078168608981688E-03 0.2759421279962239E-03 0.2461362626341978E-03 0.2183736404266527E-03 0.1926236778641105E-03 0.1688504756124491E-03 0.1470124755772384E-03 0.1270621419785909E-03 0.1089456788163143E-03 0.9260279843818645E-04 0.7796655839983218E-04 0.6496328632466781E-04 0.5351261488371726E-04 0.4352765109263255E-04 0.3491530554961739E-04 0.2757680758595959E-04 0.2140843101578471E-04 0.1630245156608879E-04 0.1214835033531085E-04 0.8834266891203550E-05 0.6248690035680286E-05 0.4282353222462611E-05 0.2830275035848309E-05 0.1793853932613698E-05 0.1082893085919590E-05 0.6174003285747537E-06 0.3289872539180627E-06 0.1616905202076728E-06 0.7206870776681014E-07 0.2849911999804606E-07 0.9712198708650968E-08 0.2742442283547959E-08 0.6076172112450161E-09 0.9772731077597771E-10 0.1017048852958432E-10 0.5734341782146348E-12 0.1311491489053561E-13 0.7338688834175233E-16 0.3808514445153469E-19 0.2185032842849075E-24 0.4450194794086531E-34 0.4448435176905321E-58 0.1173305758391880E-217 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 13 26.982 4.0500 fcc 0.0000000000000000E+00 -0.9628279509886344E-01 -0.9953365511717502E-01 -0.1085367257834955E+00 -0.1214218487615201E+00 -0.1368680672855588E+00 -0.1540621427490459E+00 -0.1724823698187966E+00 -0.1917766936082239E+00 -0.2116972667780488E+00 -0.2320627441427241E+00 -0.2527367403313019E+00 -0.2736137350811652E+00 -0.2946105714789528E+00 -0.3156602493701524E+00 -0.3367083306444053E+00 -0.3577089488344269E+00 -0.3786243739249987E+00 -0.3994221660811231E+00 -0.4200735094048743E+00 -0.4404904782781875E+00 -0.4603267076635175E+00 -0.4791342002596235E+00 -0.4966697876448934E+00 -0.5129130363987204E+00 -0.5279649398751899E+00 -0.5419673801142365E+00 -0.5550615741668476E+00 -0.5673715677751278E+00 -0.5790001198451177E+00 -0.5900298137753388E+00 -0.6005259461781434E+00 -0.6105396931325852E+00 -0.6201109775165654E+00 -0.6292707959422479E+00 -0.6380435230284373E+00 -0.6464477036605579E+00 -0.6544979268477449E+00 -0.6622058329958839E+00 -0.6695796004816827E+00 -0.6766263822113870E+00 -0.6833513422524340E+00 -0.6897586759282083E+00 -0.6958513916294100E+00 -0.7016318963634165E+00 -0.7071020397392846E+00 -0.7122632455033970E+00 -0.7171166154132189E+00 -0.7216630115090188E+00 -0.7259031214369276E+00 -0.7298375104167867E+00 -0.7334666626446351E+00 -0.7367910666835507E+00 -0.7398107650409456E+00 -0.7425268555598952E+00 -0.7449393618108722E+00 -0.7470487599589724E+00 -0.7488555593770301E+00 -0.7503603132693473E+00 -0.7515636266841099E+00 -0.7524661625108897E+00 -0.7530686459172391E+00 -0.7533718513852463E+00 -0.7533768363262632E+00 -0.7530840012877273E+00 -0.7524921131814579E+00 -0.7515804606478103E+00 -0.7502792607163535E+00 -0.7484607038243816E+00 -0.7459636916668000E+00 -0.7426298640002307E+00 -0.7383310820407341E+00 -0.7329796809143272E+00 -0.7265308852606689E+00 -0.7189742772379484E+00 -0.7103273715872973E+00 -0.7006269201238819E+00 -0.6899214100415596E+00 -0.6782669062893683E+00 -0.6657222644919032E+00 -0.6523467518594732E+00 -0.6381981822655980E+00 -0.6233317828078055E+00 -0.6077995440370048E+00 -0.5916499059655702E+00 -0.5749276704151935E+00 -0.5576740608036261E+00 -0.5399269902646231E+00 -0.5217207897977505E+00 -0.5030872174417831E+00 -0.4840550838961484E+00 -0.4646507036272260E+00 -0.4448981173724120E+00 -0.4248192982742891E+00 -0.4044343519155205E+00 -0.3837617000246638E+00 -0.3628182478945590E+00 -0.3416195360896790E+00 -0.3201798773328464E+00 -0.2985124796289278E+00 -0.2766295567505006E+00 -0.2545424272145054E+00 -0.2322616028428013E+00 -0.2097968679392537E+00 -0.1871573500428596E+00 -0.1643515831380795E+00 -0.1413875641241673E+00 -0.1182728032683014E+00 -0.9501436929434126E-01 -0.7161893009339959E-01 -0.4809278834346697E-01 -0.2444191370712145E-01 -0.6719720983290323E-03 0.2321164851959434E-01 0.4720381488457415E-01 0.7129962756731612E-01 0.9549440222479744E-01 0.1197836527451308E+00 0.1441630239601834E+00 0.1686284833950578E+00 0.1931760053643994E+00 0.2178017590483101E+00 0.2425020494231500E+00 0.2672733026214353E+00 0.2921120755096318E+00 0.3170150833336578E+00 0.3419794799317026E+00 0.3670036243095800E+00 0.3920881689533946E+00 0.4172368973967129E+00 0.4424568644116991E+00 0.4677578158531293E+00 0.4931511605824372E+00 0.5186488234682329E+00 0.5442622221402917E+00 0.5700014909585294E+00 0.5958749808858199E+00 0.6218890074764571E+00 0.6480477945330341E+00 0.6743535566999124E+00 0.7008066705597229E+00 0.7274058941450217E+00 0.7541486054898794E+00 0.7810310401956295E+00 0.8080485153972305E+00 0.8351956330126833E+00 0.8624664590130959E+00 0.8898546780165009E+00 0.9173537241128331E+00 0.9449568897488558E+00 0.9726574149554992E+00 0.1000448559348619E+01 0.1028323659291245E+01 0.1056276172451073E+01 0.1084299711777170E+01 0.1112388070685622E+01 0.1140535241011345E+01 0.1168735425061202E+01 0.1196983042901978E+01 0.1225272735836553E+01 0.1253599366863931E+01 0.1281958018782363E+01 0.1310343990479578E+01 0.1338752791854684E+01 0.1367180137734465E+01 0.1395621941077129E+01 0.1424074305699794E+01 0.1452533518717449E+01 0.1480996042842949E+01 0.1509458508665117E+01 0.1537917706995331E+01 0.1566370831749105E+01 0.1594814471963946E+01 0.1623246104160209E+01 0.1651663086958648E+01 0.1680062903840593E+01 0.1708443156854245E+01 0.1736801560607192E+01 0.1765135936545083E+01 0.1793444207513674E+01 0.1821724397566120E+01 0.1849974626590099E+01 0.1878193078402154E+01 0.1906378032515773E+01 0.1934527846644618E+01 0.1962640952792409E+01 0.1990715853560963E+01 0.2018751118665230E+01 0.2046745381644585E+01 0.2074697336759590E+01 0.2102605736064189E+01 0.2130469386642917E+01 0.2158287148004209E+01 0.2186057929620079E+01 0.2213780688603973E+01 0.2241454427518249E+01 0.2269078192303640E+01 0.2296651070323292E+01 0.2324172188515120E+01 0.2351640711701886E+01 0.2379055842086045E+01 0.2406416827027384E+01 0.2433722996957316E+01 0.2460973865437883E+01 0.2488169306929864E+01 0.2515309789359613E+01 0.2542396607347866E+01 0.2569432057808982E+01 0.2596419519065771E+01 0.2623363422536599E+01 0.2650269129601363E+01 0.2677142739909846E+01 0.2703990861443457E+01 0.2730820370008068E+01 0.2757638179775513E+01 0.2784451039495457E+01 0.2811265362580523E+01 0.2838087094127737E+01 0.2864921614243932E+01 0.2891773674664324E+01 0.2918647364337785E+01 0.2945546099121457E+01 0.2972472630730262E+01 0.2999429070422704E+01 0.3026416923420929E+01 0.3053437130653784E+01 0.3080490115009347E+01 0.3107575829842219E+01 0.3134693807981898E+01 0.3161843209919625E+01 0.3189022870212173E+01 0.3216231341437487E+01 0.3243466935272163E+01 0.3270727760447288E+01 0.3298011757479649E+01 0.3325316730182467E+01 0.3352640374035690E+01 0.3379980301550311E+01 0.3407334064796215E+01 0.3434699175284783E+01 0.3462073121407959E+01 0.3489453383638473E+01 0.3516837447692921E+01 0.3544222815852538E+01 0.3571607016626300E+01 0.3598987612930495E+01 0.3626362208945728E+01 0.3653728455799938E+01 0.3681084056213634E+01 0.3708426768230866E+01 0.3735754408148046E+01 0.3763064852741161E+01 0.3790356040882480E+01 0.3817625974627172E+01 0.3844872719842444E+01 0.3872094406443206E+01 0.3899289228291301E+01 0.3926455442808664E+01 0.3953591370348690E+01 0.3980695393365072E+01 0.4007765955412338E+01 0.4034801560008381E+01 0.4061800769384807E+01 0.4088762203148616E+01 0.4115684536874605E+01 0.4142566500646071E+01 0.4169406877558640E+01 0.4196204502200039E+01 0.4222958259116835E+01 0.4249667081277604E+01 0.4276329948540632E+01 0.4302945886132529E+01 0.4329513963143877E+01 0.4356033291046330E+01 0.4382503022235336E+01 0.4408922348601389E+01 0.4435290500132353E+01 0.4461606743549172E+01 0.4487870380976208E+01 0.4514080748647457E+01 0.4540237215649173E+01 0.4566339182699858E+01 0.4592386080967303E+01 0.4618377370923009E+01 0.4644312541233742E+01 0.4670191107689631E+01 0.4696012612168792E+01 0.4721776621637420E+01 0.4747482727184995E+01 0.4773130543093758E+01 0.4798719705941583E+01 0.4824249873737505E+01 0.4849720725089056E+01 0.4875131958400324E+01 0.4900483291100185E+01 0.4925774458899197E+01 0.4951005215074943E+01 0.4976175329784288E+01 0.5001284589402100E+01 0.5026332801140161E+01 0.5051319771276494E+01 0.5076245336511819E+01 0.5101109341973393E+01 0.5125911646062397E+01 0.5150652119931829E+01 0.5175330646984699E+01 0.5199947122391546E+01 0.5224501452626964E+01 0.5248993555024179E+01 0.5273423357346785E+01 0.5297790805953600E+01 0.5322095829385203E+01 0.5346338394872665E+01 0.5370518467903519E+01 0.5394636022497286E+01 0.5418691040867781E+01 0.5442683513098503E+01 0.5466613436830711E+01 0.5490480816963549E+01 0.5514285665365584E+01 0.5538028000597862E+01 0.5561707847647368E+01 0.5585325237670777E+01 0.5608880207748139E+01 0.5632372800646136E+01 0.5655803064590023E+01 0.5679171053044746E+01 0.5702476824504079E+01 0.5725720442287942E+01 0.5748901974347438E+01 0.5772021493077228E+01 0.5795079075135007E+01 0.5818074801267764E+01 0.5841008756144801E+01 0.5863881028196719E+01 0.5886691709361872E+01 0.5909440895975128E+01 0.5932128683720454E+01 0.5954755179911128E+01 0.5977320485443878E+01 0.5999824709469358E+01 0.6022267962734361E+01 0.6044650358660738E+01 0.6066972013230976E+01 0.6089233044877606E+01 0.6111433574377054E+01 0.6133573724746905E+01 0.6155653621147478E+01 0.6177673390786589E+01 0.6199633162827851E+01 0.6221533068302496E+01 0.6243373240024188E+01 0.6265153812506977E+01 0.6286874921886278E+01 0.6308536705842656E+01 0.6330139303528365E+01 0.6351682855496508E+01 0.6373167503632674E+01 0.6394593391089307E+01 0.6415960662221997E+01 0.6437269462528379E+01 0.6458519938589133E+01 0.6479712238010886E+01 0.6500846509371517E+01 0.6521922902167027E+01 0.6542941566760541E+01 0.6563902654333011E+01 0.6584806316835689E+01 0.6605652706944284E+01 0.6626441978014737E+01 0.6647174088072036E+01 0.6667849577716816E+01 0.6688468412040860E+01 0.6709030746709217E+01 0.6729536737868406E+01 0.6749986542110525E+01 0.6770380316439014E+01 0.6790718218235369E+01 0.6811000456475160E+01 0.6831227079554464E+01 0.6851398303748420E+01 0.6871514287649720E+01 0.6891575190080648E+01 0.6911581170066203E+01 0.6931532386808209E+01 0.6951428999660269E+01 0.6971271168103572E+01 0.6991059051723765E+01 0.7010792810188176E+01 0.7030472603224527E+01 0.7050098590599536E+01 0.7069670932099115E+01 0.7089189787508612E+01 0.7108655316594129E+01 0.7128067679084379E+01 0.7147427034653132E+01 0.7166733542902411E+01 0.7185987363346015E+01 0.7205188655394117E+01 0.7224337578337899E+01 0.7243434291334958E+01 0.7262478953395287E+01 0.7281471723367670E+01 0.7300412759926576E+01 0.7319302221559616E+01 0.7338140266555139E+01 0.7356927052990867E+01 0.7375662738722378E+01 0.7394347481372199E+01 0.7412981438319438E+01 0.7431564766689641E+01 0.7450097623345021E+01 0.7468580164875283E+01 0.7487012547588363E+01 0.7505394927501915E+01 0.7523727460334936E+01 0.7542010301499733E+01 0.7560243606094313E+01 0.7578427528894725E+01 0.7596562224348212E+01 0.7614647846566118E+01 0.7632684549317478E+01 0.7650672486022634E+01 0.7668611809747173E+01 0.7686502673196021E+01 0.7704345228708073E+01 0.7722139628250660E+01 0.7739886023414384E+01 0.7757584565408455E+01 0.7775235405055646E+01 0.7792838692788044E+01 0.7810394578642622E+01 0.7827903212257197E+01 0.7845364742866390E+01 0.7862779319297943E+01 0.7880147089969217E+01 0.7897468202883433E+01 0.7914742805626958E+01 0.7931971045365675E+01 0.7949153068842364E+01 0.7966289022373804E+01 0.7983379051848088E+01 0.8000423302722167E+01 0.8017421920019366E+01 0.8034375048327233E+01 0.8051282831795312E+01 0.8068145414133273E+01 0.8084962938608882E+01 0.8101735548046269E+01 0.8118463384824164E+01 0.8135146590874683E+01 0.8151785307681390E+01 0.8168379676278345E+01 0.8184929837248552E+01 0.8201435930723028E+01 0.8217898096379580E+01 0.8234316473441851E+01 0.8250691200678498E+01 0.8267022416402313E+01 0.8283310258469461E+01 0.8299554864278941E+01 0.8315756370771805E+01 0.8331914914430893E+01 0.8348030631280192E+01 0.8364103656884673E+01 0.8380134126349787E+01 0.8396122174321329E+01 0.8412067934985277E+01 0.8427971542067645E+01 0.8443833128834413E+01 0.8459652828091619E+01 0.8475430772185273E+01 0.8491167093001646E+01 0.8506861921967246E+01 0.8522515390049147E+01 0.8538127627755209E+01 0.8553698765134389E+01 0.8569228931777127E+01 0.8584718256815695E+01 0.8600166868924553E+01 0.8615574896321021E+01 0.8630942466765738E+01 0.8646269707563008E+01 0.8661556745561711E+01 0.8676803707155621E+01 0.8692010718284379E+01 0.8707177904433900E+01 0.8722305390637324E+01 0.8737393301475592E+01 0.8752441761078339E+01 0.8767450893124774E+01 0.8782420820844322E+01 0.8797351667017651E+01 0.8812243553977586E+01 0.8827096603609940E+01 0.8841910937354429E+01 0.8856686676205864E+01 0.8871423940714820E+01 0.8886122850988944E+01 0.8900783526693864E+01 0.8915406087054141E+01 0.8929990650854535E+01 0.8944537336441012E+01 0.8959046261721827E+01 0.8973517544168701E+01 0.8987951300817869E+01 0.9002347648271487E+01 0.9016706702698437E+01 0.9031028579835858E+01 0.9045313394990188E+01 0.9059561263038376E+01 0.9073772298429056E+01 0.9087946615184084E+01 0.9102084326899423E+01 0.9116185546746657E+01 0.9130250387474085E+01 0.9144278961408215E+01 0.9158271380454892E+01 0.9172227756100682E+01 0.9186148199414212E+01 0.9200032821047387E+01 0.9213881731236844E+01 0.9227695039805166E+01 0.9241472856162442E+01 0.9255215289307372E+01 0.9268922447828803E+01 0.9282594439906916E+01 0.9296231373314885E+01 0.9309833355419986E+01 0.9323400493185019E+01 0.9336932882359978E+01 0.9350430594893881E+01 0.9363893783342821E+01 0.9377322553011272E+01 0.9390717008807609E+01 0.9404077255245511E+01 0.9417403396445167E+01 0.9430695536134984E+01 0.9443953777652798E+01 0.9457178223947256E+01 0.9470368977579316E+01 0.9483526140723573E+01 0.9496649815169690E+01 0.9509740102323899E+01 0.9522797103210273E+01 0.9535822238420437E+01 0.9548812165768359E+01 0.9561769891801452E+01 0.9574694732427433E+01 0.9587586786767478E+01 0.9600446153569266E+01 0.9613272931208536E+01 0.9626067217690245E+01 0.9638829110650304E+01 0.9651558707356724E+01 0.9664256104711166E+01 0.9676921399250290E+01 0.9689554687147089E+01 0.9702157469174860E+01 0.9714727037387689E+01 0.9727264885308301E+01 0.9739771107669302E+01 0.9752245798846879E+01 0.9764689052861872E+01 0.9777100963381457E+01 0.9789481623720420E+01 0.9801831126842281E+01 0.9814149565361319E+01 0.9826437031543161E+01 0.9838693617306955E+01 0.9850919414226038E+01 0.9863114513529872E+01 0.9875279006105066E+01 0.9887412982496855E+01 0.9899516532910610E+01 0.9911589747212901E+01 0.9923632714933214E+01 0.9935645525264956E+01 0.9947628267067159E+01 0.9959581028865557E+01 0.9971503898854007E+01 0.9983396964895977E+01 0.9995260314525778E+01 0.1000709403494981E+02 0.1001889821304812E+02 0.1003067293537552E+02 0.1004241828816303E+02 0.1005413435731925E+02 0.1006582122843160E+02 0.1007747898676759E+02 0.1008910771727630E+02 0.1010070750458943E+02 0.1011227843302306E+02 0.1012382058657841E+02 0.1013533404894347E+02 0.1014681890349423E+02 0.1015827523329602E+02 0.1016970312110463E+02 0.1018110264936784E+02 0.1019247390022638E+02 0.1020381695551557E+02 0.1021513189676633E+02 0.1022641880520652E+02 0.1023767776176225E+02 0.1024890884705905E+02 0.1026011214142316E+02 0.1027128772488293E+02 0.1028243567716970E+02 0.1029355607771946E+02 0.1030464900567390E+02 0.1031571453988140E+02 0.1032675275889879E+02 0.1033776374099216E+02 0.1034874756413813E+02 0.1035970430602517E+02 0.1037063404405489E+02 0.1038153685534300E+02 0.1039241281672065E+02 0.1040326200473567E+02 0.1041408449565369E+02 0.1042488036545932E+02 0.1043564968985735E+02 0.1044639254427403E+02 0.1045710900385802E+02 0.1046779914348181E+02 0.1047846303774262E+02 0.1048910076096391E+02 0.1049971238719612E+02 0.1051029799021812E+02 0.1052085764353829E+02 0.1053139142039568E+02 0.1054189939376099E+02 0.1055238163633786E+02 0.1056283822056399E+02 0.1057326921861215E+02 0.1058367470239147E+02 0.1059405474354847E+02 0.1060440941346801E+02 0.1061473878327465E+02 0.1062504292383371E+02 0.1063532190575210E+02 0.1064557579937992E+02 0.1065580467481084E+02 0.1066600860188387E+02 0.1067618765018412E+02 0.1068634188904373E+02 0.1069647138754325E+02 0.1070657621451248E+02 0.1071665643853165E+02 0.1072671212793241E+02 0.1073674335079890E+02 0.1074675017496875E+02 0.1075673266803417E+02 0.1076669089734308E+02 0.1077662492999989E+02 0.1078653483286685E+02 0.1079642067256462E+02 0.1080628251547384E+02 0.1081612042773567E+02 0.1082593447525316E+02 0.1083572472369191E+02 0.1084549123848135E+02 0.1085523408481566E+02 0.1086495332765466E+02 0.1087464903172486E+02 0.1088432126152055E+02 0.1089397008130446E+02 0.1090359555510911E+02 0.1091319774673763E+02 0.1092277671976472E+02 0.1093233253753738E+02 0.1094186526317629E+02 0.1095137495957662E+02 0.1096086168940853E+02 0.1097032555892928E+02 0.1097976666590150E+02 0.1098918498743821E+02 0.1099858058553585E+02 0.1100795352196447E+02 0.1101730385826855E+02 0.1102663165576839E+02 0.1103593697556089E+02 0.1104521987852084E+02 0.1105448042530153E+02 0.1106371867633628E+02 0.1107293247783943E+02 0.1108212631163812E+02 0.1109129802968301E+02 0.1110044769153667E+02 0.1110957535654645E+02 0.1111868108384563E+02 0.1112776493235422E+02 0.1113682696078008E+02 0.1114586722761977E+02 0.1115488579115973E+02 0.1116388270947705E+02 0.1117285804044050E+02 0.1118181184171143E+02 0.1119074417074485E+02 0.1119965508479030E+02 0.1120854464089276E+02 0.1121741289589355E+02 0.1122625990643143E+02 0.1123508572894327E+02 0.1124389041966516E+02 0.1125267403463331E+02 0.1126143662968485E+02 0.1127017826045877E+02 0.1127889898239682E+02 0.1128759885074458E+02 0.1129627792055189E+02 0.1130493624667420E+02 0.1131357388377320E+02 0.1132219088631773E+02 0.1133078730858470E+02 0.1133936320465983E+02 0.1134791862843856E+02 0.1135645363362708E+02 0.1136496827374269E+02 0.1137346260211521E+02 0.1138193667188745E+02 0.1139039053601605E+02 0.1139882424727257E+02 0.1140723785824395E+02 0.1141563142133352E+02 0.1142400498876172E+02 0.1143235861256712E+02 0.1144069234460682E+02 0.1144900623655768E+02 0.1145730033991675E+02 0.1146557470600226E+02 0.1147382938595421E+02 0.1148206443073531E+02 0.1149027989113191E+02 0.1149847581775414E+02 0.1150665226103736E+02 0.1151480927124249E+02 0.1152294689845698E+02 0.1153106519259537E+02 0.1153916420340013E+02 0.1154724398044246E+02 0.1155530457312277E+02 0.1156334603067165E+02 0.1157136840215052E+02 0.1157937173645239E+02 0.1158735608230234E+02 0.1159532148825857E+02 0.1160326800271278E+02 0.1161119567389111E+02 0.1161910454985465E+02 0.1162699467850026E+02 0.1163486610756115E+02 0.1164271888460782E+02 0.1165055305704804E+02 0.1165836867212856E+02 0.1166616577693494E+02 0.1167394441839248E+02 0.1168170464326700E+02 0.1168944649816522E+02 0.1169717002953568E+02 0.1170487528366932E+02 0.1171256230670009E+02 0.1172023114460535E+02 0.1172788184320704E+02 0.1173551444817181E+02 0.1174312900501185E+02 0.1175072555908556E+02 0.1175830415559807E+02 0.1176586483960187E+02 0.1177340765599744E+02 0.1178093264953387E+02 0.1178843986480948E+02 0.1179592934627236E+02 0.1180340113822094E+02 0.1181085528480470E+02 0.1181829166269570E+02 0.1182570985953448E+02 0.1183311348562248E+02 0.1184049703658763E+02 0.1184786329267578E+02 0.1185521227437533E+02 0.1186254400205932E+02 0.1186985849598701E+02 0.1187715577630568E+02 0.1188443611784194E+02 0.1189169878246886E+02 0.1189894457481569E+02 0.1190617328225404E+02 0.1191338494670332E+02 0.1192057960986771E+02 0.1192775731323726E+02 0.1193491809808902E+02 0.1194206200548831E+02 0.1194918907628982E+02 0.1195629935113887E+02 0.1196339287047247E+02 0.1197046967452045E+02 0.1197752980330694E+02 0.1198457329665118E+02 0.1199160019416887E+02 0.1199861053527344E+02 0.1200560435917693E+02 0.1201258170489155E+02 0.1201954261123063E+02 0.1202648711680959E+02 0.1203341526004761E+02 0.1204032707916849E+02 0.1204722261220184E+02 0.1205410189698429E+02 0.1206096497116060E+02 0.1206781187218495E+02 0.1207464559802799E+02 0.1208146027002577E+02 0.1208825888009797E+02 0.1209504146494779E+02 0.1210180806109399E+02 0.1210855896537541E+02 0.1211529410378007E+02 0.1212201340030601E+02 0.1212871689296240E+02 0.1213540461963384E+02 0.1214207661808061E+02 0.1214873292593939E+02 0.1215537358072345E+02 0.1216199861982349E+02 0.1216860808050769E+02 0.1217520199992239E+02 0.1218178041509279E+02 0.1218834336292295E+02 0.1219489088019657E+02 0.1220142300357730E+02 0.1220793976960926E+02 0.1221444121471769E+02 0.1222092737520902E+02 0.1222739828727144E+02 0.1223385398697564E+02 0.1224029451027501E+02 0.1224671989300593E+02 0.1225313017088853E+02 0.1225952537952718E+02 0.1226590555441035E+02 0.1227227073091185E+02 0.1227862094429078E+02 0.1228495622969180E+02 0.1229127662214604E+02 0.1229758215657148E+02 0.1230387286777276E+02 0.1231014879044237E+02 0.1231640995916075E+02 0.1232265640839672E+02 0.1232888817250763E+02 0.1233510528574038E+02 0.1234130778223132E+02 0.1234749569600697E+02 0.1235366906098424E+02 0.1235982791097082E+02 0.1236597227966591E+02 0.1237210220066028E+02 0.1237821770743661E+02 0.1238431883337027E+02 0.1239040561172962E+02 0.1239647807567605E+02 0.1240253625826483E+02 0.1240858019244517E+02 0.1241460991106090E+02 0.1242062544685069E+02 0.1242662683244833E+02 0.1243261410038329E+02 0.1243858728308130E+02 0.1244454641286415E+02 0.1245049152195065E+02 0.1245642264245671E+02 0.1246233980639583E+02 0.1246824304567928E+02 0.1247413239211681E+02 0.1248000787741680E+02 0.1248586953318652E+02 0.1249171739093289E+02 0.1249755148206230E+02 0.1250337183788155E+02 0.1250917848959775E+02 0.1251497146831911E+02 0.1252075080505461E+02 0.1252651653071523E+02 0.1253226867611377E+02 0.1253800727196519E+02 0.1254373234888717E+02 0.1254944393740030E+02 0.1255514206792864E+02 0.1256082677079984E+02 0.1256649807624557E+02 0.1257215601440174E+02 0.1257780061530919E+02 0.1258343190891375E+02 0.1258904992506636E+02 0.1259465469352414E+02 0.1260024624394981E+02 0.1260582460591276E+02 0.1261138980888892E+02 0.1261694188226133E+02 0.1262248085532045E+02 0.1262800675726433E+02 0.1263351961719898E+02 0.1263901946413904E+02 0.1264450285631671E+02 0.1264997675865174E+02 0.1265543773449255E+02 0.1266088581249014E+02 0.1266632102120516E+02 0.1267174338910899E+02 0.1267715294458313E+02 0.1268254971592008E+02 0.1268793373132342E+02 0.1269330501890832E+02 0.1269866360670164E+02 0.1270400952264229E+02 0.1270934279458158E+02 0.1271466345028335E+02 0.1271997151742474E+02 0.1272526702359572E+02 0.1273054999630008E+02 0.1273582044112639E+02 0.1274107829127974E+02 0.1274632368547512E+02 0.1275155665077283E+02 0.1275677721414707E+02 0.1276198540248610E+02 0.1276718124259236E+02 0.1277236476118314E+02 0.1277753598489035E+02 0.1278269494026117E+02 0.1278784165375827E+02 0.1279297615176009E+02 0.1279809846056095E+02 0.1280320860637152E+02 0.1280830661531907E+02 0.1281339251344765E+02 0.1281846632671840E+02 0.1282352808100990E+02 0.1282857780211833E+02 0.1283361551575781E+02 0.1283864124756066E+02 0.1284365502307763E+02 0.1284865686777834E+02 0.1285364680705105E+02 0.1285862486620364E+02 0.1286359107046338E+02 0.1286854544497717E+02 0.1287348801481206E+02 0.1287841880495558E+02 0.1288333784031538E+02 0.1288824514572031E+02 0.1289314074592015E+02 0.1289802466558600E+02 0.1290289692931037E+02 0.1290775756160805E+02 0.1291260658691528E+02 0.1291744402959128E+02 0.1292226991391726E+02 0.1292708426409754E+02 0.1293188710425972E+02 0.1293667845845432E+02 0.1294145835065556E+02 0.1294622680476155E+02 0.1295098384459444E+02 0.1295572949390062E+02 0.1296046377635092E+02 0.1296518671554123E+02 0.1296989833499209E+02 0.1297459865814951E+02 0.1297928770838488E+02 0.1298396550899552E+02 0.1298863208320455E+02 0.1299328745416105E+02 0.1299793164494091E+02 0.1300256467854653E+02 0.1300718657790715E+02 0.1301179736587904E+02 0.1301639706524610E+02 0.1302098569871943E+02 0.1302556328893826E+02 0.1303012985846953E+02 0.1303468542980876E+02 0.1303923002537965E+02 0.1304376366753469E+02 0.1304828637855533E+02 0.1305279818065219E+02 0.1305729909596507E+02 0.1306178914656352E+02 0.1306626835444681E+02 0.1307073674154426E+02 0.1307519432971517E+02 0.1307964114074970E+02 0.1308407719636832E+02 0.1308850251822266E+02 0.1309291712789514E+02 0.1309732104689959E+02 0.1310172496590404E+02 0.1310612888490850E+02 0.1311053280391295E+02 0.0000000000000000E+00 0.2350503764662797E-10 0.1452741565148498E-08 0.1598024605657181E-07 0.8670887247915710E-07 0.3194268290355064E-06 0.9210999532108705E-06 0.2243032243257230E-05 0.4826533736759059E-05 0.9449280963997414E-05 0.1717086310497067E-04 0.2937628005930804E-04 0.4781640004850213E-04 0.7464459701436190E-04 0.1124489746320072E-03 0.1642797466831127E-03 0.2336714851009560E-03 0.3246600692852489E-03 0.4417942752036344E-03 0.5901420321021944E-03 0.7752914499470295E-03 0.1003346783485080E-02 0.1280919550391384E-02 0.1615115062592291E-02 0.2013514662642524E-02 0.2484153982012019E-02 0.3035497556237696E-02 0.3676410143962806E-02 0.4416125103690986E-02 0.5264210184320288E-02 0.6230531083824742E-02 0.7325213125386473E-02 0.8558601392363368E-02 0.9941219653166928E-02 0.1148372839483666E-01 0.1319688227020127E-01 0.1509148724834461E-01 0.1717835774193908E-01 0.1946827396813322E-01 0.2197193978231332E-01 0.2469994120640449E-01 0.2766270585561205E-01 0.3087046344978465E-01 0.3433320757803945E-01 0.3806065886804223E-01 0.4206222969448004E-01 0.4634699054488188E-01 0.5092363814510472E-01 0.5580046543156136E-01 0.6098533344267084E-01 0.6648564518809444E-01 0.7230832154110638E-01 0.7845977918695805E-01 0.8494591064833676E-01 0.9177206639800155E-01 0.9894303905839608E-01 0.1064630496784886E+00 0.1143357360692630E+00 0.1225641431711653E+00 0.1311507154193881E+00 0.1400972910661206E+00 0.1494050984128002E+00 0.1590747538999337E+00 0.1691062619971989E+00 0.1794990168322592E+00 0.1902518054930074E+00 0.2013628129347618E+00 0.2128296284212524E+00 0.2246492534260200E+00 0.2368181109190946E+00 0.2493320559624748E+00 0.2621863875369867E+00 0.2753758615225286E+00 0.2888947047534727E+00 0.3027366300710904E+00 0.3168948522952475E+00 0.3313621050382702E+00 0.3461306582847914E+00 0.3611923366625136E+00 0.3765385383301647E+00 0.3921602544104397E+00 0.4080480888974157E+00 0.4241922789697600E+00 0.4405827156430124E+00 0.4572089646963136E+00 0.4740602878111100E+00 0.4911256638616449E+00 0.5083938102993529E+00 0.5258532045756759E+00 0.5434921055502246E+00 0.5612985748336912E+00 0.5792604980173683E+00 0.5973656057436424E+00 0.6156014945742982E+00 0.6339556476159732E+00 0.6524154548645443E+00 0.6709682332326954E+00 0.6896012462273114E+00 0.7083017232457365E+00 0.7270568784622643E+00 0.7458539292785299E+00 0.7646801143137046E+00 0.7835227109126022E+00 0.8023690521519213E+00 0.8212065433269309E+00 0.8400226779029110E+00 0.8588050529176166E+00 0.8775413838228915E+00 0.8962195187553934E+00 0.9148274522281129E+00 0.9333533382360560E+00 0.9517855027710543E+00 0.9701124557421923E+00 0.9883229022998167E+00 0.1006405753562465E+01 0.1024350136747383E+01 0.1042145404706545E+01 0.1059781144871260E+01 0.1077247187609600E+01 0.1094533614001869E+01 0.1111630763040373E+01 0.1128529238260637E+01 0.1145219913812065E+01 0.1161693939976847E+01 0.1177942748146633E+01 0.1193958055267189E+01 0.1209731867761823E+01 0.1225256484945006E+01 0.1240524501938026E+01 0.1255528812099049E+01 0.1270262608980346E+01 0.1284719387825761E+01 0.1298892946621899E+01 0.1312777386716678E+01 0.1326367113019209E+01 0.1339656833795096E+01 0.1352641560071424E+01 0.1365316604665792E+01 0.1377677580853886E+01 0.1389720400690019E+01 0.1401441272995214E+01 0.1412836701027270E+01 0.1423903479847286E+01 0.1434638693397013E+01 0.1445039711301291E+01 0.1455104185409776E+01 0.1464830046091919E+01 0.1474215498299109E+01 0.1483259017407622E+01 0.1491959344855860E+01 0.1500315483589179E+01 0.1508326693325296E+01 0.1515992485653126E+01 0.1523312618977543E+01 0.1530287093322397E+01 0.1536916145003750E+01 0.1543200241185077E+01 0.1549140074325868E+01 0.1554736556534737E+01 0.1559990813837915E+01 0.1564904180373601E+01 0.1569478192522416E+01 0.1573714582983838E+01 0.1577615274808202E+01 0.1581182375393509E+01 0.1584418170455991E+01 0.1587325117983052E+01 0.1589905842176854E+01 0.1592163127396545E+01 0.1594099912106772E+01 0.1595719282839819E+01 0.1597024468178396E+01 0.1598018832765788E+01 0.1598705871349761E+01 0.1599089202866354E+01 0.1599172564569312E+01 0.1598959806210704E+01 0.1598454884277914E+01 0.1597661856291940E+01 0.1596584875171653E+01 0.1595228183668366E+01 0.1593596108874842E+01 0.1591693056812536E+01 0.1589523507100701E+01 0.1587092007710641E+01 0.1584403169808198E+01 0.1581461662687349E+01 0.1578272208797470E+01 0.1574839578866685E+01 0.1571168587123450E+01 0.1567264086618331E+01 0.1563130964647693E+01 0.1558774138280876E+01 0.1554198549992189E+01 0.1549409163398889E+01 0.1544410959106127E+01 0.1539208930659677E+01 0.1533808080607080E+01 0.1528213416667707E+01 0.1522429948012042E+01 0.1516462681650386E+01 0.1510316618931021E+01 0.1503996752147732E+01 0.1497508061256460E+01 0.1490855510700755E+01 0.1484044046345540E+01 0.1477078592518635E+01 0.1469964049159342E+01 0.1462705289073315E+01 0.1455307155292826E+01 0.1447774458541496E+01 0.1440111974802394E+01 0.1432324442988392E+01 0.1424416562713602E+01 0.1416392992164560E+01 0.1408258346069873E+01 0.1400017193766902E+01 0.1391674057364033E+01 0.1383233409997026E+01 0.1374699674177898E+01 0.1366077220234727E+01 0.1357370364840755E+01 0.1348583369631108E+01 0.1339720439905439E+01 0.1330785723414737E+01 0.1321783309230582E+01 0.1312717226695031E+01 0.1303591444449351E+01 0.1294409869539786E+01 0.1285176346598528E+01 0.1275894657098056E+01 0.1266568518676988E+01 0.1257201584535619E+01 0.1247797442899263E+01 0.1238359616547584E+01 0.1228891562408019E+01 0.1219396671211496E+01 0.1209878267208578E+01 0.1200339607944202E+01 0.1190783884089205E+01 0.1181214219326823E+01 0.1171633670292365E+01 0.1162045226564264E+01 0.1152451810704780E+01 0.1142856278348570E+01 0.1133261418337408E+01 0.1123669952899346E+01 0.1114084537870646E+01 0.1104507762958775E+01 0.1094942152044870E+01 0.1085390163524009E+01 0.1075854190681740E+01 0.1066336562105254E+01 0.1056839542127690E+01 0.1047365331304049E+01 0.1037916066917227E+01 0.1028493823512701E+01 0.1019100613460447E+01 0.1009738387542688E+01 0.1000409035566070E+01 0.9911143869969610E+00 0.9818562116185301E+00 0.9726362202083267E+00 0.9634560652350970E+00 0.9543173415736288E+00 0.9452215872364120E+00 0.9361702841209427E+00 0.9271648587715566E+00 0.9182066831546644E+00 0.9092970754463097E+00 0.9004373008310244E+00 0.8916285723109384E+00 0.8828720515241635E+00 0.8741688495714935E+00 0.8655200278504954E+00 0.8569265988960664E+00 0.8483895272266132E+00 0.8399097301949807E+00 0.8314880788433289E+00 0.8231253987611650E+00 0.8148224709457564E+00 0.8065800326641964E+00 0.7983987783164219E+00 0.7902793602984723E+00 0.7822223898653531E+00 0.7742284379928720E+00 0.7662980362378170E+00 0.7584316775959118E+00 0.7506298173569868E+00 0.7428928739568187E+00 0.7352212298251275E+00 0.7276152322292518E+00 0.7200751941130188E+00 0.7126013949303633E+00 0.7051940814732806E+00 0.6978534686936988E+00 0.6905797405188852E+00 0.6833730506600221E+00 0.6762335234136188E+00 0.6691612544554096E+00 0.6621563116264519E+00 0.6552187357111161E+00 0.6483485412067125E+00 0.6415457170844840E+00 0.6348102275417313E+00 0.6281420127448483E+00 0.6215409895630656E+00 0.6150070522926947E+00 0.6085400733717113E+00 0.6021399040845107E+00 0.5958063752566826E+00 0.5895392979396676E+00 0.5833384640851877E+00 0.5772036472093250E+00 0.5711346030461549E+00 0.5651310701908592E+00 0.5591927707322315E+00 0.5533194108745153E+00 0.5475106815485299E+00 0.5417662590120353E+00 0.5360858054393003E+00 0.5304689694998603E+00 0.5249153869264497E+00 0.5194246810720941E+00 0.5139964634563777E+00 0.5086303343008993E+00 0.5033258830539155E+00 0.4980826889042317E+00 0.4929003212843441E+00 0.4877783403628898E+00 0.4827162975264554E+00 0.4777137358507827E+00 0.4727701905614446E+00 0.4678851894840552E+00 0.4630582534840750E+00 0.4582888968962981E+00 0.4535766279440972E+00 0.4489209491485098E+00 0.4443213577272558E+00 0.4397773459837845E+00 0.4352884016864413E+00 0.4308540084378585E+00 0.4264736460346724E+00 0.4221467908176804E+00 0.4178729160125361E+00 0.4136514920611062E+00 0.4094819869436024E+00 0.4053638664915989E+00 0.4012965946920645E+00 0.3972796339825281E+00 0.3933124455374964E+00 0.3893944895462572E+00 0.3855252254821869E+00 0.3817041123636960E+00 0.3779306090069412E+00 0.3742041742704262E+00 0.3705242672916375E+00 0.3668903477158274E+00 0.3633018759170965E+00 0.3597583132118892E+00 0.3562591220650529E+00 0.3528037662885790E+00 0.3493917112331675E+00 0.3460224239727477E+00 0.3426953734820877E+00 0.3394100308076194E+00 0.3361658692316251E+00 0.3329623644299036E+00 0.3297989946230563E+00 0.3266752407215223E+00 0.3235905864644950E+00 0.3205445185528428E+00 0.3175365267761750E+00 0.3145661041341699E+00 0.3116327469522978E+00 0.3087359549920661E+00 0.3058752315559112E+00 0.3030500835868565E+00 0.3002600217630693E+00 0.2975045605874296E+00 0.2947832184722352E+00 0.2920955178191660E+00 0.2894409850946181E+00 0.2868191509005325E+00 0.2842295500408273E+00 0.2816717215835535E+00 0.2791452089188812E+00 0.2766495598130334E+00 0.2741843264582723E+00 0.2717490655190478E+00 0.2693433381744174E+00 0.2669667101568407E+00 0.2646187517874495E+00 0.2622990380079024E+00 0.2600071484089175E+00 0.2577426672555859E+00 0.2555051835095635E+00 0.2532942908482358E+00 0.2511095876809479E+00 0.2489506771623981E+00 0.2468171672032794E+00 0.2447086704782614E+00 0.2426248044314016E+00 0.2405651912790701E+00 0.2385294580104723E+00 0.2365172363858518E+00 0.2345281629324596E+00 0.2325618789383613E+00 0.2306180304441682E+00 0.2286962682327625E+00 0.2267962478170977E+00 0.2249176294261405E+00 0.2230600779890333E+00 0.2212232631175415E+00 0.2194068590868594E+00 0.2176105448148379E+00 0.2158340038397009E+00 0.2140769242963177E+00 0.2123389988910903E+00 0.2106199248755169E+00 0.2089194040184958E+00 0.2072371425774233E+00 0.2055728512681448E+00 0.2039262452338156E+00 0.2022970440127238E+00 0.2006849715051299E+00 0.1990897559391716E+00 0.1975111298358903E+00 0.1959488299734197E+00 0.1944025973503926E+00 0.1928721771486053E+00 0.1913573186949898E+00 0.1898577754229339E+00 0.1883733048329959E+00 0.1869036684530497E+00 0.1854486317979078E+00 0.1840079643284546E+00 0.1825814394103312E+00 0.1811688342722097E+00 0.1797699299636905E+00 0.1783845113128567E+00 0.1770123668835237E+00 0.1756532889322104E+00 0.1743070733648679E+00 0.1729735196933954E+00 0.1716524309919727E+00 0.1703436138532354E+00 0.1690468783443259E+00 0.1677620379628421E+00 0.1664889095927099E+00 0.1652273134600088E+00 0.1639770730887696E+00 0.1627380152567701E+00 0.1615099699513493E+00 0.1602927703252654E+00 0.1590862526526123E+00 0.1578902562848216E+00 0.1567046236067624E+00 0.1555291999929633E+00 0.1543638337639696E+00 0.1532083761428563E+00 0.1520626812119101E+00 0.1509266058694993E+00 0.1498000097871428E+00 0.1486827553667961E+00 0.1475747076983654E+00 0.1464757345174640E+00 0.1453857061634240E+00 0.1443044955375730E+00 0.1432319780617891E+00 0.1421680316373446E+00 0.1411125366040483E+00 0.1400653756996955E+00 0.1390264340198362E+00 0.1379955989778688E+00 0.1369727602654673E+00 0.1359578098133525E+00 0.1349506417524104E+00 0.1339511523751675E+00 0.1329592400976282E+00 0.1319748054214808E+00 0.1309977508966756E+00 0.1300279810843844E+00 0.1290654025203415E+00 0.1281099236785748E+00 0.1271614549355259E+00 0.1262199085345698E+00 0.1252851985509296E+00 0.1243572408569959E+00 0.1234359530880505E+00 0.1225212546083961E+00 0.1216130664778956E+00 0.1207113114189237E+00 0.1198159137837281E+00 0.1189267995222068E+00 0.1180438961500998E+00 0.1171671327175942E+00 0.1162964397783483E+00 0.1154317493589289E+00 0.1145729949286663E+00 0.1137201113699259E+00 0.1128730349487938E+00 0.1120317032861783E+00 0.1111960553293266E+00 0.1103660313237529E+00 0.1095415727855802E+00 0.1087226224742927E+00 0.1079091243658972E+00 0.1071010236264925E+00 0.1062982665862460E+00 0.1055008007137718E+00 0.1047085745909144E+00 0.1039215378879289E+00 0.1031396413390617E+00 0.1023628367185243E+00 0.1015910768168619E+00 0.1008243154177097E+00 0.1000625072749386E+00 0.9930560809018427E-01 0.9855357449075822E-01 0.9780636400793745E-01 0.9706393505562982E-01 0.9632624690941162E-01 0.9559325968593356E-01 0.9486493432269383E-01 0.9414123255817297E-01 0.9342211691232764E-01 0.9270755066744044E-01 0.9199749784932158E-01 0.9129192320885827E-01 0.9059079220391024E-01 0.8989407098154546E-01 0.8920172636061409E-01 0.8851372581465511E-01 0.8783003745513447E-01 0.8715063001500779E-01 0.8647547283260665E-01 0.8580453583584287E-01 0.8513778952672810E-01 0.8447520496620298E-01 0.8381675375927530E-01 0.8316240804045885E-01 0.8251214045951316E-01 0.8186592416747822E-01 0.8122373280299988E-01 0.8058554047894315E-01 0.7995132176928955E-01 0.7932105169631275E-01 0.7869470571803144E-01 0.7807225971593283E-01 0.7745368998296467E-01 0.7683897321179178E-01 0.7622808648331135E-01 0.7562100725542614E-01 0.7501771335206921E-01 0.7441818295247755E-01 0.7382239458071076E-01 0.7323032709541087E-01 0.7264195967979867E-01 0.7205727183190487E-01 0.7147624335502985E-01 0.7089885434843042E-01 0.7032508519822850E-01 0.6975491656853922E-01 0.6918832939281314E-01 0.6862530486539103E-01 0.6806582443326617E-01 0.6750986978805110E-01 0.6695742285814540E-01 0.6640846580110123E-01 0.6586298099618196E-01 0.6532095103711212E-01 0.6478235872501446E-01 0.6424718706153042E-01 0.6371541924212147E-01 0.6318703864954746E-01 0.6266202884751911E-01 0.6214037357452046E-01 0.6162205673779986E-01 0.6110706240752450E-01 0.6059537481109686E-01 0.6008697832762830E-01 0.5958185748256901E-01 0.5907999694248869E-01 0.5858138151000727E-01 0.5808599611887154E-01 0.5759382582917469E-01 0.5710485582271634E-01 0.5661907139850073E-01 0.5613645796836825E-01 0.5565700105276017E-01 0.5518068627661225E-01 0.5470749936537444E-01 0.5423742614115482E-01 0.5377045251898517E-01 0.5330656450320408E-01 0.5284574818395761E-01 0.5238798973381230E-01 0.5193327540447994E-01 0.5148159152365149E-01 0.5103292449193595E-01 0.5058726077990446E-01 0.5014458692523559E-01 0.4970488952995948E-01 0.4926815525779950E-01 0.4883437083160901E-01 0.4840352303089959E-01 0.4797559868946120E-01 0.4755058469306943E-01 0.4712846797727979E-01 0.4670923552530574E-01 0.4629287436597942E-01 0.4587937157179187E-01 0.4546871425701189E-01 0.4506088957588125E-01 0.4465588472088415E-01 0.4425368692108926E-01 0.4385428344056262E-01 0.4345766157684944E-01 0.4306380865952269E-01 0.4267271204879778E-01 0.4228435913421057E-01 0.4189873733335742E-01 0.4151583409069603E-01 0.4113563687640473E-01 0.4075813318529899E-01 0.4038331053580396E-01 0.4001115646898086E-01 0.3964165854760631E-01 0.3927480435530239E-01 0.3891058149571723E-01 0.3854897759175296E-01 0.3818998028484157E-01 0.3783357723426573E-01 0.3747975611652434E-01 0.3712850462474054E-01 0.3677981046811218E-01 0.3643366137140177E-01 0.3609004507446641E-01 0.3574894933182556E-01 0.3541036191226535E-01 0.3507427059847887E-01 0.3474066318674111E-01 0.3440952748661676E-01 0.3408085132070126E-01 0.3375462252439219E-01 0.3343082894569176E-01 0.3310945844503797E-01 0.3279049889516447E-01 0.3247393818098731E-01 0.3215976419951815E-01 0.3184796485980308E-01 0.3153852808288556E-01 0.3123144180179359E-01 0.3092669396154863E-01 0.3062427251919747E-01 0.3032416544386438E-01 0.3002636071682391E-01 0.2973084633159302E-01 0.2943761029404197E-01 0.2914664062252300E-01 0.2885792534801624E-01 0.2857145251429220E-01 0.2828721017808998E-01 0.2800518640931039E-01 0.2772536929122391E-01 0.2744774692069189E-01 0.2717230740840119E-01 0.2689903887911129E-01 0.2662792947191326E-01 0.2635896734050006E-01 0.2609214065344760E-01 0.2582743759450599E-01 0.2556484636290022E-01 0.2530435517364029E-01 0.2504595225783962E-01 0.2478962586304191E-01 0.2453536425355501E-01 0.2428315571079263E-01 0.2403298853362201E-01 0.2378485103871834E-01 0.2353873156092471E-01 0.2329461845361733E-01 0.2305250008907579E-01 0.2281236485885801E-01 0.2257420117417889E-01 0.2233799746629312E-01 0.2210374218688127E-01 0.2187142380843883E-01 0.2164103082466791E-01 0.2141255175087165E-01 0.2118597512435002E-01 0.2096128950479806E-01 0.2073848347470486E-01 0.2051754563975416E-01 0.2029846462922549E-01 0.2008122909639606E-01 0.1986582771894261E-01 0.1965224919934375E-01 0.1944048226528158E-01 0.1923051567004319E-01 0.1902233819292149E-01 0.1881593863961467E-01 0.1861130584262509E-01 0.1840842866165638E-01 0.1820729598400922E-01 0.1800789672497538E-01 0.1781021982822961E-01 0.1761425426621972E-01 0.1741998904055397E-01 0.1722741318238660E-01 0.1703651575280017E-01 0.1684728584318532E-01 0.1665971257561794E-01 0.1647378510323276E-01 0.1628949261059417E-01 0.1610682431406360E-01 0.1592576946216329E-01 0.1574631733593689E-01 0.1556845724930608E-01 0.1539217854942354E-01 0.1521747061702217E-01 0.1504432286676001E-01 0.1487272474756165E-01 0.1470266574295493E-01 0.1453413537140393E-01 0.1436712318663735E-01 0.1420161877797267E-01 0.1403761177063589E-01 0.1387509182607664E-01 0.1371404864227910E-01 0.1355447195406791E-01 0.1339635153340976E-01 0.1323967718971016E-01 0.1308443877010535E-01 0.1293062615974990E-01 0.1277822928209887E-01 0.1262723809918580E-01 0.1247764261189538E-01 0.1232943286023138E-01 0.1218259892357987E-01 0.1203713092096717E-01 0.1189301901131328E-01 0.1175025339368011E-01 0.1160882430751480E-01 0.1146872203288826E-01 0.1132993689072848E-01 0.1119245924304928E-01 0.1105627949317382E-01 0.1092138808595317E-01 0.1078777550798031E-01 0.1065543228779879E-01 0.1052434899610681E-01 0.1039451624595617E-01 0.1026592469294671E-01 0.1013856503541558E-01 0.1001242801462182E-01 0.9887504414926333E-02 0.9763785063966725E-02 0.9641260832827890E-02 0.9519922636207538E-02 0.9399761432577210E-02 0.9280768224338752E-02 0.9162934057976000E-02 0.9046250024202221E-02 0.8930707258102832E-02 0.8816296939273676E-02 0.8703010291955119E-02 0.8590838585161509E-02 0.8479773132806546E-02 0.8369805293824308E-02 0.8260926472285997E-02 0.8153128117512804E-02 0.8046401724184376E-02 0.7940738832443478E-02 0.7836131027996606E-02 0.7732569942210602E-02 0.7630047252205678E-02 0.7528554680944333E-02 0.7428083997316856E-02 0.7328627016223001E-02 0.7230175598650108E-02 0.7132721651747814E-02 0.7036257128899153E-02 0.6940774029788536E-02 0.6846264400466227E-02 0.6752720333409701E-02 0.6660133967581916E-02 0.6568497488486375E-02 0.6477803128219479E-02 0.6388043165519663E-02 0.6299209925814047E-02 0.6211295781262146E-02 0.6124293150797016E-02 0.6038194500163917E-02 0.5952992341956366E-02 0.5868679235650055E-02 0.5785247787634298E-02 0.5702690651241371E-02 0.5621000526773856E-02 0.5540170161529816E-02 0.5460192349826328E-02 0.5381059933021076E-02 0.5302765799532243E-02 0.5225302884857029E-02 0.5148664171588471E-02 0.5072842689431090E-02 0.4997831515215207E-02 0.4923623772910095E-02 0.4850212633636272E-02 0.4777591315676702E-02 0.4705753084487369E-02 0.4634691252707118E-02 0.4564399180166933E-02 0.4494870273898941E-02 0.4426097988144961E-02 0.4358075824365064E-02 0.4290797331245945E-02 0.4224256104709619E-02 0.4158445787922197E-02 0.4093360071303100E-02 0.4028992692534918E-02 0.3965337436573796E-02 0.3902388135660784E-02 0.3840138669334105E-02 0.3778582964442547E-02 0.3717714995160261E-02 0.3657528783002880E-02 0.3598018396845369E-02 0.3539177952941635E-02 0.3481001614946027E-02 0.3423483593937147E-02 0.3366618148443765E-02 0.3310399584473416E-02 0.3254822255543565E-02 0.3199880562715664E-02 0.3145568954632342E-02 0.3091881927557716E-02 0.3038814025421337E-02 0.2986359839865667E-02 0.2934514010297470E-02 0.2883271223943334E-02 0.2832626215909399E-02 0.2782573769245732E-02 0.2733108715015361E-02 0.2684225932368273E-02 0.2635920348620736E-02 0.2588186939339922E-02 0.2541020728434335E-02 0.2494416788250113E-02 0.2448370239673485E-02 0.2402876252239763E-02 0.2357930044248895E-02 0.2313526882888074E-02 0.2269662084361452E-02 0.2226331014027437E-02 0.2183529086543647E-02 0.2141251766019886E-02 0.2099494566179429E-02 0.2058253050528833E-02 0.2017522832536582E-02 0.1977299575820819E-02 0.1937578994346416E-02 0.1898356852631761E-02 0.1859628965965341E-02 0.1821391200632576E-02 0.1783639474153031E-02 0.1746369755528287E-02 0.1709578065500809E-02 0.1673260476823867E-02 0.1637413114542927E-02 0.1602032156288575E-02 0.1567113832581223E-02 0.1532654427147850E-02 0.1498650277250755E-02 0.1465097774028671E-02 0.1431993362850165E-02 0.1399333543679485E-02 0.1367114871454921E-02 0.1335333956479567E-02 0.1303987464824598E-02 0.1273072118744786E-02 0.1242584697106271E-02 0.1212522035826240E-02 0.1182881028324278E-02 0.1153658625985074E-02 0.1124851838631879E-02 0.1096457735010339E-02 0.1068473443281882E-02 0.1040896151525936E-02 0.1013723108250083E-02 0.9869516229069582E-03 0.9605790664167954E-03 0.9346028716940452E-03 0.9090205341765010E-03 0.8838296123550832E-03 0.8590277283020786E-03 0.8346125681955534E-03 0.8105818828371373E-03 0.7869334881601800E-03 0.7636652657249203E-03 0.7407751631967363E-03 0.7182611948033279E-03 0.6961214417659799E-03 0.6743540526996259E-03 0.6529572439758464E-03 0.6319293000421489E-03 0.6112685736903467E-03 0.5909734862658870E-03 0.5710425278092155E-03 0.5514742571193334E-03 0.5322673017285347E-03 0.5134203577763651E-03 0.4949321897694443E-03 0.4768016302125221E-03 0.4590275790946831E-03 0.4416090032129194E-03 0.4245449353136761E-03 0.4078344730309316E-03 0.3914767775974666E-03 0.3754710723036193E-03 0.3598166406754878E-03 0.3445128243419585E-03 0.3295590205570407E-03 0.3149546793411112E-03 0.3006993002013562E-03 0.2867924283882840E-03 0.2732336506415988E-03 0.2600225903747107E-03 0.2471589022432513E-03 0.2346422660385661E-03 0.2224723798427698E-03 0.2106489523774314E-03 0.1991716944731751E-03 0.1880403095829506E-03 0.1772544832569928E-03 0.1668138714930798E-03 0.1567180878715900E-03 0.1469666893810824E-03 0.1375591608372710E-03 0.1284948977961454E-03 0.1197731878613226E-03 0.1113931902866863E-03 0.1033539137784803E-03 0.9565419240704367E-04 0.8829265954769630E-04 0.8126771978413778E-04 0.7457751872672617E-04 0.6821991072362678E-04 0.6219242447627770E-04 0.5649222661344906E-04 0.5111608333233986E-04 0.4606032028242377E-04 0.4132078095054316E-04 0.3689278390632745E-04 0.3277107938782920E-04 0.2894980585093507E-04 0.2542244727468145E-04 0.2218179221009314E-04 0.1921989578338595E-04 0.1652804611495441E-04 0.1409673689099332E-04 0.1191564811913617E-04 0.9973637403230573E-05 0.8258744369264157E-05 0.6758211140689631E-05 0.5458521963065276E-05 0.4345465168603044E-05 0.3404220589992921E-05 0.2619475202729796E-05 0.1975569103509067E-05 0.1456672814492850E-05 0.1046995232007964E-05 0.7310192213004316E-06 0.4937588492987344E-06 0.3210285891032542E-06 0.1997107219284094E-06 0.1180030350752796E-06 0.6562550627018659E-07 0.3396305969110393E-07 0.1612304561662313E-07 0.6892228656363058E-08 0.2589636663001748E-08 0.8280887390551865E-09 0.2156614040605737E-09 0.4301139703498805E-10 0.6010118005039632E-11 0.5149083260942099E-12 0.2193180426472887E-13 0.3274661750280784E-15 0.9138109562588437E-18 0.1354704193168576E-21 0.5668023630192864E-28 0.1003507143230543E-40 0.5696705688614969E-79 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.2350503764662797E-10 0.1452741565148498E-08 0.1598024605657181E-07 0.8670887247915710E-07 0.3194268290355064E-06 0.9210999532108705E-06 0.2243032243257230E-05 0.4826533736759059E-05 0.9449280963997414E-05 0.1717086310497067E-04 0.2937628005930804E-04 0.4781640004850213E-04 0.7464459701436190E-04 0.1124489746320072E-03 0.1642797466831127E-03 0.2336714851009560E-03 0.3246600692852489E-03 0.4417942752036344E-03 0.5901420321021944E-03 0.7752914499470295E-03 0.1003346783485080E-02 0.1280919550391384E-02 0.1615115062592291E-02 0.2013514662642524E-02 0.2484153982012019E-02 0.3035497556237696E-02 0.3676410143962806E-02 0.4416125103690986E-02 0.5264210184320288E-02 0.6230531083824742E-02 0.7325213125386473E-02 0.8558601392363368E-02 0.9941219653166928E-02 0.1148372839483666E-01 0.1319688227020127E-01 0.1509148724834461E-01 0.1717835774193908E-01 0.1946827396813322E-01 0.2197193978231332E-01 0.2469994120640449E-01 0.2766270585561205E-01 0.3087046344978465E-01 0.3433320757803945E-01 0.3806065886804223E-01 0.4206222969448004E-01 0.4634699054488188E-01 0.5092363814510472E-01 0.5580046543156136E-01 0.6098533344267084E-01 0.6648564518809444E-01 0.7230832154110638E-01 0.7845977918695805E-01 0.8494591064833676E-01 0.9177206639800155E-01 0.9894303905839608E-01 0.1064630496784886E+00 0.1143357360692630E+00 0.1225641431711653E+00 0.1311507154193881E+00 0.1400972910661206E+00 0.1494050984128002E+00 0.1590747538999337E+00 0.1691062619971989E+00 0.1794990168322592E+00 0.1902518054930074E+00 0.2013628129347618E+00 0.2128296284212524E+00 0.2246492534260200E+00 0.2368181109190946E+00 0.2493320559624748E+00 0.2621863875369867E+00 0.2753758615225286E+00 0.2888947047534727E+00 0.3027366300710904E+00 0.3168948522952475E+00 0.3313621050382702E+00 0.3461306582847914E+00 0.3611923366625136E+00 0.3765385383301647E+00 0.3921602544104397E+00 0.4080480888974157E+00 0.4241922789697600E+00 0.4405827156430124E+00 0.4572089646963136E+00 0.4740602878111100E+00 0.4911256638616449E+00 0.5083938102993529E+00 0.5258532045756759E+00 0.5434921055502246E+00 0.5612985748336912E+00 0.5792604980173683E+00 0.5973656057436424E+00 0.6156014945742982E+00 0.6339556476159732E+00 0.6524154548645443E+00 0.6709682332326954E+00 0.6896012462273114E+00 0.7083017232457365E+00 0.7270568784622643E+00 0.7458539292785299E+00 0.7646801143137046E+00 0.7835227109126022E+00 0.8023690521519213E+00 0.8212065433269309E+00 0.8400226779029110E+00 0.8588050529176166E+00 0.8775413838228915E+00 0.8962195187553934E+00 0.9148274522281129E+00 0.9333533382360560E+00 0.9517855027710543E+00 0.9701124557421923E+00 0.9883229022998167E+00 0.1006405753562465E+01 0.1024350136747383E+01 0.1042145404706545E+01 0.1059781144871260E+01 0.1077247187609600E+01 0.1094533614001869E+01 0.1111630763040373E+01 0.1128529238260637E+01 0.1145219913812065E+01 0.1161693939976847E+01 0.1177942748146633E+01 0.1193958055267189E+01 0.1209731867761823E+01 0.1225256484945006E+01 0.1240524501938026E+01 0.1255528812099049E+01 0.1270262608980346E+01 0.1284719387825761E+01 0.1298892946621899E+01 0.1312777386716678E+01 0.1326367113019209E+01 0.1339656833795096E+01 0.1352641560071424E+01 0.1365316604665792E+01 0.1377677580853886E+01 0.1389720400690019E+01 0.1401441272995214E+01 0.1412836701027270E+01 0.1423903479847286E+01 0.1434638693397013E+01 0.1445039711301291E+01 0.1455104185409776E+01 0.1464830046091919E+01 0.1474215498299109E+01 0.1483259017407622E+01 0.1491959344855860E+01 0.1500315483589179E+01 0.1508326693325296E+01 0.1515992485653126E+01 0.1523312618977543E+01 0.1530287093322397E+01 0.1536916145003750E+01 0.1543200241185077E+01 0.1549140074325868E+01 0.1554736556534737E+01 0.1559990813837915E+01 0.1564904180373601E+01 0.1569478192522416E+01 0.1573714582983838E+01 0.1577615274808202E+01 0.1581182375393509E+01 0.1584418170455991E+01 0.1587325117983052E+01 0.1589905842176854E+01 0.1592163127396545E+01 0.1594099912106772E+01 0.1595719282839819E+01 0.1597024468178396E+01 0.1598018832765788E+01 0.1598705871349761E+01 0.1599089202866354E+01 0.1599172564569312E+01 0.1598959806210704E+01 0.1598454884277914E+01 0.1597661856291940E+01 0.1596584875171653E+01 0.1595228183668366E+01 0.1593596108874842E+01 0.1591693056812536E+01 0.1589523507100701E+01 0.1587092007710641E+01 0.1584403169808198E+01 0.1581461662687349E+01 0.1578272208797470E+01 0.1574839578866685E+01 0.1571168587123450E+01 0.1567264086618331E+01 0.1563130964647693E+01 0.1558774138280876E+01 0.1554198549992189E+01 0.1549409163398889E+01 0.1544410959106127E+01 0.1539208930659677E+01 0.1533808080607080E+01 0.1528213416667707E+01 0.1522429948012042E+01 0.1516462681650386E+01 0.1510316618931021E+01 0.1503996752147732E+01 0.1497508061256460E+01 0.1490855510700755E+01 0.1484044046345540E+01 0.1477078592518635E+01 0.1469964049159342E+01 0.1462705289073315E+01 0.1455307155292826E+01 0.1447774458541496E+01 0.1440111974802394E+01 0.1432324442988392E+01 0.1424416562713602E+01 0.1416392992164560E+01 0.1408258346069873E+01 0.1400017193766902E+01 0.1391674057364033E+01 0.1383233409997026E+01 0.1374699674177898E+01 0.1366077220234727E+01 0.1357370364840755E+01 0.1348583369631108E+01 0.1339720439905439E+01 0.1330785723414737E+01 0.1321783309230582E+01 0.1312717226695031E+01 0.1303591444449351E+01 0.1294409869539786E+01 0.1285176346598528E+01 0.1275894657098056E+01 0.1266568518676988E+01 0.1257201584535619E+01 0.1247797442899263E+01 0.1238359616547584E+01 0.1228891562408019E+01 0.1219396671211496E+01 0.1209878267208578E+01 0.1200339607944202E+01 0.1190783884089205E+01 0.1181214219326823E+01 0.1171633670292365E+01 0.1162045226564264E+01 0.1152451810704780E+01 0.1142856278348570E+01 0.1133261418337408E+01 0.1123669952899346E+01 0.1114084537870646E+01 0.1104507762958775E+01 0.1094942152044870E+01 0.1085390163524009E+01 0.1075854190681740E+01 0.1066336562105254E+01 0.1056839542127690E+01 0.1047365331304049E+01 0.1037916066917227E+01 0.1028493823512701E+01 0.1019100613460447E+01 0.1009738387542688E+01 0.1000409035566070E+01 0.9911143869969610E+00 0.9818562116185301E+00 0.9726362202083267E+00 0.9634560652350970E+00 0.9543173415736288E+00 0.9452215872364120E+00 0.9361702841209427E+00 0.9271648587715566E+00 0.9182066831546644E+00 0.9092970754463097E+00 0.9004373008310244E+00 0.8916285723109384E+00 0.8828720515241635E+00 0.8741688495714935E+00 0.8655200278504954E+00 0.8569265988960664E+00 0.8483895272266132E+00 0.8399097301949807E+00 0.8314880788433289E+00 0.8231253987611650E+00 0.8148224709457564E+00 0.8065800326641964E+00 0.7983987783164219E+00 0.7902793602984723E+00 0.7822223898653531E+00 0.7742284379928720E+00 0.7662980362378170E+00 0.7584316775959118E+00 0.7506298173569868E+00 0.7428928739568187E+00 0.7352212298251275E+00 0.7276152322292518E+00 0.7200751941130188E+00 0.7126013949303633E+00 0.7051940814732806E+00 0.6978534686936988E+00 0.6905797405188852E+00 0.6833730506600221E+00 0.6762335234136188E+00 0.6691612544554096E+00 0.6621563116264519E+00 0.6552187357111161E+00 0.6483485412067125E+00 0.6415457170844840E+00 0.6348102275417313E+00 0.6281420127448483E+00 0.6215409895630656E+00 0.6150070522926947E+00 0.6085400733717113E+00 0.6021399040845107E+00 0.5958063752566826E+00 0.5895392979396676E+00 0.5833384640851877E+00 0.5772036472093250E+00 0.5711346030461549E+00 0.5651310701908592E+00 0.5591927707322315E+00 0.5533194108745153E+00 0.5475106815485299E+00 0.5417662590120353E+00 0.5360858054393003E+00 0.5304689694998603E+00 0.5249153869264497E+00 0.5194246810720941E+00 0.5139964634563777E+00 0.5086303343008993E+00 0.5033258830539155E+00 0.4980826889042317E+00 0.4929003212843441E+00 0.4877783403628898E+00 0.4827162975264554E+00 0.4777137358507827E+00 0.4727701905614446E+00 0.4678851894840552E+00 0.4630582534840750E+00 0.4582888968962981E+00 0.4535766279440972E+00 0.4489209491485098E+00 0.4443213577272558E+00 0.4397773459837845E+00 0.4352884016864413E+00 0.4308540084378585E+00 0.4264736460346724E+00 0.4221467908176804E+00 0.4178729160125361E+00 0.4136514920611062E+00 0.4094819869436024E+00 0.4053638664915989E+00 0.4012965946920645E+00 0.3972796339825281E+00 0.3933124455374964E+00 0.3893944895462572E+00 0.3855252254821869E+00 0.3817041123636960E+00 0.3779306090069412E+00 0.3742041742704262E+00 0.3705242672916375E+00 0.3668903477158274E+00 0.3633018759170965E+00 0.3597583132118892E+00 0.3562591220650529E+00 0.3528037662885790E+00 0.3493917112331675E+00 0.3460224239727477E+00 0.3426953734820877E+00 0.3394100308076194E+00 0.3361658692316251E+00 0.3329623644299036E+00 0.3297989946230563E+00 0.3266752407215223E+00 0.3235905864644950E+00 0.3205445185528428E+00 0.3175365267761750E+00 0.3145661041341699E+00 0.3116327469522978E+00 0.3087359549920661E+00 0.3058752315559112E+00 0.3030500835868565E+00 0.3002600217630693E+00 0.2975045605874296E+00 0.2947832184722352E+00 0.2920955178191660E+00 0.2894409850946181E+00 0.2868191509005325E+00 0.2842295500408273E+00 0.2816717215835535E+00 0.2791452089188812E+00 0.2766495598130334E+00 0.2741843264582723E+00 0.2717490655190478E+00 0.2693433381744174E+00 0.2669667101568407E+00 0.2646187517874495E+00 0.2622990380079024E+00 0.2600071484089175E+00 0.2577426672555859E+00 0.2555051835095635E+00 0.2532942908482358E+00 0.2511095876809479E+00 0.2489506771623981E+00 0.2468171672032794E+00 0.2447086704782614E+00 0.2426248044314016E+00 0.2405651912790701E+00 0.2385294580104723E+00 0.2365172363858518E+00 0.2345281629324596E+00 0.2325618789383613E+00 0.2306180304441682E+00 0.2286962682327625E+00 0.2267962478170977E+00 0.2249176294261405E+00 0.2230600779890333E+00 0.2212232631175415E+00 0.2194068590868594E+00 0.2176105448148379E+00 0.2158340038397009E+00 0.2140769242963177E+00 0.2123389988910903E+00 0.2106199248755169E+00 0.2089194040184958E+00 0.2072371425774233E+00 0.2055728512681448E+00 0.2039262452338156E+00 0.2022970440127238E+00 0.2006849715051299E+00 0.1990897559391716E+00 0.1975111298358903E+00 0.1959488299734197E+00 0.1944025973503926E+00 0.1928721771486053E+00 0.1913573186949898E+00 0.1898577754229339E+00 0.1883733048329959E+00 0.1869036684530497E+00 0.1854486317979078E+00 0.1840079643284546E+00 0.1825814394103312E+00 0.1811688342722097E+00 0.1797699299636905E+00 0.1783845113128567E+00 0.1770123668835237E+00 0.1756532889322104E+00 0.1743070733648679E+00 0.1729735196933954E+00 0.1716524309919727E+00 0.1703436138532354E+00 0.1690468783443259E+00 0.1677620379628421E+00 0.1664889095927099E+00 0.1652273134600088E+00 0.1639770730887696E+00 0.1627380152567701E+00 0.1615099699513493E+00 0.1602927703252654E+00 0.1590862526526123E+00 0.1578902562848216E+00 0.1567046236067624E+00 0.1555291999929633E+00 0.1543638337639696E+00 0.1532083761428563E+00 0.1520626812119101E+00 0.1509266058694993E+00 0.1498000097871428E+00 0.1486827553667961E+00 0.1475747076983654E+00 0.1464757345174640E+00 0.1453857061634240E+00 0.1443044955375730E+00 0.1432319780617891E+00 0.1421680316373446E+00 0.1411125366040483E+00 0.1400653756996955E+00 0.1390264340198362E+00 0.1379955989778688E+00 0.1369727602654673E+00 0.1359578098133525E+00 0.1349506417524104E+00 0.1339511523751675E+00 0.1329592400976282E+00 0.1319748054214808E+00 0.1309977508966756E+00 0.1300279810843844E+00 0.1290654025203415E+00 0.1281099236785748E+00 0.1271614549355259E+00 0.1262199085345698E+00 0.1252851985509296E+00 0.1243572408569959E+00 0.1234359530880505E+00 0.1225212546083961E+00 0.1216130664778956E+00 0.1207113114189237E+00 0.1198159137837281E+00 0.1189267995222068E+00 0.1180438961500998E+00 0.1171671327175942E+00 0.1162964397783483E+00 0.1154317493589289E+00 0.1145729949286663E+00 0.1137201113699259E+00 0.1128730349487938E+00 0.1120317032861783E+00 0.1111960553293266E+00 0.1103660313237529E+00 0.1095415727855802E+00 0.1087226224742927E+00 0.1079091243658972E+00 0.1071010236264925E+00 0.1062982665862460E+00 0.1055008007137718E+00 0.1047085745909144E+00 0.1039215378879289E+00 0.1031396413390617E+00 0.1023628367185243E+00 0.1015910768168619E+00 0.1008243154177097E+00 0.1000625072749386E+00 0.9930560809018427E-01 0.9855357449075822E-01 0.9780636400793745E-01 0.9706393505562982E-01 0.9632624690941162E-01 0.9559325968593356E-01 0.9486493432269383E-01 0.9414123255817297E-01 0.9342211691232764E-01 0.9270755066744044E-01 0.9199749784932158E-01 0.9129192320885827E-01 0.9059079220391024E-01 0.8989407098154546E-01 0.8920172636061409E-01 0.8851372581465511E-01 0.8783003745513447E-01 0.8715063001500779E-01 0.8647547283260665E-01 0.8580453583584287E-01 0.8513778952672810E-01 0.8447520496620298E-01 0.8381675375927530E-01 0.8316240804045885E-01 0.8251214045951316E-01 0.8186592416747822E-01 0.8122373280299988E-01 0.8058554047894315E-01 0.7995132176928955E-01 0.7932105169631275E-01 0.7869470571803144E-01 0.7807225971593283E-01 0.7745368998296467E-01 0.7683897321179178E-01 0.7622808648331135E-01 0.7562100725542614E-01 0.7501771335206921E-01 0.7441818295247755E-01 0.7382239458071076E-01 0.7323032709541087E-01 0.7264195967979867E-01 0.7205727183190487E-01 0.7147624335502985E-01 0.7089885434843042E-01 0.7032508519822850E-01 0.6975491656853922E-01 0.6918832939281314E-01 0.6862530486539103E-01 0.6806582443326617E-01 0.6750986978805110E-01 0.6695742285814540E-01 0.6640846580110123E-01 0.6586298099618196E-01 0.6532095103711212E-01 0.6478235872501446E-01 0.6424718706153042E-01 0.6371541924212147E-01 0.6318703864954746E-01 0.6266202884751911E-01 0.6214037357452046E-01 0.6162205673779986E-01 0.6110706240752450E-01 0.6059537481109686E-01 0.6008697832762830E-01 0.5958185748256901E-01 0.5907999694248869E-01 0.5858138151000727E-01 0.5808599611887154E-01 0.5759382582917469E-01 0.5710485582271634E-01 0.5661907139850073E-01 0.5613645796836825E-01 0.5565700105276017E-01 0.5518068627661225E-01 0.5470749936537444E-01 0.5423742614115482E-01 0.5377045251898517E-01 0.5330656450320408E-01 0.5284574818395761E-01 0.5238798973381230E-01 0.5193327540447994E-01 0.5148159152365149E-01 0.5103292449193595E-01 0.5058726077990446E-01 0.5014458692523559E-01 0.4970488952995948E-01 0.4926815525779950E-01 0.4883437083160901E-01 0.4840352303089959E-01 0.4797559868946120E-01 0.4755058469306943E-01 0.4712846797727979E-01 0.4670923552530574E-01 0.4629287436597942E-01 0.4587937157179187E-01 0.4546871425701189E-01 0.4506088957588125E-01 0.4465588472088415E-01 0.4425368692108926E-01 0.4385428344056262E-01 0.4345766157684944E-01 0.4306380865952269E-01 0.4267271204879778E-01 0.4228435913421057E-01 0.4189873733335742E-01 0.4151583409069603E-01 0.4113563687640473E-01 0.4075813318529899E-01 0.4038331053580396E-01 0.4001115646898086E-01 0.3964165854760631E-01 0.3927480435530239E-01 0.3891058149571723E-01 0.3854897759175296E-01 0.3818998028484157E-01 0.3783357723426573E-01 0.3747975611652434E-01 0.3712850462474054E-01 0.3677981046811218E-01 0.3643366137140177E-01 0.3609004507446641E-01 0.3574894933182556E-01 0.3541036191226535E-01 0.3507427059847887E-01 0.3474066318674111E-01 0.3440952748661676E-01 0.3408085132070126E-01 0.3375462252439219E-01 0.3343082894569176E-01 0.3310945844503797E-01 0.3279049889516447E-01 0.3247393818098731E-01 0.3215976419951815E-01 0.3184796485980308E-01 0.3153852808288556E-01 0.3123144180179359E-01 0.3092669396154863E-01 0.3062427251919747E-01 0.3032416544386438E-01 0.3002636071682391E-01 0.2973084633159302E-01 0.2943761029404197E-01 0.2914664062252300E-01 0.2885792534801624E-01 0.2857145251429220E-01 0.2828721017808998E-01 0.2800518640931039E-01 0.2772536929122391E-01 0.2744774692069189E-01 0.2717230740840119E-01 0.2689903887911129E-01 0.2662792947191326E-01 0.2635896734050006E-01 0.2609214065344760E-01 0.2582743759450599E-01 0.2556484636290022E-01 0.2530435517364029E-01 0.2504595225783962E-01 0.2478962586304191E-01 0.2453536425355501E-01 0.2428315571079263E-01 0.2403298853362201E-01 0.2378485103871834E-01 0.2353873156092471E-01 0.2329461845361733E-01 0.2305250008907579E-01 0.2281236485885801E-01 0.2257420117417889E-01 0.2233799746629312E-01 0.2210374218688127E-01 0.2187142380843883E-01 0.2164103082466791E-01 0.2141255175087165E-01 0.2118597512435002E-01 0.2096128950479806E-01 0.2073848347470486E-01 0.2051754563975416E-01 0.2029846462922549E-01 0.2008122909639606E-01 0.1986582771894261E-01 0.1965224919934375E-01 0.1944048226528158E-01 0.1923051567004319E-01 0.1902233819292149E-01 0.1881593863961467E-01 0.1861130584262509E-01 0.1840842866165638E-01 0.1820729598400922E-01 0.1800789672497538E-01 0.1781021982822961E-01 0.1761425426621972E-01 0.1741998904055397E-01 0.1722741318238660E-01 0.1703651575280017E-01 0.1684728584318532E-01 0.1665971257561794E-01 0.1647378510323276E-01 0.1628949261059417E-01 0.1610682431406360E-01 0.1592576946216329E-01 0.1574631733593689E-01 0.1556845724930608E-01 0.1539217854942354E-01 0.1521747061702217E-01 0.1504432286676001E-01 0.1487272474756165E-01 0.1470266574295493E-01 0.1453413537140393E-01 0.1436712318663735E-01 0.1420161877797267E-01 0.1403761177063589E-01 0.1387509182607664E-01 0.1371404864227910E-01 0.1355447195406791E-01 0.1339635153340976E-01 0.1323967718971016E-01 0.1308443877010535E-01 0.1293062615974990E-01 0.1277822928209887E-01 0.1262723809918580E-01 0.1247764261189538E-01 0.1232943286023138E-01 0.1218259892357987E-01 0.1203713092096717E-01 0.1189301901131328E-01 0.1175025339368011E-01 0.1160882430751480E-01 0.1146872203288826E-01 0.1132993689072848E-01 0.1119245924304928E-01 0.1105627949317382E-01 0.1092138808595317E-01 0.1078777550798031E-01 0.1065543228779879E-01 0.1052434899610681E-01 0.1039451624595617E-01 0.1026592469294671E-01 0.1013856503541558E-01 0.1001242801462182E-01 0.9887504414926333E-02 0.9763785063966725E-02 0.9641260832827890E-02 0.9519922636207538E-02 0.9399761432577210E-02 0.9280768224338752E-02 0.9162934057976000E-02 0.9046250024202221E-02 0.8930707258102832E-02 0.8816296939273676E-02 0.8703010291955119E-02 0.8590838585161509E-02 0.8479773132806546E-02 0.8369805293824308E-02 0.8260926472285997E-02 0.8153128117512804E-02 0.8046401724184376E-02 0.7940738832443478E-02 0.7836131027996606E-02 0.7732569942210602E-02 0.7630047252205678E-02 0.7528554680944333E-02 0.7428083997316856E-02 0.7328627016223001E-02 0.7230175598650108E-02 0.7132721651747814E-02 0.7036257128899153E-02 0.6940774029788536E-02 0.6846264400466227E-02 0.6752720333409701E-02 0.6660133967581916E-02 0.6568497488486375E-02 0.6477803128219479E-02 0.6388043165519663E-02 0.6299209925814047E-02 0.6211295781262146E-02 0.6124293150797016E-02 0.6038194500163917E-02 0.5952992341956366E-02 0.5868679235650055E-02 0.5785247787634298E-02 0.5702690651241371E-02 0.5621000526773856E-02 0.5540170161529816E-02 0.5460192349826328E-02 0.5381059933021076E-02 0.5302765799532243E-02 0.5225302884857029E-02 0.5148664171588471E-02 0.5072842689431090E-02 0.4997831515215207E-02 0.4923623772910095E-02 0.4850212633636272E-02 0.4777591315676702E-02 0.4705753084487369E-02 0.4634691252707118E-02 0.4564399180166933E-02 0.4494870273898941E-02 0.4426097988144961E-02 0.4358075824365064E-02 0.4290797331245945E-02 0.4224256104709619E-02 0.4158445787922197E-02 0.4093360071303100E-02 0.4028992692534918E-02 0.3965337436573796E-02 0.3902388135660784E-02 0.3840138669334105E-02 0.3778582964442547E-02 0.3717714995160261E-02 0.3657528783002880E-02 0.3598018396845369E-02 0.3539177952941635E-02 0.3481001614946027E-02 0.3423483593937147E-02 0.3366618148443765E-02 0.3310399584473416E-02 0.3254822255543565E-02 0.3199880562715664E-02 0.3145568954632342E-02 0.3091881927557716E-02 0.3038814025421337E-02 0.2986359839865667E-02 0.2934514010297470E-02 0.2883271223943334E-02 0.2832626215909399E-02 0.2782573769245732E-02 0.2733108715015361E-02 0.2684225932368273E-02 0.2635920348620736E-02 0.2588186939339922E-02 0.2541020728434335E-02 0.2494416788250113E-02 0.2448370239673485E-02 0.2402876252239763E-02 0.2357930044248895E-02 0.2313526882888074E-02 0.2269662084361452E-02 0.2226331014027437E-02 0.2183529086543647E-02 0.2141251766019886E-02 0.2099494566179429E-02 0.2058253050528833E-02 0.2017522832536582E-02 0.1977299575820819E-02 0.1937578994346416E-02 0.1898356852631761E-02 0.1859628965965341E-02 0.1821391200632576E-02 0.1783639474153031E-02 0.1746369755528287E-02 0.1709578065500809E-02 0.1673260476823867E-02 0.1637413114542927E-02 0.1602032156288575E-02 0.1567113832581223E-02 0.1532654427147850E-02 0.1498650277250755E-02 0.1465097774028671E-02 0.1431993362850165E-02 0.1399333543679485E-02 0.1367114871454921E-02 0.1335333956479567E-02 0.1303987464824598E-02 0.1273072118744786E-02 0.1242584697106271E-02 0.1212522035826240E-02 0.1182881028324278E-02 0.1153658625985074E-02 0.1124851838631879E-02 0.1096457735010339E-02 0.1068473443281882E-02 0.1040896151525936E-02 0.1013723108250083E-02 0.9869516229069582E-03 0.9605790664167954E-03 0.9346028716940452E-03 0.9090205341765010E-03 0.8838296123550832E-03 0.8590277283020786E-03 0.8346125681955534E-03 0.8105818828371373E-03 0.7869334881601800E-03 0.7636652657249203E-03 0.7407751631967363E-03 0.7182611948033279E-03 0.6961214417659799E-03 0.6743540526996259E-03 0.6529572439758464E-03 0.6319293000421489E-03 0.6112685736903467E-03 0.5909734862658870E-03 0.5710425278092155E-03 0.5514742571193334E-03 0.5322673017285347E-03 0.5134203577763651E-03 0.4949321897694443E-03 0.4768016302125221E-03 0.4590275790946831E-03 0.4416090032129194E-03 0.4245449353136761E-03 0.4078344730309316E-03 0.3914767775974666E-03 0.3754710723036193E-03 0.3598166406754878E-03 0.3445128243419585E-03 0.3295590205570407E-03 0.3149546793411112E-03 0.3006993002013562E-03 0.2867924283882840E-03 0.2732336506415988E-03 0.2600225903747107E-03 0.2471589022432513E-03 0.2346422660385661E-03 0.2224723798427698E-03 0.2106489523774314E-03 0.1991716944731751E-03 0.1880403095829506E-03 0.1772544832569928E-03 0.1668138714930798E-03 0.1567180878715900E-03 0.1469666893810824E-03 0.1375591608372710E-03 0.1284948977961454E-03 0.1197731878613226E-03 0.1113931902866863E-03 0.1033539137784803E-03 0.9565419240704367E-04 0.8829265954769630E-04 0.8126771978413778E-04 0.7457751872672617E-04 0.6821991072362678E-04 0.6219242447627770E-04 0.5649222661344906E-04 0.5111608333233986E-04 0.4606032028242377E-04 0.4132078095054316E-04 0.3689278390632745E-04 0.3277107938782920E-04 0.2894980585093507E-04 0.2542244727468145E-04 0.2218179221009314E-04 0.1921989578338595E-04 0.1652804611495441E-04 0.1409673689099332E-04 0.1191564811913617E-04 0.9973637403230573E-05 0.8258744369264157E-05 0.6758211140689631E-05 0.5458521963065276E-05 0.4345465168603044E-05 0.3404220589992921E-05 0.2619475202729796E-05 0.1975569103509067E-05 0.1456672814492850E-05 0.1046995232007964E-05 0.7310192213004316E-06 0.4937588492987344E-06 0.3210285891032542E-06 0.1997107219284094E-06 0.1180030350752796E-06 0.6562550627018659E-07 0.3396305969110393E-07 0.1612304561662313E-07 0.6892228656363058E-08 0.2589636663001748E-08 0.8280887390551865E-09 0.2156614040605737E-09 0.4301139703498805E-10 0.6010118005039632E-11 0.5149083260942099E-12 0.2193180426472887E-13 0.3274661750280784E-15 0.9138109562588437E-18 0.1354704193168576E-21 0.5668023630192864E-28 0.1003507143230543E-40 0.5696705688614969E-79 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.2350503764662797E-10 0.1452741565148498E-08 0.1598024605657181E-07 0.8670887247915710E-07 0.3194268290355064E-06 0.9210999532108705E-06 0.2243032243257230E-05 0.4826533736759059E-05 0.9449280963997414E-05 0.1717086310497067E-04 0.2937628005930804E-04 0.4781640004850213E-04 0.7464459701436190E-04 0.1124489746320072E-03 0.1642797466831127E-03 0.2336714851009560E-03 0.3246600692852489E-03 0.4417942752036344E-03 0.5901420321021944E-03 0.7752914499470295E-03 0.1003346783485080E-02 0.1280919550391384E-02 0.1615115062592291E-02 0.2013514662642524E-02 0.2484153982012019E-02 0.3035497556237696E-02 0.3676410143962806E-02 0.4416125103690986E-02 0.5264210184320288E-02 0.6230531083824742E-02 0.7325213125386473E-02 0.8558601392363368E-02 0.9941219653166928E-02 0.1148372839483666E-01 0.1319688227020127E-01 0.1509148724834461E-01 0.1717835774193908E-01 0.1946827396813322E-01 0.2197193978231332E-01 0.2469994120640449E-01 0.2766270585561205E-01 0.3087046344978465E-01 0.3433320757803945E-01 0.3806065886804223E-01 0.4206222969448004E-01 0.4634699054488188E-01 0.5092363814510472E-01 0.5580046543156136E-01 0.6098533344267084E-01 0.6648564518809444E-01 0.7230832154110638E-01 0.7845977918695805E-01 0.8494591064833676E-01 0.9177206639800155E-01 0.9894303905839608E-01 0.1064630496784886E+00 0.1143357360692630E+00 0.1225641431711653E+00 0.1311507154193881E+00 0.1400972910661206E+00 0.1494050984128002E+00 0.1590747538999337E+00 0.1691062619971989E+00 0.1794990168322592E+00 0.1902518054930074E+00 0.2013628129347618E+00 0.2128296284212524E+00 0.2246492534260200E+00 0.2368181109190946E+00 0.2493320559624748E+00 0.2621863875369867E+00 0.2753758615225286E+00 0.2888947047534727E+00 0.3027366300710904E+00 0.3168948522952475E+00 0.3313621050382702E+00 0.3461306582847914E+00 0.3611923366625136E+00 0.3765385383301647E+00 0.3921602544104397E+00 0.4080480888974157E+00 0.4241922789697600E+00 0.4405827156430124E+00 0.4572089646963136E+00 0.4740602878111100E+00 0.4911256638616449E+00 0.5083938102993529E+00 0.5258532045756759E+00 0.5434921055502246E+00 0.5612985748336912E+00 0.5792604980173683E+00 0.5973656057436424E+00 0.6156014945742982E+00 0.6339556476159732E+00 0.6524154548645443E+00 0.6709682332326954E+00 0.6896012462273114E+00 0.7083017232457365E+00 0.7270568784622643E+00 0.7458539292785299E+00 0.7646801143137046E+00 0.7835227109126022E+00 0.8023690521519213E+00 0.8212065433269309E+00 0.8400226779029110E+00 0.8588050529176166E+00 0.8775413838228915E+00 0.8962195187553934E+00 0.9148274522281129E+00 0.9333533382360560E+00 0.9517855027710543E+00 0.9701124557421923E+00 0.9883229022998167E+00 0.1006405753562465E+01 0.1024350136747383E+01 0.1042145404706545E+01 0.1059781144871260E+01 0.1077247187609600E+01 0.1094533614001869E+01 0.1111630763040373E+01 0.1128529238260637E+01 0.1145219913812065E+01 0.1161693939976847E+01 0.1177942748146633E+01 0.1193958055267189E+01 0.1209731867761823E+01 0.1225256484945006E+01 0.1240524501938026E+01 0.1255528812099049E+01 0.1270262608980346E+01 0.1284719387825761E+01 0.1298892946621899E+01 0.1312777386716678E+01 0.1326367113019209E+01 0.1339656833795096E+01 0.1352641560071424E+01 0.1365316604665792E+01 0.1377677580853886E+01 0.1389720400690019E+01 0.1401441272995214E+01 0.1412836701027270E+01 0.1423903479847286E+01 0.1434638693397013E+01 0.1445039711301291E+01 0.1455104185409776E+01 0.1464830046091919E+01 0.1474215498299109E+01 0.1483259017407622E+01 0.1491959344855860E+01 0.1500315483589179E+01 0.1508326693325296E+01 0.1515992485653126E+01 0.1523312618977543E+01 0.1530287093322397E+01 0.1536916145003750E+01 0.1543200241185077E+01 0.1549140074325868E+01 0.1554736556534737E+01 0.1559990813837915E+01 0.1564904180373601E+01 0.1569478192522416E+01 0.1573714582983838E+01 0.1577615274808202E+01 0.1581182375393509E+01 0.1584418170455991E+01 0.1587325117983052E+01 0.1589905842176854E+01 0.1592163127396545E+01 0.1594099912106772E+01 0.1595719282839819E+01 0.1597024468178396E+01 0.1598018832765788E+01 0.1598705871349761E+01 0.1599089202866354E+01 0.1599172564569312E+01 0.1598959806210704E+01 0.1598454884277914E+01 0.1597661856291940E+01 0.1596584875171653E+01 0.1595228183668366E+01 0.1593596108874842E+01 0.1591693056812536E+01 0.1589523507100701E+01 0.1587092007710641E+01 0.1584403169808198E+01 0.1581461662687349E+01 0.1578272208797470E+01 0.1574839578866685E+01 0.1571168587123450E+01 0.1567264086618331E+01 0.1563130964647693E+01 0.1558774138280876E+01 0.1554198549992189E+01 0.1549409163398889E+01 0.1544410959106127E+01 0.1539208930659677E+01 0.1533808080607080E+01 0.1528213416667707E+01 0.1522429948012042E+01 0.1516462681650386E+01 0.1510316618931021E+01 0.1503996752147732E+01 0.1497508061256460E+01 0.1490855510700755E+01 0.1484044046345540E+01 0.1477078592518635E+01 0.1469964049159342E+01 0.1462705289073315E+01 0.1455307155292826E+01 0.1447774458541496E+01 0.1440111974802394E+01 0.1432324442988392E+01 0.1424416562713602E+01 0.1416392992164560E+01 0.1408258346069873E+01 0.1400017193766902E+01 0.1391674057364033E+01 0.1383233409997026E+01 0.1374699674177898E+01 0.1366077220234727E+01 0.1357370364840755E+01 0.1348583369631108E+01 0.1339720439905439E+01 0.1330785723414737E+01 0.1321783309230582E+01 0.1312717226695031E+01 0.1303591444449351E+01 0.1294409869539786E+01 0.1285176346598528E+01 0.1275894657098056E+01 0.1266568518676988E+01 0.1257201584535619E+01 0.1247797442899263E+01 0.1238359616547584E+01 0.1228891562408019E+01 0.1219396671211496E+01 0.1209878267208578E+01 0.1200339607944202E+01 0.1190783884089205E+01 0.1181214219326823E+01 0.1171633670292365E+01 0.1162045226564264E+01 0.1152451810704780E+01 0.1142856278348570E+01 0.1133261418337408E+01 0.1123669952899346E+01 0.1114084537870646E+01 0.1104507762958775E+01 0.1094942152044870E+01 0.1085390163524009E+01 0.1075854190681740E+01 0.1066336562105254E+01 0.1056839542127690E+01 0.1047365331304049E+01 0.1037916066917227E+01 0.1028493823512701E+01 0.1019100613460447E+01 0.1009738387542688E+01 0.1000409035566070E+01 0.9911143869969610E+00 0.9818562116185301E+00 0.9726362202083267E+00 0.9634560652350970E+00 0.9543173415736288E+00 0.9452215872364120E+00 0.9361702841209427E+00 0.9271648587715566E+00 0.9182066831546644E+00 0.9092970754463097E+00 0.9004373008310244E+00 0.8916285723109384E+00 0.8828720515241635E+00 0.8741688495714935E+00 0.8655200278504954E+00 0.8569265988960664E+00 0.8483895272266132E+00 0.8399097301949807E+00 0.8314880788433289E+00 0.8231253987611650E+00 0.8148224709457564E+00 0.8065800326641964E+00 0.7983987783164219E+00 0.7902793602984723E+00 0.7822223898653531E+00 0.7742284379928720E+00 0.7662980362378170E+00 0.7584316775959118E+00 0.7506298173569868E+00 0.7428928739568187E+00 0.7352212298251275E+00 0.7276152322292518E+00 0.7200751941130188E+00 0.7126013949303633E+00 0.7051940814732806E+00 0.6978534686936988E+00 0.6905797405188852E+00 0.6833730506600221E+00 0.6762335234136188E+00 0.6691612544554096E+00 0.6621563116264519E+00 0.6552187357111161E+00 0.6483485412067125E+00 0.6415457170844840E+00 0.6348102275417313E+00 0.6281420127448483E+00 0.6215409895630656E+00 0.6150070522926947E+00 0.6085400733717113E+00 0.6021399040845107E+00 0.5958063752566826E+00 0.5895392979396676E+00 0.5833384640851877E+00 0.5772036472093250E+00 0.5711346030461549E+00 0.5651310701908592E+00 0.5591927707322315E+00 0.5533194108745153E+00 0.5475106815485299E+00 0.5417662590120353E+00 0.5360858054393003E+00 0.5304689694998603E+00 0.5249153869264497E+00 0.5194246810720941E+00 0.5139964634563777E+00 0.5086303343008993E+00 0.5033258830539155E+00 0.4980826889042317E+00 0.4929003212843441E+00 0.4877783403628898E+00 0.4827162975264554E+00 0.4777137358507827E+00 0.4727701905614446E+00 0.4678851894840552E+00 0.4630582534840750E+00 0.4582888968962981E+00 0.4535766279440972E+00 0.4489209491485098E+00 0.4443213577272558E+00 0.4397773459837845E+00 0.4352884016864413E+00 0.4308540084378585E+00 0.4264736460346724E+00 0.4221467908176804E+00 0.4178729160125361E+00 0.4136514920611062E+00 0.4094819869436024E+00 0.4053638664915989E+00 0.4012965946920645E+00 0.3972796339825281E+00 0.3933124455374964E+00 0.3893944895462572E+00 0.3855252254821869E+00 0.3817041123636960E+00 0.3779306090069412E+00 0.3742041742704262E+00 0.3705242672916375E+00 0.3668903477158274E+00 0.3633018759170965E+00 0.3597583132118892E+00 0.3562591220650529E+00 0.3528037662885790E+00 0.3493917112331675E+00 0.3460224239727477E+00 0.3426953734820877E+00 0.3394100308076194E+00 0.3361658692316251E+00 0.3329623644299036E+00 0.3297989946230563E+00 0.3266752407215223E+00 0.3235905864644950E+00 0.3205445185528428E+00 0.3175365267761750E+00 0.3145661041341699E+00 0.3116327469522978E+00 0.3087359549920661E+00 0.3058752315559112E+00 0.3030500835868565E+00 0.3002600217630693E+00 0.2975045605874296E+00 0.2947832184722352E+00 0.2920955178191660E+00 0.2894409850946181E+00 0.2868191509005325E+00 0.2842295500408273E+00 0.2816717215835535E+00 0.2791452089188812E+00 0.2766495598130334E+00 0.2741843264582723E+00 0.2717490655190478E+00 0.2693433381744174E+00 0.2669667101568407E+00 0.2646187517874495E+00 0.2622990380079024E+00 0.2600071484089175E+00 0.2577426672555859E+00 0.2555051835095635E+00 0.2532942908482358E+00 0.2511095876809479E+00 0.2489506771623981E+00 0.2468171672032794E+00 0.2447086704782614E+00 0.2426248044314016E+00 0.2405651912790701E+00 0.2385294580104723E+00 0.2365172363858518E+00 0.2345281629324596E+00 0.2325618789383613E+00 0.2306180304441682E+00 0.2286962682327625E+00 0.2267962478170977E+00 0.2249176294261405E+00 0.2230600779890333E+00 0.2212232631175415E+00 0.2194068590868594E+00 0.2176105448148379E+00 0.2158340038397009E+00 0.2140769242963177E+00 0.2123389988910903E+00 0.2106199248755169E+00 0.2089194040184958E+00 0.2072371425774233E+00 0.2055728512681448E+00 0.2039262452338156E+00 0.2022970440127238E+00 0.2006849715051299E+00 0.1990897559391716E+00 0.1975111298358903E+00 0.1959488299734197E+00 0.1944025973503926E+00 0.1928721771486053E+00 0.1913573186949898E+00 0.1898577754229339E+00 0.1883733048329959E+00 0.1869036684530497E+00 0.1854486317979078E+00 0.1840079643284546E+00 0.1825814394103312E+00 0.1811688342722097E+00 0.1797699299636905E+00 0.1783845113128567E+00 0.1770123668835237E+00 0.1756532889322104E+00 0.1743070733648679E+00 0.1729735196933954E+00 0.1716524309919727E+00 0.1703436138532354E+00 0.1690468783443259E+00 0.1677620379628421E+00 0.1664889095927099E+00 0.1652273134600088E+00 0.1639770730887696E+00 0.1627380152567701E+00 0.1615099699513493E+00 0.1602927703252654E+00 0.1590862526526123E+00 0.1578902562848216E+00 0.1567046236067624E+00 0.1555291999929633E+00 0.1543638337639696E+00 0.1532083761428563E+00 0.1520626812119101E+00 0.1509266058694993E+00 0.1498000097871428E+00 0.1486827553667961E+00 0.1475747076983654E+00 0.1464757345174640E+00 0.1453857061634240E+00 0.1443044955375730E+00 0.1432319780617891E+00 0.1421680316373446E+00 0.1411125366040483E+00 0.1400653756996955E+00 0.1390264340198362E+00 0.1379955989778688E+00 0.1369727602654673E+00 0.1359578098133525E+00 0.1349506417524104E+00 0.1339511523751675E+00 0.1329592400976282E+00 0.1319748054214808E+00 0.1309977508966756E+00 0.1300279810843844E+00 0.1290654025203415E+00 0.1281099236785748E+00 0.1271614549355259E+00 0.1262199085345698E+00 0.1252851985509296E+00 0.1243572408569959E+00 0.1234359530880505E+00 0.1225212546083961E+00 0.1216130664778956E+00 0.1207113114189237E+00 0.1198159137837281E+00 0.1189267995222068E+00 0.1180438961500998E+00 0.1171671327175942E+00 0.1162964397783483E+00 0.1154317493589289E+00 0.1145729949286663E+00 0.1137201113699259E+00 0.1128730349487938E+00 0.1120317032861783E+00 0.1111960553293266E+00 0.1103660313237529E+00 0.1095415727855802E+00 0.1087226224742927E+00 0.1079091243658972E+00 0.1071010236264925E+00 0.1062982665862460E+00 0.1055008007137718E+00 0.1047085745909144E+00 0.1039215378879289E+00 0.1031396413390617E+00 0.1023628367185243E+00 0.1015910768168619E+00 0.1008243154177097E+00 0.1000625072749386E+00 0.9930560809018427E-01 0.9855357449075822E-01 0.9780636400793745E-01 0.9706393505562982E-01 0.9632624690941162E-01 0.9559325968593356E-01 0.9486493432269383E-01 0.9414123255817297E-01 0.9342211691232764E-01 0.9270755066744044E-01 0.9199749784932158E-01 0.9129192320885827E-01 0.9059079220391024E-01 0.8989407098154546E-01 0.8920172636061409E-01 0.8851372581465511E-01 0.8783003745513447E-01 0.8715063001500779E-01 0.8647547283260665E-01 0.8580453583584287E-01 0.8513778952672810E-01 0.8447520496620298E-01 0.8381675375927530E-01 0.8316240804045885E-01 0.8251214045951316E-01 0.8186592416747822E-01 0.8122373280299988E-01 0.8058554047894315E-01 0.7995132176928955E-01 0.7932105169631275E-01 0.7869470571803144E-01 0.7807225971593283E-01 0.7745368998296467E-01 0.7683897321179178E-01 0.7622808648331135E-01 0.7562100725542614E-01 0.7501771335206921E-01 0.7441818295247755E-01 0.7382239458071076E-01 0.7323032709541087E-01 0.7264195967979867E-01 0.7205727183190487E-01 0.7147624335502985E-01 0.7089885434843042E-01 0.7032508519822850E-01 0.6975491656853922E-01 0.6918832939281314E-01 0.6862530486539103E-01 0.6806582443326617E-01 0.6750986978805110E-01 0.6695742285814540E-01 0.6640846580110123E-01 0.6586298099618196E-01 0.6532095103711212E-01 0.6478235872501446E-01 0.6424718706153042E-01 0.6371541924212147E-01 0.6318703864954746E-01 0.6266202884751911E-01 0.6214037357452046E-01 0.6162205673779986E-01 0.6110706240752450E-01 0.6059537481109686E-01 0.6008697832762830E-01 0.5958185748256901E-01 0.5907999694248869E-01 0.5858138151000727E-01 0.5808599611887154E-01 0.5759382582917469E-01 0.5710485582271634E-01 0.5661907139850073E-01 0.5613645796836825E-01 0.5565700105276017E-01 0.5518068627661225E-01 0.5470749936537444E-01 0.5423742614115482E-01 0.5377045251898517E-01 0.5330656450320408E-01 0.5284574818395761E-01 0.5238798973381230E-01 0.5193327540447994E-01 0.5148159152365149E-01 0.5103292449193595E-01 0.5058726077990446E-01 0.5014458692523559E-01 0.4970488952995948E-01 0.4926815525779950E-01 0.4883437083160901E-01 0.4840352303089959E-01 0.4797559868946120E-01 0.4755058469306943E-01 0.4712846797727979E-01 0.4670923552530574E-01 0.4629287436597942E-01 0.4587937157179187E-01 0.4546871425701189E-01 0.4506088957588125E-01 0.4465588472088415E-01 0.4425368692108926E-01 0.4385428344056262E-01 0.4345766157684944E-01 0.4306380865952269E-01 0.4267271204879778E-01 0.4228435913421057E-01 0.4189873733335742E-01 0.4151583409069603E-01 0.4113563687640473E-01 0.4075813318529899E-01 0.4038331053580396E-01 0.4001115646898086E-01 0.3964165854760631E-01 0.3927480435530239E-01 0.3891058149571723E-01 0.3854897759175296E-01 0.3818998028484157E-01 0.3783357723426573E-01 0.3747975611652434E-01 0.3712850462474054E-01 0.3677981046811218E-01 0.3643366137140177E-01 0.3609004507446641E-01 0.3574894933182556E-01 0.3541036191226535E-01 0.3507427059847887E-01 0.3474066318674111E-01 0.3440952748661676E-01 0.3408085132070126E-01 0.3375462252439219E-01 0.3343082894569176E-01 0.3310945844503797E-01 0.3279049889516447E-01 0.3247393818098731E-01 0.3215976419951815E-01 0.3184796485980308E-01 0.3153852808288556E-01 0.3123144180179359E-01 0.3092669396154863E-01 0.3062427251919747E-01 0.3032416544386438E-01 0.3002636071682391E-01 0.2973084633159302E-01 0.2943761029404197E-01 0.2914664062252300E-01 0.2885792534801624E-01 0.2857145251429220E-01 0.2828721017808998E-01 0.2800518640931039E-01 0.2772536929122391E-01 0.2744774692069189E-01 0.2717230740840119E-01 0.2689903887911129E-01 0.2662792947191326E-01 0.2635896734050006E-01 0.2609214065344760E-01 0.2582743759450599E-01 0.2556484636290022E-01 0.2530435517364029E-01 0.2504595225783962E-01 0.2478962586304191E-01 0.2453536425355501E-01 0.2428315571079263E-01 0.2403298853362201E-01 0.2378485103871834E-01 0.2353873156092471E-01 0.2329461845361733E-01 0.2305250008907579E-01 0.2281236485885801E-01 0.2257420117417889E-01 0.2233799746629312E-01 0.2210374218688127E-01 0.2187142380843883E-01 0.2164103082466791E-01 0.2141255175087165E-01 0.2118597512435002E-01 0.2096128950479806E-01 0.2073848347470486E-01 0.2051754563975416E-01 0.2029846462922549E-01 0.2008122909639606E-01 0.1986582771894261E-01 0.1965224919934375E-01 0.1944048226528158E-01 0.1923051567004319E-01 0.1902233819292149E-01 0.1881593863961467E-01 0.1861130584262509E-01 0.1840842866165638E-01 0.1820729598400922E-01 0.1800789672497538E-01 0.1781021982822961E-01 0.1761425426621972E-01 0.1741998904055397E-01 0.1722741318238660E-01 0.1703651575280017E-01 0.1684728584318532E-01 0.1665971257561794E-01 0.1647378510323276E-01 0.1628949261059417E-01 0.1610682431406360E-01 0.1592576946216329E-01 0.1574631733593689E-01 0.1556845724930608E-01 0.1539217854942354E-01 0.1521747061702217E-01 0.1504432286676001E-01 0.1487272474756165E-01 0.1470266574295493E-01 0.1453413537140393E-01 0.1436712318663735E-01 0.1420161877797267E-01 0.1403761177063589E-01 0.1387509182607664E-01 0.1371404864227910E-01 0.1355447195406791E-01 0.1339635153340976E-01 0.1323967718971016E-01 0.1308443877010535E-01 0.1293062615974990E-01 0.1277822928209887E-01 0.1262723809918580E-01 0.1247764261189538E-01 0.1232943286023138E-01 0.1218259892357987E-01 0.1203713092096717E-01 0.1189301901131328E-01 0.1175025339368011E-01 0.1160882430751480E-01 0.1146872203288826E-01 0.1132993689072848E-01 0.1119245924304928E-01 0.1105627949317382E-01 0.1092138808595317E-01 0.1078777550798031E-01 0.1065543228779879E-01 0.1052434899610681E-01 0.1039451624595617E-01 0.1026592469294671E-01 0.1013856503541558E-01 0.1001242801462182E-01 0.9887504414926333E-02 0.9763785063966725E-02 0.9641260832827890E-02 0.9519922636207538E-02 0.9399761432577210E-02 0.9280768224338752E-02 0.9162934057976000E-02 0.9046250024202221E-02 0.8930707258102832E-02 0.8816296939273676E-02 0.8703010291955119E-02 0.8590838585161509E-02 0.8479773132806546E-02 0.8369805293824308E-02 0.8260926472285997E-02 0.8153128117512804E-02 0.8046401724184376E-02 0.7940738832443478E-02 0.7836131027996606E-02 0.7732569942210602E-02 0.7630047252205678E-02 0.7528554680944333E-02 0.7428083997316856E-02 0.7328627016223001E-02 0.7230175598650108E-02 0.7132721651747814E-02 0.7036257128899153E-02 0.6940774029788536E-02 0.6846264400466227E-02 0.6752720333409701E-02 0.6660133967581916E-02 0.6568497488486375E-02 0.6477803128219479E-02 0.6388043165519663E-02 0.6299209925814047E-02 0.6211295781262146E-02 0.6124293150797016E-02 0.6038194500163917E-02 0.5952992341956366E-02 0.5868679235650055E-02 0.5785247787634298E-02 0.5702690651241371E-02 0.5621000526773856E-02 0.5540170161529816E-02 0.5460192349826328E-02 0.5381059933021076E-02 0.5302765799532243E-02 0.5225302884857029E-02 0.5148664171588471E-02 0.5072842689431090E-02 0.4997831515215207E-02 0.4923623772910095E-02 0.4850212633636272E-02 0.4777591315676702E-02 0.4705753084487369E-02 0.4634691252707118E-02 0.4564399180166933E-02 0.4494870273898941E-02 0.4426097988144961E-02 0.4358075824365064E-02 0.4290797331245945E-02 0.4224256104709619E-02 0.4158445787922197E-02 0.4093360071303100E-02 0.4028992692534918E-02 0.3965337436573796E-02 0.3902388135660784E-02 0.3840138669334105E-02 0.3778582964442547E-02 0.3717714995160261E-02 0.3657528783002880E-02 0.3598018396845369E-02 0.3539177952941635E-02 0.3481001614946027E-02 0.3423483593937147E-02 0.3366618148443765E-02 0.3310399584473416E-02 0.3254822255543565E-02 0.3199880562715664E-02 0.3145568954632342E-02 0.3091881927557716E-02 0.3038814025421337E-02 0.2986359839865667E-02 0.2934514010297470E-02 0.2883271223943334E-02 0.2832626215909399E-02 0.2782573769245732E-02 0.2733108715015361E-02 0.2684225932368273E-02 0.2635920348620736E-02 0.2588186939339922E-02 0.2541020728434335E-02 0.2494416788250113E-02 0.2448370239673485E-02 0.2402876252239763E-02 0.2357930044248895E-02 0.2313526882888074E-02 0.2269662084361452E-02 0.2226331014027437E-02 0.2183529086543647E-02 0.2141251766019886E-02 0.2099494566179429E-02 0.2058253050528833E-02 0.2017522832536582E-02 0.1977299575820819E-02 0.1937578994346416E-02 0.1898356852631761E-02 0.1859628965965341E-02 0.1821391200632576E-02 0.1783639474153031E-02 0.1746369755528287E-02 0.1709578065500809E-02 0.1673260476823867E-02 0.1637413114542927E-02 0.1602032156288575E-02 0.1567113832581223E-02 0.1532654427147850E-02 0.1498650277250755E-02 0.1465097774028671E-02 0.1431993362850165E-02 0.1399333543679485E-02 0.1367114871454921E-02 0.1335333956479567E-02 0.1303987464824598E-02 0.1273072118744786E-02 0.1242584697106271E-02 0.1212522035826240E-02 0.1182881028324278E-02 0.1153658625985074E-02 0.1124851838631879E-02 0.1096457735010339E-02 0.1068473443281882E-02 0.1040896151525936E-02 0.1013723108250083E-02 0.9869516229069582E-03 0.9605790664167954E-03 0.9346028716940452E-03 0.9090205341765010E-03 0.8838296123550832E-03 0.8590277283020786E-03 0.8346125681955534E-03 0.8105818828371373E-03 0.7869334881601800E-03 0.7636652657249203E-03 0.7407751631967363E-03 0.7182611948033279E-03 0.6961214417659799E-03 0.6743540526996259E-03 0.6529572439758464E-03 0.6319293000421489E-03 0.6112685736903467E-03 0.5909734862658870E-03 0.5710425278092155E-03 0.5514742571193334E-03 0.5322673017285347E-03 0.5134203577763651E-03 0.4949321897694443E-03 0.4768016302125221E-03 0.4590275790946831E-03 0.4416090032129194E-03 0.4245449353136761E-03 0.4078344730309316E-03 0.3914767775974666E-03 0.3754710723036193E-03 0.3598166406754878E-03 0.3445128243419585E-03 0.3295590205570407E-03 0.3149546793411112E-03 0.3006993002013562E-03 0.2867924283882840E-03 0.2732336506415988E-03 0.2600225903747107E-03 0.2471589022432513E-03 0.2346422660385661E-03 0.2224723798427698E-03 0.2106489523774314E-03 0.1991716944731751E-03 0.1880403095829506E-03 0.1772544832569928E-03 0.1668138714930798E-03 0.1567180878715900E-03 0.1469666893810824E-03 0.1375591608372710E-03 0.1284948977961454E-03 0.1197731878613226E-03 0.1113931902866863E-03 0.1033539137784803E-03 0.9565419240704367E-04 0.8829265954769630E-04 0.8126771978413778E-04 0.7457751872672617E-04 0.6821991072362678E-04 0.6219242447627770E-04 0.5649222661344906E-04 0.5111608333233986E-04 0.4606032028242377E-04 0.4132078095054316E-04 0.3689278390632745E-04 0.3277107938782920E-04 0.2894980585093507E-04 0.2542244727468145E-04 0.2218179221009314E-04 0.1921989578338595E-04 0.1652804611495441E-04 0.1409673689099332E-04 0.1191564811913617E-04 0.9973637403230573E-05 0.8258744369264157E-05 0.6758211140689631E-05 0.5458521963065276E-05 0.4345465168603044E-05 0.3404220589992921E-05 0.2619475202729796E-05 0.1975569103509067E-05 0.1456672814492850E-05 0.1046995232007964E-05 0.7310192213004316E-06 0.4937588492987344E-06 0.3210285891032542E-06 0.1997107219284094E-06 0.1180030350752796E-06 0.6562550627018659E-07 0.3396305969110393E-07 0.1612304561662313E-07 0.6892228656363058E-08 0.2589636663001748E-08 0.8280887390551865E-09 0.2156614040605737E-09 0.4301139703498805E-10 0.6010118005039632E-11 0.5149083260942099E-12 0.2193180426472887E-13 0.3274661750280784E-15 0.9138109562588437E-18 0.1354704193168576E-21 0.5668023630192864E-28 0.1003507143230543E-40 0.5696705688614969E-79 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 1 1.0080 1.8000 fcc 0.0000000000000000E+00 -0.1535560579048078E+00 -0.2907237616945244E+00 -0.4159976694362098E+00 -0.5313742240924204E+00 -0.6381516341634162E+00 -0.7372865497340048E+00 -0.8295323942693905E+00 -0.9155075568639930E+00 -0.9957340210656841E+00 -0.1070661374993902E+01 -0.1140682768426532E+01 -0.1206146070115003E+01 -0.1267361986331669E+01 -0.1324610161159111E+01 -0.1378143882981543E+01 -0.1428193796698535E+01 -0.1474970886958801E+01 -0.1518668914237085E+01 -0.1559466431801390E+01 -0.1597528475905044E+01 -0.1633007997183788E+01 -0.1666047084236993E+01 -0.1696778018255523E+01 -0.1725324188761563E+01 -0.1751800894031140E+01 -0.1776316044902340E+01 -0.1798970786973415E+01 -0.1819860053348930E+01 -0.1839073057876778E+01 -0.1856693737076276E+01 -0.1872801147573207E+01 -0.1887469824748019E+01 -0.1900770107406360E+01 -0.1912768432550330E+01 -0.1923527603729046E+01 -0.1933107035951585E+01 -0.1941562979733216E+01 -0.1948948726501137E+01 -0.1955314797295812E+01 -0.1960709116458849E+01 -0.1965177171789682E+01 -0.1968762162475479E+01 -0.1971505135945817E+01 -0.1973445114672207E+01 -0.1974619213818786E+01 -0.1975062750551728E+01 -0.1974809345728893E+01 -0.1973891018616083E+01 -0.1972338275210313E+01 -0.1970180190692498E+01 -0.1967444486480829E+01 -0.1964157602310837E+01 -0.1960344763727966E+01 -0.1956030045342894E+01 -0.1951236430167903E+01 -0.1945985865324263E+01 -0.1940299314385106E+01 -0.1934196806595530E+01 -0.1927697483190939E+01 -0.1920819641016471E+01 -0.1913580773633311E+01 -0.1905997610082929E+01 -0.1898086151466418E+01 -0.1889861705483819E+01 -0.1881338919067047E+01 -0.1872531809229777E+01 -0.1863453792248377E+01 -0.1854117711279363E+01 -0.1844535862511214E+01 -0.1834720019941148E+01 -0.1824681458861012E+01 -0.1814430978130464E+01 -0.1803978921310083E+01 -0.1793335196722089E+01 -0.1782509296501631E+01 -0.1771510314697401E+01 -0.1760346964476296E+01 -0.1749027594483329E+01 -0.1737560204404532E+01 -0.1725952459777540E+01 -0.1714211706091635E+01 -0.1702344982216385E+01 -0.1690359033195583E+01 -0.1678260322440748E+01 -0.1666055043356523E+01 -0.1653749130428169E+01 -0.1641348269799635E+01 -0.1628857909368793E+01 -0.1616283268425060E+01 -0.1603629346852960E+01 -0.1590900933923877E+01 -0.1578102616696916E+01 -0.1565238788048639E+01 -0.1552313654350187E+01 -0.1539331242809444E+01 -0.1526295408494650E+01 -0.1513209841055223E+01 -0.1500078071154424E+01 -0.1486903476627897E+01 -0.1473689288381174E+01 -0.1460438596038697E+01 -0.1447154353356060E+01 -0.1433839383406718E+01 -0.1420496383553594E+01 -0.1407127930215773E+01 -0.1393736483439595E+01 -0.1380324391283206E+01 -0.1366893894023143E+01 -0.1353447128190937E+01 -0.1339986130447453E+01 -0.1326512841302277E+01 -0.1313029108685023E+01 -0.1299536691375160E+01 -0.1286037262296563E+01 -0.1272532411682773E+01 -0.1259023650118594E+01 -0.1245512411463359E+01 -0.1232000055660992E+01 -0.1218487871441779E+01 -0.1204977078920362E+01 -0.1191468832094503E+01 -0.1177964221248664E+01 -0.1164464275266519E+01 -0.1150969963856213E+01 -0.1137482199691838E+01 -0.1124001840474834E+01 -0.1110529690918452E+01 -0.1097066504658454E+01 -0.1083612986093118E+01 -0.1070169792155417E+01 -0.1056737534020013E+01 -0.1043316778747819E+01 -0.1029908050870580E+01 -0.1016511833917833E+01 -0.1003128571888578E+01 -0.9897586706698354E+00 -0.9764024994041254E+00 -0.9630603918080221E+00 -0.9497326474434862E+00 -0.9364195329439393E+00 -0.9231212831968543E+00 -0.9098381024844113E+00 -0.8965701655839697E+00 -0.8833176188297485E+00 -0.8700805811373453E+00 -0.8568591449923775E+00 -0.8436533774046202E+00 -0.8304633208290344E+00 -0.8172889940547750E+00 -0.8041303930634986E+00 -0.7909874918580566E+00 -0.7778602432626174E+00 -0.7647485796954503E+00 -0.7516524139151204E+00 -0.7385716397412827E+00 -0.7255061327509165E+00 -0.7124557509508342E+00 -0.6994203354274540E+00 -0.6863997109745679E+00 -0.6733936866998824E+00 -0.6604020566111790E+00 -0.6474246001827013E+00 -0.6344610829025981E+00 -0.6215112568020091E+00 -0.6085748609664665E+00 -0.5956516220302268E+00 -0.5827412546541748E+00 -0.5698434619878014E+00 -0.5569579361158532E+00 -0.5440843584902399E+00 -0.5312224003475492E+00 -0.5183717231128886E+00 -0.5055319787902968E+00 -0.4927028103404054E+00 -0.4798838520455784E+00 -0.4670747298631208E+00 -0.4542750617668665E+00 -0.4414844580776081E+00 -0.4287025217826503E+00 -0.4159288488449873E+00 -0.4031630285022929E+00 -0.3904046435562347E+00 -0.3776532706523132E+00 -0.3649084805505702E+00 -0.3521698383875012E+00 -0.3394369039294391E+00 -0.3267092318177014E+00 -0.3139863718057774E+00 -0.3012678689887569E+00 -0.2885532640253530E+00 -0.2758420933527601E+00 -0.2631338893944120E+00 -0.2504281807610877E+00 -0.2377244924455082E+00 -0.2250223460105389E+00 -0.2123212597713198E+00 -0.1996207489715085E+00 -0.1869203259537742E+00 -0.1742195003247300E+00 -0.1615177791145765E+00 -0.1488146669314823E+00 -0.1361096661109569E+00 -0.1234022768604086E+00 -0.1106919973989453E+00 -0.9797832409262908E-01 -0.8526075158534008E-01 -0.7253877292531064E-01 -0.5981187968757973E-01 -0.4707956209239161E-01 -0.3434130911979061E-01 -0.2159660862033985E-01 -0.8844947422254279E-02 0.3914188564942300E-02 0.1668131425026886E-01 0.2945694526441001E-01 0.4224159786604931E-01 0.5503578885129357E-01 0.6784003546613926E-01 0.8065485532187089E-01 0.9348076631322821E-01 0.1063182865393753E+00 0.1191679342274936E+00 0.1320302276589731E+00 0.1449056850980641E+00 0.1577948247229719E+00 0.1706981645593397E+00 0.1836162224158824E+00 0.1965495158223847E+00 0.2094985619696659E+00 0.2224638776517585E+00 0.2354459792100279E+00 0.2484453824792379E+00 0.2614626027354943E+00 0.2744981546460752E+00 0.2875525522209847E+00 0.3006263087661927E+00 0.3137199368386514E+00 0.3268339482028364E+00 0.3399688537888836E+00 0.3531251636522359E+00 0.3663033869348276E+00 0.3795040318275802E+00 0.3927276055344020E+00 0.4059746142374676E+00 0.4192455630638039E+00 0.4325409560532072E+00 0.4458612961272428E+00 0.4592070850596310E+00 0.4725788234476167E+00 0.4859770106845307E+00 0.4994021449334540E+00 0.5128547231018850E+00 0.5263352408174535E+00 0.5398441924046491E+00 0.5533820708624786E+00 0.5669493678430300E+00 0.5805465736309947E+00 0.5941741771240481E+00 0.6078326658140436E+00 0.6215225257691057E+00 0.6352442416164141E+00 0.6489982965258876E+00 0.6627851721945213E+00 0.6766053488314805E+00 0.6904593051439232E+00 0.7043475183234973E+00 0.7182704640335023E+00 0.7322286163966445E+00 0.7462224479835151E+00 0.7602524298016173E+00 0.7743190312849433E+00 0.7884227202841974E+00 0.8025639630575290E+00 0.8167432242618240E+00 0.8309609669444393E+00 0.8452176525355792E+00 0.8595137408410123E+00 0.8738496900353998E+00 0.8882259566559134E+00 0.9026429955964752E+00 0.9171012601023203E+00 0.9316012017649666E+00 0.9461432705176964E+00 0.9607279146312910E+00 0.9753555807102323E+00 0.9900267136892760E+00 0.1004741756830290E+01 0.1019501151719556E+01 0.1034305338265334E+01 0.1049154754695761E+01 0.1064049837557060E+01 0.1078991021712077E+01 0.1093978740339108E+01 0.1109013424930930E+01 0.1124095505294220E+01 0.1139225409549223E+01 0.1154403564129567E+01 0.1169630393782453E+01 0.1184906321569069E+01 0.1200231768865166E+01 0.1215607155361878E+01 0.1231032899066835E+01 0.1246509416305429E+01 0.1262037121722220E+01 0.1277616428282728E+01 0.1293247747275209E+01 0.1308931488312698E+01 0.1324668059335260E+01 0.1340457866612423E+01 0.1356301314745660E+01 0.1372198806671151E+01 0.1388150743662683E+01 0.1404157525334607E+01 0.1420219549645083E+01 0.1436337212899343E+01 0.1452510909753110E+01 0.1468741033216232E+01 0.1485027974656301E+01 0.1501372123802541E+01 0.1517773868749642E+01 0.1534233595961925E+01 0.1550751690277352E+01 0.1567328534911856E+01 0.1583964511463701E+01 0.1600659999917852E+01 0.1617415378650525E+01 0.1634231024433875E+01 0.1651107312440629E+01 0.1668044616248917E+01 0.1685043307847061E+01 0.1702103757638609E+01 0.1719226334447252E+01 0.1736411405521971E+01 0.1753659336542133E+01 0.1770970491622715E+01 0.1788345233319539E+01 0.1805783922634601E+01 0.1823286919021478E+01 0.1840854580390711E+01 0.1858487263115261E+01 0.1876185322036066E+01 0.1893949110467636E+01 0.1911778980203568E+01 0.1929675281522265E+01 0.1947638363192579E+01 0.1965668572479554E+01 0.1983766255150165E+01 0.2001931755479132E+01 0.2020165416254637E+01 0.2038467578784327E+01 0.2056838582901055E+01 0.2075278766968794E+01 0.2093788467888599E+01 0.2112368021104497E+01 0.2131017760609439E+01 0.2149738018951330E+01 0.2168529127238993E+01 0.2187391415148134E+01 0.2206325210927415E+01 0.2225330841404466E+01 0.2244408631991916E+01 0.2263558906693465E+01 0.2282781988109954E+01 0.2302078197445396E+01 0.2321447854513099E+01 0.2340891277741691E+01 0.2360408784181265E+01 0.2380000689509425E+01 0.2399667308037372E+01 0.2419408952716023E+01 0.2439225935142099E+01 0.2459118565564146E+01 0.2479087152888749E+01 0.2499132004686517E+01 0.2519253427198186E+01 0.2539451725340665E+01 0.2559727202713198E+01 0.2580080161603353E+01 0.2600510902993117E+01 0.2621019726564874E+01 0.2641606930707586E+01 0.2662272812522710E+01 0.2683017667830213E+01 0.2703841791174714E+01 0.2724745475831364E+01 0.2745729013811853E+01 0.2766792695870475E+01 0.2787936811510058E+01 0.2809161648987794E+01 0.2830467495321410E+01 0.2851854636294917E+01 0.2873323356464579E+01 0.2894873939164848E+01 0.2916506666514209E+01 0.2938221819421049E+01 0.2960019677589501E+01 0.2981900519525381E+01 0.3003864622541801E+01 0.3025912262765175E+01 0.3048043715140940E+01 0.3070259253439192E+01 0.3092559150260705E+01 0.3114943677042409E+01 0.3137413104063187E+01 0.3159967700449641E+01 0.3182607734181641E+01 0.3205333472098077E+01 0.3228145179902447E+01 0.3251043122168472E+01 0.3274027562345680E+01 0.3297098762765072E+01 0.3320256984644469E+01 0.3343502488094288E+01 0.3366835532122889E+01 0.3390256374642066E+01 0.3413765272472630E+01 0.3437362481349784E+01 0.3461048255928476E+01 0.3484822849788961E+01 0.3508686515442005E+01 0.3532639504334363E+01 0.3556682066854127E+01 0.3580814452335925E+01 0.3605036909066328E+01 0.3629349684289036E+01 0.3653753024210198E+01 0.3678247174003544E+01 0.3702832377815693E+01 0.3727508878771226E+01 0.3752276918977883E+01 0.3777136739531759E+01 0.3802088580522303E+01 0.3827132681037432E+01 0.3852269279168641E+01 0.3877498612015998E+01 0.3902820915693174E+01 0.3928236425332438E+01 0.3953745375089617E+01 0.3979347998149013E+01 0.4005044526728421E+01 0.4030835192083855E+01 0.4056720224514617E+01 0.4082699853368021E+01 0.4108774307044248E+01 0.4134943813001183E+01 0.4161208597759163E+01 0.4187568886905720E+01 0.4214024905100390E+01 0.4240576876079345E+01 0.4267225022660046E+01 0.4293969566746052E+01 0.4320810729331575E+01 0.4347748730506037E+01 0.4374783789458776E+01 0.4401916124483547E+01 0.4429145952983095E+01 0.4456473491473638E+01 0.4483898955589500E+01 0.4511422560087357E+01 0.4539044518850936E+01 0.4566765044895316E+01 0.4594584350371322E+01 0.4622502646570012E+01 0.4650520143926894E+01 0.4678637052026418E+01 0.4706853579606230E+01 0.4735169934561444E+01 0.4763586323948928E+01 0.4792102953991607E+01 0.4820720030082579E+01 0.4849437756789456E+01 0.4878256337858449E+01 0.4907175976218555E+01 0.4936196873985707E+01 0.4965319232466936E+01 0.4994543252164328E+01 0.5023869132779231E+01 0.5053297073216303E+01 0.5082827271587405E+01 0.5112459925215758E+01 0.5142195230639895E+01 0.5172033383617539E+01 0.5201974579129658E+01 0.5232019011384368E+01 0.5262166873820703E+01 0.5292418359112656E+01 0.5322773659173003E+01 0.5353232965157039E+01 0.5383796467466556E+01 0.5414464355753495E+01 0.5445236818923759E+01 0.5476114045141041E+01 0.5507096221830388E+01 0.5538183535682169E+01 0.5569376172655497E+01 0.5600674317982096E+01 0.5632078156169850E+01 0.5663587871006478E+01 0.5695203645563089E+01 0.5726925662197861E+01 0.5758754102559550E+01 0.5790689147591050E+01 0.5822730977532937E+01 0.5854879771926981E+01 0.5887135709619618E+01 0.5919498968765412E+01 0.5951969726830611E+01 0.5984548160596443E+01 0.6017234446162569E+01 0.6050028758950551E+01 0.6082931273707150E+01 0.6115942164507743E+01 0.6149061604759621E+01 0.6182289767205272E+01 0.6215626823925810E+01 0.6249072946344119E+01 0.6282628305228231E+01 0.6316293070694456E+01 0.6350067412210745E+01 0.6383951498599807E+01 0.6417945498042277E+01 0.6452049578080040E+01 0.6486263905619155E+01 0.6520588646933274E+01 0.6555023967666467E+01 0.6589570032836555E+01 0.6624227006838173E+01 0.6658995053445667E+01 0.6693874335816274E+01 0.6728865016493213E+01 0.6763967257408575E+01 0.6799181219886369E+01 0.6834507064645582E+01 0.6869944951802993E+01 0.6905495040876272E+01 0.6941157490786817E+01 0.6976932459862688E+01 0.7012820105841560E+01 0.7048820585873601E+01 0.7084934056524147E+01 0.7121160673776924E+01 0.7157500593036525E+01 0.7193953969131448E+01 0.7230520956316742E+01 0.7267201708277015E+01 0.7303996378128941E+01 0.7340905118424199E+01 0.7377928081152227E+01 0.7415065417742714E+01 0.7452317279068625E+01 0.7489683815448713E+01 0.7527165176650154E+01 0.7564761511891398E+01 0.7602472969844660E+01 0.7640299698638533E+01 0.7678241845860797E+01 0.7716299558560847E+01 0.7754472983252295E+01 0.7792762265915677E+01 0.7831167552000825E+01 0.7869688986429596E+01 0.7908326713598298E+01 0.7947080877380213E+01 0.7985951621128103E+01 0.8024939087676790E+01 0.8064043419345456E+01 0.8103264757940238E+01 0.8142603244756712E+01 0.8182059020582113E+01 0.8221632225698052E+01 0.8261322999882655E+01 0.8301131482413128E+01 0.8341057812068073E+01 0.8381102127129775E+01 0.8421264565386728E+01 0.8461545264135914E+01 0.8501944360185011E+01 0.8542461989854800E+01 0.8583098288981544E+01 0.8623853392919127E+01 0.8664727436541362E+01 0.8705720554244369E+01 0.8746832879948686E+01 0.8788064547101555E+01 0.8829415688679173E+01 0.8870886437188865E+01 0.8912476924671346E+01 0.8954187282702780E+01 0.8996017642397092E+01 0.9037968134408045E+01 0.9080038888931480E+01 0.9122230035707283E+01 0.9164541704021747E+01 0.9206974022709504E+01 0.9249527120155676E+01 0.9292201124297971E+01 0.9334996162628819E+01 0.9377912362197343E+01 0.9420949849611493E+01 0.9464108751040072E+01 0.9507389192214658E+01 0.9550791298431900E+01 0.9594315194555200E+01 0.9637961005016923E+01 0.9681728853820376E+01 0.9725618864541687E+01 0.9769631160331837E+01 0.9813765863918640E+01 0.9858023097608644E+01 0.9902402983288997E+01 0.9946905642429570E+01 0.9991531196084678E+01 0.1003627976489508E+02 0.1008115146908984E+02 0.1012614642848822E+02 0.1017126476250151E+02 0.1021650659013498E+02 0.1026187202998970E+02 0.1030736120026423E+02 0.1035297421875671E+02 0.1039871120286647E+02 0.1044457226959594E+02 0.1049055753555247E+02 0.1053666711695001E+02 0.1058290112961095E+02 0.1062925968896805E+02 0.1067574291006588E+02 0.1072235090756281E+02 0.1076908379573268E+02 0.1081594168846656E+02 0.1086292469927445E+02 0.1091003294128697E+02 0.1095726652725712E+02 0.1100462556956189E+02 0.1105211018020406E+02 0.1109972047081387E+02 0.1114745655265044E+02 0.1119531853660384E+02 0.1124330653319640E+02 0.1129142065258453E+02 0.1133966100456022E+02 0.1138802769855287E+02 0.1143652084363064E+02 0.1148514054850226E+02 0.1153388692151854E+02 0.1158276007067394E+02 0.1163176010360828E+02 0.1168088712760808E+02 0.1173014124960834E+02 0.1177952257619401E+02 0.1182903121360145E+02 0.1187866726772023E+02 0.1192843084409426E+02 0.1197832204792367E+02 0.1202834098406616E+02 0.1207848775703852E+02 0.1212876247101815E+02 0.1217916522984446E+02 0.1222969613702057E+02 0.1228035529571446E+02 0.1233114280876082E+02 0.1238205877866202E+02 0.1243310330759011E+02 0.1248427649738783E+02 0.1253557844957024E+02 0.1258700926532612E+02 0.1263856904551937E+02 0.1269025789069041E+02 0.1274207590105764E+02 0.1279402317651873E+02 0.1284609981665210E+02 0.1289830592071831E+02 0.1295064158766139E+02 0.1300310691611016E+02 0.1305570200437972E+02 0.1310842695047267E+02 0.1316128185208051E+02 0.1321426680658502E+02 0.1326738191105951E+02 0.1332062726227020E+02 0.1337400295667756E+02 0.1342750909043750E+02 0.1348114575940276E+02 0.1353491305912430E+02 0.1358881108485235E+02 0.1364283993153797E+02 0.1369699969383405E+02 0.1375129046609678E+02 0.1380571234238685E+02 0.1386026541647074E+02 0.1391494978182183E+02 0.1396976553162181E+02 0.1402471275876187E+02 0.1407979155584384E+02 0.1413500201518157E+02 0.1419034422880200E+02 0.1424581828844641E+02 0.1430142428557176E+02 0.1435716231135165E+02 0.1441303245667767E+02 0.1446903481216061E+02 0.1452516946813144E+02 0.1458143651464284E+02 0.1463783604146995E+02 0.1469436813811187E+02 0.1475103289379257E+02 0.1480783039746221E+02 0.1486476073779820E+02 0.1492182400320636E+02 0.1497902028182210E+02 0.1503634966151138E+02 0.1509381222987208E+02 0.1515140807423487E+02 0.1520913728166454E+02 0.1526699993896084E+02 0.1532499613265989E+02 0.1538312594903494E+02 0.1544138947409778E+02 0.1549978679359965E+02 0.1555831799303221E+02 0.1561698315762881E+02 0.1567578237236552E+02 0.1573471572196207E+02 0.1579378329088299E+02 0.1585298516333866E+02 0.1591232142328633E+02 0.1597179215443117E+02 0.1603139744022732E+02 0.1609113736387884E+02 0.1615101200834081E+02 0.1621102145632030E+02 0.1627116579027744E+02 0.1633144509242638E+02 0.1639185944473622E+02 0.1645240892893225E+02 0.1651309362649662E+02 0.1657391361866950E+02 0.1663486898645014E+02 0.1669595981059768E+02 0.1675718617163216E+02 0.1681854814983560E+02 0.1688004582525278E+02 0.1694167927769237E+02 0.1700344858672776E+02 0.1706535383169809E+02 0.1712739509170910E+02 0.1718957244563422E+02 0.1725188597211529E+02 0.1731433574956364E+02 0.1737692185616106E+02 0.1743964436986050E+02 0.1750250336838723E+02 0.1756549892923954E+02 0.1762863112968988E+02 0.1769190004678551E+02 0.1775530575734953E+02 0.1781884833798184E+02 0.1788252786505983E+02 0.1794634441473943E+02 0.1801029806295595E+02 0.1807438888542495E+02 0.1813861695764293E+02 0.1820298235488868E+02 0.1826748515222356E+02 0.1833212542449270E+02 0.1839690324632588E+02 0.1846181869213811E+02 0.1852687183613067E+02 0.1859206275229210E+02 0.1865739151439864E+02 0.1872285819601541E+02 0.1878846287049704E+02 0.1885420561098861E+02 0.1892008649042634E+02 0.1898610558153868E+02 0.1905226295684672E+02 0.1911855868866527E+02 0.1918499284910370E+02 0.1925156551006659E+02 0.1931827674325448E+02 0.1938512662016491E+02 0.1945211521209302E+02 0.1951924259013235E+02 0.1958650882517566E+02 0.1965391398791571E+02 0.1972145814884597E+02 0.1978914137826159E+02 0.1985696374625988E+02 0.1992492532274116E+02 0.1999302617740977E+02 0.2006126637977442E+02 0.2012964599914926E+02 0.2019816510465454E+02 0.2026682376521724E+02 0.2033562204957191E+02 0.2040456002626147E+02 0.2047363776363781E+02 0.2054285532986256E+02 0.2061221279290795E+02 0.2068171022055733E+02 0.2075134768040595E+02 0.2082112523986171E+02 0.2089104296614605E+02 0.2096110092629424E+02 0.2103129918715649E+02 0.2110163781539841E+02 0.2117211687750176E+02 0.2124273643976533E+02 0.2131349656830528E+02 0.2138439732905617E+02 0.2145543878777140E+02 0.2152662101002412E+02 0.2159794406120766E+02 0.2166940800653642E+02 0.2174101291104644E+02 0.2181275883959610E+02 0.2188464585686669E+02 0.2195667402736326E+02 0.2202884341541514E+02 0.2210115408517663E+02 0.2217360610062771E+02 0.2224619952557461E+02 0.2231893442365038E+02 0.2239181085831591E+02 0.2246482889286010E+02 0.2253798859040076E+02 0.2261129001388523E+02 0.2268473322609096E+02 0.2275831828962614E+02 0.2283204526693043E+02 0.2290591422027539E+02 0.2297992521176526E+02 0.2305407830333766E+02 0.2312837355676387E+02 0.2320281103364977E+02 0.2327739079543636E+02 0.2335211290340030E+02 0.2342697741865454E+02 0.2350198440214897E+02 0.2357713391467102E+02 0.2365242601684612E+02 0.2372786076913854E+02 0.2380343823185174E+02 0.2387915846512908E+02 0.2395502152895441E+02 0.2403102748315263E+02 0.2410717638739019E+02 0.2418346830117586E+02 0.2425990328386112E+02 0.2433648139464079E+02 0.2441320269255370E+02 0.2449006723648306E+02 0.2456707508515719E+02 0.2464422629715007E+02 0.2472152093088173E+02 0.2479895904461906E+02 0.2487654069647616E+02 0.2495426594441500E+02 0.2503213484624594E+02 0.2511014745962827E+02 0.2518830384207072E+02 0.2526660405093208E+02 0.2534504814342175E+02 0.2542363617660013E+02 0.2550236820737923E+02 0.2558124429252339E+02 0.2566026448864954E+02 0.2573942885222773E+02 0.2581873743958190E+02 0.2589819030689023E+02 0.2597778751018570E+02 0.2605752910535647E+02 0.2613741514814674E+02 0.2621744569415681E+02 0.2629762079884404E+02 0.2637794051752302E+02 0.2645840490536618E+02 0.2653901401740439E+02 0.2661976790852737E+02 0.2670066663348421E+02 0.2678171024688378E+02 0.2686289880319548E+02 0.2694423235674941E+02 0.2702571096173704E+02 0.2710733467221175E+02 0.2718910354208919E+02 0.2727101762514775E+02 0.2735307697502924E+02 0.2743528164523912E+02 0.2751763168914713E+02 0.2760012715998774E+02 0.2768276811086066E+02 0.2776555459473111E+02 0.2784848666443062E+02 0.2793156437265721E+02 0.2801478777197602E+02 0.2809815691481973E+02 0.2818167185348894E+02 0.2826533264015273E+02 0.2834913932684915E+02 0.2843309196548557E+02 0.2851719060783909E+02 0.2860143530555727E+02 0.2868582611015826E+02 0.2877036307303130E+02 0.2885504624543746E+02 0.2893987567850965E+02 0.2902485142325337E+02 0.2910997353054712E+02 0.2919524205114265E+02 0.2928065703566552E+02 0.2936621853461569E+02 0.2945192659836760E+02 0.2953778127717089E+02 0.2962378262115081E+02 0.2970993068030837E+02 0.2979622550452115E+02 0.2988266714354346E+02 0.2996925564700682E+02 0.3005599106442041E+02 0.3014287344517153E+02 0.3022990283852592E+02 0.3031707929362812E+02 0.3040440285950215E+02 0.3049187358505165E+02 0.3057949151906041E+02 0.3066725671019266E+02 0.3075516920699371E+02 0.3084322905789012E+02 0.3093143631119021E+02 0.3101979101508448E+02 0.3110829321764588E+02 0.3119694296683040E+02 0.3128574031047729E+02 0.3137468529630954E+02 0.3146377797193422E+02 0.3155301838484299E+02 0.3164240658241237E+02 0.3173194261190401E+02 0.3182162652046552E+02 0.3191145835513032E+02 0.3200143816281827E+02 0.3209156599033621E+02 0.3218184188437798E+02 0.3227226589152506E+02 0.3236283805824685E+02 0.3245355843090114E+02 0.3254442705573426E+02 0.3263544397888169E+02 0.3272660924636835E+02 0.3281792290410885E+02 0.3290938499790812E+02 0.3300099557346138E+02 0.3309275467635493E+02 0.3318466235206626E+02 0.3327671864596444E+02 0.3336892360331044E+02 0.3346127726925774E+02 0.3355377968885226E+02 0.3364643090703304E+02 0.3373923096863262E+02 0.3383217991837713E+02 0.3392527780088678E+02 0.3401852466067623E+02 0.3411192054215498E+02 0.3420546548962749E+02 0.3429915954729392E+02 0.3439300275925001E+02 0.3448699516948774E+02 0.3458113682189561E+02 0.3467542776025882E+02 0.3476986802825981E+02 0.3486445766947862E+02 0.3495919672739288E+02 0.3505408524537850E+02 0.3514912326671002E+02 0.3524431083456054E+02 0.3533964799200239E+02 0.3543513478200754E+02 0.3553077124744756E+02 0.3562655743109424E+02 0.3572249337561980E+02 0.3581857912359721E+02 0.3591481471750058E+02 0.3601120019970533E+02 0.3610773561248870E+02 0.3620442099802995E+02 0.3630125639841068E+02 0.3639824185561516E+02 0.3649537741153064E+02 0.3659266310794771E+02 0.3669009898656054E+02 0.3678768508896718E+02 0.3688542145666988E+02 0.3698330813107555E+02 0.3708134515349577E+02 0.3717938217591600E+02 0.3727741919833622E+02 0.3737545622075644E+02 0.0000000000000000E+00 0.8576998932607242E-09 0.5148474978702150E-07 0.5500333859843751E-06 0.2898571356744415E-05 0.1037065667137954E-04 0.2904394432880980E-04 0.6869069328866988E-04 0.1435525383839498E-03 0.2729524897641136E-03 0.4817179545381958E-03 0.8004046139757985E-03 0.1265323067409609E-02 0.1918378981427738E-02 0.2806743664553777E-02 0.3982376035816319E-02 0.5501419303057878E-02 0.7423496677200373E-02 0.9810930426149240E-02 0.1272790776956854E-01 0.1623961574245743E-01 0.2041136538278681E-01 0.2530772356585144E-01 0.3099166862766308E-01 0.3752378368081732E-01 0.4496149929855063E-01 0.5335839507962672E-01 0.6276356754813610E-01 0.7322106991690198E-01 0.8476942747035206E-01 0.9744123071429918E-01 0.1112628070018588E+00 0.1262539700776599E+00 0.1424278458837341E+00 0.1597907720342443E+00 0.1783422675846084E+00 0.1980750690841191E+00 0.2189752283993167E+00 0.2410222674169928E+00 0.2641893844693322E+00 0.2884437071578631E+00 0.3137465861762969E+00 0.3400539247340754E+00 0.3673165382520538E+00 0.3954805391293457E+00 0.4244877415567311E+00 0.4542760815685687E+00 0.4847800477740307E+00 0.5159311184824792E+00 0.5476582012304797E+00 0.5798880710234582E+00 0.6125458039182285E+00 0.6455552028889719E+00 0.6788392132348257E+00 0.7123203250985853E+00 0.7459209609702914E+00 0.7795638463441852E+00 0.8131723619807327E+00 0.8466708764954843E+00 0.8799850582522438E+00 0.9130421657784031E+00 0.9457713161447614E+00 0.9781037309602292E+00 0.1009972959823397E+01 0.1041315081248019E+01 0.1072068881238206E+01 0.1102176009831869E+01 0.1131581116058128E+01 0.1160231961866557E+01 0.1188079515683897E+01 0.1215078026337852E+01 0.1241185078158618E+01 0.1266361628127532E+01 0.1290572025989520E+01 0.1313784018282635E+01 0.1335968737264703E+01 0.1357100675734715E+01 0.1377157648755932E+01 0.1396120743289401E+01 0.1413974256741546E+01 0.1430705625418266E+01 0.1446305343861415E+01 0.1460766876022088E+01 0.1474086559199635E+01 0.1486263501646126E+01 0.1497299474703849E+01 0.1507198800308697E+01 0.1515968234655533E+01 0.1523616848783268E+01 0.1530155906797786E+01 0.1535598742410441E+01 0.1539960634428920E+01 0.1543258681796175E+01 0.1545511678732089E+01 0.1546739990491811E+01 0.1546965430214609E+01 0.1546211137297620E+01 0.1544501457690412E+01 0.1541861826468803E+01 0.1538318653010165E+01 0.1533899209057386E+01 0.1528631519925127E+01 0.1522544259069783E+01 0.1515666646213862E+01 0.1508028349186392E+01 0.1499659389613263E+01 0.1490590052565443E+01 0.1480850800248451E+01 0.1470472189793603E+01 0.1459484795190111E+01 0.1447919133377286E+01 0.1435805594497667E+01 0.1423174376295045E+01 0.1410055422625766E+01 0.1396478366037582E+01 0.1382472474357517E+01 0.1368066601218609E+01 0.1353289140445096E+01 0.1338167984206406E+01 0.1322730484842268E+01 0.1307003420254224E+01 0.1291012962752784E+01 0.1274784651244435E+01 0.1258343366638420E+01 0.1241713310349911E+01 0.1224917985773531E+01 0.1207980182599308E+01 0.1190921963841912E+01 0.1173764655453436E+01 0.1156528838389896E+01 0.1139234343002130E+01 0.1121900245622720E+01 0.1104544867221897E+01 0.1087185774007220E+01 0.1069839779843846E+01 0.1052522950374696E+01 0.1035250608722480E+01 0.1018037342658465E+01 0.1000897013126039E+01 0.9838427640104167E+00 0.9668870330493002E+00 0.9500415637828995E+00 0.9333174184453955E+00 0.9167249917036894E+00 0.9002740251531050E+00 0.8839736224835302E+00 0.8678322652333790E+00 0.8518578290525983E+00 0.8360576003997890E+00 0.8204382936023470E+00 0.8050060682122852E+00 0.7897665465941298E+00 0.7747248316849636E+00 0.7598855248702404E+00 0.7452527439225495E+00 0.7308301409539072E+00 0.7166209203354966E+00 0.7026278565420246E+00 0.6888533118809829E+00 0.6752992540701540E+00 0.6619672736296282E+00 0.6488586010574048E+00 0.6359741237603777E+00 0.6233144027150980E+00 0.6108796888351882E+00 0.5986699390246809E+00 0.5866848318987949E+00 0.5749237831558405E+00 0.5633859605859940E+00 0.5520702987046087E+00 0.5409755129995881E+00 0.5301001137840697E+00 0.5194424196473048E+00 0.5090005704981659E+00 0.4987725401971368E+00 0.4887561487740056E+00 0.4789490742297346E+00 0.4693488639221445E+00 0.4599529455361500E+00 0.4507586376402879E+00 0.4417631598321903E+00 0.4329636424765457E+00 0.4243571360398264E+00 0.4159406200268177E+00 0.4077110115246057E+00 0.3996651733602655E+00 0.3917999218790373E+00 0.3841120343502322E+00 0.3765982560085148E+00 0.3692553067386082E+00 0.3620798874117488E+00 0.3550686858825059E+00 0.3482183826548197E+00 0.3415256562262722E+00 0.3349871881197929E+00 0.3285996676120873E+00 0.3223597961681734E+00 0.3162642915914723E+00 0.3103098918988991E+00 0.3044933589304323E+00 0.2988114817025848E+00 0.2932610795151651E+00 0.2878390048206519E+00 0.2825421458654130E+00 0.2773674291118858E+00 0.2723118214507413E+00 0.2673723322118953E+00 0.2625460149830915E+00 0.2578299692446370E+00 0.2532213418286768E+00 0.2487173282112436E+00 0.2443151736451206E+00 0.2400121741413617E+00 0.2358056773071348E+00 0.2316930830473297E+00 0.2276718441371882E+00 0.2237394666729961E+00 0.2198935104076650E+00 0.2161315889778330E+00 0.2124513700288889E+00 0.2088505752441177E+00 0.2053269802839583E+00 0.2018784146411472E+00 0.1985027614173130E+00 0.1951979570263882E+00 0.1919619908299856E+00 0.1887929047096988E+00 0.1856887925810768E+00 0.1826477998538276E+00 0.1796681228426198E+00 0.1767480081326520E+00 0.1738857519039822E+00 0.1710796992184251E+00 0.1683282432726463E+00 0.1656298246209137E+00 0.1629829303707959E+00 0.1603860933549304E+00 0.1578378912818327E+00 0.1553369458685551E+00 0.1528819219578573E+00 0.1504715266224071E+00 0.1481045082583851E+00 0.1457796556707337E+00 0.1434957971521608E+00 0.1412517995578756E+00 0.1390465673779208E+00 0.1368790418088395E+00 0.1347481998263070E+00 0.1326530532602482E+00 0.1305926478738530E+00 0.1285660624478085E+00 0.1265724078709661E+00 0.1246108262385681E+00 0.1226804899590787E+00 0.1207806008705706E+00 0.1189103893675429E+00 0.1170691135389732E+00 0.1152560583183238E+00 0.1134705346461653E+00 0.1117118786460041E+00 0.1099794508138442E+00 0.1082726352219536E+00 0.1065908387372449E+00 0.1049334902546352E+00 0.1033000399456902E+00 0.1016899585228177E+00 0.1001027365192277E+00 0.9853788358483354E-01 0.9699492779823146E-01 0.9547341499485665E-01 0.9397290811138079E-01 0.9249298654638069E-01 0.9103324553728220E-01 0.8959329555354877E-01 0.8817276170606399E-01 0.8677128317262857E-01 0.8538851263947052E-01 0.8402411575864875E-01 0.8267777062120664E-01 0.8134916724591848E-01 0.8003800708345375E-01 0.7874400253576731E-01 0.7746687649051477E-01 0.7620636187027600E-01 0.7496220119635953E-01 0.7373414616695294E-01 0.7252195724937327E-01 0.7132540328616367E-01 0.7014426111477837E-01 0.6897831520058859E-01 0.6782735728294027E-01 0.6669118603398869E-01 0.6556960673003079E-01 0.6446243093505667E-01 0.6336947619623536E-01 0.6229056575105237E-01 0.6122552824581402E-01 0.6017419746523230E-01 0.5913641207280737E-01 0.5811201536172281E-01 0.5710085501597033E-01 0.5610278288142408E-01 0.5511765474658521E-01 0.5414533013271837E-01 0.5318567209310896E-01 0.5223854702116695E-01 0.5130382446711163E-01 0.5038137696297216E-01 0.4947107985564236E-01 0.4857281114773465E-01 0.4768645134597841E-01 0.4681188331691594E-01 0.4594899214965088E-01 0.4509766502540915E-01 0.4425779109367826E-01 0.4342926135469399E-01 0.4261196854804814E-01 0.4180580704719781E-01 0.4101067275965932E-01 0.4022646303267519E-01 0.3945307656414969E-01 0.3869041331864940E-01 0.3793837444827467E-01 0.3719686221820911E-01 0.3646577993676117E-01 0.3574503188971662E-01 0.3503452327882445E-01 0.3433416016424531E-01 0.3364384941079507E-01 0.3296349863782079E-01 0.3229301617255276E-01 0.3163231100677876E-01 0.3098129275669249E-01 0.3033987162577284E-01 0.2970795837055464E-01 0.2908546426915543E-01 0.2847230109242889E-01 0.2786838107761748E-01 0.2727361690438311E-01 0.2668792167309761E-01 0.2611120888527847E-01 0.2554339242606102E-01 0.2498438654859956E-01 0.2443410586029598E-01 0.2389246531075691E-01 0.2335938018138393E-01 0.2283476607650571E-01 0.2231853891596374E-01 0.2181061492906659E-01 0.2131091064983147E-01 0.2081934291343454E-01 0.2033582885379438E-01 0.1986028590221680E-01 0.1939263178703108E-01 0.1893278453415130E-01 0.1848066246849892E-01 0.1803618421622546E-01 0.1759926870767613E-01 0.1716983518103927E-01 0.1674780318662707E-01 0.1633309259173651E-01 0.1592562358604172E-01 0.1552531668746990E-01 0.1513209274851720E-01 0.1474587296296080E-01 0.1436657887292672E-01 0.1399413237627429E-01 0.1362845573426023E-01 0.1326947157944628E-01 0.1291710292381743E-01 0.1257127316707774E-01 0.1223190610509324E-01 0.1189892593845275E-01 0.1157225728111806E-01 0.1125182516913743E-01 0.1093755506939646E-01 0.1062937288838200E-01 0.1032720498093588E-01 0.1003097815897619E-01 0.9740619700164219E-02 0.9456057356497178E-02 0.9177219362806280E-02 0.8904034445141316E-02 0.8636431829023183E-02 0.8374341247546036E-02 0.8117692949311960E-02 0.7866417706180585E-02 0.7620446820816740E-02 0.7379712134019578E-02 0.7144146031816014E-02 0.6913681452302325E-02 0.6688251892216657E-02 0.6467791413225554E-02 0.6252234647907211E-02 0.6041516805413253E-02 0.5835573676791136E-02 0.5634341639947666E-02 0.5437757664233824E-02 0.5245759314629934E-02 0.5058284755509180E-02 0.4875272753955811E-02 0.4696662682613547E-02 0.4522394522037392E-02 0.4352408862520555E-02 0.4186646905366133E-02 0.4025050463570553E-02 0.3867561961883894E-02 0.3714124436208813E-02 0.3564681532297067E-02 0.3419177503699341E-02 0.3277557208920367E-02 0.3139766107727285E-02 0.3005750256555324E-02 0.2875456302949815E-02 0.2748831478978852E-02 0.2625823593545541E-02 0.2506381023522792E-02 0.2390452703627873E-02 0.2277988114946939E-02 0.2168937272013016E-02 0.2063250708333439E-02 0.1960879460254761E-02 0.1861775049045227E-02 0.1765889461065943E-02 0.1673175125893125E-02 0.1583584892244586E-02 0.1497072001553956E-02 0.1413590059026983E-02 0.1333093002004349E-02 0.1255535065446408E-02 0.1180870744346243E-02 0.1109054752869345E-02 0.1040041980010902E-02 0.9737874415562595E-03 0.9102462281261181E-03 0.8493734490870866E-03 0.7911241721104120E-03 0.7354533581681445E-03 0.6823157917680999E-03 0.6316660062474194E-03 0.5834582039715675E-03 0.5376461713226330E-03 0.4941831884102573E-03 0.4530219335027502E-03 0.4141143822583456E-03 0.3774117019399670E-03 0.3428641409258591E-03 0.3104209139870729E-03 0.2800300839961760E-03 0.2516384409654113E-03 0.2251913795924475E-03 0.2006327768245250E-03 0.1779048713433524E-03 0.1569481473297049E-03 0.1377012253937927E-03 0.1201007641585952E-03 0.1040813766598551E-03 0.8957556647504338E-04 0.7651368930508610E-04 0.6482394658893534E-04 0.5443241860150438E-04 0.4526314532314971E-04 0.3723826410463467E-04 0.3027821368846399E-04 0.2430201435404447E-04 0.1922763365777299E-04 0.1497244622116435E-04 0.1145379401469120E-04 0.8589650285013768E-05 0.6299385349542388E-05 0.4504625622961494E-05 0.3130188220885624E-05 0.2105062280742719E-05 0.1363395085845545E-05 0.8454270900288885E-06 0.4983067594254876E-06 0.2767065679872027E-06 0.1431594160449781E-06 0.6804490613003522E-07 0.2918182930693568E-07 0.1102919874006033E-07 0.3560261260656263E-08 0.9406176465862757E-09 0.1916420214061158E-09 0.2763777688791933E-10 0.2482312356945943E-11 0.1136644735947497E-12 0.1904831683752850E-14 0.6466043629846817E-17 0.1381172060080856E-20 0.1274303700193166E-26 0.2106088550891557E-38 0.1212886175035114E-71 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.8576998932607242E-09 0.5148474978702150E-07 0.5500333859843751E-06 0.2898571356744415E-05 0.1037065667137954E-04 0.2904394432880980E-04 0.6869069328866988E-04 0.1435525383839498E-03 0.2729524897641136E-03 0.4817179545381958E-03 0.8004046139757985E-03 0.1265323067409609E-02 0.1918378981427738E-02 0.2806743664553777E-02 0.3982376035816319E-02 0.5501419303057878E-02 0.7423496677200373E-02 0.9810930426149240E-02 0.1272790776956854E-01 0.1623961574245743E-01 0.2041136538278681E-01 0.2530772356585144E-01 0.3099166862766308E-01 0.3752378368081732E-01 0.4496149929855063E-01 0.5335839507962672E-01 0.6276356754813610E-01 0.7322106991690198E-01 0.8476942747035206E-01 0.9744123071429918E-01 0.1112628070018588E+00 0.1262539700776599E+00 0.1424278458837341E+00 0.1597907720342443E+00 0.1783422675846084E+00 0.1980750690841191E+00 0.2189752283993167E+00 0.2410222674169928E+00 0.2641893844693322E+00 0.2884437071578631E+00 0.3137465861762969E+00 0.3400539247340754E+00 0.3673165382520538E+00 0.3954805391293457E+00 0.4244877415567311E+00 0.4542760815685687E+00 0.4847800477740307E+00 0.5159311184824792E+00 0.5476582012304797E+00 0.5798880710234582E+00 0.6125458039182285E+00 0.6455552028889719E+00 0.6788392132348257E+00 0.7123203250985853E+00 0.7459209609702914E+00 0.7795638463441852E+00 0.8131723619807327E+00 0.8466708764954843E+00 0.8799850582522438E+00 0.9130421657784031E+00 0.9457713161447614E+00 0.9781037309602292E+00 0.1009972959823397E+01 0.1041315081248019E+01 0.1072068881238206E+01 0.1102176009831869E+01 0.1131581116058128E+01 0.1160231961866557E+01 0.1188079515683897E+01 0.1215078026337852E+01 0.1241185078158618E+01 0.1266361628127532E+01 0.1290572025989520E+01 0.1313784018282635E+01 0.1335968737264703E+01 0.1357100675734715E+01 0.1377157648755932E+01 0.1396120743289401E+01 0.1413974256741546E+01 0.1430705625418266E+01 0.1446305343861415E+01 0.1460766876022088E+01 0.1474086559199635E+01 0.1486263501646126E+01 0.1497299474703849E+01 0.1507198800308697E+01 0.1515968234655533E+01 0.1523616848783268E+01 0.1530155906797786E+01 0.1535598742410441E+01 0.1539960634428920E+01 0.1543258681796175E+01 0.1545511678732089E+01 0.1546739990491811E+01 0.1546965430214609E+01 0.1546211137297620E+01 0.1544501457690412E+01 0.1541861826468803E+01 0.1538318653010165E+01 0.1533899209057386E+01 0.1528631519925127E+01 0.1522544259069783E+01 0.1515666646213862E+01 0.1508028349186392E+01 0.1499659389613263E+01 0.1490590052565443E+01 0.1480850800248451E+01 0.1470472189793603E+01 0.1459484795190111E+01 0.1447919133377286E+01 0.1435805594497667E+01 0.1423174376295045E+01 0.1410055422625766E+01 0.1396478366037582E+01 0.1382472474357517E+01 0.1368066601218609E+01 0.1353289140445096E+01 0.1338167984206406E+01 0.1322730484842268E+01 0.1307003420254224E+01 0.1291012962752784E+01 0.1274784651244435E+01 0.1258343366638420E+01 0.1241713310349911E+01 0.1224917985773531E+01 0.1207980182599308E+01 0.1190921963841912E+01 0.1173764655453436E+01 0.1156528838389896E+01 0.1139234343002130E+01 0.1121900245622720E+01 0.1104544867221897E+01 0.1087185774007220E+01 0.1069839779843846E+01 0.1052522950374696E+01 0.1035250608722480E+01 0.1018037342658465E+01 0.1000897013126039E+01 0.9838427640104167E+00 0.9668870330493002E+00 0.9500415637828995E+00 0.9333174184453955E+00 0.9167249917036894E+00 0.9002740251531050E+00 0.8839736224835302E+00 0.8678322652333790E+00 0.8518578290525983E+00 0.8360576003997890E+00 0.8204382936023470E+00 0.8050060682122852E+00 0.7897665465941298E+00 0.7747248316849636E+00 0.7598855248702404E+00 0.7452527439225495E+00 0.7308301409539072E+00 0.7166209203354966E+00 0.7026278565420246E+00 0.6888533118809829E+00 0.6752992540701540E+00 0.6619672736296282E+00 0.6488586010574048E+00 0.6359741237603777E+00 0.6233144027150980E+00 0.6108796888351882E+00 0.5986699390246809E+00 0.5866848318987949E+00 0.5749237831558405E+00 0.5633859605859940E+00 0.5520702987046087E+00 0.5409755129995881E+00 0.5301001137840697E+00 0.5194424196473048E+00 0.5090005704981659E+00 0.4987725401971368E+00 0.4887561487740056E+00 0.4789490742297346E+00 0.4693488639221445E+00 0.4599529455361500E+00 0.4507586376402879E+00 0.4417631598321903E+00 0.4329636424765457E+00 0.4243571360398264E+00 0.4159406200268177E+00 0.4077110115246057E+00 0.3996651733602655E+00 0.3917999218790373E+00 0.3841120343502322E+00 0.3765982560085148E+00 0.3692553067386082E+00 0.3620798874117488E+00 0.3550686858825059E+00 0.3482183826548197E+00 0.3415256562262722E+00 0.3349871881197929E+00 0.3285996676120873E+00 0.3223597961681734E+00 0.3162642915914723E+00 0.3103098918988991E+00 0.3044933589304323E+00 0.2988114817025848E+00 0.2932610795151651E+00 0.2878390048206519E+00 0.2825421458654130E+00 0.2773674291118858E+00 0.2723118214507413E+00 0.2673723322118953E+00 0.2625460149830915E+00 0.2578299692446370E+00 0.2532213418286768E+00 0.2487173282112436E+00 0.2443151736451206E+00 0.2400121741413617E+00 0.2358056773071348E+00 0.2316930830473297E+00 0.2276718441371882E+00 0.2237394666729961E+00 0.2198935104076650E+00 0.2161315889778330E+00 0.2124513700288889E+00 0.2088505752441177E+00 0.2053269802839583E+00 0.2018784146411472E+00 0.1985027614173130E+00 0.1951979570263882E+00 0.1919619908299856E+00 0.1887929047096988E+00 0.1856887925810768E+00 0.1826477998538276E+00 0.1796681228426198E+00 0.1767480081326520E+00 0.1738857519039822E+00 0.1710796992184251E+00 0.1683282432726463E+00 0.1656298246209137E+00 0.1629829303707959E+00 0.1603860933549304E+00 0.1578378912818327E+00 0.1553369458685551E+00 0.1528819219578573E+00 0.1504715266224071E+00 0.1481045082583851E+00 0.1457796556707337E+00 0.1434957971521608E+00 0.1412517995578756E+00 0.1390465673779208E+00 0.1368790418088395E+00 0.1347481998263070E+00 0.1326530532602482E+00 0.1305926478738530E+00 0.1285660624478085E+00 0.1265724078709661E+00 0.1246108262385681E+00 0.1226804899590787E+00 0.1207806008705706E+00 0.1189103893675429E+00 0.1170691135389732E+00 0.1152560583183238E+00 0.1134705346461653E+00 0.1117118786460041E+00 0.1099794508138442E+00 0.1082726352219536E+00 0.1065908387372449E+00 0.1049334902546352E+00 0.1033000399456902E+00 0.1016899585228177E+00 0.1001027365192277E+00 0.9853788358483354E-01 0.9699492779823146E-01 0.9547341499485665E-01 0.9397290811138079E-01 0.9249298654638069E-01 0.9103324553728220E-01 0.8959329555354877E-01 0.8817276170606399E-01 0.8677128317262857E-01 0.8538851263947052E-01 0.8402411575864875E-01 0.8267777062120664E-01 0.8134916724591848E-01 0.8003800708345375E-01 0.7874400253576731E-01 0.7746687649051477E-01 0.7620636187027600E-01 0.7496220119635953E-01 0.7373414616695294E-01 0.7252195724937327E-01 0.7132540328616367E-01 0.7014426111477837E-01 0.6897831520058859E-01 0.6782735728294027E-01 0.6669118603398869E-01 0.6556960673003079E-01 0.6446243093505667E-01 0.6336947619623536E-01 0.6229056575105237E-01 0.6122552824581402E-01 0.6017419746523230E-01 0.5913641207280737E-01 0.5811201536172281E-01 0.5710085501597033E-01 0.5610278288142408E-01 0.5511765474658521E-01 0.5414533013271837E-01 0.5318567209310896E-01 0.5223854702116695E-01 0.5130382446711163E-01 0.5038137696297216E-01 0.4947107985564236E-01 0.4857281114773465E-01 0.4768645134597841E-01 0.4681188331691594E-01 0.4594899214965088E-01 0.4509766502540915E-01 0.4425779109367826E-01 0.4342926135469399E-01 0.4261196854804814E-01 0.4180580704719781E-01 0.4101067275965932E-01 0.4022646303267519E-01 0.3945307656414969E-01 0.3869041331864940E-01 0.3793837444827467E-01 0.3719686221820911E-01 0.3646577993676117E-01 0.3574503188971662E-01 0.3503452327882445E-01 0.3433416016424531E-01 0.3364384941079507E-01 0.3296349863782079E-01 0.3229301617255276E-01 0.3163231100677876E-01 0.3098129275669249E-01 0.3033987162577284E-01 0.2970795837055464E-01 0.2908546426915543E-01 0.2847230109242889E-01 0.2786838107761748E-01 0.2727361690438311E-01 0.2668792167309761E-01 0.2611120888527847E-01 0.2554339242606102E-01 0.2498438654859956E-01 0.2443410586029598E-01 0.2389246531075691E-01 0.2335938018138393E-01 0.2283476607650571E-01 0.2231853891596374E-01 0.2181061492906659E-01 0.2131091064983147E-01 0.2081934291343454E-01 0.2033582885379438E-01 0.1986028590221680E-01 0.1939263178703108E-01 0.1893278453415130E-01 0.1848066246849892E-01 0.1803618421622546E-01 0.1759926870767613E-01 0.1716983518103927E-01 0.1674780318662707E-01 0.1633309259173651E-01 0.1592562358604172E-01 0.1552531668746990E-01 0.1513209274851720E-01 0.1474587296296080E-01 0.1436657887292672E-01 0.1399413237627429E-01 0.1362845573426023E-01 0.1326947157944628E-01 0.1291710292381743E-01 0.1257127316707774E-01 0.1223190610509324E-01 0.1189892593845275E-01 0.1157225728111806E-01 0.1125182516913743E-01 0.1093755506939646E-01 0.1062937288838200E-01 0.1032720498093588E-01 0.1003097815897619E-01 0.9740619700164219E-02 0.9456057356497178E-02 0.9177219362806280E-02 0.8904034445141316E-02 0.8636431829023183E-02 0.8374341247546036E-02 0.8117692949311960E-02 0.7866417706180585E-02 0.7620446820816740E-02 0.7379712134019578E-02 0.7144146031816014E-02 0.6913681452302325E-02 0.6688251892216657E-02 0.6467791413225554E-02 0.6252234647907211E-02 0.6041516805413253E-02 0.5835573676791136E-02 0.5634341639947666E-02 0.5437757664233824E-02 0.5245759314629934E-02 0.5058284755509180E-02 0.4875272753955811E-02 0.4696662682613547E-02 0.4522394522037392E-02 0.4352408862520555E-02 0.4186646905366133E-02 0.4025050463570553E-02 0.3867561961883894E-02 0.3714124436208813E-02 0.3564681532297067E-02 0.3419177503699341E-02 0.3277557208920367E-02 0.3139766107727285E-02 0.3005750256555324E-02 0.2875456302949815E-02 0.2748831478978852E-02 0.2625823593545541E-02 0.2506381023522792E-02 0.2390452703627873E-02 0.2277988114946939E-02 0.2168937272013016E-02 0.2063250708333439E-02 0.1960879460254761E-02 0.1861775049045227E-02 0.1765889461065943E-02 0.1673175125893125E-02 0.1583584892244586E-02 0.1497072001553956E-02 0.1413590059026983E-02 0.1333093002004349E-02 0.1255535065446408E-02 0.1180870744346243E-02 0.1109054752869345E-02 0.1040041980010902E-02 0.9737874415562595E-03 0.9102462281261181E-03 0.8493734490870866E-03 0.7911241721104120E-03 0.7354533581681445E-03 0.6823157917680999E-03 0.6316660062474194E-03 0.5834582039715675E-03 0.5376461713226330E-03 0.4941831884102573E-03 0.4530219335027502E-03 0.4141143822583456E-03 0.3774117019399670E-03 0.3428641409258591E-03 0.3104209139870729E-03 0.2800300839961760E-03 0.2516384409654113E-03 0.2251913795924475E-03 0.2006327768245250E-03 0.1779048713433524E-03 0.1569481473297049E-03 0.1377012253937927E-03 0.1201007641585952E-03 0.1040813766598551E-03 0.8957556647504338E-04 0.7651368930508610E-04 0.6482394658893534E-04 0.5443241860150438E-04 0.4526314532314971E-04 0.3723826410463467E-04 0.3027821368846399E-04 0.2430201435404447E-04 0.1922763365777299E-04 0.1497244622116435E-04 0.1145379401469120E-04 0.8589650285013768E-05 0.6299385349542388E-05 0.4504625622961494E-05 0.3130188220885624E-05 0.2105062280742719E-05 0.1363395085845545E-05 0.8454270900288885E-06 0.4983067594254876E-06 0.2767065679872027E-06 0.1431594160449781E-06 0.6804490613003522E-07 0.2918182930693568E-07 0.1102919874006033E-07 0.3560261260656263E-08 0.9406176465862757E-09 0.1916420214061158E-09 0.2763777688791933E-10 0.2482312356945943E-11 0.1136644735947497E-12 0.1904831683752850E-14 0.6466043629846817E-17 0.1381172060080856E-20 0.1274303700193166E-26 0.2106088550891557E-38 0.1212886175035114E-71 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.8576998932607242E-09 0.5148474978702150E-07 0.5500333859843751E-06 0.2898571356744415E-05 0.1037065667137954E-04 0.2904394432880980E-04 0.6869069328866988E-04 0.1435525383839498E-03 0.2729524897641136E-03 0.4817179545381958E-03 0.8004046139757985E-03 0.1265323067409609E-02 0.1918378981427738E-02 0.2806743664553777E-02 0.3982376035816319E-02 0.5501419303057878E-02 0.7423496677200373E-02 0.9810930426149240E-02 0.1272790776956854E-01 0.1623961574245743E-01 0.2041136538278681E-01 0.2530772356585144E-01 0.3099166862766308E-01 0.3752378368081732E-01 0.4496149929855063E-01 0.5335839507962672E-01 0.6276356754813610E-01 0.7322106991690198E-01 0.8476942747035206E-01 0.9744123071429918E-01 0.1112628070018588E+00 0.1262539700776599E+00 0.1424278458837341E+00 0.1597907720342443E+00 0.1783422675846084E+00 0.1980750690841191E+00 0.2189752283993167E+00 0.2410222674169928E+00 0.2641893844693322E+00 0.2884437071578631E+00 0.3137465861762969E+00 0.3400539247340754E+00 0.3673165382520538E+00 0.3954805391293457E+00 0.4244877415567311E+00 0.4542760815685687E+00 0.4847800477740307E+00 0.5159311184824792E+00 0.5476582012304797E+00 0.5798880710234582E+00 0.6125458039182285E+00 0.6455552028889719E+00 0.6788392132348257E+00 0.7123203250985853E+00 0.7459209609702914E+00 0.7795638463441852E+00 0.8131723619807327E+00 0.8466708764954843E+00 0.8799850582522438E+00 0.9130421657784031E+00 0.9457713161447614E+00 0.9781037309602292E+00 0.1009972959823397E+01 0.1041315081248019E+01 0.1072068881238206E+01 0.1102176009831869E+01 0.1131581116058128E+01 0.1160231961866557E+01 0.1188079515683897E+01 0.1215078026337852E+01 0.1241185078158618E+01 0.1266361628127532E+01 0.1290572025989520E+01 0.1313784018282635E+01 0.1335968737264703E+01 0.1357100675734715E+01 0.1377157648755932E+01 0.1396120743289401E+01 0.1413974256741546E+01 0.1430705625418266E+01 0.1446305343861415E+01 0.1460766876022088E+01 0.1474086559199635E+01 0.1486263501646126E+01 0.1497299474703849E+01 0.1507198800308697E+01 0.1515968234655533E+01 0.1523616848783268E+01 0.1530155906797786E+01 0.1535598742410441E+01 0.1539960634428920E+01 0.1543258681796175E+01 0.1545511678732089E+01 0.1546739990491811E+01 0.1546965430214609E+01 0.1546211137297620E+01 0.1544501457690412E+01 0.1541861826468803E+01 0.1538318653010165E+01 0.1533899209057386E+01 0.1528631519925127E+01 0.1522544259069783E+01 0.1515666646213862E+01 0.1508028349186392E+01 0.1499659389613263E+01 0.1490590052565443E+01 0.1480850800248451E+01 0.1470472189793603E+01 0.1459484795190111E+01 0.1447919133377286E+01 0.1435805594497667E+01 0.1423174376295045E+01 0.1410055422625766E+01 0.1396478366037582E+01 0.1382472474357517E+01 0.1368066601218609E+01 0.1353289140445096E+01 0.1338167984206406E+01 0.1322730484842268E+01 0.1307003420254224E+01 0.1291012962752784E+01 0.1274784651244435E+01 0.1258343366638420E+01 0.1241713310349911E+01 0.1224917985773531E+01 0.1207980182599308E+01 0.1190921963841912E+01 0.1173764655453436E+01 0.1156528838389896E+01 0.1139234343002130E+01 0.1121900245622720E+01 0.1104544867221897E+01 0.1087185774007220E+01 0.1069839779843846E+01 0.1052522950374696E+01 0.1035250608722480E+01 0.1018037342658465E+01 0.1000897013126039E+01 0.9838427640104167E+00 0.9668870330493002E+00 0.9500415637828995E+00 0.9333174184453955E+00 0.9167249917036894E+00 0.9002740251531050E+00 0.8839736224835302E+00 0.8678322652333790E+00 0.8518578290525983E+00 0.8360576003997890E+00 0.8204382936023470E+00 0.8050060682122852E+00 0.7897665465941298E+00 0.7747248316849636E+00 0.7598855248702404E+00 0.7452527439225495E+00 0.7308301409539072E+00 0.7166209203354966E+00 0.7026278565420246E+00 0.6888533118809829E+00 0.6752992540701540E+00 0.6619672736296282E+00 0.6488586010574048E+00 0.6359741237603777E+00 0.6233144027150980E+00 0.6108796888351882E+00 0.5986699390246809E+00 0.5866848318987949E+00 0.5749237831558405E+00 0.5633859605859940E+00 0.5520702987046087E+00 0.5409755129995881E+00 0.5301001137840697E+00 0.5194424196473048E+00 0.5090005704981659E+00 0.4987725401971368E+00 0.4887561487740056E+00 0.4789490742297346E+00 0.4693488639221445E+00 0.4599529455361500E+00 0.4507586376402879E+00 0.4417631598321903E+00 0.4329636424765457E+00 0.4243571360398264E+00 0.4159406200268177E+00 0.4077110115246057E+00 0.3996651733602655E+00 0.3917999218790373E+00 0.3841120343502322E+00 0.3765982560085148E+00 0.3692553067386082E+00 0.3620798874117488E+00 0.3550686858825059E+00 0.3482183826548197E+00 0.3415256562262722E+00 0.3349871881197929E+00 0.3285996676120873E+00 0.3223597961681734E+00 0.3162642915914723E+00 0.3103098918988991E+00 0.3044933589304323E+00 0.2988114817025848E+00 0.2932610795151651E+00 0.2878390048206519E+00 0.2825421458654130E+00 0.2773674291118858E+00 0.2723118214507413E+00 0.2673723322118953E+00 0.2625460149830915E+00 0.2578299692446370E+00 0.2532213418286768E+00 0.2487173282112436E+00 0.2443151736451206E+00 0.2400121741413617E+00 0.2358056773071348E+00 0.2316930830473297E+00 0.2276718441371882E+00 0.2237394666729961E+00 0.2198935104076650E+00 0.2161315889778330E+00 0.2124513700288889E+00 0.2088505752441177E+00 0.2053269802839583E+00 0.2018784146411472E+00 0.1985027614173130E+00 0.1951979570263882E+00 0.1919619908299856E+00 0.1887929047096988E+00 0.1856887925810768E+00 0.1826477998538276E+00 0.1796681228426198E+00 0.1767480081326520E+00 0.1738857519039822E+00 0.1710796992184251E+00 0.1683282432726463E+00 0.1656298246209137E+00 0.1629829303707959E+00 0.1603860933549304E+00 0.1578378912818327E+00 0.1553369458685551E+00 0.1528819219578573E+00 0.1504715266224071E+00 0.1481045082583851E+00 0.1457796556707337E+00 0.1434957971521608E+00 0.1412517995578756E+00 0.1390465673779208E+00 0.1368790418088395E+00 0.1347481998263070E+00 0.1326530532602482E+00 0.1305926478738530E+00 0.1285660624478085E+00 0.1265724078709661E+00 0.1246108262385681E+00 0.1226804899590787E+00 0.1207806008705706E+00 0.1189103893675429E+00 0.1170691135389732E+00 0.1152560583183238E+00 0.1134705346461653E+00 0.1117118786460041E+00 0.1099794508138442E+00 0.1082726352219536E+00 0.1065908387372449E+00 0.1049334902546352E+00 0.1033000399456902E+00 0.1016899585228177E+00 0.1001027365192277E+00 0.9853788358483354E-01 0.9699492779823146E-01 0.9547341499485665E-01 0.9397290811138079E-01 0.9249298654638069E-01 0.9103324553728220E-01 0.8959329555354877E-01 0.8817276170606399E-01 0.8677128317262857E-01 0.8538851263947052E-01 0.8402411575864875E-01 0.8267777062120664E-01 0.8134916724591848E-01 0.8003800708345375E-01 0.7874400253576731E-01 0.7746687649051477E-01 0.7620636187027600E-01 0.7496220119635953E-01 0.7373414616695294E-01 0.7252195724937327E-01 0.7132540328616367E-01 0.7014426111477837E-01 0.6897831520058859E-01 0.6782735728294027E-01 0.6669118603398869E-01 0.6556960673003079E-01 0.6446243093505667E-01 0.6336947619623536E-01 0.6229056575105237E-01 0.6122552824581402E-01 0.6017419746523230E-01 0.5913641207280737E-01 0.5811201536172281E-01 0.5710085501597033E-01 0.5610278288142408E-01 0.5511765474658521E-01 0.5414533013271837E-01 0.5318567209310896E-01 0.5223854702116695E-01 0.5130382446711163E-01 0.5038137696297216E-01 0.4947107985564236E-01 0.4857281114773465E-01 0.4768645134597841E-01 0.4681188331691594E-01 0.4594899214965088E-01 0.4509766502540915E-01 0.4425779109367826E-01 0.4342926135469399E-01 0.4261196854804814E-01 0.4180580704719781E-01 0.4101067275965932E-01 0.4022646303267519E-01 0.3945307656414969E-01 0.3869041331864940E-01 0.3793837444827467E-01 0.3719686221820911E-01 0.3646577993676117E-01 0.3574503188971662E-01 0.3503452327882445E-01 0.3433416016424531E-01 0.3364384941079507E-01 0.3296349863782079E-01 0.3229301617255276E-01 0.3163231100677876E-01 0.3098129275669249E-01 0.3033987162577284E-01 0.2970795837055464E-01 0.2908546426915543E-01 0.2847230109242889E-01 0.2786838107761748E-01 0.2727361690438311E-01 0.2668792167309761E-01 0.2611120888527847E-01 0.2554339242606102E-01 0.2498438654859956E-01 0.2443410586029598E-01 0.2389246531075691E-01 0.2335938018138393E-01 0.2283476607650571E-01 0.2231853891596374E-01 0.2181061492906659E-01 0.2131091064983147E-01 0.2081934291343454E-01 0.2033582885379438E-01 0.1986028590221680E-01 0.1939263178703108E-01 0.1893278453415130E-01 0.1848066246849892E-01 0.1803618421622546E-01 0.1759926870767613E-01 0.1716983518103927E-01 0.1674780318662707E-01 0.1633309259173651E-01 0.1592562358604172E-01 0.1552531668746990E-01 0.1513209274851720E-01 0.1474587296296080E-01 0.1436657887292672E-01 0.1399413237627429E-01 0.1362845573426023E-01 0.1326947157944628E-01 0.1291710292381743E-01 0.1257127316707774E-01 0.1223190610509324E-01 0.1189892593845275E-01 0.1157225728111806E-01 0.1125182516913743E-01 0.1093755506939646E-01 0.1062937288838200E-01 0.1032720498093588E-01 0.1003097815897619E-01 0.9740619700164219E-02 0.9456057356497178E-02 0.9177219362806280E-02 0.8904034445141316E-02 0.8636431829023183E-02 0.8374341247546036E-02 0.8117692949311960E-02 0.7866417706180585E-02 0.7620446820816740E-02 0.7379712134019578E-02 0.7144146031816014E-02 0.6913681452302325E-02 0.6688251892216657E-02 0.6467791413225554E-02 0.6252234647907211E-02 0.6041516805413253E-02 0.5835573676791136E-02 0.5634341639947666E-02 0.5437757664233824E-02 0.5245759314629934E-02 0.5058284755509180E-02 0.4875272753955811E-02 0.4696662682613547E-02 0.4522394522037392E-02 0.4352408862520555E-02 0.4186646905366133E-02 0.4025050463570553E-02 0.3867561961883894E-02 0.3714124436208813E-02 0.3564681532297067E-02 0.3419177503699341E-02 0.3277557208920367E-02 0.3139766107727285E-02 0.3005750256555324E-02 0.2875456302949815E-02 0.2748831478978852E-02 0.2625823593545541E-02 0.2506381023522792E-02 0.2390452703627873E-02 0.2277988114946939E-02 0.2168937272013016E-02 0.2063250708333439E-02 0.1960879460254761E-02 0.1861775049045227E-02 0.1765889461065943E-02 0.1673175125893125E-02 0.1583584892244586E-02 0.1497072001553956E-02 0.1413590059026983E-02 0.1333093002004349E-02 0.1255535065446408E-02 0.1180870744346243E-02 0.1109054752869345E-02 0.1040041980010902E-02 0.9737874415562595E-03 0.9102462281261181E-03 0.8493734490870866E-03 0.7911241721104120E-03 0.7354533581681445E-03 0.6823157917680999E-03 0.6316660062474194E-03 0.5834582039715675E-03 0.5376461713226330E-03 0.4941831884102573E-03 0.4530219335027502E-03 0.4141143822583456E-03 0.3774117019399670E-03 0.3428641409258591E-03 0.3104209139870729E-03 0.2800300839961760E-03 0.2516384409654113E-03 0.2251913795924475E-03 0.2006327768245250E-03 0.1779048713433524E-03 0.1569481473297049E-03 0.1377012253937927E-03 0.1201007641585952E-03 0.1040813766598551E-03 0.8957556647504338E-04 0.7651368930508610E-04 0.6482394658893534E-04 0.5443241860150438E-04 0.4526314532314971E-04 0.3723826410463467E-04 0.3027821368846399E-04 0.2430201435404447E-04 0.1922763365777299E-04 0.1497244622116435E-04 0.1145379401469120E-04 0.8589650285013768E-05 0.6299385349542388E-05 0.4504625622961494E-05 0.3130188220885624E-05 0.2105062280742719E-05 0.1363395085845545E-05 0.8454270900288885E-06 0.4983067594254876E-06 0.2767065679872027E-06 0.1431594160449781E-06 0.6804490613003522E-07 0.2918182930693568E-07 0.1102919874006033E-07 0.3560261260656263E-08 0.9406176465862757E-09 0.1916420214061158E-09 0.2763777688791933E-10 0.2482312356945943E-11 0.1136644735947497E-12 0.1904831683752850E-14 0.6466043629846817E-17 0.1381172060080856E-20 0.1274303700193166E-26 0.2106088550891557E-38 0.1212886175035114E-71 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.3765610317640694E+00 0.7400358894127599E+00 0.1090712381667745E+01 0.1428873061247002E+01 0.1754795319320031E+01 0.2068751483890357E+01 0.2371008922950546E+01 0.2661830152878451E+01 0.2941472952229258E+01 0.3210190480819170E+01 0.3468231403786657E+01 0.3715840020150198E+01 0.3953256395252374E+01 0.4180716496383695E+01 0.4398452330811846E+01 0.4606692085398965E+01 0.4805660266967400E+01 0.4995577842570571E+01 0.5176662378836555E+01 0.5349128179575754E+01 0.5513186420878141E+01 0.5669045282968079E+01 0.5816910078133630E+01 0.5956983374101555E+01 0.6089465112286805E+01 0.6214552720405558E+01 0.6332441219002502E+01 0.6443323321505209E+01 0.6547389527480199E+01 0.6644828208826436E+01 0.6735825688701171E+01 0.6820566313030878E+01 0.6899232514514866E+01 0.6972004869081964E+01 0.7039062144810148E+01 0.7100581343365575E+01 0.7156737734061032E+01 0.7207704880673625E+01 0.7253654661198675E+01 0.7294757280749858E+01 0.7331181277846054E+01 0.7363093524351962E+01 0.7390659219363427E+01 0.7414041877348629E+01 0.7433403310874117E+01 0.7448903608259055E+01 0.7460701106512816E+01 0.7468952359920434E+01 0.7473812104646840E+01 0.7475433219735298E+01 0.7473966684877387E+01 0.7469561535331859E+01 0.7462364814367910E+01 0.7452521523604532E+01 0.7440174571612401E+01 0.7425464721137732E+01 0.7408530535299623E+01 0.7389508323102637E+01 0.7368532084596213E+01 0.7345733456000793E+01 0.7321241655108376E+01 0.7295183427252115E+01 0.7267682992125909E+01 0.7238861991720891E+01 0.7208839439630969E+01 0.7177731671964857E+01 0.7145652300086835E+01 0.7112712165393094E+01 0.7079019296315407E+01 0.7044678867728360E+01 0.7009793162921103E+01 0.6974461538279471E+01 0.6938780390809384E+01 0.6902843128617441E+01 0.6866740144450676E+01 0.6830558792382606E+01 0.6794383367719482E+01 0.6758295090186962E+01 0.6722372090444448E+01 0.6686689399961921E+01 0.6651318944281731E+01 0.6616329539676658E+01 0.6581786893203926E+01 0.6547753606144576E+01 0.6514289180807551E+01 0.6481450030667977E+01 0.6449289493800484E+01 0.6417857849559566E+01 0.6387202338451258E+01 0.6357367185132800E+01 0.6328393624470087E+01 0.6300319930576388E+01 0.6273181448749665E+01 0.6247010630220808E+01 0.6221837069619801E+01 0.6197687545062726E+01 0.6174586060758330E+01 0.6152553892029570E+01 0.6131609632642339E+01 0.6111769244331025E+01 0.6093046108408382E+01 0.6075451079345281E+01 0.6058992540204510E+01 0.6043676459811814E+01 0.6029506451546534E+01 0.6016483833633909E+01 0.6004607690820981E+01 0.5993874937318422E+01 0.5984280380890941E+01 0.5975816787979942E+01 0.5968474949742999E+01 0.5962243748896129E+01 0.5957110227246338E+01 0.5953059653803552E+01 0.5950075593363216E+01 0.5948139975452642E+01 0.5947233163536738E+01 0.5947334024380974E+01 0.5948419997472152E+01 0.5950467164400099E+01 0.5953450318106323E+01 0.5957343031908459E+01 0.5962117728212475E+01 0.5967745746827388E+01 0.5974197412800709E+01 0.5981442103695763E+01 0.5989448316235365E+01 0.5998183732239485E+01 0.6007615283788049E+01 0.6017709217542990E+01 0.6028431158167253E+01 0.6039746170781648E+01 0.6051618822403686E+01 0.6064013242315937E+01 0.6076893181314657E+01 0.6090222069792634E+01 0.6103963074613425E+01 0.6118079154737412E+01 0.6132533115562999E+01 0.6147287661949624E+01 0.6162305449892092E+01 0.6177549136818604E+01 0.6192981430488190E+01 0.6208565136465474E+01 0.6224263204154009E+01 0.6240038771371831E+01 0.6255855207455509E+01 0.6271676154881747E+01 0.6287465569397743E+01 0.6303187758654289E+01 0.6318807419337479E+01 0.6334289672797612E+01 0.6349600099175650E+01 0.6364704770029900E+01 0.6379570279467482E+01 0.6394163773787110E+01 0.6408452979641630E+01 0.6422406230730219E+01 0.6435992493032277E+01 0.6449181388596262E+01 0.6461943217898319E+01 0.6474248980787193E+01 0.6486070396033000E+01 0.6497379919498787E+01 0.6508150760955191E+01 0.6518356899559369E+01 0.6527973098020561E+01 0.6536974915475707E+01 0.6545338719099223E+01 0.6553041694472095E+01 0.6560061854736102E+01 0.6566378048559677E+01 0.6571969966942736E+01 0.6576818148888014E+01 0.6580903985967331E+01 0.6584209725811516E+01 0.6586718474552983E+01 0.6588414198250604E+01 0.6589281723326368E+01 0.6589306736044133E+01 0.6588475781060250E+01 0.6586776259076728E+01 0.6584196423626929E+01 0.6580725377024553E+01 0.6576353065506066E+01 0.6571070273597098E+01 0.6564868617732960E+01 0.6557740539163546E+01 0.6549679296172584E+01 0.6540678955640928E+01 0.6530734383983693E+01 0.6519841237490329E+01 0.6507995952096807E+01 0.6495195732618538E+01 0.6481438541472563E+01 0.6466723086916791E+01 0.6451048810834144E+01 0.6434415876088694E+01 0.6416825153480584E+01 0.6398278208326170E+01 0.6378777286689151E+01 0.6358325301288192E+01 0.6336925817105747E+01 0.6314583036722893E+01 0.6291301785403415E+01 0.6267087495951198E+01 0.6241946193363197E+01 0.6215884479300494E+01 0.6188909516399138E+01 0.6161029012441793E+01 0.6132251204410994E+01 0.6102584842443767E+01 0.6072039173707282E+01 0.6040623926214209E+01 0.6008349292596213E+01 0.5975225913853303E+01 0.5941264863095957E+01 0.5906477629296895E+01 0.5870876101068294E+01 0.5834472550479789E+01 0.5797279616932335E+01 0.5759310291102085E+01 0.5720577898967909E+01 0.5681096085935931E+01 0.5640878801073526E+01 0.5599940281464876E+01 0.5558295036699770E+01 0.5515957833506386E+01 0.5472943680538803E+01 0.5429267813328917E+01 0.5384945679412595E+01 0.5339992923638538E+01 0.5294425373668760E+01 0.5248259025678392E+01 0.5201510030262340E+01 0.5154194678555982E+01 0.5106329388576237E+01 0.5057930691789439E+01 0.5009015219911397E+01 0.4959599691945191E+01 0.4909700901461299E+01 0.4859335704124821E+01 0.4808521005473441E+01 0.4757273748950229E+01 0.4705610904194174E+01 0.4653549455591696E+01 0.4601106391091448E+01 0.4548298691284878E+01 0.4495143318754116E+01 0.4441657207689196E+01 0.4387857253775341E+01 0.4333760304351776E+01 0.4279383148842287E+01 0.4224742509458196E+01 0.4169855032173684E+01 0.4114737277973392E+01 0.4059405714371826E+01 0.4003876707203877E+01 0.3948166512685741E+01 0.3892291269744721E+01 0.3836266992617200E+01 0.3780109563712459E+01 0.3723834726741400E+01 0.3667458080107569E+01 0.3610995070558891E+01 0.3554460987097478E+01 0.3497870955145241E+01 0.3441239930962816E+01 0.3384582696318687E+01 0.3327913853406216E+01 0.3271247820004922E+01 0.3214598824883478E+01 0.3157980903440747E+01 0.3101407893581784E+01 0.3044893431825231E+01 0.2988450949638577E+01 0.2932093669997769E+01 0.2875834604167262E+01 0.2819686548696998E+01 0.2763662082632170E+01 0.2707773564932239E+01 0.2652033132094799E+01 0.2596452695980827E+01 0.2541043941836626E+01 0.2485818326509053E+01 0.2430787076849344E+01 0.2375961188301807E+01 0.2321351423672851E+01 0.2266968312076604E+01 0.2212822148052429E+01 0.2158922990850521E+01 0.2105280663881218E+01 0.2051904754323755E+01 0.1998804612890416E+01 0.1945989353741675E+01 0.1893467854548430E+01 0.1841248756696710E+01 0.1789340465631234E+01 0.1737751151333199E+01 0.1686488748928507E+01 0.1635560959422214E+01 0.1584975250555055E+01 0.1534738857778293E+01 0.1484858785342541E+01 0.1435341807496924E+01 0.1386194469794414E+01 0.1337423090499684E+01 0.1289033762095411E+01 0.1241032352883452E+01 0.1193424508676993E+01 0.1146215654580135E+01 0.1099410996851037E+01 0.1053015524845333E+01 0.1007034013035967E+01 0.9614710231061919E+00 0.9163309061121906E+00 0.8716178047119132E+00 0.8273356554569915E+00 0.7834881911441322E+00 0.7400789432232032E+00 0.6971112442584428E+00 0.6545882304400988E+00 0.6125128441430950E+00 0.5708878365301393E+00 0.5297157701959697E+00 0.4889990218502538E+00 0.4487397850361310E+00 0.4089400728816994E+00 0.3696017208819437E+00 0.3307263897082250E+00 0.2923155680431669E+00 0.2543705754380062E+00 0.2168925651904757E+00 0.1798825272404206E+00 0.1433412910812248E+00 0.1072695286845231E+00 0.7166775743626266E-01 0.3653634308175027E-01 0.1875502677966891E-02 -0.3231469244926006E-01 -0.6603431374472693E-01 -0.9928357246226212E-01 -0.1320628167035092E+00 -0.1643725284591359E+00 -0.1962133206540352E+00 -0.2275859341981871E+00 -0.2584912350448162E+00 -0.2889302112573159E+00 -0.3189039700865247E+00 -0.3484137350596561E+00 -0.3774608430824280E+00 -0.4060467415555353E+00 -0.4341729855069461E+00 -0.4618412347410261E+00 -0.4890532510058743E+00 -0.5158108951799040E+00 -0.5421161244787339E+00 -0.5679709896834355E+00 -0.5933776323912099E+00 -0.6183382822893291E+00 -0.6428552544532798E+00 -0.6669309466699765E+00 -0.6905678367868668E+00 -0.7137684800877064E+00 -0.7365355066956285E+00 -0.7588716190043869E+00 -0.7807795891382519E+00 -0.8022622564412896E+00 -0.8233225249964942E+00 -0.8439633611754367E+00 -0.8641877912188305E+00 -0.8839988988484928E+00 -0.9033998229112149E+00 -0.9223937550548300E+00 -0.9409839374369939E+00 -0.9591736604667737E+00 -0.9769662605796675E+00 -0.9943651180460338E+00 -0.1011373654813408E+01 -0.1027995332382722E+01 -0.1044233649718800E+01 -0.1060092141195189E+01 -0.1075574374573462E+01 -0.1090683949017157E+01 -0.1105424493140398E+01 -0.1119799663091301E+01 -0.1133813140670142E+01 -0.1147468631482395E+01 -0.1160769863126533E+01 -0.1173720583416712E+01 -0.1186324558640121E+01 -0.1198585571849071E+01 -0.1210507421187702E+01 -0.1222093918253196E+01 -0.1233348886491358E+01 -0.1244276159626517E+01 -0.1254879580125511E+01 -0.1265162997695628E+01 -0.1275130267816335E+01 -0.1284785250304552E+01 -0.1294131807913390E+01 -0.1303173804963923E+01 -0.1311915106009982E+01 -0.1320359574535607E+01 -0.1328511071684896E+01 -0.1336373455024057E+01 -0.1343950577335306E+01 -0.1351246285442432E+01 -0.1358264419067570E+01 -0.1365008809719085E+01 -0.1371483279610062E+01 -0.1377691640607245E+01 -0.1383637693209943E+01 -0.1389325225558719E+01 -0.1394758012473418E+01 -0.1399939814520254E+01 -0.1404874377107532E+01 -0.1409565429609723E+01 -0.1414016684519505E+01 -0.1418231836627389E+01 -0.1422214562228558E+01 -0.1425968518356584E+01 -0.1429497342043625E+01 -0.1432804649606689E+01 -0.1435894035959656E+01 -0.1438769073950589E+01 -0.1441433313724035E+01 -0.1443890282107847E+01 -0.1446143482024210E+01 -0.1448196391924410E+01 -0.1450052465247018E+01 -0.1451715129899050E+01 -0.1453187787759769E+01 -0.1454473814206628E+01 -0.1455576557663118E+01 -0.1456499339167960E+01 -0.1457245451965397E+01 -0.1457818161116118E+01 -0.1458220703128390E+01 -0.1458456285609144E+01 -0.1458528086934452E+01 -0.1458439255939184E+01 -0.1458192911625301E+01 -0.1457792142888557E+01 -0.1457240008263066E+01 -0.1456539535683532E+01 -0.1455693722264615E+01 -0.1454705534097164E+01 -0.1453577906060864E+01 -0.1452313741653029E+01 -0.1450915912833076E+01 -0.1449387259882392E+01 -0.1447730591279191E+01 -0.1445948683588039E+01 -0.1444044281363676E+01 -0.1442020097068773E+01 -0.1439878811005344E+01 -0.1437623071259354E+01 -0.1435255493658342E+01 -0.1432778661741579E+01 -0.1430195126742490E+01 -0.1427507407583088E+01 -0.1424717990879937E+01 -0.1421829330961478E+01 -0.1418843849896296E+01 -0.1415763937532114E+01 -0.1412591951545110E+01 -0.1409330217499327E+01 -0.1405981028915838E+01 -0.1402546647351420E+01 -0.1399029302486348E+01 -0.1395431192221163E+01 -0.1391754482782035E+01 -0.1388001308834431E+01 -0.1384173773604920E+01 -0.1380273949010718E+01 -0.1376303875796823E+01 -0.1372265563680394E+01 -0.1368160991502163E+01 -0.1363992107384622E+01 -0.1359760828896748E+01 -0.1355469043224972E+01 -0.1351118607350228E+01 -0.1346711348230812E+01 -0.1342249062990785E+01 -0.1337733519113769E+01 -0.1333166454641865E+01 -0.1328549578379474E+01 -0.1323884570101832E+01 -0.1319173080768030E+01 -0.1314416732738336E+01 -0.1309617119995603E+01 -0.1304775808370537E+01 -0.1299894335770717E+01 -0.1294974212413071E+01 -0.1290016921059716E+01 -0.1285023917256931E+01 -0.1279996629577071E+01 -0.1274936459863322E+01 -0.1269844783477041E+01 -0.1264722949547587E+01 -0.1259572281224406E+01 -0.1254394075931317E+01 -0.1249189605622732E+01 -0.1243960117041727E+01 -0.1238706831979822E+01 -0.1233430947538271E+01 -0.1228133636390794E+01 -0.1222816047047525E+01 -0.1217479304120173E+01 -0.1212124508588114E+01 -0.1206752738065413E+01 -0.1201365047068555E+01 -0.1195962467284892E+01 -0.1190546007841516E+01 -0.1185116655574617E+01 -0.1179675375299079E+01 -0.1174223110078329E+01 -0.1168760781494218E+01 -0.1163289289916911E+01 -0.1157809514774660E+01 -0.1152322314823388E+01 -0.1146828528415948E+01 -0.1141328973770988E+01 -0.1135824449241374E+01 -0.1130315733582035E+01 -0.1124803586217146E+01 -0.1119288747506621E+01 -0.1113771939011809E+01 -0.1108253863760298E+01 -0.1102735206509786E+01 -0.1097216634010968E+01 -0.1091698795269313E+01 -0.1086182321805725E+01 -0.1080667827915982E+01 -0.1075155910928945E+01 -0.1069647151463423E+01 -0.1064142113683687E+01 -0.1058641345553532E+01 -0.1053145379088904E+01 -0.1047654730608969E+01 -0.1042169900985625E+01 -0.1036691375891408E+01 -0.1031219626045731E+01 -0.1025755107459436E+01 -0.1020298261677578E+01 -0.1014849516020502E+01 -0.1009409283823040E+01 -0.1003977964671914E+01 -0.9985559446412423E+00 -0.9931435965261650E+00 -0.9877412800745212E+00 -0.9823493422165672E+00 -0.9769681172927177E+00 -0.9715979272792943E+00 -0.9662390820122231E+00 -0.9608918794086823E+00 -0.9555566056867116E+00 -0.9502335355826994E+00 -0.9449229325667899E+00 -0.9396250490561532E+00 -0.9343401266261530E+00 -0.9290683962193379E+00 -0.9238100783522983E+00 -0.9185653833203373E+00 -0.9133345113999997E+00 -0.9081176530493820E+00 -0.9029149891062611E+00 -0.8977266909840595E+00 -0.8925529208655598E+00 -0.8873938318944620E+00 -0.8822495683646910E+00 -0.8771202659075404E+00 -0.8720060516765797E+00 -0.8669070445303514E+00 -0.8618233552128786E+00 -0.8567550865319589E+00 -0.8517023335352547E+00 -0.8466651836841759E+00 -0.8416437170255952E+00 -0.8366380063613471E+00 -0.8316481174155630E+00 -0.8266741089998076E+00 -0.8217160331760809E+00 -0.8167739354176268E+00 -0.8118478547676139E+00 -0.8069378239956513E+00 -0.8020438697521995E+00 -0.7971660127208436E+00 -0.7923042677684496E+00 -0.7874586440932471E+00 -0.7826291453708021E+00 -0.7778157698979398E+00 -0.7730185107345809E+00 -0.7682373558435663E+00 -0.7634722882284258E+00 -0.7587232860691486E+00 -0.7539903228559367E+00 -0.7492733675209987E+00 -0.7445723845683611E+00 -0.7398873342017247E+00 -0.7352181724504098E+00 -0.7305648512933688E+00 -0.7259273187813085E+00 -0.7213055191569296E+00 -0.7166993929733191E+00 -0.7121088772104908E+00 -0.7075339053901175E+00 -0.7029744076884417E+00 -0.6984303110474385E+00 -0.6939015392841926E+00 -0.6893880131985548E+00 -0.6848896506790639E+00 -0.6804063668071960E+00 -0.6759380739599310E+00 -0.6714846819106545E+00 -0.6670460979284606E+00 -0.6626222268758263E+00 -0.6582129713047191E+00 -0.6538182315511271E+00 -0.6494379058280859E+00 -0.6450718903171657E+00 -0.6407200792584876E+00 -0.6363823650392715E+00 -0.6320586382809613E+00 -0.6277487879249267E+00 -0.6234527013167734E+00 -0.6191702642893190E+00 -0.6149013612442086E+00 -0.6106458752322457E+00 -0.6064036880324198E+00 -0.6021746802297080E+00 -0.5979587312916264E+00 -0.5937557196436042E+00 -0.5895655227431641E+00 -0.5853880171529922E+00 -0.5812230786128654E+00 -0.5770705821105107E+00 -0.5729304019514115E+00 -0.5688024118275793E+00 -0.5646864848853448E+00 -0.5605824937921645E+00 -0.5564903108025173E+00 -0.5524098078228833E+00 -0.5483408564758644E+00 -0.5442833281634526E+00 -0.5402370941295085E+00 -0.5362020255214600E+00 -0.5321779934512643E+00 -0.5281648690556621E+00 -0.5241625235557782E+00 -0.5201708283160628E+00 -0.5161896549026552E+00 -0.5122188751411803E+00 -0.5082583611740192E+00 -0.5043079855170916E+00 -0.5003676211161868E+00 -0.4964371414029022E+00 -0.4925164203501901E+00 -0.4886053325275901E+00 -0.4847037531561659E+00 -0.4808115581632069E+00 -0.4769286242367184E+00 -0.4730548288797583E+00 -0.4691900504646559E+00 -0.4653341682871753E+00 -0.4614870626206452E+00 -0.4576486147701215E+00 -0.4538187071266341E+00 -0.4499972232215512E+00 -0.4461840477811270E+00 -0.4423790667812826E+00 -0.4385821675026696E+00 -0.4347932385860811E+00 -0.4310121700882537E+00 -0.4272388535381303E+00 -0.4234731819936421E+00 -0.4197150500990645E+00 -0.4159643541430195E+00 -0.4122209921171803E+00 -0.4084848637757519E+00 -0.4047558706957974E+00 -0.4010339163384737E+00 -0.3973189061112476E+00 -0.3936107474311905E+00 -0.3899093497893938E+00 -0.3862146248166102E+00 -0.3825264863501910E+00 -0.3788448505024144E+00 -0.3751696357302771E+00 -0.3715007629068495E+00 -0.3678381553942878E+00 -0.3641817391185885E+00 -0.3605314426461966E+00 -0.3568871972625555E+00 -0.3532489370527205E+00 -0.3496165989841241E+00 -0.3459901229916214E+00 -0.3423694520649201E+00 -0.3387545323385251E+00 -0.3351453131843082E+00 -0.3315417473068326E+00 -0.3279437908415819E+00 -0.3243514034561918E+00 -0.3207645484548654E+00 -0.3171831928860834E+00 -0.3136073076537766E+00 -0.3100368676321130E+00 -0.3064718517840476E+00 -0.3029122432838121E+00 -0.2993580296435038E+00 -0.2958092028439498E+00 -0.2922657594700352E+00 -0.2887277008506632E+00 -0.2851950332035602E+00 -0.2816677677851020E+00 -0.2781459210453749E+00 -0.2746295147886844E+00 -0.2711185763397140E+00 -0.2676131387155659E+00 -0.2641132408039054E+00 -0.2606189275474402E+00 -0.2571302501349864E+00 -0.2536472661993449E+00 -0.2501700400222663E+00 -0.2466986427467328E+00 -0.2432331525968512E+00 -0.2397736551055949E+00 -0.2363202433506903E+00 -0.2328730181989250E+00 -0.2294320885591435E+00 -0.2259975716442418E+00 -0.2225695932424345E+00 -0.2191482879980940E+00 -0.2157337997024620E+00 -0.2123262815945201E+00 -0.2089258966723290E+00 -0.2055328180151234E+00 -0.2021472291164557E+00 -0.1987693242286884E+00 -0.1953993087191055E+00 -0.1920373994379287E+00 -0.1886838250985003E+00 -0.1853388266698828E+00 -0.1820026577821215E+00 -0.1786755851443744E+00 -0.1753578889761193E+00 -0.1720498634515968E+00 -0.1687518171576267E+00 -0.1654640735649029E+00 -0.1621869715128154E+00 -0.1589208657078173E+00 -0.1556661272352739E+00 -0.1524231440846908E+00 -0.1491923216881294E+00 -0.1459740834715274E+00 -0.1427688714185721E+00 -0.1395771466466322E+00 -0.1363993899941623E+00 -0.1332361026188316E+00 -0.1300878066054895E+00 -0.1269550455829047E+00 -0.1238383853480043E+00 -0.1207384144961449E+00 -0.1176557450556807E+00 -0.1145910131248316E+00 -0.1115448795085540E+00 -0.1085180303527610E+00 -0.1055111777728831E+00 -0.1025250604733206E+00 -0.9956044435388604E-01 -0.9661812309881886E-01 -0.9369891874337012E-01 -0.9080368221234399E-01 -0.8793329382426256E-01 -0.8508866375406340E-01 -0.8227073244639434E-01 -0.7948047097061904E-01 -0.7671888130764398E-01 -0.7398699655753553E-01 -0.7128588105567601E-01 -0.6861663038386651E-01 -0.6598037126130515E-01 -0.6337826129880289E-01 -0.6081148859784694E-01 -0.5828127117427706E-01 -0.5578885618432740E-01 -0.5333551892862030E-01 -0.5092256160742038E-01 -0.4855131179798897E-01 -0.4622312062232615E-01 -0.4393936057086534E-01 -0.4170142294489704E-01 -0.3951071487762254E-01 -0.3736865589081760E-01 -0.3527667394121730E-01 -0.3323620090791550E-01 -0.3124866746947142E-01 -0.2931549731709577E-01 -0.2743810064840861E-01 -0.2561786688503255E-01 -0.2385615655688409E-01 -0.2215429229678155E-01 -0.2051354889121152E-01 -0.1893514233719176E-01 -0.1742021786166798E-01 -0.1596983686930661E-01 -0.1458496279764457E-01 -0.1326644587608198E-01 -0.1201500680808027E-01 -0.1083121942521028E-01 -0.9715492398480059E-02 -0.8668050137937885E-02 -0.7688913067140435E-02 -0.6777877525966872E-02 -0.5934495634602323E-02 -0.5158055544131036E-02 -0.4447562605453990E-02 -0.3801722107660840E-02 -0.3218924367835703E-02 -0.2697233092980475E-02 -0.2234378075199077E-02 -0.1827753413977412E-02 -0.1474422570309129E-02 -0.1171131627019387E-02 -0.9143321317637030E-03 -0.7002148003936321E-03 -0.5247551181118452E-03 -0.3837714480605755E-03 -0.2729955946109330E-03 -0.1881548319023403E-03 -0.1250631789481358E-03 -0.7971820570180325E-04 -0.4839798665393986E-04 -0.2775118225470492E-04 -0.1487196131798424E-04 -0.7351058493098910E-05 -0.3295260747991843E-05 -0.1310550608265630E-05 -0.4491803501599659E-06 -0.1275625109004752E-06 -0.2842493719500779E-07 -0.4598019108179812E-08 -0.4812641260020268E-09 -0.2729062991232811E-10 -0.6277478184238277E-12 -0.3532884035284522E-14 -0.1843992263449434E-17 -0.1064033801639711E-22 -0.2179574996326970E-32 -0.2191274365894180E-56 -0.5812978673716309E-216 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.8687248663605213E+00 0.1707263902374461E+01 0.2516310697140216E+01 0.3296545407385949E+01 0.4048635017677018E+01 0.4773233612655782E+01 0.5470982663629552E+01 0.6142511330615299E+01 0.6788436779961467E+01 0.7409364516870689E+01 0.8005888731517908E+01 0.8578592656974877E+01 0.9128048936794247E+01 0.9654819999856910E+01 0.1015945843992924E+02 0.1064250739729831E+02 0.1110450093984054E+02 0.1154596444092118E+02 0.1196741495160918E+02 0.1236936156481509E+02 0.1275230576911170E+02 0.1311674179017046E+02 0.1346315691793700E+02 0.1379203181786923E+02 0.1410384082476923E+02 0.1439905221795016E+02 0.1467812847668937E+02 0.1494152651512514E+02 0.1518969789595702E+02 0.1542308902250295E+02 0.1564214130885283E+02 0.1584729132803401E+02 0.1603897093826909E+02 0.1621760738756086E+02 0.1638362339698061E+02 0.1653743722316642E+02 0.1667946270065578E+02 0.1681010926478216E+02 0.1692978195595912E+02 0.1703888140625709E+02 0.1713780380924828E+02 0.1722694087415465E+02 0.1730667976538239E+02 0.1737740302856498E+02 0.1743948850426588E+02 0.1749330923051193E+02 0.1753923333533993E+02 0.1757762392054244E+02 0.1760883893779540E+02 0.1763323105833935E+02 0.1765114753736991E+02 0.1766293007427053E+02 0.1766891466979376E+02 0.1766943148126528E+02 0.1766480467684931E+02 0.1765535228987511E+02 0.1764138607418140E+02 0.1762321136139172E+02 0.1760112692098567E+02 0.1757542482398380E+02 0.1754639031101227E+02 0.1751430166546395E+02 0.1747943009241989E+02 0.1744203960394378E+02 0.1740238691130952E+02 0.1736072132467072E+02 0.1731728466062878E+02 0.1727231115810628E+02 0.1722602740288191E+02 0.1717865226109467E+02 0.1713039682197727E+02 0.1708146435003250E+02 0.1703205024682137E+02 0.1698234202248845E+02 0.1693251927710871E+02 0.1688275369189969E+02 0.1683320903030526E+02 0.1678404114892058E+02 0.1673539801819411E+02 0.1668741975280949E+02 0.1664023865162014E+02 0.1659397924698056E+02 0.1654875836329216E+02 0.1650468518455595E+02 0.1646186133070283E+02 0.1642038094245007E+02 0.1638033077441462E+02 0.1634179029619614E+02 0.1630483180112684E+02 0.1626952052237267E+02 0.1623591475605696E+02 0.1620406599106814E+02 0.1617401904520420E+02 0.1614581220729854E+02 0.1611947738496719E+02 0.1609504025761150E+02 0.1607252043430844E+02 0.1605193161621790E+02 0.1603328176313632E+02 0.1601657326382578E+02 0.1600180310974979E+02 0.1598896307184925E+02 0.1597803987999542E+02 0.1596901540476141E+02 0.1596186684115860E+02 0.1595656689399044E+02 0.1595308396448294E+02 0.1595138233785788E+02 0.1595142237152340E+02 0.1595316068356454E+02 0.1595655034122527E+02 0.1596154104908305E+02 0.1596807933662661E+02 0.1597610874495764E+02 0.1598557001234738E+02 0.1599640125838981E+02 0.1600853816650400E+02 0.1602191416454864E+02 0.1603646060332359E+02 0.1605210693274370E+02 0.1606878087548201E+02 0.1608640859789002E+02 0.1610491487801469E+02 0.1612422327054205E+02 0.1614425626850959E+02 0.1616493546163930E+02 0.1618618169115549E+02 0.1620791520096096E+02 0.1623005578505677E+02 0.1625252293110075E+02 0.1627523596000996E+02 0.1629811416152313E+02 0.1632107692564781E+02 0.1634404386992741E+02 0.1636693496247232E+02 0.1638967064070816E+02 0.1641217192580325E+02 0.1643436053274611E+02 0.1645615897605117E+02 0.1647749067108008E+02 0.1649828003097248E+02 0.1651845255918834E+02 0.1653793493767038E+02 0.1655665511064232E+02 0.1657454236406513E+02 0.1659152740077896E+02 0.1660754241136564E+02 0.1662252114077064E+02 0.1663639895072981E+02 0.1664911287805092E+02 0.1666060168880418E+02 0.1667080592848118E+02 0.1667966796818515E+02 0.1668713204691969E+02 0.1669314431004635E+02 0.1669765284398512E+02 0.1670060770723475E+02 0.1670196095779233E+02 0.1670166667705496E+02 0.1669968099028751E+02 0.1669596208374337E+02 0.1669047021852679E+02 0.1668316774128659E+02 0.1667401909183290E+02 0.1666299080776961E+02 0.1665005152623624E+02 0.1663517198285345E+02 0.1661832500796750E+02 0.1659948552028914E+02 0.1657863051802247E+02 0.1655573906758000E+02 0.1653079228997926E+02 0.1650377334501676E+02 0.1647466741331476E+02 0.1644346167633494E+02 0.1641014529445382E+02 0.1637470938319258E+02 0.1633714698769450E+02 0.1629745305554087E+02 0.1625562440799640E+02 0.1621165970977314E+02 0.1616555943740087E+02 0.1611732584629117E+02 0.1606696293657995E+02 0.1601447641783236E+02 0.1595987367269281E+02 0.1590316371956016E+02 0.1584435717436734E+02 0.1578346621154290E+02 0.1572050452422970E+02 0.1565548728383454E+02 0.1558843109898079E+02 0.1551935397393391E+02 0.1544827526656816E+02 0.1537521564594045E+02 0.1530019704953602E+02 0.1522324264024800E+02 0.1514437676315159E+02 0.1506362490213083E+02 0.1498101363641504E+02 0.1489657059707905E+02 0.1481032442355990E+02 0.1472230472024070E+02 0.1463254201315024E+02 0.1454106770682513E+02 0.1444791404137927E+02 0.1435311404982355E+02 0.1425670151567689E+02 0.1415871093090752E+02 0.1405917745424228E+02 0.1395813686987899E+02 0.1385562554663566E+02 0.1375168039756887E+02 0.1364633884009084E+02 0.1353963875661431E+02 0.1343161845575160E+02 0.1332231663409325E+02 0.1321177233858961E+02 0.1310002492955745E+02 0.1298711404433202E+02 0.1287307956158335E+02 0.1275796156631419E+02 0.1264180031555601E+02 0.1252463620477686E+02 0.1240650973501518E+02 0.1228746148075084E+02 0.1216753205852430E+02 0.1204676209631323E+02 0.1192519220367461E+02 0.1180286294265961E+02 0.1167981479950663E+02 0.1155608815711772E+02 0.1143172326832159E+02 0.1130676022992646E+02 0.1118123895756377E+02 0.1105519916132396E+02 0.1092868032218412E+02 0.1080172166922607E+02 0.1067436215764326E+02 0.1054664044753408E+02 0.1041859488347744E+02 0.1029026347488684E+02 0.1016168387713817E+02 0.1003289337346536E+02 0.9903928857617679E+01 0.9774826817272114E+01 0.9645623318193554E+01 0.9516353989134197E+01 0.9387054007464796E+01 0.9257758085527723E+01 0.9128500457703609E+01 0.8999314868181001E+01 0.8870234559419087E+01 0.8741292261293285E+01 0.8612520180912444E+01 0.8483949993096608E+01 0.8355612831503974E+01 0.8227539280395387E+01 0.8099759367023964E+01 0.7972302554638278E+01 0.7845197736086287E+01 0.7718473228007762E+01 0.7592156765602027E+01 0.7466275497958868E+01 0.7340855983939128E+01 0.7215924188591989E+01 0.7091505480096169E+01 0.6967624627211525E+01 0.6844305797227783E+01 0.6721572554397537E+01 0.6599447858839925E+01 0.6477954065901652E+01 0.6357112925962435E+01 0.6236945584671568E+01 0.6117472583602064E+01 0.5998713861309926E+01 0.5880688754784813E+01 0.5763416001279670E+01 0.5646913740506246E+01 0.5531199517183574E+01 0.5416290283926924E+01 0.5302202404464881E+01 0.5188951657171522E+01 0.5076553238901992E+01 0.4965021769119214E+01 0.4854371294299406E+01 0.4744615292604905E+01 0.4635766678812629E+01 0.4527837809486449E+01 0.4420840488382136E+01 0.4314785972074110E+01 0.4209684975792541E+01 0.4105547679460195E+01 0.4002383733918524E+01 0.3900202267332557E+01 0.3799011891764151E+01 0.3698820709903869E+01 0.3599636321951710E+01 0.3501465832636705E+01 0.3404315858366423E+01 0.3308192534496821E+01 0.3213101522713837E+01 0.3119048018517560E+01 0.3026036758800617E+01 0.2934072029512395E+01 0.2843157673401020E+01 0.2753297097824851E+01 0.2664493282626155E+01 0.2576748788059156E+01 0.2490065762765371E+01 0.2404445951788702E+01 0.2319890704624000E+01 0.2236400983291912E+01 0.2153977370433589E+01 0.2072620077419250E+01 0.1992328952464182E+01 0.1913103488746359E+01 0.1834942832520140E+01 0.1757845791220436E+01 0.1681810841551835E+01 0.1606836137557940E+01 0.1532919518665786E+01 0.1460058517700443E+01 0.1388250368865471E+01 0.1317492015684907E+01 0.1247780118901998E+01 0.1179111064331551E+01 0.1111480970661150E+01 0.1044885697198059E+01 0.9793208515582879E+00 0.9147817972939893E+00 0.8512636614565350E+00 0.7887613420918976E+00 0.7272695156654265E+00 0.6667826444134151E+00 0.6072949836187563E+00 0.5488005888082287E+00 0.4912933228690584E+00 0.4347668630826892E+00 0.3792147080735970E+00 0.3246301846712228E+00 0.2710064546832890E+00 0.2183365215789164E+00 0.1666132370796914E+00 0.1158293076575852E+00 0.6597730093832276E-01 0.1704965200881259E-01 -0.3096133037222471E-01 -0.7806345766145839E-01 -0.1242646555170061E+00 -0.1695729578839355E+00 -0.2139965011800796E+00 -0.2575435185826074E+00 -0.3002223344158743E+00 -0.3420413586411577E+00 -0.3830090814482432E+00 -0.4231340679495004E+00 -0.4624249529762802E+00 -0.5008904359780200E+00 -0.5385392760237241E+00 -0.5753802869061535E+00 -0.6114223323483075E+00 -0.6466743213121019E+00 -0.6811452034089456E+00 -0.7148439644120911E+00 -0.7477796218700159E+00 -0.7799612208208035E+00 -0.8113978296067292E+00 -0.8420985357887053E+00 -0.8720724421598169E+00 -0.9013286628575624E+00 -0.9298763195738665E+00 -0.9577245378622440E+00 -0.9848824435414749E+00 -0.1011359159194722E+01 -0.1037163800763434E+01 -0.1062305474235226E+01 -0.1086793272424552E+01 -0.1110636271845517E+01 -0.1133843529675753E+01 -0.1156424080810253E+01 -0.1178386935004340E+01 -0.1199741074104586E+01 -0.1220495449366658E+01 -0.1240658978858965E+01 -0.1260240544951108E+01 -0.1279248991885808E+01 -0.1297693123433412E+01 -0.1315581700627601E+01 -0.1332923439581261E+01 -0.1349727009381238E+01 -0.1366001030060941E+01 -0.1381754070649363E+01 -0.1396994647295475E+01 -0.1411731221466749E+01 -0.1425972198220502E+01 -0.1439725924546859E+01 -0.1453000687782247E+01 -0.1465804714091862E+01 -0.1478146167020199E+01 -0.1490033146108215E+01 -0.1501473685575904E+01 -0.1512475753069052E+01 -0.1523047248468980E+01 -0.1533196002763981E+01 -0.1542929776981157E+01 -0.1552256261177614E+01 -0.1561183073489532E+01 -0.1569717759238136E+01 -0.1577867790091117E+01 -0.1585640563278520E+01 -0.1593043400861668E+01 -0.1600083549054143E+01 -0.1606768177593432E+01 -0.1613104379162233E+01 -0.1619099168858133E+01 -0.1624759483710538E+01 -0.1630092182243682E+01 -0.1635104044084646E+01 -0.1639801769615148E+01 -0.1644191979666060E+01 -0.1648281215253528E+01 -0.1652075937355576E+01 -0.1655582526728141E+01 -0.1658807283759452E+01 -0.1661756428361703E+01 -0.1664436099898922E+01 -0.1666852357150144E+01 -0.1669011178306643E+01 -0.1670918461002464E+01 -0.1672580022377071E+01 -0.1674001599169259E+01 -0.1675188847841216E+01 -0.1676147344732051E+01 -0.1676882586239485E+01 -0.1677399989029130E+01 -0.1677704890270234E+01 -0.1677802547897067E+01 -0.1677698140895068E+01 -0.1677396769610920E+01 -0.1676903456085609E+01 -0.1676223144409744E+01 -0.1675360701100275E+01 -0.1674320915497755E+01 -0.1673108500183398E+01 -0.1671728091415232E+01 -0.1670184249582419E+01 -0.1668481459677102E+01 -0.1666624131783108E+01 -0.1664616601580613E+01 -0.1662463130866198E+01 -0.1660167908087604E+01 -0.1657735048892448E+01 -0.1655168596690241E+01 -0.1652472523227175E+01 -0.1649650729172852E+01 -0.1646707044718564E+01 -0.1643645230186273E+01 -0.1640468976647931E+01 -0.1637181906554373E+01 -0.1633787574373395E+01 -0.1630289467236240E+01 -0.1626691005592231E+01 -0.1622995543870765E+01 -0.1619206371150311E+01 -0.1615326711833899E+01 -0.1611359726330491E+01 -0.1607308511741977E+01 -0.1603176102555118E+01 -0.1598965471338085E+01 -0.1594679529441171E+01 -0.1590321127701217E+01 -0.1585893057149300E+01 -0.1581398049721393E+01 -0.1576838778971485E+01 -0.1572217860786824E+01 -0.1567537854104941E+01 -0.1562801261632051E+01 -0.1558010530562515E+01 -0.1553168053298982E+01 -0.1548276168172963E+01 -0.1543337160165420E+01 -0.1538353261627133E+01 -0.1533326652998501E+01 -0.1528259463528551E+01 -0.1523153771992774E+01 -0.1518011607409659E+01 -0.1512834949755512E+01 -0.1507625730677423E+01 -0.1502385834204081E+01 -0.1497117097454231E+01 -0.1491821311342496E+01 -0.1486500221282453E+01 -0.1481155527886632E+01 -0.1475788887663291E+01 -0.1470401913709823E+01 -0.1464996176402467E+01 -0.1459573204082366E+01 -0.1454134483737546E+01 -0.1448681461680846E+01 -0.1443215544223580E+01 -0.1437738098344736E+01 -0.1432250452355627E+01 -0.1426753896559857E+01 -0.1421249683908433E+01 -0.1415739030649932E+01 -0.1410223116975571E+01 -0.1404703087659131E+01 -0.1399180052691527E+01 -0.1393655087910084E+01 -0.1388129235622212E+01 -0.1382603505223591E+01 -0.1377078873810667E+01 -0.1371556286787404E+01 -0.1366036658466202E+01 -0.1360520872663014E+01 -0.1355009783286443E+01 -0.1349504214920848E+01 -0.1344004963403421E+01 -0.1338512796395142E+01 -0.1333028453945557E+01 -0.1327552649051373E+01 -0.1322086068208856E+01 -0.1316629371959906E+01 -0.1311183195431850E+01 -0.1305748148870926E+01 -0.1300324818169403E+01 -0.1294913765386324E+01 -0.1289515529261906E+01 -0.1284130625725508E+01 -0.1278759548397190E+01 -0.1273402769082885E+01 -0.1268060738263149E+01 -0.1262733885575457E+01 -0.1257422620290157E+01 -0.1252127331779953E+01 -0.1246848389983009E+01 -0.1241586145859656E+01 -0.1236340931842745E+01 -0.1231113062281559E+01 -0.1225902833879501E+01 -0.1220710526125339E+01 -0.1215536401718194E+01 -0.1210380706986247E+01 -0.1205243672299176E+01 -0.1200125512474344E+01 -0.1195026427176832E+01 -0.1189946601313249E+01 -0.1184886205419436E+01 -0.1179845396042039E+01 -0.1174824316114016E+01 -0.1169823095324133E+01 -0.1164841850480436E+01 -0.1159880685867766E+01 -0.1154939693599391E+01 -0.1150018953962708E+01 -0.1145118535759160E+01 -0.1140238496638358E+01 -0.1135378883426438E+01 -0.1130539732448745E+01 -0.1125721069846856E+01 -0.1120922911890006E+01 -0.1116145265280953E+01 -0.1111388127456360E+01 -0.1106651486881709E+01 -0.1101935323340800E+01 -0.1097239608219940E+01 -0.1092564304786787E+01 -0.1087909368463974E+01 -0.1083274747097547E+01 -0.1078660381220247E+01 -0.1074066204309709E+01 -0.1069492143041646E+01 -0.1064938117538041E+01 -0.1060404041610429E+01 -0.1055889822998297E+01 -0.1051395363602706E+01 -0.1046920559715141E+01 -0.1042465302241655E+01 -0.1038029476922388E+01 -0.1033612964546500E+01 -0.1029215641162557E+01 -0.1024837378284490E+01 -0.1020478043093089E+01 -0.1016137498633167E+01 -0.1011815604006419E+01 -0.1007512214560045E+01 -0.1003227182071147E+01 -0.9989603549270579E+00 -0.9947115783015485E+00 -0.9904806943270184E+00 -0.9862675422627522E+00 -0.9820719586592493E+00 -0.9778937775186953E+00 -0.9737328304516771E+00 -0.9695889468301108E+00 -0.9654619539365238E+00 -0.9613516771097025E+00 -0.9572579398867307E+00 -0.9531805641415736E+00 -0.9491193702201466E+00 -0.9450741770719889E+00 -0.9410448023785890E+00 -0.9370310626784017E+00 -0.9330327734886064E+00 -0.9290497494236897E+00 -0.9250818043108714E+00 -0.9211287513024286E+00 -0.9171904029850091E+00 -0.9132665714859235E+00 -0.9093570685765163E+00 -0.9054617057726567E+00 -0.9015802944323839E+00 -0.8977126458507625E+00 -0.8938585713520132E+00 -0.8900178823789437E+00 -0.8861903905797556E+00 -0.8823759078922311E+00 -0.8785742466254294E+00 -0.8747852195388349E+00 -0.8710086399190866E+00 -0.8672443216543031E+00 -0.8634920793060465E+00 -0.8597517281789752E+00 -0.8560230843882563E+00 -0.8523059649247257E+00 -0.8486001877179036E+00 -0.8449055716968552E+00 -0.8412219368489985E+00 -0.8375491042768192E+00 -0.8338868962526480E+00 -0.8302351362714315E+00 -0.8265936491016083E+00 -0.8229622608341091E+00 -0.8193407989295268E+00 -0.8157290922634788E+00 -0.8121269711702471E+00 -0.8085342674846857E+00 -0.8049508145824523E+00 -0.8013764474186241E+00 -0.7978110025647080E+00 -0.7942543182440929E+00 -0.7907062343659974E+00 -0.7871665925579165E+00 -0.7836352361966469E+00 -0.7801120104378853E+00 -0.7765967622444689E+00 -0.7730893404132703E+00 -0.7695895956008084E+00 -0.7660973803475873E+00 -0.7626125491011952E+00 -0.7591349582382320E+00 -0.7556644660850415E+00 -0.7522009329373659E+00 -0.7487442210788564E+00 -0.7452941947985601E+00 -0.7418507204073561E+00 -0.7384136662534099E+00 -0.7349829027366561E+00 -0.7315583023223650E+00 -0.7281397395537861E+00 -0.7247270910639445E+00 -0.7213202355865901E+00 -0.7179190539663420E+00 -0.7145234291680540E+00 -0.7111332462854418E+00 -0.7077483925489899E+00 -0.7043687573331715E+00 -0.7009942321630125E+00 -0.6976247107200276E+00 -0.6942600888475667E+00 -0.6909002645555757E+00 -0.6875451380248399E+00 -0.6841946116106925E+00 -0.6808485898462595E+00 -0.6775069794452312E+00 -0.6741696893042333E+00 -0.6708366305047628E+00 -0.6675077163147983E+00 -0.6641828621900246E+00 -0.6608619857747765E+00 -0.6575450069026729E+00 -0.6542318475970094E+00 -0.6509224320708961E+00 -0.6476166867272263E+00 -0.6443145401584339E+00 -0.6410159231461258E+00 -0.6377207686605807E+00 -0.6344290118601643E+00 -0.6311405900906676E+00 -0.6278554428846229E+00 -0.6245735119605972E+00 -0.6212947412225088E+00 -0.6180190767589913E+00 -0.6147464668428325E+00 -0.6114768619305104E+00 -0.6082102146618701E+00 -0.6049464798599574E+00 -0.6016856145310354E+00 -0.5984275778648340E+00 -0.5951723312350204E+00 -0.5919198381999848E+00 -0.5886700645038960E+00 -0.5854229780781174E+00 -0.5821785490429797E+00 -0.5789367497099552E+00 -0.5756975545842548E+00 -0.5724609403678959E+00 -0.5692268859632494E+00 -0.5659953724771183E+00 -0.5627663832253617E+00 -0.5595399037381192E+00 -0.5563159217656418E+00 -0.5530944272847829E+00 -0.5498754125061794E+00 -0.5466588718821447E+00 -0.5434448021153181E+00 -0.5402332021681084E+00 -0.5370240732729479E+00 -0.5338174189434215E+00 -0.5306132449862715E+00 -0.5274115595143415E+00 -0.5242123729604776E+00 -0.5210156980924291E+00 -0.5178215500287884E+00 -0.5146299462559857E+00 -0.5114409066464112E+00 -0.5082544534776542E+00 -0.5050706114529327E+00 -0.5018894077227221E+00 -0.4987108719076290E+00 -0.4955350361225455E+00 -0.4923619350021070E+00 -0.4891916057274888E+00 -0.4860240880545712E+00 -0.4828594243435082E+00 -0.4796976595897113E+00 -0.4765388414562883E+00 -0.4733830203079488E+00 -0.4702302492464025E+00 -0.4670805841472636E+00 -0.4639340836984699E+00 -0.4607908094402333E+00 -0.4576508258065108E+00 -0.4545142001680199E+00 -0.4513810028767579E+00 -0.4482513073120319E+00 -0.4451251899279745E+00 -0.4420027303025001E+00 -0.4388840111876836E+00 -0.4357691185614755E+00 -0.4326581416807331E+00 -0.4295511731354427E+00 -0.4264483089040742E+00 -0.4233496484099363E+00 -0.4202552945784125E+00 -0.4171653538949250E+00 -0.4140799364634484E+00 -0.4109991560653700E+00 -0.4079231302184809E+00 -0.4048519802358120E+00 -0.4017858312840442E+00 -0.3987248124411331E+00 -0.3956690567527806E+00 -0.3926187012873193E+00 -0.3895738871885333E+00 -0.3865347597258667E+00 -0.3835014683414236E+00 -0.3804741666930851E+00 -0.3774530126929794E+00 -0.3744381685404753E+00 -0.3714298007487684E+00 -0.3684280801640104E+00 -0.3654331819758509E+00 -0.3624452857181055E+00 -0.3594645752581452E+00 -0.3564912387734580E+00 -0.3535254687136594E+00 -0.3505674617460703E+00 -0.3476174186827757E+00 -0.3446755443868791E+00 -0.3417420476554580E+00 -0.3388171410764583E+00 -0.3359010408565321E+00 -0.3329939666165476E+00 -0.3300961411511784E+00 -0.3272077901487176E+00 -0.3243291418668700E+00 -0.3214604267599845E+00 -0.3186018770527939E+00 -0.3157537262553701E+00 -0.3129162086136159E+00 -0.3100895584892342E+00 -0.3072740096627376E+00 -0.3044697945526863E+00 -0.3016771433440111E+00 -0.2988962830179719E+00 -0.2961274362760575E+00 -0.2933708203499825E+00 -0.2906266456898650E+00 -0.2878951145227867E+00 -0.2851764192741990E+00 -0.2824707408451726E+00 -0.2797782467393001E+00 -0.2770990890342526E+00 -0.2744334021946651E+00 -0.2717813007251957E+00 -0.2691428766655449E+00 -0.2665181969328780E+00 -0.2639073005217756E+00 -0.2613101955776174E+00 -0.2587268563663881E+00 -0.2561572201724773E+00 -0.2536011841663135E+00 -0.2510586022957567E+00 -0.2485292822692960E+00 -0.2460129827152067E+00 -0.2435094106190135E+00 -0.2410182191615573E+00 -0.2385390061013152E+00 -0.2360713128665393E+00 -0.2336146245440482E+00 -0.2311683709702571E+00 -0.2287319291436186E+00 -0.2263046271825591E+00 -0.2238857500445038E+00 -0.2214745471939171E+00 -0.2190702423535930E+00 -0.2166720453861016E+00 -0.2142791662241082E+00 -0.2118908305935776E+00 -0.2095062970515578E+00 -0.2071248745972281E+00 -0.2047459398312080E+00 -0.2023689523724028E+00 -0.1999934670554019E+00 -0.1976191414090548E+00 -0.1952457371550912E+00 -0.1928731150462155E+00 -0.1905012233025302E+00 -0.1881300810881581E+00 -0.1857597595959972E+00 -0.1833903639169085E+00 -0.1810220185223115E+00 -0.1786548578143285E+00 -0.1762890213721006E+00 -0.1739246522622315E+00 -0.1715618967099617E+00 -0.1692009041513801E+00 -0.1668418273480159E+00 -0.1644848225100573E+00 -0.1621300494242820E+00 -0.1597776715867397E+00 -0.1574278563403202E+00 -0.1550807750173627E+00 -0.1527366030874480E+00 -0.1503955203105244E+00 -0.1480577108955310E+00 -0.1457233636646466E+00 -0.1433926722233472E+00 -0.1410658351364051E+00 -0.1387430561099922E+00 -0.1364245441800418E+00 -0.1341105139070126E+00 -0.1318011855772175E+00 -0.1294967854108453E+00 -0.1271975457768302E+00 -0.1249037054146965E+00 -0.1226155096635082E+00 -0.1203332106980454E+00 -0.1180570677723090E+00 -0.1157873474704553E+00 -0.1135243239652422E+00 -0.1112682792840448E+00 -0.1090195035824928E+00 -0.1067782954257439E+00 -0.1045449620773913E+00 -0.1023198197959724E+00 -0.1001031941390004E+00 -0.9789542027442202E-01 -0.9569684329933507E-01 -0.9350781856577459E-01 -0.9132871201329762E-01 -0.8915990050804710E-01 -0.8700177218790264E-01 -0.8485472681323365E-01 -0.8271917612269755E-01 -0.8059554419341119E-01 -0.7848426780471512E-01 -0.7638579680463178E-01 -0.7430059447796174E-01 -0.7222913791482828E-01 -0.7017191837828506E-01 -0.6812944166942314E-01 -0.6610222848819827E-01 -0.6409081478795155E-01 -0.6209575212134812E-01 -0.6011760797515669E-01 -0.5815696609097321E-01 -0.5621442676864546E-01 -0.5429060714874503E-01 -0.5238614147002400E-01 -0.5050168129729559E-01 -0.4863789571467226E-01 -0.4679547147851291E-01 -0.4497511312379645E-01 -0.4317754301696363E-01 -0.4140350134749559E-01 -0.3965374604968968E-01 -0.3792905264519061E-01 -0.3623021399585374E-01 -0.3455803995547253E-01 -0.3291335690774033E-01 -0.3129700717659555E-01 -0.2970984829376720E-01 -0.2815275210690626E-01 -0.2662660371018717E-01 -0.2513230017763598E-01 -0.2367074907776015E-01 -0.2224286674626115E-01 -0.2084957629177444E-01 -0.1949180530768286E-01 -0.1817048326111876E-01 -0.1688653852836564E-01 -0.1564089504398897E-01 -0.1443446852927493E-01 -0.1326816226396534E-01 -0.1214286236395461E-01 -0.1105943252668154E-01 -0.1001870820551502E-01 -0.9021490174708021E-02 -0.8068537447652485E-02 -0.7160559513483508E-02 -0.6298207860858848E-02 -0.5482066763324758E-02 -0.4712643308532483E-02 -0.3990356664167553E-02 -0.3315526587400327E-02 -0.2688361202633861E-02 -0.2108944095059771E-02 -0.1577220795897805E-02 -0.1092984770086615E-02 -0.6558630595718385E-03 -0.2653017861664537E-03 0.7944822189490764E-04 0.3793453454019918E-03 0.6355702167323619E-03 0.8495373838452211E-03 0.1022904990027115E-02 0.1157581756795607E-02 0.1255730447553756E-02 0.1319766883295748E-02 0.1352353488459118E-02 0.1356386278494535E-02 0.1334974179358035E-02 0.1291409617048463E-02 0.1229129462600355E-02 0.1151665700113620E-02 0.1062585641275423E-02 0.9654221768740550E-03 0.8635954616548462E-03 0.7603285776664598E-03 0.6585610737771120E-03 0.5608657269660935E-03 0.4693752087118773E-03 0.3857262433307593E-03 0.3110288768033999E-03 0.2458671434387088E-03 0.1903343314865707E-03 0.1441011800570143E-03 0.1065093644667441E-03 0.7667716125666785E-04 0.5360156636052818E-04 0.3624338213230885E-04 0.2358881126340773E-04 0.1468957244294401E-04 0.8688517982512364E-05 0.4836926461183601E-05 0.2505806106186696E-05 0.1190778874910442E-05 0.5095498141563876E-06 0.1916497626697207E-06 0.6134629795982277E-07 0.1599283622173898E-07 0.3192844313628801E-08 0.4465991345509002E-09 0.3830055172706218E-10 0.1633011596692233E-11 0.2440735408533676E-13 0.6817882595562817E-16 0.1011756708173479E-19 0.4237417807138562E-26 0.7509788045435901E-39 0.4267446943283257E-77 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.5899841183367943E+00 0.1161355619573833E+01 0.1714505862663386E+01 0.2249819256784396E+01 0.2767673391510573E+01 0.3268439177645294E+01 0.3752481000506378E+01 0.4220156886514003E+01 0.4671818683172639E+01 0.5107812251922465E+01 0.5528477672848820E+01 0.5934149459862732E+01 0.6325156784687305E+01 0.6701823707789128E+01 0.7064469414269955E+01 0.7413408452670304E+01 0.7748950974623735E+01 0.8071402973330306E+01 0.8381066518882308E+01 0.8678239988567556E+01 0.8963218290390984E+01 0.9236293078186977E+01 0.9497752956839562E+01 0.9747883676281340E+01 0.9986968313100460E+01 0.1021528743874655E+02 0.1043311927348773E+02 0.1064073982542990E+02 0.1083842301406511E+02 0.1102644077796590E+02 0.1120506316638604E+02 0.1137455841466486E+02 0.1153519300345998E+02 0.1168723170195367E+02 0.1183093759528836E+02 0.1196657209658812E+02 0.1209439494401590E+02 0.1221466418339854E+02 0.1232763613702556E+02 0.1243356535929262E+02 0.1253270457991625E+02 0.1262530463549414E+02 0.1271161439022432E+02 0.1279188064662818E+02 0.1286634804714671E+02 0.1293525896749568E+02 0.1299885340267705E+02 0.1305736884654751E+02 0.1311104016584454E+02 0.1316009946956320E+02 0.1320477597456633E+02 0.1324529586829482E+02 0.1328188216942499E+02 0.1331475458729735E+02 0.1334412938091442E+02 0.1337021921827631E+02 0.1339323303679160E+02 0.1341337590546720E+02 0.1343084888954589E+02 0.1344584891822348E+02 0.1345856865604004E+02 0.1346919637850042E+02 0.1347791585244115E+02 0.1348490622162011E+02 0.1349034189796659E+02 0.1349439245888940E+02 0.1349722255100133E+02 0.1349899180057996E+02 0.1349985473104553E+02 0.1349996068770030E+02 0.1349945376993611E+02 0.1349847277108194E+02 0.1349715112602811E+02 0.1349561686673074E+02 0.1349399258566773E+02 0.1349239540728639E+02 0.1349093696745374E+02 0.1348972340089195E+02 0.1348885533655486E+02 0.1348842790087613E+02 0.1348853072879561E+02 0.1348924798244868E+02 0.1349065837738147E+02 0.1349283521613647E+02 0.1349584642903438E+02 0.1349975462196169E+02 0.1350461713095838E+02 0.1351048608338651E+02 0.1351740846544771E+02 0.1352542619580703E+02 0.1353457620507051E+02 0.1354489052085530E+02 0.1355639635818421E+02 0.1356911621492991E+02 0.1358306797202959E+02 0.1359826499818650E+02 0.1361471625877207E+02 0.1363242642864042E+02 0.1365139600856614E+02 0.1367162144501598E+02 0.1369309525296598E+02 0.1371580614147713E+02 0.1373973914174481E+02 0.1376487573734043E+02 0.1379119399636717E+02 0.1381866870525614E+02 0.1384727150393395E+02 0.1387697102209792E+02 0.1390773301634148E+02 0.1393952050787757E+02 0.1397229392061555E+02 0.1400601121935343E+02 0.1404062804785455E+02 0.1407609786658558E+02 0.1411237208990064E+02 0.1414940022246391E+02 0.1418712999471152E+02 0.1422550749716204E+02 0.1426447731339282E+02 0.1430398265150846E+02 0.1434396547393582E+02 0.1438436662538888E+02 0.1442512595885534E+02 0.1446618245946512E+02 0.1450747436611004E+02 0.1454893929069182E+02 0.1459051433488456E+02 0.1463213620430574E+02 0.1467374131999813E+02 0.1471526592713335E+02 0.1475664620085529E+02 0.1479781834918989E+02 0.1483871871295512E+02 0.1487928386261246E+02 0.1491945069200887E+02 0.1495915650896474E+02 0.1499833912267056E+02 0.1503693692786206E+02 0.1507488898574914E+02 0.1511213510168126E+02 0.1514861589953717E+02 0.1518427289283329E+02 0.1521904855255031E+02 0.1525288637168290E+02 0.1528573092652318E+02 0.1531752793469264E+02 0.1534822430994272E+02 0.1537776821374822E+02 0.1540610910372214E+02 0.1543319777888478E+02 0.1545898642182323E+02 0.1548342863778163E+02 0.1550647949072526E+02 0.1552809553642536E+02 0.1554823485261403E+02 0.1556685706626144E+02 0.1558392337803033E+02 0.1559939658396475E+02 0.1561324109447264E+02 0.1562542295066320E+02 0.1563590983810227E+02 0.1564467109805053E+02 0.1565167773625032E+02 0.1565690242932856E+02 0.1566031952888424E+02 0.1566190506332994E+02 0.1566163673755728E+02 0.1565949393049741E+02 0.1565545769064767E+02 0.1564951072963612E+02 0.1564163741389599E+02 0.1563182375452176E+02 0.1562005739537916E+02 0.1560632759954093E+02 0.1559062523411967E+02 0.1557294275356961E+02 0.1555327418152762E+02 0.1553161509126428E+02 0.1550796258481429E+02 0.1548231527085568E+02 0.1545467324140574E+02 0.1542503804740110E+02 0.1539341267322875E+02 0.1535980151027311E+02 0.1532421032954375E+02 0.1528664625344730E+02 0.1524711772676548E+02 0.1520563448690045E+02 0.1516220753344726E+02 0.1511684909715194E+02 0.1506957260831226E+02 0.1502039266467727E+02 0.1496932499890005E+02 0.1491638644559677E+02 0.1486159490806366E+02 0.1480496932470243E+02 0.1474652963520277E+02 0.1468629674652943E+02 0.1462429249875961E+02 0.1456053963081552E+02 0.1449506174613458E+02 0.1442788327831924E+02 0.1435902945680608E+02 0.1428852627259312E+02 0.1421640044406208E+02 0.1414267938293157E+02 0.1406739116037524E+02 0.1399056447333767E+02 0.1391222861107943E+02 0.1383241342198120E+02 0.1375114928063558E+02 0.1366846705525355E+02 0.1358439807541183E+02 0.1349897410016506E+02 0.1341222728654655E+02 0.1332419015847903E+02 0.1323489557611632E+02 0.1314437670563505E+02 0.1305266698949474E+02 0.1295980011718308E+02 0.1286580999646230E+02 0.1277073072513102E+02 0.1267459656331543E+02 0.1257744190630183E+02 0.1247930125792220E+02 0.1238020920450298E+02 0.1228020038938623E+02 0.1217930948803182E+02 0.1207757118370758E+02 0.1197502014377439E+02 0.1187169099657116E+02 0.1176761830890495E+02 0.1166283656414955E+02 0.1155738014095610E+02 0.1145128329257739E+02 0.1134458012680787E+02 0.1123730458653994E+02 0.1112949043093634E+02 0.1102117121721842E+02 0.1091238028306897E+02 0.1080315072964744E+02 0.1069351540521540E+02 0.1058350688936919E+02 0.1047315747787608E+02 0.1036249916810981E+02 0.1025156364508113E+02 0.1014038226805835E+02 0.1002898605777191E+02 0.9917405684197892E+01 0.9805671454913359E+01 0.9693813304017528E+01 0.9581860781611367E+01 0.9469843043828288E+01 0.9357788843408597E+01 0.9245726520809420E+01 0.9133683995842015E+01 0.9021688759828107E+01 0.8909767868266561E+01 0.8797947934001263E+01 0.8686255120881437E+01 0.8574715137904995E+01 0.8463353233835596E+01 0.8352194192283553E+01 0.8241262327241410E+01 0.8130581479064045E+01 0.8020175010883365E+01 0.7910065805447962E+01 0.7800276262377434E+01 0.7690828295821206E+01 0.7581743332512092E+01 0.7473042310204099E+01 0.7364745676484368E+01 0.7256873387949169E+01 0.7149444909733861E+01 0.7042479215386244E+01 0.6935994787073786E+01 0.6830009616114025E+01 0.6724541203818547E+01 0.6619606562640385E+01 0.6515222217614777E+01 0.6411404208083596E+01 0.6308168089693712E+01 0.6205528936659299E+01 0.6103501344278738E+01 0.6002099431696649E+01 0.5901336844901273E+01 0.5801226759948285E+01 0.5701781886401747E+01 0.5603014470983003E+01 0.5504936301418622E+01 0.5407558710478755E+01 0.5310892580196972E+01 0.5214948346263076E+01 0.5119736002580636E+01 0.5025265105980838E+01 0.4931544781084478E+01 0.4838583725304196E+01 0.4746390213979240E+01 0.4654972105634751E+01 0.4564336847358377E+01 0.4474491480286574E+01 0.4385442645193613E+01 0.4297196588176073E+01 0.4209759166425876E+01 0.4123135854085263E+01 0.4037331748177098E+01 0.3952351574603862E+01 0.3868199694209329E+01 0.3784880108896700E+01 0.3702396467797228E+01 0.3620752073483427E+01 0.3539949888221543E+01 0.3459992540257458E+01 0.3380882330130837E+01 0.3302621237012444E+01 0.3225210925059441E+01 0.3148652749783842E+01 0.3072947764429528E+01 0.2998096726353141E+01 0.2924100103404396E+01 0.2850958080301697E+01 0.2778670564998860E+01 0.2707237195038878E+01 0.2636657343891009E+01 0.2566930127267545E+01 0.2498054409416378E+01 0.2430028809386447E+01 0.2362851707262292E+01 0.2296521250364838E+01 0.2231035359415401E+01 0.2166391734659781E+01 0.2102587861949918E+01 0.2039621018780374E+01 0.1977488280277051E+01 0.1916186525135823E+01 0.1855712441508784E+01 0.1796062532835888E+01 0.1737233123619909E+01 0.1679220365142876E+01 0.1622020241122005E+01 0.1565628573303434E+01 0.1510041026992134E+01 0.1455253116516494E+01 0.1401260210626005E+01 0.1348057537820834E+01 0.1295640191612015E+01 0.1244003135710985E+01 0.1193141209147503E+01 0.1143049131314995E+01 0.1093721506942225E+01 0.1045152830990733E+01 0.9973374934770503E+00 0.9502697842192204E+00 0.9039438975069450E+00 0.8583539366947573E+00 0.8134939187180027E+00 0.7693577785309419E+00 0.7259393734669808E+00 0.6832324875204686E+00 0.6412308355501580E+00 0.5999280674039510E+00 0.5593177719650326E+00 0.5193934811192902E+00 0.4801486736441256E+00 0.4415767790185855E+00 0.4036711811552292E+00 0.3664252220536028E+00 0.3298322053757856E+00 0.2938853999441776E+00 0.2585780431619257E+00 0.2239033443561915E+00 0.1898544880448611E+00 0.1564246371270075E+00 0.1236069359975595E+00 0.9139451358676925E-01 0.5978048632501255E-01 0.2875796103333898E-01 -0.1679962259405253E-02 -0.3154018757241899E-01 -0.6082962030108538E-01 -0.8955516461660286E-01 -0.1177237209366101E+00 -0.1453421834658722E+00 -0.1724174378064842E+00 -0.1989563586366328E+00 -0.2249658074573321E+00 -0.2504526304061375E+00 -0.2754236561371938E+00 -0.2998856937666934E+00 -0.3238455308829152E+00 -0.3473099316199632E+00 -0.3702856347944674E+00 -0.3927793521041590E+00 -0.4147977663876007E+00 -0.4363475299441409E+00 -0.4574352629131093E+00 -0.4780675517114195E+00 -0.4982509475286878E+00 -0.5179919648788196E+00 -0.5372970802072690E+00 -0.5561727305530091E+00 -0.5746253122642059E+00 -0.5926611797667505E+00 -0.6102866443846747E+00 -0.6275079732115432E+00 -0.6443313880318098E+00 -0.6607630642913176E+00 -0.6768091301158876E+00 -0.6924756653771867E+00 -0.7077687008048035E+00 -0.7226942171437692E+00 -0.7372581443564278E+00 -0.7514663608678986E+00 -0.7653246928540729E+00 -0.7788389135713435E+00 -0.7920147427271221E+00 -0.8048578458902081E+00 -0.8173738339401606E+00 -0.8295682625548225E+00 -0.8414466317350016E+00 -0.8530143853655495E+00 -0.8642769108119376E+00 -0.8752395385514281E+00 -0.8859075418380596E+00 -0.8962861364005478E+00 -0.9063804801723496E+00 -0.9161956730529236E+00 -0.9257367566995721E+00 -0.9350087143488421E+00 -0.9440164706668895E+00 -0.9527648916278635E+00 -0.9612587844196464E+00 -0.9695028973760704E+00 -0.9775019199350281E+00 -0.9852604826214921E+00 -0.9927831570549439E+00 -0.1000074455980330E+01 -0.1007138833321882E+01 -0.1013980684259106E+01 -0.1020604345324242E+01 -0.1027014094520476E+01 -0.1033214151460282E+01 -0.1039208677523227E+01 -0.1045001776032526E+01 -0.1050597492449770E+01 -0.1055999814587213E+01 -0.1061212672836912E+01 -0.1066239940416186E+01 -0.1071085433628814E+01 -0.1075752912141292E+01 -0.1080246079273645E+01 -0.1084568582304249E+01 -0.1088724012788046E+01 -0.1092715906887623E+01 -0.1096547745716693E+01 -0.1100222955695317E+01 -0.1103744908916555E+01 -0.1107116923523791E+01 -0.1110342264098502E+01 -0.1113424142057791E+01 -0.1116365716061343E+01 -0.1119170092427236E+01 -0.1121840325556284E+01 -0.1124379418364351E+01 -0.1126790322722266E+01 -0.1129075939902947E+01 -0.1131239121035218E+01 -0.1133282667564084E+01 -0.1135209331716900E+01 -0.1137021816975156E+01 -0.1138722778551496E+01 -0.1140314823871568E+01 -0.1141800513060382E+01 -0.1143182359432848E+01 -0.1144462829988106E+01 -0.1145644345907359E+01 -0.1146729283054887E+01 -0.1147719972481915E+01 -0.1148618700933064E+01 -0.1149427711355036E+01 -0.1150149203407336E+01 -0.1150785333974662E+01 -0.1151338217680745E+01 -0.1151809927403365E+01 -0.1152202494790314E+01 -0.1152517910775978E+01 -0.1152758126098446E+01 -0.1152925051816752E+01 -0.1153020559828135E+01 -0.1153046483385062E+01 -0.1153004617611814E+01 -0.1152896720020397E+01 -0.1152724511025663E+01 -0.1152489674459358E+01 -0.1152193858082955E+01 -0.1151838674099132E+01 -0.1151425699661622E+01 -0.1150956477383416E+01 -0.1150432515843014E+01 -0.1149855290088658E+01 -0.1149226242140391E+01 -0.1148546781489776E+01 -0.1147818285597133E+01 -0.1147042100386233E+01 -0.1146219540736222E+01 -0.1145351890970717E+01 -0.1144440405343972E+01 -0.1143486308523956E+01 -0.1142490796072246E+01 -0.1141455034920708E+01 -0.1140380163844745E+01 -0.1139267293933129E+01 -0.1138117509054281E+01 -0.1136931866318917E+01 -0.1135711396538980E+01 -0.1134457104682830E+01 -0.1133169970326549E+01 -0.1131850948101341E+01 -0.1130500968136960E+01 -0.1129120936501098E+01 -0.1127711735634675E+01 -0.1126274224782987E+01 -0.1124809240422688E+01 -0.1123317596684496E+01 -0.1121800085771649E+01 -0.1120257478374031E+01 -0.1118690524077965E+01 -0.1117099951771584E+01 -0.1115486470045851E+01 -0.1113850767591084E+01 -0.1112193513589038E+01 -0.1110515358100515E+01 -0.1108816932448459E+01 -0.1107098849596516E+01 -0.1105361704523115E+01 -0.1103606074590946E+01 -0.1101832519911928E+01 -0.1100041583707593E+01 -0.1098233792664933E+01 -0.1096409657287642E+01 -0.1094569672242852E+01 -0.1092714316703250E+01 -0.1090844054684662E+01 -0.1088959335379075E+01 -0.1087060593483124E+01 -0.1085148249522008E+01 -0.1083222710168924E+01 -0.1081284368559944E+01 -0.1079333604604411E+01 -0.1077370785290845E+01 -0.1075396264988352E+01 -0.1073410385743633E+01 -0.1071413477573506E+01 -0.1069405858753038E+01 -0.1067387836099281E+01 -0.1065359705250640E+01 -0.1063321750941883E+01 -0.1061274247274852E+01 -0.1059217457984850E+01 -0.1057151636702792E+01 -0.1055077027213080E+01 -0.1052993863707296E+01 -0.1050902371033679E+01 -0.1048802764942500E+01 -0.1046695252327259E+01 -0.1044580031461829E+01 -0.1042457292233526E+01 -0.1040327216372171E+01 -0.1038189977675128E+01 -0.1036045742228431E+01 -0.1033894668623957E+01 -0.1031736908172717E+01 -0.1029572605114311E+01 -0.1027401896822551E+01 -0.1025224914007316E+01 -0.1023041780912662E+01 -0.1020852615511239E+01 -0.1018657529695029E+01 -0.1016456629462466E+01 -0.1014250015101953E+01 -0.1012037781371852E+01 -0.1009820017676932E+01 -0.1007596808241376E+01 -0.1005368232278329E+01 -0.1003134364156065E+01 -0.1000895273560783E+01 -0.9986510256561214E+00 -0.9964016812393415E+00 -0.9941472968943378E+00 -0.9918879251414070E+00 -0.9896236145838693E+00 -0.9873544100515853E+00 -0.9850803527413915E+00 -0.9828014803544729E+00 -0.9805178272307916E+00 -0.9782294244804987E+00 -0.9759363001124680E+00 -0.9736384791599416E+00 -0.9713359838033104E+00 -0.9690288334901421E+00 -0.9667170450524106E+00 -0.9644006328210118E+00 -0.9620796087376083E+00 -0.9597539824638249E+00 -0.9574237614878179E+00 -0.9550889512283189E+00 -0.9527495551361136E+00 -0.9504055747930490E+00 -0.9480570100085778E+00 -0.9457038589139001E+00 -0.9433461180537021E+00 -0.9409837824755957E+00 -0.9386168458172143E+00 -0.9362453003910622E+00 -0.9338691372671331E+00 -0.9314883463533257E+00 -0.9291029164737088E+00 -0.9267128354446561E+00 -0.9243180901489110E+00 -0.9219186666075736E+00 -0.9195145500500918E+00 -0.9171057249822572E+00 -0.9146921752522568E+00 -0.9122738841148049E+00 -0.9098508342934115E+00 -0.9074230080407725E+00 -0.9049903871973761E+00 -0.9025529532482975E+00 -0.9001106873782734E+00 -0.8976635705250287E+00 -0.8952115834309455E+00 -0.8927547066930527E+00 -0.8902929208114043E+00 -0.8878262062358644E+00 -0.8853545434113288E+00 -0.8828779128213984E+00 -0.8803962950305826E+00 -0.8779096707249944E+00 -0.8754180207516187E+00 -0.8729213261561652E+00 -0.8704195682195257E+00 -0.8679127284928716E+00 -0.8654007888314326E+00 -0.8628837314269541E+00 -0.8603615388388851E+00 -0.8578341940243193E+00 -0.8553016803666958E+00 -0.8527639817033201E+00 -0.8502210823517030E+00 -0.8476729671347476E+00 -0.8451196214048268E+00 -0.8425610310667432E+00 -0.8399971825996356E+00 -0.8374280630778245E+00 -0.8348536601906327E+00 -0.8322739622612096E+00 -0.8296889582643635E+00 -0.8270986378434532E+00 -0.8245029913263251E+00 -0.8219020097403632E+00 -0.8192956848266297E+00 -0.8166840090531358E+00 -0.8140669756272810E+00 -0.8114445785074459E+00 -0.8088168124137882E+00 -0.8061836728382580E+00 -0.8035451560538301E+00 -0.8009012591230101E+00 -0.7982519799055862E+00 -0.7955973170657049E+00 -0.7929372700782288E+00 -0.7902718392344300E+00 -0.7876010256470514E+00 -0.7849248312546936E+00 -0.7822432588256222E+00 -0.7795563119609465E+00 -0.7768639950972300E+00 -0.7741663135085275E+00 -0.7714632733078751E+00 -0.7687548814482437E+00 -0.7660411457229735E+00 -0.7633220747657076E+00 -0.7605976780498430E+00 -0.7578679658874885E+00 -0.7551329494280029E+00 -0.7523926406560499E+00 -0.7496470523892526E+00 -0.7468961982754271E+00 -0.7441400927894049E+00 -0.7413787512294852E+00 -0.7386121897135014E+00 -0.7358404251745365E+00 -0.7330634753562915E+00 -0.7302813588081042E+00 -0.7274940948796763E+00 -0.7247017037154513E+00 -0.7219042062487405E+00 -0.7191016241955283E+00 -0.7162939800480140E+00 -0.7134812970679073E+00 -0.7106635992794407E+00 -0.7078409114621805E+00 -0.7050132591435788E+00 -0.7021806685913191E+00 -0.6993431668054603E+00 -0.6965007815103690E+00 -0.6936535411464760E+00 -0.6908014748618515E+00 -0.6879446125036175E+00 -0.6850829846091927E+00 -0.6822166223973989E+00 -0.6793455577594238E+00 -0.6764698232496565E+00 -0.6735894520763950E+00 -0.6707044780924551E+00 -0.6678149357856630E+00 -0.6649208602692607E+00 -0.6620222872722230E+00 -0.6591192531294906E+00 -0.6562117947721472E+00 -0.6532999497175199E+00 -0.6503837560592365E+00 -0.6474632524572266E+00 -0.6445384781276909E+00 -0.6416094728330407E+00 -0.6386762768718036E+00 -0.6357389310685252E+00 -0.6327974767636543E+00 -0.6298519558034233E+00 -0.6269024105297427E+00 -0.6239488837700962E+00 -0.6209914188274636E+00 -0.6180300594702640E+00 -0.6150648499223307E+00 -0.6120958348529247E+00 -0.6091230593667976E+00 -0.6061465689942978E+00 -0.6031664096815428E+00 -0.6001826277806448E+00 -0.5971952700400222E+00 -0.5942043835947710E+00 -0.5912100159571299E+00 -0.5882122150070307E+00 -0.5852110289827398E+00 -0.5822065064716095E+00 -0.5791986964009260E+00 -0.5761876480288783E+00 -0.5731734109356420E+00 -0.5701560350145878E+00 -0.5671355704636246E+00 -0.5641120677766707E+00 -0.5610855777352810E+00 -0.5580561514004118E+00 -0.5550238401043444E+00 -0.5519886954427705E+00 -0.5489507692670410E+00 -0.5459101136765916E+00 -0.5428667810115466E+00 -0.5398208238455037E+00 -0.5367722949785179E+00 -0.5337212474302724E+00 -0.5306677344334658E+00 -0.5276118094273992E+00 -0.5245535260517865E+00 -0.5214929381407842E+00 -0.5184300997172553E+00 -0.5153650649872665E+00 -0.5122978883348268E+00 -0.5092286243168869E+00 -0.5061573276585855E+00 -0.5030840532487656E+00 -0.5000088561357634E+00 -0.4969317915234724E+00 -0.4938529147677048E+00 -0.4907722813728380E+00 -0.4876899469887706E+00 -0.4846059674081886E+00 -0.4815203985641517E+00 -0.4784332965280080E+00 -0.4753447175076490E+00 -0.4722547178461055E+00 -0.4691633540205086E+00 -0.4660706826414067E+00 -0.4629767604524667E+00 -0.4598816443305548E+00 -0.4567853912862148E+00 -0.4536880584645588E+00 -0.4505897031465675E+00 -0.4474903827508280E+00 -0.4443901548357052E+00 -0.4412890771019746E+00 -0.4381872073959169E+00 -0.4350846037128897E+00 -0.4319813242013982E+00 -0.4288774271676646E+00 -0.4257729710807258E+00 -0.4226680145780600E+00 -0.4195626164717658E+00 -0.4164568357553127E+00 -0.4133507316108669E+00 -0.4102443634172216E+00 -0.4071377907583458E+00 -0.4040310734325635E+00 -0.4009242714623935E+00 -0.3978174451050561E+00 -0.3947106548636826E+00 -0.3916039614992301E+00 -0.3884974260431417E+00 -0.3853911098107584E+00 -0.3822850744155176E+00 -0.3791793817839579E+00 -0.3760740941715547E+00 -0.3729692741794092E+00 -0.3698649847718308E+00 -0.3667612892948207E+00 -0.3636582514955066E+00 -0.3605559355425407E+00 -0.3574544060475049E+00 -0.3543537280873476E+00 -0.3512539672278892E+00 -0.3481551895484317E+00 -0.3450574616675028E+00 -0.3419608507697824E+00 -0.3388654246342396E+00 -0.3357712516635236E+00 -0.3326784009146562E+00 -0.3295869421310594E+00 -0.3264969457759724E+00 -0.3234084830672975E+00 -0.3203216260139267E+00 -0.3172364474535990E+00 -0.3141530210923392E+00 -0.3110714215455339E+00 -0.3079917243806994E+00 -0.3049140061619978E+00 -0.3018383444965689E+00 -0.2987648180827280E+00 -0.2956935067601084E+00 -0.2926244915618033E+00 -0.2895578547685831E+00 -0.2864936799652645E+00 -0.2834320520992921E+00 -0.2803730575416270E+00 -0.2773167841500085E+00 -0.2742633213346799E+00 -0.2712127601266646E+00 -0.2681651932486745E+00 -0.2651207151887529E+00 -0.2620794222767396E+00 -0.2590414127636577E+00 -0.2560067869041315E+00 -0.2529756470419290E+00 -0.2499480976987507E+00 -0.2469242456663659E+00 -0.2439042001022238E+00 -0.2408880726286486E+00 -0.2378759774357503E+00 -0.2348680313881797E+00 -0.2318643541358485E+00 -0.2288650682287657E+00 -0.2258702992361172E+00 -0.2228801758697354E+00 -0.2198948301121145E+00 -0.2169143973491063E+00 -0.2139390165074705E+00 -0.2109688301974238E+00 -0.2080039848603569E+00 -0.2050446309218908E+00 -0.2020909229504274E+00 -0.1991430198213881E+00 -0.1962010848872974E+00 -0.1932652861539021E+00 -0.1903357964625070E+00 -0.1874127936787024E+00 -0.1844964608876812E+00 -0.1815869865963202E+00 -0.1786845649422172E+00 -0.1757893959098759E+00 -0.1729016855542115E+00 -0.1700216462315742E+00 -0.1671494968384586E+00 -0.1642854630580883E+00 -0.1614297776150348E+00 -0.1585826805380398E+00 -0.1557444194312012E+00 -0.1529152497536538E+00 -0.1500954351078926E+00 -0.1472852475368416E+00 -0.1444849678297712E+00 -0.1416948858371486E+00 -0.1389153007944590E+00 -0.1361465216550372E+00 -0.1333888674318927E+00 -0.1306426675484822E+00 -0.1279082621983536E+00 -0.1251860027135053E+00 -0.1224762519412908E+00 -0.1197793846295987E+00 -0.1170957878199916E+00 -0.1144258612484021E+00 -0.1117700177528869E+00 -0.1091286836878541E+00 -0.1065022993440523E+00 -0.1038913193734918E+00 -0.1012962132183315E+00 -0.9871746554259221E-01 -0.9615557666540349E-01 -0.9361106299427452E-01 -0.9108445745667579E-01 -0.8857630992797585E-01 -0.8608718765349675E-01 -0.8361767566217436E-01 -0.8116837716895883E-01 -0.7873991396273913E-01 -0.7633292677617219E-01 -0.7394807563333809E-01 -0.7158604017067217E-01 -0.6924751992606029E-01 -0.6693323459041152E-01 -0.6464392421534722E-01 -0.6238034936994107E-01 -0.6014329123865809E-01 -0.5793355165176966E-01 -0.5575195303860343E-01 -0.5359933829294623E-01 -0.5147657053882339E-01 -0.4938453278367397E-01 -0.4732412744463571E-01 -0.4529627573227194E-01 -0.4330191687455879E-01 -0.4134200716236433E-01 -0.3941751879595017E-01 -0.3752943851022626E-01 -0.3567876595462575E-01 -0.3386651180149903E-01 -0.3209369555493235E-01 -0.3036134302986153E-01 -0.2867048346931652E-01 -0.2702214626567594E-01 -0.2541735724993743E-01 -0.2385713451135265E-01 -0.2234248370839688E-01 -0.2087439283106441E-01 -0.1945382637408551E-01 -0.1808171888098112E-01 -0.1675896782019106E-01 -0.1548642575704695E-01 -0.1426489178948888E-01 -0.1309510222150092E-01 -0.1197772045673314E-01 -0.1091332610623831E-01 -0.9902403319266216E-02 -0.8945328365362132E-02 -0.8042356520369600E-02 -0.7193608339198911E-02 -0.6399055435312237E-02 -0.5658505931682774E-02 -0.4971589801402351E-02 -0.4337744378844948E-02 -0.3756200394787513E-02 -0.3225968971126078E-02 -0.2745830102014657E-02 -0.2314323246553361E-02 -0.1929740760130854E-02 -0.1590124991640147E-02 -0.1293269963677403E-02 -0.1036728620523732E-02 -0.8178266578560640E-03 -0.6336839173092652E-03 -0.4812442114554411E-03 -0.3573142088885663E-03 -0.2586116204308245E-03 -0.1818223529741868E-03 -0.1236655132753167E-03 -0.8096414791917507E-04 -0.5071843506793948E-04 -0.3017679859046307E-04 -0.1689928305171012E-04 -0.8806800438416483E-05 -0.4209924174242123E-05 -0.1812186230608453E-05 -0.6856430207874943E-06 -0.2207762234777510E-06 -0.5789808120346374E-07 -0.1162764438867681E-07 -0.1636092194626611E-08 -0.1411469196261160E-09 -0.6053864648970130E-11 -0.9102103938482552E-13 -0.2557695550579744E-15 -0.3818161159862620E-19 -0.1608640056516381E-25 -0.2867908542943528E-38 -0.1639405452192707E-76 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.1490972894185426E+01 0.2898594369705328E+01 0.4226102647398204E+01 0.5476628578286624E+01 0.6653199649346901E+01 0.7758744314426550E+01 0.8796096630727330E+01 0.9768001136837229E+01 0.1067711788189623E+02 0.1152602750277483E+02 0.1231723624359168E+02 0.1305318081663842E+02 0.1373623301352756E+02 0.1436870398832137E+02 0.1495284814912227E+02 0.1549086661002188E+02 0.1598491017060163E+02 0.1643708180475745E+02 0.1684943865406904E+02 0.1722399353297733E+02 0.1756271596351480E+02 0.1786753276618034E+02 0.1814032824076472E+02 0.1838294397656276E+02 0.1859717833554092E+02 0.1878478565478038E+02 0.1894747521601122E+02 0.1908691003043678E+02 0.1920470548645839E+02 0.1930242790649218E+02 0.1938159305696006E+02 0.1944366465286470E+02 0.1949005289524725E+02 0.1952211307638757E+02 0.1954114428394226E+02 0.1954838823141548E+02 0.1954502823850324E+02 0.1953218838101044E+02 0.1951093282627426E+02 0.1948226536638306E+02 0.1944712915800228E+02 0.1940640667433629E+02 0.1936091987169615E+02 0.1931143057032402E+02 0.1925864104655939E+02 0.1920319483112569E+02 0.1914567770627270E+02 0.1908661889272693E+02 0.1902649241587448E+02 0.1896571863932183E+02 0.1890466595293786E+02 0.1884365260166379E+02 0.1878294864077429E+02 0.1872277800286541E+02 0.1866332066162236E+02 0.1860471487736171E+02 0.1854705950943718E+02 0.1849041638082738E+02 0.1843481268057272E+02 0.1838024339018270E+02 0.1832667372067947E+02 0.1827404154756324E+02 0.1822225983166999E+02 0.1817121901462569E+02 0.1812078937837576E+02 0.1807082335907063E+02 0.1802115780640943E+02 0.1797161618037463E+02 0.1792201067812283E+02 0.1787214428462332E+02 0.1782181274145043E+02 0.1777080642893208E+02 0.1771891215763021E+02 0.1766591486587512E+02 0.1761159922079143E+02 0.1755575112093501E+02 0.1749815909930632E+02 0.1743861562611338E+02 0.1737691831122648E+02 0.1731287100679569E+02 0.1724628481099027E+02 0.1717697897426687E+02 0.1710478170998087E+02 0.1702953091152244E+02 0.1695107477848783E+02 0.1686927235468663E+02 0.1678399398103932E+02 0.1669512166663813E+02 0.1660254938142798E+02 0.1650618327411663E+02 0.1640594181904419E+02 0.1630175589583457E+02 0.1619356880571659E+02 0.1608133622844232E+02 0.1596502612374653E+02 0.1584461858128563E+02 0.1572010562296940E+02 0.1559149096155470E+02 0.1545878971931102E+02 0.1532202811049239E+02 0.1518124309126241E+02 0.1503648198061937E+02 0.1488780205575875E+02 0.1473527012519185E+02 0.1457896208281294E+02 0.1441896244597594E+02 0.1425536388050388E+02 0.1408826671541400E+02 0.1391777844999757E+02 0.1374401325574798E+02 0.1356709147548415E+02 0.1338713912187045E+02 0.1320428737738750E+02 0.1301867209766444E+02 0.1283043331994052E+02 0.1263971477828357E+02 0.1244666342705594E+02 0.1225142897398476E+02 0.1205416342406364E+02 0.1185502063538666E+02 0.1165415588789458E+02 0.1145172546589620E+02 0.1124788625511554E+02 0.1104279535490879E+02 0.1083660970619294E+02 0.1062948573553064E+02 0.1042157901572463E+02 0.1021304394318828E+02 0.1000403343227721E+02 0.9794698626690922E+01 0.9585188627981971E+01 0.9375650241143855E+01 0.9166227737187679E+01 0.8957062632560726E+01 0.8748293485208164E+01 0.8540055707031815E+01 0.8332481392456542E+01 0.8125699162775922E+01 0.7919834025914198E+01 0.7715007251210231E+01 0.7511336258802102E+01 0.7308934523167021E+01 0.7107911490350968E+01 0.6908372508405361E+01 0.6710418770533413E+01 0.6514147270438017E+01 0.6319650769353934E+01 0.6127017774240882E+01 0.5936332526610492E+01 0.5747675001458052E+01 0.5561120915770464E+01 0.5376741746084129E+01 0.5194604754569927E+01 0.5014773023128366E+01 0.4837305494984530E+01 0.4662257023280675E+01 0.4489678426173787E+01 0.4319616547955467E+01 0.4152114325723103E+01 0.3987210861143229E+01 0.3824941496860732E+01 0.3665337897121076E+01 0.3508428132186630E+01 0.3354236766142388E+01 0.3202784947701370E+01 0.3054090503634531E+01 0.2908168034465503E+01 0.2765029012085665E+01 0.2624681878960210E+01 0.2487132148611466E+01 0.2352382507080828E+01 0.2220432915085888E+01 0.2091280710604522E+01 0.1964920711632258E+01 0.1841345318874233E+01 0.1720544618147173E+01 0.1602506482281042E+01 0.1487216672323735E+01 0.1374658937865809E+01 0.1264815116314972E+01 0.1157665230963353E+01 0.1053187587702279E+01 0.9513588702517990E+00 0.8521542337834218E+00 0.7555473968256491E+00 0.6615107313528323E+00 0.5700153509680036E+00 0.4810311971000716E+00 0.3945271231455855E+00 0.3104709764939235E+00 0.2288296783834506E+00 0.1495693015446019E+00 0.7265514559315535E-01 -0.1948189855172862E-02 -0.7427673437111640E-01 -0.1443670782148313E+00 -0.2122563061647371E+00 -0.2779819336760306E+00 -0.3415818453668393E+00 -0.4030942358252462E+00 -0.4625575527254874E+00 -0.5200104422372566E+00 -0.5754916967079484E+00 -0.6290402045940768E+00 -0.6806949026143181E+00 -0.7304947300937417E+00 -0.7784785854658435E+00 -0.8246852848961586E+00 -0.8691535229891830E+00 -0.9119218355379459E+00 -0.9530285642737767E+00 -0.9925118235722190E+00 -0.1030409469069388E+01 -0.1066759068142054E+01 -0.1101597872203433E+01 -0.1134962790765932E+01 -0.1166890367221378E+01 -0.1197416756288568E+01 -0.1226577703077706E+01 -0.1254408523721037E+01 -0.1280944087518682E+01 -0.1306218800548890E+01 -0.1330266590691901E+01 -0.1353120894016819E+01 -0.1374814642481296E+01 -0.1395380252894130E+01 -0.1414849617091440E+01 -0.1433254093277628E+01 -0.1450624498482941E+01 -0.1466991102090209E+01 -0.1482383620384031E+01 -0.1496831212076521E+01 -0.1510362474764622E+01 -0.1523005442274803E+01 -0.1534787582851975E+01 -0.1545735798150416E+01 -0.1555876422985430E+01 -0.1565235225805577E+01 -0.1573837409846275E+01 -0.1581707614926664E+01 -0.1588869919852685E+01 -0.1595347845390397E+01 -0.1601164357774630E+01 -0.1606341872719178E+01 -0.1610902259895794E+01 -0.1614866847850344E+01 -0.1618256429325549E+01 -0.1621091266960840E+01 -0.1623391099340840E+01 -0.1625175147365167E+01 -0.1626462120913114E+01 -0.1627270225777996E+01 -0.1627617170846768E+01 -0.1627520175501631E+01 -0.1626995977221341E+01 -0.1626060839360731E+01 -0.1624730559088164E+01 -0.1623020475461238E+01 -0.1620945477622288E+01 -0.1618520013095815E+01 -0.1615758096171077E+01 -0.1612673316353719E+01 -0.1609278846871282E+01 -0.1605587453218097E+01 -0.1601611501725963E+01 -0.1597362968147642E+01 -0.1592853446240992E+01 -0.1588094156342277E+01 -0.1583095953917781E+01 -0.1577869338083636E+01 -0.1572424460084281E+01 -0.1566771131720695E+01 -0.1560918833720039E+01 -0.1554876724038992E+01 -0.1548653646093535E+01 -0.1542258136908566E+01 -0.1535698435181091E+01 -0.1528982489251385E+01 -0.1522117964976844E+01 -0.1515112253503763E+01 -0.1507972478932725E+01 -0.1500705505873594E+01 -0.1493317946886631E+01 -0.1485816169806484E+01 -0.1478206304946291E+01 -0.1470494252179348E+01 -0.1462685687896228E+01 -0.1454786071835450E+01 -0.1446800653786156E+01 -0.1438734480161472E+01 -0.1430592400441542E+01 -0.1422379073485444E+01 -0.1414098973711402E+01 -0.1405756397145003E+01 -0.1397355467335255E+01 -0.1388900141138563E+01 -0.1380394214370867E+01 -0.1371841327328378E+01 -0.1363244970177461E+01 -0.1354608488214437E+01 -0.1345935086996126E+01 -0.1337227837342175E+01 -0.1328489680210275E+01 -0.1319723431445484E+01 -0.1310931786405037E+01 -0.1302117324460026E+01 -0.1293282513375510E+01 -0.1284429713570631E+01 -0.1275561182260429E+01 -0.1266679077481073E+01 -0.1257785462000340E+01 -0.1248882307115163E+01 -0.1239971496338172E+01 -0.1231054828975166E+01 -0.1222134023595495E+01 -0.1213210721397372E+01 -0.1204286489470143E+01 -0.1195362823955608E+01 -0.1186441153110434E+01 -0.1177522840271803E+01 -0.1168609186728368E+01 -0.1159701434498662E+01 -0.1150800769019061E+01 -0.1141908321743441E+01 -0.1133025172656630E+01 -0.1124152352703810E+01 -0.1115290846137928E+01 -0.1106441592787264E+01 -0.1097605490245227E+01 -0.1088783395984451E+01 -0.1079976129397275E+01 -0.1071184473764625E+01 -0.1062409178155359E+01 -0.1053650959258049E+01 -0.1044910503147221E+01 -0.1036188466985990E+01 -0.1027485480667053E+01 -0.1018802148393944E+01 -0.1010139050204464E+01 -0.1001496743438119E+01 -0.9928757641494527E+00 -0.9842766284690484E+00 -0.9756998339140143E+00 -0.9671458606496940E+00 -0.9586151727043447E+00 -0.9501082191384856E+00 -0.9416254351705762E+00 -0.9331672432606939E+00 -0.9247340541538072E+00 -0.9163262678842421E+00 -0.9079442747428956E+00 -0.8995884562087340E+00 -0.8912591858460664E+00 -0.8829568301690750E+00 -0.8746817494750385E+00 -0.8664342986476723E+00 -0.8582148279319598E+00 -0.8500236836818522E+00 -0.8418612090821510E+00 -0.8337277448458742E+00 -0.8256236298884094E+00 -0.8175492019796625E+00 -0.8095047983754566E+00 -0.8014907564293513E+00 -0.7935074141860654E+00 -0.7855551109576326E+00 -0.7776341878834073E+00 -0.7697449884750045E+00 -0.7618878591472366E+00 -0.7540631497360738E+00 -0.7462712140046344E+00 -0.7385124101381848E+00 -0.7307871012290940E+00 -0.7230956557526664E+00 -0.7154384480347357E+00 -0.7078158587119011E+00 -0.7002282751852088E+00 -0.6926760920681024E+00 -0.6851597116293913E+00 -0.6776795442319780E+00 -0.6702360087680368E+00 -0.6628295330912921E+00 -0.6554605544470310E+00 -0.6481295199004043E+00 -0.6408368867635551E+00 -0.6335831230220497E+00 -0.6263687077610380E+00 -0.6191941315915128E+00 -0.6120598970769715E+00 -0.6049665191607240E+00 -0.5979145255940220E+00 -0.5909044573650831E+00 -0.5839368691290320E+00 -0.5770123296386506E+00 -0.5701314221757601E+00 -0.5632947449829158E+00 -0.5565029116949882E+00 -0.5497565517700718E+00 -0.5430563109189926E+00 -0.5364028515325477E+00 -0.5297968531054059E+00 -0.5232390126554224E+00 -0.5167300451368810E+00 -0.5102706838459522E+00 -0.5038616808163805E+00 -0.4975038072031411E+00 -0.4911978536514589E+00 -0.4849446306482554E+00 -0.4787449688526985E+00 -0.4725997194020929E+00 -0.4665097541888966E+00 -0.4604759661041344E+00 -0.4544992692419215E+00 -0.4485805990591846E+00 -0.4427209124840173E+00 -0.4369211879653461E+00 -0.4311824254558134E+00 -0.4255056463188713E+00 -0.4198918931501576E+00 -0.4143422295021775E+00 -0.4088577395001772E+00 -0.4034395273358983E+00 -0.3980887166245596E+00 -0.3928064496090112E+00 -0.3875938861934557E+00 -0.3824522027875051E+00 -0.3773825909395854E+00 -0.3723862557368422E+00 -0.3674644139467203E+00 -0.3626182918733373E+00 -0.3578491228995945E+00 -0.3531581446837392E+00 -0.3485465959768078E+00 -0.3440157130250673E+00 -0.3395667255192788E+00 -0.3352008520504021E+00 -0.3309192950292724E+00 -0.3267232350259450E+00 -0.3226138244828918E+00 -0.3185921807551977E+00 -0.3146593784305226E+00 -0.3108164408820478E+00 -0.3070643310091922E+00 -0.3034039411238457E+00 -0.2998360819446073E+00 -0.2963614706684425E+00 -0.2929807180988327E+00 -0.2896943148224383E+00 -0.2865026164432708E+00 -0.2834058279051005E+00 -0.2804039869602682E+00 -0.2774969468771566E+00 -0.2746843585203667E+00 -0.2719656519882723E+00 -0.2693400180531267E+00 -0.2668063897203013E+00 -0.2643634243062732E+00 -0.2620094865300300E+00 -0.2597426332192892E+00 -0.2575606003500299E+00 -0.2554607932624695E+00 -0.2534402810239623E+00 -0.2514957960316366E+00 -0.2496237400535760E+00 -0.2478201979810306E+00 -0.2460809605838598E+00 -0.2444015574991944E+00 -0.2427773015044900E+00 -0.2412033447902379E+00 -0.2396747474109387E+00 -0.2381865573144384E+00 -0.2367339003009647E+00 -0.2353120769446503E+00 -0.2339166619743637E+00 -0.2325435999910598E+00 -0.2311892899420583E+00 -0.2298506498591054E+00 -0.2285251535007102E+00 -0.2272108322697357E+00 -0.2259062395150722E+00 -0.2246103800296458E+00 -0.2233226143482858E+00 -0.2220425533758296E+00 -0.2207699612307818E+00 -0.2195046807982463E+00 -0.2182465877415019E+00 -0.2169955687347858E+00 -0.2157515141286527E+00 -0.2145143163564465E+00 -0.2132838697320672E+00 -0.2120600704271507E+00 -0.2108428164580473E+00 -0.2096320076725845E+00 -0.2084275457364440E+00 -0.2072293341191706E+00 -0.2060372780798283E+00 -0.2048512846523208E+00 -0.2036712626303956E+00 -0.2024971225523388E+00 -0.2013287766853885E+00 -0.2001661390098699E+00 -0.1990091252030775E+00 -0.1978576526229085E+00 -0.1967116402912710E+00 -0.1955710088772761E+00 -0.1944356806802258E+00 -0.1933055796124141E+00 -0.1921806311817510E+00 -0.1910607624742264E+00 -0.1899459021362168E+00 -0.1888359803566597E+00 -0.1877309288490946E+00 -0.1866306808335939E+00 -0.1855351710185818E+00 -0.1844443355825659E+00 -0.1833581121557800E+00 -0.1822764398017569E+00 -0.1811992589988340E+00 -0.1801265116216080E+00 -0.1790581409223451E+00 -0.1779940915123532E+00 -0.1769343093433298E+00 -0.1758787416886912E+00 -0.1748273371248939E+00 -0.1737800455127509E+00 -0.1727368179787582E+00 -0.1716976068964338E+00 -0.1706623658676789E+00 -0.1696310497041661E+00 -0.1686036144087650E+00 -0.1675800171570109E+00 -0.1665602162786198E+00 -0.1655441712390600E+00 -0.1645318426211851E+00 -0.1635231921069348E+00 -0.1625181824591057E+00 -0.1615167775032033E+00 -0.1605189421093761E+00 -0.1595246421744391E+00 -0.1585338446039885E+00 -0.1575465172946173E+00 -0.1565626291162327E+00 -0.1555821498944797E+00 -0.1546050503932762E+00 -0.1536313022974632E+00 -0.1526608781955763E+00 -0.1516937515627348E+00 -0.1507298967436624E+00 -0.1497692889358336E+00 -0.1488119041727559E+00 -0.1478577193073842E+00 -0.1469067119956771E+00 -0.1459588606802934E+00 -0.1450141445744331E+00 -0.1440725436458233E+00 -0.1431340386008554E+00 -0.1421986108688733E+00 -0.1412662425866119E+00 -0.1403369165827954E+00 -0.1394106163628882E+00 -0.1384873260940094E+00 -0.1375670305900030E+00 -0.1366497152966734E+00 -0.1357353662771839E+00 -0.1348239701976193E+00 -0.1339155143127141E+00 -0.1330099864517488E+00 -0.1321073750046149E+00 -0.1312076689080463E+00 -0.1303108576320237E+00 -0.1294169311663473E+00 -0.1285258800073831E+00 -0.1276376951449777E+00 -0.1267523680495491E+00 -0.1258698906593478E+00 -0.1249902553678929E+00 -0.1241134550115789E+00 -0.1232394828574590E+00 -0.1223683325912011E+00 -0.1214999983052166E+00 -0.1206344744869641E+00 -0.1197717560074267E+00 -0.1189118381097634E+00 -0.1180547163981319E+00 -0.1172003868266877E+00 -0.1163488456887531E+00 -0.1155000896061621E+00 -0.1146541155187737E+00 -0.1138109206741603E+00 -0.1129705026174663E+00 -0.1121328591814367E+00 -0.1112979884766172E+00 -0.1104658888817227E+00 -0.1096365590341772E+00 -0.1088099978208190E+00 -0.1079862043687761E+00 -0.1071651780365066E+00 -0.1063469184050076E+00 -0.1055314252691870E+00 -0.1047186986294014E+00 -0.1039087386831581E+00 -0.1031015458169785E+00 -0.1022971205984247E+00 -0.1014954637682864E+00 -0.1006965762329294E+00 -0.9990045905680092E-01 -0.9910711345509600E-01 -0.9831654078657849E-01 -0.9752874254656095E-01 -0.9674372036003734E-01 -0.9596147597497186E-01 -0.9518201125574054E-01 -0.9440532817672517E-01 -0.9363142881605759E-01 -0.9286031534951537E-01 -0.9209199004456679E-01 -0.9132645525456264E-01 -0.9056371341307594E-01 -0.8980376702838780E-01 -0.8904661867811879E-01 -0.8829227100400254E-01 -0.8754072670680409E-01 -0.8679198854137972E-01 -0.8604605931187735E-01 -0.8530294186707681E-01 -0.8456263909586934E-01 -0.8382515392287562E-01 -0.8309048930419941E-01 -0.8235864822331807E-01 -0.8162963368710800E-01 -0.8090344872200475E-01 -0.8018009637029486E-01 -0.7945957968654156E-01 -0.7874190173414135E-01 -0.7802706558201103E-01 -0.7731507430140443E-01 -0.7660593096285831E-01 -0.7589963863326689E-01 -0.7519620037308256E-01 -0.7449561923364434E-01 -0.7379789825463164E-01 -0.7310304046164423E-01 -0.7241104886390530E-01 -0.7172192645209033E-01 -0.7103567619627764E-01 -0.7035230104402376E-01 -0.6967180391855922E-01 -0.6899418771710759E-01 -0.6831945530932572E-01 -0.6764760953586510E-01 -0.6697865320705315E-01 -0.6631258910169627E-01 -0.6564941996600249E-01 -0.6498914851262336E-01 -0.6433177741981720E-01 -0.6367730933073025E-01 -0.6302574685279916E-01 -0.6237709255727147E-01 -0.6173134897884694E-01 -0.6108851861543815E-01 -0.6044860392805121E-01 -0.5981160734078578E-01 -0.5917753124095684E-01 -0.5854637797933600E-01 -0.5791814987051506E-01 -0.5729284919339011E-01 -0.5667047819176833E-01 -0.5605103907509822E-01 -0.5543453401932198E-01 -0.5482096516785345E-01 -0.5421033463268072E-01 -0.5360264449559476E-01 -0.5299789680954505E-01 -0.5239609360012387E-01 -0.5179723686717961E-01 -0.5120132858656160E-01 -0.5060837071199547E-01 -0.5001836517709381E-01 -0.4943131389750106E-01 -0.4884721877317583E-01 -0.4826608169081145E-01 -0.4768790452639723E-01 -0.4711268914792258E-01 -0.4654043741822612E-01 -0.4597115119799098E-01 -0.4540483234889028E-01 -0.4484148273688456E-01 -0.4428110423567344E-01 -0.4372369873030461E-01 -0.4316926812094350E-01 -0.4261781432680625E-01 -0.4206933929025882E-01 -0.4152384498108628E-01 -0.4098133340093556E-01 -0.4044180658793538E-01 -0.3990526662149652E-01 -0.3937171562729746E-01 -0.3884115578245902E-01 -0.3831358932091222E-01 -0.3778901853896358E-01 -0.3726744580106369E-01 -0.3674887354578273E-01 -0.3623330429199824E-01 -0.3572074064530062E-01 -0.3521118530462180E-01 -0.3470464106909250E-01 -0.3420111084513349E-01 -0.3370059765378802E-01 -0.3320310463829990E-01 -0.3270863507194550E-01 -0.3221719236612464E-01 -0.3172878007871772E-01 -0.3124340192271698E-01 -0.3076106177513717E-01 -0.3028176368621473E-01 -0.2980551188890199E-01 -0.2933231080866432E-01 -0.2886216507358872E-01 -0.2839507952481046E-01 -0.2793105922726807E-01 -0.2747010948079293E-01 -0.2701223583154306E-01 -0.2655744408378990E-01 -0.2610574031206566E-01 -0.2565713087368143E-01 -0.2521162242162311E-01 -0.2476922191783597E-01 -0.2432993664690480E-01 -0.2389377423013912E-01 -0.2346074264007272E-01 -0.2303085021538444E-01 -0.2260410567625017E-01 -0.2218051814013276E-01 -0.2176009713801780E-01 -0.2134285263110349E-01 -0.2092879502794953E-01 -0.2051793520209298E-01 -0.2011028451013516E-01 -0.1970585481030489E-01 -0.1930465848150186E-01 -0.1890670844282149E-01 -0.1851201817356444E-01 -0.1812060173372857E-01 -0.1773247378498237E-01 -0.1734764961211651E-01 -0.1696614514496612E-01 -0.1658797698079692E-01 -0.1621316240714285E-01 -0.1584171942508113E-01 -0.1547366677292802E-01 -0.1510902395033159E-01 -0.1474781124273767E-01 -0.1439004974619603E-01 -0.1403576139247217E-01 -0.1368496897442080E-01 -0.1333769617157242E-01 -0.1299396757587675E-01 -0.1265380871753636E-01 -0.1231724609085785E-01 -0.1198430718003442E-01 -0.1165502048476427E-01 -0.1132941554559642E-01 -0.1100752296888000E-01 -0.1068937445118038E-01 -0.1037500280300520E-01 -0.1006444197166726E-01 -0.9757727063089234E-02 -0.9454894362331736E-02 -0.9155981352602857E-02 -0.8861026732477590E-02 -0.8570070431026370E-02 -0.8283153620518910E-02 -0.8000318726330972E-02 -0.7721609433644288E-02 -0.7447070690483597E-02 -0.7176748706588126E-02 -0.6910690947562739E-02 -0.6648946123695469E-02 -0.6391564172768492E-02 -0.6138596236119977E-02 -0.5890094627143023E-02 -0.5646112791328837E-02 -0.5406705256875357E-02 -0.5171927574793084E-02 -0.4941836247340325E-02 -0.4716488643516831E-02 -0.4495942900234213E-02 -0.4280257807663031E-02 -0.4069492677135494E-02 -0.3863707189852578E-02 -0.3662961224513759E-02 -0.3467314661850819E-02 -0.3276827163911870E-02 -0.3091557925807099E-02 -0.2911565397496689E-02 -0.2736906973081798E-02 -0.2567638644951017E-02 -0.2403814620049312E-02 -0.2245486895479086E-02 -0.2092704790623673E-02 -0.1945514433017997E-02 -0.1803958195289058E-02 -0.1668074080673803E-02 -0.1537895054912087E-02 -0.1413448322734187E-02 -0.1294754547748605E-02 -0.1181827015318322E-02 -0.1074670739037643E-02 -0.9732815127318119E-03 -0.8776449115510747E-03 -0.7877352477807324E-03 -0.7035144894988547E-03 -0.6249311532533495E-03 -0.5519191855637202E-03 -0.4843968523409821E-03 -0.4222656603112821E-03 -0.3654093402469373E-03 -0.3136929282422736E-03 -0.2669619883460904E-03 -0.2250420274226155E-03 -0.1877381608793739E-03 -0.1548350954324305E-03 -0.1260975017208530E-03 -0.1012708544007759E-03 -0.8008281908161370E-04 -0.6224526246190971E-04 -0.4745695222159778E-04 -0.3540699419800758E-04 -0.2577902344419184E-04 -0.1825612034243538E-04 -0.1252636105889374E-04 -0.8288832859917125E-05 -0.5259851630896392E-05 -0.3179018438370757E-05 -0.1814657830647114E-05 -0.9681145896094296E-06 -0.4763777092066571E-06 -0.2125847804801365E-06 -0.8416563922630169E-07 -0.2871694661282378E-07 -0.8118483409326055E-08 -0.1800875019886702E-08 -0.2899912795055122E-09 -0.3021521412802248E-10 -0.1705617717949463E-11 -0.3905505511147667E-13 -0.2187979755795985E-15 -0.1136823060733138E-18 -0.6529908184057616E-24 -0.1331494455842040E-33 -0.1332533824576676E-57 -0.3518780789111388E-217 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.2980561953329615E-01 0.5916214233164482E-01 0.8807376775591262E-01 0.1165446070923979E+00 0.1445785896945104E+00 0.1721793127131528E+00 0.1993498372288393E+00 0.2260924395124203E+00 0.2524083296657185E+00 0.2782973516026372E+00 0.3037576786932059E+00 0.3287855187856478E+00 0.3533748410476745E+00 0.3775171353675275E+00 0.4012012131151563E+00 0.4244130560281678E+00 0.4471357179640750E+00 0.4693492823288160E+00 0.4910308762069837E+00 0.5121547406179706E+00 0.5326923549257166E+00 0.5526126122474077E+00 0.5718820417388514E+00 0.5904650728749644E+00 0.6083243362816283E+00 0.6254209952953163E+00 0.6417151022124156E+00 0.6571659731229090E+00 0.6717325752842186E+00 0.6853739211620790E+00 0.6980494635281584E+00 0.7097194863416821E+00 0.7203454865385274E+00 0.7298905422913191E+00 0.7383196637747241E+00 0.7456001229593330E+00 0.7517017594547573E+00 0.7565972599187180E+00 0.7602624090360081E+00 0.7626763105428430E+00 0.7638215772227638E+00 0.7636844892256079E+00 0.7622551204578512E+00 0.7595274331582714E+00 0.7554993411058685E+00 0.7501727422062439E+00 0.7435535214678834E+00 0.7356515256112056E+00 0.7264805107514307E+00 0.7160580647622865E+00 0.7044055060626673E+00 0.6915477606740609E+00 0.6775132194747052E+00 0.6623335776287783E+00 0.6460436581976104E+00 0.6286812219467698E+00 0.6102867653501249E+00 0.5909033087616116E+00 0.5705761766794121E+00 0.5493527719676207E+00 0.5272823458290659E+00 0.5044157652415996E+00 0.4808052794806210E+00 0.4565042872543610E+00 0.4315671058772241E+00 0.4060487438014351E+00 0.3800046777198434E+00 0.3534906353440669E+00 0.3265623848532687E+00 0.2992755319008061E+00 0.2716853249594787E+00 0.2438464696819385E+00 0.2158129528517275E+00 0.1876378764027582E+00 0.1593733018915083E+00 0.1310701057169563E+00 0.1027778452988341E+00 0.7454463634517153E-01 0.4641704126567402E-01 0.1843996871823178E-01 -0.9343415788128404E-02 -0.3689176836917064E-01 -0.6416563450906662E-01 -0.9112750630870141E-01 -0.1177418695188684E+00 -0.1439752406767907E+00 -0.1697961946978080E+00 -0.1951753833029356E+00 -0.2200855446874273E+00 -0.2445015048556650E+00 -0.2684001710639848E+00 -0.2917605178254852E+00 -0.3145635659398817E+00 -0.3367923550171064E+00 -0.3584319099660255E+00 -0.3794692019194473E+00 -0.3998931040638364E+00 -0.4196943428370452E+00 -0.4388654449501550E+00 -0.4574006806803239E+00 -0.4752960038707706E+00 -0.4925489890615999E+00 -0.5091587661615586E+00 -0.5251259530560686E+00 -0.5404525865310800E+00 -0.5551420518758782E+00 -0.5691990115107658E+00 -0.5826293329679667E+00 -0.5954400165361110E+00 -0.6076391228604799E+00 -0.6192357007728714E+00 -0.6302397156066638E+00 -0.6406619782344070E+00 -0.6505140750472834E+00 -0.6598082990779603E+00 -0.6685575824509672E+00 -0.6767754303275997E+00 -0.6844758564958461E+00 -0.6916733207396428E+00 -0.6983826681062417E+00 -0.7046190701754369E+00 -0.7103979684200303E+00 -0.7157350197331149E+00 -0.7206460441846081E+00 -0.7251469750570049E+00 -0.7292538111984742E+00 -0.7329825717202728E+00 -0.7363492530549652E+00 -0.7393697883820587E+00 -0.7420600094185869E+00 -0.7444356105635324E+00 -0.7465121153771925E+00 -0.7483048453692615E+00 -0.7498288910627880E+00 -0.7510990852950691E+00 -0.7521299787110952E+00 -0.7529358174001737E+00 -0.7535305226219949E+00 -0.7539276725644879E+00 -0.7541404860724225E+00 -0.7541818082827765E+00 -0.7540640981003759E+00 -0.7537994174452843E+00 -0.7533994222016963E+00 -0.7528753547968463E+00 -0.7522380383374159E+00 -0.7514978722304342E+00 -0.7506648292152125E+00 -0.7497484537329505E+00 -0.7487578615608312E+00 -0.7477017406379203E+00 -0.7465883530109418E+00 -0.7454255378288276E+00 -0.7442207153161546E+00 -0.7429808916567682E+00 -0.7417126647203566E+00 -0.7404222305663006E+00 -0.7391153906607812E+00 -0.7377975597449168E+00 -0.7364737742936068E+00 -0.7351487015066457E+00 -0.7338266487757376E+00 -0.7325115735730846E+00 -0.7312070937093148E+00 -0.7299164979106890E+00 -0.7286427566676440E+00 -0.7273885333088894E+00 -0.7261561952575059E+00 -0.7249478254275804E+00 -0.7237652337221139E+00 -0.7226099685950527E+00 -0.7214833286424112E+00 -0.7203863741895169E+00 -0.7193199388434760E+00 -0.7182846409819289E+00 -0.7172808951511491E+00 -0.7163089233484455E+00 -0.7153687661656919E+00 -0.7144602937725963E+00 -0.7135832167201219E+00 -0.7127370965461225E+00 -0.7119213561669281E+00 -0.7111352900401826E+00 -0.7103780740857679E+00 -0.7096487753530824E+00 -0.7089463614243792E+00 -0.7082697095451826E+00 -0.7076176154740552E+00 -0.7069888020452744E+00 -0.7063819274390548E+00 -0.7057955931550737E+00 -0.7052283516861344E+00 -0.7046787138897004E+00 -0.7041451560560322E+00 -0.7036261266724787E+00 -0.7031200528842719E+00 -0.7026253466530071E+00 -0.7021404106145906E+00 -0.7016636436391807E+00 -0.7011934460961990E+00 -0.7007282248280853E+00 -0.7002663978369600E+00 -0.6998063986888191E+00 -0.6993466806403545E+00 -0.6988857204938393E+00 -0.6984220221858803E+00 -0.6979541201161606E+00 -0.6974805822225486E+00 -0.6970000128092043E+00 -0.6965110551345379E+00 -0.6960123937660179E+00 -0.6955027567089953E+00 -0.6949809173168499E+00 -0.6944456959898160E+00 -0.6938959616699598E+00 -0.6933306331398015E+00 -0.6927486801321128E+00 -0.6921491242584105E+00 -0.6915310397636959E+00 -0.6908935541148920E+00 -0.6902358484304498E+00 -0.6895571577584888E+00 -0.6888567712107797E+00 -0.6881340319597943E+00 -0.6873883371059062E+00 -0.6866191374217884E+00 -0.6858259369808462E+00 -0.6850082926764688E+00 -0.6841658136386904E+00 -0.6832981605547428E+00 -0.6824050448998029E+00 -0.6814862280841192E+00 -0.6805415205224655E+00 -0.6795707806318362E+00 -0.6785739137629465E+00 -0.6775508710711322E+00 -0.6765016483318922E+00 -0.6754262847062551E+00 -0.6743248614609347E+00 -0.6731975006480673E+00 -0.6720443637491410E+00 -0.6708656502875580E+00 -0.6696615964141065E+00 -0.6684324734694262E+00 -0.6671785865273722E+00 -0.6659002729230488E+00 -0.6645979007690805E+00 -0.6632718674635170E+00 -0.6619225981926605E+00 -0.6605505444318366E+00 -0.6591561824471119E+00 -0.6577400118006743E+00 -0.6563025538625172E+00 -0.6548443503309030E+00 -0.6533659617639238E+00 -0.6518679661243543E+00 -0.6503509573398282E+00 -0.6488155438802812E+00 -0.6472623473544041E+00 -0.6456920011267967E+00 -0.6441051489573446E+00 -0.6425024436642409E+00 -0.6408845458119288E+00 -0.6392521224252083E+00 -0.6376058457305376E+00 -0.6359463919255466E+00 -0.6342744399776308E+00 -0.6325906704524237E+00 -0.6308957643728299E+00 -0.6291904021092484E+00 -0.6274752623015023E+00 -0.6257510208129137E+00 -0.6240183497169164E+00 -0.6222779163164849E+00 -0.6205303821966133E+00 -0.6187764023100156E+00 -0.6170166240961311E+00 -0.6152516866334947E+00 -0.6134822198254523E+00 -0.6117088436191340E+00 -0.6099321672576039E+00 -0.6081527885649929E+00 -0.6063712932644193E+00 -0.6045882543284419E+00 -0.6028042313617739E+00 -0.6010197700159075E+00 -0.5992354014353167E+00 -0.5974516417348416E+00 -0.5956689915078388E+00 -0.5938879353646483E+00 -0.5921089415009345E+00 -0.5903324612953872E+00 -0.5885589289362899E+00 -0.5867887610764325E+00 -0.5850223565158195E+00 -0.5832600959116285E+00 -0.5815023415148403E+00 -0.5797494369329861E+00 -0.5780017069183963E+00 -0.5762594571813876E+00 -0.5745229742277652E+00 -0.5727925252200571E+00 -0.5710683578618634E+00 -0.5693507003047140E+00 -0.5676397610768275E+00 -0.5659357290331757E+00 -0.5642387733262232E+00 -0.5625490433967653E+00 -0.5608666689842511E+00 -0.5591917601560096E+00 -0.5575244073547678E+00 -0.5558646814639211E+00 -0.5542126338899364E+00 -0.5525682966613572E+00 -0.5509316825438423E+00 -0.5493027851706900E+00 -0.5476815791883145E+00 -0.5460680204161578E+00 -0.5444620460205136E+00 -0.5428635747017666E+00 -0.5412725068945640E+00 -0.5396887249804451E+00 -0.5381120935124601E+00 -0.5365424594513395E+00 -0.5349796524127961E+00 -0.5334234849255057E+00 -0.5318737526994184E+00 -0.5303302349039710E+00 -0.5287926944558559E+00 -0.5272608783160018E+00 -0.5257345177954069E+00 -0.5242133288695329E+00 -0.5226970125009548E+00 -0.5211852549699725E+00 -0.5196777282129478E+00 -0.5181740901680973E+00 -0.5166739851285399E+00 -0.5151770441023719E+00 -0.5136828851796083E+00 -0.5121911139058056E+00 -0.5107013236622320E+00 -0.5092130960524547E+00 -0.5077260012952530E+00 -0.5062395986237541E+00 -0.5047534366907523E+00 -0.5032670539801658E+00 -0.5017799792246062E+00 -0.5002917318290815E+00 -0.4988018223008544E+00 -0.4973097526855100E+00 -0.4958150170093096E+00 -0.4943171017279344E+00 -0.4928154861817414E+00 -0.4913096430576898E+00 -0.4897990388581003E+00 -0.4882831343764708E+00 -0.4867613851805592E+00 -0.4852332421030025E+00 -0.4836981517397486E+00 -0.4821555569566233E+00 -0.4806048974043609E+00 -0.4790456100424820E+00 -0.4774771296724106E+00 -0.4758988894802721E+00 -0.4743103215898168E+00 -0.4727108576259886E+00 -0.4710999292896421E+00 -0.4694769689439838E+00 -0.4678414102133217E+00 -0.4661926885947614E+00 -0.4645302420834957E+00 -0.4628535118124025E+00 -0.4611619427066728E+00 -0.4594549841542420E+00 -0.4577320906928324E+00 -0.4559927227144522E+00 -0.4542363471882220E+00 -0.4524624384024584E+00 -0.4506704787269636E+00 -0.4488599593965099E+00 -0.4470303813165587E+00 -0.4451812558922650E+00 -0.4433121058818812E+00 -0.4414224662756842E+00 -0.4395118852016028E+00 -0.4375799248587367E+00 -0.4356261624800019E+00 -0.4336501913251545E+00 -0.4316516217054698E+00 -0.4296300820413793E+00 -0.4275852199543783E+00 -0.4255167033945205E+00 -0.4234242218048398E+00 -0.4213074873240124E+00 -0.4191662360285776E+00 -0.4170002292160105E+00 -0.4148092547299044E+00 -0.4125931283284775E+00 -0.4103516950975684E+00 -0.4080848309091941E+00 -0.4057924439266636E+00 -0.4034744761571206E+00 -0.4011309050522512E+00 -0.3987617451577198E+00 -0.3963670498117089E+00 -0.3939469128927054E+00 -0.3915014706163934E+00 -0.3890309033812195E+00 -0.3865354376618079E+00 -0.3840153479490107E+00 -0.3814709587348666E+00 -0.3789026465402212E+00 -0.3763108419821045E+00 -0.3736960318772730E+00 -0.3710587613774890E+00 -0.3683996361312071E+00 -0.3657193244652975E+00 -0.3630185595792629E+00 -0.3602981417430927E+00 -0.3575589404884341E+00 -0.3548018967810906E+00 -0.3520280251610328E+00 -0.3492384158340347E+00 -0.3464342366967726E+00 -0.3436167352746726E+00 -0.3407872405489845E+00 -0.3379471646464616E+00 -0.3350980043615843E+00 -0.3322413424775305E+00 -0.3293788488479631E+00 -0.3265122811972369E+00 -0.3236434855917447E+00 -0.3207743965298733E+00 -0.3179070365923667E+00 -0.3150435155888747E+00 -0.3121860291300399E+00 -0.3093368565477600E+00 -0.3064983580792707E+00 -0.3036729712235190E+00 -0.3008632061710796E+00 -0.2980716402017605E+00 -0.2953009109372595E+00 -0.2925537083300732E+00 -0.2898327652646850E+00 -0.2871408466433073E+00 -0.2844807368267285E+00 -0.2818552253018305E+00 -0.2792670904519203E+00 -0.2767190813152813E+00 -0.2742138972325089E+00 -0.2717541653057443E+00 -0.2693424156246247E+00 -0.2669810542566010E+00 -0.2646723340554829E+00 -0.2624183234141169E+00 -0.2602208731776114E+00 -0.2580815820450847E+00 -0.2560017609230388E+00 -0.2539823968540338E+00 -0.2520241173314579E+00 -0.2501271560242013E+00 -0.2482913211710008E+00 -0.2465159681564286E+00 -0.2447999780373049E+00 -0.2431417440311489E+00 -0.2415391681797712E+00 -0.2399896705229777E+00 -0.2384902131086874E+00 -0.2370373409624846E+00 -0.2356272416659091E+00 -0.2342558243668445E+00 -0.2329188177912029E+00 -0.2316118850938999E+00 -0.2303307511904072E+00 -0.2290713356663495E+00 -0.2278298817525086E+00 -0.2266030696708936E+00 -0.2253881016292194E+00 -0.2241827467507004E+00 -0.2229853380898954E+00 -0.2217947209120437E+00 -0.2206101607947411E+00 -0.2194312294160579E+00 -0.2182576912681023E+00 -0.2170894123227367E+00 -0.2159263013992442E+00 -0.2147682815470252E+00 -0.2136152801508975E+00 -0.2124672267271450E+00 -0.2113240526296465E+00 -0.2101856910076705E+00 -0.2090520767782083E+00 -0.2079231465985940E+00 -0.2067988388391586E+00 -0.2056790935559256E+00 -0.2045638524633573E+00 -0.2034530589071708E+00 -0.2023466578372234E+00 -0.2012445957804879E+00 -0.2001468208141218E+00 -0.1990532825386412E+00 -0.1979639320512100E+00 -0.1968787219190523E+00 -0.1957976061529950E+00 -0.1947205401811518E+00 -0.1936474808227552E+00 -0.1925783862621419E+00 -0.1915132160229021E+00 -0.1904519309421991E+00 -0.1893944931452612E+00 -0.1883408660200601E+00 -0.1872910141921747E+00 -0.1862449034998491E+00 -0.1852025009692512E+00 -0.1841637747899360E+00 -0.1831286942905153E+00 -0.1820972299145447E+00 -0.1810693531966281E+00 -0.1800450367387435E+00 -0.1790242541867973E+00 -0.1780069802074076E+00 -0.1769931904649212E+00 -0.1759828615986671E+00 -0.1749759712004503E+00 -0.1739724977922888E+00 -0.1729724208043943E+00 -0.1719757205534020E+00 -0.1709823782208502E+00 -0.1699923758319090E+00 -0.1690056962343670E+00 -0.1680223230778698E+00 -0.1670422407934179E+00 -0.1660654345731199E+00 -0.1650918903502081E+00 -0.1641215947793118E+00 -0.1631545352169931E+00 -0.1621906997025439E+00 -0.1612300769390466E+00 -0.1602726562746950E+00 -0.1593184276843816E+00 -0.1583673817515448E+00 -0.1574195096502818E+00 -0.1564748031277238E+00 -0.1555332544866742E+00 -0.1545948565685086E+00 -0.1536596027363397E+00 -0.1527274868584397E+00 -0.1517985032919279E+00 -0.1508726468667154E+00 -0.1499499128697113E+00 -0.1490302970292871E+00 -0.1481137954999969E+00 -0.1472004048475565E+00 -0.1462901220340763E+00 -0.1453829444035485E+00 -0.1444788696675867E+00 -0.1435778958914185E+00 -0.1426800214801243E+00 -0.1417852451651289E+00 -0.1408935659909356E+00 -0.1400049833021089E+00 -0.1391194967304976E+00 -0.1382371061827025E+00 -0.1373578118277804E+00 -0.1364816140851888E+00 -0.1356085136129656E+00 -0.1347385112961426E+00 -0.1338716082353913E+00 -0.1330078057358998E+00 -0.1321471052964751E+00 -0.1312895085988738E+00 -0.1304350174973551E+00 -0.1295836340084561E+00 -0.1287353603009860E+00 -0.1278901986862372E+00 -0.1270481516084132E+00 -0.1262092216352652E+00 -0.1253734114489432E+00 -0.1245407238370528E+00 -0.1237111616839186E+00 -0.1228847279620496E+00 -0.1220614257238084E+00 -0.1212412580932750E+00 -0.1204242282583109E+00 -0.1196103394628140E+00 -0.1187995949991672E+00 -0.1179919982008737E+00 -0.1171875524353817E+00 -0.1163862610970906E+00 -0.1155881276005403E+00 -0.1147931553737807E+00 -0.1140013478519165E+00 -0.1132127084708265E+00 -0.1124272406610577E+00 -0.1116449478418844E+00 -0.1108658334155396E+00 -0.1100899007616072E+00 -0.1093171532315786E+00 -0.1085475941435698E+00 -0.1077812267771939E+00 -0.1070180543685908E+00 -0.1062580801056096E+00 -0.1055013071231401E+00 -0.1047477384985937E+00 -0.1039973772475303E+00 -0.1032502263194267E+00 -0.1025062885935886E+00 -0.1017655668751993E+00 -0.1010280638915064E+00 -0.1002937822881413E+00 -0.9956272462557243E-01 -0.9883489337568613E-01 -0.9811029091849610E-01 -0.9738891953897792E-01 -0.9667078142402649E-01 -0.9595587865953395E-01 -0.9524421322758671E-01 -0.9453578700377881E-01 -0.9383060175463867E-01 -0.9312865913516950E-01 -0.9242996068649882E-01 -0.9173450783363590E-01 -0.9104230188333598E-01 -0.9035334402206746E-01 -0.8966763531408090E-01 -0.8898517669957863E-01 -0.8830596899298146E-01 -0.8763001288129194E-01 -0.8695730892255034E-01 -0.8628785754438455E-01 -0.8562165904264758E-01 -0.8495871358014560E-01 -0.8429902118545067E-01 -0.8364258175179907E-01 -0.8298939503607108E-01 -0.8233946065785329E-01 -0.8169277809857793E-01 -0.8104934670074115E-01 -0.8040916566719632E-01 -0.7977223406052095E-01 -0.7913855080245588E-01 -0.7850811467341570E-01 -0.7788092431206631E-01 -0.7725697821497177E-01 -0.7663627473630474E-01 -0.7601881208762261E-01 -0.7540458833770475E-01 -0.7479360141245189E-01 -0.7418584909484364E-01 -0.7358132902495440E-01 -0.7298003870002605E-01 -0.7238197547459475E-01 -0.7178713656067244E-01 -0.7119551902797848E-01 -0.7060711980422413E-01 -0.7002193567544460E-01 -0.6943996328638005E-01 -0.6886119914090269E-01 -0.6828563960248966E-01 -0.6771328089473920E-01 -0.6714411910192997E-01 -0.6657815016962187E-01 -0.6601536990529702E-01 -0.6545577397903950E-01 -0.6489935792425362E-01 -0.6434611713841799E-01 -0.6379604688387538E-01 -0.6324914228865730E-01 -0.6270539834734140E-01 -0.6216480992194123E-01 -0.6162737174282699E-01 -0.6109307840967654E-01 -0.6056192439245466E-01 -0.6003390403242120E-01 -0.5950901154316545E-01 -0.5898724101166728E-01 -0.5846858639938206E-01 -0.5795304154335106E-01 -0.5744060015733360E-01 -0.5693125583296245E-01 -0.5642500204092020E-01 -0.5592183213213570E-01 -0.5542173933900042E-01 -0.5492471677660394E-01 -0.5443075744398622E-01 -0.5393985422540789E-01 -0.5345199989163673E-01 -0.5296718710124915E-01 -0.5248540840194668E-01 -0.5200665623188704E-01 -0.5153092292102712E-01 -0.5105820069247997E-01 -0.5058848166388249E-01 -0.5012175784877501E-01 -0.4965802115799089E-01 -0.4919726340105649E-01 -0.4873947628759936E-01 -0.4828465142876621E-01 -0.4783278033864765E-01 -0.4738385443571101E-01 -0.4693786504423999E-01 -0.4649480339577959E-01 -0.4605466063058778E-01 -0.4561742779909139E-01 -0.4518309586334694E-01 -0.4475165569850558E-01 -0.4432309809428110E-01 -0.4389741375642146E-01 -0.4347459330818220E-01 -0.4305462729180289E-01 -0.4263750616998431E-01 -0.4222322032736679E-01 -0.4181176007201023E-01 -0.4140311563687321E-01 -0.4099727718129280E-01 -0.4059423479246362E-01 -0.4019397848691562E-01 -0.3979649821199152E-01 -0.3940178384732158E-01 -0.3900982520629698E-01 -0.3862061203754088E-01 -0.3823413402637604E-01 -0.3785038079629078E-01 -0.3746934191040018E-01 -0.3709100687290486E-01 -0.3671536513054492E-01 -0.3634240607405034E-01 -0.3597211903958652E-01 -0.3560449331019496E-01 -0.3523951811722967E-01 -0.3487718264178740E-01 -0.3451747601613299E-01 -0.3416038732511890E-01 -0.3380590560759827E-01 -0.3345401985783308E-01 -0.3310471902689426E-01 -0.3275799202405693E-01 -0.3241382771818768E-01 -0.3207221493912545E-01 -0.3173314247905550E-01 -0.3139659909387535E-01 -0.3106257350455455E-01 -0.3073105439848577E-01 -0.3040203043082867E-01 -0.3007549022584622E-01 -0.2975142237823227E-01 -0.2942981545443215E-01 -0.2911065799395422E-01 -0.2879393851067332E-01 -0.2847964549412637E-01 -0.2816776741079883E-01 -0.2785829270540316E-01 -0.2755120980214808E-01 -0.2724650710599997E-01 -0.2694417300393482E-01 -0.2664419586618161E-01 -0.2634656404745713E-01 -0.2605126588819128E-01 -0.2575828971574435E-01 -0.2546762384561452E-01 -0.2517925658263681E-01 -0.2489317622217316E-01 -0.2460937105129300E-01 -0.2432782934994559E-01 -0.2404853939212278E-01 -0.2377148944701278E-01 -0.2349666778014561E-01 -0.2322406265452879E-01 -0.2295366233177469E-01 -0.2268545507321884E-01 -0.2241942914102913E-01 -0.2215557279930686E-01 -0.2189387431517832E-01 -0.2163432195987824E-01 -0.2137690400982439E-01 -0.2112160874768343E-01 -0.2086842446342893E-01 -0.2061733945539015E-01 -0.2036834203129333E-01 -0.2012142050929418E-01 -0.1987656321900255E-01 -0.1963375850249907E-01 -0.1939299471534369E-01 -0.1915426022757691E-01 -0.1891754342471287E-01 -0.1868283270872514E-01 -0.1845011649902528E-01 -0.1821938323343368E-01 -0.1799062136914412E-01 -0.1776381938368037E-01 -0.1753896577584702E-01 -0.1731604906667307E-01 -0.1709505780034925E-01 -0.1687598054515926E-01 -0.1665880589440464E-01 -0.1644352246732421E-01 -0.1623011891000752E-01 -0.1601858389630291E-01 -0.1580890612872058E-01 -0.1560107433933019E-01 -0.1539507729065434E-01 -0.1519090377655698E-01 -0.1498854262312769E-01 -0.1478798268956219E-01 -0.1458921286903872E-01 -0.1439222208959125E-01 -0.1419699931497929E-01 -0.1400353354555478E-01 -0.1381181381912668E-01 -0.1362182921182277E-01 -0.1343356883894992E-01 -0.1324702185585244E-01 -0.1306217745876907E-01 -0.1287902488568931E-01 -0.1269755341720873E-01 -0.1251775237738444E-01 -0.1233961113459019E-01 -0.1216311910237258E-01 -0.1198826574030775E-01 -0.1181504055485940E-01 -0.1164343310023902E-01 -0.1147343297926770E-01 -0.1130502984424104E-01 -0.1113821339779698E-01 -0.1097297339378707E-01 -0.1080929963815219E-01 -0.1064718198980239E-01 -0.1048661036150212E-01 -0.1032757472076096E-01 -0.1017006509073034E-01 -0.1001407155110739E-01 -0.9859584239045534E-02 -0.9706593350073452E-02 -0.9555089139022180E-02 -0.9405061920961404E-02 -0.9256502072145643E-02 -0.9109400030970487E-02 -0.8963746298940305E-02 -0.8819531441647413E-02 -0.8676746089763751E-02 -0.8535380940045894E-02 -0.8395426756353708E-02 -0.8256874370684052E-02 -0.8119714684219669E-02 -0.7983938668394324E-02 -0.7849537365975339E-02 -0.7716501892163617E-02 -0.7584823435712779E-02 -0.7454493260067761E-02 -0.7325502704523865E-02 -0.7197843185407555E-02 -0.7071506197279220E-02 -0.6946483314159568E-02 -0.6822766190779977E-02 -0.6700346563858386E-02 -0.6579216253401177E-02 -0.6459367164032316E-02 -0.6340791286350805E-02 -0.6223480698317331E-02 -0.6107427566671246E-02 -0.5992624148378852E-02 -0.5879062792113993E-02 -0.5766735939772315E-02 -0.5655636128019704E-02 -0.5545755989876484E-02 -0.5437088256338068E-02 -0.5329625758033137E-02 -0.5223361426920646E-02 -0.5118288298026128E-02 -0.5014399511218785E-02 -0.4911688313029938E-02 -0.4810148058513781E-02 -0.4709772213151562E-02 -0.4610554354799431E-02 -0.4512488175681280E-02 -0.4415567484426667E-02 -0.4319786208154660E-02 -0.4225138394604049E-02 -0.4131618214309937E-02 -0.4039219962827338E-02 -0.3947938063001268E-02 -0.3857767067283620E-02 -0.3768701660096141E-02 -0.3680736660238960E-02 -0.3593867023344052E-02 -0.3508087844372004E-02 -0.3423394360151161E-02 -0.3339781951956864E-02 -0.3257246148128755E-02 -0.3175782626723511E-02 -0.3095387218199560E-02 -0.3016055908130390E-02 -0.2937784839941740E-02 -0.2860570317667780E-02 -0.2784408808720544E-02 -0.2709296946665686E-02 -0.2635231533997301E-02 -0.2562209544902880E-02 -0.2490228128008725E-02 -0.2419284609094953E-02 -0.2349376493767305E-02 -0.2280501470072159E-02 -0.2212657411038820E-02 -0.2145842377131630E-02 -0.2080054618592456E-02 -0.2015292577651429E-02 -0.1951554890581906E-02 -0.1888840389572373E-02 -0.1827148104385303E-02 -0.1766477263769774E-02 -0.1706827296590603E-02 -0.1648197832633426E-02 -0.1590588703040315E-02 -0.1533999940326040E-02 -0.1478431777920006E-02 -0.1423884649172962E-02 -0.1370359185761869E-02 -0.1317856215419179E-02 -0.1266376758905965E-02 -0.1215922026140108E-02 -0.1166493411382406E-02 -0.1118092487374301E-02 -0.1070720998310677E-02 -0.1024380851520841E-02 -0.9790741077189988E-03 -0.9348029696732801E-03 -0.8915697691294780E-03 -0.8493769518112139E-03 -0.8082270603040555E-03 -0.7681227146151712E-03 -0.7290665901840791E-03 -0.6910613931034242E-03 -0.6541098322911179E-03 -0.6182145883382149E-03 -0.5833782787391545E-03 -0.5496034191941447E-03 -0.5168923806574943E-03 -0.4852473417906704E-03 -0.4546702364667819E-03 -0.4251626959634362E-03 -0.3967259854759182E-03 -0.3693609345830440E-03 -0.3430678613055810E-03 -0.3178464894144324E-03 -0.2936958586742664E-03 -0.2706142277521279E-03 -0.2485989695820504E-03 -0.2276464590608424E-03 -0.2077519530613687E-03 -0.1889094628931880E-03 -0.1711116195232660E-03 -0.1543495320979493E-03 -0.1386126405900494E-03 -0.1238885637399120E-03 -0.1101629438755946E-03 -0.9741929069423303E-04 -0.8563882667209854E-04 -0.7480033745236668E-04 -0.6488003134095919E-04 -0.5585141292167375E-04 -0.4768517677466276E-04 -0.4034912832859186E-04 -0.3380813996360609E-04 -0.2802415155542768E-04 -0.2295622562937124E-04 -0.1856066806040990E-04 -0.1479122565136393E-04 -0.1159937173437365E-04 -0.8934689902304919E-05 -0.6745363761688971E-05 -0.4978776837729040E-05 -0.3582221071745688E-05 -0.2503704396851613E-05 -0.1692837474640400E-05 -0.1101766951461853E-05 -0.6861082076102529E-06 -0.4058159914808505E-06 -0.2259190936022548E-06 -0.1170390843846189E-06 -0.5561789832021472E-07 -0.2379962422071496E-07 -0.8951415949547709E-08 -0.2865311296782646E-08 -0.7469799452895257E-09 -0.1491286872225022E-09 -0.2085937681520927E-10 -0.1788909961745903E-11 -0.7627333239967911E-13 -0.1139998169589491E-14 -0.3184439268690364E-17 -0.4725628150249130E-21 -0.1979177475376566E-27 -0.3507608647733454E-40 -0.1993203231761145E-78 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.2092827306407022E+00 0.4057670184399992E+00 0.5898979350532600E+00 0.7621100296525628E+00 0.9228266176030425E+00 0.1072464703931703E+01 0.1211436937704310E+01 0.1340155639290343E+01 0.1459036896649656E+01 0.1568504688229295E+01 0.1668994708900562E+01 0.1760957569185768E+01 0.1844861052822834E+01 0.1921191152910295E+01 0.1990451661396074E+01 0.2053162158653891E+01 0.2109854336461265E+01 0.2161066684867483E+01 0.2207337676111377E+01 0.2249197680806415E+01 0.2287159946209046E+01 0.2321711046373938E+01 0.2353301272500611E+01 0.2382335462875013E+01 0.2409164771274074E+01 0.2434079838629096E+01 0.2457305766029753E+01 0.2478999191665430E+01 0.2499247656714136E+01 0.2518071314420061E+01 0.2535426902944383E+01 0.2551213776615215E+01 0.2565281681669818E+01 0.2577439879309795E+01 0.2587467166041904E+01 0.2595122320937184E+01 0.2600154520609984E+01 0.2602313301685621E+01 0.2601357711533437E+01 0.2597064364112607E+01 0.2589234201573016E+01 0.2577697846846366E+01 0.2562319511937518E+01 0.2542999496459417E+01 0.2519675368173886E+01 0.2492321960446077E+01 0.2460950350463687E+01 0.2425605997739516E+01 0.2386366226474959E+01 0.2343337229915742E+01 0.2296650762147126E+01 0.2246460665073238E+01 0.2192939357621151E+01 0.2136274392226351E+01 0.2076665161774061E+01 0.2014319819428672E+01 0.1949452454898987E+01 0.1882280554098696E+01 0.1813022755076766E+01 0.1741896901539862E+01 0.1669118386164077E+01 0.1594898769003028E+01 0.1519444651395879E+01 0.1442956782587889E+01 0.1365629374518453E+01 0.1287649599638170E+01 0.1209197246937915E+01 0.1130444512385982E+01 0.1051555901479737E+01 0.9726882234608905E+00 0.8939906587816835E+00 0.8156048835327433E+00 0.7376652366657381E+00 0.6602989178988580E+00 0.5836262061335374E+00 0.5077606900028175E+00 0.4328095037959179E+00 0.3588735634485049E+00 0.2860477985519050E+00 0.2144213774203916E+00 0.1440779231718307E+00 0.7509571953458535E-01 0.7547905706075591E-02 -0.5849733992897237E-01 -0.1229766270456308E+00 -0.1858311911485266E+00 -0.2470067412388819E+00 -0.3064533166418045E+00 -0.3641251522021267E+00 -0.4199805510487963E+00 -0.4739817641533713E+00 -0.5260948759595897E+00 -0.5762896954288581E+00 -0.6245396519239588E+00 -0.6708216954350136E+00 -0.7151162007320108E+00 -0.7574068751038985E+00 -0.7976806694123654E+00 -0.8359276922467996E+00 -0.8721411270148933E+00 -0.9063171518391930E+00 -0.9384548621556141E+00 -0.9685561959238236E+00 -0.9966258613642036E+00 -0.1022671267132381E+01 -0.1046702454831763E+01 -0.1068732033749353E+01 -0.1088775117682357E+01 -0.1106849263704848E+01 -0.1122974412708365E+01 -0.1137172831539331E+01 -0.1149469056553965E+01 -0.1159889838419920E+01 -0.1168464088017379E+01 -0.1175222823334259E+01 -0.1180199117315087E+01 -0.1183428046714909E+01 -0.1184946642134393E+01 -0.1184793839575426E+01 -0.1183010434064154E+01 -0.1179639036149073E+01 -0.1174724032402013E+01 -0.1168311551439714E+01 -0.1160449437451607E+01 -0.1151187233775371E+01 -0.1140576179713346E+01 -0.1128669224538139E+01 -0.1115521063495940E+01 -0.1101188201577848E+01 -0.1085729051876920E+01 -0.1069204076448596E+01 -0.1051675978683903E+01 -0.1033209957189757E+01 -0.1013874031892834E+01 -0.9937394533112268E+00 -0.9728812053358954E+00 -0.9513786099635553E+00 -0.9293160385930985E+00 -0.9067837279225540E+00 -0.8838786881577604E+00 -0.8607056760163188E+00 -0.8373781836996756E+00 -0.8140193666454354E+00 -0.7907627971280821E+00 -0.7677528886053459E+00 -0.7451447902474176E+00 -0.7231035087242984E+00 -0.7018019856777432E+00 -0.6814178596116595E+00 -0.6621286890901025E+00 -0.6441055293683786E+00 -0.6275049500959465E+00 -0.6124598554819389E+00 -0.5990697931249144E+00 -0.5873917551816811E+00 -0.5774326999496706E+00 -0.5691450588850681E+00 -0.5624262731985009E+00 -0.5571229156877342E+00 -0.5530392710790523E+00 -0.5499495211576281E+00 -0.5476120912055904E+00 -0.5457844127402661E+00 -0.5442364096307576E+00 -0.5427613802609629E+00 -0.5411835048730576E+00 -0.5393618006932226E+00 -0.5371908460844405E+00 -0.5345989223491749E+00 -0.5315443627327854E+00 -0.5280108835019925E+00 -0.5240025549054657E+00 -0.5195389048925442E+00 -0.5146504785947575E+00 -0.5093750286076997E+00 -0.5037543971983343E+00 -0.4978320732717670E+00 -0.4916513597181557E+00 -0.4852540635555492E+00 -0.4786796148269129E+00 -0.4719645242683226E+00 -0.4651420995758296E+00 -0.4582423523395834E+00 -0.4512920402678477E+00 -0.4443148009770967E+00 -0.4373313437888304E+00 -0.4303596744600146E+00 -0.4234153346275730E+00 -0.4165116431348047E+00 -0.4096599305448206E+00 -0.4028697612557244E+00 -0.3961491399203882E+00 -0.3895047005196642E+00 -0.3829418775915900E+00 -0.3764650599017688E+00 -0.3700777273477470E+00 -0.3637825721974685E+00 -0.3575816059257799E+00 -0.3514762529766660E+00 -0.3454674327743286E+00 -0.3395556312570763E+00 -0.3337409631312600E+00 -0.3280232259503844E+00 -0.3224019470255501E+00 -0.3168764240734279E+00 -0.3114457604107825E+00 -0.3061088954126595E+00 -0.3008646308661068E+00 -0.2957116537733492E+00 -0.2906485560879659E+00 -0.2856738518046101E+00 -0.2807859917668553E+00 -0.2759833765084032E+00 -0.2712643673995287E+00 -0.2666272963328205E+00 -0.2620704741493222E+00 -0.2575921979776381E+00 -0.2531907576339031E+00 -0.2488644412092475E+00 -0.2446115399531009E+00 -0.2404303525450218E+00 -0.2363191888342949E+00 -0.2322763731150775E+00 -0.2283002469950982E+00 -0.2243891719075561E+00 -0.2205415313087940E+00 -0.2167557325982774E+00 -0.2130302087922870E+00 -0.2093634199784029E+00 -0.2057538545741509E+00 -0.2022000304100722E+00 -0.1987004956548198E+00 -0.1952538295976336E+00 -0.1918586433016487E+00 -0.1885135801398642E+00 -0.1852173162242242E+00 -0.1819685607370943E+00 -0.1787660561734181E+00 -0.1756085785009749E+00 -0.1724949372454470E+00 -0.1694239755063514E+00 -0.1663945699093716E+00 -0.1634056305001383E+00 -0.1604561005841044E+00 -0.1575449565168044E+00 -0.1546712074484661E+00 -0.1518338950266697E+00 -0.1490320930604994E+00 -0.1462649071494050E+00 -0.1435314742798000E+00 -0.1408309623922306E+00 -0.1381625699217879E+00 -0.1355255253142844E+00 -0.1329190865205691E+00 -0.1303425404712269E+00 -0.1277952025337876E+00 -0.1252764159544457E+00 -0.1227855512861943E+00 -0.1203220058051661E+00 -0.1178852029168765E+00 -0.1154745915539778E+00 -0.1130896455670350E+00 -0.1107298631097586E+00 -0.1083947660200428E+00 -0.1060838991980789E+00 -0.1037968299827469E+00 -0.1015331475274080E+00 -0.9929246217615594E-01 -0.9707440484152201E-01 -0.9487862638456054E-01 -0.9270479699818115E-01 -0.9055260559454251E-01 -0.8842175919725527E-01 -0.8631198233909854E-01 -0.8422301646589628E-01 -0.8215461934715129E-01 -0.8010656449399124E-01 -0.7807864058492887E-01 -0.7607065089990145E-01 -0.7408241276301041E-01 -0.7211375699433867E-01 -0.7016452737119373E-01 -0.6823458009908026E-01 -0.6632378329267392E-01 -0.6443201646703840E-01 -0.6255917003929234E-01 -0.6070514484090285E-01 -0.5886985164075899E-01 -0.5705321067914502E-01 -0.5525515121271331E-01 -0.5347561107053028E-01 -0.5171453622124416E-01 -0.4997188035140731E-01 -0.4824760445495881E-01 -0.4654167643385925E-01 -0.4485407070984989E-01 -0.4318476784728866E-01 -0.4153375418700541E-01 -0.3990102149109915E-01 -0.3828656659858688E-01 -0.3669039109180319E-01 -0.3511250097343621E-01 -0.3355290635407111E-01 -0.3201162115010978E-01 -0.3048866279191616E-01 -0.2898405194203557E-01 -0.2749781222332479E-01 -0.2602996995682040E-01 -0.2458055390917123E-01 -0.2314959504944821E-01 -0.2173712631514516E-01 -0.2034318238717427E-01 -0.1896779947365720E-01 -0.1761101510230969E-01 -0.1627286792121220E-01 -0.1495339750775495E-01 -0.1365264418554666E-01 -0.1237064884906971E-01 -0.1110745279586314E-01 -0.9863097566016712E-02 -0.8637624788750709E-02 -0.7431076035862909E-02 -0.6243492681816734E-02 -0.5074915770246633E-02 -0.3925385886656976E-02 -0.2794943037087542E-02 -0.1683626532521779E-02 -0.5914748788115108E-03 0.4814743281079707E-03 0.1535184501935395E-02 0.2569620160881108E-02 0.3584747017927284E-02 0.4580532066695804E-02 0.5556943663146154E-02 0.6513951603328201E-02 0.7451527197409622E-02 0.8369643340202203E-02 0.9268274578406274E-02 0.1014739717479459E-01 0.1100698916955656E-01 0.1184703043902031E-01 0.1266750275197406E-01 0.1346838982380348E-01 0.1424967736866517E-01 0.1501135314991321E-01 0.1575340702899826E-01 0.1647583101305540E-01 0.1717861930140175E-01 0.1786176833115984E-01 0.1852527682222726E-01 0.1916914582181181E-01 0.1979337874875210E-01 0.2039798143784515E-01 0.2098296218440263E-01 0.2154833178926046E-01 0.2209410360446425E-01 0.2262029357986047E-01 0.2312692031081800E-01 0.2361400508731372E-01 0.2408157194461195E-01 0.2452964771577501E-01 0.2495826208624157E-01 0.2536744765071304E-01 0.2575723997259286E-01 0.2612767764622501E-01 0.2647880236218226E-01 0.2681065897585869E-01 0.2712329557962571E-01 0.2741676357881194E-01 0.2769111777177585E-01 0.2794641643434182E-01 0.2818272140887457E-01 0.2840009819827491E-01 0.2859861606518020E-01 0.2877834813666253E-01 0.2893937151471862E-01 0.2908176739285332E-01 0.2920562117906286E-01 0.2931102262552834E-01 0.2939806596533533E-01 0.2946685005654058E-01 0.2951747853391014E-01 0.2955005996865805E-01 0.2956470803651828E-01 0.2956154169448472E-01 0.2954068536655733E-01 0.2950226913883336E-01 0.2944642896428323E-01 0.2937330687754944E-01 0.2928305122010533E-01 0.2917581687610584E-01 0.2905176551925757E-01 0.2891106587102654E-01 0.2875389397049235E-01 0.2858043345614350E-01 0.2839087585989199E-01 0.2818542091356523E-01 0.2796427686810767E-01 0.2772766082569555E-01 0.2747579908493241E-01 0.2720892749925168E-01 0.2692729184860401E-01 0.2663114822445014E-01 0.2632076342801500E-01 0.2599641538168244E-01 0.2565839355332355E-01 0.2530699939325154E-01 0.2494254678338238E-01 0.2456536249805061E-01 0.2417578667578270E-01 0.2377417330116236E-01 0.2336089069573457E-01 0.2293632201668000E-01 0.2250086576175244E-01 0.2205493627870053E-01 0.2159896427709156E-01 0.2113339734011533E-01 0.2065870043356471E-01 0.2017535640876495E-01 0.1968386649574995E-01 0.1918475078245607E-01 0.1867854867511944E-01 0.1816581933441314E-01 0.1764714208114318E-01 0.1712311676453094E-01 0.1659436408523645E-01 0.1606152586432164E-01 0.1552526524830300E-01 0.1498626683930028E-01 0.1444523673804386E-01 0.1390290248615655E-01 0.1336001289267242E-01 0.1281733772819916E-01 0.1227566726846887E-01 0.1173581166726628E-01 0.1119860013688112E-01 0.1066487991231793E-01 0.1013551497353980E-01 0.9611384498049214E-02 0.9093381014167966E-02 0.8582408223524964E-02 0.8079378459570645E-02 0.7585209747505587E-02 0.7100822429962137E-02 0.6627135322258290E-02 0.6165061361244632E-02 0.5715502712913672E-02 0.5279345306314358E-02 0.4857452765248114E-02 0.4450659715107746E-02 0.4059764450523725E-02 0.3685520960736674E-02 0.3328630324427772E-02 0.2989731504787848E-02 0.2669391599617415E-02 0.2368095630986141E-02 0.2086235995182996E-02 0.1824101737017772E-02 0.1581867863467087E-02 0.1359584970329603E-02 0.1157169521569523E-02 0.9743951931644752E-03 0.8108857691386213E-03 0.6661101530243749E-03 0.5393801270545922E-03 0.4298515449594449E-03 0.3365296699754433E-03 0.2582793513780087E-03 0.1938406504102719E-03 0.1418503565121643E-03 0.1008695525362177E-03 0.6941697110285677E-04 0.4600732088117413E-04 0.2919305903894978E-04 0.1760728677207078E-04 0.1000464291784026E-04 0.5296427334745831E-05 0.2575932371020878E-05 0.1130373835070578E-05 0.4371389867137730E-06 0.1443839527546615E-06 0.3903079296907923E-07 0.8136509367815676E-08 0.1200603994451306E-08 0.1103313091144371E-09 0.5169033352084336E-11 0.8862989414281884E-13 0.3078210235071099E-15 0.6727297563933329E-19 0.6350331239490211E-25 0.1073811882539351E-36 0.6326995303161769E-70 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 0.0000000000000000E+00 ================================================ FILE: samples/Formatted/long_seq.for ================================================ ACCEPTABLE LEFT PRIMERS 1-based # self self hair- qual- # sequence start ln N GC% Tm any_th end_th pin lity 0 tgctagctaggcgatgctag 411 20 0 55.00 60.028 23.16 23.16 38.59 0.028 1 actgatacgcgatgctagct 476 20 0 50.00 59.957 17.69 1.35 0.00 0.043 2 gatcgatgctagctaggcga 405 20 0 55.00 60.100 16.30 16.30 0.00 0.100 3 tcgatcgatgctagctaggc 403 20 0 55.00 60.100 18.63 8.45 0.00 0.100 4 tagctgatcgatcgtagcgg 565 20 0 55.00 60.101 25.02 17.36 0.00 0.101 5 gctgactgatcgatcgatgc 113 20 0 55.00 59.826 24.08 17.09 35.21 0.174 6 tatcatctctgcgcgatcga 361 20 0 50.00 59.747 22.07 1.72 38.48 0.253 7 agctaggcgatgctagctag 415 20 0 55.00 59.742 17.46 17.46 41.54 0.258 8 ctagctaggcgatgctagct 413 20 0 55.00 59.742 18.68 17.35 43.53 0.258 9 ggcgatctagctagctgact 583 20 0 55.00 59.671 17.44 7.44 37.58 0.329 10 tcgatgctagctaggcgatg 407 20 0 55.00 60.382 14.03 0.00 0.00 0.382 11 gctgatcgatcgatgctagc 398 20 0 55.00 59.618 25.97 24.79 35.21 0.382 12 gctagctgatcgatcgatgc 394 20 0 55.00 59.618 24.08 21.09 35.21 0.382 13 atcatctctgcgcgatcgat 362 20 0 50.00 60.382 22.07 5.02 38.48 0.382 14 gactgatacgcgatgctagc 475 20 0 55.00 59.551 8.61 8.61 0.00 0.449 15 atcgatgctagctaggcgat 406 20 0 50.00 59.452 18.43 18.43 0.00 0.548 16 gctagctgactgatacgcga 468 20 0 55.00 60.589 16.29 0.00 0.00 0.589 17 agctagctgactgatacgcg 467 20 0 55.00 60.590 17.99 3.89 0.00 0.590 18 atgctagctaggcgatgcta 410 20 0 50.00 59.375 10.59 8.91 0.00 0.625 19 ctatcatctctgcgcgatcg 360 20 0 55.00 59.347 12.19 12.19 39.07 0.653 20 gatgctagctaggcgatgct 409 20 0 55.00 60.668 7.01 7.53 0.00 0.668 21 gctactatcatctctgcgcg 356 20 0 55.00 59.273 0.00 0.00 0.00 0.727 22 cgtagcggcgatctagctag 577 20 0 60.00 60.791 15.64 15.64 37.58 0.791 23 cggcgatctagctagctgac 582 20 0 60.00 61.003 14.84 7.25 38.70 1.003 24 gctagctgatcgatcgtagc 563 20 0 55.00 58.995 23.70 23.70 0.00 1.005 25 gatcgatcgatgtgcggcta 81 20 0 55.00 61.006 19.16 0.00 41.65 1.006 26 atcgatcgatgtgcggctag 82 20 0 55.00 61.008 29.65 0.00 41.65 1.008 27 gctgactgatacgcgatgc 472 19 0 57.89 60.025 0.00 0.00 0.00 1.025 28 agctagctgatcatcgatgct 190 21 0 47.62 60.035 17.99 11.09 0.00 1.035 29 gctagctagctgactgatcga 105 21 0 52.38 60.037 34.38 0.00 46.11 1.037 30 tcatctctgcgcgatcgat 363 19 0 52.63 59.946 22.07 0.12 38.48 1.054 31 atcatctctgcgcgatcga 362 19 0 52.63 59.946 22.07 1.72 38.48 1.054 32 atcgatcgatgtgcggcta 82 19 0 52.63 59.945 29.65 0.00 41.65 1.055 33 gtagcggcgatctagctagc 578 20 0 60.00 61.071 16.97 7.15 39.86 1.071 34 gctagctgactgatcgatcg 109 20 0 55.00 58.924 16.84 13.89 0.00 1.076 35 gctgatcgatcgatgtgcg 78 19 0 57.89 60.097 29.87 18.15 42.69 1.097 36 tatcatctctgcgcgatcgat 361 21 0 47.62 60.172 22.07 11.47 38.48 1.172 37 gctagctagctgatcgatcga 390 21 0 52.38 60.172 34.38 22.52 46.11 1.172 38 gctagctagctgatcgatcga 70 21 0 52.38 60.172 34.38 22.52 46.11 1.172 39 catctctgcgcgatcgatg 364 19 0 57.89 59.810 13.74 13.74 38.48 1.190 40 tcgtagcggcgatctagcta 576 20 0 55.00 61.231 11.55 9.27 36.40 1.231 41 actgatacgcgatgctagcta 476 21 0 47.62 59.765 17.69 3.08 0.00 1.235 42 actgatcgatcgatgctagct 117 21 0 47.62 59.763 23.29 11.70 35.21 1.237 43 agctagctgatcgatcgatgt 73 21 0 47.62 59.763 17.99 2.62 35.21 1.237 44 tagcggcgatctagctagct 579 20 0 55.00 61.243 23.74 23.74 46.60 1.243 45 cgtagcggcgatctagcta 577 19 0 57.89 59.729 11.55 9.27 37.58 1.271 46 ctagctgatcgatcgtagcg 564 20 0 55.00 58.727 25.02 15.05 0.00 1.273 47 tagcggcgatctagctagc 579 19 0 57.89 59.725 16.97 9.14 39.86 1.275 48 catcgatcgatgcatgcatg 442 20 0 50.00 58.722 37.80 23.31 44.93 1.278 49 tcatctctgcgcgatcgatg 363 20 0 55.00 61.279 18.01 18.01 38.48 1.279 50 gctagctagctgatcgatcg 559 20 0 55.00 58.714 34.38 11.90 46.11 1.286 51 gctagctagctgatcgatcg 390 20 0 55.00 58.714 34.38 11.90 46.11 1.286 52 gctagctagctgatcgatcg 70 20 0 55.00 58.714 34.38 11.90 46.11 1.286 53 agcatcggattagctagctga 3 21 0 47.62 59.689 28.29 20.88 0.00 1.311 54 agctgatcgatcgtagcgg 566 19 0 57.89 60.315 25.02 17.36 0.00 1.315 55 cggcgatctagctagctga 582 19 0 57.89 59.650 21.57 16.66 38.70 1.350 56 ctagctgatcgatcgatgtgc 75 21 0 52.38 59.643 31.83 30.04 35.21 1.357 57 gctagctgatcgatcgatgtg 74 21 0 52.38 59.643 12.06 6.93 35.21 1.357 58 gctagctaggcgatgctagc 412 20 0 60.00 61.357 30.41 30.41 46.19 1.357 59 tagctagctgactgatacgcg 466 21 0 52.38 60.373 28.29 3.89 0.00 1.373 60 gctagctgactgatcgatcga 109 21 0 52.38 60.374 22.52 22.52 0.00 1.374 61 agctagctgactgatcgatcg 108 21 0 52.38 60.374 17.99 13.89 0.00 1.374 62 cgatcgatgctagctaggcg 404 20 0 60.00 61.409 15.59 9.14 0.00 1.409 63 gctagctagctgactgatcg 105 20 0 55.00 58.563 34.38 1.84 46.11 1.437 64 atgctagctaggcgatgct 410 19 0 52.63 59.561 10.59 7.53 0.00 1.439 65 agctagctgatcgatcgtagc 562 21 0 52.38 60.441 26.87 26.87 0.00 1.441 66 gctagctagctgatcgatcgt 559 21 0 52.38 60.441 34.38 2.65 46.11 1.441 67 tagctaggcgatgctagctag 414 21 0 52.38 59.559 18.42 17.46 42.44 1.441 68 ctagctaggcgatgctagcta 413 21 0 52.38 59.559 18.69 17.64 42.44 1.441 69 tagctgatcgatcgatgtgc 76 20 0 50.00 58.558 31.83 30.04 35.21 1.442 70 gatgctagctaggcgatgcta 409 21 0 52.38 60.444 9.82 8.91 0.00 1.444 71 atgctagctaggcgatgctag 410 21 0 52.38 60.444 23.16 23.16 38.59 1.444 72 gctagctgatcatcgatgct 191 20 0 50.00 58.539 16.29 12.14 0.00 1.461 73 agctagctgatcatcgatgc 190 20 0 50.00 58.539 21.42 9.22 0.00 1.461 74 gctgactgatacgcgatgct 472 20 0 55.00 61.494 2.33 0.00 0.00 1.494 75 agctgactgatacgcgatgc 471 20 0 55.00 61.494 3.47 0.00 0.00 1.494 76 ggcgatctagctagctgacta 583 21 0 52.38 59.491 17.44 5.40 37.58 1.509 77 gatcgatgctagctaggcgat 405 21 0 52.38 60.510 21.61 21.61 0.00 1.510 78 atcgatcgatgctagctaggc 402 21 0 52.38 60.510 29.65 8.45 33.56 1.510 79 ctgatcgatcgatgtgcgg 79 19 0 57.89 59.447 15.54 5.83 41.65 1.553 80 agctgatcgatcgatgtgcg 77 20 0 55.00 61.556 31.92 20.26 42.69 1.556 81 cgatcatcgatgctagctagc 548 21 0 52.38 59.444 34.89 34.89 46.99 1.556 82 tagctaggcgatgctagcta 414 20 0 50.00 58.433 19.37 17.81 42.44 1.567 83 agctagctactgatcgatgct 303 21 0 47.62 59.415 17.56 11.51 0.00 1.585 84 tcgatcgatgtgcggctag 83 19 0 57.89 60.606 18.63 0.00 41.65 1.606 85 gactgatcgatcgatgctagc 116 21 0 52.38 59.378 15.86 8.45 35.21 1.622 86 agctagctgactgatcgatca 260 21 0 47.62 59.347 26.99 26.99 35.44 1.653 87 ctgactgatacgcgatgctag 473 21 0 52.38 59.312 1.70 0.00 0.00 1.688 88 ctagctgactgatacgcgatg 469 21 0 52.38 59.312 0.00 0.00 0.00 1.688 89 gctactatcatctctgcgcga 356 21 0 52.38 60.707 2.71 2.71 0.00 1.707 90 agctactatcatctctgcgcg 355 21 0 52.38 60.709 0.00 0.00 0.00 1.709 91 actatcatctctgcgcgatc 359 20 0 50.00 58.270 4.99 0.00 0.00 1.730 92 actgatcgatcgatgctagc 117 20 0 50.00 58.270 23.29 13.61 35.21 1.730 93 gctagctgatcgatcgatgt 74 20 0 50.00 58.270 14.29 2.62 35.21 1.730 94 ctatcatctctgcgcgatcga 360 21 0 52.38 60.771 22.07 1.72 38.48 1.771 95 atcgatgctagctaggcgatg 406 21 0 52.38 60.779 21.16 4.37 0.00 1.779 96 tgactgatacgcgatgctag 474 20 0 50.00 58.207 1.70 0.00 0.00 1.793 97 ctgactgatacgcgatgcta 473 20 0 50.00 58.207 2.33 0.00 0.00 1.793 98 tagctgactgatacgcgatg 470 20 0 50.00 58.207 0.00 0.00 0.00 1.793 99 ctgactgatcgatcgatgct 114 20 0 50.00 58.197 26.44 12.40 35.21 1.803 100 agctgactgatcgatcgatg 112 20 0 50.00 58.197 23.05 13.21 35.21 1.803 101 tcggattagctagctgatgc 7 20 0 50.00 58.176 17.46 17.46 40.05 1.824 102 gcatcggattagctagctga 4 20 0 50.00 58.176 28.29 20.88 0.00 1.824 103 agcatcggattagctagctg 3 20 0 50.00 58.171 28.29 10.80 0.00 1.829 104 gatgctagctaggcgatgc 409 19 0 57.89 59.141 4.18 0.00 0.00 1.859 105 ctgatacgcgatgctagctag 477 21 0 52.38 59.113 17.46 17.46 0.00 1.887 106 gctagctgactgatacgcg 468 19 0 57.89 59.086 8.21 3.89 0.00 1.914 107 ctctgcgcgatcgatgctag 367 20 0 60.00 61.946 21.94 18.16 38.48 1.946 108 tctgcgcgatcgatgctag 368 19 0 57.89 60.966 21.94 18.16 38.48 1.966 109 ctctgcgcgatcgatgcta 367 19 0 57.89 60.966 26.61 17.10 38.48 1.966 110 cgatgctagctaggcgatgc 408 20 0 60.00 61.968 11.09 0.00 0.00 1.968 111 gactgatacgcgatgctagct 475 21 0 52.38 60.975 17.69 1.35 0.00 1.975 112 gctagctgactgatacgcgat 468 21 0 52.38 60.975 8.21 0.00 0.00 1.975 113 tgatacgcgatgctagctag 478 20 0 50.00 57.994 17.46 17.46 0.00 2.006 114 ctgatacgcgatgctagcta 477 20 0 50.00 57.994 17.69 3.08 0.00 2.006 115 cgcgatcgatgctagctagc 372 20 0 60.00 62.011 34.89 34.89 43.67 2.011 116 gcgcgatcgatgctagctag 371 20 0 60.00 62.011 21.66 17.46 38.48 2.011 117 ctgatcgatcgatgctagct 399 20 0 50.00 57.983 19.70 2.01 35.21 2.017 118 agctgatcgatcgatgctag 397 20 0 50.00 57.983 27.33 18.05 34.69 2.017 119 ctagctgatcgatcgatgct 395 20 0 50.00 57.983 33.87 33.38 38.16 2.017 120 agctagctgatcgatcgatg 393 20 0 50.00 57.983 21.99 11.03 35.21 2.017 121 ctgatcgatcgatgctagct 118 20 0 50.00 57.983 19.70 2.01 35.21 2.017 122 agctagctgatcgatcgatg 73 20 0 50.00 57.983 21.99 11.03 35.21 2.017 123 catcggattagctagctgatgc 5 22 0 50.00 59.982 24.41 24.41 40.05 2.018 124 gcatcggattagctagctgatg 4 22 0 50.00 59.982 27.81 27.81 33.28 2.018 125 tcgatgctagctaggcgat 407 19 0 52.63 58.964 14.03 3.01 0.00 2.036 126 atcgatgctagctaggcga 406 19 0 52.63 58.964 16.30 16.30 0.00 2.036 127 actatcatctctgcgcgatcg 359 21 0 52.38 61.037 12.19 12.19 39.07 2.037 128 gcgcgatcgatgctagcta 371 19 0 57.89 61.037 21.66 3.08 38.48 2.037 129 gctgatcgatcgatgctagct 398 21 0 52.38 61.044 27.88 12.70 35.21 2.044 130 agctgatcgatcgatgctagc 397 21 0 52.38 61.044 27.33 27.90 34.69 2.044 131 gctagctgatcgatcgatgct 394 21 0 52.38 61.044 33.87 33.38 38.16 2.044 132 agctagctgatcgatcgatgc 393 21 0 52.38 61.044 24.08 21.09 35.21 2.044 133 cgcgatcgatgctagctag 372 19 0 57.89 58.947 22.07 17.46 38.48 2.053 134 tcgtagcggcgatctagc 576 18 0 61.11 59.936 4.70 0.00 36.40 2.064 135 cgtagcggcgatctagct 577 18 0 61.11 59.935 11.03 11.03 37.58 2.065 136 gcggcgatctagctagct 581 18 0 61.11 59.933 23.74 23.74 38.05 2.067 137 agcggcgatctagctagc 580 18 0 61.11 59.933 16.97 7.15 39.86 2.067 138 ctagctgactgatacgcgat 469 20 0 50.00 57.918 1.43 0.00 0.00 2.082 139 ctagctgatcgatcgtagcgg 564 21 0 57.14 61.096 20.31 16.15 0.00 2.096 140 agctactatcatctctgcgc 355 20 0 50.00 57.898 0.00 0.00 0.00 2.102 141 gctagctactgatcgatgct 304 20 0 50.00 57.898 11.51 11.51 0.00 2.102 142 agctagctactgatcgatgc 303 20 0 50.00 57.898 17.56 1.76 0.00 2.102 143 agcatcggattagctagctgat 3 22 0 45.45 60.108 17.84 15.13 0.00 2.108 144 tgctagctaggcgatgcta 411 19 0 52.63 58.881 17.69 8.91 0.00 2.119 145 aagcatcggattagctagctg 2 21 0 47.62 58.879 28.29 10.80 0.00 2.121 146 tctgcgcgatcgatgcta 368 18 0 55.56 59.857 26.61 16.13 38.48 2.143 147 cgatgctagctaggcgatg 408 19 0 57.89 58.856 11.09 0.00 0.00 2.144 148 agctagctgatcatcgatgcta 190 22 0 45.45 59.845 17.99 13.09 0.00 2.155 149 tagctagctgatcatcgatgct 189 22 0 45.45 59.845 16.29 15.30 0.00 2.155 150 atcgatcgatgtgcggct 82 18 0 55.56 60.166 29.65 4.36 41.65 2.166 151 gctagctgactgatcgatca 261 20 0 50.00 57.829 26.99 26.99 35.44 2.171 152 tagctagctgactgatcgatcg 107 22 0 50.00 60.174 28.29 13.89 0.00 2.174 153 agctgatcatcatcgatgct 515 20 0 45.00 57.788 11.25 0.72 40.32 2.212 154 agctagctgactgatcgatcat 260 22 0 45.45 59.778 26.67 18.02 36.62 2.222 155 tgactgatacgcgatgctagc 474 21 0 52.38 61.238 8.61 8.61 0.00 2.238 156 gctgactgatacgcgatgcta 472 21 0 52.38 61.238 2.33 0.00 0.00 2.238 157 tagctgactgatacgcgatgc 470 21 0 52.38 61.238 3.47 0.00 0.00 2.238 158 tagctagctgatcgatcgtagc 561 22 0 50.00 60.238 26.87 26.87 0.00 2.238 159 gctagctagctgatcgatcgta 559 22 0 50.00 60.238 34.38 3.07 46.11 2.238 160 tgatcgatcgatgctagctagg 400 22 0 50.00 60.239 26.44 6.29 35.21 2.239 161 gctgactgatcgatcgatgct 113 21 0 52.38 61.244 26.44 12.40 35.21 2.244 162 agctgactgatcgatcgatgc 112 21 0 52.38 61.244 24.08 19.43 35.21 2.244 163 gatcgatcgatgtgcggct 81 19 0 57.89 61.263 19.16 0.00 41.65 2.263 164 gctgatcatcgatgctactagc 195 22 0 50.00 59.727 18.08 16.44 45.61 2.273 165 gctagctgatcatcgatgctac 191 22 0 50.00 59.727 9.57 5.47 0.00 2.273 166 gatcgatcgatgtgcggc 81 18 0 61.11 59.714 18.10 0.95 41.65 2.286 167 ctagctagctgactgatacgc 465 21 0 52.38 58.703 14.90 0.00 0.00 2.297 168 tagctgatcgatcgatgtgcg 76 21 0 52.38 61.299 31.92 20.26 42.69 2.299 169 agctgatcgatcgatgtgc 77 19 0 52.63 58.698 31.83 30.04 35.21 2.302 170 gctgatcatcatcgatgctagc 516 22 0 50.00 60.302 10.80 10.34 40.32 2.302 171 gctagctgatcatcatcgatgc 512 22 0 50.00 60.302 21.42 7.40 40.32 2.302 172 aagcatcggattagctagctga 2 22 0 45.45 60.306 28.29 20.88 0.00 2.306 173 gatcgatcgtagcggcga 570 18 0 61.11 60.318 13.01 8.51 45.59 2.318 174 atcggattagctagctgatgc 6 21 0 47.62 58.673 17.46 17.46 40.05 2.327 175 gcatcggattagctagctgat 4 21 0 47.62 58.673 17.84 15.13 0.00 2.327 176 gcggcgatctagctagctg 581 19 0 63.16 61.329 17.07 8.17 38.05 2.329 177 tgctagtgatgcatgctagt 24 20 0 45.00 57.636 24.96 11.17 35.89 2.364 178 ctactatcatctctgcgcga 357 20 0 50.00 57.636 2.71 2.71 0.00 2.364 179 actagctagctgactgatacgc 464 22 0 50.00 60.368 21.52 0.00 0.00 2.368 180 gctagctagctgatcatcga 187 20 0 50.00 57.613 34.38 0.24 46.11 2.387 181 tctctgcgcgatcgatgcta 366 20 0 55.00 62.413 26.61 17.10 38.48 2.413 182 tgatcgatcgatgctagctagt 119 22 0 45.45 59.586 26.44 5.69 35.21 2.414 183 actgatcgatcgatgctagcta 117 22 0 45.45 59.586 23.29 7.65 35.21 2.414 184 tagctagctgatcgatcgatgt 72 22 0 45.45 59.586 14.29 2.62 35.21 2.414 185 agctaggcgatgctagcta 415 19 0 52.63 58.572 17.69 3.08 41.54 2.428 186 tagctaggcgatgctagct 414 19 0 52.63 58.572 17.35 17.35 43.53 2.428 187 gatcgatcgatgctagctagg 401 21 0 52.38 58.567 23.89 6.29 35.21 2.433 188 gctagctagctgactgatcgat 105 22 0 50.00 60.434 34.38 0.00 46.11 2.434 189 gatcgatgctagctaggcg 405 19 0 57.89 58.563 15.59 9.02 0.00 2.437 190 cgatcgatgctagctaggc 404 19 0 57.89 58.563 14.87 8.45 0.00 2.437 191 tagctagctgactgatacgc 466 20 0 50.00 57.549 28.29 0.00 0.00 2.451 192 agctagctgactgatcgatc 260 20 0 50.00 57.536 19.32 19.32 0.00 2.464 193 agctagctgactgatcgatc 108 20 0 50.00 57.536 19.32 19.32 0.00 2.464 194 aaagcatcggattagctagctg 1 22 0 45.45 59.524 28.29 10.80 0.00 2.476 195 gctgactgatcgatcatcatgc 265 22 0 50.00 60.493 25.66 25.12 41.77 2.493 196 tagctactatcatctctgcgcg 354 22 0 50.00 60.495 0.00 0.00 0.00 2.495 197 ctgatcgatcgatgtgcggc 79 20 0 60.00 62.497 15.54 4.15 41.65 2.497 198 gctgatcgatcgatgtgcgg 78 20 0 60.00 62.497 29.87 22.23 41.65 2.497 199 tcgtagcggcgatctagct 576 19 0 57.89 61.503 11.03 11.03 36.40 2.503 200 agcggcgatctagctagct 580 19 0 57.89 61.519 23.74 23.74 42.96 2.519 201 ctagctagctgatcatcgatgc 188 22 0 50.00 59.470 21.42 9.22 0.00 2.530 202 gctagctagctgatcatcgatg 187 22 0 50.00 59.470 34.38 20.23 46.11 2.530 203 tcatctctgcgcgatcga 363 18 0 55.56 59.468 22.07 0.00 38.48 2.532 204 tcgatcgatgtgcggcta 83 18 0 55.56 59.465 18.63 0.00 41.65 2.535 205 tgatcgatcgatgtgcggc 80 19 0 57.89 61.549 21.27 8.44 41.65 2.549 206 ctagctaggcgatgctagctag 413 22 0 54.55 60.561 22.99 22.99 46.84 2.561 207 gctagctagctgatcgatcgat 390 22 0 50.00 60.561 34.38 30.53 46.11 2.561 208 gctagctagctgatcgatcgat 70 22 0 50.00 60.561 34.38 30.53 46.11 2.561 209 ctgcgcgatcgatgctag 369 18 0 61.11 59.415 19.79 13.97 38.48 2.585 210 aagcatcggattagctagct 2 20 0 45.00 57.413 23.74 23.74 0.00 2.587 211 gctagctgatcatcgatgcta 191 21 0 47.62 58.410 16.61 13.09 0.00 2.590 212 tagctagctgatcatcgatgc 189 21 0 47.62 58.410 21.42 9.22 0.00 2.590 213 actgatacgcgatgctagc 476 19 0 52.63 58.407 8.61 8.61 0.00 2.593 214 gctagctgactgatcgatcatc 261 22 0 50.00 59.406 23.93 21.92 36.62 2.594 215 atcgatcgatgctagctagg 402 20 0 50.00 57.396 29.65 6.29 33.56 2.604 216 atctctgcgcgatcgatgc 365 19 0 57.89 61.618 22.01 22.01 38.48 2.618 217 tgatcgatcgtagcggcg 569 18 0 61.11 60.621 20.58 0.86 0.00 2.621 218 atcatctctgcgcgatcgatg 362 21 0 52.38 61.633 18.01 18.01 38.48 2.633 219 agctagctgatcgatcgtag 562 20 0 50.00 57.344 17.99 16.86 0.00 2.656 220 ctagctagctgatcgatcgt 560 20 0 50.00 57.344 16.40 2.65 0.00 2.656 221 gctagctgactgatcgatcat 261 21 0 47.62 58.339 26.67 18.02 36.62 2.661 222 ctgatcgatcgtagcggcg 568 19 0 63.16 61.664 14.21 0.86 0.00 2.664 223 ctgactgatacgcgatgct 473 19 0 52.63 58.330 2.33 0.00 0.00 2.670 224 agctgactgatacgcgatg 471 19 0 52.63 58.330 0.00 0.00 0.00 2.670 225 gctagctgatcgatcgtagcg 563 21 0 57.14 61.676 24.18 16.49 0.00 2.676 226 ctagctgactgatcgatcga 110 20 0 50.00 57.276 22.52 22.52 0.00 2.724 227 agctagctactgatcgatgcta 303 22 0 45.45 59.252 17.56 12.23 0.00 2.748 228 tagctagctactgatcgatgct 302 22 0 45.45 59.252 27.80 11.51 0.00 2.748 229 gactgatacgcgatgctagcta 475 22 0 50.00 60.751 17.69 3.08 0.00 2.751 230 actgatacgcgatgctagctag 476 22 0 50.00 60.752 17.46 17.46 0.00 2.752 231 gactgatcgatcgatgctagct 116 22 0 50.00 60.753 18.04 9.56 35.21 2.753 232 gctagctgactgatcgatcgat 109 22 0 50.00 60.753 30.53 30.53 37.90 2.753 233 tgcgcgatcgatgctagcta 370 20 0 55.00 62.756 26.61 9.85 38.48 2.756 234 gcggcgatctagctagctga 581 20 0 60.00 62.765 21.57 16.66 38.70 2.765 235 agcggcgatctagctagctg 580 20 0 60.00 62.771 17.07 8.17 44.87 2.771 236 ctactatcatctctgcgcgatc 357 22 0 50.00 59.220 4.99 0.00 0.00 2.780 237 tatcatctctgcgcgatcg 361 19 0 52.63 58.199 12.19 12.19 39.07 2.801 238 tactatcatctctgcgcgatcg 358 22 0 50.00 60.811 12.19 12.19 39.07 2.811 239 tagctagctgactgatcgatca 259 22 0 45.45 59.187 28.29 26.99 35.44 2.813 240 gctgatcgatcgatgctagcta 398 22 0 50.00 60.816 27.88 12.57 35.21 2.816 241 tagctgatcgatcgatgctagc 396 22 0 50.00 60.816 30.84 27.90 36.80 2.816 242 gctagctgatcgatcgatgcta 394 22 0 50.00 60.816 34.11 32.56 36.80 2.816 243 tagctagctgatcgatcgatgc 392 22 0 50.00 60.816 24.08 21.09 35.21 2.816 244 gctaggcgatgctagctag 416 19 0 57.89 58.179 17.46 17.46 35.42 2.821 245 ctagctaggcgatgctagc 413 19 0 57.89 58.179 18.68 9.44 36.95 2.821 246 gctagctaggcgatgctag 412 19 0 57.89 58.179 23.16 23.16 38.59 2.821 247 catctctgcgcgatcgatgc 364 20 0 60.00 62.823 22.01 22.01 38.48 2.823 248 aaagcatcggattagctagct 1 21 0 42.86 58.168 23.74 23.74 0.00 2.832 249 ctgactgatcgatcgatgctag 114 22 0 50.00 59.155 22.81 19.44 35.21 2.845 250 ctagctgactgatcgatcgatg 110 22 0 50.00 59.155 23.05 13.21 35.21 2.845 251 tactatcatctctgcgcgatc 358 21 0 47.62 58.155 4.99 0.00 0.00 2.845 252 gctagctactgatcgatgctac 304 22 0 50.00 59.151 8.57 4.26 0.00 2.849 253 ctactatcatctctgcgcgat 357 21 0 47.62 58.150 4.99 2.52 0.00 2.850 254 agctgatcatcgatgctact 194 20 0 45.00 57.134 17.14 8.95 0.00 2.866 255 gctagctagctgatcatcgat 187 21 0 47.62 58.132 34.38 0.00 46.11 2.868 256 ctgatacgcgatgctagct 477 19 0 52.63 58.107 17.69 1.35 0.00 2.893 257 ggcgatctagctagctgac 583 19 0 57.89 58.106 14.84 7.25 37.58 2.894 258 tgactgatcgatcgatgctag 115 21 0 47.62 58.084 22.81 19.44 35.21 2.916 259 ctgactgatcgatcgatgcta 114 21 0 47.62 58.084 26.44 14.64 35.21 2.916 260 tagctgactgatcgatcgatg 111 21 0 47.62 58.084 23.05 13.21 35.21 2.916 261 actgatcgatcatcatgctagc 269 22 0 45.45 59.071 26.67 8.61 41.77 2.929 262 agctgactgatcgatcatca 264 20 0 45.00 57.064 26.49 26.49 39.98 2.936 263 ctagctagctgatcgatcga 391 20 0 50.00 57.060 22.52 22.52 0.00 2.940 264 ctagctagctgatcgatcga 71 20 0 50.00 57.060 22.52 22.52 0.00 2.940 265 gatcgatcgatgtgcggctag 81 21 0 57.14 61.947 19.16 0.00 41.65 2.947 266 tgctagctaggcgatgct 411 18 0 55.56 59.050 17.69 7.53 0.00 2.950 267 gctgatcgatcgtagcggc 567 19 0 63.16 61.960 20.49 19.38 0.00 2.960 268 cgatcgatgtgcggctag 84 18 0 61.11 59.032 10.82 0.00 41.65 2.968 269 tgatcgatcgatgtgcggct 80 20 0 55.00 62.987 22.21 0.00 41.65 2.987 270 ctgactgatcgatcatcatgct 266 22 0 45.45 59.004 20.99 6.82 41.77 2.996 271 agctgactgatcgatcatcatg 264 22 0 45.45 59.004 22.70 19.51 41.77 2.996 272 agctagctgactgatacgcga 467 21 0 52.38 62.000 17.99 0.00 0.00 3.000 273 tgactgatcgatcgatgctagc 115 22 0 50.00 61.008 18.17 12.52 35.21 3.008 274 gctgactgatcgatcgatgcta 113 22 0 50.00 61.008 26.44 14.64 35.21 3.008 275 tagctgactgatcgatcgatgc 111 22 0 50.00 61.008 24.08 19.43 35.21 3.008 276 agctagctgatcgatcgatgtg 73 22 0 50.00 61.010 17.99 6.93 35.21 3.010 277 ctgatcgatcgatgctagctag 399 22 0 50.00 58.963 19.70 17.46 35.21 3.037 278 ctagctgatcgatcgatgctag 395 22 0 50.00 58.963 37.86 37.86 43.17 3.037 279 ctagctagctgatcgatcgatg 391 22 0 50.00 58.963 21.99 11.03 35.21 3.037 280 ctgatcgatcgatgctagctag 118 22 0 50.00 58.963 19.70 17.46 35.21 3.037 281 ctagctagctgatcgatcgatg 71 22 0 50.00 58.963 21.99 11.03 35.21 3.037 282 gactgatcgatcatcatgctagc 268 23 0 47.83 60.053 24.51 9.03 41.77 3.053 283 gctagtgatgcatgctagtagtg 25 23 0 47.83 59.929 24.96 10.54 0.00 3.071 284 gctactatcatctctgcgcgat 356 22 0 50.00 61.073 4.99 2.52 0.00 3.073 285 gtagcggcgatctagctag 578 19 0 57.89 57.903 15.64 15.64 37.58 3.097 286 tgactgatcgatcatcatgct 267 21 0 42.86 57.900 26.79 12.28 41.77 3.100 287 ctagctactatcatctctgcgc 353 22 0 50.00 58.892 0.00 0.00 0.00 3.108 288 gctagctactatcatctctgcg 352 22 0 50.00 58.892 8.21 0.00 0.00 3.108 289 ctagctagctactgatcgatgc 301 22 0 50.00 58.892 14.00 1.76 0.00 3.108 290 gctagctagctactgatcgatg 300 22 0 50.00 58.892 34.38 7.78 46.11 3.108 291 catcgatcgatgctagtatgct 325 22 0 45.45 58.885 37.80 10.02 44.93 3.115 292 tgatcgatcgatgctagctag 400 21 0 47.62 57.879 26.44 17.46 35.21 3.121 293 ctgatcgatcgatgctagcta 399 21 0 47.62 57.879 19.70 3.77 35.21 3.121 294 tagctgatcgatcgatgctag 396 21 0 47.62 57.879 34.03 27.12 36.80 3.121 295 ctagctgatcgatcgatgcta 395 21 0 47.62 57.879 34.11 32.56 36.80 3.121 296 tagctagctgatcgatcgatg 392 21 0 47.62 57.879 21.99 11.03 35.21 3.121 297 tgatcgatcgatgctagctag 119 21 0 47.62 57.879 26.44 17.46 35.21 3.121 298 ctgatcgatcgatgctagcta 118 21 0 47.62 57.879 19.70 3.77 35.21 3.121 299 tagctagctgatcgatcgatg 72 21 0 47.62 57.879 21.99 11.03 35.21 3.121 300 gatcgatcgatgctagctagt 120 21 0 47.62 57.878 23.89 3.56 35.21 3.122 301 ctatcatctctgcgcgatcgat 360 22 0 50.00 61.132 22.07 11.47 38.48 3.132 302 tgatcgatcgtagcggcga 569 19 0 57.89 62.144 20.58 8.51 45.59 3.144 303 tcgtagcggcgatctagctag 576 21 0 57.14 62.173 15.64 15.64 36.40 3.173 304 tactagctagctgactgatacgc 463 23 0 47.83 60.176 13.17 0.00 0.00 3.176 305 ctgatcatcatcgatgctagct 517 22 0 45.45 58.807 17.69 1.76 40.32 3.193 306 agctgatcatcatcgatgctag 515 22 0 45.45 58.807 5.93 2.76 40.32 3.193 307 ctagctgatcatcatcgatgct 513 22 0 45.45 58.807 14.14 8.34 40.32 3.193 308 agctagctgatcatcatcgatg 511 22 0 45.45 58.807 20.23 20.23 41.48 3.193 309 ctgatcgatcatcatgctagct 270 22 0 45.45 58.807 26.67 0.00 41.77 3.193 310 ctagctgactgatcgatcgat 110 21 0 47.62 57.806 30.53 30.53 37.90 3.194 311 ttagctagctgactgatcgatca 258 23 0 43.48 59.798 28.29 26.99 35.44 3.202 312 tagctactatcatctctgcgc 354 21 0 47.62 57.798 0.00 0.00 0.00 3.202 313 gctagctactgatcgatgcta 304 21 0 47.62 57.798 12.99 12.23 0.00 3.202 314 tagctagctactgatcgatgc 302 21 0 47.62 57.798 27.80 1.76 0.00 3.202 315 tctctgcgcgatcgatgc 366 18 0 61.11 61.229 22.01 22.01 38.48 3.229 316 ctctgcgcgatcgatgct 367 18 0 61.11 61.232 26.61 0.00 38.48 3.232 317 agctagctactatcatctctgcg 351 23 0 47.83 60.238 17.56 0.00 0.00 3.238 318 ctagctagctactgatcgatgct 301 23 0 47.83 60.238 14.00 11.51 0.00 3.238 319 ctgatcgatcgtagcggc 568 18 0 61.11 58.727 14.21 0.00 0.00 3.273 320 gctgatcgatcgtagcgg 567 18 0 61.11 58.727 20.49 15.03 0.00 3.273 321 agctaggcgatgctagct 415 18 0 55.56 58.725 17.69 13.00 39.84 3.275 322 tgctagtgatgcatgctagtagt 24 23 0 43.48 60.302 24.96 12.98 35.89 3.302 323 gcgcgatcgatgctagct 371 18 0 61.11 61.306 21.66 1.35 38.48 3.306 324 tgatcatcatcgatgctagct 518 21 0 42.86 57.691 17.69 1.76 40.32 3.309 325 agctgatcatcatcgatgcta 515 21 0 42.86 57.691 0.24 0.00 40.32 3.309 326 tagctgatcatcatcgatgct 514 21 0 42.86 57.691 14.14 8.34 40.32 3.309 327 tgatcgatcatcatgctagct 271 21 0 42.86 57.691 27.48 0.00 37.38 3.309 328 ctagctagctgactgatacgcg 465 22 0 54.55 61.313 14.90 3.89 0.00 3.313 329 tgctagtgatgcatgctagtag 24 22 0 45.45 58.673 24.96 19.76 35.89 3.327 330 gctagtgatgcatgctagtagt 25 22 0 45.45 58.672 24.96 12.98 0.00 3.328 331 tagctagctgatcatcgatgcta 189 23 0 43.48 59.671 17.82 15.89 0.00 3.329 332 agctagctgactgatacgc 467 19 0 52.63 57.642 17.99 0.00 0.00 3.358 333 tatcatctctgcgcgatcgatg 361 22 0 50.00 61.383 18.01 18.01 38.48 3.383 334 agctgactgatcgatcatcat 264 21 0 42.86 57.616 26.31 18.90 41.77 3.384 335 actagctagctgatcatcatcga 508 23 0 43.48 59.607 22.43 0.00 0.00 3.393 336 tagctagctgactgatcgatcat 259 23 0 43.48 59.607 28.29 18.02 36.62 3.393 337 gatgctagctaggcgatgctag 409 22 0 54.55 61.393 23.16 23.16 38.59 3.393 338 cggcgatctagctagctgact 582 21 0 57.14 62.394 17.44 7.44 38.70 3.394 339 ctagctagctgatcgatcgat 391 21 0 47.62 57.600 30.53 30.53 37.90 3.400 340 ctagctagctgatcgatcgat 71 21 0 47.62 57.600 30.53 30.53 37.90 3.400 341 actgatcgatcatcatgctagct 269 23 0 43.48 60.428 26.67 4.70 41.77 3.428 342 ctagctagctgactgatcgatc 106 22 0 50.00 58.567 19.32 19.32 0.00 3.433 343 ctgactgatcgatcatcatgc 266 21 0 47.62 57.562 20.99 12.19 41.77 3.438 344 gctgactgatcgatcatcatg 265 21 0 47.62 57.562 22.70 19.51 41.77 3.438 345 gatcgatcgatgctagctaggc 401 22 0 54.55 61.448 23.89 8.45 35.21 3.448 346 gtgatgcatgctagtagtgatgt 29 23 0 43.48 59.551 11.60 0.00 0.00 3.449 347 tgctagtgatgcatgctagta 24 21 0 42.86 57.546 24.96 21.25 35.89 3.454 348 tagcggcgatctagctagctg 579 21 0 57.14 62.457 18.98 9.30 45.57 3.457 349 gtagcggcgatctagctagct 578 21 0 57.14 62.458 23.74 23.74 46.60 3.458 350 tagctgatcgatcgtagcg 565 19 0 52.63 57.539 25.02 11.96 0.00 3.461 351 gctagctagctactgatcgat 300 21 0 47.62 57.517 34.38 0.00 46.11 3.483 352 agctagctactgatcgatgctac 303 23 0 47.83 60.487 17.56 7.81 0.00 3.487 353 atcgatcgatgctagtatgct 326 21 0 42.86 57.502 29.65 2.17 33.56 3.498 354 agctactgatcgatgctacatc 307 22 0 45.45 58.484 7.41 0.00 37.97 3.516 355 agtgatgcatgctagtagtga 28 21 0 42.86 57.471 0.00 0.00 0.00 3.529 356 gactgatcgatcgatgctagcta 116 23 0 47.83 60.546 18.04 4.19 35.21 3.546 357 ctgatcgatcgatgctagctagt 118 23 0 47.83 60.547 22.18 3.56 35.21 3.547 358 actgatcgatcgatgctagctag 117 23 0 47.83 60.547 23.29 17.46 35.21 3.547 359 ctagctagctgatcgatcgatgt 71 23 0 47.83 60.547 14.29 2.62 35.21 3.547 360 catcgatcgatgctagtatgc 325 21 0 47.62 57.452 37.80 0.00 44.93 3.548 361 tagctagctgactgatcgatc 259 21 0 47.62 57.451 28.29 19.32 0.00 3.549 362 tagctagctgactgatcgatc 107 21 0 47.62 57.451 28.29 19.32 0.00 3.549 363 ctagctagctgactgatcgat 106 21 0 47.62 57.445 14.90 0.00 0.00 3.555 364 tcgatgctagctaggcga 407 18 0 55.56 58.427 15.59 13.52 0.00 3.573 365 tgatcgatcgatgctagctagta 119 23 0 43.48 59.424 26.44 18.77 35.21 3.576 366 ctgcgcgatcgatgctagc 369 19 0 63.16 62.586 20.26 12.12 38.48 3.586 367 agctagctgatcatcatcgat 511 21 0 42.86 57.405 17.99 0.00 0.00 3.595 368 tgcgcgatcgatgctagc 370 18 0 61.11 61.605 26.61 17.77 38.48 3.605 369 ctagctagctgatcgatcgtag 560 22 0 50.00 58.387 16.86 16.86 0.00 3.613 370 actagctagctgactgatacg 464 21 0 47.62 57.384 21.52 2.77 0.00 3.616 371 ctagctgactgatacgcga 469 19 0 52.63 57.370 16.29 0.00 0.00 3.630 372 gctactagctagctgactgat 461 21 0 47.62 57.360 15.96 3.00 44.92 3.640 373 ctgatcatcatcgatgctagc 517 21 0 47.62 57.358 8.61 8.61 40.32 3.642 374 gctgatcatcatcgatgctag 516 21 0 47.62 57.358 5.93 2.76 40.32 3.642 375 ctagctgatcatcatcgatgc 513 21 0 47.62 57.358 21.42 7.40 40.32 3.642 376 gctagctgatcatcatcgatg 512 21 0 47.62 57.358 20.23 20.23 41.48 3.642 377 ctgatcgatcatcatgctagc 270 21 0 47.62 57.358 26.67 8.61 41.77 3.642 378 agctactgatcgatgctacat 307 21 0 42.86 57.344 7.41 0.00 0.00 3.656 379 tgatcgatcgatgtgcggcta 80 21 0 52.38 62.663 22.21 0.24 41.65 3.663 380 atctctgcgcgatcgatg 365 18 0 55.56 58.327 12.03 4.19 38.48 3.673 381 catctctgcgcgatcgat 364 18 0 55.56 58.327 22.07 1.26 38.48 3.673 382 atcatctctgcgcgatcg 362 18 0 55.56 58.327 12.19 12.19 39.07 3.673 383 aagcatcggattagctagctgat 2 23 0 43.48 60.682 17.84 15.13 0.00 3.682 384 agtgatgcatgctagtagtgatg 28 23 0 43.48 59.299 7.49 7.49 0.00 3.701 385 gatcgatgctagctaggcgatg 405 22 0 54.55 61.702 24.26 6.24 0.00 3.702 386 atctctgcgcgatcgatgcta 365 21 0 52.38 62.723 26.61 17.10 38.48 3.723 387 tagctagctgactgatacgcga 466 22 0 50.00 61.730 28.29 0.00 0.00 3.730 388 tagctagctgatcgatcgtag 561 21 0 47.62 57.269 16.86 16.86 0.00 3.731 389 ctagctagctgatcgatcgta 560 21 0 47.62 57.269 11.68 3.07 0.00 3.731 390 tcgatcgatgctagctagtag 122 21 0 47.62 57.269 18.63 2.63 0.00 3.731 391 gctagctactgatcgatgctaca 304 23 0 47.83 60.734 11.21 0.06 0.00 3.734 392 agctagctgactgatcgatcatc 260 23 0 47.83 60.736 23.93 21.92 36.62 3.736 393 agctagctgactgatcgatcga 108 22 0 50.00 61.737 22.52 22.52 0.00 3.737 394 tctctgcgcgatcgatgct 366 19 0 57.89 62.740 26.61 0.00 38.48 3.740 395 tgatgcatgctagtagtgatgt 30 22 0 40.91 58.256 11.60 0.00 0.00 3.744 396 tgatcgatcgatgtgcgg 80 18 0 55.56 58.244 21.27 0.00 41.65 3.756 397 cgatcgatgctagctaggcga 404 21 0 57.14 62.770 16.30 16.30 0.00 3.770 398 tcgatcgatgctagctaggcg 403 21 0 57.14 62.770 18.63 11.67 0.00 3.770 399 atcgatcgatgcatgcatg 443 19 0 47.37 57.226 29.65 23.31 37.30 3.774 400 catcgatcgatgcatgcat 442 19 0 47.37 57.226 37.80 33.45 44.93 3.774 401 actagctagctgatcatcatcg 508 22 0 45.45 58.219 22.43 3.40 0.00 3.781 402 ctgatcatcgatgctactagct 196 22 0 45.45 58.219 10.86 0.00 45.92 3.781 403 agctgatcatcgatgctactag 194 22 0 45.45 58.219 13.67 9.68 0.00 3.781 404 ctagctgatcatcgatgctact 192 22 0 45.45 58.219 14.85 7.80 0.00 3.781 405 tttagctagctgactgatcga 257 21 0 42.86 57.216 0.38 0.00 0.00 3.784 406 tagctagctgatcgatcgatgtg 72 23 0 47.83 60.793 10.14 4.94 35.21 3.793 407 gctagctagctgatcatcatct 146 22 0 45.45 58.203 34.38 0.00 46.11 3.797 408 ctagctagctgatcatcgatgct 188 23 0 47.83 60.799 16.29 15.30 0.00 3.799 409 agctagctactatcatcgatcga 429 23 0 43.48 59.170 22.52 22.52 0.00 3.830 410 ttagctagctgactgatcgatc 258 22 0 45.45 58.159 28.29 19.32 0.00 3.841 411 ctagctgactgatcgatcatca 262 22 0 45.45 58.155 26.49 26.49 39.98 3.845 412 aaagcatcggattagctagctga 1 23 0 43.48 60.870 28.29 20.88 0.00 3.870 413 agctgactgatacgcgatgct 471 21 0 52.38 62.876 7.57 2.13 0.00 3.876 414 tagctagctactgatcgatgcta 302 23 0 43.48 59.102 27.80 12.23 0.00 3.898 415 tcatcatcgatgctagctagt 521 21 0 42.86 57.067 22.18 3.56 40.32 3.933 416 tcgatcatcatgctagctact 274 21 0 42.86 57.067 0.00 0.00 0.00 3.933 417 tgatcatcgatgctactagct 197 21 0 42.86 57.067 17.14 0.00 45.92 3.933 418 agctgatcatcgatgctacta 194 21 0 42.86 57.067 17.14 4.89 0.00 3.933 419 tagctgatcatcgatgctact 193 21 0 42.86 57.067 14.85 7.80 0.00 3.933 420 tcgatcgatgctagtatgctag 327 22 0 45.45 58.044 18.63 13.77 46.09 3.956 421 gcgatctagctagctgact 584 19 0 52.63 57.034 17.44 7.44 0.00 3.966 422 gctactgatcgatgctacatc 308 21 0 47.62 57.028 2.44 0.00 37.97 3.972 423 cggcgatctagctagctg 582 18 0 61.11 58.018 17.07 8.17 37.58 3.982 424 gctagctgactgatcgatcatca 261 23 0 47.83 60.983 26.49 26.49 39.98 3.983 425 actatcatctctgcgcgat 359 19 0 47.37 57.015 4.99 2.52 0.00 3.985 426 catcggattagctagctgatg 5 21 0 47.62 57.003 23.69 23.29 0.00 3.997 427 tagctgactgatcgatcatca 263 21 0 42.86 57.000 26.49 26.49 39.98 4.000 428 actagctagctgatcatcatcgat 508 24 0 41.67 59.995 22.43 0.00 0.00 4.005 429 agtgatgcatgctagtagtgat 28 22 0 40.91 57.984 0.00 0.00 0.00 4.016 430 ctagctagctgatcatcatcga 509 22 0 45.45 57.958 11.68 0.00 0.00 4.042 431 gctgatcatcgatgctactagct 195 23 0 47.83 61.046 20.91 5.24 45.92 4.046 432 agctgatcatcgatgctactagc 194 23 0 47.83 61.046 20.78 20.78 45.61 4.046 433 gctagctgatcatcgatgctact 191 23 0 47.83 61.046 12.59 8.92 0.00 4.046 434 agctagctgatcatcgatgctac 190 23 0 47.83 61.046 17.99 7.99 0.00 4.046 435 tagctagctactatcatctctgcg 350 24 0 45.83 60.058 27.80 0.00 0.00 4.058 436 ctagctagctactgatcgatgcta 301 24 0 45.83 60.058 14.00 12.23 0.00 4.058 437 agctactatcatctctgcgcga 355 22 0 50.00 62.058 2.71 2.71 0.00 4.058 438 gctatttagctagctgactgatcg 253 24 0 45.83 60.060 7.27 0.00 46.11 4.060 439 tgatcgatcatcatgctagctac 271 23 0 43.48 58.931 27.48 0.00 37.38 4.069 440 gtgatgcatgctagtagtgatg 29 22 0 45.45 57.921 7.49 7.49 0.00 4.079 441 ctagctagctgactgatcgatcg 106 23 0 52.17 61.091 16.84 13.89 0.00 4.091 442 ctagctactgatcgatgctaca 305 22 0 45.45 57.898 13.79 1.61 0.00 4.102 443 cggcgatctagctagctgacta 582 22 0 54.55 62.109 17.44 5.40 38.70 4.109 444 atgctagctaggcgatgc 410 18 0 55.56 57.890 10.59 0.00 0.00 4.110 445 ctgatcgatcatcatgctagctac 270 24 0 45.83 59.882 26.67 0.00 41.77 4.118 446 gctactagctagctgatcatca 505 22 0 45.45 57.879 14.37 0.00 44.92 4.121 447 gctactagctagctgatcatca 208 22 0 45.45 57.879 14.37 0.00 44.92 4.121 448 ctgactgatacgcgatgctagc 473 22 0 54.55 62.128 8.61 8.61 0.00 4.128 449 gctgactgatacgcgatgctag 472 22 0 54.55 62.128 1.70 0.00 0.00 4.128 450 ctagctgactgatacgcgatgc 469 22 0 54.55 62.128 3.47 0.00 0.00 4.128 451 gctagctgactgatacgcgatg 468 22 0 54.55 62.128 8.21 0.00 0.00 4.128 452 tgactgatcgatcatcatgctag 267 23 0 43.48 58.866 26.79 18.40 41.77 4.134 453 ctgactgatcgatcatcatgcta 266 23 0 43.48 58.866 20.99 8.89 41.77 4.134 454 tagctgactgatcgatcatcatg 263 23 0 43.48 58.866 22.70 19.51 41.77 4.134 455 ctagctagctgatcgatcgtagc 560 23 0 52.17 61.151 26.87 26.87 0.00 4.151 456 gctagctagctgatcgatcgtag 559 23 0 52.17 61.151 34.38 16.86 46.11 4.151 457 ctgatcgatcgatgctagctagg 399 23 0 52.17 61.158 22.67 6.29 35.21 4.158 458 gatcgatcgatgctagctagtag 120 23 0 47.83 58.829 23.89 2.63 35.21 4.171 459 ttagctagctgactgatcgatcat 258 24 0 41.67 60.177 28.29 18.02 36.62 4.177 460 ctgactgatcgatcatcatgctag 266 24 0 45.83 59.822 20.99 12.80 41.77 4.178 461 ctagctgactgatcgatcatcatg 262 24 0 45.83 59.822 22.70 19.51 41.77 4.178 462 ctagctgatcgatcgatgtgcg 75 22 0 54.55 62.180 31.92 20.85 42.69 4.180 463 tttagctagctgactgatcgatc 257 23 0 43.48 58.807 19.32 19.32 0.00 4.193 464 tgactgatcgatcatcatgcta 267 22 0 40.91 57.803 26.79 13.11 41.77 4.197 465 gctagctactatcatcgatcga 430 22 0 45.45 57.783 22.52 22.52 0.00 4.217 466 gatcgatcgatgctagctagta 120 22 0 45.45 57.783 23.89 18.77 35.21 4.217 467 agctagctactatcatcgatcg 429 22 0 45.45 57.777 17.56 9.87 0.00 4.223 468 atcgatcgatgctagctagtag 121 22 0 45.45 57.777 29.65 2.63 33.56 4.223 469 tgatcatcatcgatgctagctagt 518 24 0 41.67 60.238 22.18 3.56 40.32 4.238 470 tgatcgatcatcatgctagctact 271 24 0 41.67 60.238 27.48 0.00 37.38 4.238 471 actgatcgatcatcatgctagcta 269 24 0 41.67 60.238 26.67 2.76 41.77 4.238 472 catcgatcgatgctagtatgcta 325 23 0 43.48 58.753 37.80 6.23 44.93 4.247 473 tttagctagctgactgatcgat 257 22 0 40.91 57.736 0.38 0.00 0.00 4.264 474 atttagctagctgactgatcga 256 22 0 40.91 57.736 4.16 0.00 0.00 4.264 475 cgcgatcgatgctagcta 372 18 0 55.56 57.717 22.07 3.08 38.48 4.283 476 catcgatcgatgctagtatgctag 325 24 0 45.83 59.708 37.80 16.01 44.93 4.292 477 tagctagctactgatcgatgctac 302 24 0 45.83 60.297 27.80 7.81 0.00 4.297 478 agcatcggattagctagctgatg 3 23 0 47.83 61.299 27.81 27.81 33.28 4.299 479 agctagctgactgatacgcgat 467 22 0 50.00 62.317 17.99 0.00 0.00 4.317 480 tgatcatcatcgatgctagctag 518 23 0 43.48 58.678 17.46 17.46 40.32 4.322 481 ctgatcatcatcgatgctagcta 517 23 0 43.48 58.678 17.69 2.41 40.32 4.322 482 tagctgatcatcatcgatgctag 514 23 0 43.48 58.678 9.90 2.76 40.32 4.322 483 ctagctgatcatcatcgatgcta 513 23 0 43.48 58.678 14.58 9.63 40.32 4.322 484 tagctagctgatcatcatcgatg 510 23 0 43.48 58.678 20.23 20.23 41.48 4.322 485 ctgatcgatcatcatgctagcta 270 23 0 43.48 58.678 26.67 2.76 41.77 4.322 486 gatcatcatcgatgctagctagt 519 23 0 43.48 58.677 22.18 3.56 40.32 4.323 487 gatcgatcatcatgctagctact 272 23 0 43.48 58.677 21.11 0.00 0.00 4.323 488 gctagctagctgactgatcgatc 105 23 0 52.17 61.341 34.38 19.32 46.11 4.341 489 tgatcgatcgatgctagctagtag 119 24 0 45.83 60.356 26.44 2.63 35.21 4.356 490 ctgatcgatcgatgctagctagta 118 24 0 45.83 60.356 22.18 18.77 35.21 4.356 491 ctgatcatcatcgatgctagctag 517 24 0 45.83 59.644 17.46 17.46 40.32 4.356 492 ctagctgatcatcatcgatgctag 513 24 0 45.83 59.644 19.54 18.30 42.07 4.356 493 ctagctagctgatcatcatcgatg 509 24 0 45.83 59.644 20.23 20.23 41.48 4.356 494 tttagctagctgactgatcgatca 257 24 0 41.67 60.358 26.99 26.99 35.44 4.358 495 actatcatctctgcgcgatcga 359 22 0 50.00 62.365 22.07 1.72 38.48 4.365 496 agctgatcgatcgtagcg 566 18 0 55.56 57.634 25.02 11.96 0.00 4.366 497 gctactagctagctgactgatac 461 23 0 47.83 58.626 15.96 1.42 44.92 4.374 498 agctgatcgatcgatgctagct 397 22 0 50.00 62.388 30.32 30.32 38.42 4.388 499 agctagctgatcgatcgatgct 393 22 0 50.00 62.388 33.87 33.38 38.16 4.388 500 ctagctgactgatcgatcatcat 262 23 0 43.48 58.612 26.31 20.43 41.77 4.388 501 agctagctactatcatctctgc 351 22 0 45.45 57.608 17.56 0.00 0.00 4.392 502 ctagctactatcatctctgcgcg 353 23 0 52.17 61.393 0.00 0.00 0.00 4.393 503 tgatcatcatcgatgctagcta 518 22 0 40.91 57.602 17.69 3.08 40.32 4.398 504 tagctgatcatcatcgatgcta 514 22 0 40.91 57.602 15.95 9.16 40.32 4.398 505 tgatcgatcatcatgctagcta 271 22 0 40.91 57.602 27.48 3.08 37.38 4.398 506 atcatcatcgatgctagctagt 520 22 0 40.91 57.595 22.18 3.56 40.32 4.405 507 atcgatcatcatgctagctact 273 22 0 40.91 57.595 0.00 0.00 0.00 4.405 508 agctagctactatcatcgatcgat 429 24 0 41.67 59.573 25.37 25.37 35.13 4.427 509 gctagctgatcgatcgatgtgc 74 22 0 54.55 62.443 31.83 30.04 35.21 4.443 510 tagctgactgatcgatcatcat 263 22 0 40.91 57.531 26.31 20.43 41.77 4.469 511 tagctagctgactgatcgatcga 107 23 0 47.83 61.487 28.29 22.52 0.00 4.487 512 atcgatcgatgctagtatgctag 326 23 0 43.48 58.501 29.65 13.77 46.09 4.499 513 ctagtgatgcatgctagtagtga 26 23 0 43.48 58.483 20.00 1.46 0.00 4.517 514 tagctagctgactgatcgatcatc 259 24 0 45.83 60.536 28.29 21.92 36.62 4.536 515 tactagctagctgatcatcatcga 507 24 0 41.67 59.449 0.00 0.00 0.00 4.551 516 gctagctagctactatcatcga 426 22 0 45.45 57.437 34.38 0.00 46.11 4.563 517 tgactgatacgcgatgctagct 474 22 0 50.00 62.569 17.69 1.35 0.00 4.569 518 agctgactgatacgcgatgcta 471 22 0 50.00 62.569 7.57 0.00 0.00 4.569 519 tagctgactgatacgcgatgct 470 22 0 50.00 62.569 10.87 8.44 0.00 4.569 520 atcgatcgatgctagtatgcta 326 22 0 40.91 57.423 29.65 0.00 33.56 4.577 521 ctagctagctgatcatcatcgat 509 23 0 43.48 58.422 11.68 0.00 0.00 4.578 522 agctgactgatcgatcgatgct 112 22 0 50.00 62.580 26.44 23.13 35.21 4.580 523 ctagctagctgatcatcgatgcta 188 24 0 45.83 60.596 16.78 15.81 0.00 4.596 524 gtgatgcatgctagtagtgatgta 29 24 0 41.67 59.398 11.60 8.84 0.00 4.602 525 gctgatcatcatcgatgctagct 516 23 0 47.83 61.603 20.15 8.14 40.32 4.603 526 agctgatcatcatcgatgctagc 515 23 0 47.83 61.603 20.04 19.26 40.32 4.603 527 gctagctgatcatcatcgatgct 512 23 0 47.83 61.603 14.14 8.34 40.32 4.603 528 agctagctgatcatcatcgatgc 511 23 0 47.83 61.603 21.42 7.40 40.32 4.603 529 tagtgatgcatgctagtagtga 27 22 0 40.91 57.391 0.01 0.00 0.00 4.609 530 ctactagctagctgactgatacg 462 23 0 47.83 58.387 3.12 0.00 0.00 4.613 531 tagctactgatcgatgctacatc 306 23 0 43.48 58.368 13.79 0.00 37.97 4.632 532 gactgatacgcgatgctagctag 475 23 0 52.17 61.633 17.46 17.46 0.00 4.633 533 ctagctactgatcgatgctacat 305 23 0 43.48 58.364 13.79 0.09 0.00 4.636 534 gctagctactatcatctctgcgc 352 23 0 52.17 61.644 8.21 0.00 0.00 4.644 535 gctagctagctactgatcgatgc 300 23 0 52.17 61.644 34.38 12.71 46.11 4.644 536 gctactagctagctgatcatcat 505 23 0 43.48 58.350 14.37 0.00 44.92 4.650 537 gctactagctagctgatcatcat 208 23 0 43.48 58.350 14.37 0.00 44.92 4.650 538 ctagctactgatcgatgctacatc 305 24 0 45.83 59.349 13.79 0.00 37.97 4.651 539 gctactagctagctgatcatcatc 505 24 0 45.83 59.343 14.37 0.00 44.92 4.657 540 gctactagctagctgatcatcatc 208 24 0 45.83 59.343 14.37 0.00 44.92 4.657 541 gctgatcatcatctagctagtagc 154 24 0 45.83 59.343 15.25 15.25 45.79 4.657 542 tagctagctgatcatcatcgat 510 22 0 40.91 57.329 10.14 0.00 0.00 4.671 543 ctactatcatctctgcgcgatcg 357 23 0 52.17 61.686 12.19 12.19 39.07 4.686 544 tactagctagctgactgatacg 463 22 0 45.45 57.310 13.17 0.00 0.00 4.690 545 gctgatcgatcgatgctagctag 398 23 0 52.17 61.697 27.88 18.22 35.21 4.697 546 ctagctgatcgatcgatgctagc 395 23 0 52.17 61.697 38.64 35.38 43.05 4.697 547 gctagctgatcgatcgatgctag 394 23 0 52.17 61.697 41.07 41.07 46.89 4.697 548 ctagctagctgatcgatcgatgc 391 23 0 52.17 61.697 24.08 21.09 35.21 4.697 549 gctagctagctgatcgatcgatg 390 23 0 52.17 61.697 34.38 11.03 46.11 4.697 550 gctagctagctgatcgatcgatg 70 23 0 52.17 61.697 34.38 11.03 46.11 4.697 551 gctactagctagctgactgata 461 22 0 45.45 57.286 15.96 3.69 44.92 4.714 552 gatcgatcatcatgctagctac 272 22 0 45.45 57.284 21.11 0.00 0.00 4.716 553 cgatgctagctaggcgat 408 18 0 55.56 57.277 10.81 3.01 0.00 4.723 554 atcgatgctagctaggcg 406 18 0 55.56 57.277 15.59 9.02 0.00 4.723 555 tagctactgatcgatgctacat 306 22 0 40.91 57.270 13.79 0.09 0.00 4.730 556 gctagctactatcatcgatcgat 430 23 0 43.48 58.251 25.37 25.37 35.13 4.749 557 tgcatgctagtagtgatgtatacg 33 24 0 41.67 59.224 20.79 0.00 0.00 4.776 558 gcatgctagtagtgatgtatacgt 34 24 0 41.67 59.223 11.60 0.00 0.00 4.777 559 atttagctagctgactgatcgatc 256 24 0 41.67 59.219 19.32 19.32 0.00 4.781 560 gactgatcgatcatcatgctag 268 22 0 45.45 57.215 24.51 15.87 41.77 4.785 561 atttagctagctgactgatcgat 256 23 0 39.13 58.215 4.16 0.00 0.00 4.785 562 gctgactgatcgatcatcatgct 265 23 0 47.83 61.788 27.72 15.10 41.77 4.788 563 agctgactgatcgatcatcatgc 264 23 0 47.83 61.788 27.74 27.74 41.77 4.788 564 tagctactatcatctctgcgcga 354 23 0 47.83 61.796 2.71 2.71 0.00 4.796 565 gctgatcatcgatgctactagcta 195 24 0 45.83 60.834 20.91 7.37 45.92 4.834 566 tagctgatcatcgatgctactagc 193 24 0 45.83 60.834 20.78 20.78 45.61 4.834 567 gctagctgatcatcgatgctacta 191 24 0 45.83 60.834 11.65 8.83 0.00 4.834 568 tagctagctgatcatcgatgctac 189 24 0 45.83 60.834 17.82 12.06 0.00 4.834 569 tagtgatgcatgctagtagtgatg 27 24 0 41.67 59.155 11.56 7.49 0.00 4.845 570 agtgatgcatgctagtagtgatgt 28 24 0 41.67 60.846 11.60 0.00 0.00 4.846 571 tgatgcatgctagtagtgatgta 30 23 0 39.13 58.147 11.60 8.84 0.00 4.853 572 ctgactgatcgatcgatgctagc 114 23 0 52.17 61.878 18.17 12.52 35.21 4.878 573 gctgactgatcgatcgatgctag 113 23 0 52.17 61.878 22.81 19.44 35.21 4.878 574 ctagctgactgatcgatcgatgc 110 23 0 52.17 61.878 24.08 19.43 35.21 4.878 575 gctagctgactgatcgatcgatg 109 23 0 52.17 61.878 23.05 13.21 35.21 4.878 576 tcatcatcgatgctagctagtag 521 23 0 43.48 58.114 2.81 0.00 40.32 4.886 577 tactagctagctgatcatcatcg 507 23 0 43.48 58.114 0.00 0.00 0.00 4.886 578 tcgatcatcatgctagctactag 274 23 0 43.48 58.114 0.00 0.00 37.62 4.886 579 tgatcatcgatgctactagctag 197 23 0 43.48 58.114 20.04 20.04 45.92 4.886 580 ctgatcatcgatgctactagcta 196 23 0 43.48 58.114 10.86 0.00 45.92 4.886 581 tagctgatcatcgatgctactag 193 23 0 43.48 58.114 13.67 9.68 0.00 4.886 582 ctagctgatcatcgatgctacta 192 23 0 43.48 58.114 11.65 8.83 0.00 4.886 583 ctactagctagctgatcatcatcg 506 24 0 45.83 59.110 1.08 0.00 0.00 4.890 584 ctgatcatcgatgctactagctag 196 24 0 45.83 59.110 20.04 20.04 45.92 4.890 585 ctagctgatcatcgatgctactag 192 24 0 45.83 59.110 15.68 15.68 0.00 4.890 586 gctagctagctgatcatcatctag 146 24 0 45.83 59.102 34.38 13.13 44.71 4.898 587 gctagctagctgatcatcatcta 146 23 0 43.48 58.097 34.38 0.00 46.11 4.903 588 ctagtgatgcatgctagtagtg 26 22 0 45.45 57.072 20.00 3.96 0.00 4.928 589 gctactatcatctctgcgcgatc 356 23 0 52.17 61.936 4.99 0.00 0.00 4.936 590 gctgatcgatcgatgtgc 78 18 0 55.56 57.052 29.71 26.38 35.21 4.948 591 tagctagctactatcatcgatcga 428 24 0 41.67 59.031 27.80 22.52 0.00 4.969 592 agctagctgatcgatcgtagcg 562 22 0 54.55 62.971 27.20 18.31 0.00 4.971 593 tgactgatacgcgatgct 474 18 0 50.00 57.028 2.33 0.00 0.00 4.972 594 gatcatcatcgatgctagctag 519 22 0 45.45 57.019 17.46 17.46 40.32 4.981 595 tcatcatcgatgctagctagta 521 22 0 40.91 57.005 22.18 18.77 40.32 4.995 596 tcgatcatcatgctagctacta 274 22 0 40.91 57.005 0.00 0.00 0.00 4.995 597 tgatcatcgatgctactagcta 197 22 0 40.91 57.005 17.14 1.01 45.92 4.995 598 tagctgatcatcgatgctacta 193 22 0 40.91 57.005 12.62 8.42 0.00 4.995 599 tagctagctgactgatacgcgat 466 23 0 47.83 62.044 28.29 0.00 0.00 5.044 600 ctagctagctactatcatcgatcga 427 25 0 44.00 59.949 27.80 22.52 0.00 5.051 601 agctagctgactgatcgatcgat 108 23 0 47.83 62.053 30.53 30.53 37.90 5.053 602 ctactagctagctgactgatacgc 462 24 0 50.00 61.062 3.61 0.00 0.00 5.062 603 gctactagctagctgactgatacg 461 24 0 50.00 61.062 14.37 0.00 44.92 5.062 604 tgatcatcatcgatgctagctagta 518 25 0 40.00 60.062 22.18 18.77 40.32 5.062 605 tgatcgatcatcatgctagctacta 271 25 0 40.00 60.062 27.48 0.00 37.38 5.062 606 ctagtgatgcatgctagtagtgatg 26 25 0 44.00 60.064 20.00 7.49 0.00 5.064 607 gctagctagctactatcatcgatc 426 24 0 45.83 58.932 34.38 4.20 46.11 5.068 608 gctagctactgatcgatgctacat 304 24 0 45.83 61.072 11.21 0.00 0.00 5.072 609 gctagctagctactatcatcgat 426 23 0 43.48 57.922 34.38 0.00 46.11 5.078 610 ctagtgatgcatgctagtagtgat 26 24 0 41.67 58.911 20.00 4.64 0.00 5.089 611 tactatcatctctgcgcgatcga 358 23 0 47.83 62.092 22.07 1.72 38.48 5.092 612 agctgatcgatcgatgctagcta 397 23 0 47.83 62.111 31.26 14.51 40.03 5.111 613 tagctgatcgatcgatgctagct 396 23 0 47.83 62.111 33.22 33.22 42.08 5.111 614 agctagctgatcgatcgatgcta 393 23 0 47.83 62.111 34.11 32.56 36.80 5.111 615 tagctagctgatcgatcgatgct 392 23 0 47.83 62.111 33.87 33.38 38.16 5.111 616 tagtgatgcatgctagtagtgat 27 23 0 39.13 57.886 11.56 0.00 0.00 5.114 617 tactagctagctgatcatcatcgat 507 25 0 40.00 59.828 0.00 0.00 0.00 5.172 618 gctagctagctgatcatcgatgc 187 23 0 52.17 62.193 34.38 9.22 46.11 5.193 619 gctagtgatgcatgctagtagtga 25 24 0 45.83 61.195 24.96 4.57 0.00 5.195 620 aaagcatcggattagctagctgat 1 24 0 41.67 61.209 17.84 15.13 0.00 5.209 621 gtgatgcatgctagtagtgatgtat 29 25 0 40.00 59.774 1.07 1.07 0.00 5.226 622 ctatcatctctgcgcgatcgatg 360 23 0 52.17 62.227 18.01 18.01 38.48 5.227 623 tgactgatacgcgatgctagcta 474 23 0 47.83 62.287 17.69 3.08 0.00 5.287 624 tagctgactgatacgcgatgcta 470 23 0 47.83 62.287 12.64 9.09 0.00 5.287 625 tgctagtagtgatgtatacgtagct 37 25 0 40.00 59.713 9.37 8.73 0.00 5.287 626 tgactgatcgatcgatgctagct 115 23 0 47.83 62.296 20.19 11.59 35.21 5.296 627 agctgactgatcgatcgatgcta 112 23 0 47.83 62.296 26.44 14.64 35.21 5.296 628 tagctgactgatcgatcgatgct 111 23 0 47.83 62.296 31.98 30.27 35.21 5.296 629 ctagctagctactatcatcgatcg 427 24 0 45.83 58.703 12.49 9.87 0.00 5.297 630 tagctagctactatcatcgatcg 428 23 0 43.48 57.691 27.80 9.87 0.00 5.309 631 gactgatcgatcatcatgctagct 268 24 0 45.83 61.313 24.51 7.81 41.77 5.313 632 gctagctgactgatcgatcatcat 261 24 0 45.83 61.313 26.31 20.43 41.77 5.313 633 ctatttagctagctgactgatcga 254 24 0 41.67 58.679 0.00 0.00 0.00 5.321 634 gcatgctagtagtgatgtatacg 34 23 0 43.48 57.659 11.60 0.00 0.00 5.341 635 tatttagctagctgactgatcga 255 23 0 39.13 57.650 0.00 0.00 0.00 5.350 636 ctactagctagctgatcatcatcga 506 25 0 44.00 60.352 1.08 0.00 0.00 5.352 637 agctactatcatctctgcgcgat 355 23 0 47.83 62.360 4.99 2.52 0.00 5.360 638 gctgatcatcatcgatgctagcta 516 24 0 45.83 61.370 20.15 8.49 40.32 5.370 639 tagctgatcatcatcgatgctagc 514 24 0 45.83 61.370 20.04 19.26 40.32 5.370 640 gctagctgatcatcatcgatgcta 512 24 0 45.83 61.370 14.58 9.63 40.32 5.370 641 tagctagctgatcatcatcgatgc 510 24 0 45.83 61.370 21.42 7.40 40.32 5.370 642 atgcatgctagtagtgatgtatacg 32 25 0 40.00 59.604 11.70 0.00 0.00 5.396 643 tgatgcatgctagtagtgatgtat 30 24 0 37.50 58.592 12.66 12.66 0.00 5.408 644 gactgatcgatcgatgctagctag 116 24 0 50.00 61.409 18.04 17.46 35.21 5.409 645 gctatttagctagctgactgatc 253 23 0 43.48 57.572 7.27 0.00 46.11 5.428 646 tgctagtgatgcatgctagtagtg 24 24 0 45.83 61.434 24.96 10.54 35.89 5.434 647 ctagctagctactatcatctctgc 349 24 0 45.83 58.562 27.80 0.00 0.00 5.438 648 gctagctagctactatcatctctg 348 24 0 45.83 58.562 34.38 6.79 46.11 5.438 649 gatcatcatcgatgctagctagta 519 24 0 41.67 58.557 22.18 18.77 40.32 5.443 650 gatcgatcatcatgctagctacta 272 24 0 41.67 58.557 21.11 0.00 0.00 5.443 651 atcatcatcgatgctagctagtag 520 24 0 41.67 58.554 2.13 0.00 40.32 5.446 652 atcgatcatcatgctagctactag 273 24 0 41.67 58.554 0.00 0.00 37.62 5.446 653 tagctagctactatcatctctgc 350 23 0 43.48 57.527 27.80 0.00 0.00 5.473 654 atcatcatcgatgctagctagta 520 23 0 39.13 57.514 22.18 18.77 40.32 5.486 655 atcgatcatcatgctagctacta 273 23 0 39.13 57.514 0.00 0.00 0.00 5.486 656 gatcatcatcgatgctagctagtag 519 25 0 44.00 59.494 0.21 0.00 40.32 5.506 657 gatcgatcatcatgctagctactag 272 25 0 44.00 59.494 21.11 0.00 37.62 5.506 658 actagctagctgatcatcatctact 211 25 0 40.00 59.471 22.43 6.99 0.00 5.529 659 tgactgatcgatcatcatgctagc 267 24 0 45.83 61.547 26.79 14.13 41.77 5.547 660 gctgactgatcgatcatcatgcta 265 24 0 45.83 61.547 27.72 16.42 41.77 5.547 661 tagctgactgatcgatcatcatgc 263 24 0 45.83 61.547 27.74 27.74 41.77 5.547 662 tgctagtagtgatgtatacgtagc 37 24 0 41.67 58.446 4.93 4.93 0.00 5.554 663 ctagctagctgactgatacgcga 465 23 0 52.17 62.571 14.90 0.00 0.00 5.571 664 tagctagctactatcatcgatcgat 428 25 0 40.00 59.423 27.80 25.37 35.13 5.577 665 gctactagctagctgatcatcatct 208 25 0 44.00 60.585 14.37 0.00 44.92 5.585 666 agctgatcatcatctagctagtagc 153 25 0 44.00 60.585 15.25 15.25 40.45 5.585 667 ctagctagctgatcgatcgatgtg 71 24 0 50.00 61.642 11.68 4.94 35.21 5.642 668 agtgatgcatgctagtagtgatgta 28 25 0 40.00 60.646 11.60 8.84 0.00 5.646 669 tagtgatgcatgctagtagtgatgt 27 25 0 40.00 60.646 11.60 0.00 0.00 5.646 670 actatcatctctgcgcgatcgat 359 23 0 47.83 62.652 22.07 11.47 38.48 5.652 671 ctatttagctagctgactgatcg 254 23 0 43.48 57.339 0.00 0.00 0.00 5.661 672 tagctagctgatcgatcgtagcg 561 23 0 52.17 62.677 27.20 18.31 0.00 5.677 673 gcatcggattagctagctgatgc 4 23 0 52.17 62.687 34.10 34.10 41.15 5.687 674 tgcatgctagtagtgatgtatacgt 33 25 0 40.00 60.700 20.79 0.00 0.00 5.700 675 tttagctagctgactgatcgatcat 257 25 0 40.00 60.702 26.67 18.02 36.62 5.702 676 atttagctagctgactgatcgatca 256 25 0 40.00 60.702 26.99 26.99 35.44 5.702 677 gctagctagctactatcatctct 348 23 0 43.48 57.266 34.38 0.00 46.11 5.734 678 aagcatcggattagctagctgatg 2 24 0 45.83 61.794 27.81 27.81 33.28 5.794 679 agtgatgtatacgtagctagtagc 44 24 0 41.67 58.201 15.25 15.25 45.79 5.799 680 gctagtagtgatgtatacgtagct 38 24 0 41.67 58.201 5.92 5.92 0.00 5.799 681 tagctagctgactgatcgatcgat 107 24 0 45.83 61.800 30.53 30.53 37.90 5.800 682 actagctagctgactgatacgcg 464 23 0 52.17 62.816 21.52 3.89 0.00 5.816 683 actagctagctgatcatcatctac 211 24 0 41.67 58.178 22.43 0.00 0.00 5.822 684 tagctgatcgatcgatgctagcta 396 24 0 45.83 61.857 34.98 33.55 41.05 5.857 685 tagctagctgatcgatcgatgcta 392 24 0 45.83 61.857 34.11 32.56 36.80 5.857 686 tatttagctagctgactgatcgat 255 24 0 37.50 58.112 1.68 0.00 0.00 5.888 687 gcatgctagtagtgatgtatacgta 34 25 0 40.00 59.089 11.60 0.00 0.00 5.911 688 tatttagctagctgactgatcgatc 255 25 0 40.00 59.084 19.32 19.32 0.00 5.916 689 ctatttagctagctgactgatcgat 254 25 0 40.00 59.082 0.00 0.00 0.00 5.918 690 ctagctagctactatcatctctgcg 349 25 0 48.00 60.920 27.80 5.75 0.00 5.920 691 tgatcgatcgatgctagctaggc 400 23 0 52.17 62.955 26.44 12.49 35.21 5.955 692 agctagctactgatcgatgctaca 303 24 0 45.83 61.988 17.56 3.03 0.00 5.988 693 tgactgatcgatcgatgctagcta 115 24 0 45.83 62.034 20.19 11.16 35.21 6.034 694 tagctgactgatcgatcgatgcta 111 24 0 45.83 62.034 33.43 30.74 35.21 6.034 695 catgctagtagtgatgtatacgtagc 35 26 0 42.31 59.961 4.93 4.93 0.00 6.039 696 gcatgctagtagtgatgtatacgtag 34 26 0 42.31 59.961 11.60 0.00 0.00 6.039 697 actgatcgatcgatgctagctagt 117 24 0 45.83 62.039 23.29 15.07 35.21 6.039 698 ctatttagctagctgactgatcgatc 254 26 0 42.31 59.960 19.32 19.32 0.00 6.040 699 ttagctagctgactgatcgatcatc 258 25 0 44.00 61.041 28.29 21.92 36.62 6.041 700 atgctagtagtgatgtatacgtagct 36 26 0 38.46 60.068 9.37 8.73 0.00 6.068 701 ctagctagctgatcatcatctact 212 24 0 41.67 57.930 11.68 6.99 0.00 6.070 702 ctactagctagctgatcatcatct 209 24 0 41.67 57.930 1.08 0.00 0.00 6.070 703 agctgatcatcatctagctagtag 153 24 0 41.67 57.930 7.49 3.73 40.45 6.070 704 ctagctgatcatcatctagctagt 151 24 0 41.67 57.930 21.70 5.56 46.15 6.070 705 tagctactatcatctctgcgcgat 354 24 0 45.83 62.096 4.99 2.52 0.00 6.096 706 gactgatcgatcatcatgctagcta 268 25 0 44.00 61.099 24.51 4.57 41.77 6.099 707 ctgatcatcatcgatgctagctagt 517 25 0 44.00 61.101 22.18 3.56 40.32 6.101 708 actagctagctgatcatcatcgatg 508 25 0 44.00 61.101 22.43 20.23 41.48 6.101 709 ctgatcgatcatcatgctagctact 270 25 0 44.00 61.101 26.67 0.00 41.77 6.101 710 atgctagtagtgatgtatacgtagc 36 25 0 40.00 58.855 4.93 4.93 0.00 6.145 711 ctagctagctactgatcgatgctac 301 25 0 48.00 61.145 14.00 7.81 0.00 6.145 712 gctagctagctactatcatctctgc 348 25 0 48.00 61.152 34.38 11.74 46.11 6.152 713 agctagctgatcatcatctactatca 214 26 0 38.46 59.840 17.99 0.00 0.00 6.160 714 ctgatcgatcgatgctagctagtag 118 25 0 48.00 61.197 19.70 5.49 35.21 6.197 715 agctagctgactgatcgatcatca 260 24 0 45.83 62.232 26.49 26.49 39.98 6.232 716 gctagctagctactatcatcgatcg 426 25 0 48.00 61.252 34.38 9.87 46.11 6.252 717 gctatttagctagctgactgatcga 253 25 0 44.00 61.268 7.27 0.00 46.11 6.268 718 ctagctagctactatcatcgatcgat 427 26 0 42.31 60.291 27.80 25.37 35.13 6.291 719 agctgatcatcgatgctactagct 194 24 0 45.83 62.294 24.11 23.60 45.92 6.294 720 agctagctgatcatcgatgctact 190 24 0 45.83 62.294 17.99 10.88 0.00 6.294 721 ctagctagctgactgatcgatcga 106 24 0 50.00 62.312 22.52 22.52 0.00 6.312 722 actgatcgatcatcatgctagctac 269 25 0 44.00 61.328 26.67 0.00 41.77 6.328 723 tgatgcatgctagtagtgatgtatac 30 26 0 38.46 59.623 9.19 6.43 0.00 6.377 724 gtgatgcatgctagtagtgatgtata 29 26 0 38.46 59.623 4.23 0.00 0.00 6.377 725 tactatcatctctgcgcgatcgat 358 24 0 45.83 62.379 22.07 11.47 38.48 6.379 726 gctagctgatcatcatctactatca 215 25 0 40.00 58.607 8.21 0.00 0.00 6.393 727 gctactagctagctgatcatcatcta 208 26 0 42.31 60.404 14.37 0.00 44.92 6.404 728 tagctgatcatcatctagctagtagc 152 26 0 42.31 60.404 15.25 15.25 41.48 6.404 729 tgctagtagtgatgtatacgtagcta 37 26 0 38.46 59.564 10.00 8.05 0.00 6.436 730 gatgcatgctagtagtgatgtatacg 31 26 0 42.31 60.453 7.40 0.00 0.00 6.453 731 tagtgatgcatgctagtagtgatgta 27 26 0 38.46 60.461 11.60 8.84 0.00 6.461 732 gctagtgatgcatgctagtagtgat 25 25 0 44.00 61.506 24.96 8.51 0.00 6.506 733 tgcatgctagtagtgatgtatacgta 33 26 0 38.46 60.515 20.79 0.00 0.00 6.515 734 tatttagctagctgactgatcgatca 255 26 0 38.46 60.516 26.99 26.99 35.44 6.516 735 tgatgcatgctagtagtgatgtata 30 25 0 36.00 58.479 4.13 0.00 0.00 6.521 736 tactagctagctgactgatacgcg 463 24 0 50.00 62.538 13.17 3.89 0.00 6.538 737 ctagctactatcatctctgcgcga 353 24 0 50.00 62.603 2.71 2.71 0.00 6.603 738 agctagctgatcatcatctactatc 214 25 0 40.00 58.369 17.99 0.00 0.00 6.631 739 agctagctgatcatcatctactat 214 24 0 37.50 57.345 17.99 0.00 0.00 6.655 740 gctactagctagctgatcatcatcg 505 25 0 48.00 61.656 14.37 0.00 44.92 6.656 741 gctgatcatcgatgctactagctag 195 25 0 48.00 61.656 20.91 20.04 45.92 6.656 742 ctagctgatcatcgatgctactagc 192 25 0 48.00 61.656 20.78 20.78 45.61 6.656 743 gctagctgatcatcgatgctactag 191 25 0 48.00 61.656 20.13 20.13 0.00 6.656 744 ctagctagctgatcatcgatgctac 188 25 0 48.00 61.656 17.82 12.06 0.00 6.656 745 actagctagctgatcatcatctacta 211 26 0 38.46 59.328 22.43 8.11 0.00 6.672 746 tactagctagctgatcatcatctact 210 26 0 38.46 59.328 6.99 6.99 0.00 6.672 747 ctactagctagctgatcatcatcgat 506 26 0 42.31 60.681 1.08 0.00 0.00 6.681 748 tagctagctactgatcgatgctaca 302 25 0 44.00 61.746 27.80 5.02 0.00 6.746 749 gtagtgatgtatacgtagctagtagc 42 26 0 42.31 59.249 15.25 15.25 45.79 6.751 750 actgatcgatcgatgctagctagta 117 25 0 44.00 61.797 23.29 18.77 35.21 6.797 751 gatgcatgctagtagtgatgtatac 31 25 0 40.00 58.175 20.79 1.70 0.00 6.825 752 agctgatcatcatcgatgctagct 515 24 0 45.83 62.835 23.00 22.41 41.74 6.835 753 agctagctgatcatcatcgatgct 511 24 0 45.83 62.835 17.99 8.34 40.32 6.835 754 ctagctagctgactgatacgcgat 465 24 0 50.00 62.838 14.90 0.00 0.00 6.838 755 atgcatgctagtagtgatgtatac 32 24 0 37.50 57.161 11.70 0.53 0.00 6.839 756 agctagctactatcatctctgcgc 351 24 0 50.00 62.858 17.56 0.00 0.00 6.858 757 gctagctagctactgatcgatgct 300 24 0 50.00 62.858 34.38 11.51 46.11 6.858 758 ctactatcatctctgcgcgatcga 357 24 0 50.00 62.878 22.07 1.72 38.48 6.878 759 gctagctactgatcgatgctacatc 304 25 0 48.00 61.879 11.21 4.40 37.97 6.879 760 tagtgatgtatacgtagctagtagc 43 25 0 40.00 58.104 15.25 15.25 45.79 6.896 761 gctagtagtgatgtatacgtagcta 38 25 0 40.00 58.104 7.24 5.34 0.00 6.896 762 tgatcatcatcgatgctagctagtag 518 26 0 42.31 60.902 14.93 0.00 40.32 6.902 763 ctgatcatcatcgatgctagctagta 517 26 0 42.31 60.902 22.18 18.77 40.32 6.902 764 tactagctagctgatcatcatcgatg 507 26 0 42.31 60.902 20.23 20.23 41.48 6.902 765 tgatcgatcatcatgctagctactag 271 26 0 42.31 60.902 27.48 0.00 37.38 6.902 766 ctgatcgatcatcatgctagctacta 270 26 0 42.31 60.902 26.67 1.37 41.77 6.902 767 agctgatcgatcgatgctagctag 397 24 0 50.00 62.904 31.26 19.90 40.03 6.904 768 ctagctgatcgatcgatgctagct 395 24 0 50.00 62.904 35.51 33.22 43.05 6.904 769 agctagctgatcgatcgatgctag 393 24 0 50.00 62.904 41.07 41.07 46.89 6.904 770 ctagctagctgatcgatcgatgct 391 24 0 50.00 62.904 33.87 33.38 38.16 6.904 771 tactagctagctgatcatcatctac 210 25 0 40.00 58.081 0.00 0.00 0.00 6.919 772 gctagctgatcatcatctactatc 215 24 0 41.67 57.062 8.21 0.00 0.00 6.938 773 agtgatgcatgctagtagtgatgtat 28 26 0 38.46 60.969 1.07 1.07 0.00 6.969 774 gctagtagtgatgtatacgtagctag 38 26 0 42.31 59.027 8.99 8.99 0.00 6.973 775 tagctagctgactgatcgatcatca 259 25 0 44.00 61.981 28.29 26.49 39.98 6.981 776 ctactagctagctgatcatcatctac 209 26 0 42.31 59.015 1.08 0.00 0.00 6.985 777 agtagtgatgtatacgtagctagt 41 24 0 37.50 57.012 8.68 8.68 0.00 6.988 778 gctagctgatcatcatctactatcat 215 26 0 38.46 59.001 8.21 0.00 0.00 6.999 779 agctgatcatcatctactatcatca 218 25 0 36.00 57.993 0.00 0.00 0.00 7.007 780 atgcatgctagtagtgatgtatacgt 32 26 0 38.46 61.018 11.70 0.00 0.00 7.018 781 atttagctagctgactgatcgatcat 256 26 0 38.46 61.022 26.67 18.02 36.62 7.022 782 agctgatcatcgatgctactagcta 194 25 0 44.00 62.040 24.59 9.79 45.92 7.040 783 tagctgatcatcgatgctactagct 193 25 0 44.00 62.040 27.00 27.00 45.92 7.040 784 agctagctgatcatcgatgctacta 190 25 0 44.00 62.040 17.99 11.59 0.00 7.040 785 tagctagctgatcatcgatgctact 189 25 0 44.00 62.040 17.55 15.53 0.00 7.040 786 atgctagtagtgatgtatacgtagcta 36 27 0 37.04 59.911 10.00 8.05 0.00 7.089 787 gctagctgatcatcatctactatcatc 215 27 0 40.74 59.861 8.21 0.00 0.00 7.139 788 ctagctagctgatcatcatctacta 212 25 0 40.00 57.842 11.68 8.11 0.00 7.158 789 ctactagctagctgatcatcatcta 209 25 0 40.00 57.842 1.08 0.00 0.00 7.158 790 tagctgatcatcatctagctagtag 152 25 0 40.00 57.842 13.40 3.73 41.48 7.158 791 ctagctgatcatcatctagctagta 151 25 0 40.00 57.842 21.70 7.13 46.15 7.158 792 gctgatcatcatcgatgctagctag 516 25 0 48.00 62.165 20.15 17.46 40.32 7.165 793 ctagctgatcatcatcgatgctagc 513 25 0 48.00 62.165 19.27 19.26 41.96 7.165 794 gctagctgatcatcatcgatgctag 512 25 0 48.00 62.165 23.70 23.70 45.51 7.165 795 ctagctagctgatcatcatcgatgc 509 25 0 48.00 62.165 21.42 7.40 40.32 7.165 796 agctagctgatcatcatctactatcat 214 27 0 37.04 60.181 17.99 0.00 0.00 7.181 797 ctactagctagctgatcatcatctact 209 27 0 40.74 60.181 6.99 6.99 0.00 7.181 798 ctagctgatcatcatctagctagtag 151 26 0 42.31 58.789 21.70 10.73 46.15 7.211 799 aaagcatcggattagctagctgatg 1 25 0 44.00 62.249 27.81 27.81 33.28 7.249 800 agctagctactgatcgatgctacat 303 25 0 44.00 62.272 17.56 6.16 0.00 7.272 801 tagctagctgatcatcatctactatca 213 27 0 37.04 59.689 8.31 0.00 0.00 7.311 802 actagctagctgatcatcatctactat 211 27 0 37.04 59.688 22.43 2.36 0.00 7.312 803 ctgactgatcgatcatcatgctagc 266 25 0 48.00 62.333 20.99 8.86 41.77 7.333 804 gctgactgatcgatcatcatgctag 265 25 0 48.00 62.333 27.72 21.73 41.77 7.333 805 ctagctgactgatcgatcatcatgc 262 25 0 48.00 62.333 27.74 27.74 41.77 7.333 806 gctagctgactgatcgatcatcatg 261 25 0 48.00 62.333 22.70 19.51 41.77 7.333 807 tgctagtagtgatgtatacgtagctag 37 27 0 40.74 60.395 8.99 8.99 0.00 7.395 808 agtagtgatgtatacgtagctagtagc 41 27 0 40.74 60.395 15.25 15.25 45.79 7.395 809 gctagtagtgatgtatacgtagctagt 38 27 0 40.74 60.395 15.55 15.55 0.00 7.395 810 ctagtgatgcatgctagtagtgatgt 26 26 0 42.31 61.460 20.00 0.00 0.00 7.460 811 gctgatcatcatctactatcatcatca 219 27 0 37.04 59.533 0.00 0.00 0.00 7.467 812 agctagctgactgatcgatcatcat 260 25 0 44.00 62.507 26.31 20.43 41.77 7.507 813 tttagctagctgactgatcgatcatc 257 26 0 42.31 61.507 23.93 21.92 36.62 7.507 814 catgctagtagtgatgtatacgtag 35 25 0 40.00 57.441 4.74 0.00 0.00 7.559 815 agctgatcatcatcgatgctagcta 515 25 0 44.00 62.561 23.50 10.90 43.19 7.561 816 tagctgatcatcatcgatgctagct 514 25 0 44.00 62.561 26.21 26.21 44.79 7.561 817 agctagctgatcatcatcgatgcta 511 25 0 44.00 62.561 17.99 9.63 40.32 7.561 818 tagctagctgatcatcatcgatgct 510 25 0 44.00 62.561 14.14 10.38 40.32 7.561 819 gctatttagctagctgactgatcgat 253 26 0 42.31 61.564 7.27 0.00 46.11 7.564 820 ctagctagctgactgatcgatcgat 106 25 0 48.00 62.579 30.53 30.53 37.90 7.579 821 agctgatcatcatctactatcatcat 218 26 0 34.62 58.415 0.00 0.00 0.00 7.585 822 tagctagctactatcatctctgcgc 350 25 0 48.00 62.587 27.80 0.00 0.00 7.587 823 gctagctagctactgatcgatgcta 300 25 0 48.00 62.587 34.38 12.23 46.11 7.587 824 tgctagtgatgcatgctagtagtga 24 25 0 44.00 62.622 24.96 13.57 35.89 7.622 825 tagctgatcgatcgatgctagctag 396 25 0 48.00 62.632 33.71 21.46 41.05 7.632 826 ctagctgatcgatcgatgctagcta 395 25 0 48.00 62.632 35.51 32.61 43.05 7.632 827 tagctagctgatcgatcgatgctag 392 25 0 48.00 62.632 41.07 41.07 46.89 7.632 828 ctagctagctgatcgatcgatgcta 391 25 0 48.00 62.632 34.11 32.56 36.80 7.632 829 gtgatgcatgctagtagtgatgtatac 29 27 0 40.74 60.659 9.56 7.17 0.00 7.659 830 agctgatcatcatctactatcatcatc 218 27 0 37.04 59.314 0.00 0.00 0.00 7.686 831 tagctagctgatcatcatctactat 213 25 0 36.00 57.279 8.31 0.00 0.00 7.721 832 tagctagctgatcatcatctactatc 213 26 0 38.46 58.269 8.31 0.00 0.00 7.731 833 tgactgatcgatcatcatgctagct 267 25 0 44.00 62.733 26.79 10.55 41.77 7.733 834 agctgactgatcgatcatcatgcta 264 25 0 44.00 62.733 30.60 18.10 41.77 7.733 835 tagctgactgatcgatcatcatgct 263 25 0 44.00 62.733 32.31 32.31 41.77 7.733 836 ctagctagctgatcatcatctactat 212 26 0 38.46 58.265 9.41 0.00 0.00 7.735 837 agtgatgcatgctagtagtgatgtata 28 27 0 37.04 60.779 4.23 0.00 0.00 7.779 838 tagtgatgcatgctagtagtgatgtat 27 27 0 37.04 60.779 11.56 0.00 0.00 7.779 839 tgactgatcgatcgatgctagctag 115 25 0 48.00 62.800 20.19 17.46 35.21 7.800 840 ctgactgatcgatcgatgctagcta 114 25 0 48.00 62.800 20.19 11.97 35.21 7.800 841 tagctgactgatcgatcgatgctag 111 25 0 48.00 62.800 31.45 26.34 35.21 7.800 842 ctagctgactgatcgatcgatgcta 110 25 0 48.00 62.800 31.54 29.68 35.21 7.800 843 tagctagctgactgatcgatcgatg 107 25 0 48.00 62.800 28.29 13.21 35.21 7.800 844 gactgatcgatcgatgctagctagt 116 25 0 48.00 62.802 22.18 12.64 35.21 7.802 845 tactagctagctgatcatcatctacta 210 27 0 37.04 59.196 8.79 8.11 0.00 7.804 846 tagctgatcatcgatgctactagcta 193 26 0 42.31 61.805 28.86 27.39 45.92 7.805 847 tagctagctgatcatcgatgctacta 189 26 0 42.31 61.805 18.93 16.03 0.00 7.805 848 atgcatgctagtagtgatgtatacgta 32 27 0 37.04 60.828 11.70 0.00 0.00 7.828 849 tatttagctagctgactgatcgatcat 255 27 0 37.04 60.831 26.67 18.02 36.62 7.831 850 ctagctagctgatcatcatctactatc 212 27 0 40.74 59.162 9.41 0.06 0.00 7.838 851 tagctactatcatctctgcgcgatc 354 25 0 48.00 62.854 0.00 0.00 0.00 7.854 852 gctgatcatcatctactatcatcat 219 25 0 36.00 57.142 0.00 0.00 0.00 7.858 853 ctagctactatcatctctgcgcgat 353 25 0 48.00 62.859 4.99 2.52 0.00 7.859 854 gctgatcatcatctactatcatcatc 219 26 0 38.46 58.126 0.00 0.00 0.00 7.874 855 tagctagctactgatcgatgctacat 302 26 0 42.31 62.028 27.80 3.08 0.00 8.028 856 agtagtgatgtatacgtagctagtag 41 26 0 38.46 57.950 9.92 1.30 0.00 8.050 857 ctagtagtgatgtatacgtagctagt 39 26 0 38.46 57.950 15.52 15.52 0.00 8.050 858 catgctagtagtgatgtatacgtagct 35 27 0 40.74 61.089 9.37 8.73 0.00 8.089 859 gactgatcgatcatcatgctagctac 268 26 0 46.15 62.094 24.51 8.36 41.77 8.094 860 tagctgatcatcatctactatcatca 217 26 0 34.62 57.906 0.00 0.00 0.00 8.094 861 ctagctgatcatcatctactatcatca 216 27 0 37.04 58.826 0.00 0.00 0.00 8.174 862 ctagctgatcatcatctagctagtagc 151 27 0 44.44 61.196 21.70 15.25 46.15 8.196 863 tagctagctgactgatcgatcatcat 259 26 0 42.31 62.255 28.29 20.43 41.77 8.255 864 ctagtgatgcatgctagtagtgatgta 26 27 0 40.74 61.255 20.00 8.84 0.00 8.255 865 tgcatgctagtagtgatgtatacgtag 33 27 0 40.74 61.300 20.79 0.00 0.00 8.300 866 ctatttagctagctgactgatcgatca 254 27 0 40.74 61.304 26.99 26.99 35.44 8.304 867 tagctgatcatcatcgatgctagcta 514 26 0 42.31 62.307 28.23 26.63 43.19 8.307 868 tagctagctgatcatcatcgatgcta 510 26 0 42.31 62.307 14.58 11.03 40.32 8.307 869 gctagctagctactatcatcgatcga 426 26 0 46.15 62.381 34.38 22.52 46.11 8.381 870 gctactagctagctgatcatcatctac 208 27 0 44.44 61.407 14.37 0.00 44.92 8.407 871 ttagctagctgactgatcgatcatca 258 26 0 42.31 62.416 28.29 26.49 39.98 8.416 872 tgactgatcgatcatcatgctagcta 267 26 0 42.31 62.472 26.79 11.24 41.77 8.472 873 tagctgactgatcgatcatcatgcta 263 26 0 42.31 62.472 33.83 32.61 41.77 8.472 874 actgatcgatcatcatgctagctact 269 26 0 42.31 62.478 26.67 0.00 41.77 8.478 875 gctagtgatgcatgctagtagtgatg 25 26 0 46.15 62.484 24.96 9.07 0.00 8.484 876 ctagctagctactgatcgatgctaca 301 26 0 46.15 62.503 14.00 5.87 0.00 8.503 877 gactgatcgatcgatgctagctagta 116 26 0 46.15 62.543 22.18 18.77 35.21 8.543 878 actgatcgatcgatgctagctagtag 117 26 0 46.15 62.548 23.29 12.42 35.21 8.548 879 ctagctgatcatcatctactatcatc 216 26 0 38.46 57.395 0.00 0.00 0.00 8.605 880 ctgatcatcatcgatgctagctagtag 517 27 0 44.44 61.665 10.30 1.36 40.32 8.665 881 ctactagctagctgatcatcatcgatg 506 27 0 44.44 61.665 20.23 20.23 41.48 8.665 882 ctgatcgatcatcatgctagctactag 270 27 0 44.44 61.665 26.67 8.14 41.77 8.665 883 tagctgatcatcatctactatcatcat 217 27 0 33.33 58.315 0.00 0.00 0.00 8.685 884 tgatgcatgctagtagtgatgtatacg 30 27 0 40.74 61.778 9.81 0.00 0.00 8.778 885 gatgcatgctagtagtgatgtatacgt 31 27 0 40.74 61.779 7.40 0.00 0.00 8.779 886 gctactagctagctgatcatcatcga 505 26 0 46.15 62.779 14.37 0.00 44.92 8.779 887 agctgatcatcgatgctactagctag 194 26 0 46.15 62.784 24.59 20.04 45.92 8.784 888 ctagctgatcatcgatgctactagct 192 26 0 46.15 62.784 27.00 27.00 45.92 8.784 889 agctagctgatcatcgatgctactag 190 26 0 46.15 62.784 20.13 20.13 0.00 8.784 890 ctagctagctgatcatcgatgctact 188 26 0 46.15 62.784 17.55 15.53 0.00 8.784 891 atttagctagctgactgatcgatcatc 256 27 0 40.74 61.785 23.93 21.92 36.62 8.785 892 tctactatcatcatcatctactagct 230 26 0 34.62 57.155 0.00 0.00 0.00 8.845 893 tgctagtgatgcatgctagtagtgat 24 26 0 42.31 62.874 24.96 8.51 35.89 8.874 894 ctgatcatcatctactatcatcatca 220 26 0 34.62 57.026 0.00 0.00 0.00 8.974 895 agctagctactgatcgatgctacatc 303 26 0 46.15 62.999 17.56 7.89 37.97 8.999 896 tagtagtgatgtatacgtagctagtag 40 27 0 37.04 57.869 16.78 1.30 0.00 9.131 897 ctagtagtgatgtatacgtagctagta 39 27 0 37.04 57.869 16.85 15.97 0.00 9.131 898 actgatcgatcatcatgctagctacta 269 27 0 40.74 62.236 26.67 1.37 41.77 9.236 899 gcatgctagtagtgatgtatacgtagc 34 27 0 44.44 62.283 11.60 4.93 0.00 9.283 900 gctatttagctagctgactgatcgatc 253 27 0 44.44 62.291 19.32 19.32 46.11 9.291 901 atctactatcatcatcatctactagct 229 27 0 33.33 57.592 0.00 0.00 0.00 9.408 902 catctactatcatcatcatctactagc 228 27 0 37.04 57.549 0.00 0.00 0.00 9.451 903 tgatcatcatctactatcatcatcatc 221 27 0 33.33 57.467 0.00 0.00 0.00 9.533 904 tagctgatcatcgatgctactagctag 193 27 0 44.44 62.534 27.70 20.04 45.92 9.534 905 ctagctgatcatcgatgctactagcta 192 27 0 44.44 62.534 27.76 26.73 45.92 9.534 906 tagctagctgatcatcgatgctactag 189 27 0 44.44 62.534 20.13 20.13 0.00 9.534 907 ctagctagctgatcatcgatgctacta 188 27 0 44.44 62.534 17.74 15.95 0.00 9.534 908 ctgatcatcatctactatcatcatcat 220 27 0 33.33 57.462 0.00 0.00 0.00 9.538 909 gctagctagctactatcatcgatcgat 426 27 0 44.44 62.627 34.38 25.37 46.11 9.627 910 ttagctagctgactgatcgatcatcat 258 27 0 40.74 62.665 28.29 20.43 41.77 9.665 911 tagctagctactgatcgatgctacatc 302 27 0 44.44 62.742 27.80 7.89 37.97 9.742 912 ctagctagctactgatcgatgctacat 301 27 0 44.44 62.747 14.00 2.51 0.00 9.747 913 gatcatcatctactatcatcatcatct 222 27 0 33.33 57.242 0.00 0.00 0.00 9.758 914 tttagctagctgactgatcgatcatca 257 27 0 40.74 62.820 26.49 26.49 39.98 9.820 915 tctactatcatcatcatctactagcta 230 27 0 33.33 57.100 0.00 0.00 0.00 9.900 ================================================ FILE: samples/Formatted/wksst8110.for ================================================ Weekly SST data starts week centered on 3Jan1990 Nino1+2 Nino3 Nino34 Nino4 Week SST SSTA SST SSTA SST SSTA SST SSTA 03JAN1990 23.4-0.4 25.1-0.3 26.6 0.0 28.6 0.3 10JAN1990 23.4-0.8 25.2-0.3 26.6 0.1 28.6 0.3 17JAN1990 24.2-0.3 25.3-0.3 26.5-0.1 28.6 0.3 24JAN1990 24.4-0.5 25.5-0.4 26.5-0.1 28.4 0.2 31JAN1990 25.1-0.2 25.8-0.2 26.7 0.1 28.4 0.2 07FEB1990 25.8 0.2 26.1-0.1 26.8 0.1 28.4 0.3 14FEB1990 25.9-0.1 26.4 0.0 26.9 0.2 28.5 0.4 21FEB1990 26.1-0.1 26.7 0.2 27.1 0.3 28.9 0.8 28FEB1990 26.1-0.2 26.7-0.1 27.2 0.3 29.0 0.8 07MAR1990 26.7 0.3 26.7-0.2 27.3 0.2 28.9 0.7 14MAR1990 26.1-0.4 26.9-0.2 27.3 0.1 28.6 0.4 21MAR1990 26.1-0.2 27.2 0.0 27.6 0.3 28.7 0.5 28MAR1990 25.7-0.4 27.5 0.2 27.8 0.3 28.8 0.5 04APR1990 25.6-0.3 27.6 0.3 27.9 0.4 28.8 0.4 11APR1990 25.1-0.6 27.6 0.2 27.9 0.2 28.8 0.3 18APR1990 25.3 0.0 27.7 0.2 28.0 0.2 28.9 0.4 25APR1990 25.1 0.0 27.7 0.4 28.2 0.4 29.2 0.6 02MAY1990 24.6-0.2 27.6 0.3 28.1 0.3 29.0 0.4 09MAY1990 24.2-0.2 27.5 0.3 28.1 0.3 28.9 0.2 16MAY1990 24.3 0.1 27.4 0.3 28.0 0.2 28.8 0.1 23MAY1990 23.7-0.2 27.2 0.2 28.1 0.3 29.0 0.2 30MAY1990 23.4-0.1 27.1 0.3 27.9 0.2 28.9 0.1 06JUN1990 23.2 0.0 26.7 0.1 27.7 0.0 28.9 0.1 13JUN1990 22.8-0.2 26.6 0.1 27.7 0.0 29.0 0.1 20JUN1990 22.5-0.1 26.4 0.0 27.5-0.1 29.0 0.1 27JUN1990 22.1-0.3 26.0-0.1 27.3-0.2 28.9 0.1 04JUL1990 21.7-0.4 25.8-0.2 27.3-0.1 28.9 0.1 11JUL1990 21.3-0.5 25.4-0.3 27.2-0.1 28.8 0.0 18JUL1990 21.0-0.5 25.7 0.1 27.4 0.2 29.1 0.3 25JUL1990 20.2-1.1 25.1-0.4 27.3 0.1 29.1 0.3 01AUG1990 20.6-0.6 25.1-0.2 27.1 0.1 29.0 0.3 08AUG1990 20.4-0.5 25.2 0.1 27.2 0.3 29.3 0.6 15AUG1990 20.4-0.3 25.1 0.1 27.0 0.2 29.2 0.5 22AUG1990 19.8-0.7 24.9 0.0 27.0 0.2 29.2 0.5 29AUG1990 20.2-0.3 25.0 0.1 26.9 0.2 29.0 0.4 05SEP1990 19.7-0.8 24.9 0.0 26.7 0.0 28.9 0.3 12SEP1990 20.1-0.3 24.7-0.2 26.7 0.0 29.1 0.4 19SEP1990 20.3-0.1 24.9 0.1 26.8 0.0 29.1 0.4 26SEP1990 20.3-0.2 24.8-0.1 26.7 0.0 29.0 0.3 03OCT1990 20.8 0.1 25.1 0.2 26.9 0.2 29.2 0.5 10OCT1990 20.1-0.6 24.9 0.0 27.0 0.3 29.1 0.5 17OCT1990 20.3-0.6 24.9 0.0 27.0 0.3 29.3 0.6 24OCT1990 20.1-0.9 24.9-0.1 27.0 0.4 29.3 0.6 31OCT1990 20.2-1.0 24.7-0.2 26.9 0.2 29.2 0.6 07NOV1990 20.5-0.8 25.0 0.1 26.9 0.3 29.1 0.5 14NOV1990 20.8-0.8 24.8-0.1 26.7 0.0 29.0 0.4 21NOV1990 20.9-0.9 24.6-0.4 26.6 0.0 29.0 0.4 28NOV1990 21.5-0.6 24.8-0.3 26.5-0.1 28.9 0.4 05DEC1990 22.2-0.2 25.2 0.1 26.9 0.3 29.2 0.7 12DEC1990 22.1-0.5 25.0-0.1 26.8 0.3 29.3 0.8 19DEC1990 22.2-0.8 24.9-0.3 26.9 0.4 29.2 0.7 26DEC1990 23.3 0.0 25.3 0.0 27.0 0.4 29.0 0.6 02JAN1991 23.2-0.5 25.3-0.1 26.9 0.4 28.9 0.5 09JAN1991 23.5-0.6 25.4-0.1 27.0 0.4 29.1 0.8 16JAN1991 23.7-0.7 25.7 0.1 27.0 0.5 29.0 0.8 23JAN1991 24.2-0.6 25.8 0.0 27.1 0.5 29.0 0.8 30JAN1991 24.7-0.5 26.0 0.0 27.0 0.3 28.9 0.7 06FEB1991 25.4-0.2 26.1 0.0 27.0 0.3 28.8 0.6 13FEB1991 26.0 0.0 26.3 0.0 27.0 0.3 28.8 0.7 20FEB1991 26.5 0.3 26.3-0.2 26.9 0.1 28.7 0.6 27FEB1991 26.5 0.2 26.5-0.2 26.8-0.1 28.5 0.4 06MAR1991 26.5 0.2 26.6-0.3 26.8-0.2 28.5 0.3 13MAR1991 26.8 0.4 27.0-0.1 27.1-0.1 28.5 0.3 20MAR1991 26.6 0.2 27.1-0.1 27.4 0.1 28.6 0.4 27MAR1991 26.2 0.1 27.4 0.1 27.7 0.3 28.9 0.6 03APR1991 25.8-0.1 27.3 0.0 27.8 0.2 28.9 0.5 10APR1991 25.2-0.5 27.0-0.4 27.8 0.1 29.1 0.7 17APR1991 24.9-0.5 27.5 0.0 28.2 0.4 29.2 0.7 24APR1991 24.3-0.8 27.4 0.0 28.1 0.3 29.2 0.6 01MAY1991 24.6-0.2 27.6 0.4 28.1 0.3 29.1 0.4 08MAY1991 24.4-0.2 27.5 0.3 28.3 0.5 29.3 0.6 15MAY1991 24.5 0.2 27.5 0.4 28.4 0.5 29.5 0.7 22MAY1991 24.3 0.4 27.7 0.7 28.5 0.7 29.5 0.7 29MAY1991 24.2 0.5 27.6 0.8 28.5 0.7 29.5 0.7 05JUN1991 23.7 0.4 27.5 0.8 28.3 0.6 29.3 0.5 12JUN1991 23.2 0.2 27.4 0.9 28.3 0.6 29.3 0.5 19JUN1991 23.0 0.3 27.2 0.9 28.4 0.8 29.4 0.5 26JUN1991 22.2-0.2 27.3 1.1 28.4 0.9 29.4 0.6 03JUL1991 22.8 0.7 27.0 1.0 28.1 0.7 29.2 0.4 10JUL1991 22.3 0.4 26.8 1.0 28.1 0.8 29.2 0.4 17JUL1991 21.9 0.3 26.6 1.0 27.9 0.7 29.3 0.5 24JUL1991 21.6 0.3 26.2 0.7 27.7 0.5 29.2 0.5 31JUL1991 21.6 0.5 26.1 0.8 27.9 0.9 29.5 0.7 07AUG1991 21.2 0.3 25.6 0.4 27.5 0.6 29.3 0.6 14AUG1991 21.3 0.5 25.4 0.4 27.6 0.7 29.3 0.6 21AUG1991 20.9 0.3 25.4 0.5 27.4 0.6 29.3 0.6 28AUG1991 20.7 0.2 25.2 0.3 27.0 0.3 29.0 0.3 04SEP1991 20.9 0.4 25.1 0.2 27.1 0.3 29.1 0.5 11SEP1991 20.7 0.3 24.7-0.1 26.9 0.1 29.0 0.4 18SEP1991 20.7 0.3 25.1 0.2 27.2 0.5 29.4 0.7 25SEP1991 20.8 0.3 25.2 0.3 27.1 0.4 29.2 0.5 02OCT1991 20.8 0.2 25.3 0.4 27.2 0.5 29.3 0.6 09OCT1991 21.1 0.4 25.6 0.7 27.7 1.0 29.5 0.8 16OCT1991 20.7-0.1 25.5 0.6 27.8 1.1 29.6 1.0 23OCT1991 21.2 0.2 25.7 0.8 27.6 0.9 29.4 0.7 30OCT1991 21.9 0.7 25.9 1.0 27.8 1.1 29.4 0.8 06NOV1991 22.0 0.7 25.8 0.9 27.8 1.1 29.5 0.8 13NOV1991 21.9 0.4 25.9 1.0 27.8 1.1 29.5 0.9 20NOV1991 22.5 0.7 26.1 1.1 27.9 1.3 29.4 0.8 27NOV1991 22.3 0.3 26.1 1.1 28.0 1.4 29.4 0.9 04DEC1991 22.8 0.5 26.2 1.1 28.1 1.5 29.4 0.9 11DEC1991 23.4 0.8 26.5 1.4 28.3 1.7 29.4 0.9 18DEC1991 23.7 0.8 26.6 1.5 28.5 2.0 29.5 1.0 25DEC1991 23.6 0.3 26.7 1.4 28.5 1.9 29.6 1.2 01JAN1992 24.0 0.3 26.7 1.3 28.5 1.9 29.3 1.0 08JAN1992 24.2 0.2 26.8 1.3 28.5 1.9 29.2 0.9 15JAN1992 24.6 0.2 26.9 1.3 28.4 1.9 29.1 0.8 22JAN1992 25.3 0.5 27.1 1.3 28.4 1.8 29.0 0.7 29JAN1992 25.9 0.7 27.4 1.4 28.3 1.7 28.7 0.6 05FEB1992 26.3 0.8 27.5 1.3 28.4 1.7 28.8 0.7 12FEB1992 26.4 0.5 27.6 1.3 28.6 1.9 29.0 0.9 19FEB1992 26.8 0.6 27.8 1.3 28.8 2.0 29.2 1.1 26FEB1992 27.3 1.1 27.9 1.2 28.8 1.9 29.1 1.0 04MAR1992 27.3 1.0 27.9 1.1 28.6 1.6 29.1 0.9 11MAR1992 27.7 1.2 28.1 1.0 28.7 1.6 29.2 1.0 18MAR1992 27.9 1.4 28.5 1.3 28.8 1.6 28.9 0.7 25MAR1992 28.1 1.9 28.7 1.4 29.0 1.6 29.1 0.8 01APR1992 27.9 1.9 28.7 1.3 29.1 1.6 29.4 1.0 08APR1992 28.3 2.6 28.8 1.4 29.3 1.6 29.6 1.2 15APR1992 28.0 2.5 28.8 1.3 29.2 1.4 29.5 1.0 22APR1992 27.1 1.9 28.6 1.2 29.0 1.2 29.3 0.8 29APR1992 27.0 2.1 28.8 1.5 29.1 1.2 29.2 0.6 06MAY1992 27.0 2.4 28.8 1.6 29.2 1.3 29.4 0.7 13MAY1992 26.6 2.3 28.6 1.5 29.1 1.2 29.5 0.8 20MAY1992 25.8 1.8 28.2 1.2 29.0 1.1 29.5 0.8 27MAY1992 25.9 2.2 28.1 1.3 28.8 1.1 29.5 0.7 03JUN1992 24.2 0.9 27.5 0.8 28.6 0.9 29.4 0.6 10JUN1992 24.2 1.2 26.8 0.3 28.3 0.6 29.4 0.6 17JUN1992 23.9 1.1 26.6 0.2 27.8 0.2 29.2 0.4 24JUN1992 23.5 1.0 26.2 0.0 27.6 0.1 29.2 0.4 01JUL1992 22.3 0.1 25.8-0.2 27.6 0.1 29.2 0.4 08JUL1992 23.0 1.1 26.2 0.4 28.0 0.7 29.5 0.7 15JUL1992 21.4-0.3 25.7 0.0 27.7 0.5 29.5 0.7 22JUL1992 21.6 0.2 25.1-0.4 27.2 0.0 29.2 0.5 29JUL1992 21.5 0.3 24.9-0.5 27.1 0.1 29.2 0.5 05AUG1992 20.8-0.2 24.6-0.6 26.7-0.2 29.1 0.4 12AUG1992 20.8 0.0 24.9-0.2 26.6-0.3 28.8 0.1 19AUG1992 20.3-0.4 24.6-0.4 26.6-0.3 28.8 0.2 26AUG1992 20.3-0.3 24.8-0.2 26.7-0.1 28.9 0.3 02SEP1992 20.3-0.2 24.4-0.5 26.3-0.4 28.6 0.0 09SEP1992 19.7-0.8 24.4-0.5 26.4-0.3 28.7 0.1 16SEP1992 20.1-0.2 24.5-0.3 26.5-0.2 28.9 0.2 23SEP1992 20.1-0.3 24.6-0.3 26.5-0.2 28.9 0.2 30SEP1992 20.2-0.4 24.7-0.2 26.6-0.1 28.7 0.0 07OCT1992 20.5-0.2 24.5-0.4 26.4-0.3 28.8 0.1 14OCT1992 20.7 0.0 24.6-0.3 26.4-0.3 28.6-0.1 21OCT1992 20.9 0.0 24.6-0.4 26.2-0.5 28.8 0.1 28OCT1992 21.5 0.4 24.8-0.1 26.2-0.4 28.5-0.1 04NOV1992 21.2-0.1 24.7-0.2 26.3-0.4 28.6 0.0 11NOV1992 21.2-0.3 24.8-0.1 26.6-0.1 28.8 0.2 18NOV1992 21.2-0.5 24.7-0.3 26.4-0.2 28.5-0.1 25NOV1992 22.1 0.2 24.9-0.2 26.7 0.0 28.8 0.2 02DEC1992 22.2 0.0 24.9-0.2 26.7 0.1 28.9 0.4 09DEC1992 22.2-0.3 25.1 0.0 26.8 0.2 28.7 0.2 16DEC1992 22.3-0.5 24.9-0.3 26.7 0.1 28.7 0.3 23DEC1992 22.5-0.7 25.1-0.2 26.8 0.2 28.9 0.4 30DEC1992 23.3-0.2 25.1-0.3 26.6 0.0 28.6 0.2 06JAN1993 23.6-0.3 25.4-0.1 26.7 0.1 28.5 0.2 13JAN1993 24.4 0.1 25.6 0.0 26.8 0.2 28.7 0.4 20JAN1993 24.5-0.2 25.5-0.2 26.6 0.0 28.6 0.3 27JAN1993 25.2 0.1 25.8-0.2 26.7 0.0 28.6 0.4 03FEB1993 26.2 0.8 26.3 0.2 26.9 0.3 28.5 0.3 10FEB1993 26.6 0.7 26.4 0.2 26.8 0.1 28.3 0.2 17FEB1993 26.6 0.4 26.9 0.5 27.0 0.2 28.3 0.2 24FEB1993 26.6 0.4 26.7 0.1 27.1 0.2 28.5 0.4 03MAR1993 26.9 0.6 26.9 0.1 27.2 0.2 28.4 0.3 10MAR1993 27.2 0.7 27.3 0.3 27.4 0.3 28.4 0.3 17MAR1993 27.1 0.6 27.5 0.3 27.7 0.4 28.6 0.4 24MAR1993 27.2 1.0 28.0 0.7 28.0 0.7 28.8 0.5 31MAR1993 27.7 1.7 28.3 1.0 28.2 0.7 28.9 0.6 07APR1993 26.6 0.9 28.4 1.0 28.3 0.6 28.7 0.3 14APR1993 26.3 0.7 28.5 1.0 28.8 1.1 29.0 0.5 21APR1993 26.3 1.0 28.4 1.0 28.7 0.9 29.0 0.5 28APR1993 26.0 1.1 28.5 1.2 28.8 1.0 29.0 0.4 05MAY1993 25.9 1.2 28.5 1.2 28.8 1.0 28.9 0.3 12MAY1993 25.6 1.2 28.3 1.2 28.9 1.0 29.1 0.4 19MAY1993 24.9 0.8 28.1 1.1 28.8 1.0 29.2 0.4 26MAY1993 24.3 0.6 27.9 1.0 28.9 1.1 29.2 0.4 02JUN1993 24.5 1.1 27.7 0.9 28.6 0.9 29.2 0.4 09JUN1993 23.9 0.7 27.2 0.6 28.3 0.6 29.1 0.2 16JUN1993 23.6 0.8 27.1 0.6 28.2 0.6 29.1 0.2 23JUN1993 23.8 1.3 26.9 0.7 28.2 0.7 29.3 0.5 30JUN1993 23.0 0.7 26.7 0.6 28.1 0.6 29.3 0.5 07JUL1993 22.4 0.4 26.1 0.3 27.9 0.6 29.3 0.5 14JUL1993 22.2 0.5 25.8 0.1 27.4 0.2 29.2 0.4 21JUL1993 22.0 0.6 25.6 0.1 27.5 0.4 29.2 0.4 28JUL1993 21.3 0.0 25.3-0.1 27.2 0.1 29.1 0.4 04AUG1993 21.2 0.2 25.0-0.3 26.8-0.2 28.9 0.2 11AUG1993 20.8 0.0 25.0-0.1 26.9 0.0 29.0 0.3 18AUG1993 21.1 0.5 24.8-0.1 26.8 0.0 28.7 0.1 25AUG1993 21.2 0.6 24.9 0.0 26.9 0.1 29.1 0.4 01SEP1993 20.9 0.4 24.9 0.0 26.9 0.2 29.1 0.4 08SEP1993 20.8 0.3 25.0 0.1 26.8 0.1 29.0 0.4 15SEP1993 20.8 0.4 24.9 0.0 26.9 0.2 29.1 0.5 22SEP1993 21.0 0.5 25.0 0.2 27.0 0.3 29.1 0.4 29SEP1993 20.7 0.2 25.1 0.2 27.0 0.3 29.0 0.3 06OCT1993 20.6-0.1 25.2 0.3 26.9 0.2 28.8 0.1 13OCT1993 20.8 0.0 25.3 0.4 27.0 0.3 29.0 0.3 20OCT1993 21.2 0.3 25.0 0.1 26.6 0.0 28.9 0.2 27OCT1993 21.3 0.2 25.3 0.4 27.1 0.4 29.0 0.3 03NOV1993 22.0 0.8 25.4 0.4 27.2 0.5 29.0 0.3 10NOV1993 21.4 0.0 25.1 0.1 26.9 0.2 28.8 0.2 17NOV1993 21.7 0.0 25.1 0.2 26.9 0.2 28.9 0.3 24NOV1993 21.4-0.5 25.1 0.0 26.7 0.1 29.0 0.5 01DEC1993 21.8-0.4 25.3 0.2 26.9 0.3 29.2 0.6 08DEC1993 22.1-0.3 25.3 0.2 26.9 0.4 29.0 0.5 15DEC1993 23.1 0.4 25.3 0.2 26.8 0.3 28.9 0.4 22DEC1993 23.0-0.2 25.3 0.1 26.6 0.1 28.9 0.4 29DEC1993 23.3-0.2 25.4 0.0 26.5-0.1 28.6 0.2 05JAN1994 23.8 0.0 25.7 0.2 26.7 0.1 28.7 0.3 12JAN1994 23.9-0.3 25.7 0.1 26.7 0.2 28.5 0.2 19JAN1994 24.6 0.0 25.7-0.1 26.5-0.1 28.5 0.2 26JAN1994 24.8-0.2 25.8-0.1 26.5-0.2 28.2 0.0 02FEB1994 25.4 0.0 25.9-0.1 26.6 0.0 28.2 0.0 09FEB1994 25.9 0.1 26.2 0.0 26.7 0.0 28.1 0.0 16FEB1994 25.6-0.5 26.1-0.3 26.6-0.1 28.0 0.0 23FEB1994 26.1-0.1 25.9-0.7 26.4-0.5 27.9-0.2 02MAR1994 26.2-0.1 26.6-0.2 26.6-0.3 27.9-0.2 09MAR1994 25.5-0.9 27.0 0.1 27.2 0.1 28.2 0.1 16MAR1994 25.7-0.9 27.0-0.1 27.4 0.2 28.4 0.2 23MAR1994 25.0-1.2 26.8-0.4 27.3-0.1 28.3 0.0 30MAR1994 24.8-1.3 27.0-0.3 27.7 0.2 28.3 0.0 06APR1994 24.9-0.9 27.0-0.4 27.6 0.0 28.5 0.1 13APR1994 24.7-0.9 27.2-0.3 28.0 0.2 28.6 0.2 20APR1994 24.2-1.1 27.0-0.4 28.0 0.2 28.6 0.1 27APR1994 23.4-1.6 27.1-0.2 28.1 0.3 28.7 0.2 04MAY1994 23.4-1.3 27.0-0.3 27.9 0.1 28.8 0.1 11MAY1994 23.6-0.8 26.8-0.3 27.8 0.0 28.9 0.2 18MAY1994 23.0-1.1 27.2 0.1 28.2 0.4 29.0 0.2 25MAY1994 23.0-0.8 26.9 0.0 28.1 0.3 29.1 0.3 01JUN1994 22.8-0.7 26.9 0.1 28.3 0.5 29.3 0.5 08JUN1994 22.7-0.5 26.7 0.1 28.0 0.3 29.1 0.3 15JUN1994 22.7-0.1 26.8 0.4 28.2 0.6 29.1 0.3 22JUN1994 22.2-0.4 26.2-0.1 27.9 0.3 29.2 0.4 29JUN1994 21.7-0.6 25.9-0.2 27.6 0.1 29.2 0.4 06JUL1994 21.9-0.1 25.6-0.3 27.4 0.1 29.3 0.5 13JUL1994 21.3-0.4 25.2-0.5 27.3 0.1 29.4 0.6 20JUL1994 20.9-0.6 25.1-0.4 27.4 0.2 29.5 0.8 27JUL1994 20.8-0.5 24.8-0.6 27.2 0.1 29.4 0.6 03AUG1994 20.1-1.0 24.5-0.8 27.3 0.3 29.4 0.7 10AUG1994 19.2-1.6 24.8-0.3 27.6 0.7 29.5 0.8 17AUG1994 19.6-1.1 24.8-0.2 27.4 0.6 29.5 0.9 24AUG1994 20.0-0.5 24.8-0.2 27.3 0.5 29.5 0.8 31AUG1994 19.6-0.9 24.7-0.2 27.1 0.3 29.4 0.7 07SEP1994 20.1-0.4 24.6-0.3 26.9 0.2 29.3 0.6 14SEP1994 20.0-0.3 24.6-0.2 26.9 0.1 29.2 0.5 21SEP1994 20.5 0.1 24.9 0.0 27.0 0.2 29.2 0.5 28SEP1994 20.2-0.3 25.2 0.3 27.2 0.5 29.2 0.6 05OCT1994 21.0 0.3 25.4 0.5 27.3 0.6 29.4 0.8 12OCT1994 21.7 0.9 25.6 0.7 27.5 0.8 29.4 0.8 19OCT1994 21.8 0.9 25.6 0.6 27.5 0.8 29.4 0.8 26OCT1994 21.7 0.7 25.6 0.6 27.6 1.0 29.5 0.9 02NOV1994 22.1 0.9 25.7 0.7 27.8 1.1 29.6 1.0 09NOV1994 22.1 0.7 26.0 1.0 27.9 1.3 29.5 0.9 16NOV1994 22.3 0.7 25.8 0.8 27.8 1.1 29.6 1.0 23NOV1994 22.8 0.9 25.9 0.9 27.9 1.2 29.7 1.1 30NOV1994 22.9 0.7 26.0 0.9 28.0 1.4 29.8 1.3 07DEC1994 23.3 0.9 26.0 0.9 27.9 1.3 29.6 1.1 14DEC1994 23.4 0.7 25.9 0.8 27.9 1.3 29.5 1.1 21DEC1994 23.7 0.6 26.2 1.0 27.9 1.3 29.3 0.9 28DEC1994 24.3 0.9 26.3 0.9 27.8 1.3 29.3 0.9 04JAN1995 24.7 0.8 26.1 0.7 27.6 1.1 29.3 0.9 11JAN1995 25.1 0.9 26.2 0.7 27.6 1.0 29.2 0.9 18JAN1995 25.3 0.8 26.4 0.7 27.6 1.0 29.3 1.0 25JAN1995 25.9 0.9 26.5 0.6 27.5 0.8 29.1 0.8 01FEB1995 26.2 0.9 26.7 0.7 27.4 0.8 29.0 0.9 08FEB1995 26.7 0.9 26.9 0.7 27.4 0.7 29.1 1.0 15FEB1995 26.5 0.4 26.8 0.4 27.3 0.5 28.9 0.8 22FEB1995 26.4 0.2 26.9 0.3 27.5 0.7 29.0 0.9 01MAR1995 26.0-0.2 26.9 0.2 27.7 0.7 29.0 0.9 08MAR1995 26.0-0.4 26.7-0.2 27.4 0.4 28.9 0.7 15MAR1995 26.6 0.1 27.1 0.0 27.7 0.5 29.0 0.9 22MAR1995 26.4 0.1 27.2-0.1 27.7 0.3 29.0 0.8 29MAR1995 25.4-0.6 27.4 0.1 27.7 0.2 28.8 0.5 05APR1995 24.9-1.0 27.2-0.2 27.9 0.3 28.8 0.5 12APR1995 24.9-0.7 27.3-0.2 27.8 0.1 28.8 0.4 19APR1995 24.6-0.7 27.3-0.2 28.2 0.4 28.9 0.3 26APR1995 23.5-1.5 26.6-0.7 27.9 0.1 28.9 0.3 03MAY1995 23.3-1.4 26.6-0.6 28.0 0.2 29.2 0.6 10MAY1995 23.0-1.4 26.3-0.8 27.7-0.1 29.1 0.4 17MAY1995 23.0-1.2 26.2-0.8 27.7-0.2 29.2 0.4 24MAY1995 23.2-0.6 26.4-0.5 27.6-0.2 29.1 0.3 31MAY1995 22.8-0.7 26.4-0.3 27.7 0.0 29.0 0.2 07JUN1995 22.9-0.3 26.4-0.2 27.7 0.0 29.1 0.3 14JUN1995 22.9 0.0 26.4-0.1 27.7 0.1 29.1 0.3 21JUN1995 21.9-0.7 26.0-0.3 27.5 0.0 28.9 0.1 28JUN1995 21.8-0.5 25.8-0.3 27.3-0.1 28.8 0.0 05JUL1995 22.0 0.0 25.7-0.2 27.3-0.1 29.0 0.2 12JUL1995 21.2-0.5 25.6-0.1 27.1-0.2 28.8 0.0 19JUL1995 21.0-0.5 25.3-0.2 26.9-0.3 28.7-0.1 26JUL1995 20.8-0.5 25.1-0.3 26.8-0.3 28.6-0.1 02AUG1995 20.3-0.8 24.8-0.5 26.7-0.3 28.5-0.2 09AUG1995 19.9-1.0 24.3-0.8 26.3-0.6 28.3-0.4 16AUG1995 20.0-0.7 24.3-0.7 26.4-0.4 28.5-0.2 23AUG1995 19.9-0.7 24.3-0.7 26.3-0.5 28.4-0.2 30AUG1995 20.1-0.5 24.0-0.9 25.9-0.8 28.2-0.5 06SEP1995 20.4 0.0 24.1-0.8 26.0-0.8 28.2-0.5 13SEP1995 19.9-0.5 24.1-0.8 26.0-0.7 28.0-0.6 20SEP1995 20.2-0.2 24.0-0.9 26.1-0.7 28.4-0.3 27SEP1995 20.2-0.3 23.9-1.0 25.9-0.8 28.4-0.3 04OCT1995 19.6-1.0 23.9-1.0 25.6-1.1 28.1-0.5 11OCT1995 20.2-0.5 24.1-0.8 25.6-1.1 28.0-0.6 18OCT1995 20.0-0.8 24.1-0.9 25.8-0.9 28.2-0.5 25OCT1995 20.3-0.7 24.0-0.9 25.6-1.1 27.9-0.8 01NOV1995 21.0-0.2 24.1-0.8 25.6-1.0 28.0-0.7 08NOV1995 20.6-0.8 23.9-1.1 25.8-0.9 28.1-0.5 15NOV1995 21.3-0.2 24.1-0.9 25.7-1.0 27.8-0.8 22NOV1995 21.4-0.4 24.1-0.9 25.5-1.1 27.7-0.9 29NOV1995 21.6-0.5 24.1-1.0 25.7-0.9 28.1-0.5 06DEC1995 21.5-0.9 24.1-1.0 25.6-1.0 27.9-0.6 13DEC1995 21.7-1.0 24.0-1.1 25.4-1.2 27.9-0.5 20DEC1995 22.0-1.0 24.1-1.1 25.6-1.0 28.1-0.3 27DEC1995 22.8-0.6 24.5-0.8 25.7-0.9 28.1-0.3 03JAN1996 23.4-0.4 24.6-0.8 25.6-1.0 28.1-0.3 10JAN1996 23.6-0.6 24.9-0.6 25.6-1.0 27.9-0.4 17JAN1996 24.0-0.5 25.2-0.5 25.9-0.7 27.8-0.5 24JAN1996 23.9-1.0 25.0-0.8 25.9-0.7 27.9-0.4 31JAN1996 24.6-0.7 25.2-0.8 25.8-0.9 27.8-0.4 07FEB1996 25.4-0.3 25.4-0.8 25.6-1.1 27.5-0.6 14FEB1996 25.9-0.1 25.7-0.6 25.8-0.9 27.5-0.5 21FEB1996 26.0-0.2 25.9-0.6 25.8-1.0 27.4-0.7 28FEB1996 26.1-0.2 26.3-0.5 26.3-0.6 27.5-0.6 06MAR1996 26.6 0.2 26.5-0.4 26.2-0.8 27.5-0.6 13MAR1996 26.1-0.3 26.9-0.2 26.6-0.6 27.7-0.5 20MAR1996 26.3-0.1 27.0-0.2 26.8-0.5 27.7-0.5 27MAR1996 25.7-0.4 26.7-0.6 26.8-0.6 27.8-0.4 03APR1996 24.4-1.5 26.5-0.9 27.0-0.6 27.9-0.5 10APR1996 23.9-1.7 27.0-0.4 27.4-0.3 27.9-0.5 17APR1996 23.8-1.6 26.8-0.7 27.3-0.4 28.0-0.5 24APR1996 23.6-1.5 26.7-0.7 27.6-0.1 28.2-0.3 01MAY1996 23.0-1.9 26.4-0.9 27.4-0.4 28.2-0.4 08MAY1996 23.0-1.6 26.5-0.7 27.6-0.2 28.4-0.3 15MAY1996 23.0-1.3 26.3-0.8 27.3-0.5 28.3-0.4 22MAY1996 23.0-0.9 26.2-0.7 27.2-0.6 28.5-0.3 29MAY1996 22.6-1.1 26.2-0.6 27.3-0.4 28.6-0.2 05JUN1996 22.3-1.0 26.0-0.6 27.3-0.4 28.6-0.3 12JUN1996 21.9-1.0 26.0-0.5 27.3-0.4 28.5-0.4 19JUN1996 21.4-1.3 25.8-0.6 27.3-0.3 28.4-0.4 26JUN1996 20.6-1.8 25.7-0.5 27.3-0.2 28.6-0.2 03JUL1996 20.4-1.7 25.9 0.0 27.6 0.2 28.6-0.2 10JUL1996 20.1-1.8 25.4-0.3 27.1-0.2 28.5-0.3 17JUL1996 20.0-1.6 25.4-0.2 27.1-0.1 28.3-0.5 24JUL1996 20.2-1.2 25.1-0.4 26.9-0.2 28.5-0.3 31JUL1996 19.2-1.9 24.7-0.6 26.6-0.4 28.4-0.3 07AUG1996 19.2-1.7 24.8-0.4 26.7-0.3 28.5-0.2 14AUG1996 20.0-0.8 24.6-0.5 26.5-0.4 28.6 0.0 21AUG1996 20.1-0.5 24.6-0.3 26.5-0.3 28.6-0.1 28AUG1996 18.9-1.6 24.4-0.6 26.5-0.2 28.4-0.3 04SEP1996 19.1-1.3 24.3-0.6 26.4-0.4 28.5-0.2 11SEP1996 19.4-1.0 24.4-0.5 26.2-0.5 28.3-0.4 18SEP1996 19.1-1.3 24.3-0.5 26.4-0.3 28.5-0.2 25SEP1996 19.3-1.2 24.4-0.4 26.3-0.4 28.4-0.3 02OCT1996 19.5-1.2 24.5-0.4 26.2-0.5 28.3-0.4 09OCT1996 19.5-1.3 24.3-0.6 26.2-0.5 28.5-0.2 16OCT1996 20.2-0.6 24.4-0.5 26.3-0.3 28.5-0.1 23OCT1996 20.5-0.5 24.4-0.6 26.2-0.5 28.3-0.3 30OCT1996 20.0-1.1 24.3-0.7 26.1-0.5 28.3-0.3 06NOV1996 20.2-1.2 24.4-0.6 26.1-0.5 28.1-0.5 13NOV1996 20.1-1.4 24.4-0.6 26.2-0.5 28.3-0.3 20NOV1996 20.3-1.5 24.4-0.6 26.3-0.3 28.4-0.1 27NOV1996 20.4-1.6 24.3-0.7 26.2-0.4 28.3-0.2 04DEC1996 20.8-1.5 24.4-0.7 26.3-0.3 28.5 0.0 11DEC1996 21.6-1.0 24.1-1.0 26.1-0.5 28.6 0.1 18DEC1996 21.6-1.3 24.2-1.0 25.9-0.6 28.3-0.1 25DEC1996 22.1-1.1 24.1-1.1 25.9-0.7 28.3-0.1 01JAN1997 22.5-1.2 24.3-1.1 25.8-0.8 28.2-0.2 08JAN1997 23.0-1.0 24.5-1.0 25.9-0.6 28.4 0.1 15JAN1997 23.6-0.8 24.6-1.0 25.8-0.7 28.4 0.1 22JAN1997 24.3-0.5 24.8-1.0 25.9-0.7 28.4 0.2 29JAN1997 24.6-0.6 25.1-0.8 26.3-0.4 28.4 0.2 05FEB1997 25.3-0.2 25.2-0.9 26.2-0.5 28.4 0.2 12FEB1997 25.4-0.6 25.8-0.5 26.4-0.3 28.3 0.2 19FEB1997 26.3 0.1 25.9-0.6 26.4-0.4 28.2 0.1 26FEB1997 26.2-0.1 26.2-0.4 26.5-0.4 28.2 0.1 05MAR1997 26.8 0.5 26.6-0.3 26.6-0.4 28.1 0.0 12MAR1997 26.9 0.5 26.8-0.3 26.8-0.4 28.3 0.1 19MAR1997 27.0 0.6 27.3 0.1 27.4 0.1 28.5 0.3 26MAR1997 27.2 1.0 27.4 0.1 27.3-0.1 28.9 0.7 02APR1997 27.0 1.1 27.3-0.1 27.5 0.0 29.2 0.8 09APR1997 26.4 0.7 27.3-0.1 27.8 0.2 29.2 0.8 16APR1997 26.5 1.1 27.6 0.1 28.0 0.3 29.3 0.8 23APR1997 26.6 1.4 27.8 0.4 28.4 0.6 29.5 0.9 30APR1997 26.8 1.9 28.0 0.7 28.4 0.6 29.5 0.8 07MAY1997 26.8 2.2 28.2 1.0 28.6 0.8 29.4 0.8 14MAY1997 26.7 2.4 28.0 0.9 28.5 0.6 29.3 0.6 21MAY1997 26.6 2.6 27.9 1.0 28.6 0.8 29.5 0.7 28MAY1997 26.8 3.1 28.1 1.3 28.8 1.0 29.5 0.7 04JUN1997 26.4 3.1 28.0 1.3 28.8 1.1 29.4 0.6 11JUN1997 26.5 3.5 28.1 1.6 28.9 1.2 29.3 0.5 18JUN1997 26.0 3.3 28.2 1.8 29.0 1.4 29.4 0.6 25JUN1997 26.2 3.7 28.2 2.0 29.1 1.6 29.5 0.7 02JUL1997 25.9 3.7 28.1 2.1 29.0 1.5 29.4 0.6 09JUL1997 25.7 3.8 28.0 2.2 28.9 1.6 29.5 0.7 16JUL1997 25.7 4.1 28.1 2.5 29.0 1.8 29.5 0.7 23JUL1997 25.5 4.1 27.9 2.4 28.8 1.7 29.5 0.8 30JUL1997 25.2 4.0 27.9 2.6 28.9 1.9 29.5 0.8 06AUG1997 25.3 4.3 27.8 2.6 28.8 1.8 29.4 0.7 13AUG1997 25.4 4.6 27.9 2.9 28.9 2.0 29.3 0.6 20AUG1997 24.2 3.6 27.9 2.9 28.9 2.1 29.2 0.5 27AUG1997 24.3 3.7 27.7 2.7 28.8 2.0 29.2 0.5 03SEP1997 24.6 4.2 27.8 2.9 28.9 2.1 29.2 0.6 10SEP1997 24.6 4.2 27.8 2.9 28.9 2.2 29.3 0.6 17SEP1997 24.2 3.8 27.8 2.9 28.9 2.2 29.3 0.6 24SEP1997 24.4 3.9 27.9 3.0 28.9 2.2 29.5 0.8 01OCT1997 24.1 3.5 28.0 3.1 29.1 2.4 29.4 0.7 08OCT1997 24.5 3.8 28.1 3.2 29.2 2.6 29.3 0.6 15OCT1997 24.5 3.7 28.1 3.2 29.2 2.5 29.3 0.7 22OCT1997 24.9 3.9 28.2 3.3 29.3 2.6 29.5 0.8 29OCT1997 24.7 3.6 28.3 3.4 29.2 2.6 29.2 0.6 05NOV1997 25.0 3.7 28.4 3.4 29.2 2.6 29.2 0.6 12NOV1997 25.8 4.3 28.5 3.6 29.3 2.7 29.5 0.8 19NOV1997 25.8 4.1 28.6 3.6 29.3 2.7 29.7 1.1 26NOV1997 25.9 3.9 28.7 3.7 29.4 2.8 29.7 1.1 03DEC1997 26.2 3.9 28.6 3.6 29.2 2.6 29.4 0.9 10DEC1997 26.7 4.2 28.7 3.6 29.2 2.7 29.4 0.9 17DEC1997 27.0 4.1 28.8 3.6 29.3 2.7 29.3 0.8 24DEC1997 27.2 4.0 28.8 3.5 29.3 2.7 29.3 0.9 31DEC1997 27.7 4.1 28.9 3.5 29.2 2.7 29.2 0.8 07JAN1998 28.0 4.0 28.9 3.4 29.2 2.6 29.1 0.8 14JAN1998 28.4 4.0 28.9 3.3 29.1 2.5 29.0 0.7 21JAN1998 28.4 3.7 28.9 3.2 29.0 2.4 28.9 0.7 28JAN1998 28.3 3.2 29.1 3.1 29.1 2.4 28.9 0.7 04FEB1998 28.9 3.4 29.1 3.0 29.2 2.5 29.0 0.9 11FEB1998 28.9 3.0 29.0 2.7 29.0 2.3 29.0 0.9 18FEB1998 29.1 3.0 28.8 2.3 28.7 1.9 28.8 0.7 25FEB1998 29.1 2.9 28.9 2.2 28.6 1.7 28.8 0.7 04MAR1998 29.2 2.8 29.0 2.2 28.5 1.5 28.6 0.4 11MAR1998 29.2 2.8 29.1 2.1 28.7 1.6 28.8 0.7 18MAR1998 29.2 2.7 29.1 2.0 28.6 1.4 28.6 0.4 25MAR1998 29.1 2.8 29.2 2.0 28.8 1.5 28.6 0.4 01APR1998 29.1 3.1 29.3 1.9 28.7 1.2 28.6 0.2 08APR1998 28.8 3.0 29.2 1.8 28.6 1.0 28.5 0.0 15APR1998 28.6 3.1 29.1 1.6 28.4 0.6 28.5 0.0 22APR1998 28.4 3.2 29.0 1.6 28.5 0.7 28.5-0.1 29APR1998 28.3 3.4 28.9 1.6 28.7 0.8 28.7 0.1 06MAY1998 27.8 3.2 29.4 2.1 29.1 1.3 28.7 0.1 13MAY1998 28.1 3.8 28.7 1.6 28.8 0.9 28.7-0.1 20MAY1998 27.9 3.9 27.6 0.7 28.3 0.5 28.6-0.2 27MAY1998 27.0 3.3 27.1 0.2 27.9 0.1 28.8 0.0 03JUN1998 26.2 2.8 26.1-0.6 27.1-0.6 28.7-0.1 10JUN1998 26.1 3.0 26.2-0.3 26.9-0.8 28.6-0.2 17JUN1998 24.6 1.8 25.8-0.6 26.7-1.0 28.7-0.1 24JUN1998 24.5 2.0 26.0-0.2 26.4-1.1 28.5-0.3 01JUL1998 24.1 1.9 25.7-0.3 26.4-1.1 28.3-0.5 08JUL1998 23.6 1.7 25.6-0.2 26.2-1.2 28.2-0.6 15JUL1998 23.6 2.0 25.3-0.4 25.9-1.4 28.1-0.7 22JUL1998 23.0 1.5 24.9-0.6 25.7-1.4 28.0-0.8 29JUL1998 23.2 2.0 24.9-0.5 25.7-1.4 27.8-1.0 05AUG1998 22.6 1.7 24.8-0.4 25.6-1.4 27.9-0.8 12AUG1998 21.8 1.1 24.6-0.5 25.5-1.4 27.8-0.9 19AUG1998 21.3 0.7 24.4-0.6 25.2-1.6 27.6-1.0 26AUG1998 21.2 0.7 24.7-0.3 25.6-1.2 27.6-1.0 02SEP1998 21.1 0.6 24.5-0.4 25.6-1.2 27.8-0.8 09SEP1998 20.9 0.5 24.3-0.6 25.9-0.8 28.3-0.4 16SEP1998 21.0 0.7 24.2-0.7 25.7-1.0 28.0-0.7 23SEP1998 20.5 0.1 24.1-0.7 25.5-1.2 27.6-1.1 30SEP1998 20.9 0.3 23.7-1.2 25.1-1.6 27.2-1.4 07OCT1998 20.9 0.2 23.9-1.0 25.3-1.4 27.5-1.2 14OCT1998 21.2 0.4 24.1-0.8 25.4-1.3 27.3-1.4 21OCT1998 21.1 0.1 24.1-0.8 25.3-1.4 27.2-1.5 28OCT1998 21.6 0.5 24.2-0.7 25.5-1.2 27.3-1.3 04NOV1998 21.4 0.1 24.4-0.6 25.2-1.5 27.2-1.4 11NOV1998 21.0-0.4 24.0-0.9 25.2-1.5 27.2-1.4 18NOV1998 21.7 0.0 24.1-0.9 25.2-1.4 27.1-1.5 25NOV1998 21.5-0.5 24.0-1.0 25.1-1.5 27.2-1.4 02DEC1998 21.7-0.5 23.9-1.2 25.1-1.5 27.3-1.2 09DEC1998 22.0-0.5 23.8-1.3 24.8-1.8 27.2-1.2 16DEC1998 22.5-0.3 23.9-1.3 24.7-1.8 27.1-1.4 23DEC1998 23.3 0.2 23.8-1.4 24.6-1.9 27.0-1.4 30DEC1998 23.2-0.4 23.9-1.5 24.7-1.9 26.7-1.7 06JAN1999 23.4-0.5 24.1-1.4 24.7-1.9 26.7-1.7 13JAN1999 23.7-0.6 24.2-1.4 25.0-1.6 26.8-1.5 20JAN1999 23.3-1.4 24.5-1.3 25.0-1.6 26.4-1.8 27JAN1999 24.5-0.6 24.9-1.0 25.0-1.6 26.2-2.0 03FEB1999 24.8-0.6 25.1-1.0 25.2-1.5 26.6-1.6 10FEB1999 25.1-0.7 25.0-1.2 25.2-1.5 26.5-1.6 17FEB1999 25.5-0.6 25.5-0.9 25.5-1.3 26.3-1.7 24FEB1999 26.8 0.6 26.4-0.2 25.7-1.2 26.4-1.7 03MAR1999 27.4 1.1 26.7-0.1 26.1-0.9 26.8-1.3 10MAR1999 27.0 0.6 26.6-0.4 26.1-1.0 26.7-1.5 17MAR1999 26.4 0.0 26.7-0.4 26.2-1.0 26.9-1.2 24MAR1999 26.3 0.0 26.7-0.6 26.5-0.9 27.0-1.2 31MAR1999 25.8-0.3 26.6-0.7 26.5-1.0 27.0-1.3 07APR1999 24.4-1.3 26.7-0.7 26.7-0.9 27.1-1.3 14APR1999 24.6-0.9 26.5-0.9 26.8-0.9 27.3-1.1 21APR1999 23.8-1.4 26.7-0.7 27.0-0.8 27.4-1.1 28APR1999 23.7-1.3 26.8-0.6 27.0-0.8 27.5-1.1 05MAY1999 23.6-1.1 26.6-0.6 27.0-0.8 27.8-0.9 12MAY1999 23.7-0.7 26.7-0.4 27.1-0.7 27.9-0.8 19MAY1999 23.7-0.4 26.5-0.5 26.9-0.9 27.8-0.9 26MAY1999 23.2-0.6 26.1-0.8 26.9-0.9 27.9-0.9 02JUN1999 22.5-0.9 25.8-0.9 26.7-1.1 28.0-0.8 09JUN1999 22.4-0.8 25.8-0.7 26.6-1.1 27.9-0.9 16JUN1999 21.6-1.2 25.6-0.9 26.6-1.1 28.0-0.9 23JUN1999 21.3-1.2 25.4-0.8 26.5-1.0 28.0-0.8 30JUN1999 21.3-1.0 25.3-0.8 26.6-0.8 28.1-0.7 07JUL1999 20.4-1.5 25.2-0.7 26.6-0.7 28.1-0.7 14JUL1999 20.4-1.3 24.9-0.7 26.4-0.8 27.8-1.0 21JUL1999 20.3-1.1 24.8-0.7 26.2-0.9 27.8-1.0 28JUL1999 20.2-1.0 24.4-1.0 26.0-1.0 27.8-0.9 04AUG1999 20.2-0.8 24.3-0.9 26.0-1.0 27.8-0.9 11AUG1999 19.7-1.1 24.1-1.0 25.6-1.3 27.7-1.0 18AUG1999 19.5-1.1 23.9-1.1 25.4-1.4 27.8-0.9 25AUG1999 19.7-0.9 24.0-1.0 25.5-1.3 27.6-1.1 01SEP1999 19.5-1.0 23.6-1.3 25.4-1.4 27.6-1.0 08SEP1999 19.2-1.2 23.7-1.2 25.7-1.1 27.7-0.9 15SEP1999 18.9-1.5 23.6-1.3 25.7-1.0 27.7-0.9 22SEP1999 19.3-1.2 23.8-1.1 25.8-0.9 27.9-0.7 29SEP1999 19.5-1.1 24.0-0.8 25.9-0.8 27.8-0.8 06OCT1999 19.7-0.9 23.6-1.3 25.7-1.0 27.9-0.8 13OCT1999 20.1-0.7 23.7-1.2 25.8-0.9 28.0-0.6 20OCT1999 20.0-1.0 23.7-1.2 25.6-1.0 27.8-0.9 27OCT1999 20.6-0.5 23.8-1.1 25.4-1.3 27.7-1.0 03NOV1999 20.1-1.2 23.6-1.3 25.4-1.3 27.6-1.0 10NOV1999 20.1-1.3 23.7-1.2 25.4-1.3 27.5-1.1 17NOV1999 20.6-1.0 23.5-1.5 25.2-1.5 27.6-1.0 24NOV1999 20.9-1.1 23.1-1.9 24.7-1.9 27.4-1.1 01DEC1999 21.0-1.2 23.1-1.9 24.9-1.7 27.3-1.2 08DEC1999 21.1-1.4 23.6-1.5 25.1-1.4 27.3-1.2 15DEC1999 21.3-1.4 23.4-1.7 24.9-1.7 27.1-1.4 22DEC1999 22.0-1.1 23.8-1.4 24.9-1.6 27.1-1.3 29DEC1999 23.0-0.5 23.6-1.8 24.6-1.9 27.2-1.2 05JAN2000 23.2-0.6 23.4-2.1 24.5-2.0 27.0-1.3 12JAN2000 23.8-0.4 23.9-1.7 24.7-1.9 26.9-1.4 19JAN2000 23.7-0.9 24.0-1.7 24.8-1.8 26.9-1.4 26JAN2000 24.0-1.0 24.0-1.8 24.6-2.0 26.9-1.3 02FEB2000 25.0-0.4 24.7-1.3 24.8-1.9 26.7-1.5 09FEB2000 25.1-0.7 25.3-0.9 25.1-1.6 26.6-1.5 16FEB2000 25.6-0.5 25.5-0.9 25.4-1.4 26.7-1.4 23FEB2000 26.2 0.0 25.4-1.2 25.2-1.6 26.6-1.5 01MAR2000 26.4 0.1 25.7-1.0 25.5-1.5 26.5-1.6 08MAR2000 26.6 0.2 26.2-0.8 25.7-1.4 26.6-1.5 15MAR2000 26.2-0.3 26.5-0.6 26.0-1.2 26.7-1.5 22MAR2000 25.3-1.0 26.9-0.3 26.3-1.1 26.7-1.5 29MAR2000 25.6-0.5 27.5 0.2 26.8-0.7 27.0-1.3 05APR2000 25.7-0.1 27.6 0.2 27.0-0.6 27.2-1.2 12APR2000 26.1 0.5 27.4-0.1 26.9-0.8 27.3-1.2 19APR2000 25.6 0.3 27.5 0.0 27.0-0.8 27.4-1.1 26APR2000 25.3 0.3 27.5 0.1 27.1-0.7 27.5-1.0 03MAY2000 24.9 0.2 27.3 0.0 27.1-0.7 27.5-1.1 10MAY2000 24.3-0.1 27.2 0.0 27.1-0.7 27.7-1.0 17MAY2000 23.9-0.3 26.6-0.4 27.1-0.8 27.8-1.0 24MAY2000 23.2-0.6 26.4-0.5 27.1-0.7 28.0-0.8 31MAY2000 23.2-0.3 26.3-0.4 27.2-0.5 28.1-0.7 07JUN2000 22.6-0.6 26.0-0.7 27.0-0.7 28.0-0.8 14JUN2000 22.4-0.5 25.9-0.6 27.1-0.6 28.1-0.7 21JUN2000 21.7-0.9 25.8-0.5 27.0-0.6 28.2-0.7 28JUN2000 21.4-0.9 25.5-0.6 26.9-0.6 28.0-0.8 05JUL2000 21.0-1.0 25.6-0.3 26.9-0.5 28.0-0.8 12JUL2000 20.6-1.2 25.2-0.5 26.8-0.5 28.1-0.7 19JUL2000 20.3-1.2 24.9-0.6 26.7-0.5 28.2-0.5 26JUL2000 20.2-1.1 24.9-0.5 26.5-0.6 28.3-0.4 02AUG2000 20.2-0.8 24.7-0.5 26.6-0.4 28.4-0.3 09AUG2000 20.1-0.8 24.5-0.6 26.6-0.3 28.4-0.3 16AUG2000 20.5-0.2 24.4-0.6 26.4-0.4 28.3-0.3 23AUG2000 20.1-0.5 24.3-0.7 26.3-0.5 28.1-0.5 30AUG2000 19.3-1.2 24.5-0.4 26.4-0.4 28.2-0.4 06SEP2000 20.2-0.3 24.4-0.4 26.3-0.5 28.4-0.2 13SEP2000 19.7-0.7 24.3-0.6 26.1-0.6 28.4-0.2 20SEP2000 20.1-0.3 24.2-0.6 26.1-0.6 28.5-0.2 27SEP2000 19.9-0.6 24.4-0.5 26.3-0.4 28.4-0.3 04OCT2000 20.2-0.5 24.7-0.2 26.1-0.6 28.1-0.5 11OCT2000 20.2-0.5 24.4-0.5 26.0-0.6 28.2-0.4 18OCT2000 20.5-0.3 24.3-0.6 25.9-0.8 28.1-0.5 25OCT2000 20.7-0.4 24.3-0.6 25.9-0.8 28.1-0.6 01NOV2000 20.6-0.6 24.2-0.8 25.6-1.1 28.0-0.6 08NOV2000 20.6-0.8 24.0-1.0 25.6-1.1 28.1-0.6 15NOV2000 20.3-1.3 24.2-0.7 25.9-0.7 28.2-0.4 22NOV2000 20.2-1.7 24.1-0.9 25.9-0.7 28.1-0.5 29NOV2000 21.4-0.7 24.4-0.6 25.9-0.7 27.8-0.7 06DEC2000 21.8-0.6 24.4-0.7 25.6-1.0 27.5-1.1 13DEC2000 22.4-0.2 24.5-0.6 25.6-1.0 27.6-0.9 20DEC2000 22.4-0.6 24.4-0.8 25.6-1.0 27.6-0.8 27DEC2000 22.2-1.2 24.4-1.0 25.5-1.0 27.5-0.9 03JAN2001 22.8-0.9 24.5-0.9 25.6-1.0 27.5-0.8 10JAN2001 23.3-0.8 24.7-0.8 25.6-1.0 27.5-0.9 17JAN2001 23.7-0.8 25.1-0.6 25.8-0.8 27.5-0.8 24JAN2001 24.6-0.3 25.3-0.5 25.9-0.8 27.4-0.8 31JAN2001 25.2 0.0 25.4-0.6 26.0-0.7 27.3-0.9 07FEB2001 25.6-0.1 25.8-0.4 25.9-0.8 27.1-1.0 14FEB2001 25.6-0.4 25.9-0.5 26.0-0.7 27.2-0.9 21FEB2001 26.0-0.2 26.4-0.1 26.3-0.6 27.3-0.8 28FEB2001 26.7 0.4 26.7 0.0 26.4-0.5 27.4-0.8 07MAR2001 27.2 0.8 27.1 0.2 26.6-0.5 27.4-0.7 14MAR2001 27.3 0.8 27.2 0.1 26.8-0.4 27.6-0.6 21MAR2001 27.6 1.3 27.4 0.2 27.1-0.2 27.7-0.6 28MAR2001 27.7 1.6 27.4 0.2 27.0-0.4 27.8-0.5 04APR2001 27.3 1.5 27.6 0.2 27.3-0.3 27.9-0.4 11APR2001 27.2 1.6 27.7 0.3 27.6-0.1 28.1-0.3 18APR2001 26.2 0.8 27.7 0.2 27.7-0.1 28.3-0.2 25APR2001 25.9 0.8 27.2-0.1 27.6-0.2 28.2-0.3 02MAY2001 24.2-0.6 27.1-0.2 27.5-0.3 28.3-0.3 09MAY2001 23.9-0.6 27.0-0.1 27.6-0.2 28.6-0.1 16MAY2001 23.6-0.6 26.7-0.4 27.5-0.3 28.6-0.1 23MAY2001 23.3-0.6 26.9-0.1 27.7-0.1 28.8 0.0 30MAY2001 23.1-0.5 26.7 0.0 27.7-0.1 28.8 0.0 06JUN2001 22.1-1.2 26.7 0.1 27.8 0.1 28.8 0.0 13JUN2001 21.7-1.3 26.3-0.1 27.7 0.0 28.8 0.0 20JUN2001 21.5-1.2 26.3 0.0 27.7 0.1 28.8-0.1 27JUN2001 20.7-1.6 25.9-0.2 27.6 0.1 28.9 0.1 04JUL2001 20.7-1.4 25.6-0.3 27.5 0.1 29.0 0.2 11JUL2001 21.2-0.6 25.5-0.2 27.4 0.1 29.0 0.2 18JUL2001 20.9-0.7 25.5-0.1 27.3 0.1 29.1 0.3 25JUL2001 20.7-0.6 25.2-0.2 27.2 0.1 29.1 0.3 01AUG2001 20.3-0.8 25.0-0.3 27.2 0.1 29.1 0.4 08AUG2001 20.1-0.8 25.0-0.1 27.0 0.1 28.9 0.2 15AUG2001 19.8-0.9 24.7-0.3 26.8 0.0 28.9 0.2 22AUG2001 19.8-0.8 24.6-0.3 26.8 0.0 28.9 0.2 29AUG2001 19.7-0.9 24.3-0.6 26.6-0.2 29.0 0.4 05SEP2001 19.6-0.8 24.4-0.5 26.6-0.1 29.2 0.5 12SEP2001 19.1-1.3 24.2-0.7 26.6-0.2 29.1 0.4 19SEP2001 19.4-1.0 24.2-0.6 26.5-0.2 29.2 0.5 26SEP2001 19.6-0.9 24.3-0.6 26.5-0.2 29.1 0.4 03OCT2001 19.2-1.4 24.4-0.5 26.5-0.2 28.9 0.3 10OCT2001 19.6-1.1 24.4-0.5 26.5-0.2 29.0 0.4 17OCT2001 19.4-1.4 24.5-0.4 26.6 0.0 29.0 0.3 24OCT2001 19.6-1.4 24.5-0.4 26.6 0.0 29.1 0.4 31OCT2001 19.9-1.3 24.5-0.5 26.6 0.0 28.9 0.3 07NOV2001 20.3-1.1 24.3-0.7 26.6-0.1 29.1 0.5 14NOV2001 20.1-1.5 24.3-0.7 26.5-0.1 29.0 0.4 21NOV2001 20.6-1.2 24.3-0.7 26.3-0.3 28.8 0.2 28NOV2001 21.4-0.7 24.4-0.6 26.3-0.3 28.7 0.2 05DEC2001 21.4-1.0 24.5-0.6 26.1-0.5 28.6 0.1 12DEC2001 21.6-1.1 24.5-0.7 26.1-0.4 28.6 0.1 19DEC2001 22.0-0.9 24.6-0.5 26.2-0.4 28.5 0.0 26DEC2001 22.5-0.8 24.8-0.5 26.2-0.3 28.6 0.2 02JAN2002 23.2-0.5 24.8-0.7 26.2-0.4 28.6 0.2 09JAN2002 23.3-0.8 25.0-0.5 26.5-0.1 28.8 0.5 16JAN2002 23.5-1.0 25.0-0.7 26.4-0.1 28.9 0.6 23JAN2002 23.8-1.1 25.3-0.5 26.6 0.0 28.9 0.6 30JAN2002 24.3-0.9 25.5-0.5 26.7 0.1 28.7 0.6 06FEB2002 25.4-0.2 26.0-0.2 26.9 0.3 28.8 0.7 13FEB2002 25.9-0.1 26.2-0.2 27.0 0.3 28.9 0.8 20FEB2002 26.3 0.1 26.4-0.1 26.8 0.0 28.6 0.5 27FEB2002 27.4 1.1 26.7 0.0 27.1 0.1 28.6 0.5 06MAR2002 27.1 0.8 27.1 0.2 27.2 0.1 28.5 0.4 13MAR2002 27.6 1.2 27.2 0.1 27.3 0.1 28.6 0.4 20MAR2002 27.8 1.4 27.3 0.1 27.4 0.1 28.8 0.6 27MAR2002 27.4 1.3 27.4 0.2 27.4 0.0 28.7 0.5 03APR2002 27.1 1.2 27.6 0.2 27.7 0.2 28.8 0.5 10APR2002 27.1 1.5 27.8 0.4 28.0 0.3 29.0 0.6 17APR2002 26.3 0.9 27.6 0.1 27.9 0.2 29.1 0.6 24APR2002 25.4 0.3 27.3 0.0 28.0 0.2 29.3 0.7 01MAY2002 25.4 0.6 27.4 0.1 28.0 0.2 29.2 0.6 08MAY2002 25.0 0.5 27.3 0.1 28.0 0.2 29.2 0.5 15MAY2002 24.5 0.2 27.2 0.1 28.0 0.1 29.4 0.6 22MAY2002 24.4 0.5 27.1 0.2 28.3 0.4 29.6 0.8 29MAY2002 24.5 0.9 27.4 0.5 28.4 0.7 29.7 0.9 05JUN2002 23.5 0.2 27.3 0.6 28.6 0.9 29.8 1.0 12JUN2002 22.7-0.3 27.1 0.6 28.6 0.9 29.7 0.9 19JUN2002 22.1-0.6 27.0 0.6 28.4 0.8 29.6 0.8 26JUN2002 22.0-0.4 26.9 0.8 28.2 0.7 29.4 0.6 03JUL2002 21.8-0.3 26.6 0.6 28.0 0.6 29.4 0.6 10JUL2002 21.1-0.8 26.3 0.5 28.0 0.7 29.4 0.6 17JUL2002 21.2-0.4 26.0 0.4 28.0 0.8 29.5 0.7 24JUL2002 20.5-0.8 25.7 0.2 27.9 0.8 29.5 0.8 31JUL2002 20.3-0.8 25.5 0.2 27.9 0.9 29.6 0.9 07AUG2002 20.0-0.9 25.3 0.1 27.8 0.9 29.4 0.7 14AUG2002 20.3-0.4 25.5 0.5 27.8 0.9 29.4 0.7 21AUG2002 19.8-0.8 25.5 0.5 27.8 1.0 29.3 0.7 28AUG2002 19.8-0.7 25.6 0.7 27.8 1.0 29.4 0.7 04SEP2002 19.3-1.2 25.4 0.5 27.7 0.9 29.3 0.7 11SEP2002 20.2-0.2 25.5 0.6 27.8 1.0 29.4 0.7 18SEP2002 20.1-0.3 25.5 0.7 27.9 1.2 29.5 0.9 25SEP2002 20.1-0.4 25.7 0.8 27.9 1.2 29.5 0.8 02OCT2002 20.1-0.5 25.7 0.8 28.0 1.3 29.5 0.8 09OCT2002 20.7 0.0 25.6 0.7 27.9 1.2 29.4 0.7 16OCT2002 21.7 0.9 25.7 0.8 27.9 1.2 29.4 0.7 23OCT2002 21.6 0.6 26.0 1.1 28.2 1.6 29.8 1.2 30OCT2002 21.9 0.7 26.3 1.4 28.3 1.7 29.9 1.2 06NOV2002 22.0 0.6 26.2 1.3 28.2 1.6 29.8 1.2 13NOV2002 21.9 0.4 26.3 1.4 28.3 1.7 29.9 1.3 20NOV2002 22.5 0.7 26.5 1.5 28.3 1.7 29.9 1.3 27NOV2002 22.6 0.6 26.4 1.4 28.2 1.6 29.7 1.2 04DEC2002 23.0 0.7 26.6 1.6 28.2 1.6 29.6 1.0 11DEC2002 23.5 0.9 26.5 1.4 28.1 1.5 29.4 1.0 18DEC2002 23.3 0.4 26.5 1.3 28.1 1.5 29.4 1.0 25DEC2002 23.5 0.2 26.3 1.0 28.0 1.4 29.5 1.1 01JAN2003 24.2 0.6 26.6 1.2 28.1 1.5 29.4 1.1 08JAN2003 23.9-0.1 26.3 0.8 27.9 1.3 29.2 0.9 15JAN2003 24.1-0.3 26.3 0.7 27.7 1.2 29.3 1.0 22JAN2003 24.4-0.4 26.5 0.7 27.7 1.1 29.3 1.0 29JAN2003 24.9-0.3 26.3 0.3 27.5 0.8 29.1 0.9 05FEB2003 25.3-0.3 26.4 0.3 27.3 0.6 28.9 0.7 12FEB2003 25.7-0.3 26.6 0.3 27.4 0.7 28.9 0.9 19FEB2003 26.2 0.0 27.0 0.6 27.7 0.9 29.1 1.0 26FEB2003 26.0-0.3 26.8 0.1 27.6 0.7 29.2 1.1 05MAR2003 25.7-0.7 27.0 0.2 27.6 0.6 29.0 0.9 12MAR2003 25.7-0.8 27.2 0.1 27.7 0.6 29.0 0.8 19MAR2003 26.5 0.1 27.6 0.4 28.0 0.8 29.1 0.9 26MAR2003 25.5-0.7 27.4 0.2 27.9 0.5 29.0 0.7 02APR2003 25.7-0.3 27.2-0.1 27.8 0.3 28.9 0.6 09APR2003 24.8-0.9 27.3-0.1 27.8 0.2 29.0 0.6 16APR2003 24.3-1.1 27.3-0.2 27.9 0.1 28.9 0.5 23APR2003 23.6-1.6 27.2-0.2 27.8 0.0 28.9 0.4 30APR2003 23.2-1.6 26.5-0.8 27.7-0.1 28.9 0.3 07MAY2003 23.0-1.6 26.3-0.9 27.4-0.4 28.9 0.2 14MAY2003 22.5-1.8 26.2-0.9 27.3-0.5 28.8 0.1 21MAY2003 22.3-1.7 26.0-1.0 27.3-0.6 28.8 0.1 28MAY2003 22.0-1.6 26.0-0.9 27.4-0.4 29.0 0.2 04JUN2003 21.9-1.4 25.7-0.9 27.4-0.3 29.0 0.2 11JUN2003 21.6-1.5 25.7-0.8 27.4-0.2 29.1 0.2 18JUN2003 21.1-1.6 25.9-0.5 27.5-0.1 29.1 0.3 25JUN2003 21.6-0.8 25.9-0.2 27.6 0.0 29.1 0.3 02JUL2003 21.4-0.7 25.9-0.1 27.5 0.1 29.2 0.4 09JUL2003 21.1-0.8 25.9 0.0 27.6 0.3 29.2 0.4 16JUL2003 20.8-0.8 25.8 0.1 27.5 0.3 29.1 0.3 23JUL2003 20.2-1.2 25.7 0.2 27.3 0.2 29.1 0.3 30JUL2003 20.3-0.9 25.5 0.2 27.1 0.1 29.0 0.3 06AUG2003 20.2-0.8 25.3 0.1 27.0 0.0 29.0 0.3 13AUG2003 20.0-0.8 25.0 0.0 26.9 0.1 29.1 0.5 20AUG2003 20.6 0.0 24.9-0.1 26.7-0.1 29.0 0.4 27AUG2003 20.0-0.5 24.8-0.2 26.7-0.1 29.0 0.3 03SEP2003 20.4-0.1 25.0 0.1 26.9 0.1 29.0 0.3 10SEP2003 19.9-0.5 24.8-0.1 26.8 0.0 28.9 0.2 17SEP2003 19.5-0.8 25.0 0.1 26.9 0.2 28.9 0.3 24SEP2003 20.5 0.0 25.0 0.2 27.1 0.4 29.1 0.5 01OCT2003 20.1-0.5 25.3 0.4 27.3 0.6 29.1 0.4 08OCT2003 20.9 0.2 25.5 0.6 27.4 0.7 29.1 0.5 15OCT2003 20.9 0.1 25.2 0.3 27.1 0.4 29.1 0.5 22OCT2003 21.5 0.6 25.3 0.3 27.1 0.4 29.3 0.6 29OCT2003 21.4 0.3 25.4 0.4 27.2 0.5 29.3 0.7 05NOV2003 21.6 0.3 25.3 0.4 27.0 0.4 29.4 0.7 12NOV2003 21.8 0.3 25.3 0.4 26.9 0.3 29.3 0.7 19NOV2003 22.0 0.3 25.4 0.4 27.1 0.4 29.3 0.7 26NOV2003 22.3 0.3 25.5 0.5 27.2 0.5 29.2 0.6 03DEC2003 22.5 0.2 25.6 0.5 27.1 0.5 29.2 0.6 10DEC2003 22.9 0.3 25.5 0.4 27.0 0.4 29.1 0.6 17DEC2003 23.0 0.1 25.4 0.3 26.8 0.3 29.0 0.5 24DEC2003 23.0-0.2 25.6 0.3 26.8 0.2 28.9 0.4 31DEC2003 23.8 0.2 25.7 0.4 26.7 0.1 28.7 0.4 07JAN2004 24.2 0.2 25.7 0.2 26.6 0.0 28.7 0.3 14JAN2004 24.6 0.2 25.9 0.3 26.6 0.0 28.9 0.6 21JAN2004 24.8 0.0 26.0 0.3 27.0 0.4 28.9 0.7 28JAN2004 24.7-0.4 26.1 0.1 26.9 0.2 28.8 0.6 04FEB2004 25.0-0.5 26.0-0.1 26.8 0.1 28.7 0.6 11FEB2004 25.4-0.5 26.4 0.1 26.8 0.1 28.5 0.4 18FEB2004 26.1 0.0 26.7 0.2 26.9 0.1 28.5 0.4 25FEB2004 26.3 0.1 26.7 0.1 27.0 0.1 28.5 0.4 03MAR2004 25.8-0.6 26.7-0.1 26.9-0.1 28.5 0.4 10MAR2004 25.4-1.0 27.1 0.1 26.9-0.2 28.3 0.1 17MAR2004 25.6-0.8 27.4 0.2 27.1-0.1 28.3 0.1 24MAR2004 26.0-0.3 27.4 0.1 27.3-0.1 28.4 0.2 31MAR2004 26.1 0.1 27.4 0.1 27.5 0.0 28.5 0.2 07APR2004 26.0 0.2 27.4 0.0 27.7 0.1 28.6 0.2 14APR2004 25.2-0.3 27.4 0.0 27.8 0.1 28.7 0.2 21APR2004 24.8-0.4 27.4 0.0 28.0 0.2 28.8 0.3 28APR2004 24.1-0.9 27.2-0.1 28.1 0.3 28.9 0.3 05MAY2004 23.6-1.0 26.7-0.5 27.9 0.1 29.0 0.3 12MAY2004 23.1-1.3 26.6-0.6 28.0 0.1 29.0 0.3 19MAY2004 22.8-1.3 26.8-0.3 28.2 0.4 29.2 0.4 26MAY2004 22.7-1.0 26.7-0.2 28.1 0.3 29.4 0.6 02JUN2004 22.1-1.4 26.7 0.0 28.1 0.3 29.2 0.4 09JUN2004 21.7-1.4 26.6 0.0 28.0 0.3 29.2 0.4 16JUN2004 21.5-1.3 26.4-0.1 27.8 0.1 29.2 0.4 23JUN2004 21.3-1.2 26.0-0.3 27.5 0.0 29.1 0.2 30JUN2004 21.0-1.2 25.6-0.4 27.3-0.1 29.1 0.3 07JUL2004 20.8-1.2 25.4-0.4 27.6 0.3 29.4 0.6 14JUL2004 20.9-0.8 25.5-0.2 27.7 0.4 29.4 0.6 21JUL2004 20.7-0.7 25.2-0.3 27.7 0.6 29.4 0.7 28JUL2004 20.3-0.9 25.4 0.0 27.9 0.8 29.4 0.6 04AUG2004 19.9-1.1 25.2 0.0 27.8 0.8 29.4 0.7 11AUG2004 19.7-1.1 25.1 0.0 27.6 0.7 29.2 0.6 18AUG2004 19.6-1.0 24.9 0.0 27.4 0.6 29.2 0.5 25AUG2004 19.2-1.4 24.9 0.0 27.4 0.7 29.3 0.7 01SEP2004 20.1-0.4 25.0 0.1 27.4 0.7 29.6 0.9 08SEP2004 19.8-0.6 25.0 0.1 27.4 0.6 29.6 0.9 15SEP2004 19.8-0.5 25.1 0.3 27.5 0.7 29.6 0.9 22SEP2004 20.4-0.1 25.3 0.4 27.6 0.9 29.6 0.9 29SEP2004 20.5-0.1 25.4 0.5 27.5 0.8 29.5 0.8 06OCT2004 20.8 0.1 25.2 0.4 27.4 0.7 29.5 0.8 13OCT2004 20.5-0.2 25.2 0.3 27.3 0.6 29.4 0.8 20OCT2004 21.4 0.5 25.4 0.5 27.4 0.7 29.6 1.0 27OCT2004 21.3 0.2 25.4 0.5 27.4 0.7 29.7 1.0 03NOV2004 21.5 0.3 25.4 0.5 27.3 0.6 29.6 1.0 10NOV2004 22.0 0.5 25.5 0.5 27.3 0.6 29.5 0.9 17NOV2004 22.2 0.5 25.5 0.5 27.3 0.7 29.6 1.0 24NOV2004 21.9 0.0 25.4 0.4 27.3 0.7 29.5 1.0 01DEC2004 22.4 0.2 25.6 0.6 27.4 0.8 29.4 0.9 08DEC2004 22.3-0.2 25.7 0.6 27.4 0.8 29.4 0.8 15DEC2004 22.9 0.2 25.8 0.6 27.3 0.7 29.2 0.8 22DEC2004 22.9-0.2 25.9 0.6 27.3 0.7 29.5 1.1 29DEC2004 23.6 0.2 25.8 0.5 27.2 0.6 29.5 1.1 05JAN2005 23.7-0.2 25.7 0.3 27.1 0.5 29.3 0.9 12JAN2005 24.2 0.0 25.9 0.3 27.1 0.5 29.2 0.9 19JAN2005 25.0 0.3 26.0 0.3 27.1 0.5 29.2 0.9 26JAN2005 24.9-0.1 26.0 0.1 27.1 0.5 29.2 1.0 02FEB2005 24.6-0.8 25.9-0.2 26.9 0.2 29.0 0.8 09FEB2005 25.1-0.6 26.2-0.1 27.0 0.3 28.8 0.7 16FEB2005 25.8-0.3 26.4 0.0 27.0 0.3 28.8 0.7 23FEB2005 25.7-0.5 26.3-0.3 27.0 0.1 28.7 0.6 02MAR2005 25.2-1.1 26.2-0.6 27.0 0.0 28.8 0.6 09MAR2005 25.9-0.5 26.7-0.2 27.2 0.1 28.8 0.6 16MAR2005 25.9-0.6 27.3 0.2 27.6 0.4 29.0 0.8 23MAR2005 25.0-1.3 27.3 0.0 27.9 0.5 28.9 0.7 30MAR2005 24.9-1.1 27.4 0.1 28.0 0.5 29.0 0.7 06APR2005 24.8-1.0 27.4 0.0 28.0 0.4 28.9 0.5 13APR2005 24.6-0.9 27.7 0.2 27.9 0.1 28.8 0.3 20APR2005 24.8-0.5 27.9 0.5 28.2 0.4 28.9 0.4 27APR2005 25.4 0.4 28.1 0.8 28.3 0.5 29.1 0.5 04MAY2005 25.2 0.5 28.1 0.9 28.3 0.4 29.1 0.4 11MAY2005 24.6 0.2 27.6 0.5 28.2 0.4 29.1 0.3 18MAY2005 24.5 0.4 27.4 0.3 28.2 0.4 29.3 0.5 25MAY2005 23.5-0.3 27.1 0.2 28.2 0.4 29.2 0.4 01JUN2005 23.0-0.5 26.8 0.0 28.1 0.3 29.2 0.4 08JUN2005 22.6-0.5 26.9 0.3 28.1 0.4 29.2 0.4 15JUN2005 22.3-0.5 26.8 0.3 28.1 0.4 29.2 0.4 22JUN2005 22.2-0.3 26.9 0.6 28.0 0.5 29.1 0.3 29JUN2005 21.6-0.7 26.7 0.6 28.0 0.5 29.1 0.3 06JUL2005 21.5-0.5 26.3 0.4 27.8 0.4 29.2 0.4 13JUL2005 21.5-0.3 26.2 0.5 27.6 0.3 29.1 0.3 20JUL2005 20.7-0.8 25.8 0.2 27.3 0.2 29.0 0.2 27JUL2005 20.8-0.5 25.4 0.0 27.1 0.1 28.9 0.1 03AUG2005 20.8-0.2 25.2-0.1 26.9-0.1 28.8 0.1 10AUG2005 20.6-0.2 25.2 0.1 26.9 0.0 28.7 0.0 17AUG2005 20.4-0.2 25.4 0.4 27.0 0.2 28.9 0.2 24AUG2005 20.8 0.3 25.2 0.3 26.9 0.1 28.9 0.3 31AUG2005 20.4-0.1 24.8-0.1 26.7-0.1 28.9 0.2 07SEP2005 20.0-0.5 24.5-0.3 26.5-0.3 28.7 0.1 14SEP2005 19.7-0.7 24.5-0.4 26.4-0.3 28.7 0.0 21SEP2005 19.6-0.9 24.7-0.2 26.8 0.1 28.9 0.3 28SEP2005 19.6-0.9 24.5-0.4 26.7 0.0 28.9 0.3 05OCT2005 19.4-1.2 24.6-0.3 26.9 0.2 29.0 0.3 12OCT2005 20.0-0.8 24.9 0.0 26.9 0.2 28.9 0.3 19OCT2005 19.8-1.1 24.7-0.2 26.7 0.0 28.8 0.2 26OCT2005 19.9-1.2 24.7-0.2 26.6-0.1 28.8 0.1 02NOV2005 19.8-1.4 24.3-0.7 26.5-0.2 28.7 0.1 09NOV2005 20.2-1.2 24.2-0.7 26.3-0.4 28.6 0.0 16NOV2005 21.0-0.6 24.3-0.7 26.5-0.2 28.6 0.0 23NOV2005 21.2-0.7 24.3-0.7 26.3-0.3 28.7 0.1 30NOV2005 21.2-0.9 24.2-0.9 26.1-0.5 28.6 0.1 07DEC2005 21.4-1.1 24.1-1.0 26.0-0.6 28.6 0.0 14DEC2005 21.8-0.9 24.0-1.1 25.8-0.7 28.5 0.0 21DEC2005 23.1 0.1 24.3-0.9 25.8-0.8 28.1-0.3 28DEC2005 23.3-0.2 24.7-0.6 25.9-0.7 28.0-0.4 04JAN2006 23.4-0.4 25.0-0.5 25.8-0.7 27.9-0.5 11JAN2006 24.2 0.0 25.0-0.6 25.7-0.9 27.8-0.5 18JAN2006 24.3-0.2 24.8-0.9 25.5-1.1 27.6-0.7 25JAN2006 24.8-0.1 25.1-0.8 25.5-1.1 27.4-0.8 01FEB2006 25.0-0.3 25.5-0.6 25.8-0.9 27.4-0.7 08FEB2006 25.9 0.2 25.8-0.4 26.0-0.7 27.3-0.9 15FEB2006 27.1 1.0 26.3 0.0 26.1-0.6 27.3-0.8 22FEB2006 26.8 0.6 26.4-0.2 26.3-0.5 27.4-0.7 01MAR2006 27.0 0.7 26.2-0.6 26.1-0.9 27.4-0.7 08MAR2006 26.9 0.5 26.5-0.4 26.4-0.7 27.6-0.6 15MAR2006 26.7 0.2 26.5-0.6 26.5-0.7 27.7-0.5 22MAR2006 26.6 0.3 26.6-0.6 26.7-0.6 28.0-0.3 29MAR2006 26.0-0.1 26.8-0.5 27.0-0.5 28.1-0.2 05APR2006 24.9-0.9 27.1-0.3 27.3-0.3 28.1-0.2 12APR2006 24.0-1.5 27.6 0.1 27.7 0.0 28.3-0.1 19APR2006 23.4-2.0 27.2-0.2 27.7-0.1 28.4-0.1 26APR2006 23.1-1.9 27.2-0.2 27.7-0.1 28.5 0.0 03MAY2006 23.9-0.8 27.2-0.1 27.7-0.1 28.6-0.1 10MAY2006 24.1-0.4 27.1 0.0 27.8 0.0 28.8 0.1 17MAY2006 23.8-0.3 27.1 0.0 28.1 0.2 29.1 0.3 24MAY2006 23.5-0.3 26.9 0.0 28.0 0.2 29.0 0.2 31MAY2006 23.4-0.1 26.8 0.0 28.0 0.3 29.2 0.4 07JUN2006 22.6-0.6 26.6 0.0 28.0 0.3 29.2 0.4 14JUN2006 22.8-0.1 26.5 0.1 27.9 0.3 29.2 0.3 21JUN2006 22.5-0.1 26.3 0.0 27.8 0.2 29.2 0.3 28JUN2006 22.4 0.0 26.1 0.0 27.6 0.1 29.0 0.2 05JUL2006 22.2 0.1 26.0 0.1 27.5 0.1 29.0 0.1 12JUL2006 22.0 0.2 25.8 0.0 27.3 0.0 29.0 0.2 19JUL2006 22.3 0.8 25.8 0.2 27.3 0.1 29.1 0.3 26JUL2006 22.0 0.7 25.7 0.3 27.3 0.2 29.2 0.4 02AUG2006 21.9 0.8 25.5 0.3 27.2 0.2 29.2 0.5 09AUG2006 21.7 0.8 25.3 0.2 27.1 0.2 29.1 0.4 16AUG2006 21.6 0.9 25.4 0.4 27.2 0.4 29.2 0.6 23AUG2006 21.5 1.0 25.5 0.5 27.3 0.5 29.3 0.6 30AUG2006 21.1 0.6 25.6 0.6 27.3 0.5 29.3 0.7 06SEP2006 21.6 1.2 25.6 0.7 27.4 0.6 29.4 0.8 13SEP2006 21.3 0.9 25.8 0.9 27.3 0.6 29.4 0.7 20SEP2006 21.2 0.8 25.9 1.1 27.4 0.7 29.4 0.8 27SEP2006 21.7 1.1 25.7 0.8 27.2 0.5 29.3 0.7 04OCT2006 21.7 1.0 25.7 0.8 27.2 0.5 29.2 0.6 11OCT2006 22.2 1.4 26.1 1.2 27.5 0.8 29.4 0.8 18OCT2006 22.4 1.5 26.0 1.1 27.5 0.8 29.5 0.8 25OCT2006 22.7 1.6 26.1 1.1 27.6 0.9 29.6 1.0 01NOV2006 22.4 1.2 25.9 1.0 27.6 0.9 29.5 0.9 08NOV2006 22.5 1.1 25.9 0.9 27.6 0.9 29.6 1.0 15NOV2006 22.6 1.0 26.1 1.1 27.8 1.2 29.7 1.1 22NOV2006 22.7 0.8 26.3 1.2 27.8 1.2 29.6 1.1 29NOV2006 23.0 0.9 26.1 1.1 27.8 1.2 29.6 1.0 06DEC2006 22.9 0.5 26.1 1.1 27.9 1.3 29.6 1.1 13DEC2006 22.9 0.2 26.3 1.2 27.8 1.2 29.5 1.0 20DEC2006 23.7 0.6 26.5 1.3 27.7 1.2 29.4 1.0 27DEC2006 24.0 0.6 26.6 1.3 27.7 1.1 29.4 1.0 03JAN2007 24.3 0.5 26.4 0.9 27.5 0.9 29.2 0.8 10JAN2007 24.9 0.7 26.7 1.1 27.5 0.9 29.1 0.8 17JAN2007 25.0 0.4 26.4 0.7 27.2 0.6 28.8 0.6 24JAN2007 25.2 0.3 26.5 0.7 27.1 0.5 28.7 0.5 31JAN2007 25.6 0.3 26.6 0.6 27.0 0.3 28.7 0.5 07FEB2007 26.0 0.4 26.6 0.4 26.9 0.2 28.6 0.4 14FEB2007 26.3 0.3 26.3-0.1 26.7 0.0 28.6 0.6 21FEB2007 26.4 0.3 26.4-0.1 26.8-0.1 28.6 0.5 28FEB2007 25.7-0.6 26.4-0.3 26.9 0.0 28.5 0.4 07MAR2007 25.8-0.5 26.6-0.3 26.9-0.2 28.5 0.4 14MAR2007 26.0-0.5 27.3 0.2 27.3 0.1 28.6 0.4 21MAR2007 25.6-0.8 26.8-0.4 27.2-0.1 28.5 0.3 28MAR2007 25.1-1.0 26.6-0.7 27.4 0.0 28.5 0.2 04APR2007 24.5-1.4 26.7-0.7 27.5 0.0 28.7 0.3 11APR2007 24.4-1.2 27.2-0.2 27.8 0.1 28.7 0.3 18APR2007 23.9-1.4 27.4-0.1 27.9 0.2 28.7 0.2 25APR2007 24.1-1.0 27.3-0.1 27.8 0.0 28.7 0.1 02MAY2007 23.6-1.2 26.9-0.4 27.7-0.1 28.6 0.0 09MAY2007 23.0-1.5 26.3-0.9 27.4-0.4 28.7 0.0 16MAY2007 22.9-1.3 26.3-0.8 27.5-0.4 28.8 0.1 23MAY2007 22.3-1.6 26.3-0.6 27.7-0.1 29.0 0.2 30MAY2007 21.8-1.8 26.1-0.7 27.6-0.2 29.0 0.2 06JUN2007 21.6-1.6 25.8-0.9 27.6-0.1 29.0 0.2 13JUN2007 22.2-0.7 26.1-0.4 27.7 0.1 29.1 0.3 20JUN2007 21.8-0.8 25.9-0.5 27.6 0.0 28.9 0.1 27JUN2007 20.7-1.7 25.5-0.6 27.3-0.1 28.8 0.0 04JUL2007 21.2-0.9 25.3-0.6 27.0-0.4 28.7-0.1 11JUL2007 20.1-1.7 24.9-0.9 26.8-0.5 28.8 0.0 18JUL2007 19.9-1.7 24.8-0.8 26.9-0.3 28.9 0.1 25JUL2007 20.3-1.0 24.5-1.0 26.6-0.5 28.9 0.1 01AUG2007 19.6-1.5 24.1-1.2 26.4-0.6 28.7 0.0 08AUG2007 19.3-1.6 23.8-1.3 26.2-0.7 28.6-0.1 15AUG2007 19.7-1.0 24.0-1.0 26.3-0.6 28.6-0.1 22AUG2007 19.2-1.4 23.8-1.2 26.1-0.7 28.5-0.1 29AUG2007 18.4-2.1 23.7-1.3 26.1-0.7 28.4-0.2 05SEP2007 19.4-1.1 23.7-1.2 26.0-0.8 28.3-0.4 12SEP2007 18.6-1.8 23.6-1.3 25.8-1.0 28.0-0.6 19SEP2007 18.5-2.0 23.6-1.2 25.8-0.9 28.0-0.7 26SEP2007 18.4-2.1 23.2-1.7 25.6-1.1 28.0-0.7 03OCT2007 18.3-2.3 23.2-1.7 25.4-1.3 27.9-0.7 10OCT2007 18.8-1.9 23.3-1.6 24.9-1.8 27.7-1.0 17OCT2007 18.6-2.2 23.5-1.4 25.3-1.4 27.9-0.7 24OCT2007 19.2-1.8 23.5-1.4 25.3-1.4 27.8-0.8 31OCT2007 19.7-1.5 23.2-1.8 25.2-1.5 27.8-0.8 07NOV2007 19.3-2.1 23.0-2.0 25.0-1.6 27.5-1.1 14NOV2007 19.2-2.3 23.2-1.7 25.2-1.5 27.3-1.3 21NOV2007 19.8-2.0 23.2-1.8 24.9-1.7 27.1-1.5 28NOV2007 19.8-2.2 23.3-1.8 25.1-1.6 27.4-1.1 05DEC2007 20.6-1.8 23.5-1.5 25.1-1.5 27.5-1.0 12DEC2007 20.3-2.4 23.3-1.8 24.9-1.7 27.5-1.0 19DEC2007 21.3-1.6 23.7-1.5 25.0-1.6 27.2-1.3 26DEC2007 21.9-1.4 23.7-1.6 24.9-1.6 27.0-1.4 02JAN2008 22.6-1.1 23.9-1.5 25.0-1.6 26.8-1.6 09JAN2008 23.3-0.8 24.0-1.5 24.8-1.8 26.6-1.7 16JAN2008 24.1-0.4 24.0-1.6 24.6-2.0 26.6-1.7 23JAN2008 24.1-0.7 24.1-1.7 24.4-2.2 26.4-1.8 30JAN2008 25.1-0.1 24.7-1.3 24.9-1.7 26.5-1.7 06FEB2008 25.9 0.3 24.8-1.4 24.6-2.1 26.4-1.8 13FEB2008 25.9-0.1 24.7-1.7 24.5-2.2 26.4-1.7 20FEB2008 26.7 0.6 25.1-1.4 24.9-2.0 26.4-1.7 27FEB2008 27.2 0.9 25.8-0.9 25.3-1.6 26.3-1.8 05MAR2008 27.3 1.0 26.3-0.6 25.7-1.3 26.6-1.5 12MAR2008 27.2 0.7 26.5-0.5 26.0-1.1 26.7-1.4 19MAR2008 27.3 0.9 26.7-0.5 26.2-1.1 26.8-1.4 26MAR2008 27.1 0.9 26.8-0.5 26.3-1.0 27.0-1.2 02APR2008 27.2 1.2 26.9-0.4 26.5-1.0 27.2-1.2 09APR2008 25.9 0.2 27.3-0.2 26.7-1.0 27.3-1.1 16APR2008 25.5 0.0 27.3-0.2 26.9-0.9 27.4-1.1 23APR2008 25.5 0.4 27.1-0.3 26.9-0.9 27.5-1.1 30APR2008 24.5-0.3 27.3 0.0 27.1-0.7 27.7-0.9 07MAY2008 24.1-0.5 26.8-0.4 27.0-0.9 27.7-1.0 14MAY2008 24.5 0.2 27.1-0.1 27.1-0.7 27.8-0.9 21MAY2008 24.1 0.1 27.2 0.2 27.3-0.5 28.0-0.7 28MAY2008 24.1 0.5 27.2 0.4 27.3-0.5 28.0-0.8 04JUN2008 24.0 0.7 27.0 0.3 27.3-0.4 28.0-0.8 11JUN2008 23.7 0.7 26.7 0.2 27.2-0.5 28.0-0.8 18JUN2008 23.3 0.6 26.3-0.1 27.1-0.5 28.1-0.8 25JUN2008 23.0 0.6 26.2 0.0 27.1-0.4 28.1-0.7 02JUL2008 22.7 0.5 26.3 0.4 27.2-0.2 28.2-0.6 09JUL2008 22.7 0.8 26.3 0.5 27.3-0.1 28.3-0.5 16JUL2008 22.7 1.1 26.2 0.5 27.3 0.0 28.3-0.5 23JUL2008 22.6 1.2 25.9 0.5 27.1 0.0 28.2-0.6 30JUL2008 22.2 1.1 25.9 0.5 27.1 0.0 28.2-0.5 06AUG2008 22.0 1.1 25.9 0.7 27.0 0.1 28.2-0.5 13AUG2008 22.5 1.8 25.8 0.8 27.0 0.2 28.2-0.5 20AUG2008 21.1 0.5 25.5 0.5 26.7-0.1 28.1-0.6 27AUG2008 21.3 0.8 25.3 0.4 26.6-0.2 28.1-0.6 03SEP2008 21.3 0.8 25.3 0.4 26.6-0.2 28.1-0.6 10SEP2008 21.0 0.6 25.2 0.3 26.6-0.2 28.1-0.6 17SEP2008 21.1 0.8 24.9 0.1 26.4-0.4 28.1-0.6 24SEP2008 21.3 0.8 25.1 0.2 26.4-0.4 28.1-0.6 01OCT2008 21.0 0.4 24.7-0.2 26.2-0.5 28.3-0.4 08OCT2008 20.6-0.1 24.9 0.0 26.3-0.4 28.3-0.4 15OCT2008 20.7-0.1 24.9-0.1 26.4-0.3 28.3-0.4 22OCT2008 21.0 0.0 24.8-0.2 26.3-0.4 28.2-0.4 29OCT2008 20.5-0.7 24.6-0.3 26.4-0.2 28.2-0.4 05NOV2008 21.3 0.0 24.6-0.3 26.3-0.3 28.2-0.4 12NOV2008 21.8 0.3 24.9-0.1 26.5-0.2 28.1-0.5 19NOV2008 21.5-0.2 24.9-0.1 26.3-0.3 28.0-0.6 26NOV2008 21.2-0.8 24.6-0.4 26.1-0.5 27.9-0.6 03DEC2008 21.4-0.9 24.8-0.3 26.0-0.6 27.9-0.6 10DEC2008 22.1-0.4 24.6-0.5 25.8-0.8 27.7-0.7 17DEC2008 22.6-0.3 24.6-0.6 25.8-0.8 27.7-0.8 24DEC2008 22.8-0.5 24.5-0.8 25.6-1.0 27.5-0.9 31DEC2008 23.3-0.3 24.4-1.0 25.4-1.2 27.5-0.9 07JAN2009 23.4-0.6 24.5-0.9 25.4-1.2 27.4-1.0 14JAN2009 24.0-0.3 24.8-0.8 25.4-1.1 27.4-0.9 21JAN2009 25.3 0.5 25.5-0.2 25.8-0.8 27.4-0.8 28JAN2009 25.3 0.2 25.5-0.4 25.7-1.0 27.3-0.9 04FEB2009 25.1-0.4 25.4-0.7 25.7-0.9 27.2-0.9 11FEB2009 25.8 0.0 25.6-0.6 25.9-0.8 27.3-0.8 18FEB2009 26.3 0.2 26.1-0.4 26.2-0.6 27.4-0.7 25FEB2009 26.5 0.2 26.4-0.3 26.3-0.6 27.4-0.7 04MAR2009 26.5 0.2 26.1-0.7 26.4-0.7 27.5-0.6 11MAR2009 26.1-0.3 26.1-0.9 26.7-0.5 27.7-0.4 18MAR2009 26.0-0.4 26.4-0.7 26.7-0.6 27.8-0.4 25MAR2009 26.3 0.1 26.7-0.5 26.8-0.6 27.9-0.4 01APR2009 26.4 0.5 27.2-0.1 27.1-0.4 28.1-0.2 08APR2009 25.7 0.0 27.4 0.0 27.4-0.2 28.3-0.1 15APR2009 26.1 0.7 27.5 0.0 27.5-0.2 28.3-0.2 22APR2009 25.4 0.2 27.3-0.1 27.6-0.2 28.4-0.2 29APR2009 25.3 0.4 27.5 0.2 27.7-0.1 28.6 0.0 06MAY2009 25.3 0.7 27.6 0.4 27.9 0.1 28.8 0.1 13MAY2009 24.8 0.5 27.4 0.3 28.0 0.2 29.0 0.2 20MAY2009 24.4 0.4 27.4 0.4 28.2 0.4 29.1 0.3 27MAY2009 24.3 0.6 27.2 0.4 28.1 0.3 29.1 0.3 03JUN2009 23.7 0.4 27.1 0.4 27.9 0.2 29.0 0.2 10JUN2009 23.7 0.6 27.2 0.6 28.1 0.4 29.1 0.3 17JUN2009 23.9 1.1 27.2 0.8 28.2 0.5 29.2 0.4 24JUN2009 23.5 1.0 27.1 0.9 28.2 0.7 29.3 0.5 01JUL2009 22.9 0.7 26.9 0.9 28.2 0.7 29.3 0.5 08JUL2009 23.0 1.1 26.7 0.9 28.0 0.7 29.2 0.4 15JUL2009 22.7 1.0 26.6 1.0 28.0 0.7 29.2 0.4 22JUL2009 22.2 0.8 26.5 1.0 27.9 0.8 29.2 0.4 29JUL2009 22.1 0.9 26.2 0.8 27.7 0.6 29.1 0.4 05AUG2009 22.2 1.2 26.0 0.8 27.6 0.6 29.1 0.4 12AUG2009 21.4 0.6 25.9 0.8 27.4 0.6 29.1 0.4 19AUG2009 21.6 0.9 25.8 0.9 27.4 0.6 29.2 0.6 26AUG2009 21.5 1.0 25.9 1.0 27.6 0.8 29.3 0.7 02SEP2009 21.4 0.9 25.9 1.0 27.6 0.8 29.3 0.6 09SEP2009 21.1 0.6 25.7 0.8 27.5 0.8 29.3 0.6 16SEP2009 20.8 0.4 25.6 0.8 27.5 0.8 29.3 0.6 23SEP2009 20.5 0.0 25.6 0.7 27.4 0.7 29.2 0.6 30SEP2009 20.4-0.2 25.4 0.6 27.3 0.6 29.2 0.6 07OCT2009 20.1-0.5 25.5 0.6 27.3 0.6 29.4 0.7 14OCT2009 21.0 0.2 25.6 0.7 27.5 0.8 29.6 1.0 21OCT2009 21.2 0.3 25.8 0.8 27.7 1.0 29.8 1.2 28OCT2009 21.6 0.5 26.1 1.2 28.1 1.4 30.0 1.3 04NOV2009 21.8 0.5 26.2 1.3 28.2 1.6 29.9 1.3 11NOV2009 22.1 0.6 26.2 1.2 28.2 1.5 29.9 1.3 18NOV2009 22.2 0.5 26.2 1.2 28.2 1.6 29.8 1.2 25NOV2009 22.2 0.3 26.3 1.2 28.2 1.6 29.9 1.3 02DEC2009 22.7 0.4 26.5 1.4 28.2 1.6 29.7 1.2 09DEC2009 22.7 0.2 26.6 1.5 28.2 1.7 29.6 1.1 16DEC2009 22.6-0.2 26.7 1.5 28.3 1.8 29.7 1.2 23DEC2009 23.7 0.5 26.8 1.5 28.4 1.9 29.7 1.3 30DEC2009 24.3 0.7 26.7 1.4 28.3 1.7 29.6 1.2 06JAN2010 24.3 0.4 26.7 1.2 28.3 1.7 29.7 1.3 13JAN2010 24.6 0.3 26.7 1.1 28.2 1.6 29.6 1.3 20JAN2010 24.7 0.1 26.5 0.8 28.0 1.4 29.5 1.2 27JAN2010 25.5 0.4 26.6 0.7 27.8 1.2 29.3 1.1 03FEB2010 25.4 0.0 26.7 0.6 27.8 1.2 29.1 1.0 10FEB2010 25.7-0.2 27.0 0.7 27.9 1.2 29.0 0.9 17FEB2010 26.4 0.3 27.2 0.8 27.9 1.2 29.0 1.0 24FEB2010 26.5 0.3 27.4 0.8 28.0 1.1 29.2 1.1 03MAR2010 26.3-0.1 27.5 0.7 28.1 1.1 29.2 1.0 10MAR2010 26.0-0.4 27.5 0.5 28.3 1.2 29.3 1.1 17MAR2010 26.2-0.3 27.8 0.7 28.4 1.1 29.2 1.1 24MAR2010 26.3 0.0 27.9 0.7 28.4 1.0 29.2 0.9 31MAR2010 25.9-0.1 28.1 0.8 28.4 0.9 29.2 0.8 07APR2010 26.0 0.3 28.1 0.7 28.4 0.8 29.3 0.9 14APR2010 26.6 1.0 28.2 0.8 28.5 0.7 29.2 0.7 21APR2010 26.0 0.8 28.0 0.6 28.4 0.6 29.2 0.7 28APR2010 25.2 0.3 27.8 0.4 28.2 0.4 29.3 0.7 05MAY2010 24.8 0.2 27.7 0.5 28.0 0.2 29.1 0.4 12MAY2010 24.8 0.5 27.1 0.0 27.7-0.2 29.0 0.3 19MAY2010 24.0 0.0 26.8-0.3 27.5-0.3 29.0 0.2 26MAY2010 23.2-0.5 26.4-0.4 27.5-0.3 29.0 0.2 02JUN2010 23.4 0.0 26.1-0.6 27.3-0.5 28.8 0.0 09JUN2010 23.1 0.0 26.0-0.6 27.1-0.6 28.7-0.1 16JUN2010 22.3-0.5 25.8-0.6 27.0-0.7 28.6-0.2 23JUN2010 22.4-0.2 25.5-0.8 26.9-0.7 28.5-0.3 30JUN2010 21.6-0.7 25.3-0.8 26.7-0.8 28.3-0.5 07JUL2010 20.9-1.1 24.8-1.0 26.4-0.9 28.2-0.6 14JUL2010 20.0-1.6 24.6-1.1 26.1-1.1 28.2-0.6 21JUL2010 19.6-1.9 24.4-1.1 26.0-1.2 28.0-0.8 28JUL2010 19.5-1.7 24.0-1.4 25.6-1.4 27.8-1.0 04AUG2010 19.5-1.5 24.0-1.3 25.8-1.2 27.7-1.0 11AUG2010 19.6-1.2 24.1-1.0 25.7-1.2 27.5-1.2 18AUG2010 19.2-1.4 23.8-1.1 25.6-1.2 27.5-1.1 25AUG2010 19.2-1.4 23.7-1.3 25.2-1.6 27.1-1.5 01SEP2010 18.8-1.7 23.4-1.5 25.1-1.7 27.2-1.5 08SEP2010 19.1-1.3 23.5-1.4 25.2-1.6 27.1-1.6 15SEP2010 18.6-1.8 23.4-1.5 25.1-1.6 27.1-1.6 22SEP2010 19.3-1.2 24.0-0.8 25.1-1.6 27.1-1.6 29SEP2010 19.2-1.4 23.5-1.3 24.8-1.9 27.1-1.6 06OCT2010 18.7-1.9 23.2-1.7 24.8-1.9 27.1-1.6 13OCT2010 18.9-1.9 23.0-2.0 25.1-1.6 27.1-1.6 20OCT2010 19.1-1.8 23.2-1.7 25.1-1.6 27.0-1.7 27OCT2010 19.8-1.3 23.6-1.4 25.2-1.5 27.0-1.6 03NOV2010 19.7-1.6 23.4-1.6 25.2-1.4 27.0-1.6 10NOV2010 19.5-1.9 23.5-1.5 25.2-1.4 27.2-1.5 17NOV2010 20.2-1.5 23.5-1.5 25.0-1.6 27.1-1.5 24NOV2010 20.6-1.3 23.3-1.7 24.9-1.7 26.9-1.7 01DEC2010 20.5-1.7 23.3-1.7 25.0-1.7 27.0-1.5 08DEC2010 20.9-1.5 23.4-1.7 25.0-1.6 26.9-1.6 15DEC2010 21.1-1.7 23.5-1.7 25.0-1.5 26.9-1.6 22DEC2010 21.7-1.4 23.4-1.8 24.8-1.8 26.8-1.6 29DEC2010 22.9-0.6 23.8-1.5 25.0-1.5 26.7-1.7 05JAN2011 23.1-0.7 24.1-1.3 25.0-1.5 26.7-1.7 12JAN2011 23.6-0.7 24.1-1.5 24.7-1.8 26.6-1.7 19JAN2011 24.2-0.5 24.4-1.3 25.0-1.6 26.7-1.6 26JAN2011 25.0 0.0 24.5-1.4 24.9-1.7 26.8-1.4 02FEB2011 25.3-0.1 24.9-1.1 25.1-1.5 26.6-1.5 09FEB2011 25.9 0.2 25.5-0.8 25.5-1.2 26.8-1.3 16FEB2011 26.8 0.7 25.6-0.8 25.4-1.3 27.0-1.1 23FEB2011 26.4 0.2 25.9-0.7 25.6-1.3 27.0-1.1 02MAR2011 25.7-0.6 26.0-0.8 25.7-1.3 27.1-1.1 09MAR2011 26.3-0.2 26.2-0.8 26.0-1.1 27.3-0.9 16MAR2011 26.6 0.1 26.3-0.8 26.4-0.9 27.5-0.7 23MAR2011 25.8-0.5 26.6-0.6 26.4-0.9 27.5-0.7 30MAR2011 25.6-0.4 26.9-0.4 26.6-0.9 27.5-0.8 06APR2011 25.4-0.4 27.1-0.2 26.9-0.7 27.7-0.6 13APR2011 25.8 0.3 27.3-0.2 27.1-0.7 27.9-0.6 20APR2011 25.4 0.1 27.2-0.3 27.1-0.7 27.8-0.7 27APR2011 25.8 0.8 27.2-0.1 27.1-0.7 27.9-0.7 04MAY2011 25.1 0.4 27.0-0.3 27.2-0.6 28.0-0.7 11MAY2011 25.3 0.9 27.0-0.2 27.4-0.5 28.3-0.5 18MAY2011 24.6 0.5 27.0-0.1 27.6-0.3 28.4-0.4 25MAY2011 24.0 0.3 26.8 0.0 27.5-0.3 28.3-0.5 01JUN2011 24.3 0.8 26.8 0.1 27.5-0.2 28.4-0.4 08JUN2011 24.2 1.1 26.7 0.1 27.5-0.2 28.4-0.4 15JUN2011 23.8 1.0 26.6 0.1 27.4-0.2 28.4-0.4 22JUN2011 23.2 0.6 26.5 0.2 27.4-0.1 28.4-0.4 29JUN2011 22.9 0.6 26.1 0.1 27.4-0.1 28.6-0.2 06JUL2011 22.2 0.2 25.8-0.1 27.1-0.3 28.5-0.3 13JUL2011 21.9 0.2 25.7 0.0 27.1-0.2 28.5-0.3 20JUL2011 22.1 0.6 25.6 0.0 26.9-0.3 28.4-0.4 27JUL2011 21.9 0.7 25.3-0.1 26.8-0.3 28.4-0.4 03AUG2011 21.5 0.4 25.0-0.3 26.4-0.6 28.3-0.4 10AUG2011 20.9 0.0 24.6-0.5 26.3-0.6 28.4-0.3 17AUG2011 20.5-0.1 24.5-0.5 26.0-0.8 28.2-0.4 24AUG2011 20.2-0.4 24.3-0.6 26.1-0.7 28.3-0.4 31AUG2011 20.0-0.5 24.4-0.5 26.1-0.7 28.3-0.4 07SEP2011 19.7-0.7 24.2-0.7 26.1-0.7 28.2-0.5 14SEP2011 19.6-0.8 24.1-0.7 26.0-0.8 28.0-0.7 21SEP2011 19.8-0.6 24.3-0.6 25.9-0.9 27.8-0.9 28SEP2011 19.9-0.6 24.1-0.7 26.0-0.7 28.0-0.7 05OCT2011 19.8-0.8 24.1-0.8 25.7-1.0 27.7-0.9 12OCT2011 19.7-1.0 24.1-0.8 25.8-0.9 27.9-0.8 19OCT2011 20.0-0.9 23.9-1.1 25.8-0.8 28.1-0.6 26OCT2011 21.2 0.2 23.8-1.1 25.4-1.2 28.0-0.7 02NOV2011 20.5-0.8 23.9-1.1 25.6-1.0 27.9-0.8 09NOV2011 20.5-0.9 23.9-1.1 25.7-0.9 27.9-0.7 16NOV2011 20.5-1.1 23.8-1.1 25.6-1.0 27.9-0.7 23NOV2011 21.4-0.5 24.0-1.0 25.6-1.0 27.8-0.8 30NOV2011 21.0-1.2 23.8-1.3 25.4-1.2 27.7-0.9 07DEC2011 21.4-1.0 23.9-1.2 25.5-1.1 27.5-1.0 14DEC2011 21.5-1.2 24.1-1.0 25.6-1.0 27.4-1.1 21DEC2011 22.1-1.0 24.5-0.7 25.6-1.0 27.2-1.3 28DEC2011 22.6-0.9 24.4-0.9 25.5-1.1 27.1-1.3 04JAN2012 22.7-1.1 24.6-0.8 25.5-1.0 27.2-1.2 11JAN2012 23.7-0.5 24.8-0.7 25.6-1.0 27.1-1.2 18JAN2012 24.0-0.6 24.9-0.8 25.4-1.2 27.1-1.2 25JAN2012 24.6-0.4 25.2-0.7 25.5-1.2 26.9-1.3 01FEB2012 24.6-0.8 25.2-0.8 25.5-1.2 27.0-1.2 08FEB2012 25.2-0.5 25.6-0.6 25.7-1.0 27.1-1.0 15FEB2012 26.9 0.8 26.3-0.1 26.1-0.7 27.1-1.0 22FEB2012 26.9 0.8 26.8 0.2 26.5-0.4 27.4-0.7 29FEB2012 27.3 1.0 27.1 0.4 26.4-0.6 27.2-0.9 07MAR2012 26.6 0.2 26.7-0.2 26.4-0.7 27.3-0.9 14MAR2012 26.6 0.2 26.6-0.4 26.6-0.6 27.5-0.7 21MAR2012 26.7 0.4 27.0-0.2 26.7-0.6 27.8-0.5 28MAR2012 26.9 0.8 27.5 0.3 27.1-0.3 27.7-0.6 04APR2012 26.2 0.3 27.6 0.3 27.2-0.3 27.9-0.5 11APR2012 27.4 1.8 27.8 0.4 27.3-0.4 28.1-0.3 18APR2012 26.8 1.4 27.5 0.0 27.3-0.5 28.1-0.4 25APR2012 26.6 1.5 27.5 0.1 27.6-0.2 28.4-0.2 02MAY2012 26.3 1.6 27.4 0.1 27.7-0.1 28.4-0.2 09MAY2012 25.7 1.2 27.3 0.1 27.8 0.0 28.4-0.3 16MAY2012 25.2 1.0 27.2 0.1 27.8 0.0 28.5-0.3 23MAY2012 24.8 0.9 27.1 0.2 27.8 0.0 28.6-0.2 30MAY2012 24.5 0.9 27.2 0.4 27.9 0.2 28.7-0.1 06JUN2012 24.7 1.5 27.1 0.4 27.8 0.1 28.6-0.2 13JUN2012 24.4 1.5 27.1 0.6 27.9 0.3 28.6-0.2 20JUN2012 24.3 1.7 27.1 0.8 28.0 0.4 28.8 0.0 27JUN2012 23.8 1.5 27.1 0.9 28.1 0.6 28.9 0.0 04JUL2012 23.2 1.1 26.8 0.8 27.9 0.5 28.8 0.0 11JUL2012 22.6 0.8 26.6 0.8 27.7 0.4 28.8 0.0 18JUL2012 22.6 1.1 26.5 0.9 27.7 0.5 28.8 0.0 25JUL2012 22.0 0.7 26.4 1.0 27.7 0.6 28.9 0.1 01AUG2012 21.6 0.5 26.1 0.9 27.6 0.6 29.0 0.3 08AUG2012 20.9 0.0 25.9 0.8 27.7 0.8 29.1 0.4 15AUG2012 20.8 0.1 25.6 0.6 27.4 0.6 29.1 0.4 22AUG2012 21.0 0.4 25.5 0.5 27.4 0.6 29.1 0.4 29AUG2012 20.3-0.2 25.6 0.7 27.7 0.9 29.1 0.5 05SEP2012 20.7 0.3 25.5 0.6 27.5 0.8 29.2 0.5 12SEP2012 20.9 0.5 25.3 0.4 27.3 0.5 29.1 0.4 19SEP2012 21.0 0.5 25.2 0.3 27.0 0.3 29.0 0.4 26SEP2012 21.0 0.5 25.1 0.2 26.9 0.2 29.1 0.4 03OCT2012 20.5-0.1 24.8-0.1 26.8 0.1 29.0 0.3 10OCT2012 20.2-0.6 24.7-0.2 26.8 0.1 29.1 0.4 17OCT2012 20.5-0.4 25.0 0.1 27.0 0.3 29.1 0.5 24OCT2012 21.0 0.0 25.0 0.1 27.2 0.5 29.3 0.7 31OCT2012 21.5 0.3 25.2 0.2 27.1 0.4 29.2 0.6 07NOV2012 21.5 0.2 25.1 0.1 27.0 0.4 29.2 0.6 14NOV2012 21.0-0.5 25.2 0.2 27.2 0.5 29.3 0.7 21NOV2012 21.1-0.7 25.1 0.1 26.9 0.3 29.1 0.5 28NOV2012 20.7-1.4 24.9-0.1 26.8 0.2 28.9 0.4 05DEC2012 21.5-0.9 24.9-0.2 26.5-0.1 28.6 0.1 12DEC2012 21.8-0.8 24.8-0.3 26.5-0.1 28.8 0.4 19DEC2012 22.4-0.6 24.9-0.3 26.4-0.2 28.6 0.2 26DEC2012 22.7-0.6 25.0-0.3 26.4-0.1 28.6 0.2 02JAN2013 23.3-0.4 25.0-0.4 26.3-0.3 28.4 0.1 09JAN2013 23.7-0.4 24.8-0.7 26.0-0.6 28.3 0.0 16JAN2013 24.1-0.4 25.0-0.6 26.0-0.6 28.1-0.2 23JAN2013 24.2-0.6 25.3-0.5 26.4-0.2 28.2 0.0 30JAN2013 24.8-0.5 25.1-0.9 26.1-0.5 28.1 0.0 06FEB2013 25.4-0.2 25.5-0.7 26.2-0.5 28.1-0.1 13FEB2013 25.9-0.1 25.9-0.4 26.4-0.3 28.1 0.0 20FEB2013 25.6-0.6 26.2-0.3 26.3-0.5 27.9-0.1 27FEB2013 25.8-0.4 26.5-0.2 26.6-0.3 27.9-0.2 06MAR2013 26.7 0.4 27.0 0.1 26.9-0.1 27.9-0.2 13MAR2013 27.0 0.5 27.1 0.0 26.8-0.3 27.7-0.4 20MAR2013 26.6 0.2 27.6 0.4 27.1-0.1 28.0-0.2 27MAR2013 25.6-0.5 27.6 0.3 27.3-0.1 28.1-0.2 03APR2013 25.0-0.9 27.3 0.0 27.6 0.1 28.3 0.0 10APR2013 24.8-0.9 27.5 0.0 27.7 0.0 28.5 0.1 17APR2013 24.6-0.8 27.5 0.0 27.7-0.1 28.5 0.0 24APR2013 24.5-0.6 27.3-0.1 27.7-0.1 28.4-0.1 01MAY2013 23.6-1.2 26.9-0.4 27.8 0.0 28.7 0.0 08MAY2013 22.9-1.6 26.7-0.5 27.7-0.1 28.7 0.0 15MAY2013 23.2-1.1 26.5-0.6 27.5-0.4 28.6-0.2 22MAY2013 22.3-1.6 25.9-1.0 27.4-0.4 28.7-0.1 29MAY2013 21.5-2.1 25.9-0.9 27.5-0.2 28.8 0.0 05JUN2013 22.0-1.3 25.9-0.8 27.5-0.2 28.8 0.0 12JUN2013 21.9-1.1 25.9-0.6 27.5-0.2 28.8-0.1 19JUN2013 21.1-1.6 25.7-0.7 27.3-0.3 28.6-0.2 26JUN2013 20.5-1.9 25.6-0.6 27.4-0.1 28.8 0.0 03JUL2013 20.6-1.5 25.4-0.5 27.2-0.2 28.8 0.0 10JUL2013 20.5-1.3 25.0-0.8 26.9-0.4 28.8 0.0 17JUL2013 20.1-1.5 24.8-0.8 26.8-0.4 28.7-0.1 24JUL2013 20.3-1.1 24.9-0.6 26.8-0.3 28.7-0.1 31JUL2013 19.8-1.3 24.6-0.8 26.8-0.2 28.7 0.0 07AUG2013 19.8-1.1 24.5-0.7 26.7-0.3 28.6-0.1 14AUG2013 19.6-1.1 24.4-0.7 26.4-0.4 28.7 0.0 21AUG2013 19.9-0.8 24.4-0.6 26.4-0.4 28.7 0.0 28AUG2013 19.4-1.1 24.5-0.5 26.7-0.1 28.8 0.2 04SEP2013 19.6-0.9 24.6-0.3 26.8 0.0 28.8 0.1 11SEP2013 20.0-0.4 24.7-0.2 26.8 0.0 28.7 0.0 18SEP2013 19.9-0.5 24.9 0.1 26.7-0.1 28.6-0.1 25SEP2013 20.1-0.4 24.7-0.2 26.5-0.2 28.5-0.1 02OCT2013 19.7-0.9 24.6-0.2 26.4-0.3 28.7 0.0 09OCT2013 20.1-0.7 24.6-0.3 26.3-0.3 28.6 0.0 16OCT2013 20.3-0.5 24.8-0.1 26.3-0.4 28.6-0.1 23OCT2013 20.5-0.4 24.7-0.2 26.3-0.4 28.7 0.1 30OCT2013 20.5-0.7 24.8-0.1 26.5-0.2 28.8 0.2 06NOV2013 21.0-0.4 24.8-0.1 26.6 0.0 28.9 0.3 13NOV2013 21.1-0.4 24.7-0.2 26.6 0.0 28.9 0.3 20NOV2013 21.3-0.5 24.8-0.2 26.7 0.1 28.9 0.3 27NOV2013 21.7-0.4 24.9-0.1 26.7 0.1 28.8 0.2 04DEC2013 22.0-0.3 24.9-0.2 26.8 0.2 28.8 0.3 11DEC2013 22.4-0.2 25.1 0.0 26.6 0.0 28.7 0.2 18DEC2013 22.4-0.5 25.2 0.0 26.5-0.1 28.6 0.1 25DEC2013 22.8-0.4 25.2-0.1 26.4-0.2 28.5 0.1 01JAN2014 23.7 0.0 25.2-0.2 26.3-0.3 28.2-0.2 08JAN2014 24.2 0.1 25.1-0.5 26.0-0.5 28.2-0.2 15JAN2014 25.0 0.6 25.2-0.4 25.9-0.7 28.0-0.3 22JAN2014 25.4 0.6 25.6-0.2 26.2-0.4 28.1-0.1 29JAN2014 25.4 0.2 25.3-0.7 25.9-0.7 27.9-0.2 05FEB2014 25.1-0.4 25.3-0.8 25.9-0.7 28.1 0.0 12FEB2014 25.4-0.6 25.4-0.9 26.2-0.5 28.5 0.4 19FEB2014 25.1-1.1 25.7-0.7 26.4-0.4 28.5 0.4 26FEB2014 25.5-0.7 26.0-0.6 26.3-0.6 28.2 0.1 05MAR2014 26.1-0.3 26.4-0.5 26.6-0.4 28.5 0.3 12MAR2014 25.8-0.6 26.8-0.3 26.8-0.4 28.7 0.6 19MAR2014 25.2-1.2 27.3 0.1 27.4 0.1 28.8 0.6 26MAR2014 25.4-0.7 27.6 0.4 27.6 0.2 29.0 0.7 02APR2014 25.2-0.7 27.8 0.5 27.8 0.3 29.0 0.7 09APR2014 24.9-0.8 27.6 0.1 27.9 0.2 29.1 0.7 16APR2014 24.8-0.7 27.7 0.2 28.0 0.2 29.1 0.6 23APR2014 25.3 0.1 27.8 0.4 28.2 0.4 29.2 0.6 30APR2014 25.7 0.8 27.8 0.5 28.2 0.4 29.3 0.7 07MAY2014 25.8 1.2 27.8 0.6 28.3 0.5 29.5 0.8 14MAY2014 25.5 1.3 27.7 0.6 28.3 0.4 29.5 0.8 21MAY2014 25.4 1.5 27.6 0.7 28.3 0.5 29.6 0.8 28MAY2014 25.3 1.6 27.6 0.7 28.4 0.6 29.7 0.9 04JUN2014 24.8 1.4 27.5 0.8 28.3 0.5 29.6 0.8 11JUN2014 24.6 1.6 27.3 0.8 28.1 0.4 29.5 0.6 18JUN2014 24.8 2.1 27.4 1.0 28.1 0.5 29.4 0.5 25JUN2014 24.0 1.6 27.2 1.0 28.0 0.5 29.3 0.5 02JUL2014 23.6 1.4 27.0 1.0 27.8 0.4 29.1 0.3 09JUL2014 23.0 1.1 26.5 0.6 27.6 0.3 29.1 0.3 16JUL2014 23.1 1.5 26.2 0.6 27.4 0.2 29.1 0.4 23JUL2014 22.9 1.6 26.0 0.5 27.1-0.1 28.9 0.2 30JUL2014 21.8 0.6 25.5 0.2 26.9-0.1 29.0 0.3 06AUG2014 22.2 1.2 25.6 0.4 27.0 0.0 29.2 0.5 13AUG2014 21.9 1.2 25.5 0.5 26.9 0.0 29.0 0.4 20AUG2014 22.1 1.4 25.5 0.5 27.1 0.3 29.1 0.4 27AUG2014 21.3 0.8 25.4 0.4 27.2 0.4 29.2 0.5 03SEP2014 21.7 1.2 25.3 0.4 27.1 0.4 29.2 0.5 10SEP2014 21.1 0.7 25.3 0.4 27.3 0.5 29.4 0.7 17SEP2014 21.0 0.7 25.2 0.4 27.2 0.5 29.4 0.8 24SEP2014 21.2 0.8 25.4 0.5 27.1 0.4 29.3 0.6 01OCT2014 21.7 1.1 25.4 0.5 27.1 0.3 29.2 0.5 08OCT2014 21.3 0.6 25.5 0.6 27.1 0.4 29.1 0.5 15OCT2014 21.5 0.7 25.5 0.5 27.2 0.5 29.4 0.7 22OCT2014 21.8 0.8 25.8 0.8 27.2 0.5 29.4 0.7 29OCT2014 21.8 0.6 25.8 0.9 27.3 0.6 29.4 0.8 05NOV2014 21.9 0.5 25.8 0.9 27.4 0.8 29.5 0.9 12NOV2014 22.4 0.9 25.8 0.9 27.5 0.8 29.5 0.9 19NOV2014 22.6 0.8 26.0 1.0 27.5 0.9 29.5 0.9 26NOV2014 22.4 0.4 25.9 0.9 27.6 1.0 29.5 0.9 03DEC2014 22.3 0.0 25.8 0.7 27.4 0.8 29.4 0.9 10DEC2014 22.8 0.2 26.0 0.9 27.5 0.9 29.4 0.9 17DEC2014 22.9 0.1 26.0 0.8 27.4 0.8 29.4 1.0 24DEC2014 23.1-0.2 26.0 0.7 27.3 0.7 29.3 0.9 31DEC2014 23.6 0.0 25.9 0.6 27.1 0.5 29.2 0.8 07JAN2015 23.7-0.2 25.9 0.4 27.0 0.4 29.1 0.7 14JAN2015 24.0-0.4 25.9 0.3 27.1 0.5 29.1 0.9 21JAN2015 24.3-0.4 26.1 0.3 27.2 0.6 29.2 1.0 28JAN2015 24.8-0.3 26.2 0.3 27.2 0.5 29.1 0.9 04FEB2015 25.0-0.5 26.2 0.1 27.2 0.5 29.1 0.9 11FEB2015 25.1-0.8 26.6 0.3 27.2 0.5 29.0 0.9 18FEB2015 26.1-0.1 26.7 0.3 27.3 0.5 29.0 1.0 25FEB2015 26.1-0.1 26.8 0.1 27.5 0.6 29.3 1.2 ================================================ FILE: samples/Forth/KataDiversion.fth ================================================ \ KataDiversion in Forth \ -- utils \ empty the stack : EMPTY DEPTH 0 <> IF BEGIN DROP DEPTH 0 = UNTIL THEN ; \ power : ** ( n1 n2 -- n1_pow_n2 ) 1 SWAP ?DUP IF 0 DO OVER * LOOP THEN NIP ; \ compute the highest power of 2 below N. \ e.g. : 31 -> 16, 4 -> 4 : MAXPOW2 ( n -- log2_n ) DUP 1 < IF 1 ABORT" Maxpow2 need a positive value." ELSE DUP 1 = IF 1 ELSE 1 >R BEGIN ( n |R: i=1) DUP DUP I - 2 * ( n n 2*[n-i]) R> 2 * >R ( … |R: i*2) > ( n n>2*[n-i] ) UNTIL R> 2 / THEN THEN NIP ; \ -- kata \ test if the given N has two adjacent 1 bits \ e.g. : 11 -> 1011 -> -1 \ 9 -> 1001 -> 0 : ?NOT-TWO-ADJACENT-1-BITS ( n -- bool ) \ the word uses the following algorithm : \ (stack|return stack) \ ( A N | X ) A: 0, X: N LOG2 \ loop: if N-X > 0 then A++ else A=0 ; X /= 2 \ return 0 if A=2 \ if X=1 end loop and return -1 0 SWAP DUP DUP 0 <> IF MAXPOW2 >R BEGIN DUP I - 0 >= IF SWAP DUP 1 = IF 1+ SWAP ELSE DROP 1 SWAP I - THEN ELSE NIP 0 SWAP THEN OVER 2 = I 1 = OR R> 2 / >R UNTIL R> 2DROP 2 <> ELSE 2DROP INVERT THEN ; \ return the maximum number which can be made with N (given number) bits : MAX-NB ( n -- m ) DUP 1 < IF DROP 0 ( 0 ) ELSE DUP IF DUP 2 SWAP ** NIP 1 - ( 2**n - 1 ) THEN THEN ; \ return the number of numbers which can be made with N (given number) bits \ or less, and which have not two adjacent 1 bits. \ see http://www.codekata.com/2007/01/code_kata_fifte.html : HOW-MANY-NB-NOT-TWO-ADJACENT-1-BITS ( n -- m ) DUP 1 < IF DUP 0 ELSE 0 SWAP MAX-NB 1 + 0 DO I ?NOT-TWO-ADJACENT-1-BITS - LOOP THEN ; ================================================ FILE: samples/Forth/asm.fr ================================================ \ Copyright 2013-2014 Lars Brinkhoff \ Assembler for x86. \ Adds to FORTH vocabulary: ASSEMBLER CODE ;CODE. \ Creates ASSEMBLER vocabulary with: END-CODE and x86 opcodes. \ Conventional prefix syntax: " ,". \ Addressing modes: \ - immediate: "n #" \ - direct: n \ - register: \ - indirect: " )" \ - indirect with displacement: "n )#" \ - indexed: not supported yet require lib/common.fth require search.fth vocabulary assembler also assembler definitions \ Access to the target image. ' header, defer header, is header, ' cell defer cell is cell ' dp defer dp is dp 0 value delta : aligned cell + 1 - cell negate nand invert ; : align dp @ aligned dp ! ; : allot dp +! ; : here dp @ ; : cells cell * ; : c! delta + c! ; : c, here c! 1 allot ; : h, dup c, 8 rshift c, ; : , dup h, 16 rshift h, ; base @ hex \ This constant signals that an operand is not a direct address. deadbeef constant -addr \ Assembler state. variable opcode variable d variable s variable dir? variable mrrm defer ?mrrm, variable sib defer ?sib, variable disp defer ?disp, variable imm defer ?imm, defer imm, defer immediate-opcode defer reg defer ?opsize \ Set opcode. And destination: register or memory. : opcode! 3@ is immediate-opcode >r opcode ! ; : !reg dir? @ if 2 d ! then dir? off ; : !mem dir? off ; \ Set bits in mod/reg/rm byte. : -mrrm ['] nop is ?mrrm, ; : mod! mrrm c0 !bits ; : reg@ mrrm 38 @bits ; : reg! mrrm 38 !bits ; : rm@ mrrm 7 @bits ; : rm! rm@ 3 lshift reg! mrrm 7 !bits ; : reg>opcode rm@ opcode 07 !bits ; : opcode>reg opcode @ dup 3 rshift rm! 8 rshift opcode ! ; \ Write parts of instruction to memory. : ds d @ s @ + ; : ?twobyte dup FF > if dup 8 rshift c, then ; : opcode, opcode @ ?twobyte ds + c, ; : mrrm, mrrm @ c, ; : sib, sib @ c, ; : imm8, imm @ c, ; : imm16, imm @ h, ; : imm32, imm @ , ; : disp8, disp @ c, ; : disp32, disp @ , ; \ Set operand size. : -opsize 2drop r> drop ; : opsize! is imm, s ! ['] -opsize is ?opsize ; : !op8 0 ['] imm8, ?opsize ; : !op32 1 ['] imm32, ?opsize ; : !op16 1 ['] imm16, ?opsize 66 c, ; \ Set SIB byte. : !sib ['] sib, is ?sib, ; : sib! 3 lshift + sib ! !sib ; \ Set displacement. : byte? -80 80 within ; : disp! is ?disp, disp ! ; : !disp8 ['] disp8, disp! ; : !disp32 ['] disp32, disp! ; : !disp ( a -- u ) dup byte? if !disp8 40 else !disp32 80 then ; : -pc here 5 + negate ; : relative -pc disp +! ; \ Set immediate operand. : imm! imm ! ['] imm, is ?imm, ; \ Implements addressing modes: register, indirect, indexed, and direct. : reg1 rm! !reg ; : reg2 3 lshift reg! ; : !reg2 ['] reg2 is reg ; : ind dup mod! rm! !mem !reg2 ; : ind# swap !disp + ind ; : idx 04 ind sib! ; : idx# rot !disp 04 + ind sib! ; : addr !disp32 05 ind ; \ Reset assembler state. : 0opsize ['] opsize! is ?opsize ; : 0ds d off s off ; : 0reg ['] reg1 is reg ; : 0mrrm c0 mrrm ! ['] mrrm, is ?mrrm, ; : 0sib ['] nop is ?sib, ; : 0disp ['] nop is ?disp, ; : 0imm imm off ['] nop is ?imm, 0 is imm, ; : 0asm 0imm 0disp 0reg 0ds 0mrrm 0sib 0opsize dir? on ; \ Enter and exit assembler mode. : start-code also assembler 0asm ; : end-code align previous ; \ Implements addressing mode: immediate. : imm8? imm @ byte? ; : ?sign-extend d off imm8? if 2 d ! ['] imm8, is ?imm, then ; : alu# opcode @ reg! 80 opcode ! ?sign-extend ; : mov# B0 s @ 3 lshift + rm@ + opcode ! 0ds -mrrm ; : push# imm8? if ['] imm8, 6A else ['] imm32, 68 then dup opcode ! rm! is ?imm, ; : test# F6 opcode ! ; : imm-op imm! immediate-opcode ; \ Process one operand. All operands except a direct address \ have the stack picture ( n*x xt -addr ). : addr? dup -addr <> ; : op addr? if addr else drop execute then ; \ Define instruction formats. : instruction, opcode! opcode, ?mrrm, ?sib, ?disp, ?imm, 0asm ; : mnemonic ( u a "name" -- ) create ['] nop 3, does> instruction, ; : format: create ] !csp does> mnemonic ; : immediate: ' latestxt >body ! ; \ Instruction formats. format: 0op -mrrm ; format: 1reg op reg>opcode 0ds -mrrm ; format: 1op opcode>reg op d off ; format: 2op op op ; format: 2op-d op op d off ; format: 2op-ds op op 0ds ; format: 1addr op relative -mrrm ; format: 1imm8 !op8 op -mrrm ; \ Instruction mnemonics. 00 2op add, immediate: alu# 08 2op or, immediate: alu# 0F44 2op-ds cmove, \ Todo: other condition codes. 0FB6 2op-ds movzx, 0FBE 2op-ds movsx, 10 2op adc, immediate: alu# 18 2op sbb, immediate: alu# 20 2op and, immediate: alu# 26 0op es, 28 2op sub, immediate: alu# 2E 0op cs, 30 2op xor, immediate: alu# 36 0op ss, 38 2op cmp, immediate: alu# 3E 0op ds, 50 1reg push, immediate: push# 58 1reg pop, 64 0op fs, 65 0op gs, \ 70 jcc 84 2op-d test, immediate: test# 86 2op-d xchg, 88 2op mov, immediate: mov# 8D 2op-ds lea, \ 8F/0 pop, rm 90 0op nop, C3 0op ret, \ C6/0 immediate mov to r/m \ C7/0 immediate mov to r/m CD 1imm8 int, E8 1addr call, E9 1addr jmp, \ EB jmp rel8 F0 0op lock, F2 0op rep, F3 0op repz, F4 0op hlt, F5 0op cmc, F610 1op not, F618 1op neg, F8 0op clc, F9 0op stc, FA 0op cli, FB 0op sti, FC 0op cld, FD 0op std, \ FE 0 inc rm \ FF 1 dec rm \ FF 2 call rm \ FF 4 jmp rm \ FF 6 push rm : sp? dup 4 = ; \ Addressing mode syntax: immediate, indirect, and displaced indirect. : # ['] imm-op -addr ; : ) 2drop sp? if 4 ['] idx else ['] ind then -addr 0reg 0opsize ; : )# 2drop sp? if 4 ['] idx# else ['] ind# then -addr 0reg 0opsize ; \ Define registers. : reg8 create , does> @ ['] reg -addr !op8 ; : reg16 create , does> @ ['] reg -addr !op16 ; : reg32 create , does> @ ['] reg -addr !op32 ; : reg: dup reg8 dup reg16 dup reg32 1+ ; \ Register names. 0 reg: al ax eax reg: cl cx ecx reg: dl dx edx reg: bl bx ebx reg: ah sp esp reg: ch bp ebp reg: dh si esi reg: bh di edi drop \ Runtime for ;CODE. CODE! is defined elsewhere. : (;code) r> code! ; base ! only forth definitions also assembler \ Standard assembler entry points. : code parse-name header, ?code, start-code ; : ;code postpone (;code) reveal postpone [ ?csp start-code ; immediate 0asm previous ================================================ FILE: samples/Forth/bitmap.frt ================================================ \ Bit arrays. : bits ( u1 -- u2 ) 7 + 3 rshift ; : bitmap ( u "name" -- ) create bits here over erase allot does> ( u -- a x ) over 3 rshift + 1 rot 7 and lshift ; : bit@ ( a x -- f ) swap c@ and ; : 1bit ( a x -- ) over c@ or swap c! ; : 0bit ( a x -- ) invert over c@ and swap c! ; : bit! ( f a x -- ) rot if 1bit else 0bit then ; ================================================ FILE: samples/Forth/block.fth ================================================ ( Block words. ) variable blk variable current-block : block ( n -- addr ) current-block ! 0 ; : buffer ( n -- addr ) current-block ! 0 ; \ evaluate (extended semantics) \ flush ( -- ) : load ( ... n -- ... ) dup current-block ! blk ! save-input 0 >in ! blk @ block ''source ! 1024 ''#source ! ( interpret ) restore-input ; \ save-buffers ( -- ) \ update ( -- ) ( Block extension words. ) \ empty-buffers ( -- ) variable scr : list ( n -- ) dup scr ! dup current-block ! block 1024 bounds do i @ emit loop ; \ refill (extended semantics) : thru ( x y -- ) +1 swap do i load loop ; \ \ (extended semantics) ================================================ FILE: samples/Forth/core-ext.fth ================================================ \ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff \ Kernel: #tib \ TODO: .r : .( ( "" -- ) [char] ) parse type ; immediate : 0<> ( n -- flag ) 0 <> ; : 0> ( n -- flag ) 0 > ; \ Kernel: 2>r : 2r> ( -- x1 x2 ) ( R: x1 x2 -- ) r> r> r> rot >r swap ; : 2r@ ( -- x1 x2 ) ( R: x1 x2 -- x1 x2 ) 2r> 2dup 2>r ; : :noname align here 0 c, 15 allot lastxt dup @ , ! [ ' enter >code @ ] literal , 0 , ] lastxt @ ; \ Kernel: <> \ : ?do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) \ here postpone 2>r unresolved branch here ; : again ( -- ) ( C: dest -- ) postpone branch , ; immediate : string+ ( caddr -- addr ) count + aligned ; : (c") ( -- caddr ) ( R: ret1 -- ret2 ) r> dup string+ >r ; : c" ( "" -- caddr ) postpone (c") [char] " parse dup c, string, ; immediate : case ( -- ) ( C: -- case-sys ) 0 ; : compile, ( xt -- ) , ; \ TODO: convert : endcase ( x -- ) ( C: case-sys -- ) 0 do postpone then loop postpone drop ; : endof ( -- ) ( C: case-sys1 of-sys -- case-sys2 ) postpone else swap 1+ ; \ TODO: erase \ TODO: expect : false ( -- 0 ) 0 ; : hex ( -- ) 16 base ! ; \ TODO: marker \ Kernel: nip : of ( x x -- | x y -- x ) ( C: -- of-sys ) postpone over postpone = postpone if postpone drop ; \ Kernel: pad \ Kernel: parse : pick ( xn ... x0 n -- xn ... x0 xn ) 2 + cells 'SP @ + @ ; : query ( -- ) tib ''source ! #tib ''#source ! 0 'source-id ! refill drop ; \ Kernel: refill \ Kernel: restore-input \ TODO: roll ( xn xn-1 ... x0 n -- xn-1 ... x0 xn ) ; \ Kernel: save-input \ Kernel: source-id \ TODO: span \ Kernel: tib : to ( x "word" -- ) ' >body , ; : true ( -- -1 ) -1 ; : tuck ( x y -- y x y ) swap over ; \ TODO: u.r : u> ( x y -- flag ) 2dup u< if 2drop false else <> then ; \ TODO: unused : value ( x "word" -- ) create , does> ( -- x ) @ ; : within over - >r - r> u< ; \ TODO: [compile] \ Kernel: \ \ ---------------------------------------------------------------------- ( Forth2012 core extension words. ) \ TODO: action-of \ TODO: buffer: : defer create ['] abort , does> @ execute ; : defer! ( xt2 xt1 -- ) >body ! ; : defer@ ( xt1 -- xt2 ) >body @ ; \ TODO: holds : is ( xt "word" -- ) ' defer! ; \ TODO: parse-name \ TODO: s\" ================================================ FILE: samples/Forth/core.f ================================================ : immediate lastxt @ dup c@ negate swap c! ; : \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff : char \ ( "word" -- char ) bl-word here 1+ c@ ; : ahead here 0 , ; : resolve here swap ! ; : ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; : postpone-nonimmediate [ ' literal , ' compile, ] literal , ; : create dovariable_code header, reveal ; create postponers ' postpone-nonimmediate , ' abort , ' , , : word \ ( char "string" -- caddr ) drop bl-word here ; : postpone \ ( C: "word" -- ) bl word find 1+ cells postponers + @ execute ; immediate : unresolved \ ( C: "word" -- orig ) postpone postpone postpone ahead ; immediate : chars \ ( n1 -- n2 ) ; : else \ ( -- ) ( C: orig1 -- orig2 ) unresolved branch swap resolve ; immediate : if \ ( flag -- ) ( C: -- orig ) unresolved 0branch ; immediate : then \ ( -- ) ( C: orig -- ) resolve ; immediate : [char] \ ( "word" -- ) char postpone literal ; immediate : (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ; : does> postpone (does>) ; immediate : begin \ ( -- ) ( C: -- dest ) here ; immediate : while \ ( x -- ) ( C: dest -- orig dest ) unresolved 0branch swap ; immediate : repeat \ ( -- ) ( C: orig dest -- ) postpone branch , resolve ; immediate : until \ ( x -- ) ( C: dest -- ) postpone 0branch , ; immediate : recurse lastxt @ compile, ; immediate : pad \ ( -- addr ) here 1024 + ; : parse \ ( char "string" -- addr n ) pad >r begin source? if else 0 0 then while r@ c! r> 1+ >r repeat 2drop pad r> over - ; : ( \ ( "string" -- ) [ char ) ] literal parse 2drop ; immediate \ TODO: If necessary, refill and keep parsing. : string, ( addr n -- ) here over allot align swap cmove ; : (s") ( -- addr n ) ( R: ret1 -- ret2 ) r> dup @ swap cell+ 2dup + aligned >r swap ; create squote 128 allot : s" ( "string" -- addr n ) state @ if postpone (s") [char] " parse dup , string, else [char] " parse >r squote r@ cmove squote r> then ; immediate : (abort") ( ... addr n -- ) ( R: ... -- ) cr type cr abort ; : abort" ( ... x "string" -- ) ( R: ... -- ) postpone if postpone s" postpone (abort") postpone then ; immediate \ ---------------------------------------------------------------------- ( Core words. ) \ TODO: # \ TODO: #> \ TODO: #s : and ( x y -- x&y ) nand invert ; : * 1 2>r 0 swap begin r@ while r> r> swap 2dup dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; \ TODO: */mod : +loop ( -- ) ( C: nest-sys -- ) postpone (+loop) postpone 0branch , postpone unloop ; immediate : space bl emit ; : ?.- dup 0 < if [char] - emit negate then ; : digit [char] 0 + emit ; : (.) base @ /mod ?dup if recurse then digit ; : ." ( "string" -- ) postpone s" postpone type ; immediate : . ( x -- ) ?.- (.) space ; : postpone-number ( caddr -- ) 0 0 rot count >number dup 0= if 2drop nip postpone (literal) postpone (literal) postpone , postpone literal postpone , else ." Undefined: " type cr abort then ; ' postpone-number postponers cell+ ! : / ( x y -- x/y ) /mod nip ; : 0< ( n -- flag ) 0 < ; : 1- ( n -- n-1 ) -1 + ; : 2! ( x1 x2 addr -- ) swap over ! cell+ ! ; : 2* ( n -- 2n ) dup + ; \ Kernel: 2/ : 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ; \ Kernel: 2drop \ Kernel: 2dup \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) \ 3 pick 3 pick ; \ TODO: 2swap \ TODO: <# : abs ( n -- |n| ) dup 0< if negate then ; \ TODO: accept : c, ( n -- ) here c! 1 chars allot ; : char+ ( n1 -- n2 ) 1+ ; : constant create , does> @ ; : decimal ( -- ) 10 base ! ; : depth ( -- n ) data_stack 100 cells + 'SP @ - /cell / 2 - ; : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) postpone 2>r here ; immediate \ TODO: environment? \ TODO: evaluate \ TODO: fill \ TODO: fm/mod ) \ TODO: hold : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) 'RP @ 3 cells + @ ; \ TODO: leave : loop ( -- ) ( C: nest-sys -- ) postpone 1 postpone (+loop) postpone 0branch , postpone unloop ; immediate : lshift begin ?dup while 1- swap dup + swap repeat ; : rshift 1 begin over while dup + swap 1- swap repeat nip 2>r 0 1 begin r@ while r> r> 2dup swap dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; : max ( x y -- max[x,y] ) 2dup > if drop else nip then ; \ Kernel: min \ TODO: mod \ TODO: move : (quit) ( R: ... -- ) return_stack 100 cells + 'RP ! 0 'source-id ! tib ''source ! #tib ''#source ! postpone [ begin refill while interpret state @ 0= if ." ok" cr then repeat bye ; ' (quit) ' quit >body cell+ ! \ TODO: s>d \ TODO: sign \ TODO: sm/rem : spaces ( n -- ) 0 do space loop ; \ TODO: u. : signbit ( -- n ) -1 1 rshift invert ; : xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ; : u< ( x y -- flag ) signbit xor swap signbit xor > ; \ TODO: um/mod : variable ( "word" -- ) create /cell allot ; : ['] \ ( C: "word" -- ) ' postpone literal ; immediate ================================================ FILE: samples/Forth/core.for ================================================ : immediate lastxt @ dup c@ negate swap c! ; : \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff : char \ ( "word" -- char ) bl-word here 1+ c@ ; : ahead here 0 , ; : resolve here swap ! ; : ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; : postpone-nonimmediate [ ' literal , ' compile, ] literal , ; : create dovariable_code header, reveal ; create postponers ' postpone-nonimmediate , ' abort , ' , , : word \ ( char "string" -- caddr ) drop bl-word here ; : postpone \ ( C: "word" -- ) bl word find 1+ cells postponers + @ execute ; immediate : unresolved \ ( C: "word" -- orig ) postpone postpone postpone ahead ; immediate : chars \ ( n1 -- n2 ) ; : else \ ( -- ) ( C: orig1 -- orig2 ) unresolved branch swap resolve ; immediate : if \ ( flag -- ) ( C: -- orig ) unresolved 0branch ; immediate : then \ ( -- ) ( C: orig -- ) resolve ; immediate : [char] \ ( "word" -- ) char postpone literal ; immediate : (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ; : does> postpone (does>) ; immediate : begin \ ( -- ) ( C: -- dest ) here ; immediate : while \ ( x -- ) ( C: dest -- orig dest ) unresolved 0branch swap ; immediate : repeat \ ( -- ) ( C: orig dest -- ) postpone branch , resolve ; immediate : until \ ( x -- ) ( C: dest -- ) postpone 0branch , ; immediate : recurse lastxt @ compile, ; immediate : pad \ ( -- addr ) here 1024 + ; : parse \ ( char "string" -- addr n ) pad >r begin source? if else 0 0 then while r@ c! r> 1+ >r repeat 2drop pad r> over - ; : ( \ ( "string" -- ) [ char ) ] literal parse 2drop ; immediate \ TODO: If necessary, refill and keep parsing. : string, ( addr n -- ) here over allot align swap cmove ; : (s") ( -- addr n ) ( R: ret1 -- ret2 ) r> dup @ swap cell+ 2dup + aligned >r swap ; create squote 128 allot : s" ( "string" -- addr n ) state @ if postpone (s") [char] " parse dup , string, else [char] " parse >r squote r@ cmove squote r> then ; immediate : (abort") ( ... addr n -- ) ( R: ... -- ) cr type cr abort ; : abort" ( ... x "string" -- ) ( R: ... -- ) postpone if postpone s" postpone (abort") postpone then ; immediate \ ---------------------------------------------------------------------- ( Core words. ) \ TODO: # \ TODO: #> \ TODO: #s : and ( x y -- x&y ) nand invert ; : * 1 2>r 0 swap begin r@ while r> r> swap 2dup dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; \ TODO: */mod : +loop ( -- ) ( C: nest-sys -- ) postpone (+loop) postpone 0branch , postpone unloop ; immediate : space bl emit ; : ?.- dup 0 < if [char] - emit negate then ; : digit [char] 0 + emit ; : (.) base @ /mod ?dup if recurse then digit ; : ." ( "string" -- ) postpone s" postpone type ; immediate : . ( x -- ) ?.- (.) space ; : postpone-number ( caddr -- ) 0 0 rot count >number dup 0= if 2drop nip postpone (literal) postpone (literal) postpone , postpone literal postpone , else ." Undefined: " type cr abort then ; ' postpone-number postponers cell+ ! : / ( x y -- x/y ) /mod nip ; : 0< ( n -- flag ) 0 < ; : 1- ( n -- n-1 ) -1 + ; : 2! ( x1 x2 addr -- ) swap over ! cell+ ! ; : 2* ( n -- 2n ) dup + ; \ Kernel: 2/ : 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ; \ Kernel: 2drop \ Kernel: 2dup \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) \ 3 pick 3 pick ; \ TODO: 2swap \ TODO: <# : abs ( n -- |n| ) dup 0< if negate then ; \ TODO: accept : c, ( n -- ) here c! 1 chars allot ; : char+ ( n1 -- n2 ) 1+ ; : constant create , does> @ ; : decimal ( -- ) 10 base ! ; : depth ( -- n ) data_stack 100 cells + 'SP @ - /cell / 2 - ; : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) postpone 2>r here ; immediate \ TODO: environment? \ TODO: evaluate \ TODO: fill \ TODO: fm/mod ) \ TODO: hold : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) 'RP @ 3 cells + @ ; \ TODO: leave : loop ( -- ) ( C: nest-sys -- ) postpone 1 postpone (+loop) postpone 0branch , postpone unloop ; immediate : lshift begin ?dup while 1- swap dup + swap repeat ; : rshift 1 begin over while dup + swap 1- swap repeat nip 2>r 0 1 begin r@ while r> r> 2dup swap dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; : max ( x y -- max[x,y] ) 2dup > if drop else nip then ; \ Kernel: min \ TODO: mod \ TODO: move : (quit) ( R: ... -- ) return_stack 100 cells + 'RP ! 0 'source-id ! tib ''source ! #tib ''#source ! postpone [ begin refill while interpret state @ 0= if ." ok" cr then repeat bye ; ' (quit) ' quit >body cell+ ! \ TODO: s>d \ TODO: sign \ TODO: sm/rem : spaces ( n -- ) 0 do space loop ; \ TODO: u. : signbit ( -- n ) -1 1 rshift invert ; : xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ; : u< ( x y -- flag ) signbit xor swap signbit xor > ; \ TODO: um/mod : variable ( "word" -- ) create /cell allot ; : ['] \ ( C: "word" -- ) ' postpone literal ; immediate ================================================ FILE: samples/Forth/core.fs ================================================ : immediate lastxt @ dup c@ negate swap c! ; : \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff : char \ ( "word" -- char ) bl-word here 1+ c@ ; : ahead here 0 , ; : resolve here swap ! ; : ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; : postpone-nonimmediate [ ' literal , ' compile, ] literal , ; : create dovariable_code header, reveal ; create postponers ' postpone-nonimmediate , ' abort , ' , , : word \ ( char "string" -- caddr ) drop bl-word here ; : postpone \ ( C: "word" -- ) bl word find 1+ cells postponers + @ execute ; immediate : unresolved \ ( C: "word" -- orig ) postpone postpone postpone ahead ; immediate : chars \ ( n1 -- n2 ) ; : else \ ( -- ) ( C: orig1 -- orig2 ) unresolved branch swap resolve ; immediate : if \ ( flag -- ) ( C: -- orig ) unresolved 0branch ; immediate : then \ ( -- ) ( C: orig -- ) resolve ; immediate : [char] \ ( "word" -- ) char postpone literal ; immediate : (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ; : does> postpone (does>) ; immediate : begin \ ( -- ) ( C: -- dest ) here ; immediate : while \ ( x -- ) ( C: dest -- orig dest ) unresolved 0branch swap ; immediate : repeat \ ( -- ) ( C: orig dest -- ) postpone branch , resolve ; immediate : until \ ( x -- ) ( C: dest -- ) postpone 0branch , ; immediate : recurse lastxt @ compile, ; immediate : pad \ ( -- addr ) here 1024 + ; : parse \ ( char "string" -- addr n ) pad >r begin source? if else 0 0 then while r@ c! r> 1+ >r repeat 2drop pad r> over - ; : ( \ ( "string" -- ) [ char ) ] literal parse 2drop ; immediate \ TODO: If necessary, refill and keep parsing. : string, ( addr n -- ) here over allot align swap cmove ; : (s") ( -- addr n ) ( R: ret1 -- ret2 ) r> dup @ swap cell+ 2dup + aligned >r swap ; create squote 128 allot : s" ( "string" -- addr n ) state @ if postpone (s") [char] " parse dup , string, else [char] " parse >r squote r@ cmove squote r> then ; immediate : (abort") ( ... addr n -- ) ( R: ... -- ) cr type cr abort ; : abort" ( ... x "string" -- ) ( R: ... -- ) postpone if postpone s" postpone (abort") postpone then ; immediate \ ---------------------------------------------------------------------- ( Core words. ) \ TODO: # \ TODO: #> \ TODO: #s : and ( x y -- x&y ) nand invert ; : * 1 2>r 0 swap begin r@ while r> r> swap 2dup dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; \ TODO: */mod : +loop ( -- ) ( C: nest-sys -- ) postpone (+loop) postpone 0branch , postpone unloop ; immediate : space bl emit ; : ?.- dup 0 < if [char] - emit negate then ; : digit [char] 0 + emit ; : (.) base @ /mod ?dup if recurse then digit ; : ." ( "string" -- ) postpone s" postpone type ; immediate : . ( x -- ) ?.- (.) space ; : postpone-number ( caddr -- ) 0 0 rot count >number dup 0= if 2drop nip postpone (literal) postpone (literal) postpone , postpone literal postpone , else ." Undefined: " type cr abort then ; ' postpone-number postponers cell+ ! : / ( x y -- x/y ) /mod nip ; : 0< ( n -- flag ) 0 < ; : 1- ( n -- n-1 ) -1 + ; : 2! ( x1 x2 addr -- ) swap over ! cell+ ! ; : 2* ( n -- 2n ) dup + ; \ Kernel: 2/ : 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ; \ Kernel: 2drop \ Kernel: 2dup \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) \ 3 pick 3 pick ; \ TODO: 2swap \ TODO: <# : abs ( n -- |n| ) dup 0< if negate then ; \ TODO: accept : c, ( n -- ) here c! 1 chars allot ; : char+ ( n1 -- n2 ) 1+ ; : constant create , does> @ ; : decimal ( -- ) 10 base ! ; : depth ( -- n ) data_stack 100 cells + 'SP @ - /cell / 2 - ; : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) postpone 2>r here ; immediate \ TODO: environment? \ TODO: evaluate \ TODO: fill \ TODO: fm/mod ) \ TODO: hold : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) 'RP @ 3 cells + @ ; \ TODO: leave : loop ( -- ) ( C: nest-sys -- ) postpone 1 postpone (+loop) postpone 0branch , postpone unloop ; immediate : lshift begin ?dup while 1- swap dup + swap repeat ; : rshift 1 begin over while dup + swap 1- swap repeat nip 2>r 0 1 begin r@ while r> r> 2dup swap dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; : max ( x y -- max[x,y] ) 2dup > if drop else nip then ; \ Kernel: min \ TODO: mod \ TODO: move : (quit) ( R: ... -- ) return_stack 100 cells + 'RP ! 0 'source-id ! tib ''source ! #tib ''#source ! postpone [ begin refill while interpret state @ 0= if ." ok" cr then repeat bye ; ' (quit) ' quit >body cell+ ! \ TODO: s>d \ TODO: sign \ TODO: sm/rem : spaces ( n -- ) 0 do space loop ; \ TODO: u. : signbit ( -- n ) -1 1 rshift invert ; : xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ; : u< ( x y -- flag ) signbit xor swap signbit xor > ; \ TODO: um/mod : variable ( "word" -- ) create /cell allot ; : ['] \ ( C: "word" -- ) ' postpone literal ; immediate ================================================ FILE: samples/Forth/core.fth ================================================ : immediate lastxt @ dup c@ negate swap c! ; : \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff : char \ ( "word" -- char ) bl-word here 1+ c@ ; : ahead here 0 , ; : resolve here swap ! ; : ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; : postpone-nonimmediate [ ' literal , ' compile, ] literal , ; : create dovariable_code header, reveal ; create postponers ' postpone-nonimmediate , ' abort , ' , , : word \ ( char "string" -- caddr ) drop bl-word here ; : postpone \ ( C: "word" -- ) bl word find 1+ cells postponers + @ execute ; immediate : unresolved \ ( C: "word" -- orig ) postpone postpone postpone ahead ; immediate : chars \ ( n1 -- n2 ) ; : else \ ( -- ) ( C: orig1 -- orig2 ) unresolved branch swap resolve ; immediate : if \ ( flag -- ) ( C: -- orig ) unresolved 0branch ; immediate : then \ ( -- ) ( C: orig -- ) resolve ; immediate : [char] \ ( "word" -- ) char postpone literal ; immediate : (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ; : does> postpone (does>) ; immediate : begin \ ( -- ) ( C: -- dest ) here ; immediate : while \ ( x -- ) ( C: dest -- orig dest ) unresolved 0branch swap ; immediate : repeat \ ( -- ) ( C: orig dest -- ) postpone branch , resolve ; immediate : until \ ( x -- ) ( C: dest -- ) postpone 0branch , ; immediate : recurse lastxt @ compile, ; immediate : pad \ ( -- addr ) here 1024 + ; : parse \ ( char "string" -- addr n ) pad >r begin source? if else 0 0 then while r@ c! r> 1+ >r repeat 2drop pad r> over - ; : ( \ ( "string" -- ) [ char ) ] literal parse 2drop ; immediate \ TODO: If necessary, refill and keep parsing. : string, ( addr n -- ) here over allot align swap cmove ; : (s") ( -- addr n ) ( R: ret1 -- ret2 ) r> dup @ swap cell+ 2dup + aligned >r swap ; create squote 128 allot : s" ( "string" -- addr n ) state @ if postpone (s") [char] " parse dup , string, else [char] " parse >r squote r@ cmove squote r> then ; immediate : (abort") ( ... addr n -- ) ( R: ... -- ) cr type cr abort ; : abort" ( ... x "string" -- ) ( R: ... -- ) postpone if postpone s" postpone (abort") postpone then ; immediate \ ---------------------------------------------------------------------- ( Core words. ) \ TODO: # \ TODO: #> \ TODO: #s : and ( x y -- x&y ) nand invert ; : * 1 2>r 0 swap begin r@ while r> r> swap 2dup dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; \ TODO: */mod : +loop ( -- ) ( C: nest-sys -- ) postpone (+loop) postpone 0branch , postpone unloop ; immediate : space bl emit ; : ?.- dup 0 < if [char] - emit negate then ; : digit [char] 0 + emit ; : (.) base @ /mod ?dup if recurse then digit ; : ." ( "string" -- ) postpone s" postpone type ; immediate : . ( x -- ) ?.- (.) space ; : postpone-number ( caddr -- ) 0 0 rot count >number dup 0= if 2drop nip postpone (literal) postpone (literal) postpone , postpone literal postpone , else ." Undefined: " type cr abort then ; ' postpone-number postponers cell+ ! : / ( x y -- x/y ) /mod nip ; : 0< ( n -- flag ) 0 < ; : 1- ( n -- n-1 ) -1 + ; : 2! ( x1 x2 addr -- ) swap over ! cell+ ! ; : 2* ( n -- 2n ) dup + ; \ Kernel: 2/ : 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ; \ Kernel: 2drop \ Kernel: 2dup \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) \ 3 pick 3 pick ; \ TODO: 2swap \ TODO: <# : abs ( n -- |n| ) dup 0< if negate then ; \ TODO: accept : c, ( n -- ) here c! 1 chars allot ; : char+ ( n1 -- n2 ) 1+ ; : constant create , does> @ ; : decimal ( -- ) 10 base ! ; : depth ( -- n ) data_stack 100 cells + 'SP @ - /cell / 2 - ; : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) postpone 2>r here ; immediate \ TODO: environment? \ TODO: evaluate \ TODO: fill \ TODO: fm/mod ) \ TODO: hold : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) 'RP @ 3 cells + @ ; \ TODO: leave : loop ( -- ) ( C: nest-sys -- ) postpone 1 postpone (+loop) postpone 0branch , postpone unloop ; immediate : lshift begin ?dup while 1- swap dup + swap repeat ; : rshift 1 begin over while dup + swap 1- swap repeat nip 2>r 0 1 begin r@ while r> r> 2dup swap dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; : max ( x y -- max[x,y] ) 2dup > if drop else nip then ; \ Kernel: min \ TODO: mod \ TODO: move : (quit) ( R: ... -- ) return_stack 100 cells + 'RP ! 0 'source-id ! tib ''source ! #tib ''#source ! postpone [ begin refill while interpret state @ 0= if ." ok" cr then repeat bye ; ' (quit) ' quit >body cell+ ! \ TODO: s>d \ TODO: sign \ TODO: sm/rem : spaces ( n -- ) 0 do space loop ; \ TODO: u. : signbit ( -- n ) -1 1 rshift invert ; : xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ; : u< ( x y -- flag ) signbit xor swap signbit xor > ; \ TODO: um/mod : variable ( "word" -- ) create /cell allot ; : ['] \ ( C: "word" -- ) ' postpone literal ; immediate ================================================ FILE: samples/Forth/core1.F ================================================ : immediate lastxt @ dup c@ negate swap c! ; : \ source nip >in ! ; immediate \ Copyright 2004, 2012 Lars Brinkhoff : char \ ( "word" -- char ) bl-word here 1+ c@ ; : ahead here 0 , ; : resolve here swap ! ; : ' bl-word here find 0branch [ ahead ] exit [ resolve ] 0 ; : postpone-nonimmediate [ ' literal , ' compile, ] literal , ; : create dovariable_code header, reveal ; create postponers ' postpone-nonimmediate , ' abort , ' , , : word \ ( char "string" -- caddr ) drop bl-word here ; : postpone \ ( C: "word" -- ) bl word find 1+ cells postponers + @ execute ; immediate : unresolved \ ( C: "word" -- orig ) postpone postpone postpone ahead ; immediate : chars \ ( n1 -- n2 ) ; : else \ ( -- ) ( C: orig1 -- orig2 ) unresolved branch swap resolve ; immediate : if \ ( flag -- ) ( C: -- orig ) unresolved 0branch ; immediate : then \ ( -- ) ( C: orig -- ) resolve ; immediate : [char] \ ( "word" -- ) char postpone literal ; immediate : (does>) lastxt @ dodoes_code over >code ! r> swap >does ! ; : does> postpone (does>) ; immediate : begin \ ( -- ) ( C: -- dest ) here ; immediate : while \ ( x -- ) ( C: dest -- orig dest ) unresolved 0branch swap ; immediate : repeat \ ( -- ) ( C: orig dest -- ) postpone branch , resolve ; immediate : until \ ( x -- ) ( C: dest -- ) postpone 0branch , ; immediate : recurse lastxt @ compile, ; immediate : pad \ ( -- addr ) here 1024 + ; : parse \ ( char "string" -- addr n ) pad >r begin source? if else 0 0 then while r@ c! r> 1+ >r repeat 2drop pad r> over - ; : ( \ ( "string" -- ) [ char ) ] literal parse 2drop ; immediate \ TODO: If necessary, refill and keep parsing. : string, ( addr n -- ) here over allot align swap cmove ; : (s") ( -- addr n ) ( R: ret1 -- ret2 ) r> dup @ swap cell+ 2dup + aligned >r swap ; create squote 128 allot : s" ( "string" -- addr n ) state @ if postpone (s") [char] " parse dup , string, else [char] " parse >r squote r@ cmove squote r> then ; immediate : (abort") ( ... addr n -- ) ( R: ... -- ) cr type cr abort ; : abort" ( ... x "string" -- ) ( R: ... -- ) postpone if postpone s" postpone (abort") postpone then ; immediate \ ---------------------------------------------------------------------- ( Core words. ) \ TODO: # \ TODO: #> \ TODO: #s : and ( x y -- x&y ) nand invert ; : * 1 2>r 0 swap begin r@ while r> r> swap 2dup dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; \ TODO: */mod : +loop ( -- ) ( C: nest-sys -- ) postpone (+loop) postpone 0branch , postpone unloop ; immediate : space bl emit ; : ?.- dup 0 < if [char] - emit negate then ; : digit [char] 0 + emit ; : (.) base @ /mod ?dup if recurse then digit ; : ." ( "string" -- ) postpone s" postpone type ; immediate : . ( x -- ) ?.- (.) space ; : postpone-number ( caddr -- ) 0 0 rot count >number dup 0= if 2drop nip postpone (literal) postpone (literal) postpone , postpone literal postpone , else ." Undefined: " type cr abort then ; ' postpone-number postponers cell+ ! : / ( x y -- x/y ) /mod nip ; : 0< ( n -- flag ) 0 < ; : 1- ( n -- n-1 ) -1 + ; : 2! ( x1 x2 addr -- ) swap over ! cell+ ! ; : 2* ( n -- 2n ) dup + ; \ Kernel: 2/ : 2@ ( addr -- x1 x2 ) dup cell+ @ swap @ ; \ Kernel: 2drop \ Kernel: 2dup \ TODO: 2over ( x1 x2 x3 x4 -- x1 x2 x3 x4 x1 x2 ) \ 3 pick 3 pick ; \ TODO: 2swap \ TODO: <# : abs ( n -- |n| ) dup 0< if negate then ; \ TODO: accept : c, ( n -- ) here c! 1 chars allot ; : char+ ( n1 -- n2 ) 1+ ; : constant create , does> @ ; : decimal ( -- ) 10 base ! ; : depth ( -- n ) data_stack 100 cells + 'SP @ - /cell / 2 - ; : do ( n1 n2 -- ) ( R: -- loop-sys ) ( C: -- do-sys ) postpone 2>r here ; immediate \ TODO: environment? \ TODO: evaluate \ TODO: fill \ TODO: fm/mod ) \ TODO: hold : j ( -- x1 ) ( R: x1 x2 x3 -- x1 x2 x3 ) 'RP @ 3 cells + @ ; \ TODO: leave : loop ( -- ) ( C: nest-sys -- ) postpone 1 postpone (+loop) postpone 0branch , postpone unloop ; immediate : lshift begin ?dup while 1- swap dup + swap repeat ; : rshift 1 begin over while dup + swap 1- swap repeat nip 2>r 0 1 begin r@ while r> r> 2dup swap dup + 2>r and if swap over + swap then dup + repeat r> r> 2drop drop ; : max ( x y -- max[x,y] ) 2dup > if drop else nip then ; \ Kernel: min \ TODO: mod \ TODO: move : (quit) ( R: ... -- ) return_stack 100 cells + 'RP ! 0 'source-id ! tib ''source ! #tib ''#source ! postpone [ begin refill while interpret state @ 0= if ." ok" cr then repeat bye ; ' (quit) ' quit >body cell+ ! \ TODO: s>d \ TODO: sign \ TODO: sm/rem : spaces ( n -- ) 0 do space loop ; \ TODO: u. : signbit ( -- n ) -1 1 rshift invert ; : xor ( x y -- x^y ) 2dup nand >r r@ nand swap r> nand nand ; : u< ( x y -- flag ) signbit xor swap signbit xor > ; \ TODO: um/mod : variable ( "word" -- ) create /cell allot ; : ['] \ ( C: "word" -- ) ' postpone literal ; immediate ================================================ FILE: samples/Forth/enum.frt ================================================ \ Implements ENUM. \ Double DOES>! : enum create 0 , does> create dup @ 1 rot +! , does> @ ; \ But this is simpler. : enum create 0 , does> dup @ constant 1 swap +! ; ================================================ FILE: samples/Forth/hello-forth.forth ================================================ : HELLO ( -- ) ." Hello Forth (forth)!" ; HELLO ================================================ FILE: samples/Forth/hello-forth.fth ================================================ : HELLO ( -- ) ." Hello Forth (fth)!" ; HELLO ================================================ FILE: samples/Forth/macros.frt ================================================ \ Simplifies compiling words. : [[ ; immediate : '<> >in @ ' swap >in ! <> ; : (]]) begin dup '<> while postpone postpone repeat drop ; : ]] ['] [[ (]]) ; immediate ( Usage: : foo ]] dup * [[ ; immediate : bar 42 foo . ; ) ================================================ FILE: samples/Forth/tools.4TH ================================================ \ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff ( Tools words. ) : .s ( -- ) [char] < emit depth (.) ." > " 'SP @ >r r@ depth 1- cells + begin dup r@ <> while dup @ . /cell - repeat r> 2drop ; : ? @ . ; : c? c@ . ; : dump bounds do i ? /cell +loop cr ; : cdump bounds do i c? loop cr ; : again postpone branch , ; immediate : see-find ( caddr -- end xt ) >r here lastxt @ begin dup 0= abort" Undefined word" dup r@ word= if r> drop exit then nip dup >nextxt again ; : cabs ( char -- |char| ) dup 127 > if 256 swap - then ; : xt. ( xt -- ) ( >name ) count cabs type ; : xt? ( xt -- flag ) >r lastxt @ begin ?dup while dup r@ = if r> 2drop -1 exit then >nextxt repeat r> drop 0 ; : disassemble ( x -- ) dup xt? if ( >name ) count dup 127 > if ." postpone " then cabs type else . then ; : .addr dup . ; : see-line ( addr -- ) cr ." ( " .addr ." ) " @ disassemble ; : see-word ( end xt -- ) >r ." : " r@ xt. r@ >body do i see-line /cell +loop ." ;" r> c@ 127 > if ." immediate" then ; : see bl word see-find see-word cr ; : #body bl word see-find >body - ; : type-word ( end xt -- flag ) xt. space drop 0 ; : traverse-dictionary ( in.. xt -- out.. ) \ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true ) >r here lastxt @ begin ?dup while r> 2dup >r >r execute if r> r> 2drop exit then r> dup >nextxt repeat r> 2drop ; : words ( -- ) ['] type-word traverse-dictionary cr ; \ ---------------------------------------------------------------------- ( Tools extension words. ) \ ;code \ assembler \ in kernel: bye \ code \ cs-pick \ cs-roll \ editor : forget ' dup >nextxt lastxt ! 'here ! reveal ; \ Kernel: state \ [else] \ [if] \ [then] \ ---------------------------------------------------------------------- ( Forth2012 tools extension words. ) \ TODO: n>r \ TODO: nr> \ TODO: synonym : [undefined] bl-word find nip 0= ; immediate : [defined] postpone [undefined] invert ; immediate \ ---------------------------------------------------------------------- : @+ ( addr -- addr+/cell x ) dup cell+ swap @ ; : !+ ( x addr -- addr+/cell ) tuck ! cell+ ; : -rot swap >r swap r> ; ================================================ FILE: samples/Forth/tools.fth ================================================ \ -*- forth -*- Copyright 2004, 2013 Lars Brinkhoff ( Tools words. ) : .s ( -- ) [char] < emit depth (.) ." > " 'SP @ >r r@ depth 1- cells + begin dup r@ <> while dup @ . /cell - repeat r> 2drop ; : ? @ . ; : c? c@ . ; : dump bounds do i ? /cell +loop cr ; : cdump bounds do i c? loop cr ; : again postpone branch , ; immediate : see-find ( caddr -- end xt ) >r here lastxt @ begin dup 0= abort" Undefined word" dup r@ word= if r> drop exit then nip dup >nextxt again ; : cabs ( char -- |char| ) dup 127 > if 256 swap - then ; : xt. ( xt -- ) ( >name ) count cabs type ; : xt? ( xt -- flag ) >r lastxt @ begin ?dup while dup r@ = if r> 2drop -1 exit then >nextxt repeat r> drop 0 ; : disassemble ( x -- ) dup xt? if ( >name ) count dup 127 > if ." postpone " then cabs type else . then ; : .addr dup . ; : see-line ( addr -- ) cr ." ( " .addr ." ) " @ disassemble ; : see-word ( end xt -- ) >r ." : " r@ xt. r@ >body do i see-line /cell +loop ." ;" r> c@ 127 > if ." immediate" then ; : see bl word see-find see-word cr ; : #body bl word see-find >body - ; : type-word ( end xt -- flag ) xt. space drop 0 ; : traverse-dictionary ( in.. xt -- out.. ) \ xt execution: ( in.. end xt2 -- in.. 0 | in.. end xt2 -- out.. true ) >r here lastxt @ begin ?dup while r> 2dup >r >r execute if r> r> 2drop exit then r> dup >nextxt repeat r> 2drop ; : words ( -- ) ['] type-word traverse-dictionary cr ; \ ---------------------------------------------------------------------- ( Tools extension words. ) \ ;code \ assembler \ in kernel: bye \ code \ cs-pick \ cs-roll \ editor : forget ' dup >nextxt lastxt ! 'here ! reveal ; \ Kernel: state \ [else] \ [if] \ [then] \ ---------------------------------------------------------------------- ( Forth2012 tools extension words. ) \ TODO: n>r \ TODO: nr> \ TODO: synonym : [undefined] bl-word find nip 0= ; immediate : [defined] postpone [undefined] invert ; immediate \ ---------------------------------------------------------------------- : @+ ( addr -- addr+/cell x ) dup cell+ swap @ ; : !+ ( x addr -- addr+/cell ) tuck ! cell+ ; : -rot swap >r swap r> ; ================================================ FILE: samples/Fortran/bug-185631.f ================================================ ! Codes/HYCOM/hycom/ATLb2.00/src_2.0.01_22_one/ real onemu, twomu data onemu/0.0098/ data twomu/1./ data threemu/0.e9/ end ================================================ FILE: samples/Fortran/sample1.f ================================================ c comment * comment program main end subroutine foo( i, x, b ) INTEGER i REAL x LOGICAL b if( i.ne.0 ) then call bar( -i ) end if return end double complex function baz() baz = (0.0d0,0.0d0) return end ================================================ FILE: samples/Fortran/sample1.for ================================================ c comment * comment program main end subroutine foo( i, x, b ) INTEGER i REAL x LOGICAL b if( i.ne.0 ) then call bar( -i ) end if return end double complex function baz() baz = (0.0d0,0.0d0) return end ================================================ FILE: samples/Fortran/sample2.f ================================================ PROGRAM MAIN END C comment * comment SUBROUTINE foo( i, x, b ) INTEGER i REAL x LOGICAL b IF( i.NE.0 ) THEN CALL bar( -i ) END IF RETURN END DOUBLE COMPLEX FUNCTION baz() baz = (0.0d0,0.0d0) RETURN END ================================================ FILE: samples/Fortran/sample3.F ================================================ c comment * comment program main end subroutine foo( i, x, b ) INTEGER i REAL x LOGICAL b if( i.ne.0 ) then call bar( -i ) end if return end double complex function baz() baz = (0.0d0,0.0d0) return end ================================================ FILE: samples/FreeBASIC/WinGUI template.bi ================================================ #include "windows.bi" #include "win\commctrl.bi" ' for CreateStatusWindow Dim Shared As Handle hEdit, hList, hStatus Function WndProc(hWnd As HWND, msg As UINT, wParam As WPARAM, lParam As LPARAM) As LRESULT Dim As RECT rc Dim As PAINTSTRUCT ps Dim As HANDLE PtDC Dim As HMENU hMenu, hPopup, hPop2 Select Case msg Case WM_CREATE hMenu=CreateMenu() ' create the main menu hPopup=CreatePopupMenu() ' create a sub-menu AppendMenu(hMenu, MF_POPUP, Cast(UINT_PTR, hPopup), "&File") ' add it to the main menu AppendMenu(hPopup, MF_STRING, 101, "&Open") ' one more main item hPop2=CreatePopupMenu() ' create a sub-menu AppendMenu(hPop2, MF_STRING, 121, "&sources") ' fill it AppendMenu(hPop2, MF_STRING, 122, "&includes") ' with various AppendMenu(hPop2, MF_STRING, 123, "&DLLs") ' options AppendMenu(hPopup, MF_POPUP, Cast(UINT_PTR, hPop2), "&Dir") ' and add it to the main menu as "Dir" AppendMenu(hPopup, MF_STRING, 102, "&Save") ' one more main item AppendMenu(hPopup, MF_STRING, 103, "E&xit") ' one more main item SetMenu(hWnd, hMenu) ' attach menu to main window hStatus=CreateStatusWindow(WS_CHILD Or WS_VISIBLE Or WS_CLIPSIBLINGS Or SBS_SIZEGRIP, 0, hWnd, 99) SendMessage(hStatus, WM_SETTEXT, 0, Cast(lParam, @"This is the status bar")) hEdit=CreateWindowEx(WS_EX_CLIENTEDGE, "edit", "Hello, I am an edit control", WS_CHILD Or WS_VISIBLE Or ES_MULTILINE, 0, 0, 100, 100, hWnd, hMenu, 0, 0) hList=CreateWindowEx(WS_EX_CLIENTEDGE, "listbox", 0, WS_CHILD Or WS_VISIBLE, 0, 0, 100, 100, hWnd, hMenu, 0, 0) SendMessage(hList, LB_ADDSTRING, 0, Cast(lParam, @"line 1")) If Open(Command(1) For Binary Access Read As #1) = 0 Then Dim As UByte file_char ( LOF(1)) Get #1, , file_char() Close #1 SendMessage(hEdit, WM_SETTEXT, 0, Cast(lParam, @file_char(0))) endif Case WM_COMMAND Select Case wParam Case 101: MessageBox(hWnd, "Open not implemented", 0, MB_OK) Case 102: MessageBox(hWnd, "Save not implemented", 0, MB_OK) Case 121: MessageBox(hWnd, "No *.bas files found", 0, MB_OK) Case 122: MessageBox(hWnd, "No *.inc files found", 0, MB_OK) Case 123: MessageBox(hWnd, "No *.dll files found", 0, MB_OK) Case 103: SendMessage(hWnd, WM_CLOSE, 0, 0) End Select Case WM_PAINT PtDC=BeginPaint(hWnd, @ps) SetBkMode(PtDC, TRANSPARENT) TextOut(PtDC, 4, 4, "Greetings from the WM_PAINT handler", 35) EndPaint(hWnd, @ps) Case WM_KEYDOWN if wParam=VK_ESCAPE then SendMessage(hWnd, WM_CLOSE, 0, 0) Case WM_SIZE GetClientRect(hWnd, @rc) MoveWindow(hEdit, 3, 28, rc.right-66, rc.bottom-50, 0) MoveWindow(hList, rc.right-60, 28, rc.right-6, rc.bottom-50, 0) Case WM_DESTROY PostQuitMessage(0) End Select return DefWindowProc(hwnd, msg, wParam, lParam) End Function type pCall as function (xy as any ptr) as long type DLLVERSIONINFO cbSize as long dwMajorVersion as long dwMinorVersion as long dwBuildNumber as long dwPlatformID as long end type Function WinMain(hInstance As HINSTANCE, hPrevInstance As HINSTANCE, lpCmdLine As LPSTR, nShowCmd As Integer) As Integer Dim wc As WNDCLASSEX, msg As MSG, hDll As HANDLE, hIconLib As HANDLE, pGetVersion as pCall, dvi As DLLVERSIONINFO dvi.cbSize=sizeof(DLLVERSIONINFO) hIconLib=LoadLibrary("shell32") wc.hIcon = LoadIcon(hIconLib, Cast(LPCTSTR, 239)) ' get the butterfly icon FreeLibrary(hIconLib) hDll=LoadLibrary("ComCtl32") pGetVersion=Cast(Any Ptr, GetProcAddress(hDll, "DllGetVersion")) pGetVersion(@dvi) If @dvi.dwMajorVersion Then Print "Using common controls version ";Str(dvi.dwMajorVersion);".";Str(dvi.dwMinorVersion) FreeLibrary(hDll) wc.cbSize = SizeOf(WNDCLASSEX) wc.hbrBackground = GetStockObject(COLOR_BTNFACE+1) wc.hCursor = LoadCursor(0, IDC_ARROW) wc.hIconSm = wc.hIcon wc.hInstance = hInstance wc.lpfnWndProc = @WndProc wc.lpszClassName = @"FbGui" wc.style = CS_HREDRAW Or CS_VREDRAW RegisterClassEx(@wc) If CreateWindowEx(0, wc.lpszClassName, "Hello World",_ WS_OVERLAPPEDWINDOW Or WS_VISIBLE, (GetSystemMetrics(SM_CXSCREEN) / 2) - 150,_ (GetSystemMetrics(SM_CYSCREEN) / 2) - 150, 300, 300, 0, 0, hInstance, 0)=0 Then MessageBox(0, "Creating hMain failed miserably", 0, MB_OK) Return 0 End If While GetMessage(@msg, 0, 0, 0) TranslateMessage(@msg) DispatchMessage(@msg) Wend Return msg.wParam End Function WinMain(GetModuleHandle(NULL), NULL, Command(), SW_NORMAL) ================================================ FILE: samples/FreeBASIC/array_clearobj.bas ================================================ /' ERASE for static arrays of objects: re-init the elements '/ #include "fb.bi" extern "C" sub fb_hArrayCtorObj( array as FBARRAY ptr, ctor as FB_DEFCTOR, base_idx as size_t ) dim as size_t i, elements, element_len dim as FBARRAYDIM ptr _dim dim as ubyte ptr this_ if ( array->_ptr = NULL ) then exit sub end if _dim = @array->dimTB(0) elements = _dim->elements - base_idx _dim += 1 i = 1 while( i < array->dimensions ) elements *= _dim->elements i += 1 _dim += 1 wend /' call ctors '/ element_len = array->element_len this_ = array->_ptr while( elements > 0 ) /' !!!FIXME!!! check exceptions (only if rewritten in C++) '/ ctor( this_ ) this_ += element_len elements -= 1 wend end sub function fb_ArrayClearObj FBCALL ( array as FBARRAY ptr, ctor as FB_DEFCTOR, dtor as FB_DEFCTOR ) as long /' destruct all objects in the array (dtor can be NULL if there only is a ctor) '/ if ( dtor <> 0 ) then fb_ArrayDestructObj( array, dtor ) end if /' re-initialize (ctor can be NULL if there only is a dtor) '/ if( ctor <> 0) then /' if a ctor exists, it should handle the whole initialization '/ fb_hArrayCtorObj( array, ctor, 0 ) else /' otherwise, just clear '/ fb_ArrayClear( array ) end if return fb_ErrorSetNum( FB_RTERROR_OK ) end function end extern ================================================ FILE: samples/FreeBASIC/ir.bas ================================================ '' intermediate representation - core module '' '' chng: dec/2006 written [v1ctor] #include once "fb.bi" #include once "fbint.bi" #include once "ir.bi" #include once "emit.bi" #include once "ir-private.bi" dim shared ir as IRCTX sub irInit( ) select case( env.clopt.backend ) case FB_BACKEND_GCC ir.vtbl = irhlc_vtbl case FB_BACKEND_LLVM ir.vtbl = irllvm_vtbl case FB_BACKEND_GAS64 ir.vtbl = irgas64_vtbl case else assert( env.clopt.backend = FB_BACKEND_GAS ) ir.vtbl = irtac_vtbl end select '' reset ir.options becasue irSetOption() will merge (OR) values ir.options = 0 ir.vtbl.init( ) end sub sub irEnd( ) ir.vtbl.end( ) ir.options = 0 #if __FB_DEBUG__ '' debugging - reset the vtable - shouldn't matter in production '' because ir.vtbl calls should never be called outside irInit()/irEnd() dim null_vtbl as IR_VTBL ir.vtbl = null_vtbl #endif end sub dim shared irhl as IRHLCONTEXT sub irhlInit( ) flistInit( @irhl.vregs, IR_INITVREGNODES, sizeof( IRVREG ) ) listInit( @irhl.callargs, 32, sizeof( IRCALLARG ), LIST_FLAGS_NOCLEAR ) end sub sub irhlEnd( ) listEnd( @irhl.callargs ) flistEnd( @irhl.vregs ) end sub sub irhlEmitProcBegin( ) irhl.regcount = 0 end sub sub irhlEmitProcEnd( ) flistReset( @irhl.vregs ) end sub sub irhlEmitPushArg _ ( _ byval param as FBSYMBOL ptr, _ byval vr as IRVREG ptr, _ byval udtlen as longint, _ byval level as integer, _ byval lreg as IRVREG ptr _ _ ) '' Remember for later, so during _emitCall[Ptr] we can emit the whole '' call in one go dim as IRCALLARG ptr arg = listNewNode( @irhl.callargs ) arg->param = param arg->vr = vr arg->level = level '' ignore udtlen, it's only used by ir-tac.bas:_emitPushArg() '' ignore lreg, it's only used by ir-tac.bas:_emitPushArg() end sub function irhlNewVreg _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval vtype as integer _ ) as IRVREG ptr dim as IRVREG ptr v = any v = flistNewItem( @irhl.vregs ) v->typ = vtype v->dtype = dtype v->subtype = subtype if( vtype = IR_VREGTYPE_REG ) then v->reg = irhl.regcount irhl.regcount += 1 else v->reg = INVALID end if v->regFamily = 0 v->vector = 0 v->sym = NULL v->ofs = 0 v->mult = 0 v->vidx = NULL v->vaux = NULL function = v end function function irhlAllocVreg _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr _ ) as IRVREG ptr function = irhlNewVreg( dtype, subtype, IR_VREGTYPE_REG ) end function function irhlAllocVrImm _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval value as longint _ ) as IRVREG ptr dim as IRVREG ptr vr = any vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_IMM ) vr->value.i = value function = vr end function function irhlAllocVrImmF _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval value as double _ ) as IRVREG ptr dim as IRVREG ptr vr = any vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_IMM ) vr->value.f = value function = vr end function function irhlAllocVrVar _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval symbol as FBSYMBOL ptr, _ byval ofs as longint _ ) as IRVREG ptr dim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_VAR ) vr->sym = symbol vr->ofs = ofs function = vr end function function irhlAllocVrIdx _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval symbol as FBSYMBOL ptr, _ byval ofs as longint, _ byval mult as integer, _ byval vidx as IRVREG ptr _ ) as IRVREG ptr dim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_IDX ) vr->sym = symbol vr->ofs = ofs vr->vidx = vidx function = vr end function function irhlAllocVrPtr _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval ofs as longint, _ byval vidx as IRVREG ptr _ ) as IRVREG ptr dim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_PTR ) vr->ofs = ofs vr->vidx = vidx function = vr end function function irhlAllocVrOfs _ ( _ byval dtype as integer, _ byval subtype as FBSYMBOL ptr, _ byval symbol as FBSYMBOL ptr, _ byval ofs as longint _ ) as IRVREG ptr dim as IRVREG ptr vr = irhlNewVreg( dtype, subtype, IR_VREGTYPE_OFS ) vr->sym = symbol vr->ofs = ofs function = vr end function '' DATA descriptor arrays must be emitted based on the order indicated by the '' FBSYMBOL.var_.data.prev linked list, not in the symtb order. sub irForEachDataStmt( byval callback as sub( byval as FBSYMBOL ptr ) ) var sym = astGetLastDataStmtSymbol( ) while( sym ) callback( sym ) sym = sym->var_.data.prev wend end sub sub irhlFlushStaticInitializer( byval sym as FBSYMBOL ptr ) astLoadStaticInitializer( symbGetTypeIniTree( sym ), sym ) symbSetTypeIniTree( sym, NULL ) end sub #if __FB_DEBUG__ function vregDumpToStr( byval v as IRVREG ptr ) as string dim as string s dim as string regname if( v = NULL ) then return "" end if static as zstring ptr vregtypes(IR_VREGTYPE_IMM to IR_VREGTYPE_OFS) = _ { _ @"imm", @"var", @"idx", @"ptr", @"reg", @"ofs" _ } #if 0 s += "[" + hex( v, 8 ) + "] " #endif s += *vregtypes(v->typ) select case( v->typ ) case IR_VREGTYPE_IMM s += " " if( typeGetClass( v->dtype ) = FB_DATACLASS_FPOINT ) then s += str( v->value.f ) else s += str( v->value.i ) end if case IR_VREGTYPE_REG if( env.clopt.backend = FB_BACKEND_GAS ) then regname = emitDumpRegName( v->dtype, v->reg ) if( len( regname ) > 0 ) then s += " " + ucase( regname ) else s += " " + str( v->reg ) end if else ''s += " reg=" s += " " + str( v->reg ) end if end select if( v->sym ) then s += " " + *symbGetName( v->sym ) end if if( v->typ <> IR_VREGTYPE_REG ) then if( v->ofs ) then if( (env.clopt.backend = FB_BACKEND_GAS) and (v->sym <> NULL) ) then s += " [" + *symbGetMangledName( v->sym ) if( v->ofs >= 0 ) then s += "+" end if s += str( v->ofs ) s += "]" else s += " ofs=" + str( v->ofs ) end if end if if( v->mult ) then s += " mult=" + str( v->mult ) end if end if s += " " + typeDumpToStr( v->dtype, v->subtype ) if( v->typ <> IR_VREGTYPE_REG ) then if( v->vidx ) then s += " vidx=<" + vregDumpToStr( v->vidx ) + ">" end if end if '' If it's a longint vreg, show vaux '' ASM backend: uses vaux, so always show it '' C/LLVM backends: don't use vaux, so only show it if it's set if( ISLONGINT( v->dtype ) and _ ((env.clopt.backend = FB_BACKEND_GAS) or (v->vaux <> NULL)) ) then s += " vaux=<" + vregDumpToStr( v->vaux ) + ">" end if function = s end function sub vregDump( byval v as IRVREG ptr ) print vregDumpToStr( v ) end sub #endif ================================================ FILE: samples/FreeBASIC/makescript.bas ================================================ #define NULL 0 #define FALSE 0 #define TRUE (-1) #define STRINGIFY(s) #s private sub fatalCantOpenFile(byref file as string) print "Error: Could not open file: '" + file + "'" end 1 end sub private function strReplace _ ( _ byref text as string, _ byref a as string, _ byref b as string _ ) as string static as string result static as string keep result = text dim as integer alen = len(a) dim as integer blen = len(b) dim as integer p = 0 do p = instr(p + 1, result, a) if (p = 0) then exit do end if keep = mid(result, p + alen) result = left(result, p - 1) result += b result += keep p += blen - 1 loop return result end function '' Searches backwards for the last '/' or '\'. private function findFileName(byref path as string) as integer for i as integer = (len(path)-1) to 0 step -1 dim as integer ch = path[i] if ((ch = asc("/")) or (ch = asc("\"))) then return i + 1 end if next return 0 end function private function pathStripFile(byref path as string) as string return left(path, findFileName(path)) end function private function pathStripComponent(byref path as string) as string dim as string s = path '' Strip path div at the end dim as integer length = len(s) if (length > 0) then dim as integer ch = s[length-1] if ((ch = asc("/")) or (ch = asc("\"))) then s = left(s, len(s) - 1) end if end if '' Strip the last component return pathStripFile(s) end function private sub emitPath(byval o as integer, byref cmd as string, byref path as string) print #o, " " + cmd + " ""$INSTDIR\" + path + """" end sub private sub emitRmDirs(byval o as integer, byref prevpath as string, byref path as string) '' RMDir foo\bar\baz '' RMDir foo\bar '' RMDir foo while ((len(prevpath) > 0) and (prevpath <> left(path, len(prevpath)))) emitPath(o, "RMDir ", prevpath) prevpath = pathStripComponent(prevpath) wend end sub private sub emitInstallerFiles _ ( _ byref manifest as string, _ byval o as integer, _ byval install as integer _ ) dim as integer f = freefile() if (open(manifest, for input, as #f)) then fatalCantOpenFile(manifest) end if dim as string filename = "" dim as string path = "" dim as string prevpath = "" while (eof(f) = FALSE) line input #f, filename if (len(filename)) then '' Use backslashes for NSIS... filename = strReplace(filename, "/", "\") path = pathStripFile(filename) if (path <> prevpath) then if (install) then emitPath(o, "SetOutPath", path) else emitRmDirs(o, prevpath, path) end if prevpath = path end if if (install) then filename = " File """ + filename + """" else filename = " Delete ""$INSTDIR\" + filename + """" end if print #o, filename end if wend if (install = FALSE) then emitRmDirs(o, prevpath, path) end if close #f end sub if (__FB_ARGC__ <> 4) then print "Usage: makescript manifest.lst template.nsi outputscript.nsi" end 1 end if dim as string manifest = *__FB_ARGV__[1] dim as string inscript = *__FB_ARGV__[2] dim as string outscript = *__FB_ARGV__[3] dim as integer i = freefile() if (open(inscript, for input, as #i)) then fatalCantOpenFile(inscript) end if dim as integer o = freefile() if (open(outscript, for output, as #o)) then fatalCantOpenFile(outscript) end if dim as string ln = "" while (eof(i) = FALSE) line input #i, ln select case (trim(ln)) case ";;;INSTALL;;;" emitInstallerFiles(manifest, o, TRUE) case ";;;UNINSTALL;;;" emitInstallerFiles(manifest, o, FALSE) case else ln = strReplace(ln, ";;;FBVERSION;;;", STRINGIFY(FBVERSION)) print #o, ln end select wend ================================================ FILE: samples/FreeMarker/blocks-card.ftlh ================================================ <#-- @ftlvariable name="classes" type="String" --> <#-- @ftlvariable name="url" type="String" --> <#-- @ftlvariable name="image" type="Object" --> <#-- @ftlvariable name="image.src" type="String" --> <#-- @ftlvariable name="image.altText" type="String" --> <#-- @ftlvariable name="image.width" type="String" --> <#-- @ftlvariable name="image.height" type="String" --> <#-- @ftlvariable name="kicker" type="String" --> <#-- @ftlvariable name="title" type="String" --> <#-- @ftlvariable name="text" type="String" -->
    <@linkOrDiv href=url!"" class="blocks-card--card"> <#if image??>
    ${image.altText!}width="${image.width}" <#if image.height??>height="${image.height}" />
    <#if kicker?has_content || title?has_content || text?has_content>
    <#if kicker?has_content> ${kicker} <#if title?has_content>

    ${title}

    <#if text?has_content>
    ${text?no_esc}
    <#macro linkOrDiv href class> <#if href?has_content> <#nested> <#else>
    <#nested>
    ================================================ FILE: samples/FreeMarker/example.ftl ================================================ <#import "layout.ftl" as layout> <#assign results = [ { "title": "Example Result", "description": "Lorem ipsum dolor sit amet, pede id pellentesque, sollicitudin turpis sed in sed sed, libero dictum." } ] /> <@layout.page title="FreeMarker Example"> <#if results?size == 0> There were no results. <#else>
      <#list results as result>
    • ${result.title}

      ${result.description}

    <#-- This is a FreeMarker comment --> <@currentTime /> <#macro currentTime> ${.now?string.full} ================================================ FILE: samples/FreeMarker/header.ftlh ================================================ [#-- @ftlvariable name="locale" type="String" --] [#-- @ftlvariable name="spaceKey" type="String" --] [#-- @ftlvariable name="filters" type="java.util.ArrayList" --]

    [@localize key="feature-toggles.displayName" locale=locale /]

    [#if filters?size == 1]
    [@localize key="feature-toggles.spaceKey" locale=locale /] ${spaceKey}
    [#elseif filters?size > 1]
    [@localize key="feature-toggles.selectSpace" locale=locale /]
    [/#if]
    ================================================ FILE: samples/FreeMarker/layout.ftl ================================================ <#ftl strip_text=true /> <#macro page title> ${title} <@metaTags /> <#nested /> <@footer /> <#--- Default meta tags --> <#macro metaTags> <#compress> <#macro footer>

    This page is using FreeMarker v${.version}

    ================================================ FILE: samples/Frege/CommandLineClock.fr ================================================ {-- This program displays the current time on stdandard output every other second. -} module examples.CommandLineClock where data Date = native java.util.Date where native new :: () -> IO (MutableIO Date) -- new Date() native toString :: Mutable s Date -> ST s String -- d.toString() --- 'IO' action to give us the current time as 'String' current :: IO String current = do d <- Date.new () d.toString {- "java.lang.Thread.sleep" takes a "long" and returns nothing, but may throw an InterruptedException. This is without doubt an IO action. public static void sleep(long millis) throws InterruptedException Encoded in Frege: - argument type long Long - result void () - does IO IO () - throws ... throws .... -} -- .... defined in frege.java.Lang -- native sleep java.lang.Thread.sleep :: Long -> IO () throws InterruptedException main args = forever do current >>= print print "\r" stdout.flush Thread.sleep 999 ================================================ FILE: samples/Frege/Concurrent.fr ================================================ module examples.Concurrent where import System.Random import Java.Net (URL) import Control.Concurrent as C main2 args = do m <- newEmptyMVar forkIO do m.put 'x' m.put 'y' m.put 'z' replicateM_ 3 do c <- m.take print "got: " println c example1 = do forkIO (replicateM_ 100000 (putChar 'a')) replicateM_ 100000 (putChar 'b') example2 = do s <- getLine case s.long of Right n -> forkIO (setReminder n) >> example2 Left _ -> println ("exiting ...") setReminder :: Long -> IO () setReminder n = do println ("Ok, I remind you in " ++ show n ++ " seconds") Thread.sleep (1000L*n) println (show n ++ " seconds is up!") table = "table" mainPhil _ = do [fork1,fork2,fork3,fork4,fork5] <- mapM MVar.new [1..5] forkIO (philosopher "Kant" fork5 fork1) forkIO (philosopher "Locke" fork1 fork2) forkIO (philosopher "Wittgenstein" fork2 fork3) forkIO (philosopher "Nozick" fork3 fork4) forkIO (philosopher "Mises" fork4 fork5) return () philosopher :: String -> MVar Int -> MVar Int -> IO () philosopher me left right = do g <- Random.newStdGen let phil g = do let (tT,g1) = Random.randomR (60L, 120L) g (eT, g2) = Random.randomR (80L, 160L) g1 thinkTime = 300L * tT eatTime = 300L * eT println(me ++ " is going to the dining room and takes his seat.") fl <- left.take println (me ++ " takes up left fork (" ++ show fl ++ ")") rFork <- right.poll case rFork of Just fr -> do println (me ++ " takes up right fork. (" ++ show fr ++ ")") println (me ++ " is going to eat for " ++ show eatTime ++ "ms") Thread.sleep eatTime println (me ++ " finished eating.") right.put fr println (me ++ " took down right fork.") left.put fl println (me ++ " took down left fork.") table.notifyAll println(me ++ " is going to think for " ++ show thinkTime ++ "ms.") Thread.sleep thinkTime phil g2 Nothing -> do println (me ++ " finds right fork is already in use.") left.put fl println (me ++ " took down left fork.") table.notifyAll println (me ++ " is going to the bar to await notifications from table.") table.wait println (me ++ " got notice that something changed at the table.") phil g2 inter :: InterruptedException -> IO () inter _ = return () phil g `catch` inter getURL xx = do url <- URL.new xx con <- url.openConnection con.connect is <- con.getInputStream typ <- con.getContentType -- stderr.println ("content-type is " ++ show typ) ir <- InputStreamReader.new is (fromMaybe "UTF-8" (charset typ)) `catch` unsupportedEncoding is br <- BufferedReader.new ir br.getLines where unsupportedEncoding :: InputStream -> UnsupportedEncodingException -> IO InputStreamReader unsupportedEncoding is x = do stderr.println x.catched InputStreamReader.new is "UTF-8" charset ctyp = do typ <- ctyp case typ of m~´charset=(\S+)´ -> m.group 1 _ -> Nothing type SomeException = Throwable main ["dining"] = mainPhil [] main _ = do m1 <- MVar.newEmpty m2 <- MVar.newEmpty m3 <- MVar.newEmpty forkIO do r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Haskell" m1.put r forkIO do r <- (catchAll . getURL) "htto://www.wikipedia.org/wiki/Java" m2.put r forkIO do r <- (catchAll . getURL) "http://www.wikipedia.org/wiki/Frege" m3.put r r1 <- m1.take r2 <- m2.take r3 <- m3.take println (result r1, result r2, result r3) -- case r3 of -- Right ss -> mapM_ putStrLn ss -- Left _ -> return () where result :: (SomeException|[String]) -> (String|Int) result (Left x) = Left x.getClass.getName result (Right y) = (Right . sum . map length) y -- mapM_ putStrLn r2 ================================================ FILE: samples/Frege/Sudoku.fr ================================================ package examples.Sudoku where import Data.TreeMap (Tree, keys) import Data.List as DL hiding (find, union) type Element = Int -- 1,2,3,4,5,6,7,8,9 type Zelle = [Element] -- set of candidates type Position = Int -- 0..80 type Feld = (Position, Zelle) type Brett = [Feld] --- data type for assumptions and conclusions data Assumption = !ISNOT Position Element | !IS Position Element derive Eq Assumption derive Ord Assumption instance Show Assumption where show (IS p e) = pname p ++ "=" ++ e.show show (ISNOT p e) = pname p ++ "/" ++ e.show showcs cs = joined " " (map Assumption.show cs) elements :: [Element] -- all possible elements elements = [1 .. 9] {- a b c d e f g h i 0 1 2 | 3 4 5 | 6 7 8 1 9 10 11 |12 13 14 |15 16 17 2 18 19 20 |21 22 23 |24 25 26 3 ---------|---------|-------- 27 28 29 |30 31 32 |33 34 35 4 36 37 38 |39 40 41 |42 43 44 5 45 46 47 |48 49 50 |51 52 53 6 ---------|---------|-------- 54 55 56 |57 58 59 |60 61 62 7 63 64 65 |66 67 68 |69 70 71 8 72 73 74 |75 76 77 |78 79 80 9 -} positions :: [Position] -- all possible positions positions = [0..80] rowstarts :: [Position] -- all positions where a row is starting rowstarts = [0,9,18,27,36,45,54,63,72] colstarts :: [Position] -- all positions where a column is starting colstarts = [0,1,2,3,4,5,6,7,8] boxstarts :: [Position] -- all positions where a box is starting boxstarts = [0,3,6,27,30,33,54,57,60] boxmuster :: [Position] -- pattern for a box, by adding upper left position results in real box boxmuster = [0,1,2,9,10,11,18,19,20] --- extract field for position getf :: Brett -> Position -> Feld getf (f:fs) p | fst f == p = f | otherwise = getf fs p getf [] p = (p,[]) --- extract cell for position getc :: Brett -> Position -> Zelle getc b p = snd (getf b p) --- compute the list of all positions that belong to the same row as a given position row :: Position -> [Position] row p = [z..(z+8)] where z = (p `quot` 9) * 9 --- compute the list of all positions that belong to the same col as a given position col :: Position -> [Position] col p = map (c+) rowstarts where c = p `mod` 9 --- compute the list of all positions that belong to the same box as a given position box :: Position -> [Position] box p = map (z+) boxmuster where ri = p `div` 27 * 27 -- 0, 27 or 54, depending on row ci = p `mod` 9 -- column index 0..8, 0,1,2 is left, 3,4,5 is middle, 6,7,8 is right cs = ci `div` 3 * 3 -- 0, 3 or 6 z = ri + cs --- check if candidate set has exactly one member, i.e. field has been solved single :: Zelle -> Bool single [_] = true single _ = false unsolved :: Zelle -> Bool unsolved [_] = false unsolved _ = true -- list of rows, cols, boxes allrows = map row rowstarts allcols = map col colstarts allboxs = map box boxstarts allrcb = zip (repeat "row") allrows ++ zip (repeat "col") allcols ++ zip (repeat "box") allboxs containers :: [(Position -> [Position], String)] containers = [(row, "row"), (col, "col"), (box, "box")] -- ----------------- PRINTING ------------------------------------ -- printable coordinate of field, upper left is a1, lower right is i9 pname p = packed [chr (ord 'a' + p `mod` 9), chr (ord '1' + p `div` 9)] -- print board printb b = mapM_ p1line allrows >> println "" where p1line row = do print (joined "" (map pfld line)) where line = map (getc b) row -- print field (brief) -- ? = no candidate -- 5 = field is 5 -- . = some candidates pfld [] = "?" pfld [x] = show x pfld zs = "0" -- print initial/final board result msg b = do println ("Result: " ++ msg) print ("Board: ") printb b return b res012 b = case concatMap (getc b) [0,1,2] of [a,b,c] -> a*100+b*10+c _ -> 9999999 -- -------------------------- BOARD ALTERATION ACTIONS --------------------------------- -- print a message about what is done to the board and return the new board turnoff1 :: Position -> Zelle -> Brett -> IO Brett turnoff1 i off b | single nc = do -- print (pname i) -- print ": set to " -- print (head nc) -- println " (naked single)" return newb | otherwise = return newb where cell = getc b i nc = filter (`notElem` off) cell newb = (i, nc) : [ f | f <- b, fst f != i ] turnoff :: Int -> Zelle -> String -> Brett -> IO Brett turnoff i off msg b = do -- print (pname i) -- print ": set to " -- print nc -- print " by clearing " -- print off -- print " " -- println msg return newb where cell = getc b i nc = filter (`notElem` off) cell newb = (i, nc) : [ f | f <- b, fst f != i ] turnoffh ps off msg b = foldM toh b ps where toh b p = turnoff p off msg b setto :: Position -> Element -> String -> Brett -> IO Brett setto i n cname b = do -- print (pname i) -- print ": set to " -- print n -- print " (hidden single in " -- print cname -- println ")" return newb where nf = [n] newb = (i, nf) : [ f | f <- b, fst f != i ] -- ----------------------------- SOLVING STRATEGIES --------------------------------------------- -- reduce candidate sets that contains numbers already in same row, col or box -- This finds (and logs) NAKED SINGLEs in passing. reduce b = [ turnoff1 p sss | (p,cell) <- b, -- for each field unsolved cell, -- with more than 1 candidate -- single fields in containers that are candidates of that field sss = [ s | (rcb, _) <- containers, [s] <- map (getc b) (rcb p), s `elem` cell], sss != [] ] -- collect field index, elements to remove from candidate set -- look for a number that appears in exactly 1 candidate set of a container -- this number can go in no other place (HIDDEN SINGLE) hiddenSingle b = [ setto i n cname | -- select index, number, containername (cname, rcb) <- allrcb, -- FOR rcb IN allrcb n <- elements, -- FOR n IN elements fs = filter (unsolved • snd) (map (getf b) rcb), occurs = filter ((n `elem`) • snd) fs, length occurs == 1, (i, _) <- occurs ] -- look for NAKED PAIRS, TRIPLES, QUADS nakedPair n b = [ turnoff p t ("(naked tuple in " ++ nm ++ ")") | -- SELECT pos, tuple, name -- n <- [2,3,4], // FOR n IN [2,3,4] (nm, rcb) <- allrcb, -- FOR rcb IN containers fs = map (getf b) rcb, -- let fs = fields for rcb positions u = (fold union [] . filter unsolved . map snd) fs, -- let u = union of non single candidates t <- n `outof` u, -- FOR t IN n-tuples hit = (filter ((`subset` t) . snd) . filter (unsolved . snd)) fs, length hit == n, (p, cell) <- fs, p `notElem` map fst hit, any (`elem` cell) t ] -- look for HIDDEN PAIRS, TRIPLES or QUADS hiddenPair n b = [ turnoff p off ("(hidden " ++ show t ++ " in " ++ nm ++ ")") | -- SELECT pos, tuple, name -- n <- [2,3,4], // FOR n IN [2,3,4] (nm, rcb) <- allrcb, -- FOR rcb IN containers fs = map (getf b) rcb, -- let fs = fields for rcb positions u = (fold union [] . filter ((>1) . length) . map snd) fs, -- let u = union of non single candidates t <- n `outof` u, -- FOR t IN n-tuples hit = (filter (any ( `elem` t) . snd) . filter (unsolved . snd)) fs, length hit == n, off = (fold union [] . map snd) hit `minus` t, off != [], (p, cell) <- hit, ! (cell `subset` t) ] a `subset` b = all (`elem` b) a a `union` b = uniq (sort (a ++ b)) a `minus` b = filter (`notElem` b) a a `common` b = filter (`elem` b) a n `outof` as | length as < n = [] | [] <- as = [] | 1 >= n = map (:[]) as | (a:bs) <- as = map (a:) ((n-1) `outof` bs) ++ (n `outof` bs) | otherwise = undefined -- cannot happen because either as is empty or not same f a b = b `elem` f a intersectionlist = [(allboxs, row, "box/row intersection"), (allboxs, col, "box/col intersection"), (allrows ++ allcols, box, "line/box intersection")] intersections b = [ turnoff pos [c] reason | -- SELECT position, candidate, reson (from, container, reason) <- intersectionlist, rcb <- from, fs = (filter (unsolved . snd) . map (getf b)) rcb, -- fs = fields in from with more than 1 candidate c <- (fold union [] • map snd) fs, -- FOR c IN union of candidates cpos = (map fst • filter ((c `elem`) • snd)) fs, -- cpos = positions where c occurs cpos != [], -- WHERE cpos is not empty all (same container (head cpos)) (tail cpos), -- WHERE all positions are in the intersection -- we can remove all occurences of c that are in container, but not in from (pos, cell) <- map (getf b) (container (head cpos)), c `elem` cell, pos `notElem` rcb ] -- look for an XY Wing -- - there exists a cell A with candidates X and Y -- - there exists a cell B with candidates X and Z that shares a container with A -- - there exists a cell C with candidates Y and Z that shares a container with A -- reasoning -- - if A is X, B will be Z -- - if A is Y, C will be Z -- - since A will indeed be X or Y -> B or C will be Z -- - thus, no cell that can see B and C can be Z xyWing board = [ turnoff p [z] ("xy wing " ++ pname b ++ " " ++ pname c ++ " because of " ++ pname a) | (a, [x,y]) <- board, -- there exists a cell a with candidates x and y rcba = map (getf board) (row a ++ col a ++ box a), -- rcba = all fields that share a container with a (b, [b1, b2]) <- rcba, b != a, b1 == x && b2 != y || b2 == x && b1 != y, -- there exists a cell B with candidates x and z z = if b1 == x then b2 else b1, (c, [c1, c2]) <- rcba, c != a, c!= b, c1 == y && c2 == z || c1 == z && c2 == y, -- there exists a cell C with candidates y and z ps = (uniq . sort) ((row b ++ col b ++ box b) `common` (row c ++ col c ++ box c)), -- remove z in ps (p, cs) <- map (getf board) ps, p != b, p != c, z `elem` cs ] -- look for a N-Fish (2: X-Wing, 3: Swordfish, 4: Jellyfish) -- When all candidates for a particular digit in N rows are located -- in only N columns, we can eliminate all candidates from those N columns -- which are not located on those N rows fish n board = fish "row" allrows row col ++ fish "col" allcols col row where fishname 2 = "X-Wing" fishname 3 = "Swordfish" fishname 4 = "Jellyfish" fishname _ = "unknown fish" fish nm allrows row col = [ turnoff p [x] (fishname n ++ " in " ++ nm ++ " " ++ show (map (pname . head) rset)) | rset <- n `outof` allrows, -- take n rows (or cols) x <- elements, -- look for certain number rflds = map (filter ((>1) . length . snd) . map (getf board)) rset, -- unsolved fields in the rowset colss = (map (map (head . col . fst) . filter ((x `elem`) . snd)) rflds), -- where x occurs in candidates all ((>1) . length) colss, -- x must appear in at least 2 cols cols = fold union [] colss, length cols == n, cstart <- cols, (p, cell) <- map (getf board) (col cstart), x `elem` cell, all (p `notElem`) rset] -- compute immediate consequences of an assumption of the form (p `IS` e) or (p `ISNOT` e) conseq board (IS p e) = uniq (sort ([ p `ISNOT` x | x <- getc board p, x != e ] ++ [ a `ISNOT` e | (a,cs) <- map (getf board) (row p ++ col p ++ box p), a != p, e `elem` cs ])) conseq board (ISNOT p e) = uniq (sort ([ p `IS` x | cs = getc board p, length cs == 2, x <- cs, x != e ] ++ [ a `IS` e | cp <- [row p, box p, col p], as = (filter ((e `elem`) . getc board) . filter (p!=)) cp, length as == 1, a = head as ])) -- check if two assumptions contradict each other contradicts (IS a x) (IS b y) = a==b && x!=y contradicts (IS a x) (ISNOT b y) = a==b && x==y contradicts (ISNOT a x) (IS b y) = a==b && x==y contradicts (ISNOT _ _) (ISNOT _ _) = false -- get the Position of an Assumption aPos (IS p _) = p aPos (ISNOT p _) = p -- get List of elements that must be turned off when assumption is true/false toClear board true (IS p x) = filter (x!=) (getc board p) toClear board false (IS p x) = [x] toClear board true (ISNOT p x) = [x] toClear board false (ISNOT p x) = filter (x!=) (getc board p) -- look for assumptions whose implications contradict themself chain board paths = [ solution a (head cs) (reverse cs) | (a, css) <- paths, cs <- take 1 [ cs | cs <- css, contradicts a (head cs) ] ] where solution a c cs = turnoff (aPos a) (toClear board false a) reason where reason = "Assumption " ++ show a ++ " implies " ++ show c ++ "\n\t" ++ showcs cs ++ "\n\t" ++ "Therefore, " ++ show a ++ " must be false." -- look for an assumption that yields to contradictory implications -- this assumption must be false chainContra board paths = [ solution a (reverse pro) (reverse contra) | (a, css) <- paths, -- FOR ALL assumptions "a" with list of conlusions "css" (pro, contra) <- take 1 [ (pro, contra) | pro <- (uniqBy (using head) . sortBy (comparing head)) css, -- FOR ALL conslusion chains "pro" c = head pro, -- LET "c" BE the final conclusion contra <- take 1 (filter ((contradicts c) . head) css) -- THE FIRST conclusion that contradicts c ] ] where solution a pro con = turnoff (aPos a) (toClear board false a) reason where reason = ("assumption " ++ show a ++ " leads to contradictory conclusions\n\t" ++ showcs pro ++ "\n\t" ++ showcs con) -- look for a common implication c of some assumptions ai, where at least 1 ai is true -- so that (a0 OR a1 OR a2 OR ...) IMPLIES c -- For all cells pi in same container that have x as candidate, we can construct (p0==x OR p1==x OR ... OR pi==x) -- For a cell p with candidates ci, we can construct (p==c0 OR p==c1) cellRegionChain board paths = [ solution b as (map head os) | as <- cellas ++ regionas, -- one of as must be true iss = filter ((`elem` as) . fst) paths, -- the implications for as (a, ass) <- take 1 iss, -- implications for first assumption fs <- (uniqBy (using head) . sortBy (comparing head)) ass, b = head fs, -- final conclusions of first assumption os = [fs] : map (take 1 . filter ((b==) . head) . snd) (tail iss), -- look for implications with same conclusion all ([]!=) os] where cellas = [ map (p `IS`) candidates | (p, candidates@(_:_:_)) <- board ] regionas = [ map (`IS` e) ps | region <- map (map (getf board)) (allrows ++ allcols ++ allboxs), e <- elements, ps = map fst (filter ((e `elem`) . snd) region), length ps > 1 ] solution b as oss = turnoff (aPos b) (toClear board true b) reason where reason = "all of the assumptions " ++ joined ", " (map show as) ++ " imply " ++ show b ++ "\n\t" ++ joined "\n\t" (map (showcs . reverse) oss) ++ "\n\t" ++ "One of them must be true, so " ++ show b ++ " must be true." {- Wir brauchen für einige Funktionen eine Datenstruktur wie [ (Assumption, [[Assumption]]) ] d.i. eine Liste von möglichen Annahmen samt aller Schlußketten. Idealerweise sollte die Schlußkette in umgekehrter Reihenfolge vorliegen, dann kann man einfach finden: - Annahmen, die zum Selbstwiderspruch führen. - alles, was aus einer bestimmten Annahme folgt (map (map head) [[a]]) -... -} --- Liste aller Annahmen für ein bestimmtes Brett assumptions :: Brett -> [Assumption] assumptions board = [ a | (p, cs) <- board, !(single cs), a <- map (ISNOT p) cs ++ map (IS p) cs ] consequences :: Brett -> [Assumption] -> [[Assumption]] consequences board as = map (conseq board) as acstree :: Brett -> Tree Assumption [Assumption] acstree board = Tree.fromList (zip as cs) where as = assumptions board cs = consequences board as -- bypass maybe on tree lookup find :: Tree Assumption [Assumption] -> Assumption -> [Assumption] find t a | Just cs <- t.lookup a = cs | otherwise = error ("no consequences for " ++ show a) -- for performance resons, we confine ourselves to implication chains of length 20 per assumption mkPaths :: Tree Assumption [Assumption] -> [ (Assumption, [[Assumption]]) ] mkPaths acst = map impl (keys acst) -- {[a1], [a2], [a3] ] where -- [Assumption] -> [(a, [chains, ordered by length] impl a = (a, impls [[a]]) impls ns = (take 1000 • concat • takeUntil null • iterate expandchain) ns -- expandchain :: [[Assumption]] -> [[Assumption]] expandchain css = [ (n:a:as) | (a : as) <- css, -- list of assumptions n <- find acst a, -- consequences of a n `notElem` as -- avoid loops ] -- uni (a:as) = a : uni (filter ((head a !=) • head) as) -- uni [] = empty -- empty = [] -- ------------------ SOLVE A SUDOKU -------------------------- -- Apply all available strategies until nothing changes anymore -- Strategy functions are supposed to return a list of -- functions, which, when applied to a board, give a changed board. -- When a strategy does not find anything to alter, -- it returns [], and the next strategy can be tried. solve b | all (single . snd) b = result "Solved" b | any (([]==) . snd) b = result "not solvable" b | res@(_:_) <- reduce b = apply b res >>=solve -- compute smallest candidate sets -- comment "candidate sets are up to date" = () | res@(_:_) <- hiddenSingle b = apply b res >>= solve -- find HIDDEN SINGLES -- comment "no more hidden singles" = () | res@(_:_) <- intersections b = apply b res >>= solve -- find locked candidates -- comment "no more intersections" = () | res@(_:_) <- nakedPair 2 b = apply b res >>= solve -- find NAKED PAIRS, TRIPLES or QUADRUPELS -- comment "no more naked pairs" = () | res@(_:_) <- hiddenPair 2 b = apply b res >>= solve -- find HIDDEN PAIRS, TRIPLES or QUADRUPELS -- comment "no more hidden pairs" = () -- res@(_:_) <- nakedPair 3 b = apply b res >>= solve // find NAKED PAIRS, TRIPLES or QUADRUPELS -- | comment "no more naked triples" = () -- res@(_:_) <- hiddenPair 3 b = apply b res >>= solve // find HIDDEN PAIRS, TRIPLES or QUADRUPELS -- | comment "no more hidden triples" = () -- res@(_:_) <- nakedPair 4 b = apply b res >>=solve // find NAKED PAIRS, TRIPLES or QUADRUPELS -- | comment "no more naked quadruples" = () -- res@(_:_) <- hiddenPair 4 b = apply b res >>=solve // find HIDDEN PAIRS, TRIPLES or QUADRUPELS -- | comment "no more hidden quadruples" = () | res@(_:_) <- xyWing b = apply b res >>=solve -- find XY WINGS -- comment "no more xy wings" = () | res@(_:_) <- fish 2 b = apply b res >>=solve -- find 2-FISH -- comment "no more x-wings" = () -- res@(_:_) <- fish 3 b = apply b res >>=solve // find 3-FISH -- | comment "no more swordfish" = () -- res@(_:_) <- fish 4 b = apply b res >>=solve // find 4-FISH -- | comment "no more jellyfish" = () -- | comment pcomment = () | res@(_:_) <- chain b paths = apply b (take 9 res) >>= solve -- find forcing chains | res@(_:_) <- cellRegionChain b paths = apply b (take 9 res) >>= solve -- find common conclusion for true assumption | res@(_:_) <- chainContra b paths = apply b (take 9 res) >>= solve -- find assumptions that allow to infer both a and !a -- comment "consistent conclusions only" = () | otherwise = result "ambiguous" b where apply brd fs = foldM (\b\f -> f b) brd fs paths = mkPaths (acstree b) -- pcomment = show (length paths) ++ " assumptions with " ++ show (fold (+) 0 (map (length <~ snd) paths)) -- ++ " implication chains" -- comment com = do stderr << com << "\n" for false -- log com = do stderr << com << "\n" for true --- turn a string into a row mkrow :: String -> [Zelle] mkrow s = mkrow1 xs where xs = s ++ "---------" -- make sure at least 9 elements mkrow1 xs = (take 9 • filter ([]!=) • map f • unpacked) xs f x | x >= '1' && x <= '9' = [ord x - ord '0'] | x == ' ' = [] -- ignored | otherwise = elements main ["-h"] = main [] main ["-help"] = main [] main [] = do mapM_ stderr.println [ "usage: java Sudoku file ...", " java Sudoku position", "where position is a 81 char string consisting of digits", "One can get such a string by going to", "http://www.sudokuoftheday.com/pages/s-o-t-d.php", "Right click on the puzzle and open it in new tab", "Copy the 81 digits from the URL in the address field of your browser.", "", "There is also a file with hard sudokus in examples/top95.txt\n"] return () main [s@#^[0-9\W]{81}$#] = solve board >> return () where board = zip positions felder felder = decode s main files = forM_ files sudoku where sudoku file = do br <- openReader file lines <- BufferedReader.getLines br bs <- process lines ss <- mapM (\b -> print "Puzzle: " >> printb b >> solve b) bs println ("Euler: " ++ show (sum (map res012 ss))) return () -- "--3-" => [1..9, 1..9, [3], 1..9] decode s = map candi (unpacked s) where candi c | c >= '1' && c <= '9' = [(ord c - ord '0')] | otherwise = elements process [] = return [] process (s:ss) | length s == 81 = consider b1 | length s == 9, length acht == 8, all ((9==) • length) acht = consider b2 | otherwise = do stderr.println ("skipped line: " ++ s) process ss where acht = take 8 ss neun = fold (++) "" (s:acht) b1 = zip positions (decode s) b2 = zip positions (decode neun) consider b = do -- print "Puzzle: " -- printb b bs <- process ss return (b:bs) ================================================ FILE: samples/Frege/SwingExamples.fr ================================================ package examples.SwingExamples where import Java.Awt (ActionListener) import Java.Swing main _ = do rs <- mapM Runnable.new [helloWorldGUI, buttonDemoGUI, celsiusConverterGUI] mapM_ invokeLater rs println "Hit enter to end ...." s <- getLine return () celsiusConverterGUI = do tempTextField <- JTextField.new() celsiusLabel <- JLabel.new () convertButton <- JButton.new () fahrenheitLabel <- JLabel.new () frame <- JFrame.new () frame.setDefaultCloseOperation JFrame.dispose_on_close frame.setTitle "Celsius Converter" celsiusLabel.setText "Celsius" convertButton.setText "Convert" let convertButtonActionPerformed _ = do celsius <- tempTextField.getText case celsius.double of Left _ -> fahrenheitLabel.setText ("not a valid number: " ++ celsius) Right c -> fahrenheitLabel.setText (show (c*1.8 + 32.0).long ++ " Fahrenheit") return () ActionListener.new convertButtonActionPerformed >>= convertButton.addActionListener fahrenheitLabel.setText "Fahrenheit" contentPane <- frame.getContentPane layout <- GroupLayout.new contentPane contentPane.setLayout layout -- TODO continue -- http://docs.oracle.com/javase/tutorial/displayCode.html?code=http://docs.oracle.com/javase/tutorial/uiswing/examples/learn/CelsiusConverterProject/src/learn/CelsiusConverterGUI.java frame.pack frame.setVisible true helloWorldGUI = do frame <- JFrame.new "Hello World Frege" frame.setDefaultCloseOperation(JFrame.dispose_on_close) label <- JLabel.new "Hello World!" cp <- frame.getContentPane cp.add label frame.pack frame.setVisible true buttonDemoGUI = do frame <- JFrame.new "Button Demo" frame.setDefaultCloseOperation(JFrame.dispose_on_close) newContentPane <- JPanel.new () b1::JButton <- JButton.new "Disable middle button" b1.setVerticalTextPosition SwingConstants.center b1.setHorizontalTextPosition SwingConstants.leading b2::JButton <- JButton.new "Middle button" b2.setVerticalTextPosition SwingConstants.center b2.setHorizontalTextPosition SwingConstants.leading b3::JButton <- JButton.new "Enable middle button" b3.setVerticalTextPosition SwingConstants.center b3.setHorizontalTextPosition SwingConstants.leading b3.setEnabled false let action1 _ = do b2.setEnabled false b1.setEnabled false b3.setEnabled true action3 _ = do b2.setEnabled true b1.setEnabled true b3.setEnabled false ActionListener.new action1 >>= b1.addActionListener ActionListener.new action3 >>= b3.addActionListener newContentPane.add b1 newContentPane.add b2 newContentPane.add b3 newContentPane.setOpaque true frame.setContentPane newContentPane frame.pack frame.setVisible true ================================================ FILE: samples/Fstar/FStar.DependentMap.fsti ================================================ (* Copyright 2008-2018 Microsoft Research Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. *) module FStar.DependentMap /// This module provides an abstract type of maps whose co-domain /// depends on the value of each key. i.e., it is an encapsulation /// of [x:key -> value x], where [key] supports decidable equality. /// /// The main constructors of the type are: /// * [create]: To create the whole map from a function /// * [upd]: To update a map at a point /// * [restrict]: To restrict the domain of a map /// * [concat]: To concatenate maps by taking the union of their key spaces /// * [rename]: To rename the keys of a map /// * [map]: To map a function over the values of a map /// /// The main eliminators are: /// * [sel]: To query the map for its value at a point /// /// The interface is specified in a style that describes the action of /// each eliminator over each of the constructors /// /// The map also supports an extensional equality principle. (** Abstract type of dependent maps, with universe polymorphic values and keys in universe 0 with decidable equality *) val t (key: eqtype) (value: (key -> Type u#v)) : Type u#v (** Creating a new map from a function *) val create (#key: eqtype) (#value: (key -> Tot Type)) (f: (k: key -> Tot (value k))) : Tot (t key value) (** Querying the map for its value at a given key *) val sel (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) : Tot (value k) (** Relating [create] to [sel] *) val sel_create (#key: eqtype) (#value: (key -> Tot Type)) (f: (k: key -> Tot (value k))) (k: key) : Lemma (ensures (sel #key #value (create f) k == f k)) [SMTPat (sel #key #value (create f) k)] (** Updating a map at a point *) val upd (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) (v: value k) : Tot (t key value) (** The action of selecting a key [k] a map with an updated value [v] at [k] This is one of the classic McCarthy select/update axioms in the setting of a dependent map. *) val sel_upd_same (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) (v: value k) : Lemma (ensures (sel (upd m k v) k == v)) [SMTPat (sel (upd m k v) k)] (** The action of selecting a key [k] a map with an updated value [v] at a different key [k'] This is one of the classic McCarthy select/update axioms in the setting of a dependent map. *) val sel_upd_other (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) (k: key) (v: value k) (k': key) : Lemma (requires (k' <> k)) (ensures (sel (upd m k v) k' == sel m k')) [SMTPat (sel (upd m k v) k')] (** Extensional propositional equality on maps *) val equal (#key: eqtype) (#value: (key -> Tot Type)) (m1 m2: t key value) : prop (** Introducing extensional equality by lifting equality on the map, pointwise *) val equal_intro (#key: eqtype) (#value: (key -> Tot Type)) (m1 m2: t key value) : Lemma (requires (forall k. sel m1 k == sel m2 k)) (ensures (equal m1 m2)) [SMTPat (equal m1 m2)] (** [equal] is reflexive *) val equal_refl (#key: eqtype) (#value: (key -> Tot Type)) (m: t key value) : Lemma (ensures (equal m m)) [SMTPat (equal m m)] (** [equal] can be eliminated into standard propositional equality (==), also proving that it is an equivalence relation *) val equal_elim (#key: eqtype) (#value: (key -> Tot Type)) (m1 m2: t key value) : Lemma (requires (equal m1 m2)) (ensures (m1 == m2)) [SMTPat (equal m1 m2)] (**** Restricting the domain of a map *) (** Restricts the domain of the map to those keys satisfying [p] *) val restrict (#key: eqtype) (#value: (key -> Tot Type)) (p: (key -> Tot Type0)) (m: t key value) : Tot (t (k: key{p k}) value) (** The action of [sel] on [restrict] : the contents of the map isn't changed *) val sel_restrict (#key: eqtype) (#value: (key -> Tot Type)) (p: (key -> Tot Type0)) (m: t key value) (k: key{p k}) : Lemma (ensures (sel (restrict p m) k == sel m k)) (**** Concatenating maps *) /// Concatenating [t k1 v1] and [t k2 v2] produces a map /// [t (either k1 k2) (concat_value v1 v2)] /// /// I.e., the key space varies contravariantly, to take the union of /// the component key spaces. The co-domain is the dependent product /// of the co-domains of the original map (** The key space of a concatenated map is the product of the key spaces *) let concat_value (#key1: eqtype) (value1: (key1 -> Tot Type)) (#key2: eqtype) (value2: (key2 -> Tot Type)) (k: either key1 key2) : Tot Type = match k with | Inl k1 -> value1 k1 | Inr k2 -> value2 k2 (** Concatenating maps *) val concat (#key1: eqtype) (#value1: (key1 -> Tot (Type u#v))) (#key2: eqtype) (#value2: (key2 -> Tot (Type u#v))) (m1: t key1 value1) (m2: t key2 value2) : Tot (t (either key1 key2) (concat_value value1 value2)) (** The action of [sel] on [concat], for a key on the left picks a value from the left map *) val sel_concat_l (#key1: eqtype) (#value1: (key1 -> Tot (Type u#v))) (#key2: eqtype) (#value2: (key2 -> Tot (Type u#v))) (m1: t key1 value1) (m2: t key2 value2) (k1: key1) : Lemma (ensures (sel (concat m1 m2) (Inl k1) == sel m1 k1)) (** The action of [sel] on [concat], for a key on the right picks a value from the right map *) val sel_concat_r (#key1: eqtype) (#value1: (key1 -> Tot Type)) (#key2: eqtype) (#value2: (key2 -> Tot Type)) (m1: t key1 value1) (m2: t key2 value2) (k2: key2) : Lemma (ensures (sel (concat m1 m2) (Inr k2) == sel m2 k2)) (**** Renamings *) /// Given a map from [key2] to [key1], we can revise a map from [t /// key1 v] to a map [t key2 v], by composing the maps. (** The type of the co-domain of the renamed map also involves transformation along the renaming function *) let rename_value (#key1: eqtype) (value1: (key1 -> Tot Type)) (#key2: eqtype) (ren: (key2 -> Tot key1)) (k: key2) : Tot Type = value1 (ren k) (** Renaming the keys of a map *) val rename (#key1: eqtype) (#value1: (key1 -> Tot Type)) (m: t key1 value1) (#key2: eqtype) (ren: (key2 -> Tot key1)) : Tot (t key2 (rename_value value1 ren)) (** The action of [sel] on [rename] *) val sel_rename (#key1: eqtype) (#value1: (key1 -> Tot Type)) (m: t key1 value1) (#key2: eqtype) (ren: (key2 -> Tot key1)) (k2: key2) : Lemma (ensures (sel (rename m ren) k2 == sel m (ren k2))) (**** Mapping a function over a dependent map *) (** [map f m] applies f to each value in [m]'s co-domain *) val map (#key: eqtype) (#value1 #value2: (key -> Tot Type)) (f: (k: key -> value1 k -> Tot (value2 k))) (m: t key value1) : Tot (t key value2) (** The action of [sel] on [map] *) val sel_map (#key: eqtype) (#value1 #value2: (key -> Tot Type)) (f: (k: key -> value1 k -> Tot (value2 k))) (m: t key value1) (k: key) : Lemma (ensures (sel (map f m) k == f k (sel m k))) [SMTPat (sel #key #value2 (map #key #value1 #value2 f m) k)] (** [map] explained in terms of its action on [upd] *) val map_upd (#key: eqtype) (#value1 #value2: (key -> Tot Type)) (f: (k: key -> value1 k -> Tot (value2 k))) (m: t key value1) (k: key) (v: value1 k) : Lemma (ensures (map f (upd m k v) == upd (map f m) k (f k v))) [ //AR: wanted to write an SMTPatOr, but gives some error SMTPat (map #key #value1 #value2 f (upd #key #value1 m k v)) ] /// We seem to miss lemmas that relate map to the other constructors, /// including create, restrict etc. ================================================ FILE: samples/Fstar/Hacl.HKDF.fst ================================================ module Hacl.HKDF module ST = FStar.HyperStack.ST open FStar.HyperStack.All open FStar.Mul open FStar.Ghost open FStar.HyperStack open FStar.HyperStack.ST open FStar.Buffer open FStar.UInt32 (* Definition of aliases for modules *) module U8 = FStar.UInt8 module U32 = FStar.UInt32 module U64 = FStar.UInt64 module S8 = Hacl.UInt8 module S32 = Hacl.UInt32 module S64 = Hacl.UInt64 module Buffer = FStar.Buffer module Cast = Hacl.Cast module Hash = Hacl.Hash.SHA2.L256 module HMAC = Hacl.HMAC (* Definition of base types *) let uint8_t = FStar.UInt8.t let uint32_t = FStar.UInt32.t let uint64_t = FStar.UInt64.t let suint8_t = Hacl.UInt8.t let suint32_t = Hacl.UInt32.t let suint64_t = Hacl.UInt64.t let suint32_p = Buffer.buffer suint32_t let suint8_p = Buffer.buffer suint8_t (* Definitions of aliases for functions *) let u8_to_s8 = Cast.uint8_to_sint8 let u32_to_s8 = Cast.uint32_to_sint8 let u32_to_s32 = Cast.uint32_to_sint32 let u32_to_s64 = Cast.uint32_to_sint64 let s32_to_s8 = Cast.sint32_to_sint8 let s32_to_s64 = Cast.sint32_to_sint64 let u64_to_s64 = Cast.uint64_to_sint64 // // HKDF // (* Define parameters *) inline_for_extraction let hashsize = HMAC.hashsize inline_for_extraction let hashsize_32 = HMAC.hashsize_32 inline_for_extraction let blocksize = HMAC.blocksize inline_for_extraction let blocksize_32 = HMAC.blocksize_32 (* Define HKDF Extraction function *) val hkdf_extract : prk :suint8_p{length prk = v hashsize} -> salt :suint8_p -> saltlen :uint32_t{v saltlen = length salt} -> ikm :suint8_p -> ikmlen :uint32_t{v ikmlen = length ikm} -> Stack unit (requires (fun h0 -> live h0 prk /\ live h0 salt /\ live h0 ikm)) (ensures (fun h0 r h1 -> live h1 prk /\ modifies_1 prk h0 h1)) let hkdf_extract prk salt saltlen ikm ikmlen = HMAC.hmac prk salt saltlen ikm ikmlen [@"c_inline"] private val hkdf_expand_inner: state :suint8_p -> prk :suint8_p {v hashsize <= length prk} -> prklen :uint32_t {v prklen = length prk} -> info :suint8_p -> infolen :uint32_t {v infolen = length info} -> n :uint32_t {v n <= pow2 8}-> i :uint32_t {v i <= v n} -> Stack unit (requires (fun h0 -> live h0 state /\ live h0 prk /\ live h0 info)) (ensures (fun h0 r h1 -> live h1 state /\ modifies_1 state h0 h1)) [@"c_inline"] let rec hkdf_expand_inner state prk prklen info infolen n i = (* Push a new memory frame *) (**) push_frame(); (* Recompute the sizes and position of the intermediary objects *) (* Note: here we favour readability over efficiency *) let size_T = U32.mul_mod n hashsize in let size_Ti = hashsize in let size_Til = hashsize +^ infolen +^ 1ul in let pos_Ti = 0ul in let pos_Til = size_Ti in let pos_T = pos_Til +^ size_Til in (* Retreive the memory for local computations. state = Ti | Til | T *) let ti = Buffer.sub state pos_Ti size_Ti in let til = Buffer.sub state pos_Til size_Til in let t = Buffer.sub state pos_T size_T in if (i =^ 1ul) then begin (* Concatenate T(i-1) | Info | i *) Buffer.blit info 0ul til 0ul infolen; Buffer.upd til (size_Til -^ 1ul) (u32_to_s8 i); (* Compute the mac of to get block Ti *) HMAC.hmac ti prk prklen til size_Til; (* Store the resulting block in T *) Buffer.blit ti 0ul t 0ul hashsize; (* Recursive call *) hkdf_expand_inner state prk prklen info infolen n (i +^ 1ul) end else if (i <=^ n) then begin (* Concatenate T(i-1) | Info | i *) Buffer.blit ti 0ul til 0ul hashsize; Buffer.blit info 0ul til hashsize infolen; Buffer.upd til (size_Til -^ 1ul) (u32_to_s8 i); (* Compute the mac of to get block Ti *) HMAC.hmac ti prk prklen til size_Til; (* Store the resulting block in T *) let pos = U32.mul_mod (i -^ 1ul) hashsize in Buffer.blit ti 0ul t pos hashsize; (* Recursive call *) hkdf_expand_inner state prk prklen info infolen n (i +^ 1ul) end else (); (* Pop the memory frame *) (**) pop_frame() (* Define HKDF Expand function *) val hkdf_expand : okm :suint8_p -> prk :suint8_p {v hashsize <= length prk} -> prklen :uint32_t {v prklen <= length prk} -> info :suint8_p -> infolen :uint32_t {v infolen <= length info} -> len :uint32_t {v len <= length okm /\ v len <= (255 * U32.v hashsize) /\ (U32.v len / U32.v hashsize + 1) <= length okm} -> Stack unit (requires (fun h0 -> live h0 okm /\ live h0 prk /\ live h0 info)) (ensures (fun h0 r h1 -> live h1 okm /\ modifies_1 okm h0 h1)) let hkdf_expand okm prk prklen info infolen len = (* Push a new memory frame *) (**) push_frame (); (* Compute the number of blocks necessary to compute the output *) let n = U32.(div len hashsize) +^ 1ul in (* Describe the shape of memory used by the inner recursive function *) let size_T = U32.mul_mod n hashsize in let size_Ti = hashsize in let size_Til = hashsize +^ infolen +^ 1ul in let pos_Ti = 0ul in let pos_Til = size_Ti in let pos_T = pos_Til +^ size_Til in (* Allocate memory for inner expension: state = Ti | Til | T *) let state = Buffer.create (u8_to_s8 0uy) (size_Ti +^ size_Til +^ size_T) in (* Call the inner expension function *) hkdf_expand_inner state prk prklen info infolen n 0ul; (* Extract T from the state *) let _T = Buffer.sub state pos_T size_T in (* Redundant copy the desired part of T *) Buffer.blit _T 0ul okm 0ul len; (* Pop the memory frame *) (**) pop_frame() ================================================ FILE: samples/Fstar/Hacl.Spec.Bignum.Fmul.fst ================================================ module Hacl.Spec.Bignum.Fmul module ST = FStar.HyperStack.ST open FStar.HyperStack.All open FStar.Mul open Hacl.Bignum.Constants open Hacl.Bignum.Parameters open Hacl.Spec.Bignum.Bigint open Hacl.Bignum.Limb open Hacl.Spec.Bignum.Modulo open Hacl.Spec.Bignum.Fproduct module U32 = FStar.UInt32 #set-options "--initial_fuel 0 --max_fuel 0 --z3rlimit 5" let shift_reduce_pre (s:seqelem) : GTot Type0 = reduce_pre (shift_spec s) val shift_reduce_spec: s:seqelem{shift_reduce_pre s} -> Tot (s':seqelem) let shift_reduce_spec s = reduce_spec (shift_spec s) #set-options "--initial_fuel 0 --max_fuel 0 --z3rlimit 100" val lemma_shift_spec_eq: s:seqelem -> Lemma (Seq.append (Seq.slice (shift_spec s) 1 (len)) (Seq.slice (shift_spec s) 0 1) == s) let lemma_shift_spec_eq s = Seq.lemma_eq_intro (Seq.append (Seq.slice (shift_spec s) 1 (len)) (Seq.slice (shift_spec s) 0 1)) (s) val lemma_shift_reduce_spec: s:seqelem{shift_reduce_pre s} -> Lemma (seval (shift_reduce_spec s) % prime = (pow2 limb_size * seval s) % prime) let lemma_shift_reduce_spec s = lemma_shift_spec_eq s; lemma_reduce_spec (shift_spec s) #set-options "--initial_fuel 1 --max_fuel 1 --z3rlimit 50" let rec mul_shift_reduce_pre_ (output:seqelem_wide) (input:seqelem) (input2:seqelem) (ctr:nat{ctr <= len}) : GTot Type0 (decreases ctr) = (if ctr > 0 then ( sum_scalar_multiplication_pre_ output input (Seq.index input2 (len-ctr)) len /\ (let output' = sum_scalar_multiplication_spec output input (Seq.index input2 (len-ctr)) in (ctr > 1 ==> shift_reduce_pre input) /\ (let input' = if ctr > 1 then shift_reduce_spec input else input in mul_shift_reduce_pre_ output' input' input2 (ctr-1)))) else true) #reset-options "--max_fuel 0 --max_fuel 2 --z3rlimit 50" val lemma_mul_shift_reduce_pre_def: output:seqelem_wide -> input:seqelem -> input2:seqelem -> ctr:nat{ctr <= len /\ ctr > 0} -> Lemma ( mul_shift_reduce_pre_ output input input2 ctr == ( sum_scalar_multiplication_pre_ output input (Seq.index input2 (len-ctr)) len /\ (let output' = sum_scalar_multiplication_spec output input (Seq.index input2 (len-ctr)) in (ctr > 1 ==> shift_reduce_pre input) /\ (let input' = if ctr > 1 then shift_reduce_spec input else input in mul_shift_reduce_pre_ output' input' input2 (ctr-1))))) let lemma_mul_shift_reduce_pre_def output input input2 ctr = () #set-options "--initial_fuel 1 --max_fuel 1 --z3rlimit 50" let mul_shift_reduce_pre (output:seqelem_wide) (input_init:seqelem) (input:seqelem) (input2:seqelem) (ctr:nat{ctr <= len}) : GTot Type0 (decreases ctr) = seval_wide output % prime = (seval input_init * seval_ input2 (len - ctr)) % prime /\ (ctr > 0 ==> seval input % prime = (pow2 ((len - ctr) * limb_size) * seval input_init) % prime) /\ mul_shift_reduce_pre_ output input input2 ctr #set-options "--z3rlimit 20 --max_ifuel 1 --max_fuel 0" val lemma_mod_mul_distr: a:nat -> b:nat -> p:pos -> Lemma ((a+b)%p = ((a%p) + b) % p) let lemma_mod_mul_distr a b p = Math.Lemmas.lemma_mod_plus_distr_l a b p val lemma_mod_mul_comm: a:nat -> b:nat -> p:pos -> Lemma ((a*b)%p = ((a%p)*b)%p) let lemma_mod_mul_comm a b p = Math.Lemmas.lemma_mod_mul_distr_l a b p #reset-options "--z3rlimit 1000 --initial_fuel 0 --max_fuel 0" val lemma_mul_shift_reduce_spec_1_1: o':seqelem_wide -> o:seqelem_wide -> i0:seqelem -> i:seqelem ->i2:seqelem -> ij:nat -> ctr:pos{ctr <= len /\ ij = v (Seq.index i2 (len-ctr))} -> Lemma (requires ( seval_wide o' = seval_wide o + (seval i * ij) /\ seval i % prime = (pow2 ((len-ctr)*limb_size) * seval i0) % prime /\ seval_wide o % prime = (seval i0 * seval_ i2 (len-ctr)) % prime)) (ensures (seval_wide o' % prime = (seval i0 * seval_ i2 (len-ctr+1)) % prime)) let lemma_mul_shift_reduce_spec_1_1 o' o i0 i i2 ij ctr = let so' = seval_wide o' % prime in Math.Lemmas.lemma_mod_plus_distr_l (seval_wide o) (seval i * ij) prime; cut (so' = (((seval i0 * seval_ i2 (len-ctr)) % prime) + (seval i * ij)) % prime); Math.Lemmas.lemma_mod_plus_distr_l ((seval i0 * seval_ i2 (len-ctr))) (seval i * ij) prime; cut (so' = ((seval i0 * seval_ i2 (len-ctr)) + seval i * ij) % prime); Math.Lemmas.lemma_mod_plus_distr_l (seval i * ij) ((seval i0 * seval_ i2 (len-ctr))) prime; cut (so' = (((seval i * ij) % prime) + (seval i0 * seval_ i2 (len-ctr))) % prime); Math.Lemmas.lemma_mod_mul_distr_l (seval i) ij prime; cut (so' = ((((seval i % prime) * ij) % prime) + (seval i0 * seval_ i2 (len-ctr))) % prime); Math.Lemmas.lemma_mod_mul_distr_l (pow2 ((len-ctr)*limb_size) * seval i0) ij prime; cut (so' = ((((pow2 ((len-ctr)*limb_size) * seval i0) * ij) % prime) + (seval i0 * seval_ i2 (len-ctr))) % prime); Math.Lemmas.lemma_mod_plus_distr_l ((pow2 ((len-ctr)*limb_size) * seval i0) * ij) (seval i0 * seval_ i2 (len-ctr)) prime; cut (so' = (seval i0 * pow2 ((len-ctr)*limb_size) * ij + seval i0 * seval_ i2 (len-ctr)) % prime); Math.Lemmas.distributivity_add_right (seval i0) (pow2 ((len-ctr)*limb_size) * ij) (seval_ i2 (len-ctr)); cut (so' = (seval i0 * (pow2 ((len-ctr)*limb_size) * ij + seval_ i2 (len-ctr))) % prime); lemma_seval_def i2 (len-ctr+1) val lemma_mul_shift_reduce_spec_1_2: o':seqelem_wide -> o:seqelem_wide -> i0:seqelem -> i:seqelem -> i':seqelem -> i2:seqelem -> ij:nat -> ctr:pos{ctr <= len /\ ij = v (Seq.index i2 (len-ctr))} -> Lemma (requires ( seval_wide o' = seval_wide o + (seval i * ij) /\ seval i % prime = (pow2 ((len-ctr)*limb_size) * seval i0) % prime /\ seval i' % prime = (pow2 limb_size * seval i) % prime /\ seval_wide o % prime = (seval i0 * seval_ i2 (len-ctr)) % prime)) (ensures (seval i' % prime = (pow2 ((len-ctr+1) * limb_size) * seval i0) % prime)) let lemma_mul_shift_reduce_spec_1_2 o' o i0 i i' i2 ij ctr = let si' = seval i' % prime in Math.Lemmas.lemma_mod_mul_distr_l (seval i) (pow2 limb_size) prime; Math.Lemmas.lemma_mod_mul_distr_l (pow2 ((len-ctr)*limb_size) * seval i0) (pow2 limb_size) prime; Math.Lemmas.pow2_plus ((len-ctr) * limb_size) limb_size val lemma_mul_shift_reduce_spec_1: o':seqelem_wide -> o:seqelem_wide -> i0:seqelem -> i:seqelem -> i':seqelem -> i2:seqelem -> ij:nat -> ctr:pos{ctr <= len /\ ij = v (Seq.index i2 (len-ctr))} -> Lemma (requires ( seval_wide o' = seval_wide o + (seval i * ij) /\ seval i % prime = (pow2 ((len-ctr)*limb_size) * seval i0) % prime /\ seval i' % prime = (pow2 limb_size * seval i) % prime /\ seval_wide o % prime = (seval i0 * seval_ i2 (len-ctr)) % prime)) (ensures (seval_wide o' % prime = (seval i0 * seval_ i2 (len-ctr+1)) % prime /\ seval i' % prime = (pow2 ((len-ctr+1) * limb_size) * seval i0) % prime)) let lemma_mul_shift_reduce_spec_1 o' o i0 i i' i2 ij ctr = lemma_mul_shift_reduce_spec_1_1 o' o i0 i i2 ij ctr; lemma_mul_shift_reduce_spec_1_2 o' o i0 i i' i2 ij ctr val lemma_mul_shift_reduce_spec_2: o':seqelem_wide -> o:seqelem_wide -> i0:seqelem -> i:seqelem -> i':seqelem -> i2:seqelem -> ij:nat{ij = v (Seq.index i2 (len-1))} -> Lemma (requires ( seval_wide o' = seval_wide o + (seval i * ij) /\ seval i % prime = (pow2 ((len-1)*limb_size) * seval i0) % prime /\ seval_wide o % prime = (seval i0 * seval_ i2 (len-1)) % prime)) (ensures (seval_wide o' % prime = (seval i0 * seval i2) % prime)) let lemma_mul_shift_reduce_spec_2 o' o i0 i i' i2 ij = let ctr = 1 in lemma_mul_shift_reduce_spec_1_1 o' o i0 i i2 ij ctr val mul_shift_reduce_spec_: output:seqelem_wide -> input_init:seqelem -> input:seqelem -> input2:seqelem{mul_shift_reduce_pre output input_init input input2 len} -> ctr:nat{ctr <= len} -> Tot (t:tuple2 seqelem_wide seqelem{ let output', input' = t in mul_shift_reduce_pre output' input_init input' input2 ctr}) (decreases (len - ctr)) #reset-options "--z3rlimit 500 --initial_fuel 1 --max_fuel 1" let rec mul_shift_reduce_spec_ output input_init input input2 ctr = if ctr = len then output, input else ( let output, input = mul_shift_reduce_spec_ output input_init input input2 (ctr+1) in let i = ctr in let j = len - i - 1 in let input2j = Seq.index input2 j in let output' = sum_scalar_multiplication_spec output input input2j in lemma_sum_scalar_multiplication_ output input input2j len; cut (seval_wide output' = seval_wide output + (seval input * v input2j)); let input' = if ctr > 0 then shift_reduce_spec input else input in if ctr = 0 then ( lemma_mul_shift_reduce_spec_2 output' output input_init input input' input2 (v input2j); () ) else ( lemma_shift_reduce_spec input; lemma_mul_shift_reduce_spec_1 output' output input_init input input' input2 (v input2j) (ctr+1); () ); (* mul_shift_reduce_spec_ output' input_init input' input2 i *) output', input' ) val lemma_mul_shift_reduce_spec_def: output:seqelem_wide -> input_init:seqelem -> input:seqelem -> input2:seqelem{mul_shift_reduce_pre output input_init input input2 len} -> ctr:nat{ctr < len} -> Lemma ( mul_shift_reduce_spec_ output input_init input input2 ctr == (let output, input = mul_shift_reduce_spec_ output input_init input input2 (ctr+1) in let i = ctr in let j = len - i - 1 in let input2j = Seq.index input2 j in let output' = Hacl.Spec.Bignum.Fproduct.sum_scalar_multiplication_spec output input input2j in Hacl.Spec.Bignum.Fproduct.lemma_sum_scalar_multiplication_ output input input2j len; assert (seval_wide output' = seval_wide output + (seval input * v input2j)); let input' = if ctr > 0 then shift_reduce_spec input else input in (output', input')) ) let lemma_mul_shift_reduce_spec_def output input_init input input2 ctr = () val lemma_mul_shift_reduce_spec_def_0: output:seqelem_wide -> input_init:seqelem -> input:seqelem -> input2:seqelem{mul_shift_reduce_pre output input_init input input2 len} -> Lemma ( mul_shift_reduce_spec_ output input_init input input2 len == (output, input)) let lemma_mul_shift_reduce_spec_def_0 output input_init input input2 = () val lemma_seval_wide_null: a:seqelem_wide -> ctr:nat{ctr <= len} -> Lemma (requires (a == Seq.create len wide_zero)) (ensures (seval_wide_ a ctr = 0)) let rec lemma_seval_wide_null a ctr = if ctr = 0 then () else lemma_seval_wide_null a (ctr-1) #reset-options "--z3rlimit 100 --max_fuel 0 --max_ifuel 0" val mul_shift_reduce_spec: input:seqelem -> input2:seqelem{mul_shift_reduce_pre (Seq.create len wide_zero) input input input2 len} -> Tot (s:seqelem_wide{seval_wide s % prime = (seval input * seval input2) % prime}) let mul_shift_reduce_spec input input2 = lemma_seval_wide_null (Seq.create len wide_zero) len; assert_norm (pow2 0 = 1); let output, _ = mul_shift_reduce_spec_ (Seq.create len wide_zero) input input input2 0 in output #set-options "--z3rlimit 20 --initial_fuel 2 --max_fuel 2" let fmul_pre (input:seqelem) (input2:seqelem) : GTot Type0 = mul_shift_reduce_pre (Seq.create len wide_zero) input input input2 len /\ carry_wide_pre (mul_shift_reduce_spec input input2) 0 /\ carry_top_wide_pre (carry_wide_spec (mul_shift_reduce_spec input input2)) /\ copy_from_wide_pre (carry_top_wide_spec (carry_wide_spec (mul_shift_reduce_spec input input2))) /\ carry_0_to_1_pre (copy_from_wide_spec (carry_top_wide_spec (carry_wide_spec (mul_shift_reduce_spec input input2)))) #set-options "--initial_fuel 0 --max_fuel 0" val fmul_spec: input:seqelem -> input2:seqelem{fmul_pre input input2} -> Tot (output:seqelem{seval output % prime = (seval input * seval input2) % prime}) let fmul_spec input input2 = let output1 = mul_shift_reduce_spec input input2 in let output2 = carry_wide_spec output1 in lemma_carry_top_wide_spec output2; let output3 = carry_top_wide_spec output2 in lemma_copy_from_wide output3; let output4 = copy_from_wide_spec output3 in carry_0_to_1_spec output4 #set-options "--z3rlimit 40" val lemma_whole_slice: #a:Type -> s:Seq.seq a -> Lemma (Seq.slice s 0 (Seq.length s) == s) let lemma_whole_slice #a s = Seq.lemma_eq_intro (Seq.slice s 0 (Seq.length s)) s ================================================ FILE: samples/Futhark/gaussian_blur.fut ================================================ -- # Gaussian blur -- -- One common pattern of array computation is the so-called -- [stencil](https://en.wikipedia.org/wiki/Stencil_code), where we -- change the value of an element in the array based on its -- neighbours. For example, we might implement image blurring by -- assigning each pixel the average value of all of its neighbors. -- Futhark does not have a special-purpose stencil language construct. -- Instead, stencil computations are expressed as `map`s on the index -- space, using explicit array indexing to access the stencil source -- array and returning the new value for the index. While this is -- rather verbose, at least until Futhark grows more syntactical -- conveniences, it works and performs well. Let's look at how to -- implement a simple image blurring program. -- -- We will represent an image as a three-dimensional array -- `[rows][cols][3]u8`. The innermost size-3 dimension encodes the -- three colour channels for red, green, and blue, respectively. When -- blurring, it is useful to operate on each colour channel separately. -- Furthermore, instead of the colour being a number from 0 to 255, it is -- more convenient to store it as a floating-point number between 0 and -- 1.0. Therefore, we define a function that transforms an array of type -- `[rows][cols][3]u8` into three arrays of type -- `[rows][cols]f32` each. The result is that we have one array for -- each of the three colour channels: -- let split_channels [rows][cols] (image: [rows][cols][3]u8): ([rows][cols]f32, [rows][cols]f32, [rows][cols]f32) = unzip3 (map (\row -> unzip3 (map (\pixel -> (f32.u8 pixel[0] / 255, f32.u8 pixel[1] / 255, f32.u8 pixel[2] / 255)) row)) image) -- The `[rows][cols]` notation preceding the `image` parameter is not -- a normal function parameter. Rather, it is a *size parameter*, a way -- of indicating that the function `split_channels` is polymorphic -- in the sizes `rows` and `cols`. The main purpose is that we can -- then use these names to indicate the sizes of the parameter and return -- values of the function. When the function is called, size parameters -- need not be passed arguments explicitly, but are automatically -- inferred from the concrete `image` argument. If we did not -- explicitly add these size parameters, the Futhark compiler would look -- for variables `rows` and `cols` in scope. -- -- The function `split_channels` maps across each inner `[3]u8` -- element (`pixel`), turns this into a triple instead of a -- three-element array, then uses `unzip` to turn the resulting -- array-of-triples into a triple-of-arrays, which is then returned. For -- readability, we could have chosen to explicitly indicate the return -- and parameter types of the anonymous function, but in the interest of -- brevity we have left them for the compiler to infer. It is only -- required to explicitly indicate the types of all top-level functions. -- -- We will also need to re-combine the colour channel arrays into a -- single array. That function looks like this: let combine_channels [rows][cols] (rs: [rows][cols]f32) (gs: [rows][cols]f32) (bs: [rows][cols]f32): [rows][cols][3]u8 = map3 (\rs_row gs_row bs_row -> map3 (\r g b -> [u8.f32 (r * 255), u8.f32 (g * 255), u8.f32 (b * 255)]) rs_row gs_row bs_row) rs gs bs -- Another thing we will need is the actual stencil function. That is, -- the function we wish to apply to every pixel in the image. For -- blurring, we will take the average value of the pixel itself plus each -- of its eight neighbors (nine values in total): let new_value [rows][cols] (image: [rows][cols]f32) (row: i32) (col: i32): f32 = unsafe let sum = image[row-1,col-1] + image[row-1,col] + image[row-1,col+1] + image[row, col-1] + image[row, col] + image[row, col+1] + image[row+1,col-1] + image[row+1,col] + image[row+1,col+1] in sum / 9 -- The function call `new_value(image, row, col)` computes the new value -- for the pixel at position `(row, col)` in `image`. -- -- The alert reader will have noticed that `new_value` cannot be applied -- to pixels on the edge of the image - doing so would result in -- out-of-bounds accesses to the `image` array. We will take care to -- only call the `new_value` function with safe indices, but the Futhark -- compiler is sadly not yet smart enough to realise this - thus we are -- forced to use the `unsafe` keyword to prevent the insertion of -- bounds checks that would otherwise hinder parallelisation. If we did -- not use `unsafe`, the Futhark compiler would fail with an error -- message pointing at the problematic array access. -- -- Now we can write the actual stencil function, which applies -- `new_value` to every inner element of a colour channel array. This -- uses the `iota` function for constructing an array of integers -- ranging from *0* to the provided argument (the latter not inclusive). -- The edges are left unchanged: let blur [rows][cols] (channel: [rows][cols]f32): [rows][cols]f32 = map (\row -> map(\col -> if row > 0 && row < rows-1 && col > 0 && col < cols-1 then new_value channel row col else channel[row,col]) (iota cols)) (iota rows) -- You may have heard that branches are expensive on a GPU. While this -- is a good basic rule of thumb, what is actually expensive is *branch -- divergence* - that is, when neighboring threads take *different* paths -- through a branch. In our stencil, only the edge elements will take -- the false branch, and these are few in number compared to the -- interior. -- -- Stencil computations usually have an outer (sequential) loop for -- applying the stencil several times. Our program is no different - we -- will apply the blurring transformation a user-defined number of times. -- The more iterations we run, the more blurred the image will become: let main [rows][cols] (iterations: i32) (image: [rows][cols][3]u8): [rows][cols][3]u8 = let (rs, gs, bs) = split_channels image let (rs, gs, bs) = loop (rs, gs, bs) for i < iterations do let rs = blur rs let gs = blur gs let bs = blur bs in (rs, gs, bs) in combine_channels rs gs bs -- Our `main` function is quite simple. We split the input image into -- three different channels, use a sequential loop to blur each colour -- channel the requested number of times, then recombine the resulting -- channel arrays into a single final image. -- -- The Futhark `loop` construct merits an explanation: in the above -- function, we declare three *loop variant variables*, `rs`, `gs`, -- and `bs`. These take their initial values from the incidentally -- identically named variables in scope (but this is not in general -- requirement). The *loop body* then returns three values that become -- the values of the loop variant variables in the next iteration of the -- loop. In essence, the `loop` construct is just syntactical suger -- for a particularly simple (but common) pattern of tail-recursive -- function. However, the Futhark compiler is able to perform -- transformations involving `loop`s that it cannot for recursive -- functions (although it does not perform any such for this simple -- program). -- -- The three separate calls to `blur` may seem wasteful, but the -- Futhark compiler is smart enough to fuse them together into a single -- GPU kernel that traverses the three colour channel arrays -- simultaneously. This is an instance of *horisontal fusion*. -- -- Our Futhark program is now done. We can make it a little more -- useful by writing a small Python wrapper program for reading and -- writing PNGs: [blur-png.py](/static/blur-png.py). We must -- compile `blur.fut` using the PyOpenCL backend: -- -- ``` -- $ futhark pyopencl --library blur.fut -- ``` -- -- This produces a Python module `blur.py` which is then imported by -- `blur-png.py`. We can try it out on any PNG image, say, this -- [illustration of the spirit of Futhark](/images/gottagofast.png): -- -- ``` -- $ python blur-png.py gottagofast.png --output-file gottagofast-blurred.png -- ``` -- -- Which produces [this slightly smushed -- image](/images/gottagofast-blurred.png). We can also ask for a -- hundred iterations:: -- -- ``` -- $ python blur-png.py gottagofast.png --output-file gottagofast-blurred.png --iterations 100 -- ``` -- -- Which produces [this blurry -- mess](/images/gottagofast-veryblurred.png). Notice the edges - -- perhaps simply keeping them unchanged is not the best way to -- implement image blurring. Still, this program is a decent -- description of how to implement stencils in Futhark. ================================================ FILE: samples/G-code/duettest.g ================================================ ; RepRapPro Ormerod ; Board test GCodes M111 S1; Debug on G21 ; mm G90 ; Absolute positioning M83 ; Extrusion relative M906 X800 Y800 Z800 E800 ; Motor currents (mA) T0 ; Extruder 0 G1 X50 F500 G1 X0 G4 P500 G1 Y50 F500 G1 Y0 G4 P500 G1 Z20 F200 G1 Z0 G4 P500 G1 E20 F200 G1 E-20 G4 P500 M106 S255 G4 P500 M106 S0 G4 P500 M105 G10 P0 S100 T0 M140 S100 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 G4 P5000 M105 M0 ================================================ FILE: samples/G-code/ghLogo.cnc ================================================ N1 DEF BOOL W_BLADE N2 G17 G70 G90 G40 G64 N3 M32 N4 STOPRE ; R50 = Part Area in SqFt N5 R50=0.00 ; R51 = Linear Feet Cut N6 R51=0.00 N7 IF $MN_USER_DATA_INT[1]==1 N8 W_BLADE=TRUE N9 ELSE N10 W_BLADE=FALSE N11 ENDIF N12 PATHLGTH N13 DO $R44=0 N14 G17 G90 G64 G70 G40 N15 IF W_BLADE==TRUE N16 G00 SUPA Z=0 BZ=0 N17 ELSE N18 G00 SUPA Z=0 N19 ENDIF N20 M5 N21 D0 N22 IF W_BLADE==TRUE N23 G00 SUPA Z=0 BZ=0 N24 ELSE N25 G00 SUPA Z=0 N26 ENDIF N27 ; T1 (001) CORE BIT 1.375 CNC 1 N28 T1 D1 N29 M6 N30 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N31 G54 CFIN N32 ; OP 1 N33 G90 G0 X-8.8059 Y-5.3995 N34 Z5.0 N35 S2800 M3 N36 G0 Z4.0 N37 M8 N38 G1 Z-0.125 F2.0 N39 G0 Z4.0 N40 Z5.0 N41 X-7.8843 Y-3.9351 N42 Z4.0 N43 G1 Z-0.125 F2.0 N44 G0 Z4.0 N45 Z5.0 N46 M5 N47 D0 N48 IF W_BLADE==TRUE N49 G00 SUPA Z=0 BZ=0 N50 ELSE N51 G00 SUPA Z=0 N52 ENDIF N53 ; T2 (002) FINGER BIT CNC 2 N54 T2 D1 N55 M6 N56 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N57 G54 CFIN N58 ; OP 2 N59 G90 G0 X-8.8059 Y-5.3995 N60 Z5.0 N61 S5500 M3 N62 G4 F1.0 N63 G0 Z4.0 N64 M8 N65 G90 G1 X-8.8059 Y-5.3995 Z0.0 F50.0 N66 M13 N67 DO $R44=1 N68 G41 N69 G90 G1 X-8.2411 Y-5.9818 Z0.0 F10.0 N70 G90 G3 X-7.0516 Y-5.4814 Z0.0 I0.2375 J1.0997 F10.0 N71 G90 G3 X-5.8991 Y-1.4856 Z0.0 I-6.347 J3.9946 F10.0 N72 G90 G3 X-13.3975 Y6.0127 Z0.0 I-7.4983 J0.0 F10.0 N73 G90 G3 X-20.896 Y-1.4856 Z0.0 I0.0002 J-7.4987 F10.0 N74 G90 G3 X-15.9208 Y-8.5482 Z0.0 I7.5003 J-0.0001 F10.0 N75 G90 G3 X-15.3193 Y-8.1211 Z0.0 I0.1515 J0.4237 F10.0 N76 G90 G2 X-15.3278 Y-6.9564 Z0.0 I15662.3898 J114.7986 F10.0 N77 G90 G2 X-17.8663 Y-6.0115 Z0.0 I-0.7655 J1.8257 F10.0 N78 G90 G2 X-17.8694 Y-6.0038 Z0.0 I0.0448 J0.0222 F10.0 N79 G90 G3 X-18.6701 Y-4.9375 Z0.0 I-1.8647 J-0.5664 F10.0 N80 G90 G2 X-18.5939 Y-4.3774 Z0.0 I-0.0424 J0.291 F10.0 N81 G90 G2 X-17.4076 Y-5.1787 Z0.0 I-0.2305 J-1.62 F10.0 N82 G90 G2 X-17.4071 Y-5.1797 Z0.0 I-0.0433 J-0.025 F10.0 N83 G90 G3 X-15.3015 Y-5.8002 Z0.0 I1.3649 J0.749 F10.0 N84 G90 G2 X-14.8936 Y-4.8739 Z0.0 I1.6485 J-0.1729 F10.0 N85 G90 G2 X-18.2642 Y-1.0888 Z0.0 I0.0035 J3.3964 F10.0 N86 G90 G2 X-17.4934 Y0.9465 Z0.0 I2.971 J0.0385 F10.0 N87 G90 G2 X-17.409 Y2.9525 Z0.0 I2.6135 J0.8948 F10.0 N88 G90 G2 X-17.3656 Y2.9823 Z0.0 I0.0458 J-0.0201 F10.0 N89 G90 G2 X-15.273 Y2.2142 Z0.0 I0.1344 J-2.8684 F10.0 N90 G90 G2 X-13.3976 Y2.4626 Z0.0 I1.8864 J-7.0369 F10.0 N91 G90 G2 X-13.3974 Y2.4626 Z0.0 I0.0001 J-0.05 F10.0 N92 G90 G2 X-11.5205 Y2.2142 Z0.0 I-0.0119 J-7.304 F10.0 N93 G90 G2 X-9.4304 Y2.9823 Z0.0 I1.9559 J-2.0943 F10.0 N94 G90 G2 X-9.387 Y2.9525 Z0.0 I-0.0023 J-0.0499 F10.0 N95 G90 G2 X-9.3017 Y0.9465 Z0.0 I-2.5248 J-1.1122 F10.0 N96 G90 G2 X-8.5318 Y-1.0888 Z0.0 I-2.1954 J-1.9937 F10.0 N97 G90 G2 X-11.9123 Y-4.8684 Z0.0 I-3.3661 J-0.3909 F10.0 N98 G90 G2 X-11.4666 Y-6.2156 Z0.0 I-1.4037 J-1.2117 F10.0 N99 G90 G2 X-11.4743 Y-8.1215 Z0.0 I-411.1686 J0.7028 F10.0 N100 G90 G3 X-10.8728 Y-8.5481 Z0.0 I0.45 J-0.0029 F10.0 N101 G90 G3 X-7.0516 Y-5.4814 Z0.0 I-2.5258 J7.0613 F10.0 N102 G90 G3 X-7.1149 Y-4.1924 Z0.0 I-0.9521 J0.5992 F10.0 N103 G40 G90 G1 X-7.8843 Y-3.9351 Z0.0 F10.0 N104 DO $R44=0 N105 M15 N106 G0 Z5.0 N107 M9 ;MD14512[5] = 1H N108 IF $MN_USER_DATA_HEX[5] B_AND 'B00000001' N109 PARKPAUSE N110 ELSE N111 D0 N112 IF W_BLADE==TRUE N113 G00 SUPA Z=0 N114 ENDIF N115 M5 N116 SUPA X=$MA_POS_LIMIT_PLUS[X]-0.1 Y=$MA_POS_LIMIT_PLUS[Y]-0.1 N117 MSG ("- PAUSED - REMOVE SINK AND PRESS CYCLE START TO CONTINUE") N118 M0 N119 D1 N120 M3 N121 MSG("") N122 ENDIF N123 M5 N124 D0 N125 IF W_BLADE==TRUE N126 G00 SUPA Z=0 BZ=0 N127 ELSE N128 G00 SUPA Z=0 N129 ENDIF N130 ; T49 (049) A30 R3 POS 0 CNC 2 N131 T49 D1 N132 M6 N133 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N134 G54 CFIN N135 ; OP 3 N136 G90 G0 X-8.4366 Y-4.8499 N137 Z5.0 N138 S5500 M3 N139 G4 F1.0 N140 G0 Z4.0 N141 M8 N142 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N143 M13 N144 DO $R44=1 N145 G41 N146 G90 G1 X-7.0092 Y-5.5081 Z0.0 F50.0 N147 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F50.0 N148 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F50.0 N149 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F50.0 N150 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F50.0 N151 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F50.0 N152 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F50.0 N153 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F50.0 N154 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F50.0 N155 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F50.0 N156 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F50.0 N157 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F50.0 N158 DO $R44=0 N159 M15 N160 G0 Z5.0 N161 M9 N162 G90 G0 X-9.4749 Y0.8697 N163 Z4.0 N164 M8 N165 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N166 M13 N167 DO $R44=1 N168 G41 N169 G90 G1 X-8.1381 Y2.0792 Z0.0 F50.0 N170 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F50.0 N171 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F50.0 N172 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F50.0 N173 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F50.0 N174 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F50.0 N175 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F50.0 N176 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F50.0 N177 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F50.0 N178 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F50.0 N179 G40 G90 G1 X-7.896 Y6.405 Z0.0 F50.0 N180 DO $R44=0 N181 M15 N182 G0 Z5.0 N183 M9 N184 G90 G0 X-15.4413 Y2.6078 N185 Z4.0 N186 M8 N187 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N188 M13 N189 DO $R44=1 N190 G41 N191 G90 G1 X-16.5435 Y4.0344 Z0.0 F50.0 N192 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F50.0 N193 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F50.0 N194 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F50.0 N195 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F50.0 N196 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F50.0 N197 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F50.0 N198 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F50.0 N199 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F50.0 N200 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F50.0 N201 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F50.0 N202 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F50.0 N203 DO $R44=0 N204 M15 N205 G0 Z5.0 N206 M9 N207 M5 N208 D0 N209 IF W_BLADE==TRUE N210 G00 SUPA Z=0 BZ=0 N211 ELSE N212 G00 SUPA Z=0 N213 ENDIF N214 ; T50 (050) A30 R3 POS 1 CNC 2 N215 T50 D1 N216 M6 N217 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N218 G54 CFIN N219 ; OP 4 N220 G90 G0 X-8.4366 Y-4.8499 N221 Z5.0 N222 S5500 M3 N223 G4 F1.0 N224 G0 Z4.0 N225 M8 N226 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N227 M13 N228 DO $R44=1 N229 G41 N230 G90 G1 X-7.0092 Y-5.5081 Z0.0 F120.0 N231 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F120.0 N232 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F120.0 N233 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F120.0 N234 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F120.0 N235 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F120.0 N236 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F120.0 N237 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F120.0 N238 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F120.0 N239 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F120.0 N240 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F120.0 N241 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F120.0 N242 DO $R44=0 N243 M15 N244 G0 Z5.0 N245 M9 N246 G90 G0 X-9.4749 Y0.8697 N247 Z4.0 N248 M8 N249 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N250 M13 N251 DO $R44=1 N252 G41 N253 G90 G1 X-8.1381 Y2.0792 Z0.0 F120.0 N254 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F120.0 N255 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F120.0 N256 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F120.0 N257 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F120.0 N258 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F120.0 N259 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F120.0 N260 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F120.0 N261 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F120.0 N262 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F120.0 N263 G40 G90 G1 X-7.896 Y6.405 Z0.0 F120.0 N264 DO $R44=0 N265 M15 N266 G0 Z5.0 N267 M9 N268 G90 G0 X-15.4413 Y2.6078 N269 Z4.0 N270 M8 N271 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N272 M13 N273 DO $R44=1 N274 G41 N275 G90 G1 X-16.5435 Y4.0344 Z0.0 F120.0 N276 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F120.0 N277 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F120.0 N278 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F120.0 N279 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F120.0 N280 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F120.0 N281 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F120.0 N282 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F120.0 N283 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F120.0 N284 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F120.0 N285 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F120.0 N286 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F120.0 N287 DO $R44=0 N288 M15 N289 G0 Z5.0 N290 M9 N291 M5 N292 D0 N293 IF W_BLADE==TRUE N294 G00 SUPA Z=0 BZ=0 N295 ELSE N296 G00 SUPA Z=0 N297 ENDIF N298 ; T51 (051) A30 R3 POS 2 CNC 2 N299 T51 D1 N300 M6 N301 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N302 G54 CFIN N303 ; OP 5 N304 G90 G0 X-8.4366 Y-4.8499 N305 Z5.0 N306 S5500 M3 N307 G4 F1.0 N308 G0 Z4.0 N309 M8 N310 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N311 M13 N312 DO $R44=1 N313 G41 N314 G90 G1 X-7.0092 Y-5.5081 Z0.0 F120.0 N315 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F120.0 N316 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F120.0 N317 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F120.0 N318 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F120.0 N319 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F120.0 N320 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F120.0 N321 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F120.0 N322 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F120.0 N323 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F120.0 N324 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F120.0 N325 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F120.0 N326 DO $R44=0 N327 M15 N328 G0 Z5.0 N329 M9 N330 G90 G0 X-9.4749 Y0.8697 N331 Z4.0 N332 M8 N333 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N334 M13 N335 DO $R44=1 N336 G41 N337 G90 G1 X-8.1381 Y2.0792 Z0.0 F120.0 N338 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F120.0 N339 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F120.0 N340 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F120.0 N341 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F120.0 N342 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F120.0 N343 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F120.0 N344 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F120.0 N345 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F120.0 N346 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F120.0 N347 G40 G90 G1 X-7.896 Y6.405 Z0.0 F120.0 N348 DO $R44=0 N349 M15 N350 G0 Z5.0 N351 M9 N352 G90 G0 X-15.4413 Y2.6078 N353 Z4.0 N354 M8 N355 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N356 M13 N357 DO $R44=1 N358 G41 N359 G90 G1 X-16.5435 Y4.0344 Z0.0 F120.0 N360 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F120.0 N361 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F120.0 N362 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F120.0 N363 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F120.0 N364 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F120.0 N365 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F120.0 N366 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F120.0 N367 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F120.0 N368 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F120.0 N369 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F120.0 N370 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F120.0 N371 DO $R44=0 N372 M15 N373 G0 Z5.0 N374 M9 N375 M5 N376 D0 N377 IF W_BLADE==TRUE N378 G00 SUPA Z=0 BZ=0 N379 ELSE N380 G00 SUPA Z=0 N381 ENDIF N382 ; T52 (052) A30 R3 POS 3 CNC 2 N383 T52 D1 N384 M6 N385 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N386 G54 CFIN N387 ; OP 6 N388 G90 G0 X-8.4366 Y-4.8499 N389 Z5.0 N390 S5500 M3 N391 G4 F1.0 N392 G0 Z4.0 N393 M8 N394 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N395 M13 N396 DO $R44=1 N397 G41 N398 G90 G1 X-7.0092 Y-5.5081 Z0.0 F50.0 N399 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F50.0 N400 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F50.0 N401 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F50.0 N402 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F50.0 N403 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F50.0 N404 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F50.0 N405 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F50.0 N406 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F50.0 N407 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F50.0 N408 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F50.0 N409 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F50.0 N410 DO $R44=0 N411 M15 N412 G0 Z5.0 N413 M9 N414 G90 G0 X-9.4749 Y0.8697 N415 Z4.0 N416 M8 N417 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N418 M13 N419 DO $R44=1 N420 G41 N421 G90 G1 X-8.1381 Y2.0792 Z0.0 F50.0 N422 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F50.0 N423 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F50.0 N424 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F50.0 N425 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F50.0 N426 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F50.0 N427 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F50.0 N428 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F50.0 N429 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F50.0 N430 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F50.0 N431 G40 G90 G1 X-7.896 Y6.405 Z0.0 F50.0 N432 DO $R44=0 N433 M15 N434 G0 Z5.0 N435 M9 N436 G90 G0 X-15.4413 Y2.6078 N437 Z4.0 N438 M8 N439 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N440 M13 N441 DO $R44=1 N442 G41 N443 G90 G1 X-16.5435 Y4.0344 Z0.0 F50.0 N444 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F50.0 N445 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F50.0 N446 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F50.0 N447 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F50.0 N448 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F50.0 N449 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F50.0 N450 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F50.0 N451 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F50.0 N452 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F50.0 N453 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F50.0 N454 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F50.0 N455 DO $R44=0 N456 M15 N457 G0 Z5.0 N458 M9 N459 M5 N460 D0 N461 IF W_BLADE==TRUE N462 G00 SUPA Z=0 BZ=0 N463 ELSE N464 G00 SUPA Z=0 N465 ENDIF N466 ; T53 (053) A30 R3 POS 4 CNC 2 N467 T53 D1 N468 M6 N469 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N470 G54 CFIN N471 ; OP 7 N472 G90 G0 X-8.4366 Y-4.8499 N473 Z5.0 N474 S2500 M3 N475 G4 F1.0 N476 G0 Z4.0 N477 M8 N478 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N479 M13 N480 DO $R44=1 N481 G41 N482 G90 G1 X-7.0092 Y-5.5081 Z0.0 F45.0 N483 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F45.0 N484 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F45.0 N485 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F45.0 N486 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F45.0 N487 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F45.0 N488 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F45.0 N489 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F45.0 N490 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F45.0 N491 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F45.0 N492 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F45.0 N493 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F45.0 N494 DO $R44=0 N495 M15 N496 G0 Z5.0 N497 M9 N498 G90 G0 X-9.4749 Y0.8697 N499 Z4.0 N500 M8 N501 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N502 M13 N503 DO $R44=1 N504 G41 N505 G90 G1 X-8.1381 Y2.0792 Z0.0 F45.0 N506 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F45.0 N507 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F45.0 N508 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F45.0 N509 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F45.0 N510 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F45.0 N511 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F45.0 N512 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F45.0 N513 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F45.0 N514 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F45.0 N515 G40 G90 G1 X-7.896 Y6.405 Z0.0 F45.0 N516 DO $R44=0 N517 M15 N518 G0 Z5.0 N519 M9 N520 G90 G0 X-15.4413 Y2.6078 N521 Z4.0 N522 M8 N523 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N524 M13 N525 DO $R44=1 N526 G41 N527 G90 G1 X-16.5435 Y4.0344 Z0.0 F45.0 N528 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F45.0 N529 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F45.0 N530 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F45.0 N531 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F45.0 N532 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F45.0 N533 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F45.0 N534 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F45.0 N535 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F45.0 N536 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F45.0 N537 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F45.0 N538 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F45.0 N539 DO $R44=0 N540 M15 N541 G0 Z5.0 N542 M9 N543 M5 N544 D0 N545 IF W_BLADE==TRUE N546 G00 SUPA Z=0 BZ=0 N547 ELSE N548 G00 SUPA Z=0 N549 ENDIF N550 ; T54 (054) A30 R3 POS 5 CNC 2 N551 T54 D1 N552 M6 N553 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N554 G54 CFIN N555 ; OP 8 N556 G90 G0 X-8.4366 Y-4.8499 N557 Z5.0 N558 S2500 M3 N559 G4 F1.0 N560 G0 Z4.0 N561 M8 N562 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N563 M13 N564 DO $R44=1 N565 G41 N566 G90 G1 X-7.0092 Y-5.5081 Z0.0 F45.0 N567 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F45.0 N568 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F45.0 N569 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F45.0 N570 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F45.0 N571 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F45.0 N572 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F45.0 N573 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F45.0 N574 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F45.0 N575 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F45.0 N576 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F45.0 N577 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F45.0 N578 DO $R44=0 N579 M15 N580 G0 Z5.0 N581 M9 N582 G90 G0 X-9.4749 Y0.8697 N583 Z4.0 N584 M8 N585 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N586 M13 N587 DO $R44=1 N588 G41 N589 G90 G1 X-8.1381 Y2.0792 Z0.0 F45.0 N590 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F45.0 N591 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F45.0 N592 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F45.0 N593 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F45.0 N594 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F45.0 N595 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F45.0 N596 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F45.0 N597 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F45.0 N598 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F45.0 N599 G40 G90 G1 X-7.896 Y6.405 Z0.0 F45.0 N600 DO $R44=0 N601 M15 N602 G0 Z5.0 N603 M9 N604 G90 G0 X-15.4413 Y2.6078 N605 Z4.0 N606 M8 N607 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N608 M13 N609 DO $R44=1 N610 G41 N611 G90 G1 X-16.5435 Y4.0344 Z0.0 F45.0 N612 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F45.0 N613 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F45.0 N614 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F45.0 N615 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F45.0 N616 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F45.0 N617 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F45.0 N618 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F45.0 N619 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F45.0 N620 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F45.0 N621 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F45.0 N622 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F45.0 N623 DO $R44=0 N624 M15 N625 G0 Z5.0 N626 M9 N627 M5 N628 D0 N629 IF W_BLADE==TRUE N630 G00 SUPA Z=0 BZ=0 N631 ELSE N632 G00 SUPA Z=0 N633 ENDIF N634 ; T55 (055) A30 R3 POS 6 CNC 2 N635 T55 D1 N636 M6 N637 TRANS X=SPIN_X_OFFSET Y=SPIN_Y_OFFSET N638 G54 CFIN N639 ; OP 9 N640 G90 G0 X-8.4366 Y-4.8499 N641 Z5.0 N642 S2500 M3 N643 G4 F1.0 N644 G0 Z4.0 N645 M8 N646 G90 G1 X-8.4366 Y-4.8499 Z0.0 F50.0 N647 M13 N648 DO $R44=1 N649 G41 N650 G90 G1 X-7.0092 Y-5.5081 Z0.0 F45.0 N651 G90 G3 X-5.8491 Y-1.4856 Z0.0 I-6.3893 J4.0212 F45.0 N652 G90 G3 X-7.5009 Y3.2269 Z0.0 I-7.5483 J0.0 F45.0 N653 G90 G3 X-9.2607 Y2.3971 Z0.0 I-0.7812 J-0.6243 F45.0 N654 G90 G2 X-9.3588 Y0.9347 Z0.0 I-2.6511 J-0.5567 F45.0 N655 G90 G2 X-8.5819 Y-1.0914 Z0.0 I-2.1384 J-1.9819 F45.0 N656 G90 G2 X-12.0286 Y-4.8159 Z0.0 I-3.316 J-0.3884 F45.0 N657 G90 G2 X-11.5166 Y-6.2138 Z0.0 I-1.2874 J-1.2642 F45.0 N658 G90 G2 X-11.5202 Y-7.3654 Z0.0 I-411.1186 J0.7009 F45.0 N659 G90 G3 X-10.0807 Y-8.2681 Z0.0 I1.0 J-0.0045 F45.0 N660 G90 G3 X-7.0092 Y-5.5081 Z0.0 I-3.3178 J6.7813 F45.0 N661 G40 G90 G1 X-8.1714 Y-4.5684 Z0.0 F45.0 N662 DO $R44=0 N663 M15 N664 G0 Z5.0 N665 M9 N666 G90 G0 X-9.4749 Y0.8697 N667 Z4.0 N668 M8 N669 G90 G1 X-9.4749 Y0.8697 Z0.0 F50.0 N670 M13 N671 DO $R44=1 N672 G41 N673 G90 G1 X-8.1381 Y2.0792 Z0.0 F45.0 N674 G90 G3 X-9.1579 Y4.7597 Z0.0 I-2.4239 J0.612 F45.0 N675 G90 G3 X-13.3975 Y6.0627 Z0.0 I-4.2395 J-6.2453 F45.0 N676 G90 G3 X-17.637 Y4.7597 Z0.0 I0.0002 J-7.5487 F45.0 N677 G90 G3 X-17.1161 Y2.9331 Z0.0 I0.5616 J-0.8274 F45.0 N678 G90 G2 X-15.2869 Y2.1586 Z0.0 I-0.1151 J-2.8192 F45.0 N679 G90 G2 X-13.3975 Y2.4126 Z0.0 I1.9003 J-6.9814 F45.0 N680 G90 G2 X-11.5065 Y2.1586 Z0.0 I-0.0118 J-7.254 F45.0 N681 G90 G2 X-9.679 Y2.9331 Z0.0 I1.9419 J-2.0388 F45.0 N682 G90 G3 X-7.3985 Y4.6722 Z0.0 I-0.1016 J2.4979 F45.0 N683 G40 G90 G1 X-7.896 Y6.405 Z0.0 F45.0 N684 DO $R44=0 N685 M15 N686 G0 Z5.0 N687 M9 N688 G90 G0 X-15.4413 Y2.6078 N689 Z4.0 N690 M8 N691 G90 G1 X-15.4413 Y2.6078 Z0.0 F50.0 N692 M13 N693 DO $R44=1 N694 G41 N695 G90 G1 X-16.5435 Y4.0344 Z0.0 F45.0 N696 G90 G3 X-19.295 Y3.2258 Z0.0 I-0.7983 J-2.3691 F45.0 N697 G90 G3 X-20.946 Y-1.4856 Z0.0 I5.8977 J-4.7117 F45.0 N698 G90 G3 X-20.4903 Y-4.0692 Z0.0 I7.5503 J-0.0001 F45.0 N699 G90 G3 X-18.8769 Y-4.4661 Z0.0 I0.9396 J0.3422 F45.0 N700 G90 G2 X-18.7269 Y-4.4028 Z0.0 I0.1644 J-0.1804 F45.0 N701 G90 G3 X-17.8896 Y-2.9612 Z0.0 I-0.059 J0.9983 F45.0 N702 G90 G2 X-18.2141 Y-1.0914 Z0.0 I2.9995 J1.4837 F45.0 N703 G90 G2 X-17.4364 Y0.9347 Z0.0 I2.921 J0.0411 F45.0 N704 G90 G2 X-17.5349 Y2.3968 Z0.0 I2.5564 J0.9066 F45.0 N705 G90 G3 X-18.6639 Y5.0331 Z0.0 I-2.447 J0.512 F45.0 N706 G40 G90 G1 X-20.4657 Y4.9742 Z0.0 F45.0 N707 DO $R44=0 N708 M15 N709 G0 Z5.0 N710 M9 N711 M5 N712 D0 N713 G53 N714 IF W_BLADE==TRUE N715 G00 SUPA Z=0 BZ=0 C=0 N716 ELSE N717 G00 SUPA Z=0 N718 ENDIF N719 ;MD14512[5] = 1H N720 IF $MN_USER_DATA_HEX[5] B_AND 'B00000001' N721 PARKMACHINE N722 ELSE N723 SUPA X=$MA_POS_LIMIT_PLUS[X]-0.1 Y=$MA_POS_LIMIT_PLUS[Y]-0.1 N724 ENDIF N725 M30 ================================================ FILE: samples/G-code/square.g ================================================ G28 X0 Y0 G1 X55 Y5 F2000 G1 Y180 G1 X180 G1 Y5 G1 X55 G1 Y180 G1 X180 G1 Y5 G1 X55 M0 ================================================ FILE: samples/GAML/3dTutorial.gaml ================================================ model Tuto3D global { int nb_cells <-100; int environmentSize <-100; geometry shape <- cube(environmentSize); init { create cells number: nb_cells { location <- {rnd(environmentSize), rnd(environmentSize), rnd(environmentSize)}; } } } species cells skills: [moving3D] { rgb color; list neighbors; int offset; reflex move { do wander; } reflex computeNeighbors { neighbors <- cells select ((each distance_to self) < 10); } aspect default { draw sphere(environmentSize*0.01) color:#orange; loop pp over: neighbors { draw line([self.location,pp.location]); } } } experiment Tuto3D type: gui { parameter "Initial number of cells: " var: nb_cells min: 1 max: 1000 category: "Cells" ; output { display View1 type:opengl background:rgb(10,40,55){ graphics "env"{ draw cube(environmentSize) color: #black empty:true; } species cells; } } } ================================================ FILE: samples/GAML/bdiAgents.gaml ================================================ model GoldBdi global { int nb_mines <- 10; int nbminer<-5; int nb_police <- 1; int fine <-0; market the_market; string mine_at_location <- "mine_at_location"; string empty_mine_location <- "empty_mine_location"; float step <- 10#mn; //possible predicates concerning miners predicate mine_location <- new_predicate(mine_at_location) ; predicate choose_goldmine <- new_predicate("choose a gold mine"); predicate has_gold <- new_predicate("extract gold"); predicate find_gold <- new_predicate("find gold") ; predicate sell_gold <- new_predicate("sell gold") ; predicate share_information <- new_predicate("share information") ; emotion joy <- new_emotion("joy"); float inequality <- 0.0 update:standard_deviation(miner collect each.gold_sold); geometry shape <- square(20 #km); init { create market { the_market <- self; } create goldmine number:nb_mines; create miner number:nbminer; create policeman number:nb_police; } reflex end_simulation when: sum(goldmine collect each.quantity) = 0 and empty(miner where each.has_belief(has_gold)){ do pause; ask miner{ write name + " : " +gold_sold; } write "**********************"; write "fine : " + fine; } } species goldmine { int quantity <- rnd(1,20); aspect default { if (quantity = 0) { draw triangle(200) color: #gray border: #black; } else { draw triangle(200 + quantity*50) color: #yellow border: #black; } } } species market { int golds; aspect default { draw square(1000) color: #black ; } } species policeman skills: [moving] control:simple_bdi { predicate patroling <- new_predicate("patrolling"); float viewdist <- 1000.0; miner agent_perceived <- nil; init { do add_desire(patroling); } perceive target:miner in: viewdist{ enforcement law:"working" sanction:"sanctionToLaw"; enforcement obligation:has_gold /*when:has_belief(has_gold)*/ sanction: "sanctionToObligation" reward:"rewardToObligation"; } sanction sanctionToLaw{ ask agent_perceived{ thresholdLaw <- 0.0; gold_sold <- gold_sold-5; } fine <- fine +5; } sanction sanctionToObligation { ask agent_perceived{ gold_sold <- gold_sold-3; do remove_intention(sell_gold,true); thresholdObligation <- self.thresholdObligation - 0.1; } fine <- fine + 3; } sanction rewardToObligation{ ask agent_perceived{ gold_sold <- gold_sold+2; } fine <- fine -2; } plan patrol intention: patroling{ do wander; } aspect base{ draw circle(viewdist) color: #blue depth:0.0; } } species miner skills: [moving] control:simple_bdi { float viewdist<-1000.0; float speed <- 2#km/#h; rgb mycolor<-rnd_color(255); point target; int gold_sold; int gold_transported<-0; agent agent_perceived<-nil; bool use_social_architecture <- true; bool use_emotions_architecture <- true; bool use_personality <- true; float openness <- gauss(0.5,0.12); float conscientiousness <- gauss(0.5,0.12); float extraversion <- gauss(0.5,0.12); float agreeableness <- gauss(0.5,0.12); float neurotism <- gauss(0.5,0.12); float plan_persistence <- 1.0; float intention_persistence <- 1.0; float thresholdLaw <- 1.0; float thresholdObligation <- 1.0; float thresholdNorm <- 0.5; init { do add_desire(find_gold); } perceive target:self{ if(gold_transported>0){ do add_belief(has_gold); } else { do remove_belief(has_gold); } } perceive target:miner in:viewdist { myself.agent_perceived<-self; socialize liking: point(mycolor.red, mycolor.green, mycolor.blue) distance_to point(myself.mycolor.red, myself.mycolor.green, myself.mycolor.blue) / ( 255) - 1; enforcement norm:"share_information" sanction:"sanctionToNorm" reward:"rewardToNorm"; } sanction sanctionToNorm{ do change_liking(agent_perceived,-0.1); } sanction rewardToNorm{ do change_liking(agent_perceived,0.1); } perceive target:goldmine where (each.quantity > 0) in:viewdist { focus id:mine_at_location var:location; ask myself { if (has_emotion(joy)) {do add_desire(predicate:share_information, strength: 5.0);} do remove_intention(find_gold, false); } } rule belief: has_gold new_desire: sell_gold strength: 3.0; law working belief: mine_location new_obligation: has_gold when:not has_obligation(has_gold) and not has_belief(has_gold) strength: 2.0 threshold:thresholdLaw; plan letsWander intention:find_gold { do wander; } norm doingJob obligation:has_gold finished_when: has_belief(has_gold) threshold:thresholdObligation{ if (target = nil) { do add_subintention(has_gold,choose_goldmine, true); do current_intention_on_hold(); } else { do goto target: target ; if (target = location) { goldmine current_mine<- goldmine first_with (target = each.location); if current_mine.quantity > 0 { gold_transported <- gold_transported+1; do add_belief(has_gold); ask current_mine {quantity <- quantity - 1;} } else { do add_belief(new_predicate(empty_mine_location, ["location_value"::target])); do remove_belief(new_predicate(mine_at_location, ["location_value"::target])); } target <- nil; } } } plan getMoreGold intention:has_gold { if (target = nil) { do add_subintention(has_gold,choose_goldmine, true); do current_intention_on_hold(); } else { do goto target: target ; if (target = location) { goldmine current_mine<- goldmine first_with (target = each.location); if current_mine.quantity > 0 { gold_transported <- 3; do add_belief(has_gold); ask current_mine {if(quantity>=3) { quantity <- quantity - 3; }else { quantity <- 0; } } } else { do add_belief(new_predicate(empty_mine_location, ["location_value"::target])); do remove_belief(new_predicate(mine_at_location, ["location_value"::target])); } target <- nil; } } } plan choose_closest_goldmine intention: choose_goldmine instantaneous: true{ list possible_mines <- get_beliefs_with_name(mine_at_location) collect (point(get_predicate(mental_state (each)).values["location_value"])); list empty_mines <- get_beliefs_with_name(empty_mine_location) collect (point(get_predicate(mental_state (each)).values["location_value"])); possible_mines <- possible_mines - empty_mines; if (empty(possible_mines)) { do remove_intention(has_gold, true); } else { target <- (possible_mines with_min_of (each distance_to self)).location; } do remove_intention(choose_goldmine, true); } plan return_to_base intention: sell_gold when: has_belief(has_gold){ do goto target: the_market ; if (the_market.location = location) { do remove_belief(has_gold); do remove_intention(sell_gold, true); gold_sold <- gold_sold + gold_transported; gold_transported <- 0; } } norm share_information intention:share_information threshold:thresholdNorm instantaneous: true{ list my_friends <- list((social_link_base where (each.liking > 0)) collect each.agent); loop known_goldmine over: get_beliefs_with_name(mine_at_location) { ask my_friends { do add_belief(known_goldmine); } } loop known_empty_goldmine over: get_beliefs_with_name(empty_mine_location) { ask my_friends { do add_belief(known_empty_goldmine); } } do remove_intention(share_information, true); } plan share_information_to_friends intention: share_information instantaneous: true{ list my_friends <- list((social_link_base where (each.liking > 0)) collect each.agent); loop known_goldmine over: get_beliefs_with_name(empty_mine_location) { ask my_friends { do add_belief(known_goldmine); } } do remove_intention(share_information, true); } aspect default { draw circle(200) color: mycolor border: #black depth: gold_sold; } } experiment GoldBdi type: gui { output { display map type: opengl { species market ; species goldmine ; species miner; species policeman aspect:base; } } } ================================================ FILE: samples/GAML/incrementalGIS.gaml ================================================ model model7 global { int nb_people <- 500; float step <- 1 #minutes; float infection_distance <- 2.0 #m; float proba_infection <- 0.05; int nb_infected_init <- 5; file roads_shapefile <- file("../includes/road.shp"); file buildings_shapefile <- file("../includes/building.shp"); geometry shape <- envelope(roads_shapefile); graph road_network; int current_hour update: (cycle / 60) mod 24; float staying_coeff update: 10.0 ^ (1 + min([abs(current_hour - 9), abs(current_hour - 12), abs(current_hour - 18)])); float beta <- 0.01; float h<-0.1; list list_people_in_buildings update: (building accumulate each.people_inside) where (not dead(each)); int nb_people_infected <- nb_infected_init update: people count (each.is_infected) + (empty(list_people_in_buildings) ? 0 : list_people_in_buildings count (each.is_infected)); int nb_people_not_infected <- nb_people - nb_infected_init update: nb_people - nb_people_infected; bool is_night <- true update: current_hour < 7 or current_hour > 20; float infected_rate update: nb_people_infected/nb_people; init { create road from: roads_shapefile; road_network <- as_edge_graph(road); create building from: buildings_shapefile; create people number:nb_people { speed <- 5.0 #km/#h; building bd <- one_of(building); location <- any_location_in(bd); } ask nb_infected_init among people { is_infected <- true; } } reflex end_simulation when: infected_rate = 1.0 { do halt; } } species people skills:[moving]{ bool is_infected <- false; point target; int staying_counter; reflex move when: target != nil{ do goto target:target on: road_network; if (location = target) { target <- any_location_in (one_of(building)); target <- nil; staying_counter <- 0; } } reflex infect when: is_infected{ ask people at_distance infection_distance { if flip(proba_infection) { is_infected <- true; } } } aspect circle{ draw circle(5) color:is_infected ? #red : #green; } aspect sphere3D{ draw sphere(3) at: {location.x,location.y,location.z + 3} color:is_infected ? #red : #green; } } species road { geometry display_shape <- shape + 2.0; aspect geom { draw display_shape color: #black depth: 3.0; } } species building { float height <- 10#m + rnd(10) #m; list people_inside -> {members collect people_in_building(each)}; float I; float S; float T; float t; float I_to1; aspect geom { int nbI <- members count people_in_building(each).is_infected; int nbT <- length(members); draw shape color:nbT = 0 ? #gray : (float(nbI)/nbT > 0.5 ? #red : #green) depth: height; } species people_in_building parent: people schedules: [] { } reflex let_people_leave { ask members as: people_in_building{ staying_counter <- staying_counter + 1; } list leaving_people <- list(members where (flip(people_in_building(each).staying_counter / staying_coeff))); if not (empty (leaving_people)) { release leaving_people as: people in: world returns: released_people; ask released_people { target <- any_location_in (one_of(building)); } } } reflex let_people_enter { list entering_people <- people inside self where (each.target = nil); if not (empty (entering_people)) { capture entering_people as: people_in_building ; } } equation SI{ diff(S,t) = (- beta * S * I / T) ; diff(I,t) = ( beta * S * I / T) ; } reflex epidemic when: not empty(members){ T <- float(length(members)); list S_members <- list(members where not (people_in_building(each).is_infected)); S <- float(length(S_members)); I <- T-S; float I0 <- I; if (I > 0 and S > 0) { solve SI method: "rk4" step: h; I_to1 <- I_to1 + (I - I0); int I_int <- min([int(S),int(I_to1)]); I_to1 <- I_to1 - I_int; ask(I_int among S_members){ is_infected <- true; } } } } experiment main_experiment type:gui{ parameter "Infection distance" var: infection_distance; parameter "Proba infection" var: proba_infection min: 0.0 max: 1.0; parameter "Nb people infected at init" var: nb_infected_init ; output { monitor "Current hour" value: current_hour; monitor "Infected people rate" value: infected_rate; display map_3D type: opengl { light 1 color:(is_night ? 50 : 255); image "../includes/soil.jpg"; species road aspect:geom; species people aspect:sphere3D; species building aspect:geom transparency: 0.5; } display chart refresh:every(10) { chart "Disease spreading" type: series { data "susceptible" value: nb_people_not_infected color: #green; data "infected" value: nb_people_infected color: #red; } } } } ================================================ FILE: samples/GAML/luneraysFlu.gaml ================================================ model model4 global { int nb_people <- 2147; int nb_infected_init <- 5; float step <- 5 #mn; file roads_shapefile <- file("../includes/roads.shp"); file buildings_shapefile <- file("../includes/buildings.shp"); geometry shape <- envelope(roads_shapefile); graph road_network; int nb_people_infected <- nb_infected_init update: people count (each.is_infected); int nb_people_not_infected <- nb_people - nb_infected_init update: nb_people - nb_people_infected; float infected_rate update: nb_people_infected/nb_people; init{ create road from: roads_shapefile; road_network <- as_edge_graph(road); create building from: buildings_shapefile; create people number:nb_people { location <- any_location_in(one_of(building)); } ask nb_infected_init among people { is_infected <- true; } } } species people skills:[moving]{ float speed <- (2 + rnd(3)) #km/#h; bool is_infected <- false; point target; reflex stay when: target = nil { if flip(0.05) { target <- any_location_in (one_of(building)); } } reflex move when: target != nil{ do goto target:target on: road_network; if (location = target) { target <- nil; } } reflex infect when: is_infected{ ask people at_distance 10 #m { if flip(0.05) { is_infected <- true; } } } aspect circle { draw circle(10) color:is_infected ? #red : #green; } aspect geom3D { if target != nil { draw obj_file("../includes/people.obj", 90::{-1,0,0}) size: 5 at: location + {0,0,7} rotate: heading - 90 color: is_infected ? #red : #green; } } } species road { aspect geom { draw shape color: #black; } aspect geom3D { draw line(shape.points, 2.0) color: #black; } } species building { aspect geom { draw shape color: #gray; } aspect geom3D { draw shape depth: 20 #m border: #black texture:["../includes/roof_top.png","../includes/texture.jpg"]; } } experiment main type: gui { parameter "Nb people infected at init" var: nb_infected_init min: 1 max: 2147; output { monitor "Infected people rate" value: infected_rate; display map { species road aspect:geom; species building aspect:geom; species people aspect:circle; } display chart_display refresh: every(10 #cycle) { chart "Disease spreading" type: series { data "susceptible" value: nb_people_not_infected color: #green; data "infected" value: nb_people_infected color: #red; } } display view3D type: opengl ambient_light: 80 { image "../includes/luneray.png" refresh:false; species building aspect:geom3D refresh: false; species road aspect: geom3D refresh: false; species people aspect: geom3D ; } } } ================================================ FILE: samples/GAML/predatorPrey.gaml ================================================ model prey_predator global { int nb_preys_init <- 200; int nb_predators_init <- 20; float prey_max_energy <- 1.0; float prey_max_transfert <- 0.1 ; float prey_energy_consum <- 0.05; float predator_max_energy <- 1.0; float predator_energy_transfert <- 0.5; float predator_energy_consum <- 0.02; float prey_proba_reproduce <- 0.01; int prey_nb_max_offsprings <- 5; float prey_energy_reproduce <- 0.5; float predator_proba_reproduce <- 0.01; int predator_nb_max_offsprings <- 3; float predator_energy_reproduce <- 0.5; file map_init <- image_file("../images/predator_prey_raster_map.png"); int nb_preys -> {length (prey)}; int nb_predators -> {length (predator)}; init { create prey number: nb_preys_init ; create predator number: nb_predators_init ; ask vegetation_cell { color <- rgb (map_init at {grid_x,grid_y}) ; food <- 1 - (((color as list)[0]) / 255) ; foodProd <- food / 100 ; } } reflex save_result when: (nb_preys > 0) and (nb_predators > 0){ save ("cycle: "+ cycle + "; nbPreys: " + nb_preys + "; minEnergyPreys: " + ((prey as list) min_of each.energy) + "; maxSizePreys: " + ((prey as list) max_of each.energy) + "; nbPredators: " + nb_predators + "; minEnergyPredators: " + ((predator as list) min_of each.energy) + "; maxSizePredators: " + ((predator as list) max_of each.energy)) to: "results.txt" type: "text" ; } reflex stop_simulation when: (nb_preys = 0) or (nb_predators = 0) { do halt ; } } species generic_species { float size <- 1.0; rgb color ; float max_energy; float max_transfert; float energy_consum; float proba_reproduce ; float nb_max_offsprings; float energy_reproduce; image_file my_icon; vegetation_cell myCell <- one_of (vegetation_cell) ; float energy <- (rnd(1000) / 1000) * max_energy update: energy - energy_consum max: max_energy ; init { location <- myCell.location; } reflex basic_move { myCell <- choose_cell(); location <- myCell.location; } vegetation_cell choose_cell { return nil; } reflex die when: energy <= 0 { do die ; } reflex reproduce when: (energy >= energy_reproduce) and (flip(proba_reproduce)) { int nb_offsprings <- 1 + rnd(nb_max_offsprings -1); create species(self) number: nb_offsprings { myCell <- myself.myCell ; location <- myCell.location ; energy <- myself.energy / nb_offsprings ; } energy <- energy / nb_offsprings ; } aspect base { draw circle(size) color: color ; } aspect icon { draw my_icon size: 2 * size ; } aspect info { draw square(size) color: color ; draw string(energy with_precision 2) size: 3 color: #black ; } } species prey parent: generic_species { rgb color <- #blue; float max_energy <- prey_max_energy ; float max_transfert <- prey_max_transfert ; float energy_consum <- prey_energy_consum ; float proba_reproduce <- prey_proba_reproduce ; int nb_max_offsprings <- prey_nb_max_offsprings ; float energy_reproduce <- prey_energy_reproduce ; file my_icon <- file("../images/predator_prey_sheep.png") ; reflex eat when: myCell.food > 0 { float energy_transfert <- min([max_transfert, myCell.food]) ; myCell.food <- myCell.food - energy_transfert ; energy <- energy + energy_transfert ; } vegetation_cell choose_cell { return (myCell.neighbors) with_max_of (each.food); } } species predator parent: generic_species { rgb color <- #red ; float max_energy <- predator_max_energy ; float energy_transfert <- predator_energy_transfert ; float energy_consum <- predator_energy_consum ; list reachable_preys update: prey inside (myCell); float proba_reproduce <- predator_proba_reproduce ; int nb_max_offsprings <- predator_nb_max_offsprings ; float energy_reproduce <- predator_energy_reproduce ; file my_icon <- file("../images/predator_prey_wolf.png") ; reflex eat when: ! empty(reachable_preys) { ask one_of (reachable_preys) { do die ; } energy <- energy + energy_transfert ; } vegetation_cell choose_cell { vegetation_cell myCell_tmp <- shuffle(myCell.neighbors) first_with (!(empty (prey inside (each)))); if myCell_tmp != nil { return myCell_tmp; } else { return one_of (myCell.neighbors); } } } grid vegetation_cell width: 50 height: 50 neighbors: 4 { float maxFood <- 1.0 ; float foodProd <- (rnd(1000) / 1000) * 0.01 ; float food <- (rnd(1000) / 1000) max: maxFood update: food + foodProd ; rgb color <- rgb(int(255 * (1 - food)), 255, int(255 * (1 - food))) update: rgb(int(255 * (1 - food)), 255, int(255 *(1 - food))) ; list neighbors <- (self neighbors_at 2); } experiment prey_predator type: gui { parameter "Initial number of preys: " var: nb_preys_init min: 0 max: 1000 category: "Prey" ; parameter "Prey max energy: " var: prey_max_energy category: "Prey" ; parameter "Prey max transfert: " var: prey_max_transfert category: "Prey" ; parameter "Prey energy consumption: " var: prey_energy_consum category: "Prey" ; parameter "Initial number of predators: " var: nb_predators_init min: 0 max: 200 category: "Predator" ; parameter "Predator max energy: " var: predator_max_energy category: "Predator" ; parameter "Predator energy transfert: " var: predator_energy_transfert category: "Predator" ; parameter "Predator energy consumption: " var: predator_energy_consum category: "Predator" ; parameter 'Prey probability reproduce: ' var: prey_proba_reproduce category: 'Prey' ; parameter 'Prey nb max offsprings: ' var: prey_nb_max_offsprings category: 'Prey' ; parameter 'Prey energy reproduce: ' var: prey_energy_reproduce category: 'Prey' ; parameter 'Predator probability reproduce: ' var: predator_proba_reproduce category: 'Predator' ; parameter 'Predator nb max offsprings: ' var: predator_nb_max_offsprings category: 'Predator' ; parameter 'Predator energy reproduce: ' var: predator_energy_reproduce category: 'Predator' ; output { display main_display { grid vegetation_cell lines: #black ; species prey aspect: icon ; species predator aspect: icon ; } display info_display { grid vegetation_cell lines: #black ; species prey aspect: info ; species predator aspect: info ; } display Population_information refresh:every(5#cycles) { chart "Species evolution" type: series size: {1,0.5} position: {0, 0} { data "number_of_preys" value: nb_preys color: #blue ; data "number_of_predator" value: nb_predators color: #red ; } chart "Prey Energy Distribution" type: histogram background: rgb("lightGray") size: {0.5,0.5} position: {0, 0.5} { data "]0;0.25]" value: prey count (each.energy <= 0.25) color:#blue; data "]0.25;0.5]" value: prey count ((each.energy > 0.25) and (each.energy <= 0.5)) color:#blue; data "]0.5;0.75]" value: prey count ((each.energy > 0.5) and (each.energy <= 0.75)) color:#blue; data "]0.75;1]" value: prey count (each.energy > 0.75) color:#blue; } chart "Predator Energy Distribution" type: histogram background: rgb("lightGray") size: {0.5,0.5} position: {0.5, 0.5} { data "]0;0.25]" value: predator count (each.energy <= 0.25) color: #red ; data "]0.25;0.5]" value: predator count ((each.energy > 0.25) and (each.energy <= 0.5)) color: #red ; data "]0.5;0.75]" value: predator count ((each.energy > 0.5) and (each.energy <= 0.75)) color: #red ; data "]0.75;1]" value: predator count (each.energy > 0.75) color: #red; } } monitor "Number of preys" value: nb_preys; monitor "Number of predators" value: nb_predators; } } ================================================ FILE: samples/GAML/roadTraffic.gaml ================================================ model tutorial_gis_city_traffic global { file shape_file_buildings <- file("../includes/building.shp"); file shape_file_roads <- file("../includes/road.shp"); file shape_file_bounds <- file("../includes/bounds.shp"); geometry shape <- envelope(shape_file_bounds); float step <- 10 #mn; int nb_people <- 100; int current_hour update: (time / #hour) mod 24; int min_work_start <- 6; int max_work_start <- 8; int min_work_end <- 16; int max_work_end <- 20; float min_speed <- 1.0 #km / #h; float max_speed <- 5.0 #km / #h; float destroy <- 0.02; int repair_time <- 2 ; graph the_graph; init { create building from: shape_file_buildings with: [type::string(read ("NATURE"))] { if type="Industrial" { color <- #blue ; } } create road from: shape_file_roads ; map weights_map <- road as_map (each:: (each.destruction_coeff * each.shape.perimeter)); the_graph <- as_edge_graph(road) with_weights weights_map; list residential_buildings <- building where (each.type="Residential"); list industrial_buildings <- building where (each.type="Industrial") ; create people number: nb_people { speed <- min_speed + rnd (max_speed - min_speed) ; start_work <- min_work_start + rnd (max_work_start - min_work_start) ; end_work <- min_work_end + rnd (max_work_end - min_work_end) ; living_place <- one_of(residential_buildings) ; working_place <- one_of(industrial_buildings) ; objective <- "resting"; location <- any_location_in (living_place); } } reflex update_graph{ map weights_map <- road as_map (each:: (each.destruction_coeff * each.shape.perimeter)); the_graph <- the_graph with_weights weights_map; } reflex repair_road when: every(repair_time #hour / step) { road the_road_to_repair <- road with_max_of (each.destruction_coeff) ; ask the_road_to_repair { destruction_coeff <- 1.0 ; } } } species building { string type; rgb color <- #gray ; aspect base { draw shape color: color ; } } species road { float destruction_coeff <- 1 + ((rnd(100))/ 100.0) max: 2.0; int colorValue <- int(255*(destruction_coeff - 1)) update: int(255*(destruction_coeff - 1)); rgb color <- rgb(min([255, colorValue]),max ([0, 255 - colorValue]),0) update: rgb(min([255, colorValue]),max ([0, 255 - colorValue]),0) ; aspect base { draw shape color: color ; } } species people skills:[moving] { rgb color <- #yellow ; building living_place <- nil ; building working_place <- nil ; int start_work ; int end_work ; string objective ; point the_target <- nil ; reflex time_to_work when: current_hour = start_work and objective = "resting"{ objective <- "working" ; the_target <- any_location_in (working_place); } reflex time_to_go_home when: current_hour = end_work and objective = "working"{ objective <- "resting" ; the_target <- any_location_in (living_place); } reflex move when: the_target != nil { path path_followed <- self goto [target::the_target, on::the_graph, return_path:: true]; list segments <- path_followed.segments; loop line over: segments { float dist <- line.perimeter; ask road(path_followed agent_from_geometry line) { destruction_coeff <- destruction_coeff + (destroy * dist / shape.perimeter); } } if the_target = location { the_target <- nil ; } } aspect base { draw circle(10) color: color; } } experiment road_traffic type: gui { parameter "Shapefile for the buildings:" var: shape_file_buildings category: "GIS" ; parameter "Shapefile for the roads:" var: shape_file_roads category: "GIS" ; parameter "Shapefile for the bounds:" var: shape_file_bounds category: "GIS" ; parameter "Number of people agents" var: nb_people category: "People" ; parameter "Earliest hour to start work" var: min_work_start category: "People" min: 2 max: 8; parameter "Latest hour to start work" var: max_work_start category: "People" min: 8 max: 12; parameter "Earliest hour to end work" var: min_work_end category: "People" min: 12 max: 16; parameter "Latest hour to end work" var: max_work_end category: "People" min: 16 max: 23; parameter "minimal speed" var: min_speed category: "People" min: 0.1 #km/#h ; parameter "maximal speed" var: max_speed category: "People" max: 10 #km/#h; parameter "Value of destruction when a people agent takes a road" var: destroy category: "Road" ; parameter "Number of hours between two road repairs" var: repair_time category: "Road" ; output { display city_display type:opengl { species building aspect: base ; species road aspect: base ; species people aspect: base ; } display chart_display refresh:every(10#cycles) { chart "Road Status" type: series size: {1, 0.5} position: {0, 0} { data "Mean road destruction" value: mean (road collect each.destruction_coeff) style: line color: #green ; data "Max road destruction" value: road max_of each.destruction_coeff style: line color: #red ; } chart "People Objectif" type: pie style: exploded size: {1, 0.5} position: {0, 0.5}{ data "Working" value: people count (each.objective="working") color: #magenta ; data "Resting" value: people count (each.objective="resting") color: #blue ; } } } } ================================================ FILE: samples/GAMS/transport.gms ================================================ *Basic example of transport model from GAMS model library $Title A Transportation Problem (TRNSPORT,SEQ=1) $Ontext This problem finds a least cost shipping schedule that meets requirements at markets and supplies at factories. Dantzig, G B, Chapter 3.3. In Linear Programming and Extensions. Princeton University Press, Princeton, New Jersey, 1963. This formulation is described in detail in: Rosenthal, R E, Chapter 2: A GAMS Tutorial. In GAMS: A User's Guide. The Scientific Press, Redwood City, California, 1988. The line numbers will not match those in the book because of these comments. $Offtext Sets i canning plants / seattle, san-diego / j markets / new-york, chicago, topeka / ; Parameters a(i) capacity of plant i in cases / seattle 350 san-diego 600 / b(j) demand at market j in cases / new-york 325 chicago 300 topeka 275 / ; Table d(i,j) distance in thousands of miles new-york chicago topeka seattle 2.5 1.7 1.8 san-diego 2.5 1.8 1.4 ; Scalar f freight in dollars per case per thousand miles /90/ ; Parameter c(i,j) transport cost in thousands of dollars per case ; c(i,j) = f * d(i,j) / 1000 ; Variables x(i,j) shipment quantities in cases z total transportation costs in thousands of dollars ; Positive Variable x ; Equations cost define objective function supply(i) observe supply limit at plant i demand(j) satisfy demand at market j ; cost .. z =e= sum((i,j), c(i,j)*x(i,j)) ; supply(i) .. sum(j, x(i,j)) =l= a(i) ; demand(j) .. sum(i, x(i,j)) =g= b(j) ; Model transport /all/ ; Solve transport using lp minimizing z ; Display x.l, x.m ; $ontext #user model library stuff Main topic Basic GAMS Featured item 1 Trnsport model Featured item 2 Featured item 3 Featured item 4 Description Basic example of transport model from GAMS model library $offtext ================================================ FILE: samples/GAP/Magic.gd ================================================ ############################################################################# ## ## Magic.gd AutoDoc package ## ## Copyright 2013, Max Horn, JLU Giessen ## Sebastian Gutsche, University of Kaiserslautern ## ############################################################################# #! @Description #! This is the main function of the &AutoDoc; package. It can perform #! any combination of the following three tasks: #! #! #! It can (re)generate a scaffold for your package manual. #! That is, it can produce two XML files in &GAPDoc; format to be used as part #! of your manual: First, a file named doc/PACKAGENAME.xml #! (with your package's name substituted) which is used as #! main file for the package manual, i.e. this file sets the #! XML DOCTYPE and defines various XML entities, includes #! other XML files (both those generated by &AutoDoc; as well #! as additional files created by other means), tells &GAPDoc; #! to generate a table of content and an index, and more. #! Secondly, it creates a file doc/title.xml containing a title #! page for your documentation, with information about your package #! (name, description, version), its authors and more, based #! on the data in your PackageInfo.g. #! #! #! It can scan your package for &AutoDoc; based documentation (by using &AutoDoc; #! tags and the Autodoc command. #! This will #! produce further XML files to be used as part of the package manual. #! #! #! It can use &GAPDoc; to generate PDF, text and HTML (with #! MathJaX enabled) documentation from the &GAPDoc; XML files it #! generated as well as additional such files provided by you. For #! this, it invokes #! to convert the XML sources, and it also instructs &GAPDoc; to copy #! supplementary files (such as CSS style files) into your doc directory #! (see ). #! #! #! For more information and some examples, please refer to Chapter . #!

    #! The parameters have the following meanings: #! #! #! package_name #! #! The name of the package whose documentation should be(re)generated. #! #! #! #! option_record #! #! option_record can be a record with some additional options. #! The following are currently supported: #! #! dir #! #! This should be a string containing a (relative) path or a #! Directory() object specifying where the package documentation #! (i.e. the &GAPDoc; XML files) are stored. #!
    #! Default value: "doc/". #!
    #! scaffold #! #! This controls whether and how to generate scaffold XML files #! for the main and title page of the package's documentation. #!

    #! The value should be either true, false or a #! record. If it is a record or true (the latter is #! equivalent to specifying an empty record), then this feature is #! enabled. It is also enabled if opt.scaffold is missing but the #! package's info record in PackageInfo.g has an AutoDoc entry. #! In all other cases (in particular if opt.scaffold is #! false), scaffolding is disabled. #!

    #! #! If opt.scaffold is a record, it may contain the following entries. #! #### TODO: mention merging with PackageInfo.AutoDoc! #! #! #! includes #! #! A list of XML files to be included in the body of the main XML file. #! If you specify this list and also are using &AutoDoc; to document #! your operations with &AutoDoc; comments, #! you can add AutoDocMainFile.xml to this list #! to control at which point the documentation produced by &AutoDoc; #! is inserted. If you do not do this, it will be added after the last #! of your own XML files. #! #! #! appendix #! #! This entry is similar to opt.scaffold.includes but is used #! to specify files to include after the main body of the manual, #! i.e. typically appendices. #! #! #! bib #! #! The name of a bibliography file, in Bibtex or XML format. #! If this key is not set, but there is a file doc/PACKAGENAME.bib #! then it is assumed that you want to use this as your bibliography. #! #! #### TODO: The 'entities' param is a bit strange. We should probably change it to be a bit more #### general, as one might want to define other entities... For now, we do not document it #### to leave us the choice of revising how it works. #### #### entities #### #### A list of package names or other entities which are used to define corresponding XML entities. #### For example, if set to a list containing the string SomePackage, #### then the following is added to the XML preamble: ####

    SomePackage'>]]> #### This allows you to write &SomePackage; in your documentation #### to reference that package. If another type of entity is desired, one can simply add, #### instead of a string, add a two entry list a to the list. It will be handled as #### a[ 2 ]'>]]>, #### so please be careful. #### #! #! TitlePage #! #! A record whose entries are used to embellish the generated titlepage #! for the package manual with extra information, such as a copyright #! statement or acknowledgments. To this end, the names of the record #! components are used as XML element names, and the values of the #! components are outputted as content of these XML elements. For #! example, you could pass the following record to set a custom #! acknowledgements text: #! #! For a list of valid entries in the titlepage, please refer to the #! &GAPDoc; manual, specifically section #! and following. #! #! document_class #! #! Sets the document class of the resulting pdf. The value can either be a string #! which has to be the name of the new document class, a list containing this string, or #! a list of two strings. Then the first one has to be the document class name, the second one #! the option string ( contained in [ ] ) in LaTeX. #! #! latex_header_file #! #! Replaces the standard header from &GAPDoc; completely with the header in this LaTeX file. #! Please be careful here, and look at GAPDoc's latexheader.tex file for an example. #! #! gapdoc_latex_options #! #! Must be a record with entries which can be understood by SetGapDocLaTeXOptions. Each entry can be a string, which #! will be given to &GAPDoc; directly, or a list containing of two entries: The first one must be the string "file", #! the second one a filename. This file will be read and then its content is passed to &GAPDoc; as option with the name #! of the entry. #! #! #! #! #! #! #! autodoc #! #! This controls whether and how to generate addition XML documentation files #! by scanning for &AutoDoc; documentation comments. #!

    #! The value should be either true, false or a #! record. If it is a record or true (the latter is #! equivalent to specifying an empty record), then this feature is #! enabled. It is also enabled if opt.autodoc is missing but the #! package depends (directly) on the &AutoDoc; package. #! In all other cases (in particular if opt.autodoc is #! false), this feature is disabled. #!

    #! #! If opt.autodoc is a record, it may contain the following entries. #! #! #! #! files #! #! A list of files (given by paths relative to the package directory) #! to be scanned for &AutoDoc; documentation comments. #! Usually it is more convenient to use autodoc.scan_dirs, see below. #! #! #! scan_dirs #! #! A list of subdirectories of the package directory (given as relative paths) #! which &AutoDoc; then scans for .gi, .gd and .g files; all of these files #! are then scanned for &AutoDoc; documentation comments. #!
    #! Default value: [ "gap", "lib", "examples", "examples/doc" ]. #!
    #! #! level #! #! This defines the level of the created documentation. The default value is 0. #! When parts of the manual are declared with a higher value #! they will not be printed into the manual. #! #! #### TODO: Document section_intros later on. #### However, note that thanks to the new AutoDoc comment syntax, the only remaining #### use for this seems to be the ability to specify the order of chapters and #### sections. #### section_intros #### #### TODO. #### #! #!
    #! #! #! #! gapdoc #! #! This controls whether and how to invoke &GAPDoc; to create HTML, PDF and text #! files from your various XML files. #!

    #! The value should be either true, false or a #! record. If it is a record or true (the latter is #! equivalent to specifying an empty record), then this feature is #! enabled. It is also enabled if opt.gapdoc is missing. #! In all other cases (in particular if opt.gapdoc is #! false), this feature is disabled. #!

    #! #! If opt.gapdoc is a record, it may contain the following entries. #! #! #! #! #### Note: 'main' is strictly speaking also used for the scaffold. #### However, if one uses the scaffolding mechanism, then it is not #### really necessary to specify a custom name for the main XML file. #### Thus, the purpose of this parameter is to cater for packages #### that have existing documentation using a different XML name, #### and which do not wish to use scaffolding. #### #### This explain why we only allow specifying gapdoc.main. #### The scaffolding code will still honor it, though, just in case. #! main #! #! The name of the main XML file of the package manual. #! This exists primarily to support packages with existing manual #! which use a filename here which differs from the default. #! In particular, specifying this is unnecessary when using scaffolding. #!
    #! Default value: PACKAGENAME.xml. #!
    #! #! files #! #! A list of files (given by paths relative to the package directory) #! to be scanned for &GAPDoc; documentation comments. #! Usually it is more convenient to use gapdoc.scan_dirs, see below. #! #! #! scan_dirs #! #! A list of subdirectories of the package directory (given as relative paths) #! which &AutoDoc; then scans for .gi, .gd and .g files; all of these files #! are then scanned for &GAPDoc; documentation comments. #!
    #! Default value: [ "gap", "lib", "examples", "examples/doc" ]. #!
    #! #!
    #! ## This is the maketest part. Still under construction. #! maketest #! #! The maketest item can be true or a record. When it is true, #! a simple maketest.g is created in the main package directory, #! which can be used to test the examples from the manual. As a record, #! the entry can have the following entries itself, to specify some options. #! #! filename #! #! Sets the name of the test file. #! #! commands #! #! A list of strings, each one a command, which #! will be executed at the beginning of the test file. #! #! #! #! #! #! #! #! #! @Returns nothing #! @Arguments package_name[, option_record ] #! @ChapterInfo AutoDoc, The AutoDoc() function DeclareGlobalFunction( "AutoDoc" ); ================================================ FILE: samples/GAP/Magic.gi ================================================ ############################################################################# ## ## Magic.gi AutoDoc package ## ## Copyright 2013, Max Horn, JLU Giessen ## Sebastian Gutsche, University of Kaiserslautern ## ############################################################################# # Check if a string has the given suffix or not. Another # name for this would "StringEndsWithOtherString". # For example, AUTODOC_HasSuffix("file.gi", ".gi") returns # true while AUTODOC_HasSuffix("file.txt", ".gi") returns false. BindGlobal( "AUTODOC_HasSuffix", function(str, suffix) local n, m; n := Length(str); m := Length(suffix); return n >= m and str{[n-m+1..n]} = suffix; end ); # Given a string containing a ".", , return its suffix, # i.e. the bit after the last ".". For example, given "test.txt", # it returns "txt". BindGlobal( "AUTODOC_GetSuffix", function(str) local i; i := Length(str); while i > 0 and str[i] <> '.' do i := i - 1; od; if i < 0 then return ""; fi; return str{[i+1..Length(str)]}; end ); # Check whether the given directory exists, and if not, attempt # to create it. BindGlobal( "AUTODOC_CreateDirIfMissing", function(d) local tmp; if not IsDirectoryPath(d) then tmp := CreateDir(d); # Note: CreateDir is currently undocumented if tmp = fail then Error("Cannot create directory ", d, "\n", "Error message: ", LastSystemError().message, "\n"); return false; fi; fi; return true; end ); # Scan the given (by name) subdirs of a package dir for # files with one of the given extensions, and return the corresponding # filenames, as relative paths (relative to the package dir). # # For example, the invocation # AUTODOC_FindMatchingFiles("AutoDoc", [ "gap/" ], [ "gi", "gd" ]); # might return a list looking like # [ "gap/AutoDocMainFunction.gd", "gap/AutoDocMainFunction.gi", ... ] BindGlobal( "AUTODOC_FindMatchingFiles", function (pkg, subdirs, extensions) local d_rel, d, tmp, files, result; result := []; for d_rel in subdirs do # Get the absolute path to the directory in side the package... d := DirectoriesPackageLibrary( pkg, d_rel ); if IsEmpty( d ) then continue; fi; d := d[1]; # ... but also keep the relative path (such as "gap") d_rel := Directory( d_rel ); files := DirectoryContents( d ); Sort( files ); for tmp in files do if not AUTODOC_GetSuffix( tmp ) in [ "g", "gi", "gd", "autodoc" ] then continue; fi; if not IsReadableFile( Filename( d, tmp ) ) then continue; fi; Add( result, Filename( d_rel, tmp ) ); od; od; return result; end ); # AutoDoc(pkg[, opt]) # ## Make this function callable with the package_name AutoDocWorksheet. ## Which will then create a worksheet! InstallGlobalFunction( AutoDoc, function( arg ) local pkg, package_info, opt, scaffold, gapdoc, maketest, autodoc, pkg_dir, doc_dir, doc_dir_rel, d, tmp, title_page, tree, is_worksheet, position_document_class, i, gapdoc_latex_option_record; pkg := arg[1]; if LowercaseString( pkg ) = "autodocworksheet" then is_worksheet := true; package_info := rec( ); pkg_dir := DirectoryCurrent( ); else is_worksheet := false; package_info := PackageInfo( pkg )[ 1 ]; pkg_dir := DirectoriesPackageLibrary( pkg, "" )[1]; fi; if Length(arg) >= 2 then opt := arg[2]; else opt := rec(); fi; # Check for certain user supplied options, and if present, add them # to the opt record. tmp := function( key ) local val; val := ValueOption( key ); if val <> fail then opt.(key) := val; fi; end; tmp( "dir" ); tmp( "scaffold" ); tmp( "autodoc" ); tmp( "gapdoc" ); tmp( "maketest" ); # # Setup the output directory # if not IsBound( opt.dir ) then doc_dir := "doc"; elif IsString( opt.dir ) or IsDirectory( opt.dir ) then doc_dir := opt.dir; else Error( "opt.dir must be a string containing a path, or a directory object" ); fi; if IsString( doc_dir ) then # Record the relative version of the path doc_dir_rel := Directory( doc_dir ); # We intentionally do not use # DirectoriesPackageLibrary( pkg, "doc" ) # because it returns an empty list if the subdirectory is missing. # But we want to handle that case by creating the directory. doc_dir := Filename(pkg_dir, doc_dir); doc_dir := Directory(doc_dir); else # TODO: doc_dir_rel = ... ? fi; # Ensure the output directory exists, create it if necessary AUTODOC_CreateDirIfMissing(Filename(doc_dir, "")); # Let the developer know where we are generating the documentation. # This helps diagnose problems where multiple instances of a package # are visible to GAP and the wrong one is used for generating the # documentation. # TODO: Using Info() instead of Print? Print( "Generating documentation in ", doc_dir, "\n" ); # # Extract scaffolding settings, which can be controlled via # opt.scaffold or package_info.AutoDoc. The former has precedence. # if not IsBound(opt.scaffold) then # Default: enable scaffolding if and only if package_info.AutoDoc is present if IsBound( package_info.AutoDoc ) then scaffold := rec( ); fi; elif IsRecord(opt.scaffold) then scaffold := opt.scaffold; elif IsBool(opt.scaffold) then if opt.scaffold = true then scaffold := rec(); fi; else Error("opt.scaffold must be a bool or a record"); fi; # Merge package_info.AutoDoc into scaffold if IsBound(scaffold) and IsBound( package_info.AutoDoc ) then AUTODOC_APPEND_RECORD_WRITEONCE( scaffold, package_info.AutoDoc ); fi; if IsBound( scaffold ) then AUTODOC_WriteOnce( scaffold, "TitlePage", true ); AUTODOC_WriteOnce( scaffold, "MainPage", true ); fi; # # Extract AutoDoc settings # if not IsBound(opt.autodoc) and not is_worksheet then # Enable AutoDoc support if the package depends on AutoDoc. tmp := Concatenation( package_info.Dependencies.NeededOtherPackages, package_info.Dependencies.SuggestedOtherPackages ); if ForAny( tmp, x -> LowercaseString(x[1]) = "autodoc" ) then autodoc := rec(); fi; elif IsRecord(opt.autodoc) then autodoc := opt.autodoc; elif IsBool(opt.autodoc) and opt.autodoc = true then autodoc := rec(); fi; if IsBound(autodoc) then if not IsBound( autodoc.files ) then autodoc.files := [ ]; fi; if not IsBound( autodoc.scan_dirs ) and not is_worksheet then autodoc.scan_dirs := [ "gap", "lib", "examples", "examples/doc" ]; elif not IsBound( autodoc.scan_dirs ) and is_worksheet then autodoc.scan_dirs := [ ]; fi; if not IsBound( autodoc.level ) then autodoc.level := 0; fi; PushOptions( rec( level_value := autodoc.level ) ); if not is_worksheet then Append( autodoc.files, AUTODOC_FindMatchingFiles(pkg, autodoc.scan_dirs, [ "g", "gi", "gd" ]) ); fi; fi; # # Extract GAPDoc settings # if not IsBound( opt.gapdoc ) then # Enable GAPDoc support by default gapdoc := rec(); elif IsRecord( opt.gapdoc ) then gapdoc := opt.gapdoc; elif IsBool( opt.gapdoc ) and opt.gapdoc = true then gapdoc := rec(); fi; # # Extract test settings # if IsBound( opt.maketest ) then if IsRecord( opt.maketest ) then maketest := opt.maketest; elif opt.maketest = true then maketest := rec( ); fi; fi; if IsBound( gapdoc ) then if not IsBound( gapdoc.main ) then gapdoc.main := pkg; fi; # FIXME: the following may break if a package uses more than one book if IsBound( package_info.PackageDoc ) and IsBound( package_info.PackageDoc[1].BookName ) then gapdoc.bookname := package_info.PackageDoc[1].BookName; elif not is_worksheet then # Default: book name = package name gapdoc.bookname := pkg; Print("\n"); Print("WARNING: PackageInfo.g is missing a PackageDoc entry!\n"); Print("Without this, your package manual will not be recognized by the GAP help system.\n"); Print("You can correct this by adding the following to your PackageInfo.g:\n"); Print("PackageDoc := rec(\n"); Print(" BookName := ~.PackageName,\n"); #Print(" BookName := \"", pkg, "\",\n"); Print(" ArchiveURLSubset := [\"doc\"],\n"); Print(" HTMLStart := \"doc/chap0.html\",\n"); Print(" PDFFile := \"doc/manual.pdf\",\n"); Print(" SixFile := \"doc/manual.six\",\n"); Print(" LongTitle := ~.Subtitle,\n"); Print("),\n"); Print("\n"); fi; if not IsBound( gapdoc.files ) then gapdoc.files := []; fi; if not IsBound( gapdoc.scan_dirs ) and not is_worksheet then gapdoc.scan_dirs := [ "gap", "lib", "examples", "examples/doc" ]; fi; if not is_worksheet then Append( gapdoc.files, AUTODOC_FindMatchingFiles(pkg, gapdoc.scan_dirs, [ "g", "gi", "gd" ]) ); fi; # Attempt to weed out duplicates as they may confuse GAPDoc (this # won't work if there are any non-normalized paths in the list). gapdoc.files := Set( gapdoc.files ); # Convert the file paths in gapdoc.files, which are relative to # the package directory, to paths which are relative to the doc directory. # For this, we assume that doc_dir_rel is normalized (e.g. # it does not contains '//') and relative. d := Number( Filename( doc_dir_rel, "" ), x -> x = '/' ); d := Concatenation( ListWithIdenticalEntries(d, "../") ); gapdoc.files := List( gapdoc.files, f -> Concatenation( d, f ) ); fi; # read tree # FIXME: shouldn't tree be declared inside of an 'if IsBound(autodoc)' section? tree := DocumentationTree( ); if IsBound( autodoc ) then if IsBound( autodoc.section_intros ) then AUTODOC_PROCESS_INTRO_STRINGS( autodoc.section_intros : Tree := tree ); fi; AutoDocScanFiles( autodoc.files : PackageName := pkg, Tree := tree ); fi; if is_worksheet then # FIXME: We use scaffold and autodoc here without checking whether # they are bound. Does that mean worksheets always use them? if IsRecord( scaffold.TitlePage ) and IsBound( scaffold.TitlePage.Title ) then pkg := scaffold.TitlePage.Title; elif IsBound( tree!.TitlePage.Title ) then pkg := tree!.TitlePage.Title; elif IsBound( autodoc.files ) and Length( autodoc.files ) > 0 then pkg := autodoc.files[ 1 ]; while Position( pkg, '/' ) <> fail do Remove( pkg, 1 ); od; while Position( pkg, '.' ) <> fail do Remove( pkg, Length( pkg ) ); od; else Error( "could not figure out a title." ); fi; if not IsString( pkg ) then pkg := JoinStringsWithSeparator( pkg, " " ); fi; gapdoc.main := ReplacedString( pkg, " ", "_" ); gapdoc.bookname := ReplacedString( pkg, " ", "_" ); fi; # # Generate scaffold # gapdoc_latex_option_record := rec( ); if IsBound( scaffold ) then ## Syntax is [ "class", [ "options" ] ] if IsBound( scaffold.document_class ) then position_document_class := PositionSublist( GAPDoc2LaTeXProcs.Head, "documentclass" ); if IsString( scaffold.document_class ) then scaffold.document_class := [ scaffold.document_class ]; fi; if position_document_class = fail then Error( "something is wrong with the LaTeX header" ); fi; GAPDoc2LaTeXProcs.Head := Concatenation( GAPDoc2LaTeXProcs.Head{[ 1 .. PositionSublist( GAPDoc2LaTeXProcs.Head, "{", position_document_class ) ]}, scaffold.document_class[ 1 ], GAPDoc2LaTeXProcs.Head{[ PositionSublist( GAPDoc2LaTeXProcs.Head, "}", position_document_class ) .. Length( GAPDoc2LaTeXProcs.Head ) ]} ); if Length( scaffold.document_class ) = 2 then GAPDoc2LaTeXProcs.Head := Concatenation( GAPDoc2LaTeXProcs.Head{[ 1 .. PositionSublist( GAPDoc2LaTeXProcs.Head, "[", position_document_class ) ]}, scaffold.document_class[ 2 ], GAPDoc2LaTeXProcs.Head{[ PositionSublist( GAPDoc2LaTeXProcs.Head, "]", position_document_class ) .. Length( GAPDoc2LaTeXProcs.Head ) ]} ); fi; fi; if IsBound( scaffold.latex_header_file ) then GAPDoc2LaTeXProcs.Head := StringFile( scaffold.latex_header_file ); fi; if IsBound( scaffold.gapdoc_latex_options ) then if IsRecord( scaffold.gapdoc_latex_options ) then for i in RecNames( scaffold.gapdoc_latex_options ) do if not IsString( scaffold.gapdoc_latex_options.( i ) ) and IsList( scaffold.gapdoc_latex_options.( i ) ) and LowercaseString( scaffold.gapdoc_latex_options.( i )[ 1 ] ) = "file" then scaffold.gapdoc_latex_options.( i ) := StringFile( scaffold.gapdoc_latex_options.( i )[ 2 ] ); fi; od; gapdoc_latex_option_record := scaffold.gapdoc_latex_options; fi; fi; if not IsBound( scaffold.includes ) then scaffold.includes := [ ]; fi; if IsBound( autodoc ) then # If scaffold.includes is already set, then we add # AutoDocMainFile.xml to it, but *only* if it not already # there. This way, package authors can control where # it is put in their includes list. if not "AutoDocMainFile.xml" in scaffold.includes then Add( scaffold.includes, "AutoDocMainFile.xml" ); fi; fi; if IsBound( scaffold.bib ) and IsBool( scaffold.bib ) then if scaffold.bib = true then scaffold.bib := Concatenation( pkg, ".bib" ); else Unbind( scaffold.bib ); fi; elif not IsBound( scaffold.bib ) then # If there is a doc/PKG.bib file, assume that we want to reference it in the scaffold. if IsReadableFile( Filename( doc_dir, Concatenation( pkg, ".bib" ) ) ) then scaffold.bib := Concatenation( pkg, ".bib" ); fi; fi; AUTODOC_WriteOnce( scaffold, "index", true ); if IsBound( gapdoc ) then if AUTODOC_GetSuffix( gapdoc.main ) = "xml" then scaffold.main_xml_file := gapdoc.main; else scaffold.main_xml_file := Concatenation( gapdoc.main, ".xml" ); fi; fi; # TODO: It should be possible to only rebuild the title page. (Perhaps also only the main page? but this is less important) if IsBound( scaffold.TitlePage ) then if IsRecord( scaffold.TitlePage ) then title_page := scaffold.TitlePage; else title_page := rec( ); fi; AUTODOC_WriteOnce( title_page, "dir", doc_dir ); AUTODOC_APPEND_RECORD_WRITEONCE( title_page, tree!.TitlePage ); if not is_worksheet then AUTODOC_APPEND_RECORD_WRITEONCE( title_page, ExtractTitleInfoFromPackageInfo( pkg ) ); fi; CreateTitlePage( title_page ); fi; if IsBound( scaffold.MainPage ) and scaffold.MainPage <> false then scaffold.dir := doc_dir; scaffold.book_name := pkg; CreateMainPage( scaffold ); fi; fi; # # Run AutoDoc # if IsBound( autodoc ) then WriteDocumentation( tree, doc_dir ); fi; # # Run GAPDoc # if IsBound( gapdoc ) then # Ask GAPDoc to use UTF-8 as input encoding for LaTeX, as the XML files # of the documentation are also in UTF-8 encoding, and may contain characters # not contained in the default Latin 1 encoding. SetGapDocLaTeXOptions( "utf8", gapdoc_latex_option_record ); MakeGAPDocDoc( doc_dir, gapdoc.main, gapdoc.files, gapdoc.bookname, "MathJax" ); CopyHTMLStyleFiles( Filename( doc_dir, "" ) ); # The following (undocumented) API is there for compatibility # with old-style gapmacro.tex based package manuals. It # produces a manual.lab file which those packages can use if # they wish to link to things in the manual we are currently # generating. This can probably be removed eventually, but for # now, doing it does not hurt. # FIXME: It seems that this command does not work if pdflatex # is not present. Maybe we should remove it. if not is_worksheet then GAPDocManualLab( pkg ); fi; fi; if IsBound( maketest ) then AUTODOC_WriteOnce( maketest, "filename", "maketest.g" ); AUTODOC_WriteOnce( maketest, "folder", pkg_dir ); AUTODOC_WriteOnce( maketest, "scan_dir", doc_dir ); AUTODOC_WriteOnce( maketest, "files_to_scan", gapdoc.files ); if IsString( maketest.folder ) then maketest.folder := Directory( maketest.folder ); fi; if IsString( maketest.scan_dir ) then maketest.scan_dir := Directory( maketest.scan_dir ); fi; AUTODOC_WriteOnce( maketest, "commands", [ ] ); AUTODOC_WriteOnce( maketest, "book_name", gapdoc.main ); CreateMakeTest( maketest ); fi; return true; end ); ================================================ FILE: samples/GAP/PackageInfo.g ================================================ ############################################################################# ## ## PackageInfo.g for the package `cvec' Max Neunhoeffer ## ## (created from Frank Lübeck's PackageInfo.g template file) ## SetPackageInfo( rec( PackageName := "cvec", Subtitle := "Compact vectors over finite fields", Version := "2.5.1", Date := "04/04/2014", # dd/mm/yyyy format ## Information about authors and maintainers. Persons := [ rec( LastName := "Neunhoeffer", FirstNames := "Max", IsAuthor := true, IsMaintainer := false, Email := "neunhoef@mcs.st-and.ac.uk", WWWHome := "http://www-groups.mcs.st-and.ac.uk/~neunhoef/", PostalAddress := Concatenation( [ "School of Mathematics and Statistics\n", "University of St Andrews\n", "Mathematical Institute\n", "North Haugh\n", "St Andrews, Fife KY16 9SS\n", "Scotland, UK" ] ), Place := "St Andrews", Institution := "University of St Andrews" ), ], ## Status information. Currently the following cases are recognized: ## "accepted" for successfully refereed packages ## "deposited" for packages for which the GAP developers agreed ## to distribute them with the core GAP system ## "dev" for development versions of packages ## "other" for all other packages ## # Status := "accepted", Status := "deposited", ## You must provide the next two entries if and only if the status is ## "accepted" because is was successfully refereed: # format: 'name (place)' # CommunicatedBy := "Mike Atkinson (St. Andrews)", #CommunicatedBy := "", # format: mm/yyyy # AcceptDate := "08/1999", #AcceptDate := "", PackageWWWHome := "http://neunhoef.github.io/cvec/", README_URL := Concatenation(~.PackageWWWHome, "README"), PackageInfoURL := Concatenation(~.PackageWWWHome, "PackageInfo.g"), ArchiveURL := Concatenation("https://github.com/neunhoef/cvec/", "releases/download/v", ~.Version, "/cvec-", ~.Version), ArchiveFormats := ".tar.gz .tar.bz2", ## Here you must provide a short abstract explaining the package content ## in HTML format (used on the package overview Web page) and an URL ## for a Webpage with more detailed information about the package ## (not more than a few lines, less is ok): ## Please, use 'GAP' and ## 'MyPKG' for specifing package names. ## AbstractHTML := "This package provides an implementation of compact vectors over finite\ fields. Contrary to earlier implementations no table lookups are used\ but only word-based processor arithmetic. This allows for bigger finite\ fields and higher speed.", PackageDoc := rec( BookName := "cvec", ArchiveURLSubset := ["doc"], HTMLStart := "doc/chap0.html", PDFFile := "doc/manual.pdf", SixFile := "doc/manual.six", LongTitle := "Compact vectors over finite fields", ), Dependencies := rec( GAP := ">=4.5.5", NeededOtherPackages := [ ["GAPDoc", ">= 1.2"], ["IO", ">= 4.1"], ["orb", ">= 4.2"], ], SuggestedOtherPackages := [], ExternalConditions := [] ), AvailabilityTest := function() if not "cvec" in SHOW_STAT() and Filename(DirectoriesPackagePrograms("cvec"), "cvec.so") = fail then #Info(InfoWarning, 1, "cvec: kernel cvec functions not available."); return fail; fi; return true; end, ## *Optional*, but recommended: path relative to package root to a file which ## contains as many tests of the package functionality as sensible. #TestFile := "tst/testall.g", ## *Optional*: Here you can list some keyword related to the topic ## of the package. Keywords := [] )); ================================================ FILE: samples/GAP/bugfix.tst ================================================ gap> START_TEST("Test for various former bugs"); gap> # The following used to trigger an error starting with: gap> # "SolutionMat: matrix and vector incompatible called from" gap> K:=AbelianPcpGroup([3,3,3]);; gap> A:=Subgroup(K,[K.1]);; gap> cr:=CRRecordBySubgroup(K,A);; gap> ExtensionsCR(cr);; # Comparing homomorphisms used to be broken gap> K:=AbelianPcpGroup(1,[3]);; gap> hom1:=GroupHomomorphismByImages(K,K,[K.1],[K.1]);; gap> hom2:=GroupHomomorphismByImages(K,K,[K.1^2],[K.1^2]);; gap> hom1=hom2; true gap> hom1=IdentityMapping(K); true gap> hom2=IdentityMapping(K); true gap> # The following incorrectly triggered an error at some point gap> IsTorsionFree(ExamplesOfSomePcpGroups(5)); true gap> # Verify IsGeneratorsOfMagmaWithInverses warnings are silenced gap> IsGeneratorsOfMagmaWithInverses(GeneratorsOfGroup(ExamplesOfSomePcpGroups(5))); true gap> # Check for a bug reported 2012-01-19 by Robert Morse gap> g := PcGroupToPcpGroup(SmallGroup(48,1)); Pcp-group with orders [ 2, 2, 2, 2, 3 ] gap> # The next two commands used to trigger errors gap> NonAbelianTensorSquare(Centre(g)); Pcp-group with orders [ 8 ] gap> NonAbelianExteriorSquare(Centre(g)); Pcp-group with orders [ ] gap> # Check for a bug reported 2012-01-19 by Robert Morse gap> F := FreeGroup("x","y"); gap> x := F.1;; y := F.2;; gap> G := F/[x^2/y^24, y^24, y^x/y^23]; gap> iso := IsomorphismPcGroup(G); [ x, y ] -> [ f1, f2*f5 ] gap> iso1 := IsomorphismPcpGroup(Image(iso)); [ f1, f2, f3, f4, f5 ] -> [ g1, g2, g3, g4, g5 ] gap> G := Image(iso*iso1); Pcp-group with orders [ 2, 2, 2, 2, 3 ] gap> # The next command used to trigger an error gap> NonAbelianTensorSquare(Image(iso*iso1)); Pcp-group with orders [ 2, 2, 3, 2, 2, 2, 2 ] gap> # The problem with the previous example is/was that Igs(G) gap> # is set to a non-standard value: gap> Igs(G); [ g1, g2*g5, g3*g4*g5^2, g4*g5, g5 ] gap> # Unfortunately, it seems that a lot of code that gap> # really should be using Ngs or Cgs is using Igs incorrectly. gap> # For example, direct products could return *invalid* embeddings: gap> D := DirectProduct(G, G); Pcp-group with orders [ 2, 2, 2, 2, 3, 2, 2, 2, 2, 3 ] gap> hom:=Embedding(D,1);; gap> mapi:=MappingGeneratorsImages(hom);; gap> GroupHomomorphismByImages(Source(hom),Range(hom),mapi[1],mapi[2]) <> fail; true gap> hom:=Projection(D,1);; gap> mapi:=MappingGeneratorsImages(hom);; gap> GroupHomomorphismByImages(Source(hom),Range(hom),mapi[1],mapi[2]) <> fail; true gap> # Check for bug computing Schur extension of infinite cyclic groups, gap> # found by Max Horn 2012-05-25 gap> G:=AbelianPcpGroup(1,[0]); Pcp-group with orders [ 0 ] gap> # The next command used to trigger an error gap> SchurExtension(G); Pcp-group with orders [ 0 ] gap> # Check for bug computing Schur extensions of subgroups, found by MH 2012-05-25. gap> G:=HeisenbergPcpGroup(2); Pcp-group with orders [ 0, 0, 0, 0, 0 ] gap> H:=Subgroup(G,[G.2^3*G.3^2, G.1^9]); Pcp-group with orders [ 0, 0, 0 ] gap> # The next command used to trigger an error gap> SchurExtension(H); Pcp-group with orders [ 0, 0, 0, 0, 0, 0 ] gap> # Check for bug computing Schur extensions of subgroups, found by MH 2012-05-25. gap> G:=HeisenbergPcpGroup(2); Pcp-group with orders [ 0, 0, 0, 0, 0 ] gap> H:=Subgroup(G,[G.1, G.2]); Pcp-group with orders [ 0, 0 ] gap> # The next command used to trigger an error gap> SchurExtension(H); Pcp-group with orders [ 0, 0, 0 ] gap> # Check for bug computing normalizer of two subgroups, found by MH 2012-05-30. gap> # The problem was caused by incorrect resp. overly restrictive use of Parent(). gap> G:=HeisenbergPcpGroup(2); Pcp-group with orders [ 0, 0, 0, 0, 0 ] gap> A:=Subgroup(Subgroup(G,[G.2,G.3,G.4,G.5]), [G.3]); Pcp-group with orders [ 0 ] gap> B:=Subgroup(Subgroup(G,[G.1,G.4,G.5]), [G.4]); Pcp-group with orders [ 0 ] gap> Normalizer(A,B); Pcp-group with orders [ 0 ] gap> # The following used to trigger the error "arguments must have a common parent group" gap> Normalizer(B,A); Pcp-group with orders [ 0 ] gap> # In polycyclic 2.9 and 2.10, the code for 2-cohomology computations was broken. gap> G := UnitriangularPcpGroup(3,0); Pcp-group with orders [ 0, 0, 0 ] gap> mats := G!.mats; [ [ [ 1, 1, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ], [ [ 1, 0, 0 ], [ 0, 1, 1 ], [ 0, 0, 1 ] ], [ [ 1, 0, 1 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ] gap> C := CRRecordByMats(G,mats);; gap> cc := TwoCohomologyCR(C);; gap> cc.factor.rels; [ 2, 0, 0 ] gap> c := cc.factor.prei[2]; [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1 ] gap> cc.gcb; [ [ 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, -1, 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 ], [ -1, 0, 1, 1, 0, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0 ], [ 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, -1, 0, 0, 1 ] ] gap> cc.gcc; [ [ 1, 0, 0, 0, 0, -2, -1, 0, 1, 1, -1, -1, 0, 0, 0, 0, 0, 0 ], [ 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 1, 0, 0, -2, 0, 0, 1, 0, 0, -1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 1, 0, 0, -1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 1, 0, 0, -1, 0, 0, 1, 0, 0, 0, 0, 0, 0 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1, 1 ], [ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, -1 ] ] gap> # LowerCentralSeriesOfGroup for non-nilpotent pcp-groups used to trigger gap> # an infinite recursion gap> G := PcGroupToPcpGroup(SmallGroup(6,1)); Pcp-group with orders [ 2, 3 ] gap> LowerCentralSeriesOfGroup(G); [ Pcp-group with orders [ 2, 3 ], Pcp-group with orders [ 3 ] ] gap> STOP_TEST( "bugfix.tst", 10000000); ================================================ FILE: samples/GAP/example.gd ================================================ ############################################################################# ## #W example.gd ## ## This file contains a sample of a GAP declaration file. ## DeclareProperty( "SomeProperty", IsLeftModule ); DeclareGlobalFunction( "SomeGlobalFunction" ); ############################################################################# ## #C IsQuuxFrobnicator() ## ## ## ## ## ## Tests whether R is a quux frobnicator. ## ## ## DeclareSynonym( "IsQuuxFrobnicator", IsField and IsGroup ); ================================================ FILE: samples/GAP/example.gi ================================================ ############################################################################# ## #W example.gd ## ## This file contains a sample of a GAP implementation file. ## ############################################################################# ## #M SomeOperation( ) ## ## performs some operation on ## InstallMethod( SomeProperty, "for left modules", [ IsLeftModule ], 0, function( M ) if IsFreeLeftModule( M ) and not IsTrivial( M ) then return true; fi; TryNextMethod(); end ); ############################################################################# ## #F SomeGlobalFunction( ) ## ## A global variadic funfion. ## InstallGlobalFunction( SomeGlobalFunction, function( arg ) if Length( arg ) = 3 then return arg[1] + arg[2] * arg[3]; elif Length( arg ) = 2 then return arg[1] - arg[2] else Error( "usage: SomeGlobalFunction( , [, ] )" ); fi; end ); # # A plain function. # SomeFunc := function(x, y) local z, func, tmp, j; z := x * 1.0; y := 17^17 - y; func := a -> a mod 5; tmp := List( [1..50], func ); while y > 0 do for j in tmp do Print(j, "\n"); od; repeat y := y - 1; until 0 < 1; y := y -1; od; return z; end; ================================================ FILE: samples/GAP/factor.tst ================================================ gap> START_TEST("Test of factor groups and natural homomorphisms"); gap> G:=HeisenbergPcpGroup(2); Pcp-group with orders [ 0, 0, 0, 0, 0 ] gap> H:=Subgroup(G,[G.2,G.3,G.4,G.5]); gap> K:=G/H; gap> NaturalHomomorphism(K); gap> A:=Subgroup(H, [G.3]); Pcp-group with orders [ 0 ] gap> B:=Subgroup(Subgroup(G,[G.1,G.4,G.5]), [G.4]); Pcp-group with orders [ 0 ] gap> Normalizer(A,B); Pcp-group with orders [ 0 ] gap> # The following used to trigger the error "arguments must have a common parent group" gap> Normalizer(B,A); Pcp-group with orders [ 0 ] gap> STOP_TEST( "factor.tst", 10000000); ================================================ FILE: samples/GAP/vspc.gd ================================================ ############################################################################# ## #W vspc.gd GAP library Thomas Breuer ## ## #Y Copyright (C) 1997, Lehrstuhl D für Mathematik, RWTH Aachen, Germany #Y (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland #Y Copyright (C) 2002 The GAP Group ## ## This file declares the operations for vector spaces. ## ## The operations for bases of free left modules can be found in the file ## lib/basis.gd. ## ############################################################################# ## #C IsLeftOperatorRing() ## ## ## ## ## ## ## ## DeclareSynonym( "IsLeftOperatorRing", IsLeftOperatorAdditiveGroup and IsRing and IsAssociativeLOpDProd ); #T really? ############################################################################# ## #C IsLeftOperatorRingWithOne() ## ## ## ## ## ## ## ## DeclareSynonym( "IsLeftOperatorRingWithOne", IsLeftOperatorAdditiveGroup and IsRingWithOne and IsAssociativeLOpDProd ); #T really? ############################################################################# ## #C IsLeftVectorSpace( ) #C IsVectorSpace( ) ## ## <#GAPDoc Label="IsLeftVectorSpace"> ## ## ## ## ## ## A vector space in &GAP; is a free left module ## (see ) over a division ring ## (see Chapter ). ##

    ## Whenever we talk about an F-vector space V then V is ## an additive group (see ) on which the ## division ring F acts via multiplication from the left such that ## this action and the addition in V are left and right distributive. ## The division ring F can be accessed as value of the attribute ## . ##

    ## Vector spaces in &GAP; are always left vector spaces, ## and are ## synonyms. ## ## ## <#/GAPDoc> ## DeclareSynonym( "IsLeftVectorSpace", IsLeftModule and IsLeftActedOnByDivisionRing ); DeclareSynonym( "IsVectorSpace", IsLeftVectorSpace ); InstallTrueMethod( IsFreeLeftModule, IsLeftModule and IsLeftActedOnByDivisionRing ); ############################################################################# ## #F IsGaussianSpace( ) ## ## <#GAPDoc Label="IsGaussianSpace"> ## ## ## ## ## The filter (see ) ## for the row space (see ) ## or matrix space (see ) V ## over the field F, say, ## indicates that the entries of all row vectors or matrices in V, ## respectively, are all contained in F. ## In this case, V is called a Gaussian vector space. ## Bases for Gaussian spaces can be computed using Gaussian elimination for ## a given list of vector space generators. ## mats:= [ [[1,1],[2,2]], [[3,4],[0,1]] ];; ## gap> V:= VectorSpace( Rationals, mats );; ## gap> IsGaussianSpace( V ); ## true ## gap> mats[1][1][1]:= E(4);; # an element in an extension field ## gap> V:= VectorSpace( Rationals, mats );; ## gap> IsGaussianSpace( V ); ## false ## gap> V:= VectorSpace( Field( Rationals, [ E(4) ] ), mats );; ## gap> IsGaussianSpace( V ); ## true ## ]]> ## ## ## <#/GAPDoc> ## DeclareFilter( "IsGaussianSpace", IsVectorSpace ); InstallTrueMethod( IsGaussianSpace, IsVectorSpace and IsFullMatrixModule ); InstallTrueMethod( IsGaussianSpace, IsVectorSpace and IsFullRowModule ); ############################################################################# ## #C IsDivisionRing( ) ## ## <#GAPDoc Label="IsDivisionRing"> ## ## ## ## ## A division ring in &GAP; is a nontrivial associative algebra ## D with a multiplicative inverse for each nonzero element. ## In &GAP; every division ring is a vector space over a division ring ## (possibly over itself). ## Note that being a division ring is thus not a property that a ring can ## get, because a ring is usually not represented as a vector space. ##

    ## The field of coefficients is stored as the value of the attribute ## of D. ## ## ## <#/GAPDoc> ## DeclareSynonymAttr( "IsDivisionRing", IsMagmaWithInversesIfNonzero and IsLeftOperatorRingWithOne and IsLeftVectorSpace and IsNonTrivial and IsAssociative and IsEuclideanRing ); ############################################################################# ## #A GeneratorsOfLeftVectorSpace( ) #A GeneratorsOfVectorSpace( ) ## ## <#GAPDoc Label="GeneratorsOfLeftVectorSpace"> ## ## ## ## ## ## For an F-vector space V, ## returns a list of vectors in ## V that generate V as an F-vector space. ## GeneratorsOfVectorSpace( FullRowSpace( Rationals, 3 ) ); ## [ [ 1, 0, 0 ], [ 0, 1, 0 ], [ 0, 0, 1 ] ] ## ]]> ## ## ## <#/GAPDoc> ## DeclareSynonymAttr( "GeneratorsOfLeftVectorSpace", GeneratorsOfLeftOperatorAdditiveGroup ); DeclareSynonymAttr( "GeneratorsOfVectorSpace", GeneratorsOfLeftOperatorAdditiveGroup ); ############################################################################# ## #A CanonicalBasis( ) ## ## <#GAPDoc Label="CanonicalBasis"> ## ## ## ## ## If the vector space V supports a canonical basis then ## returns this basis, ## otherwise fail is returned. ##

    ## The defining property of a canonical basis is that its vectors are ## uniquely determined by the vector space. ## If canonical bases exist for two vector spaces over the same left acting ## domain (see ) then the equality of ## these vector spaces can be decided by comparing the canonical bases. ##

    ## The exact meaning of a canonical basis depends on the type of V. ## Canonical bases are defined for example for Gaussian row and matrix ## spaces (see ). ##

    ## If one designs a new kind of vector spaces ## (see ) and ## defines a canonical basis for these spaces then the ## method one installs ## (see ) ## must not call . ## On the other hand, one probably should install a ## method that simply calls , ## the value of the method ## (see  and ## ) ## being CANONICAL_BASIS_FLAGS. ## vecs:= [ [ 1, 2, 3 ], [ 1, 1, 1 ], [ 1, 1, 1 ] ];; ## gap> V:= VectorSpace( Rationals, vecs );; ## gap> B:= CanonicalBasis( V ); ## CanonicalBasis( ) ## gap> BasisVectors( B ); ## [ [ 1, 0, -1 ], [ 0, 1, 2 ] ] ## ]]> ## ## ## <#/GAPDoc> ## DeclareAttribute( "CanonicalBasis", IsFreeLeftModule ); ############################################################################# ## #F IsRowSpace( ) ## ## <#GAPDoc Label="IsRowSpace"> ## ## ## ## ## A row space in &GAP; is a vector space that consists of ## row vectors (see Chapter ). ## ## ## <#/GAPDoc> ## DeclareSynonym( "IsRowSpace", IsRowModule and IsVectorSpace ); ############################################################################# ## #F IsGaussianRowSpace( ) ## ## ## ## ## ## A row space is Gaussian if the left acting domain contains all ## scalars that occur in the vectors. ## Thus one can use Gaussian elimination in the calculations. ##

    ## (Otherwise the space is non-Gaussian. ## We will need a flag for this to write down methods that delegate from ## non-Gaussian spaces to Gaussian ones.) ## ## ## ## DeclareSynonym( "IsGaussianRowSpace", IsGaussianSpace and IsRowSpace ); ############################################################################# ## #F IsNonGaussianRowSpace( ) ## ## ## ## ## ## If an F-vector space V is in the filter ## then this expresses that V ## consists of row vectors (see ) such ## that not all entries in these row vectors are contained in F ## (so Gaussian elimination cannot be used to compute an F-basis ## from a list of vector space generators), ## and that V is handled via the mechanism of nice bases ## (see ) in the following way. ## Let K be the field spanned by the entries of all vectors in ## V. ## Then the value of V is ## a basis B of the field extension K / ( K \cap F ), ## and the value of v \in V ## is defined by replacing each entry of v by the list of its ## B-coefficients, and then forming the concatenation. ##

    ## So the associated nice vector space is a Gaussian row space ## (see ). ## ## ## DeclareHandlingByNiceBasis( "IsNonGaussianRowSpace", "for non-Gaussian row spaces" ); ############################################################################# ## #F IsMatrixSpace( ) ## ## <#GAPDoc Label="IsMatrixSpace"> ## ## ## ## ## A matrix space in &GAP; is a vector space that consists of matrices ## (see Chapter ). ## ## ## <#/GAPDoc> ## DeclareSynonym( "IsMatrixSpace", IsMatrixModule and IsVectorSpace ); ############################################################################# ## #F IsGaussianMatrixSpace( ) ## ## ## ## ## ## A matrix space is Gaussian if the left acting domain contains all ## scalars that occur in the vectors. ## Thus one can use Gaussian elimination in the calculations. ##

    ## (Otherwise the space is non-Gaussian. ## We will need a flag for this to write down methods that delegate from ## non-Gaussian spaces to Gaussian ones.) ## ## ## DeclareSynonym( "IsGaussianMatrixSpace", IsGaussianSpace and IsMatrixSpace ); ############################################################################# ## #F IsNonGaussianMatrixSpace( ) ## ## ## ## ## ## If an F-vector space V is in the filter ## ## then this expresses that V consists of matrices ## (see ) ## such that not all entries in these matrices are contained in F ## (so Gaussian elimination cannot be used to compute an F-basis ## from a list of vector space generators), ## and that V is handled via the mechanism of nice bases ## (see ) in the following way. ## Let K be the field spanned by the entries of all vectors in V. ## The value of V is irrelevant, ## and the value of v \in V ## is defined as the concatenation of the rows of v. ##

    ## So the associated nice vector space is a (not necessarily Gaussian) ## row space (see ). ## ## ## DeclareHandlingByNiceBasis( "IsNonGaussianMatrixSpace", "for non-Gaussian matrix spaces" ); ############################################################################# ## #A NormedRowVectors( ) . . . normed vectors in a Gaussian row space ## ## <#GAPDoc Label="NormedRowVectors"> ## ## ## ## ## For a finite Gaussian row space V ## (see , ), ## returns a list of those nonzero ## vectors in V that have a one in the first nonzero component. ##

    ## The result list can be used as action domain for the action of a matrix ## group via , which yields the natural action on ## one-dimensional subspaces of V ## (see also ). ## vecs:= NormedRowVectors( GF(3)^2 ); ## [ [ 0*Z(3), Z(3)^0 ], [ Z(3)^0, 0*Z(3) ], [ Z(3)^0, Z(3)^0 ], ## [ Z(3)^0, Z(3) ] ] ## gap> Action( GL(2,3), vecs, OnLines ); ## Group([ (3,4), (1,2,4) ]) ## ]]> ## ## ## <#/GAPDoc> ## DeclareAttribute( "NormedRowVectors", IsGaussianSpace ); ############################################################################# ## #A TrivialSubspace( ) ## ## <#GAPDoc Label="TrivialSubspace"> ## ## ## ## ## For a vector space V, returns the ## subspace of V that consists of the zero vector in V. ## V:= GF(3)^3;; ## gap> triv:= TrivialSubspace( V ); ## ## gap> AsSet( triv ); ## [ [ 0*Z(3), 0*Z(3), 0*Z(3) ] ] ## ]]> ## ## ## <#/GAPDoc> ## DeclareSynonymAttr( "TrivialSubspace", TrivialSubmodule ); ############################################################################# ## #F VectorSpace( , [, ][, "basis"] ) ## ## <#GAPDoc Label="VectorSpace"> ## ## ## ## ## For a field F and a collection gens of vectors, ## returns the F-vector space spanned by ## the elements in gens. ##

    ## The optional argument zero can be used to specify the zero element ## of the space; zero must be given if gens is empty. ## The optional string "basis" indicates that gens is known to ## be linearly independent over F, in particular the dimension of the ## vector space is immediately set; ## note that need not return the basis formed by ## gens if the string "basis" is given as an argument. ## ## V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] ); ## ## ]]> ## ## ## <#/GAPDoc> ## DeclareGlobalFunction( "VectorSpace" ); ############################################################################# ## #F Subspace( , [, "basis"] ) . subspace of generated by #F SubspaceNC( , [, "basis"] ) ## ## <#GAPDoc Label="Subspace"> ## ## ## ## ## ## For an F-vector space V and a list or collection ## gens that is a subset of V, ## returns the F-vector space spanned by ## gens; if gens is empty then the trivial subspace ## (see ) of V is returned. ## The parent (see ) of the returned vector space ## is set to V. ##

    ## does the same as , ## except that it omits the check whether gens is a subset of ## V. ##

    ## The optional string "basis" indicates that gens is known to ## be linearly independent over F. ## In this case the dimension of the subspace is immediately set, ## and both and do ## not check whether gens really is linearly independent and ## whether gens is a subset of V. ## ## V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );; ## gap> W:= Subspace( V, [ [ 0, 1, 2 ] ] ); ## ## ]]> ## ## ## <#/GAPDoc> ## DeclareSynonym( "Subspace", Submodule ); DeclareSynonym( "SubspaceNC", SubmoduleNC ); ############################################################################# ## #O AsVectorSpace( , ) . . . . . . . . . view as -vector space ## ## <#GAPDoc Label="AsVectorSpace"> ## ## ## ## ## Let F be a division ring and D a domain. ## If the elements in D form an F-vector space then ## returns this F-vector space, ## otherwise fail is returned. ##

    ## can be used for example to view a given ## vector space as a vector space over a smaller or larger division ring. ## V:= FullRowSpace( GF( 27 ), 3 ); ## ( GF(3^3)^3 ) ## gap> Dimension( V ); LeftActingDomain( V ); ## 3 ## GF(3^3) ## gap> W:= AsVectorSpace( GF( 3 ), V ); ## ## gap> Dimension( W ); LeftActingDomain( W ); ## 9 ## GF(3) ## gap> AsVectorSpace( GF( 9 ), V ); ## fail ## ]]> ## ## ## <#/GAPDoc> ## DeclareSynonym( "AsVectorSpace", AsLeftModule ); ############################################################################# ## #O AsSubspace( , ) . . . . . . . . . . . view as subspace of ## ## <#GAPDoc Label="AsSubspace"> ## ## ## ## ## Let V be an F-vector space, and U a collection. ## If U is a subset of V such that the elements of U ## form an F-vector space then returns this ## vector space, with parent set to V ## (see ). ## Otherwise fail is returned. ## V:= VectorSpace( Rationals, [ [ 1, 2, 3 ], [ 1, 1, 1 ] ] );; ## gap> W:= VectorSpace( Rationals, [ [ 1/2, 1/2, 1/2 ] ] );; ## gap> U:= AsSubspace( V, W ); ## ## gap> Parent( U ) = V; ## true ## gap> AsSubspace( V, [ [ 1, 1, 1 ] ] ); ## fail ## ]]> ## ## ## <#/GAPDoc> ## DeclareOperation( "AsSubspace", [ IsVectorSpace, IsCollection ] ); ############################################################################# ## #F Intersection2Spaces( , , ) ## ## ## ## ## ## is a function that takes two arguments V and W which must ## be finite dimensional vector spaces, ## and returns the intersection of V and W. ##

    ## If the left acting domains are different then let F be their ## intersection. ## The intersection of V and W is computed as intersection of ## AsStruct( F, V ) and ## AsStruct( F, V ). ##

    ## If the left acting domains are equal to F then the intersection of ## V and W is returned either as F-Substruct ## with the common parent of V and W or as ## F-Struct, in both cases with known basis. ##

    ## This function is used to handle the intersections of two vector spaces, ## two algebras, two algebras-with-one, two left ideals, two right ideals, ## two two-sided ideals. ## ## ## DeclareGlobalFunction( "Intersection2Spaces" ); ############################################################################# ## #F FullRowSpace( , ) ## ## <#GAPDoc Label="FullRowSpace"> ## ## ## ## ## ## For a field F and a nonnegative integer n, ## returns the F-vector space that ## consists of all row vectors (see ) of ## length n with entries in F. ##

    ## An alternative to construct this vector space is via ## F^n. ## FullRowSpace( GF( 9 ), 3 ); ## ( GF(3^2)^3 ) ## gap> GF(9)^3; # the same as above ## ( GF(3^2)^3 ) ## ]]> ## ## ## <#/GAPDoc> ## DeclareSynonym( "FullRowSpace", FullRowModule ); DeclareSynonym( "RowSpace", FullRowModule ); ############################################################################# ## #F FullMatrixSpace( , , ) ## ## <#GAPDoc Label="FullMatrixSpace"> ## ## ## ## ## ## For a field F and two positive integers m and n, ## returns the F-vector space that ## consists of all m by n matrices ## (see ) with entries in F. ##

    ## If m = n then the result is in fact an algebra ## (see ). ##

    ## An alternative to construct this vector space is via ## F^[m,n]. ## FullMatrixSpace( GF(2), 4, 5 ); ## ( GF(2)^[ 4, 5 ] ) ## gap> GF(2)^[ 4, 5 ]; # the same as above ## ( GF(2)^[ 4, 5 ] ) ## ]]> ## ## ## <#/GAPDoc> ## DeclareSynonym( "FullMatrixSpace", FullMatrixModule ); DeclareSynonym( "MatrixSpace", FullMatrixModule ); DeclareSynonym( "MatSpace", FullMatrixModule ); ############################################################################# ## #C IsSubspacesVectorSpace( ) ## ## <#GAPDoc Label="IsSubspacesVectorSpace"> ## ## ## ## ## The domain of all subspaces of a (finite) vector space or of all ## subspaces of fixed dimension, as returned by ## (see ) lies in the category ## . ## D:= Subspaces( GF(3)^3 ); ## Subspaces( ( GF(3)^3 ) ) ## gap> Size( D ); ## 28 ## gap> iter:= Iterator( D );; ## gap> NextIterator( iter ); ## ## gap> NextIterator( iter ); ## ## gap> IsSubspacesVectorSpace( D ); ## true ## ]]> ## ## ## <#/GAPDoc> ## DeclareCategory( "IsSubspacesVectorSpace", IsDomain ); ############################################################################# ## #M IsFinite( ) . . . . . . . . . . . . . . . . . for a subspaces domain ## ## Returns `true' if is finite. ## We allow subspaces domains in `IsSubspacesVectorSpace' only for finite ## vector spaces. ## InstallTrueMethod( IsFinite, IsSubspacesVectorSpace ); ############################################################################# ## #A Subspaces( [, ] ) ## ## <#GAPDoc Label="Subspaces"> ## ## ## ## ## Called with a finite vector space v, ## returns the domain of all subspaces of V. ##

    ## Called with V and a nonnegative integer k, ## returns the domain of all k-dimensional ## subspaces of V. ##

    ## Special and methods are ## provided for these domains. ## ## ## ## <#/GAPDoc> ## DeclareAttribute( "Subspaces", IsLeftModule ); DeclareOperation( "Subspaces", [ IsLeftModule, IsInt ] ); ############################################################################# ## #F IsSubspace( , ) ## ## ## ## ## ## check that U is a vector space that is contained in V ## ## ## ## DeclareGlobalFunction( "IsSubspace" ); ############################################################################# ## #A OrthogonalSpaceInFullRowSpace( ) ## ## ## ## ## ## For a Gaussian row space U over F, ## ## returns a complement of U in the full row space of same vector ## dimension as U over F. ## ## ## DeclareAttribute( "OrthogonalSpaceInFullRowSpace", IsGaussianSpace ); ############################################################################# ## #P IsVectorSpaceHomomorphism( ) ## ## ## ## ## ## A mapping f is a vector space homomorphism (or linear mapping) ## if the source and range are vector spaces ## (see ) ## over the same division ring D ## (see ), ## and if f( a + b ) = f(a) + f(b) and f( s * a ) = s * f(a) ## hold for all elements a, b in the source of f and ## s \in D. ## ## ## DeclareProperty( "IsVectorSpaceHomomorphism", IsGeneralMapping ); ############################################################################# ## #E ================================================ FILE: samples/GAP/vspc.gi ================================================ ############################################################################# ## #W vspc.gi GAP library Thomas Breuer ## ## #Y Copyright (C) 1997, Lehrstuhl D für Mathematik, RWTH Aachen, Germany #Y (C) 1998 School Math and Comp. Sci., University of St Andrews, Scotland #Y Copyright (C) 2002 The GAP Group ## ## This file contains generic methods for vector spaces. ## ############################################################################# ## #M SetLeftActingDomain( , ) ## ## check whether the left acting domain of the external left set ## knows that it is a division ring. ## This is used, e.g., to tell a free module over a division ring ## that it is a vector space. ## InstallOtherMethod( SetLeftActingDomain, "method to set also 'IsLeftActedOnByDivisionRing'", [ IsAttributeStoringRep and IsLeftActedOnByRing, IsObject ],0, function( extL, D ) if HasIsDivisionRing( D ) and IsDivisionRing( D ) then SetIsLeftActedOnByDivisionRing( extL, true ); fi; TryNextMethod(); end ); ############################################################################# ## #M IsLeftActedOnByDivisionRing( ) ## InstallMethod( IsLeftActedOnByDivisionRing, "method for external left set that is left acted on by a ring", [ IsExtLSet and IsLeftActedOnByRing ], function( M ) if IsIdenticalObj( M, LeftActingDomain( M ) ) then TryNextMethod(); else return IsDivisionRing( LeftActingDomain( M ) ); fi; end ); ############################################################################# ## #F VectorSpace( , [, ][, "basis"] ) ## ## The only difference between `VectorSpace' and `FreeLeftModule' shall be ## that the left acting domain of a vector space must be a division ring. ## InstallGlobalFunction( VectorSpace, function( arg ) if Length( arg ) = 0 or not IsDivisionRing( arg[1] ) then Error( "usage: VectorSpace( , [, ][, \"basis\"] )" ); fi; return CallFuncList( FreeLeftModule, arg ); end ); ############################################################################# ## #M AsSubspace( , ) . . . . . . . for a vector space and a collection ## InstallMethod( AsSubspace, "for a vector space and a collection", [ IsVectorSpace, IsCollection ], function( V, C ) local newC; if not IsSubset( V, C ) then return fail; fi; newC:= AsVectorSpace( LeftActingDomain( V ), C ); if newC = fail then return fail; fi; SetParent( newC, V ); UseIsomorphismRelation( C, newC ); UseSubsetRelation( C, newC ); return newC; end ); ############################################################################# ## #M AsLeftModule( , ) . . . . . . for division ring and vector space ## ## View the vector space as a vector space over the division ring . ## InstallMethod( AsLeftModule, "method for a division ring and a vector space", [ IsDivisionRing, IsVectorSpace ], function( F, V ) local W, # the space, result base, # basis vectors of field extension gen, # loop over generators of 'V' b, # loop over 'base' gens, # generators of 'V' newgens; # extended list of generators if Characteristic( F ) <> Characteristic( LeftActingDomain( V ) ) then # This is impossible. return fail; elif F = LeftActingDomain( V ) then # No change of the left acting domain is necessary. return V; elif IsSubset( F, LeftActingDomain( V ) ) then # Check whether 'V' is really a space over the bigger field, # that is, whether the set of elements does not change. base:= BasisVectors( Basis( AsField( LeftActingDomain( V ), F ) ) ); for gen in GeneratorsOfLeftModule( V ) do for b in base do if not b * gen in V then # The field extension would change the set of elements. return fail; fi; od; od; # Construct the space. W:= LeftModuleByGenerators( F, GeneratorsOfLeftModule(V), Zero(V) ); elif IsSubset( LeftActingDomain( V ), F ) then # View 'V' as a space over a smaller field. # For that, the list of generators must be extended. gens:= GeneratorsOfLeftModule( V ); if IsEmpty( gens ) then W:= LeftModuleByGenerators( F, [], Zero( V ) ); else base:= BasisVectors( Basis( AsField( F, LeftActingDomain( V ) ) ) ); newgens:= []; for b in base do for gen in gens do Add( newgens, b * gen ); od; od; W:= LeftModuleByGenerators( F, newgens ); fi; else # View 'V' first as space over the intersection of fields, # and then over the desired field. return AsLeftModule( F, AsLeftModule( Intersection( F, LeftActingDomain( V ) ), V ) ); fi; UseIsomorphismRelation( V, W ); UseSubsetRelation( V, W ); return W; end ); ############################################################################# ## #M ViewObj( ) . . . . . . . . . . . . . . . . . . . view a vector space ## ## print left acting domain, if known also dimension or no. of generators ## InstallMethod( ViewObj, "for vector space with known generators", [ IsVectorSpace and HasGeneratorsOfLeftModule ], function( V ) Print( "" ); end ); InstallMethod( ViewObj, "for vector space with known dimension", [ IsVectorSpace and HasDimension ], 1, # override method for known generators function( V ) Print( "" ); end ); InstallMethod( ViewObj, "for vector space", [ IsVectorSpace ], function( V ) Print( "" ); end ); ############################################################################# ## #M PrintObj( ) . . . . . . . . . . . . . . . . . . . for a vector space ## InstallMethod( PrintObj, "method for vector space with left module generators", [ IsVectorSpace and HasGeneratorsOfLeftModule ], function( V ) Print( "VectorSpace( ", LeftActingDomain( V ), ", ", GeneratorsOfLeftModule( V ) ); if IsEmpty( GeneratorsOfLeftModule( V ) ) and HasZero( V ) then Print( ", ", Zero( V ), " )" ); else Print( " )" ); fi; end ); InstallMethod( PrintObj, "method for vector space", [ IsVectorSpace ], function( V ) Print( "VectorSpace( ", LeftActingDomain( V ), ", ... )" ); end ); ############################################################################# ## #M \/( , ) . . . . . . . . . factor of a vector space by a subspace #M \/( , ) . . . . . . factor of a vector space by a subspace ## InstallOtherMethod( \/, "method for vector space and collection", IsIdenticalObj, [ IsVectorSpace, IsCollection ], function( V, vectors ) if IsVectorSpace( vectors ) then TryNextMethod(); else return V / Subspace( V, vectors ); fi; end ); InstallOtherMethod( \/, "generic method for two vector spaces", IsIdenticalObj, [ IsVectorSpace, IsVectorSpace ], function( V, W ) return ImagesSource( NaturalHomomorphismBySubspace( V, W ) ); end ); ############################################################################# ## #M Intersection2Spaces( , , ) ## InstallGlobalFunction( Intersection2Spaces, function( AsStructure, Substructure, Structure ) return function( V, W ) local inters, # intersection, result F, # coefficients field gensV, # list of generators of 'V' gensW, # list of generators of 'W' VW, # sum of 'V' and 'W' B; # basis of 'VW' if LeftActingDomain( V ) <> LeftActingDomain( W ) then # Compute the intersection as vector space over the intersection # of the coefficients fields. # (Note that the characteristic is the same.) F:= Intersection2( LeftActingDomain( V ), LeftActingDomain( W ) ); return Intersection2( AsStructure( F, V ), AsStructure( F, W ) ); elif IsFiniteDimensional( V ) and IsFiniteDimensional( W ) then # Compute the intersection of two spaces over the same field. gensV:= GeneratorsOfLeftModule( V ); gensW:= GeneratorsOfLeftModule( W ); if IsEmpty( gensV ) then if Zero( V ) in W then inters:= V; else inters:= []; fi; elif IsEmpty( gensW ) then if Zero( V ) in W then inters:= W; else inters:= []; fi; else # Compute a common coefficient space. VW:= LeftModuleByGenerators( LeftActingDomain( V ), Concatenation( gensV, gensW ) ); B:= Basis( VW ); # Construct the coefficient subspaces corresponding to 'V' and 'W'. gensV:= List( gensV, x -> Coefficients( B, x ) ); gensW:= List( gensW, x -> Coefficients( B, x ) ); # Construct the intersection of row spaces, and carry back to VW. inters:= List( SumIntersectionMat( gensV, gensW )[2], x -> LinearCombination( B, x ) ); # Construct the intersection space, if possible with a parent. if HasParent( V ) and HasParent( W ) and IsIdenticalObj( Parent( V ), Parent( W ) ) then inters:= Substructure( Parent( V ), inters, "basis" ); elif IsEmpty( inters ) then inters:= Substructure( V, inters, "basis" ); SetIsTrivial( inters, true ); else inters:= Structure( LeftActingDomain( V ), inters, "basis" ); fi; # Run implications by the subset relation. UseSubsetRelation( V, inters ); UseSubsetRelation( W, inters ); fi; # Return the result. return inters; else TryNextMethod(); fi; end; end ); ############################################################################# ## #M Intersection2( , ) . . . . . . . . . . . . . for two vector spaces ## InstallMethod( Intersection2, "method for two vector spaces", IsIdenticalObj, [ IsVectorSpace, IsVectorSpace ], Intersection2Spaces( AsLeftModule, SubspaceNC, VectorSpace ) ); ############################################################################# ## #M ClosureLeftModule( , ) . . . . . . . . . closure of a vector space ## InstallMethod( ClosureLeftModule, "method for a vector space with basis, and a vector", IsCollsElms, [ IsVectorSpace and HasBasis, IsVector ], function( V, w ) local B; # basis of 'V' # We can test membership easily. B:= Basis( V ); #T why easily? if Coefficients( B, w ) = fail then # In the case of a vector space, we know a basis of the closure. B:= Concatenation( BasisVectors( B ), [ w ] ); V:= LeftModuleByGenerators( LeftActingDomain( V ), B ); UseBasis( V, B ); fi; return V; end ); ############################################################################# ## ## Methods for collections of subspaces of a vector space ## ############################################################################# ## #R IsSubspacesVectorSpaceDefaultRep( ) ## ## is the representation of domains of subspaces of a vector space , ## with the components 'structure' (with value ) and 'dimension' ## (with value either the dimension of the subspaces in the domain ## or the string '\"all\"', which means that the domain contains all ## subspaces of ). ## DeclareRepresentation( "IsSubspacesVectorSpaceDefaultRep", IsComponentObjectRep, [ "dimension", "structure" ] ); #T not IsAttributeStoringRep? ############################################################################# ## #M PrintObj( ) . . . . . . . . . . . . . . . . . for a subspaces domain ## InstallMethod( PrintObj, "method for a subspaces domain", [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ], function( D ) if IsInt( D!.dimension ) then Print( "Subspaces( ", D!.structure, ", ", D!.dimension, " )" ); else Print( "Subspaces( ", D!.structure, " )" ); fi; end ); ############################################################################# ## #M Size( ) . . . . . . . . . . . . . . . . . . . for a subspaces domain ## ## The number of $k$-dimensional subspaces in a $n$-dimensional space over ## the field with $q$ elements is ## $$ ## a(n,k) = \prod_{i=0}^{k-1} \frac{q^n-q^i}{q^k-q^i} = ## \prod_{i=0}^{k-1} \frac{q^{n-i}-1}{q^{k-i}-1}. ## $$ ## We have the recursion ## $$ ## a(n,k+1) = a(n,k) \frac{q^{n-i}-1}{q^{i+1}-1}. ## $$ ## ## (The number of all subspaces is $\sum_{k=0}^n a(n,k)$.) ## InstallMethod( Size, "method for a subspaces domain", [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ], function( D ) local k, n, q, size, qn, qd, ank, i; if D!.dimension = "all" then # all subspaces of the space n:= Dimension( D!.structure ); q:= Size( LeftActingDomain( D!.structure ) ); size:= 1; qn:= q^n; qd:= q; # $a(n,0)$ ank:= 1; for k in [ 1 .. Int( (n-1)/2 ) ] do # Compute $a(n,k)$. ank:= ank * ( qn - 1 ) / ( qd - 1 ); qn:= qn / q; qd:= qd * q; size:= size + ank; od; size:= 2 * size; if n mod 2 = 0 then # Add the number of spaces of dimension $n/2$. size:= size + ank * ( qn - 1 ) / ( qd - 1 ); fi; else # number of spaces of dimension 'k' only n:= Dimension( D!.structure ); if D!.dimension < 0 or n < D!.dimension then return 0; elif n / 2 < D!.dimension then k:= n - D!.dimension; else k:= D!.dimension; fi; q:= Size( LeftActingDomain( D!.structure ) ); size:= 1; qn:= q^n; qd:= q; for i in [ 1 .. k ] do size:= size * ( qn - 1 ) / ( qd - 1 ); qn:= qn / q; qd:= qd * q; od; fi; # Return the result. return size; end ); ############################################################################# ## #M Enumerator( ) . . . . . . . . . . . . . . . . for a subspaces domain ## ## Use the iterator to compute the elements list. #T This is not allowed! ## InstallMethod( Enumerator, "method for a subspaces domain", [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ], function( D ) local iter, # iterator for 'D' elms; # elements list, result iter:= Iterator( D ); elms:= []; while not IsDoneIterator( iter ) do Add( elms, NextIterator( iter ) ); od; return elms; end ); #T necessary? ############################################################################# ## #M Iterator( ) . . . . . . . . . . . . . . . . . for a subspaces domain ## ## uses the subspaces iterator for full row spaces and the mechanism of ## associated row spaces. ## BindGlobal( "IsDoneIterator_Subspaces", iter -> IsDoneIterator( iter!.associatedIterator ) ); BindGlobal( "NextIterator_Subspaces", function( iter ) local next; next:= NextIterator( iter!.associatedIterator ); next:= List( GeneratorsOfLeftModule( next ), x -> LinearCombination( iter!.basis, x ) ); return Subspace( iter!.structure, next, "basis" ); end ); BindGlobal( "ShallowCopy_Subspaces", iter -> rec( structure := iter!.structure, basis := iter!.basis, associatedIterator := ShallowCopy( iter!.associatedIterator ) ) ); InstallMethod( Iterator, "for a subspaces domain", [ IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ], function( D ) local V; # the vector space V:= D!.structure; return IteratorByFunctions( rec( IsDoneIterator := IsDoneIterator_Subspaces, NextIterator := NextIterator_Subspaces, ShallowCopy := ShallowCopy_Subspaces, structure := V, basis := Basis( V ), associatedIterator := Iterator( Subspaces( FullRowSpace( LeftActingDomain( V ), Dimension( V ) ), D!.dimension ) ) ) ); end ); ############################################################################# ## #M Subspaces( , ) ## InstallMethod( Subspaces, "for a vector space, and an integer", [ IsVectorSpace, IsInt ], function( V, dim ) if IsFinite( V ) then return Objectify( NewType( CollectionsFamily( FamilyObj( V ) ), IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ), rec( structure := V, dimension := dim ) ); else TryNextMethod(); fi; end ); ############################################################################# ## #M Subspaces( ) ## InstallMethod( Subspaces, "for a vector space", [ IsVectorSpace ], function( V ) if IsFinite( V ) then return Objectify( NewType( CollectionsFamily( FamilyObj( V ) ), IsSubspacesVectorSpace and IsSubspacesVectorSpaceDefaultRep ), rec( structure := V, dimension := "all" ) ); else TryNextMethod(); fi; end ); ############################################################################# ## #F IsSubspace( , ) . . . . . . . . . . . . . . . . . check <= ## InstallGlobalFunction( IsSubspace, function( V, U ) return IsVectorSpace( U ) and IsSubset( V, U ); end ); ############################################################################# ## #M IsVectorSpaceHomomorphism( ) ## InstallMethod( IsVectorSpaceHomomorphism, [ IsGeneralMapping ], function( map ) local S, R, F; S:= Source( map ); if not IsVectorSpace( S ) then return false; fi; R:= Range( map ); if not IsVectorSpace( R ) then return false; fi; F:= LeftActingDomain( S ); return ( F = LeftActingDomain( R ) ) and IsLinearMapping( F, map ); end ); ############################################################################# ## #E ================================================ FILE: samples/GCC Machine Description/pdp10.md ================================================ ;;- Machine description for the PDP-10. ;; Copyright (C) 2001, 2002 Lars Brinkhoff. ;; Contributed by Lars Brinkhoff , funded by XKL, LLC. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Index ;; Front Page ;; Index ;; Constraints for Immediate Operands ;; To-do List ;; Instruction Wish-List ;; Attributes ;; length, skip, reorg_type ;; Unspec Usage ;; UNSPEC_ADJSP, UNSPEC_ADJBP, UNSPEC_ADDRESS, UNSPEC_FFO, UNSPEC_SUBBP, ;; VUNSPEC_BLT, VUNSPEC_FSC, VUNSPEC_XBLT, VUNSPEC_MOVSLJ, VUNSPEC_MOVST ;; Constants ;; RIGHT_HALF, LEFT_HALF, SIGNBIT, SP_REGNUM ;; Optimizations ;; Data Movement ;; LDB, ILDB, (LDBI), LDBE, ILDBE, (LDBEI), DPB, IDPB, (DPBI), ;; HRR, HRL, HLR, HLL, HRRM, HRLM, HLRM, HLLM, ;; HRRZ, HRLZ, HLRZ, HLLZ, HRRE, HRLE, HLRE, HLLE, ;; SETZM, SETOM, ;; MOVE, MOVEI, MOVSI, HRLOI, HRROI, MOVEM, ;; MOVS, EXCH, SETZB, ;; DMOVE, DMOVEM, ;; BLT, XBLT, (MOVSLJ), (MOVST), (CMPS) ;; Conditional Data Movement ;; SKIPL, SKIPE, SKIPLE, SKIPGE, SKIPN, SKIPG, ;; TDZA ;; Integer Arithmetic ;; AOS, SOS, ;; ADD, ADDI, ADDM, ADDB, DADD, ;; SUB, SUBI, SUBM, SUBB, DSUB, ;; IMUL, IMULI, IMULM, IMULB, MUL, MULI, MULM, MULB, DMUL, ;; IDIV, IDIVI, IDIVM, DIV, DIVI, DIVM, DDIV, ;; UIDIV, UIDIVI, UIDIVM, UIMOD, UIMODI, UIMODM, ;; MOVN, MOVNM, MOVNS, MOVNI, DMOVN, DMOVNM, ;; MOVM, MOVMM, MOVMS, ;; FFS ;; Integer Conversions ;; ANDI, HRRZ, SEXT, HRRE, ANDI, HRR ;; Shifting and Rotating ;; LSH, LSHC, ASH, ASHC, ROT, ROTC ;; Logical Operations ;; AND, ANDI, ANDM, ANDB, TLZ, ANDCMI, ;; ANDCA, ANDCAI, ANDCAM, ANDCAB, ANDCBI, ;; ANDCM, ANDCMM, ANDCMB, ;; XOR, XORI, XORM, XORB, TLC, EQVI, ;; IOR, IORI, IORM, IORB, TLO, ORCMI, ;; ANDCB, ANDCBM, ANDCBB, ;; EQV, EQVM, EQVB, ;; SETCA, SETCAM, SETCAB, ;; SETCM, SETCMM, SETCMB, ;; ORCA, ORCAI, ORCAM, ORCAB, ORCBI, ;; ORCM, ORCMM, ORCMB, ;; ORCB, ORCBM, ORCBB ;; Floating-point Arithmetic ;; FADR, FADRI, FADRM, FADRB, DFAD, GFAD, ;; FSBR, FSBRI, FSBRM, FSBRB, DFSB, GFSB, ;; MOVM, MOVMM, MOVMS, ;; MOVN, MOVNM, MOVNS, DMOVN, DMOVNM, ;; FMPR, FMPRI, FMPRM, FMPRB, DFMP, GFMP, ;; FDVR, FDVRI, FDVRM, FDVRB, DFDV, GFDV, ;; SQRT, DSQRT, GSQRT, ;; FSC, DFSC, GFSC ;; Floating-point Conversions ;; FIX, DFIX, GFIX, DDFIX, GDFIX, ;; FLTR, DFLTR, GFLTR, DDFLTR, DGFLTR, ;; GSNGL, GDBLE ;; Pointer Arithmetic ;; IBP, ADJBP, SUBBP ;; Unconditional Jumps ;; JFCL, JRST, PUSHJ ;; Conditional Jumps ;; TRNE, TLNE, TDNE, TRNN, TLNN, TDNN, TLZN, ;; JUMP, SKIP, CAI, CAM, ;; SOJ, SOS, AOJ, AOS, ;; JFFO, CMPBP ;; Function prologue and epilogue ;; POPJ, ADJSP, PUSH, POP ;; Peepholes ;; Miscellaneous ;; ;; Instructions in parentheses are either commented out or not ;; generated by the compiler. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Constraints for Immediate Operands ;; 'G' Any valid immediate floating-point constant. ;; 'I' 0 .. 262143 ;; 'J' -262143 .. 0 ;; 'K' -131072 .. 131071 ;; 'L' xxxxxx,,000000 (MOVSI, TLN, TLO, TLC) ;; 'M' -1 ;; 'N' xxxxxx,,777777 (HRLOI, TLZ) ;; 'O' 0 ;; 'P' 777777,,xxxxxx (HRROI, ORCMI, ANDCBI, ANDCMI) ;; 'Q' 1 ;; 'R' Floating-point zero. ;; 'S' Local symbol. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; To-do List ;; Use peep2_reg_dead_p in peepholes. ;; Unsigned multiplication. ;; ;; mul 1,3 ; multiply AC1 by AC3 ;; lsh 2,1 ;; lshc 1,-1 ; result in AC2 ;; 71-bit arithmetic. ;; ;; Addition, subtraction, multiplication, division, arithmetic shift: ;; supported in hardware. ;; ;; Logical shift (left or right). ;; ;; lsh 2,-1 ;; lshc 1,3 ;; lsh 2,1 ;; 72-bit arithmetic. ;; ;; Addition 72 x 72 -> 72. ;; ;; jfcl 17,.+1 ; add AC1 and AC2 to AC3 and AC4 ;; add 2,4 ;; jcry0 [aoja 1,.+1] ;; add 1,3 ; result in AC1 and AC2 ;; ;; Subtraction 72 x 72 -> 72. ;; ;; jfcl 17,.+1 ; add AC1 and AC2 to AC3 and AC4 ;; sub 2,4 ;; jcry0 .+2 ;; subi 1,1 ;; sub 1,3 ; result in AC1 and AC2 ;; ;; Negation 72 -> 72. ;; ;; setcm 1,3 ;; movn 2,4 ;; jumpe 2,[aoja 1,.+1] ;; ;; ; to self ;; setca 1, ;; jumpe 2,[aoja 1,.+2] ;; movn 2,2 ;; ;; Magnitude 72 -> 72. ;; ;; ; conditional negation ;; jumpge 1,.+4 ;; setca 1, ;; jumpe 2,[aoja 1,.+2] ;; movn 2,2 ;; ;; ; mask = x >> 71 (arithmetic shift) ;; ; y = (x ^ mask) - mask ;; move 3,1 ;; ash 1,-43 ; shortcut ;; xor 1,3 ;; xor 2,3 ;; jfcl 17,.+1 ;; sub 2,3 ;; jcry0 [aoja 1,.+1] ;; ;; Signed right shift 72 -> 72. ;; ;; Variable amount: ;; ;; ; only works if n <= 35 ;; movn 4,3 ; operand in AC1:AC2, shift amount in AC3 ;; lshc 1,4 ;; lsh 1,3 ;; ash 1,4 ; result in AC1:AC2 ;; ;; ; loop ;; jumple 3,.+5 ;; lshc 1,-1 ;; tlne 1,200000 ;; tlo 1,400000 ;; sojg 3,.-3 ;; ;; ; only works if n <= 70 ;; tlnn 1,400000 ;; tdza 4,4 ;; movsi 4,400000 ;; movei 5,0 ;; ashc 4,3 ;; lsh 5,1 ;; lshc 1,3 ;; ior 1,4 ;; ior 2,5 ;; ;; Fixed amount: ;; ;; lshc 1,-n ;; tlne 1,mask1 ;; tlo 1,mask2 ;; ;; skipge 1 ; or cail 1,0 or jumpge 1,.+2 or tlne 1,400000 ;; iori 2,<2^n-1> ;; rotc 1,-n ;; ;; Signed multiplication 36 x 36 -> 72. ;; ;; jfcl .+1 ; multiply AC1 by AC3 ;; mul 1,3 ;; lsh 2,1 ;; jov [movsi 1,200000 ;; jrst .+4] ;; lshc 1,-1 ;; tlne 1,200000 ;; tlo 1,400000 ; result in AC1 and AC2 ;; ;; mul 1,3 ;; lsh 2,1 ;; jumpe 2,[cam 1,[400000000000] ;; jrst .+1 ;; movsi 1,200000 ;; jrst .+4] ;; lshc 1,-1 ;; tlne 1,200000 ;; tlo 1,400000 ; result in AC1 and AC2 ;; ;; ... ;; lshc 1,-1 ;; lsh 1,1 ;; ash 1,-1 ; result in AC1 and AC2 ;; ;; ... ;; skipge 1 ;; iori 2,1 ;; rotc 1,-1 ; result in AC1 and AC2 ;; ;; jfcl .+1 ; multiply AC1 by AC3 ;; mul 1,3 ;; jov [movsi 1,200000 ;; movei 2,0 ;; jrst .+5] ;; trne 1,1 ;; tloa 2,400000 ;; tlz 2,400000 ;; ash 1,-1 ; result in AC1 and AC2 ;; ;; 377777,,777777 ^ 2 = 177777,,777777 000000,,000001 ;; -400000,,000000 * 377777,,777777 = -177777,,777777 400000,,000000 ;; (= 600000,,000000 400000,,000000) ;; -400000,,000000 ^ 2 = 200000,,000000 000000,,000000 ;; -400000,,000000 * -1 = 000000,,000000 400000,,000000 ;; -000000,,000001 ^ 2 = 000000,,000000 000000,,000001 ;; -000000,,000001 * 000000,,000001 = -000000,,000000 000000,,000001 ;; (= 777777,,777777 777777,,777777) ;; -000000,,000001 * 000001,,000001 = -000000,,000000 000001,,000001 ;; (= 777777,,777777 777776,,777777) ;; ;; Signed high part multiplication 36 x 36 -> 36. ;; ;; jfcl .+1 ; multiply AC1 by AC2 ;; mulm 2,1 ;; jov [movsi 1,200000 ;; jrst .+2] ;; ash 1,-1 ; result in AC1 ;; ;; Unsigned multiplication 36 x 36 -> 72. ;; ;; 377777,,777777 ^ 2 = 177777,,777777 000000,,000001 ;; 400000,,000000 * 377777,,777777 = 177777,,777777 400000,,000000 ;; 400000,,000000 ^ 2 = 200000,,000000 000000,,000000 ;; 400000,,000000 * 777777,,777777 = 377777,,777777 400000,,000000 ;; 777777,,777777 ^ 2 = 777777,,777776 000000,,000001 ;; 777777,,777777 * 000000,,000001 = 000000,,000000 777777,,777777 ;; 777777,,777777 * 000001,,000001 = 000001,,000000 777776,,777777 ;; ;; Multiplication 72 x 72 -> 72. ;; ;; dmul 1,3 ; multiply AC1 and AC2 by AC3 and AC4 ;; lsh 3,1 ;; lshc 2,-1 ;; lsh 4,1 ;; lshc 3,1 ;; trne 2,1 ;; tlo 3,400000 ; result in AC3 and AC4 ;; ;; dmul 1,3 ;; lsh 4,1 ;; lshc 3,-1 ;; lsh 3,2 ;; lshc 2,-2 ;; ;; Comparisons 72 x 72. ;; ;; ; x == y ;; CAMN x+1,y+1 ;; CAME x,y ;; ;here if false ;; TSC, TSO, TSZ. TSNE, TSNN. ;; Ok to negate double-word integer with DMOVN? ;; Answer: perhaps not. ;; ;; If comparison code cares about bit 0 in the second word of a ;; double-word integer, negation has to set the bit to the right ;; value. ;; Converting from double float to single float (truncdfsf2) needs ;; rounding. ;; ANDCMI really faster than TRZ? ;; Add `cmpdi' pattern. ;; Revisit `casesi'. ;; *move_and_skipsi and *move_and_skipsf clobbers accumulator 0. Is ;; it possible to allocate a scratch register? ;; Peepholes for AOSA and SOSA. ;; "Self" half-word instructions. ;; AOBJP, AOBJN? ;; SUBREG of DImode causes bad register allocation: ;; divmodsi4, divmoddi4, expand_builtin_jffo, ffssi. ;; String instructions. Avoid them for now. REG: "None of these is ;; fast. None of these is thoroughly tested. They all require a lot ;; of registers for setup. They are uncharacteristic of other PDP-10 ;; instructions." ;; Test-modify-skip instructions? ;; In case anyone would like to play strange games, this could be ;; optimized to use a PUSHJ instruction: ;; static ;; foo (void **p, void *f) FOO: ;; { PUSHJ 1,(2) ;; *++p = &&label; POPJ 17, ;; goto *f; ;; label: ;; return; ;; } ;; And POPJ: ;; static void ;; bar (void **p) BAR: ;; { POPJ 1, ;; goto *p--; ;; } ;; Use JSP to call functions with __attribute__ ((fastcall)) or similar. ;; Historical: KA10 software double precision floating-point. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Instruction Wish-List ;; ILDBE, LDBE - (increment and) load sign-extended byte. ;; LDBI, LDBEI, DPBI - load/deposit byte, then increment. ;; SUBBP - subtract byte pointers. ;; CMPBP - compare byte pointers. ;; SEXT r,n - sign-extend n-bit byte in register r. ;; Clear/set byte. ;; Test byte >0 =0 <0. ;; UIDIV, UDIV, UDDIV - unsigned division (udivsi3, udivdi3). ;; UIMOD, UMOD, UDMOD - unsigned modulo (umodsi3, umoddi3). ;; UJUMP, USKIP, UCAI, UCAM - compare unsigned values. ;; MIN, MAX, UMIN, UMAX - min/max (minsi3, maxsi3, uminsi3, umaxsi3). ;; SQRT, DSQRT, GSQRT - square root (sqrtM2). ;; SIN, DSIN, GSIN - sine function (__builtin_sin). ;; COS, DCOS, GCOS - cosine function (__builtin_cos). ;; Any other mathematical function: TAN, ASIN, ACOS, ATAN, SINH, COSH, ;; TANH, ASINH, ACOSH, ATANH, EXP, LN, LOG2, LOG10, POW, ... All ;; potentially in single, double, and giant versions. ;; FFS - find first set, counting least significant bit first (ffsM2). ;; ?DFIX, DFIXR - Double Floating to Integer (fix_truncdfsi2). ;; ?DFIX, DFIXR - Single Floating to Double Precision Integer (fix_truncsfdi2). ;; DDFIX, DDFIXR - Double Floating to Double Precision Integer (fix_truncdfdi2) ;; ?DFLTR - Double Float and Round (floatsidf2). ;; ?DFLTR - Float Double Precision Integer and Round (floatdisf2). ;; DDFLTR - Double Float Double Precision Integer and Round (floatdidf2). ;; UDFLTR, UGFLTR, ... - Unsigned Float and Round (floatuns...). ;; WAIT - wait for interrupt. ;; XPUSH, XPUSHJ, XPOP, XPOPJ - fast versions for use with a global ;; stack pointer only. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Attributes ;; Length of the instruction, in words. (define_attr "length" "" (const_int 1)) ;; The instruction is a skip instruction. (define_attr "skip" "no,yes" (const_string "no")) ;; Instruction type used in the machine dependent reorg pass. (define_attr "reorg_type" "none,ibp,ldb,dpb" (const_string "none")) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Unspec Usage (define_constants [(UNSPEC_ADJSP 0) ; ADJSP operation (Pmode): ; Operand 0 is the stack pointer. ; Operand 1 is the adjustment. (UNSPEC_ADJBP 1) ; ADJBP operation (Pmode): ; Operand 0 is the byte pointer. ; Operand 1 is the adjustment. (UNSPEC_ADDRESS 2) ; Effective-address calculation (Pmode): ; Operand 0 is the memory operand. (UNSPEC_FFO 3) ; Find-first-one operation in FFO (SImode): ; Operand 0 is the register. (UNSPEC_FSC 4) ; FSC operation (SFmode, DFmode): ; Operand 0 is the floating-point value. ; Operand 1 is the scale factor. (UNSPEC_SHIFT 5) ; Left-shift operation (SImode, Pmode): ; Used to compensate for unnecessary ; shifts generated by pointer arithmetic. ; Operand 0 is the value. ; Operand 1 is the shift count. (UNSPEC_SHIFTRT 6) ; Right-shift operation (SImode, Pmode): ; Used to compensate for unnecessary ; shifts generated by pointer arithmetic. ; Operand 0 is the value. ; Operand 1 is the shift count. (UNSPEC_TLNE_TLZA_TLO ; TLNE-TLZA-TLO sequence (SImode): 7) ; Operand 0 is the register. ; Operand 1 is the TLNE operand. ; Operand 2 is the TLZA operand. ; Operand 3 is the TLO operand. (UNSPEC_SUBBP 8) ; Byte pointer difference (SImode): ; Operand 0 is the first pointer. ; Operand 1 is the second pointer. (UNSPEC_CMPBP 9) ; Prepare byte pointer for comparison (SImode): ; Operand 0 is the pointer. (UNSPEC_REAL_ASHIFT 10) ; Arithmetic left shift (SImode, DImode): ; Operand 0 is the value to shift. ; Operand 1 is the amount to shift by. (UNSPEC_ASH71 11) ; 71-bit arithmetic shift (DImode): ; Operand 0 is the value to shift. ; Operand 1 is the amount to shift by. (UNSPEC_MUL71 12) ; 71-bit multiplication (DImode): ; Operands 0 and 1 are the multiplicands. (UNSPEC_SIGN_EXTEND 13) ; Sign extension (SImode): ; Operand 0 is the value to extend. ; Operand 1 is the number of bits to extend. (UNSPEC_ZERO_EXTEND 14) ; Zero extension (SImode): ; Operand 0 is the value to extend. ; Operand 1 is the number of bits to extend. (UNSPEC_TRUNCATE 15) ; Truncate (SImode): ; Operand 0 is the value to truncate. ; Operand 1 is the number of bits to trunc. (UNSPEC_TRNE_TLO 16) ; TLNE-TLO sequence (SImode): ; Operand 0 is the TRNE operand. ; Operand 1 is the TLO operand. (UNSPEC_ASHC 17) ; ASHC operation (DImode): ; Operand 0 is the value to shift. ; Operand 1 is the amount to shift by. (UNSPEC_LSHC 18)]) ; ASHC operation (DImode): ; Operand 0 is the value to shift. ; Operand 1 is the amount to shift by. (define_constants [(VUNSPEC_BLOCKAGE 0) (VUNSPEC_BLT 1) ; BLT operation (BLKmode): ; Operand 0 is the source address. ; Operand 1 is the destination address. ; Operand 2 is the block length. (VUNSPEC_XBLT 2) ; XBLT operation (BLKmode): ; operand 0 is the block length ; operand 1 is the source address ; operand 2 is the destination address (VUNSPEC_MOVSLJ 3) ; MOVSLJ operation (BLKmode): ; operand 0 is the register block (VUNSPEC_MOVST 4) ; MOVST operation (BLKmode): ; operand 0 is the register block (VUNSPEC_CMPS 5)]) ; CMPS operation (BLKmode): ; operand 0 is the register block ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Constants (define_constants [(RIGHT_HALF 262143) ; 0000000777777 (LEFT_HALF -262144) ; 0777777000000 (SIGNBIT -34359738368) ; 0400000000000 (FP_REGNUM 13) ; Frame pointer register. (SP_REGNUM 15)]) ; Stack pointer register. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Optimizations ;; Adding a constant to a word pointer is done fastest by (X)MOVEI ;; op0,const(op1). As a special case, recognize the stack pointer. (define_insn "MOVEI_sp" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (reg:SI SP_REGNUM) (match_operand:SI 1 "const_int_operand" "")))] "" { operands[1] = gen_rtx_PLUS (Pmode, stack_pointer_rtx, operands[1]); /* ADDRESS: ... */ return TARGET_EXTENDED ? "xmovei %0,%a1" : "movei %0,%a1"; }) ;; Moving from any word pointer is done fastest by (X)MOVEI op0,(op1). ;; As a special case, recognize the stack pointer. (define_insn "*move_from_sp" [(set (match_operand:SI 0 "register_operand" "=r") (reg:SI SP_REGNUM))] "" { /* ADDRESS: ... */ return TARGET_EXTENDED ? "xmovei %0,(17)" : "movei %0,(17)"; }) ;; Load scalar signed chars using HRRE. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:QI 1 "pdp10_maybe_volatile_memory_operand" "m")))] "MEM_SCALAR_P (operands[1])" "hrre %0,%W1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:SI 1 "pdp10_maybe_volatile_memory_operand" "m") (const_int 9) (const_int 27)))] "MEM_SCALAR_P (operands[1])" "hrre %0,%1") (define_insn "" [(set (match_operand:QI 0 "register_operand" "=r") (subreg:QI (zero_extract:SI (match_operand: SI 1 "memory_operand" "m") (const_int 9) (const_int 27)) 3))] "MEM_SCALAR_P (operands[1])" "move %0,%1") (define_insn "" [(set (subreg:QI (zero_extract:SI (match_operand:SI 0 "memory_operand" "+m") (const_int 9) (const_int 27)) 3) (match_operand:QI 1 "register_operand" "r"))] "MEM_SCALAR_P (operands[0])" "movem %1,%0") (define_insn "" [(set (subreg:HI (zero_extract:SI (match_operand:SI 0 "memory_operand" "+m") (const_int 18) (const_int 18)) 2) (match_operand:HI 1 "register_operand" "r"))] "MEM_SCALAR_P (operands[0])" "movem %1,%0") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(subreg:SI (match_operand:QI 1 "memory_operand" "m") 0) (match_operand 2 "const_int_operand" "")] UNSPEC_SIGN_EXTEND))] "MEM_SCALAR_P (operands[1]) && INTVAL (operands[2]) >= 18" "hrre %0,%W1") ;; Load scalar unsigned chars using MOVE. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:QI 1 "pdp10_maybe_volatile_memory_operand" "m")))] "MEM_SCALAR_P (operands[1])" "move %0,%W1") ; (define_insn "" ; [(set (match_operand:SI 0 "register_operand" "=r") ; (and:SI ;; This could well be a scalar int variable. ; (match_operand:SI 1 "pdp10_maybe_volatile_memory_operand" "m") ; (const_int 511)))] ; "MEM_SCALAR_P (operands[1])" ; "move %0,%W1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(subreg:SI (match_operand:QI 1 "memory_operand" "m") 0) (match_operand 2 "const_int_operand" "")] UNSPEC_ZERO_EXTEND))] "MEM_SCALAR_P (operands[1])" "move %0,%W1") ;; Store scalar chars using MOVEM. (define_insn "" [(set (match_operand:QI 0 "pdp10_maybe_volatile_memory_operand" "=m") (match_operand:QI 1 "register_operand" "r"))] "MEM_SCALAR_P (operands[0])" "movem %1,%W0") (define_insn "" [(set (match_operand:SI 0 "pdp10_maybe_volatile_memory_operand" "=m") (sign_extract:SI (match_operand:SI 1 "register_operand" "r") (const_int 9) (const_int 27)))] "MEM_SCALAR_P (operands[0])" "movem %1,%0") (define_insn "" [(set (zero_extract:SI (match_operand:SI 0 "pdp10_maybe_volatile_memory_operand" "+m") (const_int 9) (const_int 27)) (and:SI (match_operand:SI 1 "register_operand" "r") (const_int 511)))] "MEM_SCALAR_P (operands[0])" "movem %1,%0") (define_insn "" [(set (match_operand:QI 0 "memory_operand" "=m") (subreg:QI (unspec:SI [(match_operand:SI 1 "register_operand" "r") (match_operand 2 "const_int_operand" "")] UNSPEC_SIGN_EXTEND) 3))] "MEM_SCALAR_P (operands[0])" "movem %1,%W0") (define_insn "" [(set (match_operand:QI 0 "memory_operand" "=m") (subreg:QI (unspec:SI [(match_operand:SI 1 "register_operand" "r") (match_operand 2 "const_int_operand" "")] UNSPEC_ZERO_EXTEND) 3))] "MEM_SCALAR_P (operands[0])" "movem %1,%W0") ;; Load scalar unsigned shorts using MOVE. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:HI 1 "pdp10_maybe_volatile_memory_operand" "m")))] "MEM_SCALAR_P (operands[1])" "move %0,%W1") (define_insn "" [(set (match_operand:HI 0 "register_operand" "=r") (subreg:HI (zero_extract:SI (match_operand:SI 1 "pdp10_maybe_volatile_memory_operand" "m") (const_int 18) (const_int 18)) 2))] "MEM_SCALAR_P (operands[1])" "move %0,%W1") ; (define_insn "" ; [(set (match_operand:SI 0 "register_operand" "=r") ;; This could well be a scalar int variable. ; (and:SI (match_operand:SI 1 "pdp10_maybe_volatile_memory_operand" "m") ; (const_int RIGHT_HALF)))] ; "MEM_SCALAR_P (operands[1])" ; "move %0,%W1") ;; Load scalar signed shorts using HRRE. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:SI 1 "pdp10_maybe_volatile_memory_operand" "m") (const_int 18) (const_int 18)))] "MEM_SCALAR_P (operands[1])" "hrre %0,%1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:HI 1 "pdp10_maybe_volatile_memory_operand" "m")))] "MEM_SCALAR_P (operands[1])" "hrre %0,%W1") ;; Store scalar shorts using MOVEM. (define_insn "" [(set (match_operand:HI 0 "pdp10_maybe_volatile_memory_operand" "=m") (match_operand:HI 1 "register_operand" "r"))] "MEM_SCALAR_P (operands[0])" "movem %1,%W0") (define_insn "" [(set (zero_extract:SI (match_operand:SI 0 "pdp10_maybe_volatile_memory_operand" "+m") (const_int 18) (const_int 18)) (and:SI (match_operand:SI 1 "register_operand" "r") (const_int RIGHT_HALF)))] "MEM_SCALAR_P (operands[0])" "movem %1,%0") (define_insn "*sgeu" [(set (match_operand:SI 0 "register_operand" "=x") (ge:SI (xor:SI (match_operand:SI 1 "reg_or_mem_operand" "rm") (const_int SIGNBIT)) (match_operand:SI 2 "const_int_operand" "")))] "" { HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35; operands[2] = gen_int_mode (INTVAL (operands[2]) ^ sign, SImode); if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777) return "skipl %0,%1\;%_caml %0,[%2]\;%_%_trna\;%_%_%_tdza %0,%0\;%_%_%_%_movei %0,1"; else return "skipl %0,%1\;%_cail %0,%2\;%_%_trna\;%_%_%_tdza %0,%0\;%_%_%_%_movei %0,1"; } [(set_attr "length" "5")]) (define_insn "*sgeu_plus" [(set (match_operand:SI 0 "register_operand" "=&r") (ge:SI (xor:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "")) (const_int SIGNBIT)) (match_operand:SI 3 "const_int_operand" "")))] "" { HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35; output_asm_insn ("movei %0,0", operands); operands[2] = gen_int_mode (-INTVAL (operands[2]), SImode); if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777) output_asm_insn ("caml %1,[%2]", operands); else output_asm_insn ("cail %1,%2", operands); operands[3] = gen_int_mode ((INTVAL (operands[3]) ^ sign) - INTVAL (operands[2]), SImode); if (INTVAL (operands[3]) & ~(HOST_WIDE_INT)0777777) output_asm_insn ("%_caml %1,[%3]", operands); else output_asm_insn ("%_cail %1,%3", operands); return "%_%_movei %0,1"; } [(set_attr "length" "4")]) (define_insn "*cbranchgeu" [(set (pc) (if_then_else (ge (xor:SI (match_operand:SI 0 "register_operand" "r") (const_int SIGNBIT)) (match_operand:SI 1 "const_int_operand" "")) (label_ref (match_operand 2 "" "")) (pc)))] "" { rtx ops[5]; ops[0] = operands[0]; ops[1] = operands[0]; ops[2] = GEN_INT (0); ops[3] = operands[1]; ops[4] = operands[2]; return pdp10_output_range_compare (insn, ops, 0); } [(set_attr "length" "3")]) (define_insn "*cbranchgeu_mem" [(set (pc) (if_then_else (ge (xor:SI (match_operand:SI 0 "memory_operand" "m") (const_int SIGNBIT)) (match_operand:SI 1 "const_int_operand" "")) (label_ref (match_operand 2 "" "")) (pc))) (clobber (match_scratch:SI 3 "=x"))] "" { rtx ops[5]; ops[0] = operands[3]; ops[1] = operands[0]; ops[2] = GEN_INT (0); ops[3] = operands[1]; ops[4] = operands[2]; return pdp10_output_range_compare (insn, ops, 0); } [(set_attr "length" "4")]) (define_insn "*cbranchgeu_plus" [(set (pc) (if_then_else (ge (xor:SI (plus:SI (match_operand:SI 0 "reg_or_mem_operand" "r") (match_operand:SI 1 "const_int_operand" "")) (const_int SIGNBIT)) (match_operand:SI 2 "const_int_operand" "")) (label_ref (match_operand 3 "" "")) (pc)))] "" { rtx ops[5]; ops[0] = operands[0]; ops[1] = operands[0]; ops[2] = operands[1]; ops[3] = operands[2]; ops[4] = operands[3]; return pdp10_output_range_compare (insn, ops, 0); } [(set_attr "length" "3")]) (define_insn "*sltu" [(set (match_operand:SI 0 "register_operand" "=x") (lt:SI (xor:SI (match_operand:SI 1 "reg_or_mem_operand" "rm") (const_int SIGNBIT)) (match_operand:SI 2 "const_int_operand" "")))] "" { HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35; operands[2] = gen_int_mode (INTVAL (operands[2]) ^ sign, SImode); if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777) return "skipl %0,%1\;%_caml %0,[%2]\;%_%_tdza %0,%0\;%_%_%_movei %0,1"; else return "skipl %0,%1\;%_cail %0,%2\;%_%_tdza %0,%0\;%_%_%_movei %0,1"; } [(set_attr "length" "4")]) (define_insn "*sltu_plus" [(set (match_operand:SI 0 "register_operand" "=x") (lt:SI (xor:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "")) (const_int SIGNBIT)) (match_operand:SI 3 "const_int_operand" "")))] "" { HOST_WIDE_INT sign = (HOST_WIDE_INT)1 << 35; operands[2] = gen_int_mode (-INTVAL (operands[2]), SImode); if (INTVAL (operands[2]) & ~(HOST_WIDE_INT)0777777) output_asm_insn ("caml %1,[%2]", operands); else output_asm_insn ("cail %1,%2", operands); operands[3] = gen_int_mode ((INTVAL (operands[3]) ^ sign) - INTVAL (operands[2]), SImode); if (INTVAL (operands[3]) & ~(HOST_WIDE_INT)0777777) output_asm_insn ("%_caml %1,[%3]", operands); else output_asm_insn ("%_cail %1,%3", operands); return "%_%_tdza %0,%0\;%_%_%_movei %0,1"; } [(set_attr "length" "4")]) (define_insn "*cbranchltu" [(set (pc) (if_then_else (lt (xor:SI (match_operand:SI 0 "register_operand" "r") (const_int SIGNBIT)) (match_operand:SI 1 "const_int_operand" "")) (label_ref (match_operand 2 "" "")) (pc)))] "" { rtx ops[5]; ops[0] = operands[0]; ops[1] = operands[0]; ops[2] = GEN_INT (0); ops[3] = operands[1]; ops[4] = operands[2]; return pdp10_output_range_compare (insn, ops, 1); } [(set_attr "length" "4")]) (define_insn "*cbranchltu_mem" [(set (pc) (if_then_else (lt (xor:SI (match_operand:SI 0 "memory_operand" "m") (const_int SIGNBIT)) (match_operand:SI 1 "const_int_operand" "")) (label_ref (match_operand 2 "" "")) (pc))) (clobber (match_scratch:SI 3 "=x"))] "" { rtx ops[5]; ops[0] = operands[3]; ops[1] = operands[0]; ops[2] = GEN_INT (0); ops[3] = operands[1]; ops[4] = operands[2]; return pdp10_output_range_compare (insn, ops, 1); } [(set_attr "length" "4")]) (define_insn "*cbranchltu_plus" [(set (pc) (if_then_else (lt (xor:SI (plus:SI (match_operand:SI 0 "reg_or_mem_operand" "r") (match_operand:SI 1 "const_int_operand" "")) (const_int SIGNBIT)) (match_operand:SI 2 "const_int_operand" "")) (label_ref (match_operand 3 "" "")) (pc)))] "" { rtx ops[5]; ops[0] = operands[0]; ops[1] = operands[0]; ops[2] = operands[1]; ops[3] = operands[2]; ops[4] = operands[3]; return pdp10_output_range_compare (insn, ops, 1); } [(set_attr "length" "4")]) (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (lshiftrt:SI (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "i")))] "INTVAL (operands[2]) != 4 && INTVAL (operands[2]) != 18 && INTVAL (operands[2]) != 20" { rtx ops[4]; ops[0] = operands[0]; ops[1] = operands[1]; ops[2] = GEN_INT (BITS_PER_WORD - INTVAL (operands[2])); ops[3] = GEN_INT (0); if (get_attr_length (insn) == 1) output_asm_insn (pdp10_output_extzv (insn, ops), ops); else output_asm_insn (pdp10_output_extzv_sequence (ops), ops); return ""; } [(set (attr "length") (if_then_else (and (ne (symbol_ref "TARGET_LARGE") (const_int 0)) (match_operand:SI 1 "pdp10_constaddr_memory_operand" "")) (const_int 1) (const_int 2)))]) (define_insn "" [(set (match_operand:SI 0 "memory_operand" "=m") (and:SI (match_operand:SI 1 "memory_operand" "0") (const_int LEFT_HALF)))] "" "hllzs %W0") (define_insn "" [(set (match_operand:HI 0 "memory_operand" "=m") (const_int 0))] "MEM_ALIGN (operands[0]) == 36" "hrrzs %W0") (define_insn "" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (and:SI (match_dup 0) (const_int RIGHT_HALF))) (set (match_operand:SI 1 "register_operand" "=x") (and:SI (match_operand:SI 2 "reg_or_mem_operand" "=0") (const_int RIGHT_HALF)))] "" "hrrzs %1,%0") (define_insn "" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (and:SI (match_dup 0) (const_int LEFT_HALF))) (set (match_operand:SI 1 "register_operand" "=x") (and:SI (match_operand:SI 2 "reg_or_mem_operand" "=0") (const_int LEFT_HALF)))] "" "hllzs %1,%0") (define_insn "" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (ashift:SI (match_dup 0) (const_int 18))) (set (match_operand:SI 1 "register_operand" "=x") (ashift:SI (match_operand:SI 2 "reg_or_mem_operand" "=0") (const_int 18)))] "" "hrlzs %1,%0") (define_insn "" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (lshiftrt:SI (match_dup 0) (const_int 18))) (set (match_operand:SI 1 "register_operand" "=x") (lshiftrt:SI (match_operand:SI 2 "reg_or_mem_operand" "=0") (const_int 18)))] "" "hlrzs %1,%0") (define_insn "" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (ior:SI (match_dup 0) (const_int LEFT_HALF))) (set (match_operand:SI 1 "register_operand" "=x") (ior:SI (match_operand:SI 2 "reg_or_mem_operand" "=0") (const_int LEFT_HALF)))] "" "hrros %1,%0") (define_insn "" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (ior:SI (match_dup 0) (const_int RIGHT_HALF))) (set (match_operand:SI 1 "register_operand" "=x") (ior:SI (match_operand:SI 2 "reg_or_mem_operand" "=0") (const_int RIGHT_HALF)))] "" "hllos %1,%0") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (ashift:SI (match_operand:SI 1 "reg_or_mem_operand" "rm") (const_int 18)) (const_int RIGHT_HALF)))] "" "hrlo %0,%1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (lshiftrt:SI (match_operand:SI 1 "reg_or_mem_operand" "rm") (const_int 18)) (const_int LEFT_HALF)))] "" "hlro %0,%1") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Data Movement (define_expand "movqi" [(set (match_operand:QI 0 "reg_or_mem_operand" "") (match_operand:QI 1 "general_operand" ""))] "" "if (no_new_pseudos) { if (REG_P (operands[0]) && GET_CODE (operands[1]) == CONST_INT) operands[0] = gen_rtx_REG (SImode, REGNO (operands[0])); } else { if (GET_CODE (operands[0]) == SUBREG && GET_CODE (SUBREG_REG (operands[0])) == ZERO_EXTRACT) { if (GET_CODE (XEXP (SUBREG_REG (operands[0]), 0)) == MEM && SUBREG_BYTE (operands[0]) == 3 && GET_CODE (XEXP (SUBREG_REG (operands[0]), 1)) == CONST_INT && INTVAL (XEXP (SUBREG_REG (operands[0]), 1)) == 9 && GET_CODE (XEXP (SUBREG_REG (operands[0]), 2)) == CONST_INT && INTVAL (XEXP (SUBREG_REG (operands[0]), 2)) == 27 && MEM_SCALAR_P (XEXP (SUBREG_REG (operands[0]), 0))) emit_move_insn (XEXP (SUBREG_REG (operands[0]), 0), convert_to_mode (SImode, operands[1], 1)); else emit_move_insn (SUBREG_REG (operands[0]), convert_to_mode (SImode, operands[1], 1)); DONE; } else if (GET_CODE (operands[1]) == SUBREG && GET_CODE (SUBREG_REG (operands[1])) == ZERO_EXTRACT) { rtx temp = gen_reg_rtx (SImode); emit_move_insn (temp, SUBREG_REG (operands[1])); operands[1] = gen_rtx_SUBREG (QImode, temp, 3); } else if (GET_CODE (operands[1]) == CONST_INT) { rtx temp = gen_reg_rtx (SImode); emit_insn (gen_movsi (temp, operands[1])); operands[1] = gen_rtx_SUBREG (QImode, temp, 3); } if (GET_CODE (operands[0]) == MEM) operands[1] = force_reg (QImode, operands[1]); }") (define_insn "*movqi_reg" [(set (match_operand:QI 0 "register_operand" "=r") (match_operand:QI 1 "register_operand" "r"))] "" "move %0,%1") (define_insn "*LDBzqi_sequence" [(set (match_operand:SI 0 "register_operand" "=r,r") (zero_extend:SI (match_operand:QI 1 "memory_operand" "m,>")))] "TARGET_EXTENDED && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0)) && pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD && (GET_CODE (XEXP (operands[1], 0)) == REG || (INTVAL (XEXP (XEXP (operands[1], 0), 1)) % UNITS_PER_WORD == 0))" { rtx ops[4]; ops[0] = operands[0]; ops[1] = operands[1]; ops[2] = GEN_INT (9); ops[3] = GEN_INT (0); output_asm_insn (pdp10_output_extzv_sequence (ops), ops); return ""; } [(set_attr "length" "2")]) (define_insn "*LDBzqi" [(set (match_operand:SI 0 "register_operand" "=r,r") (zero_extend:SI (match_operand:QI 1 "memory_operand" ">,m")))] "" "*return pdp10_output_load_unsigned_byte (insn, operands);" [(set_attr "reorg_type" "none,ldb")]) (define_insn "*LDBIzqi" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:QI 1 "memory_operand" "<")))] "TARGET_XKL2" "*return pdp10_output_load_unsigned_byte (insn, operands);") (define_insn "*LDBEqi" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (sign_extend:SI (match_operand:QI 1 "memory_operand" ">,<,m")))] "TARGET_XKL2" "*return pdp10_output_load_signed_byte (insn, operands);" [(set_attr "reorg_type" "none,none,ldb")]) (define_insn "*LDBEqi_sequence" [(set (match_operand:SI 0 "register_operand" "=r,r") (sign_extend:SI (match_operand:QI 1 "memory_operand" ">,m")))] "!TARGET_XKL2" { if (/*CONSTANT_ADDRESS_P (XEXP (operands[1], 0)) || */ pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD) { rtx ops[4]; int offset = pdp10_pointer_offset (XEXP (operands[1], 0)); ops[0] = operands[0]; ops[1] = operands[1]; ops[2] = GEN_INT (9); ops[3] = GEN_INT (0); output_asm_insn (pdp10_output_extv_sequence (ops), ops); return ""; } else { if (which_alternative == 0) return "ildb %0,%1\;trne %0,400\;%_orcmi %0,777"; else return "ldb %0,%1\;trne %0,400\;%_orcmi %0,777"; } } [(set_attr "length" "3") (set_attr "reorg_type" "none,ldb")]) (define_insn "*LDBqi" [(set (match_operand:QI 0 "register_operand" "=r,r") (match_operand:QI 1 "memory_operand" ">,m"))] "" "*return pdp10_output_load_unsigned_byte (insn, operands);" [(set_attr "reorg_type" "none,ldb")]) ; "@ ; ildb %0,%1 ; ldb %0,%1") (define_insn "*LDBIqi" [(set (match_operand:QI 0 "register_operand" "=r") (match_operand:QI 1 "memory_operand" "<"))] "TARGET_XKL2" "*return pdp10_output_load_unsigned_byte (insn, operands);") (define_insn "*DPBqi" [(set (match_operand:QI 0 "memory_operand" "=>,m") (match_operand:QI 1 "register_operand" "r,r"))] "" "*return pdp10_output_store_byte (insn, operands);" [(set_attr "reorg_type" "none,dpb")]) (define_insn "*DPBIqi" [(set (match_operand:QI 0 "memory_operand" "=<") (match_operand:QI 1 "register_operand" "r"))] "TARGET_XKL2" "*return pdp10_output_store_byte (insn, operands);") (define_expand "movhi" [(set (match_operand:HI 0 "reg_or_mem_operand" "") (match_operand:HI 1 "general_operand" ""))] "" "if (no_new_pseudos) { if (REG_P (operands[0]) && GET_CODE (operands[1]) == CONST_INT) operands[0] = gen_rtx_REG (SImode, REGNO (operands[0])); } else { if (GET_CODE (operands[0]) == SUBREG && GET_CODE (SUBREG_REG (operands[0])) == ZERO_EXTRACT) { if (GET_CODE (XEXP (SUBREG_REG (operands[0]), 0)) == MEM && SUBREG_BYTE (operands[0]) == 2 && GET_CODE (XEXP (SUBREG_REG (operands[0]), 1)) == CONST_INT && INTVAL (XEXP (SUBREG_REG (operands[0]), 1)) == 18 && GET_CODE (XEXP (SUBREG_REG (operands[0]), 2)) == CONST_INT && INTVAL (XEXP (SUBREG_REG (operands[0]), 2)) == 18 && MEM_SCALAR_P (XEXP (SUBREG_REG (operands[0]), 0))) emit_move_insn (XEXP (SUBREG_REG (operands[0]), 0), convert_to_mode (SImode, operands[1], 1)); else emit_move_insn (SUBREG_REG (operands[0]), convert_to_mode (SImode, operands[1], 1)); DONE; } else if (GET_CODE (operands[1]) == SUBREG && GET_CODE (SUBREG_REG (operands[1])) == ZERO_EXTRACT) { rtx temp = gen_reg_rtx (SImode); emit_move_insn (temp, XEXP (operands[1], 0)); operands[1] = gen_rtx_SUBREG (HImode, temp, 2); } else if (GET_CODE (operands[1]) == CONST_INT) { rtx reg = gen_reg_rtx (SImode); emit_insn (gen_movsi (reg, operands[1])); operands[1] = gen_rtx_SUBREG (HImode, reg, 2); } if (GET_CODE (operands[0]) == MEM) operands[1] = force_reg (HImode, operands[1]); }") (define_insn "*movhi" [(set (match_operand:HI 0 "register_operand" "=r") (match_operand:HI 1 "register_operand" "r"))] "" "move %0,%1") ; (define_insn "*halfword_move" ; [(set (match_operand:SI 0 "pdp10_halfword_destination" "=") ; (match_operand:SI 1 "pdp10_halfword_source" ""))] ; "" ; "*pdp10_output_halfword_move (operands);") (define_insn "*HLR" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") (const_int 18) (const_int 18)) (subreg:SI (match_operand:HI 1 "memory_operand" "m") 0))] "" "hlr %0,%W1") (define_insn "*HLL" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") (const_int 18) (const_int 0)) (subreg:SI (match_operand:HI 1 "memory_operand" "m") 0))] "" "hll %0,%W1") (define_insn "*HLLM" [(set (mem:SI (match_operand:SI 0 "address_operand" "p")) (ior:SI (and:SI (match_operand:SI 1 "register_operand" "r") (const_int LEFT_HALF)) (zero_extend:SI (mem:HI (match_dup 0)))))] "" { if (GET_CODE (operands[0]) == CONST && TARGET_EXTENDED && !TARGET_SMALLISH) /* ADDRESS: ... */ return "hllm %1,@[%W0]"; else return "hllm %1,%W0"; }) (define_insn "HRR" [(set (zero_extract:SI (match_operand:SI 0 "reg_or_mem_operand" "+r,m") (const_int 18) (const_int 18)) (and:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int RIGHT_HALF)))] "" "@ hrr %0,%1 hrrm %1,%0") (define_insn "*HRL" [(set (zero_extract:SI (match_operand:SI 0 "reg_or_mem_operand" "+r,m") (const_int 18) (const_int 0)) (and:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int RIGHT_HALF)))] "" "@ hrl %0,%1 hrlm %1,%0") ; (define_insn "*HxR" ; [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") ; (const_int 18) ; (const_int 18)) ; (subreg:SI (match_operand:HI 1 "memory_operand" "m") 0))] ; "" ; "*return pdp10_output_halfword_insv (insn, operands, 18);") (define_insn "*HxRM" [(set (subreg:SI (match_operand:HI 1 "memory_operand" "=m") 0) (zero_extract:SI (match_operand:SI 0 "register_operand" "r") (const_int 18) (const_int 18)))] "" "*return pdp10_output_halfword_extv (insn, operands, 18);") ; (define_insn "*HxL" ; [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") ; (const_int 18) ; (const_int 0)) ; (subreg:SI (match_operand:HI 1 "memory_operand" "m") 0))] ; "" ; "*return pdp10_output_halfword_insv (insn, operands, 0);") (define_insn "*HxLM" [(set (match_operand:HI 1 "memory_operand" "=m") (subreg:HI (lshiftrt:SI (match_operand:SI 0 "register_operand" "r") (const_int 18)) 2))] "" "*return pdp10_output_halfword_extv (insn, operands, 0);") (define_insn "*HLR" [(set (zero_extract:SI (match_operand:SI 0 "reg_or_mem_operand" "+r,m") (const_int 18) (const_int 18)) (lshiftrt:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int 18)))] "" "@ hlr %0,%W1 hlrm %1,%W0") (define_insn "HRRZ" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (and:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int RIGHT_HALF)))] "" { if (REG_P (operands[0]) && REG_P (operands[1]) && REGNO (operands[0]) == REGNO (operands[1]) && zero_extended_p (operands[0], 18, insn)) return ""; else { const char *insn[] = { "hrrz %0,%W1", "hrrzm %1,%W0" }; return insn[which_alternative]; } }) (define_insn "*HRRO" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (ior:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int LEFT_HALF)))] "" "@ hrro %0,%W1 hrrom %1,%W0") (define_insn "*HLLZ" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (and:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int LEFT_HALF)))] "" "@ hllz %0,%W1 hllzm %1,%W0") (define_insn "*HLLO" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (ior:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int RIGHT_HALF)))] "" "@ hllo %0,%W1 hllom %1,%W0") (define_insn "*HLL" [(set (zero_extract:SI (match_operand:SI 0 "reg_or_mem_operand" "+r,m") (const_int 18) (const_int 0)) (lshiftrt:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int 18)))] "" "@ hll %0,%W1 hllm %1,%W0") (define_insn "HLRZ" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (lshiftrt:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int 18)))] "" "@ hlrz %0,%1 hlrzm %1,%0") (define_insn "HLRE" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (ashiftrt:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int 18)))] "" "@ hlre %0,%1 hlrem %1,%0") (define_insn "*HLRE_extract" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:HI 1 "memory_operand" "m") (const_int 18) (const_int 0)))] "" "hlre %0,%W1") (define_insn "*HRLZ" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (ashift:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r") (const_int 18)))] "" "@ hrlz %0,%1 hrlzm %1,%0") (define_insn "*loadhi" [(set (match_operand:HI 0 "register_operand" "=r") (match_operand:HI 1 "memory_operand" "m>"))] "" "*return pdp10_output_movhi (operands, 0);") (define_insn "*zloadhi" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:HI 1 "memory_operand" "m>")))] "" "*return pdp10_output_movhi (operands, 0);") (define_insn "*sloadhi_1" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:HI 1 "pdp10_maybe_volatile_memory_operand" "m")))] "pdp10_pointer_alignment (XEXP (operands[1], 0)) >= UNITS_PER_WORD" "*return pdp10_output_movhi (operands, 1);") (define_insn "*sloadhi_2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:HI 1 "pdp10_maybe_volatile_memory_operand" "m")))] "pdp10_pointer_alignment (XEXP (operands[1], 0)) < UNITS_PER_WORD" { output_asm_insn (pdp10_output_movhi (operands, 0), operands); return "hrre %0,%0"; } [(set_attr "length" "2")]) (define_insn "storehi" [(set (match_operand:HI 0 "memory_operand" "=m>") (match_operand:HI 1 "register_operand" "r"))] "" "*return pdp10_output_movhi (operands, 0);") (define_insn "*zstorehi" [(set (match_operand:SI 0 "memory_operand" "=m") (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))] "" "hrrzm %1,%0") (define_insn "*sstorehi" [(set (match_operand:SI 0 "memory_operand" "=m") (sign_extend:SI (match_operand:HI 1 "memory_operand" "r")))] "" "hrrem %1,%0") (define_expand "extv" [(set (match_operand:SI 0 "register_operand" "") (sign_extract:SI (match_operand:SI 1 "reg_or_mem_operand" "") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "" "if (INTVAL (operands[2]) + INTVAL (operands[3]) > BITS_PER_WORD) FAIL; if (!TARGET_XKL2) { if (pdp10_expand_extv (operands)) DONE; }") (define_insn "*extv_reg" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "!TARGET_XKL2" "*return pdp10_output_extv_sequence (operands);" [(set_attr "length" "3")]) (define_insn "*extv_mem" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:QI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "!TARGET_XKL2" "*return pdp10_output_extv_sequence (operands);" [(set_attr "length" "3")]) (define_insn "*extv_memsi" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "!TARGET_XKL2" "*return pdp10_output_extv_sequence (operands);" [(set_attr "length" "3")]) (define_insn "*LDBE_reg" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "TARGET_XKL2" "*return pdp10_output_extv (insn, operands);") (define_insn "*LDBE_regqi" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:QI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "TARGET_XKL2" "*return pdp10_output_extv (insn, operands);") (define_insn "*LDBE_mem" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extract:SI (match_operand:QI 1 "memory_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "TARGET_XKL2" "*return pdp10_output_extv (insn, operands);") (define_expand "extzv" [(set (match_operand:SI 0 "register_operand" "") (zero_extract:SI (match_operand:SI 1 "reg_or_mem_operand" "") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "" "if (INTVAL (operands[2]) + INTVAL (operands[3]) > BITS_PER_WORD) FAIL; if (pdp10_expand_extzv (operands)) DONE;") (define_insn "*extzv_reg_sequence" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) == 16 || INTVAL (operands[3]) == 0" "*return pdp10_output_extzv_sequence (operands);" [(set_attr "length" "3")]) (define_insn "*extzv_memsi_sequence" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extract:SI (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) == 16 || (TARGET_EXTENDED && (INTVAL (operands[3]) == 0 || INTVAL (operands[2]) + INTVAL (operands[3]) == 36) && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0)))" ; && (GET_CODE (XEXP (operands[1], 0)) == REG ; || GET_CODE (XEXP (operands[1], 0)) == PLUS))" ; || (GET_CODE (XEXP (operands[1], 0)) == PLUS ; && INTVAL (XEXP (XEXP (operands[1], 0), 1)) ; % UNITS_PER_WORD == 0)))" "*return pdp10_output_extzv_sequence (operands);" [(set_attr "length" "3")]) (define_insn "*extzv_mem_sequence" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extract:SI (match_operand:QI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) == 16 || (TARGET_EXTENDED && INTVAL (operands[3]) == 0 && !CONSTANT_ADDRESS_P (XEXP (operands[1], 0)) && (GET_CODE (XEXP (operands[1], 0)) == REG || (GET_CODE (XEXP (operands[1], 0)) == PLUS && INTVAL (XEXP (XEXP (operands[1], 0), 1)) % UNITS_PER_WORD == 0)))" "*return pdp10_output_extzv_sequence (operands);" [(set_attr "length" "3")]) (define_insn "*extzv_reg" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) != 16" "*return pdp10_output_extzv (insn, operands);") (define_insn "*extzv_mem" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extract:SI (match_operand:QI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) != 16" "*return pdp10_output_extzv (insn, operands);") (define_insn "*extzv_memsi" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extract:SI (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) != 16" "*return pdp10_output_extzv (insn, operands);") (define_insn "*move_dpb" [(set (match_operand:QI 0 "memory_operand" "=m") (subreg:QI (zero_extract:SI (match_operand:SI 2 "memory_operand" "m") (const_int 9) (const_int 27)) 3)) (clobber (match_scratch:SI 1 "=r"))] "" { output_asm_insn ("move %1,%2", operands); return pdp10_output_store_byte (insn, operands); } [(set_attr "length" "2")]) (define_insn "*move_dpb2" [(set (zero_extract:SI (match_operand:SI 0 "memory_operand" "+m") (const_int 8) (const_int 0)) (and:SI (match_operand:SI 2 "memory_operand" "m") (const_int 255))) (clobber (match_scratch:SI 1 "=r"))] "" { output_asm_insn ("move %1,%2", operands); return pdp10_output_store_byte (insn, operands); } [(set_attr "length" "2")]) (define_expand "insv" [(set (zero_extract:SI (match_operand:SI 0 "reg_or_mem_operand" "") (match_operand:SI 1 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "")) (match_operand:SI 3 "register_operand" ""))] "" "if (INTVAL (operands[1]) + INTVAL (operands[2]) > BITS_PER_WORD) FAIL; /* FIXME: is this necessary? According to test/misc/array-loop.c, yes. */ if (GET_CODE (operands[0]) == MEM && GET_CODE (XEXP (operands[0], 0)) == REG && INTVAL (operands[1]) == BITS_PER_WORD && INTVAL (operands[2]) == 0) { emit_move_insn (gen_rtx_MEM (SImode, XEXP (operands[0], 0)), operands[3]); DONE; }") ; (define_insn "" ; [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") ; (const_int 18) ; (const_int 18)) ; (match_operand:SI 3 "register_operand" "r"))] ; "" ; "*return pdp10_output_insv (insn, operands);") (define_insn "*insv_reg" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r") (match_operand:SI 1 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "")) (match_operand:SI 3 "register_operand" "r"))] "" "*return pdp10_output_insv (insn, operands);") (define_insn "*insv_mem" [(set (zero_extract:SI (match_operand:QI 0 "memory_operand" "+m") (match_operand:SI 1 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "")) (match_operand:SI 3 "register_operand" "r"))] "" "*return pdp10_output_insv (insn, operands);") (define_insn "*insv_memsi" [(set (zero_extract:SI (match_operand:SI 0 "memory_operand" "+m") (match_operand:SI 1 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "")) (match_operand:SI 3 "register_operand" "r"))] "" "*return pdp10_output_insv (insn, operands);") (define_expand "movsi" [(set (match_operand:SI 0 "reg_or_mem_operand" "") (match_operand:SI 1 "general_operand" ""))] "" "if (GET_CODE (operands[0]) == ZERO_EXTRACT) operands[1] = force_reg (SImode, operands[1]);") ;; Special version using SKIPA to load a full-word constant. This may ;; be beneficial on processors with a cache. Note the 'x' constraint ;; on alternative 7. Reload can fall back on the last alternative if ;; instisting on moving to register 0. (define_insn "*movsi_cache" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,r,r,r,x,m,m,m,r") ;; ADDRESS: the S constraint allows a symbol. (match_operand:SI 1 "general_operand" "rm,I,S,L,M,N,P,i,O,M,r,i"))] "TARGET_CACHE && !optimize_size" "*return pdp10_output_movsi (insn, which_alternative);" [(set_attr "length" "1,1,1,1,1,1,1,2,1,1,1,1")]) (define_insn "*movsi_nocache" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,r,r,r,r,m,m,m") ;; ADDRESS: the S constraint allows a symbol. (match_operand:SI 1 "general_operand" "rm,I,S,L,M,N,P,i,O,M,r"))] "" "*return pdp10_output_movsi (insn, which_alternative);") (define_insn "move_two_halves" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (ashift:SI (match_operand:SI 1 "immediate_operand" "p") (const_int 18)) (match_operand:SI 2 "immediate_operand" "p")))] "" "move %0,[%1,,%2]") (define_insn "*MOVEI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "movei %0,%2(%1)") (define_insn "*MOVS" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (match_operator:SI 1 "pdp10_rotate_operator" [(match_operand:SI 2 "reg_or_mem_operand" "rm,r") (const_int 18)]))] "" "@ movs %0,%2 movsm %2,%0") (define_insn "*EXCH" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (match_operand:SI 1 "register_operand" "r")) (set (match_operand:SI 2 "register_operand" "=1") (match_dup 0))] "" "exch %1,%0") (define_insn "*SETZB" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (const_int 0)) (set (match_operand:SI 1 "register_operand" "=r") (const_int 0))] "" "setzb %1,%0") (define_expand "movdi" [(set (match_operand:DI 0 "reg_or_mem_operand" "") (match_operand:DI 1 "general_operand" ""))] "" "if (!HAVE_DMOVE && pdp10_expand_dmove (operands[0], operands[1])) DONE;") ;; TODO: if there's a REG_UNUSED note attached to this insn, avoid ;; moving the unused part of the DImode register. (define_insn "DMOVE" [(set (match_operand:DI 0 "reg_or_mem_operand" "=r,r,r,r,r,o,m") (match_operand:DI 1 "general_operand" "rm,O,I,J,i,O,r"))] "TARGET_KI10up" "@ dmove %0,%1 setzb %0,%Z0 movei %0,0\;movei %Z0,%1 seto %0,\;movni %Z0,%n1 dmove %0,[%D1] setzm %0\;setzm %Z0 dmovem %1,%0" [(set_attr "length" "1,1,2,2,1,2,1")]) (define_insn "*movdi" [(set (match_operand:DI 0 "reg_or_mem_operand" "=r,r,r,r,r,o,o") (match_operand:DI 1 "general_operand" "ro,O,I,J,i,O,r"))] "!TARGET_KI10up" "@ move %0,%1\;move %Z0,%Z1 setzb %0,%Z0 movei %0,0\;movei %Z0,%1 seto %0,\;movni %Z0,%n1 move %0,[%A1]\;move %Z0,[%B1] setzm %0\;setzm %Z0 movem %1,%0\;movem %Z1,%Z0" [(set_attr "length" "2,1,2,2,2,2,2")]) (define_expand "movti" [(set (match_operand:TI 0 "reg_or_mem_operand" "") (match_operand:TI 1 "general_operand" ""))] "TARGET_KI10up" "if (pdp10_expand_move_4 (operands[0], operands[1])) DONE;") (define_insn "movsf" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,r,r,r,m,m") (match_operand:SF 1 "general_operand" "rm,R,G,F,R,r"))] "" "@ move %0,%1%; movsf movei %0,0%; movsf movsi %0,%G1%; movsf move %0,[%1]%; movsf setzm %0%; movsf movem %1,%0%; movsf") (define_expand "movdf" [(set (match_operand:DF 0 "reg_or_mem_operand" "") (match_operand:DF 1 "general_operand" ""))] "" "if (!HAVE_DMOVE && pdp10_expand_dmove (operands[0], operands[1])) DONE;") (define_insn "*movdf_KI10up" [(set (match_operand:DF 0 "reg_or_mem_operand" "=r,r,r,r,o,m") (match_operand:DF 1 "general_operand" "rm,R,G,F,R,r"))] "TARGET_KI10up" "@ dmove %0,%1 setzb %0,%Z0%; movdf movsi %0,%G1%; movdf\;movei %Z0,0%; movdf dmove %0,[%1] setzm %0%; movdf\;setzm %Z0%; movdf dmovem %1,%0" [(set_attr "length" "1,1,2,1,2,1")]) (define_insn "*movdf_notKI10up" [(set (match_operand:DF 0 "reg_or_mem_operand" "=r,r,r,r,o,o") (match_operand:DF 1 "general_operand" "ro,R,G,F,R,r"))] "!TARGET_KI10up" "@ move %0,%1%; movdf\;move %Z0,%Z1%; movdf setzb %0,%Z0%; movdf movsi %0,%G1%; movdf\;movei %Z0,0%; movdf move %0,[%A1]%; movdf\;move %Z0,[%B1]%; movdf setzm %0%; movdf\;setzm %Z0%; movdf movem %1,%0%; movdf\;movem %Z1,%Z0%; movdf" [(set_attr "length" "2,1,2,2,2,2")]) (define_expand "movstrsi" [(match_operand:BLK 0 "general_operand" "") (match_operand:BLK 1 "general_operand" "") (match_operand:SI 2 "general_operand" "") (match_operand:SI 3 "const_int_operand" "")] "" "if (pdp10_expand_movstrsi (operands)) DONE; FAIL;") (define_expand "clrstrsi" [(match_operand:BLK 0 "general_operand" "") (match_operand:SI 1 "general_operand" "") (match_operand:SI 2 "const_int_operand" "")] "" "if (pdp10_expand_clrstrsi (operands)) DONE; FAIL;") ; (define_expand "cmpstrsi" ; [(set (match_operand:SI 0 "register_operand" "") ; (compare:SI (match_operand:BLK 1 "general_operand" "") ; (match_operand:BLK 2 "general_operand" ""))) ; (use (match_operand:SI 3 "general_operand" "")) ; (use (match_operand:SI 4 "const_int_operand" ""))] ; "TARGET_KL10up && TARGET_STRING" ; "if (pdp10_expand_cmpstrsi (operands)) ; DONE; ; FAIL;") (define_insn "BLT" [(unspec_volatile:BLK [(match_operand:SI 0 "register_operand" "r")] VUNSPEC_BLT) (clobber (match_dup 0)) (use (match_operand:BLK 1 "memory_operand" "m"))] "" "blt %0,%1") (define_insn "XBLT" [(unspec_volatile:BLK [(match_operand:TI 0 "register_operand" "+r")] VUNSPEC_XBLT) (clobber (match_dup 0))] "TARGET_KL10up" "extend %0,[xblt]") ; (define_insn "MOVSLJ" ; [(unspec_volatile:BLK [(match_operand:SI 0 "register_operand" "+r")] ; VUNSPEC_MOVSLJ)] ; "TARGET_KL10up && TARGET_STRING" ; "extend %0,[movslj]") ; (define_insn "MOVST" ; [(unspec_volatile:BLK [(match_operand:SI 0 "register_operand" "+r")] ; VUNSPEC_MOVST)] ; "TARGET_KL10up && TARGET_STRING" ; "extend %0,[movst]") ; (define_insn "CMPS" ; [(unspec_volatile:BLK [(match_operand:SI 0 "register_operand" "+r")] ; VUNSPEC_CMPS)] ; "TARGET_KL10up && TARGET_STRING" ; "extend %0,[cmps]") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Conditional Data Movement ;; (define_expand "cstoresi4" ...) ;; (define_expand "cstoresf4" ...) (define_expand "seq" [(set (match_operand:SI 0 "register_operand" "") (eq:SI (match_dup 1) (match_dup 2)))] "" "if (GET_MODE (pdp10_compare_op0) == DFmode) FAIL; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "sne" [(set (match_operand:SI 0 "register_operand" "") (ne:SI (match_dup 1) (match_dup 2)))] "" "if (GET_MODE (pdp10_compare_op0) == DFmode) FAIL; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "slt" [(set (match_operand:SI 0 "register_operand" "") (lt:SI (match_dup 1) (match_dup 2)))] "" "if (GET_MODE (pdp10_compare_op0) == DFmode) FAIL; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "sgt" [(set (match_operand:SI 0 "register_operand" "") (gt:SI (match_dup 1) (match_dup 2)))] "" "if (GET_MODE (pdp10_compare_op0) == DFmode) FAIL; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "sle" [(set (match_operand:SI 0 "register_operand" "") (le:SI (match_dup 1) (match_dup 2)))] "" "if (GET_MODE (pdp10_compare_op0) == DFmode) FAIL; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "sge" [(set (match_operand:SI 0 "register_operand" "") (ge:SI (match_dup 1) (match_dup 2)))] "" "if (GET_MODE (pdp10_compare_op0) == DFmode) FAIL; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "sltu" [(set (match_operand:SI 0 "register_operand" "") (lt:SI (match_dup 1) (match_dup 2)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_expand "sgtu" [(set (match_operand:SI 0 "register_operand" "") (gt:SI (match_dup 1) (match_dup 2)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_expand "sleu" [(set (match_operand:SI 0 "register_operand" "") (le:SI (match_dup 1) (match_dup 2)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_expand "sgeu" [(set (match_operand:SI 0 "register_operand" "") (ge:SI (match_dup 1) (match_dup 2)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_insn "*snesi" [(set (match_operand:SI 0 "register_operand" "=r,x") (ne:SI (match_operand:SI 1 "reg_or_mem_operand" "0,rm") (const_int 0)))] "" "@ skipe %@%0\;%_movei %0,1 skipe %0,%1\;%_movei %0,1" [(set_attr "length" "2")]) (define_insn "*sgesi" [(set (match_operand:SI 0 "register_operand" "=r") (ge:SI (match_operand:SI 1 "register_operand" "0") (const_int 0)))] "" "lsh %0,-43\;xori %0,1" [(set_attr "length" "2")]) ;; This seemingly useless instruction combination is needed to enable ;; the combination below. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (plus:SI (match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "reg_or_mem_operand" "rm")) (const_int SIGNBIT)))] "0" "add %0,%2\;tlc %0,400000") ;; Calculate the truth value of this particular unsigned comparison ;; with ADD and JCRY0. (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (gt:SI (xor:SI (match_operand:SI 1 "register_operand" "r") (const_int SIGNBIT)) (xor:SI (plus:SI (match_operand:SI 2 "register_operand" "0") (match_operand:SI 3 "reg_or_mem_operand" "1")) (const_int SIGNBIT))))] "0" "jfcl 17,.+1\;add %0,%3\;jcry0 .+2\;%_tdza %0,%0\;movei %0,1") (define_insn "*sccsi" [(set (match_operand:SI 0 "register_operand" "=r,r") (match_operator:SI 1 "pdp10_comparison_operator" [(match_operand:SI 2 "reg_or_mem_operand" "r,rm") (match_operand:SI 3 "general_operand" "rm,O")]))] "" "@ cam%1 %2,%3\;%_tdza %0,%0\;%_%_movei %0,1 skip%1 %@%2\;%_tdza %0,%0\;%_%_movei %0,1" [(set_attr "length" "3")]) (define_insn "*snesf" [(set (match_operand:SI 0 "register_operand" "=r,x") (ne:SI (match_operand:SF 1 "reg_or_mem_operand" "0,rm") (match_operand:SF 2 "immediate_operand" "R,R")))] "" "@ skipe %@%0\;%_movei %0,1 skipe %0,%1\;%_movei %0,1" [(set_attr "length" "2")]) (define_insn "*sltsf" [(set (match_operand:SI 0 "register_operand" "=r") (lt:SI (match_operand:SF 1 "register_operand" "0") (match_operand:SF 2 "immediate_operand" "R")))] "" "lsh %0,-43") (define_insn "*sgesf" [(set (match_operand:SI 0 "register_operand" "=r") (ge:SI (match_operand:SF 1 "register_operand" "0") (match_operand:SF 2 "immediate_operand" "R")))] "" "lsh %0,-43\;xori %0,1" [(set_attr "length" "2")]) (define_insn "*sccsf" [(set (match_operand:SI 0 "register_operand" "=r,r") (match_operator:SI 1 "pdp10_comparison_operator" [(match_operand:SF 2 "reg_or_mem_operand" "r,rm") (match_operand:SF 3 "general_operand" "rm,R")]))] "" "@ cam%1 %2,%3\;%_tdza %0,%0\;%_%_movei %0,1 skip%1 %@%2\;%_tdza %0,%0\;%_%_movei %0,1" [(set_attr "length" "3")]) (define_insn "*snedf" [(set (match_operand:SI 0 "register_operand" "=x") (ne:SI (match_operand:DF 1 "reg_or_mem_operand" "ro") (match_operand:DF 2 "pdp10_const_double_0_operand" "")))] "" "skipn %@%1\;%_skipe %0,%Z1\;%_%_movei %0,1" [(set_attr "length" "3")]) (define_insn "*sltdf" [(set (match_operand:SI 0 "register_operand" "=r") (lt:SI (match_operand:DF 1 "register_operand" "0") (match_operand:DF 2 "immediate_operand" "R")))] "" "lsh %0,-43") (define_insn "*sgedf" [(set (match_operand:SI 0 "register_operand" "=r") (ge:SI (match_operand:DF 1 "register_operand" "0") (match_operand:DF 2 "immediate_operand" "R")))] "" "lsh %0,-43\;xori %0,1" [(set_attr "length" "2")]) ;; (define_expand "cmovsi6" ...) ;; (define_expand "cmovsf6" ...) ;; Reload can't handle JUMP_INSNs (such as this one) with spilled ;; register outputs. Therefore, this pattern must have a memory ;; alternative for operand 3. (define_insn "*move_and_skipsi" [(set (pc) (if_then_else (match_operator 0 "pdp10_comparison_operator" [(match_operand:SI 1 "reg_or_mem_operand" "r,rm,r,m") (const_int 0)]) (label_ref (match_operand 2 "" "")) (pc))) ;; The predicate is "preferably_register_operand" so that memory ;; operands are invalid until after register allocation. The ;; memory constraint is just there as a last resort when operand 3 ;; is spilled to stack. The "r" constraint is there to allow ;; accumulator 0. (set (match_operand:SI 3 "preferably_register_operand" "=1,x,rm,!rm") (match_dup 1))] "" { if (which_alternative == 0) return "jump%0 %1,%F2"; pdp10_remove_unnecessary_label (insn, operands[2]); switch (get_attr_length (insn)) { case 1: return "skip%0 %3,%1"; case 2: if (which_alternative == 2) return "movem %1,%3\;jump%0 %1,%F2"; else if (REGNO (operands[3]) == 0) return "move %3,%1\;jump%0 %3,%F2"; else { output_asm_insn ("skip%R0 %3,%1", operands); return pdp10_output_jrst (operands[2]); } /* FIXME: is the use of a fixed scratch register avoidable? */ case 3: return "move 0,%1\;movem 0,%3\;jump%0 0,%F2"; default: abort (); } } [(set (attr "length") (cond [(eq_attr "alternative" "0") (const_int 1) (eq_attr "alternative" "2") (const_int 2) (eq_attr "alternative" "3") (const_int 3) (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1)] (const_int 2))) (set_attr "skip" "yes")]) ; (define_insn "*move_and_skipsi" ; [(set (pc) ; (if_then_else (match_operator 0 "pdp10_comparison_operator" ; [(match_operand:SI 1 "reg_or_mem_operand" "r,rm,rm") ; (const_int 0)]) ; (label_ref (match_operand 2 "" "")) ; (pc))) ; ;; The predicate is "preferably_register_operand" so that memory ; ;; operands are invalid until after register allocation. The ; ;; memory constraint is just there as a last resort when operand 3 ; ;; is spilled to stack. The "r" constraint is there to allow ; ;; accumulator 0. ; (set (match_operand:SI 3 "preferably_register_operand" "=1,x,!rm") ; (match_dup 1))] ; "" ; { ; if (which_alternative == 0) ; return "jump%0 %1,%F2"; ; pdp10_remove_unnecessary_label (insn, operands[2]); ; switch (get_attr_length (insn)) ; { ; case 1: ; return "skip%0 %3,%1"; ; case 2: ; if (REGNO (operands[3]) == 0) ; return "move %3,%1\;jump%0 %3,%F2"; ; else ; { ; output_asm_insn ("skip%R0 %3,%1", operands); ; return pdp10_output_jrst (operands[2]); ; } ; /* FIXME: is the use of a fixed scratch register avoidable? */ ; case 3: ; return "move 0,%1\;movem 0,%3\;jump%0 0,%F2"; ; default: ; abort (); ; } ; } ; [(set (attr "length") ; (cond [(eq_attr "alternative" "0") (const_int 1) ; (eq_attr "alternative" "2") (const_int 3) ; (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1)] ; (const_int 2))) ; (set_attr "skip" "yes")]) ;; Reload can't handle JUMP_INSNs (such as this one) with spilled ;; register outputs. Therefore, this pattern must have a memory ;; alternative for operand 4. (define_insn "*move_and_skipsf" [(set (pc) (if_then_else (match_operator 0 "pdp10_comparison_operator" [(match_operand:SF 1 "reg_or_mem_operand" "rm,rm,rm") (match_operand:SF 2 "pdp10_const_double_0_operand" "")]) (label_ref (match_operand 3 "" "")) (pc))) ;; The predicate is "preferably_register_operand" so that memory ;; operands are invalid until after register allocation pass. The ;; memory constraint is just there as a last resort when operand 3 ;; is spilled to stack. The "r" constraint is there to allow ;; accumulator 0. (set (match_operand:SF 4 "preferably_register_operand" "=1,x,!rm") (match_dup 1))] "" { if (which_alternative == 0) return "jump%0 %1,%F3"; pdp10_remove_unnecessary_label (insn, operands[3]); switch (get_attr_length (insn)) { case 1: return "skip%0 %4,%1"; case 2: if (REGNO (operands[3]) == 0) return "move %4,%1\;jump%0 %4,%F3"; else { output_asm_insn ("skip%R0 %4,%1", operands); return pdp10_output_jrst (operands[3]); } /* FIXME: is the use of a fixed scratch register avoidable? */ case 3: return "move 0,%1\;movem 0,%4\;jump%0 0,%F3"; default: abort (); } } [(set (attr "length") (cond [(eq_attr "alternative" "0") (const_int 1) (eq_attr "alternative" "2") (const_int 3) (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1)] (const_int 2))) (set_attr "skip" "yes")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Integer Arithmetic (define_expand "addsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_operand:SI 1 "reg_or_mem_operand" "") (match_operand:SI 2 "general_operand" "")))] "" ;; Make sure that for a MEM + x, x can only be a register or +/-1. "if (memory_operand (operands[1], SImode) && !(register_operand (operands[2], SImode) || (const_int_operand (operands[2], SImode) && (INTVAL (operands[2]) == 1 || INTVAL (operands[2]) == -1)))) operands[2] = force_reg (SImode, operands[2]);") (define_insn "*addsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,r,m,m,m") (plus:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0,0,r,0,0,0,0") ;; ADDRESS: an S constraint for the addi case would allow ;; a symbol. (match_operand:SI 2 "general_operand" "rm,I,J,S,i,r,Q,M")))] "" ; ;; Make sure that for a MEM + x, x can only be a register or +/-1. ; "!(memory_operand (operands[1], SImode) ; && !(register_operand (operands[2], SImode) ; || (const_int_operand (operands[2], SImode) ; && (INTVAL (operands[2]) == 1 || INTVAL (operands[2]) == -1))))" "@ add %0,%2 addi %0,%2 subi %0,%N2 xmovei %0,%2(%1) add %0,[%X2] addm %2,%0 aos %@%0 sos %@%0") (define_insn "*ADDI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "addi %0,(%1)") (define_insn "*ADDI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (plus:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "addi %0,%2(%1)") (define_insn "*ADDB1" [(set (match_operand:SI 0 "memory_operand" "+m") (plus:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (plus:SI (match_dup 0) (match_dup 1)))] "" "addb %1,%0") (define_insn "*ADDB2" [(set (match_operand:SI 0 "memory_operand" "+m") (plus:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (plus:SI (match_dup 1) (match_dup 0)))] "" "addb %1,%0") (define_insn "*AOS_and_move" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (plus:SI (match_dup 0) (const_int 1))) (set (match_operand:SI 1 "register_operand" "=x") (plus:SI (match_dup 0) (const_int 1)))] "" "aos %1,%0") (define_expand "adddi3" [(set (match_operand:DI 0 "register_operand" "") (plus:DI (match_operand:DI 1 "register_operand" "") (match_operand:DI 2 "general_operand" "")))] "TARGET_KL10up && TARGET_71BIT" "") (define_insn "*adddi3" [(set (match_operand:DI 0 "reg_or_mem_operand" "=r,r,r,r,o,o,o") (plus:DI (match_operand:DI 1 "reg_or_mem_operand" "%0,0,0,0,0,0,0") (match_operand:DI 2 "general_operand" "ro,I,J,i,r,Q,M")))] "0 && !TARGET_71BIT" "@ jfcl 17,.+1\;add %Z0,%Z2\;jcry0 [aoja %0,.+1]\;add %0,%2 jfcl 17,.+1\;addi %Z0,%2\;jcry0 [aoja %0,.+1] jfcl 17,.+1\;subi %Z0,%N2\;jcry0 .+2\;%_subi %0,1 jfcl 17,.+1\;add %Z0,[%B2]\;jcry0 [aoja %0,.+1]\;add %0,[%A2] jfcl 17,.+1\;addm %Z2,%Z0\;jcry0 [aos %0\;jrst .+1]\;add %2,%0 jfcl 17,.+1\;aos %Z0\;jcry0 [aos %0\;jrst .+1]\;aos %0 jfcl 17,.+1\;sos %Z0\;jcry0 .+2\;sos %0\;sos %0" [(set_attr "length" "4,3,4,4,4,4,5")]) (define_insn "*DADD" [(set (match_operand:DI 0 "register_operand" "=r,r") (plus:DI (match_operand:DI 1 "register_operand" "%0,0") (match_operand:DI 2 "general_operand" "rm,i")))] "TARGET_71BIT && TARGET_KL10up" "@ dadd %0,%2 dadd %0,[%D2]") (define_expand "subsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "") (minus:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "if (!register_operand (operands[1], SImode)) operands[1] = force_reg (SImode, operands[1]);") (define_insn "*subsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (minus:SI (match_operand:SI 1 "register_operand" "0,r") (match_operand:SI 2 "general_operand" "rm,0")))] "" "@ sub %0,%2 subm %1,%0") (define_insn "*SUBI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "0") (and:SI (match_operand:SI 2 "register_operand" "x") (const_int RIGHT_HALF))))] "" "subi %0,(%2)") (define_insn "*SUBI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (minus:SI (match_operand:SI 1 "register_operand" "0") (and:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "const_int_operand" "I")) (const_int RIGHT_HALF))))] "pdp10_const_ok_for_letter_p (INTVAL (operands[3]), 'I')" "subi %0,%3(%2)") (define_insn "*SUBB" [(set (match_operand:SI 0 "memory_operand" "+m") (minus:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (minus:SI (match_dup 1) (match_dup 0)))] "" "subb %1,%0") (define_insn "*SOS_and_move" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (plus:SI (match_dup 0) (const_int -1))) (set (match_operand:SI 1 "register_operand" "=x") (plus:SI (match_dup 0) (const_int -1)))] "" "sos %1,%0") (define_expand "subdi3" [(set (match_operand:DI 0 "register_operand" "") (minus:DI (match_operand:DI 1 "register_operand" "") (match_operand:DI 2 "general_operand" "")))] "TARGET_KL10up && TARGET_71BIT" "") (define_insn "*subdi3" [(set (match_operand:DI 0 "register_operand" "=r,o") (minus:DI (match_operand:DI 1 "register_operand" "%0,0") (match_operand:DI 2 "reg_or_mem_operand" "ro,r")))] "0 && !TARGET_71BIT" "@ jfcl 17,.+1\;sub %Z0,%Z2\;jcry0 .+2\;%_subi %0,1\;sub %0,%2 jfcl 17,.+1\;subm %Z2,%Z0\;jcry0 .+2\;%_sos %0\;subm %2,%0" [(set_attr "length" "5,5")]) (define_insn "*DSUB" [(set (match_operand:DI 0 "register_operand" "=r,r") (minus:DI (match_operand:DI 1 "register_operand" "0,0") (match_operand:DI 2 "reg_or_mem_operand" "rm,i")))] "TARGET_71BIT && TARGET_KL10up" "@ dsub %0,%2 dsub %0,[%D2]") (define_insn "mulsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,m") (mult:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0,0,0") (match_operand:SI 2 "general_operand" "rm,I,i,r")))] "" "@ imul %0,%2 imuli %0,%2 imul %0,[%2] imulm %2,%0") (define_insn "*IMULI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "imuli %0,(%1)") (define_insn "*IMULI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (mult:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "imuli %0,%2(%1)") (define_insn "*IMULB1" [(set (match_operand:SI 0 "memory_operand" "+m") (mult:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (mult:SI (match_dup 0) (match_dup 1)))] "" "imulb %1,%0") (define_insn "*IMULB2" [(set (match_operand:SI 0 "memory_operand" "+m") (mult:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (mult:SI (match_dup 1) (match_dup 0)))] "" "imulb %1,%0") (define_expand "mulsidi3" [(set (match_operand:DI 0 "register_operand" "") (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "")) (sign_extend:DI (match_operand:SI 2 "general_operand" ""))))] "TARGET_71BIT" "") (define_insn "*mulsidi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%0,0,0")) (sign_extend:DI (match_operand:SI 2 "general_operand" "rm,I,i"))))] "TARGET_71BIT" "@ mul %0,%2 muli %0,%2 mul %0,[%2]") (define_insn "MUL" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (unspec:DI [(sign_extend:DI (match_operand:SI 1 "register_operand" "%0,0,0")) (sign_extend:DI (match_operand:SI 2 "general_operand" "rm,I,i"))] UNSPEC_MUL71))] "" "@ mul %0,%2 muli %0,%2 mul %0,[%2]") (define_expand "smulsi3_highpart" [(set (match_dup 3) (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%r")) (sign_extend:DI (match_operand:SI 2 "reg_or_mem_operand" "0"))) (const_int 35)))) (set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (ashiftrt:SI (match_dup 3) (neg:SI (const_int -1))))] "0" "operands[3] = gen_reg_rtx (SImode);") (define_insn "*smulsi3_highpart" [(set (match_operand:SI 0 "register_operand" "=r") (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%0")) (sign_extend:DI (match_operand:SI 2 "register_operand" "r"))) (const_int 36))))] "0" "jfcl .+1\;mulm %2,%0\;jov [movsi %0,200000\;%_%_%_%_%_jrst .+2]\;ash %0,-1" [(set_attr "length" "4")]) (define_insn "*smulsi3_highpart_71" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (truncate:SI (lshiftrt:DI (mult:DI (sign_extend:DI (match_operand:SI 1 "register_operand" "%r")) (sign_extend:DI (match_operand:SI 2 "reg_or_mem_operand" "0"))) (const_int 35))))] "0" "mulm %1,%0") (define_expand "muldi3" [(set (match_operand:DI 0 "register_operand" "") (mult:DI (match_operand:DI 1 "register_operand" "") (match_operand:DI 2 "reg_or_mem_operand" "")))] "0" "{ rtx temp = gen_reg_rtx (TImode); emit_move_insn (gen_rtx_SUBREG (DImode, temp, 0), operands[1]); emit_insn (gen_DMUL (temp, gen_rtx_SUBREG (DImode, temp, 8), operands[2])); emit_insn (gen_ashlsi3 (gen_rtx_SUBREG (SImode, temp, 8), gen_rtx_SUBREG (SImode, temp, 8), GEN_INT (1))); emit_insn (gen_lshrdi3 (gen_rtx_SUBREG (DImode, temp, 4), gen_rtx_SUBREG (DImode, temp, 4), GEN_INT (1))); emit_insn (gen_ashlsi3 (gen_rtx_SUBREG (SImode, temp, 12), gen_rtx_SUBREG (SImode, temp, 12), GEN_INT (1))); emit_insn (gen_lshrdi3 (gen_rtx_SUBREG (DImode, temp, 8), gen_rtx_SUBREG (DImode, temp, 8), GEN_INT (1))); emit_insn (gen_TRNE_TLO (gen_rtx_SUBREG (SImode, temp, 8), gen_rtx_SUBREG (SImode, temp, 8), gen_rtx_SUBREG (SImode, temp, 12))); DONE; }") (define_insn "TRNE_TLO" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "register_operand" "r")] UNSPEC_TRNE_TLO))] "" "trne %2,1\;%_tlo %0,400000" [(set_attr "length" "2")]) (define_expand "mulditi3" [(set (match_operand:TI 0 "register_operand" "=r,r") (mult:TI (sign_extend:TI (match_operand:DI 1 "register_operand" "%0,0")) (sign_extend:TI (match_operand:DI 2 "general_operand" "rm,i"))))] "TARGET_71BIT && TARGET_KL10up" "") (define_insn "DMUL" [(set (match_operand:TI 0 "register_operand" "=r,r") (mult:TI (sign_extend:TI (match_operand:DI 1 "register_operand" "%0,0")) (sign_extend:TI (match_operand:DI 2 "general_operand" "rm,i"))))] "TARGET_71BIT && TARGET_KL10up" "@ dmul %0,%2 dmul %0,[%D2]") (define_insn "IDIV" [(set (subreg:SI (match_operand:DI 0 "register_operand" "=r,r,r") 0) (div:SI (match_operand:SI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "rm,I,i"))) (set (subreg:SI (match_dup 0) 4) (mod:SI (match_dup 1) (match_dup 2)))] "" "@ idiv %0,%2 idivi %0,%2 idiv %0,[%2]") (define_insn "IDIVM" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (div:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "reg_or_mem_operand" "0")))] "" "idivm %1,%0") ;; IDIVI with indexing missing. ;; IDIVB missing. (define_expand "divsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "") (div:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "if (immediate_operand (operands[2], SImode)) { rtx temp = gen_reg_rtx (DImode); rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0); emit_move_insn (temp0, operands[1]); emit_insn (gen_IDIV (temp, temp0, operands[2])); emit_move_insn (operands[0], temp0); } else emit_insn (gen_IDIVM (operands[0], operands[1], operands[2])); DONE;") (define_expand "modsi3" [(set (match_operand:SI 0 "register_operand" "") (mod:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "{ rtx temp = gen_reg_rtx (DImode); rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0); rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4); emit_move_insn (temp0, operands[1]); emit_insn (gen_IDIV (temp, temp0, operands[2])); emit_move_insn (operands[0], temp1); DONE; }") ;; This is disabled, since it doesn't seem to have any advantages over ;; the `divsi3' and `modsi3' patterns. (define_expand "_divmodsi4" [(parallel [(set (match_operand:SI 0 "reg_or_mem_operand" "") (div:SI (match_operand:SI 1 "reg_or_mem_operand" "") (match_operand:SI 2 "general_operand" ""))) (set (match_operand:SI 3 "reg_or_mem_operand" "") (mod:SI (match_dup 1) (match_dup 2)))])] "0" "{ rtx temp = gen_reg_rtx (DImode); rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0); rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4); emit_move_insn (temp0, operands[1]); emit_insn (gen_IDIV (temp, temp0, operands[2])); emit_move_insn (operands[0], temp0); emit_move_insn (operands[3], temp1); DONE; }") (define_insn "*DIV" [(set (subreg:SI (match_operand:DI 0 "register_operand" "=r,r,r") 0) (truncate:SI (div:DI (match_operand:DI 1 "register_operand" "0,0,0") (sign_extend:DI (match_operand:SI 2 "general_operand" "rm,I,i"))))) (set (subreg:SI (match_dup 0) 4) (truncate:SI (mod:DI (match_dup 1) (sign_extend:DI (match_dup 2)))))] "TARGET_71BIT" "@ div %0,%2 divi %0,%2 div %0,[%D2]") (define_insn "*DIVM" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (truncate:SI (div:DI (match_operand:DI 1 "register_operand" "r") (sign_extend:DI (match_operand:SI 2 "memory_operand" "0")))))] "TARGET_71BIT" "divm %1,%0") ;; DIVB missing. (define_insn "DDIV" [(set (subreg:DI (match_operand:TI 0 "register_operand" "=r,r") 0) (truncate:DI (div:TI (match_operand:TI 1 "register_operand" "0,0") (sign_extend:TI (match_operand:DI 2 "general_operand" "rm,i"))))) (set (subreg:DI (match_dup 0) 8) (truncate:DI (mod:TI (match_dup 1) (sign_extend:TI (match_dup 2)))))] "TARGET_71BIT" "@ ddiv %0,%2 ddiv %0,[%D2]") (define_expand "divmoddi4" [(parallel [(set (match_operand:DI 0 "reg_or_mem_operand" "") (div:DI (match_operand:DI 1 "register_operand" "") (match_operand:DI 2 "general_operand" ""))) (set (match_operand:DI 3 "register_operand" "") (mod:DI (match_dup 1) (match_dup 2)))])] "TARGET_71BIT" "{ rtx temp = gen_reg_rtx (TImode); emit_move_insn (gen_rtx_SUBREG (SImode, temp, 0), gen_rtx_SUBREG (SImode, operands[1], 0)); emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, temp, 0), gen_rtx_SUBREG (SImode, temp, 0), GEN_INT (35))); emit_move_insn (gen_rtx_SUBREG (SImode, temp, 4), gen_rtx_SUBREG (SImode, temp, 0)); emit_move_insn (gen_rtx_SUBREG (DImode, temp, 8), operands[1]); emit_insn (gen_DDIV (temp, temp, operands[2])); emit_move_insn (operands[0], gen_rtx_SUBREG (DImode, temp, 0)); emit_move_insn (operands[3], gen_rtx_SUBREG (DImode, temp, 8)); DONE; }") (define_insn "udivsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,m") (udiv:SI (match_operand:SI 1 "register_operand" "0,0,0,r") (match_operand:SI 2 "general_operand" "I,i,rm,0")))] "TARGET_XKL2" "@ extend %0,[uidivi %2] extend %0,[uidiv [%2]] extend %0,[uidiv %2] extend %1,[uidivm %0]") ;; UIDIVI with indexing missing. ;; UIDIVB missing. (define_insn "umodsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r,m") (umod:SI (match_operand:SI 1 "register_operand" "0,0,0,r") (match_operand:SI 2 "general_operand" "I,i,rm,0")))] "TARGET_XKL2" "@ extend %0,[uimodi %2] extend %0,[uimod [%2]] extend %0,[uimod %2] extend %1,[uimodm %0]") ;; UIMODI with indexing missing. ;; UIMODB missing. (define_insn "negsi2" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m,r,m") (neg:SI (match_operand:SI 1 "general_operand" "rm,r,I,0")))] "" "@ movn %0,%1 movnm %1,%0 movni %0,%N1 movns %0") (define_insn "*MOVNI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (and:SI (match_operand:SI 1 "register_operand" "r") (const_int RIGHT_HALF))))] "" "movni %0,(%1)") (define_insn "*MOVNI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (neg:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF))))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "movni %0,%2(%1)") (define_insn "*MOVNS" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (neg:SI (match_dup 0))) (set (match_operand:SI 1 "register_operand" "=x") (neg:SI (match_dup 0)))] "" "movns %1,%0") (define_expand "negdi2" [(set (match_operand:DI 0 "reg_or_mem_operand" "") (neg:DI (match_operand:DI 1 "reg_or_mem_operand" "")))] "TARGET_KI10up && TARGET_71BIT" "") (define_insn "*negdi2" [(set (match_operand:DI 0 "register_operand" "=r,r") (neg:DI (match_operand:DI 1 "reg_or_mem_operand" "0,ro")))] "!TARGET_71BIT" "@ setca %0,\;jumpe %Z0,[aoja %0,.+2]\;%_movn %Z0,%Z0 setcm %0,%1\;movn %Z0,%Z1\;jumpe %Z0,[aoja %0,.+1]" [(set_attr "length" "3,3")]) (define_insn "*DMOVN" [(set (match_operand:DI 0 "register_operand" "=r") (neg:DI (match_operand:DI 1 "reg_or_mem_operand" "rm")))] "TARGET_71BIT && TARGET_KI10up" "dmovn %0,%1\;tlne %0,400000\;%_tlo %Z0,400000" [(set_attr "length" "3")]) (define_insn "abssi2" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m,m") (abs:SI (match_operand:SI 1 "reg_or_mem_operand" "rm,r,0")))] "" "@ movm %0,%1 movmm %1,%0 movms %0") (define_insn "*MOVMS" [(set (match_operand:SI 0 "reg_or_mem_operand" "+rm") (abs:SI (match_dup 0))) (set (match_operand:SI 1 "register_operand" "=x") (abs:SI (match_dup 0)))] "" "movms %1,%0") (define_insn "smaxsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,x,x,x") (smax:SI (match_operand:SI 1 "register_operand" "%0,0,0,0,r,r,r,r") (match_operand:SI 2 "general_operand" "rm,I,M,i,0,O,I,rm")))] "" "@ camge %1,%2\;%_move %0,%2 caige %1,%2\;%_movei %0,%2 camge %1,[%2]\;%_seto %0, camge %1,[%2]\;%_move %0,[%2] camle %1,%2\;%_move %0,%1 skipge %0,%1\;%_movei %0,0 caile %1,%2\;%_skipa %0,%1\;%_%_movei %0,%2 camle %1,%2\;%_skipa %0,%1\;%_%_move %0,%2" [(set_attr "length" "2,2,2,2,2,2,3,3")]) (define_expand "umaxsi3" [(set (match_dup 3) (xor:SI (match_operand:SI 1 "reg_or_mem_operand" "") (const_int SIGNBIT))) (set (match_dup 4) (xor:SI (match_operand:SI 2 "reg_or_mem_operand" "") (const_int SIGNBIT))) (set (match_operand:SI 0 "register_operand" "") (if_then_else:SI (ge (match_dup 3) (match_dup 4)) (match_dup 1) (match_dup 2)))] "" "operands[3] = gen_reg_rtx (SImode); operands[4] = gen_reg_rtx (SImode);") (define_insn "*umaxsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,x") (if_then_else:SI (ge (match_operand:SI 3 "register_operand" "r,r,r") (match_operand:SI 4 "reg_or_mem_operand" "rm,rm,rm")) (match_operand:SI 1 "reg_or_mem_operand" "0,rm,rm") (match_operand:SI 2 "reg_or_mem_operand" "rm,0,rm")))] "" "@ camge %3,%4\;%_move %0,%2 camle %3,%4\;%_move %0,%1 camle %3,%4\;%_skipa %0,%1\;%_%_move %0,%2" [(set_attr "length" "2,2,3")]) (define_insn "sminsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r,r,x,x,x") (smin:SI (match_operand:SI 1 "register_operand" "%0,0,0,0,r,r,r,r") (match_operand:SI 2 "general_operand" "rm,I,M,i,0,O,I,rm")))] "" "@ camle %1,%2\;%_move %0,%2 caile %1,%2\;%_movei %0,%2 camle %1,[%2]\;%_seto %0, camle %1,[%2]\;%_move %0,[%2] camge %1,%2\;%_move %0,%1 skiple %0,%1\;%_movei %0,0 caige %1,%2\;%_skipa %0,%1\;%_%_movei %0,%2 camge %1,%2\;%_skipa %0,%1\;%_%_move %0,%2" [(set_attr "length" "2,2,2,2,2,2,3,3")]) (define_expand "uminsi3" [(set (match_dup 3) (xor:SI (match_operand:SI 1 "reg_or_mem_operand" "") (const_int SIGNBIT))) (set (match_dup 4) (xor:SI (match_operand:SI 2 "reg_or_mem_operand" "") (const_int SIGNBIT))) (set (match_operand:SI 0 "register_operand" "") (if_then_else:SI (le (match_dup 3) (match_dup 4)) (match_dup 1) (match_dup 2)))] "" "operands[3] = gen_reg_rtx (SImode); operands[4] = gen_reg_rtx (SImode);") (define_insn "*uminsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,x") (if_then_else:SI (le (match_operand:SI 3 "register_operand" "r,r,r") (match_operand:SI 4 "reg_or_mem_operand" "rm,rm,rm")) (match_operand:SI 1 "reg_or_mem_operand" "0,rm,rm") (match_operand:SI 2 "reg_or_mem_operand" "rm,0,rm")))] "" "@ camle %3,%4\;%_move %0,%2 camge %3,%4\;%_move %0,%1 camge %3,%4\;%_skipa %0,%1\;%_%_move %0,%2" [(set_attr "length" "2,2,3")]) ;; The JFFO instruction searches from the most significant bit while ;; FFS searches from the least significant bit. The bit index and ;; treatment of zero also differ. (define_expand "ffssi2" [(set (match_operand:SI 0 "register_operand" "") (ffs:SI (match_operand:SI 1 "register_operand" "")))] "TARGET_KA10up" "if (!TARGET_XKL2) { rtx t1 = gen_reg_rtx (SImode); rtx t2 = gen_reg_rtx (SImode); rtx t3 = gen_reg_rtx (DImode); rtx t4 = gen_reg_rtx (SImode); rtx label = gen_label_rtx (); extern int pdp10_expand_ffs; pdp10_expand_ffs++; emit_insn (gen_negsi2 (t1, operands[1])); emit_insn (gen_andsi3 (t2, operands[1], t1)); emit_move_insn (gen_rtx_SUBREG (SImode, t3, 0), t2); emit_jump_insn (gen_JFFO (t3, gen_rtx_LABEL_REF (Pmode, label))); emit_move_insn (gen_rtx_SUBREG (SImode, t3, 4), GEN_INT (36)); emit_label (label); emit_insn (gen_subsi3 (t4, gen_rtx_SUBREG (SImode, t3, 4), GEN_INT (36))); emit_insn (gen_negsi2 (operands[0], t4)); DONE; }") (define_insn "*FFS" [(set (match_operand:SI 0 "register_operand" "=r") (ffs:SI (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2" "ffs %0,%1") ; (define_expand "popcountsi" ; Sequence taken from HAKMEM. ; LDB B,[014300,,A] ;or MOVE B,A then LSH B,-1 ; AND B,[333333,,333333] ; SUB A,B ; LSH B,-1 ; AND B,[333333,,333333] ; SUBB A,B ;each octal digit is replaced by number of 1's in it ; LSH B,-3 ; ADD A,B ; AND A,[070707,,070707] ; IDIVI A,77 ;casting out 63.'s ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Integer Conversions ; (define_insn "zero_extendqisi2" ; [(set (match_operand:SI 0 "register_operand" "=r") ; (zero_extend:SI (match_operand:QI 1 "register_operand" "r")))] ; "" ; "" ; [(set_attr "length" "0")]) (define_insn "zero_extendqisi2" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:QI 1 "register_operand" "0")))] "" { if (zero_extended_p (operands[0], 27, insn)) return ""; else return "andi %0,777%; zero_extendqisi2"; }) (define_insn "zero_extendhisi2" [(set (match_operand:SI 0 "register_operand" "=r") (zero_extend:SI (match_operand:HI 1 "register_operand" "r")))] "" { if (REGNO (operands[0]) == REGNO (operands[1]) && zero_extended_p (operands[0], 18, insn)) return ""; else return "hrrz %0,%1%; zero_extendhisi2"; }) (define_insn "zero_extendsi" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "")] UNSPEC_ZERO_EXTEND))] "" { int extend_bits = INTVAL (operands[2]); int bitsize = BITS_PER_WORD - extend_bits; if (zero_extended_p (operands[0], extend_bits, insn)) return ""; else if (extend_bits > 18) { operands[2] = GEN_INT ((1 << bitsize) - 1); return "andi %0,%2"; } else if (extend_bits == 18) return "hrrz %0,%0"; else { operands[2] = GEN_INT (((1 << extend_bits) - 1) << (18 - extend_bits)); return "tlz %0,%2"; } }) (define_insn "*extendqisi2_reg" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (subreg:QI (match_operand:SI 1 "register_operand" "r") 0)))] "" { if (REGNO (operands[0]) == REGNO (operands[1])) return ""; else return "move %0,%1%; extendqisi2_reg"; }) (define_expand "extendqisi2" [(set (match_operand:SI 0 "register_operand" "") (sign_extend:SI (match_operand:QI 1 "register_operand" "")))] "" "") ; "if (!TARGET_XKL2) ; { ; rtx op1 = operands[1]; ; if (GET_CODE (op1) == SUBREG && SUBREG_BYTE (op1) == 3) ; op1 = SUBREG_REG (op1); ; emit_insn (gen_ashlsi3 (operands[0], ; gen_rtx_SUBREG (SImode, op1, 0), ; GEN_INT (27))); ; emit_insn (gen_ASH_right (operands[0], operands[0], GEN_INT (-27))); ; DONE; ; }") (define_insn "*extendqisi2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:QI 1 "register_operand" "0")))] "!TARGET_XKL2" { if (sign_extended_p (operands[0], 27, insn)) return ""; else if (zero_extended_p (operands[0], 27, insn)) return "trne %0,400\;%_orcmi %0,777"; else return "lsh %0,33\;ash %0,-33"; } [(set_attr "length" "2")]) (define_insn "*extendqisi2_xkl2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:QI 1 "register_operand" "0")))] "TARGET_XKL2" "extend %0,[sext 9]") (define_insn "extendhisi2" [(set (match_operand:SI 0 "register_operand" "=r") (sign_extend:SI (match_operand:HI 1 "register_operand" "r")))] "" { if (sign_extended_p (operands[1], 18, insn) && REGNO (operands[0]) == REGNO (operands[1])) return ""; else return "hrre %0,%1%; extendhisi2"; }) (define_insn "sign_extendsi" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "")] UNSPEC_SIGN_EXTEND))] "" { int extend_bits = INTVAL (operands[2]); if (sign_extended_p (operands[0], extend_bits, insn)) return ""; else if (zero_extended_p (operands[0], extend_bits, insn)) { int bitsize = BITS_PER_WORD - extend_bits; operands[1] = GEN_INT ((HOST_WIDE_INT)1 << (bitsize - 1)); operands[2] = GEN_INT (((HOST_WIDE_INT)1 << bitsize) - 1); return "trne %0,%1\;%_orcmi %0,%2"; } else return "lsh %0,%2\;ash %0,-%2"; }) (define_insn "truncsiqi2" [(set (match_operand:QI 0 "register_operand" "=r") (truncate:QI (match_operand:SI 1 "register_operand" "0")))] "" "andi %0,777%; truncsiqi2") (define_insn "truncsihi2" [(set (match_operand:HI 0 "register_operand" "=r") (truncate:HI (match_operand:SI 1 "register_operand" "r")))] "" "hrr %0,%1%; truncsihi2") (define_insn "truncsi" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand 2 "const_int_operand" "")] UNSPEC_TRUNCATE))] "" { int bits = BITS_PER_WORD - INTVAL (operands[2]); if (bits < 18) { operands[2] = GEN_INT (((HOST_WIDE_INT)1 << bits) - 1); return "andi %0,%2%; truncsi"; } else { operands[2] = GEN_INT ((0777777 << (bits - 18)) & 0777777); return "tlz %0,%2%; truncsi"; } }) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Shifting and Rotating (define_insn "real_ashlsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (unspec:SI [(match_operand:SI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")] UNSPEC_REAL_ASHIFT))] "" "@ ash %0,(%2) ash %0,%2 ash %0,@%2") (define_insn "*ASH_left_plus" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))] UNSPEC_REAL_ASHIFT))] "" "ash %0,%3(%2)") (define_expand "lshrsi3" [(set (match_dup 3) (neg:SI (match_operand:SI 2 "general_operand" ""))) (set (match_operand:SI 0 "register_operand" "") (lshiftrt:SI (match_operand:SI 1 "register_operand" "") (neg:SI (match_dup 3))))] "" "if (GET_CODE (operands[2]) == CONST_INT) { emit_insn (gen_LSH_right (operands[0], operands[1], GEN_INT (-INTVAL (operands[2])))); DONE; } else operands[3] = gen_reg_rtx (SImode);") (define_insn "LSH_right" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (lshiftrt:SI (match_operand:SI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "" "@ lsh %0,(%2) lsh %0,%2 lsh %0,@%2") (define_insn "*LSH_right_plus" [(set (match_operand:SI 0 "register_operand" "=r") (lshiftrt:SI (match_operand:SI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "const_int_operand" "K")))))] "" "lsh %0,%3(%2)") (define_insn "real_ashldi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (unspec:DI [(match_operand:DI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")] UNSPEC_REAL_ASHIFT))] "TARGET_71BIT" "@ ashc %0,(%2) ashc %0,%2 ashc %0,@%2") (define_insn "*ASHC" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand:DI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))] UNSPEC_REAL_ASHIFT))] "TARGET_71BIT" "ashc %0,%3(%2)") (define_expand "lshrdi3" [(set (match_dup 3) (neg:SI (match_operand:SI 2 "general_operand" ""))) (set (match_operand:DI 0 "register_operand" "") (lshiftrt:DI (match_operand:DI 1 "register_operand" "") (neg:SI (match_dup 3))))] "" "if (GET_CODE (operands[2]) == CONST_INT) { if (TARGET_71BIT) emit_insn (gen_LSHC_right_71 (operands[0], operands[1], GEN_INT (-INTVAL (operands[2])))); else emit_insn (gen_LSHC_right (operands[0], operands[1], GEN_INT (-INTVAL (operands[2])))); DONE; } else operands[3] = gen_reg_rtx (SImode);") (define_insn "LSHC_right_71" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (lshiftrt:DI (match_operand:DI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "TARGET_71BIT" { const char *asms[] = { "lsh %Z0,1\;lshc %0,(%2)\;lsh %Z0,-1", "lsh %Z0,1\;lshc %0,%2\;lsh %Z0,-1", "lsh %Z0,1\;lshc %0,@%2\;lsh %Z0,-1" }; int n; if (get_attr_length (insn) == 1) { operands[2] = GEN_INT (INTVAL (operands[2]) - 1); return "lshc %0,%2"; } /*else if (GET_CODE (operands[2]) == CONST_INT && INTVAL (operands[2]) == -1) return "ashc %0,-1\;tlze %0,400000\;tlz %Z0,400000";*/ else if (GET_CODE (operands[2]) == CONST_INT && (n = INTVAL (operands[2])) >= -18) { int mask = (0777777 << (18 + n)) & 0777777; static char insn[100]; snprintf (insn, sizeof insn, "ashc %%0,%%2\;tlze %%0,%o\;tlz %%Z0,400000", mask); return insn; } else return asms[which_alternative]; } [(set (attr "length") (if_then_else (and (match_operand 2 "const_int_operand" "") (ge (symbol_ref "-INTVAL (operands[2])") (const_int 35))) (const_int 1) (const_int 3)))]) (define_insn "LSHC_right" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (lshiftrt:DI (match_operand:DI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "!TARGET_71BIT" "@ lshc %0,(%2) lshc %0,%2 lshc %0,@%2") (define_insn "*LSHC_right_plus_71" [(set (match_operand:DI 0 "register_operand" "=r") (lshiftrt:DI (match_operand:DI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K")))))] "TARGET_71BIT" "lsh %Z0,1\;lshc %0,%3(%2)\;lsh %Z0,-1" [(set_attr "length" "3")]) (define_insn "*LSHC_right_plus" [(set (match_operand:DI 0 "register_operand" "=r") (lshiftrt:DI (match_operand:DI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K")))))] "!TARGET_71BIT" "lshc %0,%3(%2)") (define_insn "ashlsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (ashift:SI (match_operand:SI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")))] "" "@ lsh %0,(%2) lsh %0,%2 lsh %0,@%2") (define_insn "*LSH_left_plus" [(set (match_operand:SI 0 "register_operand" "=r") (ashift:SI (match_operand:SI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))))] "" "lsh %0,%3(%2)") (define_expand "ashrsi3" [(set (match_dup 3) (neg:SI (match_operand:SI 2 "general_operand" ""))) (set (match_operand:SI 0 "register_operand" "") (ashiftrt:SI (match_operand:SI 1 "register_operand" "") (neg:SI (match_dup 3))))] "" "if (GET_CODE (operands[2]) == CONST_INT) { emit_insn (gen_ASH_right (operands[0], operands[1], GEN_INT (-INTVAL (operands[2])))); DONE; } else operands[3] = gen_reg_rtx (SImode);") (define_insn "ASH_right" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (ashiftrt:SI (match_operand:SI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "" "@ ash %0,(%2) ash %0,%2 ash %0,@%2") (define_insn "*ASH_right_plus" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K")))))] "" "ash %0,%3(%2)") (define_expand "ashldi3" [(set (match_operand:DI 0 "register_operand" "") (ashift:DI (match_operand:DI 1 "register_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "") (define_insn "*ashldi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (ashift:DI (match_operand:DI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")))] "!TARGET_71BIT" "@ lshc %0,(%2) lshc %0,%2 lshc %0,@%2") (define_insn "LSHC_left" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (unspec:DI [(match_operand:DI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")] UNSPEC_LSHC))] "TARGET_71BIT" "@ lshc %0,(%2) lshc %0,%2 lshc %0,@%2") (define_insn "*ashldi3_71bit" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (ashift:DI (match_operand:DI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")))] "TARGET_71BIT" { const char *asms[] = { "lsh %Z0,1\;lshc %0,(%2)\;lsh %Z0,-1", "lsh %Z0,1\;lshc %0,%2\;lsh %Z0,-1", "lsh %Z0,1\;lshc %0,@%2\;lsh %Z0,-1" }; switch (get_attr_length (insn)) { case 3: operands[2] = GEN_INT (INTVAL (operands[2]) + 1); output_asm_insn ("lshc %0,%2", operands); break; case 4: { static char insn[100]; int n = INTVAL (operands[2]); snprintf (insn, sizeof insn, n < 18 ? "tlne %%0,%o" : "trne %%0,%o", 0400000 >> (n < 18 ? n: n - 18)); output_asm_insn (insn, operands); return "%_tloa %0,400000\;%_%_tlz %0,400000\;ashc %0,%2"; } case 5: output_asm_insn (asms[which_alternative], operands); break; default: abort (); } return "tlne %0,400000\;%_tlo %Z0,400000"; } [(set (attr "length") (if_then_else (match_operand 2 "const_int_operand" "") (if_then_else (ge (symbol_ref "INTVAL (operands[2])") (const_int 36)) (const_int 3) (const_int 4)) (const_int 5)))]) (define_insn "*LSHC_left_plus" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (match_operand:DI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))))] "!TARGET_71BIT" "lshc %0,%3(%2)") (define_insn "*LSHC_left_plus_71bit" [(set (match_operand:DI 0 "register_operand" "=r") (ashift:DI (match_operand:DI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))))] "TARGET_71BIT" "lsh %Z0,1\;lshc %0,%3(%2)\;lsh %Z0,-1\;tlne %0,400000\;%_tlo %Z0,400000" [(set_attr "length" "5")]) (define_expand "ashrdi3" [(set (match_dup 3) (neg:SI (match_operand:SI 2 "general_operand" ""))) (set (match_operand:DI 0 "register_operand" "") (ashiftrt:DI (match_operand:DI 1 "register_operand" "") (neg:SI (match_dup 3))))] "" "if (!TARGET_71BIT) { HOST_WIDE_INT mask; /*rtx op0hi = gen_rtx_SUBREG (SImode, operands[0], 0); rtx op0lo = gen_rtx_SUBREG (SImode, operands[0], 4);*/ rtx temp = gen_reg_rtx (SImode); rtx label; if (GET_CODE (operands[2]) == CONST_INT) { int n = INTVAL (operands[2]); if (n <= 35) { label = gen_label_rtx (); mask = (HOST_WIDE_INT)1 << (35 - n); emit_insn (gen_lshrdi3 (operands[0], operands[1], operands[2])); emit_jump_insn (gen_test_and_skip (gen_rtx_EQ (VOIDmode, NULL_RTX, NULL_RTX), gen_rtx_SUBREG (SImode, operands[0], 0), gen_int_mode (mask, SImode), label)); mask = ~(mask - 1); if (n != 17 && n != 35) mask <<= 1; emit_insn (gen_iorsi3 (gen_rtx_SUBREG (SImode, operands[0], 0), gen_rtx_SUBREG (SImode, operands[0], 0), gen_int_mode (mask, SImode))); emit_label (label); } else if (n == 36) /*{ emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, operands[0], 0), gen_rtx_SUBREG (SImode, operands[1], 0), GEN_INT (35))); emit_move_insn (gen_rtx_SUBREG (SImode, operands[0], 4), gen_rtx_SUBREG (SImode, operands[1], 0)); }*/ /*{ emit_move_insn (gen_rtx_SUBREG (SImode, operands[0], 4), gen_rtx_SUBREG (SImode, operands[1], 0)); emit_insn (gen_ashrsi3 (gen_rtx_SUBREG (SImode, operands[0], 0), gen_rtx_SUBREG (SImode, operands[1], 0), GEN_INT (35))); }*/ emit_insn (gen_ashrdi3_36 (operands[0], operands[1])); else if (n >= 71 && !optimize_size) emit_insn (gen_sign_extension_di (operands[0], operands[1])); else emit_insn (gen_ASHC (operands[0], operands[1], GEN_INT (1 - n))); DONE; } /* Sequence adapted from Hacker's Delight, section 2-6. */ emit_insn (gen_ashrsi3 (temp, gen_rtx_SUBREG (SImode, operands[1], 0), GEN_INT (35))); /*emit_move_insn (operands[0], operands[1]); emit_insn (gen_xorsi3 (op0hi, op0hi, temp)); emit_insn (gen_xorsi3 (op0lo, op0lo, temp));*/ emit_insn (gen_xordisi3 (operands[0], operands[1], temp)); emit_insn (gen_lshrdi3 (operands[0], operands[0], operands[2])); /*emit_insn (gen_xorsi3 (op0hi, op0hi, temp)); emit_insn (gen_xorsi3 (op0lo, op0lo, temp));*/ emit_insn (gen_xordisi3 (operands[0], operands[0], temp)); DONE; } else if (GET_CODE (operands[2]) == CONST_INT) { emit_insn (gen_ASHC_right (operands[0], operands[1], GEN_INT (-INTVAL (operands[2])))); DONE; } else operands[3] = gen_reg_rtx (SImode);") (define_insn "ashrdi3_36" [(set (match_operand:DI 0 "register_operand" "=r") (ashiftrt:DI (match_operand:DI 1 "register_operand" "0") (const_int 36)))] "!TARGET_71BIT" "@ move %Z0,%0\;ash %0,-43" [(set_attr "length" "2")]) (define_insn "sign_extension_di" [(set (match_operand:DI 0 "register_operand" "=r,r") (ashiftrt:DI (match_operand:DI 1 "register_operand" "0,r") (const_int 71)))] "!TARGET_71BIT" { if (which_alternative == 0) return "ash %0,-43\;move %Z0,%0"; else if (REGNO (operands[0]) + 1 == REGNO (operands[1])) return "ash %Z0,-43\;move %0,%Z0"; else return "move %0,%1\;ash %0,-43\;move %Z0,%0"; } [(set_attr "length" "2,3")]) (define_insn "ASHC_right" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (ashiftrt:DI (match_operand:DI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "TARGET_71BIT" "@ ashc %0,(%2) ashc %0,%2 ashc %0,@%2") (define_insn "ASHC" [(set (match_operand:DI 0 "register_operand" "=r") (unspec:DI [(match_operand:DI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "K")] UNSPEC_ASHC))] "!TARGET_71BIT" "ashc %0,%2") (define_insn "*ASHC_right_plus" [(set (match_operand:DI 0 "register_operand" "=r") (ashiftrt:DI (match_operand:DI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K")))))] "TARGET_71BIT" "ashc %0,%3(%2)") (define_insn "rotlsi3" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (rotate:SI (match_operand:SI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")))] "" "@ rot %0,(%2) rot %0,%Y2 rot %0,@%2") (define_insn "*ROT_left_plus" [(set (match_operand:SI 0 "register_operand" "=r") (rotate:SI (match_operand:SI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))))] "" "rot %0,%Y3(%2)") (define_expand "rotrsi3" [(set (match_dup 3) (neg:SI (match_operand:SI 2 "general_operand" ""))) (set (match_operand:SI 0 "register_operand" "") (rotatert:SI (match_operand:SI 1 "register_operand" "") (neg:SI (match_dup 3))))] "" "operands[3] = gen_reg_rtx (SImode);") (define_insn "*ROT_right" [(set (match_operand:SI 0 "register_operand" "=r,r,r") (rotatert:SI (match_operand:SI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "" "@ rot %0,(%2) rot %0,%Y2 rot %0,@%2") (define_insn "*ROT_right_plus" [(set (match_operand:SI 0 "register_operand" "=r") (rotatert:SI (match_operand:SI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K")))))] "" "rot %0,%Y3(%2)") (define_insn "rotldi3" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (rotate:DI (match_operand:DI 1 "register_operand" "0,0,0") (match_operand:SI 2 "general_operand" "x,K,m")))] "!TARGET_71BIT" "@ rotc %0,(%2) rotc %0,%V2 rotc %0,@%2") (define_insn "*ROTC_left_plus" [(set (match_operand:DI 0 "register_operand" "=r") (rotate:DI (match_operand:DI 1 "register_operand" "0") (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K"))))] "!TARGET_71BIT" "rotc %0,%V3(%2)") (define_expand "rotrdi3" [(set (match_dup 3) (neg:SI (match_operand:SI 2 "general_operand" ""))) (set (match_operand:DI 0 "register_operand" "") (rotatert:DI (match_operand:DI 1 "register_operand" "") (neg:SI (match_dup 3))))] "!TARGET_71BIT" "operands[3] = gen_reg_rtx (SImode);") (define_insn "*ROTC_right" [(set (match_operand:DI 0 "register_operand" "=r,r,r") (rotatert:DI (match_operand:DI 1 "register_operand" "0,0,0") (neg:SI (match_operand:SI 2 "general_operand" "x,K,m"))))] "!TARGET_71BIT" "@ rotc %0,(%2) rotc %0,%V2 rotc %0,@%2") (define_insn "*ROTC_right_plus" [(set (match_operand:DI 0 "register_operand" "=r") (rotatert:DI (match_operand:DI 1 "register_operand" "0") (neg:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "immediate_operand" "K")))))] "!TARGET_71BIT" "rotc %0,%V3(%2)") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Logical Operations ;; SETZ -- in Data Movement ;; AND -- andsi3 (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (subreg:SI (match_operand:QI 1 "memory_operand" "m") 0) (const_int 63)))] "" "*return pdp10_output_extzv_foo (insn, operands);") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "const_int_operand" "i")))] "TARGET_LARGE && CONSTANT_ADDRESS_P (XEXP (operands[1], 0)) && (INTVAL (operands[2]) == 077 || INTVAL (operands[2]) == 0777)" { rtx ops[4]; int bitsize = exact_log2 (INTVAL (operands[2]) + 1); ops[0] = operands[0]; ops[1] = operands[1]; ops[2] = GEN_INT (bitsize); ops[3] = GEN_INT (BITS_PER_WORD - bitsize); output_asm_insn (pdp10_output_extzv (insn, ops), ops); return ""; }) (define_expand "andsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "") (and:SI (match_operand:SI 1 "reg_or_mem_operand" "") (match_operand:SI 2 "general_operand" "")))] "" "") (define_insn "*andsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,r,m") (and:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0,0,0,0,0") (match_operand:SI 2 "general_operand" "rm,I,N,P,i,r")))] "" "@ and %0,%2 andi %0,%2 tlz %0,%T2 andcmi %0,%C2 and %0,[%2] andm %2,%0") (define_insn "*ANDI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "andi %0,(%1)") (define_insn "*ANDI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "andi %0,%2(%1)") (define_insn "*TLZ_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (not:SI (ashift:SI (match_operand:SI 1 "register_operand" "x") (const_int 18))) (match_operand:SI 2 "register_operand" "0")))] "" "tlz %0,(%1)") (define_insn "*TLZ_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (not:SI (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "x") (const_int 262144)) (match_operand:SI 2 "const_int_operand" "L"))) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')" "tlz %0,%S2(%1)") (define_insn "*ANDB1" [(set (match_operand:SI 0 "memory_operand" "+m") (and:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (and:SI (match_dup 0) (match_dup 1)))] "" "andb %1,%0") (define_insn "*ANDB2" [(set (match_operand:SI 0 "memory_operand" "+m") (and:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (and:SI (match_dup 1) (match_dup 0)))] "" "andb %1,%0") ;; ANDCA, ANDCM (define_insn "ANDCx" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,m,m") (and:SI (not:SI (match_operand:SI 1 "reg_or_mem_operand" "0,rm,0,0,r,0")) (match_operand:SI 2 "general_operand" "rm,0,I,P,0,r")))] "" "@ andca %0,%2 andcm %0,%1 andcai %0,%2 andcbi %0,%C2 andcam %1,%0 andcmm %2,%0") (define_insn "*ANDCMI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (ior:SI (not:SI (match_operand:SI 1 "register_operand" "x")) (const_int LEFT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "andcmi %0,(%1)") (define_insn "*ANDCMI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (ior:SI (not:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I"))) (const_int LEFT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "andcmi %0,%2(%1)") (define_insn "*ANDCAB" [(set (match_operand:SI 0 "memory_operand" "+m") (and:SI (not:SI (match_operand:SI 1 "register_operand" "r")) (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (and:SI (not:SI (match_dup 1)) (match_dup 0)))] "" "andcab %1,%0") (define_insn "*ANDCMB" [(set (match_operand:SI 0 "memory_operand" "+m") (and:SI (not:SI (match_dup 0)) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (and:SI (not:SI (match_dup 0)) (match_dup 1)))] "" "andcmb %1,%0") ; (define_insn "*ANDCMB" ; [(set (match_operand:SI 0 "register_operand" "=r") ; (and:SI (not:SI (match_operand:SI 1 "memory_operand" "+m")) ; (match_operand:SI 2 "register_operand" "0"))) ; (set (match_dup 1) ; (and:SI (not:SI (match_dup 1)) (match_dup 2)))] ; "" ; "andcmb %0,%1") ;; SETM -- not useful ;; SETA -- not useful ;; XOR -- xorsi3 (define_insn "xorsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,r,m") (xor:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0,0,0,0,0") (match_operand:SI 2 "general_operand" "rm,I,L,P,i,r")))] "" "@ xor %0,%2 xori %0,%2 tlc %0,%S2 eqvi %0,%C2 xor %0,[%2] xorm %2,%0") (define_insn "*XORI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (and:SI (match_operand:SI 1 "register_operand" "r") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "xori %0,(%1)") (define_insn "*XORI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "xori %0,%2(%1)") (define_insn "*TLC_reg" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (ashift:SI (match_operand:SI 1 "register_operand" "r") (const_int 18)) (match_operand:SI 2 "register_operand" "0")))] "" "tlc %0,(%1)") (define_insn "*TLC_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "x") (const_int 262144)) (match_operand:SI 2 "const_int_operand" "L")) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')" "tlc %0,%S2(%1)") (define_insn "*XORB1" [(set (match_operand:SI 0 "memory_operand" "+m") (xor:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (xor:SI (match_dup 0) (match_dup 1)))] "" "xorb %1,%0") (define_insn "*XORB2" [(set (match_operand:SI 0 "memory_operand" "+m") (xor:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (xor:SI (match_dup 1) (match_dup 0)))] "" "xorb %1,%0") (define_insn "xordisi3" [(set (match_operand:DI 0 "register_operand" "=r") (xor:DI (match_operand:DI 1 "register_operand" "%0") (plus:DI (ashift:DI (zero_extend:DI (match_operand:SI 2 "register_operand" "r")) (const_int 36)) (zero_extend:DI (match_dup 2)))))] "" "xor %0,%2\;xor %Z0,%2") ;; IOR -- iorsi3 (define_insn "iorsi3" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,r,m") (ior:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0,0,0,0,0") (match_operand:SI 2 "general_operand" "rm,I,L,P,i,r")))] "" "@ ior %0,%2 iori %0,%2 tlo %0,%S2 orcmi %0,%C2 ior %0,[%2] iorm %2,%0") (define_insn "*IORI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "iori %0,(%1)") (define_insn "*IORI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "iori %0,%2(%1)") (define_insn "*TLO_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (ashift:SI (match_operand:SI 1 "register_operand" "x") (const_int 18)) (match_operand:SI 2 "register_operand" "0")))] "" "tlo %0,(%1)") (define_insn "*TLO_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (plus:SI (mult:SI (match_operand:SI 1 "register_operand" "x") (const_int 262144)) (match_operand:SI 2 "const_int_operand" "L")) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'L')" "tlo %0,%S2(%1)") (define_insn "*IORB1" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (match_dup 0) (match_dup 1)))] "" "iorb %1,%0") (define_insn "*IORB2" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (match_dup 1) (match_dup 0)))] "" "iorb %1,%0") ;; ANDCB (define_insn "*ANCDB" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (and:SI (not:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0")) (not:SI (match_operand:SI 2 "reg_or_mem_operand" "rm,r"))))] "" "@ andcb %0,%2 andcbm %2,%0") (define_insn "*ANDCBI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (not:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF))) (not:SI (match_operand:SI 2 "register_operand" "0"))))] "" "andcbi %0,(%1)") (define_insn "*ANDCBI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (not:SI (and:SI (plus:SI (match_operand:SI 2 "register_operand" "x") (match_operand:SI 3 "const_int_operand" "I")) (const_int RIGHT_HALF))) (not:SI (match_operand:SI 1 "register_operand" "0"))))] "pdp10_const_ok_for_letter_p (INTVAL (operands[3]), 'I')" "andcbi %0,%3(%2)") (define_insn "*ANDCBB1" [(set (match_operand:SI 0 "memory_operand" "+m") (and:SI (not:SI (match_dup 0)) (not:SI (match_operand:SI 1 "register_operand" "r")))) (set (match_operand:SI 2 "register_operand" "=1") (and:SI (not:SI (match_dup 0)) (not:SI (match_dup 1))))] "" "andcbb %1,%0") (define_insn "*ANDCBB2" [(set (match_operand:SI 0 "memory_operand" "+m") (and:SI (not:SI (match_operand:SI 1 "register_operand" "r")) (not:SI (match_dup 0)))) (set (match_operand:SI 2 "register_operand" "=1") (and:SI (not:SI (match_dup 1)) (not:SI (match_dup 0))))] "" "andcbb %1,%0") (define_insn "*ANDCBB" [(set (match_operand:SI 0 "register_operand" "=r") (and:SI (not:SI (match_operand:SI 1 "register_operand" "%0")) (not:SI (match_operand:SI 2 "memory_operand" "+m")))) (set (match_dup 2) (and:SI (not:SI (match_dup 1)) (not:SI (match_dup 2))))] "" "andcbb %0,%2") ;; EQV (define_insn "*EQV" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (not:SI (xor:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0") (match_operand:SI 2 "reg_or_mem_operand" "rm,r"))))] "" "@ eqv %0,%2 eqvm %2,%0") (define_insn "*EQVI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (not:SI (xor:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "0"))))] "" "eqvi %0,(%1)") (define_insn "*EQVI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (not:SI (xor:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "0"))))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "eqvi %0,%2(%1)") (define_insn "*EQVB1" [(set (match_operand:SI 0 "memory_operand" "+m") (not:SI (xor:SI (match_dup 0) (match_operand:SI 1 "register_operand" "r")))) (set (match_operand:SI 2 "register_operand" "=1") (not:SI (xor:SI (match_dup 0) (match_dup 1))))] "" "eqvb %1,%0") (define_insn "*EQVB2" [(set (match_operand:SI 0 "memory_operand" "+m") (not:SI (xor:SI (match_operand:SI 1 "register_operand" "r") (match_dup 0)))) (set (match_operand:SI 2 "register_operand" "=1") (not:SI (xor:SI (match_dup 1) (match_dup 0))))] "" "eqvb %1,%0") ;; SETCA, SETCM -- one_cmplsi2 (define_insn "one_cmplsi2" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,m,m") (not:SI (match_operand:SI 1 "reg_or_mem_operand" "0,rm,r,0")))] "" "@ setca %0, setcm %0,%1 setcam %1,%0 setcmm %0") (define_insn "*SETCAB" [(set (match_operand:SI 0 "memory_operand" "+m") (not:SI (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (not:SI (match_dup 1)))] "" "setcab %1,%0") (define_insn "*SETCMB" [(set (match_operand:SI 0 "memory_operand" "+m") (not:SI (match_dup 0))) (set (match_operand:SI 1 "register_operand" "=r") (not:SI (match_dup 0)))] "" "setcmb %0,%1") ;; SETCMI is done with ORCBI. ;; ORCA, ORCM (define_insn "*ORCx" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,r,r,r,m,m") (ior:SI (not:SI (match_operand:SI 1 "reg_or_mem_operand" "0,rm,0,0,r,0")) (match_operand:SI 2 "general_operand" "rm,0,I,P,0,r")))] "" "@ orca %0,%2 orcm %0,%1 orcai %0,%2 orcbi %0,%C2 orcam %1,%0 orcmm %2,%0") (define_insn "*ORCMI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (ior:SI (not:SI (match_operand:SI 1 "register_operand" "x")) (const_int LEFT_HALF)) (match_operand:SI 2 "register_operand" "0")))] "" "orcmi %0,(%1)") (define_insn "*ORCMI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (ior:SI (not:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I"))) (const_int LEFT_HALF)) (match_operand:SI 3 "register_operand" "0")))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" "orcmi %0,%2(%1)") (define_insn "*ORCAB1" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (match_dup 0) (not:SI (match_operand:SI 1 "register_operand" "r")))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (match_dup 0) (not:SI (match_dup 1))))] "" "orcab %1,%0") (define_insn "*ORCAB2" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (not:SI (match_operand:SI 1 "register_operand" "r")) (match_dup 0))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (not:SI (match_dup 1)) (match_dup 0)))] "" "orcab %1,%0") (define_insn "*ORCMB1" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (not:SI (match_dup 0)) (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (not:SI (match_dup 0)) (match_dup 1)))] "" "orcmb %1,%0") (define_insn "*ORCMB2" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (match_operand:SI 1 "register_operand" "r") (not:SI (match_dup 0)))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (match_dup 1) (not:SI (match_dup 0))))] "" "orcmb %1,%0") ;; ORCB (define_insn "*ORCB" [(set (match_operand:SI 0 "reg_or_mem_operand" "=r,m") (ior:SI (not:SI (match_operand:SI 1 "reg_or_mem_operand" "%0,0")) (not:SI (match_operand:SI 2 "reg_or_mem_operand" "rm,r"))))] "" "@ orcb %0,%2 orcbm %2,%0") (define_insn "*ORCBI_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (not:SI (and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF))) (not:SI (match_operand:SI 2 "register_operand" "0"))))] "" "orcbi %0,(%1)") (define_insn "*ORCBI_const_plus_reg" [(set (match_operand:SI 0 "register_operand" "=r") (ior:SI (not:SI (and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF))) (not:SI (match_operand:SI 3 "register_operand" "0"))))] "" "orcbi %0,%2(%1)") (define_insn "*ORCMB1" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (not:SI (match_dup 0)) (not:SI (match_operand:SI 1 "register_operand" "r")))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (not:SI (match_dup 0)) (not:SI (match_dup 1))))] "" "orcbb %1,%0") (define_insn "*ORCMB2" [(set (match_operand:SI 0 "memory_operand" "+m") (ior:SI (not:SI (match_operand:SI 1 "register_operand" "r")) (not:SI (match_dup 0)))) (set (match_operand:SI 2 "register_operand" "=1") (ior:SI (not:SI (match_dup 1)) (not:SI (match_dup 0))))] "" "orcbb %1,%0") ;; SETO -- in Data Movement ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Floating-point Arithmetic (define_insn "addsf3" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,r,r,m") (plus:SF (match_operand:SF 1 "reg_or_mem_operand" "%0,0,0,0") (match_operand:SF 2 "general_operand" "rm,G,F,r")))] "" "@ fadr %0,%2 fadri %0,%G2 fadr %0,[%2] fadrm %2,%0") (define_insn "*FADRB1" [(set (match_operand:SF 0 "memory_operand" "+m") (plus:SF (match_dup 0) (match_operand:SF 1 "register_operand" "r"))) (set (match_operand:SF 2 "register_operand" "=1") (plus:SF (match_dup 0) (match_dup 1)))] "" "fadrb %1,%0") (define_insn "*FADRB2" [(set (match_operand:SF 0 "memory_operand" "+m") (plus:SF (match_operand:SF 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SF 2 "register_operand" "=1") (plus:SF (match_dup 1) (match_dup 0)))] "" "fadrb %1,%0") (define_expand "adddf3" [(set (match_operand:DF 0 "register_operand" "") (plus:DF (match_operand:DF 1 "register_operand" "") (match_operand:DF 2 "general_operand" "")))] "(TARGET_KI10up && !TARGET_GFLOAT) || (TARGET_KL10up && TARGET_GFLOAT)" "") (define_insn "DFAD" [(set (match_operand:DF 0 "register_operand" "=r,r") (plus:DF (match_operand:DF 1 "register_operand" "%0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KI10up && !TARGET_GFLOAT" "@ dfad %0,%2 dfad %0,[%2]") (define_insn "*GFAD" [(set (match_operand:DF 0 "register_operand" "=r,r") (plus:DF (match_operand:DF 1 "register_operand" "%0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KL10up && TARGET_GFLOAT" "@ gfad %0,%2 gfad %0,[%2]") (define_insn "subsf3" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,r,r,m") (minus:SF (match_operand:SF 1 "register_operand" "0,0,0,r") (match_operand:SF 2 "general_operand" "rm,G,F,0")))] "" "@ fsbr %0,%2 fsbri %0,%G2 fsbr %0,[%2] fsbrm %1,%0") (define_insn "*FSBRB" [(set (match_operand:SF 0 "memory_operand" "+m") (minus:SF (match_operand:SF 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SF 2 "register_operand" "=1") (minus:SF (match_dup 1) (match_dup 0)))] "" "fsbrb %1,%0") (define_expand "subdf3" [(set (match_operand:DF 0 "register_operand" "") (minus:DF (match_operand:DF 1 "register_operand" "") (match_operand:DF 2 "general_operand" "")))] "TARGET_KI10up" "") (define_insn "*DFSB" [(set (match_operand:DF 0 "register_operand" "=r,r") (minus:DF (match_operand:DF 1 "register_operand" "0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KI10up && !TARGET_GFLOAT" "@ dfsb %0,%2 dfsb %0,[%2]") (define_insn "*GFSB" [(set (match_operand:DF 0 "register_operand" "=r,r") (minus:DF (match_operand:DF 1 "register_operand" "0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KL10up && TARGET_GFLOAT" "@ gfsb %0,%2 gfsb %0,[%2]") (define_insn "abssf2" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,m,m") (abs:SF (match_operand:SF 1 "reg_or_mem_operand" "rm,r,0")))] "" "@ movm %0,%1 movmm %1,%0 movms %0") (define_insn "*MOVMSsf" [(set (match_operand:SF 0 "reg_or_mem_operand" "+rm") (abs:SF (match_dup 0))) (set (match_operand:SF 1 "register_operand" "=x") (abs:SF (match_dup 0)))] "" "movms %1,%0") (define_insn "negsf2" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,m,m") (neg:SF (match_operand:SF 1 "reg_or_mem_operand" "rm,r,0")))] "" "@ movn %0,%1 movnm %1,%0 movns %0") (define_insn "*MOVNS" [(set (match_operand:SF 0 "reg_or_mem_operand" "=rm") (neg:SF (match_dup 0))) (set (match_operand:SF 1 "register_operand" "+x") (neg:SF (match_dup 0)))] "" "movns %1,%0") (define_insn "negdf2" [(set (match_operand:DF 0 "reg_or_mem_operand" "=r,m") (neg:DF (match_operand:DF 1 "reg_or_mem_operand" "rm,r")))] "TARGET_KI10up" "@ dmovn %0,%1 dmovnm %1,%0") (define_insn "mulsf3" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,r,r,m") (mult:SF (match_operand:SF 1 "reg_or_mem_operand" "%0,0,0,0") (match_operand:SF 2 "general_operand" "rm,G,F,r")))] "" "@ fmpr %0,%2 fmpri %0,%G2 fmpr %0,[%2] fmprm %2,%0") (define_insn "*FMPRB1" [(set (match_operand:SF 0 "memory_operand" "+m") (mult:SF (match_dup 0) (match_operand:SF 1 "register_operand" "r"))) (set (match_operand:SF 2 "register_operand" "=1") (mult:SF (match_dup 0) (match_dup 1)))] "" "fmprb %1,%0") (define_insn "*FMPRB2" [(set (match_operand:SF 0 "memory_operand" "+m") (mult:SF (match_operand:SF 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SF 2 "register_operand" "=1") (mult:SF (match_dup 1) (match_dup 0)))] "" "fmprb %1,%0") (define_expand "muldf3" [(set (match_operand:DF 0 "register_operand" "") (mult:DF (match_operand:DF 1 "register_operand" "") (match_operand:DF 2 "general_operand" "")))] "TARGET_KI10up" "") (define_insn "*DFMP" [(set (match_operand:DF 0 "register_operand" "=r,r") (mult:DF (match_operand:DF 1 "register_operand" "%0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KI10up && !TARGET_GFLOAT" "@ dfmp %0,%2 dfmp %0,[%2]") (define_insn "*GFMP" [(set (match_operand:DF 0 "register_operand" "=r,r") (mult:DF (match_operand:DF 1 "register_operand" "%0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KL10up && TARGET_GFLOAT" "@ gfmp %0,%2 gfmp %0,[%2]") (define_insn "divsf3" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,r,r,m") (div:SF (match_operand:SF 1 "register_operand" "0,0,0,r") (match_operand:SF 2 "general_operand" "rm,G,F,0")))] "" "@ fdvr %0,%2 fdvri %0,%G2 fdvr %0,[%2] fdvrm %1,%0") (define_insn "*FDVRB2" [(set (match_operand:SF 0 "memory_operand" "+m") (div:SF (match_operand:SF 1 "register_operand" "r") (match_dup 0))) (set (match_operand:SF 2 "register_operand" "=1") (div:SF (match_dup 1) (match_dup 0)))] "" "fdvrb %1,%0") (define_expand "divdf3" [(set (match_operand:DF 0 "register_operand" "") (div:DF (match_operand:DF 1 "register_operand" "") (match_operand:DF 2 "general_operand" "")))] "TARGET_KI10up" "") (define_insn "*DFDV" [(set (match_operand:DF 0 "register_operand" "=r,r") (div:DF (match_operand:DF 1 "register_operand" "0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KI10up && !TARGET_GFLOAT" "@ dfdv %0,%2 dfdv %0,[%2]") (define_insn "*GFDV" [(set (match_operand:DF 0 "register_operand" "=r,r") (div:DF (match_operand:DF 1 "register_operand" "0,0") (match_operand:DF 2 "general_operand" "rm,F")))] "TARGET_KL10up && TARGET_GFLOAT" "@ gfdv %0,%2 gfdv %0,[%2]") (define_insn "sqrtsf2" [(set (match_operand:SF 0 "register_operand" "=r") (sqrt:SF (match_operand:SF 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2" "extend %0,[sqrt %1]") (define_expand "sqrtdf2" [(set (match_operand:DF 0 "register_operand" "") (sqrt:DF (match_operand:DF 1 "reg_or_mem_operand" "")))] "TARGET_XKL2" "") (define_insn "*DSQRT" [(set (match_operand:DF 0 "register_operand" "=r") (sqrt:DF (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && !TARGET_GFLOAT" "extend %0,[dsqrt %1]") (define_insn "*GSQRT" [(set (match_operand:DF 0 "register_operand" "=r") (sqrt:DF (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && TARGET_GFLOAT" "extend %0,[gsqrt %1]") (define_insn "FSC" [(set (match_operand:SF 0 "register_operand" "=r,r") (unspec:SF [(match_operand:SF 1 "register_operand" "0,0") (match_operand:SI 2 "nonmemory_operand" "K,x")] UNSPEC_FSC))] "" "@ fsc %0,%2 fsc %0,(%2)") (define_expand "DFSC" [(set (match_operand:DF 0 "register_operand" "=r,r") (unspec:DF [(match_operand:DF 1 "register_operand" "0,0") (match_operand:SI 2 "nonmemory_operand" "K,r")] UNSPEC_FSC))] "!TARGET_GFLOAT" "if (!TARGET_XKL2) { rtx x = gen_rtx_REG (SFmode, REGNO (operands[0])); if (!flag_unsafe_math_optimizations) emit_insn (gen_DFAD (operands[0], operands[1], CONST0_RTX (DFmode))); emit_insn (gen_FSC (x, x, operands[2])); DONE; }") (define_insn "*DFSC" [(set (match_operand:DF 0 "register_operand" "=r,r") (unspec:DF [(match_operand:DF 1 "register_operand" "0,0") (match_operand:SI 2 "nonmemory_operand" "K,x")] UNSPEC_FSC))] "TARGET_XKL2 && !TARGET_GFLOAT" "@ extend %0,[dfsc %2] extend %0,[dfsc (%2)]") (define_insn "GFSC" [(set (match_operand:DF 0 "register_operand" "=r,r") (unspec:DF [(match_operand:DF 1 "register_operand" "0,0") (match_operand:SI 2 "nonmemory_operand" "K,x")] UNSPEC_FSC))] "TARGET_KL10up && TARGET_GFLOAT" "@ extend %0,[gfsc %2] extend %0,[gfsc (%2)]") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Floating-point Conversions (define_expand "fix_truncsfsi2" [(set (match_operand:SI 0 "register_operand" "") (fix:SI (match_operand:SF 1 "reg_or_mem_operand" "")))] "" "if (!TARGET_KI10up) { rtx temp = gen_reg_rtx (DImode); rtx temp0 = gen_rtx_SUBREG (SImode, temp, 0); rtx temp1 = gen_rtx_SUBREG (SImode, temp, 4); /* Sequence taken from KCC. */ emit_insn (gen_MUL (temp, gen_rtx_SUBREG (SImode, operands[1], 0), GEN_INT (0400))); emit_insn (gen_TSC (temp0, temp0)); /*emit_insn (gen_ashrsi3 (operands[0], temp1, gen_rtx_PLUS (SImode, temp0, GEN_INT (-0243))));*/ emit_insn (gen_rtx_SET (VOIDmode, operands[0], gen_rtx_ASHIFTRT (SImode, temp0, gen_rtx_NEG (SImode, gen_rtx_PLUS (SImode, temp1, GEN_INT (-0243)))))); DONE; }") (define_insn "*fix_truncsfsi2" [(set (match_operand:SI 0 "register_operand" "=r") (fix:SI (match_operand:SF 1 "reg_or_mem_operand" "rm")))] "TARGET_KI10up" "fix %0,%1") ; (define_insn "fix_truncsfdi2" ...) (define_expand "fix_truncdfsi2" [(set (match_operand:SI 0 "register_operand" "") (fix:SI (match_operand:DF 1 "reg_or_mem_operand" "")))] "(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)" "") (define_insn "*DFIX" [(set (match_operand:SI 0 "register_operand" "=r") (fix:SI (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && !TARGET_GFLOAT" "extend %0,[dfix %1]") (define_insn "*GFIX" [(set (match_operand:SI 0 "register_operand" "=r") (fix:SI (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_KL10up && TARGET_GFLOAT" "extend %0,[gfix %1]") (define_expand "fix_truncdfdi2" [(set (match_operand:DI 0 "register_operand" "") (fix:DI (match_operand:DF 1 "reg_or_mem_operand" "")))] "(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)" "") (define_insn "*DDFIX" [(set (match_operand:DI 0 "register_operand" "=r") (fix:DI (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && !TARGET_GFLOAT" "extend %0,[ddfix %1]") (define_insn "*GDFIX" [(set (match_operand:DI 0 "register_operand" "=r") (fix:DI (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_KL10up && TARGET_GFLOAT" "extend %0,[gdfix %1]") (define_insn "floatunsqisf2" [(set (match_operand:SF 0 "register_operand" "=r") (unsigned_float:SF (match_operand:QI 1 "register_operand" "0")))] "" "fsc %0,233") (define_insn "floatunshisf2" [(set (match_operand:SF 0 "register_operand" "=r") (unsigned_float:SF (match_operand:HI 1 "register_operand" "0")))] "" "fsc %0,233") (define_insn "floatsisf2" [(set (match_operand:SF 0 "register_operand" "=r") (float:SF (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_KI10up" "fltr %0,%1") (define_insn "floatunssisf2" [(set (match_operand:SF 0 "register_operand" "=r") (unsigned_float:SF (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_KI10up" { if (TARGET_XKL2) return "ufltr %0,%1"; else /* Sequence taken from KCC. */ return "skipge %0,%1\;%_lsh %0,1\;fltr %0,%0\;skipge %@%1\;%_fsc %0,1"; } [(set (attr "length") (if_then_else (ne (symbol_ref "TARGET_XKL2") (const_int 0)) (const_int 1) (const_int 5)))]) ; (define_insn "floatdisf2" ...) (define_insn "floatunsqidf2" [(set (match_operand:DF 0 "register_operand" "=r") (unsigned_float:DF (match_operand:QI 1 "register_operand" "0")))] "!TARGET_GFLOAT" "fsc %0,233\;movei %Z0,0" [(set_attr "length" "2")]) (define_insn "floatunshidf2" [(set (match_operand:DF 0 "register_operand" "=r") (unsigned_float:DF (match_operand:HI 1 "register_operand" "0")))] "!TARGET_GFLOAT" "fsc %0,233\;movei %Z0,0" [(set_attr "length" "2")]) (define_expand "floatsidf2" [(set (match_operand:DF 0 "register_operand" "") (float:DF (match_operand:SI 1 "reg_or_mem_operand" "")))] "TARGET_KL10up || (TARGET_KI10 && !TARGET_GFLOAT)" "if (TARGET_KI10up && !TARGET_XKL2 && !TARGET_GFLOAT) { rtx temp = gen_rtx_SUBREG (DImode, operands[0], 0); rtx temp0 = gen_rtx_SUBREG (SImode, operands[0], 0); rtx temp1 = gen_rtx_SUBREG (SImode, operands[0], 4); /* Sequence taken from KCC. */ emit_move_insn (temp0, operands[1]); emit_move_insn (temp1, const0_rtx); emit_insn (gen_ASHC_right (temp, temp, GEN_INT (8))); emit_insn (gen_xorsi3 (temp0, temp0, GEN_INT ((HOST_WIDE_INT)0243 << 27))); if (!flag_unsafe_math_optimizations) emit_insn (gen_adddf3 (operands[0], operands[0], CONST0_RTX (DFmode))); DONE; }") (define_insn "*DFLTR" [(set (match_operand:DF 0 "register_operand" "=r") (float:DF (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && !TARGET_GFLOAT" "extend %0,[dfltr %1]") (define_insn "*GFLTR" [(set (match_operand:DF 0 "register_operand" "=r") (float:DF (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_KL10up && TARGET_GFLOAT" "extend %0,[gfltr %1]") (define_expand "floatunssidf2" [(set (match_operand:DF 0 "register_operand" "") (unsigned_float:DF (match_operand:SI 1 "reg_or_mem_operand" "")))] "" "if (!TARGET_XKL2) { rtx temp = gen_rtx_SUBREG (DImode, operands[0], 0); rtx temp0 = gen_rtx_SUBREG (SImode, operands[0], 0); rtx temp1 = gen_rtx_SUBREG (SImode, operands[0], 4); /* Sequence taken from KCC. */ emit_move_insn (temp0, operands[1]); emit_move_insn (temp1, const0_rtx); emit_insn (gen_lshrdi3 (temp, temp, GEN_INT (9))); emit_insn (gen_lshrsi3 (temp1, temp1, GEN_INT (1))); emit_insn (gen_xorsi3 (temp0, temp0, TARGET_GFLOAT ? GEN_INT ((HOST_WIDE_INT)02743 << 24) : GEN_INT ((HOST_WIDE_INT)0243 << 27))); if (!flag_unsafe_math_optimizations) emit_insn (gen_adddf3 (operands[0], operands[0], CONST0_RTX (DFmode))); DONE; }") (define_insn "*UDFLTR" [(set (match_operand:DF 0 "register_operand" "=r") (unsigned_float:DF (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && !TARGET_GFLOAT" "extend %0,[udfltr %1]") (define_insn "*UGFLTR" [(set (match_operand:DF 0 "register_operand" "=r") (unsigned_float:DF (match_operand:SI 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && TARGET_GFLOAT" "extend %0,[ugfltr %1]") (define_expand "floatdidf2" [(set (match_operand:DF 0 "register_operand" "") (float:DF (match_operand:DI 1 "reg_or_mem_operand" "")))] "(TARGET_KL10up && TARGET_GFLOAT) || (TARGET_XKL2 && !TARGET_GFLOAT)" "") (define_insn "*DDFLTR" [(set (match_operand:DF 0 "register_operand" "=r") (float:DF (match_operand:DI 1 "reg_or_mem_operand" "rm")))] "TARGET_XKL2 && !TARGET_GFLOAT" "extend %0,[ddfltr %1]") (define_insn "*DGFLTR" [(set (match_operand:DF 0 "register_operand" "=r") (float:DF (match_operand:DI 1 "reg_or_mem_operand" "rm")))] "TARGET_KL10up && TARGET_GFLOAT" "extend %0,[dgfltr %1]") (define_expand "extendsfdf2" [(set (match_operand:DF 0 "reg_or_mem_operand" "") (float_extend:DF (match_operand:SF 1 "reg_or_mem_operand" "")))] "!TARGET_GFLOAT || TARGET_KL10up" "") ;; Extend to D-float by moving the high-order word (if necessary) and ;; zeroing the low-order word. (define_insn "*extendsfdf2" [(set (match_operand:DF 0 "reg_or_mem_operand" "=r,o,r,o") (float_extend:DF (match_operand:SF 1 "reg_or_mem_operand" "0,0,rm,r")))] "!TARGET_GFLOAT" "@ movei %Z0,0%; extendsfdf2 setzm %Z0%; extendsfdf2 move %0,%1%; extendsfdf2\;movei %Z0,0%; extendsfdf2 movem %1,%0%; extendsfdf2\;setzm %Z0%; extendsfdf2" [(set (attr "length") (if_then_else (eq_attr "alternative" "0,1") (const_int 1) (const_int 2)))]) (define_insn "*GSNGL" [(set (match_operand:DF 0 "register_operand" "=r") (float_extend:DF (match_operand:SF 1 "reg_or_mem_operand" "rm")))] "TARGET_KL10up && TARGET_GFLOAT" "extend %0,[gsngl %1]") (define_expand "truncdfsf2" [(set (match_operand:SF 0 "reg_or_mem_operand" "") (float_truncate:SF (match_operand:DF 1 "reg_or_mem_operand" "")))] "!TARGET_GFLOAT || TARGET_KL10up" "") ;; Truncate from D-float by just dropping the low-order word. ;; FIXME: this is not good enough, rounding needed. Or is it?? (define_insn "*truncdfsf2" [(set (match_operand:SF 0 "reg_or_mem_operand" "=r,m,r,m") (float_truncate:SF (match_operand:DF 1 "reg_or_mem_operand" "0,0,rm,r")))] "!TARGET_GFLOAT" "@ \\t%; truncdfsf2 \\t%; truncdfsf2 move %0,%1%; truncdfsf2 movem %1,%0%; truncdfsf2" [(set (attr "length") (if_then_else (eq_attr "alternative" "0,1") (const_int 0) (const_int 1)))]) (define_insn "*GDBLE" [(set (match_operand:SF 0 "register_operand" "=r") (float_truncate:SF (match_operand:DF 1 "reg_or_mem_operand" "rm")))] "TARGET_KL10up && TARGET_GFLOAT" "extend %0,[gdble %1]") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Pointer Arithmetic (define_insn "*ADJBP_0" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm,r,m") (unspec:SI [(match_operand:SI 1 "reg_or_mem_operand" "0,rm,r") (const_int 0)] UNSPEC_ADJBP))] "" "@ %; nothing move %0,%1 movem %1,%0" [(set_attr "length" "0,1,1")]) (define_insn "IBP" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (unspec:SI [(match_operand:SI 1 "reg_or_mem_operand" "0") (const_int 1)] UNSPEC_ADJBP))] "!TARGET_KL10up" "ibp %0" [(set_attr "reorg_type" "ibp")]) (define_insn "ADJBP" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm,x,x") (unspec:SI [(match_operand:SI 1 "general_operand" "0,rm,i") (match_operand:SI 2 "general_operand" "Q,0,0")] UNSPEC_ADJBP))] "TARGET_KL10up" "@ ibp %0 adjbp %0,%1 adjbp %0,[%1]" [(set_attr "reorg_type" "ibp,none,none")]) (define_insn "MOVEI" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "address_operand" "p")] UNSPEC_ADDRESS))] "" { if (TARGET_EXTENDED) { /* ADDRESS: ... */ if (GET_CODE (operands[1]) == CONST_INT && !pdp10_const_ok_for_letter_p (INTVAL (operands[1]), 'I')) return "move %0,[%1]"; else return "xmovei %0,%a1"; } else return "movei %0,%a1"; }) (define_insn "MOVSI" [(set (match_operand:SI 0 "register_operand" "=r,r") (ashift:SI (unspec:SI [(match_operand:SI 1 "address_operand" "r,p")] UNSPEC_ADDRESS) (const_int 18)))] "" "@ movs %0,%1 movsi %0,%a1") (define_insn "HRRI" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r,r") (const_int 18) (const_int 18)) (unspec:SI [(match_operand:SI 1 "address_operand" "r,p")] UNSPEC_ADDRESS))] "" "@ hrr %0,%1 hrri %0,%a1") (define_insn "HRLI" [(set (zero_extract:SI (match_operand:SI 0 "register_operand" "+r,r") (const_int 18) (const_int 0)) (unspec:SI [(match_operand:SI 1 "address_operand" "r,p")] UNSPEC_ADDRESS))] "" "@ hrl %0,%1 hrli %0,%a1") (define_insn "ADDI" [(set (match_operand:SI 0 "register_operand" "=r,r,r,r") (unspec:SI [(plus:SI (match_operand:SI 1 "register_operand" "0,0,0,0") (match_operand:SI 2 "address_operand" "r,I,i,p"))] UNSPEC_ADDRESS))] "" "@ add %0,%2 addi %0,%2 add %0,[%2] addi %0,%a2") (define_insn "ashrsi3_pointer" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "immediate_operand" "K")] UNSPEC_SHIFTRT))] "" "ash %0,%N2%; ashrsi3_pointer") (define_insn "ashlsi3_pointer" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "immediate_operand" "K")] UNSPEC_SHIFT))] "" "ash %0,%2%; ashlsi3_pointer") (define_insn "SUBBP" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "reg_or_mem_operand" "rm")] UNSPEC_SUBBP))] "TARGET_XKL2" "extend %0,[subbp %2]") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Unconditional Jumps (define_insn "nop" [(const_int 0)] "" ;; TODO: this is the traditional NOP instruction. On KL10, TRN is ;; faster. "jfcl%; nop") (define_insn "jump" [(set (pc) (label_ref (match_operand 0 "" "")))] "" { return pdp10_output_jrst (operands[0]); }) (define_expand "indirect_jump" [(set (pc) (match_operand:SI 0 "general_operand" ""))] "" "/* Strip off any byte pointer fields, leaving only the word address. TODO: do this earlier, before conversion to 'void *'? */ if (GET_CODE (operands[0]) == CONST_INT) { HOST_WIDE_INT address = INTVAL (operands[0]); address &= TARGET_EXTENDED ? 07777777777 : 0777777; operands[0] = GEN_INT (address); } else if (GET_CODE (operands[0]) == CONST && GET_CODE (XEXP (operands[0], 0)) == PLUS && GET_CODE (XEXP (XEXP (operands[0], 0), 0)) == SYMBOL_REF && GET_CODE (XEXP (XEXP (operands[0], 0), 1)) == CONST_INT) { HOST_WIDE_INT offset = INTVAL (XEXP (XEXP (operands[0], 0), 1)); offset &= TARGET_EXTENDED ? 07777777777 : 0777777; operands[0] = plus_constant (XEXP (XEXP (operands[0], 0), 0), offset); }") (define_insn "*indirect_jump" [(set (pc) ;; ADDRESS: the S constraint allows a symbol. (match_operand:SI 0 "general_operand" "x,IS,i,rm"))] "" "@ jrst (%0) jrst %0 jrst @[%0] jrst @%0") (define_expand "call" [(call (match_operand 0 "memory_operand" "") (match_operand 1 "general_operand" ""))] "" "") (define_insn "*call_reg" [(call (mem:SI (match_operand:SI 0 "register_operand" "x")) (match_operand 1 "" "g"))] "" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst (%0)"; else return "pushj 17,(%0)"; }) (define_insn "*call_mem2" [(call (mem:SI (match_operand 0 "immediate_operand" "i")) (match_operand 1 "general_operand" "g"))] "GET_CODE (operands[0]) != SYMBOL_REF" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst %a0"; else return "pushj 17,%a0"; }) (define_insn "*call_symbol" [(call (mem:SI (match_operand:SI 0 "" "X")) (match_operand:SI 1 "general_operand" "g"))] "GET_CODE (operands[0]) == SYMBOL_REF" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst %L0"; else return "pushj 17,%L0"; }) (define_insn "*call_mem1" [(call (match_operand:SI 0 "memory_operand" "m") (match_operand:SI 1 "general_operand" "g"))] "" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst @%0"; else return "pushj 17,@%0"; }) (define_expand "call_value" [(set (match_operand 0 "" "") (call (match_operand 1 "memory_operand" "") (match_operand 2 "general_operand" "")))] "" "") (define_insn "*call_value_reg" [(set (match_operand 0 "" "=r") (call (mem:SI (match_operand:SI 1 "register_operand" "x")) (match_operand:SI 2 "general_operand" "g")))] "" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst (%1)"; else return "pushj 17,(%1)"; }) (define_insn "*call_value_mem1" [(set (match_operand 0 "" "=r") (call (mem:SI (match_operand 1 "memory_operand" "o")) (match_operand 2 "general_operand" "g")))] "CONSTANT_ADDRESS_P (XEXP (operands[1], 0))" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst @%1"; else return "pushj 17,@%1"; }) (define_insn "*call_value_mem2" [(set (match_operand 0 "register_operand" "=r") (call (mem:SI (match_operand 1 "immediate_operand" "i")) (match_operand 2 "general_operand" "g")))] "GET_CODE (operands[1]) != SYMBOL_REF" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst %a1"; else return "pushj 17,%a1"; }) (define_insn "*call_value_symbol" [(set (match_operand 0 "register_operand" "=r") (call (mem:SI (match_operand:SI 1 "" "X")) (match_operand:SI 2 "general_operand" "g")))] "GET_CODE (operands[1]) == SYMBOL_REF" { if (pdp10_output_call_as_jrst_p (insn)) return "jrst %L1"; else if (pdp10_output_call_as_jsp_p (operands[1])) return "jsp ?,%L1"; else return "pushj 17,%L1"; }) (define_insn "*call_value_mem3" [(set (match_operand 0 "register_operand" "=r") ; (call (mem:SI (match_operand:SI 1 "address_operand" "a")) (call (match_operand:SI 1 "memory_operand" "m") (match_operand:SI 2 "general_operand" "g")))] "" { /* operands[1] = gen_rtx_MEM (SImode, operands[1]);*/ if (pdp10_output_call_as_jrst_p (insn)) return "jrst %1"; else return "pushj 17,%1"; }) ; (define_expand "sibcall" ...) ; (define_expand "sibcall_value" ...) (define_expand "untyped_call" [(parallel [(call (match_operand 0 "" "") (const_int 0)) (match_operand 1 "" "") (match_operand 2 "" "")])] "" "{ int i; emit_call_insn (gen_call (operands[0], const0_rtx)); for (i = 0; i < XVECLEN (operands[2], 0); i++) { rtx set = XVECEXP (operands[2], 0, i); emit_move_insn (SET_DEST (set), SET_SRC (set)); } /* The optimizer doesn't know that the call sets the function value registers we stored in the result block. We avoid problems by claiming that all hard registers are used and clobbered at this point. */ emit_insn (gen_blockage ()); DONE; }") (define_insn "*PUSHJ" [(parallel [(call (match_operand:SI 0 "memory_operand" "m") (match_operand:SI 1 "" "")) (use (match_operand:SI 2 "register_operand" "+r"))])] "" "pushj %2,%0") ; (define_insn "trap" ; [(trap_if (const_int 1) (const_int 0))] ; "" ; "%; trap") (define_expand "casesi" [(set (match_dup 5) (minus:SI (match_operand:SI 0 "register_operand" "") (match_operand:SI 1 "general_operand" ""))) (set (pc) (if_then_else (lt (match_dup 5) (const_int 0)) (label_ref (match_operand 4 "" "")) (pc))) (set (pc) (if_then_else (gt (match_dup 5) (match_operand:SI 2 "general_operand" "")) (label_ref (match_dup 4)) (pc))) ;;; This is too general. The jump table label will always be local. ;;; Unless the table is in .rodata located in another section. ; (set (match_dup 6) ; (plus:SI (match_dup 5) (label_ref (match_operand 3 "" "")))) ; (parallel [(set (pc) (if_then_else (const_int 1) ; (mem:SI (match_dup 6)) ; (label_ref (match_dup 4)))) ; (use (label_ref (match_dup 3)))])] (parallel [(set (pc) (if_then_else (const_int 1) (mem:SI (plus:SI (match_dup 5) (label_ref (match_operand 3 "" "")))) (label_ref (match_dup 4)))) (use (label_ref (match_dup 3)))])] "" "operands[5] = gen_reg_rtx (SImode); /*operands[6] = gen_reg_rtx (SImode);*/") ;; This is the bare minimum of how an acceptable casesi dispatch ;; instruction must look like. (define_insn "" [(parallel [(set (pc) (if_then_else (const_int 1) (match_operand:SI 0 "address_operand" "p") (label_ref (match_operand 1 "" "")))) (use (label_ref (match_operand 2 "" "")))])] "" "jrst %a0") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Conditional Jumps (define_expand "cmpsi" [(set (cc0) (compare (match_operand:SI 0 "register_operand" "") (match_operand:SI 1 "general_operand" "")))] "" "pdp10_compare_op0 = operands[0]; pdp10_compare_op1 = operands[1]; DONE;") ;; (define_expand "cmpdi" ;; [(set (cc0) (compare (match_operand:DI 0 "register_operand" "") ;; (match_operand:DI 1 "general_operand" "")))] ;; "" ;; "pdp10_compare_op0 = operands[0]; ;; pdp10_compare_op1 = operands[1]; ;; DONE;") (define_expand "cmpsf" [(set (cc0) (compare (match_operand:SF 0 "register_operand" "") (match_operand:SF 1 "general_operand" "")))] "" "pdp10_compare_op0 = operands[0]; pdp10_compare_op1 = operands[1]; DONE;") ;; KCC generates this for double x, y: ;; x == y: ;; CAMN x+1,y+1 ;; CAME x,y ;; ;here if false ;; x < y: xy ;; CAML x,y ? false false ;; CAMGE x+1,y+1 false true ? ;; CAMLE x,y true false ;; ;here if false no yes yes ;; x <= y: ;; CAML x,y ? false false ;; CAMG x+1,y+1 false false ? ;; CAMLE x,y true true false ;; ;here if false no no yes ;; These may also work for long long after adaptions. ;; To compare a double against zero: ;; x < 0: ;; JUMPL x,label ;; ;here if false ;; x >= 0: ;; JUMPGE x,label ;; ;here if false ;; x <= 0: x<0 x==0 x>0 ;; JUMPL x,label true false false ;; SKIPN x false ;; JUMPE x+1,label true ;; ;here if false ;; x > 0: ;; JUMPG x,label false false maybe ;; SKIPL x true false false ;; JUMPG x+1,label false true ;; ;here if false (define_expand "cmpdf" [(set (cc0) (compare (match_operand:DF 0 "register_operand" "") (match_operand:DF 1 "general_operand" "")))] "" "if (pdp10_const_double_0_operand (operands[1], DFmode)) pdp10_compare_op0 = operands[0]; else { pdp10_compare_op0 = gen_reg_rtx (DFmode); gen_subdf3 (pdp10_compare_op0, operands[0], operands[1]); } pdp10_compare_op1 = CONST0_RTX (DFmode); DONE;") (define_insn "test_and_skip" [(set (pc) (if_then_else (match_operator 0 "pdp10_equality_operator" [(and:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "general_operand" "g")) (const_int 0)]) (label_ref (match_operand 3 "" "")) (pc)))] "" "*pdp10_remove_unnecessary_label (insn, operands[3]); return pdp10_output_test_and_skip (insn, operands);" [(set (attr "length") (if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) ;; Equality comparisons of a contigous group of bits with zero will be ;; written using zero_extract rather than the equivalent AND operations. (define_insn "test_extract_skip" [(set (pc) (if_then_else (match_operator 0 "pdp10_equality_operator" [(zero_extract:SI (match_operand:SI 1 "register_operand" "r") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")) (const_int 0)]) (label_ref (match_operand 4 "" "")) (pc)))] "" { int len = INTVAL (operands[2]), pos = INTVAL (operands[3]); HOST_WIDE_INT mask = (((HOST_WIDE_INT)1 << len) - 1) << (36 - pos - len); /* Must assign operands[2] and operands[3], since pdp10_output_test_and_skip use those to output the instruction. */ operands[2] = gen_int_mode (mask, SImode); operands[3] = operands[4]; pdp10_remove_unnecessary_label (insn, operands[3]); return pdp10_output_test_and_skip (insn, operands); } [(set (attr "length") (if_then_else (eq (minus (match_dup 4) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) (define_insn "TLZN" [(set (pc) (if_then_else (ne (and:SI (match_operand:SI 0 "register_operand" "+r") (match_operand:SI 1 "const_int_operand" "")) (const_int 0)) (label_ref (match_operand 2 "" "")) (pc))) (set (match_dup 0) (and:SI (match_dup 0) (not:SI (match_dup 1))))] "" { pdp10_remove_unnecessary_label (insn, operands[2]); if (get_attr_length (insn) == 1) return "tlzn %0,%1"; else return "tlze %0,%1\;jrst %2"; } [(set (attr "length") (if_then_else (eq (minus (match_dup 2) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) (define_insn "TLNE_TLZA_TLO" [(set (match_operand:SI 0 "register_operand" "+r") (unspec:SI [(match_dup 0) (match_operand:SI 1 "const_int_operand" "") (match_operand:SI 2 "const_int_operand" "") (match_operand:SI 3 "const_int_operand" "")] UNSPEC_TLNE_TLZA_TLO))] "" "tlne %0,%1\;%_tlza %0,%2\;%_%_tlo %0,%3" [(set_attr "length" "3")]) (define_expand "bne" [(set (pc) (if_then_else (ne (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "if (pdp10_generate_cbranchdi (NE, pdp10_compare_op0, pdp10_compare_op1)) DONE; operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "beq" [(set (pc) (if_then_else (eq (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "bge" [(set (pc) (if_then_else (ge (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "bgt" [(set (pc) (if_then_else (gt (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "ble" [(set (pc) (if_then_else (le (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "blt" [(set (pc) (if_then_else (lt (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_compare_op0; operands[2] = pdp10_compare_op1;") (define_expand "bgeu" [(set (pc) (if_then_else (ge (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_expand "bgtu" [(set (pc) (if_then_else (gt (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_expand "bleu" [(set (pc) (if_then_else (le (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") (define_expand "bltu" [(set (pc) (if_then_else (lt (match_dup 1) (match_dup 2)) (label_ref (match_operand 0 "" "")) (pc)))] "" "operands[1] = pdp10_flip_sign_bit (pdp10_compare_op0); operands[2] = pdp10_flip_sign_bit (pdp10_compare_op1);") ; (define_insn "cbranchsi4" ...) (define_insn "cbranchsi" [(set (pc) (if_then_else (match_operator 3 "comparison_operator" [(match_operand:SI 1 "reg_or_mem_operand" "r,m,r,r,r") ;; ADDRESS: an S constraint for the cai case ;; (alternative 2) would allow a symbol. (match_operand:SI 2 "general_operand" "O,O,I,i,rm")]) (label_ref (match_operand 0 "" "")) (pc)))] "" { static const char *asms[] = { "jump%3 %1,%F0", "skip%3 %@%1", "cai%3 %1,%2", "cam%3 %1,[%X2]", "cam%3 %1,%2" }; if (which_alternative != 0) pdp10_remove_unnecessary_label (insn, operands[0]); /* ADDRESS: unextended code can store the symbol in the immediate field. */ if (which_alternative == 3 && !TARGET_EXTENDED && GET_CODE (operands[2]) == CONST) which_alternative = 2; if (get_attr_length (insn) == 1) return asms[which_alternative]; else { /* Reverse the skip condition and output a JRST. */ operands[3] = gen_rtx_fmt_ee (reverse_condition (GET_CODE (operands[3])), VOIDmode, NULL_RTX, NULL_RTX); output_asm_insn (asms[which_alternative], operands); return pdp10_output_jrst (operands[0]); } } [(set (attr "length") (if_then_else (ior (eq_attr "alternative" "0") (eq (minus (match_dup 0) (pc)) (const_int 1))) (const_int 1) (const_int 2))) (set_attr "skip" "no,yes,yes,yes,yes")]) (define_insn "*CAI_reg" [(set (pc) (if_then_else (match_operator 0 "comparison_operator" [(and:SI (match_operand:SI 1 "register_operand" "x") (const_int RIGHT_HALF)) (match_operand:SI 2 "register_operand" "r")]) (label_ref (match_operand 3 "" "")) (pc)))] "" { pdp10_remove_unnecessary_label (insn, operands[3]); if (get_attr_length (insn) == 1) return "cai%0 %2,(%1)"; else { /* Reverse the skip condition and output a JRST. */ output_asm_insn ("cai%R0 %2,(%1)", operands); return pdp10_output_jrst (operands[3]); } } [(set (attr "length") (if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) (define_insn "*CAI_const_plus_reg" [(set (pc) (if_then_else (match_operator 0 "comparison_operator" [(and:SI (plus:SI (match_operand:SI 1 "register_operand" "x") (match_operand:SI 2 "const_int_operand" "I")) (const_int RIGHT_HALF)) (match_operand:SI 3 "register_operand" "r")]) (label_ref (match_operand 4 "" "")) (pc)))] "pdp10_const_ok_for_letter_p (INTVAL (operands[2]), 'I')" { pdp10_remove_unnecessary_label (insn, operands[4]); if (get_attr_length (insn) == 1) return "cai%0 %3,%2(%1)"; else { /* Reverse the skip condition and output a JRST. */ output_asm_insn ("cai%R0 %3,%2(%1)", operands); return pdp10_output_jrst (operands[4]); } } [(set (attr "length") (if_then_else (eq (minus (match_dup 4) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) (define_insn "*cbranchsf" [(set (pc) (if_then_else (match_operator 3 "pdp10_comparison_operator" [(match_operand:SF 1 "reg_or_mem_operand" "r,m,r,r,r") (match_operand:SF 2 "general_operand" "R,R,I,i,rm")]) (label_ref (match_operand 0 "" "")) (pc)))] "" { /* TODO: Copy from cbranchsi. Maybe create an output function for both? */ const char *asms[][2] = { { "jump%3 %1,%F0", 0 }, { "skip%3 %@%1", "skip%R3 %@%1\;jrst %l0" }, { "cai%3 %1,%2", "cai%R3 %1,%2\;jrst %l0" }, { "cam%3 %1,[%2]", "cam%R3 %1,[%2]\;jrst %l0" }, { "cam%3 %1,%2", "cam%R3 %1,%2\;jrst %l0" } }; if (which_alternative != 0) pdp10_remove_unnecessary_label (insn, operands[0]); return asms[which_alternative][get_attr_length (insn) - 1]; } [(set (attr "length") (if_then_else (ior (eq_attr "alternative" "0") (eq (minus (match_dup 0) (pc)) (const_int 1))) (const_int 1) (const_int 2))) (set_attr "skip" "no,yes,yes,yes,yes")]) (define_insn "*cbranchdf" [(set (pc) (if_then_else (match_operator 3 "pdp10_comparison_operator" [(match_operand:DF 1 "reg_or_mem_operand" "r,m") (match_operand:DF 2 "pdp10_const_double_0_operand" "")]) (label_ref (match_operand 0 "" "")) (pc)))] "" { if (which_alternative == 0) return "jump%3 %1,%F0"; pdp10_remove_unnecessary_label (insn, operands[0]); if (get_attr_length (insn) == 1) return "skip%3 %@%1"; else { output_asm_insn ("skip%R3 %@%1", operands); return pdp10_output_jrst (operands[0]); } } [(set (attr "length") (if_then_else (ior (eq_attr "alternative" "0") (eq (minus (match_dup 0) (pc)) (const_int 1))) (const_int 1) (const_int 2))) (set_attr "skip" "no,yes")]) (define_insn "doloop_end" [(set (pc) (if_then_else (ge (plus:SI (match_operand:SI 0 "reg_or_mem_operand" "+r") (const_int -1)) (const_int 0)) (label_ref (match_operand 4 "" "")) (pc))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1))) (use (match_operand 1 "" "")) ; iterations; zero if unknown (use (match_operand 2 "" "")) ; max iterations (use (match_operand 3 "" ""))] ; loop level "" "sojge %0,%l4%; doloop_end") (define_insn "decrement_and_branch_until_zero" [(set (pc) (if_then_else (match_operator 2 "pdp10_comparison_operator" [(plus:SI (match_operand:SI 0 "reg_or_mem_operand" "+r,m") (const_int -1)) (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1)))] "" { if (which_alternative == 0) return "soj%2 %0,%l1%; decrement_and_branch_until_zero"; pdp10_remove_unnecessary_label (insn, operands[1]); if (get_attr_length (insn) == 1) return "sos%2 %@%0%; decrement_and_branch_until_zero"; else { output_asm_insn ("sos%R2 %@%0%; decrement_and_branch_until_zero", operands); return pdp10_output_jrst (operands[1]); } } [(set (attr "length") (if_then_else (ior (eq_attr "alternative" "0") (eq (minus (match_dup 1) (pc)) (const_int 1))) (const_int 1) (const_int 2))) (set_attr "skip" "no,yes")]) (define_insn "*AOJ" [(set (pc) (if_then_else (match_operator 0 "pdp10_comparison_operator" [(plus:SI (match_operand:SI 1 "reg_or_mem_operand" "+r,m") (const_int 1)) (const_int 0)]) (label_ref (match_operand 2 "" "")) (pc))) (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1)))] "" { if (which_alternative == 0) return "aoj%0 %1,%l2"; pdp10_remove_unnecessary_label (insn, operands[2]); if (get_attr_length (insn) == 1) return "aos%0 %@%1"; else { output_asm_insn ("aos%R0 %@%1", operands); return pdp10_output_jrst (operands[2]); } } [(set (attr "length") (if_then_else (ior (eq_attr "alternative" "0") (eq (minus (match_dup 2) (pc)) (const_int 1))) (const_int 1) (const_int 2))) (set_attr "skip" "no,yes")]) (define_insn "*SOJA" [(set (pc) (label_ref (match_operand 2 "" ""))) (set (match_operand:SI 0 "register_operand" "=r") (plus:SI (match_operand:SI 1 "register_operand" "0") (const_int -1)))] "" { rtx next = next_nonnote_insn (insn); if (next == operands[2] || (GET_CODE (next) == BARRIER && next_nonnote_insn (next) == operands[2])) { pdp10_remove_unnecessary_label (insn, operands[1]); return "subi %0,1"; } else return "soja %0,%l2"; }) (define_insn "*AOJA" [(set (pc) (label_ref (match_operand 2 "" ""))) (set (match_operand:SI 0 "register_operand" "=r") (plus:SI (match_operand:SI 1 "register_operand" "0") (const_int 1)))] "" { rtx next = next_nonnote_insn (insn); if (next == operands[2] || (GET_CODE (next) == BARRIER && next_nonnote_insn (next) == operands[2])) { pdp10_remove_unnecessary_label (insn, operands[2]); return "addi %0,1"; } else return "aoja %0,%l2"; }) (define_insn "*SOSx_and_move" [(set (pc) (if_then_else (match_operator 2 "pdp10_comparison_operator" [(plus:SI (match_operand:SI 1 "reg_or_mem_operand" "+rm") (const_int -1)) (const_int 0)]) (label_ref (match_operand 3 "" "")) (pc))) (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1))) (set (match_operand:SI 0 "register_operand" "=x") (plus:SI (match_dup 1) (const_int -1)))] "" { pdp10_remove_unnecessary_label (insn, operands[3]); if (get_attr_length (insn) == 1) return "sos%2 %0,%1"; else { output_asm_insn ("sos%R2 %0,%1", operands); return pdp10_output_jrst (operands[3]); } } [(set (attr "length") (if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) (define_insn "*AOSx_and_move" [(set (pc) (if_then_else (match_operator 2 "pdp10_comparison_operator" [(plus:SI (match_operand:SI 1 "reg_or_mem_operand" "+rm") (const_int 1)) (const_int 0)]) (label_ref (match_operand 3 "" "")) (pc))) (set (match_dup 1) (plus:SI (match_dup 1) (const_int 1))) (set (match_operand:SI 0 "register_operand" "=x") (plus:SI (match_dup 1) (const_int 1)))] "" { pdp10_remove_unnecessary_label (insn, operands[3]); if (get_attr_length (insn) == 1) return "aos%2 %0,%1"; else { output_asm_insn ("aos%R2 %0,%1", operands); return pdp10_output_jrst (operands[3]); } } [(set (attr "length") (if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) (define_insn "JFFO" [(set (pc) (if_then_else (ne (subreg:SI (match_operand:DI 0 "register_operand" "+r") 0) (const_int 0)) (match_operand 1 "address_operand" "") (pc))) (set (subreg:SI (match_dup 0) 4) (unspec:SI [(subreg:SI (match_dup 0) 0)] UNSPEC_FFO))] "TARGET_KA10up" { if (GET_CODE (operands[1]) == LABEL_REF) return "jffo %0,%l1"; else return "jffo %0,%1"; }) (define_insn "CMPBP" [(set (pc) (if_then_else (match_operator 0 "comparison_operator" [(unspec:SI [(match_operand:SI 1 "register_operand" "r")] UNSPEC_CMPBP) (unspec:SI [(match_operand:SI 2 "reg_or_mem_operand" "rm")] UNSPEC_CMPBP)]) (label_ref (match_operand 3 "" "")) (pc)))] "TARGET_XKL2" { pdp10_remove_unnecessary_label (insn, operands[3]); if (get_attr_length (insn) == 1) return "extend %1,[cmpbp%0 %2]"; else return "extend %1,[cmpbp%C0 %2]\;jump %3"; } [(set (attr "length") (if_then_else (eq (minus (match_dup 3) (pc)) (const_int 1)) (const_int 1) (const_int 2))) (set_attr "skip" "yes")]) ; (define_expand "conditional_trap" ; [(trap_if (match_operator 0 "pdp10_comparison_operator" ; [(match_dup 2) (const_int 0)]) ; (match_operand 1 "const_int_operand" ""))] ; "" ; "operands[2] = pdp10_compare_op0;") ; (define_insn "*trap" ; [(trap_if (match_operator 0 "pdp10_comparison_operator" ; [(match_operand 2 "memory_operand" "m") (const_int 0)]) ; (match_operand 1 "const_int_operand" "i"))] ; "" ; "skip%R0 %2\;%_%; conditional_trap" ; [(set_attr "length" "2")]) ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Function Prologue and Epilogue (define_expand "prologue" [(const_int 2)] "" "pdp10_expand_prologue (); DONE;") (define_expand "epilogue" [(return)] "" "pdp10_expand_epilogue (1); DONE;") (define_expand "sibcall_epilogue" [(const_int 3)] "" "pdp10_expand_epilogue (0); DONE;") (define_insn "POPJ" [(set (pc) (match_operand:SI 0 "pdp10_pop_operand" ""))] "" "popj %P0,") (define_insn "POPJ_17" [(return)] "" { return pdp10_output_return (); }) ;; Allocate stack space, and return the word address of the allocated ;; memory. (define_expand "allocate_stack" [(set (match_operand:SI 0 "register_operand" "") (unspec:SI [(plus:SI (reg:SI SP_REGNUM) (const_int 1))] UNSPEC_ADDRESS)) (set (reg:SI SP_REGNUM) (unspec:SI [(reg:SI SP_REGNUM) (match_operand:SI 1 "general_operand" "")] UNSPEC_ADJSP))] "" "{ rtx x = plus_constant (stack_pointer_rtx, 1); rtx y, z = gen_reg_rtx (Pmode); if (GET_CODE (operands[1]) == CONST_INT) y = GEN_INT ((INTVAL (operands[1]) + 3) / 4); else { y = gen_reg_rtx (Pmode); emit_insn (gen_addsi3 (y, operands[1], GEN_INT (3))); emit_insn (gen_ASH_right (y, y, GEN_INT (-2))); } emit_move_insn (z, gen_rtx_UNSPEC (Pmode, gen_rtvec (1, x), UNSPEC_ADDRESS)); emit_move_insn (operands[0], z); emit_insn (pdp10_gen_stack_adjust (y)); DONE; }") (define_expand "ADJSP" [(set (match_operand:SI 0 "register_operand" "") (unspec:SI [(match_dup 0) (match_operand:SI 1 "general_operand" "")] UNSPEC_ADJSP))] "" "") (define_insn "*ADJSP_KL10up" [(set (match_operand:SI 0 "register_operand" "+r,r,r,r") (unspec:SI [(match_dup 0) (match_operand:SI 1 "general_operand" "K,i,x,m")] UNSPEC_ADJSP))] "TARGET_KL10up" "@ adjsp %0,%1 adjsp %0,[%1] adjsp %0,(%1) adjsp %0,@%1") (define_insn "*ADJSP_noKL10up" [(set (match_operand:SI 0 "register_operand" "+r") (unspec:SI [(match_dup 0) (match_operand:SI 1 "immediate_operand" "K")] UNSPEC_ADJSP))] "!TARGET_KL10up && !TARGET_EXTENDED" "add %0,[%1,,%1]") (define_insn "PUSH" [(set (match_operand:SI 0 "pdp10_push_operand" "=m") (match_operand:SI 1 "reg_or_mem_operand" "rm"))] "" "push %P0,%1") (define_insn "*pushsi_combine" [(parallel [(set (mem:SI (plus:SI (match_operand:SI 0 "register_operand" "r") (const_int 1))) ;; FIXME: empty predicate allowed? (match_operand:SI 1 "" "rm")) (set (match_operand:SI 2 "register_operand" "=0") (plus:SI (match_dup 0) (const_int 1)))])] "optimize_size && TARGET_EXTENDED" "push %0,%1") (define_insn "*pushsf_combine" [(parallel [(set (mem:SF (plus:SI (match_operand:SI 0 "register_operand" "r") (const_int 1))) (match_operand:SF 1 "reg_or_mem_operand" "rm")) (set (match_operand:SI 2 "register_operand" "=0") (plus:SI (match_dup 0) (const_int 1)))])] "optimize_size && TARGET_EXTENDED" "push %0,%1") (define_insn "POP" [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (match_operand:SI 1 "pdp10_pop_operand" "m"))] "" "pop %P1,%0") (define_insn "*popsi_combine" [(parallel [(set (match_operand:SI 0 "reg_or_mem_operand" "=rm") (mem:SI (match_operand:SI 1 "register_operand" "r"))) (set (match_operand:SI 2 "reg_or_mem_operand" "=1") (plus:SI (match_dup 1) (const_int -1)))])] "optimize_size && TARGET_EXTENDED" "pop %1,%0") (define_insn "*popsf_combine" [(parallel [(set (match_operand:SF 0 "reg_or_mem_operand" "=rm") (mem:SF (match_operand:SI 1 "register_operand" "+r"))) (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))])] "optimize_size && TARGET_EXTENDED" "pop %1,%0") ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Peepholes ;; The following four insns compensate for unnecessary shifts ;; generated by pointer arithmetic. (define_insn "*combine_nop_shift_left_right" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(ashift:SI (match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "")) (match_operand:SI 3 "const_int_operand" "")] UNSPEC_SHIFTRT))] "INTVAL (operands[2]) == INTVAL (operands[3])" "" [(set_attr "length" "0")]) (define_insn "*combine_shift_left_right" [(set (match_operand:SI 0 "register_operand" "=r") (unspec:SI [(ashift:SI (match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "")) (match_operand:SI 3 "const_int_operand" "")] UNSPEC_SHIFTRT))] "" { operands[2] = GEN_INT (INTVAL (operands[2]) - INTVAL (operands[3])); return "ash %0,%2"; }) (define_insn "*combine_nop_shift_right_left" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "")] UNSPEC_SHIFT) (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) == INTVAL (operands[3])" "" [(set_attr "length" "0")]) (define_insn "*combine_shift_right_left" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (unspec:SI [(match_operand:SI 1 "register_operand" "0") (match_operand:SI 2 "const_int_operand" "")] UNSPEC_SHIFT) (match_operand:SI 3 "const_int_operand" "")))] "" { operands[2] = GEN_INT (INTVAL (operands[2]) - INTVAL (operands[3])); return "ash %0,%2"; }) ;; Remove unnecessary shifts generated by pointer arithmetic. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (unspec:SI [(truncate:SI (ashift:SI (match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "const_int_operand" ""))) (match_operand:SI 3 "const_int_operand" "")] UNSPEC_SHIFTRT))] "INTVAL (operands[2]) == INTVAL (operands[3])" [(set (match_dup 0) (truncate:SI (match_dup 1)))]) (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (ashiftrt:SI (unspec:SI [(match_operand:SI 1 "register_operand" "") (match_operand:SI 2 "const_int_operand" "")] UNSPEC_SHIFT) (match_operand:SI 3 "const_int_operand" "")))] "INTVAL (operands[2]) == INTVAL (operands[3])" [(set (match_dup 0) (match_dup 1))]) ;; Generate EXCH instructions. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (match_operand:SI 1 "reg_or_mem_operand" "")) (set (match_dup 1) (match_operand:SI 2 "reg_or_mem_operand" "")) (set (match_dup 2) (match_dup 0))] "find_reg_note (next_nonnote_insn (next_nonnote_insn (insn)), REG_DEAD, operands[0]) && (register_operand (operands[1], SImode) || register_operand (operands[2], SImode))" ;"peep2_reg_dead_p (2, operands[0]) && ..." [(parallel [(set (match_dup 1) (match_dup 2)) (set (match_dup 2) (match_dup 1))])] "if (register_operand (operands[1], SImode)) { rtx tmp = operands[1]; operands[1] = operands[2]; operands[2] = tmp; }") ;; Generate SETZB instructions. (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (const_int 0)) (set (match_operand:SI 1 "reg_or_mem_operand" "") (const_int 0))] "register_operand (operands[0], SImode) || register_operand (operands[1], SImode)" [(parallel [(set (match_dup 0) (const_int 0)) (set (match_dup 1) (const_int 0))])] "if (register_operand (operands[0], SImode)) { rtx tmp = operands[0]; operands[0] = operands[1]; operands[1] = tmp; }") ;; Remove an unneccesary MOVEI instruction. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (unspec:SI [(plus:SI (match_dup 0) (match_operand 1 "const_int_operand" ""))] UNSPEC_ADDRESS)) (parallel [(unspec_volatile:BLK [(match_operand:SI 2 "register_operand" "")] VUNSPEC_BLT) (use (mem:BLK (match_dup 0)))])] "dead_or_set_p (insn, operands[0])" ;"peep2_reg_dead_p (0, operands[0])" [(parallel [(unspec_volatile:BLK [(match_dup 2)] VUNSPEC_BLT) (use (mem:BLK (plus:SI (match_dup 0) (match_dup 1))))])]) ;; Optimize a block-copy operation with constant addresses. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (unspec:SI [(match_operand:SI 1 "immediate_operand" "")] UNSPEC_ADDRESS)) (set (zero_extract:SI (match_dup 0) (const_int 18) (const_int 0)) (unspec:SI [(match_operand:SI 2 "immediate_operand" "")] UNSPEC_ADDRESS))] "" [(set (match_dup 0) (ior:SI (ashift:SI (match_dup 2) (const_int 18)) (match_dup 1)))]) ;; Optimize a block-clear operation with a constant address. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (match_operand:SI 1 "immediate_operand" "")) (set (match_operand:SI 2 "register_operand" "") (ashift:SI (unspec:SI [(match_dup 0)] UNSPEC_ADDRESS) (const_int 18))) (set (zero_extract:SI (match_dup 2) (const_int 18) (const_int 18)) ;; FIXME: (const_int 4) -> (const_int 1)? (unspec:SI [(plus:SI (match_dup 0) (const_int 4))] UNSPEC_ADDRESS))] "dead_or_set_p (insn, operands[0])" ;"peep2_reg_dead_p (0, operands[0])" [(set (match_dup 2) (ior:SI (ashift:SI (match_dup 1) (const_int 18)) (const:SI (plus:SI (match_dup 1) (const_int 1)))))]) ;; Generate a PUSHJ instruction from an equivalent sequence of ;; instructions. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (label_ref:SI (match_operand 1 "" ""))) (parallel [(set (mem:SI (plus:SI (match_operand:SI 2 "register_operand" "") (const_int 1))) (match_operand:SI 3 "" "")) (set (match_dup 2) (plus:SI (match_dup 2) (const_int 1)))]) (set (pc) (match_operand:SI 4 "" ""))] ;; TODO: find code_label corresponding to operands[1]. "0 && TARGET_EXTENDED" [(parallel [(call (mem:SI (match_dup 4)) (const_int 0)) (use (match_dup 2))])]) ;; Generate a POP instruction from an equivalent sequence of ;; instructions. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (mem:SI (match_operand:SI 1 "register_operand" ""))) (set (match_operand:SI 2 "reg_or_mem_operand" "") (match_dup 0)) (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))] "optimize_size && TARGET_EXTENDED" [(parallel [(set (match_dup 2) (mem:SI (match_dup 1))) (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))])]) (define_peephole2 [(set (match_operand:SF 0 "register_operand" "") (mem:SF (match_operand:SI 1 "register_operand" ""))) (set (match_operand:SF 2 "reg_or_mem_operand" "") (match_dup 0)) (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))] "optimize_size && TARGET_EXTENDED" [(parallel [(set (match_dup 2) (mem:SF (match_dup 1))) (set (match_dup 1) (plus:SI (match_dup 1) (const_int -1)))])]) ;; XMOVEI AC1,OFFSET(17) ;; MOVE AC2,AC1 -> MOVE AC2,OFFSET(17) ;; AC1 is dead (define_peephole2 [(set (match_operand:SI 1 "register_operand" "") (plus:SI (reg:SI SP_REGNUM) (match_operand:SI 2 "const_int_operand" ""))) (set (match_operand:SI 0 "register_operand" "") (match_dup 1))] ;"dead_or_set_p (insn, operands[1])" "find_regno_note (next_real_insn (insn), REG_DEAD, REGNO (operands[1]))" ;"peep2_reg_dead_p (1, operands[1]);" [(set (match_dup 0) (plus:SI (reg:SI SP_REGNUM) (match_dup 2)))]) ;; XMOVEI AC1,(17) ;; ADDI AC1,OFFSET -> XMOVEI AC1,OFFSET(17) (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (reg:SI SP_REGNUM)) (set (match_dup 0) (plus:SI (match_dup 0) (match_operand:SI 1 "const_int_operand" "")))] "" [(set (match_dup 0) (plus:SI (reg:SI SP_REGNUM) (match_dup 1)))]) ;; XMOVEI AC1,OFFSET1(17) ;; ADDI AC1,OFFSET2 -> XMOVEI AC1,OFFSET1+OFFSET2(17) (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (plus:SI (reg:SI SP_REGNUM) (match_operand:SI 1 "const_int_operand" ""))) (set (match_dup 0) (plus:SI (match_dup 0) (match_operand:SI 2 "const_int_operand" "")))] "" [(set (match_dup 0) (plus:SI (reg:SI SP_REGNUM) (match_dup 3)))] "operands[3] = gen_int_mode (INTVAL (operands[1]) + INTVAL (operands[2]), Pmode);") ;; AOS m ;; MOVE a,m -> AOS a,m (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_dup 0) (const_int 1))) (set (match_operand:SI 1 "register_operand" "") (match_dup 0))] "REGNO (operands[1]) != 0" [(parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int 1))) (set (match_dup 1) (plus:SI (match_dup 0) (const_int 1)))])]) ;; SOS m ;; MOVE a,m -> SOS a,m (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_dup 0) (const_int -1))) (set (match_operand:SI 1 "register_operand" "") (match_dup 0))] "REGNO (operands[1]) != 0" [(parallel [(set (match_dup 0) (plus:SI (match_dup 0) (const_int -1))) (set (match_dup 1) (plus:SI (match_dup 0) (const_int -1)))])]) ;; AOS a,m ;; CAILE a,0 -> AOSLE a,m ;; MOVEI a,0 MOVEI a,0 (define_peephole [(parallel [(set (match_operand:SI 0 "memory_operand" "") (plus:SI (match_dup 0) (const_int 1))) (set (match_operand:SI 1 "register_operand" "") (plus:SI (match_dup 0) (const_int 1)))]) (set (match_dup 1) (smin:SI (match_dup 1) (match_operand 2 "const_int_operand" "")))] "REGNO (operands[1]) != 0 && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)" { if (INTVAL (operands[2]) == 0) return "aosle %1,%0\;%_movei %1,0"; else if (INTVAL (operands[2]) == 1) return "aosle %1,%0\;%_movei %1,1"; else return "aosl %1,%0\;%_seto %1,"; }) ;; SOS a,m ;; CAILE a,0 -> SOSLE a,m ;; MOVEI a,0 MOVEI a,0 (define_peephole [(parallel [(set (match_operand:SI 0 "memory_operand" "") (plus:SI (match_dup 0) (const_int -1))) (set (match_operand:SI 1 "register_operand" "") (plus:SI (match_dup 0) (const_int -1)))]) (set (match_dup 1) (smin:SI (match_dup 1) (match_operand 2 "const_int_operand" "")))] "REGNO (operands[1]) != 0 && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)" { if (INTVAL (operands[2]) == 0) return "sosle %1,%0\;%_movei %1,0"; else if (INTVAL (operands[2]) == 1) return "sosle %1,%0\;%_movei %1,1"; else return "sosl %1,%0\;%_seto %1,"; }) ;; AOS a,m ;; CAIGE a,0 -> AOSGE a,m ;; MOVEI a,0 MOVEI a,0 (define_peephole [(parallel [(set (match_operand:SI 0 "memory_operand" "") (plus:SI (match_dup 0) (const_int 1))) (set (match_operand:SI 1 "register_operand" "") (plus:SI (match_dup 0) (const_int 1)))]) (set (match_dup 1) (smax:SI (match_dup 1) (match_operand 2 "const_int_operand" "")))] "REGNO (operands[1]) != 0 && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)" { if (INTVAL (operands[2]) == 0) return "aosge %1,%0\;%_movei %1,0"; else if (INTVAL (operands[2]) == 1) return "aosg %1,%0\;%_movei %1,1"; else return "aosge %1,%0\;%_seto %1,"; }) ;; SOS a,m ;; CAIGE a,0 -> SOSGE a,m ;; MOVEI a,0 MOVEI a,0 (define_peephole [(parallel [(set (match_operand:SI 0 "memory_operand" "") (plus:SI (match_dup 0) (const_int -1))) (set (match_operand:SI 1 "register_operand" "") (plus:SI (match_dup 0) (const_int -1)))]) (set (match_dup 1) (smax:SI (match_dup 1) (match_operand 2 "const_int_operand" "")))] "REGNO (operands[1]) != 0 && (INTVAL (operands[2]) >= -1 || INTVAL (operands[2]) <= 1)" { if (INTVAL (operands[2]) == 0) return "sosge %1,%0\;%_movei %1,0"; else if (INTVAL (operands[2]) == 1) return "sosg %1,%0\;%_movei %1,1"; else return "sosge %1,%0\;%_seto %1,"; }) ;; AOS m ;; SKIPx m -> AOSx m (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_dup 0) (const_int 1))) (set (pc) (if_then_else (match_operator 2 "pdp10_comparison_operator" [(match_dup 0) (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc)))] "" [(parallel [(set (pc) (if_then_else (match_op_dup 2 [(plus:SI (match_dup 0) (const_int 1)) (const_int 0)]) (label_ref (match_dup 1)) (pc))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int 1)))])]) ;; SOS m ;; SKIPx m -> SOSx m (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_dup 0) (const_int -1))) (set (pc) (if_then_else (match_operator 2 "pdp10_comparison_operator" [(match_dup 0) (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc)))] "" [(parallel [(set (pc) (if_then_else (match_op_dup 2 [(plus:SI (match_dup 0) (const_int -1)) (const_int 0)]) (label_ref (match_dup 1)) (pc))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1)))])]) ;; AOS m ;; SKIPx a,m -> AOSx a,m (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_dup 0) (const_int 1))) (parallel [(set (pc) (if_then_else (match_operator 3 "pdp10_comparison_operator" [(match_dup 0) (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc))) (set (match_operand:SI 2 "register_operand" "") (match_dup 0))])] "REGNO (operands[2]) != 0" [(parallel [(set (pc) (if_then_else (match_op_dup 3 [(plus:SI (match_dup 0) (const_int 1)) (const_int 0)]) (label_ref (match_dup 1)) (pc))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int 1))) (set (match_dup 2) (plus:SI (match_dup 0) (const_int 1)))])]) ;; SOS m ;; SKIPx a,m -> SOSx a,m (define_peephole2 [(set (match_operand:SI 0 "reg_or_mem_operand" "") (plus:SI (match_dup 0) (const_int -1))) (parallel [(set (pc) (if_then_else (match_operator 3 "pdp10_comparison_operator" [(match_dup 0) (const_int 0)]) (label_ref (match_operand 1 "" "")) (pc))) (set (match_operand:SI 2 "register_operand" "") (match_dup 0))])] "REGNO (operands[2]) != 0" [(parallel [(set (pc) (if_then_else (match_op_dup 3 [(plus:SI (match_dup 0) (const_int -1)) (const_int 0)]) (label_ref (match_dup 1)) (pc))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1))) (set (match_dup 2) (plus:SI (match_dup 0) (const_int -1)))])]) ;; ADDI a,1 ;; JRST m -> AOJA a,m ;; The traditional peephole is needed to detect sequences after basic ;; block reordering. peephole2 is run before that. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (plus:SI (match_dup 0) (const_int 1))) (set (pc) (label_ref (match_operand 1 "" "")))] "" [(parallel [(set (pc) (label_ref (match_dup 1))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int 1)))])]) (define_peephole [(set (match_operand:SI 0 "register_operand" "") (plus:SI (match_dup 0) (const_int 1))) (set (pc) (label_ref (match_operand 1 "" "")))] "" "aoja %0,%l1") ;; SUBI a,1 ;; JRST m -> SOJA a,m ;; The traditional peephole is needed to detect sequences after basic ;; block reordering. peephole2 is run before that. (define_peephole2 [(set (match_operand:SI 0 "register_operand" "") (plus:SI (match_dup 0) (const_int -1))) (set (pc) (label_ref (match_operand 1 "" "")))] "" [(parallel [(set (pc) (label_ref (match_dup 1))) (set (match_dup 0) (plus:SI (match_dup 0) (const_int -1)))])]) (define_peephole [(set (match_operand:SI 0 "register_operand" "") (plus:SI (match_dup 0) (const_int -1))) (set (pc) (label_ref (match_operand 1 "" "")))] "" "soja %0,%l1") ;; AOS m1 ;; JRST m2 -> AOSA m1,m2 (if possible) ;; TODO. ;; SOS m1 ;; JRST m2 -> SOSA m1,m2 (if possible) ;; TODO. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Miscellaneous ;; UNSPEC_VOLATILE is considered to use and clobber all hard registers ;; and all of memory. This blocks insns from being moved across this ;; point. (define_insn "blockage" [(unspec_volatile [(const_int 0)] VUNSPEC_BLOCKAGE)] "" "" [(set_attr "length" "0")]) (define_insn "*movqi_subreg" [(set (match_operand:QI 0 "register_operand" "=r") (subreg:QI (match_operand:SI 1 "register_operand" "r") 3))] "" "move %0,%1%; (set (reg:QI %0) (subreg:QI (reg:SI %1) 3)") (define_insn "" [(set (subreg:QI (match_operand:SI 0 "register_operand" "=r") 3) (match_operand:QI 1 "register_operand" "r"))] "" "move %0,%1%; (set (subreg:QI (reg:SI %0) 3) (reg:QI %1)") (define_insn "" [(set (match_operand:QI 0 "register_operand" "=r") (subreg:QI (match_operand:SI 1 "register_operand" "0") 0))] "" "lsh %0,-33%; (set (reg:QI %0) (subreg:QI (reg:SI %1) 0))") (define_insn "" [(set (match_operand:HI 0 "register_operand" "=r") (subreg:HI (match_operand:SI 1 "register_operand" "r") 0))] "" "hlrz %0,%1%; (set (reg:HI %0) (subreg:HI (reg:SI %1) 0))") (define_insn "" [(set (match_operand:HI 0 "register_operand" "=r") (subreg:HI (match_operand:SI 1 "register_operand" "r") 2))] "" "hrrz %0,%1%; (set (reg:HI %0) (subreg:HI (reg:SI %1) 2))") (define_insn "" [(set (match_operand:HI 0 "register_operand" "=r") (subreg:HI (zero_extract:SI (match_operand:SI 1 "memory_operand" "m") (const_int 18) (const_int 18)) 0))] "" "hrrz %0,%1%; (set (reg:HI %0) (subreg:HI (zero_extr:SI %1 18 18) 0))") (define_insn "" [(set (match_operand:QI 0 "register_operand" "=r") (subreg:QI (zero_extract:SI (match_operand:SI 1 "memory_operand" "m") (const_int 9) (const_int 27)) 0))] "" ;; FIXME: will this do? "move %0,%1" [(set_attr "length" "3")]) ;; Only used in KA10 expansion of FIX. (define_insn "TSC" [(set (match_operand:SI 0 "register_operand" "=r") (xor:SI (match_dup 0) (ior:SI (ashift:SI (match_operand:SI 1 "reg_or_mem_operand" "rm") (const_int 18)) (lshiftrt:SI (match_dup 1) (const_int 18)))))] "" "tsc %0,%1") (define_insn "" [(set (match_operand:SI 0 "register_operand" "=r") (ashiftrt:SI (match_operand:SI 1 "memory_operand" "m") (const_int 27)))] "" "move %0,%1\;ash %0,-33" [(set_attr "length" "2")]) (define_insn "" [(set (match_operand:QI 0 "register_operand" "=r") (subreg:QI (zero_extract:SI (match_operand:SI 1 "memory_operand" "m") (const_int 9) (const_int 0)) 3))] "" { rtx ops[4]; ops[0] = operands[0]; ops[1] = operands[1]; ops[2] = GEN_INT (9); ops[3] = GEN_INT (0); if (get_attr_length (insn) == 1) output_asm_insn (pdp10_output_extzv (insn, ops), ops); else output_asm_insn (pdp10_output_extzv_sequence (ops), ops); return ""; } [(set (attr "length") (if_then_else (ne (symbol_ref "TARGET_LARGE") (const_int 0)) (const_int 1) (const_int 2)))]) (define_insn "" [(set (match_operand:QI 0 "register_operand" "=r") (subreg:QI (zero_extract:SI (match_operand:SI 1 "memory_operand" "m") (const_int 9) (const_int 9)) 3))] "" { rtx ops[4]; ops[0] = operands[0]; ops[1] = operands[1]; ops[2] = GEN_INT (9); ops[3] = GEN_INT (9); output_asm_insn (pdp10_output_extzv (insn, ops), ops); return ""; }) ================================================ FILE: samples/GDB/as3.gdbinit ================================================ # -*- gdb-script -*- # This Source Code Form is subject to the terms of the Mozilla Public # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. # Interactive commands to help inspecting ActionScript execution state while debugging in gdb. # # To use this file, type from the gdb prompt: # source $(hg root)/utils/as3.gdbinit # or include in your .gdbinit. # # See gdb help for individual commands. # # In case of undefined symbols, try running the gdb 'where' command before aswhere. # # Typical use case: # (gdb) run # ^C # (gdb) where # (gdb) aswhere # (gdb) asframe 4 # select 4th AS3 frame from the top # (gdb) aslocal # print locals # (gdb) aslocal 2 # print 2nd local as a C++ value # $42 = .... # (gdb) print *$42 # dereference $42, assuming it's a pointer (to a ScriptObject or String) # # Note that the gdb scripting language is rather limited. # define aswhere set var $fcount = avmplus::AvmCore::getActiveCore()->debugger()->frameCount() set var $i = 0 while ($i < $fcount) # set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($k) # call (void)avmplus::Debugger::printFrame($k) asprintframe $i set var $i = $i + 1 end end document aswhere Print backtrace of all the ActionScript stack frames. May not work in all contexts (notably inside MMgc). May not work properly until gdb 'where' is called at least once. end set var $_asframe_selected=-1 define asprintframe set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($arg0) if ($frame == 0) echo no frame\n else aspstring avmplus::Debugger::methodNameAt($frame) echo ( set var $vcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT) set var $j = 0 while ($j < $vcount) set var $argname = avmplus::Debugger::autoVarName($frame, $j, avmplus::Debugger::AUTO_ARGUMENT) aspstring $argname echo = set var $_atom = avmplus::Debugger::autoAtomAt($frame, $j, avmplus::Debugger::AUTO_ARGUMENT) call (void)avmplus::Debugger::printAtom($_atom) set var $j = $j + 1 if ($j != $vcount) echo , end end echo ) echo \n end end define asframe if ($argc != 0) set var $_asframe_selected=$arg0 end if ($_asframe_selected >= 0) asprintframe $_asframe_selected else echo no frame\n end end document asframe Select and print an ActionScript stack frame. With no argument, print the selected AS stack frame. An argument specifies the number of the stack frame to select. end define aspstring call (void)avmplus::Debugger::printString($arg0) end document aspstring Print the AS3 string. end # not pretty, but there's no switch define aslocal set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected) if ($frame == 0) echo no frame\n else if $argc == 0 set var $lcount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_LOCAL) set var $k = 0 while ($k < $lcount) set var $lname = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_LOCAL) output $k echo :\ \ aspstring $lname echo :\ \ aslocal $k set var $k = $k + 1 end else set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) if ($_last_type == 0) echo unknown\n end if ($_last_type == 1) call avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) end if ($_last_type == 2) call avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) end if ($_last_type == 3) ecno namespace (unfinished)\n end if ($_last_type == 4) echo undefined\n end if ($_last_type == 5) call avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) end if ($_last_type == 6) call avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) end if ($_last_type == 7) call avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_LOCAL) end end end end document aslocal Print local variables of the currently selected AS stack frame, if debuging information present. Information may be incorrect if not at a debugger safepoint. With no argument, print all the local variables. With a numeric argument print the specific local variable (gdb will store value in history for further manipulation). end define asarg set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected) if ($frame == 0) echo no frame\n else if $argc == 0 set var $acount = avmplus::Debugger::autoVarCount($frame, avmplus::Debugger::AUTO_ARGUMENT) set var $k = 0 while ($k < $acount) set var $name = avmplus::Debugger::autoVarName($frame, $k, avmplus::Debugger::AUTO_ARGUMENT) output $k echo :\ \ aspstring $name echo :\ \ asarg $k set var $k = $k + 1 end else set var $_last_type=avmplus::Debugger::autoAtomKindAt($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) if ($_last_type == 0) echo unknown\n end if ($_last_type == 1) print avmplus::Debugger::autoVarAsObject($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) end if ($_last_type == 2) print avmplus::Debugger::autoVarAsString($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) end if ($_last_type == 3) echo namespace (unfinished)\n end if ($_last_type == 4) echo undefined\n end if ($_last_type == 5) print avmplus::Debugger::autoVarAsBoolean($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) end if ($_last_type == 6) print avmplus::Debugger::autoVarAsInteger($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) end if ($_last_type == 7) print avmplus::Debugger::autoVarAsDouble($frame, $arg0, avmplus::Debugger::AUTO_ARGUMENT) end end end end document asarg Print arguments of the currently selected AS stack frame. If no debugging information is available, argument names will not be printed. With no argument, print all the arguments. With a numeric argument print the specific argument (gdb will store value in history for further manipulation). end define asthis set var $frame = avmplus::AvmCore::getActiveCore()->debugger()->frameAt($_asframe_selected) if ($frame == 0) echo no frame\n else print avmplus::Debugger::autoVarAsObject($frame, 0, avmplus::Debugger::AUTO_THIS) end end document asthis Print the receiver of the currently selected frame. end define asmixon print avmshell::DebugCLI::debuggerInterruptOnEnter print avmshell::DebugCLI::debuggerInterruptOnEnter = true end document asmixon turn on stepping. Execution will return to gdb propmpt after asstep* instructions. Requires debugging symbols in .abcs end define asstepout call avmplus::AvmCore::getActiveCore()->debugger()->stepOut() continue asprintframe 0 end define asstepinto output avmplus::AvmCore::getActiveCore()->debugger()->stepInto() continue asprintframe 0 end define asstepover output avmplus::AvmCore::getActiveCore()->debugger()->stepOver() continue asprintframe 0 end define asprint aspstring $arg0->traits()->name() echo \n end ================================================ FILE: samples/GDB/gdb_lpc17xx_program.gdb ================================================ # # MicropendousX LPC17xx Development Board # # http://www.MicropendousX.org # # Connect to a debugger controlling a LPC17xx # and download firmware. # # Start your OpenOCD gdb server before running # this script with: arm-none-eabi-gdb -x gdb_lpc17xx_program.gdb # # Note the 'monitor' command just passes its # arguments to OpenOCD # # This file is released under the MIT License # # Connect to OpenOCD gdb server target remote localhost:3333 # reset the LPC17xx IC with the OpenOCD reset command monitor reset # the following are OpenOCD commands as in OpenOCD_program.script # which will download a hex file into your LPC17xx monitor halt monitor sleep 200 monitor wait_halt monitor flash probe 0 monitor flash info 0 monitor flash write_image erase unlock USBtoSerial.hex monitor sleep 200 monitor reset run monitor exit quit ================================================ FILE: samples/GDScript/example.gd ================================================ # Taken from https://github.com/okamstudio/godot/wiki/gdscript # a file is a class! # inheritance extends BaseClass # member variables var a = 5 var s = "Hello" var arr = [1, 2, 3] var dict = {"key":"value", 2:3} # constants const answer = 42 const thename = "Charly" # built-in vector types var v2 = Vector2(1, 2) var v3 = Vector3(1, 2, 3) # function func some_function(param1, param2): var local_var = 5 if param1 < local_var: print(param1) elif param2 > 5: print(param2) else: print("fail!") for i in range(20): print(i) while(param2 != 0): param2 -= 1 var local_var2 = param1+3 return local_var2 # subclass class Something: var a = 10 # constructor func _init(): print("constructed!") var lv = Something.new() print(lv.a) ================================================ FILE: samples/GDScript/grid.gd ================================================ extends Control # Simple Tetris-like demo, (c) 2012 Juan Linietsky # Implemented by using a regular Control and drawing on it during the _draw() callback. # The drawing surface is updated only when changes happen (by calling update()) var score = 0 var score_label=null const MAX_SHAPES = 7 var block = preload("block.png") var block_colors=[ Color(1,0.5,0.5), Color(0.5,1,0.5), Color(0.5,0.5,1), Color(0.8,0.4,0.8), Color(0.8,0.8,0.4), Color(0.4,0.8,0.8), Color(0.7,0.7,0.7)] var block_shapes=[ [ Vector2(0,-1),Vector2(0,0),Vector2(0,1),Vector2(0,2) ], # I [ Vector2(0,0),Vector2(1,0),Vector2(1,1),Vector2(0,1) ], # O [ Vector2(-1,1),Vector2(0,1),Vector2(0,0),Vector2(1,0) ], # S [ Vector2(1,1),Vector2(0,1),Vector2(0,0),Vector2(-1,0) ], # Z [ Vector2(-1,1),Vector2(-1,0),Vector2(0,0),Vector2(1,0) ], # L [ Vector2(1,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ], # J [ Vector2(0,1),Vector2(1,0),Vector2(0,0),Vector2(-1,0) ]] # T var block_rotations=[ Matrix32( Vector2(1,0),Vector2(0,1), Vector2() ), Matrix32( Vector2(0,1),Vector2(-1,0), Vector2() ), Matrix32( Vector2(-1,0),Vector2(0,-1), Vector2() ), Matrix32( Vector2(0,-1),Vector2(1,0), Vector2() ) ] var width=0 var height=0 var cells={} var piece_active=false var piece_shape=0 var piece_pos=Vector2() var piece_rot=0 func piece_cell_xform(p,er=0): var r = (4+er+piece_rot)%4 return piece_pos+block_rotations[r].xform(p) func _draw(): var sb = get_stylebox("bg","Tree") # use line edit bg draw_style_box(sb,Rect2(Vector2(),get_size()).grow(3)) var bs = block.get_size() for y in range(height): for x in range(width): if (Vector2(x,y) in cells): draw_texture_rect(block,Rect2(Vector2(x,y)*bs,bs),false,block_colors[cells[Vector2(x,y)]]) if (piece_active): for c in block_shapes[piece_shape]: draw_texture_rect(block,Rect2(piece_cell_xform(c)*bs,bs),false,block_colors[piece_shape]) func piece_check_fit(ofs,er=0): for c in block_shapes[piece_shape]: var pos = piece_cell_xform(c,er)+ofs if (pos.x < 0): return false if (pos.y < 0): return false if (pos.x >= width): return false if (pos.y >= height): return false if (pos in cells): return false return true func new_piece(): piece_shape = randi() % MAX_SHAPES piece_pos = Vector2(width/2,0) piece_active=true piece_rot=0 if (piece_shape==0): piece_pos.y+=1 if (not piece_check_fit(Vector2())): #game over #print("GAME OVER!") game_over() update() func test_collapse_rows(): var accum_down=0 for i in range(height): var y = height - i - 1 var collapse = true for x in range(width): if (Vector2(x,y) in cells): if (accum_down): cells[ Vector2(x,y+accum_down) ] = cells[Vector2(x,y)] else: collapse=false if (accum_down): cells.erase( Vector2(x,y+accum_down) ) if (collapse): accum_down+=1 score+=accum_down*100 score_label.set_text(str(score)) func game_over(): piece_active=false get_node("gameover").set_text("Game Over") update() func restart_pressed(): score=0 score_label.set_text("0") cells.clear() get_node("gameover").set_text("") piece_active=true update() func piece_move_down(): if (!piece_active): return if (piece_check_fit(Vector2(0,1))): piece_pos.y+=1 update() else: for c in block_shapes[piece_shape]: var pos = piece_cell_xform(c) cells[pos]=piece_shape test_collapse_rows() new_piece() func piece_rotate(): var adv = 1 if (not piece_check_fit(Vector2(),1)): return piece_rot = (piece_rot + adv) % 4 update() func _input(ie): if (not piece_active): return if (!ie.is_pressed()): return if (ie.is_action("move_left")): if (piece_check_fit(Vector2(-1,0))): piece_pos.x-=1 update() elif (ie.is_action("move_right")): if (piece_check_fit(Vector2(1,0))): piece_pos.x+=1 update() elif (ie.is_action("move_down")): piece_move_down() elif (ie.is_action("rotate")): piece_rotate() func setup(w,h): width=w height=h set_size( Vector2(w,h)*block.get_size() ) new_piece() get_node("timer").start() func _ready(): # Initalization here setup(10,20) score_label = get_node("../score") set_process_input(true) ================================================ FILE: samples/GDScript/player.gd ================================================ extends RigidBody # member variables here, example: # var a=2 # var b="textvar" #var dir=Vector3() const ANIM_FLOOR = 0 const ANIM_AIR_UP = 1 const ANIM_AIR_DOWN = 2 const SHOOT_TIME = 1.5 const SHOOT_SCALE = 2 const CHAR_SCALE = Vector3(0.3,0.3,0.3) var facing_dir = Vector3(1, 0, 0) var movement_dir = Vector3() var jumping=false var turn_speed=40 var keep_jump_inertia = true var air_idle_deaccel = false var accel=19.0 var deaccel=14.0 var sharp_turn_threshhold = 140 var max_speed=3.1 var on_floor = false var prev_shoot = false var last_floor_velocity = Vector3() var shoot_blend = 0 func adjust_facing(p_facing, p_target,p_step, p_adjust_rate,current_gn): var n = p_target # normal var t = n.cross(current_gn).normalized() var x = n.dot(p_facing) var y = t.dot(p_facing) var ang = atan2(y,x) if (abs(ang)<0.001): # too small return p_facing var s = sign(ang) ang = ang * s var turn = ang * p_adjust_rate * p_step var a if (ang 0.1 and rad2deg(acos(target_dir.dot(hdir))) > sharp_turn_threshhold if (dir.length()>0.1 and !sharp_turn) : if (hspeed > 0.001) : #linear_dir = linear_h_velocity/linear_vel #if (linear_vel > brake_velocity_limit and linear_dir.dot(ctarget_dir)<-cos(Math::deg2rad(brake_angular_limit))) # brake=true #else hdir = adjust_facing(hdir,target_dir,delta,1.0/hspeed*turn_speed,up) facing_dir = hdir else: hdir = target_dir if (hspeed0): anim=ANIM_AIR_UP else: anim=ANIM_AIR_DOWN var hs if (dir.length()>0.1): hv += target_dir * (accel * 0.2) * delta if (hv.length() > max_speed): hv = hv.normalized() * max_speed else: if (air_idle_deaccel): hspeed = hspeed - (deaccel * 0.2) * delta if (hspeed<0): hspeed=0 hv = hdir*hspeed if (jumping and vv < 0): jumping=false lv = hv+up*vv if (onfloor): movement_dir = lv #lv += floor_velocity last_floor_velocity = floor_velocity else: if (on_floor) : #if (keep_jump_inertia): # lv += last_floor_velocity pass last_floor_velocity = Vector3() movement_dir = lv on_floor = onfloor state.set_linear_velocity(lv) if (shoot_blend>0): shoot_blend -= delta * SHOOT_SCALE if (shoot_blend<0): shoot_blend=0 if (shoot_attempt and not prev_shoot): shoot_blend = SHOOT_TIME var bullet = preload("res://bullet.scn").instance() bullet.set_transform( get_node("Armature/bullet").get_global_transform().orthonormalized() ) get_parent().add_child( bullet ) bullet.set_linear_velocity( get_node("Armature/bullet").get_global_transform().basis[2].normalized() * 20 ) PS.body_add_collision_exception( bullet.get_rid(), get_rid() ) #add it to bullet get_node("sfx").play("shoot") prev_shoot = shoot_attempt if (onfloor): get_node("AnimationTreePlayer").blend2_node_set_amount("walk",hspeed / max_speed) get_node("AnimationTreePlayer").transition_node_set_current("state",anim) get_node("AnimationTreePlayer").blend2_node_set_amount("gun",min(shoot_blend,1.0)) # state.set_angular_velocity(Vector3()) func _ready(): # Initalization here get_node("AnimationTreePlayer").set_active(true) pass ================================================ FILE: samples/GDScript/pong.gd ================================================ extends Node2D # member variables here, example: # var a=2 # var b="textvar" const INITIAL_BALL_SPEED = 80 var ball_speed = INITIAL_BALL_SPEED var screen_size = Vector2(640,400) #default ball direction var direction = Vector2(-1,0) var pad_size = Vector2(8,32) const PAD_SPEED = 150 func _process(delta): # get ball positio and pad rectangles var ball_pos = get_node("ball").get_pos() var left_rect = Rect2( get_node("left").get_pos() - pad_size*0.5, pad_size ) var right_rect = Rect2( get_node("right").get_pos() - pad_size*0.5, pad_size ) #integrate new ball postion ball_pos+=direction*ball_speed*delta #flip when touching roof or floor if ( (ball_pos.y<0 and direction.y <0) or (ball_pos.y>screen_size.y and direction.y>0)): direction.y = -direction.y #flip, change direction and increase speed when touching pads if ( (left_rect.has_point(ball_pos) and direction.x < 0) or (right_rect.has_point(ball_pos) and direction.x > 0)): direction.x=-direction.x ball_speed*=1.1 direction.y=randf()*2.0-1 direction = direction.normalized() #check gameover if (ball_pos.x<0 or ball_pos.x>screen_size.x): ball_pos=screen_size*0.5 ball_speed=INITIAL_BALL_SPEED direction=Vector2(-1,0) get_node("ball").set_pos(ball_pos) #move left pad var left_pos = get_node("left").get_pos() if (left_pos.y > 0 and Input.is_action_pressed("left_move_up")): left_pos.y+=-PAD_SPEED*delta if (left_pos.y < screen_size.y and Input.is_action_pressed("left_move_down")): left_pos.y+=PAD_SPEED*delta get_node("left").set_pos(left_pos) #move right pad var right_pos = get_node("right").get_pos() if (right_pos.y > 0 and Input.is_action_pressed("right_move_up")): right_pos.y+=-PAD_SPEED*delta if (right_pos.y < screen_size.y and Input.is_action_pressed("right_move_down")): right_pos.y+=PAD_SPEED*delta get_node("right").set_pos(right_pos) func _ready(): screen_size = get_viewport_rect().size # get actual size pad_size = get_node("left").get_texture().get_size() set_process(true) ================================================ FILE: samples/GDShader/dissolve.gdshader ================================================ // Taken from https://github.com/gdquest-demos/godot-shaders/blob/main/godot/Shaders/dissolve.gdshader shader_type spatial; render_mode depth_prepass_alpha, cull_disabled; uniform vec4 albedo : source_color; uniform sampler2D texture_albedo : source_color; uniform vec4 emission_color : source_color = vec4(1); uniform float emission_amount; uniform sampler2D dissolve_texture; uniform float burn_size : hint_range(0, 2); uniform float dissolve_amount : hint_range(0, 1); void fragment() { vec4 albedo_tex = texture(texture_albedo, UV); ALBEDO = albedo.rgb * albedo_tex.rgb; float sample = texture(dissolve_texture, UV).r; float emission_value = 1.0 - smoothstep(dissolve_amount, dissolve_amount + burn_size, sample); EMISSION = vec3(emission_value * emission_amount * emission_color.rgb); ALPHA = smoothstep(dissolve_amount - burn_size, dissolve_amount, sample); } ================================================ FILE: samples/GDShader/first_shader.gdshader ================================================ // Taken directly from Godot Engine documentation // https://docs.godotengine.org/en/stable/tutorials/shaders/your_first_shader/your_first_3d_shader.html shader_type spatial; uniform float height_scale = 0.5; uniform sampler2D noise; uniform sampler2D normalmap; varying vec2 tex_position; void vertex() { tex_position = VERTEX.xz / 2.0 + 0.5; float height = texture(noise, tex_position).x; VERTEX.y += height * height_scale; } void fragment() { NORMAL_MAP = texture(normalmap, tex_position).xyz; } ================================================ FILE: samples/GDShader/gaussian_blur.gdshader ================================================ // Taken from https://github.com/gdquest-demos/godot-shaders/blob/main/godot/Shaders/gaussian_blur.gdshader shader_type canvas_item; uniform vec2 blur_scale = vec2(1, 0); const float SAMPLES = 71.0; const float TAU = 6.283185307179586476925286766559; float gaussian(float x) { float x_squared = x * x; float width = 1.0 / sqrt(TAU * SAMPLES); return width * exp((x_squared / (2.0 * SAMPLES)) * -1.0); } void fragment() { vec2 scale = TEXTURE_PIXEL_SIZE * blur_scale; float total_weight = 0.0; vec4 color = vec4(0.0); for (int i = -int(SAMPLES) / 2; i < int(SAMPLES) / 2; ++i) { float weight = gaussian(float(i)); color += texture(TEXTURE, UV + scale * vec2(float(i))) * weight; total_weight += weight; } COLOR = color / total_weight; } ================================================ FILE: samples/GDShader/include.gdshaderinc ================================================ // Taken directly from Godot Engine documentation // https://docs.godotengine.org/en/stable/tutorials/shaders/shader_reference/shader_preprocessor.html // fancy_color.gdshaderinc // While technically allowed, there is usually no `shader_type` declaration in include files. vec3 get_fancy_color() { return vec3(0.3, 0.6, 0.9); } ================================================ FILE: samples/GDShader/stylized_grass.gdshader ================================================ // Shader from https://godotshaders.com/shader/stylized-grass-with-wind-and-deformation/ shader_type spatial; render_mode cull_disabled, unshaded; uniform float wind_speed = 0.2; uniform float wind_strength = 2.0; // How big, in world space, is the noise texture // wind will tile every wind_texture_tile_size uniform float wind_texture_tile_size = 20.0; uniform float wind_vertical_strength = 0.3; uniform vec2 wind_horizontal_direction = vec2(1.0,0.5); uniform sampler2D color_ramp : hint_black_albedo; // we need a tiling noise here! uniform sampler2D wind_noise : hint_black; uniform vec3 character_position; uniform float character_radius = 3.0; uniform sampler2D character_distance_falloff_curve : hint_black_albedo; uniform float character_push_strength = 1.0; varying float debug_wind; void vertex() { vec3 world_vert = (WORLD_MATRIX * vec4(VERTEX, 1.0)).xyz; vec2 normalized_wind_direction = normalize(wind_horizontal_direction); vec2 world_uv = world_vert.xz / wind_texture_tile_size + normalized_wind_direction * TIME * wind_speed; // we displace only the top part of the mesh // note that this means that the mesh needs to have UV in a way that the bottom of UV space // is at the top of the mesh float displacement_affect = (1.0 - UV.y); float wind_noise_intensity = (textureLod(wind_noise, world_uv , 0.0).r - 0.5); // We convert the direction of the wind into vertex space from world space // if we used it directly in vertex space, rotated blades of grass wouldn't behave properly vec2 vert_space_horizontal_dir = (inverse(WORLD_MATRIX) * vec4(wind_horizontal_direction, 0.0,0.0)).xy; vert_space_horizontal_dir = normalize(vert_space_horizontal_dir); vec3 bump_wind = vec3( wind_noise_intensity * vert_space_horizontal_dir.x, 1.0 - wind_noise_intensity, wind_noise_intensity * vert_space_horizontal_dir.y ); normalize(bump_wind); bump_wind *= vec3( wind_strength, wind_vertical_strength, wind_strength ); VERTEX += bump_wind * displacement_affect; // At the moment the blades are pushed away in a perfectly circular manner. // We could distort the distance to the character based on a noise, to break a bit the // circular shape. We could distort the falloff by sampling in a noise based on the xz coordinates. // The task is left to the reader vec3 dir_to_character = character_position - WORLD_MATRIX[3].xyz; // uncomment the following line to have a horizontal only character push // dir_to_character.y = 0.0; float distance_to_character = length(dir_to_character); float falloff = 1.0 - smoothstep(0.0, 1.0, distance_to_character/character_radius); // Because we operate in vertex space, we need to convert the direction to the character // in vertex space. Otherwise, it wouldn't work for rotated blades of grass. // comment the next line to observe how the blades are not all facing away from the character. dir_to_character = (inverse(WORLD_MATRIX) * vec4(dir_to_character, 0.0)).xyz; dir_to_character = normalize(dir_to_character); // sample the curve based on how far we are from the character, in normalized coordinates float falloff_curve = texture(character_distance_falloff_curve, vec2(falloff)).x; // direction to character is inverted because we want to point away from it VERTEX += normalize(-dir_to_character) * falloff_curve * character_push_strength * displacement_affect; } void fragment() { ALBEDO = texture(color_ramp, vec2(1.0 - UV.y, 0)).rgb ; } ================================================ FILE: samples/GDShader/toon_water.gdshader ================================================ // Original shader - https://godotshaders.com/shader/wind-waker-water-no-textures-needed/ // Wind Waker style water - NekotoArts // Adapted from https://www.shadertoy.com/view/3tKBDz // After which I added in some fractal Brownian motion // as well as vertex displacement shader_type spatial; uniform vec4 WATER_COL : hint_color = vec4(0.04, 0.38, 0.88, 1.0); uniform vec4 WATER2_COL : hint_color = vec4(0.04, 0.35, 0.78, 1.0); uniform vec4 FOAM_COL : hint_color = vec4(0.8125, 0.9609, 0.9648, 1.0); uniform float distortion_speed = 2.0; uniform vec2 tile = vec2(5.0, 5.0); uniform float height = 2.0; uniform vec2 wave_size = vec2(2.0, 2.0); uniform float wave_speed = 1.5; const float M_2PI = 6.283185307; const float M_6PI = 18.84955592; float random(vec2 uv) { return fract(sin(dot(uv.xy, vec2(12.9898,78.233))) * 43758.5453123); } float noise(vec2 uv) { vec2 uv_index = floor(uv); vec2 uv_fract = fract(uv); // Four corners in 2D of a tile float a = random(uv_index); float b = random(uv_index + vec2(1.0, 0.0)); float c = random(uv_index + vec2(0.0, 1.0)); float d = random(uv_index + vec2(1.0, 1.0)); vec2 blur = smoothstep(0.0, 1.0, uv_fract); return mix(a, b, blur.x) + (c - a) * blur.y * (1.0 - blur.x) + (d - b) * blur.x * blur.y; } float fbm(vec2 uv) { int octaves = 6; float amplitude = 0.5; float frequency = 3.0; float value = 0.0; for(int i = 0; i < octaves; i++) { value += amplitude * noise(frequency * uv); amplitude *= 0.5; frequency *= 2.0; } return value; } float circ(vec2 pos, vec2 c, float s) { c = abs(pos - c); c = min(c, 1.0 - c); return smoothstep(0.0, 0.002, sqrt(s) - sqrt(dot(c, c))) * -1.0; } // Foam pattern for the water constructed out of a series of circles float waterlayer(vec2 uv) { uv = mod(uv, 1.0); // Clamp to [0..1] float ret = 1.0; ret += circ(uv, vec2(0.37378, 0.277169), 0.0268181); ret += circ(uv, vec2(0.0317477, 0.540372), 0.0193742); ret += circ(uv, vec2(0.430044, 0.882218), 0.0232337); ret += circ(uv, vec2(0.641033, 0.695106), 0.0117864); ret += circ(uv, vec2(0.0146398, 0.0791346), 0.0299458); ret += circ(uv, vec2(0.43871, 0.394445), 0.0289087); ret += circ(uv, vec2(0.909446, 0.878141), 0.028466); ret += circ(uv, vec2(0.310149, 0.686637), 0.0128496); ret += circ(uv, vec2(0.928617, 0.195986), 0.0152041); ret += circ(uv, vec2(0.0438506, 0.868153), 0.0268601); ret += circ(uv, vec2(0.308619, 0.194937), 0.00806102); ret += circ(uv, vec2(0.349922, 0.449714), 0.00928667); ret += circ(uv, vec2(0.0449556, 0.953415), 0.023126); ret += circ(uv, vec2(0.117761, 0.503309), 0.0151272); ret += circ(uv, vec2(0.563517, 0.244991), 0.0292322); ret += circ(uv, vec2(0.566936, 0.954457), 0.00981141); ret += circ(uv, vec2(0.0489944, 0.200931), 0.0178746); ret += circ(uv, vec2(0.569297, 0.624893), 0.0132408); ret += circ(uv, vec2(0.298347, 0.710972), 0.0114426); ret += circ(uv, vec2(0.878141, 0.771279), 0.00322719); ret += circ(uv, vec2(0.150995, 0.376221), 0.00216157); ret += circ(uv, vec2(0.119673, 0.541984), 0.0124621); ret += circ(uv, vec2(0.629598, 0.295629), 0.0198736); ret += circ(uv, vec2(0.334357, 0.266278), 0.0187145); ret += circ(uv, vec2(0.918044, 0.968163), 0.0182928); ret += circ(uv, vec2(0.965445, 0.505026), 0.006348); ret += circ(uv, vec2(0.514847, 0.865444), 0.00623523); ret += circ(uv, vec2(0.710575, 0.0415131), 0.00322689); ret += circ(uv, vec2(0.71403, 0.576945), 0.0215641); ret += circ(uv, vec2(0.748873, 0.413325), 0.0110795); ret += circ(uv, vec2(0.0623365, 0.896713), 0.0236203); ret += circ(uv, vec2(0.980482, 0.473849), 0.00573439); ret += circ(uv, vec2(0.647463, 0.654349), 0.0188713); ret += circ(uv, vec2(0.651406, 0.981297), 0.00710875); ret += circ(uv, vec2(0.428928, 0.382426), 0.0298806); ret += circ(uv, vec2(0.811545, 0.62568), 0.00265539); ret += circ(uv, vec2(0.400787, 0.74162), 0.00486609); ret += circ(uv, vec2(0.331283, 0.418536), 0.00598028); ret += circ(uv, vec2(0.894762, 0.0657997), 0.00760375); ret += circ(uv, vec2(0.525104, 0.572233), 0.0141796); ret += circ(uv, vec2(0.431526, 0.911372), 0.0213234); ret += circ(uv, vec2(0.658212, 0.910553), 0.000741023); ret += circ(uv, vec2(0.514523, 0.243263), 0.0270685); ret += circ(uv, vec2(0.0249494, 0.252872), 0.00876653); ret += circ(uv, vec2(0.502214, 0.47269), 0.0234534); ret += circ(uv, vec2(0.693271, 0.431469), 0.0246533); ret += circ(uv, vec2(0.415, 0.884418), 0.0271696); ret += circ(uv, vec2(0.149073, 0.41204), 0.00497198); ret += circ(uv, vec2(0.533816, 0.897634), 0.00650833); ret += circ(uv, vec2(0.0409132, 0.83406), 0.0191398); ret += circ(uv, vec2(0.638585, 0.646019), 0.0206129); ret += circ(uv, vec2(0.660342, 0.966541), 0.0053511); ret += circ(uv, vec2(0.513783, 0.142233), 0.00471653); ret += circ(uv, vec2(0.124305, 0.644263), 0.00116724); ret += circ(uv, vec2(0.99871, 0.583864), 0.0107329); ret += circ(uv, vec2(0.894879, 0.233289), 0.00667092); ret += circ(uv, vec2(0.246286, 0.682766), 0.00411623); ret += circ(uv, vec2(0.0761895, 0.16327), 0.0145935); ret += circ(uv, vec2(0.949386, 0.802936), 0.0100873); ret += circ(uv, vec2(0.480122, 0.196554), 0.0110185); ret += circ(uv, vec2(0.896854, 0.803707), 0.013969); ret += circ(uv, vec2(0.292865, 0.762973), 0.00566413); ret += circ(uv, vec2(0.0995585, 0.117457), 0.00869407); ret += circ(uv, vec2(0.377713, 0.00335442), 0.0063147); ret += circ(uv, vec2(0.506365, 0.531118), 0.0144016); ret += circ(uv, vec2(0.408806, 0.894771), 0.0243923); ret += circ(uv, vec2(0.143579, 0.85138), 0.00418529); ret += circ(uv, vec2(0.0902811, 0.181775), 0.0108896); ret += circ(uv, vec2(0.780695, 0.394644), 0.00475475); ret += circ(uv, vec2(0.298036, 0.625531), 0.00325285); ret += circ(uv, vec2(0.218423, 0.714537), 0.00157212); ret += circ(uv, vec2(0.658836, 0.159556), 0.00225897); ret += circ(uv, vec2(0.987324, 0.146545), 0.0288391); ret += circ(uv, vec2(0.222646, 0.251694), 0.00092276); ret += circ(uv, vec2(0.159826, 0.528063), 0.00605293); return max(ret, 0.0); } // Procedural texture generation for the water vec3 water(vec2 uv, vec3 cdir, float iTime) { uv *= vec2(0.25); uv += fbm(uv) * 0.2; // Parallax height distortion with two directional waves at // slightly different angles. vec2 a = 0.025 * cdir.xz / cdir.y; // Parallax offset float h = sin(uv.x + iTime); // Height at UV uv += a * h; h = sin(0.841471 * uv.x - 0.540302 * uv.y + iTime); uv += a * h; // Texture distortion float d1 = mod(uv.x + uv.y, M_2PI); float d2 = mod((uv.x + uv.y + 0.25) * 1.3, M_6PI); d1 = iTime * 0.07 + d1; d2 = iTime * 0.5 + d2; vec2 dist = vec2( sin(d1) * 0.15 + sin(d2) * 0.05, cos(d1) * 0.15 + cos(d2) * 0.05 ); vec3 ret = mix(WATER_COL.rgb, WATER2_COL.rgb, waterlayer(uv + dist.xy)); ret = mix(ret, FOAM_COL.rgb, waterlayer(vec2(1.0) - uv - dist.yx)); return ret; } void vertex(){ float time = TIME * wave_speed; vec2 uv = UV * wave_size; float d1 = mod(uv.x + uv.y, M_2PI); float d2 = mod((uv.x + uv.y + 0.25) * 1.3, M_6PI); d1 = time * 0.07 + d1; d2 = time * 0.5 + d2; vec2 dist = vec2( sin(d1) * 0.15 + sin(d2) * 0.05, cos(d1) * 0.15 + cos(d2) * 0.05 ); VERTEX.y += dist.y * height; } void fragment() { vec2 uv = UV; ALBEDO = vec3(water(uv * tile, vec3(0,1,0), TIME * distortion_speed)); } ================================================ FILE: samples/GEDCOM/Royal92.ged ================================================ 0 HEAD 1 SOUR PAF 2.2 1 DEST PAF 1 DATE 20 NOV 1992 1 FILE ROYALS.GED 1 CHAR ANSEL 0 @S1@ SUBM 1 NAME Denis R. Reid 1 ADDR 149 Kimrose Lane 2 CONT Broadview Heights, Ohio 44147-1258 2 CONT Internet Email address: ah189@cleveland.freenet.edu 1 PHON (216) 237-5364 1 COMM >> In a message to Cliff Manis (cmanis@csoftec.csf.com) 2 CONT >> Denis Reid wrote the following: 2 CONT >> Date: Fri, 25 Dec 92 14:12:32 -0500 2 CONT >> From: ah189@cleveland.Freenet.Edu (Denis Reid) 2 CONT >> Subject: THE ROYALS 2 CONT >> First of all, MERRY CHRISTMAS! 2 CONT >> 2 CONT >> You may make this Royal GEDCOM available available to whomever. 2 CONT >> As you know this is a work in process and have received suggestions, 2 CONT >> corrections and additions from all over the planet... 2 CONT >> some even who claim to be descended from Charlemange, himself! 2 CONT >> 2 CONT >> The weakest part of the Royals is in the French and Spanish lines. 2 CONT >> I found that many of the French Kings had multiple mistresses whose 2 CONT >> descendants claimed noble titles, and the Throne itself in some 2 CONT >> cases. I have had the hardest time finding good published sources 2 CONT >> for French and Spanish Royalty. 2 CONT >> 2 CONT >> If you do post it to a BBS or send it around, I would appreciate 2 CONT >> it if you'd append a message to the effect that I would welcome 2 CONT >> comments and suggestions and possible sources to improve 2 CONT >> the database. 2 CONT >> 2 CONT >> Since the Royals had so many names and many titles it was difficult 2 CONT >> to "fill in the blanks" with their name. In the previous version, 2 CONT >> I included all their titles, names, monikers in the notes. 2 CONT >> 2 CONT >> Thanks for your interest. Denis Reid 0 @I1@ INDI 1 NAME Victoria /Hanover/ 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE 24 MAY 1819 2 PLAC Kensington,Palace,London,England 1 DEAT 2 DATE 22 JAN 1901 2 PLAC Osborne House,Isle of Wight,England 1 BURI 2 PLAC Royal Mausoleum,Frogmore,Berkshire,England 1 REFN 1 1 FAMS @F1@ 1 FAMC @F42@ 0 @I2@ INDI 1 NAME Albert Augustus Charles// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 26 AUG 1819 2 PLAC Schloss Rosenau,Near Coburg,Germany 1 DEAT 2 DATE 14 DEC 1861 2 PLAC Windsor Castle,Berkshire,England 1 BURI 2 PLAC Royal Masoleum,Frogmore,Windsor,England 1 FAMS @F1@ 1 FAMC @F43@ 0 @I3@ INDI 1 NAME Victoria Adelaide Mary// 1 TITL Princess Royal 1 SEX F 1 BIRT 2 DATE 21 NOV 1840 2 PLAC Buckingham,Palace,London,England 1 CHR 2 DATE 10 FEB 1841 2 PLAC Throne Room,Buckingham Palac,England 1 DEAT 2 DATE 5 AUG 1901 2 PLAC Friedrichshof,Near,Kronberg,Taunus 1 BURI 2 PLAC Friedenskirche,Potsdam 1 FAMS @F3@ 1 FAMC @F1@ 0 @I4@ INDI 1 NAME Edward_VII /Wettin/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 9 NOV 1841 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 6 MAY 1910 2 PLAC Buckingham,Palace,London,England 1 BURI 2 DATE 20 MAY 1910 2 PLAC Windsor,Berkshire,England 1 FAMS @F2@ 1 FAMC @F1@ 0 @I5@ INDI 1 NAME Alice Maud Mary// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 25 APR 1843 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 14 DEC 1878 2 PLAC Darmstadt,,,Germany 1 FAMS @F8@ 1 FAMC @F1@ 0 @I6@ INDI 1 NAME Alfred Ernest Albert// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 6 AUG 1844 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 30 JUL 1900 2 PLAC Schloss Rosenau,Near Coburg 1 FAMS @F26@ 1 FAMC @F1@ 0 @I7@ INDI 1 NAME Helena Augusta Victoria// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 25 MAY 1846 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 9 JUN 1923 2 PLAC Schomberg House,Pall Mall,London,England 1 FAMS @F32@ 1 FAMC @F1@ 0 @I8@ INDI 1 NAME Louise Caroline Alberta// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 18 MAR 1848 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 3 DEC 1939 2 PLAC Kensington,Palace,London,England 1 BURI 2 PLAC Frogmore,,,England 1 FAMS @F69@ 1 FAMC @F1@ 0 @I9@ INDI 1 NAME Arthur William Patrick// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1 MAY 1850 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 16 JAN 1942 2 PLAC Bagshot Park,Surrey 1 FAMS @F34@ 1 FAMC @F1@ 0 @I10@ INDI 1 NAME Leopold George Duncan// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 7 APR 1853 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 28 MAR 1884 2 PLAC Cannes 1 FAMS @F5@ 1 FAMC @F1@ 0 @I11@ INDI 1 NAME Beatrice Mary Victoria// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 14 APR 1857 2 PLAC Buckingham,Palace,London,England 1 DEAT 2 DATE 26 OCT 1944 2 PLAC Bantridge Park,Balcombe,Sussex,England 1 FAMS @F6@ 1 FAMC @F1@ 0 @I12@ INDI 1 NAME Alexandra of_Denmark "Alix"// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1 DEC 1844 2 PLAC Yellow Palace,Copenhagen,Denmark 1 DEAT 2 DATE 20 NOV 1925 2 PLAC Sandringham,,Norfolk,England 1 BURI 2 PLAC St. George Chap.,Windsor,Berkshire,England 1 FAMS @F2@ 1 FAMC @F74@ 0 @I13@ INDI 1 NAME Albert Victor Christian// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 8 JAN 1864 2 PLAC Frogmore House,Windsor,Berkshire,England 1 DEAT 2 DATE 14 JAN 1892 2 PLAC Sandringham,,Norfolk,England 1 BURI 2 DATE 20 JAN 1892 2 PLAC Windsor,Berkshire,England 1 FAMC @F2@ 0 @I14@ INDI 1 NAME George_V /Windsor/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 3 JUN 1865 2 PLAC Marlborough Hse,London,England 1 CHR 2 DATE 7 JUL 1865 1 DEAT 2 DATE 20 JAN 1936 2 PLAC Sandringham,Norfolk,England 1 BURI 2 DATE 28 JAN 1936 2 PLAC Windsor Castle,St. George Chap.,Berkshire,England 1 FAMS @F7@ 1 FAMC @F2@ 0 @I15@ INDI 1 NAME Louise Victoria Alexandra// 1 TITL Princess Royal 1 SEX F 1 BIRT 2 DATE 20 FEB 1867 2 PLAC Marlborough,House,London,England 1 DEAT 2 DATE 4 JAN 1931 2 PLAC Portman Square,London,England 1 FAMS @F29@ 1 FAMC @F2@ 0 @I16@ INDI 1 NAME Victoria Alexandra Olga// 1 SEX F 1 BIRT 2 DATE 6 JUL 1868 2 PLAC Marlborough,House,London,England 1 DEAT 2 DATE 3 DEC 1935 2 PLAC Coppins,Iver,Bucks,England 1 FAMC @F2@ 0 @I17@ INDI 1 NAME Maude Charlotte Mary// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 26 NOV 1869 2 PLAC Marlborough,House,London,England 1 DEAT 2 DATE 20 NOV 1938 2 PLAC London,England 1 FAMS @F21@ 1 FAMC @F2@ 0 @I18@ INDI 1 NAME John Alexander // 1 SEX M 1 BIRT 2 DATE 6 APR 1871 1 DEAT 2 DATE 7 APR 1871 1 FAMC @F2@ 0 @I19@ INDI 1 NAME George Victor of_Waldeck// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1889 1 FAMS @F67@ 0 @I20@ INDI 1 NAME Frederick_III // 1 TITL German Emperor 1 SEX M 1 BIRT 2 DATE 18 OCT 1831 2 PLAC Neues Palais,Potsdam,Germany 1 DEAT 2 DATE 15 JUN 1888 2 PLAC Neues Palais,Potsdam,Germany 1 BURI 2 PLAC Friedenskirche,Potsdam,Germany 1 FAMS @F3@ 1 FAMC @F147@ 0 @I21@ INDI 1 NAME William_II // 1 TITL German Emperor 1 SEX M 1 BIRT 2 DATE 27 JAN 1859 2 PLAC Berlin,Germany 1 DEAT 2 DATE 4 JUN 1941 2 PLAC Haus Doorn,Netherlands 1 FAMS @F136@ 1 FAMS @F146@ 1 FAMC @F3@ 0 @I22@ INDI 1 NAME Louis_IV of_Hesse // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1837 1 DEAT 2 DATE 1892 1 FAMS @F8@ 1 FAMC @F114@ 0 @I23@ INDI 1 NAME Helena Frederica of_Waldeck// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 17 FEB 1861 2 PLAC Arolsen 1 DEAT 2 DATE 1 SEP 1922 2 PLAC Tyrol 1 FAMS @F5@ 1 FAMC @F67@ 0 @I24@ INDI 1 NAME Alice of_Athlone // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1883 1 DEAT 2 DATE JAN 1981 1 FAMS @F38@ 1 FAMC @F5@ 0 @I25@ INDI 1 NAME Henry Maurice of_Battenberg// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1896 1 FAMS @F6@ 1 FAMC @F109@ 0 @I26@ INDI 1 NAME Alexander of_Carisbrooke // 1 TITL Marquess 1 SEX M 1 BIRT 2 DATE 1886 1 DEAT 2 DATE 23 FEB 1960 1 BURI 2 PLAC Whippingham Ch.,Isle of Wight,England 1 FAMS @F142@ 1 FAMC @F6@ 0 @I27@ INDI 1 NAME Victoria Eugenie "Ena"// 1 TITL Queen of Spain 1 SEX F 1 BIRT 2 DATE 1887 1 DEAT 2 DATE 1969 2 PLAC Lausanne 1 FAMS @F143@ 1 FAMC @F6@ 0 @I28@ INDI 1 NAME Leopold // 1 SEX M 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1922 1 FAMC @F6@ 0 @I29@ INDI 1 NAME Maurice // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1891 1 DEAT 2 DATE 1914 1 FAMC @F6@ 0 @I30@ INDI 1 NAME Mary_of_Teck (May) // 1 TITL Queen 1 SEX F 1 BIRT 2 DATE 26 MAY 1867 2 PLAC Kensington,Palace,London,England 1 DEAT 2 DATE 24 MAR 1953 2 PLAC Marlborough Hse,London,England 1 BURI 2 DATE 31 MAR 1953 2 PLAC St. George's,Chapel,Windsor Castle,England 1 FAMS @F7@ 1 FAMC @F41@ 0 @I31@ INDI 1 NAME Edward_VIII /Windsor/ 1 TITL Duke of Windsor 1 SEX M 1 BIRT 2 DATE 23 JUN 1894 2 PLAC White Lodge,Richmond Park,Surrey,England 1 DEAT 2 DATE 28 MAY 1972 2 PLAC Paris,,,France 1 BURI 2 PLAC Frogmore,Windsor,Berkshire,England 1 FAMS @F20@ 1 FAMC @F7@ 0 @I32@ INDI 1 NAME George_VI /Windsor/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 14 DEC 1895 2 PLAC York Cottage,Sandringham,Norfolk,England 1 DEAT 2 DATE 6 FEB 1952 2 PLAC Sandringham,Norfolk,England 1 BURI 2 DATE 11 MAR 1952 2 PLAC St. George Chap.,,Windsor,England 1 FAMS @F12@ 1 FAMC @F7@ 0 @I33@ INDI 1 NAME Mary /Windsor/ 1 TITL Princess Royal 1 SEX F 1 BIRT 2 DATE 25 APR 1897 2 PLAC York Cottage,Sandringham,Norfolk,England 1 DEAT 2 DATE 28 MAR 1965 2 PLAC Harewood House,Yorkshire,,England 1 FAMS @F18@ 1 FAMC @F7@ 0 @I34@ INDI 1 NAME Henry William Frederick/Windsor/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 31 MAR 1900 2 PLAC York Cottage,Sandringham,Norfolk,England 1 DEAT 2 DATE 1974 1 FAMS @F19@ 1 FAMC @F7@ 0 @I35@ INDI 1 NAME George Edward Alexander/Windsor/ 1 TITL Duke of Kent 1 SEX M 1 BIRT 2 DATE 20 DEC 1902 2 PLAC York Cottage,Sandringham,Norfolk,England 1 DEAT 2 DATE 25 AUG 1942 2 PLAC Morven,,,Scotland 1 FAMS @F17@ 1 FAMC @F7@ 0 @I36@ INDI 1 NAME John Charles Francis/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 12 JUL 1905 2 PLAC York Cottage,Sandringham,Norfolk,England 1 DEAT 2 DATE 18 JAN 1919 2 PLAC Wood Farm,Wolferton,Norfolk,England 1 BURI 2 PLAC Sandringham,Norfolk,,England 1 FAMC @F7@ 0 @I37@ INDI 1 NAME Nicholas_II Alexandrovich /Romanov/ 1 TITL Tsar of Russia 1 SEX M 1 BIRT 2 DATE 18 MAY 1868 2 PLAC Tsarskoye Selo,Pushkin,,Russia 1 DEAT 2 DATE 16 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMS @F4@ 1 FAMC @F9@ 0 @I38@ INDI 1 NAME Victoria Alberta of_Hesse// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1863 1 DEAT 2 DATE 1950 1 FAMS @F27@ 1 FAMC @F8@ 0 @I39@ INDI 1 NAME Alexandra Fedorovna "Alix"// 1 TITL Tsarina 1 SEX F 1 BIRT 2 DATE 6 JUN 1872 2 PLAC Darmstadt,,,Germany 1 DEAT 2 DATE 16 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMS @F4@ 1 FAMC @F8@ 0 @I40@ INDI 1 NAME Alexander_III Alexandrovich /Romanov/ 1 TITL Tsar of Russia 1 SEX M 1 BIRT 2 DATE 1845 1 DEAT 2 DATE 1 NOV 1894 2 PLAC Livadia,Crimea,Near Yalta,Russia 1 BURI 2 DATE 19 NOV 1894 2 PLAC Cathedral of the,Fortress of P&P,St. Petersburg,Russia 1 FAMS @F9@ 1 FAMC @F11@ 0 @I41@ INDI 1 NAME Dagmar "Marie" of_Denmark// 1 TITL Tsarina 1 SEX F 1 BIRT 2 DATE 1847 1 DEAT 2 DATE OCT 1928 2 PLAC Copenhagen,,,Denmark 1 FAMS @F9@ 1 FAMC @F74@ 0 @I42@ INDI 1 NAME Nicholas_I /Romanov/ 1 TITL Tsar of Russia 1 SEX M 1 BIRT 2 DATE 1796 1 DEAT 2 DATE 1855 1 FAMS @F10@ 1 FAMC @F469@ 0 @I43@ INDI 1 NAME Charlotte of_Prussia // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1798 1 DEAT 2 DATE 1860 1 FAMS @F10@ 1 FAMC @F145@ 0 @I44@ INDI 1 NAME Alexander_II Nicholoevich /Romanov/ 1 TITL Tsar of Russia 1 SEX M 1 BIRT 2 DATE 1818 1 DEAT 2 DATE 13 MAR 1881 1 FAMS @F11@ 1 FAMS @F593@ 1 FAMC @F10@ 0 @I45@ INDI 1 NAME Marie of_Hesse- Darmstadt// 1 SEX F 1 BIRT 2 DATE 1824 1 DEAT 2 DATE 1880 1 FAMS @F11@ 1 FAMC @F110@ 0 @I46@ INDI 1 NAME Olga Nicholovna /Romanov/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE NOV 1895 2 PLAC Alexander Palace,Tsarskoe Selo,,Russia 1 DEAT 2 DATE 18 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMC @F4@ 0 @I47@ INDI 1 NAME Tatiana Nicholovna // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE JUN 1897 1 DEAT 2 DATE 18 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMC @F4@ 0 @I48@ INDI 1 NAME Maria Nicholovna /Romanov/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE MAY 1899 1 DEAT 2 DATE 18 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMC @F4@ 0 @I49@ INDI 1 NAME Anastasia Nicholovna /Romanov/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE JUN 1901 1 DEAT 2 DATE 18 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMC @F4@ 0 @I50@ INDI 1 NAME Alexis Nicolaievich /Romanov/ 1 TITL Tsarevich 1 SEX M 1 BIRT 2 DATE 12 AUG 1904 2 PLAC Peterhof,Near,St. Petersburg,Russia 1 DEAT 2 DATE 18 JUL 1918 2 PLAC Ekaterinburg,,,Russia 1 FAMC @F4@ 0 @I51@ INDI 1 NAME Elizabeth Angela Marguerite/Bowes-Lyon/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 4 AUG 1900 2 PLAC ,,London,England 1 CHR 2 DATE 23 SEP 1900 1 FAMS @F12@ 1 FAMC @F46@ 0 @I52@ INDI 1 NAME Elizabeth_II Alexandra Mary/Windsor/ 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE 21 APR 1926 2 PLAC 17 Bruton St.,London,W1,England 1 FAMS @F14@ 1 FAMC @F12@ 0 @I53@ INDI 1 NAME Margaret Rose /Windsor/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 21 AUG 1930 2 PLAC Glamis Castle,,Angus,Scotland 1 FAMS @F13@ 1 FAMC @F12@ 0 @I54@ INDI 1 NAME Anthony Charles Robert/Armstrong-Jones/ 1 TITL Earl of Snowdon 1 SEX M 1 BIRT 2 DATE 7 MAR 1930 1 FAMS @F13@ 1 FAMS @F1410@ 0 @I55@ INDI 1 NAME David Albert Charles/Armstrong-Jones/ 1 TITL Vicount Linley 1 SEX M 1 BIRT 2 DATE 3 NOV 1961 1 FAMC @F13@ 0 @I56@ INDI 1 NAME Sarah Frances Elizabeth/Armstrong-Jones/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1 MAY 1964 1 FAMC @F13@ 0 @I57@ INDI 1 NAME Philip /Mountbatten/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 10 JUN 1921 2 PLAC Isle of Kerkira,Mon Repos,Corfu,Greece 1 FAMS @F14@ 1 FAMC @F28@ 0 @I58@ INDI 1 NAME Charles Philip Arthur/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 14 NOV 1948 2 PLAC Buckingham,Palace,London,England 1 CHR 2 DATE 15 DEC 1948 2 PLAC Buckingham,Palace,Music Room,England 1 FAMS @F16@ 1 FAMC @F14@ 0 @I59@ INDI 1 NAME Anne Elizabeth Alice/Windsor/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 15 AUG 1950 2 PLAC Clarence House,St. James,,England 1 CHR 2 DATE 21 OCT 1950 2 PLAC ,,,England 1 FAMS @F15@ 1 FAMC @F14@ 0 @I60@ INDI 1 NAME Andrew Albert Christian/Windsor/ 1 TITL Duke of York 1 SEX M 1 BIRT 2 DATE 19 FEB 1960 2 PLAC Belgian Suite,Buckingham,Palace,England 1 FAMS @F53@ 1 FAMC @F14@ 0 @I61@ INDI 1 NAME Edward Anthony Richard/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 10 MAR 1964 2 PLAC Buckingham,Palace,London,England 1 CHR 2 DATE 2 MAY 1964 1 FAMC @F14@ 0 @I62@ INDI 1 NAME Mark Anthony Peter/Phillips/ 1 TITL Captain 1 SEX M 1 BIRT 2 DATE 22 SEP 1948 1 FAMS @F15@ 1 FAMC @F1405@ 0 @I63@ INDI 1 NAME Peter Mark Andrew/Phillips/ 1 SEX M 1 BIRT 2 DATE 15 NOV 1977 2 PLAC St. Mary's Hosp.,Paddington,London,England 1 CHR 2 DATE 22 DEC 1977 2 PLAC Music Room,Buckingham,Palace,England 1 FAMC @F15@ 0 @I64@ INDI 1 NAME Zara Anne Elizabeth/Phillips/ 1 SEX F 1 BIRT 2 DATE 15 MAY 1981 2 PLAC St. Marys Hosp.,Paddington,London,England 1 FAMC @F15@ 0 @I65@ INDI 1 NAME Diana Frances /Spencer/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1 JUL 1961 2 PLAC Park House,Sandringham,Norfolk,England 1 CHR 2 PLAC Sandringham,Church,Norfolk,England 1 FAMS @F16@ 1 FAMC @F78@ 0 @I66@ INDI 1 NAME Marina of_Greece // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 30 NOV 1906 2 PLAC Athens,Greece 1 DEAT 2 DATE 1968 2 PLAC Kensington,Palace,,England 1 FAMS @F17@ 1 FAMC @F76@ 0 @I67@ INDI 1 NAME Edward George Nicholas/Windsor/ 1 TITL Duke of Kent 1 SEX M 1 BIRT 2 DATE 9 SEP 1935 2 PLAC 3 Belgrave Sq.,,England 1 FAMS @F31@ 1 FAMC @F17@ 0 @I68@ INDI 1 NAME Henry George Charles/Lascelles/ 1 TITL Viscount 1 SEX M 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1947 1 FAMS @F18@ 0 @I69@ INDI 1 NAME Alice Christabel /Montagu-Douglas/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 25 DEC 1901 2 PLAC London,England 1 FAMS @F19@ 1 FAMC @F296@ 0 @I70@ INDI 1 NAME Bessiewallis /Warfield/ 1 SEX F 1 BIRT 2 DATE 1896 2 PLAC ,,,U.S.A. 1 DEAT 2 DATE 24 APR 1986 2 PLAC Paris,,,France 1 BURI 2 PLAC Frogmore,Windsor,Berkshire,England 1 FAMS @F20@ 1 FAMS @F24@ 1 FAMS @F25@ 1 FAMC @F55@ 0 @I71@ INDI 1 NAME Charles Haakon_VII // 1 TITL King of Norway 1 SEX M 1 BIRT 2 DATE 1872 2 PLAC Charlottenlund,Denmark 1 DEAT 2 DATE 1957 1 FAMS @F21@ 1 FAMC @F218@ 0 @I72@ INDI 1 NAME Henry of_Prussia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1862 1 DEAT 2 DATE 1929 1 FAMS @F22@ 1 FAMC @F3@ 0 @I73@ INDI 1 NAME Sigismund // 1 SEX M 1 BIRT 2 DATE 1864 1 DEAT 2 DATE 1866 1 FAMC @F3@ 0 @I74@ INDI 1 NAME Victoria // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1866 1 DEAT 2 DATE 1929 1 FAMS @F138@ 1 FAMS @F442@ 1 FAMC @F3@ 0 @I75@ INDI 1 NAME Waldemar // 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1879 1 FAMC @F3@ 0 @I76@ INDI 1 NAME Sophie of_Prussia // 1 TITL Queen of Greece 1 SEX F 1 BIRT 2 DATE 14 JUN 1870 2 PLAC Potsdam,Germany 1 DEAT 2 DATE 13 JAN 1932 2 PLAC Frankfurt,Germany 1 BURI 2 DATE NOV 1936 2 PLAC Tatoi,Near Athens,Greece 1 FAMS @F139@ 1 FAMC @F3@ 0 @I77@ INDI 1 NAME Charlotte of_Saxe- Meiningen// 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE 1860 1 DEAT 2 DATE 1919 1 FAMS @F137@ 1 FAMC @F3@ 0 @I78@ INDI 1 NAME Margarete of_Hesse // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1954 1 FAMS @F140@ 1 FAMC @F3@ 0 @I79@ INDI 1 NAME Irene of_Hesse // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1866 1 DEAT 2 DATE 1953 1 FAMS @F22@ 1 FAMC @F8@ 0 @I80@ INDI 1 NAME Waldemar // 1 SEX M 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1945 1 FAMC @F22@ 0 @I81@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE 1900 1 DEAT 2 DATE 1904 1 FAMC @F22@ 0 @I82@ INDI 1 NAME Child_#3 // 1 SEX M 1 FAMC @F22@ 0 @I83@ INDI 1 NAME Ernest Louis of_Hesse// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1937 1 FAMS @F49@ 1 FAMS @F157@ 1 FAMC @F8@ 0 @I84@ INDI 1 NAME Elizabeth "Ella" // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1864 1 DEAT 2 DATE 17 JUL 1918 2 PLAC Alapayevsk,Ural Mts.,,Russia 1 FAMS @F144@ 1 FAMC @F8@ 0 @I85@ INDI 1 NAME Mary "May" // 1 SEX F 1 BIRT 2 DATE 1874 1 DEAT 2 DATE 1878 2 PLAC Hesse-Darmstadt,Palace,,Germany 1 FAMC @F8@ 0 @I86@ INDI 1 NAME Frederick // 1 SEX M 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1873 1 FAMC @F8@ 0 @I87@ INDI 1 NAME William Henry Andrew/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 18 DEC 1941 2 PLAC Hadley Common,Hertfordshire,England 1 CHR 2 DATE 22 FEB 1942 2 PLAC Private Chapel,Windsor Castle,Berkshire,England 1 DEAT 2 DATE 28 AUG 1972 2 PLAC Near,Wolverhampton,England 1 FAMC @F19@ 0 @I88@ INDI 1 NAME Richard Alexander Walter/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 26 AUG 1944 2 PLAC Hadley Common,Hertfordshire,England 1 CHR 2 DATE 20 OCT 1944 2 PLAC Private Chapel,Windsor Castle,Berkshire,England 1 FAMS @F23@ 1 FAMC @F19@ 0 @I89@ INDI 1 NAME Birgitte of_Denmark /von_Deurs/ 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE 1947 1 FAMS @F23@ 0 @I90@ INDI 1 NAME Alexander Patrick Gregers// 1 TITL Earl of Ulster 1 SEX M 1 BIRT 2 DATE 24 OCT 1974 2 PLAC St. Marys Hosp.,Paddington,London,England 1 CHR 2 DATE 9 FEB 1975 2 PLAC Barnwell Church 1 FAMC @F23@ 0 @I91@ INDI 1 NAME Earl Winfield /Spencer/ 1 TITL Jr. 1 SEX M 1 FAMS @F24@ 0 @I92@ INDI 1 NAME Ernest /Simpson/ 1 SEX M 1 FAMS @F25@ 0 @I93@ INDI 1 NAME Frances /Burke_Roche/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1936 1 FAMS @F78@ 1 FAMS @F297@ 1 FAMC @F119@ 0 @I94@ INDI 1 NAME Marie Alexandrovna // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 17 OCT 1853 2 PLAC St. Petersburg,,,Russia 1 DEAT 2 DATE 25 OCT 1920 2 PLAC Zurich,,,Switzerland 1 FAMS @F26@ 1 FAMC @F11@ 0 @I95@ INDI 1 NAME Alfred // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1874 1 DEAT 2 DATE 1899 1 FAMC @F26@ 0 @I96@ INDI 1 NAME Marie of_Saxe-Coburg and_Gotha// 1 TITL Queen of Romania 1 SEX F 1 BIRT 2 DATE 29 OCT 1875 2 PLAC Eastwell Park,Kent,England 1 DEAT 2 DATE 10 JUL 1938 2 PLAC Castle Pelesch,Sinaia,Romania 1 FAMS @F100@ 1 FAMC @F26@ 0 @I97@ INDI 1 NAME Victoria Melita of_Edinburgh// 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1876 2 PLAC Malta 1 DEAT 2 DATE 1936 1 FAMS @F49@ 1 FAMS @F213@ 1 FAMC @F26@ 0 @I98@ INDI 1 NAME Alexandra // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1878 1 DEAT 2 DATE 1942 1 FAMS @F961@ 1 FAMC @F26@ 0 @I99@ INDI 1 NAME Beatrice // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1966 1 FAMS @F960@ 1 FAMC @F26@ 0 @I100@ INDI 1 NAME Louis of_Battenberg // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1854 1 DEAT 2 DATE 1921 1 FAMS @F27@ 1 FAMC @F109@ 0 @I101@ INDI 1 NAME Alice of_Battenberg // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1885 1 DEAT 2 DATE ABT 1969 2 PLAC Buckingham,Palace,London,England 1 FAMS @F28@ 1 FAMC @F27@ 0 @I102@ INDI 1 NAME George /Mountbatten/ 1 TITL Marquess 1 SEX M 1 BIRT 2 DATE 1892 1 DEAT 2 DATE 1938 1 FAMS @F176@ 1 FAMC @F27@ 0 @I103@ INDI 1 NAME Louis of_Burma /Mountbatten/ 1 TITL Earl Mountbatten 1 SEX M 1 BIRT 2 DATE 1900 2 PLAC Windsor,Berkshire,England 1 DEAT 2 DATE 27 AUG 1979 2 PLAC Donegal Bay,County Sligo,Ireland 1 FAMS @F175@ 1 FAMC @F27@ 0 @I104@ INDI 1 NAME Andrew of_Greece // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1944 1 FAMS @F28@ 1 FAMC @F75@ 0 @I105@ INDI 1 NAME Alexander /Duff/ 1 TITL Duke of Fife 1 SEX M 1 BIRT 2 DATE 1849 1 DEAT 2 DATE 1912 1 FAMS @F29@ 0 @I106@ INDI 1 NAME Alexandra /Windsor/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 25 DEC 1936 1 FAMS @F30@ 1 FAMC @F17@ 0 @I107@ INDI 1 NAME Michael /Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 4 JUL 1942 2 PLAC Coppins,,England 1 FAMS @F103@ 1 FAMC @F17@ 0 @I108@ INDI 1 NAME Angus /Ogilvy/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1928 1 FAMS @F30@ 0 @I109@ INDI 1 NAME James Robert Bruce/Ogilvy/ 1 SEX M 1 BIRT 2 DATE 29 FEB 1964 2 PLAC Thatched House,Lodge,,England 1 FAMS @F1411@ 1 FAMC @F30@ 0 @I110@ INDI 1 NAME Marina Victoria Alexandra/Ogilvy/ 1 SEX F 1 BIRT 2 DATE 31 JUL 1966 2 PLAC Thatched House,Lodge,Richmond Park,England 1 FAMS @F1402@ 1 FAMC @F30@ 0 @I111@ INDI 1 NAME Katharine /Worsley/ 1 TITL Duchess of Kent 1 SEX F 1 BIRT 2 DATE 1933 1 FAMS @F31@ 1 FAMC @F367@ 0 @I112@ INDI 1 NAME George Philip of_St._Andrews/Windsor/ 1 TITL Earl 1 SEX M 1 BIRT 2 DATE 26 JUN 1962 1 CHR 2 DATE 14 SEP 1962 2 PLAC Buckingham,Palace,Music Room,England 1 FAMS @F1406@ 1 FAMC @F31@ 0 @I113@ INDI 1 NAME Helen Marina Lucy/Windsor/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 28 APR 1964 1 CHR 2 DATE 12 MAY 1964 2 PLAC Private Chapel,Windsor Castle,Berkshire,England 1 FAMC @F31@ 0 @I114@ INDI 1 NAME Nicholas Charles Edward/Windsor/ 1 TITL Lord 1 SEX M 1 BIRT 2 DATE 25 JUL 1970 2 PLAC Kings College,Hospital,Denmark Hill 1 CHR 2 PLAC Private Chapel,Windsor Castle,Berkshire,England 1 FAMC @F31@ 0 @I115@ INDI 1 NAME William Arthur Philip/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 21 JUN 1982 2 PLAC St. Mary's Hosp.,Paddington,London,England 1 CHR 2 DATE 4 AUG 1982 2 PLAC Music Room,Buckingham,Palace,England 1 FAMC @F16@ 0 @I116@ INDI 1 NAME Henry Charles Albert/Windsor/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 15 SEP 1984 2 PLAC St. Mary's Hosp.,Paddington,London,England 1 FAMC @F16@ 0 @I117@ INDI 1 NAME (Frederick) Christian Charles// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1917 1 FAMS @F32@ 0 @I118@ INDI 1 NAME Marie Louise // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1956 1 FAMS @F33@ 1 FAMC @F32@ 0 @I119@ INDI 1 NAME Aribert of_Anhalt // 1 SEX M 1 BIRT 2 DATE 1864 1 DEAT 2 DATE 1933 1 FAMS @F33@ 0 @I120@ INDI 1 NAME Louise Margaret of_Prussia// 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE 25 JUN 1860 2 PLAC Potsdam 1 DEAT 2 DATE 14 MAR 1917 2 PLAC Clarence House,London,,England 1 BURI 2 PLAC Frogmore,,,England 1 FAMS @F34@ 1 FAMC @F68@ 0 @I121@ INDI 1 NAME Margaret of_Sweden // 1 TITL Crown Princess 1 SEX F 1 BIRT 2 DATE 15 JAN 1882 2 PLAC Bagshot Park 1 DEAT 2 DATE 1 MAY 1920 2 PLAC Stockholm,Sweden 1 FAMS @F35@ 1 FAMC @F34@ 0 @I122@ INDI 1 NAME Arthur of_Connaught // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1883 1 DEAT 2 DATE 1938 1 FAMS @F36@ 1 FAMC @F34@ 0 @I123@ INDI 1 NAME Patricia // 1 TITL Lady Ramsay 1 SEX F 1 BIRT 2 DATE 1886 1 DEAT 2 DATE 1974 1 FAMS @F37@ 1 FAMC @F34@ 0 @I124@ INDI 1 NAME Gustav_VI Adolf // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 11 NOV 1882 2 PLAC Stockholm,Sweden 1 DEAT 2 DATE 15 SEP 1973 2 PLAC Helsingborg 1 BURI 2 PLAC Royal Cemetery,Haga Castle Park 1 FAMS @F35@ 1 FAMS @F77@ 1 FAMC @F155@ 0 @I125@ INDI 1 NAME Alexandra // 1 TITL Duchess of Fife 1 SEX F 1 BIRT 2 DATE 1891 1 DEAT 2 DATE 26 FEB 1959 1 BURI 2 PLAC Mar Lodge,Braemar,Aberdeenshire,England 1 FAMS @F36@ 1 FAMC @F29@ 0 @I126@ INDI 1 NAME Alexander /Ramsay/ 1 TITL Admiral Sir 1 SEX M 1 BIRT 2 DATE 1881 1 DEAT 2 DATE 1972 1 FAMS @F37@ 1 FAMC @F962@ 0 @I127@ INDI 1 NAME Isabella of_France // 1 SEX F 1 BIRT 2 DATE 1292 2 PLAC Paris 1 DEAT 2 DATE 22 AUG 1358 2 PLAC Castle Rising,Norfolk,England 1 BURI 2 PLAC Grey Friars,Church,London,England 1 FAMS @F92@ 1 FAMC @F794@ 0 @I128@ INDI 1 NAME Issue_Unknown // 1 SEX M 0 @I129@ INDI 1 NAME Charles Edward // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1954 1 FAMS @F141@ 1 FAMC @F5@ 0 @I130@ INDI 1 NAME George_III /Hanover/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 4 JUN 1738 2 PLAC Norfolk-House,St. James Square,London,England 1 DEAT 2 DATE 29 JAN 1820 2 PLAC Windsor Castle,Windsor,Berkshire,England 1 BURI 2 PLAC St. George Chap.,Windsor Castle,Berkshire,England 1 REFN 4 1 FAMS @F39@ 1 FAMC @F105@ 0 @I131@ INDI 1 NAME (Sophia) Charlotte // 1 SEX F 1 BIRT 2 DATE 19 MAY 1744 2 PLAC Mirow 1 DEAT 2 DATE 17 NOV 1818 2 PLAC Kew Palace 1 BURI 2 PLAC St. George Chap.,Windsor,,England 1 REFN 5 1 FAMS @F39@ 1 FAMC @F959@ 0 @I132@ INDI 1 NAME Adolphus of_Cambridge /Hanover/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1774 1 DEAT 2 DATE 1850 1 FAMS @F40@ 1 FAMC @F39@ 0 @I133@ INDI 1 NAME Edward Augustus /Hanover/ 1 TITL Duke of Kent 1 SEX M 1 BIRT 2 DATE 2 NOV 1767 2 PLAC Buckingham House,,London,England 1 DEAT 2 DATE 23 JAN 1820 2 PLAC Sidmouth,Devon,,England 1 REFN 2 1 FAMS @F42@ 1 FAMC @F39@ 0 @I134@ INDI 1 NAME Augusta of_Hesse-Cassel // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1797 1 DEAT 2 DATE 1889 1 FAMS @F40@ 1 FAMC @F97@ 0 @I135@ INDI 1 NAME Augusta Caroline // 1 SEX F 1 BIRT 2 DATE 1822 1 DEAT 2 DATE 1916 1 FAMS @F89@ 1 FAMC @F40@ 0 @I136@ INDI 1 NAME Mary Adelaide "Fat_Mary"// 1 SEX F 1 BIRT 2 DATE 1833 1 DEAT 2 DATE 1897 1 FAMS @F41@ 1 FAMC @F40@ 0 @I137@ INDI 1 NAME Francis // 1 TITL Duke of Teck 1 SEX M 1 BIRT 2 DATE 1837 1 DEAT 2 DATE 1900 1 FAMS @F41@ 1 FAMC @F98@ 0 @I138@ INDI 1 NAME Victoria Mary Louisa// 1 SEX F 1 BIRT 2 DATE 17 AUG 1786 2 PLAC Coburg 1 DEAT 2 DATE 16 MAR 1861 2 PLAC Frogmore House,Windsor,,England 1 REFN 3 1 FAMS @F1409@ 1 FAMS @F42@ 1 FAMC @F1147@ 0 @I139@ INDI 1 NAME Ernest_I of_Saxe-Coburg- Saalfeld// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1784 1 DEAT 2 DATE 29 JAN 1844 1 FAMS @F43@ 1 FAMS @F1368@ 1 FAMC @F1147@ 0 @I140@ INDI 1 NAME Louise of_Saxe-Coburg- Altenburg// 1 SEX F 1 BIRT 2 DATE 1800 2 PLAC Thuringia 1 DEAT 2 DATE 1831 2 PLAC Paris,France 1 FAMS @F43@ 0 @I141@ INDI 1 NAME George_IV /Hanover/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 12 AUG 1762 2 PLAC ,,London,England 1 DEAT 2 DATE 26 JUN 1830 2 PLAC Windsor Castle,Berkshire,England 1 FAMS @F44@ 1 FAMS @F45@ 1 FAMC @F39@ 0 @I142@ INDI 1 NAME Maria Anne /Fitzherbert/ 1 SEX F 1 BIRT 2 DATE 1756 1 DEAT 2 DATE 1837 1 FAMS @F44@ 0 @I143@ INDI 1 NAME Caroline Amelia of_Brunswick// 1 SEX F 1 BIRT 2 DATE 1768 1 DEAT 2 DATE 1821 1 FAMS @F45@ 1 FAMC @F501@ 0 @I144@ INDI 1 NAME Charlotte Augusta /Hanover/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 7 JAN 1796 2 PLAC Carlton House 1 DEAT 2 DATE 6 NOV 1817 2 PLAC Claremont House,Esher,Surrey,England 1 BURI 2 PLAC St George Chapel,Windsor,England 1 FAMS @F80@ 1 FAMC @F45@ 0 @I145@ INDI 1 NAME Claude George /Bowes-Lyon/ 1 TITL Earl of Strath. 1 SEX M 1 BIRT 2 DATE 1855 1 DEAT 2 DATE 1944 1 FAMS @F46@ 1 FAMC @F56@ 0 @I146@ INDI 1 NAME Cecilia Nina /Cavendish-Bentin/ 1 TITL Countess of S. 1 SEX F 1 BIRT 2 DATE 1862 1 DEAT 2 DATE 1938 1 FAMS @F46@ 1 FAMC @F71@ 0 @I147@ INDI 1 NAME Margarita /Mountbatten/ 1 SEX F 1 BIRT 2 DATE 1905 1 DEAT 2 DATE 1981 1 FAMS @F166@ 1 FAMC @F28@ 0 @I148@ INDI 1 NAME Theodora /Mountbatten/ 1 SEX F 1 BIRT 2 DATE 1906 1 DEAT 2 DATE 1960 1 FAMS @F167@ 1 FAMC @F28@ 0 @I149@ INDI 1 NAME Vladimir /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1847 1 DEAT 2 DATE 1909 1 FAMS @F47@ 1 FAMC @F11@ 0 @I150@ INDI 1 NAME Alexis /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1850 1 DEAT 2 DATE 1908 1 FAMC @F11@ 0 @I151@ INDI 1 NAME Serge Alexandrovich /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1857 1 DEAT 2 DATE FEB 1905 1 FAMS @F144@ 1 FAMC @F11@ 0 @I152@ INDI 1 NAME Paul Alexandrovich /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1860 1 DEAT 2 DATE JAN 1919 2 PLAC Fortress of,Peter and Paul,,Russia 1 FAMS @F50@ 1 FAMS @F499@ 1 FAMC @F11@ 0 @I153@ INDI 1 NAME George Alexandrovich /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1871 1 DEAT 2 DATE JUL 1899 2 PLAC Abbas Tuman,Caucasus,Russia 1 BURI 2 PLAC Peter and Paul,Cathedral,,Russia 1 FAMC @F9@ 0 @I154@ INDI 1 NAME Xenia /Romanov/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1875 1 DEAT 2 DATE 20 APR 1960 2 PLAC London,England 1 FAMS @F51@ 1 FAMC @F9@ 0 @I155@ INDI 1 NAME Michael "Mischa" Alexandrovich/Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1878 1 DEAT 2 DATE 10 JUL 1918 2 PLAC Perm,,,Russia 1 FAMS @F498@ 1 FAMC @F9@ 0 @I156@ INDI 1 NAME Olga Alexandrovna /Romanov/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1 JUN 1882 1 DEAT 2 DATE 24 NOV 1960 2 PLAC East Toronto,Ontario,,Canada 1 BURI 2 DATE 30 NOV 1960 2 PLAC York Cemetery,Toronto,Ontario,Canada 1 FAMS @F500@ 1 FAMS @F592@ 1 FAMC @F9@ 0 @I157@ INDI 1 NAME Marie /Pavlovna/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1854 1 DEAT 2 DATE 1920 1 FAMS @F47@ 1 FAMC @F1270@ 0 @I158@ INDI 1 NAME Cyril Vladimirovitch /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1876 1 DEAT 2 DATE 1938 1 FAMS @F213@ 1 FAMC @F47@ 0 @I159@ INDI 1 NAME Boris /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1877 1 DEAT 2 DATE 1943 1 FAMS @F1379@ 1 FAMC @F47@ 0 @I160@ INDI 1 NAME Andrei (Andrew) Vladimirovich/Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1879 1 DEAT 2 DATE 1956 1 FAMS @F48@ 1 FAMC @F47@ 0 @I161@ INDI 1 NAME Mathilde (Maria) /Krzesinska/ 1 SEX F 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1971 1 FAMS @F48@ 1 FAMC @F1380@ 0 @I162@ INDI 1 NAME Frederick William_III // 1 TITL King of Prussia 1 SEX M 1 BIRT 2 DATE 1770 2 PLAC Potsdam,Germany 1 DEAT 2 DATE 1840 1 FAMS @F145@ 1 FAMS @F179@ 1 FAMC @F200@ 0 @I163@ INDI 1 NAME Alexandra of_Greece // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1891 1 FAMS @F50@ 1 FAMC @F75@ 0 @I164@ INDI 1 NAME Dmitri Pavlovich /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1891 1 DEAT 2 DATE 1941 2 PLAC Switzerland 1 FAMS @F511@ 1 FAMC @F50@ 0 @I165@ INDI 1 NAME Nicholas /Romanov/ 1 SEX M 1 BIRT 2 DATE 1850 1 DEAT 2 DATE 1918 1 FAMS @F1267@ 1 FAMC @F112@ 0 @I166@ INDI 1 NAME Irina // 1 SEX F 1 BIRT 2 DATE 1895 1 FAMS @F52@ 1 FAMC @F51@ 0 @I167@ INDI 1 NAME Felix /Yussoupov/ 1 SEX M 1 BIRT 2 DATE 1887 1 FAMS @F52@ 0 @I168@ INDI 1 NAME Sarah Margaret /Ferguson/ 1 TITL Duchess of York 1 SEX F 1 BIRT 2 DATE 15 OCT 1959 2 PLAC 27 Welbech St.,Marylebone,London,England 1 FAMS @F53@ 1 FAMC @F54@ 0 @I169@ INDI 1 NAME Ronald Ivor /Ferguson/ 1 TITL Major 1 SEX M 1 BIRT 2 DATE 1931 1 FAMS @F54@ 1 FAMS @F1384@ 1 FAMC @F303@ 0 @I170@ INDI 1 NAME Susan Mary /Wright/ 1 SEX F 1 BIRT 2 DATE 1937 1 FAMS @F54@ 1 FAMS @F311@ 1 FAMC @F309@ 0 @I171@ INDI 1 NAME Teackle Wallis /Warfield/ 1 SEX M 1 FAMS @F55@ 0 @I172@ INDI 1 NAME Alice /Montague/ 1 SEX F 1 FAMS @F55@ 0 @I173@ INDI 1 NAME Violet Hyacinth /Bowes-Lyon/ 1 SEX F 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1893 1 FAMC @F46@ 0 @I174@ INDI 1 NAME Mary Frances /Bowes-Lyon/ 1 SEX F 1 BIRT 2 DATE 1883 1 DEAT 2 DATE 1961 1 FAMS @F60@ 1 FAMC @F46@ 0 @I175@ INDI 1 NAME Patrick /Bowes-Lyon/ 1 SEX M 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1949 1 FAMS @F61@ 1 FAMC @F46@ 0 @I176@ INDI 1 NAME John Herbert /Bowes-Lyon/ 1 SEX M 1 BIRT 2 DATE 1886 1 DEAT 2 DATE 1930 1 FAMS @F62@ 1 FAMC @F46@ 0 @I177@ INDI 1 NAME Alexander Francis /Bowes-Lyon/ 1 SEX M 1 BIRT 2 DATE 1887 1 DEAT 2 DATE 1911 1 FAMC @F46@ 0 @I178@ INDI 1 NAME Fergus /Bowes-Lyon/ 1 SEX M 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1915 1 FAMS @F63@ 1 FAMC @F46@ 0 @I179@ INDI 1 NAME Rose /Bowes-Lyon/ 1 SEX F 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 1967 1 FAMS @F64@ 1 FAMC @F46@ 0 @I180@ INDI 1 NAME Michael Claude /Bowes-Lyon/ 1 SEX M 1 BIRT 2 DATE 1893 1 DEAT 2 DATE 1953 1 FAMS @F65@ 1 FAMC @F46@ 0 @I181@ INDI 1 NAME David /Bowes-Lyon/ 1 TITL Sir 1 SEX M 1 BIRT 2 DATE 2 MAY 1902 1 DEAT 2 DATE 1961 2 PLAC Birkhall 1 FAMS @F66@ 1 FAMC @F46@ 0 @I182@ INDI 1 NAME Claude /Bowes-Lyon/ 1 TITL Earl 1 SEX M 1 BIRT 2 DATE 1824 1 DEAT 2 DATE FEB 1904 1 FAMS @F56@ 1 FAMC @F57@ 0 @I183@ INDI 1 NAME Frances Dora /Smith/ 1 SEX F 1 BIRT 2 DATE 1833 1 DEAT 2 DATE 1922 1 FAMS @F56@ 1 FAMC @F117@ 0 @I184@ INDI 1 NAME Thomas /Lyon-Bowes/ 1 SEX M 1 BIRT 2 DATE 1773 1 DEAT 2 DATE 1846 1 FAMS @F57@ 1 FAMC @F58@ 0 @I185@ INDI 1 NAME Mary /Carpenter/ 1 SEX F 1 FAMS @F57@ 0 @I186@ INDI 1 NAME Thomas George /Lyon-Bowes/ 1 SEX M 1 BIRT 2 DATE 1822 1 DEAT 2 DATE 1865 1 FAMC @F57@ 0 @I187@ INDI 1 NAME John /Lyon/ 1 SEX M 1 BIRT 2 DATE 1737 1 DEAT 2 DATE 1776 1 FAMS @F58@ 0 @I188@ INDI 1 NAME Mary Eleanor /Bowes/ 1 SEX F 1 BIRT 2 DATE 1749 1 DEAT 2 DATE 1800 1 FAMS @F58@ 1 FAMS @F59@ 0 @I189@ INDI 1 NAME John Lyon /Bowes/ 1 SEX M 1 BIRT 2 DATE 1769 1 DEAT 2 DATE 1820 1 FAMC @F58@ 0 @I190@ INDI 1 NAME Andrew Robinson /Stoney/ 1 SEX M 1 FAMS @F59@ 0 @I191@ INDI 1 NAME /Elphinstone/ 1 TITL Lord 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1955 1 FAMS @F60@ 0 @I192@ INDI 1 NAME Dorothy Beatrix /Osborne/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1888 1 DEAT 2 DATE 1946 1 FAMS @F61@ 0 @I193@ INDI 1 NAME Fenella Stuart-Forbes Trefusis/Hepburn/ 1 TITL Hon 1 SEX F 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1966 1 FAMS @F62@ 0 @I194@ INDI 1 NAME Christian Norah /Dawson-Damer/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 1959 1 FAMS @F63@ 0 @I195@ INDI 1 NAME /Granville/ 1 TITL Lord 1 SEX M 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1953 1 FAMS @F64@ 0 @I196@ INDI 1 NAME Elizabeth /Cator/ 1 SEX F 1 BIRT 2 DATE 1899 1 DEAT 2 DATE 1959 1 FAMS @F65@ 0 @I197@ INDI 1 NAME Rachel /Clay/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1907 1 FAMS @F66@ 0 @I198@ INDI 1 NAME Jeanne d'Albret of_France// 1 SEX F 1 FAMS @F446@ 0 @I199@ INDI 1 NAME Frederick Charles of_Prussia// 1 TITL Prince 1 SEX M 1 FAMS @F68@ 0 @I200@ INDI 1 NAME Maria Anna of_Anhalt// 1 SEX F 1 FAMS @F68@ 0 @I201@ INDI 1 NAME John /Campbell/ 1 TITL Duke of Argyll 1 SEX M 1 BIRT 2 DATE 1845 1 DEAT 2 DATE 1914 1 FAMS @F69@ 0 @I202@ INDI 1 NAME Frederick /Hanover/ 1 TITL Duke of York 1 SEX M 1 BIRT 2 DATE 16 AUG 1763 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 5 JAN 1827 2 PLAC Rutland House,Arlington St.,London,England 1 FAMS @F185@ 1 FAMC @F39@ 0 @I203@ INDI 1 NAME William_IV Henry /Hanover/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 21 AUG 1765 2 PLAC Buckingham House,London,England 1 DEAT 2 DATE 20 JUN 1837 2 PLAC Windsor Castle,Windsor,Berkshire,England 1 BURI 2 PLAC St. George Chap.,Windsor,Berkshire,England 1 FAMS @F73@ 1 FAMC @F39@ 0 @I204@ INDI 1 NAME Charlotte Augusta Matilda/Hanover/ 1 TITL Princess Royal 1 SEX F 1 BIRT 2 DATE 29 SEP 1766 2 PLAC Buckingham House,St. James Park,London,England 1 DEAT 2 DATE 6 OCT 1828 2 PLAC Ludwigsburg 1 FAMS @F82@ 1 FAMC @F39@ 0 @I205@ INDI 1 NAME Ferdinand // 1 SEX M 1 BIRT 2 DATE 1785 1 DEAT 2 DATE 1851 1 FAMS @F1370@ 1 FAMC @F1147@ 0 @I206@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 1799 1 DEAT 2 DATE 1860 1 FAMS @F1368@ 0 @I207@ INDI 1 NAME Charles /Cavendish-Bentin/ 1 TITL Reverend 1 SEX M 1 BIRT 2 DATE 1817 1 DEAT 2 DATE 1865 1 FAMS @F71@ 1 FAMC @F115@ 0 @I208@ INDI 1 NAME Caroline Louisa /Burnaby/ 1 SEX F 1 BIRT 2 DATE 1832 1 DEAT 2 DATE 1918 1 FAMS @F71@ 1 FAMC @F116@ 0 @I209@ INDI 1 NAME Augusta Sophia /Hanover/ 1 SEX F 1 BIRT 2 DATE 8 NOV 1768 2 PLAC Buckingham House 1 DEAT 2 DATE 22 SEP 1840 2 PLAC Clarence House,St. James 1 FAMC @F39@ 0 @I210@ INDI 1 NAME Elizabeth /Hanover/ 1 SEX F 1 BIRT 2 DATE 22 MAY 1770 2 PLAC Buckingham House 1 DEAT 2 DATE 10 JAN 1840 2 PLAC Frankfurt,-am-Main 1 FAMS @F72@ 1 FAMC @F39@ 0 @I211@ INDI 1 NAME Frederick_VI of_Hesse-Homburg // 1 TITL Landgrave 1 SEX M 1 BIRT 2 DATE 1769 1 DEAT 2 DATE 1829 1 FAMS @F72@ 0 @I212@ INDI 1 NAME Ernest Augustus_I /Hanover/ 1 TITL King of Hanover 1 SEX M 1 BIRT 2 DATE 5 JUN 1771 2 PLAC Buckingham House,London,England 1 DEAT 2 DATE 18 NOV 1851 2 PLAC Herrenhausen 1 BURI 2 PLAC Herrenhausen 1 FAMS @F83@ 1 FAMC @F39@ 0 @I213@ INDI 1 NAME Augustus Frederick /Hanover/ 1 TITL Duke of Sussex 1 SEX M 1 BIRT 2 DATE 27 JAN 1773 2 PLAC Buckingham House 1 DEAT 2 DATE 21 APR 1843 2 PLAC Kensington Palac 1 FAMC @F39@ 0 @I214@ INDI 1 NAME Mary /Hanover/ 1 SEX F 1 BIRT 2 DATE 25 APR 1776 2 PLAC Buckingham House 1 DEAT 2 DATE 30 APR 1857 2 PLAC Gloucester House,Piccadilly,London,England 1 FAMS @F93@ 1 FAMC @F39@ 0 @I215@ INDI 1 NAME Sophia /Hanover/ 1 SEX F 1 BIRT 2 DATE 2 NOV 1777 2 PLAC Buckingham House 1 DEAT 2 DATE 27 MAY 1848 2 PLAC Vicarage Place,Kensington 1 FAMC @F39@ 0 @I216@ INDI 1 NAME Octavius /Hanover/ 1 SEX M 1 BIRT 2 DATE 23 FEB 1779 2 PLAC Buckingham House 1 DEAT 2 DATE 3 MAY 1783 2 PLAC Kew Palace 1 FAMC @F39@ 0 @I217@ INDI 1 NAME Alfred /Hanover/ 1 SEX M 1 BIRT 2 DATE 22 SEP 1780 2 PLAC Windsor Castle,Windsor,Berkshire,England 1 DEAT 2 DATE 20 AUG 1783 2 PLAC Windsor Castle,Windsor,Berkshire,England 1 FAMC @F39@ 0 @I218@ INDI 1 NAME Amelia /Hanover/ 1 SEX F 1 BIRT 2 DATE 7 AUG 1783 2 PLAC Royal Lodge,Windsor,Berkshire,England 1 DEAT 2 DATE 2 NOV 1810 2 PLAC Augusta Lodge,Windsor,Berkshire,England 1 FAMC @F39@ 0 @I219@ INDI 1 NAME Adelaide Louisa Theresa// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 13 AUG 1792 2 PLAC Meiningen 1 DEAT 2 DATE 2 DEC 1849 2 PLAC Near Stanmore,Middlesex,England 1 BURI 2 PLAC St. George Chap.,Windsor,England 1 FAMS @F73@ 1 FAMC @F277@ 0 @I220@ INDI 1 NAME Charlotte Augusta Louisa/Hanover/ 1 SEX F 1 BIRT 2 DATE 1819 1 DEAT 2 DATE 27 MAR 1819 2 PLAC Furstenhof,Hanover 1 FAMC @F73@ 0 @I221@ INDI 1 NAME Elizabeth Georgiana Adelaide/Hanover/ 1 SEX F 1 BIRT 2 DATE 10 DEC 1820 2 PLAC St. James Palac 1 DEAT 2 DATE 4 MAR 1821 2 PLAC St. James Palac 1 FAMC @F73@ 0 @I222@ INDI 1 NAME Twin-Boy_1 // 1 SEX M 1 BIRT 2 DATE 23 APR 1822 2 PLAC Bushy Park 1 DEAT 2 DATE 23 APR 1822 2 PLAC Bushy Park 1 FAMC @F73@ 0 @I223@ INDI 1 NAME Twin-Boy_2 // 1 SEX M 1 BIRT 2 DATE 23 APR 1822 2 PLAC Bushy Park 1 DEAT 2 DATE 23 APR 1822 2 PLAC Bushy Park 1 FAMC @F73@ 0 @I224@ INDI 1 NAME Marie // 1 SEX F 1 BIRT 2 DATE 1852 1 DEAT 2 DATE 1923 1 FAMS @F171@ 1 FAMC @F109@ 0 @I225@ INDI 1 NAME Christian_IX // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 8 APR 1818 2 PLAC Gottorp 1 DEAT 2 DATE 29 JAN 1906 2 PLAC Amalienborg 1 BURI 2 PLAC Roskilde,Denmark 1 FAMS @F74@ 1 FAMC @F108@ 0 @I226@ INDI 1 NAME Louise of_Hesse-Cassel // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 7 SEP 1817 2 PLAC Cassel 1 DEAT 2 DATE 29 SEP 1898 2 PLAC Bernstorff 1 FAMS @F74@ 1 FAMC @F96@ 0 @I227@ INDI 1 NAME William George_I of_the_Hellenes/Oldenburg/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 24 DEC 1845 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 18 MAR 1913 2 PLAC Salonika 1 BURI 2 PLAC Tatoi 1 FAMS @F75@ 1 FAMC @F74@ 0 @I228@ INDI 1 NAME Olga Constantinovna // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1851 1 DEAT 2 DATE 1926 1 BURI 2 DATE NOV 1936 2 PLAC Tatoi,Near Athens,Greece 1 FAMS @F75@ 1 FAMC @F112@ 0 @I229@ INDI 1 NAME Nicholas of_Greece // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1938 1 FAMS @F76@ 1 FAMC @F75@ 0 @I230@ INDI 1 NAME Child_6 // 1 SEX M 1 BIRT 2 DATE 1913 1 FAMC @F139@ 0 @I231@ INDI 1 NAME Child_5 // 1 SEX M 1 FAMC @F139@ 0 @I232@ INDI 1 NAME Paul_I /Oldenburg/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 14 DEC 1901 2 PLAC Athens,Greece 1 DEAT 2 DATE 6 MAR 1964 2 PLAC Tatoi,Near Athens,Greece 1 BURI 2 PLAC Tatoi,Near Athens,Greece 1 FAMS @F162@ 1 FAMC @F139@ 0 @I233@ INDI 1 NAME Helen of_Greece // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 2 MAY 1896 2 PLAC Athens,Greece 1 DEAT 2 DATE 28 NOV 1982 2 PLAC Lausanne,Switzerland 1 FAMS @F160@ 1 FAMC @F139@ 0 @I234@ INDI 1 NAME Alexander_I /Oldenburg/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 1 AUG 1893 2 PLAC Tatoi 1 DEAT 2 DATE 25 OCT 1920 2 PLAC Athens,Greece 1 BURI 2 PLAC Tatoi 1 FAMS @F164@ 1 FAMC @F139@ 0 @I235@ INDI 1 NAME Sumner M. /Kirby/ 1 SEX F 1 DEAT 2 DATE 1945 1 FAMS @F1381@ 0 @I236@ INDI 1 NAME Child_2 // 1 SEX M 1 FAMC @F76@ 0 @I237@ INDI 1 NAME Child_3 // 1 SEX M 1 FAMC @F76@ 0 @I238@ INDI 1 NAME Louise Alexandra /Mountbatten/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 13 JUL 1889 2 PLAC Schloss,Heiligenberg 1 DEAT 2 DATE 7 MAR 1965 2 PLAC Stockholm,Sweden 1 FAMS @F77@ 1 FAMC @F27@ 0 @I239@ INDI 1 NAME Edward John VIII/Spencer/ 1 TITL Earl of Spencer 1 SEX M 1 BIRT 2 DATE 24 JAN 1924 2 PLAC England 1 DEAT 2 DATE 29 MAR 1992 2 PLAC London,England 1 FAMS @F78@ 1 FAMS @F79@ 1 FAMC @F118@ 0 @I240@ INDI 1 NAME Sarah /Spencer/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1955 1 FAMS @F301@ 1 FAMC @F78@ 0 @I241@ INDI 1 NAME Jane /Spencer/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1957 1 FAMS @F300@ 1 FAMC @F78@ 0 @I242@ INDI 1 NAME Charles /Spencer/ 1 TITL Vicount Althorp 1 SEX M 1 BIRT 2 DATE 1964 1 FAMS @F1403@ 1 FAMC @F78@ 0 @I243@ INDI 1 NAME Raine of_Dartmouth /McCorquodale/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE SEP 1929 1 FAMS @F1414@ 1 FAMS @F79@ 1 FAMC @F299@ 0 @I244@ INDI 1 NAME George Earl_of_Harewood /Lascelles/ 1 TITL Viscount 1 SEX M 1 BIRT 2 DATE 1923 1 FAMS @F94@ 1 FAMS @F101@ 1 FAMC @F18@ 0 @I245@ INDI 1 NAME Louise Marie d'Orleans// 1 SEX F 1 BIRT 2 DATE 3 APR 1812 2 PLAC Palermo,Italy 1 DEAT 2 DATE 11 OCT 1850 2 PLAC Ostende 1 BURI 2 PLAC Laeken,Belgium 1 FAMS @F663@ 1 FAMC @F1187@ 0 @I246@ INDI 1 NAME Ludwig_IX of_Hesse- Darmstadt// 1 TITL Landgrave 1 SEX M 1 FAMS @F81@ 0 @I247@ INDI 1 NAME Frederick_I of_Wurttemberg // 1 TITL King 1 SEX M 1 BIRT 2 DATE 1754 1 DEAT 2 DATE 1816 1 FAMS @F82@ 1 FAMS @F405@ 1 FAMC @F404@ 0 @I248@ INDI 1 NAME Frederica of_Mecklenburg- Strelitz// 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE 2 MAR 1778 2 PLAC Hanover,Germany 1 DEAT 2 DATE 29 JUN 1841 2 PLAC Hanover 1 BURI 2 PLAC Herrenhausen 1 FAMS @F201@ 1 FAMS @F83@ 1 FAMC @F520@ 0 @I249@ INDI 1 NAME George_V /Hanover/ 1 TITL King of Hanover 1 SEX M 1 BIRT 2 DATE 27 MAY 1819 2 PLAC Berlin,Germany 1 DEAT 2 DATE 12 JUN 1878 2 PLAC Paris,France 1 BURI 2 PLAC St George Chapel,Windsor,England 1 FAMS @F84@ 1 FAMC @F83@ 0 @I250@ INDI 1 NAME Mary of_Saxe- Altenburg// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 14 APR 1818 2 PLAC Hildburghausen 1 DEAT 2 DATE 9 JAN 1907 2 PLAC Gmunden,Austria 1 BURI 2 PLAC Gmunden 1 FAMS @F84@ 0 @I251@ INDI 1 NAME Ernest Augustus of_Cumberland/Hanover/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1845 1 DEAT 2 DATE 1923 1 FAMS @F85@ 1 FAMC @F84@ 0 @I252@ INDI 1 NAME Frederica /Hanover/ 1 SEX F 1 BIRT 2 DATE 1848 1 DEAT 2 DATE 1926 1 FAMS @F86@ 1 FAMC @F84@ 0 @I253@ INDI 1 NAME Mary /Hanover/ 1 SEX F 1 BIRT 2 DATE 1849 1 DEAT 2 DATE 1904 1 FAMC @F84@ 0 @I254@ INDI 1 NAME Thyra of_Denmark // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1853 1 DEAT 2 DATE 1933 1 FAMS @F85@ 1 FAMC @F74@ 0 @I255@ INDI 1 NAME Marie Louise /Hanover/ 1 SEX F 1 BIRT 2 DATE 1879 1 DEAT 2 DATE 1948 1 FAMS @F397@ 1 FAMC @F85@ 0 @I256@ INDI 1 NAME George William /Hanover/ 1 SEX M 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1912 1 FAMC @F85@ 0 @I257@ INDI 1 NAME Alexandra /Hanover/ 1 SEX F 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1963 1 FAMS @F398@ 1 FAMC @F85@ 0 @I258@ INDI 1 NAME Olga /Hanover/ 1 SEX F 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1958 1 FAMC @F85@ 0 @I259@ INDI 1 NAME Christian /Hanover/ 1 SEX M 1 BIRT 2 DATE 1885 1 DEAT 2 DATE 1901 1 FAMC @F85@ 0 @I260@ INDI 1 NAME Rene of_Bourbon-Parma // 1 TITL Prince 1 SEX M 1 FAMS @F399@ 0 @I261@ INDI 1 NAME Alfons /Pawel-Rammingen/ 1 TITL Baron von 1 SEX M 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1932 1 FAMS @F86@ 0 @I262@ INDI 1 NAME George of_Cambridge // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1819 1 DEAT 2 DATE 1904 1 FAMS @F87@ 1 FAMC @F40@ 0 @I263@ INDI 1 NAME Sarah (Louisa) /Fairbrother/ 1 SEX F 1 BIRT 2 DATE 1815/1816 1 DEAT 2 DATE 1890 1 FAMS @F87@ 0 @I264@ INDI 1 NAME George /FitzGeorge/ 1 SEX M 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1907 1 FAMS @F88@ 1 FAMC @F87@ 0 @I265@ INDI 1 NAME Adolphus // 1 SEX M 1 BIRT 2 DATE 1846 1 DEAT 2 DATE 1922 1 FAMC @F87@ 0 @I266@ INDI 1 NAME Agustus // 1 SEX M 1 BIRT 2 DATE 1847 1 DEAT 2 DATE 1933 1 FAMC @F87@ 0 @I267@ INDI 1 NAME Rosa /Baring/ 1 SEX F 1 FAMS @F88@ 0 @I268@ INDI 1 NAME Son_1 // 1 SEX M 1 FAMC @F88@ 0 @I269@ INDI 1 NAME Dau._1 // 1 SEX F 1 FAMC @F88@ 0 @I270@ INDI 1 NAME Dau._2 // 1 SEX F 1 FAMC @F88@ 0 @I271@ INDI 1 NAME Frederick William // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1819 1 DEAT 2 DATE 1904 1 FAMS @F89@ 0 @I272@ INDI 1 NAME Adolphus Frederick_V // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1848 1 DEAT 2 DATE 1914 1 FAMS @F90@ 1 FAMC @F89@ 0 @I273@ INDI 1 NAME Elisabeth of_Anhalt // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1933 1 FAMS @F90@ 0 @I274@ INDI 1 NAME Son_1 // 1 SEX M 1 FAMC @F90@ 0 @I275@ INDI 1 NAME Son_2 // 1 SEX M 1 FAMC @F90@ 0 @I276@ INDI 1 NAME Dau._1 // 1 SEX F 1 FAMC @F90@ 0 @I277@ INDI 1 NAME Dau._2 // 1 SEX F 1 FAMC @F90@ 0 @I278@ INDI 1 NAME Adolphus 2nd // 1 TITL Duke of Teck 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1927 1 FAMS @F91@ 1 FAMC @F41@ 0 @I279@ INDI 1 NAME Francis // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1910 1 FAMC @F41@ 0 @I280@ INDI 1 NAME Alexander George of_Teck// 1 TITL Earl of Athlone 1 SEX M 1 BIRT 2 DATE 1874 1 DEAT 2 DATE 1957 1 FAMS @F38@ 1 FAMC @F41@ 0 @I281@ INDI 1 NAME Margaret /Grosvenor/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1873 1 DEAT 2 DATE 1929 1 FAMS @F91@ 0 @I282@ INDI 1 NAME George of_Cambridge // 1 TITL Marquess 1 SEX M 1 BIRT 2 DATE 1895 1 FAMS @F666@ 1 FAMC @F91@ 0 @I283@ INDI 1 NAME Son_2 // 1 SEX M 1 FAMC @F91@ 0 @I284@ INDI 1 NAME Mary // 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1897 1 FAMS @F667@ 1 FAMC @F91@ 0 @I285@ INDI 1 NAME Helena // 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1899 1 DEAT 2 DATE 1969 1 FAMS @F668@ 1 FAMC @F91@ 0 @I286@ INDI 1 NAME Edward_II // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 25 APR 1284 2 PLAC Caernarvon,Castle,Wales 1 DEAT 2 DATE 21 SEP 1327 2 PLAC Berkeley Castle,Gloucestershire 1 BURI 2 PLAC Gloucester,Cathedral 1 FAMS @F92@ 1 FAMC @F464@ 0 @I287@ INDI 1 NAME Rupert // 1 TITL Vicount Trematon 1 SEX M 1 DEAT 2 DATE 1928 1 FAMC @F38@ 0 @I288@ INDI 1 NAME Son_2 // 1 SEX M 1 FAMC @F38@ 0 @I289@ INDI 1 NAME May Cambridge // 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1906 1 FAMS @F669@ 1 FAMC @F38@ 0 @I290@ INDI 1 NAME William Frederick of_Gloucester// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1776 1 DEAT 2 DATE 1834 1 FAMS @F93@ 1 FAMC @F279@ 0 @I291@ INDI 1 NAME Gerald /Lascelles/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1924 1 FAMS @F95@ 1 FAMS @F102@ 1 FAMC @F18@ 0 @I292@ INDI 1 NAME Marion (Maria) Donata/Stein/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1926 1 FAMS @F94@ 1 FAMC @F1413@ 0 @I293@ INDI 1 NAME David /Lascelles/ 1 TITL Viscount 1 SEX M 1 BIRT 2 DATE 1950 1 FAMS @F357@ 1 FAMC @F94@ 0 @I294@ INDI 1 NAME James /Lascelles/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1953 1 FAMS @F358@ 1 FAMC @F94@ 0 @I295@ INDI 1 NAME Jeremy /Lascelles/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1955 1 FAMS @F359@ 1 FAMC @F94@ 0 @I296@ INDI 1 NAME Angela /Dowding/ 1 SEX F 1 BIRT 2 DATE 1919 1 FAMS @F95@ 0 @I297@ INDI 1 NAME Henry /Lascelles/ 1 SEX M 1 BIRT 2 DATE 1953 1 FAMS @F368@ 1 FAMC @F95@ 0 @I298@ INDI 1 NAME William of_Hesse-Cassel // 1 TITL Landgrave 1 SEX M 1 BIRT 2 DATE 1787 1 DEAT 2 DATE 1867 1 FAMS @F96@ 1 FAMC @F97@ 0 @I299@ INDI 1 NAME Louise Charlotte of_Denmark// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1789 1 DEAT 2 DATE 1864 1 FAMS @F96@ 1 FAMC @F642@ 0 @I300@ INDI 1 NAME Other_issue // 1 SEX M 1 FAMC @F96@ 0 @I301@ INDI 1 NAME Frederick of_Hesse-Cassel // 1 TITL Landgrave 1 SEX M 1 BIRT 2 DATE 1747 1 DEAT 2 DATE 1837 1 FAMS @F97@ 1 FAMC @F622@ 0 @I302@ INDI 1 NAME Caroline of_Nassau- Usingen// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1762 1 DEAT 2 DATE 1823 1 FAMS @F97@ 0 @I303@ INDI 1 NAME Alexander of_Wurttemberg // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1804 1 DEAT 2 DATE 1885 1 FAMS @F98@ 1 FAMC @F170@ 0 @I304@ INDI 1 NAME Claudine // 1 TITL Countess Rhedey 1 SEX F 1 BIRT 2 DATE 1814 1 DEAT 2 DATE 1841 1 FAMS @F98@ 0 @I305@ INDI 1 NAME Claudine // 1 TITL Princess of Teck 1 SEX F 1 BIRT 2 DATE 1836 1 DEAT 2 DATE 1894 1 FAMC @F98@ 0 @I306@ INDI 1 NAME Amelie // 1 TITL Princess of Teck 1 SEX F 1 BIRT 2 DATE 1838 1 DEAT 2 DATE 1893 1 FAMS @F99@ 1 FAMC @F98@ 0 @I307@ INDI 1 NAME Paul /von_Hugel/ 1 TITL Baron 1 SEX M 1 BIRT 2 DATE 1835 1 DEAT 2 DATE 1897 1 FAMS @F99@ 0 @I308@ INDI 1 NAME Paul /von_Hugel/ 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1912 1 FAMC @F99@ 0 @I309@ INDI 1 NAME Ferdinand_I of_Hohenzollern- Sigmaringen/Hohenzollern/ 1 TITL King of Romania 1 SEX M 1 BIRT 2 DATE 24 AUG 1865 2 PLAC Sigmaringen,Germany 1 DEAT 2 DATE 20 JUL 1927 2 PLAC Sinaia,Romania 1 FAMS @F100@ 1 FAMC @F416@ 0 @I310@ INDI 1 NAME Christian Victor // 1 SEX M 1 BIRT 2 DATE 1867 1 DEAT 2 DATE 1900 1 FAMC @F32@ 0 @I311@ INDI 1 NAME Albert of_Schleswig- Holstein// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1931 1 FAMC @F32@ 0 @I312@ INDI 1 NAME Helena Victoria // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1948 1 FAMC @F32@ 0 @I313@ INDI 1 NAME Frederick Harold // 1 SEX M 1 BIRT 2 DATE 12 MAY 1876 1 DEAT 2 DATE 20 MAY 1876 1 FAMC @F32@ 0 @I314@ INDI 1 NAME Patricia /Tuckwell/ 1 SEX F 1 BIRT 2 DATE 1923 1 FAMS @F101@ 1 FAMS @F1412@ 0 @I315@ INDI 1 NAME Mark /Lascelles/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1964 1 FAMC @F101@ 0 @I316@ INDI 1 NAME Elizabeth Collingwood /Colvin/ 1 SEX F 1 BIRT 2 DATE 1924 1 FAMS @F102@ 0 @I317@ INDI 1 NAME Davina Elizabeth Alice/Windsor/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 19 NOV 1977 1 CHR 2 PLAC Barnwell Church,,England 1 FAMC @F23@ 0 @I318@ INDI 1 NAME Rose Victoria Birgitte/Windsor/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1 MAR 1980 2 PLAC St. Marys Hosp.,Paddington,England 1 CHR 2 DATE 13 JUL 1980 2 PLAC Barnwell Church,,England 1 FAMC @F23@ 0 @I319@ INDI 1 NAME Marie-Christine /von_Reibnitz/ 1 TITL Baroness 1 SEX F 1 BIRT 2 DATE 15 JAN 1945 2 PLAC Czechoslovakia 1 FAMS @F295@ 1 FAMS @F103@ 0 @I320@ INDI 1 NAME Frederick /Windsor/ 1 TITL Lord 1 SEX M 1 BIRT 2 DATE 6 APR 1979 2 PLAC St. Mary's Hosp.,Paddington,London,England 1 CHR 2 DATE 11 JUL 1979 2 PLAC Chapel Royal,St. James Palace,England 1 FAMC @F103@ 0 @I321@ INDI 1 NAME George_II /Hanover/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 30 OCT 1683 2 PLAC Herrenhausen,Palace,Hannover,Germany 1 DEAT 2 DATE 25 OCT 1760 2 PLAC Kensington,Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 REFN 16 1 FAMS @F104@ 1 FAMC @F106@ 0 @I322@ INDI 1 NAME Caroline of_Ansbach // 1 SEX F 1 BIRT 2 DATE 1683 1 DEAT 2 DATE 1737 1 REFN 17 1 FAMS @F104@ 1 FAMC @F661@ 0 @I323@ INDI 1 NAME Frederick Louis /Hanover/ 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE 31 JAN 1701 2 PLAC Hanover 1 DEAT 2 DATE 31 MAR 1751 2 PLAC Leicester-House,,London,England 1 REFN 8 1 FAMS @F105@ 1 FAMC @F104@ 0 @I324@ INDI 1 NAME Anne /Hanover/ 1 TITL Princess Royal 1 SEX F 1 BIRT 2 DATE 2 NOV 1709 2 PLAC Herrenhausen 1 DEAT 2 DATE 12 JAN 1759 2 PLAC The Hague 1 FAMS @F238@ 1 FAMC @F104@ 0 @I325@ INDI 1 NAME Amelia Sophia Eleanor/Hanover/ 1 SEX F 1 BIRT 2 DATE 10 JUL 1711 2 PLAC Herrenhausen 1 DEAT 2 DATE 31 OCT 1786 2 PLAC Cavendish Square,,London,England 1 FAMC @F104@ 0 @I326@ INDI 1 NAME Caroline Elizabeth /Hanover/ 1 SEX F 1 BIRT 2 DATE 21 JUN 1713 2 PLAC Herrenhausen 1 DEAT 2 DATE 28 DEC 1757 2 PLAC St. James Palace,,,England 1 FAMC @F104@ 0 @I327@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE 20 NOV 1716 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 20 NOV 1716 2 PLAC St. James Palace,London,England 1 FAMC @F104@ 0 @I328@ INDI 1 NAME George William /Hanover/ 1 SEX M 1 BIRT 2 DATE 13 NOV 1717 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 17 FEB 1718 2 PLAC Kensington,Palace,London,England 1 FAMC @F104@ 0 @I329@ INDI 1 NAME William Augustus of_Cumberland/Hanover/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 26 APR 1721 2 PLAC Leicester House 1 DEAT 2 DATE 31 OCT 1765 2 PLAC London,,,England 1 FAMC @F104@ 0 @I330@ INDI 1 NAME Mary /Hanover/ 1 SEX F 1 BIRT 2 DATE 5 MAR 1723 2 PLAC Leicester House 1 DEAT 2 DATE 14 JAN 1772 2 PLAC Hanau 1 FAMS @F622@ 1 FAMC @F104@ 0 @I331@ INDI 1 NAME Louisa /Hanover/ 1 SEX F 1 BIRT 2 DATE 18 DEC 1724 2 PLAC Leicester House,London,England 1 DEAT 2 DATE 19 DEC 1751 2 PLAC Christiansborg,Denmark 1 FAMS @F107@ 1 FAMC @F104@ 0 @I332@ INDI 1 NAME Augusta of_Saxe-Gotha // 1 SEX F 1 BIRT 2 DATE 30 NOV 1719 2 PLAC Gotha 1 DEAT 2 DATE 8 FEB 1772 2 PLAC Carlton House 1 REFN 9 1 FAMS @F105@ 1 FAMC @F956@ 0 @I333@ INDI 1 NAME Augusta /Hanover/ 1 SEX F 1 BIRT 2 DATE 12 AUG 1737 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 23 MAR 1813 2 PLAC London,England 1 FAMS @F501@ 1 FAMC @F105@ 0 @I334@ INDI 1 NAME Edward Augustus /Hanover/ 1 TITL Duke of York 1 SEX M 1 BIRT 2 DATE 25 MAR 1739 2 PLAC Norfolk House 1 DEAT 2 DATE 17 SEP 1767 2 PLAC Monaco 1 FAMC @F105@ 0 @I335@ INDI 1 NAME Elizabeth Caroline /Hanover/ 1 SEX F 1 BIRT 2 DATE 10 JAN 1741 1 DEAT 2 DATE 4 SEP 1759 2 PLAC Kew Palace 1 FAMC @F105@ 0 @I336@ INDI 1 NAME Edward Henry of_Gloucester/Hanover/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 25 NOV 1743 2 PLAC Leicester House 1 DEAT 2 DATE 25 AUG 1805 2 PLAC Gloucester House 1 FAMS @F279@ 1 FAMC @F105@ 0 @I337@ INDI 1 NAME Henry Frederick of_Cumberland/Hanover/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 7 NOV 1745 2 PLAC Leicester House 1 DEAT 2 DATE 18 SEP 1790 2 PLAC London,,,England 1 FAMS @F280@ 1 FAMC @F105@ 0 @I338@ INDI 1 NAME Louisa Anne /Hanover/ 1 SEX F 1 BIRT 2 DATE 19 MAR 1749 2 PLAC Leicester House 1 DEAT 2 DATE 13 MAY 1768 2 PLAC Carlton House 1 FAMC @F105@ 0 @I339@ INDI 1 NAME Frederick William /Hanover/ 1 SEX M 1 BIRT 2 DATE 24 MAY 1750 2 PLAC Leicester House 1 DEAT 2 DATE 29 DEC 1765 2 PLAC Leicester House 1 FAMC @F105@ 0 @I340@ INDI 1 NAME Caroline Matilda /Hanover/ 1 SEX F 1 BIRT 2 DATE 22 JUL 1751 2 PLAC Leicester House 1 DEAT 2 DATE 10 MAY 1775 2 PLAC Celle 1 BURI 2 PLAC Celle 1 FAMS @F281@ 1 FAMC @F105@ 0 @I341@ INDI 1 NAME George_I /Hanover/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 28 MAY 1660 2 PLAC Leineschloss,Osnabruck,Hanover,Germany 1 DEAT 2 DATE 11 JUN 1727 2 PLAC Osnabruck 1 BURI 2 PLAC Moved in 1957 to,Herrenhausen 1 REFN 32 1 FAMS @F106@ 1 FAMC @F266@ 0 @I342@ INDI 1 NAME Sophia Dorothea of_Celle// 1 SEX F 1 BIRT 2 DATE 10 SEP 1666 1 DEAT 2 DATE 13 NOV 1726 1 BURI 2 PLAC Celle 1 REFN 33 1 FAMS @F106@ 1 FAMC @F955@ 0 @I343@ INDI 1 NAME Sophia Dorothea /Hanover/ 1 SEX F 1 BIRT 2 DATE 26 MAR 1687 2 PLAC Hanover 1 DEAT 2 DATE 28 JUN 1757 2 PLAC Monbijou Palace,,Berlin,Germany 1 FAMS @F435@ 1 FAMC @F106@ 0 @I344@ INDI 1 NAME Frederick_V // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 31 MAR 1723 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 14 JAN 1766 2 PLAC Christiansborg 1 FAMS @F107@ 1 FAMS @F630@ 1 FAMC @F631@ 0 @I345@ INDI 1 NAME Frederick William of_Schleswig-// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1785 1 DEAT 2 DATE 1831 1 FAMS @F108@ 0 @I346@ INDI 1 NAME Louise Caroline of_Hesse-Cassel// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1789 1 DEAT 2 DATE 1867 1 FAMS @F108@ 1 FAMC @F641@ 0 @I347@ INDI 1 NAME Alexander of_Hesse and_the_Rhine// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1823 1 DEAT 2 DATE 1888 1 FAMS @F109@ 1 FAMC @F110@ 0 @I348@ INDI 1 NAME Julia of_Battenberg /von_Hauke/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1825 1 DEAT 2 DATE 1895 1 FAMS @F109@ 1 FAMC @F111@ 0 @I349@ INDI 1 NAME Louis_II of_Hesse and_the_Rhine// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1777 1 DEAT 2 DATE 1848 1 FAMS @F110@ 1 FAMC @F1371@ 0 @I350@ INDI 1 NAME Wilhelmina of_Baden // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1788 1 DEAT 2 DATE 1836 1 FAMS @F110@ 0 @I351@ INDI 1 NAME John Maurice /von_Hauke/ 1 TITL Count 1 SEX M 1 DEAT 2 DATE 1830 1 FAMS @F111@ 0 @I352@ INDI 1 NAME Sophie /la_Fontaine/ 1 SEX F 1 DEAT 2 DATE 1831 1 FAMS @F111@ 0 @I353@ INDI 1 NAME Constantine Nikolaievitch of_Russia// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1827 1 DEAT 2 DATE 1892 1 FAMS @F112@ 1 FAMC @F10@ 0 @I354@ INDI 1 NAME Elizabeth Alexandra of_Saxe-// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1830 1 DEAT 2 DATE 1911 1 FAMS @F112@ 1 FAMC @F113@ 0 @I355@ INDI 1 NAME Joseph of_Saxe- Altenburg// 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1868 1 FAMS @F113@ 0 @I356@ INDI 1 NAME Amalie of_Wurttemberg // 1 TITL Duchess 1 SEX F 1 DEAT 2 DATE 1848 1 FAMS @F113@ 1 FAMC @F170@ 0 @I357@ INDI 1 NAME Charles of_Hesse // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1809 1 DEAT 2 DATE 1877 1 FAMS @F114@ 1 FAMC @F110@ 0 @I358@ INDI 1 NAME Elizabeth of_Prussia // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1815 1 DEAT 2 DATE 1885 1 FAMS @F114@ 1 FAMC @F1235@ 0 @I359@ INDI 1 NAME Charles William Frederick/Cavendish-Bentwi/ 1 TITL Reverend 1 SEX M 1 DEAT 2 DATE 1865 0 @I360@ INDI 1 NAME William Charles Augustus/Cavendish-Bentin/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1826 1 FAMS @F115@ 0 @I361@ INDI 1 NAME Anne /Wellesley/ 1 SEX F 1 DEAT 2 DATE 1875 1 FAMS @F115@ 1 FAMC @F803@ 0 @I362@ INDI 1 NAME Edwyn /Burnaby/ 1 SEX M 1 DEAT 2 DATE 1867 1 FAMS @F116@ 0 @I363@ INDI 1 NAME Anne Caroline /Salisbury/ 1 SEX F 1 DEAT 2 DATE 1881 1 FAMS @F116@ 0 @I364@ INDI 1 NAME Oswald /Smith/ 1 SEX M 1 DEAT 2 DATE 1863 1 FAMS @F117@ 0 @I365@ INDI 1 NAME Henrietta Mildred /Hodgson/ 1 SEX F 1 FAMS @F117@ 0 @I366@ INDI 1 NAME Albert Edward John/Spencer/ 1 TITL Earl of Spencer 1 SEX M 1 BIRT 2 DATE 1892 1 DEAT 2 DATE 1975 1 FAMS @F118@ 1 FAMC @F133@ 0 @I367@ INDI 1 NAME Cynthia Elinor Beatrix/Hamilton/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1897 1 DEAT 2 DATE 1972 1 FAMS @F118@ 1 FAMC @F127@ 0 @I368@ INDI 1 NAME Edmund Maurice /Burke_Roche/ 1 TITL Baron Fermoy 1 SEX M 1 BIRT 2 DATE 1885 1 DEAT 2 DATE 1955 1 FAMS @F119@ 1 FAMC @F120@ 0 @I369@ INDI 1 NAME Ruth Sylvia /Gill/ 1 SEX F 1 BIRT 2 DATE 1908 1 FAMS @F119@ 1 FAMC @F130@ 0 @I370@ INDI 1 NAME James Boothby /Burke_Roche/ 1 TITL Baron Fermoy 1 SEX M 1 BIRT 2 DATE 1851 1 DEAT 2 DATE 1920 1 FAMS @F120@ 1 FAMC @F124@ 0 @I371@ INDI 1 NAME Frances Ellen /Work/ 1 SEX F 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1947 1 FAMS @F120@ 1 FAMC @F121@ 0 @I372@ INDI 1 NAME Frank /Work/ 1 SEX M 1 BIRT 2 DATE 1819 1 DEAT 2 DATE 1911 1 FAMS @F121@ 1 FAMC @F123@ 0 @I373@ INDI 1 NAME Ellen /Wood/ 1 SEX F 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1877 1 FAMS @F121@ 1 FAMC @F122@ 0 @I374@ INDI 1 NAME John /Wood/ 1 SEX M 1 DEAT 2 DATE 1847 1 FAMS @F122@ 0 @I375@ INDI 1 NAME Ellen /Strong/ 1 SEX F 1 DEAT 2 DATE 1863 1 FAMS @F122@ 0 @I376@ INDI 1 NAME John /Work/ 1 SEX M 1 FAMS @F123@ 0 @I377@ INDI 1 NAME Sarah /Boude/ 1 SEX F 1 FAMS @F123@ 0 @I378@ INDI 1 NAME Edmund /Burke_Roche/ 1 TITL Baron Fermoy 1 SEX M 1 BIRT 2 DATE 1815 1 DEAT 2 DATE 1874 1 FAMS @F124@ 1 FAMC @F126@ 0 @I379@ INDI 1 NAME Elizabeth Caroline /Boothby/ 1 SEX F 1 BIRT 2 DATE 1821 1 DEAT 2 DATE 1897 1 FAMS @F124@ 1 FAMC @F125@ 0 @I380@ INDI 1 NAME James Brownell /Boothby/ 1 SEX M 1 DEAT 2 DATE 1850 1 FAMS @F125@ 0 @I381@ INDI 1 NAME Charlotte /Cunningham/ 1 SEX F 1 DEAT 2 DATE 1893 1 FAMS @F125@ 0 @I382@ INDI 1 NAME Edward /Roche/ 1 SEX M 1 DEAT 2 DATE 1855 1 FAMS @F126@ 0 @I383@ INDI 1 NAME Margaret Honoria /Curtain/ 1 SEX F 1 DEAT 2 DATE 1862 1 FAMS @F126@ 0 @I384@ INDI 1 NAME James Albert Edward/Hamilton/ 1 TITL Duke of Abercorn 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1953 1 FAMS @F127@ 1 FAMC @F128@ 0 @I385@ INDI 1 NAME Rosalind Cecilia Caroline/Bingham/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1958 1 FAMS @F127@ 1 FAMC @F129@ 0 @I386@ INDI 1 NAME James /Hamilton/ 1 TITL Duke of Abercorn 1 SEX M 1 BIRT 2 DATE 1838 1 DEAT 2 DATE 1913 1 FAMS @F128@ 1 FAMC @F288@ 0 @I387@ INDI 1 NAME Mary Anna /Curzon-Howe/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1848 1 DEAT 2 DATE 1929 1 FAMS @F128@ 1 FAMC @F287@ 0 @I388@ INDI 1 NAME George /Bingham/ 1 TITL Earl of Lucan 1 SEX M 1 BIRT 2 DATE 1830 1 DEAT 2 DATE 1914 1 FAMS @F129@ 1 FAMC @F289@ 0 @I389@ INDI 1 NAME Cecilia Catherine /Gordon-Lennox/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1838 1 DEAT 2 DATE 1910 1 FAMS @F129@ 1 FAMC @F290@ 0 @I390@ INDI 1 NAME William Smith /Gill/ 1 SEX M 1 BIRT 2 DATE 1865 1 DEAT 2 DATE 1957 1 FAMS @F130@ 1 FAMC @F131@ 0 @I391@ INDI 1 NAME Ruth /Littlejohn/ 1 SEX F 1 BIRT 2 DATE 1879 1 DEAT 2 DATE 1964 1 FAMS @F130@ 1 FAMC @F132@ 0 @I392@ INDI 1 NAME Alexander Ogston /Gill/ 1 SEX M 1 BIRT 2 DATE 1833 1 DEAT 2 DATE 1908 1 FAMS @F131@ 1 FAMC @F291@ 0 @I393@ INDI 1 NAME Barbara Smith /Marr/ 1 SEX F 1 BIRT 2 DATE 1843 1 FAMS @F131@ 1 FAMC @F292@ 0 @I394@ INDI 1 NAME David /Littlejohn/ 1 SEX M 1 BIRT 2 DATE 1841 1 DEAT 2 DATE 1924 1 FAMS @F132@ 1 FAMC @F293@ 0 @I395@ INDI 1 NAME Jane /Crombie/ 1 SEX F 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1917 1 FAMS @F132@ 1 FAMC @F294@ 0 @I396@ INDI 1 NAME Charles Robert /Spencer/ 1 TITL Earl of Spencer 1 SEX M 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1922 1 FAMS @F133@ 1 FAMC @F134@ 0 @I397@ INDI 1 NAME Margaret /Baring/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1906 1 FAMS @F133@ 1 FAMC @F135@ 0 @I398@ INDI 1 NAME Frederick /Spencer/ 1 TITL Earl of Spencer 1 SEX M 1 BIRT 2 DATE 1798 1 DEAT 2 DATE 1857 1 FAMS @F134@ 1 FAMS @F683@ 1 FAMC @F285@ 0 @I399@ INDI 1 NAME Adelaide Horatia Elizabeth/Seymour/ 1 SEX F 1 BIRT 2 DATE 1825 1 DEAT 2 DATE 1877 1 FAMS @F134@ 1 FAMC @F284@ 0 @I400@ INDI 1 NAME Edward Charles /Baring/ 1 TITL Baron Revelstoke 1 SEX M 1 BIRT 2 DATE 1828 1 DEAT 2 DATE 1897 1 FAMS @F135@ 1 FAMC @F286@ 0 @I401@ INDI 1 NAME Louisa Emily Charlotte/Bulteel/ 1 SEX F 1 BIRT 2 DATE 1839 1 DEAT 2 DATE 1892 1 FAMS @F135@ 1 FAMC @F283@ 0 @I402@ INDI 1 NAME Augusta of_Schleswig- Holstein-// 1 SEX F 1 BIRT 2 DATE 22 OCT 1858 2 PLAC Dolzig 1 DEAT 2 DATE 11 APR 1921 2 PLAC Haus Doorn,Netherlands 1 FAMS @F136@ 0 @I403@ INDI 1 NAME Bernard of_Saxe- Meiningen// 1 SEX M 1 BIRT 2 DATE 1851 1 DEAT 2 DATE 1928 1 FAMS @F137@ 0 @I404@ INDI 1 NAME Adolphus of_Schaumburg- Lippe// 1 SEX M 1 BIRT 2 DATE 1859 1 DEAT 2 DATE 1916 1 FAMS @F138@ 0 @I405@ INDI 1 NAME Constantine_I /Oldenburg/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 2 AUG 1868 2 PLAC Athens,Greece 1 DEAT 2 DATE 11 JAN 1923 2 PLAC Palermo,Italy 1 BURI 2 DATE NOV 1936 2 PLAC Tatoi,Near Athens,Greece 1 FAMS @F139@ 1 FAMC @F75@ 0 @I406@ INDI 1 NAME Frederick Charles of_Hesse// 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1940 1 FAMS @F140@ 0 @I407@ INDI 1 NAME Victoria of_Schleswig- Holstein// 1 TITL Princess 1 SEX F 1 FAMS @F141@ 0 @I408@ INDI 1 NAME Irene /Denison/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 16 JUL 1956 1 BURI 2 PLAC Whippingham Ch.,Isle of Wight,,England 1 FAMS @F142@ 1 FAMC @F966@ 0 @I409@ INDI 1 NAME Alfonso_XIII // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1886 1 DEAT 2 DATE 1941 2 PLAC ,,Portugal 1 FAMS @F143@ 1 FAMC @F254@ 0 @I410@ INDI 1 NAME Louise of_Mecklenburg- Strelitz// 1 SEX F 1 BIRT 2 DATE 1776 1 DEAT 2 DATE 1810 1 FAMS @F145@ 0 @I411@ INDI 1 NAME Frederick William_IV // 1 TITL King of Prussia 1 SEX M 1 BIRT 2 DATE 15 OCT 1795 2 PLAC Berlin,Germany 1 DEAT 2 DATE 2 JAN 1861 1 FAMS @F434@ 1 FAMC @F145@ 0 @I412@ INDI 1 NAME William_I of_Germany // 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 22 MAR 1797 2 PLAC Berlin,Germany 1 DEAT 2 DATE 9 MAR 1888 2 PLAC Berlin,Germany 1 FAMS @F147@ 1 FAMC @F145@ 0 @I413@ INDI 1 NAME Frederica // 1 SEX F 1 BIRT 2 DATE 1799 1 DEAT 2 DATE 1800 1 FAMC @F145@ 0 @I414@ INDI 1 NAME Charles // 1 SEX M 1 BIRT 2 DATE 1801 1 DEAT 2 DATE 1883 1 FAMS @F184@ 1 FAMC @F145@ 0 @I415@ INDI 1 NAME Charles // 1 SEX M 1 BIRT 2 DATE 1766 1 DEAT 2 DATE 1806 1 FAMS @F1257@ 0 @I416@ INDI 1 NAME Ferdinand // 1 SEX M 1 BIRT 2 DATE 1804 1 DEAT 2 DATE 1806 1 FAMC @F145@ 0 @I417@ INDI 1 NAME Charlemagne // 1 TITL King of Franks 1 SEX M 1 BIRT 2 DATE 2 APR 742 2 PLAC Aachen,West Germany 1 DEAT 2 DATE 814 1 FAMS @F182@ 1 FAMS @F664@ 1 FAMS @F1202@ 1 FAMS @F1203@ 1 FAMS @F1204@ 1 FAMC @F1225@ 0 @I418@ INDI 1 NAME Albert of_Prussia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1809 1 DEAT 2 DATE 1872 1 FAMS @F180@ 1 FAMS @F181@ 1 FAMC @F145@ 0 @I419@ INDI 1 NAME Hermine of_Reuss // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 17 DEC 1887 2 PLAC Greiz 1 DEAT 2 DATE 7 AUG 1947 2 PLAC Frankfurt an der,Oder 1 FAMS @F278@ 1 FAMS @F146@ 0 @I420@ INDI 1 NAME William // 1 TITL Crown Prince 1 SEX M 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1951/1952 1 FAMS @F186@ 1 FAMC @F136@ 0 @I421@ INDI 1 NAME Eitel Frederick // 1 SEX M 1 BIRT 2 DATE 1883 1 DEAT 2 DATE 1942/1943 1 FAMS @F193@ 1 FAMC @F136@ 0 @I422@ INDI 1 NAME Adalbert // 1 SEX M 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1948 1 FAMS @F194@ 1 FAMC @F136@ 0 @I423@ INDI 1 NAME Augustus William // 1 SEX M 1 BIRT 2 DATE 1887 1 DEAT 2 DATE 1949 1 FAMS @F195@ 1 FAMC @F136@ 0 @I424@ INDI 1 NAME Oscar // 1 SEX M 1 BIRT 2 DATE 1888 1 DEAT 2 DATE 1958 1 FAMS @F196@ 1 FAMC @F136@ 0 @I425@ INDI 1 NAME Joachim // 1 SEX M 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 1920 1 FAMS @F197@ 1 FAMC @F136@ 0 @I426@ INDI 1 NAME Victoria Louise of_Prussia// 1 SEX F 1 BIRT 2 DATE 1892 1 DEAT 2 DATE 1980 1 FAMS @F198@ 1 FAMC @F136@ 0 @I427@ INDI 1 NAME Augusta of_Saxe-Weimar // 1 SEX F 1 BIRT 2 DATE 1811 1 DEAT 2 DATE 1890 1 FAMS @F147@ 0 @I428@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1828 1 DEAT 2 DATE 1923 1 FAMS @F148@ 1 FAMC @F147@ 0 @I429@ INDI 1 NAME Frederick of_Baden // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1826 1 DEAT 2 DATE 1907 1 FAMS @F148@ 0 @I430@ INDI 1 NAME Alphonso of_Cavadonga // 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1907 1 DEAT 2 DATE 1938 1 FAMS @F1248@ 1 FAMS @F1249@ 1 FAMC @F143@ 0 @I431@ INDI 1 NAME Don Jamie // 1 SEX M 1 FAMC @F143@ 0 @I432@ INDI 1 NAME Don Juan of_Spain// 1 SEX M 1 BIRT 2 DATE JUN 1913 2 PLAC San Ildefonso,,Spain 1 FAMS @F149@ 1 FAMC @F143@ 0 @I433@ INDI 1 NAME Beatrice // 1 SEX F 1 BIRT 2 DATE 1909 1 FAMS @F1251@ 1 FAMC @F143@ 0 @I434@ INDI 1 NAME Maria de_las_Mercedes of_Bourbon// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1910 2 PLAC Madrid,,Spain 1 FAMS @F149@ 1 FAMC @F1245@ 0 @I435@ INDI 1 NAME Juan Carlos // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1938 1 FAMS @F152@ 1 FAMC @F149@ 0 @I436@ INDI 1 NAME Marie (Mignon) /Hohenzollern/ 1 SEX F 1 BIRT 2 DATE 1900 1 DEAT 2 DATE 1961 1 FAMS @F151@ 1 FAMC @F100@ 0 @I437@ INDI 1 NAME Elizabeth of_Romania /Hohenzollern/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 12 OCT 1894 2 PLAC Pelesch 1 DEAT 2 DATE 14 NOV 1956 2 PLAC Cannes,France 1 FAMS @F150@ 1 FAMC @F100@ 0 @I438@ INDI 1 NAME Carol_II /Hohenzollern/ 1 TITL King of Romania 1 SEX M 1 BIRT 2 DATE 15 OCT 1893 2 PLAC Castle Pelesch,Sinaia,Romania 1 DEAT 2 DATE 4 APR 1953 2 PLAC Villa Mar y Sol,Estoril,Portugal 1 FAMS @F364@ 1 FAMS @F160@ 1 FAMS @F401@ 1 FAMC @F100@ 0 @I439@ INDI 1 NAME George_II /Oldenburg/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 19 JUL 1890 2 PLAC Tatoi,Near Athens,Greece 1 DEAT 2 DATE 1 APR 1947 2 PLAC Athens,Greece 1 BURI 2 PLAC Tatoi,Near Athens,Greece 1 FAMS @F150@ 1 FAMC @F139@ 0 @I440@ INDI 1 NAME Alexander_I of_Yugoslavia // 1 TITL King 1 SEX M 1 BIRT 2 DATE 1888 1 DEAT 2 DATE 1934 1 FAMS @F151@ 1 FAMC @F1195@ 0 @I441@ INDI 1 NAME Sophia of_Greece /Oldenburg/ 1 SEX F 1 BIRT 2 DATE 1938 1 FAMS @F152@ 1 FAMC @F162@ 0 @I442@ INDI 1 NAME Helen // 1 SEX F 1 BIRT 2 DATE 1963 1 FAMC @F152@ 0 @I443@ INDI 1 NAME Christine // 1 SEX F 1 BIRT 2 DATE 1965 1 FAMC @F152@ 0 @I444@ INDI 1 NAME Philip of_Asturias // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1968 1 FAMC @F152@ 0 @I445@ INDI 1 NAME Gustav Adolf // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1906 1 DEAT 2 DATE 1947 1 FAMS @F217@ 1 FAMC @F35@ 0 @I446@ INDI 1 NAME Erik of_Vastmanland // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1918 1 FAMC @F155@ 0 @I447@ INDI 1 NAME Sigvard Oscar Fredrik// 1 TITL Count of Wisborg 1 SEX M 1 BIRT 2 DATE 7 JUN 1907 1 FAMS @F1291@ 1 FAMS @F1292@ 1 FAMS @F1289@ 1 FAMC @F35@ 0 @I448@ INDI 1 NAME Bertil Gustaf Oscar// 1 TITL Prince of Sweden 1 SEX M 1 BIRT 2 DATE 28 FEB 1912 1 FAMS @F1290@ 1 FAMC @F35@ 0 @I449@ INDI 1 NAME Carl Johan Arthur// 1 TITL Count of Wisborg 1 SEX M 1 BIRT 2 DATE 31 OCT 1916 1 FAMS @F1293@ 1 FAMS @F1294@ 1 FAMC @F35@ 0 @I450@ INDI 1 NAME Olav_V // 1 TITL King of Norway 1 SEX M 1 BIRT 2 DATE 2 JUL 1903 2 PLAC Appleton House,Sandringham,Norfolk,England 1 DEAT 2 DATE 17 JAN 1991 2 PLAC Norway 1 FAMS @F153@ 1 FAMC @F21@ 0 @I451@ INDI 1 NAME Martha of_Sweden // 1 TITL Crown Princess 1 SEX F 1 BIRT 2 DATE 1901 1 DEAT 2 DATE 1954 1 FAMS @F153@ 1 FAMC @F215@ 0 @I452@ INDI 1 NAME Harald // 1 TITL Crown Prince 1 SEX M 1 BIRT 2 DATE 21 FEB 1937 2 PLAC Skaugum,Near Oslo,Norway 1 FAMS @F154@ 1 FAMC @F153@ 0 @I453@ INDI 1 NAME Sonja /Haraldsen/ 1 TITL Crown Princess 1 SEX F 1 BIRT 2 DATE 1937 1 FAMS @F154@ 1 FAMC @F1282@ 0 @I454@ INDI 1 NAME Martha Louise // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1971 1 FAMC @F154@ 0 @I455@ INDI 1 NAME Haakon of_Norway /Magnus/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1973 1 FAMC @F154@ 0 @I456@ INDI 1 NAME Gustav_V // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 16 JUN 1858 2 PLAC Drottningholm,Near Stockholm,Sweden 1 DEAT 2 DATE 29 OCT 1950 2 PLAC Drottningholm,Near Stockholm,Sweden 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F155@ 1 FAMC @F156@ 0 @I457@ INDI 1 NAME Victoria of_Baden // 1 TITL Sweden 1 SEX F 1 BIRT 2 DATE 7 AUG 1862 2 PLAC Karlsruhe 1 DEAT 2 DATE 4 APR 1930 2 PLAC Rome,Italy 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F155@ 0 @I458@ INDI 1 NAME Oscar_II // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 21 JAN 1829 2 PLAC Stockholm,Sweden 1 DEAT 2 DATE 8 DEC 1907 2 PLAC Stockholm,Sweden 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F156@ 1 FAMC @F627@ 0 @I459@ INDI 1 NAME Sophia // 1 SEX F 1 BIRT 2 DATE 9 JUL 1836 2 PLAC Biebrich 1 DEAT 2 DATE 30 DEC 1913 2 PLAC Stockholm,Sweden 1 FAMS @F156@ 1 FAMC @F209@ 0 @I460@ INDI 1 NAME Eleonore of_Solms- Hohensolms-Lich// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1871 1 DEAT 2 DATE 1937 1 FAMS @F157@ 0 @I461@ INDI 1 NAME George Donatus of_Hesse// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1906 1 DEAT 2 DATE 1937 1 FAMS @F158@ 1 FAMC @F157@ 0 @I462@ INDI 1 NAME Louis // 1 SEX M 1 BIRT 2 DATE 1908 1 DEAT 2 DATE 1968 1 FAMS @F159@ 1 FAMC @F157@ 0 @I463@ INDI 1 NAME Cecilie of_Greece /Mountbatten/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1911 1 DEAT 2 DATE 1937 1 FAMS @F158@ 1 FAMC @F28@ 0 @I464@ INDI 1 NAME Margaret /Campbell-Geddes/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1913 1 FAMS @F159@ 1 FAMC @F1242@ 0 @I465@ INDI 1 NAME Christopher /Oldenburg/ 1 SEX M 1 BIRT 2 DATE 1888 1 DEAT 2 DATE 1940 1 FAMS @F1334@ 1 FAMS @F1335@ 1 FAMC @F75@ 0 @I466@ INDI 1 NAME George /Oldenburg/ 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1957 1 FAMS @F1276@ 1 FAMC @F75@ 0 @I467@ INDI 1 NAME Olga // 1 SEX F 1 FAMC @F75@ 0 @I468@ INDI 1 NAME Michael /Hohenzollern/ 1 TITL King of Romania 1 SEX M 1 BIRT 2 DATE 25 OCT 1921 2 PLAC Pelesch,Sinaia,Romania 1 FAMS @F161@ 1 FAMC @F160@ 0 @I469@ INDI 1 NAME Anne of_Bourbon-Parma // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 18 SEP 1923 2 PLAC Paris,France 1 FAMS @F161@ 1 FAMC @F399@ 0 @I470@ INDI 1 NAME Frederica of_Hanover /Hanover/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 18 APR 1917 2 PLAC Blankenburg,Harz,Germany 1 DEAT 2 DATE 6 FEB 1981 2 PLAC Madrid,Spain 1 BURI 2 PLAC Tatoi 1 FAMS @F162@ 1 FAMC @F198@ 0 @I471@ INDI 1 NAME Constantine_II /Oldenburg/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 2 JUN 1940 2 PLAC Psychiko 1 FAMS @F163@ 1 FAMC @F162@ 0 @I472@ INDI 1 NAME Anne-Marie of_Denmark // 1 SEX F 1 BIRT 2 DATE 30 AUG 1946 2 PLAC Copenhagen,Denmark 1 FAMS @F163@ 1 FAMC @F402@ 0 @I473@ INDI 1 NAME Aspasia /Manos/ 1 SEX F 1 BIRT 2 DATE 4 SEP 1896 2 PLAC Athens,Greece 1 DEAT 2 DATE 7 AUG 1972 2 PLAC Venice,Italy 1 FAMS @F164@ 1 FAMC @F403@ 0 @I474@ INDI 1 NAME Alexandra of_Greece // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1921 1 FAMS @F165@ 1 FAMC @F164@ 0 @I475@ INDI 1 NAME Peter_II of_Yugoslavia // 1 TITL King 1 SEX M 1 BIRT 2 DATE 6 SEP 1923 2 PLAC Belgrade 1 DEAT 2 DATE 1970 1 FAMS @F165@ 1 FAMC @F151@ 0 @I476@ INDI 1 NAME Sophia // 1 SEX F 1 BIRT 2 DATE 1914 1 FAMS @F168@ 1 FAMS @F169@ 1 FAMC @F28@ 0 @I477@ INDI 1 NAME Gottfried of_Hohenlohe- Lagenburg// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1897 1 DEAT 2 DATE 1960 1 FAMS @F166@ 0 @I478@ INDI 1 NAME Five_children // 1 SEX M 1 FAMC @F166@ 0 @I479@ INDI 1 NAME Berthold of_Baden // 1 TITL Margrave 1 SEX M 1 BIRT 2 DATE 1906 1 DEAT 2 DATE 1963 1 FAMS @F167@ 0 @I480@ INDI 1 NAME Four_Children // 1 SEX M 1 FAMC @F167@ 0 @I481@ INDI 1 NAME Christopher of_Hesse // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1901 1 DEAT 2 DATE 1944 1 FAMS @F168@ 0 @I482@ INDI 1 NAME George William of_Hanover// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1915 1 FAMS @F169@ 0 @I483@ INDI 1 NAME Eight_children // 1 SEX M 1 FAMC @F169@ 0 @I484@ INDI 1 NAME Ludwig of_Wurttemberg // 1 TITL Duke 1 SEX M 1 FAMS @F170@ 0 @I485@ INDI 1 NAME Henriette // 1 SEX F 1 FAMS @F170@ 1 FAMC @F207@ 0 @I486@ INDI 1 NAME Alexander of_Bulgaria // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1893 1 FAMS @F172@ 1 FAMC @F109@ 0 @I487@ INDI 1 NAME Francis Joseph // 1 SEX M 1 BIRT 2 DATE 1861 1 DEAT 2 DATE 1924 1 FAMS @F173@ 1 FAMC @F109@ 0 @I488@ INDI 1 NAME Gustav Ernst of_Erbach-Schonb// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1840 1 DEAT 2 DATE 1908 1 FAMS @F171@ 0 @I489@ INDI 1 NAME Johanna /Loisinger/ 1 SEX F 1 BIRT 2 DATE 1865 1 DEAT 2 DATE 1951 1 FAMS @F172@ 1 FAMC @F1236@ 0 @I490@ INDI 1 NAME Anna of_Montenegro Princess// 1 SEX F 1 FAMS @F173@ 0 @I491@ INDI 1 NAME Alexandra Alexandrovna /Romanov/ 1 SEX F 1 BIRT 2 DATE 1842 1 DEAT 2 DATE 1849 1 FAMC @F11@ 0 @I492@ INDI 1 NAME Nicholas Alexandrovich /Romanov/ 1 SEX M 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1865 1 FAMC @F11@ 0 @I493@ INDI 1 NAME Louis_III of_Hesse // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1806 1 DEAT 2 DATE 1877 1 FAMS @F174@ 1 FAMS @F1234@ 1 FAMC @F110@ 0 @I494@ INDI 1 NAME Edwina /Ashley/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1901 1 DEAT 2 DATE 1960 1 FAMS @F175@ 1 FAMC @F965@ 0 @I495@ INDI 1 NAME Mathilde // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1813 1 DEAT 2 DATE 1862 1 FAMS @F174@ 1 FAMC @F432@ 0 @I496@ INDI 1 NAME Frederica of_Hesse- Darmstadt// 1 SEX F 1 FAMS @F520@ 0 @I497@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE 1838 1 DEAT 2 DATE 1900 1 FAMS @F1240@ 1 FAMS @F1241@ 1 FAMC @F114@ 0 @I498@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE ABT 1845 1 DEAT 2 DATE 1900 1 FAMS @F1238@ 1 FAMC @F114@ 0 @I499@ INDI 1 NAME Anna // 1 SEX F 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1865 1 FAMS @F1237@ 1 FAMC @F114@ 0 @I500@ INDI 1 NAME Patricia /Mountbatten/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1924 1 FAMS @F177@ 1 FAMC @F175@ 0 @I501@ INDI 1 NAME Pamela /Mountbatten/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1929 1 FAMS @F178@ 1 FAMC @F175@ 0 @I502@ INDI 1 NAME Nadejda // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1896 1 DEAT 2 DATE 1963 1 FAMS @F176@ 1 FAMC @F498@ 0 @I503@ INDI 1 NAME Tatiana Elizabeth /Mountbatten/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1917 1 FAMC @F176@ 0 @I504@ INDI 1 NAME David of_Milford_Haven /Mountbatten/ 1 TITL Marquess 1 SEX M 1 BIRT 2 DATE 1919 1 DEAT 2 DATE 14 APR 1970 1 BURI 2 PLAC Whippingham Ch.,Isle of Wight,England 1 FAMS @F963@ 1 FAMS @F964@ 1 FAMC @F176@ 0 @I505@ INDI 1 NAME John Knatchbull /Ulick/ 1 TITL Lord Brabourne 1 SEX M 1 BIRT 2 DATE 1918 1 FAMS @F177@ 0 @I506@ INDI 1 NAME Five_children // 1 SEX M 1 FAMC @F177@ 0 @I507@ INDI 1 NAME David /Hicks/ 1 SEX M 1 BIRT 2 DATE 1928 1 FAMS @F178@ 0 @I508@ INDI 1 NAME Two_Children // 1 SEX M 1 FAMC @F178@ 0 @I509@ INDI 1 NAME Iris /Mountbatten/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1920 1 FAMS @F967@ 1 FAMS @F968@ 1 FAMS @F969@ 1 FAMC @F142@ 0 @I510@ INDI 1 NAME Auguste /von_Harrach/ 1 SEX F 1 BIRT 2 DATE 1800 1 DEAT 2 DATE 1873 1 FAMS @F179@ 0 @I511@ INDI 1 NAME Daughter Stillborn // 1 SEX F 1 FAMC @F145@ 0 @I512@ INDI 1 NAME Frederick // 1 SEX M 1 BIRT 2 DATE 1833 1 DEAT 2 DATE 1834 1 FAMC @F388@ 0 @I513@ INDI 1 NAME Rosalie of_Hohenau /von_Rauch/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1820 1 DEAT 2 DATE 1879 1 FAMS @F181@ 0 @I514@ INDI 1 NAME Himiltude // 1 SEX F 1 FAMS @F182@ 0 @I515@ INDI 1 NAME Paul Frederick // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1800 1 DEAT 2 DATE 1842 1 FAMS @F183@ 0 @I516@ INDI 1 NAME Marie of_Saxe-Weimar- Eisenach// 1 SEX F 1 BIRT 2 DATE 1808 1 DEAT 2 DATE 1877 1 FAMS @F184@ 0 @I517@ INDI 1 NAME Caroline of_Zweibrucken // 1 SEX F 1 FAMS @F81@ 0 @I518@ INDI 1 NAME Cecilie of_Mecklenburg- Schwerin// 1 SEX F 1 BIRT 2 DATE 1886 1 DEAT 2 DATE 1954 1 FAMS @F186@ 0 @I519@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE 1906 1 DEAT 2 DATE 1940 1 FAMS @F187@ 1 FAMC @F186@ 0 @I520@ INDI 1 NAME Louis Ferdinand of_Prussia// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1907 1 FAMS @F188@ 1 FAMC @F186@ 0 @I521@ INDI 1 NAME Hubertus // 1 SEX M 1 BIRT 2 DATE 1909 1 DEAT 2 DATE 1950 1 FAMS @F189@ 1 FAMS @F190@ 1 FAMC @F186@ 0 @I522@ INDI 1 NAME Frederick // 1 SEX M 1 BIRT 2 DATE 1911 1 DEAT 2 DATE 1966 1 FAMS @F191@ 1 FAMC @F186@ 0 @I523@ INDI 1 NAME Alexandrine // 1 SEX F 1 BIRT 2 DATE 1915 1 DEAT 2 DATE 1980 1 FAMC @F186@ 0 @I524@ INDI 1 NAME Cecilie // 1 SEX F 1 BIRT 2 DATE 1917 1 DEAT 2 DATE 1975 1 FAMS @F192@ 1 FAMC @F186@ 0 @I525@ INDI 1 NAME Dorothea /von_Salviati/ 1 SEX F 1 BIRT 2 DATE 1907 1 DEAT 2 DATE 1972 1 FAMS @F187@ 0 @I526@ INDI 1 NAME Dau._1 // 1 SEX F 1 FAMC @F187@ 0 @I527@ INDI 1 NAME Dau._2 // 1 SEX F 1 FAMC @F187@ 0 @I528@ INDI 1 NAME Kira of_Russia // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1909 1 DEAT 2 DATE 1967 1 FAMS @F188@ 1 FAMC @F213@ 0 @I529@ INDI 1 NAME Louis_XIII // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 27 SEP 1601 2 PLAC Fontainebleau,France 1 DEAT 2 DATE 14 MAY 1643 2 PLAC Germain-en-Laye,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F521@ 1 FAMC @F271@ 0 @I530@ INDI 1 NAME Joanna of_Austria // 1 TITL Arch Duchess 1 SEX F 1 FAMS @F489@ 0 @I531@ INDI 1 NAME Francesco_I of_Tuscany Italy// 1 TITL Grand Duke 1 SEX M 1 FAMS @F489@ 0 @I532@ INDI 1 NAME Alice de_Courtenay // 1 SEX F 1 FAMS @F351@ 0 @I533@ INDI 1 NAME Aymer of_Angouleme /Taillefer/ 1 TITL Count 1 SEX M 1 FAMS @F351@ 0 @I534@ INDI 1 NAME Dau._2 // 1 SEX F 1 FAMC @F188@ 0 @I535@ INDI 1 NAME Dau._3 // 1 SEX F 1 FAMC @F188@ 0 @I536@ INDI 1 NAME Maria-Anna /von_Humboldt/ 1 SEX F 1 BIRT 2 DATE 1916 1 FAMS @F189@ 0 @I537@ INDI 1 NAME Magdalene /Reuss/ 1 SEX F 1 BIRT 2 DATE 1920 1 FAMS @F190@ 0 @I538@ INDI 1 NAME Dau._1 // 1 SEX F 1 FAMC @F190@ 0 @I539@ INDI 1 NAME Dau._2 // 1 SEX F 1 FAMC @F190@ 0 @I540@ INDI 1 NAME Brigid /Guinness/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1920 1 FAMS @F191@ 0 @I541@ INDI 1 NAME Son_1 // 1 SEX M 1 FAMC @F191@ 0 @I542@ INDI 1 NAME Son_2 // 1 SEX M 1 FAMC @F191@ 0 @I543@ INDI 1 NAME Son_3 // 1 SEX M 1 FAMC @F191@ 0 @I544@ INDI 1 NAME Dau._1 // 1 SEX F 1 FAMC @F191@ 0 @I545@ INDI 1 NAME Dau._2 // 1 SEX F 1 FAMC @F191@ 0 @I546@ INDI 1 NAME Clyde /Harris/ 1 SEX M 1 FAMS @F192@ 0 @I547@ INDI 1 NAME Sophie Charlotte // 1 SEX F 1 BIRT 2 DATE 1879 1 DEAT 2 DATE 1964 1 FAMS @F193@ 0 @I548@ INDI 1 NAME Adelheid of_Saxe- Meiningen// 1 SEX F 1 BIRT 2 DATE 1891 1 DEAT 2 DATE 1971 1 FAMS @F194@ 0 @I549@ INDI 1 NAME Alexandra of_Schleswig- // 1 SEX F 1 BIRT 2 DATE 1887 1 DEAT 2 DATE 1957 1 FAMS @F195@ 0 @I550@ INDI 1 NAME Ina Maria /von_Bassewitz/ 1 SEX F 1 BIRT 2 DATE 1888 1 DEAT 2 DATE 1973 1 FAMS @F196@ 0 @I551@ INDI 1 NAME Marie Auguste of_Anhalt// 1 SEX F 1 BIRT 2 DATE 1898 1 DEAT 2 DATE 1983 1 FAMS @F197@ 0 @I552@ INDI 1 NAME Ernest Augustus of_Brunswick/Hanover/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1887 1 DEAT 2 DATE 1953 1 FAMS @F198@ 1 FAMC @F85@ 0 @I553@ INDI 1 NAME Frederick William_II // 1 TITL King of Prussia 1 SEX M 1 BIRT 2 DATE 25 SEP 1744 2 PLAC Berlin 1 DEAT 2 DATE 16 DEC 1797 2 PLAC Marmorpalais,Potsdam 1 FAMS @F199@ 1 FAMS @F200@ 1 FAMC @F205@ 0 @I554@ INDI 1 NAME Elizabeth Christine of_Brunswick// 1 SEX F 1 BIRT 2 DATE 8 NOV 1746 2 PLAC Wolfenbuttel 1 DEAT 2 DATE 18 FEB 1840 2 PLAC Stettin 1 FAMS @F199@ 0 @I555@ INDI 1 NAME Frederica Charlotte of_Prussia// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 7 MAY 1767 2 PLAC Charlottenburg 1 DEAT 2 DATE 6 AUG 1820 2 PLAC Oatlands Park,Weybridge,Surrey,England 1 FAMS @F185@ 1 FAMC @F199@ 0 @I556@ INDI 1 NAME Frederica of_Hesse- Darmstadt// 1 SEX F 1 BIRT 2 DATE 16 OCT 1751 2 PLAC Prenzlau 1 DEAT 2 DATE 25 FEB 1805 2 PLAC Berlin 1 FAMS @F200@ 1 FAMC @F81@ 0 @I557@ INDI 1 NAME Christine // 1 SEX F 1 BIRT 2 DATE 1772 1 DEAT 2 DATE 1773 1 FAMC @F200@ 0 @I558@ INDI 1 NAME Louis // 1 SEX M 1 BIRT 2 DATE 1773 1 DEAT 2 DATE 1796 1 FAMS @F201@ 1 FAMC @F200@ 0 @I559@ INDI 1 NAME Wilhelmina // 1 SEX F 1 BIRT 2 DATE 18 NOV 1774 2 PLAC Potsdam 1 DEAT 2 DATE 12 OCT 1837 2 PLAC The Hague 1 FAMS @F202@ 1 FAMC @F200@ 0 @I560@ INDI 1 NAME Son Stillborn // 1 SEX M 1 FAMC @F200@ 0 @I561@ INDI 1 NAME Augusta // 1 SEX F 1 BIRT 2 DATE 1780 1 DEAT 2 DATE 1841 1 FAMS @F203@ 1 FAMC @F200@ 0 @I562@ INDI 1 NAME Charles // 1 SEX M 1 BIRT 2 DATE 1781 1 DEAT 2 DATE 1846 1 FAMC @F200@ 0 @I563@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE 1783 1 DEAT 2 DATE 1851 1 FAMS @F204@ 1 FAMC @F200@ 0 @I564@ INDI 1 NAME Charles of_Mecklenburg- Strelitz// 1 TITL Grand Duke 1 SEX M 1 FAMS @F520@ 0 @I565@ INDI 1 NAME William_I of_Netherlands // 1 TITL King 1 SEX M 1 BIRT 2 DATE 24 AUG 1772 2 PLAC Oraniensaal,The Hague 1 DEAT 2 DATE 12 DEC 1843 2 PLAC Berlin,Germany 1 FAMS @F202@ 1 FAMS @F468@ 1 FAMC @F239@ 0 @I566@ INDI 1 NAME William_II of_Hesse // 1 TITL Elector 1 SEX M 1 FAMS @F203@ 0 @I567@ INDI 1 NAME Maria Anna of_Hesse// 1 SEX F 1 BIRT 2 DATE 1785 1 DEAT 2 DATE 1846 1 FAMS @F204@ 0 @I568@ INDI 1 NAME Augustus William // 1 SEX M 1 BIRT 2 DATE 1722 1 DEAT 2 DATE 1758 1 FAMS @F205@ 1 FAMC @F435@ 0 @I569@ INDI 1 NAME Louise of_Brunswick // 1 SEX F 1 BIRT 2 DATE 1722 1 DEAT 2 DATE 1780 1 FAMS @F205@ 0 @I570@ INDI 1 NAME Frederick Henry Charles// 1 SEX M 1 BIRT 2 DATE 1747 1 DEAT 2 DATE 1767 1 FAMC @F205@ 0 @I571@ INDI 1 NAME Wilhelmine // 1 SEX F 1 BIRT 2 DATE 1751 1 DEAT 2 DATE 1820 1 FAMS @F206@ 1 FAMC @F205@ 0 @I572@ INDI 1 NAME George Charles Emil// 1 SEX M 1 BIRT 2 DATE 1758 1 DEAT 2 DATE 1759 1 FAMC @F205@ 0 @I573@ INDI 1 NAME William_V of_Orange // 1 SEX M 1 FAMS @F206@ 0 @I574@ INDI 1 NAME Charles Christian of_Nassau-Weilb// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1735 1 DEAT 2 DATE 1788 1 FAMS @F207@ 0 @I575@ INDI 1 NAME Caroline // 1 SEX F 1 BIRT 2 DATE 1743 1 DEAT 2 DATE 1787 1 FAMS @F207@ 1 FAMC @F238@ 0 @I576@ INDI 1 NAME Friedrich Wilhelm of_Nassau-Weilb// 1 TITL Prince 1 SEX M 1 FAMS @F208@ 1 FAMC @F207@ 0 @I577@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F208@ 0 @I578@ INDI 1 NAME Wilhelm of_Nassau // 1 TITL Duke 1 SEX M 1 FAMS @F209@ 1 FAMC @F208@ 0 @I579@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F209@ 0 @I580@ INDI 1 NAME Adolphe of_Luxembourg // 1 TITL Grand Duke 1 SEX M 1 FAMS @F210@ 1 FAMC @F209@ 0 @I581@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F210@ 0 @I582@ INDI 1 NAME Guillaume_IV of_Luxembourg // 1 TITL Grand Duke 1 SEX M 1 FAMS @F211@ 1 FAMC @F210@ 0 @I583@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F211@ 0 @I584@ INDI 1 NAME Charlotte of_Luxembourg // 1 TITL Grand Duchess 1 SEX F 1 FAMS @F212@ 1 FAMC @F211@ 0 @I585@ INDI 1 NAME Unknown // 1 SEX M 1 FAMS @F212@ 0 @I586@ INDI 1 NAME Jean of_Luxembourg // 1 TITL Grand Duke 1 SEX M 1 FAMC @F212@ 0 @I587@ INDI 1 NAME Marie-Josephe de_Saxe // 1 SEX F 1 FAMS @F1185@ 0 @I588@ INDI 1 NAME Vladimir Cyrilovitch /Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 30 AUG 1917 2 PLAC Near Borga,Finland,Finland 1 FAMS @F1381@ 1 FAMS @F214@ 1 FAMC @F213@ 0 @I589@ INDI 1 NAME Leonide Bagration- Moukhransky// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1914 2 PLAC Tiflis 1 FAMS @F214@ 1 FAMC @F1271@ 0 @I590@ INDI 1 NAME Gaston // 1 TITL Duke of Orleans 1 SEX M 1 BIRT 2 DATE 1608 1 DEAT 2 DATE 1660 1 FAMS @F1372@ 1 FAMC @F271@ 0 @I591@ INDI 1 NAME James // 1 TITL Duke of Segovia 1 SEX M 1 BIRT 2 DATE 1908 1 DEAT 2 DATE 1975 1 FAMS @F1252@ 1 FAMS @F1253@ 1 FAMC @F143@ 0 @I592@ INDI 1 NAME Dona_Maria of_Bourbon // 1 SEX F 1 BIRT 2 DATE 1937 1 FAMS @F1246@ 1 FAMC @F149@ 0 @I593@ INDI 1 NAME Margarite // 1 TITL Crown Princess 1 SEX F 1 BIRT 2 DATE 1939 1 FAMS @F1247@ 1 FAMC @F149@ 0 @I594@ INDI 1 NAME Alphonso // 1 TITL Crown Prince 1 SEX M 1 BIRT 2 DATE 1941 1 DEAT 2 DATE 1956 2 PLAC ,,Portugal 1 FAMC @F149@ 0 @I595@ INDI 1 NAME Maria // 1 SEX F 1 FAMS @F255@ 1 FAMC @F170@ 0 @I596@ INDI 1 NAME Isabella /Marshal/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 9 OCT 1200 2 PLAC Pembroke Castle 1 DEAT 2 DATE 15 JAN 1240 2 PLAC Berkhamsted 1 FAMS @F599@ 1 FAMC @F778@ 0 @I597@ INDI 1 NAME Charles of_Sweden // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1861 1 DEAT 2 DATE 1951 1 FAMS @F215@ 1 FAMC @F156@ 0 @I598@ INDI 1 NAME Ingeborg of_Denmark // 1 SEX F 1 BIRT 2 DATE 1878 1 DEAT 2 DATE 1958 1 FAMS @F215@ 1 FAMC @F218@ 0 @I599@ INDI 1 NAME Astrid of_Sweden // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 17 NOV 1905 1 DEAT 2 DATE 29 AUG 1935 2 PLAC Kussnacht,Switzerland 1 BURI 2 PLAC Laeken 1 FAMS @F216@ 1 FAMC @F215@ 0 @I600@ INDI 1 NAME Leopold_III // 1 TITL King of Belgium 1 SEX M 1 BIRT 2 DATE 3 NOV 1901 2 PLAC Brussels,Belgium 1 DEAT 2 DATE 25 SEP 1983 2 PLAC Near Brussels,Belgium 1 BURI 2 PLAC Laeken 1 FAMS @F216@ 1 FAMS @F429@ 1 FAMC @F423@ 0 @I601@ INDI 1 NAME Baudouin_I of_the_Belgians // 1 TITL King 1 SEX M 1 BIRT 2 DATE 7 SEP 1930 2 PLAC Chateau de,Stuyvenberg 1 FAMS @F426@ 1 FAMC @F216@ 0 @I602@ INDI 1 NAME Sibylla of_Saxe-Coburg // 1 SEX F 1 BIRT 2 DATE 1908 1 DEAT 2 DATE 1971 1 FAMS @F217@ 0 @I603@ INDI 1 NAME Carl_XVI Gustav // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 30 APR 1946 2 PLAC Haga Castle 1 FAMS @F220@ 1 FAMC @F217@ 0 @I604@ INDI 1 NAME Frederick_VIII // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 3 JUN 1843 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 14 MAY 1912 2 PLAC Hamburg,Germany 1 BURI 2 PLAC Roskilde,Denmark 1 FAMS @F218@ 1 FAMC @F74@ 0 @I605@ INDI 1 NAME Louise of_Sweden // 1 SEX F 1 BIRT 2 DATE 31 OCT 1851 2 PLAC Stockholm,Sweden 1 DEAT 2 DATE 20 MAR 1926 2 PLAC Amalienborg 1 FAMS @F218@ 1 FAMC @F387@ 0 @I606@ INDI 1 NAME Christian_X // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 26 SEP 1870 2 PLAC Charlottenlund,Nr: Copenhagen,Denmark 1 DEAT 2 DATE 20 APR 1947 2 PLAC Amalienborg 1 BURI 2 PLAC Roskilde,Denmark 1 FAMS @F219@ 1 FAMC @F218@ 0 @I607@ INDI 1 NAME Alexandrine of_Mecklenburg- Schwerin// 1 SEX F 1 BIRT 2 DATE 24 DEC 1879 2 PLAC Schwerin 1 DEAT 2 DATE 28 DEC 1952 2 PLAC Copenhagen 1 FAMS @F219@ 1 FAMC @F1278@ 0 @I608@ INDI 1 NAME Frederick_IX // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 11 MAR 1899 2 PLAC Sorgenfri,Nr: Copenhagen,Denmark 1 DEAT 2 DATE 14 JAN 1972 2 PLAC Copenhagen,Denmark 1 BURI 2 PLAC Roskilde,Denmark 1 FAMS @F402@ 1 FAMC @F219@ 0 @I609@ INDI 1 NAME Alexia /Oldenburg/ 1 SEX M 1 BIRT 2 DATE 1965 1 FAMC @F163@ 0 @I610@ INDI 1 NAME Mergrethe_II // 1 TITL Queen of Denmark 1 SEX F 1 BIRT 2 DATE 16 APR 1940 2 PLAC Copenhagen,Denmark 1 FAMS @F626@ 1 FAMC @F402@ 0 @I611@ INDI 1 NAME Johann Georg_II of_Anhalt-Dessau// 1 TITL Prince 1 SEX M 1 DEAT 2 DATE 1693 1 FAMS @F221@ 0 @I612@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F221@ 0 @I613@ INDI 1 NAME Leopold_I of_Anhalt-Dessau // 1 TITL Prince 1 SEX M 1 FAMS @F244@ 1 FAMC @F221@ 0 @I614@ INDI 1 NAME Henriette Amalie // 1 SEX F 1 FAMS @F222@ 1 FAMC @F221@ 0 @I615@ INDI 1 NAME Heinrich Kasimir of_Nassau-Dietz// 1 TITL Prince 1 SEX M 1 FAMS @F222@ 0 @I616@ INDI 1 NAME John William of_Orange/Friso/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1686 1 DEAT 2 DATE 1711 1 FAMS @F223@ 1 FAMC @F222@ 0 @I617@ INDI 1 NAME Mary Louise // 1 SEX F 1 BIRT 2 DATE 1688 1 DEAT 2 DATE 1765 1 FAMS @F223@ 0 @I618@ INDI 1 NAME William_IV of_Orange // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1711 1 DEAT 2 DATE 1751 1 FAMS @F238@ 1 FAMC @F223@ 0 @I619@ INDI 1 NAME Charlotte Amalia // 1 SEX F 1 BIRT 2 DATE 1710 1 DEAT 2 DATE 1777 1 FAMS @F224@ 1 FAMC @F223@ 0 @I620@ INDI 1 NAME Friedrich of_Baden-Durlach // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1703 1 DEAT 2 DATE 1732 1 FAMS @F224@ 0 @I621@ INDI 1 NAME Karl Friedrich of_Baden// 1 TITL Grand Duke 1 SEX M 1 FAMS @F225@ 1 FAMC @F224@ 0 @I622@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F225@ 0 @I623@ INDI 1 NAME Karl Ludwig of_Baden// 1 TITL Prince 1 SEX M 1 FAMS @F226@ 1 FAMC @F225@ 0 @I624@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F226@ 0 @I625@ INDI 1 NAME Karl of_Baden // 1 TITL Grand Duke 1 SEX M 1 FAMS @F227@ 1 FAMC @F226@ 0 @I626@ INDI 1 NAME Caroline of_Baden // 1 SEX F 1 BIRT 2 DATE 13 JUL 1776 2 PLAC Karlsruhe 1 DEAT 2 DATE 13 NOV 1841 2 PLAC Munich,Germany 1 BURI 2 PLAC Theatinerkirche,Munich,Germany 1 FAMS @F232@ 1 FAMC @F226@ 0 @I627@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F227@ 0 @I628@ INDI 1 NAME Marie // 1 SEX F 1 FAMS @F228@ 1 FAMC @F227@ 0 @I629@ INDI 1 NAME William Alexander of_Hamilton// 1 TITL Duke 1 SEX M 1 FAMS @F228@ 0 @I630@ INDI 1 NAME Mary // 1 SEX F 1 FAMS @F229@ 1 FAMC @F228@ 0 @I631@ INDI 1 NAME Albert_I of_Monaco // 1 TITL Prince 1 SEX M 1 FAMS @F229@ 0 @I632@ INDI 1 NAME Louis_II of_Monaco // 1 TITL Prince 1 SEX M 1 FAMS @F230@ 1 FAMC @F229@ 0 @I633@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F230@ 0 @I634@ INDI 1 NAME Charlotte // 1 SEX F 1 FAMS @F231@ 1 FAMC @F230@ 0 @I635@ INDI 1 NAME Pierre /de_Polignac/ 1 TITL Prince 1 SEX M 1 FAMS @F231@ 0 @I636@ INDI 1 NAME Rainier_III of_Monaco // 1 TITL Prince 1 SEX M 1 FAMC @F231@ 0 @I637@ INDI 1 NAME Maximilian_I Joseph /Wittelsbach/ 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE 27 MAY 1756 2 PLAC Mannheim,Germany 1 DEAT 2 DATE 13 OCT 1825 2 PLAC Schloss,Nymphenburg,Germany 1 BURI 2 PLAC Theatinerkirche 1 FAMS @F431@ 1 FAMS @F232@ 0 @I638@ INDI 1 NAME Sophie (twin) /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1805 1 DEAT 2 DATE 1872 1 FAMS @F233@ 1 FAMC @F232@ 0 @I639@ INDI 1 NAME Franz Karl of_Austria// 1 TITL Archduke 1 SEX M 1 FAMS @F233@ 0 @I640@ INDI 1 NAME Otto // 1 SEX M 1 FAMS @F234@ 1 FAMC @F236@ 0 @I641@ INDI 1 NAME Elisabeth Amalia // 1 SEX F 1 FAMS @F237@ 1 FAMC @F236@ 0 @I642@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F234@ 0 @I643@ INDI 1 NAME Karl_I of_Austria // 1 TITL Emperor 1 SEX M 1 FAMS @F235@ 1 FAMC @F234@ 0 @I644@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F235@ 0 @I645@ INDI 1 NAME Otto of_Austria // 1 TITL Archduke 1 SEX M 1 FAMC @F235@ 0 @I646@ INDI 1 NAME Karl Ludwig // 1 SEX M 1 FAMS @F236@ 1 FAMC @F233@ 0 @I647@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F236@ 0 @I648@ INDI 1 NAME Aloys of_Liechtenstein // 1 TITL Prince 1 SEX M 1 FAMS @F237@ 0 @I649@ INDI 1 NAME Franz_Joseph_II of_Liechtenstein // 1 TITL Prince 1 SEX M 1 FAMC @F237@ 0 @I650@ INDI 1 NAME William_V of_Orange // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1748 1 DEAT 2 DATE 1806 1 FAMS @F239@ 1 FAMC @F238@ 0 @I651@ INDI 1 NAME Wilhelmina // 1 SEX F 1 BIRT 2 DATE 1751 1 DEAT 2 DATE 1820 1 FAMS @F239@ 0 @I652@ INDI 1 NAME William_II of_Netherlands // 1 TITL King 1 SEX M 1 BIRT 2 DATE 6 DEC 1792 2 PLAC The Hague,Netherlands 1 DEAT 2 DATE 17 MAR 1849 2 PLAC Tilburg 1 FAMS @F240@ 1 FAMC @F202@ 0 @I653@ INDI 1 NAME Frederik of_Netherlands // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1797 1 DEAT 2 DATE 1881 1 FAMS @F388@ 1 FAMC @F202@ 0 @I654@ INDI 1 NAME Anna Pavlovna // 1 SEX F 1 BIRT 2 DATE 18 JAN 1795 2 PLAC St. Petersburg,Russia 1 DEAT 2 DATE 1 MAR 1865 2 PLAC The Hague 1 FAMS @F240@ 1 FAMC @F469@ 0 @I655@ INDI 1 NAME William_III of_Netherlands // 1 TITL King 1 SEX M 1 BIRT 2 DATE 19 FEB 1817 2 PLAC Brussels,Belgium 1 DEAT 2 DATE 23 NOV 1890 2 PLAC Het Loo 1 FAMS @F447@ 1 FAMS @F241@ 1 FAMC @F240@ 0 @I656@ INDI 1 NAME Emma of_Netherlands // 1 TITL Queen Regent 1 SEX F 1 BIRT 2 DATE 2 AUG 1858 2 PLAC Arolsen 1 DEAT 2 DATE 20 MAR 1934 2 PLAC The Hague 1 FAMS @F241@ 1 FAMC @F67@ 0 @I657@ INDI 1 NAME Wilhelmina of_Netherlands // 1 TITL Queen 1 SEX F 1 BIRT 2 DATE 31 AUG 1880 2 PLAC The Hague,Netherlands 1 DEAT 2 DATE 28 NOV 1962 2 PLAC Het Loo 1 FAMS @F242@ 1 FAMC @F241@ 0 @I658@ INDI 1 NAME Henry of_Mecklenburg // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 19 APR 1876 2 PLAC Schwerin 1 DEAT 2 DATE 3 JUL 1934 2 PLAC The Hague,Netherlands 1 FAMS @F242@ 1 FAMC @F445@ 0 @I659@ INDI 1 NAME Juliana of_Netherlands // 1 TITL Queen 1 SEX F 1 BIRT 2 DATE 30 APR 1909 2 PLAC The Hague,Netherlands 1 FAMS @F243@ 1 FAMC @F242@ 0 @I660@ INDI 1 NAME Bernhard of_Lippe- Biesterfeld// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 29 JUN 1911 2 PLAC Jena 1 FAMS @F243@ 0 @I661@ INDI 1 NAME Beatrix of_Netherlands // 1 TITL Queen 1 SEX F 1 BIRT 2 DATE 31 JAN 1938 2 PLAC Soetdijk,Palace,Netherlands 1 FAMS @F443@ 1 FAMC @F243@ 0 @I662@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F244@ 0 @I663@ INDI 1 NAME Leopold_II of_Anhalt-Dessau // 1 TITL Prince 1 SEX M 1 FAMS @F245@ 1 FAMC @F244@ 0 @I664@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F245@ 0 @I665@ INDI 1 NAME Agnes // 1 SEX F 1 FAMS @F246@ 1 FAMC @F245@ 0 @I666@ INDI 1 NAME Johann /Just/ 1 TITL Baron von Loen 1 SEX M 1 FAMS @F246@ 0 @I667@ INDI 1 NAME Agnes // 1 SEX F 1 FAMS @F247@ 1 FAMC @F246@ 0 @I668@ INDI 1 NAME Ernst von_Seherr-Thoss // 1 TITL Count 1 SEX M 1 FAMS @F247@ 0 @I669@ INDI 1 NAME Hermann von_Seherr-Thoss // 1 TITL Count 1 SEX M 1 FAMS @F248@ 1 FAMC @F247@ 0 @I670@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F248@ 0 @I671@ INDI 1 NAME Marguerite // 1 SEX F 1 FAMS @F249@ 1 FAMC @F248@ 0 @I672@ INDI 1 NAME Lajos Apponyi_de Nagy-Appony// 1 TITL Count 1 SEX M 1 FAMS @F249@ 0 @I673@ INDI 1 NAME Cyula Apponyi_de Nagy-Appony// 1 TITL Count 1 SEX M 1 FAMS @F250@ 1 FAMC @F249@ 0 @I674@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F250@ 0 @I675@ INDI 1 NAME Geraldine // 1 SEX F 1 FAMS @F251@ 1 FAMC @F250@ 0 @I676@ INDI 1 NAME Zog_I of_Albania // 1 TITL King 1 SEX M 1 FAMS @F251@ 0 @I677@ INDI 1 NAME Leka_I of_Albania // 1 TITL King 1 SEX M 1 FAMC @F251@ 0 @I678@ INDI 1 NAME Karl of_Austria // 1 TITL Archduke 1 SEX M 1 FAMS @F252@ 0 @I679@ INDI 1 NAME Henriette // 1 SEX F 1 FAMS @F252@ 0 @I680@ INDI 1 NAME Karl Ferdinand // 1 SEX M 1 FAMS @F253@ 1 FAMC @F252@ 0 @I681@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F253@ 0 @I682@ INDI 1 NAME Maria Cristina of_Austria// 1 TITL Queen of Spain 1 SEX F 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1929 1 FAMS @F254@ 1 FAMC @F253@ 0 @I683@ INDI 1 NAME Alfonso_XII // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1857 2 PLAC Madrid,Spain 1 DEAT 2 DATE 1885 1 FAMS @F1243@ 1 FAMS @F254@ 1 FAMC @F453@ 0 @I684@ INDI 1 NAME Joseph of_Austria // 1 TITL Archduke 1 SEX M 1 FAMS @F255@ 0 @I685@ INDI 1 NAME Elisabeth of_Austria // 1 TITL Archduchess 1 SEX F 1 FAMS @F256@ 1 FAMC @F255@ 0 @I686@ INDI 1 NAME Ferdinand of_Austria-Este // 1 TITL Archduke 1 SEX M 1 FAMS @F256@ 0 @I687@ INDI 1 NAME Maria Theresa // 1 SEX F 1 BIRT 2 DATE 2 JUL 1849 2 PLAC Brunn 1 DEAT 2 DATE 3 FEB 1919 2 PLAC Schloss,Wildenwart 1 BURI 2 PLAC Dom Church,Munich,Germany 1 FAMS @F257@ 1 FAMC @F256@ 0 @I688@ INDI 1 NAME Ludwig_III /Wittelsbach/ 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE 7 JAN 1845 2 PLAC Munich,Germany 1 DEAT 2 DATE 18 OCT 1921 2 PLAC Sarvar,Hungary 1 FAMS @F257@ 1 FAMC @F438@ 0 @I689@ INDI 1 NAME Rupprecht of_Bavaria // 1 TITL Crown Prince 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1955 1 FAMS @F258@ 1 FAMS @F439@ 1 FAMC @F257@ 0 @I690@ INDI 1 NAME Maria Gabriele of_Bavaria// 1 SEX F 1 BIRT 2 DATE 1878 1 DEAT 2 DATE 1912 1 FAMS @F258@ 1 FAMC @F441@ 0 @I691@ INDI 1 NAME Albrecht (Albert) // 1 TITL Duke of Bavaria 1 SEX M 1 BIRT 2 DATE 1905 1 FAMC @F258@ 0 @I692@ INDI 1 NAME George of_Denmark // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 2 APR 1653 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 28 OCT 1708 2 PLAC Kensington,Palace,,England 1 FAMS @F259@ 1 FAMC @F637@ 0 @I693@ INDI 1 NAME Anne /Stuart/ 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE 6 FEB 1665 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 1 AUG 1714 2 PLAC Kensington,Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F259@ 1 FAMC @F260@ 0 @I694@ INDI 1 NAME Daughter // 1 SEX F 1 BIRT 2 DATE 12 MAY 1684 1 DEAT 2 DATE 12 MAY 1684 1 FAMC @F259@ 0 @I695@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 2 JUN 1685 2 PLAC Whitehall,,England 1 DEAT 2 DATE 8 FEB 1687 2 PLAC Windsor Castle,Berkshire,England 1 FAMC @F259@ 0 @I696@ INDI 1 NAME Anne Sophia // 1 SEX F 1 BIRT 2 DATE 12 MAY 1686 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 2 FEB 1687 2 PLAC Windsor Castle,Berkshire,England 1 FAMC @F259@ 0 @I697@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE 22 OCT 1687 1 DEAT 2 DATE 22 OCT 1687 1 FAMC @F259@ 0 @I698@ INDI 1 NAME William of_Gloucester // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 24 JUL 1689 2 PLAC Hampton Court,Palace,England 1 DEAT 2 DATE 30 JUL 1700 2 PLAC Windsor Castle,Berkshire,England 1 FAMC @F259@ 0 @I699@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 14 OCT 1690 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 14 OCT 1690 2 PLAC St. James Palace,London,England 1 FAMC @F259@ 0 @I700@ INDI 1 NAME George // 1 SEX M 1 BIRT 2 DATE 17 APR 1692 2 PLAC Syon House,Brentford,Middlesex,England 1 DEAT 2 DATE 17 APR 1692 2 PLAC Syon House,Brentford,Middlesex,England 1 FAMC @F259@ 0 @I701@ INDI 1 NAME Daughter // 1 SEX F 1 BIRT 2 DATE 23 MAR 1693 2 PLAC Berkeley House,,England 1 DEAT 2 DATE 23 MAR 1693 2 PLAC Berkeley House,,England 1 FAMC @F259@ 0 @I702@ INDI 1 NAME Daughter // 1 SEX F 1 BIRT 2 DATE 18 FEB 1696 1 DEAT 2 DATE 18 FEB 1696 1 FAMC @F259@ 0 @I703@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE 20 SEP 1696 2 PLAC Windsor,Berkshire,England 1 DEAT 2 DATE 20 SEP 1696 2 PLAC Windsor,Berkshire,England 1 FAMC @F259@ 0 @I704@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE 15 SEP 1698 1 DEAT 2 DATE 15 SEP 1698 1 FAMC @F259@ 0 @I705@ INDI 1 NAME Daughter // 1 SEX F 1 BIRT 2 DATE 25 JAN 1700 1 DEAT 2 DATE 25 JAN 1700 1 FAMC @F259@ 0 @I706@ INDI 1 NAME James_II /Stuart/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 14 OCT 1633 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 6 SEP 1701 2 PLAC St. Germain-,en-Laye,France 1 BURI 2 PLAC St. Germain-,en-Laye,France 1 FAMS @F260@ 1 FAMS @F261@ 1 FAMC @F270@ 0 @I707@ INDI 1 NAME Anne /Hyde/ 1 SEX F 1 BIRT 2 DATE 12 MAR 1637/1638 2 PLAC Cranbourne Lodge,Near,Windsor,England 1 DEAT 2 DATE 31 MAR 1671 2 PLAC St. James Palace,London,England 1 FAMS @F260@ 1 FAMC @F944@ 0 @I708@ INDI 1 NAME Charles of_Cambridge // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 22 OCT 1660 2 PLAC Worcester House,London,England 1 DEAT 2 DATE 5 MAY 1661 2 PLAC Whitehall 1 FAMC @F260@ 0 @I709@ INDI 1 NAME Mary_II // 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE 30 APR 1662 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 28 DEC 1694 2 PLAC Kensington,Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F276@ 1 FAMC @F260@ 0 @I710@ INDI 1 NAME James of_Cambridge // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 12 JUL 1663 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 22 MAY 1667 2 PLAC St. James Palace,London,England 1 FAMC @F260@ 0 @I711@ INDI 1 NAME Charles // 1 TITL Duke of Kendal 1 SEX M 1 BIRT 2 DATE 4 JUL 1666 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 20 JUN 1667 2 PLAC Richmond Palace,,England 1 FAMC @F260@ 0 @I712@ INDI 1 NAME Edgar of_Cambridge // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 14 SEP 1667 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 15 NOV 1669 2 PLAC Richmond Palace,London,England 1 FAMC @F260@ 0 @I713@ INDI 1 NAME Henrietta // 1 SEX F 1 BIRT 2 DATE 13 JAN 1669 2 PLAC Whitehall,,England 1 DEAT 2 DATE 15 NOV 1669 2 PLAC St. James Palace,,England 1 FAMC @F260@ 0 @I714@ INDI 1 NAME Catherine // 1 SEX F 1 BIRT 2 DATE 9 FEB 1671 2 PLAC Whitehall,,England 1 DEAT 2 DATE 5 DEC 1671 2 PLAC St. James Palace,,England 1 FAMC @F260@ 0 @I715@ INDI 1 NAME Mary Beatrice of_Modena// 1 SEX F 1 BIRT 2 DATE 25 SEP 1658 1 DEAT 2 DATE 7 MAY 1718 2 PLAC St. Germain-,en-Laye,France 1 BURI 2 PLAC Convent of,Chaillot,France 1 FAMS @F261@ 1 FAMC @F275@ 0 @I716@ INDI 1 NAME Catherine Laura /Stuart/ 1 SEX F 1 BIRT 2 DATE 10 JAN 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 3 OCT 1675 2 PLAC St. James Palace,London,England 1 FAMC @F261@ 0 @I717@ INDI 1 NAME Charles of_Cambridge /Stuart/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 7 NOV 1677 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 12 DEC 1677 2 PLAC St. James Palace,London,England 1 FAMC @F261@ 0 @I718@ INDI 1 NAME Charlotte Maria /Stuart/ 1 SEX F 1 BIRT 2 DATE 16 AUG 1682 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 6 OCT 1682 2 PLAC St. James Palace,London,England 1 FAMC @F261@ 0 @I719@ INDI 1 NAME James Francis Edward/Stuart/ 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE 10 JUN 1688 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 1 JAN 1766 2 PLAC Rome,,Italy 1 FAMS @F262@ 1 FAMC @F261@ 0 @I720@ INDI 1 NAME Louisa Maria Theresa/Stuart/ 1 SEX F 1 BIRT 2 DATE 28 JUN 1692 2 PLAC St. Germain-,en-Laye,France 1 DEAT 2 DATE 8 APR 1712 2 PLAC St. Germain-,en-Laye,France 1 FAMC @F261@ 0 @I721@ INDI 1 NAME Maria Casimire Clementina/Sobieska/ 1 SEX F 1 BIRT 2 DATE 18 JUL 1702 1 DEAT 2 DATE 18 JAN 1735 2 PLAC Rome,,Italy 1 FAMS @F262@ 1 FAMC @F952@ 0 @I722@ INDI 1 NAME Charles Edward Louis/Stuart/ 1 SEX M 1 BIRT 2 DATE 31 DEC 1720 2 PLAC Rome,,Italy 1 DEAT 2 DATE 31 JAN 1788 2 PLAC Rome,,Italy 1 FAMS @F263@ 1 FAMC @F262@ 0 @I723@ INDI 1 NAME Henry Benedict Thomas/Stuart/ 1 TITL Duke of York 1 SEX M 1 BIRT 2 DATE 6 MAR 1725 2 PLAC Rome,,Italy 1 DEAT 2 DATE 13 JUL 1807 2 PLAC Frascati,,Italy 1 FAMC @F262@ 0 @I724@ INDI 1 NAME Louise Maximilienne Caroline// 1 SEX F 1 BIRT 2 DATE 10 SEP 1752 2 PLAC Mons 1 DEAT 2 DATE 29 JAN 1824 2 PLAC Florence,,Italy 1 FAMS @F263@ 1 FAMC @F954@ 0 @I725@ INDI 1 NAME James_I /Stuart/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 19 JUN 1566 2 PLAC Edinburgh Castle,,Scotland 1 DEAT 2 DATE 27 MAR 1625 2 PLAC Theobalds Park,Hertfordshire,Herts,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F264@ 1 FAMC @F455@ 0 @I726@ INDI 1 NAME Anne of_Denmark // 1 SEX F 1 BIRT 2 DATE 14 OCT 1574 2 PLAC Skanderborg,Castle 1 DEAT 2 DATE 4 MAR 1619 2 PLAC Hampton Court,Palace 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F264@ 1 FAMC @F268@ 0 @I727@ INDI 1 NAME Henry Frederick /Stuart/ 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE 19 FEB 1594 2 PLAC Stirling Castle 1 DEAT 2 DATE 6 NOV 1612 2 PLAC St. James Palace,,England 1 FAMC @F264@ 0 @I728@ INDI 1 NAME Elizabeth /Stuart/ 1 SEX F 1 BIRT 2 DATE 19 AUG 1596 2 PLAC Dunfermline 1 DEAT 2 DATE 13 FEB 1662 2 PLAC Leicester House,London,England 1 FAMS @F265@ 1 FAMC @F264@ 0 @I729@ INDI 1 NAME Margaret /Stuart/ 1 SEX F 1 BIRT 2 DATE 24 DEC 1598 2 PLAC Dalkeith Palace 1 DEAT 2 DATE MAR 1600 2 PLAC Linlithgow 1 FAMC @F264@ 0 @I730@ INDI 1 NAME Charles_I /Stuart/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 19 NOV 1600 2 PLAC Dunfermline,Scotland 1 DEAT 2 DATE 30 JAN 1649 2 PLAC Whitehall Palace,,England 1 BURI 2 PLAC St. George's,Chapel,Windsor,England 1 FAMS @F270@ 1 FAMC @F264@ 0 @I731@ INDI 1 NAME Robert /Stuart/ 1 TITL Duke of Kintyre 1 SEX M 1 BIRT 2 DATE 18 JAN 1602 2 PLAC Dunfermline 1 DEAT 2 DATE 27 MAY 1602 2 PLAC Dunfermline 1 FAMC @F264@ 0 @I732@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE MAY 1603 2 PLAC Stirling 1 DEAT 2 DATE MAY 1603 2 PLAC Stirling 1 FAMC @F264@ 0 @I733@ INDI 1 NAME Mary /Stuart/ 1 SEX F 1 BIRT 2 DATE 8 APR 1605 2 PLAC Greenwich Palace 1 DEAT 2 DATE 16 SEP 1607 2 PLAC Stanwell Park,Middlesex,England 1 FAMC @F264@ 0 @I734@ INDI 1 NAME Sophia /Stuart/ 1 SEX F 1 BIRT 2 DATE 22 JUN 1606 2 PLAC Greenwich Palace 1 DEAT 2 DATE 23 JUN 1606 2 PLAC Greenwich Palace 1 FAMC @F264@ 0 @I735@ INDI 1 NAME Frederick_V of_Palatinate // 1 TITL King of Bohemia 1 SEX M 1 BIRT 2 DATE 1596 1 DEAT 2 DATE 1632 1 FAMS @F265@ 0 @I736@ INDI 1 NAME Sophia /Hanover/ 1 SEX F 1 BIRT 2 DATE 1630 1 DEAT 2 DATE 1714 1 FAMS @F266@ 1 FAMC @F265@ 0 @I737@ INDI 1 NAME Frederick_II of_Denmark and_Norway// 1 TITL King 1 SEX M 1 BIRT 2 DATE 1 JUL 1534 2 PLAC Haderslevhus 1 DEAT 2 DATE 4 APR 1588 2 PLAC Antvorslev,Castle 1 BURI 2 PLAC Roskilde,Cathedral,Denmark 1 FAMS @F268@ 1 FAMC @F638@ 0 @I738@ INDI 1 NAME Sophia of_Mecklenburg- Gustrow// 1 SEX F 1 BIRT 2 DATE 4 SEP 1557 2 PLAC Wismar 1 DEAT 2 DATE 4 OCT 1631 2 PLAC Nykobing 1 FAMS @F268@ 0 @I739@ INDI 1 NAME Henrietta Maria of_France// 1 SEX F 1 BIRT 2 DATE 26 NOV 1609 2 PLAC Hotel du Louvre,Paris,France 1 DEAT 2 DATE 31 AUG 1669 2 PLAC Colombe,Near Paris,France 1 BURI 2 PLAC St. Denis 1 FAMS @F270@ 1 FAMC @F271@ 0 @I740@ INDI 1 NAME Henry_IV the_Great // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 13 DEC 1553 2 PLAC Pau,Navarre,France 1 DEAT 2 DATE 14 MAY 1610 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1184@ 1 FAMS @F271@ 1 FAMC @F446@ 0 @I741@ INDI 1 NAME Marie /de'_Medici/ 1 SEX F 1 BIRT 2 DATE 1573 1 DEAT 2 DATE 1642 1 FAMS @F271@ 1 FAMC @F489@ 0 @I742@ INDI 1 NAME Charles James /Stuart/ 1 TITL Duke of Cornwall 1 SEX M 1 BIRT 2 DATE 13 MAY 1629 2 PLAC Greenwich Palace 1 DEAT 2 DATE 13 MAY 1629 2 PLAC Greenwich Palace 1 FAMC @F270@ 0 @I743@ INDI 1 NAME Charles_II /Stuart/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 29 MAY 1630 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 6 FEB 1685 2 PLAC Whitehall Palace,,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F273@ 1 FAMC @F270@ 0 @I744@ INDI 1 NAME Mary /Stuart/ 1 TITL Princess Royal 1 SEX F 1 BIRT 2 DATE 4 NOV 1631 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 24 DEC 1660 2 PLAC Whitehall Palace,,England 1 FAMS @F269@ 1 FAMC @F270@ 0 @I745@ INDI 1 NAME Elizabeth /Stuart/ 1 SEX F 1 BIRT 2 DATE 29 DEC 1635 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 8 SEP 1650 2 PLAC Carisbrooke,Castle,Isle of Wight,England 1 FAMC @F270@ 0 @I746@ INDI 1 NAME Anne /Stuart/ 1 SEX F 1 BIRT 2 DATE 17 MAR 1637 2 PLAC St. James Palace,London,England 1 DEAT 2 DATE 5 NOV 1640 2 PLAC Richmond Palace,,England 1 FAMC @F270@ 0 @I747@ INDI 1 NAME Catherine /Stuart/ 1 SEX F 1 BIRT 2 DATE 29 JUN 1639 2 PLAC Whitehall Palace,,England 1 DEAT 2 DATE 29 JUN 1639 2 PLAC Whitehall Palace,,England 1 FAMC @F270@ 0 @I748@ INDI 1 NAME Henry of_Gloucester /Stuart/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 8 JUL 1640 2 PLAC Oatlands,Surrey,England 1 DEAT 2 DATE 13 SEP 1660 2 PLAC Whitehall Palace 1 FAMC @F270@ 0 @I749@ INDI 1 NAME Henrietta Anne /Stuart/ 1 SEX F 1 BIRT 2 DATE 16 JUN 1644 2 PLAC Bedford House,Exeter,England 1 DEAT 2 DATE 30 JUN 1670 2 PLAC St. Cloud 1 FAMS @F272@ 1 FAMC @F270@ 0 @I750@ INDI 1 NAME William_II of_Orange // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1626 1 DEAT 2 DATE 1650 1 FAMS @F269@ 0 @I751@ INDI 1 NAME Philippe of_Orleans // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1641 1 DEAT 2 DATE 1701 1 FAMS @F272@ 1 FAMS @F1373@ 1 FAMC @F521@ 0 @I752@ INDI 1 NAME Catherine of_Braganza // 1 SEX F 1 BIRT 2 DATE 25 NOV 1638 2 PLAC Vila Vicosa,Lisbon,Portugal 1 DEAT 2 DATE 31 DEC 1705 2 PLAC Bemposta,Palace,Lisbon,Portugal 1 BURI 2 PLAC Belem 1 FAMS @F273@ 1 FAMC @F274@ 0 @I753@ INDI 1 NAME John_IV the_Fortunate // 1 TITL King of Portugal 1 SEX M 1 BIRT 2 DATE 1605 1 DEAT 2 DATE 1656 1 FAMS @F274@ 0 @I754@ INDI 1 NAME Luiza Maria /de_Guzman/ 1 SEX F 1 FAMS @F274@ 0 @I755@ INDI 1 NAME Alfonso_IV /d'Este/ 1 TITL Duke of Modena 1 SEX M 1 FAMS @F275@ 0 @I756@ INDI 1 NAME Laura /Mortinozzi/ 1 SEX F 1 FAMS @F275@ 0 @I757@ INDI 1 NAME William_III of_Orange /Stuart/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 14 NOV 1650 2 PLAC The Hague,Netherlands 1 DEAT 2 DATE 19 MAR 1702 2 PLAC Kensington,Palace,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F276@ 1 FAMC @F269@ 0 @I758@ INDI 1 NAME Ernest Augustus of_Brunswick// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1629 1 DEAT 2 DATE 1698 1 FAMS @F266@ 0 @I759@ INDI 1 NAME George_I of_Saxe- Meiningen// 1 TITL Duke 1 SEX M 1 FAMS @F277@ 0 @I760@ INDI 1 NAME Louisa Eleonora of_Hohenlohe-// 1 TITL Princess 1 SEX F 1 FAMS @F277@ 0 @I761@ INDI 1 NAME Frederick William_I // 1 TITL King of Prussia 1 SEX M 1 BIRT 2 DATE 14 AUG 1688 2 PLAC Berlin,Germany 1 DEAT 2 DATE 31 MAY 1740 2 PLAC Potsdam,Germany 1 BURI 2 PLAC Potsdam,Germany 1 FAMS @F435@ 1 FAMC @F267@ 0 @I762@ INDI 1 NAME Maria of_Waldegrave /Walpole/ 1 TITL Countess 1 SEX F 1 DEAT 2 DATE 1790 1 FAMS @F958@ 1 FAMS @F279@ 1 FAMC @F957@ 0 @I763@ INDI 1 NAME Anne /Horton/ 1 TITL Hon. 1 SEX F 1 DEAT 2 DATE 1808 1 FAMS @F280@ 0 @I764@ INDI 1 NAME Christian_VII // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 29 JAN 1749 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 13 MAR 1808 2 PLAC Rendsborg 1 FAMS @F281@ 1 FAMC @F107@ 0 @I765@ INDI 1 NAME Charles Louis // 1 TITL Elector Palatine 1 SEX M 1 DEAT 2 DATE 1680 1 FAMS @F940@ 1 FAMC @F265@ 0 @I766@ INDI 1 NAME Rupert of_Cumberland // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1619 1 DEAT 2 DATE 1682 1 FAMC @F265@ 0 @I767@ INDI 1 NAME Maurice // 1 SEX M 1 DEAT 2 DATE 1654 1 FAMC @F265@ 0 @I768@ INDI 1 NAME Edward // 1 SEX M 1 FAMS @F942@ 1 FAMC @F265@ 0 @I769@ INDI 1 NAME Charlotte /Landgrave/ 1 SEX F 1 FAMS @F940@ 1 FAMC @F941@ 0 @I770@ INDI 1 NAME Ernest Augustus // 1 TITL Duke of York 1 SEX M 1 FAMC @F266@ 0 @I771@ INDI 1 NAME Sophia Charlotte // 1 SEX F 1 BIRT 2 DATE 20 OCT 1668 2 PLAC Schloss Iburg,Near,Osnabruck 1 DEAT 2 DATE 1 FEB 1705 2 PLAC Hanover 1 BURI 2 PLAC Berlin,Cathedral,Germany 1 FAMS @F267@ 1 FAMC @F266@ 0 @I772@ INDI 1 NAME Frederick_I // 1 TITL King of Prussia 1 SEX M 1 BIRT 2 DATE 11 JUL 1657 2 PLAC Konigsberg,Prussia 1 DEAT 2 DATE 25 FEB 1713 2 PLAC Berlin,Germany 1 FAMS @F436@ 1 FAMS @F267@ 1 FAMS @F437@ 0 @I773@ INDI 1 NAME Henry_VII /Tudor/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 28 JAN 1457 2 PLAC Pembroke Castle,Pembrokeshire,England 1 DEAT 2 DATE 21 APR 1509 2 PLAC Richmond Palace,Richmond Surrey,England 1 BURI 2 PLAC Henry VII Chapel,Westminster,Abbey,England 1 FAMS @F282@ 1 FAMC @F461@ 0 @I774@ INDI 1 NAME Elizabeth of_York // 1 SEX F 1 BIRT 2 DATE 11 FEB 1466 2 PLAC Westminster,Palace,London,England 1 DEAT 2 DATE 11 FEB 1503 2 PLAC Tower of London,London,England 1 BURI 2 PLAC Henry VII Chapel,Westminster,Abbey,London 1 FAMS @F282@ 1 FAMC @F373@ 0 @I775@ INDI 1 NAME Arthur /Tudor/ 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE 20 SEP 1486 2 PLAC St. Swithin's,Priory,Winchester,England 1 DEAT 2 DATE 2 APR 1502 2 PLAC Ludlow Castle 1 FAMS @F313@ 1 FAMC @F282@ 0 @I776@ INDI 1 NAME Margaret /Tudor/ 1 SEX F 1 BIRT 2 DATE 28 NOV 1489 2 PLAC Westminster,Palace,London,England 1 DEAT 2 DATE 18 OCT 1541 2 PLAC Methven Castle 1 FAMS @F314@ 1 FAMS @F529@ 1 FAMS @F316@ 1 FAMC @F282@ 0 @I777@ INDI 1 NAME John Crocker /Bulteel/ 1 SEX M 1 DEAT 2 DATE 1843 1 FAMS @F283@ 0 @I778@ INDI 1 NAME Elizabeth /Grey/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1880 1 FAMS @F283@ 0 @I779@ INDI 1 NAME Horace Beauchamp /Seymour/ 1 TITL Sir 1 SEX M 1 BIRT 2 DATE 1791 1 DEAT 2 DATE 1856 1 FAMS @F284@ 1 FAMC @F1019@ 0 @I780@ INDI 1 NAME Elizabeth Malet /Palk/ 1 SEX F 1 DEAT 2 DATE 1827 1 FAMS @F284@ 0 @I781@ INDI 1 NAME George John /Spencer/ 1 TITL Earl of Spencer 1 SEX M 1 BIRT 2 DATE 1758 1 DEAT 2 DATE 1834 1 FAMS @F285@ 1 FAMC @F467@ 0 @I782@ INDI 1 NAME Lavinia /Bingham/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1831 1 FAMS @F285@ 1 FAMC @F682@ 0 @I783@ INDI 1 NAME Henry /Baring/ 1 SEX M 1 DEAT 2 DATE 1848 1 FAMS @F286@ 0 @I784@ INDI 1 NAME Cecilia Anne /Windham/ 1 SEX F 1 DEAT 2 DATE 1874 1 FAMS @F286@ 0 @I785@ INDI 1 NAME // 1 TITL Earl Howe I 1 SEX M 1 DEAT 2 DATE 1870 1 FAMS @F287@ 0 @I786@ INDI 1 NAME Anne /Gore/ 1 SEX F 1 DEAT 2 DATE 1877 1 FAMS @F287@ 0 @I787@ INDI 1 NAME Louisa Jane /Russell/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1905 1 FAMS @F288@ 1 FAMC @F675@ 0 @I788@ INDI 1 NAME // 1 TITL Duke Albercorn I 1 SEX M 1 DEAT 2 DATE 1885 1 FAMS @F288@ 0 @I789@ INDI 1 NAME George Charles /Bingham/ 1 TITL Earl of Lucan 1 SEX M 1 BIRT 2 DATE 1800 1 DEAT 2 DATE 1888 1 FAMS @F289@ 1 FAMC @F681@ 0 @I790@ INDI 1 NAME Anne /Brudenell/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1877 1 FAMS @F289@ 0 @I791@ INDI 1 NAME Caroline /Paget/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1874 1 FAMS @F290@ 0 @I792@ INDI 1 NAME Charles Lennox of_Richmond// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1791 1 DEAT 2 DATE 1860 1 FAMS @F290@ 1 FAMC @F671@ 0 @I793@ INDI 1 NAME David /Gill/ 1 SEX M 1 FAMS @F291@ 0 @I794@ INDI 1 NAME Sarah /Ogston/ 1 SEX F 1 FAMS @F291@ 0 @I795@ INDI 1 NAME William Smith /Marr/ 1 SEX M 1 DEAT 2 DATE 1898 1 FAMS @F292@ 0 @I796@ INDI 1 NAME Helen /Bean/ 1 SEX F 1 DEAT 2 DATE 1852 1 FAMS @F292@ 0 @I797@ INDI 1 NAME William /Littlejohn/ 1 SEX M 1 DEAT 2 DATE 1888 1 FAMS @F293@ 0 @I798@ INDI 1 NAME Janet /Bentley/ 1 SEX F 1 DEAT 2 DATE 1848 1 FAMS @F293@ 0 @I799@ INDI 1 NAME James /Crombie/ 1 SEX M 1 DEAT 2 DATE 1878 1 FAMS @F294@ 0 @I800@ INDI 1 NAME Katherine Scott /Forbes/ 1 SEX F 1 DEAT 2 DATE 1893 1 FAMS @F294@ 0 @I801@ INDI 1 NAME Gabriella Marina Alexandra/Windsor/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 23 APR 1981 2 PLAC ,,England 1 CHR 2 DATE 8 JUN 1981 2 PLAC Chapel Royal,St. James Palace,England 1 FAMC @F103@ 0 @I802@ INDI 1 NAME Thomas /Troubridge/ 1 SEX M 1 FAMS @F295@ 0 @I803@ INDI 1 NAME John_Charles of_Buccleuch VII// 1 TITL Duke 1 SEX M 1 FAMS @F296@ 0 @I804@ INDI 1 NAME Peter /Shand-Kydde/ 1 SEX M 1 FAMS @F297@ 1 FAMS @F298@ 0 @I805@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F298@ 0 @I806@ INDI 1 NAME Barbara /Cartland/ 1 TITL Dame 1 SEX F 1 BIRT 2 DATE JUL 1900 1 FAMS @F299@ 1 FAMS @F1415@ 1 FAMC @F1418@ 0 @I807@ INDI 1 NAME Robert /Fellowes/ 1 TITL Sir 1 SEX M 1 BIRT 2 DATE 1941 1 FAMS @F300@ 1 FAMC @F302@ 0 @I808@ INDI 1 NAME Laura Jane /Fellowes/ 1 SEX F 1 BIRT 2 DATE JUL 1980 1 FAMC @F300@ 0 @I809@ INDI 1 NAME Neil /McCorquodale/ 1 SEX M 1 BIRT 2 DATE 1951 1 FAMS @F301@ 0 @I810@ INDI 1 NAME William /Fellowes/ 1 TITL Sir 1 SEX M 1 FAMS @F302@ 0 @I811@ INDI 1 NAME Andrew /Ferguson/ 1 TITL Major 1 SEX M 1 BIRT 2 DATE 1899 1 DEAT 2 DATE 1966 1 FAMS @F303@ 1 FAMC @F304@ 0 @I812@ INDI 1 NAME Marian -Scott /Montagu-Douglas-/ 1 SEX F 1 BIRT 2 DATE 1980 1 FAMS @F303@ 1 FAMC @F1393@ 0 @I813@ INDI 1 NAME John Andrew /Ferguson/ 1 SEX M 1 FAMC @F303@ 0 @I814@ INDI 1 NAME Algernon Francis /Ferguson/ 1 TITL Brig. Gen. 1 SEX M 1 BIRT 2 DATE 1867 1 DEAT 2 DATE 1943 1 FAMS @F304@ 1 FAMC @F305@ 0 @I815@ INDI 1 NAME John /Ferguson/ 1 TITL Colonel 1 SEX M 1 FAMS @F305@ 1 FAMC @F306@ 0 @I816@ INDI 1 NAME Thomas /Ferguson/ 1 SEX M 1 FAMS @F306@ 1 FAMC @F307@ 0 @I817@ INDI 1 NAME Emma /Benyon/ 1 SEX F 1 FAMS @F306@ 0 @I818@ INDI 1 NAME John /Ferguson/ 1 SEX M 1 FAMS @F307@ 1 FAMC @F308@ 0 @I819@ INDI 1 NAME James /Ferguson/ 1 TITL Dr. 1 SEX M 1 DEAT 2 DATE 1789 1 FAMS @F308@ 0 @I820@ INDI 1 NAME Fitzherbert /Wright/ 1 SEX M 1 BIRT 2 DATE 1905 1 DEAT 2 DATE 1975 1 FAMS @F309@ 1 FAMC @F1387@ 0 @I821@ INDI 1 NAME Doreen /Wingfield/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1904 1 FAMS @F309@ 1 FAMC @F1385@ 0 @I822@ INDI 1 NAME Jane Louisa /Ferguson/ 1 SEX F 1 BIRT 2 DATE 26 AUG 1957 2 PLAC ,,England 1 FAMS @F312@ 1 FAMC @F54@ 0 @I823@ INDI 1 NAME Hector /Barrantes/ 1 SEX M 1 BIRT 2 DATE ABT 1939 1 DEAT 2 DATE 10 AUG 1990 2 PLAC Buenos Aires,Argentina 1 FAMS @F310@ 1 FAMS @F311@ 0 @I824@ INDI 1 NAME Louise // 1 SEX F 1 DEAT 2 DATE ABT 1967 2 PLAC Buenos Aires,,Argentina 1 FAMS @F310@ 0 @I825@ INDI 1 NAME Alex /Makim/ 1 SEX M 1 BIRT 2 DATE ABT 1951 1 FAMS @F312@ 0 @I826@ INDI 1 NAME Seamus /Makim/ 1 SEX M 1 BIRT 2 DATE ABT 1980 1 FAMC @F312@ 0 @I827@ INDI 1 NAME Beatrice Elizabeth Mary/Windsor/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 8 AUG 1988 2 PLAC Portland Hosp.,,England 1 FAMC @F53@ 0 @I828@ INDI 1 NAME Henry_VIII /Tudor/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 28 JUN 1491 2 PLAC Greenwich Palace,,England 1 DEAT 2 DATE 28 JAN 1547 2 PLAC Whitehall,London,England 1 BURI 2 PLAC St. George Chap.,Windsor,England 1 FAMS @F319@ 1 FAMS @F321@ 1 FAMS @F322@ 1 FAMS @F323@ 1 FAMS @F325@ 1 FAMS @F327@ 1 FAMC @F282@ 0 @I829@ INDI 1 NAME Elizabeth /Tudor/ 1 SEX F 1 BIRT 2 DATE 2 JUL 1492 1 DEAT 2 DATE 14 SEP 1495 2 PLAC Eltham Palace,,England 1 FAMC @F282@ 0 @I830@ INDI 1 NAME Mary /Tudor/ 1 SEX F 1 BIRT 2 DATE 18 MAR 1496 2 PLAC Richmond Palace,,England 1 DEAT 2 DATE 25 JUN 1533 2 PLAC Westhorpe,Suffolk,England 1 FAMS @F317@ 1 FAMS @F318@ 1 FAMC @F282@ 0 @I831@ INDI 1 NAME Edmund /Tudor/ 1 SEX M 1 BIRT 2 DATE 21 FEB 1499 2 PLAC Greenwich,Palace,England 1 DEAT 2 DATE 19 JUN 1500 2 PLAC Bishops Hatfield,Herts,England 1 FAMC @F282@ 0 @I832@ INDI 1 NAME Katherine /Tudor/ 1 SEX F 1 BIRT 2 DATE 2 FEB 1503 2 PLAC Tower of London,,England 1 DEAT 2 DATE 1503 2 PLAC ,,England 1 FAMC @F282@ 0 @I833@ INDI 1 NAME Catherine of_Aragon // 1 SEX F 1 BIRT 2 DATE 15 DEC 1485 2 PLAC Near Madrid,,Spain 1 DEAT 2 DATE 7 JAN 1536 2 PLAC Kimbolton Castle,Hunts,England 1 BURI 2 PLAC Peterborough,Cathedral,England 1 FAMS @F313@ 1 FAMS @F319@ 1 FAMC @F320@ 0 @I834@ INDI 1 NAME James_IV // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1473 1 DEAT 2 DATE 9 SEP 1513 1 FAMS @F314@ 1 FAMC @F460@ 0 @I835@ INDI 1 NAME James_V // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1512 2 PLAC Linlithgow,,Scotland 1 DEAT 2 DATE 1542 1 FAMS @F458@ 1 FAMS @F459@ 1 FAMC @F314@ 0 @I836@ INDI 1 NAME Archibald /Douglas/ 1 TITL Earl of Angus VI 1 SEX M 1 DEAT 2 DATE ABT 1557 1 FAMS @F529@ 0 @I837@ INDI 1 NAME Henry /Stewart/ 1 TITL Lord Methven I 1 SEX M 1 DEAT 2 DATE ABT 1551 1 FAMS @F316@ 0 @I838@ INDI 1 NAME Louis_XII // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 27 JUN 1462 2 PLAC Blois,France 1 DEAT 2 DATE 1 JAN 1515 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1151@ 1 FAMS @F1201@ 1 FAMS @F317@ 1 FAMC @F462@ 0 @I839@ INDI 1 NAME Charles /Brandon/ 1 TITL Duke of Suffolk 1 SEX M 1 DEAT 2 DATE 1545 1 FAMS @F318@ 0 @I840@ INDI 1 NAME Ferdinand_V // 1 TITL King of Aragon 1 SEX M 1 BIRT 2 DATE 1452 1 DEAT 2 DATE 1516 1 FAMS @F320@ 1 FAMS @F1353@ 0 @I841@ INDI 1 NAME Isabella // 1 TITL Queen of Castile 1 SEX F 1 BIRT 2 DATE 1451 1 DEAT 2 DATE 1504 1 FAMS @F320@ 1 FAMC @F1152@ 0 @I842@ INDI 1 NAME Daughter /Tudor/ 1 SEX F 1 BIRT 2 DATE 31 JAN 1510 1 DEAT 2 DATE 31 JAN 1510 1 FAMC @F319@ 0 @I843@ INDI 1 NAME Henry_(1) /Tudor/ 1 TITL Duke of Cornwall 1 SEX M 1 BIRT 2 DATE 1 JAN 1511 2 PLAC Richmond Palace,,England 1 DEAT 2 DATE 22 FEB 1511 2 PLAC Richmond Palace,,England 1 FAMC @F319@ 0 @I844@ INDI 1 NAME Henry_(2) /Tudor/ 1 TITL Duke of Cornwall 1 SEX M 1 BIRT 2 DATE NOV 1513 2 PLAC Richmond Palace,,England 1 DEAT 2 DATE NOV 1513 2 PLAC Richmond Palace,,England 1 FAMC @F319@ 0 @I845@ INDI 1 NAME Son /Tudor/ 1 SEX M 1 BIRT 2 DATE DEC 1514 1 DEAT 2 DATE DEC 1514 1 FAMC @F319@ 0 @I846@ INDI 1 NAME Mary_I /Tudor/ 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE 18 FEB 1516 2 PLAC Greenwich Palace,London,England 1 DEAT 2 DATE 17 NOV 1558 2 PLAC St. James Palace,,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F334@ 1 FAMC @F319@ 0 @I847@ INDI 1 NAME Daughter /Tudor/ 1 SEX F 1 BIRT 2 DATE 10 NOV 1518 1 DEAT 2 DATE 10 NOV 1518 1 FAMC @F319@ 0 @I848@ INDI 1 NAME Anne /Boleyn/ 1 SEX F 1 BIRT 2 DATE ABT 1501 2 PLAC Blickling Hall,Norfolk,England 1 DEAT 2 DATE 19 MAY 1536 2 PLAC Tower of London,London,England 1 BURI 2 PLAC Chapel Royal,Tower of London,London,England 1 FAMS @F321@ 1 FAMC @F931@ 0 @I849@ INDI 1 NAME Elizabeth_I /Tudor/ 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE 7 SEP 1533 2 PLAC Greenwich Palace,London,England 1 DEAT 2 DATE 23 MAR 1603 2 PLAC Richmond Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMC @F321@ 0 @I850@ INDI 1 NAME Son /Tudor/ 1 SEX M 1 BIRT 2 DATE 29 JAN 1536 2 PLAC Greenwich,,England 1 DEAT 2 DATE 29 JAN 1536 2 PLAC Greenwich,,England 1 FAMC @F321@ 0 @I851@ INDI 1 NAME Jane /Seymour/ 1 SEX F 1 BIRT 2 DATE ABT 1505 2 PLAC Wolf Hall,Savernake,Wilts 1 DEAT 2 DATE 24 OCT 1537 2 PLAC Hampton Court,Palace,England 1 BURI 2 DATE 12 NOV 1537 2 PLAC St. George Chap.,Windsor,England 1 FAMS @F322@ 1 FAMC @F328@ 0 @I852@ INDI 1 NAME Edward_VI /Tudor/ 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 12 OCT 1537 2 PLAC Hampton Court,Palace,England 1 DEAT 2 DATE 6 JUL 1553 2 PLAC Greenwich,Palace,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMC @F322@ 0 @I853@ INDI 1 NAME Anne of_Cleves // 1 SEX F 1 BIRT 2 DATE 22 SEP 1515 2 PLAC Dusseldorf 1 DEAT 2 DATE 17 JUL 1557 2 PLAC Chelsea,,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F323@ 1 FAMC @F324@ 0 @I854@ INDI 1 NAME John_III // 1 TITL Duke of Cleves 1 SEX M 1 FAMS @F324@ 0 @I855@ INDI 1 NAME Marie of_Julich // 1 SEX F 1 FAMS @F324@ 0 @I856@ INDI 1 NAME Catherine /Howard/ 1 SEX F 1 BIRT 2 DATE ABT 1520 2 PLAC Lambeth 1 DEAT 2 DATE 13 FEB 1542 2 PLAC Tower of London,London,England 1 BURI 2 PLAC Chapel Royal,London,England 1 FAMS @F325@ 1 FAMC @F326@ 0 @I857@ INDI 1 NAME Edmund /Howard/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1513 1 FAMS @F326@ 1 FAMS @F1099@ 1 FAMC @F1096@ 0 @I858@ INDI 1 NAME Joyce /Culpeper/ 1 SEX F 1 FAMS @F326@ 0 @I859@ INDI 1 NAME Catherine /Parr/ 1 SEX F 1 BIRT 2 DATE ABT 1512 2 PLAC Kendal Castle 1 DEAT 2 DATE 5 SEP 1548 2 PLAC Sudeley Castle,Gloucestershire 1 BURI 2 PLAC Sudeley Castle,Chapel 1 FAMS @F329@ 1 FAMS @F330@ 1 FAMS @F327@ 1 FAMS @F331@ 1 FAMC @F332@ 0 @I860@ INDI 1 NAME John /Seymour/ 1 TITL Sir 1 SEX M 1 FAMS @F328@ 0 @I861@ INDI 1 NAME Margery /Wentworth/ 1 SEX F 1 FAMS @F328@ 0 @I862@ INDI 1 NAME Edward /Borough/ 1 TITL Sir 1 SEX M 1 DEAT 2 DATE BEF APR 1533 1 FAMS @F329@ 0 @I863@ INDI 1 NAME John /Nevill/ 1 TITL Baron Latimer #3 1 SEX M 1 DEAT 2 DATE 2 MAR 1543 2 PLAC London,England 1 FAMS @F330@ 0 @I864@ INDI 1 NAME Thomas /Seymour/ 1 TITL Baron Seymour 1 SEX M 1 FAMS @F331@ 0 @I865@ INDI 1 NAME Thomas of_Kendal /Parr/ 1 TITL Sir 1 SEX M 1 FAMS @F332@ 0 @I866@ INDI 1 NAME Maud /Green/ 1 SEX F 1 FAMS @F332@ 0 @I867@ INDI 1 NAME Daughter /Seymour/ 1 SEX F 1 BIRT 2 DATE 29 AUG 1548 1 DEAT 2 DATE 5 SEP 1548 1 FAMC @F331@ 0 @I868@ INDI 1 NAME Jane /Grey/ 1 TITL Queen of England 1 SEX F 1 BIRT 2 DATE OCT 1537 2 PLAC Bradgate,Leicestershire 1 DEAT 2 DATE 12 FEB 1554 2 PLAC Tower of London,Tower Green,London,England 1 BURI 2 PLAC Tower of London,Chapel Royal,London,England 1 FAMS @F333@ 1 FAMC @F527@ 0 @I869@ INDI 1 NAME Guildford /Dudley/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 12 FEB 1554 2 PLAC Tower of London,Tower Green,London,England 1 FAMS @F333@ 1 FAMC @F1078@ 0 @I870@ INDI 1 NAME Philip_II // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 21 MAY 1527 2 PLAC Valladolid 1 DEAT 2 DATE 13 SEP 1598 2 PLAC El Escorial,Palace,Madrid,Spain 1 FAMS @F949@ 1 FAMS @F334@ 1 FAMS @F950@ 1 FAMS @F951@ 1 FAMC @F335@ 0 @I871@ INDI 1 NAME Charles_V // 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1500 1 DEAT 2 DATE 1558 1 FAMS @F335@ 1 FAMC @F1352@ 0 @I872@ INDI 1 NAME Isabella of_Portugal // 1 SEX F 1 BIRT 2 DATE 1503 1 DEAT 2 DATE 1539 1 FAMS @F335@ 0 @I873@ INDI 1 NAME Simon /de_Montfort/ 1 TITL Earl Leicester 1 SEX M 1 DEAT 2 DATE 4 AUG 1265 2 PLAC Evesham 1 FAMS @F598@ 0 @I874@ INDI 1 NAME Tomislav of_Yugoslavia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1928 2 PLAC Belgrade 1 FAMS @F338@ 1 FAMS @F339@ 1 FAMC @F151@ 0 @I875@ INDI 1 NAME Andrej of_Yugoslavia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1929 2 PLAC ,,Yugoslavia 1 FAMS @F340@ 1 FAMS @F341@ 1 FAMS @F342@ 1 FAMC @F151@ 0 @I876@ INDI 1 NAME William /Marshal/ 1 TITL Earl of Pembroke 1 SEX M 1 DEAT 2 DATE 24 APR 1231 1 FAMS @F336@ 0 @I877@ INDI 1 NAME Alexander // 1 TITL Crown Prince 1 SEX M 1 BIRT 2 DATE 1945 1 FAMS @F337@ 1 FAMC @F165@ 0 @I878@ INDI 1 NAME Dona_Maria da_Gloria // 1 TITL Princess 1 SEX F 1 FAMS @F337@ 0 @I879@ INDI 1 NAME Peter of_Yugoslavia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1980 2 PLAC U.S.A. 1 FAMC @F337@ 0 @I880@ INDI 1 NAME Philip of_Yugoslavia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1982 2 PLAC Washington D.C.,U.S.A. 1 FAMC @F337@ 0 @I881@ INDI 1 NAME Alexander of_Yugoslavia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1982 2 PLAC Washington D.C.,U.S.A. 1 FAMC @F337@ 0 @I882@ INDI 1 NAME Alice /Scholastica/ 1 TITL Grand Duchess 1 SEX F 1 FAMS @F338@ 0 @I883@ INDI 1 NAME Nikolas K. /George/ 1 SEX M 1 BIRT 2 DATE 1958 1 FAMC @F338@ 0 @I884@ INDI 1 NAME Katarina K. /George/ 1 SEX F 1 BIRT 2 DATE 1959 1 FAMC @F338@ 0 @I885@ INDI 1 NAME Linda /Bonney/ 1 SEX F 1 FAMS @F339@ 0 @I886@ INDI 1 NAME George K. /George/ 1 SEX M 1 BIRT 2 DATE 1984 1 FAMC @F339@ 0 @I887@ INDI 1 NAME Christina of_Hesse // 1 SEX F 1 FAMS @F340@ 0 @I888@ INDI 1 NAME Tatiana Maria // 1 SEX F 1 BIRT 2 DATE 1957 1 FAMC @F340@ 0 @I889@ INDI 1 NAME Christopher K. /George/ 1 SEX M 1 BIRT 2 DATE 1960 1 FAMC @F340@ 0 @I890@ INDI 1 NAME Kira Melita of_Leiningen// 1 SEX F 1 BIRT 2 DATE 1930 1 FAMS @F341@ 1 FAMC @F346@ 0 @I891@ INDI 1 NAME Vladimir K. /George/ 1 SEX M 1 BIRT 2 DATE 1964 1 FAMC @F341@ 0 @I892@ INDI 1 NAME Dimitrye K. /George/ 1 SEX M 1 BIRT 2 DATE 1965 2 PLAC London,England 1 FAMC @F341@ 0 @I893@ INDI 1 NAME Mitsi // 1 SEX F 1 FAMS @F342@ 0 @I894@ INDI 1 NAME Louis // 1 TITL Dauphin 1 SEX M 1 DEAT 2 DATE 1765 1 FAMS @F1185@ 1 FAMC @F525@ 0 @I895@ INDI 1 NAME Maria of_Russia // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1907 1 DEAT 2 DATE 1951 1 FAMS @F346@ 1 FAMC @F213@ 0 @I896@ INDI 1 NAME Elizabeth of_France // 1 SEX F 1 BIRT 2 DATE 1602 1 DEAT 2 DATE 1644 1 FAMS @F948@ 1 FAMC @F271@ 0 @I897@ INDI 1 NAME Charles_X // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1757 1 DEAT 2 DATE NOV 1836 1 FAMS @F1186@ 1 FAMC @F1185@ 0 @I898@ INDI 1 NAME Louis_XVIII // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1755 2 PLAC Versailles,France 1 DEAT 2 DATE 16 SEP 1824 1 FAMC @F1185@ 0 @I899@ INDI 1 NAME Maria of_Russia // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1953 2 PLAC Madrid,Spain,Spain 1 FAMS @F345@ 1 FAMC @F214@ 0 @I900@ INDI 1 NAME Franz Wilhelm of_Prussia// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE ABT 1943 1 FAMS @F345@ 0 @I901@ INDI 1 NAME George of_Russia // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1981 2 PLAC ,,Spain 1 FAMC @F345@ 0 @I902@ INDI 1 NAME Karl of_Leiningen // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1898 1 DEAT 2 DATE 1946 1 FAMS @F346@ 0 @I903@ INDI 1 NAME Emich of_Leiningen // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1926 1 FAMS @F347@ 1 FAMC @F346@ 0 @I904@ INDI 1 NAME Karl of_Leiningen // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1928 1 FAMC @F346@ 0 @I905@ INDI 1 NAME Margarita // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1932 1 FAMC @F346@ 0 @I906@ INDI 1 NAME Mechtilde // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1936 1 FAMS @F350@ 1 FAMC @F346@ 0 @I907@ INDI 1 NAME Friedrich of_Leiningen // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1938 1 FAMC @F346@ 0 @I908@ INDI 1 NAME Eilika of_Oldenberg // 1 TITL Duchess 1 SEX F 1 FAMS @F347@ 0 @I909@ INDI 1 NAME Melita // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1951 1 FAMC @F347@ 0 @I910@ INDI 1 NAME Karl // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1952 1 FAMS @F348@ 1 FAMC @F347@ 0 @I911@ INDI 1 NAME Andreas // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1955 1 FAMS @F349@ 1 FAMC @F347@ 0 @I912@ INDI 1 NAME Stephanie // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1958 1 FAMC @F347@ 0 @I913@ INDI 1 NAME Margarite of_Hohenloche- Ochringen// 1 TITL Princess 1 SEX F 1 FAMS @F348@ 0 @I914@ INDI 1 NAME Alexandra of_Hanover // 1 TITL Princess 1 SEX F 1 FAMS @F349@ 0 @I915@ INDI 1 NAME Ferdinand // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1982 1 FAMC @F349@ 0 @I916@ INDI 1 NAME Karl /Bauscher/ 1 SEX M 1 FAMS @F350@ 0 @I917@ INDI 1 NAME Ulf /Bauscher/ 1 SEX M 1 BIRT 2 DATE 1963 1 FAMC @F350@ 0 @I918@ INDI 1 NAME Berthold /Bauscher/ 1 SEX M 1 BIRT 2 DATE 1965 1 FAMC @F350@ 0 @I919@ INDI 1 NAME Johan /Bauscher/ 1 SEX M 1 BIRT 2 DATE 1971 1 FAMC @F350@ 0 @I920@ INDI 1 NAME Anne of_Austria // 1 SEX F 1 BIRT 2 DATE 1601 1 DEAT 2 DATE 1666 1 FAMS @F521@ 1 FAMC @F522@ 0 @I921@ INDI 1 NAME Friedrich Wilhelm of_Prussia// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1939 1 FAMS @F355@ 1 FAMS @F356@ 1 FAMC @F188@ 0 @I922@ INDI 1 NAME Michael of_Prussia // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1939 1 FAMS @F354@ 1 FAMC @F188@ 0 @I923@ INDI 1 NAME Marie-Cecile of_Prussia // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1942 1 FAMC @F188@ 0 @I924@ INDI 1 NAME Louis Ferdinand of_Prussia// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1944 1 DEAT 2 DATE 1977 1 FAMS @F353@ 1 FAMC @F188@ 0 @I925@ INDI 1 NAME Christian Sigismund of_Prussia// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1946 1 FAMS @F352@ 1 FAMC @F188@ 0 @I926@ INDI 1 NAME Nina zu_Reventlow // 1 TITL Countess 1 SEX F 1 FAMS @F352@ 0 @I927@ INDI 1 NAME Daughter // 1 SEX F 1 FAMC @F352@ 0 @I928@ INDI 1 NAME Donata of_Castell- Rudenhausen// 1 SEX F 1 FAMS @F353@ 0 @I929@ INDI 1 NAME Georg Friedrich // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1976 1 FAMC @F353@ 0 @I930@ INDI 1 NAME Corneilie-Cecile // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1978 1 FAMC @F353@ 0 @I931@ INDI 1 NAME Jutta /Jorn/ 1 SEX F 1 FAMS @F354@ 0 @I932@ INDI 1 NAME Micaela // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1967 1 FAMC @F354@ 0 @I933@ INDI 1 NAME Nataly // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1970 1 FAMC @F354@ 0 @I934@ INDI 1 NAME Waltraud /Freydag/ 1 SEX F 1 FAMS @F355@ 0 @I935@ INDI 1 NAME Philip // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1968 1 FAMC @F355@ 0 @I936@ INDI 1 NAME Ehrengard /von_Reden/ 1 SEX F 1 FAMS @F356@ 0 @I937@ INDI 1 NAME Friedrich // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1979 1 FAMC @F356@ 0 @I938@ INDI 1 NAME Viktoria // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1982 1 FAMC @F356@ 0 @I939@ INDI 1 NAME Joachim // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1984 1 FAMC @F356@ 0 @I940@ INDI 1 NAME Margaret /Messenger/ 1 SEX F 1 FAMS @F357@ 0 @I941@ INDI 1 NAME Emily // 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1976 1 FAMC @F357@ 0 @I942@ INDI 1 NAME Benjamin // 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1978 1 FAMC @F357@ 0 @I943@ INDI 1 NAME Alexander /Lascelles/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1980 1 FAMC @F357@ 0 @I944@ INDI 1 NAME Edward /Lascelles/ 1 SEX M 1 BIRT 2 DATE 1982 1 FAMC @F357@ 0 @I945@ INDI 1 NAME Fredericka Ann /Duhrrson/ 1 SEX F 1 FAMS @F358@ 0 @I946@ INDI 1 NAME Sophie /Lascelles/ 1 SEX F 1 BIRT 2 DATE 1973 1 FAMC @F358@ 0 @I947@ INDI 1 NAME Rowan /Lascelles/ 1 SEX M 1 BIRT 2 DATE 1977 1 FAMC @F358@ 0 @I948@ INDI 1 NAME Julie /Bayliss/ 1 SEX F 1 FAMS @F359@ 0 @I949@ INDI 1 NAME Thomas /Lascelles/ 1 SEX M 1 BIRT 2 DATE 1982 1 FAMC @F359@ 0 @I950@ INDI 1 NAME Ellen /Lascelles/ 1 SEX F 1 BIRT 2 DATE 1984 1 FAMC @F359@ 0 @I951@ INDI 1 NAME Marie Louise // 1 SEX F 1 BIRT 2 DATE 1662 1 DEAT 2 DATE 1689 1 FAMS @F946@ 1 FAMC @F272@ 0 @I952@ INDI 1 NAME Maud /Carnegie/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1893 1 DEAT 2 DATE 1945 1 FAMS @F360@ 1 FAMC @F29@ 0 @I953@ INDI 1 NAME Charles of_Southesk // 1 TITL Earl XI 1 SEX M 1 BIRT 2 DATE 1893 1 FAMS @F360@ 0 @I954@ INDI 1 NAME James George Alexander/Carnegie/ 1 TITL Duke of Fife 1 SEX M 1 BIRT 2 DATE 1929 1 FAMS @F361@ 1 FAMC @F360@ 0 @I955@ INDI 1 NAME Caroline /Dewar/ 1 TITL Hon. 1 SEX F 1 FAMS @F361@ 0 @I956@ INDI 1 NAME Alexandra /Carnegie/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1959 1 FAMC @F361@ 0 @I957@ INDI 1 NAME David Charles /Carnegie/ 1 TITL Earl of Macduff 1 SEX M 1 BIRT 2 DATE 1961 1 FAMC @F361@ 0 @I958@ INDI 1 NAME Ragnhild Alexandra // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1930 2 PLAC Oslo,Norway 1 FAMS @F363@ 1 FAMC @F153@ 0 @I959@ INDI 1 NAME Astrid Maud Ingeborg// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1932 1 FAMS @F362@ 1 FAMC @F153@ 0 @I960@ INDI 1 NAME Johan Martin /Ferner/ 1 SEX M 1 BIRT 2 DATE 1927 1 FAMS @F362@ 0 @I961@ INDI 1 NAME Cathrine /Ferner/ 1 SEX F 1 BIRT 2 DATE 1962 1 FAMC @F362@ 0 @I962@ INDI 1 NAME Benedickte /Ferner/ 1 SEX M 1 BIRT 2 DATE 1963 1 FAMC @F362@ 0 @I963@ INDI 1 NAME Alexander /Ferner/ 1 SEX M 1 BIRT 2 DATE 1965 1 FAMC @F362@ 0 @I964@ INDI 1 NAME Elisabeth /Ferner/ 1 SEX F 1 BIRT 2 DATE 1969 1 FAMC @F362@ 0 @I965@ INDI 1 NAME Carl Christian /Ferner/ 1 SEX M 1 BIRT 2 DATE 1972 1 FAMC @F362@ 0 @I966@ INDI 1 NAME Erling /Lorentzen/ 1 SEX M 1 FAMS @F363@ 0 @I967@ INDI 1 NAME Haakon /Lorentzen/ 1 SEX M 1 FAMC @F363@ 0 @I968@ INDI 1 NAME Ingeborg /Lorentzen/ 1 SEX F 1 FAMC @F363@ 0 @I969@ INDI 1 NAME Ragnhild Alexandra /Lorentzen/ 1 SEX F 1 BIRT 2 DATE 1968 2 PLAC ,,Brazil 1 FAMC @F363@ 0 @I970@ INDI 1 NAME Anne of_Bourbon-Parma // 1 TITL Princess 1 SEX F 0 @I971@ INDI 1 NAME Joana Maria Valentina/Lambrino/ 1 SEX F 1 BIRT 2 DATE 3 OCT 1898 2 PLAC Roman,Romania 1 DEAT 2 DATE 11 MAR 1953 2 PLAC Paris,France 1 FAMS @F364@ 1 FAMC @F400@ 0 @I972@ INDI 1 NAME Margarita of_Romania // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1949 2 PLAC Lausanne 1 FAMC @F161@ 0 @I973@ INDI 1 NAME Helen of_Romania // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1950 2 PLAC Lausanne 1 FAMS @F365@ 1 FAMC @F161@ 0 @I974@ INDI 1 NAME Irina // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1953 2 PLAC Lausanne 1 FAMS @F366@ 1 FAMC @F161@ 0 @I975@ INDI 1 NAME Sophie // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1957 1 FAMC @F161@ 0 @I976@ INDI 1 NAME Maria // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1964 1 FAMC @F161@ 0 @I977@ INDI 1 NAME Robin /Medforth-Mills/ 1 TITL Professor 1 SEX M 1 FAMS @F365@ 0 @I978@ INDI 1 NAME Nicholas /Medforth-Mills/ 1 SEX M 1 BIRT 2 DATE 1985 1 FAMC @F365@ 0 @I979@ INDI 1 NAME John /Kreuger/ 1 SEX M 1 FAMS @F366@ 0 @I980@ INDI 1 NAME Michael /Kreuger/ 1 SEX M 1 BIRT 2 DATE 1985 1 FAMC @F366@ 0 @I981@ INDI 1 NAME William /Worsley/ 1 TITL Sir 1 SEX M 1 FAMS @F367@ 0 @I982@ INDI 1 NAME Martin /Lascelles/ 1 SEX M 1 BIRT 2 DATE 1963 1 FAMC @F102@ 0 @I983@ INDI 1 NAME Alexandra /Morton/ 1 SEX F 1 FAMS @F368@ 0 @I984@ INDI 1 NAME Richard_III // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 2 OCT 1452 2 PLAC Fotheringay,Castle 1 DEAT 2 DATE 22 AUG 1485 2 PLAC Bosworth 1 BURI 2 PLAC Grey Friars,Abbey,Leicester 1 FAMS @F369@ 1 FAMC @F371@ 0 @I985@ INDI 1 NAME Anne /Nevill/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 11 JUN 1456 2 PLAC Warwick Castle,Warwick,England 1 DEAT 2 DATE 16 MAR 1485 2 PLAC Westminster,Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F380@ 1 FAMS @F369@ 1 FAMC @F370@ 0 @I986@ INDI 1 NAME Edward // 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE ABT DEC 1473 2 PLAC Middleham Castle,Yorkshire,England 1 DEAT 2 DATE 9 APR 1484 2 PLAC Middleham Castle,Yorkshire,England 1 FAMC @F369@ 0 @I987@ INDI 1 NAME Richard /Neville/ 1 TITL Earl of Warwick 1 SEX M 1 DEAT 2 DATE 1471 1 FAMS @F370@ 1 FAMC @F490@ 0 @I988@ INDI 1 NAME Richard /Plantagenet/ 1 TITL Duke of York 1 SEX M 1 DEAT 2 DATE 1460 1 FAMS @F371@ 1 FAMC @F385@ 0 @I989@ INDI 1 NAME Cicely /Nevill/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1495 1 FAMS @F371@ 1 FAMC @F372@ 0 @I990@ INDI 1 NAME Ralph of_Westmoreland 1st// 1 TITL Earl 1 SEX M 1 FAMS @F372@ 0 @I991@ INDI 1 NAME Edward_IV // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 28 APR 1442 2 PLAC Rouen,France 1 DEAT 2 DATE 9 APR 1483 2 PLAC Westminster,Palace,London,England 1 BURI 2 PLAC St. George Chap.,Windsor,England 1 FAMS @F373@ 1 FAMC @F371@ 0 @I992@ INDI 1 NAME Edmund // 1 TITL Earl of Rutland 1 SEX M 1 DEAT 2 DATE 1460 1 FAMC @F371@ 0 @I993@ INDI 1 NAME George // 1 TITL Duke of Clarence 1 SEX M 1 FAMS @F381@ 1 FAMC @F371@ 0 @I994@ INDI 1 NAME Anne // 1 SEX F 1 DEAT 2 DATE 1476 1 FAMS @F382@ 1 FAMS @F383@ 1 FAMC @F371@ 0 @I995@ INDI 1 NAME Elizabeth // 1 SEX F 1 DEAT 2 DATE 1503 1 FAMS @F1056@ 1 FAMC @F371@ 0 @I996@ INDI 1 NAME Margaret // 1 SEX F 1 FAMS @F384@ 1 FAMC @F371@ 0 @I997@ INDI 1 NAME Ursula // 1 SEX F 1 FAMC @F371@ 0 @I998@ INDI 1 NAME Elizabeth /Woodville/ 1 SEX F 1 BIRT 2 DATE ABT 1437 2 PLAC Grafton Regis,Northants 1 DEAT 2 DATE 8 JUN 1492 2 PLAC Bermondsey Abbey 1 BURI 2 PLAC St. George Chap.,Windsor,England 1 FAMS @F379@ 1 FAMS @F373@ 1 FAMC @F1051@ 0 @I999@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE AUG 1466 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 23 MAY 1482 2 PLAC Greenwich,,England 1 FAMC @F373@ 0 @I1000@ INDI 1 NAME Cicely // 1 SEX F 1 BIRT 2 DATE 20 MAR 1469 1 DEAT 2 DATE 24 AUG 1507 2 PLAC Quarr Abbey,Isle of Wight,England 1 FAMS @F374@ 1 FAMS @F375@ 1 FAMC @F373@ 0 @I1001@ INDI 1 NAME Edward_V // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 4 NOV 1470 2 PLAC Sanctuary,Westminster,England 1 DEAT 2 DATE 1483 1 FAMC @F373@ 0 @I1002@ INDI 1 NAME Margaret // 1 SEX F 1 BIRT 2 DATE 10 APR 1472 1 DEAT 2 DATE 11 DEC 1472 1 FAMC @F373@ 0 @I1003@ INDI 1 NAME Richard // 1 TITL Duke of York 1 SEX M 1 BIRT 2 DATE 17 AUG 1473 2 PLAC Shrewsbury 1 DEAT 2 DATE AFT 1483 1 FAMS @F376@ 1 FAMC @F373@ 0 @I1004@ INDI 1 NAME Anne // 1 SEX F 1 BIRT 2 DATE 2 NOV 1475 2 PLAC Westminster,Palace 1 DEAT 2 DATE 23 NOV 1511 1 FAMS @F377@ 1 FAMC @F373@ 0 @I1005@ INDI 1 NAME George // 1 TITL Duke of Bedford 1 SEX M 1 BIRT 2 DATE MAR 1477 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE MAR 1479 2 PLAC Windsor Castle,Berkshire,England 1 FAMC @F373@ 0 @I1006@ INDI 1 NAME Catherine // 1 SEX F 1 BIRT 2 DATE ABT 14 AUG 1479 2 PLAC Eltham Palace 1 DEAT 2 DATE 15 NOV 1527 2 PLAC Tiverton 1 FAMS @F378@ 1 FAMC @F373@ 0 @I1007@ INDI 1 NAME Bridget // 1 SEX F 1 BIRT 2 DATE 10 NOV 1480 2 PLAC Eltham Palace 1 DEAT 2 DATE 1517 2 PLAC Dartford 1 FAMC @F373@ 0 @I1008@ INDI 1 NAME John 1st /Welles/ 1 TITL Viscount Welles 1 SEX M 1 DEAT 2 DATE 9 FEB 1499 2 PLAC London,,England 1 FAMS @F374@ 0 @I1009@ INDI 1 NAME Thomas of_Isle_of_Wight /Kyme/ 1 SEX M 1 FAMS @F375@ 0 @I1010@ INDI 1 NAME Anne /Mowbray/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 19 NOV 1481 2 PLAC Greenwich,,England 1 FAMS @F376@ 0 @I1011@ INDI 1 NAME Thomas 3rd /Howard/ 1 TITL Duke of Norfolk 1 SEX M 1 FAMS @F377@ 0 @I1012@ INDI 1 NAME William /Courtenay/ 1 TITL Earl of Devon 1 SEX M 1 FAMS @F378@ 0 @I1013@ INDI 1 NAME John /Grey/ 1 TITL Sir 1 SEX M 1 DEAT 2 DATE 17 FEB 1461 1 FAMS @F379@ 0 @I1014@ INDI 1 NAME Son /Grey/ 1 SEX M 1 BIRT 2 DATE BEF 1461 1 FAMC @F379@ 0 @I1015@ INDI 1 NAME Son_2 /Grey/ 1 SEX M 1 BIRT 2 DATE BEF 1461 1 FAMC @F379@ 0 @I1016@ INDI 1 NAME Edward // 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE 13 OCT 1453 2 PLAC Westminster,Palace,England 1 DEAT 2 DATE 4 MAY 1471 2 PLAC Tewkesbury 1 FAMS @F380@ 1 FAMC @F448@ 0 @I1017@ INDI 1 NAME Margaret of_Austria // 1 SEX F 1 BIRT 2 DATE 1584 1 DEAT 2 DATE 1611 1 FAMS @F522@ 1 FAMC @F1351@ 0 @I1018@ INDI 1 NAME Edward // 1 TITL Earl of Warwick 1 SEX M 1 DEAT 2 DATE 1499 1 FAMC @F381@ 0 @I1019@ INDI 1 NAME Margaret of_Salisbury // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE ABT 1469 1 DEAT 2 DATE 1541 1 FAMS @F1055@ 1 FAMC @F381@ 0 @I1020@ INDI 1 NAME Henry // 1 TITL Duke of Exeter 1 SEX M 1 FAMS @F382@ 0 @I1021@ INDI 1 NAME Thomas /St._Leger/ 1 TITL Sir 1 SEX M 1 FAMS @F383@ 0 @I1022@ INDI 1 NAME Charles the_Bold // 1 TITL Duke of Burgundy 1 SEX M 1 FAMS @F384@ 0 @I1023@ INDI 1 NAME Richard of_Cambridge /Plantagenet/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1415 1 FAMS @F385@ 1 FAMS @F535@ 1 FAMC @F488@ 0 @I1024@ INDI 1 NAME Anne /Mortimer/ 1 TITL Lady 1 SEX F 1 FAMS @F385@ 1 FAMC @F492@ 0 @I1025@ INDI 1 NAME Isabel /Plantagenet/ 1 SEX F 1 DEAT 2 DATE 1484 1 FAMS @F1053@ 1 FAMS @F386@ 1 FAMC @F385@ 0 @I1026@ INDI 1 NAME Henry 1st /Bourchier/ 1 TITL Earl of Essex 1 SEX M 1 FAMS @F386@ 1 FAMC @F621@ 0 @I1027@ INDI 1 NAME Charles_XV // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 3 MAY 1826 2 PLAC Stockholm,Sweden 1 DEAT 2 DATE 19 AUG 1872 2 PLAC Malmo 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F387@ 1 FAMC @F627@ 0 @I1028@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 5 AUG 1828 2 PLAC The Hague 1 DEAT 2 DATE 30 MAR 1871 2 PLAC Stockholm,Sweden 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F387@ 1 FAMC @F388@ 0 @I1029@ INDI 1 NAME Louisa of_Prussia // 1 SEX F 1 BIRT 2 DATE 1808 1 DEAT 2 DATE 1870 1 FAMS @F388@ 1 FAMC @F145@ 0 @I1030@ INDI 1 NAME Ernest Augustus of_Hanover/Hanover/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1914 1 DEAT 2 DATE 1987 1 FAMS @F392@ 1 FAMC @F198@ 0 @I1031@ INDI 1 NAME George William /Hanover/ 1 SEX M 1 BIRT 2 DATE 1915 1 FAMS @F391@ 1 FAMC @F198@ 0 @I1032@ INDI 1 NAME Mireille /Dutry/ 1 SEX F 1 BIRT 2 DATE 1946 1 FAMS @F389@ 0 @I1033@ INDI 1 NAME Christian /Hanover/ 1 SEX M 1 BIRT 2 DATE 1919 1 DEAT 2 DATE 1981 1 FAMS @F389@ 1 FAMC @F198@ 0 @I1034@ INDI 1 NAME Guelph Henry /Hanover/ 1 SEX M 1 BIRT 2 DATE 1923 1 FAMS @F390@ 1 FAMC @F198@ 0 @I1035@ INDI 1 NAME Monika of_Solms-Laubach /Hanover/ 1 SEX F 1 BIRT 2 DATE 1929 1 FAMC @F198@ 0 @I1036@ INDI 1 NAME Alexandra of_Ysenburg_and Budingen// 1 SEX F 1 BIRT 2 DATE 1938 1 FAMS @F390@ 0 @I1037@ INDI 1 NAME Sophie of_Greece // 1 SEX F 1 BIRT 2 DATE 1914 1 FAMS @F391@ 0 @I1038@ INDI 1 NAME Ortrud of_Schleswig- Holstein// 1 SEX F 1 BIRT 2 DATE 1925 1 DEAT 2 DATE 1980 1 FAMS @F392@ 0 @I1039@ INDI 1 NAME Marie /Hanover/ 1 SEX F 1 BIRT 2 DATE 1952 1 FAMS @F393@ 1 FAMC @F392@ 0 @I1040@ INDI 1 NAME Ernest Augustus of_Hanover/Hanover/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1954 1 FAMS @F394@ 1 FAMC @F392@ 0 @I1041@ INDI 1 NAME Ludwig Rudolph /Hanover/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 28 NOV 1955 1 DEAT 2 DATE 29 NOV 1989 1 BURI 2 DATE 2 DEC 1989 2 PLAC Grunau,Austria 1 FAMS @F395@ 1 FAMC @F392@ 0 @I1042@ INDI 1 NAME Olga /Hanover/ 1 SEX F 1 BIRT 2 DATE 1958 1 FAMC @F392@ 0 @I1043@ INDI 1 NAME Alexandra /Hanover/ 1 SEX F 1 BIRT 2 DATE 1959 1 FAMS @F396@ 1 FAMC @F392@ 0 @I1044@ INDI 1 NAME Heinrich Julius /Hanover/ 1 SEX M 1 BIRT 2 DATE 1961 1 FAMC @F392@ 0 @I1045@ INDI 1 NAME Michael /von_Hochberg/ 1 TITL Count 1 SEX M 1 FAMS @F393@ 0 @I1046@ INDI 1 NAME Chantal /Hochuli/ 1 SEX F 1 BIRT 2 PLAC ,Switzerland 1 FAMS @F394@ 0 @I1047@ INDI 1 NAME Ernest Augustus /Hanover/ 1 SEX M 1 BIRT 2 DATE 1983 1 FAMC @F394@ 0 @I1048@ INDI 1 NAME Christian Heinrich /Hanover/ 1 SEX M 1 BIRT 2 DATE 1985 1 FAMC @F394@ 0 @I1049@ INDI 1 NAME Isabella Valsassina /von_Thurn/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1962 1 DEAT 2 DATE 29 NOV 1989 1 BURI 2 DATE 2 DEC 1989 2 PLAC Grunau,Austria 1 FAMS @F395@ 0 @I1050@ INDI 1 NAME Otto /Hanover/ 1 SEX M 1 BIRT 2 DATE 1988 1 FAMC @F395@ 0 @I1051@ INDI 1 NAME Andreas of_Leiningen // 1 TITL Prince 1 SEX M 1 FAMS @F396@ 0 @I1052@ INDI 1 NAME Max of_Baden // 1 TITL Prince 1 SEX M 1 FAMS @F397@ 0 @I1053@ INDI 1 NAME Frederick Francis_IV of_Mecklenburg// 1 TITL Grand Duke 1 SEX M 1 FAMS @F398@ 0 @I1054@ INDI 1 NAME Margrethe of_Denmark // 1 SEX F 1 FAMS @F399@ 0 @I1055@ INDI 1 NAME Constantine /Lambrino/ 1 TITL Col. 1 SEX M 1 FAMS @F400@ 0 @I1056@ INDI 1 NAME Euphrosine /Alcaz/ 1 SEX F 1 FAMS @F400@ 0 @I1057@ INDI 1 NAME Son /Hohenzollern/ 1 SEX M 1 FAMC @F364@ 0 @I1058@ INDI 1 NAME Elena (Magda) /Lupescu/ 1 SEX F 1 BIRT 2 DATE 15 SEP 1895 2 PLAC Jassy 1 DEAT 2 DATE 28 JUN 1977 2 PLAC Estoril,Portugal 1 FAMS @F401@ 0 @I1059@ INDI 1 NAME Ingrid Victoria of_Sweden// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 28 MAR 1910 2 PLAC Stockholm 1 FAMS @F402@ 1 FAMC @F35@ 0 @I1060@ INDI 1 NAME Paul of_Sparta /Oldenburg/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1967 1 FAMC @F163@ 0 @I1061@ INDI 1 NAME Nicholas /Oldenburg/ 1 SEX M 1 BIRT 2 DATE 1969 1 FAMC @F163@ 0 @I1062@ INDI 1 NAME /Oldenburg/ 1 SEX F 1 FAMC @F163@ 0 @I1063@ INDI 1 NAME /Oldenburg/ 1 SEX F 1 FAMC @F163@ 0 @I1064@ INDI 1 NAME Irene of_Greece /Oldenburg/ 1 TITL Crown Princess 1 SEX F 1 BIRT 2 DATE 1942 1 FAMC @F162@ 0 @I1065@ INDI 1 NAME Petros /Manos/ 1 TITL Col. 1 SEX M 1 FAMS @F403@ 0 @I1066@ INDI 1 NAME Maria /Argyropoulos/ 1 SEX F 1 FAMS @F403@ 0 @I1067@ INDI 1 NAME Frederick Eugene /Wurttemberg/ 1 SEX M 1 BIRT 2 DATE 1732 1 DEAT 2 DATE 1797 1 FAMS @F404@ 0 @I1068@ INDI 1 NAME Frederica of_Brandenburg- Schwedt// 1 SEX F 1 BIRT 2 DATE 1736 1 DEAT 2 DATE 1798 1 FAMS @F404@ 0 @I1069@ INDI 1 NAME Augusta of_Brunswick // 1 SEX F 1 BIRT 2 DATE 1764 1 DEAT 2 DATE 1788 1 FAMS @F405@ 0 @I1070@ INDI 1 NAME William_I of_Wurttemberg /Wurttemberg/ 1 TITL King 1 SEX M 1 BIRT 2 DATE 1781 1 DEAT 2 DATE 1864 1 FAMS @F406@ 1 FAMS @F407@ 1 FAMS @F408@ 1 FAMC @F405@ 0 @I1071@ INDI 1 NAME Catherine /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1783 1 DEAT 2 DATE 1835 1 FAMC @F405@ 0 @I1072@ INDI 1 NAME Sophia Dorothea /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1783 1 DEAT 2 DATE 1784 1 FAMC @F405@ 0 @I1073@ INDI 1 NAME Paul /Wurttemberg/ 1 SEX M 1 BIRT 2 DATE 1785 1 DEAT 2 DATE 1852 1 FAMS @F411@ 1 FAMC @F405@ 0 @I1074@ INDI 1 NAME Charlotte of_Bavaria /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1792 1 DEAT 2 DATE 1873 1 FAMS @F406@ 1 FAMC @F431@ 0 @I1075@ INDI 1 NAME Catherine of_Russia // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1788 1 DEAT 2 DATE 1819 1 FAMS @F407@ 0 @I1076@ INDI 1 NAME Marie /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1816 1 DEAT 2 DATE 1887 1 FAMC @F407@ 0 @I1077@ INDI 1 NAME Sophie /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 17 JUN 1818 2 PLAC Stuttgart 1 DEAT 2 DATE 3 JUN 1877 2 PLAC Het Loo,Apeldoorn 1 FAMS @F447@ 1 FAMC @F407@ 0 @I1078@ INDI 1 NAME Pauline of_Wurttemberg // 1 SEX F 1 BIRT 2 DATE 1800 1 DEAT 2 DATE 1873 1 FAMS @F408@ 0 @I1079@ INDI 1 NAME Catherine /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1821 1 DEAT 2 DATE 1898 1 FAMS @F412@ 1 FAMC @F408@ 0 @I1080@ INDI 1 NAME Charles_I of_Wurttemberg /Wurttemberg/ 1 TITL King 1 SEX M 1 BIRT 2 DATE 1823 1 DEAT 2 DATE 1891 1 FAMS @F409@ 1 FAMC @F408@ 0 @I1081@ INDI 1 NAME Augusta /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1826 1 DEAT 2 DATE 1898 1 FAMS @F410@ 1 FAMC @F408@ 0 @I1082@ INDI 1 NAME Olga of_Russia // 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1822 1 DEAT 2 DATE 1892 1 FAMS @F409@ 0 @I1083@ INDI 1 NAME Hermann of_Saxe-Weimar // 1 TITL Prince 1 SEX M 1 FAMS @F410@ 0 @I1084@ INDI 1 NAME Charlotte of_Saxe- Hildburghausen// 1 SEX F 1 BIRT 2 DATE 1787 1 DEAT 2 DATE 1847 1 FAMS @F411@ 0 @I1085@ INDI 1 NAME Charlotte /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1807 1 DEAT 2 DATE 1873 1 FAMC @F411@ 0 @I1086@ INDI 1 NAME Frederick /Wurttemberg/ 1 SEX M 1 BIRT 2 DATE 1808 1 DEAT 2 DATE 1870 1 FAMS @F412@ 1 FAMC @F411@ 0 @I1087@ INDI 1 NAME Paul /Wurttemberg/ 1 SEX M 1 BIRT 2 DATE 1809 1 DEAT 2 DATE 1810 1 FAMC @F411@ 0 @I1088@ INDI 1 NAME Pauline /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1810 1 DEAT 2 DATE 1856 1 FAMC @F411@ 0 @I1089@ INDI 1 NAME August /Wurttemberg/ 1 SEX M 1 BIRT 2 DATE 1813 1 DEAT 2 DATE 1885 1 FAMC @F411@ 0 @I1090@ INDI 1 NAME William_II of_Wurttemberg /Wurttemberg/ 1 TITL King 1 SEX M 1 BIRT 2 DATE 1848 1 DEAT 2 DATE 1921 1 FAMS @F413@ 1 FAMS @F415@ 1 FAMC @F412@ 0 @I1091@ INDI 1 NAME Marie of_Waldeck and_Pyrmont// 1 SEX F 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1882 1 FAMS @F413@ 0 @I1092@ INDI 1 NAME Pauline /Wurttemberg/ 1 SEX F 1 BIRT 2 DATE 1877 1 DEAT 2 DATE 1965 1 FAMS @F414@ 1 FAMC @F413@ 0 @I1093@ INDI 1 NAME Ulrich /Wurttemberg/ 1 SEX M 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1880 1 FAMC @F413@ 0 @I1094@ INDI 1 NAME Frederick // 1 TITL Prince of Wied 1 SEX M 1 FAMS @F414@ 0 @I1095@ INDI 1 NAME Charlotte of_Schaumburg- Lippe// 1 SEX F 1 BIRT 2 DATE 1864 1 DEAT 2 DATE 1946 1 FAMS @F415@ 0 @I1096@ INDI 1 NAME Nicholas /Hohenzollern/ 1 SEX M 1 BIRT 2 DATE 1903 1 DEAT 2 DATE 1978 1 FAMC @F100@ 0 @I1097@ INDI 1 NAME Ileana /Hohenzollern/ 1 SEX F 1 BIRT 2 DATE 1909 1 FAMC @F100@ 0 @I1098@ INDI 1 NAME Mircea /Hohenzollern/ 1 BIRT 2 DATE 1913 1 DEAT 2 DATE 2 NOV 1916 1 BURI 2 PLAC Cotroceni Palace,Bucharest,Romania 1 FAMC @F100@ 0 @I1099@ INDI 1 NAME Leopold of_Hohenzollern /Hohenzollern/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1835 1 DEAT 2 DATE 1905 1 FAMS @F416@ 1 FAMC @F418@ 0 @I1100@ INDI 1 NAME Antonia of_Portugal // 1 SEX F 1 BIRT 2 DATE 1845 1 DEAT 2 DATE 1913 1 FAMS @F416@ 0 @I1101@ INDI 1 NAME William of_Hohenzollern /Hohenzollern/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1864 1 DEAT 2 DATE 1927 1 FAMC @F416@ 0 @I1102@ INDI 1 NAME Charles Anthony /Hohenzollern/ 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1919 1 FAMS @F417@ 1 FAMC @F416@ 0 @I1103@ INDI 1 NAME Josephine of_Belgium // 1 SEX F 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1958 1 FAMS @F417@ 1 FAMC @F422@ 0 @I1104@ INDI 1 NAME Charles Anthony /Hohenzollern/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1811 1 DEAT 2 DATE 1885 1 FAMS @F418@ 0 @I1105@ INDI 1 NAME Josephine of_Baden // 1 SEX F 1 BIRT 2 DATE 1813 1 DEAT 2 DATE 1900 1 FAMS @F418@ 0 @I1106@ INDI 1 NAME Stephanie /Hohenzollern/ 1 SEX F 1 BIRT 2 DATE 1837 1 DEAT 2 DATE 1859 1 FAMS @F419@ 1 FAMC @F418@ 0 @I1107@ INDI 1 NAME Carol_I of_Romania /Hohenzollern/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 20 APR 1839 2 PLAC Sigmaringen,Germany 1 DEAT 2 DATE 10 OCT 1914 2 PLAC Castle Pelesch,Sinaia,Romania 1 FAMS @F420@ 1 FAMC @F418@ 0 @I1108@ INDI 1 NAME Anthony /Hohenzollern/ 1 SEX M 1 BIRT 2 DATE 1841 1 DEAT 2 DATE 1866 1 FAMC @F418@ 0 @I1109@ INDI 1 NAME Frederick /Hohenzollern/ 1 SEX M 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1904 1 FAMS @F421@ 1 FAMC @F418@ 0 @I1110@ INDI 1 NAME Marie /Hohenzollern/ 1 SEX F 1 BIRT 2 DATE 1845 1 DEAT 2 DATE 1912 1 FAMS @F422@ 1 FAMC @F418@ 0 @I1111@ INDI 1 NAME Pedro_V // 1 TITL King of Portugal 1 SEX M 1 FAMS @F419@ 0 @I1112@ INDI 1 NAME Elisabeth of_Wied // 1 SEX F 1 BIRT 2 DATE 29 DEC 1843 2 PLAC Neuwied,Germany 1 DEAT 2 DATE 3 MAR 1916 2 PLAC Curtea de Arges,Romania 1 FAMS @F420@ 0 @I1113@ INDI 1 NAME Louise of_Thurn and_Taxis// 1 SEX F 1 FAMS @F421@ 0 @I1114@ INDI 1 NAME Philip of_Flanders // 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1837 1 DEAT 2 DATE 1905 1 FAMS @F422@ 1 FAMC @F663@ 0 @I1115@ INDI 1 NAME Baudouin // 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1891 1 FAMC @F422@ 0 @I1116@ INDI 1 NAME Henriette (twin) // 1 SEX F 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1948 1 FAMS @F1362@ 1 FAMC @F422@ 0 @I1117@ INDI 1 NAME Josephine (twin) // 1 SEX F 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1871 1 FAMC @F422@ 0 @I1118@ INDI 1 NAME Albert_I // 1 TITL King of Belgians 1 SEX M 1 BIRT 2 DATE 8 APR 1875 2 PLAC Brussels,Belgium 1 DEAT 2 DATE 17 FEB 1934 2 PLAC Marche-les-Dames,Near Namur 1 FAMS @F423@ 1 FAMC @F422@ 0 @I1119@ INDI 1 NAME Elisabeth of_Bavaria // 1 SEX F 1 BIRT 2 DATE 25 JUL 1876 2 PLAC Possenhofen 1 DEAT 2 DATE 23 NOV 1965 2 PLAC Chateau de,Stuyvenberg 1 BURI 2 PLAC Laeken 1 FAMS @F423@ 1 FAMC @F441@ 0 @I1120@ INDI 1 NAME Charles of_Belgium // 1 TITL Regent 1 SEX M 1 BIRT 2 DATE 1903 1 DEAT 2 DATE 1983 1 FAMC @F423@ 0 @I1121@ INDI 1 NAME Marie Jose // 1 SEX F 1 BIRT 2 DATE 1906 1 FAMS @F424@ 1 FAMC @F423@ 0 @I1122@ INDI 1 NAME Umberto_II // 1 TITL King of Italy 1 SEX M 1 BIRT 2 DATE 1904 1 DEAT 2 DATE 1983 1 FAMS @F424@ 0 @I1123@ INDI 1 NAME Josephine Charlotte // 1 SEX F 1 BIRT 2 DATE 1927 1 FAMS @F425@ 1 FAMC @F216@ 0 @I1124@ INDI 1 NAME Albert // 1 TITL Prince of Liege 1 SEX M 1 BIRT 2 DATE 1934 1 FAMS @F427@ 1 FAMC @F216@ 0 @I1125@ INDI 1 NAME Jean of_Luxembourg // 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1921 1 FAMS @F425@ 0 @I1126@ INDI 1 NAME Fabiola de_Mora_y_Aragon // 1 SEX F 1 BIRT 2 DATE 11 JUN 1928 2 PLAC Madrid,Spain 1 FAMS @F426@ 0 @I1127@ INDI 1 NAME Paola di_Calabria /Ruffo/ 1 SEX F 1 BIRT 2 DATE 1937 1 FAMS @F427@ 0 @I1128@ INDI 1 NAME Philippe // 1 SEX M 1 BIRT 2 DATE 1960 1 FAMC @F427@ 0 @I1129@ INDI 1 NAME Astrid // 1 SEX F 1 BIRT 2 DATE 1962 1 FAMS @F428@ 1 FAMC @F427@ 0 @I1130@ INDI 1 NAME Laurent // 1 SEX M 1 BIRT 2 DATE 1963 1 FAMC @F427@ 0 @I1131@ INDI 1 NAME Lorenz of_Austria-Este // 1 TITL Archduke 1 SEX M 1 BIRT 2 DATE 1955 1 FAMS @F428@ 0 @I1132@ INDI 1 NAME Mary Liliane /Baels/ 1 SEX F 1 BIRT 2 DATE 28 NOV 1916 2 PLAC Highbury,London,England 1 FAMS @F429@ 0 @I1133@ INDI 1 NAME Alexandre // 1 SEX M 1 BIRT 2 DATE 1942 1 FAMC @F429@ 0 @I1134@ INDI 1 NAME Marie Christine // 1 SEX F 1 BIRT 2 DATE 1951 1 FAMS @F430@ 1 FAMC @F429@ 0 @I1135@ INDI 1 NAME Marie Esmeralda // 1 SEX F 1 BIRT 2 DATE 1956 1 FAMC @F429@ 0 @I1136@ INDI 1 NAME Paul /Druker/ 1 SEX M 1 FAMS @F430@ 0 @I1137@ INDI 1 NAME Augusta Wilhelmine of_Hesse-// 1 SEX F 1 BIRT 2 DATE 14 APR 1765 2 PLAC Darmstadt 1 DEAT 2 DATE 30 MAR 1796 2 PLAC Near,Heidelberg,Germany 1 FAMS @F431@ 0 @I1138@ INDI 1 NAME Ludwig_I /Wittelsbach/ 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE 25 AUG 1786 2 PLAC Strassburg 1 DEAT 2 DATE 29 FEB 1868 2 PLAC Nice 1 BURI 2 PLAC St. Boniface,Church,Munich 1 FAMS @F432@ 1 FAMC @F431@ 0 @I1139@ INDI 1 NAME Auguste /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1788 1 DEAT 2 DATE 1851 1 FAMC @F431@ 0 @I1140@ INDI 1 NAME Amelia /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1790 1 DEAT 2 DATE 1794 1 FAMC @F431@ 0 @I1141@ INDI 1 NAME Charles /Wittelsbach/ 1 SEX M 1 BIRT 2 DATE 1795 1 DEAT 2 DATE 1875 1 FAMC @F431@ 0 @I1142@ INDI 1 NAME Therese of_Saxe- Hildburghausen// 1 SEX F 1 BIRT 2 DATE 8 JUL 1792 2 PLAC Hildburghausen 1 DEAT 2 DATE 26 OCT 1854 2 PLAC Munich 1 BURI 2 PLAC St. Boniface,Church,Munich 1 FAMS @F432@ 0 @I1143@ INDI 1 NAME Maximilian_II // 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE 28 NOV 1811 2 PLAC Munich 1 DEAT 2 DATE 10 MAR 1864 2 PLAC Munich 1 BURI 2 PLAC Theatinerkirche 1 FAMS @F433@ 1 FAMC @F432@ 0 @I1144@ INDI 1 NAME Marie of_Prussia // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 15 OCT 1825 2 PLAC Berlin 1 DEAT 2 DATE 17 MAY 1889 2 PLAC Schloss,Hohenschwangau 1 BURI 2 PLAC Theatinerkirche 1 FAMS @F433@ 0 @I1145@ INDI 1 NAME Ludwig_II /Wittelsbach/ 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE 25 AUG 1845 2 PLAC Schloss,Nymphenburg 1 DEAT 2 DATE 13 JUN 1886 2 PLAC Starnbergersee,Near Schloss,Berg 1 BURI 2 PLAC St. Michaels,Church,Munich 1 FAMC @F433@ 0 @I1146@ INDI 1 NAME Otto_I /Wittelsbach/ 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE 27 APR 1848 2 PLAC Munich 1 DEAT 2 DATE 11 OCT 1916 2 PLAC Near,Munich 1 BURI 2 PLAC St. Michaels,Church,Munich 1 FAMC @F433@ 0 @I1147@ INDI 1 NAME 5sons_1dau // 1 FAMC @F598@ 0 @I1148@ INDI 1 NAME Otto_I Friedrich Ludwig/Wittelsbach/ 1 TITL King of Greece 1 SEX M 1 BIRT 2 DATE 1 JUN 1815 2 PLAC Salzburg,Austria 1 DEAT 2 DATE 26 JUL 1867 2 PLAC Bamberg,Germany 1 BURI 2 PLAC Theatinerkirche,Munich,Germany 1 FAMS @F662@ 1 FAMC @F432@ 0 @I1149@ INDI 1 NAME Theodolinde // 1 BIRT 2 DATE 1816 1 DEAT 2 DATE 1817 1 FAMC @F432@ 0 @I1150@ INDI 1 NAME Luitpold // 1 TITL Regent 1 SEX M 1 BIRT 2 DATE 1821 1 DEAT 2 DATE 1912 1 FAMS @F438@ 1 FAMC @F432@ 0 @I1151@ INDI 1 NAME Adelgunde // 1 SEX F 1 BIRT 2 DATE 1823 1 DEAT 2 DATE 1914 1 FAMC @F432@ 0 @I1152@ INDI 1 NAME Hildegarde // 1 SEX F 1 BIRT 2 DATE 1825 1 DEAT 2 DATE 1864 1 FAMC @F432@ 0 @I1153@ INDI 1 NAME Adalbert // 1 SEX M 1 BIRT 2 DATE 1828 1 DEAT 2 DATE 1875 1 FAMC @F432@ 0 @I1154@ INDI 1 NAME Maximilian /Wittelsbach/ 1 SEX M 1 BIRT 2 DATE 1800 1 DEAT 2 DATE 1803 1 FAMC @F232@ 0 @I1155@ INDI 1 NAME Elizabeth (twin) of_Bavaria/Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1801 1 DEAT 2 DATE 1873 1 FAMS @F434@ 1 FAMC @F232@ 0 @I1156@ INDI 1 NAME Amelia (twin) /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1801 1 DEAT 2 DATE 1877 1 FAMC @F232@ 0 @I1157@ INDI 1 NAME Maria (twin) /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1805 1 DEAT 2 DATE 1877 1 FAMC @F232@ 0 @I1158@ INDI 1 NAME Ludovica (Louise) /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1808 1 DEAT 2 DATE 1892 1 FAMS @F440@ 1 FAMC @F232@ 0 @I1159@ INDI 1 NAME Maximiliana /Wittelsbach/ 1 SEX F 1 BIRT 2 DATE 1810 1 DEAT 2 DATE 1821 1 FAMC @F232@ 0 @I1160@ INDI 1 NAME Frederick Louis // 1 SEX M 1 BIRT 2 DATE 1707 1 DEAT 2 DATE 1708 1 FAMC @F435@ 0 @I1161@ INDI 1 NAME Frederick William // 1 SEX M 1 BIRT 2 DATE 1710 1 DEAT 2 DATE 1711 1 FAMC @F435@ 0 @I1162@ INDI 1 NAME Frederick_II the_Great // 1 TITL King of Prussia 1 SEX M 1 BIRT 2 DATE 24 JAN 1712 2 PLAC Berlin,Germany 1 DEAT 2 DATE 17 AUG 1786 2 PLAC Sans Souci,Potsdam,Germany 1 FAMS @F623@ 1 FAMC @F435@ 0 @I1163@ INDI 1 NAME Charlotte Albertine // 1 SEX F 1 BIRT 2 DATE 1713 1 DEAT 2 DATE 1714 1 FAMC @F435@ 0 @I1164@ INDI 1 NAME Frederica Louise // 1 SEX F 1 BIRT 2 DATE 1714 1 DEAT 2 DATE 1784 1 FAMC @F435@ 0 @I1165@ INDI 1 NAME Philippine Charlotte // 1 SEX F 1 BIRT 2 DATE 1716 1 DEAT 2 DATE 1801 1 FAMC @F435@ 0 @I1166@ INDI 1 NAME Louis Charles William// 1 SEX M 1 BIRT 2 DATE 1717 1 DEAT 2 DATE 1719 1 FAMC @F435@ 0 @I1167@ INDI 1 NAME Sophia // 1 SEX F 1 BIRT 2 DATE 1719 1 DEAT 2 DATE 1765 1 FAMC @F435@ 0 @I1168@ INDI 1 NAME Louise Ulrika // 1 SEX F 1 BIRT 2 DATE 1720 1 DEAT 2 DATE 1782 1 FAMC @F435@ 0 @I1169@ INDI 1 NAME Anna Amelia // 1 SEX F 1 BIRT 2 DATE 1725 1 DEAT 2 DATE 1787 1 FAMC @F435@ 0 @I1170@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE 1726 1 DEAT 2 DATE 1802 1 FAMC @F435@ 0 @I1171@ INDI 1 NAME Ferdinand // 1 SEX M 1 BIRT 2 DATE 1730 1 DEAT 2 DATE 1813 1 FAMC @F435@ 0 @I1172@ INDI 1 NAME Heinrich_XXII /Reuss/ 1 TITL Prince 1 SEX M 1 FAMS @F278@ 0 @I1173@ INDI 1 NAME Elizabeth Henrietta of_Hesse-Cassel// 1 SEX F 1 BIRT 2 DATE 8 NOV 1661 2 PLAC Cassel 1 DEAT 2 DATE 27 JUN 1683 2 PLAC Coln au Der,Spree 1 FAMS @F436@ 0 @I1174@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1680 1 DEAT 2 DATE 1705 1 FAMC @F436@ 0 @I1175@ INDI 1 NAME Frederick_I // 1 TITL King of Sweden 1 SEX M 1 FAMC @F436@ 0 @I1176@ INDI 1 NAME Sophia Louise of_Mecklenburg-// 1 SEX F 1 BIRT 2 DATE 16 MAY 1685 1 DEAT 2 DATE 29 JUL 1735 2 PLAC Grabow 1 FAMS @F437@ 0 @I1177@ INDI 1 NAME Frederick Augustus // 1 SEX M 1 BIRT 2 DATE 1685 1 DEAT 2 DATE 1686 1 FAMC @F267@ 0 @I1178@ INDI 1 NAME Son (stillborn) // 1 SEX M 1 FAMC @F267@ 0 @I1179@ INDI 1 NAME Augusta of_Austria- Tuscany// 1 TITL Archduchess 1 SEX F 1 BIRT 2 DATE 1825 1 DEAT 2 DATE 1864 1 FAMS @F438@ 0 @I1180@ INDI 1 NAME Leopold // 1 SEX M 1 BIRT 2 DATE 1846 1 DEAT 2 DATE 1930 1 FAMC @F438@ 0 @I1181@ INDI 1 NAME Therese // 1 SEX F 1 BIRT 2 DATE 1850 1 DEAT 2 DATE 1925 1 FAMC @F438@ 0 @I1182@ INDI 1 NAME Amulf // 1 SEX M 1 BIRT 2 DATE 1852 1 DEAT 2 DATE 1907 1 FAMC @F438@ 0 @I1183@ INDI 1 NAME Luitpold // 1 SEX M 1 BIRT 2 DATE 1901 1 DEAT 2 DATE 1914 1 FAMC @F258@ 0 @I1184@ INDI 1 NAME Irmingard // 1 SEX F 1 BIRT 2 DATE 1902 1 DEAT 2 DATE 1903 1 FAMC @F258@ 0 @I1185@ INDI 1 NAME Rudolf // 1 SEX M 1 BIRT 2 DATE 1909 1 DEAT 2 DATE 1912 1 FAMC @F258@ 0 @I1186@ INDI 1 NAME Antoinette of_Luxembourg // 1 SEX F 1 BIRT 2 DATE 1899 1 DEAT 2 DATE 1954 1 FAMS @F439@ 0 @I1187@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE 1922 1 DEAT 2 DATE 1958 1 FAMC @F439@ 0 @I1188@ INDI 1 NAME Irmingard // 1 SEX F 1 BIRT 2 DATE 1923 1 FAMC @F439@ 0 @I1189@ INDI 1 NAME Editha // 1 SEX F 1 BIRT 2 DATE 1924 1 FAMC @F439@ 0 @I1190@ INDI 1 NAME Hilda // 1 SEX F 1 BIRT 2 DATE 1926 1 FAMC @F439@ 0 @I1191@ INDI 1 NAME Gabriele // 1 SEX F 1 BIRT 2 DATE 1927 1 FAMC @F439@ 0 @I1192@ INDI 1 NAME Sophie // 1 SEX F 1 BIRT 2 DATE 1935 1 FAMC @F439@ 0 @I1193@ INDI 1 NAME Maximilian Joseph // 1 TITL Duke of Bavaria 1 SEX M 1 FAMS @F440@ 0 @I1194@ INDI 1 NAME Ludwig // 1 SEX M 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1920 1 FAMC @F440@ 0 @I1195@ INDI 1 NAME Helene // 1 SEX F 1 BIRT 2 DATE 1834 1 DEAT 2 DATE 1858 1 FAMC @F440@ 0 @I1196@ INDI 1 NAME Elizabeth // 1 TITL Empress 1 SEX F 1 BIRT 2 DATE 1837 1 DEAT 2 DATE 1898 1 FAMS @F532@ 1 FAMC @F440@ 0 @I1197@ INDI 1 NAME Karl Theodor "Gackl"// 1 SEX M 1 BIRT 2 DATE 1839 1 DEAT 2 DATE 1909 1 FAMS @F441@ 1 FAMC @F440@ 0 @I1198@ INDI 1 NAME Maria // 1 SEX F 1 BIRT 2 DATE 1841 1 DEAT 2 DATE 1925 1 FAMC @F440@ 0 @I1199@ INDI 1 NAME Mathilde // 1 SEX F 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1925 1 FAMC @F440@ 0 @I1200@ INDI 1 NAME Sophie // 1 SEX F 1 BIRT 2 DATE 1847 1 DEAT 2 DATE 1897 1 FAMS @F533@ 1 FAMC @F440@ 0 @I1201@ INDI 1 NAME Maximilian // 1 SEX M 1 BIRT 2 DATE 1849 1 DEAT 2 DATE 1893 1 FAMC @F440@ 0 @I1202@ INDI 1 NAME Maria Josepha of_Portugal// 1 SEX F 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1943 1 FAMS @F441@ 1 FAMC @F1361@ 0 @I1203@ INDI 1 NAME Alexander /Zoubkoff/ 1 SEX M 1 FAMS @F442@ 0 @I1204@ INDI 1 NAME Irene // 1 SEX F 1 BIRT 2 DATE 1939 1 FAMS @F657@ 1 FAMC @F243@ 0 @I1205@ INDI 1 NAME Margaret // 1 SEX F 1 BIRT 2 DATE 1943 1 FAMS @F658@ 1 FAMC @F243@ 0 @I1206@ INDI 1 NAME Mary Christina // 1 SEX F 1 BIRT 2 DATE 1947 1 FAMS @F659@ 1 FAMC @F243@ 0 @I1207@ INDI 1 NAME Claus /von_Amsberg/ 1 SEX M 1 BIRT 2 DATE 6 SEP 1926 2 PLAC Dotzingen 1 FAMS @F443@ 1 FAMC @F444@ 0 @I1208@ INDI 1 NAME William Alexander // 1 TITL Prince of Orange 1 SEX M 1 BIRT 2 DATE 1967 1 FAMC @F443@ 0 @I1209@ INDI 1 NAME John Friso // 1 SEX M 1 BIRT 2 DATE 1968 1 FAMC @F443@ 0 @I1210@ INDI 1 NAME Constantine // 1 SEX M 1 BIRT 2 DATE 1969 1 FAMC @F443@ 0 @I1211@ INDI 1 NAME Claus /von_Amsberg/ 1 SEX M 1 FAMS @F444@ 0 @I1212@ INDI 1 NAME Gosta /von_dem_Bussche-/ 1 TITL Baroness 1 SEX F 1 FAMS @F444@ 0 @I1213@ INDI 1 NAME Frederick Francis_II of_Mecklenburg-// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1823 1 DEAT 2 DATE 1883 1 FAMS @F445@ 1 FAMC @F183@ 0 @I1214@ INDI 1 NAME Marie of_Schwarzburg- Rudolstadt// 1 SEX F 1 FAMS @F445@ 1 FAMC @F1256@ 0 @I1215@ INDI 1 NAME Antoine de_Bourbon of_France// 1 SEX M 1 FAMS @F446@ 0 @I1216@ INDI 1 NAME Helene of_Nassau Henrietta// 1 SEX F 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1888 1 FAMS @F67@ 0 @I1217@ INDI 1 NAME Henry_VI // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 6 DEC 1421 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 21 MAY 1471 2 PLAC Tower of London,London,England 1 BURI 2 PLAC St. George Chap.,Windsor,Berkshire,England 1 FAMS @F448@ 1 FAMC @F449@ 0 @I1218@ INDI 1 NAME Margaret of_Anjou // 1 SEX F 1 BIRT 2 DATE 23 MAR 1429 2 PLAC Pont-a-Mousson,Lorraine 1 DEAT 2 DATE 25 AUG 1482 2 PLAC Chateau de,Dampiere,Near Saumur 1 BURI 2 PLAC Angers,Cathedral 1 FAMS @F448@ 1 FAMC @F1052@ 0 @I1219@ INDI 1 NAME Henry_V // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 9 AUG 1387 2 PLAC Monmouth 1 DEAT 2 DATE 31 AUG 1422 2 PLAC Bois de,Vincennes 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F449@ 1 FAMC @F450@ 0 @I1220@ INDI 1 NAME Catherine of_Valois // 1 SEX F 1 BIRT 2 DATE 27 OCT 1401 2 PLAC Paris 1 DEAT 2 DATE 3 JAN 1437 2 PLAC Bermondsey,Abbey 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F449@ 1 FAMS @F497@ 1 FAMC @F915@ 0 @I1221@ INDI 1 NAME Henry_IV // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 4 APR 1366 2 PLAC Bolingbrooke,Castle 1 DEAT 2 DATE 20 MAR 1413 2 PLAC London,England 1 BURI 2 PLAC Canterbury,Cathedral,England 1 FAMS @F450@ 1 FAMS @F620@ 1 FAMC @F452@ 0 @I1222@ INDI 1 NAME Mary /De_Bohun/ 1 SEX F 1 DEAT 2 DATE 4 JUL 1394 2 PLAC Peterborough,Castle 1 FAMS @F450@ 1 FAMC @F914@ 0 @I1223@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE APR 1382 1 DEAT 2 DATE ABT 1382 1 FAMC @F450@ 0 @I1224@ INDI 1 NAME Thomas // 1 TITL Duke of Clarence 1 SEX M 1 BIRT 2 DATE 1388 2 PLAC Kenilworth 1 DEAT 2 DATE 22 MAR 1421 2 PLAC Beauge 1 FAMS @F613@ 1 FAMC @F450@ 0 @I1225@ INDI 1 NAME John // 1 TITL Duke of Bedford 1 SEX M 1 BIRT 2 DATE 20 JUN 1389 1 DEAT 2 DATE 15 SEP 1435 2 PLAC Rouen 1 FAMS @F614@ 1 FAMS @F484@ 1 FAMC @F450@ 0 @I1226@ INDI 1 NAME Humphrey of_Gloucester // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE SEP 1390 1 DEAT 2 DATE 23 FEB 1447 2 PLAC Bury St. Edmunds 1 FAMS @F615@ 1 FAMS @F616@ 1 FAMC @F450@ 0 @I1227@ INDI 1 NAME Blanche // 1 SEX F 1 BIRT 2 DATE 1392 2 PLAC Peterborough,Castle 1 DEAT 2 DATE 21 MAY 1409 2 PLAC Germany 1 FAMS @F617@ 1 FAMC @F450@ 0 @I1228@ INDI 1 NAME Philippa // 1 SEX F 1 BIRT 2 DATE 4 JUL 1394 2 PLAC Peterborough,Castle 1 DEAT 2 DATE 5 JAN 1430 2 PLAC Convent,of Vadstena 1 FAMS @F618@ 1 FAMC @F450@ 0 @I1229@ INDI 1 NAME Edward_III // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 13 NOV 1312 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 21 JUN 1377 2 PLAC Sheen Palace 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F451@ 1 FAMC @F92@ 0 @I1230@ INDI 1 NAME Philippa of_Hainault // 1 SEX F 1 BIRT 2 DATE 24 JUN 1311 2 PLAC Valenciennes 1 DEAT 2 DATE 14 AUG 1369 2 PLAC Windsor Castle,Windsor,Berkshire,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F451@ 1 FAMC @F900@ 0 @I1231@ INDI 1 NAME Edward // 1 TITL Prince of Wales 1 SEX M 1 BIRT 2 DATE 15 JUN 1330 2 PLAC Woodstock,Oxfordshire,England 1 DEAT 2 DATE 8 JUN 1376 2 PLAC Westminster,Palace,London,England 1 BURI 2 PLAC Canterbury,Cathedral,London,England 1 FAMS @F513@ 1 FAMC @F451@ 0 @I1232@ INDI 1 NAME Isabella // 1 SEX F 1 BIRT 2 DATE 16 JUN 1332 2 PLAC Woodstock 1 DEAT 2 DATE BEF OCT 1382 2 PLAC London 1 FAMS @F516@ 1 FAMC @F451@ 0 @I1233@ INDI 1 NAME Joan (Joanna) // 1 SEX F 1 BIRT 2 DATE ABT FEB 1335 2 PLAC Woodstock 1 DEAT 2 DATE 2 SEP 1348 2 PLAC Bayonne 1 FAMC @F451@ 0 @I1234@ INDI 1 NAME William of_Hatfield // 1 SEX M 1 BIRT 2 DATE BEF 16 FEB 1337 2 PLAC Hatfield Herts 1 DEAT 2 DATE BEF 8 JUL 1337 1 FAMC @F451@ 0 @I1235@ INDI 1 NAME Lionel of_Antwerp // 1 TITL Duke of Clarence 1 SEX M 1 BIRT 2 DATE 29 NOV 1338 2 PLAC Antwerp,Belgium 1 DEAT 2 DATE 10 DEC 1363 2 PLAC Dublin,Ireland 1 FAMS @F519@ 1 FAMS @F493@ 1 FAMC @F451@ 0 @I1236@ INDI 1 NAME John of_Gaunt // 1 TITL Duke of Lancast. 1 SEX M 1 BIRT 2 DATE MAR 1340 2 PLAC Ghent 1 DEAT 2 DATE 3 FEB 1399 2 PLAC Leicester Castle 1 FAMS @F452@ 1 FAMS @F517@ 1 FAMS @F485@ 1 FAMC @F451@ 0 @I1237@ INDI 1 NAME Edmund of_Langley // 1 TITL Duke of York 1 SEX M 1 BIRT 2 DATE 5 JUN 1341 2 PLAC Kings Langley,Herts 1 DEAT 2 DATE 1 AUG 1402 2 PLAC Kings Langley,Herts 1 FAMS @F488@ 1 FAMS @F534@ 1 FAMC @F451@ 0 @I1238@ INDI 1 NAME Blanche // 1 SEX F 1 BIRT 2 DATE MAR 1342 2 PLAC Tower of London 1 DEAT 2 DATE MAR 1342 2 PLAC Tower of London 1 FAMC @F451@ 0 @I1239@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 10 OCT 1344 2 PLAC Waltham,Near Winchester 1 DEAT 2 DATE 1361/1362 1 FAMS @F612@ 1 FAMC @F451@ 0 @I1240@ INDI 1 NAME Margaret // 1 SEX F 1 BIRT 2 DATE 20 JUL 1346 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE AFT 1 OCT 1361 1 FAMS @F518@ 1 FAMC @F451@ 0 @I1241@ INDI 1 NAME William of_Windsor // 1 SEX M 1 BIRT 2 DATE 24 JUN 1348 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE SEP 1348 1 FAMC @F451@ 0 @I1242@ INDI 1 NAME Thomas of_Woodstock // 1 TITL Duke of Glouces. 1 SEX M 1 BIRT 2 DATE 7 JAN 1355 2 PLAC Woodstock 1 DEAT 2 DATE 15 SEP 1396/1397 2 PLAC Calais 1 FAMS @F491@ 1 FAMC @F451@ 0 @I1243@ INDI 1 NAME Blanche of_Lancaster // 1 SEX F 1 BIRT 2 DATE 1341 1 DEAT 2 DATE 12 SEP 1369 2 PLAC Bolingbroke,Castle 1 FAMS @F452@ 1 FAMC @F560@ 0 @I1244@ INDI 1 NAME Isabella_II // 1 TITL Queen of Spain 1 SEX F 1 BIRT 2 DATE 1830 2 PLAC Madrid,Spain 1 DEAT 2 DATE 1904 1 FAMS @F453@ 1 FAMC @F454@ 0 @I1245@ INDI 1 NAME Don_Francisco /de_Asis/ 1 SEX M 1 BIRT 2 DATE 1822 1 DEAT 2 DATE 1902 1 FAMS @F453@ 0 @I1246@ INDI 1 NAME Ferdinand_VII // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1784 1 DEAT 2 DATE 1833 1 FAMS @F1345@ 1 FAMS @F1346@ 1 FAMS @F1347@ 1 FAMS @F454@ 1 FAMC @F1348@ 0 @I1247@ INDI 1 NAME Mary /Stuart/ 1 TITL Queen of Scots 1 SEX F 1 BIRT 2 DATE 7 DEC 1542 2 PLAC Linlithgow,Scotland 1 DEAT 2 DATE 8 FEB 1587 2 PLAC ,England 1 FAMS @F456@ 1 FAMS @F455@ 1 FAMS @F457@ 1 FAMC @F459@ 0 @I1248@ INDI 1 NAME Francis_II // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 19 JAN 1544 2 PLAC Fontainebleau,France 1 DEAT 2 DATE 5 DEC 1560 2 PLAC Orleans,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F456@ 1 FAMC @F1148@ 0 @I1249@ INDI 1 NAME Henry /Stuart/ 1 TITL Lord Darnley 1 SEX M 1 BIRT 2 DATE 1545 1 DEAT 2 DATE 1567 1 FAMS @F455@ 1 FAMC @F528@ 0 @I1250@ INDI 1 NAME James /Hepburn/ 1 TITL Earl Bothwell-4 1 SEX M 1 DEAT 2 DATE 1576 1 FAMS @F457@ 0 @I1251@ INDI 1 NAME Mary of_Guise // 1 SEX F 1 BIRT 2 DATE 1515 1 DEAT 2 DATE 1560 1 FAMS @F459@ 1 FAMC @F727@ 0 @I1252@ INDI 1 NAME James_III // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1451 2 PLAC Stirling,Scotland 1 DEAT 2 DATE 1488 1 FAMS @F460@ 1 FAMC @F547@ 0 @I1253@ INDI 1 NAME Richard de_Burgh // 1 TITL Earl of Ulster 1 SEX M 1 FAMS @F548@ 0 @I1254@ INDI 1 NAME Edmund /Tudor/ 1 TITL Earl of Richmond 1 SEX M 1 BIRT 2 DATE ABT 1430 1 DEAT 2 DATE 1456 1 FAMS @F461@ 1 FAMC @F497@ 0 @I1255@ INDI 1 NAME Margaret of_Richmond /Beaufort/ 1 TITL Countess 1 SEX F 1 DEAT 2 DATE 1509 1 FAMS @F461@ 1 FAMS @F495@ 1 FAMS @F496@ 1 FAMC @F487@ 0 @I1256@ INDI 1 NAME John of_Eltham // 1 TITL Earl of Cornwall 1 SEX M 1 BIRT 2 DATE ABT 15 AUG 1316 2 PLAC Eltham Palace,Kent 1 DEAT 2 DATE 14 SEP 1336 2 PLAC Perth 1 FAMC @F92@ 0 @I1257@ INDI 1 NAME Eleanor // 1 SEX F 1 BIRT 2 DATE 18 JUN 1318 2 PLAC Woodstock 1 DEAT 2 DATE 22 APR 1355 2 PLAC Deventer 1 FAMS @F463@ 1 FAMC @F92@ 0 @I1258@ INDI 1 NAME Joan of_the_Tower // 1 SEX F 1 BIRT 2 DATE 5 JUL 1321 2 PLAC Tower of London,London,England 1 DEAT 2 DATE 7 SEP 1362 2 PLAC Hertford 1 FAMS @F540@ 1 FAMC @F92@ 0 @I1259@ INDI 1 NAME Rainald_II of_Gueldres // 1 TITL Duke 1 SEX M 1 FAMS @F463@ 0 @I1260@ INDI 1 NAME Charles of_Orleans // 1 TITL Duke of Orleans 1 SEX M 1 BIRT 2 DATE 1391 1 DEAT 2 DATE 1465 1 FAMS @F462@ 0 @I1261@ INDI 1 NAME Edward_I (Longshanks) // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 17 JUN 1239 2 PLAC Westminster,Palace,London,England 1 DEAT 2 DATE 7 JUL 1307 2 PLAC Near Carlisle 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F464@ 1 FAMS @F465@ 1 FAMC @F466@ 0 @I1262@ INDI 1 NAME Eleanor of_Castile // 1 SEX F 1 BIRT 2 DATE ABT 1244 2 PLAC Castile 1 DEAT 2 DATE 24 NOV 1290 2 PLAC Herdeby,Near Grantham,Lincolnshire 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F464@ 1 FAMC @F693@ 0 @I1263@ INDI 1 NAME Eleanor // 1 SEX F 1 BIRT 2 DATE 17 JUN 1264 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 12 OCT 1297 2 PLAC Ghent 1 FAMC @F464@ 0 @I1264@ INDI 1 NAME Joan // 1 SEX F 1 BIRT 2 DATE 1265 1 DEAT 2 DATE 1265 1 FAMC @F464@ 0 @I1265@ INDI 1 NAME John // 1 SEX M 1 BIRT 2 DATE 10 JUL 1266 2 PLAC Windsor,Berkshire,England 1 DEAT 2 DATE 3 AUG 1271 2 PLAC Westminster,London,England 1 FAMC @F464@ 0 @I1266@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE 13 JUL 1267 2 PLAC Windsor,Berkshire,England 1 DEAT 2 DATE 14 OCT 1274 2 PLAC Merton,Surrey 1 FAMC @F464@ 0 @I1267@ INDI 1 NAME Julian (Katherine) // 1 SEX F 1 BIRT 2 DATE 1271 2 PLAC Holy Land 1 DEAT 2 DATE 1271 2 PLAC Holy Land 1 FAMC @F464@ 0 @I1268@ INDI 1 NAME Joan of_Acre // 1 SEX F 1 BIRT 2 DATE 1272 2 PLAC Acre,Palestine 1 DEAT 2 DATE 23 APR 1307 2 PLAC Clare,Suffolk,England 1 FAMS @F606@ 1 FAMS @F607@ 1 FAMC @F464@ 0 @I1269@ INDI 1 NAME Alfonso // 1 TITL Earl of Chester 1 SEX M 1 BIRT 2 DATE 24 NOV 1273 2 PLAC Bordeaux 1 DEAT 2 DATE 19 AUG 1284 2 PLAC Windsor Castle,Berkshire,England 1 FAMC @F464@ 0 @I1270@ INDI 1 NAME Margaret // 1 SEX F 1 BIRT 2 DATE 11 SEP 1275 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 1318 2 PLAC Brussels 1 FAMS @F608@ 1 FAMC @F464@ 0 @I1271@ INDI 1 NAME Berengaria // 1 SEX F 1 BIRT 2 DATE 1276 2 PLAC Kennington 1 DEAT 2 DATE ABT 1279 1 FAMC @F464@ 0 @I1272@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 11 MAR 1278 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE BEF 8 JUL 1332 2 PLAC Amesbury 1 FAMC @F464@ 0 @I1273@ INDI 1 NAME Alice // 1 SEX F 1 BIRT 2 DATE 12 MAR 1279 2 PLAC Woodstock 1 DEAT 2 DATE 1291 1 FAMC @F464@ 0 @I1274@ INDI 1 NAME Elizabeth // 1 SEX F 1 BIRT 2 DATE AUG 1282 2 PLAC Rhuddlan Castle 1 DEAT 2 DATE 5 MAY 1316 1 FAMS @F609@ 1 FAMS @F610@ 1 FAMC @F464@ 0 @I1275@ INDI 1 NAME Beatrice // 1 SEX F 1 BIRT 2 DATE ABT 1286 2 PLAC Aquitaine 1 FAMC @F464@ 0 @I1276@ INDI 1 NAME Blanche // 1 SEX F 1 BIRT 2 DATE 1290 1 DEAT 2 DATE 1290 1 FAMC @F464@ 0 @I1277@ INDI 1 NAME Marguerite of_France // 1 SEX F 1 BIRT 2 DATE 1279 2 PLAC Paris 1 DEAT 2 DATE 14 FEB 1317 2 PLAC Marlborough,Castle 1 BURI 2 PLAC Grey Friars,Church,London,England 1 FAMS @F465@ 1 FAMC @F688@ 0 @I1278@ INDI 1 NAME Thomas of_Brotherton // 1 TITL Earl of Norfolk 1 SEX M 1 BIRT 2 DATE 1 JUN 1300 2 PLAC Brotherton,Yorkshire,England 1 DEAT 2 DATE AUG 1338 1 FAMS @F562@ 1 FAMS @F611@ 1 FAMC @F465@ 0 @I1279@ INDI 1 NAME Edmund of_Woodstock // 1 TITL Earl of Kent 1 SEX M 1 BIRT 2 DATE 5 AUG 1301 2 PLAC Woodstock 1 DEAT 2 DATE 19 MAR 1330 2 PLAC Winchester 1 FAMS @F564@ 1 FAMC @F465@ 0 @I1280@ INDI 1 NAME Eleanor // 1 SEX F 1 BIRT 2 DATE 4 MAY 1306 2 PLAC Winchester 1 DEAT 2 DATE 1311 2 PLAC Amesbury 1 FAMC @F465@ 0 @I1281@ INDI 1 NAME Henry_III // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 1 OCT 1207 2 PLAC Winchester,Castle 1 DEAT 2 DATE 16 NOV 1272 2 PLAC Westminster,Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F466@ 1 FAMC @F503@ 0 @I1282@ INDI 1 NAME Eleanor of_Provence // 1 SEX F 1 BIRT 2 DATE ABT 1217 2 PLAC Aix-en-Provence 1 DEAT 2 DATE 24 JUN 1291 2 PLAC Amesbury,Wiltshire 1 BURI 2 PLAC Convent Church,Amesbury 1 FAMS @F466@ 1 FAMC @F777@ 0 @I1283@ INDI 1 NAME Margaret // 1 SEX F 1 BIRT 2 DATE 29 SEP 1240 2 PLAC Windsor Castle,Berkshire,England 1 DEAT 2 DATE 26 FEB 1275 2 PLAC Cupar Castle,Fife 1 FAMS @F603@ 1 FAMC @F466@ 0 @I1284@ INDI 1 NAME Beatrice // 1 SEX F 1 BIRT 2 DATE 25 JUN 1242 2 PLAC Bordeaux 1 DEAT 2 DATE 24 MAR 1275 2 PLAC London,England 1 FAMS @F604@ 1 FAMC @F466@ 0 @I1285@ INDI 1 NAME Edmund Crouchback of_Leicester// 1 TITL Earl 1 SEX M 1 BIRT 2 DATE 16 JAN 1245 2 PLAC London,England 1 DEAT 2 DATE 5 JUN 1296 2 PLAC Bayonne 1 FAMS @F605@ 1 FAMS @F558@ 1 FAMC @F466@ 0 @I1286@ INDI 1 NAME Richard // 1 SEX M 1 BIRT 2 DATE ABT 1247 1 DEAT 2 DATE BEF 1256 1 FAMC @F466@ 0 @I1287@ INDI 1 NAME John // 1 SEX M 1 BIRT 2 DATE ABT 1250 1 DEAT 2 DATE BEF 1256 1 FAMC @F466@ 0 @I1288@ INDI 1 NAME Katherine // 1 SEX F 1 BIRT 2 DATE 25 NOV 1253 2 PLAC Westminster 1 DEAT 2 DATE 3 MAY 1257 2 PLAC Windsor Castle,Berkshire,England 1 FAMC @F466@ 0 @I1289@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE ABT 1256 1 DEAT 2 DATE ABT 1256 1 FAMC @F466@ 0 @I1290@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE AFT 1256 1 DEAT 2 DATE ABT 1257 1 FAMC @F466@ 0 @I1291@ INDI 1 NAME John /Spencer/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1734 1 DEAT 2 DATE 1783 1 FAMS @F467@ 1 FAMC @F685@ 0 @I1292@ INDI 1 NAME Georgiana /Carteret/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1780 1 FAMS @F467@ 0 @I1293@ INDI 1 NAME Henrietta // 1 SEX F 1 BIRT 2 DATE 28 FEB 1792 2 PLAC Maastricht 1 DEAT 2 DATE 26 OCT 1864 2 PLAC Schloss Rahr,Near Aachen 1 FAMS @F468@ 0 @I1294@ INDI 1 NAME Paul_I /Romanov/ 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1754 1 DEAT 2 DATE 1801 1 FAMS @F469@ 1 FAMC @F471@ 0 @I1295@ INDI 1 NAME Maria Feodorovna of_Wurttemberg// 1 SEX F 1 BIRT 2 DATE 1759 1 DEAT 2 DATE 1828 1 FAMS @F469@ 1 FAMC @F1274@ 0 @I1296@ INDI 1 NAME Alexander_I /Romanov/ 1 TITL Tsar of Russia 1 SEX M 1 BIRT 2 DATE 1777 1 DEAT 2 DATE 1825 1 FAMS @F470@ 1 FAMC @F469@ 0 @I1297@ INDI 1 NAME Yelizaveta Alekseyevna of_Baden// 1 SEX F 1 FAMS @F470@ 0 @I1298@ INDI 1 NAME Konstantin /Romanov/ 1 SEX M 1 BIRT 2 DATE 1779 1 FAMC @F470@ 0 @I1299@ INDI 1 NAME Catherine_II the_Great // 1 TITL Empress 1 SEX F 1 BIRT 2 DATE 2 MAY 1729 2 PLAC Szczecin,Poland 1 DEAT 2 DATE 17 NOV 1796 2 PLAC St. Petersburg,Russia 1 FAMS @F471@ 1 FAMC @F1275@ 0 @I1300@ INDI 1 NAME Peter_III /Romanov/ 1 TITL Emperor Russia 1 SEX M 1 BIRT 2 DATE 1728 2 PLAC Kiel,Germany 1 DEAT 2 DATE 17 JUL 1762 1 FAMS @F471@ 1 FAMC @F473@ 0 @I1301@ INDI 1 NAME Peter_I the_Great /Romanov/ 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1672 1 DEAT 2 DATE 1725 1 FAMS @F472@ 1 FAMS @F474@ 1 FAMC @F478@ 0 @I1302@ INDI 1 NAME Catherine_I // 1 TITL Empress 1 SEX F 1 BIRT 2 DATE 1683 2 PLAC Jakobstadt,Latvia 1 DEAT 2 DATE 1727 1 FAMS @F472@ 0 @I1303@ INDI 1 NAME Anna Petrovna /Romanov/ 1 SEX F 1 BIRT 2 DATE 1708 1 DEAT 2 DATE 1728 1 FAMS @F473@ 1 FAMC @F472@ 0 @I1304@ INDI 1 NAME Elizabeth Petrovna /Romanov/ 1 TITL Empress 1 SEX F 1 BIRT 2 DATE 1709 2 PLAC Near Moscow,Russia 1 DEAT 2 DATE 1761/1762 1 FAMC @F472@ 0 @I1305@ INDI 1 NAME Yevdokiya Lopukhina // 1 SEX F 1 FAMS @F474@ 0 @I1306@ INDI 1 NAME Alexis /Romanov/ 1 SEX M 1 BIRT 2 DATE 1690 1 DEAT 2 DATE 1718 1 FAMS @F475@ 1 FAMC @F474@ 0 @I1307@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F475@ 0 @I1308@ INDI 1 NAME Peter_II /Romanov/ 1 SEX M 1 BIRT 2 DATE 1715 1 DEAT 2 DATE 1730 1 FAMC @F475@ 0 @I1309@ INDI 1 NAME Alexis_I Michaylovich /Romanov/ 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1629 1 DEAT 2 DATE 1675/1676 1 FAMS @F476@ 1 FAMS @F478@ 1 FAMC @F477@ 0 @I1310@ INDI 1 NAME Maria Miroslavkaya // 1 SEX F 1 DEAT 2 DATE 1668 1 FAMS @F476@ 0 @I1311@ INDI 1 NAME Feodor_III (Theodore) /Romanov/ 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1662 1 DEAT 2 DATE 1682 1 FAMS @F479@ 1 FAMC @F476@ 0 @I1312@ INDI 1 NAME Mikhail_III Feodorovich /Romanov/ 1 SEX M 1 BIRT 2 DATE 1597 1 DEAT 2 DATE 1645 1 FAMS @F477@ 1 FAMC @F1261@ 0 @I1313@ INDI 1 NAME Eudoxia /Streshniev/ 1 SEX F 1 BIRT 2 DATE 1608 1 DEAT 2 DATE 1645 1 FAMS @F477@ 1 FAMC @F1260@ 0 @I1314@ INDI 1 NAME Natalia Narishkina // 1 SEX F 1 BIRT 2 DATE 1651 1 DEAT 2 DATE 1694 1 FAMS @F478@ 1 FAMC @F483@ 0 @I1315@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F479@ 0 @I1316@ INDI 1 NAME Ivan_V /Romanov/ 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1666 1 DEAT 2 DATE 1696 1 FAMS @F480@ 1 FAMC @F479@ 0 @I1317@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F480@ 0 @I1318@ INDI 1 NAME Anna Ioannovna /Romanov/ 1 TITL Empress 1 SEX F 1 BIRT 2 DATE 1693 1 DEAT 2 DATE 1740 1 FAMC @F480@ 0 @I1319@ INDI 1 NAME Yekaterina of_Mecklenburg // 1 SEX F 1 FAMS @F481@ 1 FAMC @F480@ 0 @I1320@ INDI 1 NAME Unknown // 1 SEX M 1 FAMS @F481@ 0 @I1321@ INDI 1 NAME Anna Leopoldovna of_Brunswick// 1 SEX F 1 FAMS @F482@ 1 FAMC @F481@ 0 @I1322@ INDI 1 NAME Unknown // 1 SEX M 1 FAMS @F482@ 0 @I1323@ INDI 1 NAME Ivan_VI /Romanov/ 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1740 1 DEAT 2 DATE 1741 1 FAMC @F482@ 0 @I1324@ INDI 1 NAME Ivan /Romanov/ 1 SEX M 1 FAMC @F476@ 0 @I1325@ INDI 1 NAME Sophia /Romanov/ 1 SEX F 1 BIRT 2 DATE ABT 1657 1 FAMC @F476@ 0 @I1326@ INDI 1 NAME Cyril /Naryshkin/ 1 SEX M 1 BIRT 2 DATE 1623 1 DEAT 2 DATE 1691 1 FAMS @F483@ 0 @I1327@ INDI 1 NAME Jacquetta of_Luxembourg // 1 SEX F 1 FAMS @F484@ 1 FAMS @F1051@ 1 FAMC @F1050@ 0 @I1328@ INDI 1 NAME Catherine Swynford /Roet/ 1 SEX F 1 BIRT 2 DATE 1350 1 DEAT 2 DATE 10 MAY 1403 2 PLAC Lincoln 1 FAMS @F907@ 1 FAMS @F485@ 1 FAMC @F906@ 0 @I1329@ INDI 1 NAME John Beaufort // 1 TITL Earl Sommerset 1 SEX M 1 DEAT 2 DATE 1410 1 FAMS @F486@ 1 FAMS @F736@ 1 FAMC @F485@ 0 @I1330@ INDI 1 NAME Henry Beaufort // 1 TITL Cardinal 1 SEX M 1 DEAT 2 DATE 1447 1 FAMC @F485@ 0 @I1331@ INDI 1 NAME Joan Beaufort // 1 SEX F 1 FAMS @F916@ 1 FAMS @F372@ 1 FAMC @F485@ 0 @I1332@ INDI 1 NAME Humphrey /De_Bohun/ 1 TITL Earl of Hereford 1 SEX M 1 FAMS @F914@ 0 @I1333@ INDI 1 NAME Henry /Beaufort/ 1 TITL Earl Sommerset 1 SEX M 1 BIRT 2 DATE 1401 1 DEAT 2 DATE 1418 1 FAMC @F486@ 0 @I1334@ INDI 1 NAME John /Beaufort/ 1 TITL Duke Sommerset 1 SEX M 1 BIRT 2 DATE 1403 1 DEAT 2 DATE 1444 1 FAMS @F487@ 1 FAMC @F486@ 0 @I1335@ INDI 1 NAME Edmund /Beaufort/ 1 TITL Duke Sommerset 1 SEX M 1 DEAT 2 DATE 1455 1 FAMS @F920@ 1 FAMC @F486@ 0 @I1336@ INDI 1 NAME Margaret /Beauchamp/ 1 SEX F 1 FAMS @F487@ 0 @I1337@ INDI 1 NAME Isabella of_Castile // 1 SEX F 1 DEAT 2 DATE 23 NOV 1393 1 FAMS @F488@ 1 FAMC @F908@ 0 @I1338@ INDI 1 NAME Edward // 1 TITL Duke of York 1 SEX M 1 DEAT 2 DATE 1415 2 PLAC Agincourt 1 FAMS @F1072@ 1 FAMC @F488@ 0 @I1339@ INDI 1 NAME Anne /Beauchamp/ 1 TITL Lady 1 SEX F 1 FAMS @F370@ 0 @I1340@ INDI 1 NAME Isabel /Nevill/ 1 TITL Lady 1 SEX F 1 FAMS @F381@ 1 FAMC @F370@ 0 @I1341@ INDI 1 NAME Louis_XIV // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 5 SEP 1638 2 PLAC St Germain-en-,Laye,France 1 DEAT 2 DATE 1 SEP 1715 2 PLAC Versailles,France 1 BURI 2 PLAC St Denis,France 1 FAMS @F523@ 1 FAMS @F524@ 1 FAMC @F521@ 0 @I1342@ INDI 1 NAME Richard /Nevill/ 1 TITL Earl Salisbury 1 SEX M 1 DEAT 2 DATE 1460 1 FAMS @F490@ 1 FAMC @F372@ 0 @I1343@ INDI 1 NAME Eleanor /De_Bohun/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 3 OCT 1399 2 PLAC Barking Abbey,Essex,England 1 FAMS @F491@ 1 FAMC @F912@ 0 @I1344@ INDI 1 NAME Roger /Mortimer/ 1 TITL Earl of March IV 1 SEX M 1 DEAT 2 DATE 1398 2 PLAC ,,,Ireland 1 FAMS @F492@ 1 FAMC @F494@ 0 @I1345@ INDI 1 NAME Eleanor /Holland/ 1 SEX F 1 DEAT 2 DATE 1405 1 FAMS @F492@ 1 FAMS @F1058@ 1 FAMC @F1057@ 0 @I1346@ INDI 1 NAME Edmund /Mortimer/ 1 TITL Earl of March 1 SEX M 1 DEAT 2 DATE 1425 1 FAMS @F536@ 1 FAMC @F492@ 0 @I1347@ INDI 1 NAME Violante of_Milan /Visconti/ 1 SEX F 1 DEAT 2 DATE 1404 1 FAMS @F493@ 1 FAMS @F904@ 1 FAMC @F903@ 0 @I1348@ INDI 1 NAME Philippa of_Ulster // 1 TITL Countess 1 SEX F 1 DEAT 2 DATE 1382 1 FAMS @F494@ 1 FAMC @F519@ 0 @I1349@ INDI 1 NAME Edmund /Mortimer/ 1 TITL Earl of March 3d 1 SEX M 1 DEAT 2 DATE 1381 1 FAMS @F494@ 1 FAMC @F795@ 0 @I1350@ INDI 1 NAME Henry /Stafford/ 1 TITL Sir 1 SEX M 1 DEAT 2 DATE 1481 1 FAMS @F495@ 0 @I1351@ INDI 1 NAME Thomas /Stanley/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1504 1 FAMS @F496@ 0 @I1352@ INDI 1 NAME Owen /Tudor/ 1 SEX M 1 DEAT 2 DATE 1461 1 FAMS @F497@ 1 FAMC @F976@ 0 @I1353@ INDI 1 NAME Jasper /Tudor/ 1 TITL Earl of Pembroke 1 SEX M 1 DEAT 2 DATE 1495/1496 1 FAMS @F537@ 1 FAMC @F497@ 0 @I1354@ INDI 1 NAME Natalia /Sheremetevskaya/ 1 SEX F 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1952 1 FAMS @F498@ 0 @I1355@ INDI 1 NAME Maria Pavlovna /Romanov/ 1 SEX F 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 1958 1 FAMS @F512@ 1 FAMC @F50@ 0 @I1356@ INDI 1 NAME Olga /Karnovich/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1866 1 DEAT 2 DATE 1929 1 FAMS @F499@ 1 FAMC @F1382@ 0 @I1357@ INDI 1 NAME Vladimir /Romanov/ 1 SEX M 1 BIRT 2 DATE 1896 1 DEAT 2 DATE 1918 1 FAMC @F499@ 0 @I1358@ INDI 1 NAME Natalie /Romanov/ 1 SEX F 1 BIRT 2 DATE 1905 1 FAMC @F499@ 0 @I1359@ INDI 1 NAME Irina /Romanov/ 1 SEX F 1 BIRT 2 DATE 1908 1 FAMC @F499@ 0 @I1360@ INDI 1 NAME George /Romanov/ 1 SEX M 1 BIRT 2 DATE 1910 1 DEAT 2 DATE 1931 1 FAMC @F498@ 0 @I1361@ INDI 1 NAME Peter of_Oldenburg // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1924 1 FAMS @F500@ 0 @I1362@ INDI 1 NAME Helen Vladimirovna of_Russia/Romanov/ 1 TITL Grand Duchess 1 SEX F 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1957 1 FAMS @F76@ 1 FAMC @F47@ 0 @I1363@ INDI 1 NAME Charles of_Brunswick- Wolfenbuttel// 1 TITL Duke 1 SEX M 1 FAMS @F501@ 0 @I1364@ INDI 1 NAME John Lackland // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 24 DEC 1167 2 PLAC Beaumont Palace,Oxford,England 1 DEAT 2 DATE 19 OCT 1216 2 PLAC Newark Castle,Newark,Nottinghamshire,England 1 BURI 2 PLAC Worcester,Cathedral 1 FAMS @F502@ 1 FAMS @F503@ 1 FAMC @F504@ 0 @I1365@ INDI 1 NAME Isabella De_Clare of_Gloucester// 1 TITL Countess 1 SEX F 1 DEAT 2 DATE NOV 1217 1 FAMS @F502@ 1 FAMS @F774@ 1 FAMS @F775@ 1 FAMC @F773@ 0 @I1366@ INDI 1 NAME Isabella of_Angouleme // 1 SEX F 1 BIRT 2 DATE ABT 1188 2 PLAC Angouleme 1 DEAT 2 DATE 31 MAY 1246 2 PLAC Fontevraud 1 BURI 2 PLAC Fontevraud Abbey 1 FAMS @F503@ 1 FAMS @F776@ 1 FAMC @F351@ 0 @I1367@ INDI 1 NAME Richard // 1 TITL Earl of Cornwall 1 SEX M 1 BIRT 2 DATE 5 JAN 1209 2 PLAC Winchester,Castle,England 1 DEAT 2 DATE 1272 2 PLAC Newark Castle,Newark,England 1 BURI 2 PLAC Worcester,Cathedral 1 FAMS @F599@ 1 FAMS @F600@ 1 FAMS @F601@ 1 FAMC @F503@ 0 @I1368@ INDI 1 NAME Joan // 1 SEX F 1 BIRT 2 DATE 22 JUL 1210 2 PLAC Gloucester,England 1 DEAT 2 DATE 4 MAR 1238 2 PLAC Near London,England 1 FAMS @F781@ 1 FAMC @F503@ 0 @I1369@ INDI 1 NAME Isabella // 1 SEX F 1 BIRT 2 DATE 1214 2 PLAC Gloucester 1 DEAT 2 DATE 1 DEC 1241 2 PLAC Foggia 1 FAMS @F602@ 1 FAMC @F503@ 0 @I1370@ INDI 1 NAME Eleanor // 1 SEX F 1 BIRT 2 DATE 1215 2 PLAC Gloucester 1 DEAT 2 DATE 13 APR 1275 2 PLAC Montargis,France 1 FAMS @F336@ 1 FAMS @F598@ 1 FAMC @F503@ 0 @I1371@ INDI 1 NAME Henry_II Curtmantle // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 25 MAR 1133 2 PLAC Le Mans 1 DEAT 2 DATE 6 JUL 1189 2 PLAC Chinon 1 BURI 2 PLAC Fontevraud Abbey 1 FAMS @F504@ 1 FAMC @F510@ 0 @I1372@ INDI 1 NAME Eleanor of_Aquitaine // 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE ABT 1122 2 PLAC Bordeaux/Berlin 1 DEAT 2 DATE 1 APR 1204 2 PLAC Fontevraud 1 BURI 2 PLAC Fontevraud 1 FAMS @F766@ 1 FAMS @F504@ 1 FAMC @F765@ 0 @I1373@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE 17 AUG 1152 2 PLAC Normandy,England 1 DEAT 2 DATE ABT APR 1156 2 PLAC Wallingford,Castle,Berkshire,England 1 FAMC @F504@ 0 @I1374@ INDI 1 NAME Henry the_Young_King // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 28 FEB 1155 2 PLAC Bermondsey 1 DEAT 2 DATE 11 JUN 1183 2 PLAC Martel 1 FAMS @F567@ 1 FAMC @F504@ 0 @I1375@ INDI 1 NAME Matilda (Maud) // 1 SEX F 1 BIRT 2 DATE 1156 2 PLAC London,England 1 DEAT 2 DATE 28 JUN 1189 2 PLAC Brunswick 1 FAMS @F566@ 1 FAMC @F504@ 0 @I1376@ INDI 1 NAME Richard_I Coeur_de_Lion // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 1157 2 PLAC Beaumont Palace,Oxford,England 1 DEAT 2 DATE 6 APR 1199 2 PLAC Chalus,Limousin 1 BURI 2 PLAC Fontevraud Abbey 1 FAMS @F565@ 1 FAMC @F504@ 0 @I1377@ INDI 1 NAME Geoffrey // 1 TITL Duke of Brittany 1 SEX M 1 BIRT 2 DATE 23 SEP 1158 1 DEAT 2 DATE 19 AUG 1186 2 PLAC Paris 1 FAMS @F563@ 1 FAMC @F504@ 0 @I1378@ INDI 1 NAME Eleanor // 1 SEX F 1 BIRT 2 DATE 13 OCT 1162 2 PLAC Domfront,Normandy 1 DEAT 2 DATE 31 OCT 1214 2 PLAC Burgos 1 FAMS @F571@ 1 FAMC @F504@ 0 @I1379@ INDI 1 NAME Joan /Plantagenet/ 1 SEX F 1 BIRT 2 DATE OCT 1165 2 PLAC Angers 1 DEAT 2 DATE 4 SEP 1199 1 FAMS @F590@ 1 FAMS @F591@ 1 FAMC @F504@ 0 @I1380@ INDI 1 NAME William_I the_Conqueror // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 1027/1028 2 PLAC Falaise,Normandy,France 1 DEAT 2 DATE 7 SEP 1087 2 PLAC Near Rouen,France 1 BURI 2 PLAC St Stephen Abbey,Caen,Normandy 1 FAMS @F505@ 1 FAMC @F572@ 0 @I1381@ INDI 1 NAME Matilda of_Flanders // 1 SEX F 1 BIRT 2 DATE ABT 1031 2 PLAC Flanders,France 1 DEAT 2 DATE 2 NOV 1083 2 PLAC Caen 1 BURI 2 PLAC Holy Trinity,Abbey,Caen 1 FAMS @F505@ 1 FAMC @F752@ 0 @I1382@ INDI 1 NAME Robert Curthose // 1 TITL Duke of Normandy 1 SEX M 1 BIRT 2 DATE 1054 2 PLAC Normandy,France 1 DEAT 2 DATE 10 FEB 1134 2 PLAC Cardiff Castle 1 FAMS @F753@ 1 FAMC @F505@ 0 @I1383@ INDI 1 NAME Richard // 1 SEX M 1 BIRT 2 DATE ABT 1055 1 DEAT 2 DATE ABT 1081 2 PLAC New Forest 1 FAMC @F505@ 0 @I1384@ INDI 1 NAME William_II Rufus // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 1056/1060 2 PLAC Normandy,France 1 DEAT 2 DATE 2 AUG 1100 2 PLAC New Forest 1 BURI 2 PLAC Winchester,Cathedral 1 FAMC @F505@ 0 @I1385@ INDI 1 NAME Cecilia of_Holy_Trinity // 1 TITL Abess 1 SEX F 1 DEAT 2 DATE 30 JUL 1126 2 PLAC Caen 1 FAMC @F505@ 0 @I1386@ INDI 1 NAME Agatha // 1 SEX F 1 FAMC @F505@ 0 @I1387@ INDI 1 NAME Adeliza a_nun // 1 SEX F 1 FAMC @F505@ 0 @I1388@ INDI 1 NAME Adela // 1 SEX F 1 BIRT 2 DATE ABT 1062 2 PLAC Normandy,France 1 DEAT 2 DATE 8 MAR 1137/1138 2 PLAC Marcigny-sur-,Loire,France 1 FAMS @F569@ 1 FAMC @F505@ 0 @I1389@ INDI 1 NAME Matilda // 1 SEX F 1 FAMC @F505@ 0 @I1390@ INDI 1 NAME Constance // 1 SEX F 1 BIRT 2 DATE ABT 1066 2 PLAC Normandy,France 1 DEAT 2 DATE 13 AUG 1090 2 PLAC Brittany,France 1 FAMS @F586@ 1 FAMC @F505@ 0 @I1391@ INDI 1 NAME Henry_I Beauclerc // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE ABT SEP 1068 2 PLAC Selby,Yorkshire,England 1 DEAT 2 DATE 1 DEC 1135 2 PLAC St Denis-le-,Fermont,Near Gisors 1 BURI 2 PLAC Reading Abbey 1 FAMS @F506@ 1 FAMS @F507@ 1 FAMC @F505@ 0 @I1392@ INDI 1 NAME Matilda (Edith) of_Scotland// 1 SEX F 1 BIRT 2 DATE 1079/1080 2 PLAC Dunfermline 1 DEAT 2 DATE 1 MAY 1118 2 PLAC Westminster,Palace,London,England 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F506@ 1 FAMC @F568@ 0 @I1393@ INDI 1 NAME Robert of_Gloucester // 1 SEX M 1 DEAT 2 DATE 1147 1 FAMC @F506@ 0 @I1394@ INDI 1 NAME William // 1 TITL Duke of Normandy 1 SEX M 1 BIRT 2 DATE BEF 5 AUG 1103 2 PLAC Winchester 1 DEAT 2 DATE 25 NOV 1120 1 FAMS @F759@ 1 FAMC @F506@ 0 @I1395@ INDI 1 NAME Matilda // 1 SEX F 1 BIRT 2 DATE ABT 1103/1104 2 PLAC Winchester 1 DEAT 2 DATE 10 SEP 1167 2 PLAC Rouen 1 FAMS @F509@ 1 FAMS @F510@ 1 FAMC @F506@ 0 @I1396@ INDI 1 NAME Adeliza of_Louvain // 1 SEX F 1 BIRT 2 DATE ABT 1105 2 PLAC Louvain,Belgium 1 DEAT 2 DATE ABT 23 APR 1151 2 PLAC Afflighem,Flanders 1 BURI 2 PLAC Afflighem,Flanders 1 FAMS @F507@ 1 FAMS @F625@ 1 FAMC @F756@ 0 @I1397@ INDI 1 NAME Stephen // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE ABT 1096 2 PLAC Blois,France 1 DEAT 2 DATE 25 OCT 1154 2 PLAC Dover Castle 1 BURI 2 PLAC Faversham Abbey 1 FAMS @F508@ 1 FAMC @F569@ 0 @I1398@ INDI 1 NAME Matilda of_Boulogne // 1 SEX F 1 BIRT 2 DATE ABT 1103/1105 2 PLAC Boulogne 1 DEAT 2 DATE 3 MAY 1152 2 PLAC Hedingham Castle,Essex,England 1 BURI 2 PLAC Faversham Abbey 1 FAMS @F508@ 1 FAMC @F589@ 0 @I1399@ INDI 1 NAME Baldwin // 1 SEX M 1 BIRT 2 DATE ABT 1126 1 DEAT 2 DATE BEF 2 DEC 1135 2 PLAC London,England 1 FAMC @F508@ 0 @I1400@ INDI 1 NAME Eustace of_Boulongne // 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1130/1131 1 DEAT 2 DATE 10 AUG 1153 2 PLAC Bury St Edmunds 1 FAMS @F570@ 1 FAMC @F508@ 0 @I1401@ INDI 1 NAME Matilda // 1 SEX F 1 BIRT 2 DATE ABT 1133 1 DEAT 2 DATE ABT 1135 1 FAMC @F508@ 0 @I1402@ INDI 1 NAME William of_Boulogne // 1 TITL Count 1 SEX M 1 BIRT 2 DATE ABT 1134 1 DEAT 2 DATE 11 OCT 1159 2 PLAC Toulouse 1 FAMS @F587@ 1 FAMC @F508@ 0 @I1403@ INDI 1 NAME Mary of_Boulogne // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE ABT 1136 1 DEAT 2 DATE 1182 2 PLAC St Austrebert 1 FAMS @F588@ 1 FAMC @F508@ 0 @I1404@ INDI 1 NAME Henry_V // 1 TITL Holy Roman Empr 1 SEX M 1 BIRT 2 DATE 1086 1 DEAT 2 DATE 23 MAY 1125 2 PLAC Utrecht 1 FAMS @F509@ 0 @I1405@ INDI 1 NAME Geoffrey_V /Plantagenet/ 1 TITL Count of Anjou 1 SEX M 1 DEAT 2 DATE 7 SEP 1151 2 PLAC Chateau-du-Loir 1 FAMS @F510@ 0 @I1406@ INDI 1 NAME Audrey /Emery/ 1 SEX F 1 BIRT 2 DATE 1904 1 FAMS @F511@ 1 FAMC @F1383@ 0 @I1407@ INDI 1 NAME Paul /Romanov/ 1 TITL Prince Ilynsky 1 SEX M 1 FAMC @F511@ 0 @I1408@ INDI 1 NAME William // 1 TITL Prince of Sweden 1 SEX M 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1965 1 FAMS @F512@ 1 FAMC @F155@ 0 @I1409@ INDI 1 NAME Lennart Gustaf Nicholas// 1 TITL Count of Wisborg 1 SEX M 1 BIRT 2 DATE 8 MAY 1909 2 PLAC Stockholm,Sweden 1 FAMS @F1295@ 1 FAMS @F1296@ 1 FAMC @F512@ 0 @I1410@ INDI 1 NAME Joan // 1 TITL Countess of Kent 1 SEX F 1 BIRT 2 DATE 29 SEP 1328 1 DEAT 2 DATE 8 AUG 1385 2 PLAC Wallingford,Castle,Berkshire,England 1 FAMS @F901@ 1 FAMS @F513@ 1 FAMC @F564@ 0 @I1411@ INDI 1 NAME Edward // 1 SEX M 1 BIRT 2 DATE 27 JAN 1365 2 PLAC Angouleme 1 DEAT 2 DATE 1372 2 PLAC Bordeaux,France 1 FAMC @F513@ 0 @I1412@ INDI 1 NAME Richard_II // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE 6 JAN 1367 2 PLAC Bordeaux,France 1 DEAT 2 DATE 6 JAN 1400 2 PLAC Pontefract,Castle 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F514@ 1 FAMS @F515@ 1 FAMC @F513@ 0 @I1413@ INDI 1 NAME Anne of_Bohemia // 1 SEX F 1 BIRT 2 DATE 11 MAY 1366 2 PLAC Prague 1 DEAT 2 DATE BEF 3 JUN 1394 2 PLAC Sheen Palace 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F514@ 1 FAMC @F1066@ 0 @I1414@ INDI 1 NAME Isabella of_France // 1 SEX F 1 BIRT 2 DATE 9 NOV 1387 2 PLAC Hotel du Louvre,Paris,France 1 DEAT 2 DATE 13 SEP 1409 2 PLAC Blois 1 BURI 2 DATE ABT 1624 2 PLAC Celestines,Paris 1 FAMS @F515@ 1 FAMC @F915@ 0 @I1415@ INDI 1 NAME Enguerrand_VII de_Courcy // 1 TITL Earl of Bedford 1 SEX M 1 DEAT 2 DATE 1396 1 FAMS @F516@ 0 @I1416@ INDI 1 NAME Constanza (Constance) // 1 TITL Queen of Castile 1 SEX F 1 DEAT 2 DATE 24 MAR 1394 2 PLAC Leicester,England 1 FAMS @F517@ 1 FAMC @F905@ 0 @I1417@ INDI 1 NAME John 2d /Hastings/ 1 TITL Earl of Pembroke 1 SEX M 1 DEAT 2 DATE 1375 1 FAMS @F518@ 0 @I1418@ INDI 1 NAME Elizabeth de_Burgh // 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 10 DEC 1363 2 PLAC Dublin 1 FAMS @F519@ 1 FAMC @F902@ 0 @I1419@ INDI 1 NAME Charles Frederick of_Holstein-// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1700 1 DEAT 2 DATE 1739 1 FAMS @F473@ 0 @I1420@ INDI 1 NAME Marie-Therese of_Spain // 1 SEX F 1 BIRT 2 DATE 20 SEP 1638 2 PLAC Madrid,Spain 1 DEAT 2 DATE 30 JUL 1683 2 PLAC Versailles,France 1 BURI 2 PLAC St Denis 1 FAMS @F523@ 1 FAMC @F948@ 0 @I1421@ INDI 1 NAME Francoise d'Aubigne // 1 SEX F 1 BIRT 2 DATE 27 NOV 1635 2 PLAC Niort,France 1 DEAT 2 DATE 15 APR 1719 2 PLAC St Cyr,France 1 BURI 2 PLAC St Cyr 1 FAMS @F524@ 0 @I1422@ INDI 1 NAME Louis_XV // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 15 FEB 1710 2 PLAC Versailles,France 1 DEAT 2 DATE 10 MAY 1774 2 PLAC Versailles,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F525@ 1 FAMC @F344@ 0 @I1423@ INDI 1 NAME Maria of_Poland /Leczinska/ 1 SEX F 1 BIRT 2 DATE 1703 1 DEAT 2 DATE 1768 1 FAMS @F525@ 1 FAMC @F1183@ 0 @I1424@ INDI 1 NAME Louis_XVI // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 23 AUG 1754 2 PLAC Versailles,France 1 DEAT 2 DATE 21 JAN 1793 2 PLAC Paris,France 1 BURI 2 DATE 1815 2 PLAC St Denis,France 1 FAMS @F526@ 1 FAMC @F1185@ 0 @I1425@ INDI 1 NAME Marie Antoinette of_Austria// 1 SEX F 1 BIRT 2 DATE 2 NOV 1755 2 PLAC Vienna,Austria 1 DEAT 2 DATE 16 OCT 1793 2 PLAC Paris,France 1 BURI 2 DATE 1815 2 PLAC St Denis,France 1 FAMS @F526@ 0 @I1426@ INDI 1 NAME Henry /Brandon/ 1 TITL Earl of Lincoln 1 SEX M 1 BIRT 2 DATE 1516 1 DEAT 2 DATE 1534 1 FAMC @F318@ 0 @I1427@ INDI 1 NAME Frances /Brandon/ 1 SEX F 1 BIRT 2 DATE 1517 1 DEAT 2 DATE 1559 1 FAMS @F527@ 1 FAMS @F935@ 1 FAMC @F318@ 0 @I1428@ INDI 1 NAME Eleanor /Brandon/ 1 SEX F 1 DEAT 2 DATE 1547 1 FAMS @F934@ 1 FAMC @F318@ 0 @I1429@ INDI 1 NAME Madeleine of_France // 1 SEX F 1 DEAT 2 DATE 1537 1 FAMS @F458@ 1 FAMC @F728@ 0 @I1430@ INDI 1 NAME Henry /Grey/ 1 TITL Duke of Suffolk 1 SEX M 1 DEAT 2 DATE 1554 1 FAMS @F527@ 0 @I1431@ INDI 1 NAME Margaret /Douglas/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1515 1 DEAT 2 DATE 1578 1 FAMS @F528@ 1 FAMC @F529@ 0 @I1432@ INDI 1 NAME Matthew /Stuart/ 1 TITL Earl Lennox 4th 1 SEX M 1 BIRT 2 DATE 1516 1 DEAT 2 DATE 1571 1 FAMS @F528@ 1 FAMC @F551@ 0 @I1433@ INDI 1 NAME Charles /Stuart/ 1 TITL Earl Lennox 6th 1 SEX M 1 DEAT 2 DATE 1576 1 FAMS @F530@ 1 FAMC @F528@ 0 @I1434@ INDI 1 NAME Elizabeth /Cavendish/ 1 SEX F 1 DEAT 2 DATE 1581 1 FAMS @F530@ 1 FAMC @F930@ 0 @I1435@ INDI 1 NAME Arabella /Stuart/ 1 SEX F 1 DEAT 2 DATE 1615 1 FAMS @F531@ 1 FAMC @F530@ 0 @I1436@ INDI 1 NAME William /Seymour/ 1 TITL Duke Sommerset 1 SEX M 1 DEAT 2 DATE 1660 1 FAMS @F531@ 1 FAMS @F932@ 1 FAMC @F938@ 0 @I1437@ INDI 1 NAME Thomas /Beaufort/ 1 TITL Duke of Exeter 1 SEX M 1 FAMS @F917@ 1 FAMC @F485@ 0 @I1438@ INDI 1 NAME Franz Josef of_Austria// 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 18 AUG 1830 2 PLAC Vienna,Austria 1 DEAT 2 DATE 21 NOV 1916 1 FAMS @F532@ 1 FAMC @F1150@ 0 @I1439@ INDI 1 NAME Rudolf // 1 TITL Archduke 1 SEX M 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1889 1 FAMC @F532@ 0 @I1440@ INDI 1 NAME Daughter_1 // 1 SEX F 1 FAMC @F532@ 0 @I1441@ INDI 1 NAME Daughter_2 // 1 SEX F 1 FAMC @F532@ 0 @I1442@ INDI 1 NAME // 1 TITL duc d' Alencon 1 SEX M 1 FAMS @F533@ 0 @I1443@ INDI 1 NAME Joan /Holland/ 1 SEX F 1 DEAT 2 DATE 1434 1 FAMS @F534@ 0 @I1444@ INDI 1 NAME Maud /Clifford/ 1 SEX F 1 FAMS @F1074@ 1 FAMS @F535@ 1 FAMC @F1073@ 0 @I1445@ INDI 1 NAME Anne /Stafford/ 1 SEX F 1 FAMS @F536@ 1 FAMC @F1059@ 0 @I1446@ INDI 1 NAME Catherine /Woodville/ 1 SEX F 1 FAMS @F537@ 0 @I1447@ INDI 1 NAME Robert_I /Bruce/ 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1274 1 DEAT 2 DATE 1329 2 PLAC Cardoss Castle,Firth of Clyde,Scotland 1 FAMS @F538@ 1 FAMS @F539@ 1 FAMC @F740@ 0 @I1448@ INDI 1 NAME Isobel of_Mar // 1 SEX F 1 FAMS @F538@ 1 FAMC @F730@ 0 @I1449@ INDI 1 NAME Margery /Bruce/ 1 SEX F 1 DEAT 2 DATE 1316 1 FAMS @F542@ 1 FAMC @F538@ 0 @I1450@ INDI 1 NAME Elizabeth de_Burgh // 1 SEX F 1 DEAT 2 DATE 1327 1 FAMS @F539@ 1 FAMC @F548@ 0 @I1451@ INDI 1 NAME David_II /Bruce/ 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1329 1 DEAT 2 DATE 1371 1 FAMS @F540@ 1 FAMS @F541@ 1 FAMC @F539@ 0 @I1452@ INDI 1 NAME Thored // 1 TITL Ealdorman 1 SEX M 1 FAMS @F697@ 1 FAMC @F698@ 0 @I1453@ INDI 1 NAME Margaret /Drummond/ 1 SEX F 1 DEAT 2 DATE 1375 1 FAMS @F746@ 1 FAMS @F541@ 1 FAMC @F747@ 0 @I1454@ INDI 1 NAME Walter /Stewart/ 1 SEX M 1 BIRT 2 DATE 1292 1 DEAT 2 DATE 1326 1 FAMS @F542@ 0 @I1455@ INDI 1 NAME Robert_II // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1316 1 DEAT 2 DATE 1390 1 FAMS @F543@ 1 FAMS @F545@ 1 FAMC @F542@ 0 @I1456@ INDI 1 NAME Elizabeth of_Rowallan /Mure/ 1 SEX F 1 FAMS @F543@ 1 FAMC @F731@ 0 @I1457@ INDI 1 NAME Robert_III // 1 TITL King of Scotland 1 SEX M 1 FAMS @F544@ 1 FAMC @F543@ 0 @I1458@ INDI 1 NAME Walter // 1 SEX M 1 FAMC @F543@ 0 @I1459@ INDI 1 NAME Robert // 1 TITL Earl of Fife 1 SEX M 1 FAMS @F554@ 1 FAMC @F543@ 0 @I1460@ INDI 1 NAME Alexander // 1 SEX M 1 FAMC @F543@ 0 @I1461@ INDI 1 NAME Annabella // 1 SEX F 1 DEAT 2 DATE 1401 1 FAMS @F544@ 1 FAMC @F737@ 0 @I1462@ INDI 1 NAME David of_Rothesay // 1 TITL Duke 1 SEX M 1 FAMC @F544@ 0 @I1463@ INDI 1 NAME James_I // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1394 2 PLAC Dunfermline,Scotland 1 DEAT 2 DATE 1437 1 FAMS @F546@ 1 FAMC @F544@ 0 @I1464@ INDI 1 NAME Euphemia of_Ross // 1 SEX F 1 FAMS @F545@ 1 FAMC @F732@ 0 @I1465@ INDI 1 NAME Joan /Beaufort/ 1 SEX F 1 DEAT 2 DATE 1445 1 FAMS @F546@ 1 FAMS @F555@ 1 FAMC @F486@ 0 @I1466@ INDI 1 NAME James_II // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1430 2 PLAC Edinburgh,Scotland 1 DEAT 2 DATE 1460 2 PLAC Roxburgh Castle,Scotland 1 FAMS @F547@ 1 FAMC @F546@ 0 @I1467@ INDI 1 NAME Marie of_Gueldres // 1 SEX F 1 DEAT 2 DATE 1463 1 FAMS @F547@ 1 FAMC @F738@ 0 @I1468@ INDI 1 NAME John // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 1455 1 DEAT 2 DATE 1513 1 FAMS @F1343@ 1 FAMC @F739@ 0 @I1469@ INDI 1 NAME Margaret of_Denmark // 1 SEX F 1 BIRT 2 DATE ABT 1457 1 DEAT 2 DATE 1486 1 FAMS @F460@ 1 FAMC @F739@ 0 @I1470@ INDI 1 NAME Alexander // 1 TITL Duke of Albany 1 SEX M 1 BIRT 2 DATE ABT 1454 1 DEAT 2 DATE 1485 1 FAMS @F553@ 1 FAMS @F1344@ 1 FAMC @F547@ 0 @I1471@ INDI 1 NAME John // 1 TITL Earl of Mar 1 SEX M 1 FAMC @F547@ 0 @I1472@ INDI 1 NAME Mary // 1 SEX F 1 FAMS @F315@ 1 FAMS @F549@ 1 FAMC @F547@ 0 @I1473@ INDI 1 NAME Thomas /Boyd/ 1 TITL Earl of Arran 1 SEX M 1 FAMS @F315@ 0 @I1474@ INDI 1 NAME James /Hamilton/ 1 TITL Lord 1st 1 SEX M 1 BIRT 2 DATE 1479 1 FAMS @F549@ 0 @I1475@ INDI 1 NAME Elizabeth // 1 SEX F 1 FAMS @F550@ 1 FAMC @F549@ 0 @I1476@ INDI 1 NAME James /Hamilton/ 1 TITL Earl of Arran I 1 SEX M 1 BIRT 2 DATE 1477 1 DEAT 2 DATE 1529 1 FAMS @F556@ 1 FAMC @F549@ 0 @I1477@ INDI 1 NAME Matthew /Stewart/ 1 TITL Earl Lennox II 1 SEX M 1 FAMS @F550@ 0 @I1478@ INDI 1 NAME John /Stewart/ 1 TITL Earl Lennox III 1 SEX M 1 FAMS @F551@ 1 FAMC @F550@ 0 @I1479@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F551@ 0 @I1480@ INDI 1 NAME John /Stuart/ 1 TITL Lord d'Aubigny V 1 SEX M 1 FAMS @F552@ 1 FAMC @F551@ 0 @I1481@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F552@ 0 @I1482@ INDI 1 NAME Esme /Stuart/ 1 TITL Duke Lennox I 1 SEX M 1 DEAT 2 DATE 1583 1 FAMC @F552@ 0 @I1483@ INDI 1 NAME Catherine /Sinclair/ 1 SEX F 1 FAMS @F553@ 0 @I1484@ INDI 1 NAME John // 1 TITL Duke of Albany 1 SEX M 1 BIRT 2 DATE 1484 1 DEAT 2 DATE 1536 1 FAMC @F1344@ 0 @I1485@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F554@ 0 @I1486@ INDI 1 NAME Murdoch // 1 TITL Duke of Albany 1 SEX M 1 FAMC @F554@ 0 @I1487@ INDI 1 NAME James /Stewart/ 1 TITL Sir 1 SEX M 1 FAMS @F555@ 0 @I1488@ INDI 1 NAME John /Stewart/ 1 TITL Earl of Atholl 1 SEX M 1 FAMC @F555@ 0 @I1489@ INDI 1 NAME James /Stewart/ 1 TITL Earl of Buchan 1 SEX M 1 FAMC @F555@ 0 @I1490@ INDI 1 NAME Andrew /Stewart/ 1 TITL Bishop of Moray 1 SEX M 1 FAMC @F555@ 0 @I1491@ INDI 1 NAME Janet /Beaton/ 1 SEX F 1 DEAT 2 DATE ABT 1522 1 FAMS @F556@ 0 @I1492@ INDI 1 NAME James /Hamilton/ 1 TITL Earl of Arran II 1 SEX M 1 BIRT 2 DATE 1515 1 DEAT 2 DATE 1575 1 FAMS @F557@ 1 FAMC @F556@ 0 @I1493@ INDI 1 NAME Margaret /Douglas/ 1 SEX F 1 FAMS @F557@ 0 @I1494@ INDI 1 NAME James /Hamilton/ 1 TITL 3d Earl of Arran 1 SEX M 1 DEAT 2 DATE 1609 1 FAMC @F557@ 0 @I1495@ INDI 1 NAME Blanche of_Artois // 1 SEX F 1 DEAT 2 DATE 2 MAY 1302 1 FAMS @F558@ 1 FAMC @F786@ 0 @I1496@ INDI 1 NAME Thomas // 1 TITL Earl Lancaster 1 SEX M 1 FAMC @F558@ 0 @I1497@ INDI 1 NAME Henry // 1 TITL Earl Lancaster 1 SEX M 1 FAMS @F559@ 1 FAMC @F558@ 0 @I1498@ INDI 1 NAME Maud /Chaworth/ 1 SEX F 1 FAMS @F559@ 0 @I1499@ INDI 1 NAME Henry // 1 TITL Duke Lancaster I 1 SEX M 1 DEAT 2 DATE 1361 1 FAMS @F560@ 1 FAMC @F559@ 0 @I1500@ INDI 1 NAME Isabel /de_Beaumont/ 1 SEX F 1 FAMS @F560@ 0 @I1501@ INDI 1 NAME Philippa of_Lancaster // 1 SEX F 1 BIRT 2 DATE ABT 1360 1 DEAT 2 DATE 1415 1 FAMS @F561@ 1 FAMC @F452@ 0 @I1502@ INDI 1 NAME Elizabeth // 1 SEX F 1 BIRT 2 DATE 1364 1 DEAT 2 DATE 1426 1 FAMS @F1067@ 1 FAMS @F1068@ 1 FAMC @F452@ 0 @I1503@ INDI 1 NAME John_I // 1 TITL King of Portugal 1 SEX M 1 BIRT 2 DATE 1357 1 DEAT 2 DATE 1433 1 FAMS @F561@ 0 @I1504@ INDI 1 NAME Alice (Itayls) /Hayles/ 1 SEX F 1 DEAT 2 DATE AFT 8 MAY 1326 1 FAMS @F562@ 1 FAMC @F789@ 0 @I1505@ INDI 1 NAME Margaret of_Liddell /Wake/ 1 TITL Baroness 1 SEX F 1 DEAT 2 DATE 29 SEP 1349 1 FAMS @F793@ 1 FAMS @F564@ 1 FAMC @F792@ 0 @I1506@ INDI 1 NAME Constance of_Brittany // 1 TITL Duchess 1 SEX F 1 DEAT 2 DATE 1201 1 FAMS @F563@ 1 FAMS @F771@ 1 FAMS @F772@ 1 FAMC @F770@ 0 @I1507@ INDI 1 NAME Arthur // 1 SEX M 1 BIRT 2 DATE 1187 1 DEAT 2 DATE 1203 1 FAMC @F563@ 0 @I1508@ INDI 1 NAME Berengaria of_Navarre // 1 SEX F 1 BIRT 2 DATE 1163 1 DEAT 2 DATE 1230 1 FAMS @F565@ 1 FAMC @F769@ 0 @I1509@ INDI 1 NAME Henry the_Lion // 1 TITL Duke of Saxony 1 SEX M 1 DEAT 2 DATE 1195 1 FAMS @F566@ 0 @I1510@ INDI 1 NAME Margaret of_France // 1 SEX F 1 DEAT 2 DATE 1198 1 FAMS @F567@ 1 FAMC @F766@ 0 @I1511@ INDI 1 NAME Malcolm_III Canmore // 1 TITL King of Scotland 1 SEX M 1 DEAT 2 DATE 1093 1 FAMS @F1020@ 1 FAMS @F568@ 1 FAMC @F1028@ 0 @I1512@ INDI 1 NAME St_Margaret // 1 SEX F 1 DEAT 2 DATE 1093 1 FAMS @F568@ 1 FAMC @F582@ 0 @I1513@ INDI 1 NAME Edgar // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE ABT 1074 1 DEAT 2 DATE 1107 1 FAMC @F568@ 0 @I1514@ INDI 1 NAME Alexander_I the_Fierce // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1078 1 DEAT 2 DATE 1124 1 FAMS @F1018@ 1 FAMC @F568@ 0 @I1515@ INDI 1 NAME David_I the_Saint // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE ABT 1080 1 DEAT 2 DATE 1153 1 FAMS @F1022@ 1 FAMC @F568@ 0 @I1516@ INDI 1 NAME Mary of_Scotland // 1 SEX F 1 FAMS @F589@ 1 FAMC @F568@ 0 @I1517@ INDI 1 NAME Stephen Henry // 1 TITL Count of Blois 1 SEX M 1 DEAT 2 DATE 1102 1 FAMS @F569@ 0 @I1518@ INDI 1 NAME Theobald // 1 TITL Count of Blois 1 SEX M 1 DEAT 2 DATE 1151 1 FAMS @F763@ 1 FAMC @F569@ 0 @I1519@ INDI 1 NAME Henry of_Winchester // 1 TITL Bishop 1 SEX M 1 FAMC @F569@ 0 @I1520@ INDI 1 NAME Alfonso_VIII // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE 1155 1 DEAT 2 DATE 1214 1 FAMS @F571@ 1 FAMC @F695@ 0 @I1521@ INDI 1 NAME Matthew of_Alsace // 1 TITL Count Boulogne 1 SEX M 1 FAMS @F588@ 1 FAMC @F768@ 0 @I1522@ INDI 1 NAME Eustace_III of_Boulogne // 1 TITL Count 1 SEX M 1 FAMS @F589@ 0 @I1523@ INDI 1 NAME Isabel de_Warrenne // 1 SEX F 1 FAMS @F587@ 1 FAMC @F767@ 0 @I1524@ INDI 1 NAME Constance of_Toulouse // 1 SEX F 1 FAMS @F570@ 0 @I1525@ INDI 1 NAME Robert the_Devil // 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1035 1 FAMS @F572@ 1 FAMC @F573@ 0 @I1526@ INDI 1 NAME Herleva // 1 SEX F 1 FAMS @F572@ 1 FAMS @F585@ 0 @I1527@ INDI 1 NAME Richard_II of_Normandy // 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1026 1 FAMS @F573@ 1 FAMC @F574@ 0 @I1528@ INDI 1 NAME Judith of_Brittany // 1 SEX F 1 FAMS @F573@ 0 @I1529@ INDI 1 NAME Richard_III of_Normandy // 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1028 1 FAMC @F573@ 0 @I1530@ INDI 1 NAME Richard_I the_Fearless of_Normandy// 1 TITL Count 1 SEX M 1 DEAT 2 DATE 996 1 FAMS @F574@ 0 @I1531@ INDI 1 NAME Gunnor of_Denmark // 1 SEX F 1 FAMS @F574@ 0 @I1532@ INDI 1 NAME Emma of_Normandy // 1 SEX F 1 DEAT 2 DATE 1052 1 FAMS @F575@ 1 FAMS @F584@ 1 FAMC @F574@ 0 @I1533@ INDI 1 NAME Ethelred_II the_Unready // 1 TITL King of Kent 1 SEX M 1 BIRT 2 DATE ABT 968 1 DEAT 2 DATE 1016 1 BURI 2 PLAC St. Paul's 1 FAMS @F580@ 1 FAMS @F575@ 1 FAMC @F710@ 0 @I1534@ INDI 1 NAME Edward the_Confessor // 1 TITL King of England 1 SEX M 1 BIRT 2 DATE ABT 1002 2 PLAC Islip,Oxfordshire,England 1 DEAT 2 DATE 5 JAN 1066 1 BURI 2 DATE 6 JAN 1066 2 PLAC Westminster,Abbey,London,England 1 FAMS @F576@ 1 FAMC @F575@ 0 @I1535@ INDI 1 NAME Edith (Eadgyth) // 1 SEX F 1 DEAT 2 DATE 18 DEC 1075 1 BURI 2 PLAC Westminster,Abbey,London,England 1 FAMS @F576@ 1 FAMC @F577@ 0 @I1536@ INDI 1 NAME Godwin // 1 TITL Earl of Wessex 1 SEX M 1 FAMS @F577@ 0 @I1537@ INDI 1 NAME Gytha // 1 SEX F 1 FAMS @F577@ 0 @I1538@ INDI 1 NAME Harold_II // 1 SEX M 1 BIRT 2 DATE ABT 1022 1 DEAT 2 DATE 14 OCT 1066 2 PLAC Hastings 1 FAMS @F578@ 1 FAMC @F577@ 0 @I1539@ INDI 1 NAME Edith Swan-neck (Ealdgyth)// 1 SEX F 1 FAMS @F813@ 1 FAMS @F578@ 1 FAMC @F706@ 0 @I1540@ INDI 1 NAME Gytha // 1 SEX F 1 FAMS @F579@ 1 FAMC @F578@ 0 @I1541@ INDI 1 NAME Vladimir of_Kiev /Monomakh/ 1 TITL Grand Duke 1 SEX M 1 DEAT 2 DATE 1125 1 FAMS @F579@ 0 @I1542@ INDI 1 NAME Elfreda (Elfgiva) // 1 SEX F 1 FAMS @F580@ 1 FAMC @F697@ 0 @I1543@ INDI 1 NAME Edmund_II Ironside // 1 SEX M 1 DEAT 2 DATE 1016 1 FAMS @F581@ 1 FAMC @F580@ 0 @I1544@ INDI 1 NAME Ealdgyth // 1 SEX F 1 FAMS @F581@ 0 @I1545@ INDI 1 NAME Edward /Athling/ 1 SEX M 1 BIRT 2 DATE ABT 1016 1 DEAT 2 DATE 1057 1 FAMS @F582@ 1 FAMC @F581@ 0 @I1546@ INDI 1 NAME Agatha // 1 SEX F 1 FAMS @F582@ 1 FAMC @F699@ 0 @I1547@ INDI 1 NAME Edgar /Athling/ 1 SEX M 1 FAMC @F582@ 0 @I1548@ INDI 1 NAME Canute_II the_Great // 1 SEX M 1 BIRT 2 DATE ABT 995 1 DEAT 2 DATE 12 NOV 1035 2 PLAC Shaftesbury,England 1 BURI 2 PLAC Winchester,Cathedral,London,England 1 FAMS @F583@ 1 FAMS @F584@ 1 FAMC @F708@ 0 @I1549@ INDI 1 NAME Elfgiva of_Northampton // 1 SEX F 1 FAMS @F583@ 1 FAMC @F707@ 0 @I1550@ INDI 1 NAME Harold_I Harefoot // 1 SEX M 1 BIRT 2 DATE ABT 1015 1 DEAT 2 DATE 17 MAR 1040 2 PLAC Oxford,England 1 BURI 2 PLAC St Clement Danes,London,England 1 FAMC @F583@ 0 @I1551@ INDI 1 NAME Sweyn // 1 TITL King of Norway 1 SEX M 1 DEAT 2 DATE 1036 1 FAMC @F583@ 0 @I1552@ INDI 1 NAME Hardicanute // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 1018 1 DEAT 2 DATE 8 JUN 1042 2 PLAC Lambeth 1 BURI 2 PLAC Winchester,Cathedral,London,England 1 FAMC @F584@ 0 @I1553@ INDI 1 NAME Herluin of_Conteville // 1 TITL Viscount 1 SEX M 1 FAMS @F585@ 0 @I1554@ INDI 1 NAME Odo of_Bayeux // 1 TITL Bishop 1 SEX M 1 DEAT 2 DATE 1097 1 FAMC @F585@ 0 @I1555@ INDI 1 NAME Robert // 1 TITL Count of Mortain 1 SEX M 1 FAMC @F585@ 0 @I1556@ INDI 1 NAME Alan_IV of_Brittany /Fergant/ 1 TITL Count 1 SEX M 1 FAMS @F586@ 0 @I1557@ INDI 1 NAME William_II the_Good // 1 TITL King of Sicily 1 SEX M 1 BIRT 2 DATE 1166 1 DEAT 2 DATE 18 NOV 1189 1 FAMS @F590@ 1 FAMC @F1166@ 0 @I1558@ INDI 1 NAME Raymond_VI of_Toulouse // 1 TITL Count 1 SEX M 1 FAMS @F591@ 0 @I1559@ INDI 1 NAME Nicholas /Koulikovsky/ 1 TITL Colonel 1 SEX M 1 BIRT 2 DATE 1881 1 DEAT 2 DATE 1958 2 PLAC Cooksville,Near Toronto,Ontario,Canada 1 BURI 2 PLAC York Cemetery,Toronto,Ontario,Canada 1 FAMS @F592@ 0 @I1560@ INDI 1 NAME Tikhon /Koulikovsky/ 1 SEX M 1 BIRT 2 DATE 1917 1 FAMC @F592@ 0 @I1561@ INDI 1 NAME Goury /Koulikovsky/ 1 SEX M 1 BIRT 2 DATE 1919 1 FAMC @F592@ 0 @I1562@ INDI 1 NAME Andrew // 1 SEX M 1 BIRT 2 DATE 1897 1 FAMC @F51@ 0 @I1563@ INDI 1 NAME Theodore // 1 SEX M 1 BIRT 2 DATE 1898 1 FAMC @F51@ 0 @I1564@ INDI 1 NAME Nikita // 1 SEX M 1 BIRT 2 DATE 1900 1 FAMC @F51@ 0 @I1565@ INDI 1 NAME Dimitri // 1 SEX M 1 BIRT 2 DATE 1901 1 FAMC @F51@ 0 @I1566@ INDI 1 NAME Rostislav // 1 SEX M 1 BIRT 2 DATE 1902 1 FAMC @F51@ 0 @I1567@ INDI 1 NAME Vassily // 1 SEX M 1 BIRT 2 DATE 1907 1 FAMC @F51@ 0 @I1568@ INDI 1 NAME Alexander Alexandrovich /Romanov/ 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1870 1 FAMC @F9@ 0 @I1569@ INDI 1 NAME Catherine /Yourievska/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1847 1 DEAT 2 DATE 1922 1 FAMS @F593@ 0 @I1570@ INDI 1 NAME George /Romanov/ 1 SEX M 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1913 1 FAMS @F594@ 1 FAMC @F593@ 0 @I1571@ INDI 1 NAME Olga /Romanov/ 1 SEX F 1 BIRT 2 DATE 1874 1 DEAT 2 DATE 1925 1 FAMS @F595@ 1 FAMC @F593@ 0 @I1572@ INDI 1 NAME Catherine /Romanov/ 1 SEX F 1 BIRT 2 DATE 1878 1 DEAT 2 DATE 1959 1 FAMS @F596@ 1 FAMS @F597@ 1 FAMC @F593@ 0 @I1573@ INDI 1 NAME Alexandra /Zarnekau/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1883 1 FAMS @F594@ 0 @I1574@ INDI 1 NAME Alexander Alexandrovich /Romanov/ 1 SEX M 1 BIRT 2 DATE 1900 1 FAMC @F594@ 0 @I1575@ INDI 1 NAME /von_Merenberg/ 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1871 1 DEAT 2 DATE 1948 1 FAMS @F595@ 0 @I1576@ INDI 1 NAME George // 1 SEX M 1 BIRT 2 DATE 1897 1 FAMC @F595@ 0 @I1577@ INDI 1 NAME Olga // 1 SEX F 1 BIRT 2 DATE 1898 1 FAMC @F595@ 0 @I1578@ INDI 1 NAME Alexander V. /Bariatinsky/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1910 1 FAMS @F596@ 0 @I1579@ INDI 1 NAME Andrei /Bariatinsky/ 1 SEX M 1 BIRT 2 DATE 1902 1 DEAT 2 DATE 1931 1 FAMC @F596@ 0 @I1580@ INDI 1 NAME Alexander /Bariatinsky/ 1 SEX M 1 BIRT 2 DATE 1905 1 FAMC @F596@ 0 @I1581@ INDI 1 NAME Serge /Obelensky/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1890 1 FAMS @F597@ 0 @I1582@ INDI 1 NAME Sanchia of_Provence // 1 SEX F 1 BIRT 2 DATE ABT 1225 2 PLAC Aix-en-Provence 1 DEAT 2 DATE 9 NOV 1261 2 PLAC Berkhamsted 1 FAMS @F600@ 1 FAMC @F779@ 0 @I1583@ INDI 1 NAME Beatrix of_Falkenburg // 1 SEX F 1 BIRT 2 DATE ABT 1253 1 DEAT 2 DATE 17 OCT 1277 1 FAMS @F601@ 1 FAMC @F780@ 0 @I1584@ INDI 1 NAME Frederick_II of_Germany // 1 TITL Emperor 1 SEX M 1 FAMS @F602@ 0 @I1585@ INDI 1 NAME Alexander_III // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1241 1 DEAT 2 DATE 1286 1 FAMS @F603@ 1 FAMS @F787@ 1 FAMC @F1025@ 0 @I1586@ INDI 1 NAME John of_Dreux // 1 TITL Earl of Richmond 1 SEX M 1 FAMS @F604@ 0 @I1587@ INDI 1 NAME Aveline de_Forz // 1 SEX F 1 DEAT 2 DATE 10 NOV 1274 2 PLAC Stockwell 1 FAMS @F605@ 1 FAMC @F785@ 0 @I1588@ INDI 1 NAME Gilbert De_Clare // 1 TITL Earl Gloucester 1 SEX M 1 DEAT 2 DATE 1295 1 FAMS @F606@ 0 @I1589@ INDI 1 NAME Ralph de_Monthermer // 1 TITL Baron 1 SEX M 1 DEAT 2 DATE 1305 1 FAMS @F607@ 0 @I1590@ INDI 1 NAME John_II // 1 TITL Duke of Brabant 1 SEX M 1 FAMS @F608@ 0 @I1591@ INDI 1 NAME John_I // 1 TITL Count of Holland 1 SEX M 1 FAMS @F609@ 0 @I1592@ INDI 1 NAME Humphrey De_Bohun // 1 TITL Earl of Hereford 1 SEX M 1 FAMS @F610@ 0 @I1593@ INDI 1 NAME Mary de_Ros // 1 SEX F 1 FAMS @F791@ 1 FAMS @F611@ 1 FAMC @F790@ 0 @I1594@ INDI 1 NAME John_V /de_Montfort/ 1 TITL Duke of Brittany 1 SEX M 1 DEAT 2 DATE 1 NOV 1399 1 FAMS @F612@ 1 FAMS @F619@ 0 @I1595@ INDI 1 NAME Margaret /Holland/ 1 SEX F 1 DEAT 2 DATE 31 DEC 1439 1 FAMS @F486@ 1 FAMS @F613@ 1 FAMC @F901@ 0 @I1596@ INDI 1 NAME Anne of_Burgundy // 1 SEX F 1 DEAT 2 DATE 14 NOV 1432 2 PLAC Paris,France 1 FAMS @F614@ 1 FAMC @F1049@ 0 @I1597@ INDI 1 NAME Jacqueline of_Holland // 1 TITL Countess 1 SEX F 1 FAMS @F615@ 0 @I1598@ INDI 1 NAME Eleanor de_Cobham // 1 SEX F 1 DEAT 2 DATE 7 JUL 1452 2 PLAC Beaumaris Castle 1 FAMS @F616@ 1 FAMC @F1048@ 0 @I1599@ INDI 1 NAME Ludwig_III // 1 TITL Elector Palatine 1 SEX M 1 FAMS @F617@ 0 @I1600@ INDI 1 NAME Eric_X of_Pomerania // 1 TITL King of Denmark 1 SEX M 1 FAMS @F618@ 0 @I1601@ INDI 1 NAME Joan of_Navarre // 1 SEX F 1 BIRT 2 DATE ABT 1370 2 PLAC Pamplona 1 DEAT 2 DATE 9 JUL 1437 2 PLAC Havering atte,Bower,Essex,England 1 BURI 2 PLAC Canterbury,Cathedral,,England 1 FAMS @F619@ 1 FAMS @F620@ 1 FAMC @F1047@ 0 @I1602@ INDI 1 NAME William /Bourchier/ 1 TITL Count 1 SEX M 1 DEAT 2 DATE 1420 1 FAMS @F621@ 0 @I1603@ INDI 1 NAME Anne of_Gloucester // 1 SEX F 1 FAMS @F913@ 1 FAMS @F621@ 1 FAMC @F491@ 0 @I1604@ INDI 1 NAME Frederick_II of_Hesse-Cassel // 1 TITL Landgrave 1 SEX M 1 BIRT 2 DATE 1720 1 DEAT 2 DATE 1785 1 FAMS @F622@ 0 @I1605@ INDI 1 NAME Elizabeth Christine // 1 SEX F 1 BIRT 2 DATE 1715 1 DEAT 2 DATE 1797 1 FAMS @F623@ 1 FAMC @F624@ 0 @I1606@ INDI 1 NAME Ferdinand Albert_II of_Brunswick// 1 SEX M 1 BIRT 2 DATE 1680 1 DEAT 2 DATE 1735 1 FAMS @F624@ 0 @I1607@ INDI 1 NAME Margaret Alice /Bridgeman/ 1 TITL Lady 1 SEX F 1 FAMS @F296@ 0 @I1608@ INDI 1 NAME William /d'Aubigny/ 1 TITL Earl of Arundel 1 SEX M 1 DEAT 2 DATE 12 OCT 1176 1 FAMS @F625@ 0 @I1609@ INDI 1 NAME Henri /de_Laborde/ 1 SEX M 1 BIRT 2 DATE 11 JUN 1934 2 PLAC Talence,Gironde,France 1 FAMS @F626@ 0 @I1610@ INDI 1 NAME Frederick // 1 SEX M 1 BIRT 2 DATE 1968 1 FAMC @F626@ 0 @I1611@ INDI 1 NAME Joachim // 1 SEX M 1 BIRT 2 DATE 1969 1 FAMC @F626@ 0 @I1612@ INDI 1 NAME Silvia Renate /Sommerlath/ 1 SEX F 1 BIRT 2 DATE 23 DEC 1943 2 PLAC Heidelberg,Germany 1 FAMS @F220@ 1 FAMC @F1153@ 0 @I1613@ INDI 1 NAME Oscar_I // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 4 JUL 1799 2 PLAC Paris,France 1 DEAT 2 DATE 8 MAR 1844 2 PLAC Stockholm,Sweden 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F627@ 1 FAMC @F628@ 0 @I1614@ INDI 1 NAME Josephine /de_Beauharnais/ 1 SEX F 1 BIRT 2 DATE 14 MAR 1807 2 PLAC Milan,Italy 1 DEAT 2 DATE 7 JUN 1876 2 PLAC Stockholm,Sweden 1 FAMS @F627@ 1 FAMC @F1149@ 0 @I1615@ INDI 1 NAME Charles_XIV John // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 26 JAN 1763 2 PLAC Pau,Bearn,France 1 DEAT 2 DATE 8 MAR 1844 2 PLAC Stockholm,Sweden 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F628@ 0 @I1616@ INDI 1 NAME Desiree // 1 SEX F 1 BIRT 2 DATE 9 NOV 1777 2 PLAC Marseilles,France 1 DEAT 2 DATE 17 DEC 1860 2 PLAC Stockholm,Sweden 1 BURI 2 PLAC Stockholm,Sweden 1 FAMS @F628@ 0 @I1617@ INDI 1 NAME Frederick_VI // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 28 JAN 1768 2 PLAC Christiansborg,Nr: Copenhagen,Denmark 1 DEAT 2 DATE 3 DEC 1839 2 PLAC Amalienborg 1 FAMS @F629@ 1 FAMC @F281@ 0 @I1618@ INDI 1 NAME Marie // 1 SEX F 1 BIRT 2 DATE 28 OCT 1767 2 PLAC Hanau 1 DEAT 2 DATE 21 MAR 1852 2 PLAC Amalienborg,Denmark 1 FAMS @F629@ 1 FAMC @F641@ 0 @I1619@ INDI 1 NAME Juliana Maria // 1 SEX F 1 BIRT 2 DATE 4 SEP 1729 2 PLAC Wolfenbuttel 1 DEAT 2 DATE 10 OCT 1796 2 PLAC Fredensborg,Denmark 1 FAMS @F630@ 0 @I1620@ INDI 1 NAME Christian_VI // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 10 DEC 1699 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 6 AUG 1746 2 PLAC Copenhagen,Denmark 1 FAMS @F631@ 1 FAMC @F632@ 0 @I1621@ INDI 1 NAME Sophie Magdalene // 1 SEX F 1 BIRT 2 DATE 28 NOV 1700 1 DEAT 2 DATE 27 MAY 1770 2 PLAC Christiansborg,Denmark 1 FAMS @F631@ 0 @I1622@ INDI 1 NAME Frederick_IV // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 21 OCT 1671 2 PLAC Copenhagen,Denmark 1 DEAT 2 DATE 12 OCT 1730 2 PLAC Copenhagen,Denmark 1 FAMS @F632@ 1 FAMS @F633@ 1 FAMC @F634@ 0 @I1623@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 28 AUG 1667 1 DEAT 2 DATE 15 MAR 1721 1 FAMS @F632@ 0 @I1624@ INDI 1 NAME Anna Sophie // 1 SEX F 1 BIRT 2 DATE 16 APR 1693 1 DEAT 2 DATE 7 JAN 1743 2 PLAC Klausholm 1 FAMS @F633@ 0 @I1625@ INDI 1 NAME Christian_V // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 15 APR 1646 2 PLAC Flensborg 1 DEAT 2 DATE 25 AUG 1699 1 FAMS @F634@ 1 FAMC @F637@ 0 @I1626@ INDI 1 NAME Charlotte Amelia // 1 SEX F 1 BIRT 2 DATE 27 APR 1650 2 PLAC Cassel 1 DEAT 2 DATE 27 MAR 1714 2 PLAC Copenhagen 1 FAMS @F634@ 0 @I1627@ INDI 1 NAME Christian_IV // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 12 APR 1577 2 PLAC Frederiksborg 1 DEAT 2 DATE 28 FEB 1648 2 PLAC Copenhagen,Denmark 1 FAMS @F635@ 1 FAMS @F636@ 1 FAMC @F268@ 0 @I1628@ INDI 1 NAME Anne Catherine // 1 SEX F 1 BIRT 2 DATE 26 JUN 1575 1 DEAT 2 DATE 29 MAR 1612 1 FAMS @F635@ 1 FAMC @F1054@ 0 @I1629@ INDI 1 NAME Christine of_Schleswig- Holstein// 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 6 JUL 1598 1 DEAT 2 DATE 19 APR 1658 2 PLAC Odense 1 FAMS @F636@ 0 @I1630@ INDI 1 NAME Frederick_III // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 18 MAR 1609 2 PLAC Haderslev,Denmark 1 DEAT 2 DATE 9 FEB 1670 2 PLAC Copenhagen,Denmark 1 FAMS @F637@ 1 FAMC @F635@ 0 @I1631@ INDI 1 NAME Sophia Amelia // 1 SEX F 1 BIRT 2 DATE 24 MAR 1628 2 PLAC Herzberg 1 DEAT 2 DATE 20 FEB 1685 2 PLAC Copenhagen 1 FAMS @F637@ 0 @I1632@ INDI 1 NAME Christian_III // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 12 AUG 1503 2 PLAC Gottorp 1 DEAT 2 DATE 1 JAN 1559 2 PLAC Coldingen 1 FAMS @F638@ 1 FAMC @F639@ 0 @I1633@ INDI 1 NAME Dorothea // 1 SEX F 1 BIRT 2 DATE 9 JUL 1511 1 DEAT 2 DATE 7 OCT 1571 2 PLAC Sonderburg 1 FAMS @F638@ 0 @I1634@ INDI 1 NAME Frederick_I // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 7 OCT 1471 1 DEAT 2 DATE 10 APR 1533 2 PLAC Gottorp 1 FAMS @F639@ 1 FAMS @F640@ 1 FAMC @F739@ 0 @I1635@ INDI 1 NAME Anna // 1 SEX F 1 BIRT 2 DATE 27 AUG 1487 1 DEAT 2 DATE 3 MAY 1547 2 PLAC Kiel 1 FAMS @F639@ 0 @I1636@ INDI 1 NAME Sophie // 1 SEX F 1 BIRT 2 DATE 1498 1 DEAT 2 DATE 13 MAY 1568 2 PLAC Keil 1 FAMS @F640@ 0 @I1637@ INDI 1 NAME Christian // 1 SEX M 1 BIRT 2 DATE 1745 1 DEAT 2 DATE 1747 1 FAMC @F107@ 0 @I1638@ INDI 1 NAME Sophia Magdalena // 1 SEX F 1 BIRT 2 DATE 1746 1 DEAT 2 DATE 1813 1 FAMS @F1339@ 1 FAMC @F107@ 0 @I1639@ INDI 1 NAME Caroline // 1 SEX F 1 BIRT 2 DATE 1747 1 DEAT 2 DATE 1820 1 FAMS @F1340@ 1 FAMC @F107@ 0 @I1640@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1750 1 DEAT 2 DATE 1831 1 FAMS @F641@ 1 FAMC @F107@ 0 @I1641@ INDI 1 NAME Charles of_Hesse-Cassel // 1 SEX M 1 BIRT 2 DATE 1744 1 DEAT 2 DATE 1836 1 FAMS @F641@ 0 @I1642@ INDI 1 NAME Christian // 1 SEX M 1 BIRT 2 DATE 1791 1 DEAT 2 DATE 1791 1 FAMC @F629@ 0 @I1643@ INDI 1 NAME Frederick // 1 SEX M 1 BIRT 2 DATE 1753 1 DEAT 2 DATE 1805 1 FAMS @F642@ 1 FAMC @F630@ 0 @I1644@ INDI 1 NAME Sophia Frederica of_Mecklenburg-// 1 SEX F 1 BIRT 2 DATE 1758 1 DEAT 2 DATE 1794 1 FAMS @F642@ 0 @I1645@ INDI 1 NAME Christian_VIII // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 18 SEP 1786 2 PLAC Christiansborg 1 DEAT 2 DATE 20 JAN 1848 2 PLAC Amalienborg 1 FAMS @F643@ 1 FAMS @F644@ 1 FAMC @F642@ 0 @I1646@ INDI 1 NAME Ferdinand // 1 SEX M 1 BIRT 2 DATE 1792 1 DEAT 2 DATE 1863 1 FAMS @F649@ 1 FAMC @F642@ 0 @I1647@ INDI 1 NAME Charlotte // 1 SEX F 1 BIRT 2 DATE 4 DEC 1784 2 PLAC Ludwigslust 1 DEAT 2 DATE 13 JUL 1840 2 PLAC Rome,Italy 1 FAMS @F643@ 0 @I1648@ INDI 1 NAME Caroline // 1 SEX F 1 BIRT 2 DATE 22 JUN 1796 2 PLAC Copenhagen 1 DEAT 2 DATE 9 MAR 1881 2 PLAC Amalienborg 1 FAMS @F644@ 1 FAMC @F648@ 0 @I1649@ INDI 1 NAME Frederick_VII // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 6 OCT 1808 2 PLAC Amalienborg 1 DEAT 2 DATE 15 NOV 1863 2 PLAC Glucksburg 1 FAMS @F645@ 1 FAMS @F646@ 1 FAMS @F647@ 1 FAMC @F643@ 0 @I1650@ INDI 1 NAME Wilhelmine // 1 SEX F 1 BIRT 2 DATE 18 JAN 1808 2 PLAC Kiel 1 DEAT 2 DATE 30 MAY 1891 2 PLAC Glucksburg 1 FAMS @F645@ 1 FAMS @F650@ 1 FAMC @F629@ 0 @I1651@ INDI 1 NAME Caroline // 1 SEX F 1 BIRT 2 DATE 10 JAN 1821 2 PLAC Neustrelitz 1 DEAT 2 DATE 1 JUN 1876 2 PLAC Neustrelitz 1 FAMS @F646@ 0 @I1652@ INDI 1 NAME Louise /Rasmussen/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 21 APR 1815 2 PLAC Copenhagen 1 DEAT 2 DATE 6 MAR 1874 2 PLAC Cannes 1 FAMS @F647@ 0 @I1653@ INDI 1 NAME Louise Augusta // 1 SEX F 1 BIRT 2 DATE 1771 1 DEAT 2 DATE 1843 1 FAMS @F648@ 1 FAMC @F281@ 0 @I1654@ INDI 1 NAME Frederick Christian of_Schleswig-// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1765 1 DEAT 2 DATE 1814 1 FAMS @F648@ 0 @I1655@ INDI 1 NAME Marie Louise // 1 SEX F 1 BIRT 2 DATE 1792 1 DEAT 2 DATE 1793 1 FAMC @F629@ 0 @I1656@ INDI 1 NAME Caroline // 1 SEX F 1 BIRT 2 DATE 1793 1 DEAT 2 DATE 1881 1 FAMS @F649@ 1 FAMC @F629@ 0 @I1657@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1795 1 DEAT 2 DATE 1795 1 FAMC @F629@ 0 @I1658@ INDI 1 NAME Christian // 1 SEX M 1 BIRT 2 DATE 1797 1 DEAT 2 DATE 1797 1 FAMC @F629@ 0 @I1659@ INDI 1 NAME Louise Juliane // 1 SEX F 1 BIRT 2 DATE 1802 1 DEAT 2 DATE 1802 1 FAMC @F629@ 0 @I1660@ INDI 1 NAME Frederica Maria // 1 SEX F 1 BIRT 2 DATE 1805 1 DEAT 2 DATE 1805 1 FAMC @F629@ 0 @I1661@ INDI 1 NAME Charles // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1813 1 DEAT 2 DATE 1878 1 FAMS @F650@ 0 @I1662@ INDI 1 NAME Maximilian of_Austria // 1 TITL Archduke 1 SEX M 1 BIRT 2 DATE 1832 1 DEAT 2 DATE 1867 1 FAMS @F686@ 0 @I1663@ INDI 1 NAME Valdemar // 1 SEX M 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1939 1 FAMS @F687@ 1 FAMC @F74@ 0 @I1664@ INDI 1 NAME Harold // 1 SEX M 1 BIRT 2 DATE 1876 1 DEAT 2 DATE 1949 1 FAMS @F652@ 1 FAMC @F218@ 0 @I1665@ INDI 1 NAME Thyra // 1 SEX F 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1945 1 FAMC @F218@ 0 @I1666@ INDI 1 NAME Gustav // 1 SEX M 1 BIRT 2 DATE 1887 1 DEAT 2 DATE 1944 1 FAMC @F218@ 0 @I1667@ INDI 1 NAME Dagmar // 1 SEX F 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 1961 1 FAMS @F651@ 1 FAMC @F218@ 0 @I1668@ INDI 1 NAME Jorgen /Castenskiold/ 1 SEX M 1 BIRT 2 DATE 1893 1 FAMS @F651@ 0 @I1669@ INDI 1 NAME Helene of_Schleswig- Holstein// 1 SEX F 1 BIRT 2 DATE 1888 1 DEAT 2 DATE 1962 1 FAMS @F652@ 0 @I1670@ INDI 1 NAME Caroline Mathilde // 1 SEX F 1 BIRT 2 DATE 1912 1 FAMS @F654@ 1 FAMC @F652@ 0 @I1671@ INDI 1 NAME Knud // 1 TITL Her. Prince 1 SEX M 1 BIRT 2 DATE 1900 1 DEAT 2 DATE 1976 1 FAMS @F654@ 1 FAMC @F219@ 0 @I1672@ INDI 1 NAME Benedikte // 1 SEX F 1 BIRT 2 DATE 1944 1 FAMS @F653@ 1 FAMC @F402@ 0 @I1673@ INDI 1 NAME Richard of_Sayn- Wittgenstein-// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1934 1 FAMS @F653@ 0 @I1674@ INDI 1 NAME Elizabeth // 1 SEX F 1 BIRT 2 DATE 1935 1 FAMC @F654@ 0 @I1675@ INDI 1 NAME Ingolf // 1 SEX M 1 BIRT 2 DATE 1940 1 FAMS @F1281@ 1 FAMC @F654@ 0 @I1676@ INDI 1 NAME Christian // 1 SEX M 1 BIRT 2 DATE 1942 1 FAMS @F655@ 1 FAMC @F654@ 0 @I1677@ INDI 1 NAME Anne Dorothy Maltoft-Nielsen// 1 SEX F 1 BIRT 2 DATE 1947 1 FAMS @F655@ 0 @I1678@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE 1840 1 DEAT 2 DATE 1879 1 FAMC @F447@ 0 @I1679@ INDI 1 NAME Maurice // 1 SEX M 1 BIRT 2 DATE 1843 1 DEAT 2 DATE 1850 1 FAMC @F447@ 0 @I1680@ INDI 1 NAME Alexander // 1 SEX M 1 BIRT 2 DATE 1851 1 DEAT 2 DATE 1884 1 FAMC @F447@ 0 @I1681@ INDI 1 NAME Charlotte // 1 SEX F 1 BIRT 2 DATE 1800 1 DEAT 2 DATE 1806 1 FAMC @F202@ 0 @I1682@ INDI 1 NAME Marianne of_Netherlands // 1 SEX F 1 BIRT 2 DATE 1810 1 DEAT 2 DATE 1883 1 FAMS @F180@ 1 FAMC @F202@ 0 @I1683@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE 1836 1 DEAT 2 DATE 1846 1 FAMC @F388@ 0 @I1684@ INDI 1 NAME Marie // 1 SEX F 1 BIRT 2 DATE 1841 1 DEAT 2 DATE 1910 1 FAMS @F656@ 1 FAMC @F388@ 0 @I1685@ INDI 1 NAME William of_Wied // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1845 1 DEAT 2 DATE 1907 1 FAMS @F656@ 0 @I1686@ INDI 1 NAME Carlos Hugo // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1930 1 FAMS @F657@ 0 @I1687@ INDI 1 NAME Peter /van_Vollenhoven/ 1 SEX M 1 BIRT 2 DATE 1939 1 FAMS @F658@ 0 @I1688@ INDI 1 NAME Jorge /Guillermo/ 1 SEX M 1 BIRT 2 DATE 1946 1 FAMS @F659@ 0 @I1689@ INDI 1 NAME Alexander // 1 SEX M 1 BIRT 2 DATE 1818 1 DEAT 2 DATE 1848 1 FAMC @F240@ 0 @I1690@ INDI 1 NAME Henry // 1 SEX M 1 BIRT 2 DATE 1820 1 DEAT 2 DATE 1879 1 FAMS @F1258@ 1 FAMS @F1259@ 1 FAMC @F240@ 0 @I1691@ INDI 1 NAME Ernest // 1 SEX M 1 BIRT 2 DATE 1822 1 DEAT 2 DATE 1822 1 FAMC @F240@ 0 @I1692@ INDI 1 NAME Sophie // 1 SEX F 1 BIRT 2 DATE 1824 1 DEAT 2 DATE 1897 1 FAMS @F660@ 1 FAMC @F240@ 0 @I1693@ INDI 1 NAME Charles Alexander of_Saxe-Weimar// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1818 1 DEAT 2 DATE 1901 1 FAMS @F660@ 0 @I1694@ INDI 1 NAME John Frederick of_Brandenburg-// 1 TITL Margrave 1 SEX M 1 FAMS @F661@ 0 @I1695@ INDI 1 NAME Amalia // 1 SEX F 1 BIRT 2 DATE 21 DEC 1818 2 PLAC Oldenburg,Germany 1 DEAT 2 DATE 20 MAY 1875 2 PLAC Bamberg,Germany 1 BURI 2 PLAC Theatinerkirche,Munich,Germany 1 FAMS @F662@ 0 @I1696@ INDI 1 NAME Leopold_I George of_Saxe-Coburg// 1 TITL King of Belgium 1 SEX M 1 BIRT 2 DATE 16 DEC 1790 2 PLAC Coburg,Germany 1 DEAT 2 DATE 10 DEC 1865 2 PLAC Laeken,Belgium 1 BURI 2 PLAC Laeken,Belgium 1 FAMS @F80@ 1 FAMS @F663@ 1 FAMC @F1147@ 0 @I1697@ INDI 1 NAME Leopold // 1 SEX M 1 BIRT 2 DATE 1833 1 DEAT 2 DATE 1834 1 FAMC @F663@ 0 @I1698@ INDI 1 NAME Leopold_II // 1 TITL King of Belgium 1 SEX M 1 BIRT 2 DATE 9 APR 1835 2 PLAC Brussels,Belgium 1 DEAT 2 DATE 17 DEC 1909 2 PLAC Laeken 1 BURI 2 PLAC Laeken 1 FAMS @F1154@ 1 FAMC @F663@ 0 @I1699@ INDI 1 NAME Marie Charlotte // 1 SEX F 1 BIRT 2 DATE 1840 1 DEAT 2 DATE 1927 1 FAMS @F686@ 1 FAMC @F663@ 0 @I1700@ INDI 1 NAME Louis Joseph // 1 TITL Dauphin 1 SEX M 1 BIRT 2 DATE 1781 1 DEAT 2 DATE 1789 1 FAMC @F526@ 0 @I1701@ INDI 1 NAME Louis_XVII // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 27 MAR 1785 2 PLAC Versailles,France 1 DEAT 2 DATE 8 JUN 1795 2 PLAC Paris,France 1 BURI 2 PLAC St Marguerite,Cemetery,France 1 FAMC @F526@ 0 @I1702@ INDI 1 NAME Sophie Beatrix // 1 SEX F 1 BIRT 2 DATE 1786 1 DEAT 2 DATE 1787 1 FAMC @F526@ 0 @I1703@ INDI 1 NAME Marie Therese of_Angouleme// 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE 1778 1 DEAT 2 DATE 1851 1 FAMC @F526@ 0 @I1704@ INDI 1 NAME Pepin the_Hunchback // 1 SEX M 1 DEAT 2 DATE 811 1 FAMC @F182@ 0 @I1705@ INDI 1 NAME Marie Amelie of_Bourbon// 1 TITL Queen of France 1 SEX F 1 BIRT 2 DATE 1782 1 DEAT 2 DATE 24 MAR 1866 2 PLAC Claremont 1 FAMS @F1187@ 0 @I1706@ INDI 1 NAME Alexander of_Mar /Ramsay/ 1 TITL Capt. 1 SEX M 1 BIRT 2 DATE 1919 1 FAMS @F665@ 1 FAMC @F37@ 0 @I1707@ INDI 1 NAME Flora Fraser // 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1930 1 FAMS @F665@ 0 @I1708@ INDI 1 NAME Dorothy /Hastings/ 1 SEX F 1 BIRT 2 DATE 1899 1 FAMS @F666@ 0 @I1709@ INDI 1 NAME // 1 TITL Duke of Beaufort 1 SEX M 1 BIRT 2 DATE 1900 1 FAMS @F667@ 0 @I1710@ INDI 1 NAME J. E. /Gibbs/ 1 TITL Col. 1 SEX M 1 BIRT 2 DATE 1879 1 DEAT 2 DATE 1932 1 FAMS @F668@ 0 @I1711@ INDI 1 NAME Henry Abel /Smith/ 1 TITL Col. Sir 1 SEX M 1 BIRT 2 DATE 1900 1 FAMS @F669@ 0 @I1712@ INDI 1 NAME John /Spencer/ 1 SEX M 1 BIRT 2 DATE 1960 1 DEAT 2 DATE 1960 1 FAMC @F78@ 0 @I1713@ INDI 1 NAME Katharine /Seymour/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1900 1 FAMC @F127@ 0 @I1714@ INDI 1 NAME James // 1 TITL Duke of Abercorn 1 SEX M 1 BIRT 2 DATE 1904 1 DEAT 2 DATE 1979 1 FAMS @F670@ 1 FAMC @F127@ 0 @I1715@ INDI 1 NAME Kathleen /Crichton/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1905 1 FAMS @F670@ 0 @I1716@ INDI 1 NAME Charles Lennox of_Richmond// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1764 1 DEAT 2 DATE 1819 1 FAMS @F671@ 1 FAMC @F672@ 0 @I1717@ INDI 1 NAME George Henry Lennox// 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1805 1 FAMS @F672@ 1 FAMC @F673@ 0 @I1718@ INDI 1 NAME Louisa /Kerr/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1830 1 FAMS @F672@ 1 FAMC @F678@ 0 @I1719@ INDI 1 NAME Charles Lennox of_Richmond// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1701 1 DEAT 2 DATE 1750 1 FAMS @F673@ 1 FAMC @F674@ 0 @I1720@ INDI 1 NAME Charles Lennox of_Richmond// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1672 1 DEAT 2 DATE 1723 1 FAMS @F674@ 0 @I1721@ INDI 1 NAME Anne of_Albemarle // 1 TITL Countess 1 SEX F 1 DEAT 2 DATE 1789 1 FAMS @F677@ 1 FAMC @F674@ 0 @I1722@ INDI 1 NAME John /Russell/ 1 TITL Duke of Bedford 1 SEX M 1 BIRT 2 DATE 1766 1 DEAT 2 DATE 1839 1 FAMS @F675@ 1 FAMC @F676@ 0 @I1723@ INDI 1 NAME Elizabeth of_Tavistock // 1 TITL Marchioness 1 SEX F 1 DEAT 2 DATE 1768 1 FAMS @F676@ 1 FAMC @F677@ 0 @I1724@ INDI 1 NAME Caroline of_Lothian // 1 TITL Marchioness 1 SEX F 1 DEAT 2 DATE 1778 1 FAMS @F678@ 1 FAMC @F679@ 0 @I1725@ INDI 1 NAME Frederica of_Holdernesse // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1688 1 DEAT 2 DATE 1751 1 FAMS @F679@ 1 FAMC @F680@ 0 @I1726@ INDI 1 NAME of_Schomberg // 1 TITL Duke 1 SEX M 1 FAMS @F680@ 0 @I1727@ INDI 1 NAME Charlot // 1 SEX F 1 BIRT 2 DATE 1659 1 DEAT 2 DATE 1696 1 FAMS @F680@ 0 @I1728@ INDI 1 NAME Richard /Bingham/ 1 TITL Earl of Lucan 1 SEX M 1 BIRT 2 DATE 1764 1 DEAT 2 DATE 1839 1 FAMS @F681@ 1 FAMC @F682@ 0 @I1729@ INDI 1 NAME Charles /Bingham/ 1 TITL Earl of Lucan 1 SEX M 1 BIRT 2 DATE 1735 1 DEAT 2 DATE 1799 1 FAMS @F682@ 0 @I1730@ INDI 1 NAME Elizabeth /Poyntz/ 1 SEX F 1 DEAT 2 DATE 1851 1 FAMS @F683@ 0 @I1731@ INDI 1 NAME /Spencer/ 1 TITL Earl of Spencer 1 SEX M 1 BIRT 2 DATE 1835 1 DEAT 2 DATE 1910 1 FAMS @F684@ 1 FAMC @F683@ 0 @I1732@ INDI 1 NAME Charlotte /Seymour/ 1 SEX F 1 DEAT 2 DATE 1903 1 FAMS @F684@ 0 @I1733@ INDI 1 NAME Delia Peel // 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1981 1 FAMC @F133@ 0 @I1734@ INDI 1 NAME Lavinia Annaly // 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1899 1 DEAT 2 DATE 1955 1 FAMC @F133@ 0 @I1735@ INDI 1 NAME John of_Althorp /Spencer/ 1 TITL Hon. 1 SEX M 1 BIRT 2 DATE 1708 1 DEAT 2 DATE 1746 1 FAMS @F685@ 0 @I1736@ INDI 1 NAME William_IX of_Hesse-Cassel // 1 TITL Elector 1 SEX M 1 FAMC @F622@ 0 @I1737@ INDI 1 NAME Ernest_II of_Saxe-Coburg- Saalfeld// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1818 1 DEAT 2 DATE 1893 1 FAMS @F1369@ 1 FAMC @F43@ 0 @I1738@ INDI 1 NAME Marie // 1 SEX F 1 FAMS @F687@ 0 @I1739@ INDI 1 NAME Philip_III the_Bold // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1 MAY 1245 2 PLAC Poissy,,,France 1 DEAT 2 DATE 5 OCT 1285 2 PLAC Perpignan 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1231@ 1 FAMS @F688@ 1 FAMC @F689@ 0 @I1740@ INDI 1 NAME Louis_IX (St._Louis) // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 25 APR 1214 1 DEAT 2 DATE 25 AUG 1270 2 PLAC Tunis,,,Africa 1 BURI 2 PLAC St. Denis,France 1 FAMS @F689@ 1 FAMC @F690@ 0 @I1741@ INDI 1 NAME Louis_VIII the_Lion // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 5 SEP 1187 2 PLAC Paris,France 1 DEAT 2 DATE 8 NOV 1226 2 PLAC Auvergne,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F690@ 1 FAMC @F1156@ 0 @I1742@ INDI 1 NAME Blanche of_Castile // 1 SEX F 1 BIRT 2 DATE 1188 1 DEAT 2 DATE 1252 1 FAMS @F690@ 1 FAMC @F691@ 0 @I1743@ INDI 1 NAME Charles_IV the_Fair // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 1294 1 DEAT 2 DATE 1 FEB 1328 2 PLAC Vincennes,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1176@ 1 FAMS @F1177@ 1 FAMS @F1178@ 1 FAMC @F794@ 0 @I1744@ INDI 1 NAME Edward // 1 SEX M 1 FAMS @F692@ 1 FAMC @F562@ 0 @I1745@ INDI 1 NAME Beatrice // 1 SEX F 1 FAMS @F692@ 0 @I1746@ INDI 1 NAME Ferdinand_III // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE 1199 1 DEAT 2 DATE 1252 1 FAMS @F693@ 1 FAMC @F784@ 0 @I1747@ INDI 1 NAME Berengaria // 1 SEX F 1 BIRT 2 DATE 1171 1 DEAT 2 DATE 1246 1 FAMS @F784@ 1 FAMC @F571@ 0 @I1748@ INDI 1 NAME Sancho_III // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE ABT 1134 1 DEAT 2 DATE ABT 1158 1 FAMS @F695@ 0 @I1749@ INDI 1 NAME Alfonso_X the_Wise // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE ABT 1226 1 DEAT 2 DATE 1284 2 PLAC Seville,,,Spain 1 FAMS @F696@ 1 FAMC @F693@ 0 @I1750@ INDI 1 NAME /Unknown/ 1 SEX F 1 FAMS @F696@ 0 @I1751@ INDI 1 NAME Sancho_IV // 1 SEX M 1 BIRT 2 DATE 1258 1 DEAT 2 DATE 1296 1 FAMC @F696@ 0 @I1752@ INDI 1 NAME Gunnor // 1 SEX M 1 FAMS @F698@ 0 @I1753@ INDI 1 NAME Athelstan // 1 FAMC @F580@ 0 @I1754@ INDI 1 NAME Egbert // 1 SEX M 1 DEAT 2 DATE 1005 1 FAMC @F580@ 0 @I1755@ INDI 1 NAME Edred // 1 FAMC @F580@ 0 @I1756@ INDI 1 NAME Edwy // 1 DEAT 2 DATE 1017 1 FAMC @F580@ 0 @I1757@ INDI 1 NAME Edward // 1 SEX M 1 FAMC @F580@ 0 @I1758@ INDI 1 NAME Edgar // 1 SEX M 1 FAMC @F580@ 0 @I1759@ INDI 1 NAME Edith // 1 SEX F 1 FAMS @F701@ 1 FAMC @F580@ 0 @I1760@ INDI 1 NAME Elgiva // 1 SEX F 1 FAMS @F702@ 1 FAMC @F580@ 0 @I1761@ INDI 1 NAME Wulfhilda // 1 SEX F 1 FAMS @F704@ 1 FAMC @F580@ 0 @I1762@ INDI 1 NAME (Daughter) // 1 SEX F 1 FAMS @F705@ 1 FAMC @F580@ 0 @I1763@ INDI 1 NAME Stephen_I // 1 TITL King of Hungary 1 SEX M 1 BIRT 2 DATE ABT 975 1 DEAT 2 DATE 1038 1 FAMS @F699@ 0 @I1764@ INDI 1 NAME Edmund // 1 SEX M 1 FAMS @F700@ 1 FAMC @F581@ 0 @I1765@ INDI 1 NAME Hedwig // 1 SEX F 1 FAMS @F700@ 1 FAMC @F699@ 0 @I1766@ INDI 1 NAME Christina // 1 SEX F 1 FAMC @F582@ 0 @I1767@ INDI 1 NAME Alfred Athling // 1 SEX M 1 DEAT 2 DATE 1036 1 FAMC @F575@ 0 @I1768@ INDI 1 NAME Gunhilda // 1 SEX F 1 DEAT 2 DATE 1038 1 FAMS @F846@ 1 FAMC @F584@ 0 @I1769@ INDI 1 NAME Edric of_Mercia /Streona/ 1 TITL Ealdorman 1 SEX M 1 FAMS @F701@ 0 @I1770@ INDI 1 NAME Uchtred // 1 SEX M 1 FAMS @F702@ 1 FAMC @F703@ 0 @I1771@ INDI 1 NAME Waltheof of Northumberland// 1 TITL Earl 1 SEX M 1 FAMS @F703@ 0 @I1772@ INDI 1 NAME Ulfcytel of_East_Anglia /Snylling/ 1 TITL Ealdorman 1 SEX M 1 FAMS @F704@ 0 @I1773@ INDI 1 NAME Athelstan // 1 SEX M 1 FAMS @F705@ 0 @I1774@ INDI 1 NAME Alfgar of_Mercia // 1 TITL Earl 1 SEX M 1 FAMS @F706@ 0 @I1775@ INDI 1 NAME Alfhelm of_Northhampton // 1 TITL Earl 1 SEX M 1 FAMS @F707@ 0 @I1776@ INDI 1 NAME Sweyn Forkbeard // 1 TITL King of Denmark 1 SEX M 1 DEAT 2 DATE 1014 1 FAMS @F708@ 0 @I1777@ INDI 1 NAME Gunhilda // 1 SEX F 1 FAMS @F708@ 1 FAMC @F709@ 0 @I1778@ INDI 1 NAME Mieczislaw_I of_Poland // 1 TITL Duke 1 SEX M 1 FAMS @F709@ 0 @I1779@ INDI 1 NAME Edgar the_Peaceful // 1 SEX M 1 BIRT 2 DATE 944 1 DEAT 2 DATE 975 1 BURI 2 PLAC Glastonbury 1 FAMS @F710@ 1 FAMS @F711@ 1 FAMC @F714@ 0 @I1780@ INDI 1 NAME Elfrida // 1 SEX F 1 DEAT 2 DATE 1000 1 FAMS @F710@ 1 FAMC @F713@ 0 @I1781@ INDI 1 NAME Ethelfleda // 1 SEX F 1 FAMS @F711@ 1 FAMC @F712@ 0 @I1782@ INDI 1 NAME Edward the_Martyr // 1 SEX M 1 FAMC @F711@ 0 @I1783@ INDI 1 NAME Ordmaer // 1 TITL Ealdorman 1 SEX M 1 FAMS @F712@ 0 @I1784@ INDI 1 NAME Edmund // 1 SEX M 1 DEAT 2 DATE 970 1 FAMC @F710@ 0 @I1785@ INDI 1 NAME Ordgar of_Devon Ealdorman// 1 SEX M 1 FAMS @F713@ 0 @I1786@ INDI 1 NAME Edmund_I the_Elder // 1 SEX M 1 BIRT 2 DATE 939 1 DEAT 2 DATE 946 1 BURI 2 PLAC Glastonbury 1 FAMS @F714@ 1 FAMS @F716@ 1 FAMC @F718@ 0 @I1787@ INDI 1 NAME St._Elgiva // 1 SEX F 1 FAMS @F714@ 0 @I1788@ INDI 1 NAME Edwy // 1 SEX M 1 FAMS @F715@ 1 FAMC @F714@ 0 @I1789@ INDI 1 NAME Elgiva // 1 SEX F 1 FAMS @F715@ 0 @I1790@ INDI 1 NAME Ethelfleda of_Domerham // 1 SEX F 1 FAMS @F716@ 1 FAMC @F717@ 0 @I1791@ INDI 1 NAME Alfgar of_Wiltshire // 1 TITL Ealdorman 1 SEX M 1 FAMS @F717@ 0 @I1792@ INDI 1 NAME Edward the_Elder // 1 SEX M 1 DEAT 2 DATE 924 1 BURI 2 PLAC Winchester 1 FAMS @F720@ 1 FAMS @F722@ 1 FAMS @F718@ 1 FAMC @F834@ 0 @I1793@ INDI 1 NAME Edgiva // 1 SEX F 1 FAMS @F718@ 0 @I1794@ INDI 1 NAME Edred // 1 SEX M 1 FAMC @F718@ 0 @I1795@ INDI 1 NAME Edburh // 1 SEX F 1 FAMC @F718@ 0 @I1796@ INDI 1 NAME Edgiva // 1 SEX F 1 FAMS @F719@ 1 FAMC @F718@ 0 @I1797@ INDI 1 NAME Louis // 1 TITL King of Provence 1 SEX M 1 FAMS @F719@ 0 @I1798@ INDI 1 NAME Ecgwyn // 1 SEX F 1 FAMS @F720@ 0 @I1799@ INDI 1 NAME Athelstan // 1 SEX M 1 BIRT 2 DATE 895 1 DEAT 2 DATE 940 1 BURI 2 PLAC Malmesbury 1 FAMC @F720@ 0 @I1800@ INDI 1 NAME Daughter // 1 SEX F 1 FAMS @F721@ 1 FAMC @F720@ 0 @I1801@ INDI 1 NAME Sihtric of Northumberland// 1 TITL King of Denmark 1 SEX M 1 FAMS @F721@ 0 @I1802@ INDI 1 NAME Elfleda // 1 SEX F 1 FAMS @F722@ 0 @I1803@ INDI 1 NAME Ethelwerd // 1 DEAT 2 DATE 924 1 FAMC @F722@ 0 @I1804@ INDI 1 NAME Edwin // 1 SEX M 1 FAMC @F722@ 0 @I1805@ INDI 1 NAME Elfleda // 1 SEX F 1 FAMC @F722@ 0 @I1806@ INDI 1 NAME Edgiva // 1 SEX F 1 FAMS @F723@ 1 FAMC @F722@ 0 @I1807@ INDI 1 NAME Ethelhilda // 1 SEX F 1 FAMC @F722@ 0 @I1808@ INDI 1 NAME Edhilda // 1 SEX F 1 FAMS @F724@ 1 FAMC @F722@ 0 @I1809@ INDI 1 NAME Eadgyth (Edith) // 1 SEX F 1 FAMS @F725@ 1 FAMC @F722@ 0 @I1810@ INDI 1 NAME Elgiva // 1 SEX F 1 FAMS @F726@ 1 FAMC @F722@ 0 @I1811@ INDI 1 NAME Charles the_Simple // 1 TITL King of France 1 SEX M 1 FAMS @F723@ 0 @I1812@ INDI 1 NAME Hugh the_Great // 1 TITL Count of Paris 1 SEX M 1 FAMS @F724@ 0 @I1813@ INDI 1 NAME Otho_I the_Great // 1 TITL King of Germany 1 SEX M 1 FAMS @F725@ 0 @I1814@ INDI 1 NAME Boleslaw_II // 1 TITL Duke of Bohemia 1 SEX M 1 FAMS @F726@ 0 @I1815@ INDI 1 NAME Claude // 1 TITL Duke of Guise 1 SEX M 1 FAMS @F727@ 0 @I1816@ INDI 1 NAME Francis_I // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 12 SEP 1494 2 PLAC Cognac,France 1 DEAT 2 DATE 31 MAR 1547 2 PLAC Rambouillet,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F728@ 1 FAMS @F1359@ 1 FAMC @F729@ 0 @I1817@ INDI 1 NAME Louise of_Savoy // 1 SEX F 1 BIRT 2 DATE 1476 1 DEAT 2 DATE 1531 1 FAMS @F729@ 0 @I1818@ INDI 1 NAME Donald // 1 TITL Earl of Mar 1 SEX M 1 FAMS @F730@ 0 @I1819@ INDI 1 NAME Adam of_Rowallan /Mure/ 1 TITL Sir 1 SEX M 1 FAMS @F731@ 0 @I1820@ INDI 1 NAME Hugh // 1 TITL Earl of Ross 1 SEX M 1 FAMS @F732@ 0 @I1821@ INDI 1 NAME Jean // 1 TITL Lady 1 SEX F 1 FAMS @F733@ 1 FAMS @F734@ 1 FAMS @F735@ 1 FAMC @F543@ 0 @I1822@ INDI 1 NAME John /Keith/ 1 TITL Sir 1 SEX M 1 FAMS @F733@ 0 @I1823@ INDI 1 NAME John of_Glamis /Lyon/ 1 TITL Sir 1 SEX M 1 FAMS @F734@ 0 @I1824@ INDI 1 NAME James /Sandilands/ 1 TITL Sir 1 SEX M 1 FAMS @F735@ 0 @I1825@ INDI 1 NAME John /Drummond/ 1 TITL Sir 1 SEX M 1 FAMS @F737@ 0 @I1826@ INDI 1 NAME Arnold // 1 TITL Duke of Gueldres 1 SEX M 1 FAMS @F738@ 0 @I1827@ INDI 1 NAME Christian_I // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 1426 1 DEAT 2 DATE 1481 1 FAMS @F739@ 0 @I1828@ INDI 1 NAME Dorothea // 1 SEX F 1 BIRT 2 DATE 1430 1 DEAT 2 DATE 1495 1 FAMS @F739@ 1 FAMS @F1342@ 1 FAMC @F1277@ 0 @I1829@ INDI 1 NAME /Unknown/ 1 SEX F 1 FAMS @F548@ 0 @I1830@ INDI 1 NAME Robert /Bruce/ 1 SEX M 1 DEAT 2 DATE 1304 1 FAMS @F740@ 1 FAMC @F741@ 0 @I1831@ INDI 1 NAME Margaret of_Carrick // 1 TITL Countess 1 SEX F 1 FAMS @F740@ 0 @I1832@ INDI 1 NAME Robert /Bruce/ 1 SEX M 1 DEAT 2 DATE 1295 1 FAMS @F741@ 1 FAMC @F743@ 0 @I1833@ INDI 1 NAME Isobel // 1 SEX F 1 DEAT 2 DATE 1254 1 FAMS @F741@ 1 FAMC @F742@ 0 @I1834@ INDI 1 NAME Gilbert De_Clare of_Gloucester// 1 TITL Earl 1 SEX M 1 FAMS @F742@ 0 @I1835@ INDI 1 NAME Robert of_Annandale /Bruce/ 1 TITL Lord 1 SEX M 1 FAMS @F743@ 0 @I1836@ INDI 1 NAME Isobel // 1 SEX F 1 DEAT 2 DATE 1251 1 FAMS @F743@ 1 FAMC @F744@ 0 @I1837@ INDI 1 NAME David of_Huntingdon // 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1219 1 FAMS @F744@ 1 FAMC @F1023@ 0 @I1838@ INDI 1 NAME Matilda // 1 SEX F 1 DEAT 2 DATE 1233 1 FAMS @F744@ 1 FAMC @F745@ 0 @I1839@ INDI 1 NAME Hugh /Keveliock/ 1 TITL Earl of Chester 1 SEX M 1 FAMS @F745@ 0 @I1840@ INDI 1 NAME John /Logie/ 1 TITL Sir 1 SEX M 1 FAMS @F746@ 0 @I1841@ INDI 1 NAME Malcolm /Drummond/ 1 TITL Sir 1 SEX M 1 FAMS @F747@ 0 @I1842@ INDI 1 NAME Margaret // 1 SEX F 1 DEAT 2 DATE 1228 1 FAMS @F806@ 1 FAMC @F744@ 0 @I1843@ INDI 1 NAME Alan // 1 TITL Lord of Galloway 1 SEX M 1 FAMS @F748@ 1 FAMS @F806@ 0 @I1844@ INDI 1 NAME Devorguilla // 1 SEX F 1 DEAT 2 DATE 1290 1 FAMS @F749@ 1 FAMC @F806@ 0 @I1845@ INDI 1 NAME John /Balliol/ 1 SEX M 1 FAMS @F749@ 0 @I1846@ INDI 1 NAME John /Balliol/ 1 SEX M 1 DEAT 2 DATE 1313 1 FAMS @F750@ 1 FAMC @F749@ 0 @I1847@ INDI 1 NAME Isobel // 1 SEX F 1 FAMS @F750@ 1 FAMC @F751@ 0 @I1848@ INDI 1 NAME John de_Warenne // 1 TITL Earl of Surrey 1 SEX M 1 FAMS @F751@ 0 @I1849@ INDI 1 NAME Edward /Balliol/ 1 SEX M 1 DEAT 2 DATE 1363 1 FAMC @F750@ 0 @I1850@ INDI 1 NAME Baldwin_V of_Flanders // 1 TITL Count 1 SEX M 1 FAMS @F752@ 0 @I1851@ INDI 1 NAME Sybilla // 1 SEX F 1 FAMS @F753@ 1 FAMC @F754@ 0 @I1852@ INDI 1 NAME Geoffrey of_Conversano // 1 TITL Count 1 SEX M 1 FAMS @F754@ 0 @I1853@ INDI 1 NAME William Clito of_Flanders// 1 TITL Count 1 SEX M 1 DEAT 2 DATE 1128 1 FAMS @F755@ 1 FAMS @F757@ 1 FAMC @F753@ 0 @I1854@ INDI 1 NAME Sybil // 1 SEX F 1 FAMS @F755@ 1 FAMC @F760@ 0 @I1855@ INDI 1 NAME Fulke // 1 TITL Count of Anjou 1 SEX M 1 FAMS @F760@ 0 @I1856@ INDI 1 NAME Adelicia // 1 SEX F 1 FAMS @F757@ 1 FAMC @F758@ 0 @I1857@ INDI 1 NAME Reiner of_Montferrat // 1 TITL Marquis 1 SEX M 1 FAMS @F758@ 0 @I1858@ INDI 1 NAME Isabella // 1 SEX F 1 FAMS @F759@ 1 FAMC @F760@ 0 @I1859@ INDI 1 NAME Geoffrey Lower_Lorraine // 1 TITL Duke 1 SEX M 1 FAMS @F756@ 0 @I1860@ INDI 1 NAME Matilda // 1 SEX F 1 DEAT 2 DATE 1120 1 FAMC @F569@ 0 @I1861@ INDI 1 NAME William // 1 SEX M 1 FAMS @F761@ 1 FAMC @F569@ 0 @I1862@ INDI 1 NAME Agnes // 1 SEX F 1 FAMS @F761@ 1 FAMC @F762@ 0 @I1863@ INDI 1 NAME Giles de_Sulli // 1 SEX M 1 FAMS @F762@ 0 @I1864@ INDI 1 NAME Maud // 1 SEX F 1 FAMS @F763@ 1 FAMC @F764@ 0 @I1865@ INDI 1 NAME Ingelbert of_Carinthia // 1 TITL Duke 1 SEX M 1 FAMS @F764@ 0 @I1866@ INDI 1 NAME Geoffrey_VI of_Anjou // 1 TITL Count of Nantes 1 SEX M 1 BIRT 2 DATE 1134 1 DEAT 2 DATE 1158 1 FAMC @F510@ 0 @I1867@ INDI 1 NAME William // 1 TITL Count of Poitou 1 SEX M 1 BIRT 2 DATE 1136 1 DEAT 2 DATE 1164 1 FAMC @F510@ 0 @I1868@ INDI 1 NAME William_X of_Aquitaine // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1099 1 DEAT 2 DATE 1137 1 FAMS @F765@ 0 @I1869@ INDI 1 NAME Louis_VII the_Younger // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 1121 1 DEAT 2 DATE 18 SEP 1180 2 PLAC Paris,France 1 BURI 2 PLAC Abbey Barbeaux,Melun,France 1 FAMS @F766@ 1 FAMS @F1168@ 1 FAMS @F1169@ 1 FAMC @F1158@ 0 @I1870@ INDI 1 NAME William de_Warenne // 1 TITL Earl of Surrey 1 SEX M 1 FAMS @F767@ 0 @I1871@ INDI 1 NAME Theodore of_Flanders // 1 TITL Count 1 SEX M 1 FAMS @F768@ 0 @I1872@ INDI 1 NAME Sancho_VI // 1 TITL King of Navarre 1 SEX M 1 FAMS @F769@ 0 @I1873@ INDI 1 NAME Eleanor // 1 SEX F 1 DEAT 2 DATE 1241 1 FAMC @F563@ 0 @I1874@ INDI 1 NAME Conan of_Brittany // 1 TITL Duke 1 SEX M 1 FAMS @F770@ 0 @I1875@ INDI 1 NAME Ranulph // 1 TITL Earl of Chester 1 SEX M 1 FAMS @F771@ 0 @I1876@ INDI 1 NAME Guy of_Thouars // 1 TITL Viscount 1 SEX M 1 FAMS @F772@ 0 @I1877@ INDI 1 NAME William of_Gloucester // 1 TITL Earl 1 SEX M 1 FAMS @F773@ 0 @I1878@ INDI 1 NAME Geoffrey de_Mandeville // 1 SEX M 1 FAMS @F774@ 0 @I1879@ INDI 1 NAME Hubert de_Burgh // 1 SEX M 1 FAMS @F775@ 0 @I1880@ INDI 1 NAME Hugh de_la_Marche /le_Brun/ 1 TITL Count 1 SEX M 1 FAMS @F776@ 0 @I1881@ INDI 1 NAME Raymond of_Provence // 1 TITL Count 1 SEX M 1 FAMS @F777@ 0 @I1882@ INDI 1 NAME Henry // 1 SEX M 1 DEAT 2 DATE 1271 1 FAMC @F599@ 0 @I1883@ INDI 1 NAME William of_Pembroke /Marshal/ 1 TITL Earl 1 SEX M 1 FAMS @F778@ 0 @I1884@ INDI 1 NAME Raymond of_Provence /Berengar/ 1 TITL Count 1 SEX M 1 FAMS @F779@ 0 @I1885@ INDI 1 NAME William de_Fauquemont of_Montjoye// 1 TITL Count 1 SEX M 1 FAMS @F780@ 0 @I1886@ INDI 1 NAME Alexander_II // 1 TITL King of Scotland 1 SEX M 1 BIRT 2 DATE 1198 1 DEAT 2 DATE 1249 1 FAMS @F781@ 1 FAMS @F1025@ 1 FAMC @F1024@ 0 @I1887@ INDI 1 NAME Edmund // 1 TITL Earl of Cornwall 1 SEX M 1 DEAT 2 DATE 1300 1 FAMS @F782@ 1 FAMC @F600@ 0 @I1888@ INDI 1 NAME Richard // 1 SEX M 1 DEAT 2 DATE 1296 1 FAMC @F600@ 0 @I1889@ INDI 1 NAME Margaret // 1 SEX F 1 FAMS @F782@ 1 FAMC @F783@ 0 @I1890@ INDI 1 NAME Richard De_Clare of_Gloucester// 1 TITL Earl 1 SEX M 1 FAMS @F783@ 0 @I1891@ INDI 1 NAME Alfonso_IX // 1 TITL King of Castile 1 SEX M 1 DEAT 2 DATE 1230 1 FAMS @F784@ 1 FAMS @F691@ 0 @I1892@ INDI 1 NAME Lucienne of_Rochefort // 1 SEX F 1 FAMS @F694@ 0 @I1893@ INDI 1 NAME William of_Albemarle /de_Forz/ 1 TITL Count 1 SEX M 1 FAMS @F785@ 0 @I1894@ INDI 1 NAME Robert // 1 TITL Count of Artois 1 SEX M 1 FAMS @F786@ 1 FAMC @F690@ 0 @I1895@ INDI 1 NAME /Unknown/ 1 SEX F 1 FAMS @F786@ 0 @I1896@ INDI 1 NAME Yolande // 1 SEX F 1 FAMS @F787@ 1 FAMC @F788@ 0 @I1897@ INDI 1 NAME Robert_IV // 1 TITL Count of Dreux 1 SEX M 1 FAMS @F788@ 0 @I1898@ INDI 1 NAME Roger of_Harwich /Hayles/ 1 TITL Sir 1 SEX M 1 FAMS @F789@ 0 @I1899@ INDI 1 NAME Piers De_Braose // 1 SEX M 1 FAMS @F790@ 0 @I1900@ INDI 1 NAME Ralph /Cobham/ 1 TITL Sir 1 SEX M 1 FAMS @F791@ 0 @I1901@ INDI 1 NAME John // 1 TITL Lord Wake 1 SEX M 1 FAMS @F792@ 0 @I1902@ INDI 1 NAME John /Comyn/ 1 SEX M 1 FAMS @F793@ 0 @I1903@ INDI 1 NAME Philip_IV the_Fair // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1268 2 PLAC Fontainebleau,France 1 DEAT 2 DATE 29 NOV 1314 2 PLAC Fontainebleau,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F794@ 1 FAMC @F688@ 0 @I1904@ INDI 1 NAME Roger /Mortimer/ 1 TITL Earl of March II 1 SEX M 1 DEAT 2 DATE 1360 1 FAMS @F795@ 1 FAMC @F796@ 0 @I1905@ INDI 1 NAME Edmund /Mortimer/ 1 TITL Sir 1 SEX M 1 FAMS @F796@ 1 FAMC @F797@ 0 @I1906@ INDI 1 NAME Roger /Mortimer/ 1 TITL Earl of March I 1 SEX M 1 DEAT 2 DATE 1330 1 FAMS @F797@ 1 FAMC @F798@ 0 @I1907@ INDI 1 NAME Edmund /Mortimer/ 1 TITL Lord Mortimer I 1 SEX M 1 FAMS @F798@ 1 FAMC @F799@ 0 @I1908@ INDI 1 NAME Roger /Mortimer/ 1 SEX M 1 FAMS @F799@ 1 FAMC @F800@ 0 @I1909@ INDI 1 NAME Maud // 1 SEX F 1 FAMS @F799@ 1 FAMC @F807@ 0 @I1910@ INDI 1 NAME Ralph /Mortimer/ 1 SEX M 1 FAMS @F800@ 0 @I1911@ INDI 1 NAME Gwladus DDU // 1 SEX F 1 FAMS @F801@ 1 FAMS @F800@ 1 FAMC @F802@ 0 @I1912@ INDI 1 NAME Reginald De_Braose // 1 SEX M 1 FAMS @F801@ 1 FAMS @F808@ 1 FAMC @F809@ 0 @I1913@ INDI 1 NAME Llywelyn Fawr the_Great// 1 TITL Prince of Wales 1 SEX M 1 FAMS @F802@ 1 FAMC @F830@ 0 @I1914@ INDI 1 NAME Richard /Wellesley/ 1 TITL Marquess 1 SEX M 1 DEAT 2 DATE 1842 1 FAMS @F803@ 1 FAMC @F804@ 0 @I1915@ INDI 1 NAME Garret of_Mornington /Wellesley/ 1 TITL Earl 1 SEX M 1 FAMS @F804@ 0 @I1916@ INDI 1 NAME Anne /Hill/ 1 TITL Hon. 1 SEX F 1 DEAT 2 DATE 1831 1 FAMS @F804@ 1 FAMC @F805@ 0 @I1917@ INDI 1 NAME Arthur of_Wellington /Wellesley/ 1 TITL Duke 1 SEX M 1 FAMC @F804@ 0 @I1918@ INDI 1 NAME Arthur Dungannon /Hill/ 1 TITL Viscount 1 SEX M 1 FAMS @F805@ 1 FAMC @F987@ 0 @I1919@ INDI 1 NAME William /De_Braose/ 1 SEX M 1 FAMS @F807@ 1 FAMC @F808@ 0 @I1920@ INDI 1 NAME William /De_Braose/ 1 SEX M 1 FAMS @F809@ 0 @I1921@ INDI 1 NAME Bertha // 1 SEX F 1 FAMS @F809@ 1 FAMC @F810@ 0 @I1922@ INDI 1 NAME Miles of_Gloucester // 1 TITL Earl of Hereford 1 SEX M 1 FAMS @F810@ 0 @I1923@ INDI 1 NAME Sybil // 1 SEX F 1 FAMS @F810@ 1 FAMC @F811@ 0 @I1924@ INDI 1 NAME Bernard of_Neufmarche // 1 SEX M 1 FAMS @F811@ 0 @I1925@ INDI 1 NAME Nest // 1 SEX F 1 FAMS @F811@ 1 FAMC @F812@ 0 @I1926@ INDI 1 NAME Osbern Fitz Richard// 1 SEX M 1 FAMS @F812@ 0 @I1927@ INDI 1 NAME Nest // 1 SEX F 1 FAMS @F812@ 1 FAMC @F813@ 0 @I1928@ INDI 1 NAME Gruffydd Ap_Llywelyn // 1 SEX M 1 FAMS @F813@ 1 FAMC @F814@ 0 @I1929@ INDI 1 NAME Henry_III // 1 TITL King of Germany 1 SEX M 1 BIRT 2 DATE 1017 1 DEAT 2 DATE 1056 1 FAMS @F846@ 0 @I1930@ INDI 1 NAME Llywelyn Ap_Seisyll // 1 SEX M 1 FAMS @F814@ 0 @I1931@ INDI 1 NAME Angharad // 1 SEX F 1 FAMS @F814@ 1 FAMS @F815@ 1 FAMC @F816@ 0 @I1932@ INDI 1 NAME Cynfyn of_Powys // 1 SEX M 1 FAMS @F815@ 0 @I1933@ INDI 1 NAME Bleddyn // 1 SEX M 1 FAMC @F815@ 0 @I1934@ INDI 1 NAME Maredudd // 1 SEX M 1 FAMS @F816@ 1 FAMC @F817@ 0 @I1935@ INDI 1 NAME Owain // 1 SEX M 1 DEAT 2 DATE 968 1 FAMS @F817@ 1 FAMC @F818@ 0 @I1936@ INDI 1 NAME Hywel Dda (the_Good)// 1 SEX M 1 FAMS @F818@ 1 FAMC @F819@ 0 @I1937@ INDI 1 NAME Cadell // 1 SEX M 1 DEAT 2 DATE 909 1 FAMS @F819@ 1 FAMC @F820@ 0 @I1938@ INDI 1 NAME Rhodri Mawr (the_Great)// 1 SEX M 1 FAMS @F820@ 0 @I1939@ INDI 1 NAME Anarawd // 1 SEX M 1 FAMS @F822@ 1 FAMC @F820@ 0 @I1940@ INDI 1 NAME Idwal Foel (the_Bald)// 1 SEX M 1 DEAT 2 DATE 942 1 FAMS @F821@ 1 FAMC @F822@ 0 @I1941@ INDI 1 NAME /Unknown/ 1 SEX F 1 FAMS @F821@ 0 @I1942@ INDI 1 NAME Iago // 1 SEX M 1 FAMC @F821@ 0 @I1943@ INDI 1 NAME Ieuaf (Levan) // 1 SEX M 1 FAMS @F824@ 1 FAMC @F821@ 0 @I1944@ INDI 1 NAME Meurig // 1 SEX M 1 DEAT 2 DATE 986 1 FAMS @F825@ 1 FAMC @F821@ 0 @I1945@ INDI 1 NAME Hywel (the_Bad) // 1 SEX M 1 FAMS @F823@ 1 FAMC @F824@ 0 @I1946@ INDI 1 NAME Cadwallon // 1 SEX M 1 FAMC @F824@ 0 @I1947@ INDI 1 NAME Cynan // 1 SEX M 1 FAMC @F823@ 0 @I1948@ INDI 1 NAME Idwal // 1 SEX M 1 DEAT 2 DATE 996 1 FAMS @F826@ 1 FAMC @F825@ 0 @I1949@ INDI 1 NAME Iago // 1 SEX M 1 FAMS @F828@ 1 FAMC @F826@ 0 @I1950@ INDI 1 NAME Cynan // 1 SEX M 1 FAMS @F827@ 1 FAMC @F828@ 0 @I1951@ INDI 1 NAME Gruffydd Ap_Cynan // 1 SEX M 1 FAMS @F829@ 1 FAMC @F827@ 0 @I1952@ INDI 1 NAME Owain Gwynedd // 1 SEX M 1 FAMS @F831@ 1 FAMC @F829@ 0 @I1953@ INDI 1 NAME Iorwerth Drwyndwn // 1 SEX M 1 FAMS @F830@ 1 FAMC @F831@ 0 @I1954@ INDI 1 NAME /Unknown/ 1 SEX F 1 FAMS @F831@ 0 @I1955@ INDI 1 NAME Dafydd // 1 SEX M 1 FAMC @F831@ 0 @I1956@ INDI 1 NAME /Unknown/ 1 SEX F 1 FAMS @F802@ 0 @I1957@ INDI 1 NAME Gruffydd // 1 SEX M 1 FAMS @F833@ 1 FAMC @F802@ 0 @I1958@ INDI 1 NAME Dafydd // 1 SEX M 1 FAMC @F802@ 0 @I1959@ INDI 1 NAME Angharad // 1 SEX F 1 FAMS @F970@ 1 FAMC @F802@ 0 @I1960@ INDI 1 NAME Gwenllian // 1 SEX F 1 FAMC @F832@ 0 @I1961@ INDI 1 NAME Llywelyn Ap_Gruffydd // 1 SEX M 1 FAMS @F832@ 1 FAMC @F833@ 0 @I1962@ INDI 1 NAME Kathryn // 1 SEX F 1 FAMC @F62@ 0 @I1963@ INDI 1 NAME Norissa // 1 SEX F 1 FAMC @F62@ 0 @I1964@ INDI 1 NAME Alfred the_Great // 1 TITL King West Saxons 1 SEX M 1 BIRT 2 DATE 849 2 PLAC Wantage,,,England 1 DEAT 2 DATE 899 1 FAMS @F834@ 1 FAMC @F835@ 0 @I1965@ INDI 1 NAME Ealhswith // 1 SEX F 1 DEAT 2 DATE 905 1 FAMS @F834@ 1 FAMC @F842@ 0 @I1966@ INDI 1 NAME Ethelwulf // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 858 1 FAMS @F835@ 1 FAMS @F838@ 1 FAMC @F837@ 0 @I1967@ INDI 1 NAME Osburh // 1 SEX F 1 DEAT 2 DATE 846 1 FAMS @F835@ 1 FAMC @F839@ 0 @I1968@ INDI 1 NAME Athelstan // 1 SEX M 1 FAMC @F835@ 0 @I1969@ INDI 1 NAME Ethelbald // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 860 1 FAMS @F836@ 1 FAMC @F835@ 0 @I1970@ INDI 1 NAME Judith // 1 SEX F 1 FAMS @F836@ 1 FAMS @F838@ 0 @I1971@ INDI 1 NAME Ethelbert // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 866 1 FAMC @F835@ 0 @I1972@ INDI 1 NAME Ethelred_I // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 871 1 FAMS @F840@ 1 FAMC @F835@ 0 @I1973@ INDI 1 NAME Egbert // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 839 1 FAMS @F837@ 1 FAMC @F895@ 0 @I1974@ INDI 1 NAME Redburh // 1 SEX F 1 FAMS @F837@ 0 @I1975@ INDI 1 NAME Athelstan // 1 SEX M 1 FAMC @F837@ 0 @I1976@ INDI 1 NAME Oslac // 1 SEX M 1 FAMS @F839@ 0 @I1977@ INDI 1 NAME Ethelswith // 1 SEX F 1 DEAT 2 DATE 888 1 FAMS @F841@ 1 FAMC @F835@ 0 @I1978@ INDI 1 NAME Ethelhelm // 1 SEX M 1 FAMC @F840@ 0 @I1979@ INDI 1 NAME Ethelwald // 1 TITL King of York 1 SEX M 1 FAMC @F840@ 0 @I1980@ INDI 1 NAME Burghred // 1 TITL King of Mercia 1 SEX M 1 FAMS @F841@ 0 @I1981@ INDI 1 NAME Ethelred /Mucel/ 1 TITL Ealdorman 1 SEX M 1 FAMS @F842@ 0 @I1982@ INDI 1 NAME Ethelwerd // 1 SEX M 1 DEAT 2 DATE 922 1 FAMS @F843@ 1 FAMC @F834@ 0 @I1983@ INDI 1 NAME Elfwine // 1 SEX M 1 DEAT 2 DATE 937 1 FAMC @F843@ 0 @I1984@ INDI 1 NAME Ethelwine // 1 SEX M 1 DEAT 2 DATE 937 1 FAMC @F843@ 0 @I1985@ INDI 1 NAME Ethelfleda // 1 TITL Lady of Mercia 1 SEX F 1 DEAT 2 DATE 918 1 FAMS @F845@ 1 FAMC @F834@ 0 @I1986@ INDI 1 NAME Ethelgiva of_Shaftesbury // 1 TITL Abbess 1 SEX F 1 FAMC @F834@ 0 @I1987@ INDI 1 NAME Elfrida // 1 SEX F 1 FAMS @F844@ 1 FAMC @F834@ 0 @I1988@ INDI 1 NAME Baldwin_II of_Flanders // 1 TITL Count 1 SEX M 1 FAMS @F844@ 0 @I1989@ INDI 1 NAME Ethelred of_Mercia // 1 TITL Ealdorman 1 SEX M 1 DEAT 2 DATE 910 1 FAMS @F845@ 0 @I1990@ INDI 1 NAME Henry_IV // 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 11 NOV 1050 2 PLAC Goslar,,,Germany 1 DEAT 2 DATE 7 AUG 1106 2 PLAC Liege,,,Belgium 1 FAMC @F846@ 0 @I1991@ INDI 1 NAME Cerdic // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 534 1 FAMS @F847@ 1 FAMC @F849@ 0 @I1992@ INDI 1 NAME Cynric // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 560 1 FAMS @F848@ 1 FAMC @F847@ 0 @I1993@ INDI 1 NAME Ceawlin // 1 SEX M 1 DEAT 2 DATE 593 1 FAMS @F885@ 1 FAMC @F848@ 0 @I1994@ INDI 1 NAME Cutha // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 584 1 FAMS @F874@ 1 FAMC @F848@ 0 @I1995@ INDI 1 NAME Elesa // 1 SEX M 1 FAMS @F849@ 1 FAMC @F850@ 0 @I1996@ INDI 1 NAME Elsa // 1 SEX M 1 FAMS @F850@ 1 FAMC @F851@ 0 @I1997@ INDI 1 NAME Gewis // 1 SEX M 1 FAMS @F851@ 1 FAMC @F852@ 0 @I1998@ INDI 1 NAME Wig // 1 SEX M 1 FAMS @F852@ 1 FAMC @F853@ 0 @I1999@ INDI 1 NAME Freawine // 1 SEX M 1 FAMS @F853@ 1 FAMC @F854@ 0 @I2000@ INDI 1 NAME Frithogar // 1 SEX M 1 FAMS @F854@ 1 FAMC @F855@ 0 @I2001@ INDI 1 NAME Brond // 1 SEX M 1 FAMS @F855@ 1 FAMC @F856@ 0 @I2002@ INDI 1 NAME Baeldaeg // 1 SEX M 1 FAMS @F856@ 1 FAMC @F857@ 0 @I2003@ INDI 1 NAME Woden // 1 SEX M 1 FAMS @F857@ 1 FAMC @F858@ 0 @I2004@ INDI 1 NAME Frithuwald // 1 SEX M 1 FAMS @F858@ 1 FAMC @F859@ 0 @I2005@ INDI 1 NAME Frealaf // 1 SEX M 1 FAMS @F859@ 1 FAMC @F860@ 0 @I2006@ INDI 1 NAME Frithuwulf // 1 SEX M 1 FAMS @F860@ 1 FAMC @F861@ 0 @I2007@ INDI 1 NAME Finn // 1 SEX M 1 FAMS @F861@ 1 FAMC @F862@ 0 @I2008@ INDI 1 NAME Godwulf // 1 SEX M 1 FAMS @F862@ 1 FAMC @F863@ 0 @I2009@ INDI 1 NAME Geata // 1 SEX M 1 FAMS @F863@ 1 FAMC @F864@ 0 @I2010@ INDI 1 NAME Taetwa // 1 SEX M 1 FAMS @F864@ 1 FAMC @F865@ 0 @I2011@ INDI 1 NAME Beaw // 1 SEX M 1 FAMS @F865@ 1 FAMC @F866@ 0 @I2012@ INDI 1 NAME Sceldwa // 1 SEX M 1 FAMS @F866@ 1 FAMC @F867@ 0 @I2013@ INDI 1 NAME Heremod // 1 SEX M 1 FAMS @F867@ 1 FAMC @F868@ 0 @I2014@ INDI 1 NAME Itermon // 1 SEX M 1 FAMS @F868@ 1 FAMC @F869@ 0 @I2015@ INDI 1 NAME Hathra // 1 SEX M 1 FAMS @F869@ 1 FAMC @F870@ 0 @I2016@ INDI 1 NAME Hwala // 1 SEX M 1 FAMS @F870@ 1 FAMC @F871@ 0 @I2017@ INDI 1 NAME Bedwig // 1 SEX M 1 FAMS @F871@ 1 FAMC @F872@ 0 @I2018@ INDI 1 NAME Sceaf // 1 SEX M 1 FAMS @F872@ 0 @I2019@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F873@ 1 FAMC @F849@ 0 @I2020@ INDI 1 NAME Stuf // 1 SEX M 1 FAMC @F873@ 0 @I2021@ INDI 1 NAME Wihtgar Isle_of_Wight // 1 TITL King 1 SEX M 1 DEAT 2 DATE 544 1 FAMC @F873@ 0 @I2022@ INDI 1 NAME Ceolric // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 597 1 FAMS @F875@ 1 FAMC @F874@ 0 @I2023@ INDI 1 NAME Ceolwulf // 1 TITL King of Wessex 1 SEX M 1 FAMS @F879@ 1 FAMC @F874@ 0 @I2024@ INDI 1 NAME Cynegils // 1 TITL King of Wessex 1 SEX M 1 FAMS @F880@ 1 FAMC @F875@ 0 @I2025@ INDI 1 NAME Aescwine // 1 TITL King of Wessex 1 SEX M 1 FAMC @F876@ 0 @I2026@ INDI 1 NAME Cenfus // 1 SEX M 1 FAMS @F876@ 1 FAMC @F877@ 0 @I2027@ INDI 1 NAME Cenferth // 1 SEX M 1 FAMS @F877@ 1 FAMC @F878@ 0 @I2028@ INDI 1 NAME Cuthgils // 1 SEX M 1 FAMS @F878@ 1 FAMC @F879@ 0 @I2029@ INDI 1 NAME Cwichelm // 1 SEX M 1 DEAT 2 DATE 636 1 FAMS @F881@ 1 FAMC @F880@ 0 @I2030@ INDI 1 NAME Cenwealh // 1 SEX M 1 FAMS @F882@ 1 FAMS @F883@ 1 FAMC @F880@ 0 @I2031@ INDI 1 NAME Centwine // 1 TITL King of Wessex 1 SEX M 1 FAMC @F880@ 0 @I2032@ INDI 1 NAME Cyneburh // 1 SEX F 1 FAMS @F884@ 1 FAMC @F880@ 0 @I2033@ INDI 1 NAME Cuthred // 1 FAMC @F881@ 0 @I2034@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F882@ 0 @I2035@ INDI 1 NAME Sexburh // 1 TITL Queen of Wessex 1 SEX F 1 FAMS @F883@ 0 @I2036@ INDI 1 NAME Oswald of_Northumbria // 1 TITL King 1 SEX M 1 FAMS @F884@ 0 @I2037@ INDI 1 NAME Cuthwine // 1 SEX M 1 FAMS @F886@ 1 FAMC @F885@ 0 @I2038@ INDI 1 NAME Chad // 1 SEX M 1 FAMS @F887@ 1 FAMC @F886@ 0 @I2039@ INDI 1 NAME Cynebald // 1 SEX M 1 FAMS @F890@ 1 FAMC @F886@ 0 @I2040@ INDI 1 NAME Cuthwulf (Cutha) // 1 SEX M 1 FAMS @F899@ 1 FAMC @F886@ 0 @I2041@ INDI 1 NAME Cenbert // 1 SEX M 1 DEAT 2 DATE 661 1 FAMS @F888@ 1 FAMC @F887@ 0 @I2042@ INDI 1 NAME Cedwalla // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 689 2 PLAC Rome,,,Italy 1 FAMC @F888@ 0 @I2043@ INDI 1 NAME Mul // 1 TITL King of Kent 1 SEX M 1 DEAT 2 DATE 687 1 FAMC @F888@ 0 @I2044@ INDI 1 NAME Oswald /Atheling/ 1 SEX M 1 DEAT 2 DATE 729 1 FAMC @F889@ 0 @I2045@ INDI 1 NAME Ethelbald // 1 SEX M 1 FAMS @F889@ 1 FAMC @F890@ 0 @I2046@ INDI 1 NAME Ine // 1 TITL King of Wessex 1 SEX M 1 DEAT 2 DATE 728 2 PLAC Rome,,Italy 1 FAMS @F893@ 1 FAMC @F891@ 0 @I2047@ INDI 1 NAME Cenred // 1 SEX M 1 FAMS @F891@ 1 FAMC @F892@ 0 @I2048@ INDI 1 NAME Ceolwald // 1 SEX M 1 FAMS @F892@ 1 FAMC @F899@ 0 @I2049@ INDI 1 NAME Ethelburh // 1 SEX F 1 FAMS @F893@ 0 @I2050@ INDI 1 NAME Ingild // 1 SEX M 1 DEAT 2 DATE 718 1 FAMS @F898@ 1 FAMC @F891@ 0 @I2051@ INDI 1 NAME Cwenburh of_Wimborne // 1 TITL Abbess 1 SEX F 1 FAMC @F891@ 0 @I2052@ INDI 1 NAME Cuthburh // 1 SEX F 1 FAMS @F894@ 1 FAMC @F891@ 0 @I2053@ INDI 1 NAME Aldfrid of_Northumbria // 1 TITL King 1 SEX M 1 FAMS @F894@ 0 @I2054@ INDI 1 NAME Ealhmund of_Kent // 1 TITL Under-King 1 SEX M 1 DEAT 2 DATE 786 1 FAMS @F895@ 1 FAMC @F896@ 0 @I2055@ INDI 1 NAME Eaba // 1 SEX M 1 FAMS @F896@ 1 FAMC @F897@ 0 @I2056@ INDI 1 NAME Eoppa // 1 SEX M 1 FAMS @F897@ 1 FAMC @F898@ 0 @I2057@ INDI 1 NAME William of_Hainault // 1 TITL Count 1 SEX M 1 FAMS @F900@ 0 @I2058@ INDI 1 NAME Thomas /Holland/ 1 TITL Earl of Kent 1 SEX M 1 FAMS @F901@ 0 @I2059@ INDI 1 NAME William /de_Burgh/ 1 TITL Earl of Ulster 1 SEX M 1 FAMS @F902@ 0 @I2060@ INDI 1 NAME Galeazzo /Visconti/ 1 TITL Duke of Milan 1 SEX M 1 FAMS @F903@ 0 @I2061@ INDI 1 NAME Otho of_Montferrat // 1 TITL Marquis 1 SEX M 1 FAMS @F904@ 0 @I2062@ INDI 1 NAME Pedro_III of_Castile // 1 TITL King 1 SEX M 1 FAMS @F905@ 1 FAMS @F908@ 0 @I2063@ INDI 1 NAME Payne of_Guienne /Roet/ 1 TITL Sir 1 SEX M 1 FAMS @F906@ 0 @I2064@ INDI 1 NAME Hugh /Swynford/ 1 TITL Sir 1 SEX M 1 FAMS @F907@ 0 @I2065@ INDI 1 NAME Katherine // 1 SEX F 1 FAMS @F909@ 1 FAMC @F517@ 0 @I2066@ INDI 1 NAME Henry_III // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE 1379 1 DEAT 2 DATE 1406 1 FAMS @F909@ 1 FAMC @F910@ 0 @I2067@ INDI 1 NAME John_I (Juan) // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE 1358 1 DEAT 2 DATE 1390 1 FAMS @F910@ 1 FAMC @F911@ 0 @I2068@ INDI 1 NAME Henry_II (Enrique) // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE ABT 1333 1 DEAT 2 DATE 1379 1 FAMS @F911@ 0 @I2069@ INDI 1 NAME Humphrey of_Hereford /De_Bohun/ 1 TITL Earl 1 SEX M 1 FAMS @F912@ 0 @I2070@ INDI 1 NAME Edmund of_Stafford // 1 TITL Earl 1 SEX M 1 FAMS @F913@ 0 @I2071@ INDI 1 NAME Humphrey of_Buckingham // 1 TITL Earl 1 SEX M 1 FAMC @F491@ 0 @I2072@ INDI 1 NAME Joan // 1 SEX F 1 FAMC @F491@ 0 @I2073@ INDI 1 NAME Isabel // 1 SEX F 1 FAMC @F491@ 0 @I2074@ INDI 1 NAME Isabelle of_Bavaria // 1 SEX F 1 BIRT 2 DATE 1371 1 DEAT 2 DATE 1435 1 FAMS @F915@ 0 @I2075@ INDI 1 NAME Charles_VI the_Beloved // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 3 DEC 1368 2 PLAC Paris,France 1 DEAT 2 DATE 22 OCT 1422 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F915@ 1 FAMC @F1182@ 0 @I2076@ INDI 1 NAME Robert /Ferrers/ 1 TITL Sir 1 SEX M 1 FAMS @F916@ 0 @I2077@ INDI 1 NAME Margaret // 1 SEX F 1 FAMS @F917@ 1 FAMC @F918@ 0 @I2078@ INDI 1 NAME Thomas /Neville/ 1 TITL Sir 1 SEX M 1 FAMS @F918@ 0 @I2079@ INDI 1 NAME Margaret /Beaufort/ 1 SEX F 1 FAMS @F919@ 1 FAMC @F486@ 0 @I2080@ INDI 1 NAME Thomas /Courtenay/ 1 TITL Earl of Devon V 1 SEX M 1 FAMS @F919@ 0 @I2081@ INDI 1 NAME Eleanor /Beauchamp/ 1 SEX F 1 FAMS @F920@ 1 FAMC @F921@ 0 @I2082@ INDI 1 NAME Richard /Beauchamp/ 1 TITL Earl of Warwick 1 SEX M 1 FAMS @F921@ 0 @I2083@ INDI 1 NAME Henry /Beaufort/ 1 TITL Duke Sommerset 1 SEX M 1 DEAT 2 DATE 1463 1 FAMC @F920@ 0 @I2084@ INDI 1 NAME Edmund /Beaufort/ 1 TITL Duke Sommerset 1 SEX M 1 DEAT 2 DATE 1471 1 FAMC @F920@ 0 @I2085@ INDI 1 NAME John /Beaufort/ 1 SEX M 1 DEAT 2 DATE 1471 1 FAMC @F920@ 0 @I2086@ INDI 1 NAME Eleanor /Beaufort/ 1 SEX F 1 FAMS @F922@ 1 FAMS @F923@ 1 FAMC @F920@ 0 @I2087@ INDI 1 NAME Joan /Beaufort/ 1 SEX F 1 FAMS @F924@ 1 FAMS @F925@ 1 FAMC @F920@ 0 @I2088@ INDI 1 NAME Anne /Beaufort/ 1 SEX F 1 FAMS @F926@ 1 FAMC @F920@ 0 @I2089@ INDI 1 NAME Margaret /Beaufort/ 1 SEX F 1 FAMS @F927@ 1 FAMS @F928@ 1 FAMC @F920@ 0 @I2090@ INDI 1 NAME Elizabeth /Beaufort/ 1 SEX F 1 FAMS @F929@ 1 FAMC @F920@ 0 @I2091@ INDI 1 NAME James of_Wiltshire /Butler/ 1 TITL Earl 1 SEX M 1 FAMS @F922@ 0 @I2092@ INDI 1 NAME Robert /Spencer/ 1 TITL Sir 1 SEX M 1 FAMS @F923@ 0 @I2093@ INDI 1 NAME Robert /St._Lawrence/ 1 TITL Lord Howth 1 SEX M 1 FAMS @F924@ 0 @I2094@ INDI 1 NAME Richard /Fry/ 1 SEX M 1 FAMS @F925@ 0 @I2095@ INDI 1 NAME William /Paston/ 1 SEX M 1 FAMS @F926@ 0 @I2096@ INDI 1 NAME Humphrey // 1 TITL Earl of Stafford 1 SEX M 1 FAMS @F927@ 0 @I2097@ INDI 1 NAME Richard /Darell/ 1 TITL Sir 1 SEX M 1 FAMS @F928@ 0 @I2098@ INDI 1 NAME Henry Fitz /Lewes/ 1 TITL Sir 1 SEX M 1 FAMS @F929@ 0 @I2099@ INDI 1 NAME Thomas of_Wiltshire /Boleyn/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1536 1 FAMS @F931@ 0 @I2100@ INDI 1 NAME Joanna the_Mad (Juana)// 1 SEX F 1 BIRT 2 DATE 1479 1 DEAT 2 DATE 1555 1 FAMS @F1352@ 1 FAMC @F320@ 0 @I2101@ INDI 1 NAME William /Cavendish/ 1 TITL Sir 1 SEX M 1 FAMS @F930@ 0 @I2102@ INDI 1 NAME Frances /Devereux/ 1 SEX F 1 DEAT 2 DATE 1674 1 FAMS @F932@ 1 FAMC @F933@ 0 @I2103@ INDI 1 NAME Robert /Devereux/ 1 TITL Earl of Essex 1 SEX M 1 FAMS @F933@ 0 @I2104@ INDI 1 NAME Henry of_Cumberland /Clifford/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1569 1 FAMS @F934@ 1 FAMS @F1094@ 0 @I2105@ INDI 1 NAME Adrian /Stokes/ 1 SEX M 1 DEAT 2 DATE ABT 1581 1 FAMS @F935@ 0 @I2106@ INDI 1 NAME Catherine /Grey/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE ABT 1568 1 FAMS @F1091@ 1 FAMS @F936@ 1 FAMC @F527@ 0 @I2107@ INDI 1 NAME Mary /Grey/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1578 1 FAMS @F1092@ 1 FAMC @F527@ 0 @I2108@ INDI 1 NAME Edward /Seymour/ 1 TITL Earl of Hertford 1 SEX M 1 FAMS @F936@ 1 FAMS @F1122@ 1 FAMS @F1123@ 1 FAMC @F1125@ 0 @I2109@ INDI 1 NAME Edward Beauchamp /Seymour/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1612 1 FAMS @F938@ 1 FAMC @F936@ 0 @I2110@ INDI 1 NAME Thomas /Seymour/ 1 SEX M 1 DEAT 2 DATE 1600 1 FAMS @F937@ 1 FAMC @F936@ 0 @I2111@ INDI 1 NAME Isabel /Onley/ 1 SEX F 1 FAMS @F937@ 0 @I2112@ INDI 1 NAME Honora /Rogers/ 1 SEX F 1 FAMS @F938@ 1 FAMC @F939@ 0 @I2113@ INDI 1 NAME Richard /Rogers/ 1 TITL Sir 1 SEX M 1 FAMS @F939@ 0 @I2114@ INDI 1 NAME Frederick Henry // 1 SEX M 1 BIRT 2 DATE 1614 1 DEAT 2 DATE 1629 1 FAMC @F265@ 0 @I2115@ INDI 1 NAME Philip // 1 SEX M 1 DEAT 2 DATE 1650 1 FAMC @F265@ 0 @I2116@ INDI 1 NAME Elizabeth of_Hervorden // 1 TITL Abbess 1 SEX F 1 DEAT 2 DATE 1680 1 FAMC @F265@ 0 @I2117@ INDI 1 NAME Louisa Hollandine of_Maubisson// 1 TITL Abbess 1 SEX F 1 DEAT 2 DATE 1709 1 FAMC @F265@ 0 @I2118@ INDI 1 NAME Henrietta Maria // 1 SEX F 1 DEAT 2 DATE 1651 1 FAMS @F943@ 1 FAMC @F265@ 0 @I2119@ INDI 1 NAME Charlotte // 1 SEX F 1 DEAT 2 DATE 1631 1 FAMC @F265@ 0 @I2120@ INDI 1 NAME William of_Hesse /Landgrave/ 1 SEX M 1 FAMS @F941@ 0 @I2121@ INDI 1 NAME Anne // 1 SEX F 1 FAMS @F942@ 0 @I2122@ INDI 1 NAME Sigismund of_Transylvania /Ragotski/ 1 TITL Prince 1 SEX M 1 FAMS @F943@ 0 @I2123@ INDI 1 NAME Frederick Augustus // 1 SEX M 1 DEAT 2 DATE 1690 1 FAMC @F266@ 0 @I2124@ INDI 1 NAME Maximilian William // 1 SEX M 1 DEAT 2 DATE 1726 1 FAMC @F266@ 0 @I2125@ INDI 1 NAME Charles Philip // 1 SEX M 1 DEAT 2 DATE 1690 1 FAMC @F266@ 0 @I2126@ INDI 1 NAME Christian // 1 SEX M 1 DEAT 2 DATE 1703 1 FAMC @F266@ 0 @I2127@ INDI 1 NAME Edward /Hyde/ 1 TITL Earl of Claredon 1 SEX M 1 FAMS @F944@ 0 @I2128@ INDI 1 NAME Anna Maria // 1 SEX F 1 BIRT 2 DATE 1669 1 DEAT 2 DATE 1728 1 FAMS @F945@ 1 FAMC @F272@ 0 @I2129@ INDI 1 NAME Victor Amadeus_II // 1 TITL Duke of Savoy 1 SEX M 1 BIRT 2 DATE 1666 1 DEAT 2 DATE 1732 1 FAMS @F945@ 0 @I2130@ INDI 1 NAME Charles_II // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1661 1 DEAT 2 DATE 1700 1 FAMS @F946@ 1 FAMC @F947@ 0 @I2131@ INDI 1 NAME Philip_IV // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1605 1 DEAT 2 DATE 1665 1 FAMS @F948@ 1 FAMS @F947@ 1 FAMC @F522@ 0 @I2132@ INDI 1 NAME Philip_III // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1578 2 PLAC Madrid,,,Spain 1 DEAT 2 DATE 1621 1 FAMS @F522@ 1 FAMC @F951@ 0 @I2133@ INDI 1 NAME Maria of_Portugal // 1 SEX F 1 FAMS @F949@ 0 @I2134@ INDI 1 NAME Elizabeth of_France // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1545 1 DEAT 2 DATE 1568 1 FAMS @F950@ 0 @I2135@ INDI 1 NAME Anne of_Austria // 1 SEX F 1 BIRT 2 DATE 1549 1 DEAT 2 DATE 1580 1 FAMS @F951@ 0 @I2136@ INDI 1 NAME Don_Carlos // 1 SEX M 1 FAMC @F949@ 0 @I2137@ INDI 1 NAME James Louis /Sobieski/ 1 TITL Prince 1 SEX M 1 FAMS @F952@ 1 FAMC @F953@ 0 @I2138@ INDI 1 NAME John_III /Sobieski/ 1 TITL King of Poland 1 SEX M 1 BIRT 2 DATE 9 JUN 1624 2 PLAC Olesko,Now:,Ukraine,SSR 1 DEAT 2 DATE 17 JUN 1696 2 PLAC Wilanow,Nr.,Warsaw,Poland 1 FAMS @F953@ 0 @I2139@ INDI 1 NAME Gustavus Adolphus of_Stolberg-Ged.// 1 TITL Prince 1 SEX M 1 FAMS @F954@ 0 @I2140@ INDI 1 NAME George William of_Brunswick// 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1726 1 FAMS @F955@ 0 @I2141@ INDI 1 NAME Celle // 1 SEX F 1 FAMS @F955@ 0 @I2142@ INDI 1 NAME Frederick_II of_Saxe-Gotha // 1 TITL Duke 1 SEX M 1 FAMS @F956@ 0 @I2143@ INDI 1 NAME Magdalena Augusta of_Anhalt-Zerbst// 1 SEX F 1 FAMS @F956@ 0 @I2144@ INDI 1 NAME Edward /Walpole/ 1 TITL Hon. Sir 1 SEX M 1 FAMS @F957@ 0 @I2145@ INDI 1 NAME James Waldegrave_2nd // 1 TITL Earl 1 SEX M 1 FAMS @F958@ 0 @I2146@ INDI 1 NAME Sophia // 1 SEX F 1 DEAT 2 DATE 1844 1 FAMC @F279@ 0 @I2147@ INDI 1 NAME Charles Louis Frederick// 1 TITL Duke 1 SEX M 1 FAMS @F959@ 0 @I2148@ INDI 1 NAME Elizabeth of_Saxe- Hildburghausen/Albertin/ 1 SEX F 1 FAMS @F959@ 0 @I2149@ INDI 1 NAME Alfonso // 1 TITL Infante of Spain 1 SEX M 1 FAMS @F960@ 0 @I2150@ INDI 1 NAME Ernest of_Hohenlohe- Langenburg// 1 TITL Prince 1 SEX M 1 FAMS @F961@ 0 @I2151@ INDI 1 NAME of_Dalhousie XIII// 1 TITL Earl 1 SEX M 1 FAMS @F962@ 0 @I2152@ INDI 1 NAME Katharine Fraser // 1 SEX F 1 BIRT 2 DATE 1957 1 FAMC @F665@ 0 @I2153@ INDI 1 NAME Alice // 1 SEX F 1 BIRT 2 DATE 1961 1 FAMC @F665@ 0 @I2154@ INDI 1 NAME Elizabeth // 1 SEX F 1 BIRT 2 DATE 1963 1 FAMC @F665@ 0 @I2155@ INDI 1 NAME Alistair Arthur of_Connaught_2nd// 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1943 1 FAMC @F36@ 0 @I2156@ INDI 1 NAME Romaine // 1 SEX F 1 FAMS @F963@ 0 @I2157@ INDI 1 NAME Janet /Bryce/ 1 SEX F 1 FAMS @F964@ 0 @I2158@ INDI 1 NAME George of_Milford_Haven // 1 TITL Marquess 1 SEX M 1 FAMC @F963@ 0 @I2159@ INDI 1 NAME Ivar // 1 TITL Lord 1 SEX M 1 FAMC @F963@ 0 @I2160@ INDI 1 NAME of_Mount_Temple // 1 TITL Lord 1 SEX M 1 FAMS @F965@ 0 @I2161@ INDI 1 NAME of_Lodesborough // 1 TITL Earl 1 SEX M 1 FAMS @F966@ 0 @I2162@ INDI 1 NAME J. Keyes-O'Malley /Hamilton/ 1 TITL Capt. 1 SEX M 1 FAMS @F967@ 0 @I2163@ INDI 1 NAME Michael Kelly Bryan// 1 SEX M 1 FAMS @F968@ 0 @I2164@ INDI 1 NAME William Kemp // 1 SEX M 1 FAMS @F969@ 0 @I2165@ INDI 1 NAME Robin Alexander // 1 SEX M 1 FAMC @F968@ 0 @I2166@ INDI 1 NAME Maelgwn Fychan // 1 SEX M 1 DEAT 2 DATE 1257 1 FAMS @F970@ 0 @I2167@ INDI 1 NAME Eleanor // 1 SEX F 1 FAMS @F971@ 1 FAMC @F970@ 0 @I2168@ INDI 1 NAME Maredudd Ap_Owain // 1 SEX M 1 DEAT 2 DATE 1265 1 FAMS @F971@ 0 @I2169@ INDI 1 NAME Owain // 1 SEX M 1 DEAT 2 DATE 1275 1 FAMS @F972@ 1 FAMC @F971@ 0 @I2170@ INDI 1 NAME Llywelyn // 1 SEX M 1 DEAT 2 DATE 1309 1 FAMS @F973@ 1 FAMC @F972@ 0 @I2171@ INDI 1 NAME Thomas // 1 SEX M 1 DEAT 2 DATE ABT 1343 1 FAMS @F974@ 1 FAMC @F973@ 0 @I2172@ INDI 1 NAME Margaret // 1 SEX F 1 FAMS @F975@ 1 FAMC @F974@ 0 @I2173@ INDI 1 NAME Tudor Fychan of_Pemmynydd// 1 SEX M 1 FAMS @F975@ 1 FAMC @F977@ 0 @I2174@ INDI 1 NAME Maredudd (Meredith) /Tudor/ 1 SEX M 1 FAMS @F976@ 1 FAMC @F975@ 0 @I2175@ INDI 1 NAME Goronwy_Ap Tudor // 1 SEX M 1 DEAT 2 DATE 1331 1 FAMS @F977@ 1 FAMC @F978@ 0 @I2176@ INDI 1 NAME Tudor Hen // 1 SEX M 1 DEAT 2 DATE 1311 1 FAMS @F978@ 1 FAMC @F979@ 0 @I2177@ INDI 1 NAME Goronwy // 1 SEX M 1 FAMS @F979@ 1 FAMC @F980@ 0 @I2178@ INDI 1 NAME Ednyfed Fychan // 1 SEX M 1 FAMS @F980@ 0 @I2179@ INDI 1 NAME Gwenllian // 1 SEX F 1 DEAT 2 DATE 1236 1 FAMS @F980@ 1 FAMC @F981@ 0 @I2180@ INDI 1 NAME Rhys_Ap Gruffydd // 1 TITL Lord Rhys 1 SEX M 1 DEAT 2 DATE 1197 1 FAMS @F981@ 1 FAMC @F982@ 0 @I2181@ INDI 1 NAME Gruffydd // 1 SEX M 1 DEAT 2 DATE 1137 1 FAMS @F982@ 1 FAMC @F983@ 0 @I2182@ INDI 1 NAME Rhys_Ap Twedwr // 1 TITL Prince S. Wales 1 SEX M 1 FAMS @F983@ 1 FAMC @F984@ 0 @I2183@ INDI 1 NAME Tewdwr Mawr the_Great// 1 SEX M 1 FAMS @F984@ 1 FAMC @F985@ 0 @I2184@ INDI 1 NAME Cadell // 1 SEX M 1 FAMS @F985@ 1 FAMC @F986@ 0 @I2185@ INDI 1 NAME Einion // 1 SEX M 1 DEAT 2 DATE 984 1 FAMS @F986@ 1 FAMC @F817@ 0 @I2186@ INDI 1 NAME Michael of_Hillsborough /Hill/ 1 SEX M 1 FAMS @F987@ 1 FAMC @F988@ 0 @I2187@ INDI 1 NAME William /Hill/ 1 SEX M 1 FAMS @F988@ 0 @I2188@ INDI 1 NAME Eleanor /Boyle/ 1 SEX F 1 FAMS @F988@ 1 FAMC @F989@ 0 @I2189@ INDI 1 NAME Michael /Boyle/ 1 TITL Dr. 1 SEX M 1 FAMS @F989@ 0 @I2190@ INDI 1 NAME Mary /O'Brien/ 1 SEX F 1 FAMS @F989@ 1 FAMC @F990@ 0 @I2191@ INDI 1 NAME Dermont /O'Brien/ 1 TITL Lord Inchiquin V 1 SEX M 1 DEAT 2 DATE 1624 1 FAMS @F990@ 1 FAMC @F991@ 0 @I2192@ INDI 1 NAME Murrough /O'Brien/ 1 TITL Lord Inchiquin 4 1 SEX M 1 DEAT 2 DATE 1597 1 FAMS @F991@ 1 FAMC @F992@ 0 @I2193@ INDI 1 NAME Murrough /O'Brien/ 1 TITL Lord Inchiquin 3 1 SEX M 1 DEAT 2 DATE 1573 1 FAMS @F992@ 1 FAMC @F993@ 0 @I2194@ INDI 1 NAME Dermod /O'Brien/ 1 TITL Lord Inchiquin 2 1 SEX M 1 DEAT 2 DATE 1557 1 FAMS @F993@ 1 FAMC @F994@ 0 @I2195@ INDI 1 NAME Murrough // 1 TITL King of Thomond 1 SEX M 1 DEAT 2 DATE 1551 1 FAMS @F994@ 1 FAMC @F995@ 0 @I2196@ INDI 1 NAME Turlough Don // 1 TITL King of Thomond 1 SEX M 1 FAMS @F995@ 1 FAMC @F996@ 0 @I2197@ INDI 1 NAME Teige An_Chomard // 1 TITL King of Thomond 1 SEX M 1 FAMS @F996@ 1 FAMC @F997@ 0 @I2198@ INDI 1 NAME Turlough Bog the_Soft// 1 TITL King of Thomond 1 SEX M 1 FAMS @F997@ 1 FAMC @F998@ 0 @I2199@ INDI 1 NAME Brian_Catha An_Eanaigh // 1 TITL King of Thomond 1 SEX M 1 FAMS @F998@ 1 FAMC @F999@ 0 @I2200@ INDI 1 NAME Mahon Moinmoy // 1 TITL King of Thomond 1 SEX M 1 FAMS @F999@ 1 FAMC @F1000@ 0 @I2201@ INDI 1 NAME Mortogh // 1 TITL King of Thomond 1 SEX M 1 FAMS @F1000@ 1 FAMC @F1001@ 0 @I2202@ INDI 1 NAME Turlough // 1 TITL King of Thomond 1 SEX M 1 DEAT 2 DATE 1306 1 FAMS @F1001@ 1 FAMC @F1002@ 0 @I2203@ INDI 1 NAME Teige Caeluisce // 1 TITL King of Thomond 1 SEX M 1 FAMS @F1002@ 1 FAMC @F1003@ 0 @I2204@ INDI 1 NAME Conor Na_Suidane // 1 TITL King of Thomond 1 SEX M 1 FAMS @F1003@ 1 FAMC @F1004@ 0 @I2205@ INDI 1 NAME Donough Cairbreach // 1 TITL King of Thomond 1 SEX M 1 FAMS @F1004@ 1 FAMC @F1005@ 0 @I2206@ INDI 1 NAME Donnell More // 1 TITL King of Thomond 1 SEX M 1 DEAT 2 DATE 1194 1 FAMS @F1005@ 1 FAMC @F1006@ 0 @I2207@ INDI 1 NAME Urlachan // 1 SEX F 1 FAMS @F1005@ 1 FAMC @F1014@ 0 @I2208@ INDI 1 NAME Turlough // 1 TITL King of Thomond 1 SEX M 1 FAMS @F1006@ 1 FAMC @F1007@ 0 @I2209@ INDI 1 NAME Dermot // 1 TITL King of Munster 1 SEX M 1 FAMS @F1007@ 1 FAMC @F1008@ 0 @I2210@ INDI 1 NAME Turough // 1 TITL King of Munster 1 SEX M 1 FAMS @F1008@ 1 FAMC @F1009@ 0 @I2211@ INDI 1 NAME Teige (Terence) // 1 SEX M 1 DEAT 2 DATE 1023 1 FAMS @F1009@ 1 FAMC @F1010@ 0 @I2212@ INDI 1 NAME Brian Boru // 1 TITL King of Ireland 1 SEX M 1 FAMS @F1010@ 0 @I2213@ INDI 1 NAME Dearbforgail // 1 SEX F 1 DEAT 2 DATE 1080 1 FAMS @F1011@ 1 FAMC @F1010@ 0 @I2214@ INDI 1 NAME Dermot /MacMailnamo/ 1 TITL King of Ireland 1 SEX M 1 DEAT 2 DATE 1072 1 FAMS @F1011@ 0 @I2215@ INDI 1 NAME Murchad // 1 TITL King of Leinster 1 SEX M 1 DEAT 2 DATE 1090 1 FAMS @F1017@ 1 FAMC @F1011@ 0 @I2216@ INDI 1 NAME Eva // 1 SEX F 1 FAMS @F807@ 1 FAMC @F1012@ 0 @I2217@ INDI 1 NAME William /Marshal/ 1 TITL Earl of Pembroke 1 SEX M 1 FAMS @F1012@ 0 @I2218@ INDI 1 NAME Isabel // 1 SEX F 1 FAMS @F1012@ 1 FAMC @F1013@ 0 @I2219@ INDI 1 NAME Richard (Strongbow) // 1 TITL Earl of Pembroke 1 SEX M 1 FAMS @F1013@ 0 @I2220@ INDI 1 NAME Aoife (Eva) // 1 SEX F 1 FAMS @F1013@ 1 FAMC @F1014@ 0 @I2221@ INDI 1 NAME Dermot /MacMurrough/ 1 TITL King of Leinster 1 SEX M 1 DEAT 2 DATE 1171 1 FAMS @F1014@ 1 FAMC @F1015@ 0 @I2222@ INDI 1 NAME Enna // 1 TITL King of Leinster 1 SEX M 1 DEAT 2 DATE 1126 1 FAMS @F1015@ 1 FAMC @F1016@ 0 @I2223@ INDI 1 NAME Donchad // 1 TITL King of Leinster 1 SEX M 1 DEAT 2 DATE 1126 1 FAMS @F1016@ 1 FAMC @F1017@ 0 @I2224@ INDI 1 NAME Sybil // 1 SEX F 1 FAMS @F1018@ 1 FAMC @F506@ 0 @I2225@ INDI 1 NAME Ingibiorg // 1 SEX F 1 FAMS @F1020@ 1 FAMC @F1021@ 0 @I2226@ INDI 1 NAME Finn /Arnasson/ 1 SEX M 1 FAMS @F1021@ 0 @I2227@ INDI 1 NAME Matilda // 1 SEX F 1 DEAT 2 DATE 1131 1 FAMS @F1022@ 0 @I2228@ INDI 1 NAME Henry of_Huntingdon // 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1152 1 FAMS @F1023@ 1 FAMC @F1022@ 0 @I2229@ INDI 1 NAME Ada // 1 SEX F 1 FAMS @F1023@ 0 @I2230@ INDI 1 NAME Malcolm_IV the_Maiden // 1 TITL King of Scotland 1 SEX M 1 FAMC @F1023@ 0 @I2231@ INDI 1 NAME Willaim_I the_Lion // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1024@ 1 FAMC @F1023@ 0 @I2232@ INDI 1 NAME Ermengarde // 1 SEX F 1 DEAT 2 DATE 1234 1 FAMS @F1024@ 0 @I2233@ INDI 1 NAME Mary of_Coucy // 1 SEX F 1 FAMS @F1025@ 0 @I2234@ INDI 1 NAME Margaret // 1 SEX F 1 DEAT 2 DATE 1283 1 FAMS @F1026@ 1 FAMC @F603@ 0 @I2235@ INDI 1 NAME Eric /Magnusson/ 1 TITL King of Norway 1 SEX M 1 FAMS @F1026@ 0 @I2236@ INDI 1 NAME Margaret Maid_of_Norway // 1 SEX F 1 BIRT 2 DATE ABT 1282 1 DEAT 2 DATE 1290 1 FAMC @F1026@ 0 @I2237@ INDI 1 NAME Duncan_II May-Nov // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1027@ 1 FAMC @F1020@ 0 @I2238@ INDI 1 NAME Ethelreda // 1 SEX F 1 FAMS @F1027@ 0 @I2239@ INDI 1 NAME Duncan_I // 1 SEX M 1 FAMS @F1028@ 1 FAMC @F1029@ 0 @I2240@ INDI 1 NAME Sybil // 1 SEX F 1 FAMS @F1028@ 0 @I2241@ INDI 1 NAME Donald_III Bane // 1 TITL King of Scotland 1 SEX M 1 FAMC @F1028@ 0 @I2242@ INDI 1 NAME Crinan // 1 SEX M 1 FAMS @F1029@ 0 @I2243@ INDI 1 NAME Bethoc // 1 SEX F 1 FAMS @F1029@ 1 FAMC @F1032@ 0 @I2244@ INDI 1 NAME Gillacomgan // 1 SEX M 1 FAMS @F1030@ 0 @I2245@ INDI 1 NAME Gruoch // 1 SEX F 1 FAMS @F1030@ 1 FAMS @F1031@ 1 FAMC @F1038@ 0 @I2246@ INDI 1 NAME Lulach // 1 TITL King of Scotland 1 SEX M 1 FAMC @F1030@ 0 @I2247@ INDI 1 NAME Macbeth // 1 TITL King of Scotland 1 SEX M 1 DEAT 2 DATE 1057 1 FAMS @F1031@ 0 @I2248@ INDI 1 NAME Malcolm_II // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1032@ 1 FAMC @F1033@ 0 @I2249@ INDI 1 NAME Kenneth_II // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1033@ 1 FAMC @F1034@ 0 @I2250@ INDI 1 NAME Malcolm_I // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1034@ 1 FAMC @F1035@ 0 @I2251@ INDI 1 NAME Donald_II // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1035@ 1 FAMC @F1036@ 0 @I2252@ INDI 1 NAME Constantine_II // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1036@ 1 FAMC @F1044@ 0 @I2253@ INDI 1 NAME Duff // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1037@ 1 FAMC @F1034@ 0 @I2254@ INDI 1 NAME Kenneth_III // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1039@ 1 FAMC @F1037@ 0 @I2255@ INDI 1 NAME Beoedhe // 1 SEX M 1 FAMS @F1038@ 1 FAMC @F1039@ 0 @I2256@ INDI 1 NAME Constantine_IV // 1 TITL King of Scotland 1 SEX M 1 FAMC @F1040@ 0 @I2257@ INDI 1 NAME Colin // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1040@ 1 FAMC @F1041@ 0 @I2258@ INDI 1 NAME Indulf // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1041@ 1 FAMC @F1042@ 0 @I2259@ INDI 1 NAME Constantine_III // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1042@ 1 FAMC @F1043@ 0 @I2260@ INDI 1 NAME Aedh // 1 TITL King of Scotland 1 SEX M 1 FAMS @F1043@ 1 FAMC @F1044@ 0 @I2261@ INDI 1 NAME Kenneth_I /MacAlpin/ 1 TITL King of Scotland 1 SEX M 1 FAMS @F1044@ 1 FAMC @F1046@ 0 @I2262@ INDI 1 NAME Unknown_Dau. // 1 SEX F 1 FAMS @F1045@ 1 FAMC @F1044@ 0 @I2263@ INDI 1 NAME Run of_Strathclyde // 1 TITL King 1 SEX M 1 FAMS @F1045@ 0 @I2264@ INDI 1 NAME Eocha // 1 TITL King of Scotland 1 SEX M 1 FAMC @F1045@ 0 @I2265@ INDI 1 NAME Alpin // 1 TITL King of Scotland 1 SEX M 1 DEAT 2 DATE 834 1 FAMS @F1046@ 0 @I2266@ INDI 1 NAME Donald_I // 1 TITL King of Scotland 1 SEX M 1 FAMC @F1046@ 0 @I2267@ INDI 1 NAME Charles_II // 1 TITL King of Navarre 1 SEX M 1 FAMS @F1047@ 0 @I2268@ INDI 1 NAME Reynald /Cobham/ 1 TITL Sir 1 SEX M 1 FAMS @F1048@ 0 @I2269@ INDI 1 NAME of_Burgandy // 1 TITL Duke 1 SEX M 1 FAMS @F1049@ 0 @I2270@ INDI 1 NAME Peter of_Luxemburg // 1 TITL Count St. Pol 1 SEX M 1 FAMS @F1050@ 0 @I2271@ INDI 1 NAME Richard /Woodville/ 1 TITL Earl Rivers 1 SEX M 1 FAMS @F1051@ 0 @I2272@ INDI 1 NAME Rene // 1 TITL Count of Anjou 1 SEX M 1 FAMS @F1052@ 0 @I2273@ INDI 1 NAME Thomas of_Heton /Grey/ 1 TITL Sir 1 SEX M 1 FAMS @F1053@ 0 @I2274@ INDI 1 NAME Joachim Frederick of_Brandenburg// 1 TITL Elector 1 SEX M 1 FAMS @F1054@ 0 @I2275@ INDI 1 NAME Richard /Pole/ 1 TITL Sir 1 SEX M 1 FAMS @F1055@ 0 @I2276@ INDI 1 NAME John /De_La_Pole/ 1 TITL Duke of Suffolk 1 SEX M 1 FAMS @F1056@ 0 @I2277@ INDI 1 NAME Thomas /Holland/ 1 TITL Earl of Kent 1 SEX M 1 FAMS @F1057@ 0 @I2278@ INDI 1 NAME Edward // 1 TITL Lord Cherleton 1 SEX M 1 FAMS @F1058@ 0 @I2279@ INDI 1 NAME Edmund // 1 TITL Earl of Stafford 1 SEX M 1 FAMS @F1059@ 0 @I2280@ INDI 1 NAME Roger /Mortimer/ 1 SEX M 1 DEAT 2 DATE 1409 1 FAMC @F492@ 0 @I2281@ INDI 1 NAME Eleanor /Mortimer/ 1 SEX F 1 FAMS @F1060@ 1 FAMC @F492@ 0 @I2282@ INDI 1 NAME Edward /Courtenay/ 1 TITL Sir 1 SEX M 1 FAMS @F1060@ 0 @I2283@ INDI 1 NAME Edmund /Mortimer/ 1 SEX M 1 DEAT 2 DATE 1409 1 FAMC @F494@ 0 @I2284@ INDI 1 NAME Elizabeth /Mortimer/ 1 SEX F 1 FAMS @F1061@ 1 FAMS @F1062@ 1 FAMC @F494@ 0 @I2285@ INDI 1 NAME Philippa /Mortimer/ 1 SEX F 1 DEAT 2 DATE 1401 1 FAMS @F1063@ 1 FAMS @F1064@ 1 FAMS @F1065@ 1 FAMC @F494@ 0 @I2286@ INDI 1 NAME Henry (Hotspur) /Percy/ 1 SEX M 1 FAMS @F1061@ 0 @I2287@ INDI 1 NAME Thomas // 1 TITL Lord Camoys 1 SEX M 1 FAMS @F1062@ 0 @I2288@ INDI 1 NAME John /Hastings/ 1 TITL Earl of Pembroke 1 SEX M 1 FAMS @F1063@ 0 @I2289@ INDI 1 NAME Richard /Fitzalan/ 1 TITL Earl of Arundel 1 SEX M 1 FAMS @F1064@ 0 @I2290@ INDI 1 NAME Thomas of_Basing /Poynings/ 1 TITL Lord St. John 1 SEX M 1 FAMS @F1065@ 0 @I2291@ INDI 1 NAME Charles_IV // 1 TITL Emperor 1 SEX M 1 BIRT 2 DATE 1316 1 DEAT 2 DATE 1378 1 FAMS @F1066@ 0 @I2292@ INDI 1 NAME John /Holland/ 1 TITL Duke of Exeter 1 SEX M 1 FAMS @F1067@ 0 @I2293@ INDI 1 NAME John /Cornwall/ 1 TITL Lord Fanhope 1 SEX M 1 FAMS @F1068@ 0 @I2294@ INDI 1 NAME Constance // 1 SEX F 1 FAMS @F1069@ 1 FAMC @F488@ 0 @I2295@ INDI 1 NAME Thomas of_Gloucester /Despencer/ 1 TITL Earl 1 SEX M 1 FAMS @F1069@ 0 @I2296@ INDI 1 NAME Philippa // 1 SEX F 1 FAMS @F1070@ 1 FAMS @F1071@ 1 FAMS @F1072@ 0 @I2297@ INDI 1 NAME /Fitzwater/ 1 TITL Lord 1 SEX M 1 FAMS @F1070@ 0 @I2298@ INDI 1 NAME John /Golafre/ 1 TITL Sir 1 SEX M 1 FAMS @F1071@ 0 @I2299@ INDI 1 NAME Thomas /Clifford/ 1 TITL Lord 1 SEX M 1 FAMS @F1073@ 0 @I2300@ INDI 1 NAME John // 1 TITL Lord Latymer 1 SEX M 1 FAMS @F1074@ 0 @I2301@ INDI 1 NAME Hugh /Seymour/ 1 TITL Admiral 1 SEX M 1 BIRT 2 DATE 1759 1 DEAT 2 DATE 1801 1 FAMS @F1019@ 1 FAMC @F1075@ 0 @I2302@ INDI 1 NAME Anne Horatia /Waldegrave/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1801 1 FAMS @F1019@ 0 @I2303@ INDI 1 NAME Francis of_Hertford I/Seymour/ 1 TITL Marquess 1 SEX M 1 BIRT 2 DATE 1718 1 DEAT 2 DATE 1794 1 FAMS @F1075@ 0 @I2304@ INDI 1 NAME Isabella // 1 SEX F 1 BIRT 2 DATE 1726 1 DEAT 2 DATE 1782 1 FAMS @F1075@ 1 FAMC @F1076@ 0 @I2305@ INDI 1 NAME Charles /Fitzroy/ 1 TITL Duke of Grafton 1 SEX M 1 BIRT 2 DATE 1683 1 DEAT 2 DATE 1757 1 FAMS @F1076@ 1 FAMC @F1077@ 0 @I2306@ INDI 1 NAME Henrietta /Somerset/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1726 1 FAMS @F1076@ 0 @I2307@ INDI 1 NAME Henry /Fitzroy/ 1 TITL Duke of Grafton 1 SEX M 1 BIRT 2 DATE 1663 1 DEAT 2 DATE 1690 1 FAMS @F1077@ 0 @I2308@ INDI 1 NAME Isabella /Bennett/ 1 TITL Lady 1 SEX F 1 DEAT 2 DATE 1723 1 FAMS @F1077@ 0 @I2309@ INDI 1 NAME William of_Northampton /Parr/ 1 TITL Marquess 1 SEX M 1 FAMC @F332@ 0 @I2310@ INDI 1 NAME John Northumberland /Dudley/ 1 TITL Duke 1 SEX M 1 DEAT 2 DATE 1553 1 FAMS @F1078@ 0 @I2311@ INDI 1 NAME Jane /Guildford/ 1 SEX F 1 FAMS @F1078@ 0 @I2312@ INDI 1 NAME John /Dudley/ 1 TITL Earl of Warwick 1 SEX M 1 DEAT 2 DATE 1554 1 FAMS @F1079@ 1 FAMC @F1078@ 0 @I2313@ INDI 1 NAME Ambrose /Dudley/ 1 TITL Earl of Warwick 1 SEX M 1 DEAT 2 DATE 1590 1 FAMS @F1081@ 1 FAMS @F1082@ 1 FAMS @F1083@ 1 FAMC @F1078@ 0 @I2314@ INDI 1 NAME Henry /Dudley/ 1 SEX M 1 FAMS @F1084@ 1 FAMC @F1078@ 0 @I2315@ INDI 1 NAME Robert of_Leicester /Dudley/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1588 1 FAMS @F1089@ 1 FAMS @F1090@ 1 FAMC @F1078@ 0 @I2316@ INDI 1 NAME Jane /Dudley/ 1 SEX F 1 FAMS @F1086@ 1 FAMC @F1078@ 0 @I2317@ INDI 1 NAME Mary /Dudley/ 1 SEX F 1 DEAT 2 DATE 1586 1 FAMS @F1087@ 1 FAMC @F1078@ 0 @I2318@ INDI 1 NAME Catherine /Dudley/ 1 SEX F 1 FAMS @F1088@ 1 FAMC @F1078@ 0 @I2319@ INDI 1 NAME Anne /Seymour/ 1 SEX F 1 DEAT 2 DATE 1588 1 FAMS @F1079@ 1 FAMS @F1080@ 1 FAMC @F1125@ 0 @I2320@ INDI 1 NAME Edward /Unton/ 1 SEX M 1 FAMS @F1080@ 0 @I2321@ INDI 1 NAME Anne /Whorwood/ 1 SEX F 1 DEAT 2 DATE 1552 1 FAMS @F1081@ 0 @I2322@ INDI 1 NAME Elizabeth /Talboys/ 1 SEX F 1 FAMS @F1082@ 0 @I2323@ INDI 1 NAME Anne /Russell/ 1 SEX F 1 DEAT 2 DATE 1603 1 FAMS @F1083@ 0 @I2324@ INDI 1 NAME John /Dudley/ 1 SEX M 1 FAMC @F1081@ 0 @I2325@ INDI 1 NAME Margaret /Audley/ 1 SEX F 1 DEAT 2 DATE 1563 1 FAMS @F1084@ 1 FAMS @F1085@ 0 @I2326@ INDI 1 NAME Thomas /Howard/ 1 TITL Duke of Norfolk 1 SEX M 1 DEAT 2 DATE 1572 1 FAMS @F1085@ 0 @I2327@ INDI 1 NAME Henry /Seymour/ 1 SEX M 1 FAMS @F1086@ 1 FAMC @F1125@ 0 @I2328@ INDI 1 NAME Henry /Sidney/ 1 SEX M 1 DEAT 2 DATE 1586 1 FAMS @F1087@ 0 @I2329@ INDI 1 NAME Henry of_Huntington /Hastings/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1595 1 FAMS @F1088@ 0 @I2330@ INDI 1 NAME Amy /Robsart/ 1 SEX F 1 DEAT 2 DATE 1560 1 FAMS @F1089@ 0 @I2331@ INDI 1 NAME Lettice /Knollys/ 1 SEX F 1 DEAT 2 DATE 1634 1 FAMS @F1134@ 1 FAMS @F1090@ 1 FAMS @F1135@ 1 FAMC @F1132@ 0 @I2332@ INDI 1 NAME Henry /Herbert/ 1 SEX M 1 FAMS @F1091@ 0 @I2333@ INDI 1 NAME Thomas /Keyes/ 1 SEX M 1 DEAT 2 DATE 1571 1 FAMS @F1092@ 0 @I2334@ INDI 1 NAME Margaret /Clifford/ 1 SEX F 1 DEAT 2 DATE 1596 1 FAMS @F1093@ 1 FAMC @F934@ 0 @I2335@ INDI 1 NAME Henry /Stanley/ 1 TITL Earl of Derby 1 SEX M 1 DEAT 2 DATE 1593 1 FAMS @F1093@ 0 @I2336@ INDI 1 NAME Anne /Dacre/ 1 SEX F 1 DEAT 2 DATE 1581 1 FAMS @F1094@ 0 @I2337@ INDI 1 NAME Elizabeth /Howard/ 1 SEX F 1 DEAT 2 DATE 1512 1 FAMS @F931@ 1 FAMC @F1096@ 0 @I2338@ INDI 1 NAME George Rochford /Boleyn/ 1 TITL Viscount 1 SEX M 1 DEAT 2 DATE 1536 1 FAMC @F931@ 0 @I2339@ INDI 1 NAME Mary /Boleyn/ 1 SEX F 1 DEAT 2 DATE 1544 1 FAMS @F1095@ 1 FAMC @F931@ 0 @I2340@ INDI 1 NAME William /Carey/ 1 SEX M 1 DEAT 2 DATE 1528 1 FAMS @F1095@ 0 @I2341@ INDI 1 NAME Thomas /Howard/ 1 TITL Duke of Norfolk 1 SEX M 1 DEAT 2 DATE 1524 1 FAMS @F1096@ 1 FAMS @F1100@ 0 @I2342@ INDI 1 NAME Elizabeth /Tilney/ 1 SEX F 1 DEAT 2 DATE 1497 1 FAMS @F1096@ 0 @I2343@ INDI 1 NAME Thomas /Howard/ 1 TITL Duke of Norfolk 1 SEX M 1 FAMS @F1097@ 1 FAMS @F1098@ 1 FAMC @F1096@ 0 @I2344@ INDI 1 NAME Anne of_York // 1 SEX F 1 DEAT 2 DATE 1511 1 FAMS @F1097@ 0 @I2345@ INDI 1 NAME Elizabeth /Stafford/ 1 SEX F 1 DEAT 2 DATE 1558 1 FAMS @F1098@ 0 @I2346@ INDI 1 NAME Dorothy /Troyes/ 1 SEX F 1 FAMS @F1099@ 0 @I2347@ INDI 1 NAME Agnes /Tilney/ 1 SEX F 1 DEAT 2 DATE 1545 1 FAMS @F1100@ 0 @I2348@ INDI 1 NAME William of_Effingham /Howard/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1572 1 FAMS @F1101@ 1 FAMS @F1102@ 1 FAMC @F1100@ 0 @I2349@ INDI 1 NAME Dorothy /Howard/ 1 SEX F 1 FAMS @F1103@ 1 FAMC @F1100@ 0 @I2350@ INDI 1 NAME Elizabeth /Howard/ 1 SEX F 1 DEAT 2 DATE 1534 1 FAMS @F1104@ 1 FAMC @F1100@ 0 @I2351@ INDI 1 NAME Catherine /Broughton/ 1 SEX F 1 DEAT 2 DATE 1531 1 FAMS @F1101@ 0 @I2352@ INDI 1 NAME Margaret /Gamage/ 1 SEX F 1 DEAT 2 DATE 1535 1 FAMS @F1102@ 0 @I2353@ INDI 1 NAME Edward /Stanley/ 1 TITL Earl of Derby 1 SEX M 1 DEAT 2 DATE 1572 1 FAMS @F1103@ 0 @I2354@ INDI 1 NAME Henry /Radcliffe/ 1 TITL Earl of Sussex 1 SEX M 1 DEAT 2 DATE 1556/1557 1 FAMS @F1104@ 0 @I2355@ INDI 1 NAME Henry /Howard/ 1 TITL Earl of Surrey 1 SEX M 1 DEAT 2 DATE 1546 1 FAMS @F1105@ 1 FAMC @F1098@ 0 @I2356@ INDI 1 NAME Mary /Howard/ 1 SEX F 1 FAMS @F1106@ 1 FAMC @F1098@ 0 @I2357@ INDI 1 NAME Thomas /Howard/ 1 TITL Viscount Bindon 1 SEX M 1 DEAT 2 DATE 1582 1 FAMS @F1107@ 1 FAMC @F1098@ 0 @I2358@ INDI 1 NAME Frances de_Vere // 1 SEX F 1 DEAT 2 DATE 1577 1 FAMS @F1105@ 0 @I2359@ INDI 1 NAME Thomas /Howard/ 1 TITL Duke of Norfolk 1 SEX M 1 DEAT 2 DATE 1572 1 FAMS @F1108@ 1 FAMS @F1111@ 1 FAMC @F1105@ 0 @I2360@ INDI 1 NAME Henry of_Northhampton /Howard/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1614 1 FAMC @F1105@ 0 @I2361@ INDI 1 NAME Catherine /Howard/ 1 SEX F 1 DEAT 2 DATE 1596 1 FAMC @F1105@ 0 @I2362@ INDI 1 NAME Jane /Howard/ 1 SEX F 1 DEAT 2 DATE 1593 1 FAMC @F1105@ 0 @I2363@ INDI 1 NAME Margaret /Howard/ 1 SEX F 1 DEAT 2 DATE 1592 1 FAMC @F1105@ 0 @I2364@ INDI 1 NAME Henry /Fitzroy/ 1 TITL Duke of Richmond 1 SEX M 1 DEAT 2 DATE 1533 1 FAMS @F1106@ 0 @I2365@ INDI 1 NAME Gertrude /Lyte/ 1 SEX F 1 FAMS @F1107@ 0 @I2366@ INDI 1 NAME Mary /Fitzalan/ 1 SEX F 1 DEAT 2 DATE 1557 1 FAMS @F1108@ 0 @I2367@ INDI 1 NAME Philip /Howard/ 1 TITL Earl of Arundel 1 SEX M 1 DEAT 2 DATE 1595 1 FAMS @F1109@ 1 FAMC @F1108@ 0 @I2368@ INDI 1 NAME Anne /Dacre/ 1 SEX F 1 FAMS @F1109@ 0 @I2369@ INDI 1 NAME Thomas /Howard/ 1 TITL Earl of Arundel 1 SEX M 1 DEAT 2 DATE 1646 1 FAMS @F1110@ 1 FAMC @F1109@ 0 @I2370@ INDI 1 NAME Aletheia /Talbot/ 1 SEX F 1 DEAT 2 DATE 1654 1 FAMS @F1110@ 0 @I2371@ INDI 1 NAME Margaret /Audley/ 1 SEX F 1 DEAT 2 DATE 1563 1 FAMS @F1111@ 0 @I2372@ INDI 1 NAME Thomas /Howard/ 1 TITL Earl of Suffolk 1 SEX M 1 DEAT 2 DATE 1626 1 FAMS @F1112@ 1 FAMS @F1113@ 1 FAMC @F1111@ 0 @I2373@ INDI 1 NAME Mary /Dacre/ 1 SEX F 1 DEAT 2 DATE 1576 1 FAMS @F1112@ 0 @I2374@ INDI 1 NAME Catherine /Knyvett/ 1 SEX F 1 DEAT 2 DATE 1633 1 FAMS @F1113@ 0 @I2375@ INDI 1 NAME Theophilus /Howard/ 1 TITL Earl of Suffolk 1 SEX M 1 DEAT 2 DATE 1640 1 FAMS @F1114@ 1 FAMC @F1113@ 0 @I2376@ INDI 1 NAME Thomas of_Berkshire /Howard/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1669 1 FAMS @F1115@ 1 FAMC @F1113@ 0 @I2377@ INDI 1 NAME Henry /Howard/ 1 SEX M 1 FAMS @F1116@ 1 FAMC @F1113@ 0 @I2378@ INDI 1 NAME Catherine /Howard/ 1 SEX F 1 DEAT 2 DATE 1672 1 FAMS @F1118@ 1 FAMC @F1113@ 0 @I2379@ INDI 1 NAME Frances /Howard/ 1 SEX F 1 FAMS @F1119@ 1 FAMS @F1120@ 1 FAMC @F1113@ 0 @I2380@ INDI 1 NAME Elizabeth /Dunbar/ 1 SEX F 1 FAMS @F1114@ 0 @I2381@ INDI 1 NAME Elizabeth /Cecil/ 1 SEX F 1 FAMS @F1115@ 0 @I2382@ INDI 1 NAME Elizabeth /Bassett/ 1 SEX F 1 DEAT 2 DATE 1643 1 FAMS @F1116@ 1 FAMS @F1117@ 0 @I2383@ INDI 1 NAME William of_Newcastle /Cavendish/ 1 TITL Earl 1 SEX M 1 FAMS @F1117@ 0 @I2384@ INDI 1 NAME William of_Berkshire /Cecil/ 1 TITL Earl 1 SEX M 1 DEAT 2 DATE 1668 1 FAMS @F1118@ 0 @I2385@ INDI 1 NAME Robert /Devereux/ 1 TITL Earl of Essex 1 SEX M 1 DEAT 2 DATE 1646 1 FAMS @F1119@ 0 @I2386@ INDI 1 NAME Robert /Carr/ 1 TITL Earl of Somerset 1 SEX M 1 DEAT 2 DATE 1645 1 FAMS @F1120@ 0 @I2387@ INDI 1 NAME William /Howard/ 1 SEX M 1 DEAT 2 DATE 1640 1 FAMS @F1121@ 1 FAMC @F1111@ 0 @I2388@ INDI 1 NAME Elizabeth /Dacre/ 1 SEX F 1 FAMS @F1121@ 0 @I2389@ INDI 1 NAME Frances /Howard/ 1 SEX F 1 DEAT 2 DATE 1598 1 FAMS @F1122@ 0 @I2390@ INDI 1 NAME Frances /Howard/ 1 SEX F 1 DEAT 2 DATE 1639 1 FAMS @F1123@ 1 FAMS @F1124@ 0 @I2391@ INDI 1 NAME Ludovic of_Richmond /Stuart/ 1 TITL Duke of Lennox 1 SEX M 1 FAMS @F1124@ 0 @I2392@ INDI 1 NAME Edward /Seymour/ 1 TITL Duke of Somerset 1 SEX M 1 DEAT 2 DATE 1552 1 FAMS @F1126@ 1 FAMS @F1125@ 0 @I2393@ INDI 1 NAME Anne /Stanhope/ 1 SEX F 1 DEAT 2 DATE 1587 1 FAMS @F1125@ 0 @I2394@ INDI 1 NAME Henry /Carey/ 1 TITL Baron Hunsdon 1 SEX M 1 DEAT 2 DATE 1596 1 FAMS @F1131@ 1 FAMC @F1095@ 0 @I2395@ INDI 1 NAME Catherine /Fillol/ 1 SEX F 1 FAMS @F1126@ 0 @I2396@ INDI 1 NAME Edward Beauchamp /Seymour/ 1 TITL Lord 1 SEX M 1 DEAT 2 DATE 1618 1 FAMS @F1127@ 1 FAMC @F938@ 0 @I2397@ INDI 1 NAME Francis /Seymour/ 1 TITL Baron Seymour 1 SEX M 1 DEAT 2 DATE 1664 1 FAMS @F1129@ 1 FAMS @F1130@ 1 FAMC @F938@ 0 @I2398@ INDI 1 NAME Honora /Seymour/ 1 SEX F 1 DEAT 2 DATE 1620 1 FAMC @F938@ 0 @I2399@ INDI 1 NAME Anne /Sackville/ 1 SEX F 1 FAMS @F1127@ 1 FAMS @F1128@ 0 @I2400@ INDI 1 NAME Edward /Lewes/ 1 SEX M 1 FAMS @F1128@ 0 @I2401@ INDI 1 NAME Frances /Prynne/ 1 SEX F 1 FAMS @F1129@ 0 @I2402@ INDI 1 NAME Catherine /Lee/ 1 SEX F 1 DEAT 2 DATE 1700 1 FAMS @F1130@ 0 @I2403@ INDI 1 NAME Catherine /Carey/ 1 SEX F 1 DEAT 2 DATE 1568 1 FAMS @F1132@ 1 FAMC @F1095@ 0 @I2404@ INDI 1 NAME Anne /Morgan/ 1 SEX F 1 FAMS @F1131@ 0 @I2405@ INDI 1 NAME Francis /Knollys/ 1 SEX M 1 DEAT 2 DATE 1596 1 FAMS @F1132@ 0 @I2406@ INDI 1 NAME Henry /Knollys/ 1 SEX M 1 DEAT 2 DATE 1583 1 FAMS @F1133@ 1 FAMC @F1132@ 0 @I2407@ INDI 1 NAME William /Knollys/ 1 TITL Earl of Banbury 1 SEX M 1 DEAT 2 DATE 1632 1 FAMC @F1132@ 0 @I2408@ INDI 1 NAME Anne /Knollys/ 1 SEX F 1 FAMS @F1136@ 1 FAMC @F1132@ 0 @I2409@ INDI 1 NAME Catherine /Knollys/ 1 SEX F 1 FAMS @F1137@ 1 FAMC @F1132@ 0 @I2410@ INDI 1 NAME Margaret /Cave/ 1 SEX F 1 DEAT 2 DATE 1606 1 FAMS @F1133@ 0 @I2411@ INDI 1 NAME Walter /Devereux/ 1 TITL Earl of Essex 1 SEX M 1 DEAT 2 DATE 1576 1 FAMS @F1134@ 0 @I2412@ INDI 1 NAME Christopher /Blount/ 1 SEX M 1 DEAT 2 DATE 1601 1 FAMS @F1135@ 0 @I2413@ INDI 1 NAME Thomas /Leighton/ 1 TITL Lord De La Warr 1 SEX M 1 FAMS @F1136@ 0 @I2414@ INDI 1 NAME Gerald /Fitzgerald/ 1 TITL Lord Offaley 1 SEX M 1 DEAT 2 DATE 1580 1 FAMS @F1137@ 0 @I2415@ INDI 1 NAME Charles // 1 SEX M 1 DEAT 2 DATE 1685 1 FAMC @F940@ 0 @I2416@ INDI 1 NAME Mariana of_Austria // 1 SEX F 1 FAMS @F947@ 1 FAMC @F1138@ 0 @I2417@ INDI 1 NAME Maria // 1 SEX F 1 FAMS @F1138@ 1 FAMC @F522@ 0 @I2418@ INDI 1 NAME Ferdinand_III // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 1608 2 PLAC Graz,Austria 1 DEAT 2 DATE 1657 1 FAMS @F1138@ 1 FAMC @F1139@ 0 @I2419@ INDI 1 NAME Ferdinand_II // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 1578 2 PLAC Graz,Austria 1 DEAT 2 DATE 1637 1 FAMS @F1139@ 0 @I2420@ INDI 1 NAME Leopold_I // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 1640 2 PLAC Vienna,Austria 1 DEAT 2 DATE 5 MAY 1705 1 FAMS @F1140@ 1 FAMS @F1141@ 1 FAMC @F1138@ 0 @I2421@ INDI 1 NAME Margaret Teresa // 1 SEX F 1 BIRT 2 DATE 1651 1 DEAT 2 DATE 1673 1 FAMS @F1140@ 1 FAMC @F947@ 0 @I2422@ INDI 1 NAME Eleanor of_Neuburg // 1 SEX F 1 FAMS @F1141@ 0 @I2423@ INDI 1 NAME Louis de_France // 1 TITL Dauphin 1 SEX M 1 BIRT 2 DATE 1661 1 DEAT 2 DATE 1711 1 FAMS @F1143@ 1 FAMC @F523@ 0 @I2424@ INDI 1 NAME Philip_V // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1683 2 PLAC Versailles,France 1 DEAT 2 DATE 1746 1 FAMS @F1350@ 1 FAMS @F1142@ 1 FAMC @F1143@ 0 @I2425@ INDI 1 NAME Isabella Elizabeth /Farnese/ 1 SEX F 1 BIRT 2 DATE 1692 1 DEAT 2 DATE 1766 1 FAMS @F1142@ 0 @I2426@ INDI 1 NAME Louis // 1 TITL Duke of Burgundy 1 SEX M 1 BIRT 2 DATE 1682 1 DEAT 2 DATE 1712 1 FAMS @F344@ 1 FAMC @F1143@ 0 @I2427@ INDI 1 NAME Maria Antonia // 1 SEX F 1 FAMS @F1144@ 1 FAMC @F1140@ 0 @I2428@ INDI 1 NAME Maximilian Emmanuel of_Bavaria// 1 TITL Elector 1 SEX M 1 FAMS @F1144@ 0 @I2429@ INDI 1 NAME Joseph Ferdinand // 1 TITL Electoral Prince 1 SEX M 1 DEAT 2 DATE 1699 1 FAMC @F1144@ 0 @I2430@ INDI 1 NAME Joseph_I // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 1678 1 DEAT 2 DATE 1711 1 FAMC @F1141@ 0 @I2431@ INDI 1 NAME Charles_VI // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 1685 2 PLAC Vienna,Austria 1 DEAT 2 DATE 1740 1 FAMS @F1146@ 1 FAMC @F1141@ 0 @I2432@ INDI 1 NAME Maria Theresa // 1 TITL Empress 1 SEX F 1 DEAT 2 DATE 1780 1 FAMS @F1145@ 1 FAMC @F1146@ 0 @I2433@ INDI 1 NAME Francis_I Stephen // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 1708 2 PLAC Nancy,Lorraine 1 DEAT 2 DATE 1765 1 FAMS @F1145@ 0 @I2434@ INDI 1 NAME Joseph_II // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 13 MAR 1741 2 PLAC Vienna,Austria 1 DEAT 2 DATE 1790 1 FAMC @F1145@ 0 @I2435@ INDI 1 NAME Eugene of_Leuchtenberg /de_Beauharnais/ 1 TITL Duke 1 SEX M 1 FAMS @F1149@ 0 @I2436@ INDI 1 NAME Augusta of_Bavaria // 1 SEX F 1 FAMS @F1149@ 0 @I2437@ INDI 1 NAME Francis Charles // 1 TITL Archduke 1 SEX M 1 BIRT 2 DATE 1802 1 DEAT 2 DATE 1878 1 FAMS @F1150@ 0 @I2438@ INDI 1 NAME Henry_II // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 31 MAR 1519 2 PLAC Saint-Germain,en-Laye 1 DEAT 2 DATE 10 JUL 1559 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1148@ 1 FAMC @F728@ 0 @I2439@ INDI 1 NAME Catherine of_Florence /de_Medici/ 1 SEX F 1 BIRT 2 DATE 1519 1 DEAT 2 DATE 1589 1 FAMS @F1148@ 0 @I2440@ INDI 1 NAME Claude of_France // 1 SEX F 1 BIRT 2 DATE 1499 1 DEAT 2 DATE 1524 1 FAMS @F728@ 1 FAMC @F1201@ 0 @I2441@ INDI 1 NAME Margaret of_Navarre // 1 SEX F 1 FAMC @F729@ 0 @I2442@ INDI 1 NAME John_II (Juan_II) // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE 1405 1 DEAT 2 DATE 1454 1 FAMS @F1152@ 0 @I2443@ INDI 1 NAME Isabella of_Portugal // 1 SEX F 1 FAMS @F1152@ 0 @I2444@ INDI 1 NAME Walter /Sommerlath/ 1 SEX M 1 FAMS @F1153@ 0 @I2445@ INDI 1 NAME Alice /de_Toledo/ 1 SEX F 1 FAMS @F1153@ 0 @I2446@ INDI 1 NAME Victoria Ingrid Alice// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 14 JUL 1977 1 FAMC @F220@ 0 @I2447@ INDI 1 NAME Carl Philip // 1 TITL Prince of Sweden 1 SEX M 1 BIRT 2 DATE 13 MAY 1979 1 FAMC @F220@ 0 @I2448@ INDI 1 NAME Francis Frederick of_Saxe-Coburg// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1750 1 DEAT 2 DATE 1806 1 REFN 6 1 FAMS @F1367@ 1 FAMS @F1147@ 1 FAMS @F70@ 1 FAMC @F1360@ 0 @I2449@ INDI 1 NAME Maria Henrietta // 1 SEX F 1 BIRT 2 DATE 1836 1 DEAT 2 DATE 1902 1 FAMS @F1154@ 1 FAMC @F1155@ 0 @I2450@ INDI 1 NAME Joseph of_Austria // 1 TITL Archduke 1 SEX M 1 BIRT 2 DATE 1776 1 DEAT 2 DATE 1847 1 FAMS @F1155@ 0 @I2451@ INDI 1 NAME Philip_II Augustus // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 21 AUG 1165 2 PLAC Gonesse,Nr: Paris,France 1 DEAT 2 DATE 14 JUL 1223 2 PLAC Mantes,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1156@ 1 FAMS @F1170@ 1 FAMS @F1171@ 1 FAMC @F1169@ 0 @I2452@ INDI 1 NAME Louis_VI the_Fat // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 1081 2 PLAC Paris,France 1 DEAT 2 DATE 1 AUG 1137 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F694@ 1 FAMS @F1158@ 1 FAMC @F1159@ 0 @I2453@ INDI 1 NAME Adelaide of_Savoy // 1 SEX F 1 DEAT 2 DATE 1154 1 FAMS @F1158@ 0 @I2454@ INDI 1 NAME Philip_I the_Fair // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1052 1 DEAT 2 DATE 29 JUL 1108 1 FAMS @F1159@ 1 FAMS @F1160@ 1 FAMC @F1161@ 0 @I2455@ INDI 1 NAME Bertha of_Holland // 1 SEX F 1 DEAT 2 DATE 1093 1 FAMS @F1159@ 0 @I2456@ INDI 1 NAME Bertrada de_Montfort // 1 SEX F 1 FAMS @F1160@ 0 @I2457@ INDI 1 NAME Henry_I // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE APR 1008 1 DEAT 2 DATE 4 AUG 1060 2 PLAC Vitry-en-Brie,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1196@ 1 FAMS @F1161@ 1 FAMC @F1162@ 0 @I2458@ INDI 1 NAME Robert_II the_Pious // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 970 2 PLAC Orleans,France 1 DEAT 2 DATE 1031 1 FAMS @F1163@ 1 FAMS @F1164@ 1 FAMS @F1162@ 1 FAMC @F1165@ 0 @I2459@ INDI 1 NAME Constance of_Arles // 1 SEX F 1 DEAT 2 DATE 1032 1 FAMS @F1162@ 0 @I2460@ INDI 1 NAME Hugh // 1 SEX M 1 BIRT 2 DATE 1007 1 DEAT 2 DATE 1025 1 FAMC @F1162@ 0 @I2461@ INDI 1 NAME Unknown // 1 SEX F 1 FAMS @F1163@ 0 @I2462@ INDI 1 NAME Bertha of_Burgundy // 1 SEX F 1 BIRT 2 DATE ABT 962 1 FAMS @F1164@ 0 @I2463@ INDI 1 NAME Hugh /Capet/ 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 938 1 DEAT 2 DATE AUG 996 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1165@ 0 @I2464@ INDI 1 NAME Louis_X the_Headstrong // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 4 OCT 1289 2 PLAC Paris,France 1 DEAT 2 DATE 5 JUN 1316 2 PLAC Vincennes,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1232@ 1 FAMS @F1157@ 1 FAMC @F794@ 0 @I2465@ INDI 1 NAME Philip_V the_Tall // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 1294 2 PLAC Lyons,France 1 DEAT 2 DATE 3 JAN 1322 2 PLAC Longchamp,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1175@ 1 FAMC @F794@ 0 @I2466@ INDI 1 NAME John_I // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 15 NOV 1316 2 PLAC Paris,France 1 DEAT 2 DATE 20 NOV 1316 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMC @F1157@ 0 @I2467@ INDI 1 NAME William_I // 1 TITL King of Sicily 1 SEX M 1 BIRT 2 DATE 1120 1 DEAT 2 DATE 1166 1 FAMS @F1166@ 1 FAMC @F1167@ 0 @I2468@ INDI 1 NAME Roger_II // 1 SEX M 1 FAMS @F1167@ 0 @I2469@ INDI 1 NAME Philip // 1 SEX M 1 FAMC @F1158@ 0 @I2470@ INDI 1 NAME Robert // 1 TITL Count of Dreux 1 SEX M 1 FAMC @F1158@ 0 @I2471@ INDI 1 NAME Pierre de_Courtenay // 1 SEX M 1 FAMC @F1158@ 0 @I2472@ INDI 1 NAME Henry of_Beauvais // 1 TITL Bishop of Rouen 1 SEX M 1 FAMC @F1158@ 0 @I2473@ INDI 1 NAME Philip // 1 TITL Bishop of Paris 1 SEX M 1 FAMC @F1158@ 0 @I2474@ INDI 1 NAME Constance of_Toulouse // 1 TITL Constance 1 SEX F 1 FAMC @F1158@ 0 @I2475@ INDI 1 NAME Constance of_Castile // 1 SEX F 1 DEAT 2 DATE 1160 1 FAMS @F1168@ 0 @I2476@ INDI 1 NAME Adele of_Champagne // 1 SEX F 1 DEAT 2 DATE 1206 1 FAMS @F1169@ 0 @I2477@ INDI 1 NAME Isabella of_Hainault // 1 SEX F 1 DEAT 2 DATE 1190 1 FAMS @F1156@ 0 @I2478@ INDI 1 NAME Ingeborg // 1 SEX F 1 BIRT 2 DATE 1175 1 DEAT 2 DATE 1236 1 FAMS @F1170@ 0 @I2479@ INDI 1 NAME Agnes of_Meranie // 1 TITL Princess 1 SEX F 1 DEAT 2 DATE 1201 1 FAMS @F1171@ 0 @I2480@ INDI 1 NAME Philip /Hurepel/ 1 SEX M 1 FAMC @F1171@ 0 @I2481@ INDI 1 NAME Alphonse // 1 SEX M 1 DEAT 2 DATE 1271 1 FAMC @F690@ 0 @I2482@ INDI 1 NAME Margaret of_Provence // 1 SEX F 1 BIRT 2 DATE 1221 1 DEAT 2 DATE 1295 1 FAMS @F689@ 1 FAMC @F1172@ 0 @I2483@ INDI 1 NAME Raymond of_Provence /Berenger/ 1 TITL Count IV 1 SEX M 1 FAMS @F1172@ 0 @I2484@ INDI 1 NAME Charles of_Anjou // 1 SEX M 1 FAMC @F690@ 0 @I2485@ INDI 1 NAME Mary of_Brabant // 1 SEX F 1 DEAT 2 DATE 1321 1 FAMS @F688@ 0 @I2486@ INDI 1 NAME Joan of_Navarre // 1 SEX F 1 BIRT 2 DATE 1271 1 DEAT 2 DATE 1305 1 FAMS @F794@ 0 @I2487@ INDI 1 NAME Clemence of_Hungary // 1 SEX F 1 BIRT 2 DATE ABT 1293 1 DEAT 2 DATE 1328 1 FAMS @F1157@ 1 FAMC @F1173@ 0 @I2488@ INDI 1 NAME Charles_I // 1 TITL King of Hungary 1 SEX M 1 BIRT 2 DATE 1288 1 DEAT 2 DATE 1342 1 FAMS @F1173@ 1 FAMC @F1174@ 0 @I2489@ INDI 1 NAME Charles_II // 1 TITL King of Naples 1 SEX M 1 FAMS @F1174@ 0 @I2490@ INDI 1 NAME Joan of_Burgundy // 1 SEX F 1 BIRT 2 DATE ABT 1293 1 DEAT 2 DATE 1329 1 FAMS @F1175@ 0 @I2491@ INDI 1 NAME Blanche of_Burgundy // 1 SEX F 1 BIRT 2 DATE ABT 1296 1 DEAT 2 DATE 1326 1 FAMS @F1176@ 0 @I2492@ INDI 1 NAME Marie of_Luxemburg // 1 SEX F 1 BIRT 2 DATE 1305 1 DEAT 2 DATE ABT 1323 1 FAMS @F1177@ 0 @I2493@ INDI 1 NAME Joan of_Evreux // 1 SEX F 1 DEAT 2 DATE 1371 1 FAMS @F1178@ 0 @I2494@ INDI 1 NAME Philip_VI of_Valois // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1293 1 DEAT 2 DATE 22 AUG 1350 2 PLAC Nogent-le-Roi,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1180@ 1 FAMS @F1181@ 1 FAMC @F1179@ 0 @I2495@ INDI 1 NAME Charles de_Valois // 1 SEX M 1 BIRT 2 DATE 1270 2 PLAC Fontainebleau,France 1 DEAT 2 DATE 1325 1 FAMS @F1179@ 0 @I2496@ INDI 1 NAME Joan of_Burgundy // 1 TITL Queen 1 SEX F 1 DEAT 2 DATE ABT 1349 1 FAMS @F1180@ 0 @I2497@ INDI 1 NAME Blanche of_Navarre // 1 SEX F 1 DEAT 2 DATE 1398 1 FAMS @F1181@ 0 @I2498@ INDI 1 NAME John_II the_Good // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 26 APR 1319 2 PLAC Le Mans,France 1 DEAT 2 DATE 8 APR 1364 2 PLAC London,England 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1192@ 1 FAMS @F1233@ 1 FAMC @F1180@ 0 @I2499@ INDI 1 NAME Charles_V the_Wise // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 21 JAN 1337 2 PLAC Vincennes,France 1 DEAT 2 DATE 16 SEP 1380 2 PLAC Vincennes,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1182@ 1 FAMC @F1192@ 0 @I2500@ INDI 1 NAME Joan of_Bourbon // 1 TITL Queen 1 SEX F 1 BIRT 2 DATE 1338 1 DEAT 2 DATE 4 FEB 1378 1 FAMS @F1182@ 0 @I2501@ INDI 1 NAME Louis of_Beaumont // 1 TITL Count of Valois 1 SEX M 1 DEAT 2 DATE 1407 1 FAMC @F1182@ 0 @I2502@ INDI 1 NAME Catherine // 1 TITL Princess 1 SEX F 1 FAMC @F1182@ 0 @I2503@ INDI 1 NAME Isabelle // 1 SEX F 1 BIRT 2 DATE FEB 1378 1 DEAT 2 DATE FEB 1378 1 FAMC @F1182@ 0 @I2504@ INDI 1 NAME Stanislaw /Leczinski/ 1 TITL King of Poland 1 SEX M 1 FAMS @F1183@ 0 @I2505@ INDI 1 NAME Margaret of_Valois // 1 SEX F 1 BIRT 2 DATE 1553 1 DEAT 2 DATE 1615 1 FAMS @F1184@ 0 @I2506@ INDI 1 NAME Elizabeth // 1 SEX F 1 FAMC @F1185@ 0 @I2507@ INDI 1 NAME Charles // 1 TITL Duke of Berry 1 SEX M 1 BIRT 2 DATE 1686 1 DEAT 2 DATE 1714 1 FAMS @F1375@ 1 FAMC @F1143@ 0 @I2508@ INDI 1 NAME Clotilde of_Savoy // 1 SEX F 1 DEAT 2 DATE 1805 1 FAMS @F1186@ 0 @I2509@ INDI 1 NAME of_Angouleme // 1 TITL Duke 1 BIRT 2 DATE 1775 1 FAMC @F1186@ 0 @I2510@ INDI 1 NAME of_Berry // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1778 1 FAMC @F1186@ 0 @I2511@ INDI 1 NAME Louis_Philippe_I // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 1773 2 PLAC Palace Royal,France,France 1 DEAT 2 DATE 1850 1 FAMS @F1187@ 1 FAMC @F1188@ 0 @I2512@ INDI 1 NAME Desideria // 1 SEX F 1 FAMS @F664@ 0 @I2513@ INDI 1 NAME Louis-Philippe Joseph // 1 SEX M 1 DEAT 2 DATE 1793 1 FAMS @F1188@ 1 FAMC @F1189@ 0 @I2514@ INDI 1 NAME Louise Adelaide de_Penthievre// 1 TITL Princess 1 SEX F 1 FAMS @F1188@ 0 @I2515@ INDI 1 NAME Louis-Philippe // 1 SEX M 1 DEAT 2 DATE 1785 1 FAMS @F1189@ 1 FAMC @F1190@ 0 @I2516@ INDI 1 NAME Louis of_Orleans // 1 SEX M 1 DEAT 2 DATE 1752 1 FAMS @F1190@ 1 FAMC @F1191@ 0 @I2517@ INDI 1 NAME Philippe Duc_de_Chartes // 1 TITL Regent 1 SEX M 1 BIRT 2 DATE 1674 1 DEAT 2 DATE 1723 1 FAMS @F1191@ 1 FAMC @F1373@ 0 @I2518@ INDI 1 NAME Philip the_Bold // 1 SEX M 1 DEAT 2 DATE 1404 1 FAMC @F1192@ 0 @I2519@ INDI 1 NAME Bonne of_Luxemburg // 1 SEX F 1 DEAT 2 DATE 1349 1 FAMS @F1192@ 0 @I2520@ INDI 1 NAME Joan of_Valois // 1 SEX F 1 FAMS @F1193@ 1 FAMC @F1179@ 0 @I2521@ INDI 1 NAME Robert of_Artois // 1 TITL Duke of Richmond 1 SEX M 1 FAMS @F1193@ 0 @I2522@ INDI 1 NAME Charles_IX // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 27 JUN 1550 2 PLAC St. Germain-,en-Laye,France 1 DEAT 2 DATE 30 MAY 1574 2 PLAC Vincennes,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1229@ 1 FAMC @F1148@ 0 @I2523@ INDI 1 NAME Henry_III // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 19 SEP 1551 2 PLAC Fontainebleau,France 1 DEAT 2 DATE 2 AUG 1589 2 PLAC Paris,France 1 BURI 2 PLAC St. Denis,France 1 FAMS @F1230@ 1 FAMC @F1148@ 0 @I2524@ INDI 1 NAME Charles of_Valois // 1 TITL Count Angouleme 1 SEX M 1 FAMS @F729@ 1 FAMC @F1194@ 0 @I2525@ INDI 1 NAME John of_Valois // 1 TITL Count Angouleme 1 SEX M 1 FAMS @F1194@ 0 @I2526@ INDI 1 NAME Margaretha of_Sweden // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 31 OCT 1934 1 FAMS @F1285@ 1 FAMC @F217@ 0 @I2527@ INDI 1 NAME Birgitta of_Sweden // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 19 JAN 1937 1 FAMS @F1286@ 1 FAMC @F217@ 0 @I2528@ INDI 1 NAME Desiree of_Sweden // 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 2 JUN 1938 1 FAMS @F1287@ 1 FAMC @F217@ 0 @I2529@ INDI 1 NAME Christina Louise Helen// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 3 AUG 1943 1 FAMS @F1288@ 1 FAMC @F217@ 0 @I2530@ INDI 1 NAME Peter_I // 1 TITL King of Serbia 1 SEX M 1 DEAT 2 DATE 1921 1 FAMS @F1195@ 0 @I2531@ INDI 1 NAME Zorka of_Montenegro // 1 TITL Princess 1 SEX F 1 DEAT 2 DATE ABT 1889 1 FAMS @F1195@ 0 @I2532@ INDI 1 NAME George /Karageorgeovitch/ 1 SEX M 1 FAMC @F1195@ 0 @I2533@ INDI 1 NAME Robert // 1 SEX M 1 FAMC @F1162@ 0 @I2534@ INDI 1 NAME Hugh the_Great of_Vermandois// 1 TITL Count 1 SEX M 1 FAMC @F1196@ 0 @I2535@ INDI 1 NAME Anne of_Kiev // 1 SEX F 1 BIRT 2 DATE ABT 1024 1 DEAT 2 DATE ABT 1066 1 FAMS @F1161@ 0 @I2536@ INDI 1 NAME Matilda of_Germany // 1 SEX F 1 DEAT 2 DATE BEF 1044 1 FAMS @F1196@ 0 @I2537@ INDI 1 NAME Charles_VII // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 22 FEB 1403 2 PLAC Paris,France 1 DEAT 2 DATE 21 JUL 1461 2 PLAC Bourges,France 1 BURI 2 DATE 9 AUG 1461 2 PLAC St. Denis,France 1 FAMS @F1197@ 1 FAMC @F915@ 0 @I2538@ INDI 1 NAME Mary of_Anjou // 1 SEX F 1 BIRT 2 DATE 1404 1 DEAT 2 DATE 1463 1 FAMS @F1197@ 1 FAMC @F1198@ 0 @I2539@ INDI 1 NAME Yolande of_Aragon // 1 SEX F 1 FAMS @F1198@ 0 @I2540@ INDI 1 NAME Louis_XI // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 3 JUL 1423 2 PLAC Bourges,France 1 DEAT 2 DATE 30 AUG 1483 1 BURI 2 PLAC Notre Dame,de Clery,France 1 FAMS @F1199@ 1 FAMS @F1200@ 1 FAMC @F1197@ 0 @I2541@ INDI 1 NAME Margaret of_Scotland // 1 SEX F 1 BIRT 2 DATE ABT 1418 1 DEAT 2 DATE 1445 1 FAMS @F1199@ 0 @I2542@ INDI 1 NAME Charlotte of_Savoy // 1 SEX F 1 BIRT 2 DATE ABT 1445 1 DEAT 2 DATE 1483 1 FAMS @F1200@ 0 @I2543@ INDI 1 NAME Charles_VIII // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 30 JUN 1490 1 DEAT 2 DATE 7 APR 1498 2 PLAC Amboise 1 BURI 2 PLAC St. Denis,France 1 FAMS @F343@ 1 FAMC @F1200@ 0 @I2544@ INDI 1 NAME Anne // 1 SEX F 1 BIRT 2 DATE 1461 1 DEAT 2 DATE 1522 1 FAMC @F1200@ 0 @I2545@ INDI 1 NAME Anne of_Brittany // 1 SEX F 1 BIRT 2 DATE 1477 1 DEAT 2 DATE 1514 1 FAMS @F343@ 0 @I2546@ INDI 1 NAME Anne of_Cleves // 1 SEX F 1 FAMS @F462@ 0 @I2547@ INDI 1 NAME Joan of_Valois // 1 SEX F 1 BIRT 2 DATE 1464 1 DEAT 2 DATE 1505 1 FAMS @F1151@ 0 @I2548@ INDI 1 NAME Anne of_Brittany // 1 SEX F 1 BIRT 2 DATE 1476 1 DEAT 2 DATE 9 JAN 1514 1 FAMS @F1201@ 0 @I2549@ INDI 1 NAME Catherine of_Brandenburg -Kustrin// 1 SEX F 1 FAMS @F1054@ 0 @I2550@ INDI 1 NAME Hildegard // 1 SEX F 1 BIRT 2 DATE ABT 757 1 DEAT 2 DATE 783 1 FAMS @F1202@ 0 @I2551@ INDI 1 NAME Charles // 1 SEX M 1 DEAT 2 DATE 811 1 FAMC @F1202@ 0 @I2552@ INDI 1 NAME Pepin // 1 TITL King of Italy 1 SEX M 1 BIRT 2 DATE 777 1 DEAT 2 DATE 810 1 FAMS @F1205@ 1 FAMC @F1202@ 0 @I2553@ INDI 1 NAME Louis_I the_Pious of_Aquitaine// 1 TITL King 1 SEX M 1 BIRT 2 DATE 778 1 DEAT 2 DATE 840 1 FAMS @F1206@ 1 FAMS @F1207@ 1 FAMC @F1202@ 0 @I2554@ INDI 1 NAME Berthe // 1 SEX F 1 FAMC @F1202@ 0 @I2555@ INDI 1 NAME Fastrada // 1 SEX F 1 DEAT 2 DATE 794 1 FAMS @F1203@ 0 @I2556@ INDI 1 NAME Luitgard // 1 SEX F 1 DEAT 2 DATE 800 1 FAMS @F1204@ 0 @I2557@ INDI 1 NAME Bertha of_Toulouse // 1 SEX F 1 FAMS @F1205@ 0 @I2558@ INDI 1 NAME Irmengard of_Hesbain // 1 SEX F 1 FAMS @F1206@ 0 @I2559@ INDI 1 NAME Judith of_Bavaria // 1 SEX F 1 FAMS @F1207@ 0 @I2560@ INDI 1 NAME Lothar_I // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE 795 1 DEAT 2 DATE 855 1 FAMS @F1208@ 1 FAMC @F1206@ 0 @I2561@ INDI 1 NAME Pepin_I of_Aquitaine // 1 TITL King 1 SEX M 1 DEAT 2 DATE 838 1 FAMS @F1209@ 1 FAMC @F1206@ 0 @I2562@ INDI 1 NAME Adelaide // 1 SEX F 1 FAMC @F1206@ 0 @I2563@ INDI 1 NAME Louis_II the_German // 1 TITL King East Franks 1 SEX M 1 BIRT 2 DATE ABT 805 1 DEAT 2 DATE 876 1 FAMS @F1210@ 1 FAMC @F1206@ 0 @I2564@ INDI 1 NAME Charles_II the_Bald // 1 TITL King West Franks 1 SEX M 1 BIRT 2 DATE 823 1 DEAT 2 DATE 6 OCT 877 2 PLAC Modano 1 FAMS @F1211@ 1 FAMC @F1207@ 0 @I2565@ INDI 1 NAME Bernard // 1 TITL King of Italy 1 SEX M 1 BIRT 2 DATE ABT 799 1 DEAT 2 DATE 818 1 FAMC @F1205@ 0 @I2566@ INDI 1 NAME Irmengard // 1 SEX F 1 FAMS @F1208@ 0 @I2567@ INDI 1 NAME Louis_II le_Jeune // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE ABT 822 1 DEAT 2 DATE 875 1 FAMS @F1215@ 1 FAMC @F1208@ 0 @I2568@ INDI 1 NAME Lothar_II of_Lorraine // 1 TITL King 1 SEX M 1 BIRT 2 DATE ABT 826 1 DEAT 2 DATE 868 1 FAMS @F1217@ 1 FAMS @F1218@ 1 FAMC @F1208@ 0 @I2569@ INDI 1 NAME Charles // 1 TITL King of Provence 1 SEX M 1 DEAT 2 DATE 863 1 FAMC @F1208@ 0 @I2570@ INDI 1 NAME Pepin_II of_Aquitaine // 1 TITL King 1 SEX M 1 DEAT 2 DATE 870 1 FAMC @F1209@ 0 @I2571@ INDI 1 NAME Emma of_Bavaria // 1 SEX F 1 DEAT 2 DATE 876 1 FAMS @F1210@ 0 @I2572@ INDI 1 NAME Carloman // 1 TITL King of Bavaria 1 SEX M 1 BIRT 2 DATE ABT 828 1 DEAT 2 DATE 880 1 FAMS @F1219@ 1 FAMC @F1210@ 0 @I2573@ INDI 1 NAME Louis the_Young // 1 TITL King East Franks 1 SEX M 1 DEAT 2 DATE 882 1 FAMC @F1210@ 0 @I2574@ INDI 1 NAME Charles_III the_Fat // 1 TITL King West Franks 1 SEX M 1 BIRT 2 DATE 839 1 DEAT 2 DATE 887 1 FAMC @F1210@ 0 @I2575@ INDI 1 NAME Ermentrude // 1 SEX F 1 DEAT 2 DATE 869 1 FAMS @F1211@ 0 @I2576@ INDI 1 NAME Louis_II the_Stammerer // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 846 1 DEAT 2 DATE 879 1 FAMS @F1212@ 1 FAMS @F1213@ 1 FAMC @F1211@ 0 @I2577@ INDI 1 NAME Charles of_Aquitaine // 1 TITL King 1 SEX M 1 DEAT 2 DATE 866 1 FAMC @F1211@ 0 @I2578@ INDI 1 NAME Carloman // 1 SEX M 1 DEAT 2 DATE 876 1 FAMC @F1211@ 0 @I2579@ INDI 1 NAME Judith // 1 SEX F 1 FAMC @F1211@ 0 @I2580@ INDI 1 NAME Ansgarde of_Burgundy // 1 SEX F 1 FAMS @F1212@ 0 @I2581@ INDI 1 NAME Louis_III // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE ABT 863 1 DEAT 2 DATE 882 1 FAMC @F1212@ 0 @I2582@ INDI 1 NAME Carloman // 1 TITL King of France 1 SEX M 1 DEAT 2 DATE 884 1 FAMC @F1212@ 0 @I2583@ INDI 1 NAME Adelaide Judith // 1 SEX F 1 FAMS @F1213@ 0 @I2584@ INDI 1 NAME Charles_III the_Simple // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 879 1 DEAT 2 DATE 929 1 FAMS @F1214@ 1 FAMC @F1213@ 0 @I2585@ INDI 1 NAME Eadgifu of_England // 1 SEX F 1 BIRT 2 DATE 902 1 FAMS @F1214@ 0 @I2586@ INDI 1 NAME Engeberge // 1 SEX F 1 FAMS @F1215@ 0 @I2587@ INDI 1 NAME Irmengard // 1 SEX F 1 FAMS @F1216@ 1 FAMC @F1215@ 0 @I2588@ INDI 1 NAME Boso // 1 TITL King of Provence 1 SEX M 1 DEAT 2 DATE 887 1 FAMS @F1216@ 0 @I2589@ INDI 1 NAME Louis_III the_Blind // 1 TITL Holy Roman Emper 1 SEX M 1 BIRT 2 DATE ABT 880 1 DEAT 2 DATE 928 1 FAMC @F1216@ 0 @I2590@ INDI 1 NAME Theutberga of_Valois // 1 SEX F 1 FAMS @F1217@ 0 @I2591@ INDI 1 NAME Waldrada // 1 SEX F 1 FAMS @F1218@ 0 @I2592@ INDI 1 NAME Litwinde // 1 SEX F 1 FAMS @F1219@ 0 @I2593@ INDI 1 NAME Arnulf // 1 TITL King of Germany 1 SEX M 1 BIRT 2 DATE ABT 863 1 DEAT 2 DATE 899 1 FAMS @F1220@ 1 FAMC @F1219@ 0 @I2594@ INDI 1 NAME Oda of_Bavaria // 1 SEX F 1 FAMS @F1220@ 0 @I2595@ INDI 1 NAME Louis_III the_Child // 1 TITL King of Germany 1 SEX M 1 BIRT 2 DATE 893 1 DEAT 2 DATE 911 1 FAMC @F1220@ 0 @I2596@ INDI 1 NAME Zwentibold // 1 TITL King of Lorraine 1 SEX M 1 DEAT 2 DATE 900 1 FAMC @F1220@ 0 @I2597@ INDI 1 NAME Hedwige // 1 SEX F 1 FAMS @F1221@ 1 FAMC @F1220@ 0 @I2598@ INDI 1 NAME Otto of_Saxony // 1 SEX M 1 FAMS @F1221@ 0 @I2599@ INDI 1 NAME Henry the_Fowler // 1 TITL Emperor 1 SEX M 1 FAMS @F1222@ 1 FAMC @F1221@ 0 @I2600@ INDI 1 NAME Matilda of_Ringelheim // 1 SEX F 1 FAMS @F1222@ 0 @I2601@ INDI 1 NAME Bruno of_Cologne // 1 TITL Archbishop 1 SEX M 1 FAMC @F1222@ 0 @I2602@ INDI 1 NAME Otto_I // 1 TITL Emperor 1 SEX M 1 FAMC @F1222@ 0 @I2603@ INDI 1 NAME Gerberge // 1 SEX F 1 DEAT 2 DATE 968 1 FAMS @F1223@ 1 FAMC @F1222@ 0 @I2604@ INDI 1 NAME Louis_IV d'Outre-Mer // 1 SEX M 1 BIRT 2 DATE ABT 920 1 DEAT 2 DATE 954 1 FAMS @F1223@ 1 FAMC @F1214@ 0 @I2605@ INDI 1 NAME Lothar // 1 TITL King of France 1 SEX M 1 BIRT 2 DATE 941 1 DEAT 2 DATE 986 1 FAMS @F1224@ 1 FAMC @F1223@ 0 @I2606@ INDI 1 NAME Charles Lower_Lorraine // 1 SEX M 1 BIRT 2 DATE 954 1 DEAT 2 DATE 986 1 FAMC @F1223@ 0 @I2607@ INDI 1 NAME Louis_V the_Coward // 1 SEX M 1 BIRT 2 DATE ABT 986 1 DEAT 2 DATE 997 1 FAMC @F1224@ 0 @I2608@ INDI 1 NAME Adalberon of_Rheims // 1 TITL Archbishop 1 SEX M 1 DEAT 2 DATE 1021 1 FAMC @F1224@ 0 @I2609@ INDI 1 NAME Pepin the_Short // 1 TITL King of Franks 1 SEX M 1 BIRT 2 DATE 714 1 DEAT 2 DATE 768 1 FAMS @F1225@ 1 FAMC @F1227@ 0 @I2610@ INDI 1 NAME Bertha // 1 SEX F 1 DEAT 2 DATE 783 1 FAMS @F1225@ 0 @I2611@ INDI 1 NAME Carloman // 1 TITL King of Franks 1 SEX M 1 BIRT 2 DATE ABT 751 1 DEAT 2 DATE 771 1 FAMS @F1226@ 1 FAMC @F1225@ 0 @I2612@ INDI 1 NAME Gerberge of_the_Lombard // 1 SEX F 1 FAMS @F1226@ 0 @I2613@ INDI 1 NAME Charles /Martel/ 1 SEX M 1 BIRT 2 DATE ABT 686 1 DEAT 2 DATE 741 1 FAMS @F1227@ 0 @I2614@ INDI 1 NAME Augusta Reuss-Ebersdorf // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1757 1 DEAT 2 DATE 1831 1 FAMS @F1147@ 1 FAMC @F1228@ 0 @I2615@ INDI 1 NAME Elisabeth of_Austria // 1 SEX F 1 BIRT 2 DATE 1554 1 DEAT 2 DATE 1592 1 FAMS @F1229@ 0 @I2616@ INDI 1 NAME Marie Elisabeth // 1 SEX F 1 BIRT 2 DATE 27 OCT 1572 1 DEAT 2 DATE 2 APR 1578 1 FAMC @F1229@ 0 @I2617@ INDI 1 NAME Louise of_Lorraine // 1 SEX F 1 BIRT 2 DATE 1553 1 DEAT 2 DATE 1601 1 FAMS @F1230@ 0 @I2618@ INDI 1 NAME Isabelle of_Aragon // 1 SEX F 1 BIRT 2 DATE 1247 1 DEAT 2 DATE 1271 1 FAMS @F1231@ 0 @I2619@ INDI 1 NAME Marguerite of_Burgundy // 1 SEX F 1 BIRT 2 DATE 1290 1 DEAT 2 DATE 1315 1 FAMS @F1232@ 0 @I2620@ INDI 1 NAME Joan of_Boulogne // 1 SEX F 1 BIRT 2 DATE ABT 1326 1 DEAT 2 DATE 1361 1 FAMS @F1233@ 0 @I2621@ INDI 1 NAME Magdalen of_Hochstadten // 1 TITL Baroness 1 SEX F 1 BIRT 2 DATE 1846 1 DEAT 2 DATE 1917 1 FAMS @F1234@ 0 @I2622@ INDI 1 NAME William of_Prussia // 1 TITL Prince 1 SEX M 1 FAMS @F1235@ 0 @I2623@ INDI 1 NAME John /Loisinger/ 1 SEX M 1 FAMS @F1236@ 0 @I2624@ INDI 1 NAME Francis_II Frederick of_Mecklenburg// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1823 1 DEAT 2 DATE 1883 1 FAMS @F1237@ 0 @I2625@ INDI 1 NAME Josephine of_Lichtenberg // 1 TITL Baroness 1 SEX F 1 BIRT 2 DATE 1857 1 DEAT 2 DATE 1952 1 FAMS @F1238@ 1 FAMC @F1239@ 0 @I2626@ INDI 1 NAME Philip /Bender/ 1 SEX M 1 FAMS @F1239@ 0 @I2627@ INDI 1 NAME Caroline of_Nidda // 1 TITL Baroness 1 SEX F 1 BIRT 2 DATE 1848 1 DEAT 2 DATE 1879 1 FAMS @F1240@ 0 @I2628@ INDI 1 NAME Emily of_Dornberg // 1 TITL Baroness 1 SEX F 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1961 1 FAMS @F1241@ 0 @I2629@ INDI 1 NAME Louis // 1 SEX M 1 BIRT 2 DATE 1931 1 DEAT 2 DATE 1937 1 FAMC @F158@ 0 @I2630@ INDI 1 NAME Alexander // 1 SEX M 1 BIRT 2 DATE 1933 1 DEAT 2 DATE 1937 1 FAMC @F158@ 0 @I2631@ INDI 1 NAME Joanna // 1 SEX F 1 BIRT 2 DATE 1936 1 DEAT 2 DATE 1939 1 FAMC @F158@ 0 @I2632@ INDI 1 NAME Auckland L. of_Rolvenden/Geddes/ 1 SEX M 1 FAMS @F1242@ 0 @I2633@ INDI 1 NAME Maria de_las_Mercedes // 1 SEX F 1 BIRT 2 DATE 1860 1 DEAT 2 DATE 1878 1 FAMS @F1243@ 0 @I2634@ INDI 1 NAME Maria de_las_Mercedes // 1 SEX F 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1904 1 FAMS @F1244@ 1 FAMC @F254@ 0 @I2635@ INDI 1 NAME Maria Theresa // 1 SEX F 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1912 1 FAMS @F1254@ 1 FAMC @F254@ 0 @I2636@ INDI 1 NAME Charles of_Bourbon -Sicily// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1949 1 FAMS @F1244@ 1 FAMS @F1245@ 0 @I2637@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1952 1 FAMS @F1245@ 0 @I2638@ INDI 1 NAME Louis de_la_Torre /Gomez-Acebo/ 1 TITL Viscount 1 SEX M 1 BIRT 2 DATE 1934 1 FAMS @F1246@ 0 @I2639@ INDI 1 NAME Carlos Zurita_y_Delgado // 1 SEX M 1 BIRT 2 DATE 1943 1 FAMS @F1247@ 0 @I2640@ INDI 1 NAME Edelmira // 1 SEX F 1 BIRT 2 DATE 1906 1 FAMS @F1248@ 0 @I2641@ INDI 1 NAME Martha y_Altazurra /Rocafort/ 1 SEX F 1 FAMS @F1249@ 0 @I2642@ INDI 1 NAME Maria Christina // 1 SEX F 1 BIRT 2 DATE 1911 1 FAMS @F1250@ 1 FAMC @F143@ 0 @I2643@ INDI 1 NAME Gonzalo // 1 SEX M 1 BIRT 2 DATE 1914 1 DEAT 2 DATE 1934 1 FAMC @F143@ 0 @I2644@ INDI 1 NAME Henry C. /Marone/ 1 SEX M 1 BIRT 2 DATE 1895 1 DEAT 2 DATE 1968 1 FAMS @F1250@ 0 @I2645@ INDI 1 NAME Alexander of_Civitella- Cessi/Torlonia/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1911 1 FAMS @F1251@ 0 @I2646@ INDI 1 NAME Emmanuela de_Dampierre // 1 SEX F 1 BIRT 2 DATE 1913 1 FAMS @F1252@ 0 @I2647@ INDI 1 NAME Charlotte /Tiedemann/ 1 SEX F 1 BIRT 2 DATE 1919 1 FAMS @F1253@ 0 @I2648@ INDI 1 NAME Ferdinand of_Bavaria // 1 SEX M 1 BIRT 2 DATE 1884 1 DEAT 2 DATE 1958 1 FAMS @F1254@ 1 FAMC @F1255@ 0 @I2649@ INDI 1 NAME Louis Ferdinand of_Bavaria// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1859 1 DEAT 2 DATE 1949 1 FAMS @F1255@ 0 @I2650@ INDI 1 NAME Maria de_la_Paz // 1 SEX F 1 BIRT 2 DATE 1862 1 DEAT 2 DATE 1946 1 FAMS @F1255@ 0 @I2651@ INDI 1 NAME Adolph of_Schwarzburg- Rudolstadt// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1801 1 DEAT 2 DATE 1875 1 FAMS @F1256@ 0 @I2652@ INDI 1 NAME Matilda // 1 SEX F 1 BIRT 2 DATE 1826 1 DEAT 2 DATE 1914 1 FAMS @F1256@ 0 @I2653@ INDI 1 NAME Frederica // 1 SEX F 1 BIRT 2 DATE 1770 1 DEAT 2 DATE 1819 1 FAMS @F1257@ 1 FAMC @F239@ 0 @I2654@ INDI 1 NAME Alexandrine // 1 SEX F 1 BIRT 2 DATE 1803 1 DEAT 2 DATE 1892 1 FAMS @F183@ 1 FAMC @F145@ 0 @I2655@ INDI 1 NAME Frederick // 1 SEX M 1 BIRT 2 DATE 1774 1 DEAT 2 DATE 1799 1 FAMC @F239@ 0 @I2656@ INDI 1 NAME Amalia // 1 SEX F 1 BIRT 2 DATE 1830 1 DEAT 2 DATE 1872 1 FAMS @F1258@ 0 @I2657@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 1855 1 DEAT 2 DATE 1888 1 FAMS @F1259@ 0 @I2658@ INDI 1 NAME Lucas /Streshniev/ 1 SEX M 1 DEAT 2 DATE 1650 1 FAMS @F1260@ 0 @I2659@ INDI 1 NAME Anne /Volkonska/ 1 SEX F 1 FAMS @F1260@ 1 FAMC @F1378@ 0 @I2660@ INDI 1 NAME Theodore // 1 TITL Patr. of Moscow 1 SEX M 1 DEAT 2 DATE 1633 1 FAMS @F1261@ 0 @I2661@ INDI 1 NAME Xenia // 1 SEX F 1 DEAT 2 DATE 1631 1 FAMS @F1261@ 1 FAMC @F1376@ 0 @I2662@ INDI 1 NAME Anne /Leontiev/ 1 SEX F 1 DEAT 2 DATE 1706 1 FAMS @F483@ 1 FAMC @F1262@ 0 @I2663@ INDI 1 NAME Leonti /Leontiev/ 1 SEX M 1 FAMS @F1262@ 0 @I2664@ INDI 1 NAME Praskovia /Rayevska/ 1 SEX F 1 DEAT 2 DATE 1641 1 FAMS @F1262@ 1 FAMC @F1377@ 0 @I2665@ INDI 1 NAME Nicholas /Romanov/ 1 SEX M 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1891 1 FAMS @F1263@ 1 FAMC @F10@ 0 @I2666@ INDI 1 NAME Michael /Romanov/ 1 SEX M 1 BIRT 2 DATE 1832 1 DEAT 2 DATE 1909 1 FAMS @F1264@ 1 FAMC @F10@ 0 @I2667@ INDI 1 NAME Alexandra // 1 SEX F 1 BIRT 2 DATE 1838 1 DEAT 2 DATE 1900 1 FAMS @F1263@ 0 @I2668@ INDI 1 NAME Cecily (Olga) // 1 SEX F 1 BIRT 2 DATE 1839 1 DEAT 2 DATE 1891 1 FAMS @F1264@ 0 @I2669@ INDI 1 NAME Nicholas /Romanov/ 1 SEX M 1 BIRT 2 DATE 1859 1 DEAT 2 DATE 1919 1 FAMC @F1264@ 0 @I2670@ INDI 1 NAME Michael /Romanov/ 1 SEX M 1 BIRT 2 DATE 1861 1 DEAT 2 DATE 1929 1 FAMS @F1266@ 1 FAMC @F1264@ 0 @I2671@ INDI 1 NAME Constantine /Romanov/ 1 SEX M 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1915 1 FAMS @F1268@ 1 FAMC @F112@ 0 @I2672@ INDI 1 NAME Sergius /Romanov/ 1 SEX M 1 BIRT 2 DATE 1869 1 DEAT 2 DATE 1918 1 FAMC @F1264@ 0 @I2673@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 1876 1 DEAT 2 DATE 1940 1 FAMS @F1265@ 1 FAMS @F1336@ 1 FAMC @F75@ 0 @I2674@ INDI 1 NAME George /Romanov/ 1 SEX M 1 BIRT 2 DATE 1863 1 DEAT 2 DATE 1919 1 FAMS @F1265@ 1 FAMC @F1264@ 0 @I2675@ INDI 1 NAME Alexander Mikhailovich (Sandro)/Romanov/ 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1866 1 DEAT 2 DATE 1933 1 FAMS @F51@ 1 FAMC @F1264@ 0 @I2676@ INDI 1 NAME Sophia of_Nassau // 1 SEX F 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1927 1 FAMS @F1266@ 0 @I2677@ INDI 1 NAME Dimitri /Romanov/ 1 SEX M 1 BIRT 2 DATE 1860 1 DEAT 2 DATE 1919 1 FAMC @F112@ 0 @I2678@ INDI 1 NAME Nadezhda /Dreyer/ 1 SEX F 1 BIRT 2 DATE 1861 1 DEAT 2 DATE 1929 1 FAMS @F1267@ 0 @I2679@ INDI 1 NAME Elizabeth // 1 SEX F 1 BIRT 2 DATE 1865 1 DEAT 2 DATE 1929 1 FAMS @F1268@ 1 FAMC @F1269@ 0 @I2680@ INDI 1 NAME Maurice of_Saxe- Altenburg// 1 TITL Prince 1 SEX M 1 FAMS @F1269@ 0 @I2681@ INDI 1 NAME Artemi /Romanov/ 1 TITL Prince Iskander 1 SEX M 1 BIRT 2 DATE 1881 1 DEAT 2 DATE 1919 1 FAMC @F1267@ 0 @I2682@ INDI 1 NAME Frederick Francis_II of_Mecklengb-Sch// 1 TITL Grand Duke 1 SEX M 1 FAMS @F1270@ 0 @I2683@ INDI 1 NAME George Bagration- Mukhranski// 1 TITL Prince 1 SEX M 1 FAMS @F1271@ 0 @I2684@ INDI 1 NAME Ivan /Romanov/ 1 SEX M 1 BIRT 2 DATE 1886 1 DEAT 2 DATE 1918 1 FAMS @F1272@ 1 FAMC @F1268@ 0 @I2685@ INDI 1 NAME Constantine /Romanov/ 1 SEX M 1 BIRT 2 DATE 1891 1 DEAT 2 DATE 1918 1 FAMC @F1268@ 0 @I2686@ INDI 1 NAME Igor /Romanov/ 1 SEX M 1 BIRT 2 DATE 1894 1 DEAT 2 DATE 1918 1 FAMC @F1268@ 0 @I2687@ INDI 1 NAME Helen // 1 SEX F 1 BIRT 2 DATE 1881 1 DEAT 2 DATE 1962 1 FAMS @F1272@ 1 FAMC @F1273@ 0 @I2688@ INDI 1 NAME Peter_I // 1 TITL King of Serbia 1 SEX M 1 FAMS @F1273@ 0 @I2689@ INDI 1 NAME Frederick Eugene of_Wurttemberg// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1732 1 DEAT 2 DATE 1797 1 FAMS @F1274@ 0 @I2690@ INDI 1 NAME Dorothea of_Brandenburg -Schwedt// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1736 1 DEAT 2 DATE 1798 1 FAMS @F1274@ 0 @I2691@ INDI 1 NAME Christian Augustus // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1690 1 DEAT 2 DATE 1747 1 FAMS @F1275@ 0 @I2692@ INDI 1 NAME Joanna // 1 SEX F 1 BIRT 2 DATE 1712 1 DEAT 2 DATE 1760 1 FAMS @F1275@ 0 @I2693@ INDI 1 NAME Peter /Oldenburg/ 1 SEX M 1 BIRT 2 DATE 1908 1 DEAT 2 DATE 1980 1 FAMS @F1331@ 1 FAMC @F1276@ 0 @I2694@ INDI 1 NAME John of_Brandenburg // 1 TITL Margrave 1 SEX M 1 FAMS @F1277@ 0 @I2695@ INDI 1 NAME Frederick Francis_III Mecklenburg-Schw// 1 TITL Grand Duke 1 SEX M 1 BIRT 2 DATE 1851 1 DEAT 2 DATE 1897 1 FAMS @F1278@ 0 @I2696@ INDI 1 NAME Anastasia // 1 SEX F 1 BIRT 2 DATE 1860 1 DEAT 2 DATE 1922 1 FAMS @F1278@ 0 @I2697@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1875 1 DEAT 2 DATE 1906 1 FAMS @F1279@ 1 FAMC @F218@ 0 @I2698@ INDI 1 NAME Frederick of_Schaumburg -Lippe// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1868 1 DEAT 2 DATE 1945 1 FAMS @F1279@ 0 @I2699@ INDI 1 NAME Feodora // 1 SEX F 1 BIRT 2 DATE 1910 1 DEAT 2 DATE 1975 1 FAMC @F652@ 0 @I2700@ INDI 1 NAME Alexandrine Louise // 1 SEX F 1 BIRT 2 DATE 1914 1 DEAT 2 DATE 1962 1 FAMC @F652@ 0 @I2701@ INDI 1 NAME Gorm // 1 SEX M 1 BIRT 2 DATE 1919 1 FAMC @F652@ 0 @I2702@ INDI 1 NAME Oluf of_Rosenborg // 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1923 1 FAMS @F1280@ 1 FAMC @F652@ 0 @I2703@ INDI 1 NAME Helen /Dorrit/ 1 SEX F 1 BIRT 2 DATE 1926 1 FAMS @F1280@ 0 @I2704@ INDI 1 NAME Inge /Terney/ 1 SEX F 1 BIRT 2 DATE 1938 1 FAMS @F1281@ 0 @I2705@ INDI 1 NAME Charles Augustus /Haraldsen/ 1 SEX M 1 FAMS @F1282@ 0 @I2706@ INDI 1 NAME Guelph /Hanover/ 1 SEX M 1 BIRT 2 DATE 1947 1 DEAT 2 DATE 1981 1 FAMS @F1283@ 1 FAMC @F391@ 0 @I2707@ INDI 1 NAME George /Hanover/ 1 SEX M 1 BIRT 2 DATE 1949 1 FAMS @F1284@ 1 FAMC @F391@ 0 @I2708@ INDI 1 NAME Fredericka /Hanover/ 1 SEX F 1 BIRT 2 DATE 1954 1 FAMC @F391@ 0 @I2709@ INDI 1 NAME Wilbeke /von_Gunsteren/ 1 SEX F 1 BIRT 2 DATE 1948 1 FAMS @F1283@ 0 @I2710@ INDI 1 NAME Victoria /Bee/ 1 SEX F 1 BIRT 2 DATE 1951 1 FAMS @F1284@ 0 @I2711@ INDI 1 NAME Caroline Louise /Hanover/ 1 SEX F 1 BIRT 2 DATE 1965 1 FAMC @F389@ 0 @I2712@ INDI 1 NAME Mireille /Hanover/ 1 SEX F 1 BIRT 2 DATE 1971 1 FAMC @F389@ 0 @I2713@ INDI 1 NAME John Kenneth /Ambler/ 1 SEX M 1 BIRT 2 DATE 6 JUN 1924 1 FAMS @F1285@ 0 @I2714@ INDI 1 NAME Sybilla Louise // 1 SEX F 1 BIRT 2 DATE 14 APR 1965 1 FAMC @F1285@ 0 @I2715@ INDI 1 NAME Charles Edward // 1 SEX M 1 BIRT 2 DATE 14 JUL 1966 1 FAMC @F1285@ 0 @I2716@ INDI 1 NAME James Patrick // 1 SEX M 1 BIRT 2 DATE 10 JUN 1969 1 FAMC @F1285@ 0 @I2717@ INDI 1 NAME Johann Georg of_Hohenzollern// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 31 JUL 1932 1 FAMS @F1286@ 0 @I2718@ INDI 1 NAME Carl Christian // 1 SEX M 1 BIRT 2 DATE 5 APR 1962 1 FAMC @F1286@ 0 @I2719@ INDI 1 NAME Desiree Margaretha Victoria// 1 SEX F 1 BIRT 2 DATE 27 NOV 1963 1 FAMC @F1286@ 0 @I2720@ INDI 1 NAME Hubertus Gustaf Adolf// 1 SEX M 1 BIRT 2 DATE 10 JUN 1966 1 FAMC @F1286@ 0 @I2721@ INDI 1 NAME Nicholas /Silfverschiold/ 1 TITL Baron 1 SEX M 1 BIRT 2 DATE 31 MAY 1934 1 FAMS @F1287@ 0 @I2722@ INDI 1 NAME Carl Otto Edmund// 1 SEX M 1 BIRT 2 DATE 22 MAR 1965 1 FAMC @F1287@ 0 @I2723@ INDI 1 NAME Christina Louise // 1 SEX F 1 BIRT 2 DATE 29 SEP 1966 1 FAMC @F1287@ 0 @I2724@ INDI 1 NAME Helene Ingeborg // 1 SEX F 1 BIRT 2 DATE 20 SEP 1968 1 FAMC @F1287@ 0 @I2725@ INDI 1 NAME Tord Gosta /Magnuson/ 1 SEX M 1 BIRT 2 DATE 7 APR 1941 1 FAMS @F1288@ 0 @I2726@ INDI 1 NAME Carl Gustaf Victor// 1 SEX M 1 BIRT 2 DATE 8 AUG 1975 1 FAMC @F1288@ 0 @I2727@ INDI 1 NAME Tord Oscar Fredrik// 1 SEX M 1 BIRT 2 DATE 20 JUN 1977 1 FAMC @F1288@ 0 @I2728@ INDI 1 NAME Victor Edmund Lennart// 1 SEX M 1 BIRT 2 DATE 10 SEP 1980 1 FAMC @F1288@ 0 @I2729@ INDI 1 NAME Madeleine Therese Amelie// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 10 JUN 1982 1 FAMC @F220@ 0 @I2730@ INDI 1 NAME Marianne of_Wisborg /Lindberg/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 15 JUL 1924 1 FAMS @F1289@ 0 @I2731@ INDI 1 NAME Lilian May of_Sweden/Davies/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 30 AUG 1915 1 FAMS @F1290@ 0 @I2732@ INDI 1 NAME Erika /Patzek/ 1 SEX F 1 BIRT 2 DATE 1911 2 PLAC ,Germany 1 FAMS @F1291@ 0 @I2733@ INDI 1 NAME Sonia /Robbert/ 1 SEX F 1 BIRT 2 DATE 1909 1 FAMS @F1292@ 0 @I2734@ INDI 1 NAME Elin Kerstin Margareta/Wijkmark/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 4 MAR 1910 1 DEAT 2 DATE 11 SEP 1987 1 FAMS @F1293@ 0 @I2735@ INDI 1 NAME Gunnila Martha Louise/Wachtmeister/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 12 MAY 1923 1 FAMS @F1294@ 0 @I2736@ INDI 1 NAME Karin Emma Louise/Nissvandt/ 1 SEX F 1 BIRT 2 DATE 7 JUL 1911 2 PLAC Nora,Sweden 1 FAMS @F1295@ 0 @I2737@ INDI 1 NAME Sonja Anita Maria/Hauntz/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 7 MAY 1944 1 FAMS @F1296@ 0 @I2738@ INDI 1 NAME Carl Gustaf Oscar// 1 TITL Prince of Sweden 1 SEX M 1 BIRT 2 DATE 10 JAN 1911 1 FAMS @F1327@ 1 FAMS @F1329@ 1 FAMS @F1297@ 1 FAMC @F215@ 0 @I2739@ INDI 1 NAME Kristine /Rivelsrud/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 22 APR 1932 1 FAMS @F1297@ 0 @I2740@ INDI 1 NAME Michael // 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1944 1 FAMS @F1298@ 1 FAMC @F1292@ 0 @I2741@ INDI 1 NAME Christine /Wellhoefer/ 1 SEX F 1 BIRT 2 DATE 1947 1 FAMS @F1298@ 0 @I2742@ INDI 1 NAME Monica // 1 SEX F 1 BIRT 2 DATE 1948 1 FAMS @F1299@ 1 FAMC @F1293@ 0 @I2743@ INDI 1 NAME Christian // 1 SEX M 1 BIRT 2 DATE 1949 1 FAMC @F1293@ 0 @I2744@ INDI 1 NAME Johan /Bonde/ 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1950 1 FAMS @F1299@ 0 @I2745@ INDI 1 NAME Birgitta // 1 SEX F 1 BIRT 2 DATE 1933 1 FAMS @F1300@ 1 FAMC @F1295@ 0 @I2746@ INDI 1 NAME Marie Louise // 1 SEX F 1 BIRT 2 DATE 1935 1 FAMS @F1301@ 1 FAMC @F1295@ 0 @I2747@ INDI 1 NAME Jan // 1 SEX M 1 BIRT 2 DATE 1941 1 FAMS @F1302@ 1 FAMS @F1303@ 1 FAMS @F1304@ 1 FAMS @F1305@ 1 FAMC @F1295@ 0 @I2748@ INDI 1 NAME Cecilia // 1 SEX F 1 BIRT 2 DATE 1944 1 FAMS @F1306@ 1 FAMC @F1295@ 0 @I2749@ INDI 1 NAME Friedrich /Straehl/ 1 SEX M 1 BIRT 2 DATE 1922 1 FAMS @F1300@ 0 @I2750@ INDI 1 NAME Friedrich /Straehl/ 1 SEX M 1 BIRT 2 DATE 1956 1 FAMC @F1300@ 0 @I2751@ INDI 1 NAME Andreas /Straehl/ 1 SEX M 1 BIRT 2 DATE 1957 1 FAMC @F1300@ 0 @I2752@ INDI 1 NAME Christina /Straehl/ 1 SEX F 1 BIRT 2 DATE 1960 1 FAMC @F1300@ 0 @I2753@ INDI 1 NAME Desiree /Straehl/ 1 SEX F 1 BIRT 2 DATE 1961 1 FAMC @F1300@ 0 @I2754@ INDI 1 NAME Stephan /Straehl/ 1 SEX M 1 BIRT 2 DATE 1964 1 FAMC @F1300@ 0 @I2755@ INDI 1 NAME Rudolf /Kautz/ 1 SEX M 1 BIRT 2 DATE 1930 1 FAMS @F1301@ 0 @I2756@ INDI 1 NAME Heinrich /Kautz/ 1 SEX M 1 BIRT 2 DATE 1957 1 FAMC @F1301@ 0 @I2757@ INDI 1 NAME Karin /Kautz/ 1 SEX F 1 BIRT 2 DATE 1958 1 FAMC @F1301@ 0 @I2758@ INDI 1 NAME Madeleine /Kautz/ 1 SEX F 1 BIRT 2 DATE 1961 1 FAMC @F1301@ 0 @I2759@ INDI 1 NAME Gunilla /Stampe/ 1 SEX F 1 BIRT 2 DATE 1941 1 FAMS @F1302@ 0 @I2760@ INDI 1 NAME Anna /Skarne/ 1 SEX F 1 BIRT 2 DATE 1944 1 FAMS @F1303@ 0 @I2761@ INDI 1 NAME Sophia // 1 SEX F 1 BIRT 2 DATE 1968 1 FAMC @F1303@ 0 @I2762@ INDI 1 NAME Annegret /Thomssen/ 1 SEX F 1 BIRT 2 DATE 1938 1 FAMS @F1304@ 0 @I2763@ INDI 1 NAME Cecilia // 1 SEX F 1 BIRT 2 DATE 1971 1 FAMC @F1304@ 0 @I2764@ INDI 1 NAME Maritta /Berg/ 1 SEX F 1 BIRT 2 DATE 1953 1 FAMS @F1305@ 0 @I2765@ INDI 1 NAME Son // 1 SEX M 1 BIRT 2 DATE 1977 1 FAMC @F1305@ 0 @I2766@ INDI 1 NAME Hans-Jorg /Baenkler/ 1 SEX M 1 BIRT 2 DATE 1939 1 FAMS @F1306@ 0 @I2767@ INDI 1 NAME Bettina // 1 SEX F 1 BIRT 2 DATE 1974 1 FAMC @F1296@ 0 @I2768@ INDI 1 NAME Bjorn // 1 SEX M 1 BIRT 2 DATE 1975 1 FAMC @F1296@ 0 @I2769@ INDI 1 NAME Catherina // 1 SEX F 1 BIRT 2 DATE 1977 1 FAMC @F1296@ 0 @I2770@ INDI 1 NAME Oscar // 1 TITL Count of Wisborg 1 SEX M 1 BIRT 2 DATE 1859 1 DEAT 2 DATE 1953 1 FAMS @F1307@ 1 FAMC @F156@ 0 @I2771@ INDI 1 NAME Eugene // 1 TITL Duke of Narke 1 SEX M 1 BIRT 2 DATE 1865 1 DEAT 2 DATE 1947 1 FAMC @F156@ 0 @I2772@ INDI 1 NAME Ebba of_Fulkila /Munck/ 1 SEX F 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1946 1 FAMS @F1307@ 1 FAMC @F1308@ 0 @I2773@ INDI 1 NAME Maria Bernadotte // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1889 1 DEAT 2 DATE 1974 1 FAMC @F1307@ 0 @I2774@ INDI 1 NAME Carl Bernadotte // 1 TITL Count of Wisborg 1 SEX M 1 BIRT 2 DATE 1890 1 DEAT 2 DATE 1977 1 FAMS @F1309@ 1 FAMS @F1320@ 1 FAMC @F1307@ 0 @I2775@ INDI 1 NAME Sophia Bernadotte of_Wisborg// 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1892 1 DEAT 2 DATE 1936 1 FAMS @F1322@ 1 FAMC @F1307@ 0 @I2776@ INDI 1 NAME Elsa Bernadotte of_Wisborg// 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1893 1 FAMS @F1323@ 1 FAMC @F1307@ 0 @I2777@ INDI 1 NAME Folke Bernadotte // 1 TITL Count of Wisborg 1 SEX M 1 BIRT 2 DATE 1895 1 DEAT 2 DATE 1948 1 FAMS @F1324@ 1 FAMC @F1307@ 0 @I2778@ INDI 1 NAME Charles of_Fulkila /Munck/ 1 SEX M 1 FAMS @F1308@ 0 @I2779@ INDI 1 NAME Marianne of_Leufsta /de_Geer/ 1 TITL Baroness 1 SEX F 1 BIRT 2 DATE 1893 1 FAMS @F1309@ 0 @I2780@ INDI 1 NAME Dagmar // 1 SEX F 1 BIRT 2 DATE 1916 1 FAMS @F1310@ 1 FAMC @F1309@ 0 @I2781@ INDI 1 NAME Oscar // 1 SEX M 1 BIRT 2 DATE 1921 1 FAMS @F1315@ 1 FAMS @F1317@ 1 FAMC @F1309@ 0 @I2782@ INDI 1 NAME Catharina // 1 SEX F 1 BIRT 2 DATE 1926 1 FAMS @F1319@ 1 FAMC @F1309@ 0 @I2783@ INDI 1 NAME Nils Magnus /von_Arbin/ 1 SEX M 1 BIRT 2 DATE 1910 1 FAMS @F1310@ 0 @I2784@ INDI 1 NAME Marianne /von_Arbin/ 1 SEX F 1 BIRT 2 DATE 1937 1 FAMS @F1311@ 1 FAMC @F1310@ 0 @I2785@ INDI 1 NAME Louise /von_Arbin/ 1 SEX F 1 BIRT 2 DATE 1940 1 FAMS @F1312@ 1 FAMC @F1310@ 0 @I2786@ INDI 1 NAME Catherine /von_Arbin/ 1 SEX F 1 BIRT 2 DATE 1946 1 FAMS @F1313@ 1 FAMC @F1310@ 0 @I2787@ INDI 1 NAME Jeanette /von_Arbin/ 1 SEX F 1 BIRT 2 DATE 1951 1 FAMS @F1314@ 1 FAMC @F1310@ 0 @I2788@ INDI 1 NAME Madeleine /von_Arbin/ 1 SEX F 1 BIRT 2 DATE 1955 1 FAMC @F1310@ 0 @I2789@ INDI 1 NAME Miles /Flach/ 1 TITL Capt. 1 SEX M 1 BIRT 2 DATE 1934 1 FAMS @F1311@ 0 @I2790@ INDI 1 NAME Camilla /Flach/ 1 SEX F 1 BIRT 2 DATE 1960 1 FAMC @F1311@ 0 @I2791@ INDI 1 NAME Dick /Bergstrom/ 1 SEX M 1 BIRT 2 DATE 1936 1 FAMS @F1312@ 0 @I2792@ INDI 1 NAME Therese /Bergstrom/ 1 SEX F 1 BIRT 2 DATE 1963 1 FAMC @F1312@ 0 @I2793@ INDI 1 NAME Michael /Bergstrom/ 1 SEX M 1 BIRT 2 DATE 1965 1 FAMC @F1312@ 0 @I2794@ INDI 1 NAME Johan /Ryding/ 1 SEX M 1 BIRT 2 DATE 1943 1 FAMS @F1313@ 0 @I2795@ INDI 1 NAME Gustaf /Ryding/ 1 SEX M 1 BIRT 2 DATE 1971 1 FAMC @F1313@ 0 @I2796@ INDI 1 NAME Charlotte /Ryding/ 1 SEX F 1 BIRT 2 DATE 1974 1 FAMC @F1313@ 0 @I2797@ INDI 1 NAME Esben /Coljach/ 1 SEX M 1 BIRT 2 DATE 1947 1 FAMS @F1314@ 0 @I2798@ INDI 1 NAME Ebba /Gyllenkrok/ 1 SEX F 1 BIRT 2 DATE 1918 1 FAMS @F1315@ 0 @I2799@ INDI 1 NAME Ebba // 1 SEX F 1 BIRT 2 DATE 1945 1 FAMS @F1316@ 1 FAMC @F1315@ 0 @I2800@ INDI 1 NAME Pontus /Reutersward/ 1 SEX M 1 BIRT 2 DATE 1943 1 FAMS @F1316@ 0 @I2801@ INDI 1 NAME Gustaf /Reutersward/ 1 SEX M 1 BIRT 2 DATE 1971 1 FAMC @F1316@ 0 @I2802@ INDI 1 NAME Anna /Reutersward/ 1 SEX F 1 BIRT 2 DATE 1973 1 FAMC @F1316@ 0 @I2803@ INDI 1 NAME Gertrude /Ollen/ 1 SEX F 1 BIRT 2 DATE 1916 1 FAMS @F1317@ 0 @I2804@ INDI 1 NAME Christina // 1 SEX F 1 BIRT 2 DATE 1951 1 FAMS @F1318@ 1 FAMC @F1317@ 0 @I2805@ INDI 1 NAME Peter /Langenskiold/ 1 TITL Baron 1 SEX M 1 BIRT 2 DATE 1950 1 FAMS @F1318@ 0 @I2806@ INDI 1 NAME Birgitta // 1 SEX F 1 BIRT 2 DATE 1953 1 FAMC @F1317@ 0 @I2807@ INDI 1 NAME Carl // 1 SEX M 1 BIRT 2 DATE 1955 1 FAMC @F1317@ 0 @I2808@ INDI 1 NAME Tore /Nilert/ 1 SEX M 1 BIRT 2 DATE 1915 1 FAMS @F1319@ 0 @I2809@ INDI 1 NAME Jan /Nilert/ 1 SEX M 1 BIRT 2 DATE 1950 1 FAMC @F1319@ 0 @I2810@ INDI 1 NAME Charlotte /Nilert/ 1 SEX F 1 BIRT 2 DATE 1952 1 FAMC @F1319@ 0 @I2811@ INDI 1 NAME Anne Marie /Nilert/ 1 SEX F 1 BIRT 2 DATE 1954 1 FAMC @F1319@ 0 @I2812@ INDI 1 NAME Gerty /Borjesson/ 1 SEX F 1 BIRT 2 DATE 1910 1 FAMS @F1320@ 0 @I2813@ INDI 1 NAME Claes // 1 SEX M 1 BIRT 2 DATE 1942 1 FAMS @F1321@ 1 FAMC @F1320@ 0 @I2814@ INDI 1 NAME Birgitta /Magnusson/ 1 SEX F 1 BIRT 2 DATE 1943 1 FAMS @F1321@ 0 @I2815@ INDI 1 NAME Carl Johann // 1 SEX M 1 BIRT 2 DATE 1970 1 FAMC @F1321@ 0 @I2816@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1973 1 FAMC @F1321@ 0 @I2817@ INDI 1 NAME Carl Marten /Fleetwood/ 1 TITL Baron 1 SEX M 1 BIRT 2 DATE 1885 1 DEAT 2 DATE 1966 1 FAMS @F1322@ 0 @I2818@ INDI 1 NAME Hugo /Cedergren/ 1 SEX M 1 BIRT 2 DATE 1891 1 DEAT 2 DATE 1971 1 FAMS @F1323@ 0 @I2819@ INDI 1 NAME Estelle /Manville/ 1 SEX F 1 BIRT 2 DATE 1904 1 FAMS @F1324@ 0 @I2820@ INDI 1 NAME Gustaf // 1 SEX M 1 BIRT 2 DATE 1930 1 DEAT 2 DATE 1966 1 FAMC @F1324@ 0 @I2821@ INDI 1 NAME Folke // 1 SEX M 1 BIRT 2 DATE 1931 1 FAMS @F1325@ 1 FAMC @F1324@ 0 @I2822@ INDI 1 NAME Fredrik Oscar // 1 SEX M 1 BIRT 2 DATE 1934 1 DEAT 2 DATE 1934 1 FAMC @F1324@ 0 @I2823@ INDI 1 NAME Bertil // 1 SEX M 1 BIRT 2 DATE 1925 1 FAMC @F1324@ 0 @I2824@ INDI 1 NAME Christine /Glahns/ 1 SEX F 1 BIRT 2 DATE 1932 1 FAMS @F1325@ 0 @I2825@ INDI 1 NAME Anna // 1 SEX F 1 BIRT 2 DATE 1956 1 FAMC @F1325@ 0 @I2826@ INDI 1 NAME Folke // 1 SEX M 1 BIRT 2 DATE 1958 1 FAMC @F1325@ 0 @I2827@ INDI 1 NAME Maria // 1 SEX F 1 BIRT 2 DATE 1962 1 FAMC @F1325@ 0 @I2828@ INDI 1 NAME Gunnar // 1 SEX M 1 BIRT 2 DATE 1963 1 FAMC @F1325@ 0 @I2829@ INDI 1 NAME Margaretha // 1 SEX F 1 BIRT 2 DATE 1899 1 DEAT 2 DATE 1977 1 FAMS @F1326@ 1 FAMC @F215@ 0 @I2830@ INDI 1 NAME Axel of_Denmark // 1 SEX M 1 FAMS @F1326@ 0 @I2831@ INDI 1 NAME Elsa /von_Rosen/ 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1904 1 FAMS @F1327@ 0 @I2832@ INDI 1 NAME Madeline Bernadotte // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1938 1 FAMS @F1328@ 1 FAMC @F1327@ 0 @I2833@ INDI 1 NAME Charles de_Schooten /Ullens/ 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1927 1 FAMS @F1328@ 0 @I2834@ INDI 1 NAME Marie Christine /Ullens/ 1 SEX F 1 BIRT 2 DATE 1964 1 FAMC @F1328@ 0 @I2835@ INDI 1 NAME Jean Charles /Ullens/ 1 SEX M 1 BIRT 2 DATE 1965 1 FAMC @F1328@ 0 @I2836@ INDI 1 NAME Astrid /Ullens/ 1 SEX F 1 BIRT 2 DATE 1970 1 FAMC @F1328@ 0 @I2837@ INDI 1 NAME Sophie /Ullens/ 1 SEX F 1 BIRT 2 DATE 1972 1 FAMC @F1328@ 0 @I2838@ INDI 1 NAME Ann /Larsson/ 1 SEX F 1 BIRT 2 DATE 1921 1 FAMS @F1329@ 0 @I2839@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 1882 1 DEAT 2 DATE 1962 1 FAMS @F1276@ 1 FAMC @F1330@ 0 @I2840@ INDI 1 NAME Roland /Bonaparte/ 1 TITL Prince 1 SEX M 1 FAMS @F1330@ 0 @I2841@ INDI 1 NAME Irene /Ovchinnikov/ 1 SEX F 1 BIRT 2 DATE 1904 1 FAMS @F1331@ 0 @I2842@ INDI 1 NAME Eugenia /Oldenburg/ 1 SEX F 1 BIRT 2 DATE 1910 1 FAMS @F1332@ 1 FAMS @F1333@ 1 FAMC @F1276@ 0 @I2843@ INDI 1 NAME Dominic /Radziwill/ 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1911 1 DEAT 2 DATE 1976 1 FAMS @F1332@ 0 @I2844@ INDI 1 NAME Raymond of_Castel // 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1907 1 FAMS @F1333@ 0 @I2845@ INDI 1 NAME Anastasia /Stewart/ 1 SEX F 1 BIRT 2 DATE 1883 1 DEAT 2 DATE 1923 1 FAMS @F1334@ 0 @I2846@ INDI 1 NAME Francis of_Guise // 1 SEX F 1 BIRT 2 DATE 1902 1 DEAT 2 DATE 1953 1 FAMS @F1335@ 0 @I2847@ INDI 1 NAME Perikles Joannides // 1 SEX M 1 BIRT 2 DATE 1881 1 DEAT 2 DATE 1965 1 FAMS @F1336@ 0 @I2848@ INDI 1 NAME Michael /Oldenburg/ 1 SEX M 1 BIRT 2 DATE 1939 1 FAMS @F1337@ 1 FAMC @F1334@ 0 @I2849@ INDI 1 NAME Marina /Karella/ 1 SEX F 1 BIRT 2 DATE 1940 1 FAMS @F1337@ 0 @I2850@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1726 1 DEAT 2 DATE 1756 1 FAMS @F1338@ 1 FAMC @F631@ 0 @I2851@ INDI 1 NAME Ernest Frederick_III of_Saxe-// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1727 1 DEAT 2 DATE 1780 1 FAMS @F1338@ 0 @I2852@ INDI 1 NAME Gustaf_III // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 1746 1 DEAT 2 DATE 1792 1 FAMS @F1339@ 0 @I2853@ INDI 1 NAME William_I of_Hesse-Cassel // 1 TITL Elector 1 SEX M 1 BIRT 2 DATE 1743 1 DEAT 2 DATE 1821 1 FAMS @F1340@ 0 @I2854@ INDI 1 NAME Charles // 1 SEX M 1 BIRT 2 DATE 1680 1 DEAT 2 DATE 1729 1 FAMC @F634@ 0 @I2855@ INDI 1 NAME William // 1 SEX M 1 BIRT 2 DATE 1687 1 DEAT 2 DATE 1705 1 FAMC @F634@ 0 @I2856@ INDI 1 NAME Anne Sophia // 1 SEX F 1 BIRT 2 DATE 1647 1 DEAT 2 DATE 1717 1 FAMC @F637@ 0 @I2857@ INDI 1 NAME Frederica // 1 SEX F 1 BIRT 2 DATE 1649 1 DEAT 2 DATE 1704 1 FAMC @F637@ 0 @I2858@ INDI 1 NAME Ulrica // 1 SEX F 1 BIRT 2 DATE 1656 1 DEAT 2 DATE 1693 1 FAMS @F1341@ 1 FAMC @F637@ 0 @I2859@ INDI 1 NAME Charles_XI // 1 TITL King of Sweden 1 SEX M 1 BIRT 2 DATE 1655 1 DEAT 2 DATE 1697 1 FAMS @F1341@ 0 @I2860@ INDI 1 NAME Ulrich // 1 SEX M 1 BIRT 2 DATE 1578 1 DEAT 2 DATE 1624 1 FAMC @F268@ 0 @I2861@ INDI 1 NAME Augusta // 1 SEX F 1 BIRT 2 DATE 1580 1 DEAT 2 DATE 1639 1 FAMC @F268@ 0 @I2862@ INDI 1 NAME Hedwig // 1 SEX F 1 BIRT 2 DATE 1581 1 DEAT 2 DATE 1641 1 FAMC @F268@ 0 @I2863@ INDI 1 NAME Christopher_III // 1 TITL King of Denmark 1 SEX M 1 BIRT 2 DATE 1416 1 DEAT 2 DATE 1448 1 FAMS @F1342@ 0 @I2864@ INDI 1 NAME Christina // 1 SEX F 1 BIRT 2 DATE 1461 1 DEAT 2 DATE 1521 1 FAMS @F1343@ 0 @I2865@ INDI 1 NAME Anne /de_la_Tour/ 1 SEX F 1 BIRT 2 DATE 1512 1 FAMS @F1344@ 0 @I2866@ INDI 1 NAME Alexander // 1 TITL Bishop of Moray 1 SEX M 1 BIRT 2 DATE 1534 1 FAMC @F553@ 0 @I2867@ INDI 1 NAME James // 1 TITL Duke of Ross 1 SEX M 1 BIRT 2 DATE 1476 1 DEAT 2 DATE 1503 1 FAMC @F460@ 0 @I2868@ INDI 1 NAME John // 1 TITL Earl of Mar 1 SEX M 1 BIRT 2 DATE 1479 1 DEAT 2 DATE 1503 1 FAMC @F460@ 0 @I2869@ INDI 1 NAME Edward // 1 TITL Earl of Carrick 1 SEX M 1 DEAT 2 DATE 1318 1 FAMC @F740@ 0 @I2870@ INDI 1 NAME Thomas // 1 SEX M 1 DEAT 2 DATE 1307 1 FAMC @F740@ 0 @I2871@ INDI 1 NAME Alexander // 1 SEX M 1 DEAT 2 DATE 1307 1 FAMC @F740@ 0 @I2872@ INDI 1 NAME Nigel // 1 SEX M 1 DEAT 2 DATE 1306 1 FAMC @F740@ 0 @I2873@ INDI 1 NAME Isabel // 1 SEX F 1 BIRT 2 DATE 1358 1 FAMC @F740@ 0 @I2874@ INDI 1 NAME Mary Christina of_Sicily// 1 SEX F 1 BIRT 2 DATE 1806 1 DEAT 2 DATE 1878 1 FAMS @F454@ 0 @I2875@ INDI 1 NAME Antonia of_Sicily // 1 SEX F 1 BIRT 2 DATE 1784 1 DEAT 2 DATE 1806 1 FAMS @F1345@ 0 @I2876@ INDI 1 NAME Isabella of_Portugal // 1 SEX F 1 BIRT 2 DATE 1797 1 DEAT 2 DATE 1818 1 FAMS @F1346@ 0 @I2877@ INDI 1 NAME Mary Josepha // 1 SEX F 1 BIRT 2 DATE 1803 1 DEAT 2 DATE 1829 1 FAMS @F1347@ 0 @I2878@ INDI 1 NAME Charles_IV // 1 SEX M 1 BIRT 2 DATE 1748 1 DEAT 2 DATE 1819 1 FAMS @F1348@ 1 FAMC @F1349@ 0 @I2879@ INDI 1 NAME Maria Louisa of_Parma// 1 SEX F 1 BIRT 2 DATE 1751 1 DEAT 2 DATE 1819 1 FAMS @F1348@ 0 @I2880@ INDI 1 NAME Charles_III // 1 TITL King of Spain 1 SEX M 1 BIRT 2 DATE 1716 1 DEAT 2 DATE 1788 1 FAMS @F1349@ 1 FAMC @F1142@ 0 @I2881@ INDI 1 NAME Mary Amalia // 1 SEX F 1 BIRT 2 DATE 1724 1 DEAT 2 DATE 1760 1 FAMS @F1349@ 0 @I2882@ INDI 1 NAME Mary Anne of_Bavaria// 1 SEX F 1 BIRT 2 DATE 1660 1 DEAT 2 DATE 1690 1 FAMS @F1143@ 0 @I2883@ INDI 1 NAME Mary Louise // 1 SEX F 1 BIRT 2 DATE 1688 1 DEAT 2 DATE 1714 1 FAMS @F1350@ 0 @I2884@ INDI 1 NAME Charles // 1 TITL Duke of Styria 1 SEX M 1 BIRT 2 DATE 1540 1 DEAT 2 DATE 1590 1 FAMS @F1351@ 0 @I2885@ INDI 1 NAME Philip_I the_Handsome // 1 TITL King of Castile 1 SEX M 1 BIRT 2 DATE 1478 2 PLAC Bruges,Flanders 1 DEAT 2 DATE 1506 1 FAMS @F1352@ 0 @I2886@ INDI 1 NAME Germaine of_Narbonne // 1 SEX F 1 DEAT 2 DATE 1536 1 FAMS @F1353@ 0 @I2887@ INDI 1 NAME Isabella // 1 SEX F 1 BIRT 2 DATE 1470 1 DEAT 2 DATE 1498 1 FAMS @F1354@ 1 FAMS @F1355@ 1 FAMC @F320@ 0 @I2888@ INDI 1 NAME Mary // 1 SEX F 1 BIRT 2 DATE 1482 1 DEAT 2 DATE 1517 1 FAMC @F320@ 0 @I2889@ INDI 1 NAME John // 1 SEX M 1 BIRT 2 DATE 1478 1 DEAT 2 DATE 1497 1 FAMS @F1356@ 1 FAMC @F320@ 0 @I2890@ INDI 1 NAME Alphonso of_Portugal // 1 SEX M 1 BIRT 2 DATE 1475 1 DEAT 2 DATE 1491 1 FAMS @F1354@ 0 @I2891@ INDI 1 NAME Emanuel // 1 TITL King of Portugal 1 SEX M 1 BIRT 2 DATE 1469 1 DEAT 2 DATE 1521 1 FAMS @F1358@ 0 @I2892@ INDI 1 NAME Margaret // 1 SEX F 1 BIRT 2 DATE 1480 1 DEAT 2 DATE 1530 1 FAMS @F1356@ 1 FAMS @F1357@ 0 @I2893@ INDI 1 NAME Philibert_II // 1 TITL Duke of Savoy 1 SEX M 1 DEAT 2 DATE 1504 1 FAMS @F1357@ 0 @I2894@ INDI 1 NAME Eleanor // 1 SEX F 1 BIRT 2 DATE 1498 1 DEAT 2 DATE 1558 1 FAMS @F1358@ 1 FAMS @F1359@ 1 FAMC @F1352@ 0 @I2895@ INDI 1 NAME Henry_XXIV Reuss-Ebersdorf // 1 TITL Count 1 SEX M 1 BIRT 2 DATE 1724 1 DEAT 2 DATE 1779 1 FAMS @F1228@ 0 @I2896@ INDI 1 NAME Caroline Erbach-Schonberg // 1 TITL Countess 1 SEX F 1 BIRT 2 DATE 1727 1 DEAT 2 DATE 1795 1 FAMS @F1228@ 0 @I2897@ INDI 1 NAME Ernest Frederick of_Saxe-Coburg// 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1724 1 DEAT 2 DATE 1800 1 FAMS @F1360@ 0 @I2898@ INDI 1 NAME Sophia Antonia of_Brunswick// 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 1724 1 DEAT 2 DATE 1802 1 FAMS @F1360@ 0 @I2899@ INDI 1 NAME Michael of_Portugal // 1 TITL Prince 1 SEX M 1 FAMS @F1361@ 0 @I2900@ INDI 1 NAME Emanuel of_Orleans // 1 TITL Duke of Vendome 1 SEX M 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1931 1 FAMS @F1362@ 0 @I2901@ INDI 1 NAME Louise // 1 SEX F 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1924 1 FAMS @F1366@ 1 FAMC @F1154@ 0 @I2902@ INDI 1 NAME Stephanie // 1 SEX F 1 BIRT 2 DATE 1864 1 DEAT 2 DATE 1945 1 FAMS @F1364@ 1 FAMS @F1365@ 1 FAMC @F1154@ 0 @I2903@ INDI 1 NAME Clementine // 1 SEX F 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1955 1 FAMS @F1363@ 1 FAMC @F1154@ 0 @I2904@ INDI 1 NAME Victor // 1 TITL Prince Napoleon 1 SEX M 1 BIRT 2 DATE 1862 1 DEAT 2 DATE 1926 1 FAMS @F1363@ 0 @I2905@ INDI 1 NAME Rudolph of_Austria // 1 TITL Crown Prince 1 SEX M 1 BIRT 2 DATE 1858 1 DEAT 2 DATE 1889 1 FAMS @F1364@ 0 @I2906@ INDI 1 NAME Elemer // 1 TITL Prince Lonyai 1 SEX M 1 BIRT 2 DATE 1863 1 DEAT 2 DATE 1946 1 FAMS @F1365@ 0 @I2907@ INDI 1 NAME Philip of_Saxe-Coburg // 1 TITL Prince 1 SEX M 1 BIRT 2 DATE 1844 1 DEAT 2 DATE 1921 1 FAMS @F1366@ 0 @I2908@ INDI 1 NAME Sophia // 1 SEX F 1 BIRT 2 DATE 1760 1 DEAT 2 DATE 1776 1 FAMS @F1367@ 0 @I2909@ INDI 1 NAME Alexandrine of_Baden // 1 SEX F 1 BIRT 2 DATE 1820 1 DEAT 2 DATE 1904 1 FAMS @F1369@ 0 @I2910@ INDI 1 NAME Antoinette (Antonia) /Kohary/ 1 SEX F 1 BIRT 2 DATE 1797 1 DEAT 2 DATE 1862 1 FAMS @F1370@ 0 @I2911@ INDI 1 NAME Louis_I of_Hesse-Darmst. // 1 TITL Landgrave 1 SEX M 1 BIRT 2 DATE 1753 1 DEAT 2 DATE 1830 1 FAMS @F1371@ 0 @I2912@ INDI 1 NAME Louise of_Hesse-Darmst. // 1 SEX F 1 BIRT 2 DATE 1761 1 DEAT 2 DATE 1829 1 FAMS @F1371@ 0 @I2913@ INDI 1 NAME Marie Christine // 1 SEX F 1 DEAT 2 DATE 1663 1 FAMC @F271@ 0 @I2914@ INDI 1 NAME Marie de_Bourbon // 1 SEX F 1 FAMS @F1372@ 0 @I2915@ INDI 1 NAME Ann Marie Louise// 1 TITL Duchess 1 SEX F 1 BIRT 2 DATE 1627 1 DEAT 2 DATE 1693 1 FAMC @F1372@ 0 @I2916@ INDI 1 NAME Elizabeth Charlotte of_Bavaria// 1 SEX F 1 BIRT 2 DATE 1652 1 DEAT 2 DATE 1722 1 FAMS @F1373@ 0 @I2917@ INDI 1 NAME Elizabeth Charlotte // 1 SEX F 1 BIRT 2 DATE 1676 1 FAMS @F1374@ 1 FAMC @F1373@ 0 @I2918@ INDI 1 NAME Leopold Joseph de_Lorraine// 1 TITL Duke 1 SEX M 1 FAMS @F1374@ 0 @I2919@ INDI 1 NAME Francoise Marie de_Blois// 1 TITL Mademoiselle 1 SEX F 1 BIRT 2 DATE 1677 1 DEAT 2 DATE 1749 1 FAMS @F1191@ 0 @I2920@ INDI 1 NAME Marie Adelaide of_Savoy// 1 SEX F 1 BIRT 2 DATE 1685 1 DEAT 2 DATE 1712 1 FAMS @F344@ 0 @I2921@ INDI 1 NAME Marie Louise of_Orleans// 1 SEX F 1 BIRT 2 DATE 1695 1 DEAT 2 DATE 1715 1 FAMS @F1375@ 1 FAMC @F1191@ 0 @I2922@ INDI 1 NAME Ivan of_Shestov // 1 SEX M 1 FAMS @F1376@ 0 @I2923@ INDI 1 NAME Ivan /Rayevski/ 1 SEX M 1 FAMS @F1377@ 0 @I2924@ INDI 1 NAME Constantine /Volkonski/ 1 SEX M 1 FAMS @F1378@ 0 @I2925@ INDI 1 NAME Zenaida /Rashevska/ 1 SEX F 1 BIRT 2 DATE 1898 1 DEAT 2 DATE 1963 1 FAMS @F1379@ 0 @I2926@ INDI 1 NAME Felix Krzesinski // 1 SEX M 1 FAMS @F1380@ 0 @I2927@ INDI 1 NAME Valerian /Karnovich/ 1 SEX M 1 FAMS @F1382@ 0 @I2928@ INDI 1 NAME John /Emery/ 1 SEX M 1 FAMS @F1383@ 0 @I2929@ INDI 1 NAME Susan /Deptford/ 1 SEX F 1 FAMS @F1384@ 0 @I2930@ INDI 1 NAME Andrew /Ferguson/ 1 SEX M 1 BIRT 2 DATE 1978 1 FAMC @F1384@ 0 @I2931@ INDI 1 NAME Alice /Ferguson/ 1 SEX F 1 BIRT 2 DATE 1980 1 FAMC @F1384@ 0 @I2932@ INDI 1 NAME Elizabeth (Eliza) /Ferguson/ 1 SEX F 1 BIRT 2 DATE 1985 1 FAMC @F1384@ 0 @I2933@ INDI 1 NAME Mervyn Powerscourt /Wingfield/ 1 TITL Viscount 1 SEX M 1 BIRT 2 DATE 1880 1 DEAT 2 DATE 1947 1 FAMS @F1385@ 1 FAMC @F1386@ 0 @I2934@ INDI 1 NAME Mervyn /Wingfield/ 1 SEX M 1 BIRT 2 DATE 1836 1 DEAT 2 DATE 1904 1 FAMS @F1386@ 0 @I2935@ INDI 1 NAME Julia /Coke/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1844 1 DEAT 2 DATE 1931 1 FAMS @F1386@ 1 FAMC @F1399@ 0 @I2936@ INDI 1 NAME Henry Fitzherbert /Wright/ 1 SEX M 1 BIRT 2 DATE 1870 1 DEAT 2 DATE 1947 1 FAMS @F1387@ 0 @I2937@ INDI 1 NAME Muriel /Fletcher/ 1 SEX F 1 BIRT 2 DATE 1873 1 DEAT 2 DATE 1955 1 FAMS @F1387@ 1 FAMC @F1388@ 0 @I2938@ INDI 1 NAME Henry /Fletcher/ 1 TITL Col. 1 SEX M 1 BIRT 2 DATE 1833 1 DEAT 2 DATE 1879 1 FAMS @F1388@ 0 @I2939@ INDI 1 NAME Harriet /Marsham/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1838 1 DEAT 2 DATE 1886 1 FAMS @F1388@ 1 FAMC @F1389@ 0 @I2940@ INDI 1 NAME Charles /Marsham/ 1 TITL Earl of Romney 1 SEX M 1 BIRT 2 DATE 1808 1 DEAT 2 DATE 1874 1 FAMS @F1389@ 0 @I2941@ INDI 1 NAME Margaret -Scott /Montagu-Douglas-/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1811 1 DEAT 2 DATE 1836 1 FAMS @F1389@ 1 FAMC @F1390@ 0 @I2942@ INDI 1 NAME Charles of_Buccleuch /Montagu-Douglas/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1772 1 DEAT 2 DATE 1819 1 FAMS @F1390@ 1 FAMC @F1396@ 0 @I2943@ INDI 1 NAME Walter -Scott of_Buccleuch/Montagu-Douglas-/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1806 1 DEAT 2 DATE 1884 1 FAMS @F1391@ 1 FAMC @F1390@ 0 @I2944@ INDI 1 NAME William -Scott of_Buccleuch/Montagu-Douglas-/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1831 1 DEAT 2 DATE 1914 1 FAMS @F1392@ 1 FAMC @F1391@ 0 @I2945@ INDI 1 NAME Louisa /Hamilton/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1836 1 DEAT 2 DATE 1912 1 FAMS @F1392@ 0 @I2946@ INDI 1 NAME Herbert -Scott /Montagu-Douglas-/ 1 TITL Lord 1 SEX M 1 BIRT 2 DATE 1872 1 DEAT 2 DATE 1944 1 FAMS @F1393@ 1 FAMC @F1392@ 0 @I2947@ INDI 1 NAME Margaret /Brand/ 1 TITL Hon. 1 SEX F 1 BIRT 2 DATE 1873 1 DEAT 2 DATE 1948 1 FAMS @F304@ 1 FAMC @F1394@ 0 @I2948@ INDI 1 NAME Henry /Brand/ 1 TITL Viscount Hampden 1 SEX M 1 BIRT 2 DATE 1941 1 DEAT 2 DATE 1906 1 FAMS @F1394@ 1 FAMC @F1395@ 0 @I2949@ INDI 1 NAME Henry /Brand/ 1 TITL Viscount Hampden 1 SEX M 1 BIRT 2 DATE 1814 1 DEAT 2 DATE 1892 1 FAMS @F1395@ 0 @I2950@ INDI 1 NAME Henry of_Buccleuch /Scott/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1772 1 DEAT 2 DATE 1819 1 FAMS @F1396@ 1 FAMC @F1397@ 0 @I2951@ INDI 1 NAME Francis /Scott/ 1 TITL Earl of Dalkeith 1 SEX M 1 BIRT 2 DATE 1721 1 DEAT 2 DATE 1750 1 FAMS @F1397@ 1 FAMC @F1398@ 0 @I2952@ INDI 1 NAME Francis of_Buccleuch /Scott/ 1 TITL Duke 1 SEX M 1 BIRT 2 DATE 1695 1 DEAT 2 DATE 1751 1 FAMS @F1398@ 0 @I2953@ INDI 1 NAME Thomas of_Leicester /Coke/ 1 TITL Earl 1 SEX M 1 BIRT 2 DATE 1822 1 DEAT 2 DATE 1902 1 FAMS @F1399@ 1 FAMC @F1400@ 0 @I2954@ INDI 1 NAME Thomas of_Leicester /Coke/ 1 TITL Earl 1 SEX M 1 BIRT 2 DATE 1754 1 DEAT 2 DATE 1842 1 FAMS @F1400@ 0 @I2955@ INDI 1 NAME Anne /Keppel/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 1803 1 DEAT 2 DATE 1844 1 FAMS @F1400@ 1 FAMC @F1401@ 0 @I2956@ INDI 1 NAME William of_Albemarle /Keppel/ 1 TITL Earl 1 SEX M 1 BIRT 2 DATE 1724 1 DEAT 2 DATE 1772 1 FAMS @F1401@ 0 @I2957@ INDI 1 NAME Richard // 1 SEX M 1 DEAT 2 DATE 1120 1 FAMC @F506@ 0 @I2958@ INDI 1 NAME Eugenie Victoria Helena/Windsor/ 1 TITL Princess 1 SEX F 1 BIRT 2 DATE 23 MAR 1990 2 PLAC London,England 1 CHR 2 DATE 23 DEC 1990 2 PLAC Sandringham,England 1 FAMC @F53@ 0 @I2959@ INDI 1 NAME Ayesha /Makim/ 1 SEX F 1 BIRT 2 DATE ABT 1986 1 FAMC @F312@ 0 @I2960@ INDI 1 NAME Paul /Mowatt/ 1 SEX M 1 BIRT 2 DATE ABT 1962 1 FAMS @F1402@ 0 @I2961@ INDI 1 NAME /Mowatt/ 1 SEX F 1 BIRT 2 DATE 26 MAY 1990 1 FAMC @F1402@ 0 @I2962@ INDI 1 NAME Victoria /Lockwood/ 1 SEX F 1 BIRT 2 DATE 1964 1 FAMS @F1403@ 0 @I2963@ INDI 1 NAME Kitty // 1 SEX F 1 BIRT 2 DATE ABT 1991 1 FAMC @F1403@ 0 @I2964@ INDI 1 NAME Olga // 1 TITL Princess 1 SEX F 1 FAMS @F1404@ 1 FAMC @F76@ 0 @I2965@ INDI 1 NAME Paul of_Yugoslavia // 1 TITL Prince 1 SEX M 1 FAMS @F1404@ 0 @I2966@ INDI 1 NAME Son // 1 SEX M 1 FAMC @F1404@ 0 @I2967@ INDI 1 NAME Elizabeth // 1 SEX F 1 FAMC @F76@ 0 @I2968@ INDI 1 NAME Peter /Phillips/ 1 TITL Major 1 SEX M 1 FAMS @F1405@ 0 @I2969@ INDI 1 NAME Sylvana /Tomaselli/ 1 SEX F 1 BIRT 2 DATE ABT 1957 2 PLAC Canada 1 FAMS @F1407@ 1 FAMS @F1406@ 1 FAMC @F1408@ 0 @I2970@ INDI 1 NAME John Paul /Jones/ 1 SEX M 1 FAMS @F1407@ 0 @I2971@ INDI 1 NAME Max /Tomaselli/ 1 SEX M 1 BIRT 2 PLAC Austria 1 FAMS @F1408@ 0 @I2972@ INDI 1 NAME Josiane /Derners/ 1 TITL Madame 1 SEX F 1 BIRT 2 PLAC France 1 FAMS @F1408@ 0 @I2973@ INDI 1 NAME Antoinette // 1 SEX F 1 FAMC @F1147@ 0 @I2974@ INDI 1 NAME Sophie // 1 SEX F 1 FAMC @F1147@ 0 @I2975@ INDI 1 NAME Julie // 1 SEX F 1 FAMC @F1147@ 0 @I2976@ INDI 1 NAME Emich Karl of_Leiningen// 1 TITL Prince 1 SEX M 1 BIRT 2 DATE ABT 1762 1 DEAT 2 DATE 1814 1 FAMS @F1409@ 0 @I2977@ INDI 1 NAME Lucy /Lindsay-Hogg/ 1 SEX F 1 FAMS @F1410@ 0 @I2978@ INDI 1 NAME Frances /Armstrong-Jones/ 1 TITL Lady 1 SEX F 1 BIRT 2 DATE 17 JUL 1979 1 FAMC @F1410@ 0 @I2979@ INDI 1 NAME Julia /Rawlinson/ 1 SEX F 1 FAMS @F1411@ 0 @I2980@ INDI 1 NAME Athol /Schmith/ 1 SEX M 1 FAMS @F1412@ 0 @I2981@ INDI 1 NAME /Schmith/ 1 SEX M 1 BIRT 2 DATE ABT 1943 1 FAMC @F1412@ 0 @I2982@ INDI 1 NAME Erwin /Stein/ 1 SEX M 1 FAMS @F1413@ 0 @I2983@ INDI 1 NAME Sophie // 1 SEX F 1 FAMS @F1413@ 0 @I2984@ INDI 1 NAME Alexander (Sachie) /McCorquodale/ 1 SEX M 1 BIRT 2 DATE ABT 1898 1 FAMS @F299@ 0 @I2985@ INDI 1 NAME Gerald /Legge/ 1 TITL Earl Dartmouth 1 SEX M 1 FAMS @F1414@ 1 FAMC @F1417@ 0 @I2986@ INDI 1 NAME Hugh /McCorquodale/ 1 SEX M 1 FAMS @F1415@ 1 FAMC @F1416@ 0 @I2987@ INDI 1 NAME Harold /McCorquodale/ 1 SEX M 1 FAMS @F1416@ 0 @I2988@ INDI 1 NAME Gracie // 1 SEX F 1 FAMS @F1416@ 0 @I2989@ INDI 1 NAME Ian /McCorquodale/ 1 SEX M 1 BIRT 2 DATE 11 OCT 1937 1 FAMC @F1415@ 0 @I2990@ INDI 1 NAME /Legge/ 1 FAMC @F1414@ 0 @I2991@ INDI 1 NAME /Legge/ 1 FAMC @F1414@ 0 @I2992@ INDI 1 NAME /Legge/ 1 FAMC @F1414@ 0 @I2993@ INDI 1 NAME /Legge/ 1 FAMC @F1414@ 0 @I2994@ INDI 1 NAME Humphrey /Legge/ 1 TITL Hon. 1 SEX M 1 FAMS @F1417@ 0 @I2995@ INDI 1 NAME Bertram (Bertie) /Cartland/ 1 TITL Major 1 SEX M 1 DEAT 2 DATE 27 MAY 1917 1 FAMS @F1418@ 1 FAMC @F1422@ 0 @I2996@ INDI 1 NAME Mary Hamilton (Polly)/Scobell/ 1 SEX F 1 BIRT 2 DATE 5 SEP 1877 1 FAMS @F1418@ 1 FAMC @F1419@ 0 @I2997@ INDI 1 NAME Ronald /Cartland/ 1 SEX M 1 BIRT 2 DATE 3 JAN 1907 1 DEAT 2 DATE 30 MAY 1940 2 PLAC Nr Cassel,France 1 FAMC @F1418@ 0 @I2998@ INDI 1 NAME Anthony (Tony) /Cartland/ 1 SEX M 1 BIRT 2 DATE 4 JAN 1912 1 DEAT 2 DATE 29 MAY 1940 1 BURI 2 PLAC Zuidschote 1 FAMC @F1418@ 0 @I2999@ INDI 1 NAME Edith /Palairet/ 1 SEX F 1 FAMS @F1419@ 1 FAMC @F1420@ 0 @I3000@ INDI 1 NAME Mary Anne /Hamilton/ 1 SEX F 1 FAMS @F1420@ 1 FAMC @F1421@ 0 @I3001@ INDI 1 NAME Andrew /Hamilton/ 1 SEX M 1 FAMS @F1421@ 0 @I3002@ INDI 1 NAME George /Scobell/ 1 SEX M 1 FAMS @F1419@ 0 @I3003@ INDI 1 NAME Melloney /Scobell/ 1 SEX F 1 FAMC @F1419@ 0 @I3004@ INDI 1 NAME /Scobell/ 1 SEX M 1 BIRT 2 PLAC Florence,Italy 1 DEAT 2 DATE BEF 1877 1 FAMC @F1419@ 0 @I3005@ INDI 1 NAME Emily /Scobell/ 1 SEX F 1 FAMC @F1419@ 0 @I3006@ INDI 1 NAME John Sanford /Scobell/ 1 TITL Sir 1 SEX M 1 BIRT 2 DATE 1879 1 FAMC @F1419@ 0 @I3007@ INDI 1 NAME James /Cartland/ 1 SEX M 1 FAMS @F1422@ 0 @I3008@ INDI 1 NAME Flora // 1 SEX F 1 FAMS @F1422@ 0 @I3009@ INDI 1 NAME /Cartland/ 1 SEX F 1 DEAT 2 DATE ABT 1911 1 FAMC @F1418@ 0 @I3010@ INDI 1 NAME Glen /McCorquodale/ 1 SEX M 1 BIRT 2 DATE 31 DEC 1939 1 FAMC @F1415@ 0 @F1@ FAM 1 HUSB @I2@ 1 WIFE @I1@ 1 CHIL @I3@ 1 CHIL @I4@ 1 CHIL @I5@ 1 CHIL @I6@ 1 CHIL @I7@ 1 CHIL @I8@ 1 CHIL @I9@ 1 CHIL @I10@ 1 CHIL @I11@ 1 DIV N 1 MARR 2 DATE 10 FEB 1840 2 PLAC Chapel Royal,St. James Palace,England 0 @F2@ FAM 1 HUSB @I4@ 1 WIFE @I12@ 1 CHIL @I13@ 1 CHIL @I14@ 1 CHIL @I15@ 1 CHIL @I16@ 1 CHIL @I17@ 1 CHIL @I18@ 1 MARR 2 DATE 10 MAR 1863 2 PLAC St. George Chap.,Windsor,,England 0 @F3@ FAM 1 HUSB @I20@ 1 WIFE @I3@ 1 CHIL @I21@ 1 CHIL @I77@ 1 CHIL @I72@ 1 CHIL @I73@ 1 CHIL @I74@ 1 CHIL @I75@ 1 CHIL @I76@ 1 CHIL @I78@ 1 MARR 2 DATE 25 JAN 1858 2 PLAC London,England 0 @F4@ FAM 1 HUSB @I37@ 1 WIFE @I39@ 1 CHIL @I46@ 1 CHIL @I47@ 1 CHIL @I48@ 1 CHIL @I49@ 1 CHIL @I50@ 1 DIV N 1 MARR 2 DATE 26 NOV 1894 2 PLAC Winter Palace,,St. Petersburg,Russia 0 @F5@ FAM 1 HUSB @I10@ 1 WIFE @I23@ 1 CHIL @I24@ 1 CHIL @I129@ 1 MARR 2 DATE 27 APR 1882 2 PLAC St. George Chap.,Windsor,,England 0 @F6@ FAM 1 HUSB @I25@ 1 WIFE @I11@ 1 CHIL @I26@ 1 CHIL @I27@ 1 CHIL @I28@ 1 CHIL @I29@ 1 MARR 2 DATE 23 JUL 1885 2 PLAC Whippingham,Isle of Wight 0 @F7@ FAM 1 HUSB @I14@ 1 WIFE @I30@ 1 CHIL @I31@ 1 CHIL @I32@ 1 CHIL @I33@ 1 CHIL @I34@ 1 CHIL @I35@ 1 CHIL @I36@ 1 MARR 2 DATE 6 JUL 1893 2 PLAC Chapel Royal,St. James Palace 0 @F8@ FAM 1 HUSB @I22@ 1 WIFE @I5@ 1 CHIL @I38@ 1 CHIL @I84@ 1 CHIL @I79@ 1 CHIL @I83@ 1 CHIL @I86@ 1 CHIL @I39@ 1 CHIL @I85@ 1 MARR 2 DATE 1 JUL 1862 2 PLAC Osborne House,Isle of Wight 0 @F9@ FAM 1 HUSB @I40@ 1 WIFE @I41@ 1 CHIL @I37@ 1 CHIL @I1568@ 1 CHIL @I153@ 1 CHIL @I154@ 1 CHIL @I155@ 1 CHIL @I156@ 1 MARR 2 DATE 1866 0 @F10@ FAM 1 HUSB @I42@ 1 WIFE @I43@ 1 CHIL @I44@ 1 CHIL @I353@ 1 CHIL @I2665@ 1 CHIL @I2666@ 1 MARR 2 DATE 1817 0 @F11@ FAM 1 HUSB @I44@ 1 WIFE @I45@ 1 CHIL @I491@ 1 CHIL @I492@ 1 CHIL @I40@ 1 CHIL @I149@ 1 CHIL @I150@ 1 CHIL @I94@ 1 CHIL @I151@ 1 CHIL @I152@ 1 MARR 2 DATE 1840 0 @F12@ FAM 1 HUSB @I32@ 1 WIFE @I51@ 1 CHIL @I52@ 1 CHIL @I53@ 1 DIV N 1 MARR 2 DATE 26 APR 1923 0 @F13@ FAM 1 HUSB @I54@ 1 WIFE @I53@ 1 CHIL @I55@ 1 CHIL @I56@ 1 DIV Y 1 MARR 2 DATE 6 MAY 1960 2 PLAC Westminster,Cathedral,London,England 0 @F14@ FAM 1 HUSB @I57@ 1 WIFE @I52@ 1 CHIL @I58@ 1 CHIL @I59@ 1 CHIL @I60@ 1 CHIL @I61@ 1 DIV N 1 MARR 2 DATE 20 NOV 1947 2 PLAC Westminster,Abbey,London,England 0 @F15@ FAM 1 HUSB @I62@ 1 WIFE @I59@ 1 CHIL @I63@ 1 CHIL @I64@ 1 DIV N 1 MARR 2 DATE 14 NOV 1973 2 PLAC Westminster,Abbey,London,England 0 @F16@ FAM 1 HUSB @I58@ 1 WIFE @I65@ 1 CHIL @I115@ 1 CHIL @I116@ 1 DIV N 1 MARR 2 DATE 29 JUL 1981 2 PLAC St. Paul's,Cathedral,London,England 0 @F17@ FAM 1 HUSB @I35@ 1 WIFE @I66@ 1 CHIL @I67@ 1 CHIL @I106@ 1 CHIL @I107@ 1 MARR 2 DATE 29 NOV 1934 2 PLAC Westminster,Abbey,London,England 0 @F18@ FAM 1 HUSB @I68@ 1 WIFE @I33@ 1 CHIL @I244@ 1 CHIL @I291@ 1 MARR 2 DATE 28 FEB 1922 2 PLAC Westminster,Abbey,London,England 0 @F19@ FAM 1 HUSB @I34@ 1 WIFE @I69@ 1 CHIL @I87@ 1 CHIL @I88@ 1 MARR 2 DATE 6 NOV 1935 2 PLAC Buckingham,Palace,London,England 0 @F20@ FAM 1 HUSB @I31@ 1 WIFE @I70@ 1 DIV N 1 MARR 2 DATE 3 JUN 1937 2 PLAC Chateau de Cande,Monts,,France 0 @F21@ FAM 1 HUSB @I71@ 1 WIFE @I17@ 1 CHIL @I450@ 1 MARR 2 DATE 22 JUL 1896 2 PLAC Buckingham,Palace,London,England 0 @F22@ FAM 1 HUSB @I72@ 1 WIFE @I79@ 1 CHIL @I80@ 1 CHIL @I81@ 1 CHIL @I82@ 1 MARR 2 DATE 1888 0 @F23@ FAM 1 HUSB @I88@ 1 WIFE @I89@ 1 CHIL @I90@ 1 CHIL @I317@ 1 CHIL @I318@ 1 MARR 2 DATE JUL 1972 0 @F24@ FAM 1 HUSB @I91@ 1 WIFE @I70@ 1 DIV Y 1 MARR 2 DATE 1916 0 @F25@ FAM 1 HUSB @I92@ 1 WIFE @I70@ 1 DIV Y 1 MARR 2 DATE 1928 0 @F26@ FAM 1 HUSB @I6@ 1 WIFE @I94@ 1 CHIL @I95@ 1 CHIL @I96@ 1 CHIL @I97@ 1 CHIL @I98@ 1 CHIL @I99@ 1 MARR 2 DATE 23 JAN 1874 2 PLAC Winter Palace,St. Petersburg,Russia 0 @F27@ FAM 1 HUSB @I100@ 1 WIFE @I38@ 1 CHIL @I101@ 1 CHIL @I238@ 1 CHIL @I102@ 1 CHIL @I103@ 1 MARR 2 DATE 1884 0 @F28@ FAM 1 HUSB @I104@ 1 WIFE @I101@ 1 CHIL @I147@ 1 CHIL @I148@ 1 CHIL @I463@ 1 CHIL @I476@ 1 CHIL @I57@ 1 MARR 2 DATE 1903 0 @F29@ FAM 1 HUSB @I105@ 1 WIFE @I15@ 1 CHIL @I125@ 1 CHIL @I952@ 1 MARR 2 DATE 27 JUL 1889 2 PLAC Buckingham,Palace,London,England 0 @F30@ FAM 1 HUSB @I108@ 1 WIFE @I106@ 1 CHIL @I109@ 1 CHIL @I110@ 1 MARR 2 DATE APR 1963 2 PLAC ,,England 0 @F31@ FAM 1 HUSB @I67@ 1 WIFE @I111@ 1 CHIL @I112@ 1 CHIL @I113@ 1 CHIL @I114@ 1 MARR 2 DATE 1961 0 @F32@ FAM 1 HUSB @I117@ 1 WIFE @I7@ 1 CHIL @I310@ 1 CHIL @I311@ 1 CHIL @I312@ 1 CHIL @I118@ 1 CHIL @I313@ 1 MARR 2 DATE 5 JUL 1866 2 PLAC Windsor Castle,,,England 0 @F33@ FAM 1 HUSB @I119@ 1 WIFE @I118@ 1 DIV Y 0 @F34@ FAM 1 HUSB @I9@ 1 WIFE @I120@ 1 CHIL @I121@ 1 CHIL @I122@ 1 CHIL @I123@ 1 MARR 2 DATE 13 MAR 1879 2 PLAC St. George Chap.,Windsor,,England 0 @F35@ FAM 1 HUSB @I124@ 1 WIFE @I121@ 1 CHIL @I445@ 1 CHIL @I1059@ 1 CHIL @I447@ 1 CHIL @I448@ 1 CHIL @I449@ 1 MARR 2 DATE 15 JUN 1905 2 PLAC Windsor,England 0 @F36@ FAM 1 HUSB @I122@ 1 WIFE @I125@ 1 CHIL @I2155@ 0 @F37@ FAM 1 HUSB @I126@ 1 WIFE @I123@ 1 CHIL @I1706@ 0 @F38@ FAM 1 HUSB @I280@ 1 WIFE @I24@ 1 CHIL @I287@ 1 CHIL @I288@ 1 CHIL @I289@ 0 @F39@ FAM 1 HUSB @I130@ 1 WIFE @I131@ 1 CHIL @I141@ 1 CHIL @I202@ 1 CHIL @I203@ 1 CHIL @I204@ 1 CHIL @I133@ 1 CHIL @I209@ 1 CHIL @I210@ 1 CHIL @I212@ 1 CHIL @I213@ 1 CHIL @I132@ 1 CHIL @I214@ 1 CHIL @I215@ 1 CHIL @I216@ 1 CHIL @I217@ 1 CHIL @I218@ 0 @F40@ FAM 1 HUSB @I132@ 1 WIFE @I134@ 1 CHIL @I262@ 1 CHIL @I135@ 1 CHIL @I136@ 0 @F41@ FAM 1 HUSB @I137@ 1 WIFE @I136@ 1 CHIL @I30@ 1 CHIL @I278@ 1 CHIL @I279@ 1 CHIL @I280@ 0 @F42@ FAM 1 HUSB @I133@ 1 WIFE @I138@ 1 CHIL @I1@ 1 MARR 2 DATE 11 JUL 1818 2 PLAC Kew Palace 0 @F43@ FAM 1 HUSB @I139@ 1 WIFE @I140@ 1 CHIL @I1737@ 1 CHIL @I2@ 1 DIV Y 1 MARR 2 DATE 31 JUL 1817 2 PLAC Gotha 0 @F44@ FAM 1 HUSB @I141@ 1 WIFE @I142@ 1 MARR 2 DATE 1785 0 @F45@ FAM 1 HUSB @I141@ 1 WIFE @I143@ 1 CHIL @I144@ 1 MARR 2 DATE 8 APR 1795 2 PLAC Chapel Royal,St James Palace,,England 0 @F46@ FAM 1 HUSB @I145@ 1 WIFE @I146@ 1 CHIL @I173@ 1 CHIL @I174@ 1 CHIL @I175@ 1 CHIL @I176@ 1 CHIL @I177@ 1 CHIL @I178@ 1 CHIL @I179@ 1 CHIL @I180@ 1 CHIL @I51@ 1 CHIL @I181@ 0 @F47@ FAM 1 HUSB @I149@ 1 WIFE @I157@ 1 CHIL @I158@ 1 CHIL @I159@ 1 CHIL @I160@ 1 CHIL @I1362@ 1 MARR 2 DATE 1874 0 @F48@ FAM 1 HUSB @I160@ 1 WIFE @I161@ 1 MARR 2 DATE 1921 0 @F49@ FAM 1 HUSB @I83@ 1 WIFE @I97@ 1 DIV Y 1 MARR 2 DATE 1894 0 @F50@ FAM 1 HUSB @I152@ 1 WIFE @I163@ 1 CHIL @I1355@ 1 CHIL @I164@ 1 MARR 2 DATE 1889 0 @F51@ FAM 1 HUSB @I2675@ 1 WIFE @I154@ 1 CHIL @I166@ 1 CHIL @I1562@ 1 CHIL @I1563@ 1 CHIL @I1564@ 1 CHIL @I1565@ 1 CHIL @I1566@ 1 CHIL @I1567@ 1 MARR 2 DATE 1894 0 @F52@ FAM 1 HUSB @I167@ 1 WIFE @I166@ 0 @F53@ FAM 1 HUSB @I60@ 1 WIFE @I168@ 1 CHIL @I827@ 1 CHIL @I2958@ 1 MARR 2 DATE 23 JUL 1986 2 PLAC Westminster,Abbey,London,England 0 @F54@ FAM 1 HUSB @I169@ 1 WIFE @I170@ 1 CHIL @I822@ 1 CHIL @I168@ 1 DIV Y 1 MARR 2 DATE JAN 1956 2 PLAC St. Margarets,Westminster,England 0 @F55@ FAM 1 HUSB @I171@ 1 WIFE @I172@ 1 CHIL @I70@ 0 @F56@ FAM 1 HUSB @I182@ 1 WIFE @I183@ 1 CHIL @I145@ 0 @F57@ FAM 1 HUSB @I184@ 1 WIFE @I185@ 1 CHIL @I186@ 1 CHIL @I182@ 0 @F58@ FAM 1 HUSB @I187@ 1 WIFE @I188@ 1 CHIL @I189@ 1 CHIL @I184@ 0 @F59@ FAM 1 HUSB @I190@ 1 WIFE @I188@ 0 @F60@ FAM 1 HUSB @I191@ 1 WIFE @I174@ 0 @F61@ FAM 1 HUSB @I175@ 1 WIFE @I192@ 0 @F62@ FAM 1 HUSB @I176@ 1 WIFE @I193@ 1 CHIL @I1962@ 1 CHIL @I1963@ 0 @F63@ FAM 1 HUSB @I178@ 1 WIFE @I194@ 0 @F64@ FAM 1 HUSB @I195@ 1 WIFE @I179@ 0 @F65@ FAM 1 HUSB @I180@ 1 WIFE @I196@ 0 @F66@ FAM 1 HUSB @I181@ 1 WIFE @I197@ 0 @F67@ FAM 1 HUSB @I19@ 1 WIFE @I1216@ 1 CHIL @I23@ 1 CHIL @I656@ 0 @F68@ FAM 1 HUSB @I199@ 1 WIFE @I200@ 1 CHIL @I120@ 0 @F69@ FAM 1 HUSB @I201@ 1 WIFE @I8@ 1 MARR 2 DATE 21 MAR 1871 2 PLAC St. George Chap.,Windsor,,England 0 @F70@ FAM 1 HUSB @I2448@ 0 @F71@ FAM 1 HUSB @I207@ 1 WIFE @I208@ 1 CHIL @I146@ 0 @F72@ FAM 1 HUSB @I211@ 1 WIFE @I210@ 1 MARR 2 DATE 7 APR 1818 2 PLAC Buckingham House 0 @F73@ FAM 1 HUSB @I203@ 1 WIFE @I219@ 1 CHIL @I220@ 1 CHIL @I221@ 1 CHIL @I222@ 1 CHIL @I223@ 1 MARR 2 DATE 11 JUL 1818 2 PLAC Kew Palace 0 @F74@ FAM 1 HUSB @I225@ 1 WIFE @I226@ 1 CHIL @I604@ 1 CHIL @I12@ 1 CHIL @I227@ 1 CHIL @I41@ 1 CHIL @I254@ 1 CHIL @I1663@ 1 MARR 2 DATE 1842 0 @F75@ FAM 1 HUSB @I227@ 1 WIFE @I228@ 1 CHIL @I405@ 1 CHIL @I466@ 1 CHIL @I163@ 1 CHIL @I229@ 1 CHIL @I2673@ 1 CHIL @I104@ 1 CHIL @I465@ 1 CHIL @I467@ 1 MARR 2 DATE 1867 0 @F76@ FAM 1 HUSB @I229@ 1 WIFE @I1362@ 1 CHIL @I66@ 1 CHIL @I236@ 1 CHIL @I237@ 1 CHIL @I2964@ 1 CHIL @I2967@ 1 MARR 2 DATE 1902 0 @F77@ FAM 1 HUSB @I124@ 1 WIFE @I238@ 1 MARR 2 DATE 3 NOV 1923 2 PLAC Chapel Royal,St. James Palace,England 0 @F78@ FAM 1 HUSB @I239@ 1 WIFE @I93@ 1 CHIL @I240@ 1 CHIL @I241@ 1 CHIL @I1712@ 1 CHIL @I65@ 1 CHIL @I242@ 1 DIV Y 1 MARR 2 DATE 1954 2 PLAC Westminster,Abbey,London,England 0 @F79@ FAM 1 HUSB @I239@ 1 WIFE @I243@ 1 DIV N 1 MARR 2 DATE 14 JUL 1976 2 PLAC Caxton Hall 0 @F80@ FAM 1 HUSB @I1696@ 1 WIFE @I144@ 1 MARR 2 DATE 2 MAY 1816 2 PLAC Carlton House,London,England 0 @F81@ FAM 1 HUSB @I246@ 1 WIFE @I517@ 1 CHIL @I556@ 0 @F82@ FAM 1 HUSB @I247@ 1 WIFE @I204@ 1 MARR 2 DATE 18 MAY 1797 2 PLAC Chapel Royal,St James Palace,,England 0 @F83@ FAM 1 HUSB @I212@ 1 WIFE @I248@ 1 CHIL @I249@ 1 MARR 2 DATE 29 AUG 1815 2 PLAC Carlton House,London,England 0 @F84@ FAM 1 HUSB @I249@ 1 WIFE @I250@ 1 CHIL @I251@ 1 CHIL @I252@ 1 CHIL @I253@ 1 MARR 2 DATE 18 FEB 1843 2 PLAC Hanover,Germany 0 @F85@ FAM 1 HUSB @I251@ 1 WIFE @I254@ 1 CHIL @I255@ 1 CHIL @I256@ 1 CHIL @I257@ 1 CHIL @I258@ 1 CHIL @I259@ 1 CHIL @I552@ 0 @F86@ FAM 1 HUSB @I261@ 1 WIFE @I252@ 0 @F87@ FAM 1 HUSB @I262@ 1 WIFE @I263@ 1 CHIL @I264@ 1 CHIL @I265@ 1 CHIL @I266@ 0 @F88@ FAM 1 HUSB @I264@ 1 WIFE @I267@ 1 CHIL @I268@ 1 CHIL @I269@ 1 CHIL @I270@ 0 @F89@ FAM 1 HUSB @I271@ 1 WIFE @I135@ 1 CHIL @I272@ 0 @F90@ FAM 1 HUSB @I272@ 1 WIFE @I273@ 1 CHIL @I274@ 1 CHIL @I275@ 1 CHIL @I276@ 1 CHIL @I277@ 0 @F91@ FAM 1 HUSB @I278@ 1 WIFE @I281@ 1 CHIL @I282@ 1 CHIL @I283@ 1 CHIL @I284@ 1 CHIL @I285@ 0 @F92@ FAM 1 HUSB @I286@ 1 WIFE @I127@ 1 CHIL @I1229@ 1 CHIL @I1256@ 1 CHIL @I1257@ 1 CHIL @I1258@ 1 MARR 2 DATE 25 JAN 1308 2 PLAC Bolongne 0 @F93@ FAM 1 HUSB @I290@ 1 WIFE @I214@ 0 @F94@ FAM 1 HUSB @I244@ 1 WIFE @I292@ 1 CHIL @I293@ 1 CHIL @I294@ 1 CHIL @I295@ 1 DIV Y 1 MARR 2 DATE 1949 0 @F95@ FAM 1 HUSB @I291@ 1 WIFE @I296@ 1 CHIL @I297@ 1 DIV Y 1 MARR 2 DATE 1952 0 @F96@ FAM 1 HUSB @I298@ 1 WIFE @I299@ 1 CHIL @I226@ 1 CHIL @I300@ 1 MARR 2 DATE 1810 0 @F97@ FAM 1 HUSB @I301@ 1 WIFE @I302@ 1 CHIL @I298@ 1 CHIL @I134@ 0 @F98@ FAM 1 HUSB @I303@ 1 WIFE @I304@ 1 CHIL @I305@ 1 CHIL @I137@ 1 CHIL @I306@ 0 @F99@ FAM 1 HUSB @I307@ 1 WIFE @I306@ 1 CHIL @I308@ 0 @F100@ FAM 1 HUSB @I309@ 1 WIFE @I96@ 1 CHIL @I438@ 1 CHIL @I437@ 1 CHIL @I436@ 1 CHIL @I1096@ 1 CHIL @I1097@ 1 CHIL @I1098@ 1 MARR 2 DATE 10 JAN 1893 2 PLAC Sigmaringen,Germany 0 @F101@ FAM 1 HUSB @I244@ 1 WIFE @I314@ 1 CHIL @I315@ 1 MARR 2 DATE 1967 0 @F102@ FAM 1 HUSB @I291@ 1 WIFE @I316@ 1 CHIL @I982@ 1 MARR 2 DATE 1978 0 @F103@ FAM 1 HUSB @I107@ 1 WIFE @I319@ 1 CHIL @I320@ 1 CHIL @I801@ 1 MARR 2 DATE 30 JUN 1978 2 PLAC Vienna,Austria 0 @F104@ FAM 1 HUSB @I321@ 1 WIFE @I322@ 1 CHIL @I323@ 1 CHIL @I324@ 1 CHIL @I325@ 1 CHIL @I326@ 1 CHIL @I327@ 1 CHIL @I328@ 1 CHIL @I329@ 1 CHIL @I330@ 1 CHIL @I331@ 1 MARR 2 DATE 22 AUG 1705 2 PLAC Herrenhausen 0 @F105@ FAM 1 HUSB @I323@ 1 WIFE @I332@ 1 CHIL @I333@ 1 CHIL @I130@ 1 CHIL @I334@ 1 CHIL @I335@ 1 CHIL @I336@ 1 CHIL @I337@ 1 CHIL @I338@ 1 CHIL @I339@ 1 CHIL @I340@ 1 MARR 2 DATE 8 MAY 1736 2 PLAC Chapel Royal,St. James 0 @F106@ FAM 1 HUSB @I341@ 1 WIFE @I342@ 1 CHIL @I321@ 1 CHIL @I343@ 1 DIV Y 1 MARR 2 DATE 22 NOV 1682 2 PLAC Celle 0 @F107@ FAM 1 HUSB @I344@ 1 WIFE @I331@ 1 CHIL @I1637@ 1 CHIL @I1638@ 1 CHIL @I1639@ 1 CHIL @I764@ 1 CHIL @I1640@ 1 MARR 2 DATE 11 DEC 1743 2 PLAC Christiansborg 0 @F108@ FAM 1 HUSB @I345@ 1 WIFE @I346@ 1 CHIL @I225@ 1 MARR 2 DATE 1810 0 @F109@ FAM 1 HUSB @I347@ 1 WIFE @I348@ 1 CHIL @I224@ 1 CHIL @I100@ 1 CHIL @I486@ 1 CHIL @I25@ 1 CHIL @I487@ 1 MARR 2 DATE 1851 0 @F110@ FAM 1 HUSB @I349@ 1 WIFE @I350@ 1 CHIL @I493@ 1 CHIL @I357@ 1 CHIL @I347@ 1 CHIL @I45@ 1 MARR 2 DATE 1804 0 @F111@ FAM 1 HUSB @I351@ 1 WIFE @I352@ 1 CHIL @I348@ 0 @F112@ FAM 1 HUSB @I353@ 1 WIFE @I354@ 1 CHIL @I165@ 1 CHIL @I228@ 1 CHIL @I2671@ 1 CHIL @I2677@ 1 MARR 2 DATE 1848 0 @F113@ FAM 1 HUSB @I355@ 1 WIFE @I356@ 1 CHIL @I354@ 0 @F114@ FAM 1 HUSB @I357@ 1 WIFE @I358@ 1 CHIL @I22@ 1 CHIL @I497@ 1 CHIL @I498@ 1 CHIL @I499@ 1 MARR 2 DATE 1836 0 @F115@ FAM 1 HUSB @I360@ 1 WIFE @I361@ 1 CHIL @I207@ 0 @F116@ FAM 1 HUSB @I362@ 1 WIFE @I363@ 1 CHIL @I208@ 0 @F117@ FAM 1 HUSB @I364@ 1 WIFE @I365@ 1 CHIL @I183@ 0 @F118@ FAM 1 HUSB @I366@ 1 WIFE @I367@ 1 CHIL @I239@ 0 @F119@ FAM 1 HUSB @I368@ 1 WIFE @I369@ 1 CHIL @I93@ 0 @F120@ FAM 1 HUSB @I370@ 1 WIFE @I371@ 1 CHIL @I368@ 0 @F121@ FAM 1 HUSB @I372@ 1 WIFE @I373@ 1 CHIL @I371@ 0 @F122@ FAM 1 HUSB @I374@ 1 WIFE @I375@ 1 CHIL @I373@ 0 @F123@ FAM 1 HUSB @I376@ 1 WIFE @I377@ 1 CHIL @I372@ 0 @F124@ FAM 1 HUSB @I378@ 1 WIFE @I379@ 1 CHIL @I370@ 0 @F125@ FAM 1 HUSB @I380@ 1 WIFE @I381@ 1 CHIL @I379@ 0 @F126@ FAM 1 HUSB @I382@ 1 WIFE @I383@ 1 CHIL @I378@ 0 @F127@ FAM 1 HUSB @I384@ 1 WIFE @I385@ 1 CHIL @I367@ 1 CHIL @I1713@ 1 CHIL @I1714@ 0 @F128@ FAM 1 HUSB @I386@ 1 WIFE @I387@ 1 CHIL @I384@ 0 @F129@ FAM 1 HUSB @I388@ 1 WIFE @I389@ 1 CHIL @I385@ 0 @F130@ FAM 1 HUSB @I390@ 1 WIFE @I391@ 1 CHIL @I369@ 0 @F131@ FAM 1 HUSB @I392@ 1 WIFE @I393@ 1 CHIL @I390@ 0 @F132@ FAM 1 HUSB @I394@ 1 WIFE @I395@ 1 CHIL @I391@ 0 @F133@ FAM 1 HUSB @I396@ 1 WIFE @I397@ 1 CHIL @I1733@ 1 CHIL @I366@ 1 CHIL @I1734@ 0 @F134@ FAM 1 HUSB @I398@ 1 WIFE @I399@ 1 CHIL @I396@ 0 @F135@ FAM 1 HUSB @I400@ 1 WIFE @I401@ 1 CHIL @I397@ 0 @F136@ FAM 1 HUSB @I21@ 1 WIFE @I402@ 1 CHIL @I420@ 1 CHIL @I421@ 1 CHIL @I422@ 1 CHIL @I423@ 1 CHIL @I424@ 1 CHIL @I425@ 1 CHIL @I426@ 0 @F137@ FAM 1 HUSB @I403@ 1 WIFE @I77@ 0 @F138@ FAM 1 HUSB @I404@ 1 WIFE @I74@ 0 @F139@ FAM 1 HUSB @I405@ 1 WIFE @I76@ 1 CHIL @I439@ 1 CHIL @I234@ 1 CHIL @I233@ 1 CHIL @I232@ 1 CHIL @I231@ 1 CHIL @I230@ 1 MARR 2 DATE 27 OCT 1889 2 PLAC Athens,Greece 0 @F140@ FAM 1 HUSB @I406@ 1 WIFE @I78@ 0 @F141@ FAM 1 HUSB @I129@ 1 WIFE @I407@ 0 @F142@ FAM 1 HUSB @I26@ 1 WIFE @I408@ 1 CHIL @I509@ 0 @F143@ FAM 1 HUSB @I409@ 1 WIFE @I27@ 1 CHIL @I430@ 1 CHIL @I591@ 1 CHIL @I433@ 1 CHIL @I2642@ 1 CHIL @I431@ 1 CHIL @I432@ 1 CHIL @I2643@ 1 MARR 2 DATE 1906 2 PLAC Church of,San Jeronimo,Madrid,Spain 0 @F144@ FAM 1 HUSB @I151@ 1 WIFE @I84@ 1 MARR 2 DATE 1884 0 @F145@ FAM 1 HUSB @I162@ 1 WIFE @I410@ 1 CHIL @I511@ 1 CHIL @I411@ 1 CHIL @I412@ 1 CHIL @I43@ 1 CHIL @I413@ 1 CHIL @I414@ 1 CHIL @I2654@ 1 CHIL @I416@ 1 CHIL @I1029@ 1 CHIL @I418@ 0 @F146@ FAM 1 HUSB @I21@ 1 WIFE @I419@ 1 MARR 2 DATE 5 NOV 1922 2 PLAC Haus Doorn,Netherlands 0 @F147@ FAM 1 HUSB @I412@ 1 WIFE @I427@ 1 CHIL @I428@ 1 CHIL @I20@ 0 @F148@ FAM 1 HUSB @I429@ 1 WIFE @I428@ 0 @F149@ FAM 1 HUSB @I432@ 1 WIFE @I434@ 1 CHIL @I592@ 1 CHIL @I435@ 1 CHIL @I593@ 1 CHIL @I594@ 1 MARR 2 DATE 1935 2 PLAC Rome,,Italy 0 @F150@ FAM 1 HUSB @I439@ 1 WIFE @I437@ 1 DIV Y 1 MARR 2 DATE 27 FEB 1921 2 PLAC Bucharest,Romania 0 @F151@ FAM 1 HUSB @I440@ 1 WIFE @I436@ 1 CHIL @I475@ 1 CHIL @I874@ 1 CHIL @I875@ 0 @F152@ FAM 1 HUSB @I435@ 1 WIFE @I441@ 1 CHIL @I442@ 1 CHIL @I443@ 1 CHIL @I444@ 1 MARR 2 DATE 1962 0 @F153@ FAM 1 HUSB @I450@ 1 WIFE @I451@ 1 CHIL @I958@ 1 CHIL @I959@ 1 CHIL @I452@ 1 MARR 2 DATE 1929 0 @F154@ FAM 1 HUSB @I452@ 1 WIFE @I453@ 1 CHIL @I454@ 1 CHIL @I455@ 1 MARR 2 DATE AUG 1968 2 PLAC Oslo Cathedral,Oslo,Norway 0 @F155@ FAM 1 HUSB @I456@ 1 WIFE @I457@ 1 CHIL @I124@ 1 CHIL @I1408@ 1 CHIL @I446@ 1 MARR 2 DATE 1881 0 @F156@ FAM 1 HUSB @I458@ 1 WIFE @I459@ 1 CHIL @I456@ 1 CHIL @I2770@ 1 CHIL @I597@ 1 CHIL @I2771@ 1 MARR 2 DATE 6 JUN 1857 2 PLAC Biebrich 0 @F157@ FAM 1 HUSB @I83@ 1 WIFE @I460@ 1 CHIL @I461@ 1 CHIL @I462@ 1 MARR 2 DATE 1905 0 @F158@ FAM 1 HUSB @I461@ 1 WIFE @I463@ 1 CHIL @I2629@ 1 CHIL @I2630@ 1 CHIL @I2631@ 1 MARR 2 DATE 1931 0 @F159@ FAM 1 HUSB @I462@ 1 WIFE @I464@ 1 MARR 2 DATE 1937 0 @F160@ FAM 1 HUSB @I438@ 1 WIFE @I233@ 1 CHIL @I468@ 1 DIV Y 1 MARR 2 DATE 10 MAR 1921 2 PLAC Athens,Greece 0 @F161@ FAM 1 HUSB @I468@ 1 WIFE @I469@ 1 CHIL @I972@ 1 CHIL @I973@ 1 CHIL @I974@ 1 CHIL @I975@ 1 CHIL @I976@ 1 MARR 2 DATE 10 JUN 1948 2 PLAC Athens,Greece 0 @F162@ FAM 1 HUSB @I232@ 1 WIFE @I470@ 1 CHIL @I441@ 1 CHIL @I471@ 1 CHIL @I1064@ 0 @F163@ FAM 1 HUSB @I471@ 1 WIFE @I472@ 1 CHIL @I609@ 1 CHIL @I1060@ 1 CHIL @I1061@ 1 CHIL @I1062@ 1 CHIL @I1063@ 1 MARR 2 DATE 18 SEP 1964 2 PLAC Athens,Greece 0 @F164@ FAM 1 HUSB @I234@ 1 WIFE @I473@ 1 CHIL @I474@ 1 MARR 2 DATE 4 NOV 1919 2 PLAC Athens,Greece 0 @F165@ FAM 1 HUSB @I475@ 1 WIFE @I474@ 1 CHIL @I877@ 0 @F166@ FAM 1 HUSB @I477@ 1 WIFE @I147@ 1 CHIL @I478@ 1 MARR 2 DATE 1931 0 @F167@ FAM 1 HUSB @I479@ 1 WIFE @I148@ 1 CHIL @I480@ 1 MARR 2 DATE 1931 0 @F168@ FAM 1 HUSB @I481@ 1 WIFE @I476@ 1 MARR 2 DATE 1930 0 @F169@ FAM 1 HUSB @I482@ 1 WIFE @I476@ 1 CHIL @I483@ 1 MARR 2 DATE 1946 0 @F170@ FAM 1 HUSB @I484@ 1 WIFE @I485@ 1 CHIL @I303@ 1 CHIL @I595@ 1 CHIL @I356@ 0 @F171@ FAM 1 HUSB @I488@ 1 WIFE @I224@ 0 @F172@ FAM 1 HUSB @I486@ 1 WIFE @I489@ 1 MARR 2 DATE 1889 0 @F173@ FAM 1 HUSB @I487@ 1 WIFE @I490@ 0 @F174@ FAM 1 HUSB @I493@ 1 WIFE @I495@ 1 MARR 2 DATE 1833 0 @F175@ FAM 1 HUSB @I103@ 1 WIFE @I494@ 1 CHIL @I500@ 1 CHIL @I501@ 0 @F176@ FAM 1 HUSB @I102@ 1 WIFE @I502@ 1 CHIL @I503@ 1 CHIL @I504@ 0 @F177@ FAM 1 HUSB @I505@ 1 WIFE @I500@ 1 CHIL @I506@ 0 @F178@ FAM 1 HUSB @I507@ 1 WIFE @I501@ 1 CHIL @I508@ 0 @F179@ FAM 1 HUSB @I162@ 1 WIFE @I510@ 0 @F180@ FAM 1 HUSB @I418@ 1 WIFE @I1682@ 1 DIV Y 1 MARR 2 DATE 1830 0 @F181@ FAM 1 HUSB @I418@ 1 WIFE @I513@ 0 @F182@ FAM 1 HUSB @I417@ 1 WIFE @I514@ 1 CHIL @I1704@ 0 @F183@ FAM 1 HUSB @I515@ 1 WIFE @I2654@ 1 CHIL @I1213@ 1 MARR 2 DATE 1822 0 @F184@ FAM 1 HUSB @I414@ 1 WIFE @I516@ 0 @F185@ FAM 1 HUSB @I202@ 1 WIFE @I555@ 0 @F186@ FAM 1 HUSB @I420@ 1 WIFE @I518@ 1 CHIL @I519@ 1 CHIL @I520@ 1 CHIL @I521@ 1 CHIL @I522@ 1 CHIL @I523@ 1 CHIL @I524@ 0 @F187@ FAM 1 HUSB @I519@ 1 WIFE @I525@ 1 CHIL @I526@ 1 CHIL @I527@ 0 @F188@ FAM 1 HUSB @I520@ 1 WIFE @I528@ 1 CHIL @I921@ 1 CHIL @I922@ 1 CHIL @I923@ 1 CHIL @I924@ 1 CHIL @I925@ 1 CHIL @I534@ 1 CHIL @I535@ 1 MARR 2 DATE 1938 0 @F189@ FAM 1 HUSB @I521@ 1 WIFE @I536@ 1 DIV Y 0 @F190@ FAM 1 HUSB @I521@ 1 WIFE @I537@ 1 CHIL @I538@ 1 CHIL @I539@ 0 @F191@ FAM 1 HUSB @I522@ 1 WIFE @I540@ 1 CHIL @I541@ 1 CHIL @I542@ 1 CHIL @I543@ 1 CHIL @I544@ 1 CHIL @I545@ 0 @F192@ FAM 1 HUSB @I546@ 1 WIFE @I524@ 0 @F193@ FAM 1 HUSB @I421@ 1 WIFE @I547@ 0 @F194@ FAM 1 HUSB @I422@ 1 WIFE @I548@ 0 @F195@ FAM 1 HUSB @I423@ 1 WIFE @I549@ 0 @F196@ FAM 1 HUSB @I424@ 1 WIFE @I550@ 0 @F197@ FAM 1 HUSB @I425@ 1 WIFE @I551@ 0 @F198@ FAM 1 HUSB @I552@ 1 WIFE @I426@ 1 CHIL @I1030@ 1 CHIL @I1031@ 1 CHIL @I470@ 1 CHIL @I1033@ 1 CHIL @I1034@ 1 CHIL @I1035@ 1 MARR 2 DATE 1913 0 @F199@ FAM 1 HUSB @I553@ 1 WIFE @I554@ 1 CHIL @I555@ 1 DIV Y 1 MARR 2 DATE 14 JUL 1765 2 PLAC Charlottenburg 0 @F200@ FAM 1 HUSB @I553@ 1 WIFE @I556@ 1 CHIL @I162@ 1 CHIL @I557@ 1 CHIL @I558@ 1 CHIL @I559@ 1 CHIL @I560@ 1 CHIL @I561@ 1 CHIL @I562@ 1 CHIL @I563@ 1 MARR 2 DATE 14 JUL 1769 2 PLAC Charlottenburg 0 @F201@ FAM 1 HUSB @I558@ 1 WIFE @I248@ 1 MARR 2 DATE 29 AUG 1815 2 PLAC London,England 0 @F202@ FAM 1 HUSB @I565@ 1 WIFE @I559@ 1 CHIL @I652@ 1 CHIL @I653@ 1 CHIL @I1681@ 1 CHIL @I1682@ 1 MARR 2 DATE 1 OCT 1791 2 PLAC Berlin,Germany 0 @F203@ FAM 1 HUSB @I566@ 1 WIFE @I561@ 0 @F204@ FAM 1 HUSB @I563@ 1 WIFE @I567@ 0 @F205@ FAM 1 HUSB @I568@ 1 WIFE @I569@ 1 CHIL @I553@ 1 CHIL @I570@ 1 CHIL @I571@ 1 CHIL @I572@ 0 @F206@ FAM 1 HUSB @I573@ 1 WIFE @I571@ 0 @F207@ FAM 1 HUSB @I574@ 1 WIFE @I575@ 1 CHIL @I576@ 1 CHIL @I485@ 1 MARR 2 DATE 1760 0 @F208@ FAM 1 HUSB @I576@ 1 WIFE @I577@ 1 CHIL @I578@ 0 @F209@ FAM 1 HUSB @I578@ 1 WIFE @I579@ 1 CHIL @I580@ 1 CHIL @I459@ 0 @F210@ FAM 1 HUSB @I580@ 1 WIFE @I581@ 1 CHIL @I582@ 0 @F211@ FAM 1 HUSB @I582@ 1 WIFE @I583@ 1 CHIL @I584@ 0 @F212@ FAM 1 HUSB @I585@ 1 WIFE @I584@ 1 CHIL @I586@ 0 @F213@ FAM 1 HUSB @I158@ 1 WIFE @I97@ 1 CHIL @I895@ 1 CHIL @I528@ 1 CHIL @I588@ 1 MARR 2 DATE 1905 2 PLAC Tegernsee,,Bavaria 0 @F214@ FAM 1 HUSB @I588@ 1 WIFE @I589@ 1 CHIL @I899@ 1 MARR 2 DATE 1948 2 PLAC ,Switzerland 0 @F215@ FAM 1 HUSB @I597@ 1 WIFE @I598@ 1 CHIL @I2829@ 1 CHIL @I451@ 1 CHIL @I599@ 1 CHIL @I2738@ 1 MARR 2 DATE 1897 0 @F216@ FAM 1 HUSB @I600@ 1 WIFE @I599@ 1 CHIL @I1123@ 1 CHIL @I601@ 1 CHIL @I1124@ 1 MARR 2 DATE 10 NOV 1926 2 PLAC Brussels,Belgium 0 @F217@ FAM 1 HUSB @I445@ 1 WIFE @I602@ 1 CHIL @I2526@ 1 CHIL @I2527@ 1 CHIL @I2528@ 1 CHIL @I2529@ 1 CHIL @I603@ 1 MARR 2 DATE 1932 0 @F218@ FAM 1 HUSB @I604@ 1 WIFE @I605@ 1 CHIL @I606@ 1 CHIL @I71@ 1 CHIL @I2697@ 1 CHIL @I1664@ 1 CHIL @I598@ 1 CHIL @I1665@ 1 CHIL @I1666@ 1 CHIL @I1667@ 0 @F219@ FAM 1 HUSB @I606@ 1 WIFE @I607@ 1 CHIL @I608@ 1 CHIL @I1671@ 1 MARR 2 DATE 1898 0 @F220@ FAM 1 HUSB @I603@ 1 WIFE @I1612@ 1 CHIL @I2446@ 1 CHIL @I2447@ 1 CHIL @I2729@ 1 MARR 2 DATE 19 JUN 1976 2 PLAC Stockholm,Sweden 0 @F221@ FAM 1 HUSB @I611@ 1 WIFE @I612@ 1 CHIL @I613@ 1 CHIL @I614@ 0 @F222@ FAM 1 HUSB @I615@ 1 WIFE @I614@ 1 CHIL @I616@ 0 @F223@ FAM 1 HUSB @I616@ 1 WIFE @I617@ 1 CHIL @I618@ 1 CHIL @I619@ 1 MARR 2 DATE 1709 0 @F224@ FAM 1 HUSB @I620@ 1 WIFE @I619@ 1 CHIL @I621@ 1 MARR 2 DATE 1727 0 @F225@ FAM 1 HUSB @I621@ 1 WIFE @I622@ 1 CHIL @I623@ 0 @F226@ FAM 1 HUSB @I623@ 1 WIFE @I624@ 1 CHIL @I625@ 1 CHIL @I626@ 0 @F227@ FAM 1 HUSB @I625@ 1 WIFE @I627@ 1 CHIL @I628@ 0 @F228@ FAM 1 HUSB @I629@ 1 WIFE @I628@ 1 CHIL @I630@ 0 @F229@ FAM 1 HUSB @I631@ 1 WIFE @I630@ 1 CHIL @I632@ 0 @F230@ FAM 1 HUSB @I632@ 1 WIFE @I633@ 1 CHIL @I634@ 0 @F231@ FAM 1 HUSB @I635@ 1 WIFE @I634@ 1 CHIL @I636@ 0 @F232@ FAM 1 HUSB @I637@ 1 WIFE @I626@ 1 CHIL @I1154@ 1 CHIL @I1155@ 1 CHIL @I1156@ 1 CHIL @I1157@ 1 CHIL @I638@ 1 CHIL @I1158@ 1 CHIL @I1159@ 1 MARR 2 DATE 1797 0 @F233@ FAM 1 HUSB @I639@ 1 WIFE @I638@ 1 CHIL @I646@ 0 @F234@ FAM 1 HUSB @I640@ 1 WIFE @I642@ 1 CHIL @I643@ 0 @F235@ FAM 1 HUSB @I643@ 1 WIFE @I644@ 1 CHIL @I645@ 0 @F236@ FAM 1 HUSB @I646@ 1 WIFE @I647@ 1 CHIL @I640@ 1 CHIL @I641@ 0 @F237@ FAM 1 HUSB @I648@ 1 WIFE @I641@ 1 CHIL @I649@ 0 @F238@ FAM 1 HUSB @I618@ 1 WIFE @I324@ 1 CHIL @I650@ 1 CHIL @I575@ 0 @F239@ FAM 1 HUSB @I650@ 1 WIFE @I651@ 1 CHIL @I2653@ 1 CHIL @I565@ 1 CHIL @I2655@ 0 @F240@ FAM 1 HUSB @I652@ 1 WIFE @I654@ 1 CHIL @I655@ 1 CHIL @I1689@ 1 CHIL @I1690@ 1 CHIL @I1691@ 1 CHIL @I1692@ 1 MARR 2 DATE 1816 0 @F241@ FAM 1 HUSB @I655@ 1 WIFE @I656@ 1 CHIL @I657@ 1 MARR 2 DATE 7 JAN 1879 2 PLAC Arolsen 0 @F242@ FAM 1 HUSB @I658@ 1 WIFE @I657@ 1 CHIL @I659@ 1 MARR 2 DATE 7 FEB 1901 2 PLAC The Hague,Netherlands 0 @F243@ FAM 1 HUSB @I660@ 1 WIFE @I659@ 1 CHIL @I661@ 1 CHIL @I1204@ 1 CHIL @I1205@ 1 CHIL @I1206@ 1 MARR 2 DATE 7 JAN 1937 2 PLAC The Hague,Netherlands 0 @F244@ FAM 1 HUSB @I613@ 1 WIFE @I662@ 1 CHIL @I663@ 0 @F245@ FAM 1 HUSB @I663@ 1 WIFE @I664@ 1 CHIL @I665@ 0 @F246@ FAM 1 HUSB @I666@ 1 WIFE @I665@ 1 CHIL @I667@ 0 @F247@ FAM 1 HUSB @I668@ 1 WIFE @I667@ 1 CHIL @I669@ 0 @F248@ FAM 1 HUSB @I669@ 1 WIFE @I670@ 1 CHIL @I671@ 0 @F249@ FAM 1 HUSB @I672@ 1 WIFE @I671@ 1 CHIL @I673@ 0 @F250@ FAM 1 HUSB @I673@ 1 WIFE @I674@ 1 CHIL @I675@ 0 @F251@ FAM 1 HUSB @I676@ 1 WIFE @I675@ 1 CHIL @I677@ 0 @F252@ FAM 1 HUSB @I678@ 1 WIFE @I679@ 1 CHIL @I680@ 0 @F253@ FAM 1 HUSB @I680@ 1 WIFE @I681@ 1 CHIL @I682@ 0 @F254@ FAM 1 HUSB @I683@ 1 WIFE @I682@ 1 CHIL @I2634@ 1 CHIL @I2635@ 1 CHIL @I409@ 1 MARR 2 DATE 1879 0 @F255@ FAM 1 HUSB @I684@ 1 WIFE @I595@ 1 CHIL @I685@ 0 @F256@ FAM 1 HUSB @I686@ 1 WIFE @I685@ 1 CHIL @I687@ 0 @F257@ FAM 1 HUSB @I688@ 1 WIFE @I687@ 1 CHIL @I689@ 1 MARR 2 DATE 20 FEB 1868 2 PLAC Vienna,Austria 0 @F258@ FAM 1 HUSB @I689@ 1 WIFE @I690@ 1 CHIL @I1183@ 1 CHIL @I1184@ 1 CHIL @I691@ 1 CHIL @I1185@ 0 @F259@ FAM 1 HUSB @I692@ 1 WIFE @I693@ 1 CHIL @I694@ 1 CHIL @I695@ 1 CHIL @I696@ 1 CHIL @I697@ 1 CHIL @I698@ 1 CHIL @I699@ 1 CHIL @I700@ 1 CHIL @I701@ 1 CHIL @I702@ 1 CHIL @I703@ 1 CHIL @I704@ 1 CHIL @I705@ 1 MARR 2 DATE 28 JUL 1683 2 PLAC Chapel Royal,St. James,England 0 @F260@ FAM 1 HUSB @I706@ 1 WIFE @I707@ 1 CHIL @I708@ 1 CHIL @I709@ 1 CHIL @I710@ 1 CHIL @I693@ 1 CHIL @I711@ 1 CHIL @I712@ 1 CHIL @I713@ 1 CHIL @I714@ 1 MARR 2 DATE 24 NOV 1659 2 PLAC Breda 0 @F261@ FAM 1 HUSB @I706@ 1 WIFE @I715@ 1 CHIL @I716@ 1 CHIL @I717@ 1 CHIL @I718@ 1 CHIL @I719@ 1 CHIL @I720@ 1 MARR 2 DATE 21 NOV 1673 2 PLAC Dover,,England 0 @F262@ FAM 1 HUSB @I719@ 1 WIFE @I721@ 1 CHIL @I722@ 1 CHIL @I723@ 1 MARR 2 DATE 3 SEP 1719 2 PLAC Monte Fiascone 0 @F263@ FAM 1 HUSB @I722@ 1 WIFE @I724@ 1 MARR 2 DATE 17 APR 1772 2 PLAC Marcerata 0 @F264@ FAM 1 HUSB @I725@ 1 WIFE @I726@ 1 CHIL @I727@ 1 CHIL @I728@ 1 CHIL @I729@ 1 CHIL @I730@ 1 CHIL @I731@ 1 CHIL @I732@ 1 CHIL @I733@ 1 CHIL @I734@ 1 MARR 2 DATE 23 NOV 1589 2 PLAC Oslo,Norway 0 @F265@ FAM 1 HUSB @I735@ 1 WIFE @I728@ 1 CHIL @I2114@ 1 CHIL @I765@ 1 CHIL @I766@ 1 CHIL @I767@ 1 CHIL @I768@ 1 CHIL @I2115@ 1 CHIL @I2116@ 1 CHIL @I2117@ 1 CHIL @I2118@ 1 CHIL @I2119@ 1 CHIL @I736@ 1 MARR 2 DATE 14 FEB 1613 2 PLAC Whitehall 0 @F266@ FAM 1 HUSB @I758@ 1 WIFE @I736@ 1 CHIL @I341@ 1 CHIL @I2123@ 1 CHIL @I2124@ 1 CHIL @I2125@ 1 CHIL @I2126@ 1 CHIL @I770@ 1 CHIL @I771@ 0 @F267@ FAM 1 HUSB @I772@ 1 WIFE @I771@ 1 CHIL @I1177@ 1 CHIL @I1178@ 1 CHIL @I761@ 1 MARR 2 DATE 8 OCT 1684 2 PLAC Herrenhausen 0 @F268@ FAM 1 HUSB @I737@ 1 WIFE @I738@ 1 CHIL @I726@ 1 CHIL @I1627@ 1 CHIL @I2860@ 1 CHIL @I2861@ 1 CHIL @I2862@ 1 MARR 2 DATE 20 JUL 1572 2 PLAC Copenhagen,Denmark 0 @F269@ FAM 1 HUSB @I750@ 1 WIFE @I744@ 1 CHIL @I757@ 0 @F270@ FAM 1 HUSB @I730@ 1 WIFE @I739@ 1 CHIL @I742@ 1 CHIL @I743@ 1 CHIL @I744@ 1 CHIL @I706@ 1 CHIL @I745@ 1 CHIL @I746@ 1 CHIL @I747@ 1 CHIL @I748@ 1 CHIL @I749@ 1 MARR 2 DATE 13 JUN 1625 2 PLAC Canterbury,,England 0 @F271@ FAM 1 HUSB @I740@ 1 WIFE @I741@ 1 CHIL @I529@ 1 CHIL @I896@ 1 CHIL @I2913@ 1 CHIL @I590@ 1 CHIL @I739@ 1 MARR 2 DATE 17 DEC 1600 0 @F272@ FAM 1 HUSB @I751@ 1 WIFE @I749@ 1 CHIL @I951@ 1 CHIL @I2128@ 1 MARR 2 DATE 31 MAR 1661 2 PLAC Paris,,France 0 @F273@ FAM 1 HUSB @I743@ 1 WIFE @I752@ 1 MARR 2 DATE 20 MAY 1662 2 PLAC Portsmouth,England 0 @F274@ FAM 1 HUSB @I753@ 1 WIFE @I754@ 1 CHIL @I752@ 0 @F275@ FAM 1 HUSB @I755@ 1 WIFE @I756@ 1 CHIL @I715@ 0 @F276@ FAM 1 HUSB @I757@ 1 WIFE @I709@ 1 MARR 2 DATE 4 NOV 1677 2 PLAC St. James Palace,,England 0 @F277@ FAM 1 HUSB @I759@ 1 WIFE @I760@ 1 CHIL @I219@ 0 @F278@ FAM 1 HUSB @I1172@ 1 WIFE @I419@ 0 @F279@ FAM 1 HUSB @I336@ 1 WIFE @I762@ 1 CHIL @I290@ 1 CHIL @I2146@ 0 @F280@ FAM 1 HUSB @I337@ 1 WIFE @I763@ 0 @F281@ FAM 1 HUSB @I764@ 1 WIFE @I340@ 1 CHIL @I1617@ 1 CHIL @I1653@ 1 DIV Y 1 MARR 2 DATE 8 NOV 1766 2 PLAC Christiansborg 0 @F282@ FAM 1 HUSB @I773@ 1 WIFE @I774@ 1 CHIL @I775@ 1 CHIL @I776@ 1 CHIL @I828@ 1 CHIL @I829@ 1 CHIL @I830@ 1 CHIL @I831@ 1 CHIL @I832@ 1 MARR 2 DATE 18 JAN 1486 2 PLAC Westminster,,England 0 @F283@ FAM 1 HUSB @I777@ 1 WIFE @I778@ 1 CHIL @I401@ 0 @F284@ FAM 1 HUSB @I779@ 1 WIFE @I780@ 1 CHIL @I399@ 0 @F285@ FAM 1 HUSB @I781@ 1 WIFE @I782@ 1 CHIL @I398@ 0 @F286@ FAM 1 HUSB @I783@ 1 WIFE @I784@ 1 CHIL @I400@ 0 @F287@ FAM 1 HUSB @I785@ 1 WIFE @I786@ 1 CHIL @I387@ 0 @F288@ FAM 1 HUSB @I788@ 1 WIFE @I787@ 1 CHIL @I386@ 0 @F289@ FAM 1 HUSB @I789@ 1 WIFE @I790@ 1 CHIL @I388@ 0 @F290@ FAM 1 HUSB @I792@ 1 WIFE @I791@ 1 CHIL @I389@ 0 @F291@ FAM 1 HUSB @I793@ 1 WIFE @I794@ 1 CHIL @I392@ 0 @F292@ FAM 1 HUSB @I795@ 1 WIFE @I796@ 1 CHIL @I393@ 0 @F293@ FAM 1 HUSB @I797@ 1 WIFE @I798@ 1 CHIL @I394@ 0 @F294@ FAM 1 HUSB @I799@ 1 WIFE @I800@ 1 CHIL @I395@ 0 @F295@ FAM 1 HUSB @I802@ 1 WIFE @I319@ 1 DIV Y 1 MARR 2 DATE SEP 1971 0 @F296@ FAM 1 HUSB @I803@ 1 WIFE @I1607@ 1 CHIL @I69@ 0 @F297@ FAM 1 HUSB @I804@ 1 WIFE @I93@ 1 MARR 2 DATE 1969 0 @F298@ FAM 1 HUSB @I804@ 1 WIFE @I805@ 0 @F299@ FAM 1 HUSB @I2984@ 1 WIFE @I806@ 1 CHIL @I243@ 1 DIV Y 1 MARR 2 DATE 23 APR 1927 0 @F300@ FAM 1 HUSB @I807@ 1 WIFE @I241@ 1 CHIL @I808@ 1 MARR 2 DATE MAR 1978 2 PLAC ,London,England 0 @F301@ FAM 1 HUSB @I809@ 1 WIFE @I240@ 1 MARR 2 DATE MAY 1980 0 @F302@ FAM 1 HUSB @I810@ 1 CHIL @I807@ 0 @F303@ FAM 1 HUSB @I811@ 1 WIFE @I812@ 1 CHIL @I813@ 1 CHIL @I169@ 0 @F304@ FAM 1 HUSB @I814@ 1 WIFE @I2947@ 1 CHIL @I811@ 0 @F305@ FAM 1 HUSB @I815@ 1 CHIL @I814@ 0 @F306@ FAM 1 HUSB @I816@ 1 WIFE @I817@ 1 CHIL @I815@ 0 @F307@ FAM 1 HUSB @I818@ 1 CHIL @I816@ 0 @F308@ FAM 1 HUSB @I819@ 1 CHIL @I818@ 0 @F309@ FAM 1 HUSB @I820@ 1 WIFE @I821@ 1 CHIL @I170@ 0 @F310@ FAM 1 HUSB @I823@ 1 WIFE @I824@ 1 MARR 2 DATE ABT 1953 0 @F311@ FAM 1 HUSB @I823@ 1 WIFE @I170@ 1 MARR 2 DATE JUL 1975 2 PLAC Chichester,Register Office,England 0 @F312@ FAM 1 HUSB @I825@ 1 WIFE @I822@ 1 CHIL @I826@ 1 CHIL @I2959@ 1 DIV Y 1 MARR 2 DATE JUL 1976 2 PLAC Dummer,,England 0 @F313@ FAM 1 HUSB @I775@ 1 WIFE @I833@ 1 MARR 2 DATE 14 NOV 1501 2 PLAC St. Pauls Cath.,London,England 0 @F314@ FAM 1 HUSB @I834@ 1 WIFE @I776@ 1 CHIL @I835@ 1 MARR 2 DATE 8 AUG 1503 2 PLAC Holyrod Abbey 0 @F315@ FAM 1 HUSB @I1473@ 1 WIFE @I1472@ 0 @F316@ FAM 1 HUSB @I837@ 1 WIFE @I776@ 1 MARR 2 DATE 3 MAR 1528 0 @F317@ FAM 1 HUSB @I838@ 1 WIFE @I830@ 1 MARR 2 DATE 9 OCT 1514 2 PLAC Abbeville 0 @F318@ FAM 1 HUSB @I839@ 1 WIFE @I830@ 1 CHIL @I1426@ 1 CHIL @I1427@ 1 CHIL @I1428@ 1 MARR 2 DATE 3 MAR 1515 2 PLAC Paris,France 0 @F319@ FAM 1 HUSB @I828@ 1 WIFE @I833@ 1 CHIL @I842@ 1 CHIL @I843@ 1 CHIL @I844@ 1 CHIL @I845@ 1 CHIL @I846@ 1 CHIL @I847@ 1 DIV Y 1 MARR 2 DATE 11 JUN 1509 2 PLAC Grey Friars Ch.,Greenwich,England 0 @F320@ FAM 1 HUSB @I840@ 1 WIFE @I841@ 1 CHIL @I2887@ 1 CHIL @I2889@ 1 CHIL @I2100@ 1 CHIL @I2888@ 1 CHIL @I833@ 1 MARR 2 DATE 1469 0 @F321@ FAM 1 HUSB @I828@ 1 WIFE @I848@ 1 CHIL @I849@ 1 CHIL @I850@ 1 MARR 2 DATE 25 JAN 1533 2 PLAC Westminster,London,England 0 @F322@ FAM 1 HUSB @I828@ 1 WIFE @I851@ 1 CHIL @I852@ 1 MARR 2 DATE 30 MAY 1536 2 PLAC York Place,,England 0 @F323@ FAM 1 HUSB @I828@ 1 WIFE @I853@ 1 DIV Y 1 MARR 2 DATE 6 JAN 1540 2 PLAC Greenwich,,England 0 @F324@ FAM 1 HUSB @I854@ 1 WIFE @I855@ 1 CHIL @I853@ 0 @F325@ FAM 1 HUSB @I828@ 1 WIFE @I856@ 1 MARR 2 DATE 28 JUL 1540 2 PLAC Hampton Court,Palace,England 0 @F326@ FAM 1 HUSB @I857@ 1 WIFE @I858@ 1 CHIL @I856@ 0 @F327@ FAM 1 HUSB @I828@ 1 WIFE @I859@ 1 MARR 2 DATE 12 JUL 1543 2 PLAC Hampton Court,Palace 0 @F328@ FAM 1 HUSB @I860@ 1 WIFE @I861@ 1 CHIL @I851@ 0 @F329@ FAM 1 HUSB @I862@ 1 WIFE @I859@ 1 MARR 2 DATE ABT 1529 0 @F330@ FAM 1 HUSB @I863@ 1 WIFE @I859@ 1 MARR 2 DATE 1533 0 @F331@ FAM 1 HUSB @I864@ 1 WIFE @I859@ 1 CHIL @I867@ 1 MARR 2 DATE 4 APR 1547 0 @F332@ FAM 1 HUSB @I865@ 1 WIFE @I866@ 1 CHIL @I859@ 1 CHIL @I2309@ 0 @F333@ FAM 1 HUSB @I869@ 1 WIFE @I868@ 1 MARR 2 DATE 21 MAY 1553 2 PLAC Durham House,London,England 0 @F334@ FAM 1 HUSB @I870@ 1 WIFE @I846@ 1 MARR 2 DATE 25 JUL 1554 2 PLAC Winchester,Cathedral,,England 0 @F335@ FAM 1 HUSB @I871@ 1 WIFE @I872@ 1 CHIL @I870@ 0 @F336@ FAM 1 HUSB @I876@ 1 WIFE @I1370@ 1 MARR 2 DATE 23 APR 1224 0 @F337@ FAM 1 HUSB @I877@ 1 WIFE @I878@ 1 CHIL @I879@ 1 CHIL @I880@ 1 CHIL @I881@ 0 @F338@ FAM 1 HUSB @I874@ 1 WIFE @I882@ 1 CHIL @I883@ 1 CHIL @I884@ 1 DIV Y 1 MARR 2 DATE 1957 2 PLAC Salem,Bavaria 0 @F339@ FAM 1 HUSB @I874@ 1 WIFE @I885@ 1 CHIL @I886@ 0 @F340@ FAM 1 HUSB @I875@ 1 WIFE @I887@ 1 CHIL @I888@ 1 CHIL @I889@ 0 @F341@ FAM 1 HUSB @I875@ 1 WIFE @I890@ 1 CHIL @I891@ 1 CHIL @I892@ 0 @F342@ FAM 1 HUSB @I875@ 1 WIFE @I893@ 0 @F343@ FAM 1 HUSB @I2543@ 1 WIFE @I2545@ 1 MARR 2 DATE 6 DEC 1491 0 @F344@ FAM 1 HUSB @I2426@ 1 WIFE @I2920@ 1 CHIL @I1422@ 0 @F345@ FAM 1 HUSB @I900@ 1 WIFE @I899@ 1 CHIL @I901@ 1 DIV Y 1 MARR 2 DATE 1976 2 PLAC Dinard,,France 0 @F346@ FAM 1 HUSB @I902@ 1 WIFE @I895@ 1 CHIL @I903@ 1 CHIL @I904@ 1 CHIL @I890@ 1 CHIL @I905@ 1 CHIL @I906@ 1 CHIL @I907@ 1 MARR 2 DATE 1925 0 @F347@ FAM 1 HUSB @I903@ 1 WIFE @I908@ 1 CHIL @I909@ 1 CHIL @I910@ 1 CHIL @I911@ 1 CHIL @I912@ 0 @F348@ FAM 1 HUSB @I910@ 1 WIFE @I913@ 0 @F349@ FAM 1 HUSB @I911@ 1 WIFE @I914@ 1 CHIL @I915@ 0 @F350@ FAM 1 HUSB @I916@ 1 WIFE @I906@ 1 CHIL @I917@ 1 CHIL @I918@ 1 CHIL @I919@ 0 @F351@ FAM 1 HUSB @I533@ 1 WIFE @I532@ 1 CHIL @I1366@ 0 @F352@ FAM 1 HUSB @I925@ 1 WIFE @I926@ 1 CHIL @I927@ 1 MARR 2 DATE 1984 0 @F353@ FAM 1 HUSB @I924@ 1 WIFE @I928@ 1 CHIL @I929@ 1 CHIL @I930@ 0 @F354@ FAM 1 HUSB @I922@ 1 WIFE @I931@ 1 CHIL @I932@ 1 CHIL @I933@ 0 @F355@ FAM 1 HUSB @I921@ 1 WIFE @I934@ 1 CHIL @I935@ 1 DIV Y 0 @F356@ FAM 1 HUSB @I921@ 1 WIFE @I936@ 1 CHIL @I937@ 1 CHIL @I938@ 1 CHIL @I939@ 0 @F357@ FAM 1 HUSB @I293@ 1 WIFE @I940@ 1 CHIL @I941@ 1 CHIL @I942@ 1 CHIL @I943@ 1 CHIL @I944@ 1 MARR 2 DATE 1979 0 @F358@ FAM 1 HUSB @I294@ 1 WIFE @I945@ 1 CHIL @I946@ 1 CHIL @I947@ 1 MARR 2 DATE 1973 0 @F359@ FAM 1 HUSB @I295@ 1 WIFE @I948@ 1 CHIL @I949@ 1 CHIL @I950@ 1 MARR 2 DATE 1981 0 @F360@ FAM 1 HUSB @I953@ 1 WIFE @I952@ 1 CHIL @I954@ 1 MARR 2 DATE 1923 0 @F361@ FAM 1 HUSB @I954@ 1 WIFE @I955@ 1 CHIL @I956@ 1 CHIL @I957@ 1 DIV Y 1 MARR 2 DATE 1956 0 @F362@ FAM 1 HUSB @I960@ 1 WIFE @I959@ 1 CHIL @I961@ 1 CHIL @I962@ 1 CHIL @I963@ 1 CHIL @I964@ 1 CHIL @I965@ 1 MARR 2 DATE 1961 2 PLAC Asker,Near Oslo,Norway 0 @F363@ FAM 1 HUSB @I966@ 1 WIFE @I958@ 1 CHIL @I967@ 1 CHIL @I968@ 1 CHIL @I969@ 1 MARR 2 DATE 1953 0 @F364@ FAM 1 HUSB @I438@ 1 WIFE @I971@ 1 CHIL @I1057@ 1 DIV Y 1 MARR 2 DATE 31 AUG 1918 2 PLAC Odessa 0 @F365@ FAM 1 HUSB @I977@ 1 WIFE @I973@ 1 CHIL @I978@ 1 MARR 2 DATE 1983 0 @F366@ FAM 1 HUSB @I979@ 1 WIFE @I974@ 1 CHIL @I980@ 1 MARR 2 DATE 1984 0 @F367@ FAM 1 HUSB @I981@ 1 CHIL @I111@ 0 @F368@ FAM 1 HUSB @I297@ 1 WIFE @I983@ 1 MARR 2 DATE 1979 0 @F369@ FAM 1 HUSB @I984@ 1 WIFE @I985@ 1 CHIL @I986@ 1 MARR 2 DATE 12 JUL 1472 2 PLAC Westminster,,London,England 0 @F370@ FAM 1 HUSB @I987@ 1 WIFE @I1339@ 1 CHIL @I1340@ 1 CHIL @I985@ 0 @F371@ FAM 1 HUSB @I988@ 1 WIFE @I989@ 1 CHIL @I991@ 1 CHIL @I992@ 1 CHIL @I993@ 1 CHIL @I984@ 1 CHIL @I994@ 1 CHIL @I995@ 1 CHIL @I996@ 1 CHIL @I997@ 0 @F372@ FAM 1 HUSB @I990@ 1 WIFE @I1331@ 1 CHIL @I1342@ 1 CHIL @I989@ 0 @F373@ FAM 1 HUSB @I991@ 1 WIFE @I998@ 1 CHIL @I774@ 1 CHIL @I999@ 1 CHIL @I1000@ 1 CHIL @I1001@ 1 CHIL @I1002@ 1 CHIL @I1003@ 1 CHIL @I1004@ 1 CHIL @I1005@ 1 CHIL @I1006@ 1 CHIL @I1007@ 1 MARR 2 DATE 1 MAY 1464 2 PLAC Grafton Regis,Northants 0 @F374@ FAM 1 HUSB @I1008@ 1 WIFE @I1000@ 1 MARR 2 DATE BEF DEC 1487 0 @F375@ FAM 1 HUSB @I1009@ 1 WIFE @I1000@ 1 MARR 2 DATE BEF JAN 1504 0 @F376@ FAM 1 HUSB @I1003@ 1 WIFE @I1010@ 1 MARR 2 DATE 15 JAN 1478 2 PLAC St. Stephen's,Chapel,Westminster,England 0 @F377@ FAM 1 HUSB @I1011@ 1 WIFE @I1004@ 1 MARR 2 DATE 4 FEB 1495 0 @F378@ FAM 1 HUSB @I1012@ 1 WIFE @I1006@ 1 MARR 2 DATE BEF OCT 1495 0 @F379@ FAM 1 HUSB @I1013@ 1 WIFE @I998@ 1 CHIL @I1014@ 1 CHIL @I1015@ 1 MARR 2 DATE BEF 1460 0 @F380@ FAM 1 HUSB @I1016@ 1 WIFE @I985@ 1 MARR 2 DATE AUG 1470 2 PLAC Amboise 0 @F381@ FAM 1 HUSB @I993@ 1 WIFE @I1340@ 1 CHIL @I1018@ 1 CHIL @I1019@ 0 @F382@ FAM 1 HUSB @I1020@ 1 WIFE @I994@ 0 @F383@ FAM 1 HUSB @I1021@ 1 WIFE @I994@ 0 @F384@ FAM 1 HUSB @I1022@ 1 WIFE @I996@ 0 @F385@ FAM 1 HUSB @I1023@ 1 WIFE @I1024@ 1 CHIL @I988@ 1 CHIL @I1025@ 0 @F386@ FAM 1 HUSB @I1026@ 1 WIFE @I1025@ 0 @F387@ FAM 1 HUSB @I1027@ 1 WIFE @I1028@ 1 CHIL @I605@ 1 MARR 2 DATE 1850 0 @F388@ FAM 1 HUSB @I653@ 1 WIFE @I1029@ 1 CHIL @I1028@ 1 CHIL @I512@ 1 CHIL @I1683@ 1 CHIL @I1684@ 1 MARR 2 DATE 1825 0 @F389@ FAM 1 HUSB @I1033@ 1 WIFE @I1032@ 1 CHIL @I2711@ 1 CHIL @I2712@ 1 MARR 2 DATE 1963 0 @F390@ FAM 1 HUSB @I1034@ 1 WIFE @I1036@ 1 MARR 2 DATE 1960 0 @F391@ FAM 1 HUSB @I1031@ 1 WIFE @I1037@ 1 CHIL @I2706@ 1 CHIL @I2707@ 1 CHIL @I2708@ 1 MARR 2 DATE 1946 0 @F392@ FAM 1 HUSB @I1030@ 1 WIFE @I1038@ 1 CHIL @I1039@ 1 CHIL @I1040@ 1 CHIL @I1041@ 1 CHIL @I1042@ 1 CHIL @I1043@ 1 CHIL @I1044@ 0 @F393@ FAM 1 HUSB @I1045@ 1 WIFE @I1039@ 0 @F394@ FAM 1 HUSB @I1040@ 1 WIFE @I1046@ 1 CHIL @I1047@ 1 CHIL @I1048@ 0 @F395@ FAM 1 HUSB @I1041@ 1 WIFE @I1049@ 1 CHIL @I1050@ 1 DIV N 1 MARR 2 DATE SEP 1988 0 @F396@ FAM 1 HUSB @I1051@ 1 WIFE @I1043@ 0 @F397@ FAM 1 HUSB @I1052@ 1 WIFE @I255@ 0 @F398@ FAM 1 HUSB @I1053@ 1 WIFE @I257@ 0 @F399@ FAM 1 HUSB @I260@ 1 WIFE @I1054@ 1 CHIL @I469@ 0 @F400@ FAM 1 HUSB @I1055@ 1 WIFE @I1056@ 1 CHIL @I971@ 0 @F401@ FAM 1 HUSB @I438@ 1 WIFE @I1058@ 1 MARR 2 DATE 3 JUN 1947 2 PLAC Rio de Janerio,Brazil 0 @F402@ FAM 1 HUSB @I608@ 1 WIFE @I1059@ 1 CHIL @I610@ 1 CHIL @I1672@ 1 CHIL @I472@ 1 MARR 2 DATE 24 MAY 1935 2 PLAC Stockholm,Sweden 0 @F403@ FAM 1 HUSB @I1065@ 1 WIFE @I1066@ 1 CHIL @I473@ 0 @F404@ FAM 1 HUSB @I1067@ 1 WIFE @I1068@ 1 CHIL @I247@ 0 @F405@ FAM 1 HUSB @I247@ 1 WIFE @I1069@ 1 CHIL @I1070@ 1 CHIL @I1071@ 1 CHIL @I1072@ 1 CHIL @I1073@ 0 @F406@ FAM 1 HUSB @I1070@ 1 WIFE @I1074@ 1 DIV Y 0 @F407@ FAM 1 HUSB @I1070@ 1 WIFE @I1075@ 1 CHIL @I1076@ 1 CHIL @I1077@ 0 @F408@ FAM 1 HUSB @I1070@ 1 WIFE @I1078@ 1 CHIL @I1079@ 1 CHIL @I1080@ 1 CHIL @I1081@ 0 @F409@ FAM 1 HUSB @I1080@ 1 WIFE @I1082@ 0 @F410@ FAM 1 HUSB @I1083@ 1 WIFE @I1081@ 0 @F411@ FAM 1 HUSB @I1073@ 1 WIFE @I1084@ 1 CHIL @I1085@ 1 CHIL @I1086@ 1 CHIL @I1087@ 1 CHIL @I1088@ 1 CHIL @I1089@ 0 @F412@ FAM 1 HUSB @I1086@ 1 WIFE @I1079@ 1 CHIL @I1090@ 0 @F413@ FAM 1 HUSB @I1090@ 1 WIFE @I1091@ 1 CHIL @I1092@ 1 CHIL @I1093@ 0 @F414@ FAM 1 HUSB @I1094@ 1 WIFE @I1092@ 0 @F415@ FAM 1 HUSB @I1090@ 1 WIFE @I1095@ 0 @F416@ FAM 1 HUSB @I1099@ 1 WIFE @I1100@ 1 CHIL @I1101@ 1 CHIL @I309@ 1 CHIL @I1102@ 0 @F417@ FAM 1 HUSB @I1102@ 1 WIFE @I1103@ 1 MARR 2 DATE 1894 0 @F418@ FAM 1 HUSB @I1104@ 1 WIFE @I1105@ 1 CHIL @I1099@ 1 CHIL @I1106@ 1 CHIL @I1107@ 1 CHIL @I1108@ 1 CHIL @I1109@ 1 CHIL @I1110@ 0 @F419@ FAM 1 HUSB @I1111@ 1 WIFE @I1106@ 0 @F420@ FAM 1 HUSB @I1107@ 1 WIFE @I1112@ 1 MARR 2 DATE 15 NOV 1869 2 PLAC Neuwied,Germany 0 @F421@ FAM 1 HUSB @I1109@ 1 WIFE @I1113@ 0 @F422@ FAM 1 HUSB @I1114@ 1 WIFE @I1110@ 1 CHIL @I1115@ 1 CHIL @I1116@ 1 CHIL @I1117@ 1 CHIL @I1103@ 1 CHIL @I1118@ 1 MARR 2 DATE 1867 0 @F423@ FAM 1 HUSB @I1118@ 1 WIFE @I1119@ 1 CHIL @I600@ 1 CHIL @I1120@ 1 CHIL @I1121@ 1 MARR 2 DATE 2 OCT 1900 2 PLAC Munich,Germany 0 @F424@ FAM 1 HUSB @I1122@ 1 WIFE @I1121@ 1 MARR 2 DATE 1930 0 @F425@ FAM 1 HUSB @I1125@ 1 WIFE @I1123@ 1 MARR 2 DATE 1953 0 @F426@ FAM 1 HUSB @I601@ 1 WIFE @I1126@ 1 MARR 2 DATE 15 DEC 1960 2 PLAC Brussels,Belgium 0 @F427@ FAM 1 HUSB @I1124@ 1 WIFE @I1127@ 1 CHIL @I1128@ 1 CHIL @I1129@ 1 CHIL @I1130@ 1 MARR 2 DATE 1959 0 @F428@ FAM 1 HUSB @I1131@ 1 WIFE @I1129@ 0 @F429@ FAM 1 HUSB @I600@ 1 WIFE @I1132@ 1 CHIL @I1133@ 1 CHIL @I1134@ 1 CHIL @I1135@ 1 MARR 2 DATE 11 SEP 1941 2 PLAC Laeken 0 @F430@ FAM 1 HUSB @I1136@ 1 WIFE @I1134@ 1 DIV Y 0 @F431@ FAM 1 HUSB @I637@ 1 WIFE @I1137@ 1 CHIL @I1138@ 1 CHIL @I1139@ 1 CHIL @I1140@ 1 CHIL @I1074@ 1 CHIL @I1141@ 1 MARR 2 DATE 30 SEP 1785 2 PLAC Darmstadt 0 @F432@ FAM 1 HUSB @I1138@ 1 WIFE @I1142@ 1 CHIL @I1143@ 1 CHIL @I495@ 1 CHIL @I1148@ 1 CHIL @I1149@ 1 CHIL @I1150@ 1 CHIL @I1151@ 1 CHIL @I1152@ 1 CHIL @I1153@ 1 MARR 2 DATE 12 OCT 1810 2 PLAC Munich 0 @F433@ FAM 1 HUSB @I1143@ 1 WIFE @I1144@ 1 CHIL @I1145@ 1 CHIL @I1146@ 1 MARR 2 DATE 12 OCT 1842 2 PLAC Munich 0 @F434@ FAM 1 HUSB @I411@ 1 WIFE @I1155@ 0 @F435@ FAM 1 HUSB @I761@ 1 WIFE @I343@ 1 CHIL @I1160@ 1 CHIL @I1161@ 1 CHIL @I1162@ 1 CHIL @I1163@ 1 CHIL @I1164@ 1 CHIL @I1165@ 1 CHIL @I1166@ 1 CHIL @I1167@ 1 CHIL @I1168@ 1 CHIL @I568@ 1 CHIL @I1169@ 1 CHIL @I1170@ 1 CHIL @I1171@ 1 MARR 2 DATE 28 NOV 1706 2 PLAC Berlin 0 @F436@ FAM 1 HUSB @I772@ 1 WIFE @I1173@ 1 CHIL @I1174@ 1 CHIL @I1175@ 1 MARR 2 DATE 23 AUG 1679 2 PLAC Potsdam 0 @F437@ FAM 1 HUSB @I772@ 1 WIFE @I1176@ 1 MARR 2 DATE 28 NOV 1708 2 PLAC Berlin 0 @F438@ FAM 1 HUSB @I1150@ 1 WIFE @I1179@ 1 CHIL @I688@ 1 CHIL @I1180@ 1 CHIL @I1181@ 1 CHIL @I1182@ 0 @F439@ FAM 1 HUSB @I689@ 1 WIFE @I1186@ 1 CHIL @I1187@ 1 CHIL @I1188@ 1 CHIL @I1189@ 1 CHIL @I1190@ 1 CHIL @I1191@ 1 CHIL @I1192@ 0 @F440@ FAM 1 HUSB @I1193@ 1 WIFE @I1158@ 1 CHIL @I1194@ 1 CHIL @I1195@ 1 CHIL @I1196@ 1 CHIL @I1197@ 1 CHIL @I1198@ 1 CHIL @I1199@ 1 CHIL @I1200@ 1 CHIL @I1201@ 0 @F441@ FAM 1 HUSB @I1197@ 1 WIFE @I1202@ 1 CHIL @I1119@ 1 CHIL @I690@ 1 MARR 2 DATE 1874 0 @F442@ FAM 1 HUSB @I1203@ 1 WIFE @I74@ 0 @F443@ FAM 1 HUSB @I1207@ 1 WIFE @I661@ 1 CHIL @I1208@ 1 CHIL @I1209@ 1 CHIL @I1210@ 1 MARR 2 DATE 10 MAR 1966 2 PLAC Amsterdam,Netherlands 0 @F444@ FAM 1 HUSB @I1211@ 1 WIFE @I1212@ 1 CHIL @I1207@ 0 @F445@ FAM 1 HUSB @I1213@ 1 WIFE @I1214@ 1 CHIL @I658@ 1 MARR 2 DATE 1868 0 @F446@ FAM 1 HUSB @I1215@ 1 WIFE @I198@ 1 CHIL @I740@ 0 @F447@ FAM 1 HUSB @I655@ 1 WIFE @I1077@ 1 CHIL @I1678@ 1 CHIL @I1679@ 1 CHIL @I1680@ 1 MARR 2 DATE 18 JUN 1839 2 PLAC Stuttgart 0 @F448@ FAM 1 HUSB @I1217@ 1 WIFE @I1218@ 1 CHIL @I1016@ 1 MARR 2 DATE 22 APR 1445 2 PLAC Titchfield,Abbey,Hants 0 @F449@ FAM 1 HUSB @I1219@ 1 WIFE @I1220@ 1 CHIL @I1217@ 1 MARR 2 DATE 2 JUN 1420 2 PLAC Troyes 0 @F450@ FAM 1 HUSB @I1221@ 1 WIFE @I1222@ 1 CHIL @I1223@ 1 CHIL @I1219@ 1 CHIL @I1224@ 1 CHIL @I1225@ 1 CHIL @I1226@ 1 CHIL @I1227@ 1 CHIL @I1228@ 1 MARR 2 DATE 1380/1381 2 PLAC Arundel Castle 0 @F451@ FAM 1 HUSB @I1229@ 1 WIFE @I1230@ 1 CHIL @I1231@ 1 CHIL @I1232@ 1 CHIL @I1233@ 1 CHIL @I1234@ 1 CHIL @I1235@ 1 CHIL @I1236@ 1 CHIL @I1237@ 1 CHIL @I1238@ 1 CHIL @I1239@ 1 CHIL @I1240@ 1 CHIL @I1241@ 1 CHIL @I1242@ 1 MARR 2 DATE 24 JAN 1328 2 PLAC York Minster 0 @F452@ FAM 1 HUSB @I1236@ 1 WIFE @I1243@ 1 CHIL @I1501@ 1 CHIL @I1502@ 1 CHIL @I1221@ 1 MARR 2 DATE 13 MAY 1359 2 PLAC Reading 0 @F453@ FAM 1 HUSB @I1245@ 1 WIFE @I1244@ 1 CHIL @I683@ 1 MARR 2 DATE 1846 0 @F454@ FAM 1 HUSB @I1246@ 1 WIFE @I2874@ 1 CHIL @I1244@ 1 MARR 2 DATE 1829 0 @F455@ FAM 1 HUSB @I1249@ 1 WIFE @I1247@ 1 CHIL @I725@ 1 MARR 2 DATE 29 JUL 1565 2 PLAC Edinburgh,Scotland 0 @F456@ FAM 1 HUSB @I1248@ 1 WIFE @I1247@ 1 MARR 2 DATE 24 APR 1558 2 PLAC Paris,France 0 @F457@ FAM 1 HUSB @I1250@ 1 WIFE @I1247@ 1 MARR 2 DATE ABT 1567 0 @F458@ FAM 1 HUSB @I835@ 1 WIFE @I1429@ 0 @F459@ FAM 1 HUSB @I835@ 1 WIFE @I1251@ 1 CHIL @I1247@ 1 MARR 2 DATE 1538 0 @F460@ FAM 1 HUSB @I1252@ 1 WIFE @I1469@ 1 CHIL @I834@ 1 CHIL @I2867@ 1 CHIL @I2868@ 1 MARR 2 DATE 1469 0 @F461@ FAM 1 HUSB @I1254@ 1 WIFE @I1255@ 1 CHIL @I773@ 0 @F462@ FAM 1 HUSB @I1260@ 1 WIFE @I2546@ 1 CHIL @I838@ 1 MARR 2 DATE 1462 0 @F463@ FAM 1 HUSB @I1259@ 1 WIFE @I1257@ 1 MARR 2 DATE MAY 1332 2 PLAC Ni jmegen 0 @F464@ FAM 1 HUSB @I1261@ 1 WIFE @I1262@ 1 CHIL @I1263@ 1 CHIL @I1264@ 1 CHIL @I1265@ 1 CHIL @I1266@ 1 CHIL @I1267@ 1 CHIL @I1268@ 1 CHIL @I1269@ 1 CHIL @I1270@ 1 CHIL @I1271@ 1 CHIL @I1272@ 1 CHIL @I1273@ 1 CHIL @I1274@ 1 CHIL @I286@ 1 CHIL @I1275@ 1 CHIL @I1276@ 1 MARR 2 DATE OCT 1254 2 PLAC Las Huelgas 0 @F465@ FAM 1 HUSB @I1261@ 1 WIFE @I1277@ 1 CHIL @I1278@ 1 CHIL @I1279@ 1 CHIL @I1280@ 1 MARR 2 DATE 10 SEP 1299 2 PLAC Canterbury,Cathedral 0 @F466@ FAM 1 HUSB @I1281@ 1 WIFE @I1282@ 1 CHIL @I1261@ 1 CHIL @I1283@ 1 CHIL @I1284@ 1 CHIL @I1285@ 1 CHIL @I1286@ 1 CHIL @I1287@ 1 CHIL @I1288@ 1 CHIL @I1289@ 1 CHIL @I1290@ 1 MARR 2 DATE 4 JAN 1236 2 PLAC Canterbury,Cathedral 0 @F467@ FAM 1 HUSB @I1291@ 1 WIFE @I1292@ 1 CHIL @I781@ 0 @F468@ FAM 1 HUSB @I565@ 1 WIFE @I1293@ 1 MARR 2 DATE 17 FEB 1841 2 PLAC Berlin,Germany 0 @F469@ FAM 1 HUSB @I1294@ 1 WIFE @I1295@ 1 CHIL @I1296@ 1 CHIL @I654@ 1 CHIL @I42@ 1 MARR 2 DATE 1776 0 @F470@ FAM 1 HUSB @I1296@ 1 WIFE @I1297@ 1 CHIL @I1298@ 0 @F471@ FAM 1 HUSB @I1300@ 1 WIFE @I1299@ 1 CHIL @I1294@ 1 MARR 2 DATE 1745 0 @F472@ FAM 1 HUSB @I1301@ 1 WIFE @I1302@ 1 CHIL @I1303@ 1 CHIL @I1304@ 1 MARR 2 DATE 1712 0 @F473@ FAM 1 HUSB @I1419@ 1 WIFE @I1303@ 1 CHIL @I1300@ 1 MARR 2 DATE 1725 0 @F474@ FAM 1 HUSB @I1301@ 1 WIFE @I1305@ 1 CHIL @I1306@ 1 DIV Y 0 @F475@ FAM 1 HUSB @I1306@ 1 WIFE @I1307@ 1 CHIL @I1308@ 0 @F476@ FAM 1 HUSB @I1309@ 1 WIFE @I1310@ 1 CHIL @I1325@ 1 CHIL @I1324@ 1 CHIL @I1311@ 1 MARR 2 DATE ABT 1641 0 @F477@ FAM 1 HUSB @I1312@ 1 WIFE @I1313@ 1 CHIL @I1309@ 1 MARR 2 DATE 1626 0 @F478@ FAM 1 HUSB @I1309@ 1 WIFE @I1314@ 1 CHIL @I1301@ 1 MARR 2 DATE ABT 1670 0 @F479@ FAM 1 HUSB @I1311@ 1 WIFE @I1315@ 1 CHIL @I1316@ 0 @F480@ FAM 1 HUSB @I1316@ 1 WIFE @I1317@ 1 CHIL @I1319@ 1 CHIL @I1318@ 0 @F481@ FAM 1 HUSB @I1320@ 1 WIFE @I1319@ 1 CHIL @I1321@ 0 @F482@ FAM 1 HUSB @I1322@ 1 WIFE @I1321@ 1 CHIL @I1323@ 0 @F483@ FAM 1 HUSB @I1326@ 1 WIFE @I2662@ 1 CHIL @I1314@ 0 @F484@ FAM 1 HUSB @I1225@ 1 WIFE @I1327@ 1 MARR 2 DATE 22 APR 1433 2 PLAC Therouenne 0 @F485@ FAM 1 HUSB @I1236@ 1 WIFE @I1328@ 1 CHIL @I1329@ 1 CHIL @I1330@ 1 CHIL @I1331@ 1 CHIL @I1437@ 1 MARR 2 DATE 13 JAN 1396 2 PLAC Lincoln 0 @F486@ FAM 1 HUSB @I1329@ 1 WIFE @I1595@ 1 CHIL @I1333@ 1 CHIL @I1334@ 1 CHIL @I1335@ 1 CHIL @I1465@ 1 CHIL @I2079@ 0 @F487@ FAM 1 HUSB @I1334@ 1 WIFE @I1336@ 1 CHIL @I1255@ 0 @F488@ FAM 1 HUSB @I1237@ 1 WIFE @I1337@ 1 CHIL @I1023@ 1 CHIL @I1338@ 1 CHIL @I2294@ 1 MARR 2 DATE ABT 1 MAR 1372 2 PLAC Hertford 0 @F489@ FAM 1 HUSB @I531@ 1 WIFE @I530@ 1 CHIL @I741@ 0 @F490@ FAM 1 HUSB @I1342@ 1 CHIL @I987@ 0 @F491@ FAM 1 HUSB @I1242@ 1 WIFE @I1343@ 1 CHIL @I2071@ 1 CHIL @I1603@ 1 CHIL @I2072@ 1 CHIL @I2073@ 1 MARR 2 DATE 1374 0 @F492@ FAM 1 HUSB @I1344@ 1 WIFE @I1345@ 1 CHIL @I1346@ 1 CHIL @I2280@ 1 CHIL @I1024@ 1 CHIL @I2281@ 0 @F493@ FAM 1 HUSB @I1235@ 1 WIFE @I1347@ 1 MARR 2 DATE 28 MAY 1368 2 PLAC Milan,Italy 0 @F494@ FAM 1 HUSB @I1349@ 1 WIFE @I1348@ 1 CHIL @I1344@ 1 CHIL @I2283@ 1 CHIL @I2284@ 1 CHIL @I2285@ 0 @F495@ FAM 1 HUSB @I1350@ 1 WIFE @I1255@ 0 @F496@ FAM 1 HUSB @I1351@ 1 WIFE @I1255@ 0 @F497@ FAM 1 HUSB @I1352@ 1 WIFE @I1220@ 1 CHIL @I1353@ 1 CHIL @I1254@ 0 @F498@ FAM 1 HUSB @I155@ 1 WIFE @I1354@ 1 CHIL @I502@ 1 CHIL @I1360@ 1 MARR 2 DATE JUL 1912 2 PLAC Vienna,Austria 0 @F499@ FAM 1 HUSB @I152@ 1 WIFE @I1356@ 1 CHIL @I1357@ 1 CHIL @I1358@ 1 CHIL @I1359@ 1 MARR 2 DATE 1902 2 PLAC Leghorn 0 @F500@ FAM 1 HUSB @I1361@ 1 WIFE @I156@ 1 DIV Y 1 MARR 2 DATE JUL 1901 0 @F501@ FAM 1 HUSB @I1363@ 1 WIFE @I333@ 1 CHIL @I143@ 0 @F502@ FAM 1 HUSB @I1364@ 1 WIFE @I1365@ 1 DIV Y 1 MARR 2 DATE 29 AUG 1189 2 PLAC Marlebridge 0 @F503@ FAM 1 HUSB @I1364@ 1 WIFE @I1366@ 1 CHIL @I1281@ 1 CHIL @I1367@ 1 CHIL @I1368@ 1 CHIL @I1369@ 1 CHIL @I1370@ 1 MARR 2 DATE 24 AUG 1200 2 PLAC Bordeaux 0 @F504@ FAM 1 HUSB @I1371@ 1 WIFE @I1372@ 1 CHIL @I1373@ 1 CHIL @I1374@ 1 CHIL @I1375@ 1 CHIL @I1376@ 1 CHIL @I1377@ 1 CHIL @I1378@ 1 CHIL @I1379@ 1 CHIL @I1364@ 1 MARR 2 DATE 18 MAY 1152 2 PLAC Bordeaux,France 0 @F505@ FAM 1 HUSB @I1380@ 1 WIFE @I1381@ 1 CHIL @I1382@ 1 CHIL @I1383@ 1 CHIL @I1384@ 1 CHIL @I1385@ 1 CHIL @I1386@ 1 CHIL @I1387@ 1 CHIL @I1388@ 1 CHIL @I1389@ 1 CHIL @I1390@ 1 CHIL @I1391@ 1 MARR 2 DATE 1053 0 @F506@ FAM 1 HUSB @I1391@ 1 WIFE @I1392@ 1 CHIL @I1393@ 1 CHIL @I2957@ 1 CHIL @I1394@ 1 CHIL @I1395@ 1 CHIL @I2224@ 1 MARR 2 DATE 6 AUG 1100 2 PLAC Westminster,Abbey,London,England 0 @F507@ FAM 1 HUSB @I1391@ 1 WIFE @I1396@ 1 MARR 2 DATE 29 JAN 1122 2 PLAC Westminster,Abbey,London,England 0 @F508@ FAM 1 HUSB @I1397@ 1 WIFE @I1398@ 1 CHIL @I1399@ 1 CHIL @I1400@ 1 CHIL @I1401@ 1 CHIL @I1402@ 1 CHIL @I1403@ 1 MARR 2 DATE 1125 2 PLAC Westminster,England 0 @F509@ FAM 1 HUSB @I1404@ 1 WIFE @I1395@ 1 MARR 2 DATE 7 JAN 1114 2 PLAC Mainz 0 @F510@ FAM 1 HUSB @I1405@ 1 WIFE @I1395@ 1 CHIL @I1371@ 1 CHIL @I1866@ 1 CHIL @I1867@ 1 MARR 2 DATE 22 MAY 1127 2 PLAC Le Mans 0 @F511@ FAM 1 HUSB @I164@ 1 WIFE @I1406@ 1 CHIL @I1407@ 1 DIV Y 1 MARR 2 DATE 1926 2 PLAC Biarritz 0 @F512@ FAM 1 HUSB @I1408@ 1 WIFE @I1355@ 1 CHIL @I1409@ 1 DIV Y 1 MARR 2 DATE 1908 0 @F513@ FAM 1 HUSB @I1231@ 1 WIFE @I1410@ 1 CHIL @I1411@ 1 CHIL @I1412@ 1 MARR 2 DATE 10 OCT 1361 2 PLAC Windsor,England 0 @F514@ FAM 1 HUSB @I1412@ 1 WIFE @I1413@ 1 MARR 2 DATE 20 JAN 1382 2 PLAC Westminster,Palace,London,England 0 @F515@ FAM 1 HUSB @I1412@ 1 WIFE @I1414@ 1 MARR 2 DATE 1 NOV 1396 2 PLAC Calais 0 @F516@ FAM 1 HUSB @I1415@ 1 WIFE @I1232@ 1 MARR 2 DATE 27 JUL 1365 2 PLAC Windsor,England 0 @F517@ FAM 1 HUSB @I1236@ 1 WIFE @I1416@ 1 CHIL @I2065@ 1 MARR 2 DATE SEP 1371 2 PLAC Roquefort 0 @F518@ FAM 1 HUSB @I1417@ 1 WIFE @I1240@ 1 MARR 2 DATE 19 MAY 1359 2 PLAC Reading 0 @F519@ FAM 1 HUSB @I1235@ 1 WIFE @I1418@ 1 CHIL @I1348@ 1 MARR 2 DATE 9 SEP 1342 2 PLAC Tower of London,London,England 0 @F520@ FAM 1 HUSB @I564@ 1 WIFE @I496@ 1 CHIL @I248@ 0 @F521@ FAM 1 HUSB @I529@ 1 WIFE @I920@ 1 CHIL @I1341@ 1 CHIL @I751@ 1 MARR 2 DATE 24 NOV 1615 0 @F522@ FAM 1 HUSB @I2132@ 1 WIFE @I1017@ 1 CHIL @I920@ 1 CHIL @I2131@ 1 CHIL @I2417@ 1 MARR 2 DATE 1599 0 @F523@ FAM 1 HUSB @I1341@ 1 WIFE @I1420@ 1 CHIL @I2423@ 1 MARR 2 DATE 9 JUN 1660 2 PLAC St Jean-de-Luz,France 0 @F524@ FAM 1 HUSB @I1341@ 1 WIFE @I1421@ 1 MARR 2 DATE 12 JUN 1684 2 PLAC Versailles,France 0 @F525@ FAM 1 HUSB @I1422@ 1 WIFE @I1423@ 1 CHIL @I894@ 1 MARR 2 DATE 4 SEP 1725 0 @F526@ FAM 1 HUSB @I1424@ 1 WIFE @I1425@ 1 CHIL @I1703@ 1 CHIL @I1700@ 1 CHIL @I1701@ 1 CHIL @I1702@ 1 MARR 2 DATE 16 MAY 1770 2 PLAC Versailles,France 0 @F527@ FAM 1 HUSB @I1430@ 1 WIFE @I1427@ 1 CHIL @I868@ 1 CHIL @I2106@ 1 CHIL @I2107@ 0 @F528@ FAM 1 HUSB @I1432@ 1 WIFE @I1431@ 1 CHIL @I1249@ 1 CHIL @I1433@ 0 @F529@ FAM 1 HUSB @I836@ 1 WIFE @I776@ 1 CHIL @I1431@ 1 DIV Y 1 MARR 2 DATE 4 AUG 1514 0 @F530@ FAM 1 HUSB @I1433@ 1 WIFE @I1434@ 1 CHIL @I1435@ 0 @F531@ FAM 1 HUSB @I1436@ 1 WIFE @I1435@ 0 @F532@ FAM 1 HUSB @I1438@ 1 WIFE @I1196@ 1 CHIL @I1439@ 1 CHIL @I1440@ 1 CHIL @I1441@ 1 MARR 2 DATE 1854 0 @F533@ FAM 1 HUSB @I1442@ 1 WIFE @I1200@ 1 MARR 2 DATE 1868 0 @F534@ FAM 1 HUSB @I1237@ 1 WIFE @I1443@ 1 MARR 2 DATE BEF 4 NOV 1393 0 @F535@ FAM 1 HUSB @I1023@ 1 WIFE @I1444@ 0 @F536@ FAM 1 HUSB @I1346@ 1 WIFE @I1445@ 0 @F537@ FAM 1 HUSB @I1353@ 1 WIFE @I1446@ 0 @F538@ FAM 1 HUSB @I1447@ 1 WIFE @I1448@ 1 CHIL @I1449@ 1 MARR 2 DATE 1296 0 @F539@ FAM 1 HUSB @I1447@ 1 WIFE @I1450@ 1 CHIL @I1451@ 1 MARR 2 DATE 1302 0 @F540@ FAM 1 HUSB @I1451@ 1 WIFE @I1258@ 1 MARR 2 DATE 17 JUL 1328 2 PLAC Berwick-on-Tweed 0 @F541@ FAM 1 HUSB @I1451@ 1 WIFE @I1453@ 1 DIV Y 0 @F542@ FAM 1 HUSB @I1454@ 1 WIFE @I1449@ 1 CHIL @I1455@ 1 MARR 2 DATE 1315 0 @F543@ FAM 1 HUSB @I1455@ 1 WIFE @I1456@ 1 CHIL @I1457@ 1 CHIL @I1458@ 1 CHIL @I1459@ 1 CHIL @I1460@ 1 CHIL @I1821@ 0 @F544@ FAM 1 HUSB @I1457@ 1 WIFE @I1461@ 1 CHIL @I1462@ 1 CHIL @I1463@ 0 @F545@ FAM 1 HUSB @I1455@ 1 WIFE @I1464@ 0 @F546@ FAM 1 HUSB @I1463@ 1 WIFE @I1465@ 1 CHIL @I1466@ 0 @F547@ FAM 1 HUSB @I1466@ 1 WIFE @I1467@ 1 CHIL @I1252@ 1 CHIL @I1470@ 1 CHIL @I1471@ 1 CHIL @I1472@ 0 @F548@ FAM 1 HUSB @I1253@ 1 WIFE @I1829@ 1 CHIL @I1450@ 0 @F549@ FAM 1 HUSB @I1474@ 1 WIFE @I1472@ 1 CHIL @I1475@ 1 CHIL @I1476@ 0 @F550@ FAM 1 HUSB @I1477@ 1 WIFE @I1475@ 1 CHIL @I1478@ 0 @F551@ FAM 1 HUSB @I1478@ 1 WIFE @I1479@ 1 CHIL @I1432@ 1 CHIL @I1480@ 0 @F552@ FAM 1 HUSB @I1480@ 1 WIFE @I1481@ 1 CHIL @I1482@ 0 @F553@ FAM 1 HUSB @I1470@ 1 WIFE @I1483@ 1 CHIL @I2866@ 1 DIV Y 0 @F554@ FAM 1 HUSB @I1459@ 1 WIFE @I1485@ 1 CHIL @I1486@ 0 @F555@ FAM 1 HUSB @I1487@ 1 WIFE @I1465@ 1 CHIL @I1488@ 1 CHIL @I1489@ 1 CHIL @I1490@ 0 @F556@ FAM 1 HUSB @I1476@ 1 WIFE @I1491@ 1 CHIL @I1492@ 0 @F557@ FAM 1 HUSB @I1492@ 1 WIFE @I1493@ 1 CHIL @I1494@ 1 MARR 2 DATE 1532 0 @F558@ FAM 1 HUSB @I1285@ 1 WIFE @I1495@ 1 CHIL @I1496@ 1 CHIL @I1497@ 1 MARR 2 DATE BEF 3 FEB 1276 2 PLAC Paris,France 0 @F559@ FAM 1 HUSB @I1497@ 1 WIFE @I1498@ 1 CHIL @I1499@ 0 @F560@ FAM 1 HUSB @I1499@ 1 WIFE @I1500@ 1 CHIL @I1243@ 0 @F561@ FAM 1 HUSB @I1503@ 1 WIFE @I1501@ 0 @F562@ FAM 1 HUSB @I1278@ 1 WIFE @I1504@ 1 CHIL @I1744@ 1 MARR 2 DATE ABT 1316 0 @F563@ FAM 1 HUSB @I1377@ 1 WIFE @I1506@ 1 CHIL @I1507@ 1 CHIL @I1873@ 1 MARR 2 DATE JUL 1181 0 @F564@ FAM 1 HUSB @I1279@ 1 WIFE @I1505@ 1 CHIL @I1410@ 1 MARR 2 DATE DEC 1325 0 @F565@ FAM 1 HUSB @I1376@ 1 WIFE @I1508@ 0 @F566@ FAM 1 HUSB @I1509@ 1 WIFE @I1375@ 1 MARR 2 DATE 1 FEB 1168 2 PLAC Minden,Saxony,Germany 0 @F567@ FAM 1 HUSB @I1374@ 1 WIFE @I1510@ 0 @F568@ FAM 1 HUSB @I1511@ 1 WIFE @I1512@ 1 CHIL @I1513@ 1 CHIL @I1514@ 1 CHIL @I1392@ 1 CHIL @I1515@ 1 CHIL @I1516@ 0 @F569@ FAM 1 HUSB @I1517@ 1 WIFE @I1388@ 1 CHIL @I1860@ 1 CHIL @I1518@ 1 CHIL @I1519@ 1 CHIL @I1397@ 1 CHIL @I1861@ 0 @F570@ FAM 1 HUSB @I1400@ 1 WIFE @I1524@ 1 MARR 2 DATE AFT FEB 1140 0 @F571@ FAM 1 HUSB @I1520@ 1 WIFE @I1378@ 1 CHIL @I1747@ 1 MARR 2 DATE SEP 1170 2 PLAC Burgos 0 @F572@ FAM 1 HUSB @I1525@ 1 WIFE @I1526@ 1 CHIL @I1380@ 0 @F573@ FAM 1 HUSB @I1527@ 1 WIFE @I1528@ 1 CHIL @I1529@ 1 CHIL @I1525@ 0 @F574@ FAM 1 HUSB @I1530@ 1 WIFE @I1531@ 1 CHIL @I1527@ 1 CHIL @I1532@ 0 @F575@ FAM 1 HUSB @I1533@ 1 WIFE @I1532@ 1 CHIL @I1767@ 1 CHIL @I1534@ 1 MARR 2 DATE 1002 0 @F576@ FAM 1 HUSB @I1534@ 1 WIFE @I1535@ 1 MARR 2 DATE 23 JAN 1045 0 @F577@ FAM 1 HUSB @I1536@ 1 WIFE @I1537@ 1 CHIL @I1538@ 1 CHIL @I1535@ 0 @F578@ FAM 1 HUSB @I1538@ 1 WIFE @I1539@ 1 CHIL @I1540@ 1 MARR 2 DATE BEF 1065 0 @F579@ FAM 1 HUSB @I1541@ 1 WIFE @I1540@ 0 @F580@ FAM 1 HUSB @I1533@ 1 WIFE @I1542@ 1 CHIL @I1753@ 1 CHIL @I1754@ 1 CHIL @I1543@ 1 CHIL @I1755@ 1 CHIL @I1756@ 1 CHIL @I1757@ 1 CHIL @I1758@ 1 CHIL @I1759@ 1 CHIL @I1760@ 1 CHIL @I1761@ 1 CHIL @I1762@ 1 MARR 2 DATE ABT 985 0 @F581@ FAM 1 HUSB @I1543@ 1 WIFE @I1544@ 1 CHIL @I1764@ 1 CHIL @I1545@ 0 @F582@ FAM 1 HUSB @I1545@ 1 WIFE @I1546@ 1 CHIL @I1512@ 1 CHIL @I1547@ 1 CHIL @I1766@ 0 @F583@ FAM 1 HUSB @I1548@ 1 WIFE @I1549@ 1 CHIL @I1550@ 1 CHIL @I1551@ 1 DIV Y 0 @F584@ FAM 1 HUSB @I1548@ 1 WIFE @I1532@ 1 CHIL @I1552@ 1 CHIL @I1768@ 1 MARR 2 DATE 2 JUL 1017 0 @F585@ FAM 1 HUSB @I1553@ 1 WIFE @I1526@ 1 CHIL @I1554@ 1 CHIL @I1555@ 0 @F586@ FAM 1 HUSB @I1556@ 1 WIFE @I1390@ 1 MARR 2 DATE 1086 2 PLAC Caen 0 @F587@ FAM 1 HUSB @I1402@ 1 WIFE @I1523@ 1 MARR 2 DATE ABT 1149 0 @F588@ FAM 1 HUSB @I1521@ 1 WIFE @I1403@ 1 DIV Y 1 MARR 2 DATE ABT 1160 0 @F589@ FAM 1 HUSB @I1522@ 1 WIFE @I1516@ 1 CHIL @I1398@ 0 @F590@ FAM 1 HUSB @I1557@ 1 WIFE @I1379@ 1 MARR 2 DATE 13 FEB 1177 2 PLAC Palermo,Italy 0 @F591@ FAM 1 HUSB @I1558@ 1 WIFE @I1379@ 1 MARR 2 DATE OCT 1196 2 PLAC Rouen 0 @F592@ FAM 1 HUSB @I1559@ 1 WIFE @I156@ 1 CHIL @I1560@ 1 CHIL @I1561@ 1 MARR 2 DATE 1916 2 PLAC ,,,Russia 0 @F593@ FAM 1 HUSB @I44@ 1 WIFE @I1569@ 1 CHIL @I1570@ 1 CHIL @I1571@ 1 CHIL @I1572@ 0 @F594@ FAM 1 HUSB @I1570@ 1 WIFE @I1573@ 1 CHIL @I1574@ 0 @F595@ FAM 1 HUSB @I1575@ 1 WIFE @I1571@ 1 CHIL @I1576@ 1 CHIL @I1577@ 0 @F596@ FAM 1 HUSB @I1578@ 1 WIFE @I1572@ 1 CHIL @I1579@ 1 CHIL @I1580@ 0 @F597@ FAM 1 HUSB @I1581@ 1 WIFE @I1572@ 0 @F598@ FAM 1 HUSB @I873@ 1 WIFE @I1370@ 1 CHIL @I1147@ 1 MARR 2 DATE 7 JAN 1239 2 PLAC Westminster 0 @F599@ FAM 1 HUSB @I1367@ 1 WIFE @I596@ 1 CHIL @I1882@ 1 MARR 2 DATE 13 MAR 1231 2 PLAC Fawley,Bucks 0 @F600@ FAM 1 HUSB @I1367@ 1 WIFE @I1582@ 1 CHIL @I1887@ 1 CHIL @I1888@ 1 MARR 2 DATE 23 NOV 1243 2 PLAC Westminster,Abbey,London,England 0 @F601@ FAM 1 HUSB @I1367@ 1 WIFE @I1583@ 1 MARR 2 DATE 16 JUN 1269 2 PLAC Kaiserslautern,Germany 0 @F602@ FAM 1 HUSB @I1584@ 1 WIFE @I1369@ 1 MARR 2 DATE 20 JUL 2 PLAC Worms 0 @F603@ FAM 1 HUSB @I1585@ 1 WIFE @I1283@ 1 CHIL @I2234@ 1 MARR 2 DATE 26 DEC 1251 2 PLAC York 0 @F604@ FAM 1 HUSB @I1586@ 1 WIFE @I1284@ 1 MARR 2 DATE 22 JAN 1260 2 PLAC St Denis 0 @F605@ FAM 1 HUSB @I1285@ 1 WIFE @I1587@ 1 MARR 2 DATE 9 APR 1269 2 PLAC Westminster,Abbey,London,England 0 @F606@ FAM 1 HUSB @I1588@ 1 WIFE @I1268@ 1 MARR 2 DATE 30 APR 1290 2 PLAC Westminster,Abbey,London,England 0 @F607@ FAM 1 HUSB @I1589@ 1 WIFE @I1268@ 1 MARR 2 DATE JAN 1297 0 @F608@ FAM 1 HUSB @I1590@ 1 WIFE @I1270@ 1 MARR 2 DATE 8 JUL 1290 2 PLAC Westminster,Abbey,London,England 0 @F609@ FAM 1 HUSB @I1591@ 1 WIFE @I1274@ 1 MARR 2 DATE 18 JAN 1297 2 PLAC Ipswich 0 @F610@ FAM 1 HUSB @I1592@ 1 WIFE @I1274@ 1 MARR 2 DATE 14 NOV 1302 2 PLAC Westminster 0 @F611@ FAM 1 HUSB @I1278@ 1 WIFE @I1593@ 1 MARR 2 DATE ABT 1328 0 @F612@ FAM 1 HUSB @I1594@ 1 WIFE @I1239@ 1 MARR 2 DATE 1361 2 PLAC Woodstock 0 @F613@ FAM 1 HUSB @I1224@ 1 WIFE @I1595@ 1 MARR 2 DATE 1412 0 @F614@ FAM 1 HUSB @I1225@ 1 WIFE @I1596@ 1 MARR 2 DATE 17 APR 1423 2 PLAC Troyes 0 @F615@ FAM 1 HUSB @I1226@ 1 WIFE @I1597@ 1 MARR 2 DATE 1422 0 @F616@ FAM 1 HUSB @I1226@ 1 WIFE @I1598@ 1 MARR 2 DATE BEF 1431 0 @F617@ FAM 1 HUSB @I1599@ 1 WIFE @I1227@ 1 MARR 2 DATE 6 JUL 1402 2 PLAC Cologne,Germany 0 @F618@ FAM 1 HUSB @I1600@ 1 WIFE @I1228@ 1 MARR 2 DATE 26 OCT 1406 2 PLAC Lund 0 @F619@ FAM 1 HUSB @I1594@ 1 WIFE @I1601@ 1 MARR 2 DATE 11 SEP 1386 2 PLAC Saille,Near Guerrand 0 @F620@ FAM 1 HUSB @I1221@ 1 WIFE @I1601@ 1 MARR 2 DATE 7 FEB 1403 2 PLAC Winchester,Cathedral,London,England 0 @F621@ FAM 1 HUSB @I1602@ 1 WIFE @I1603@ 1 CHIL @I1026@ 0 @F622@ FAM 1 HUSB @I1604@ 1 WIFE @I330@ 1 CHIL @I1736@ 1 CHIL @I301@ 1 MARR 2 DATE 28 JUN 1740 2 PLAC Cassel 0 @F623@ FAM 1 HUSB @I1162@ 1 WIFE @I1605@ 1 MARR 2 DATE 1733 0 @F624@ FAM 1 HUSB @I1606@ 1 CHIL @I1605@ 0 @F625@ FAM 1 HUSB @I1608@ 1 WIFE @I1396@ 1 MARR 2 DATE 1138 0 @F626@ FAM 1 HUSB @I1609@ 1 WIFE @I610@ 1 CHIL @I1610@ 1 CHIL @I1611@ 1 MARR 2 DATE 10 JUN 1967 2 PLAC Copenhagen,Denmark 0 @F627@ FAM 1 HUSB @I1613@ 1 WIFE @I1614@ 1 CHIL @I1027@ 1 CHIL @I458@ 1 MARR 2 DATE 19 JUN 1823 2 PLAC Stockholm,Sweden 0 @F628@ FAM 1 HUSB @I1615@ 1 WIFE @I1616@ 1 CHIL @I1613@ 1 MARR 2 DATE 17 AUG 1798 2 PLAC Sceaux 0 @F629@ FAM 1 HUSB @I1617@ 1 WIFE @I1618@ 1 CHIL @I1642@ 1 CHIL @I1655@ 1 CHIL @I1656@ 1 CHIL @I1657@ 1 CHIL @I1658@ 1 CHIL @I1659@ 1 CHIL @I1660@ 1 CHIL @I1650@ 1 MARR 2 DATE 31 JUL 1790 2 PLAC Gottorp 0 @F630@ FAM 1 HUSB @I344@ 1 WIFE @I1619@ 1 CHIL @I1643@ 1 MARR 2 DATE 8 JUL 1752 2 PLAC Frederiksborg,Denmark 0 @F631@ FAM 1 HUSB @I1620@ 1 WIFE @I1621@ 1 CHIL @I344@ 1 CHIL @I2850@ 1 MARR 2 DATE 7 AUG 1721 0 @F632@ FAM 1 HUSB @I1622@ 1 WIFE @I1623@ 1 CHIL @I1620@ 1 MARR 2 DATE 5 DEC 1695 0 @F633@ FAM 1 HUSB @I1622@ 1 WIFE @I1624@ 1 MARR 2 DATE 4 APR 1721 0 @F634@ FAM 1 HUSB @I1625@ 1 WIFE @I1626@ 1 CHIL @I1622@ 1 CHIL @I2854@ 1 CHIL @I2855@ 1 MARR 2 DATE 25 JUN 1667 2 PLAC Copenhagen,Denmark 0 @F635@ FAM 1 HUSB @I1627@ 1 WIFE @I1628@ 1 CHIL @I1630@ 1 MARR 2 DATE 27 NOV 1597 0 @F636@ FAM 1 HUSB @I1627@ 1 WIFE @I1629@ 1 DIV Y 1 MARR 2 DATE 31 DEC 1615 0 @F637@ FAM 1 HUSB @I1630@ 1 WIFE @I1631@ 1 CHIL @I1625@ 1 CHIL @I2856@ 1 CHIL @I2857@ 1 CHIL @I692@ 1 CHIL @I2858@ 1 MARR 2 DATE 1 OCT 1643 2 PLAC Gluckstadt 0 @F638@ FAM 1 HUSB @I1632@ 1 WIFE @I1633@ 1 CHIL @I737@ 1 MARR 2 DATE 29 OCT 1525 2 PLAC Lauenburg 0 @F639@ FAM 1 HUSB @I1634@ 1 WIFE @I1635@ 1 CHIL @I1632@ 1 MARR 2 DATE 10 APR 1502 0 @F640@ FAM 1 HUSB @I1634@ 1 WIFE @I1636@ 1 MARR 2 DATE 9 OCT 1518 2 PLAC Keil 0 @F641@ FAM 1 HUSB @I1641@ 1 WIFE @I1640@ 1 CHIL @I1618@ 1 CHIL @I346@ 0 @F642@ FAM 1 HUSB @I1643@ 1 WIFE @I1644@ 1 CHIL @I1645@ 1 CHIL @I299@ 1 CHIL @I1646@ 1 MARR 2 DATE 1774 0 @F643@ FAM 1 HUSB @I1645@ 1 WIFE @I1647@ 1 CHIL @I1649@ 1 DIV Y 1 MARR 2 DATE 21 JUN 1806 2 PLAC Ludwigslust 0 @F644@ FAM 1 HUSB @I1645@ 1 WIFE @I1648@ 1 MARR 2 DATE 22 MAY 1815 2 PLAC Augustenburg 0 @F645@ FAM 1 HUSB @I1649@ 1 WIFE @I1650@ 1 DIV Y 1 MARR 2 DATE 1 NOV 1828 2 PLAC Copenhagen 0 @F646@ FAM 1 HUSB @I1649@ 1 WIFE @I1651@ 1 DIV Y 1 MARR 2 DATE 10 JUN 1841 2 PLAC Neustrelitz 0 @F647@ FAM 1 HUSB @I1649@ 1 WIFE @I1652@ 1 MARR 2 DATE 7 AUG 1850 2 PLAC Frederiksborg 0 @F648@ FAM 1 HUSB @I1654@ 1 WIFE @I1653@ 1 CHIL @I1648@ 0 @F649@ FAM 1 HUSB @I1646@ 1 WIFE @I1656@ 0 @F650@ FAM 1 HUSB @I1661@ 1 WIFE @I1650@ 0 @F651@ FAM 1 HUSB @I1668@ 1 WIFE @I1667@ 1 MARR 2 DATE 1922 0 @F652@ FAM 1 HUSB @I1664@ 1 WIFE @I1669@ 1 CHIL @I2699@ 1 CHIL @I1670@ 1 CHIL @I2700@ 1 CHIL @I2701@ 1 CHIL @I2702@ 1 MARR 2 DATE 1909 0 @F653@ FAM 1 HUSB @I1673@ 1 WIFE @I1672@ 1 MARR 2 DATE 1968 0 @F654@ FAM 1 HUSB @I1671@ 1 WIFE @I1670@ 1 CHIL @I1674@ 1 CHIL @I1675@ 1 CHIL @I1676@ 1 MARR 2 DATE 1933 0 @F655@ FAM 1 HUSB @I1676@ 1 WIFE @I1677@ 1 MARR 2 DATE 1971 0 @F656@ FAM 1 HUSB @I1685@ 1 WIFE @I1684@ 1 MARR 2 DATE 1871 0 @F657@ FAM 1 HUSB @I1686@ 1 WIFE @I1204@ 1 DIV Y 1 MARR 2 DATE 1964 0 @F658@ FAM 1 HUSB @I1687@ 1 WIFE @I1205@ 1 MARR 2 DATE 1967 0 @F659@ FAM 1 HUSB @I1688@ 1 WIFE @I1206@ 1 MARR 2 DATE 1975 0 @F660@ FAM 1 HUSB @I1693@ 1 WIFE @I1692@ 1 MARR 2 DATE 1842 0 @F661@ FAM 1 HUSB @I1694@ 1 CHIL @I322@ 0 @F662@ FAM 1 HUSB @I1148@ 1 WIFE @I1695@ 1 MARR 2 DATE 22 NOV 1836 2 PLAC Oldenburg,Germany 0 @F663@ FAM 1 HUSB @I1696@ 1 WIFE @I245@ 1 CHIL @I1697@ 1 CHIL @I1698@ 1 CHIL @I1114@ 1 CHIL @I1699@ 1 MARR 2 DATE 9 AUG 1832 2 PLAC Compiegne 0 @F664@ FAM 1 HUSB @I417@ 1 WIFE @I2512@ 1 MARR 2 DATE 770 0 @F665@ FAM 1 HUSB @I1706@ 1 WIFE @I1707@ 1 CHIL @I2152@ 1 CHIL @I2153@ 1 CHIL @I2154@ 1 MARR 2 DATE 1956 0 @F666@ FAM 1 HUSB @I282@ 1 WIFE @I1708@ 0 @F667@ FAM 1 HUSB @I1709@ 1 WIFE @I284@ 0 @F668@ FAM 1 HUSB @I1710@ 1 WIFE @I285@ 0 @F669@ FAM 1 HUSB @I1711@ 1 WIFE @I289@ 0 @F670@ FAM 1 HUSB @I1714@ 1 WIFE @I1715@ 0 @F671@ FAM 1 HUSB @I1716@ 1 CHIL @I792@ 0 @F672@ FAM 1 HUSB @I1717@ 1 WIFE @I1718@ 1 CHIL @I1716@ 0 @F673@ FAM 1 HUSB @I1719@ 1 CHIL @I1717@ 0 @F674@ FAM 1 HUSB @I1720@ 1 CHIL @I1719@ 1 CHIL @I1721@ 0 @F675@ FAM 1 HUSB @I1722@ 1 CHIL @I787@ 0 @F676@ FAM 1 WIFE @I1723@ 1 CHIL @I1722@ 0 @F677@ FAM 1 WIFE @I1721@ 1 CHIL @I1723@ 0 @F678@ FAM 1 WIFE @I1724@ 1 CHIL @I1718@ 0 @F679@ FAM 1 WIFE @I1725@ 1 CHIL @I1724@ 0 @F680@ FAM 1 HUSB @I1726@ 1 WIFE @I1727@ 1 CHIL @I1725@ 0 @F681@ FAM 1 HUSB @I1728@ 1 CHIL @I789@ 0 @F682@ FAM 1 HUSB @I1729@ 1 CHIL @I782@ 1 CHIL @I1728@ 0 @F683@ FAM 1 HUSB @I398@ 1 WIFE @I1730@ 1 CHIL @I1731@ 0 @F684@ FAM 1 HUSB @I1731@ 1 WIFE @I1732@ 0 @F685@ FAM 1 HUSB @I1735@ 1 CHIL @I1291@ 0 @F686@ FAM 1 HUSB @I1662@ 1 WIFE @I1699@ 1 MARR 2 DATE 1857 0 @F687@ FAM 1 HUSB @I1663@ 1 WIFE @I1738@ 0 @F688@ FAM 1 HUSB @I1739@ 1 WIFE @I2485@ 1 CHIL @I1903@ 1 CHIL @I1277@ 1 MARR 2 DATE 1274 0 @F689@ FAM 1 HUSB @I1740@ 1 WIFE @I2482@ 1 CHIL @I1739@ 1 MARR 2 DATE 1234 0 @F690@ FAM 1 HUSB @I1741@ 1 WIFE @I1742@ 1 CHIL @I1740@ 1 CHIL @I1894@ 1 CHIL @I2481@ 1 CHIL @I2484@ 1 MARR 2 DATE 1200 0 @F691@ FAM 1 HUSB @I1891@ 1 CHIL @I1742@ 0 @F692@ FAM 1 HUSB @I1744@ 1 WIFE @I1745@ 0 @F693@ FAM 1 HUSB @I1746@ 1 CHIL @I1749@ 1 CHIL @I1262@ 0 @F694@ FAM 1 HUSB @I2452@ 1 WIFE @I1892@ 1 DIV Y 1 MARR 2 DATE 1104 0 @F695@ FAM 1 HUSB @I1748@ 1 CHIL @I1520@ 0 @F696@ FAM 1 HUSB @I1749@ 1 WIFE @I1750@ 1 CHIL @I1751@ 0 @F697@ FAM 1 HUSB @I1452@ 1 CHIL @I1542@ 0 @F698@ FAM 1 HUSB @I1752@ 1 CHIL @I1452@ 0 @F699@ FAM 1 HUSB @I1763@ 1 CHIL @I1765@ 1 CHIL @I1546@ 0 @F700@ FAM 1 HUSB @I1764@ 1 WIFE @I1765@ 0 @F701@ FAM 1 HUSB @I1769@ 1 WIFE @I1759@ 0 @F702@ FAM 1 HUSB @I1770@ 1 WIFE @I1760@ 0 @F703@ FAM 1 HUSB @I1771@ 1 CHIL @I1770@ 0 @F704@ FAM 1 HUSB @I1772@ 1 WIFE @I1761@ 0 @F705@ FAM 1 HUSB @I1773@ 1 WIFE @I1762@ 0 @F706@ FAM 1 HUSB @I1774@ 1 CHIL @I1539@ 0 @F707@ FAM 1 HUSB @I1775@ 1 CHIL @I1549@ 0 @F708@ FAM 1 HUSB @I1776@ 1 WIFE @I1777@ 1 CHIL @I1548@ 0 @F709@ FAM 1 HUSB @I1778@ 1 CHIL @I1777@ 0 @F710@ FAM 1 HUSB @I1779@ 1 WIFE @I1780@ 1 CHIL @I1784@ 1 CHIL @I1533@ 0 @F711@ FAM 1 HUSB @I1779@ 1 WIFE @I1781@ 1 CHIL @I1782@ 0 @F712@ FAM 1 HUSB @I1783@ 1 CHIL @I1781@ 0 @F713@ FAM 1 HUSB @I1785@ 1 CHIL @I1780@ 0 @F714@ FAM 1 HUSB @I1786@ 1 WIFE @I1787@ 1 CHIL @I1788@ 1 CHIL @I1779@ 0 @F715@ FAM 1 HUSB @I1788@ 1 WIFE @I1789@ 0 @F716@ FAM 1 HUSB @I1786@ 1 WIFE @I1790@ 0 @F717@ FAM 1 HUSB @I1791@ 1 CHIL @I1790@ 0 @F718@ FAM 1 HUSB @I1792@ 1 WIFE @I1793@ 1 CHIL @I1786@ 1 CHIL @I1794@ 1 CHIL @I1795@ 1 CHIL @I1796@ 0 @F719@ FAM 1 HUSB @I1797@ 1 WIFE @I1796@ 0 @F720@ FAM 1 HUSB @I1792@ 1 WIFE @I1798@ 1 CHIL @I1799@ 1 CHIL @I1800@ 0 @F721@ FAM 1 HUSB @I1801@ 1 WIFE @I1800@ 0 @F722@ FAM 1 HUSB @I1792@ 1 WIFE @I1802@ 1 CHIL @I1803@ 1 CHIL @I1804@ 1 CHIL @I1805@ 1 CHIL @I1806@ 1 CHIL @I1807@ 1 CHIL @I1808@ 1 CHIL @I1809@ 1 CHIL @I1810@ 0 @F723@ FAM 1 HUSB @I1811@ 1 WIFE @I1806@ 0 @F724@ FAM 1 HUSB @I1812@ 1 WIFE @I1808@ 0 @F725@ FAM 1 HUSB @I1813@ 1 WIFE @I1809@ 0 @F726@ FAM 1 HUSB @I1814@ 1 WIFE @I1810@ 0 @F727@ FAM 1 HUSB @I1815@ 1 CHIL @I1251@ 0 @F728@ FAM 1 HUSB @I1816@ 1 WIFE @I2440@ 1 CHIL @I1429@ 1 CHIL @I2438@ 1 MARR 2 DATE 18 MAY 1514 0 @F729@ FAM 1 HUSB @I2524@ 1 WIFE @I1817@ 1 CHIL @I2441@ 1 CHIL @I1816@ 0 @F730@ FAM 1 HUSB @I1818@ 1 CHIL @I1448@ 0 @F731@ FAM 1 HUSB @I1819@ 1 CHIL @I1456@ 0 @F732@ FAM 1 HUSB @I1820@ 1 CHIL @I1464@ 0 @F733@ FAM 1 HUSB @I1822@ 1 WIFE @I1821@ 0 @F734@ FAM 1 HUSB @I1823@ 1 WIFE @I1821@ 0 @F735@ FAM 1 HUSB @I1824@ 1 WIFE @I1821@ 0 @F736@ FAM 1 HUSB @I1329@ 0 @F737@ FAM 1 HUSB @I1825@ 1 CHIL @I1461@ 0 @F738@ FAM 1 HUSB @I1826@ 1 CHIL @I1467@ 0 @F739@ FAM 1 HUSB @I1827@ 1 WIFE @I1828@ 1 CHIL @I1469@ 1 CHIL @I1468@ 1 CHIL @I1634@ 1 MARR 2 DATE 1449 0 @F740@ FAM 1 HUSB @I1830@ 1 WIFE @I1831@ 1 CHIL @I1447@ 1 CHIL @I2869@ 1 CHIL @I2870@ 1 CHIL @I2871@ 1 CHIL @I2872@ 1 CHIL @I2873@ 0 @F741@ FAM 1 HUSB @I1832@ 1 WIFE @I1833@ 1 CHIL @I1830@ 0 @F742@ FAM 1 HUSB @I1834@ 1 CHIL @I1833@ 0 @F743@ FAM 1 HUSB @I1835@ 1 WIFE @I1836@ 1 CHIL @I1832@ 0 @F744@ FAM 1 HUSB @I1837@ 1 WIFE @I1838@ 1 CHIL @I1842@ 1 CHIL @I1836@ 0 @F745@ FAM 1 HUSB @I1839@ 1 CHIL @I1838@ 0 @F746@ FAM 1 HUSB @I1840@ 1 WIFE @I1453@ 0 @F747@ FAM 1 HUSB @I1841@ 1 CHIL @I1453@ 0 @F748@ FAM 1 HUSB @I1843@ 0 @F749@ FAM 1 HUSB @I1845@ 1 WIFE @I1844@ 1 CHIL @I1846@ 0 @F750@ FAM 1 HUSB @I1846@ 1 WIFE @I1847@ 1 CHIL @I1849@ 0 @F751@ FAM 1 HUSB @I1848@ 1 CHIL @I1847@ 0 @F752@ FAM 1 HUSB @I1850@ 1 CHIL @I1381@ 0 @F753@ FAM 1 HUSB @I1382@ 1 WIFE @I1851@ 1 CHIL @I1853@ 0 @F754@ FAM 1 HUSB @I1852@ 1 CHIL @I1851@ 0 @F755@ FAM 1 HUSB @I1853@ 1 WIFE @I1854@ 1 DIV Y 0 @F756@ FAM 1 HUSB @I1859@ 1 CHIL @I1396@ 0 @F757@ FAM 1 HUSB @I1853@ 1 WIFE @I1856@ 0 @F758@ FAM 1 HUSB @I1857@ 1 CHIL @I1856@ 0 @F759@ FAM 1 HUSB @I1394@ 1 WIFE @I1858@ 0 @F760@ FAM 1 HUSB @I1855@ 1 CHIL @I1858@ 1 CHIL @I1854@ 0 @F761@ FAM 1 HUSB @I1861@ 1 WIFE @I1862@ 0 @F762@ FAM 1 HUSB @I1863@ 1 CHIL @I1862@ 0 @F763@ FAM 1 HUSB @I1518@ 1 WIFE @I1864@ 0 @F764@ FAM 1 HUSB @I1865@ 1 CHIL @I1864@ 0 @F765@ FAM 1 HUSB @I1868@ 1 CHIL @I1372@ 0 @F766@ FAM 1 HUSB @I1869@ 1 WIFE @I1372@ 1 CHIL @I1510@ 1 DIV Y 1 MARR 2 DATE 1137 0 @F767@ FAM 1 HUSB @I1870@ 1 CHIL @I1523@ 0 @F768@ FAM 1 HUSB @I1871@ 1 CHIL @I1521@ 0 @F769@ FAM 1 HUSB @I1872@ 1 CHIL @I1508@ 0 @F770@ FAM 1 HUSB @I1874@ 1 CHIL @I1506@ 0 @F771@ FAM 1 HUSB @I1875@ 1 WIFE @I1506@ 0 @F772@ FAM 1 HUSB @I1876@ 1 WIFE @I1506@ 0 @F773@ FAM 1 HUSB @I1877@ 1 CHIL @I1365@ 0 @F774@ FAM 1 HUSB @I1878@ 1 WIFE @I1365@ 0 @F775@ FAM 1 HUSB @I1879@ 1 WIFE @I1365@ 0 @F776@ FAM 1 HUSB @I1880@ 1 WIFE @I1366@ 0 @F777@ FAM 1 HUSB @I1881@ 1 CHIL @I1282@ 0 @F778@ FAM 1 HUSB @I1883@ 1 CHIL @I596@ 0 @F779@ FAM 1 HUSB @I1884@ 1 CHIL @I1582@ 0 @F780@ FAM 1 HUSB @I1885@ 1 CHIL @I1583@ 0 @F781@ FAM 1 HUSB @I1886@ 1 WIFE @I1368@ 0 @F782@ FAM 1 HUSB @I1887@ 1 WIFE @I1889@ 0 @F783@ FAM 1 HUSB @I1890@ 1 CHIL @I1889@ 0 @F784@ FAM 1 HUSB @I1891@ 1 WIFE @I1747@ 1 CHIL @I1746@ 1 DIV Y 1 MARR 2 DATE 1197 0 @F785@ FAM 1 HUSB @I1893@ 1 CHIL @I1587@ 0 @F786@ FAM 1 HUSB @I1894@ 1 WIFE @I1895@ 1 CHIL @I1495@ 0 @F787@ FAM 1 HUSB @I1585@ 1 WIFE @I1896@ 0 @F788@ FAM 1 HUSB @I1897@ 1 CHIL @I1896@ 0 @F789@ FAM 1 HUSB @I1898@ 1 CHIL @I1504@ 0 @F790@ FAM 1 HUSB @I1899@ 1 CHIL @I1593@ 0 @F791@ FAM 1 HUSB @I1900@ 1 WIFE @I1593@ 0 @F792@ FAM 1 HUSB @I1901@ 1 CHIL @I1505@ 0 @F793@ FAM 1 HUSB @I1902@ 1 WIFE @I1505@ 0 @F794@ FAM 1 HUSB @I1903@ 1 WIFE @I2486@ 1 CHIL @I2464@ 1 CHIL @I127@ 1 CHIL @I2465@ 1 CHIL @I1743@ 1 MARR 2 DATE 1284 0 @F795@ FAM 1 HUSB @I1904@ 1 CHIL @I1349@ 0 @F796@ FAM 1 HUSB @I1905@ 1 CHIL @I1904@ 0 @F797@ FAM 1 HUSB @I1906@ 1 CHIL @I1905@ 0 @F798@ FAM 1 HUSB @I1907@ 1 CHIL @I1906@ 0 @F799@ FAM 1 HUSB @I1908@ 1 WIFE @I1909@ 1 CHIL @I1907@ 0 @F800@ FAM 1 HUSB @I1910@ 1 WIFE @I1911@ 1 CHIL @I1908@ 0 @F801@ FAM 1 HUSB @I1912@ 1 WIFE @I1911@ 0 @F802@ FAM 1 HUSB @I1913@ 1 WIFE @I1956@ 1 CHIL @I1957@ 1 CHIL @I1958@ 1 CHIL @I1911@ 1 CHIL @I1959@ 0 @F803@ FAM 1 HUSB @I1914@ 1 CHIL @I361@ 0 @F804@ FAM 1 HUSB @I1915@ 1 WIFE @I1916@ 1 CHIL @I1917@ 1 CHIL @I1914@ 0 @F805@ FAM 1 HUSB @I1918@ 1 CHIL @I1916@ 0 @F806@ FAM 1 HUSB @I1843@ 1 WIFE @I1842@ 1 CHIL @I1844@ 0 @F807@ FAM 1 HUSB @I1919@ 1 WIFE @I2216@ 1 CHIL @I1909@ 0 @F808@ FAM 1 HUSB @I1912@ 1 CHIL @I1919@ 0 @F809@ FAM 1 HUSB @I1920@ 1 WIFE @I1921@ 1 CHIL @I1912@ 0 @F810@ FAM 1 HUSB @I1922@ 1 WIFE @I1923@ 1 CHIL @I1921@ 0 @F811@ FAM 1 HUSB @I1924@ 1 WIFE @I1925@ 1 CHIL @I1923@ 0 @F812@ FAM 1 HUSB @I1926@ 1 WIFE @I1927@ 1 CHIL @I1925@ 0 @F813@ FAM 1 HUSB @I1928@ 1 WIFE @I1539@ 1 CHIL @I1927@ 0 @F814@ FAM 1 HUSB @I1930@ 1 WIFE @I1931@ 1 CHIL @I1928@ 0 @F815@ FAM 1 HUSB @I1932@ 1 WIFE @I1931@ 1 CHIL @I1933@ 0 @F816@ FAM 1 HUSB @I1934@ 1 CHIL @I1931@ 0 @F817@ FAM 1 HUSB @I1935@ 1 CHIL @I1934@ 1 CHIL @I2185@ 0 @F818@ FAM 1 HUSB @I1936@ 1 CHIL @I1935@ 0 @F819@ FAM 1 HUSB @I1937@ 1 CHIL @I1936@ 0 @F820@ FAM 1 HUSB @I1938@ 1 CHIL @I1939@ 1 CHIL @I1937@ 0 @F821@ FAM 1 HUSB @I1940@ 1 WIFE @I1941@ 1 CHIL @I1942@ 1 CHIL @I1943@ 1 CHIL @I1944@ 0 @F822@ FAM 1 HUSB @I1939@ 1 CHIL @I1940@ 0 @F823@ FAM 1 HUSB @I1945@ 1 CHIL @I1947@ 0 @F824@ FAM 1 HUSB @I1943@ 1 CHIL @I1945@ 1 CHIL @I1946@ 0 @F825@ FAM 1 HUSB @I1944@ 1 CHIL @I1948@ 0 @F826@ FAM 1 HUSB @I1948@ 1 CHIL @I1949@ 0 @F827@ FAM 1 HUSB @I1950@ 1 CHIL @I1951@ 0 @F828@ FAM 1 HUSB @I1949@ 1 CHIL @I1950@ 0 @F829@ FAM 1 HUSB @I1951@ 1 CHIL @I1952@ 0 @F830@ FAM 1 HUSB @I1953@ 1 CHIL @I1913@ 0 @F831@ FAM 1 HUSB @I1952@ 1 WIFE @I1954@ 1 CHIL @I1955@ 1 CHIL @I1953@ 0 @F832@ FAM 1 HUSB @I1961@ 1 CHIL @I1960@ 0 @F833@ FAM 1 HUSB @I1957@ 1 CHIL @I1961@ 0 @F834@ FAM 1 HUSB @I1964@ 1 WIFE @I1965@ 1 CHIL @I1792@ 1 CHIL @I1982@ 1 CHIL @I1985@ 1 CHIL @I1986@ 1 CHIL @I1987@ 0 @F835@ FAM 1 HUSB @I1966@ 1 WIFE @I1967@ 1 CHIL @I1968@ 1 CHIL @I1969@ 1 CHIL @I1971@ 1 CHIL @I1977@ 1 CHIL @I1972@ 1 CHIL @I1964@ 0 @F836@ FAM 1 HUSB @I1969@ 1 WIFE @I1970@ 0 @F837@ FAM 1 HUSB @I1973@ 1 WIFE @I1974@ 1 CHIL @I1966@ 1 CHIL @I1975@ 0 @F838@ FAM 1 HUSB @I1966@ 1 WIFE @I1970@ 0 @F839@ FAM 1 HUSB @I1976@ 1 CHIL @I1967@ 0 @F840@ FAM 1 HUSB @I1972@ 1 CHIL @I1978@ 1 CHIL @I1979@ 0 @F841@ FAM 1 HUSB @I1980@ 1 WIFE @I1977@ 0 @F842@ FAM 1 HUSB @I1981@ 1 CHIL @I1965@ 0 @F843@ FAM 1 HUSB @I1982@ 1 CHIL @I1983@ 1 CHIL @I1984@ 0 @F844@ FAM 1 HUSB @I1988@ 1 WIFE @I1987@ 0 @F845@ FAM 1 HUSB @I1989@ 1 WIFE @I1985@ 0 @F846@ FAM 1 HUSB @I1929@ 1 WIFE @I1768@ 1 CHIL @I1990@ 0 @F847@ FAM 1 HUSB @I1991@ 1 CHIL @I1992@ 0 @F848@ FAM 1 HUSB @I1992@ 1 CHIL @I1993@ 1 CHIL @I1994@ 0 @F849@ FAM 1 HUSB @I1995@ 1 CHIL @I1991@ 1 CHIL @I2019@ 0 @F850@ FAM 1 HUSB @I1996@ 1 CHIL @I1995@ 0 @F851@ FAM 1 HUSB @I1997@ 1 CHIL @I1996@ 0 @F852@ FAM 1 HUSB @I1998@ 1 CHIL @I1997@ 0 @F853@ FAM 1 HUSB @I1999@ 1 CHIL @I1998@ 0 @F854@ FAM 1 HUSB @I2000@ 1 CHIL @I1999@ 0 @F855@ FAM 1 HUSB @I2001@ 1 CHIL @I2000@ 0 @F856@ FAM 1 HUSB @I2002@ 1 CHIL @I2001@ 0 @F857@ FAM 1 HUSB @I2003@ 1 CHIL @I2002@ 0 @F858@ FAM 1 HUSB @I2004@ 1 CHIL @I2003@ 0 @F859@ FAM 1 HUSB @I2005@ 1 CHIL @I2004@ 0 @F860@ FAM 1 HUSB @I2006@ 1 CHIL @I2005@ 0 @F861@ FAM 1 HUSB @I2007@ 1 CHIL @I2006@ 0 @F862@ FAM 1 HUSB @I2008@ 1 CHIL @I2007@ 0 @F863@ FAM 1 HUSB @I2009@ 1 CHIL @I2008@ 0 @F864@ FAM 1 HUSB @I2010@ 1 CHIL @I2009@ 0 @F865@ FAM 1 HUSB @I2011@ 1 CHIL @I2010@ 0 @F866@ FAM 1 HUSB @I2012@ 1 CHIL @I2011@ 0 @F867@ FAM 1 HUSB @I2013@ 1 CHIL @I2012@ 0 @F868@ FAM 1 HUSB @I2014@ 1 CHIL @I2013@ 0 @F869@ FAM 1 HUSB @I2015@ 1 CHIL @I2014@ 0 @F870@ FAM 1 HUSB @I2016@ 1 CHIL @I2015@ 0 @F871@ FAM 1 HUSB @I2017@ 1 CHIL @I2016@ 0 @F872@ FAM 1 HUSB @I2018@ 1 CHIL @I2017@ 0 @F873@ FAM 1 WIFE @I2019@ 1 CHIL @I2020@ 1 CHIL @I2021@ 0 @F874@ FAM 1 HUSB @I1994@ 1 CHIL @I2022@ 1 CHIL @I2023@ 0 @F875@ FAM 1 HUSB @I2022@ 1 CHIL @I2024@ 0 @F876@ FAM 1 HUSB @I2026@ 1 CHIL @I2025@ 0 @F877@ FAM 1 HUSB @I2027@ 1 CHIL @I2026@ 0 @F878@ FAM 1 HUSB @I2028@ 1 CHIL @I2027@ 0 @F879@ FAM 1 HUSB @I2023@ 1 CHIL @I2028@ 0 @F880@ FAM 1 HUSB @I2024@ 1 CHIL @I2029@ 1 CHIL @I2030@ 1 CHIL @I2031@ 1 CHIL @I2032@ 0 @F881@ FAM 1 HUSB @I2029@ 1 CHIL @I2033@ 0 @F882@ FAM 1 HUSB @I2030@ 1 WIFE @I2034@ 1 DIV Y 0 @F883@ FAM 1 HUSB @I2030@ 1 WIFE @I2035@ 0 @F884@ FAM 1 HUSB @I2036@ 1 WIFE @I2032@ 0 @F885@ FAM 1 HUSB @I1993@ 1 CHIL @I2037@ 0 @F886@ FAM 1 HUSB @I2037@ 1 CHIL @I2038@ 1 CHIL @I2039@ 1 CHIL @I2040@ 0 @F887@ FAM 1 HUSB @I2038@ 1 CHIL @I2041@ 0 @F888@ FAM 1 HUSB @I2041@ 1 CHIL @I2042@ 1 CHIL @I2043@ 0 @F889@ FAM 1 HUSB @I2045@ 1 CHIL @I2044@ 0 @F890@ FAM 1 HUSB @I2039@ 1 CHIL @I2045@ 0 @F891@ FAM 1 HUSB @I2047@ 1 CHIL @I2046@ 1 CHIL @I2050@ 1 CHIL @I2051@ 1 CHIL @I2052@ 0 @F892@ FAM 1 HUSB @I2048@ 1 CHIL @I2047@ 0 @F893@ FAM 1 HUSB @I2046@ 1 WIFE @I2049@ 0 @F894@ FAM 1 HUSB @I2053@ 1 WIFE @I2052@ 0 @F895@ FAM 1 HUSB @I2054@ 1 CHIL @I1973@ 0 @F896@ FAM 1 HUSB @I2055@ 1 CHIL @I2054@ 0 @F897@ FAM 1 HUSB @I2056@ 1 CHIL @I2055@ 0 @F898@ FAM 1 HUSB @I2050@ 1 CHIL @I2056@ 0 @F899@ FAM 1 HUSB @I2040@ 1 CHIL @I2048@ 0 @F900@ FAM 1 HUSB @I2057@ 1 CHIL @I1230@ 0 @F901@ FAM 1 HUSB @I2058@ 1 WIFE @I1410@ 1 CHIL @I1595@ 0 @F902@ FAM 1 HUSB @I2059@ 1 CHIL @I1418@ 0 @F903@ FAM 1 HUSB @I2060@ 1 CHIL @I1347@ 0 @F904@ FAM 1 HUSB @I2061@ 1 WIFE @I1347@ 0 @F905@ FAM 1 HUSB @I2062@ 1 CHIL @I1416@ 0 @F906@ FAM 1 HUSB @I2063@ 1 CHIL @I1328@ 0 @F907@ FAM 1 HUSB @I2064@ 1 WIFE @I1328@ 0 @F908@ FAM 1 HUSB @I2062@ 1 CHIL @I1337@ 0 @F909@ FAM 1 HUSB @I2066@ 1 WIFE @I2065@ 0 @F910@ FAM 1 HUSB @I2067@ 1 CHIL @I2066@ 0 @F911@ FAM 1 HUSB @I2068@ 1 CHIL @I2067@ 0 @F912@ FAM 1 HUSB @I2069@ 1 CHIL @I1343@ 0 @F913@ FAM 1 HUSB @I2070@ 1 WIFE @I1603@ 0 @F914@ FAM 1 HUSB @I1332@ 1 CHIL @I1222@ 0 @F915@ FAM 1 HUSB @I2075@ 1 WIFE @I2074@ 1 CHIL @I1414@ 1 CHIL @I1220@ 1 CHIL @I2537@ 1 MARR 2 DATE 17 JUL 1385 0 @F916@ FAM 1 HUSB @I2076@ 1 WIFE @I1331@ 0 @F917@ FAM 1 HUSB @I1437@ 1 WIFE @I2077@ 0 @F918@ FAM 1 HUSB @I2078@ 1 CHIL @I2077@ 0 @F919@ FAM 1 HUSB @I2080@ 1 WIFE @I2079@ 0 @F920@ FAM 1 HUSB @I1335@ 1 WIFE @I2081@ 1 CHIL @I2083@ 1 CHIL @I2084@ 1 CHIL @I2085@ 1 CHIL @I2086@ 1 CHIL @I2087@ 1 CHIL @I2088@ 1 CHIL @I2089@ 1 CHIL @I2090@ 0 @F921@ FAM 1 HUSB @I2082@ 1 CHIL @I2081@ 0 @F922@ FAM 1 HUSB @I2091@ 1 WIFE @I2086@ 0 @F923@ FAM 1 HUSB @I2092@ 1 WIFE @I2086@ 0 @F924@ FAM 1 HUSB @I2093@ 1 WIFE @I2087@ 0 @F925@ FAM 1 HUSB @I2094@ 1 WIFE @I2087@ 0 @F926@ FAM 1 HUSB @I2095@ 1 WIFE @I2088@ 0 @F927@ FAM 1 HUSB @I2096@ 1 WIFE @I2089@ 0 @F928@ FAM 1 HUSB @I2097@ 1 WIFE @I2089@ 0 @F929@ FAM 1 HUSB @I2098@ 1 WIFE @I2090@ 0 @F930@ FAM 1 HUSB @I2101@ 1 CHIL @I1434@ 0 @F931@ FAM 1 HUSB @I2099@ 1 WIFE @I2337@ 1 CHIL @I2338@ 1 CHIL @I2339@ 1 CHIL @I848@ 0 @F932@ FAM 1 HUSB @I1436@ 1 WIFE @I2102@ 0 @F933@ FAM 1 HUSB @I2103@ 1 CHIL @I2102@ 0 @F934@ FAM 1 HUSB @I2104@ 1 WIFE @I1428@ 1 CHIL @I2334@ 0 @F935@ FAM 1 HUSB @I2105@ 1 WIFE @I1427@ 0 @F936@ FAM 1 HUSB @I2108@ 1 WIFE @I2106@ 1 CHIL @I2109@ 1 CHIL @I2110@ 0 @F937@ FAM 1 HUSB @I2110@ 1 WIFE @I2111@ 0 @F938@ FAM 1 HUSB @I2109@ 1 WIFE @I2112@ 1 CHIL @I1436@ 1 CHIL @I2396@ 1 CHIL @I2397@ 1 CHIL @I2398@ 0 @F939@ FAM 1 HUSB @I2113@ 1 CHIL @I2112@ 0 @F940@ FAM 1 HUSB @I765@ 1 WIFE @I769@ 1 CHIL @I2415@ 0 @F941@ FAM 1 HUSB @I2120@ 1 CHIL @I769@ 0 @F942@ FAM 1 HUSB @I768@ 1 WIFE @I2121@ 0 @F943@ FAM 1 HUSB @I2122@ 1 WIFE @I2118@ 0 @F944@ FAM 1 HUSB @I2127@ 1 CHIL @I707@ 0 @F945@ FAM 1 HUSB @I2129@ 1 WIFE @I2128@ 0 @F946@ FAM 1 HUSB @I2130@ 1 WIFE @I951@ 0 @F947@ FAM 1 HUSB @I2131@ 1 WIFE @I2416@ 1 CHIL @I2130@ 1 CHIL @I2421@ 1 MARR 2 DATE 1649 0 @F948@ FAM 1 HUSB @I2131@ 1 WIFE @I896@ 1 CHIL @I1420@ 1 MARR 2 DATE 1621 0 @F949@ FAM 1 HUSB @I870@ 1 WIFE @I2133@ 1 CHIL @I2136@ 1 MARR 2 DATE 1543 0 @F950@ FAM 1 HUSB @I870@ 1 WIFE @I2134@ 0 @F951@ FAM 1 HUSB @I870@ 1 WIFE @I2135@ 1 CHIL @I2132@ 1 MARR 2 DATE 1570 0 @F952@ FAM 1 HUSB @I2137@ 1 CHIL @I721@ 0 @F953@ FAM 1 HUSB @I2138@ 1 CHIL @I2137@ 0 @F954@ FAM 1 HUSB @I2139@ 1 CHIL @I724@ 0 @F955@ FAM 1 HUSB @I2140@ 1 WIFE @I2141@ 1 CHIL @I342@ 0 @F956@ FAM 1 HUSB @I2142@ 1 WIFE @I2143@ 1 CHIL @I332@ 0 @F957@ FAM 1 HUSB @I2144@ 1 CHIL @I762@ 0 @F958@ FAM 1 HUSB @I2145@ 1 WIFE @I762@ 0 @F959@ FAM 1 HUSB @I2147@ 1 WIFE @I2148@ 1 CHIL @I131@ 0 @F960@ FAM 1 HUSB @I2149@ 1 WIFE @I99@ 0 @F961@ FAM 1 HUSB @I2150@ 1 WIFE @I98@ 0 @F962@ FAM 1 HUSB @I2151@ 1 CHIL @I126@ 0 @F963@ FAM 1 HUSB @I504@ 1 WIFE @I2156@ 1 CHIL @I2158@ 1 CHIL @I2159@ 1 DIV Y 0 @F964@ FAM 1 HUSB @I504@ 1 WIFE @I2157@ 0 @F965@ FAM 1 HUSB @I2160@ 1 CHIL @I494@ 0 @F966@ FAM 1 HUSB @I2161@ 1 CHIL @I408@ 0 @F967@ FAM 1 HUSB @I2162@ 1 WIFE @I509@ 1 DIV Y 1 MARR 2 DATE 1941 0 @F968@ FAM 1 HUSB @I2163@ 1 WIFE @I509@ 1 CHIL @I2165@ 1 DIV Y 1 MARR 2 DATE 1957 0 @F969@ FAM 1 HUSB @I2164@ 1 WIFE @I509@ 1 MARR 2 DATE 1965 0 @F970@ FAM 1 HUSB @I2166@ 1 WIFE @I1959@ 1 CHIL @I2167@ 0 @F971@ FAM 1 HUSB @I2168@ 1 WIFE @I2167@ 1 CHIL @I2169@ 0 @F972@ FAM 1 HUSB @I2169@ 1 CHIL @I2170@ 0 @F973@ FAM 1 HUSB @I2170@ 1 CHIL @I2171@ 0 @F974@ FAM 1 HUSB @I2171@ 1 CHIL @I2172@ 0 @F975@ FAM 1 HUSB @I2173@ 1 WIFE @I2172@ 1 CHIL @I2174@ 0 @F976@ FAM 1 HUSB @I2174@ 1 CHIL @I1352@ 0 @F977@ FAM 1 HUSB @I2175@ 1 CHIL @I2173@ 0 @F978@ FAM 1 HUSB @I2176@ 1 CHIL @I2175@ 0 @F979@ FAM 1 HUSB @I2177@ 1 CHIL @I2176@ 0 @F980@ FAM 1 HUSB @I2178@ 1 WIFE @I2179@ 1 CHIL @I2177@ 0 @F981@ FAM 1 HUSB @I2180@ 1 CHIL @I2179@ 0 @F982@ FAM 1 HUSB @I2181@ 1 CHIL @I2180@ 0 @F983@ FAM 1 HUSB @I2182@ 1 CHIL @I2181@ 0 @F984@ FAM 1 HUSB @I2183@ 1 CHIL @I2182@ 0 @F985@ FAM 1 HUSB @I2184@ 1 CHIL @I2183@ 0 @F986@ FAM 1 HUSB @I2185@ 1 CHIL @I2184@ 0 @F987@ FAM 1 HUSB @I2186@ 1 CHIL @I1918@ 0 @F988@ FAM 1 HUSB @I2187@ 1 WIFE @I2188@ 1 CHIL @I2186@ 0 @F989@ FAM 1 HUSB @I2189@ 1 WIFE @I2190@ 1 CHIL @I2188@ 0 @F990@ FAM 1 HUSB @I2191@ 1 CHIL @I2190@ 0 @F991@ FAM 1 HUSB @I2192@ 1 CHIL @I2191@ 0 @F992@ FAM 1 HUSB @I2193@ 1 CHIL @I2192@ 0 @F993@ FAM 1 HUSB @I2194@ 1 CHIL @I2193@ 0 @F994@ FAM 1 HUSB @I2195@ 1 CHIL @I2194@ 0 @F995@ FAM 1 HUSB @I2196@ 1 CHIL @I2195@ 0 @F996@ FAM 1 HUSB @I2197@ 1 CHIL @I2196@ 0 @F997@ FAM 1 HUSB @I2198@ 1 CHIL @I2197@ 0 @F998@ FAM 1 HUSB @I2199@ 1 CHIL @I2198@ 0 @F999@ FAM 1 HUSB @I2200@ 1 CHIL @I2199@ 0 @F1000@ FAM 1 HUSB @I2201@ 1 CHIL @I2200@ 0 @F1001@ FAM 1 HUSB @I2202@ 1 CHIL @I2201@ 0 @F1002@ FAM 1 HUSB @I2203@ 1 CHIL @I2202@ 0 @F1003@ FAM 1 HUSB @I2204@ 1 CHIL @I2203@ 0 @F1004@ FAM 1 HUSB @I2205@ 1 CHIL @I2204@ 0 @F1005@ FAM 1 HUSB @I2206@ 1 WIFE @I2207@ 1 CHIL @I2205@ 0 @F1006@ FAM 1 HUSB @I2208@ 1 CHIL @I2206@ 0 @F1007@ FAM 1 HUSB @I2209@ 1 CHIL @I2208@ 0 @F1008@ FAM 1 HUSB @I2210@ 1 CHIL @I2209@ 0 @F1009@ FAM 1 HUSB @I2211@ 1 CHIL @I2210@ 0 @F1010@ FAM 1 HUSB @I2212@ 1 CHIL @I2211@ 1 CHIL @I2213@ 0 @F1011@ FAM 1 HUSB @I2214@ 1 WIFE @I2213@ 1 CHIL @I2215@ 0 @F1012@ FAM 1 HUSB @I2217@ 1 WIFE @I2218@ 1 CHIL @I2216@ 0 @F1013@ FAM 1 HUSB @I2219@ 1 WIFE @I2220@ 1 CHIL @I2218@ 0 @F1014@ FAM 1 HUSB @I2221@ 1 CHIL @I2220@ 1 CHIL @I2207@ 0 @F1015@ FAM 1 HUSB @I2222@ 1 CHIL @I2221@ 0 @F1016@ FAM 1 HUSB @I2223@ 1 CHIL @I2222@ 0 @F1017@ FAM 1 HUSB @I2215@ 1 CHIL @I2223@ 0 @F1018@ FAM 1 HUSB @I1514@ 1 WIFE @I2224@ 0 @F1019@ FAM 1 HUSB @I2301@ 1 WIFE @I2302@ 1 CHIL @I779@ 0 @F1020@ FAM 1 HUSB @I1511@ 1 WIFE @I2225@ 1 CHIL @I2237@ 0 @F1021@ FAM 1 HUSB @I2226@ 1 CHIL @I2225@ 0 @F1022@ FAM 1 HUSB @I1515@ 1 WIFE @I2227@ 1 CHIL @I2228@ 0 @F1023@ FAM 1 HUSB @I2228@ 1 WIFE @I2229@ 1 CHIL @I2230@ 1 CHIL @I2231@ 1 CHIL @I1837@ 0 @F1024@ FAM 1 HUSB @I2231@ 1 WIFE @I2232@ 1 CHIL @I1886@ 0 @F1025@ FAM 1 HUSB @I1886@ 1 WIFE @I2233@ 1 CHIL @I1585@ 1 MARR 2 DATE AFT 1238 0 @F1026@ FAM 1 HUSB @I2235@ 1 WIFE @I2234@ 1 CHIL @I2236@ 0 @F1027@ FAM 1 HUSB @I2237@ 1 WIFE @I2238@ 0 @F1028@ FAM 1 HUSB @I2239@ 1 WIFE @I2240@ 1 CHIL @I1511@ 1 CHIL @I2241@ 0 @F1029@ FAM 1 HUSB @I2242@ 1 WIFE @I2243@ 1 CHIL @I2239@ 0 @F1030@ FAM 1 HUSB @I2244@ 1 WIFE @I2245@ 1 CHIL @I2246@ 0 @F1031@ FAM 1 HUSB @I2247@ 1 WIFE @I2245@ 0 @F1032@ FAM 1 HUSB @I2248@ 1 CHIL @I2243@ 0 @F1033@ FAM 1 HUSB @I2249@ 1 CHIL @I2248@ 0 @F1034@ FAM 1 HUSB @I2250@ 1 CHIL @I2249@ 1 CHIL @I2253@ 0 @F1035@ FAM 1 HUSB @I2251@ 1 CHIL @I2250@ 0 @F1036@ FAM 1 HUSB @I2252@ 1 CHIL @I2251@ 0 @F1037@ FAM 1 HUSB @I2253@ 1 CHIL @I2254@ 0 @F1038@ FAM 1 HUSB @I2255@ 1 CHIL @I2245@ 0 @F1039@ FAM 1 HUSB @I2254@ 1 CHIL @I2255@ 0 @F1040@ FAM 1 HUSB @I2257@ 1 CHIL @I2256@ 0 @F1041@ FAM 1 HUSB @I2258@ 1 CHIL @I2257@ 0 @F1042@ FAM 1 HUSB @I2259@ 1 CHIL @I2258@ 0 @F1043@ FAM 1 HUSB @I2260@ 1 CHIL @I2259@ 0 @F1044@ FAM 1 HUSB @I2261@ 1 CHIL @I2252@ 1 CHIL @I2260@ 1 CHIL @I2262@ 0 @F1045@ FAM 1 HUSB @I2263@ 1 WIFE @I2262@ 1 CHIL @I2264@ 0 @F1046@ FAM 1 HUSB @I2265@ 1 CHIL @I2261@ 1 CHIL @I2266@ 0 @F1047@ FAM 1 HUSB @I2267@ 1 CHIL @I1601@ 0 @F1048@ FAM 1 HUSB @I2268@ 1 CHIL @I1598@ 0 @F1049@ FAM 1 HUSB @I2269@ 1 CHIL @I1596@ 0 @F1050@ FAM 1 HUSB @I2270@ 1 CHIL @I1327@ 0 @F1051@ FAM 1 HUSB @I2271@ 1 WIFE @I1327@ 1 CHIL @I998@ 0 @F1052@ FAM 1 HUSB @I2272@ 1 CHIL @I1218@ 0 @F1053@ FAM 1 HUSB @I2273@ 1 WIFE @I1025@ 0 @F1054@ FAM 1 HUSB @I2274@ 1 WIFE @I2549@ 1 CHIL @I1628@ 0 @F1055@ FAM 1 HUSB @I2275@ 1 WIFE @I1019@ 0 @F1056@ FAM 1 HUSB @I2276@ 1 WIFE @I995@ 0 @F1057@ FAM 1 HUSB @I2277@ 1 CHIL @I1345@ 0 @F1058@ FAM 1 HUSB @I2278@ 1 WIFE @I1345@ 0 @F1059@ FAM 1 HUSB @I2279@ 1 CHIL @I1445@ 0 @F1060@ FAM 1 HUSB @I2282@ 1 WIFE @I2281@ 0 @F1061@ FAM 1 HUSB @I2286@ 1 WIFE @I2284@ 0 @F1062@ FAM 1 HUSB @I2287@ 1 WIFE @I2284@ 0 @F1063@ FAM 1 HUSB @I2288@ 1 WIFE @I2285@ 0 @F1064@ FAM 1 HUSB @I2289@ 1 WIFE @I2285@ 0 @F1065@ FAM 1 HUSB @I2290@ 1 WIFE @I2285@ 0 @F1066@ FAM 1 HUSB @I2291@ 1 CHIL @I1413@ 0 @F1067@ FAM 1 HUSB @I2292@ 1 WIFE @I1502@ 0 @F1068@ FAM 1 HUSB @I2293@ 1 WIFE @I1502@ 0 @F1069@ FAM 1 HUSB @I2295@ 1 WIFE @I2294@ 0 @F1070@ FAM 1 HUSB @I2297@ 1 WIFE @I2296@ 0 @F1071@ FAM 1 HUSB @I2298@ 1 WIFE @I2296@ 0 @F1072@ FAM 1 HUSB @I1338@ 1 WIFE @I2296@ 0 @F1073@ FAM 1 HUSB @I2299@ 1 CHIL @I1444@ 0 @F1074@ FAM 1 HUSB @I2300@ 1 WIFE @I1444@ 1 DIV Y 0 @F1075@ FAM 1 HUSB @I2303@ 1 WIFE @I2304@ 1 CHIL @I2301@ 0 @F1076@ FAM 1 HUSB @I2305@ 1 WIFE @I2306@ 1 CHIL @I2304@ 0 @F1077@ FAM 1 HUSB @I2307@ 1 WIFE @I2308@ 1 CHIL @I2305@ 0 @F1078@ FAM 1 HUSB @I2310@ 1 WIFE @I2311@ 1 CHIL @I2312@ 1 CHIL @I2313@ 1 CHIL @I2314@ 1 CHIL @I869@ 1 CHIL @I2315@ 1 CHIL @I2316@ 1 CHIL @I2317@ 1 CHIL @I2318@ 0 @F1079@ FAM 1 HUSB @I2312@ 1 WIFE @I2319@ 0 @F1080@ FAM 1 HUSB @I2320@ 1 WIFE @I2319@ 0 @F1081@ FAM 1 HUSB @I2313@ 1 WIFE @I2321@ 1 CHIL @I2324@ 0 @F1082@ FAM 1 HUSB @I2313@ 1 WIFE @I2322@ 0 @F1083@ FAM 1 HUSB @I2313@ 1 WIFE @I2323@ 0 @F1084@ FAM 1 HUSB @I2314@ 1 WIFE @I2325@ 0 @F1085@ FAM 1 HUSB @I2326@ 1 WIFE @I2325@ 0 @F1086@ FAM 1 HUSB @I2327@ 1 WIFE @I2316@ 0 @F1087@ FAM 1 HUSB @I2328@ 1 WIFE @I2317@ 0 @F1088@ FAM 1 HUSB @I2329@ 1 WIFE @I2318@ 0 @F1089@ FAM 1 HUSB @I2315@ 1 WIFE @I2330@ 0 @F1090@ FAM 1 HUSB @I2315@ 1 WIFE @I2331@ 0 @F1091@ FAM 1 HUSB @I2332@ 1 WIFE @I2106@ 1 DIV Y 0 @F1092@ FAM 1 HUSB @I2333@ 1 WIFE @I2107@ 0 @F1093@ FAM 1 HUSB @I2335@ 1 WIFE @I2334@ 0 @F1094@ FAM 1 HUSB @I2104@ 1 WIFE @I2336@ 0 @F1095@ FAM 1 HUSB @I2340@ 1 WIFE @I2339@ 1 CHIL @I2394@ 1 CHIL @I2403@ 0 @F1096@ FAM 1 HUSB @I2341@ 1 WIFE @I2342@ 1 CHIL @I2343@ 1 CHIL @I2337@ 1 CHIL @I857@ 0 @F1097@ FAM 1 HUSB @I2343@ 1 WIFE @I2344@ 0 @F1098@ FAM 1 HUSB @I2343@ 1 WIFE @I2345@ 1 CHIL @I2355@ 1 CHIL @I2356@ 1 CHIL @I2357@ 0 @F1099@ FAM 1 HUSB @I857@ 1 WIFE @I2346@ 0 @F1100@ FAM 1 HUSB @I2341@ 1 WIFE @I2347@ 1 CHIL @I2348@ 1 CHIL @I2349@ 1 CHIL @I2350@ 0 @F1101@ FAM 1 HUSB @I2348@ 1 WIFE @I2351@ 0 @F1102@ FAM 1 HUSB @I2348@ 1 WIFE @I2352@ 0 @F1103@ FAM 1 HUSB @I2353@ 1 WIFE @I2349@ 0 @F1104@ FAM 1 HUSB @I2354@ 1 WIFE @I2350@ 0 @F1105@ FAM 1 HUSB @I2355@ 1 WIFE @I2358@ 1 CHIL @I2359@ 1 CHIL @I2360@ 1 CHIL @I2361@ 1 CHIL @I2362@ 1 CHIL @I2363@ 0 @F1106@ FAM 1 HUSB @I2364@ 1 WIFE @I2356@ 0 @F1107@ FAM 1 HUSB @I2357@ 1 WIFE @I2365@ 0 @F1108@ FAM 1 HUSB @I2359@ 1 WIFE @I2366@ 1 CHIL @I2367@ 0 @F1109@ FAM 1 HUSB @I2367@ 1 WIFE @I2368@ 1 CHIL @I2369@ 0 @F1110@ FAM 1 HUSB @I2369@ 1 WIFE @I2370@ 0 @F1111@ FAM 1 HUSB @I2359@ 1 WIFE @I2371@ 1 CHIL @I2372@ 1 CHIL @I2387@ 0 @F1112@ FAM 1 HUSB @I2372@ 1 WIFE @I2373@ 0 @F1113@ FAM 1 HUSB @I2372@ 1 WIFE @I2374@ 1 CHIL @I2375@ 1 CHIL @I2376@ 1 CHIL @I2377@ 1 CHIL @I2378@ 1 CHIL @I2379@ 0 @F1114@ FAM 1 HUSB @I2375@ 1 WIFE @I2380@ 0 @F1115@ FAM 1 HUSB @I2376@ 1 WIFE @I2381@ 0 @F1116@ FAM 1 HUSB @I2377@ 1 WIFE @I2382@ 0 @F1117@ FAM 1 HUSB @I2383@ 1 WIFE @I2382@ 0 @F1118@ FAM 1 HUSB @I2384@ 1 WIFE @I2378@ 0 @F1119@ FAM 1 HUSB @I2385@ 1 WIFE @I2379@ 1 DIV Y 0 @F1120@ FAM 1 HUSB @I2386@ 1 WIFE @I2379@ 0 @F1121@ FAM 1 HUSB @I2387@ 1 WIFE @I2388@ 0 @F1122@ FAM 1 HUSB @I2108@ 1 WIFE @I2389@ 0 @F1123@ FAM 1 HUSB @I2108@ 1 WIFE @I2390@ 0 @F1124@ FAM 1 HUSB @I2391@ 1 WIFE @I2390@ 0 @F1125@ FAM 1 HUSB @I2392@ 1 WIFE @I2393@ 1 CHIL @I2327@ 1 CHIL @I2108@ 1 CHIL @I2319@ 0 @F1126@ FAM 1 HUSB @I2392@ 1 WIFE @I2395@ 1 DIV Y 0 @F1127@ FAM 1 HUSB @I2396@ 1 WIFE @I2399@ 0 @F1128@ FAM 1 HUSB @I2400@ 1 WIFE @I2399@ 0 @F1129@ FAM 1 HUSB @I2397@ 1 WIFE @I2401@ 0 @F1130@ FAM 1 HUSB @I2397@ 1 WIFE @I2402@ 0 @F1131@ FAM 1 HUSB @I2394@ 1 WIFE @I2404@ 0 @F1132@ FAM 1 HUSB @I2405@ 1 WIFE @I2403@ 1 CHIL @I2406@ 1 CHIL @I2407@ 1 CHIL @I2331@ 1 CHIL @I2408@ 1 CHIL @I2409@ 0 @F1133@ FAM 1 HUSB @I2406@ 1 WIFE @I2410@ 0 @F1134@ FAM 1 HUSB @I2411@ 1 WIFE @I2331@ 0 @F1135@ FAM 1 HUSB @I2412@ 1 WIFE @I2331@ 0 @F1136@ FAM 1 HUSB @I2413@ 1 WIFE @I2408@ 0 @F1137@ FAM 1 HUSB @I2414@ 1 WIFE @I2409@ 0 @F1138@ FAM 1 HUSB @I2418@ 1 WIFE @I2417@ 1 CHIL @I2416@ 1 CHIL @I2420@ 0 @F1139@ FAM 1 HUSB @I2419@ 1 CHIL @I2418@ 0 @F1140@ FAM 1 HUSB @I2420@ 1 WIFE @I2421@ 1 CHIL @I2427@ 0 @F1141@ FAM 1 HUSB @I2420@ 1 WIFE @I2422@ 1 CHIL @I2430@ 1 CHIL @I2431@ 0 @F1142@ FAM 1 HUSB @I2424@ 1 WIFE @I2425@ 1 CHIL @I2880@ 1 MARR 2 DATE 1714 0 @F1143@ FAM 1 HUSB @I2423@ 1 WIFE @I2882@ 1 CHIL @I2426@ 1 CHIL @I2424@ 1 CHIL @I2507@ 1 MARR 2 DATE 1680 0 @F1144@ FAM 1 HUSB @I2428@ 1 WIFE @I2427@ 1 CHIL @I2429@ 0 @F1145@ FAM 1 HUSB @I2433@ 1 WIFE @I2432@ 1 CHIL @I2434@ 1 MARR 2 DATE 1736 0 @F1146@ FAM 1 HUSB @I2431@ 1 CHIL @I2432@ 0 @F1147@ FAM 1 HUSB @I2448@ 1 WIFE @I2614@ 1 CHIL @I2973@ 1 CHIL @I2974@ 1 CHIL @I2975@ 1 CHIL @I139@ 1 CHIL @I205@ 1 CHIL @I138@ 1 CHIL @I1696@ 1 MARR 2 DATE 1777 0 @F1148@ FAM 1 HUSB @I2438@ 1 WIFE @I2439@ 1 CHIL @I1248@ 1 CHIL @I2522@ 1 CHIL @I2523@ 1 MARR 2 DATE 28 OCT 1533 0 @F1149@ FAM 1 HUSB @I2435@ 1 WIFE @I2436@ 1 CHIL @I1614@ 0 @F1150@ FAM 1 HUSB @I2437@ 1 CHIL @I1438@ 0 @F1151@ FAM 1 HUSB @I838@ 1 WIFE @I2547@ 1 DIV Y 1 MARR 2 DATE 8 SEP 1476 0 @F1152@ FAM 1 HUSB @I2442@ 1 WIFE @I2443@ 1 CHIL @I841@ 0 @F1153@ FAM 1 HUSB @I2444@ 1 WIFE @I2445@ 1 CHIL @I1612@ 0 @F1154@ FAM 1 HUSB @I1698@ 1 WIFE @I2449@ 1 CHIL @I2901@ 1 CHIL @I2902@ 1 CHIL @I2903@ 1 MARR 2 DATE 1853 0 @F1155@ FAM 1 HUSB @I2450@ 1 CHIL @I2449@ 0 @F1156@ FAM 1 HUSB @I2451@ 1 WIFE @I2477@ 1 CHIL @I1741@ 1 MARR 2 DATE 1180 0 @F1157@ FAM 1 HUSB @I2464@ 1 WIFE @I2487@ 1 CHIL @I2466@ 1 MARR 2 DATE AUG 1315 0 @F1158@ FAM 1 HUSB @I2452@ 1 WIFE @I2453@ 1 CHIL @I2469@ 1 CHIL @I1869@ 1 CHIL @I2470@ 1 CHIL @I2471@ 1 CHIL @I2472@ 1 CHIL @I2473@ 1 CHIL @I2474@ 1 MARR 2 DATE 1115 0 @F1159@ FAM 1 HUSB @I2454@ 1 WIFE @I2455@ 1 CHIL @I2452@ 1 DIV Y 1 MARR 2 DATE 1072 0 @F1160@ FAM 1 HUSB @I2454@ 1 WIFE @I2456@ 1 MARR 2 DATE 1095 0 @F1161@ FAM 1 HUSB @I2457@ 1 WIFE @I2535@ 1 CHIL @I2454@ 1 MARR 2 DATE 1051 0 @F1162@ FAM 1 HUSB @I2458@ 1 WIFE @I2459@ 1 CHIL @I2460@ 1 CHIL @I2457@ 1 CHIL @I2533@ 1 MARR 2 DATE 1003 0 @F1163@ FAM 1 HUSB @I2458@ 1 WIFE @I2461@ 0 @F1164@ FAM 1 HUSB @I2458@ 1 WIFE @I2462@ 1 DIV Y 1 MARR 2 DATE 996 0 @F1165@ FAM 1 HUSB @I2463@ 1 CHIL @I2458@ 0 @F1166@ FAM 1 HUSB @I2467@ 1 CHIL @I1557@ 0 @F1167@ FAM 1 HUSB @I2468@ 1 CHIL @I2467@ 0 @F1168@ FAM 1 HUSB @I1869@ 1 WIFE @I2475@ 1 MARR 2 DATE 1154 0 @F1169@ FAM 1 HUSB @I1869@ 1 WIFE @I2476@ 1 CHIL @I2451@ 1 MARR 2 DATE 1160 0 @F1170@ FAM 1 HUSB @I2451@ 1 WIFE @I2478@ 1 DIV Y 1 MARR 2 DATE 1193 0 @F1171@ FAM 1 HUSB @I2451@ 1 WIFE @I2479@ 1 CHIL @I2480@ 1 DIV Y 1 MARR 2 DATE 1196 0 @F1172@ FAM 1 HUSB @I2483@ 1 CHIL @I2482@ 0 @F1173@ FAM 1 HUSB @I2488@ 1 CHIL @I2487@ 0 @F1174@ FAM 1 HUSB @I2489@ 1 CHIL @I2488@ 0 @F1175@ FAM 1 HUSB @I2465@ 1 WIFE @I2490@ 1 MARR 2 DATE 1307 0 @F1176@ FAM 1 HUSB @I1743@ 1 WIFE @I2491@ 1 DIV Y 1 MARR 2 DATE 1307 0 @F1177@ FAM 1 HUSB @I1743@ 1 WIFE @I2492@ 1 MARR 2 DATE 21 SEP 1322 0 @F1178@ FAM 1 HUSB @I1743@ 1 WIFE @I2493@ 1 MARR 2 DATE JUL 1325 0 @F1179@ FAM 1 HUSB @I2495@ 1 CHIL @I2494@ 1 CHIL @I2520@ 0 @F1180@ FAM 1 HUSB @I2494@ 1 WIFE @I2496@ 1 CHIL @I2498@ 1 MARR 2 DATE JUL 1313 0 @F1181@ FAM 1 HUSB @I2494@ 1 WIFE @I2497@ 1 MARR 2 DATE 1349 0 @F1182@ FAM 1 HUSB @I2499@ 1 WIFE @I2500@ 1 CHIL @I2075@ 1 CHIL @I2501@ 1 CHIL @I2502@ 1 CHIL @I2503@ 1 MARR 2 DATE 8 APR 1350 0 @F1183@ FAM 1 HUSB @I2504@ 1 CHIL @I1423@ 0 @F1184@ FAM 1 HUSB @I740@ 1 WIFE @I2505@ 1 MARR 2 DATE 18 AUG 1572 0 @F1185@ FAM 1 HUSB @I894@ 1 WIFE @I587@ 1 CHIL @I1424@ 1 CHIL @I898@ 1 CHIL @I897@ 1 CHIL @I2506@ 0 @F1186@ FAM 1 HUSB @I897@ 1 WIFE @I2508@ 1 CHIL @I2509@ 1 CHIL @I2510@ 0 @F1187@ FAM 1 HUSB @I2511@ 1 WIFE @I1705@ 1 CHIL @I245@ 0 @F1188@ FAM 1 HUSB @I2513@ 1 WIFE @I2514@ 1 CHIL @I2511@ 0 @F1189@ FAM 1 HUSB @I2515@ 1 CHIL @I2513@ 0 @F1190@ FAM 1 HUSB @I2516@ 1 CHIL @I2515@ 0 @F1191@ FAM 1 HUSB @I2517@ 1 WIFE @I2919@ 1 CHIL @I2516@ 1 CHIL @I2921@ 0 @F1192@ FAM 1 HUSB @I2498@ 1 WIFE @I2519@ 1 CHIL @I2499@ 1 CHIL @I2518@ 1 MARR 2 DATE 28 JUL 1332 0 @F1193@ FAM 1 HUSB @I2521@ 1 WIFE @I2520@ 0 @F1194@ FAM 1 HUSB @I2525@ 1 CHIL @I2524@ 0 @F1195@ FAM 1 HUSB @I2530@ 1 WIFE @I2531@ 1 CHIL @I2532@ 1 CHIL @I440@ 0 @F1196@ FAM 1 HUSB @I2457@ 1 WIFE @I2536@ 1 CHIL @I2534@ 0 @F1197@ FAM 1 HUSB @I2537@ 1 WIFE @I2538@ 1 CHIL @I2540@ 1 MARR 2 DATE 18 DEC 1422 0 @F1198@ FAM 1 WIFE @I2539@ 1 CHIL @I2538@ 0 @F1199@ FAM 1 HUSB @I2540@ 1 WIFE @I2541@ 1 MARR 2 DATE 24 JUN 1436 0 @F1200@ FAM 1 HUSB @I2540@ 1 WIFE @I2542@ 1 CHIL @I2544@ 1 CHIL @I2543@ 1 MARR 2 DATE 14 FEB 1457 0 @F1201@ FAM 1 HUSB @I838@ 1 WIFE @I2548@ 1 CHIL @I2440@ 1 MARR 2 DATE 8 JAN 1499 0 @F1202@ FAM 1 HUSB @I417@ 1 WIFE @I2550@ 1 CHIL @I2551@ 1 CHIL @I2552@ 1 CHIL @I2553@ 1 CHIL @I2554@ 1 MARR 2 DATE 771 0 @F1203@ FAM 1 HUSB @I417@ 1 WIFE @I2555@ 1 MARR 2 DATE 784 0 @F1204@ FAM 1 HUSB @I417@ 1 WIFE @I2556@ 1 MARR 2 DATE 794 0 @F1205@ FAM 1 HUSB @I2552@ 1 WIFE @I2557@ 1 CHIL @I2565@ 0 @F1206@ FAM 1 HUSB @I2553@ 1 WIFE @I2558@ 1 CHIL @I2560@ 1 CHIL @I2561@ 1 CHIL @I2562@ 1 CHIL @I2563@ 1 MARR 2 DATE 798 0 @F1207@ FAM 1 HUSB @I2553@ 1 WIFE @I2559@ 1 CHIL @I2564@ 0 @F1208@ FAM 1 HUSB @I2560@ 1 WIFE @I2566@ 1 CHIL @I2567@ 1 CHIL @I2568@ 1 CHIL @I2569@ 0 @F1209@ FAM 1 HUSB @I2561@ 1 CHIL @I2570@ 0 @F1210@ FAM 1 HUSB @I2563@ 1 WIFE @I2571@ 1 CHIL @I2572@ 1 CHIL @I2573@ 1 CHIL @I2574@ 0 @F1211@ FAM 1 HUSB @I2564@ 1 WIFE @I2575@ 1 CHIL @I2576@ 1 CHIL @I2577@ 1 CHIL @I2578@ 1 CHIL @I2579@ 1 MARR 2 DATE 842 0 @F1212@ FAM 1 HUSB @I2576@ 1 WIFE @I2580@ 1 CHIL @I2581@ 1 CHIL @I2582@ 1 MARR 2 DATE 862 0 @F1213@ FAM 1 HUSB @I2576@ 1 WIFE @I2583@ 1 CHIL @I2584@ 0 @F1214@ FAM 1 HUSB @I2584@ 1 WIFE @I2585@ 1 CHIL @I2604@ 1 MARR 2 DATE 917 0 @F1215@ FAM 1 HUSB @I2567@ 1 WIFE @I2586@ 1 CHIL @I2587@ 0 @F1216@ FAM 1 HUSB @I2588@ 1 WIFE @I2587@ 1 CHIL @I2589@ 0 @F1217@ FAM 1 HUSB @I2568@ 1 WIFE @I2590@ 0 @F1218@ FAM 1 HUSB @I2568@ 1 WIFE @I2591@ 0 @F1219@ FAM 1 HUSB @I2572@ 1 WIFE @I2592@ 1 CHIL @I2593@ 0 @F1220@ FAM 1 HUSB @I2593@ 1 WIFE @I2594@ 1 CHIL @I2595@ 1 CHIL @I2596@ 1 CHIL @I2597@ 0 @F1221@ FAM 1 HUSB @I2598@ 1 WIFE @I2597@ 1 CHIL @I2599@ 0 @F1222@ FAM 1 HUSB @I2599@ 1 WIFE @I2600@ 1 CHIL @I2601@ 1 CHIL @I2602@ 1 CHIL @I2603@ 0 @F1223@ FAM 1 HUSB @I2604@ 1 WIFE @I2603@ 1 CHIL @I2605@ 1 CHIL @I2606@ 0 @F1224@ FAM 1 HUSB @I2605@ 1 CHIL @I2607@ 1 CHIL @I2608@ 0 @F1225@ FAM 1 HUSB @I2609@ 1 WIFE @I2610@ 1 CHIL @I417@ 1 CHIL @I2611@ 0 @F1226@ FAM 1 HUSB @I2611@ 1 WIFE @I2612@ 0 @F1227@ FAM 1 HUSB @I2613@ 1 CHIL @I2609@ 0 @F1228@ FAM 1 HUSB @I2895@ 1 WIFE @I2896@ 1 CHIL @I2614@ 1 MARR 2 DATE 1754 0 @F1229@ FAM 1 HUSB @I2522@ 1 WIFE @I2615@ 1 CHIL @I2616@ 1 MARR 2 DATE 26 NOV 1570 0 @F1230@ FAM 1 HUSB @I2523@ 1 WIFE @I2617@ 1 MARR 2 DATE 15 FEB 1575 0 @F1231@ FAM 1 HUSB @I1739@ 1 WIFE @I2618@ 1 MARR 2 DATE 1262 0 @F1232@ FAM 1 HUSB @I2464@ 1 WIFE @I2619@ 1 MARR 2 DATE 1305 0 @F1233@ FAM 1 HUSB @I2498@ 1 WIFE @I2620@ 1 MARR 2 DATE 19 FEB 1350 0 @F1234@ FAM 1 HUSB @I493@ 1 WIFE @I2621@ 1 MARR 2 DATE 1868 0 @F1235@ FAM 1 HUSB @I2622@ 1 CHIL @I358@ 0 @F1236@ FAM 1 HUSB @I2623@ 1 CHIL @I489@ 0 @F1237@ FAM 1 HUSB @I2624@ 1 WIFE @I499@ 1 MARR 2 DATE 1864 0 @F1238@ FAM 1 HUSB @I498@ 1 WIFE @I2625@ 1 MARR 2 DATE 1884 0 @F1239@ FAM 1 HUSB @I2626@ 1 CHIL @I2625@ 0 @F1240@ FAM 1 HUSB @I497@ 1 WIFE @I2627@ 1 MARR 2 DATE 1878 0 @F1241@ FAM 1 HUSB @I497@ 1 WIFE @I2628@ 1 MARR 2 DATE 1892 0 @F1242@ FAM 1 HUSB @I2632@ 1 CHIL @I464@ 0 @F1243@ FAM 1 HUSB @I683@ 1 WIFE @I2633@ 1 MARR 2 DATE 1878 0 @F1244@ FAM 1 HUSB @I2636@ 1 WIFE @I2634@ 1 MARR 2 DATE 1901 0 @F1245@ FAM 1 HUSB @I2636@ 1 WIFE @I2637@ 1 CHIL @I434@ 1 MARR 2 DATE 1907 0 @F1246@ FAM 1 HUSB @I2638@ 1 WIFE @I592@ 1 MARR 2 DATE 1967 0 @F1247@ FAM 1 HUSB @I2639@ 1 WIFE @I593@ 1 MARR 2 DATE 1972 0 @F1248@ FAM 1 HUSB @I430@ 1 WIFE @I2640@ 1 DIV Y 1 MARR 2 DATE 1933 0 @F1249@ FAM 1 HUSB @I430@ 1 WIFE @I2641@ 1 DIV Y 1 MARR 2 DATE 1937 0 @F1250@ FAM 1 HUSB @I2644@ 1 WIFE @I2642@ 1 MARR 2 DATE 1940 0 @F1251@ FAM 1 HUSB @I2645@ 1 WIFE @I433@ 1 MARR 2 DATE 1935 0 @F1252@ FAM 1 HUSB @I591@ 1 WIFE @I2646@ 1 DIV Y 1 MARR 2 DATE 1935 0 @F1253@ FAM 1 HUSB @I591@ 1 WIFE @I2647@ 1 MARR 2 DATE 1949 0 @F1254@ FAM 1 HUSB @I2648@ 1 WIFE @I2635@ 1 MARR 2 DATE 1906 0 @F1255@ FAM 1 HUSB @I2649@ 1 WIFE @I2650@ 1 CHIL @I2648@ 0 @F1256@ FAM 1 HUSB @I2651@ 1 WIFE @I2652@ 1 CHIL @I1214@ 0 @F1257@ FAM 1 HUSB @I415@ 1 WIFE @I2653@ 1 MARR 2 DATE 1790 0 @F1258@ FAM 1 HUSB @I1690@ 1 WIFE @I2656@ 1 MARR 2 DATE 1853 0 @F1259@ FAM 1 HUSB @I1690@ 1 WIFE @I2657@ 1 MARR 2 DATE 1878 0 @F1260@ FAM 1 HUSB @I2658@ 1 WIFE @I2659@ 1 CHIL @I1313@ 0 @F1261@ FAM 1 HUSB @I2660@ 1 WIFE @I2661@ 1 CHIL @I1312@ 0 @F1262@ FAM 1 HUSB @I2663@ 1 WIFE @I2664@ 1 CHIL @I2662@ 0 @F1263@ FAM 1 HUSB @I2665@ 1 WIFE @I2667@ 1 MARR 2 DATE 1856 0 @F1264@ FAM 1 HUSB @I2666@ 1 WIFE @I2668@ 1 CHIL @I2669@ 1 CHIL @I2670@ 1 CHIL @I2674@ 1 CHIL @I2675@ 1 CHIL @I2672@ 1 MARR 2 DATE 1857 0 @F1265@ FAM 1 HUSB @I2674@ 1 WIFE @I2673@ 1 MARR 2 DATE 1900 0 @F1266@ FAM 1 HUSB @I2670@ 1 WIFE @I2676@ 1 MARR 2 DATE 1891 0 @F1267@ FAM 1 HUSB @I165@ 1 WIFE @I2678@ 1 CHIL @I2681@ 1 MARR 2 DATE 1882 0 @F1268@ FAM 1 HUSB @I2671@ 1 WIFE @I2679@ 1 CHIL @I2684@ 1 CHIL @I2685@ 1 CHIL @I2686@ 1 MARR 2 DATE 1884 0 @F1269@ FAM 1 HUSB @I2680@ 1 CHIL @I2679@ 0 @F1270@ FAM 1 HUSB @I2682@ 1 CHIL @I157@ 0 @F1271@ FAM 1 HUSB @I2683@ 1 CHIL @I589@ 0 @F1272@ FAM 1 HUSB @I2684@ 1 WIFE @I2687@ 1 MARR 2 DATE 1911 0 @F1273@ FAM 1 HUSB @I2688@ 1 CHIL @I2687@ 0 @F1274@ FAM 1 HUSB @I2689@ 1 WIFE @I2690@ 1 CHIL @I1295@ 1 MARR 2 DATE 1753 0 @F1275@ FAM 1 HUSB @I2691@ 1 WIFE @I2692@ 1 CHIL @I1299@ 0 @F1276@ FAM 1 HUSB @I466@ 1 WIFE @I2839@ 1 CHIL @I2693@ 1 CHIL @I2842@ 1 MARR 2 DATE 1907 0 @F1277@ FAM 1 HUSB @I2694@ 1 CHIL @I1828@ 0 @F1278@ FAM 1 HUSB @I2695@ 1 WIFE @I2696@ 1 CHIL @I607@ 1 MARR 2 DATE 1879 0 @F1279@ FAM 1 HUSB @I2698@ 1 WIFE @I2697@ 1 MARR 2 DATE 1896 0 @F1280@ FAM 1 HUSB @I2702@ 1 WIFE @I2703@ 1 MARR 2 DATE 1948 0 @F1281@ FAM 1 HUSB @I1675@ 1 WIFE @I2704@ 1 MARR 2 DATE 1968 0 @F1282@ FAM 1 HUSB @I2705@ 1 CHIL @I453@ 0 @F1283@ FAM 1 HUSB @I2706@ 1 WIFE @I2709@ 1 MARR 2 DATE 1969 0 @F1284@ FAM 1 HUSB @I2707@ 1 WIFE @I2710@ 1 MARR 2 DATE 1973 0 @F1285@ FAM 1 HUSB @I2713@ 1 WIFE @I2526@ 1 CHIL @I2714@ 1 CHIL @I2715@ 1 CHIL @I2716@ 1 MARR 2 DATE 30 JUN 1964 0 @F1286@ FAM 1 HUSB @I2717@ 1 WIFE @I2527@ 1 CHIL @I2718@ 1 CHIL @I2719@ 1 CHIL @I2720@ 1 MARR 2 DATE 25 MAY 1961 0 @F1287@ FAM 1 HUSB @I2721@ 1 WIFE @I2528@ 1 CHIL @I2722@ 1 CHIL @I2723@ 1 CHIL @I2724@ 1 MARR 2 DATE 5 JUN 1964 0 @F1288@ FAM 1 HUSB @I2725@ 1 WIFE @I2529@ 1 CHIL @I2726@ 1 CHIL @I2727@ 1 CHIL @I2728@ 1 MARR 2 DATE 15 JUN 1974 0 @F1289@ FAM 1 HUSB @I447@ 1 WIFE @I2730@ 1 MARR 2 DATE 30 JUL 1961 0 @F1290@ FAM 1 HUSB @I448@ 1 WIFE @I2731@ 1 MARR 2 DATE 7 DEC 1976 0 @F1291@ FAM 1 HUSB @I447@ 1 WIFE @I2732@ 1 DIV Y 1 MARR 2 DATE 1934 0 @F1292@ FAM 1 HUSB @I447@ 1 WIFE @I2733@ 1 CHIL @I2740@ 1 DIV Y 1 MARR 2 DATE 1943 0 @F1293@ FAM 1 HUSB @I449@ 1 WIFE @I2734@ 1 CHIL @I2742@ 1 CHIL @I2743@ 1 MARR 2 DATE 19 FEB 1946 0 @F1294@ FAM 1 HUSB @I449@ 1 WIFE @I2735@ 1 MARR 2 DATE 29 SEP 1988 0 @F1295@ FAM 1 HUSB @I1409@ 1 WIFE @I2736@ 1 CHIL @I2745@ 1 CHIL @I2746@ 1 CHIL @I2747@ 1 CHIL @I2748@ 1 DIV Y 1 MARR 2 DATE 11 MAR 1932 2 PLAC London,England 0 @F1296@ FAM 1 HUSB @I1409@ 1 WIFE @I2737@ 1 CHIL @I2767@ 1 CHIL @I2768@ 1 CHIL @I2769@ 1 MARR 2 DATE 29 APR 1972 0 @F1297@ FAM 1 HUSB @I2738@ 1 WIFE @I2739@ 1 MARR 2 DATE 8 JUN 1978 0 @F1298@ FAM 1 HUSB @I2740@ 1 WIFE @I2741@ 1 MARR 2 DATE 1976 0 @F1299@ FAM 1 HUSB @I2744@ 1 WIFE @I2742@ 1 MARR 2 DATE 1975 0 @F1300@ FAM 1 HUSB @I2749@ 1 WIFE @I2745@ 1 CHIL @I2750@ 1 CHIL @I2751@ 1 CHIL @I2752@ 1 CHIL @I2753@ 1 CHIL @I2754@ 1 MARR 2 DATE 1955 0 @F1301@ FAM 1 HUSB @I2755@ 1 WIFE @I2746@ 1 CHIL @I2756@ 1 CHIL @I2757@ 1 CHIL @I2758@ 1 MARR 2 DATE 1956 0 @F1302@ FAM 1 HUSB @I2747@ 1 WIFE @I2759@ 1 MARR 2 DATE 1965 0 @F1303@ FAM 1 HUSB @I2747@ 1 WIFE @I2760@ 1 CHIL @I2761@ 1 MARR 2 DATE 1967 0 @F1304@ FAM 1 HUSB @I2747@ 1 WIFE @I2762@ 1 CHIL @I2763@ 1 MARR 2 DATE 1972 0 @F1305@ FAM 1 HUSB @I2747@ 1 WIFE @I2764@ 1 CHIL @I2765@ 1 MARR 2 DATE 1975 0 @F1306@ FAM 1 HUSB @I2766@ 1 WIFE @I2748@ 1 MARR 2 DATE 1967 0 @F1307@ FAM 1 HUSB @I2770@ 1 WIFE @I2772@ 1 CHIL @I2773@ 1 CHIL @I2774@ 1 CHIL @I2775@ 1 CHIL @I2776@ 1 CHIL @I2777@ 1 MARR 2 DATE 1888 0 @F1308@ FAM 1 HUSB @I2778@ 1 CHIL @I2772@ 0 @F1309@ FAM 1 HUSB @I2774@ 1 WIFE @I2779@ 1 CHIL @I2780@ 1 CHIL @I2781@ 1 CHIL @I2782@ 1 MARR 2 DATE 1915 0 @F1310@ FAM 1 HUSB @I2783@ 1 WIFE @I2780@ 1 CHIL @I2784@ 1 CHIL @I2785@ 1 CHIL @I2786@ 1 CHIL @I2787@ 1 CHIL @I2788@ 1 MARR 2 DATE 1936 0 @F1311@ FAM 1 HUSB @I2789@ 1 WIFE @I2784@ 1 CHIL @I2790@ 1 MARR 2 DATE 1958 0 @F1312@ FAM 1 HUSB @I2791@ 1 WIFE @I2785@ 1 CHIL @I2792@ 1 CHIL @I2793@ 1 MARR 2 DATE 1961 0 @F1313@ FAM 1 HUSB @I2794@ 1 WIFE @I2786@ 1 CHIL @I2795@ 1 CHIL @I2796@ 1 MARR 2 DATE 1970 0 @F1314@ FAM 1 HUSB @I2797@ 1 WIFE @I2787@ 1 MARR 2 DATE 1976 0 @F1315@ FAM 1 HUSB @I2781@ 1 WIFE @I2798@ 1 CHIL @I2799@ 1 MARR 2 DATE 1944 0 @F1316@ FAM 1 HUSB @I2800@ 1 WIFE @I2799@ 1 CHIL @I2801@ 1 CHIL @I2802@ 1 MARR 2 DATE 1970 0 @F1317@ FAM 1 HUSB @I2781@ 1 WIFE @I2803@ 1 CHIL @I2804@ 1 CHIL @I2806@ 1 CHIL @I2807@ 1 MARR 2 DATE 1950 0 @F1318@ FAM 1 HUSB @I2805@ 1 WIFE @I2804@ 1 MARR 2 DATE 1977 0 @F1319@ FAM 1 HUSB @I2808@ 1 WIFE @I2782@ 1 CHIL @I2809@ 1 CHIL @I2810@ 1 CHIL @I2811@ 1 MARR 2 DATE 1948 0 @F1320@ FAM 1 HUSB @I2774@ 1 WIFE @I2812@ 1 CHIL @I2813@ 1 MARR 2 DATE 1937 0 @F1321@ FAM 1 HUSB @I2813@ 1 WIFE @I2814@ 1 CHIL @I2815@ 1 CHIL @I2816@ 1 MARR 2 DATE 1969 0 @F1322@ FAM 1 HUSB @I2817@ 1 WIFE @I2775@ 1 MARR 2 DATE 1918 0 @F1323@ FAM 1 HUSB @I2818@ 1 WIFE @I2776@ 1 MARR 2 DATE 1929 0 @F1324@ FAM 1 HUSB @I2777@ 1 WIFE @I2819@ 1 CHIL @I2820@ 1 CHIL @I2821@ 1 CHIL @I2822@ 1 CHIL @I2823@ 1 MARR 2 DATE 1928 0 @F1325@ FAM 1 HUSB @I2821@ 1 WIFE @I2824@ 1 CHIL @I2825@ 1 CHIL @I2826@ 1 CHIL @I2827@ 1 CHIL @I2828@ 1 MARR 2 DATE 1955 0 @F1326@ FAM 1 HUSB @I2830@ 1 WIFE @I2829@ 1 MARR 2 DATE 1919 0 @F1327@ FAM 1 HUSB @I2738@ 1 WIFE @I2831@ 1 CHIL @I2832@ 1 MARR 2 DATE 1937 0 @F1328@ FAM 1 HUSB @I2833@ 1 WIFE @I2832@ 1 CHIL @I2834@ 1 CHIL @I2835@ 1 CHIL @I2836@ 1 CHIL @I2837@ 1 MARR 2 DATE 1962 0 @F1329@ FAM 1 HUSB @I2738@ 1 WIFE @I2838@ 1 MARR 2 DATE 1954 0 @F1330@ FAM 1 HUSB @I2840@ 1 CHIL @I2839@ 0 @F1331@ FAM 1 HUSB @I2693@ 1 WIFE @I2841@ 1 MARR 2 DATE 1939 0 @F1332@ FAM 1 HUSB @I2843@ 1 WIFE @I2842@ 1 DIV Y 1 MARR 2 DATE 1938 0 @F1333@ FAM 1 HUSB @I2844@ 1 WIFE @I2842@ 1 DIV Y 1 MARR 2 DATE 1949 0 @F1334@ FAM 1 HUSB @I465@ 1 WIFE @I2845@ 1 CHIL @I2848@ 1 MARR 2 DATE 1920 0 @F1335@ FAM 1 HUSB @I465@ 1 WIFE @I2846@ 1 MARR 2 DATE 1929 0 @F1336@ FAM 1 HUSB @I2847@ 1 WIFE @I2673@ 1 MARR 2 DATE 1922 0 @F1337@ FAM 1 HUSB @I2848@ 1 WIFE @I2849@ 1 MARR 2 DATE 1965 0 @F1338@ FAM 1 HUSB @I2851@ 1 WIFE @I2850@ 1 MARR 2 DATE 1749 0 @F1339@ FAM 1 HUSB @I2852@ 1 WIFE @I1638@ 1 MARR 2 DATE 1766 0 @F1340@ FAM 1 HUSB @I2853@ 1 WIFE @I1639@ 1 MARR 2 DATE 1763 0 @F1341@ FAM 1 HUSB @I2859@ 1 WIFE @I2858@ 1 MARR 2 DATE 1680 0 @F1342@ FAM 1 HUSB @I2863@ 1 WIFE @I1828@ 1 MARR 2 DATE 1445 0 @F1343@ FAM 1 HUSB @I1468@ 1 WIFE @I2864@ 1 MARR 2 DATE 1478 0 @F1344@ FAM 1 HUSB @I1470@ 1 WIFE @I2865@ 1 CHIL @I1484@ 1 MARR 2 DATE 1480 0 @F1345@ FAM 1 HUSB @I1246@ 1 WIFE @I2875@ 1 MARR 2 DATE 1802 0 @F1346@ FAM 1 HUSB @I1246@ 1 WIFE @I2876@ 1 MARR 2 DATE 1816 0 @F1347@ FAM 1 HUSB @I1246@ 1 WIFE @I2877@ 1 MARR 2 DATE 1819 0 @F1348@ FAM 1 HUSB @I2878@ 1 WIFE @I2879@ 1 CHIL @I1246@ 1 MARR 2 DATE 1765 0 @F1349@ FAM 1 HUSB @I2880@ 1 WIFE @I2881@ 1 CHIL @I2878@ 1 MARR 2 DATE 1738 0 @F1350@ FAM 1 HUSB @I2424@ 1 WIFE @I2883@ 1 MARR 2 DATE 1701 0 @F1351@ FAM 1 HUSB @I2884@ 1 CHIL @I1017@ 0 @F1352@ FAM 1 HUSB @I2885@ 1 WIFE @I2100@ 1 CHIL @I2894@ 1 CHIL @I871@ 1 MARR 2 DATE 1496 0 @F1353@ FAM 1 HUSB @I840@ 1 WIFE @I2886@ 1 MARR 2 DATE 1506 0 @F1354@ FAM 1 HUSB @I2890@ 1 WIFE @I2887@ 1 MARR 2 DATE 1490 0 @F1355@ FAM 1 WIFE @I2887@ 1 MARR 2 DATE 1497 0 @F1356@ FAM 1 HUSB @I2889@ 1 WIFE @I2892@ 1 MARR 2 DATE 1497 0 @F1357@ FAM 1 HUSB @I2893@ 1 WIFE @I2892@ 1 MARR 2 DATE 1501 0 @F1358@ FAM 1 HUSB @I2891@ 1 WIFE @I2894@ 1 MARR 2 DATE 1519 0 @F1359@ FAM 1 HUSB @I1816@ 1 WIFE @I2894@ 1 MARR 2 DATE 8 JUL 1530 0 @F1360@ FAM 1 HUSB @I2897@ 1 WIFE @I2898@ 1 CHIL @I2448@ 1 MARR 2 DATE 1749 0 @F1361@ FAM 1 HUSB @I2899@ 1 CHIL @I1202@ 0 @F1362@ FAM 1 HUSB @I2900@ 1 WIFE @I1116@ 1 MARR 2 DATE 1896 0 @F1363@ FAM 1 HUSB @I2904@ 1 WIFE @I2903@ 1 MARR 2 DATE 1910 0 @F1364@ FAM 1 HUSB @I2905@ 1 WIFE @I2902@ 1 MARR 2 DATE 1881 0 @F1365@ FAM 1 HUSB @I2906@ 1 WIFE @I2902@ 1 MARR 2 DATE 1900 0 @F1366@ FAM 1 HUSB @I2907@ 1 WIFE @I2901@ 1 DIV Y 1 MARR 2 DATE 1875 0 @F1367@ FAM 1 HUSB @I2448@ 1 WIFE @I2908@ 1 MARR 2 DATE 1776 0 @F1368@ FAM 1 HUSB @I139@ 1 WIFE @I206@ 1 MARR 2 DATE 1832 0 @F1369@ FAM 1 HUSB @I1737@ 1 WIFE @I2909@ 1 MARR 2 DATE 1842 0 @F1370@ FAM 1 HUSB @I205@ 1 WIFE @I2910@ 1 MARR 2 DATE 1816 0 @F1371@ FAM 1 HUSB @I2911@ 1 WIFE @I2912@ 1 CHIL @I349@ 1 MARR 2 DATE 1777 0 @F1372@ FAM 1 HUSB @I590@ 1 WIFE @I2914@ 1 CHIL @I2915@ 0 @F1373@ FAM 1 HUSB @I751@ 1 WIFE @I2916@ 1 CHIL @I2517@ 1 CHIL @I2917@ 0 @F1374@ FAM 1 HUSB @I2918@ 1 WIFE @I2917@ 0 @F1375@ FAM 1 HUSB @I2507@ 1 WIFE @I2921@ 0 @F1376@ FAM 1 HUSB @I2922@ 1 CHIL @I2661@ 0 @F1377@ FAM 1 HUSB @I2923@ 1 CHIL @I2664@ 0 @F1378@ FAM 1 HUSB @I2924@ 1 CHIL @I2659@ 0 @F1379@ FAM 1 HUSB @I159@ 1 WIFE @I2925@ 1 MARR 2 DATE 1919 0 @F1380@ FAM 1 HUSB @I2926@ 1 CHIL @I161@ 0 @F1381@ FAM 1 HUSB @I588@ 1 WIFE @I235@ 1 MARR 2 DATE 1934 0 @F1382@ FAM 1 HUSB @I2927@ 1 CHIL @I1356@ 0 @F1383@ FAM 1 HUSB @I2928@ 1 CHIL @I1406@ 0 @F1384@ FAM 1 HUSB @I169@ 1 WIFE @I2929@ 1 CHIL @I2930@ 1 CHIL @I2931@ 1 CHIL @I2932@ 0 @F1385@ FAM 1 HUSB @I2933@ 1 CHIL @I821@ 0 @F1386@ FAM 1 HUSB @I2934@ 1 WIFE @I2935@ 1 CHIL @I2933@ 0 @F1387@ FAM 1 HUSB @I2936@ 1 WIFE @I2937@ 1 CHIL @I820@ 0 @F1388@ FAM 1 HUSB @I2938@ 1 WIFE @I2939@ 1 CHIL @I2937@ 0 @F1389@ FAM 1 HUSB @I2940@ 1 WIFE @I2941@ 1 CHIL @I2939@ 0 @F1390@ FAM 1 HUSB @I2942@ 1 CHIL @I2943@ 1 CHIL @I2941@ 0 @F1391@ FAM 1 HUSB @I2943@ 1 CHIL @I2944@ 0 @F1392@ FAM 1 HUSB @I2944@ 1 WIFE @I2945@ 1 CHIL @I2946@ 0 @F1393@ FAM 1 HUSB @I2946@ 1 CHIL @I812@ 0 @F1394@ FAM 1 HUSB @I2948@ 1 CHIL @I2947@ 0 @F1395@ FAM 1 HUSB @I2949@ 1 CHIL @I2948@ 0 @F1396@ FAM 1 HUSB @I2950@ 1 CHIL @I2942@ 0 @F1397@ FAM 1 HUSB @I2951@ 1 CHIL @I2950@ 0 @F1398@ FAM 1 HUSB @I2952@ 1 CHIL @I2951@ 0 @F1399@ FAM 1 HUSB @I2953@ 1 CHIL @I2935@ 0 @F1400@ FAM 1 HUSB @I2954@ 1 WIFE @I2955@ 1 CHIL @I2953@ 0 @F1401@ FAM 1 HUSB @I2956@ 1 CHIL @I2955@ 0 @F1402@ FAM 1 HUSB @I2960@ 1 WIFE @I110@ 1 CHIL @I2961@ 1 MARR 2 DATE FEB 1990 0 @F1403@ FAM 1 HUSB @I242@ 1 WIFE @I2962@ 1 CHIL @I2963@ 1 MARR 2 DATE ABT 1990 0 @F1404@ FAM 1 HUSB @I2965@ 1 WIFE @I2964@ 1 CHIL @I2966@ 0 @F1405@ FAM 1 HUSB @I2968@ 1 CHIL @I62@ 0 @F1406@ FAM 1 HUSB @I112@ 1 WIFE @I2969@ 1 MARR 2 DATE JAN 1988 0 @F1407@ FAM 1 HUSB @I2970@ 1 WIFE @I2969@ 1 DIV Y 0 @F1408@ FAM 1 HUSB @I2971@ 1 WIFE @I2972@ 1 CHIL @I2969@ 1 DIV Y 0 @F1409@ FAM 1 HUSB @I2976@ 1 WIFE @I138@ 1 MARR 2 DATE ABT 1802 0 @F1410@ FAM 1 HUSB @I54@ 1 WIFE @I2977@ 1 CHIL @I2978@ 1 MARR 2 DATE 17 DEC 1978 0 @F1411@ FAM 1 HUSB @I109@ 1 WIFE @I2979@ 1 MARR 2 DATE AFT 1989 0 @F1412@ FAM 1 HUSB @I2980@ 1 WIFE @I314@ 1 CHIL @I2981@ 0 @F1413@ FAM 1 HUSB @I2982@ 1 WIFE @I2983@ 1 CHIL @I292@ 0 @F1414@ FAM 1 HUSB @I2985@ 1 WIFE @I243@ 1 CHIL @I2990@ 1 CHIL @I2991@ 1 CHIL @I2992@ 1 CHIL @I2993@ 1 DIV Y 1 MARR 2 DATE ABT 1947 0 @F1415@ FAM 1 HUSB @I2986@ 1 WIFE @I806@ 1 CHIL @I2989@ 1 CHIL @I3010@ 1 MARR 2 DATE 28 DEC 1936 2 PLAC Guildhall,London,England 0 @F1416@ FAM 1 HUSB @I2987@ 1 WIFE @I2988@ 1 CHIL @I2986@ 0 @F1417@ FAM 1 HUSB @I2994@ 1 CHIL @I2985@ 0 @F1418@ FAM 1 HUSB @I2995@ 1 WIFE @I2996@ 1 CHIL @I806@ 1 CHIL @I2997@ 1 CHIL @I3009@ 1 CHIL @I2998@ 1 MARR 2 DATE JUL 1900 0 @F1419@ FAM 1 HUSB @I3002@ 1 WIFE @I2999@ 1 CHIL @I3003@ 1 CHIL @I3004@ 1 CHIL @I3005@ 1 CHIL @I2996@ 1 CHIL @I3006@ 0 @F1420@ FAM 1 WIFE @I3000@ 1 CHIL @I2999@ 0 @F1421@ FAM 1 HUSB @I3001@ 1 CHIL @I3000@ 0 @F1422@ FAM 1 HUSB @I3007@ 1 WIFE @I3008@ 1 CHIL @I2995@ 0 TRLR ================================================ FILE: samples/GLSL/SimpleLighting.gl2.frag ================================================ static const char* SimpleFragmentShader = STRINGIFY( varying vec4 FrontColor; void main(void) { gl_FragColor = FrontColor; } ); ================================================ FILE: samples/GLSL/SyLens.glsl ================================================ #version 120 /* Original Lens Distortion Algorithm from SSontech (Syntheyes) http://www.ssontech.com/content/lensalg.htm r2 is radius squared. r2 = image_aspect*image_aspect*u*u + v*v f = 1 + r2*(k + kcube*sqrt(r2)) u' = f*u v' = f*v */ // Controls uniform float kCoeff, kCube, uShift, vShift; uniform float chroma_red, chroma_green, chroma_blue; uniform bool apply_disto; // Uniform inputs uniform sampler2D input1; uniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio; uniform float adsk_result_w, adsk_result_h; float distortion_f(float r) { float f = 1 + (r*r)*(kCoeff + kCube * r); return f; } float inverse_f(float r) { // Build a lookup table on the radius, as a fixed-size table. // We will use a vec3 since we will store the multipled number in the Z coordinate. // So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y; vec3[48] lut; // Since out LUT is shader-global check if it's been computed alrite // Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1; float incr = max_r / 48; float lut_r = 0; float f; for(int i=0; i < 48; i++) { f = distortion_f(lut_r); lut[i] = vec3(lut_r, f, lut_r * f); lut_r += incr; } float t; // Now find the nehgbouring elements // only iterate to 46 since we will need // 47 as i+1 for(int i=0; i < 47; i++) { if(lut[i].z < r && lut[i+1].z > r) { // BAM! our value is between these two segments // get the T interpolant and mix t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z; return mix(lut[i].y, lut[i+1].y, t ); } } } float aberrate(float f, float chroma) { return f + (f * chroma); } vec3 chromaticize_and_invert(float f) { vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue)); // We need to DIVIDE by F when we redistort, and x / y == x * (1 / y) if(apply_disto) { rgb_f = 1 / rgb_f; } return rgb_f; } void main(void) { vec2 px, uv; float f = 1; float r = 1; px = gl_FragCoord.xy; // Make sure we are still centered px.x -= (adsk_result_w - adsk_input1_w) / 2; px.y -= (adsk_result_h - adsk_input1_h) / 2; // Push the destination coordinates into the [0..1] range uv.x = px.x / adsk_input1_w; uv.y = px.y / adsk_input1_h; // And to Syntheyes UV which are [1..-1] on both X and Y uv.x = (uv.x *2 ) - 1; uv.y = (uv.y *2 ) - 1; // Add UV shifts uv.x += uShift; uv.y += vShift; // Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect] uv.x = uv.x * adsk_input1_frameratio; // Compute the radius r = sqrt(uv.x*uv.x + uv.y*uv.y); // If we are redistorting, account for the oversize plate in the input, assume that // the input aspect is the same if(apply_disto) { r = r / (float(adsk_input1_w) / float(adsk_result_w)); } // Apply or remove disto, per channel honoring chromatic aberration if(apply_disto) { f = inverse_f(r); } else { f = distortion_f(r); } vec2[3] rgb_uvs = vec2[](uv, uv, uv); // Compute distortions per component vec3 rgb_f = chromaticize_and_invert(f); // Apply the disto coefficients, per component rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr; rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg; rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb; // Convert all the UVs back to the texture space, per color component for(int i=0; i < 3; i++) { uv = rgb_uvs[i]; // Back from [-aspect..aspect] to [-1..1] uv.x = uv.x / adsk_input1_frameratio; // Remove UV shifts uv.x -= uShift; uv.y -= vShift; // Back to OGL UV uv.x = (uv.x + 1) / 2; uv.y = (uv.y + 1) / 2; rgb_uvs[i] = uv; } // Sample the input plate, per component vec4 sampled; sampled.r = texture2D(input1, rgb_uvs[0]).r; sampled.g = texture2D(input1, rgb_uvs[1]).g; sampled.b = texture2D(input1, rgb_uvs[2]).b; // and assign to the output gl_FragColor.rgba = vec4(sampled.rgb, 1.0 ); } ================================================ FILE: samples/GLSL/SyLens.shader ================================================ #version 120 /* Original Lens Distortion Algorithm from SSontech (Syntheyes) http://www.ssontech.com/content/lensalg.htm r2 is radius squared. r2 = image_aspect*image_aspect*u*u + v*v f = 1 + r2*(k + kcube*sqrt(r2)) u' = f*u v' = f*v */ // Controls uniform float kCoeff, kCube, uShift, vShift; uniform float chroma_red, chroma_green, chroma_blue; uniform bool apply_disto; // Uniform inputs uniform sampler2D input1; uniform float adsk_input1_w, adsk_input1_h, adsk_input1_aspect, adsk_input1_frameratio; uniform float adsk_result_w, adsk_result_h; float distortion_f(float r) { float f = 1 + (r*r)*(kCoeff + kCube * r); return f; } float inverse_f(float r) { // Build a lookup table on the radius, as a fixed-size table. // We will use a vec3 since we will store the multipled number in the Z coordinate. // So to recap: x will be the radius, y will be the f(x) distortion, and Z will be x * y; vec3[48] lut; // Since out LUT is shader-global check if it's been computed alrite // Flame has no overflow bbox so we can safely max out at the image edge, plus some cushion float max_r = sqrt((adsk_input1_frameratio * adsk_input1_frameratio) + 1) + 0.1; float incr = max_r / 48; float lut_r = 0; float f; for(int i=0; i < 48; i++) { f = distortion_f(lut_r); lut[i] = vec3(lut_r, f, lut_r * f); lut_r += incr; } float t; // Now find the nehgbouring elements // only iterate to 46 since we will need // 47 as i+1 for(int i=0; i < 47; i++) { if(lut[i].z < r && lut[i+1].z > r) { // BAM! our value is between these two segments // get the T interpolant and mix t = (r - lut[i].z) / (lut[i+1].z - lut[i]).z; return mix(lut[i].y, lut[i+1].y, t ); } } } float aberrate(float f, float chroma) { return f + (f * chroma); } vec3 chromaticize_and_invert(float f) { vec3 rgb_f = vec3(aberrate(f, chroma_red), aberrate(f, chroma_green), aberrate(f, chroma_blue)); // We need to DIVIDE by F when we redistort, and x / y == x * (1 / y) if(apply_disto) { rgb_f = 1 / rgb_f; } return rgb_f; } void main(void) { vec2 px, uv; float f = 1; float r = 1; px = gl_FragCoord.xy; // Make sure we are still centered px.x -= (adsk_result_w - adsk_input1_w) / 2; px.y -= (adsk_result_h - adsk_input1_h) / 2; // Push the destination coordinates into the [0..1] range uv.x = px.x / adsk_input1_w; uv.y = px.y / adsk_input1_h; // And to Syntheyes UV which are [1..-1] on both X and Y uv.x = (uv.x *2 ) - 1; uv.y = (uv.y *2 ) - 1; // Add UV shifts uv.x += uShift; uv.y += vShift; // Make the X value the aspect value, so that the X coordinates go to [-aspect..aspect] uv.x = uv.x * adsk_input1_frameratio; // Compute the radius r = sqrt(uv.x*uv.x + uv.y*uv.y); // If we are redistorting, account for the oversize plate in the input, assume that // the input aspect is the same if(apply_disto) { r = r / (float(adsk_input1_w) / float(adsk_result_w)); } // Apply or remove disto, per channel honoring chromatic aberration if(apply_disto) { f = inverse_f(r); } else { f = distortion_f(r); } vec2[3] rgb_uvs = vec2[](uv, uv, uv); // Compute distortions per component vec3 rgb_f = chromaticize_and_invert(f); // Apply the disto coefficients, per component rgb_uvs[0] = rgb_uvs[0] * rgb_f.rr; rgb_uvs[1] = rgb_uvs[1] * rgb_f.gg; rgb_uvs[2] = rgb_uvs[2] * rgb_f.bb; // Convert all the UVs back to the texture space, per color component for(int i=0; i < 3; i++) { uv = rgb_uvs[i]; // Back from [-aspect..aspect] to [-1..1] uv.x = uv.x / adsk_input1_frameratio; // Remove UV shifts uv.x -= uShift; uv.y -= vShift; // Back to OGL UV uv.x = (uv.x + 1) / 2; uv.y = (uv.y + 1) / 2; rgb_uvs[i] = uv; } // Sample the input plate, per component vec4 sampled; sampled.r = texture2D(input1, rgb_uvs[0]).r; sampled.g = texture2D(input1, rgb_uvs[1]).g; sampled.b = texture2D(input1, rgb_uvs[2]).b; // and assign to the output gl_FragColor.rgba = vec4(sampled.rgb, 1.0 ); } ================================================ FILE: samples/GLSL/blend_120.glslf ================================================ #version 120 #define SCREEN 0 #define DODGE 1 #define BURN 2 #define OVERLAY 3 #define MULTIPLY 4 #define ADD 5 #define DIVIDE 6 #define GRAIN_EXTRACT 7 #define GRAIN_MERGE 8 // grayscale uniform sampler2D t_Lena; // rgba uniform sampler2D t_Tint; uniform int i_Blend; varying vec2 v_Uv; void main() { // we sample from both textures using the same uv coordinates. since our // lena image is grayscale, we only get the first component. vec3 lena = vec3(texture2D(t_Lena, v_Uv).r); vec3 tint = texture2D(t_Tint, v_Uv).rgb; vec3 result = vec3(0.0); // normally you'd have a shader program per technique, but for the sake of // simplicity we'll just branch on it here. if (i_Blend == SCREEN) { result = vec3(1.0) - ((vec3(1.0) - lena) * (vec3(1.0) - tint)); } else if (i_Blend == DODGE) { result = lena / (vec3(1.0) - tint); } else if (i_Blend == BURN) { result = vec3(1.0) - ((vec3(1.0) - lena) / lena); } else if (i_Blend == OVERLAY) { result = lena * (lena + (tint * 2) * (vec3(1.0) - lena)); } else if (i_Blend == MULTIPLY) { result = lena * tint; } else if (i_Blend == ADD) { result = lena + tint; } else if (i_Blend == DIVIDE) { result = lena / tint; } else if (i_Blend == GRAIN_EXTRACT) { result = lena - tint + 0.5; } else if (i_Blend == GRAIN_MERGE) { result = lena + tint - 0.5; } gl_FragColor = vec4(result, 1.0); } ================================================ FILE: samples/GLSL/closesthit.rchit ================================================ #version 460 #extension GL_EXT_ray_tracing : require #extension GL_EXT_nonuniform_qualifier : enable struct RayPayload { vec3 color; float distance; vec3 normal; float reflector; }; layout(location = 0) rayPayloadInEXT RayPayload rayPayload; hitAttributeEXT vec3 attribs; layout(binding = 0, set = 0) uniform accelerationStructureEXT topLevelAS; layout(binding = 2, set = 0) uniform UBO { mat4 viewInverse; mat4 projInverse; vec4 lightPos; int vertexSize; } ubo; layout(binding = 3, set = 0) buffer Vertices { vec4 v[]; } vertices; layout(binding = 4, set = 0) buffer Indices { uint i[]; } indices; struct Vertex { vec3 pos; vec3 normal; vec2 uv; vec4 color; vec4 _pad0; vec4 _pad1; }; Vertex unpack(uint index) { // Unpack the vertices from the SSBO using the glTF vertex structure // The multiplier is the size of the vertex divided by four float components (=16 bytes) const int m = ubo.vertexSize / 16; vec4 d0 = vertices.v[m * index + 0]; vec4 d1 = vertices.v[m * index + 1]; vec4 d2 = vertices.v[m * index + 2]; Vertex v; v.pos = d0.xyz; v.normal = vec3(d0.w, d1.x, d1.y); v.color = vec4(d2.x, d2.y, d2.z, 1.0); return v; } void main() { ivec3 index = ivec3(indices.i[3 * gl_PrimitiveID], indices.i[3 * gl_PrimitiveID + 1], indices.i[3 * gl_PrimitiveID + 2]); Vertex v0 = unpack(index.x); Vertex v1 = unpack(index.y); Vertex v2 = unpack(index.z); // Interpolate normal const vec3 barycentricCoords = vec3(1.0f - attribs.x - attribs.y, attribs.x, attribs.y); vec3 normal = normalize(v0.normal * barycentricCoords.x + v1.normal * barycentricCoords.y + v2.normal * barycentricCoords.z); // Basic lighting vec3 lightVector = normalize(ubo.lightPos.xyz); float dot_product = max(dot(lightVector, normal), 0.6); rayPayload.color = v0.color.rgb * vec3(dot_product); rayPayload.distance = gl_RayTmaxEXT; rayPayload.normal = normal; // Objects with full white vertex color are treated as reflectors rayPayload.reflector = ((v0.color.r == 1.0f) && (v0.color.g == 1.0f) && (v0.color.b == 1.0f)) ? 1.0f : 0.0f; } ================================================ FILE: samples/GLSL/extrude_normals.gs ================================================ #version 330 core layout(triangles) in; layout (line_strip, max_vertices = 6) out; in VS_OUT { vec3 normal; }gs_in[]; const float MAGNITUDE = 0.025f; void GenerateLine(int index) { gl_Position = gl_in[index].gl_Position; EmitVertex(); gl_Position = gl_in[index].gl_Position + vec4(gs_in[index].normal, 0.0f) * MAGNITUDE; EmitVertex(); EndPrimitive(); } void main() { GenerateLine(0); GenerateLine(1); GenerateLine(2); } ================================================ FILE: samples/GLSL/gbuffers_textured_lit.fsh ================================================ #version 120 uniform sampler2D texture; varying vec3 color; varying vec2 texcoord; vec4 GetDiffuse() { vec4 diffuse = vec4(color.rgb, 1.0); diffuse *= texture2D(texture, texcoord); return diffuse; } void main() { vec4 diffuse = GetDiffuse(); gl_FragData[0] = diffuse; } ================================================ FILE: samples/GLSL/gbuffers_textured_lit.vsh ================================================ #version 120 varying vec3 color; varying vec2 texcoord; void main() { color = gl_Color.rgb; texcoord = gl_MultiTexCoord0.st; gl_Position = ftransform(); } ================================================ FILE: samples/GLSL/islandScene.glsl ================================================ //// High quality (Some browsers may freeze or crash) //#define HIGHQUALITY //// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow) //#define MEDIUMQUALITY //// Defaults //#define REFLECTIONS #define SHADOWS //#define GRASS //#define SMALL_WAVES #define RAGGED_LEAVES //#define DETAILED_NOISE //#define LIGHT_AA // 2 sample SSAA //#define HEAVY_AA // 2x2 RG SSAA //#define TONEMAP //// Configurations #ifdef MEDIUMQUALITY #define SHADOWS #define SMALL_WAVES #define RAGGED_LEAVES #define TONEMAP #endif #ifdef HIGHQUALITY #define REFLECTIONS #define SHADOWS //#define GRASS #define SMALL_WAVES #define RAGGED_LEAVES #define DETAILED_NOISE #define LIGHT_AA #define TONEMAP #endif // Constants const float eps = 1e-5; const float PI = 3.14159265359; const vec3 sunDir = vec3(0.79057,-0.47434, 0.0); const vec3 skyCol = vec3(0.3, 0.5, 0.8); const vec3 sandCol = vec3(0.9, 0.8, 0.5); const vec3 treeCol = vec3(0.8, 0.65, 0.3); const vec3 grassCol = vec3(0.4, 0.5, 0.18); const vec3 leavesCol = vec3(0.3, 0.6, 0.2); const vec3 leavesPos = vec3(-5.1,13.4, 0.0); #ifdef TONEMAP const vec3 sunCol = vec3(1.8, 1.7, 1.6); #else const vec3 sunCol = vec3(0.9, 0.85, 0.8); #endif const float exposure = 1.1; // Only used when tonemapping // Description : Array and textureless GLSL 2D/3D/4D simplex // noise functions. // Author : Ian McEwan, Ashima Arts. // License : Copyright (C) 2011 Ashima Arts. All rights reserved. // Distributed under the MIT License. See LICENSE file. // https://github.com/ashima/webgl-noise vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 permute(vec4 x) { return mod289(((x*34.0)+1.0)*x); } vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; } float snoise(vec3 v) { const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); // First corner vec3 i = floor(v + dot(v, C.yyy) ); vec3 x0 = v - i + dot(i, C.xxx) ; // Other corners vec3 g = step(x0.yzx, x0.xyz); vec3 l = 1.0 - g; vec3 i1 = min( g.xyz, l.zxy ); vec3 i2 = max( g.xyz, l.zxy ); // x0 = x0 - 0.0 + 0.0 * C.xxx; // x1 = x0 - i1 + 1.0 * C.xxx; // x2 = x0 - i2 + 2.0 * C.xxx; // x3 = x0 - 1.0 + 3.0 * C.xxx; vec3 x1 = x0 - i1 + C.xxx; vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y // Permutations i = mod289(i); vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); // Gradients: 7x7 points over a square, mapped onto an octahedron. // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) float n_ = 0.142857142857; // 1.0/7.0 vec3 ns = n_ * D.wyz - D.xzx; vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7) vec4 x_ = floor(j * ns.z); vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) vec4 x = x_ *ns.x + ns.yyyy; vec4 y = y_ *ns.x + ns.yyyy; vec4 h = 1.0 - abs(x) - abs(y); vec4 b0 = vec4( x.xy, y.xy ); vec4 b1 = vec4( x.zw, y.zw ); //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; vec4 s0 = floor(b0)*2.0 + 1.0; vec4 s1 = floor(b1)*2.0 + 1.0; vec4 sh = -step(h, vec4(0.0)); vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; vec3 p0 = vec3(a0.xy,h.x); vec3 p1 = vec3(a0.zw,h.y); vec3 p2 = vec3(a1.xy,h.z); vec3 p3 = vec3(a1.zw,h.w); //Normalise gradients vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w; // Mix final noise value vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); m = m * m; return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) ); } // Main float fbm(vec3 p) { float final = snoise(p); p *= 1.94; final += snoise(p) * 0.5; #ifdef DETAILED_NOISE p *= 3.75; final += snoise(p) * 0.25; return final / 1.75; #else return final / 1.5; #endif } float waterHeight(vec3 p) { float d = length(p.xz); float h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves #ifdef SMALL_WAVES h += fbm(p*0.5); // Other waves #endif return h; } vec3 bump(vec3 pos, vec3 rayDir) { float s = 2.0; // Fade out waves to reduce aliasing float dist = dot(pos, rayDir); s *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist); // Calculate normal from heightmap vec2 e = vec2(1e-2, 0.0); vec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7; float m = waterHeight(p)*s; return normalize(vec3( waterHeight(p+e.xyy)*s-m, 1.0, waterHeight(p+e.yxy)*s-m )); } // Ray intersections vec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad) { vec3 op = pos - rpos; float b = dot(op, rdir); float det = b*b - dot(op, op) + rad*rad; if (det > 0.0) { det = sqrt(det); float t = b - det; if (t > eps) return vec4(-normalize(rpos+rdir*t-pos), t); } return vec4(0.0); } vec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad) { vec3 op = pos - rpos; vec2 rdir2 = normalize(rdir.yz); float b = dot(op.yz, rdir2); float det = b*b - dot(op.yz, op.yz) + rad*rad; if (det > 0.0) { det = sqrt(det); float t = b - det; if (t > eps) return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t); t = b + det; if (t > eps) return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t); } return vec4(0.0); } vec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d) { float t = -(dot(rayPos, n) + d) / dot(rayDir, n); return vec4(n * sign(dot(rayDir, n)), t); } // Helper functions vec3 rotate(vec3 p, float theta) { float c = cos(theta), s = sin(theta); return vec3(p.x * c + p.z * s, p.y, p.z * c - p.x * s); } float impulse(float k, float x) // by iq { float h = k*x; return h * exp(1.0 - h); } // Raymarched parts of scene float grass(vec3 pos) { float h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0; if (h > 2.0) return h; // Optimization (Avoid noise if too far away) return h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9; } float tree(vec3 pos) { pos.y -= 0.5; float s = sin(pos.y*0.03); float c = cos(pos.y*0.03); mat2 m = mat2(c, -s, s, c); vec3 p = vec3(m*pos.xy, pos.z); float width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1); return max(length(p.xz) - width, pos.y - 12.5); } vec2 scene(vec3 pos) { float vtree = tree(pos); #ifdef GRASS float vgrass = grass(pos); float v = min(vtree, vgrass); #else float v = vtree; #endif return vec2(v, v == vtree ? 2.0 : 1.0); } vec3 normal(vec3 pos) { vec2 eps = vec2(1e-3, 0.0); float h = scene(pos).x; return normalize(vec3( scene(pos-eps.xyy).x-h, scene(pos-eps.yxy).x-h, scene(pos-eps.yyx).x-h )); } float plantsShadow(vec3 rayPos, vec3 rayDir) { // Soft shadow taken from iq float k = 6.0; float t = 0.0; float s = 1.0; for (int i = 0; i < 30; i++) { vec3 pos = rayPos+rayDir*t; vec2 res = scene(pos); if (res.x < 0.001) return 0.0; s = min(s, k*res.x/t); t += max(res.x, 0.01); } return s*s*(3.0 - 2.0*s); } // Ray-traced parts of scene vec4 intersectWater(vec3 rayPos, vec3 rayDir) { float h = sin(20.5 + iGlobalTime * 2.0) * 0.03; float t = -(rayPos.y + 2.5 + h) / rayDir.y; return vec4(0.0, 1.0, 0.0, t); } vec4 intersectSand(vec3 rayPos, vec3 rayDir) { return intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1); } vec4 intersectTreasure(vec3 rayPos, vec3 rayDir) { return vec4(0.0); } vec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount) { vec3 dir = normalize(vec3(0.0, 1.0, openAmount)); float offset = 0.0; vec4 res = intersectPlane(rayPos, rayDir, dir, 0.0); vec3 pos = rayPos+rayDir*res.w; #ifdef RAGGED_LEAVES offset = snoise(pos*0.8) * 0.3; #endif if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0; vec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0); pos = rayPos+rayDir*res2.w; #ifdef RAGGED_LEAVES offset = snoise(pos*0.8) * 0.3; #endif if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0; if (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0) res = res2; return res; } vec4 leaves(vec3 rayPos, vec3 rayDir) { float t = 1e20; vec3 n = vec3(0.0); rayPos -= leavesPos; float sway = impulse(15.0, fract(iGlobalTime / PI * 0.125)); float upDownSway = sway * -sin(iGlobalTime) * 0.06; float openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0); float angleOffset = -0.1; for (float k = 0.0; k < 6.2; k += 0.75) { // Left-right float alpha = k + (k - PI) * sway * 0.015; vec3 p = rotate(rayPos, alpha); vec3 d = rotate(rayDir, alpha); // Up-down angleOffset *= -1.0; float theta = -0.4 + angleOffset + cos(k) * 0.35 + upDownSway + sin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2); p = rotate(p.xzy, theta).xzy; d = rotate(d.xzy, theta).xzy; // Shift p -= vec3(5.4, 0.0, 0.0); // Intersect individual leaf vec4 res = intersectLeaf(p, d, 1.0+openAmount); if (res.w > 0.0 && res.w < t) { t = res.w; n = res.xyz; } } return vec4(n, t); } // Lighting float shadow(vec3 rayPos, vec3 rayDir) { float s = 1.0; // Intersect sand //vec4 resSand = intersectSand(rayPos, rayDir); //if (resSand.w > 0.0) return 0.0; // Intersect plants s = min(s, plantsShadow(rayPos, rayDir)); if (s < 0.0001) return 0.0; // Intersect leaves vec4 resLeaves = leaves(rayPos, rayDir); if (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0; return s; } vec3 light(vec3 p, vec3 n) { float s = 1.0; #ifdef SHADOWS s = shadow(p-sunDir*0.01, -sunDir); #endif vec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s); col += skyCol * (-n.y * 0.5 + 0.5) * 0.3; return col; } vec3 lightLeaves(vec3 p, vec3 n) { float s = 1.0; #ifdef SHADOWS s = shadow(p-sunDir*0.01, -sunDir); #endif float ao = min(length(p - leavesPos) * 0.1, 1.0); float ns = dot(n, sunDir); float d = sqrt(max(ns, 0.0)); vec3 col = sunCol * min(d, s); col += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao; col += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao; return col; } vec3 sky(vec3 n) { return skyCol * (1.0 - n.y * 0.8); } // Ray-marching vec4 plants(vec3 rayPos, vec3 rayDir) { float t = 0.0; for (int i = 0; i < 40; i++) { vec3 pos = rayPos+rayDir*t; vec2 res = scene(pos); float h = res.x; if (h < 0.001) { vec3 col = res.y == 2.0 ? treeCol : grassCol; float uvFact = res.y == 2.0 ? 1.0 : 10.0; vec3 n = normal(pos); vec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact; vec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4; float ao = min(length(pos - leavesPos) * 0.1, 1.0); return vec4(col * light(pos, n) * ao * tex, t); } t += h; } return vec4(sky(rayDir), 1e8); } // Final combination vec3 traceReflection(vec3 rayPos, vec3 rayDir) { vec3 col = vec3(0.0); float t = 1e20; // Intersect plants vec4 resPlants = plants(rayPos, rayDir); if (resPlants.w > 0.0 && resPlants.w < t) { t = resPlants.w; col = resPlants.xyz; } // Intersect leaves vec4 resLeaves = leaves(rayPos, rayDir); if (resLeaves.w > 0.0 && resLeaves.w < t) { vec3 pos = rayPos + rayDir * resLeaves.w; vec2 uv = (pos.xz - leavesPos.xz) * 0.3; float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5; t = resLeaves.w; col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex; } if (t > 1e7) return sky(rayDir); return col; } vec3 trace(vec3 rayPos, vec3 rayDir) { vec3 col = vec3(0.0); float t = 1e20; // Intersect sand vec4 resSand = intersectSand(rayPos, rayDir); if (resSand.w > 0.0) { vec3 pos = rayPos + rayDir * resSand.w; t = resSand.w; col = sandCol * light(pos, resSand.xyz); } // Intersect treasure chest vec4 resTreasure = intersectTreasure(rayPos, rayDir); if (resTreasure.w > 0.0 && resTreasure.w < t) { vec3 pos = rayPos + rayDir * resTreasure.w; t = resTreasure.w; col = leavesCol * light(pos, resTreasure.xyz); } // Intersect leaves vec4 resLeaves = leaves(rayPos, rayDir); if (resLeaves.w > 0.0 && resLeaves.w < t) { vec3 pos = rayPos + rayDir * resLeaves.w; vec2 uv = (pos.xz - leavesPos.xz) * 0.3; float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5; t = resLeaves.w; col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex; } // Intersect plants vec4 resPlants = plants(rayPos, rayDir); if (resPlants.w > 0.0 && resPlants.w < t) { t = resPlants.w; col = resPlants.xyz; } // Intersect water vec4 resWater = intersectWater(rayPos, rayDir); if (resWater.w > 0.0 && resWater.w < t) { vec3 pos = rayPos + rayDir * resWater.w; float dist = t - resWater.w; vec3 n = bump(pos, rayDir); float ct = -min(dot(n,rayDir), 0.0); float fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0); vec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0); vec3 reflDir = normalize(reflect(rayDir, n)); vec3 refl = sky(reflDir); #ifdef REFLECTIONS if (dot(pos, rayDir) < -2.0) refl = traceReflection(pos, reflDir).rgb; #endif t = resWater.t; col = mix(refl, trans, fresnel); } if (t > 1e7) return sky(rayDir); return col; } // Ray-generation vec3 camera(vec2 px) { vec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0; float t = sin(iGlobalTime * 0.1) * 0.2; vec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0)); vec3 rayPos = vec3(0.0, 3.0, -18.0); return trace(rayPos, rayDir); } void main(void) { #ifdef HEAVY_AA vec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25; col += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25; col += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25; col += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25; #else vec3 col = camera(gl_FragCoord.xy); #ifdef LIGHT_AA col = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5; #endif #endif #ifdef TONEMAP // Optimized Haarm-Peter Duiker’s curve vec3 x = max(vec3(0.0),col*exposure-0.004); col = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06); #else col = pow(col, vec3(0.4545)); #endif gl_FragColor = vec4(col, 1.0); } ================================================ FILE: samples/GLSL/islandScene.shader ================================================ //// High quality (Some browsers may freeze or crash) //#define HIGHQUALITY //// Medium quality (Should be fine on all systems, works on Intel HD2000 on Win7 but quite slow) //#define MEDIUMQUALITY //// Defaults //#define REFLECTIONS #define SHADOWS //#define GRASS //#define SMALL_WAVES #define RAGGED_LEAVES //#define DETAILED_NOISE //#define LIGHT_AA // 2 sample SSAA //#define HEAVY_AA // 2x2 RG SSAA //#define TONEMAP //// Configurations #ifdef MEDIUMQUALITY #define SHADOWS #define SMALL_WAVES #define RAGGED_LEAVES #define TONEMAP #endif #ifdef HIGHQUALITY #define REFLECTIONS #define SHADOWS //#define GRASS #define SMALL_WAVES #define RAGGED_LEAVES #define DETAILED_NOISE #define LIGHT_AA #define TONEMAP #endif // Constants const float eps = 1e-5; const float PI = 3.14159265359; const vec3 sunDir = vec3(0.79057,-0.47434, 0.0); const vec3 skyCol = vec3(0.3, 0.5, 0.8); const vec3 sandCol = vec3(0.9, 0.8, 0.5); const vec3 treeCol = vec3(0.8, 0.65, 0.3); const vec3 grassCol = vec3(0.4, 0.5, 0.18); const vec3 leavesCol = vec3(0.3, 0.6, 0.2); const vec3 leavesPos = vec3(-5.1,13.4, 0.0); #ifdef TONEMAP const vec3 sunCol = vec3(1.8, 1.7, 1.6); #else const vec3 sunCol = vec3(0.9, 0.85, 0.8); #endif const float exposure = 1.1; // Only used when tonemapping // Description : Array and textureless GLSL 2D/3D/4D simplex // noise functions. // Author : Ian McEwan, Ashima Arts. // License : Copyright (C) 2011 Ashima Arts. All rights reserved. // Distributed under the MIT License. See LICENSE file. // https://github.com/ashima/webgl-noise vec3 mod289(vec3 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 mod289(vec4 x) { return x - floor(x * (1.0 / 289.0)) * 289.0; } vec4 permute(vec4 x) { return mod289(((x*34.0)+1.0)*x); } vec4 taylorInvSqrt(vec4 r) { return 1.79284291400159 - 0.85373472095314 * r; } float snoise(vec3 v) { const vec2 C = vec2(1.0/6.0, 1.0/3.0) ; const vec4 D = vec4(0.0, 0.5, 1.0, 2.0); // First corner vec3 i = floor(v + dot(v, C.yyy) ); vec3 x0 = v - i + dot(i, C.xxx) ; // Other corners vec3 g = step(x0.yzx, x0.xyz); vec3 l = 1.0 - g; vec3 i1 = min( g.xyz, l.zxy ); vec3 i2 = max( g.xyz, l.zxy ); // x0 = x0 - 0.0 + 0.0 * C.xxx; // x1 = x0 - i1 + 1.0 * C.xxx; // x2 = x0 - i2 + 2.0 * C.xxx; // x3 = x0 - 1.0 + 3.0 * C.xxx; vec3 x1 = x0 - i1 + C.xxx; vec3 x2 = x0 - i2 + C.yyy; // 2.0*C.x = 1/3 = C.y vec3 x3 = x0 - D.yyy; // -1.0+3.0*C.x = -0.5 = -D.y // Permutations i = mod289(i); vec4 p = permute( permute( permute( i.z + vec4(0.0, i1.z, i2.z, 1.0 )) + i.y + vec4(0.0, i1.y, i2.y, 1.0 )) + i.x + vec4(0.0, i1.x, i2.x, 1.0 )); // Gradients: 7x7 points over a square, mapped onto an octahedron. // The ring size 17*17 = 289 is close to a multiple of 49 (49*6 = 294) float n_ = 0.142857142857; // 1.0/7.0 vec3 ns = n_ * D.wyz - D.xzx; vec4 j = p - 49.0 * floor(p * ns.z * ns.z); // mod(p,7*7) vec4 x_ = floor(j * ns.z); vec4 y_ = floor(j - 7.0 * x_ ); // mod(j,N) vec4 x = x_ *ns.x + ns.yyyy; vec4 y = y_ *ns.x + ns.yyyy; vec4 h = 1.0 - abs(x) - abs(y); vec4 b0 = vec4( x.xy, y.xy ); vec4 b1 = vec4( x.zw, y.zw ); //vec4 s0 = vec4(lessThan(b0,0.0))*2.0 - 1.0; //vec4 s1 = vec4(lessThan(b1,0.0))*2.0 - 1.0; vec4 s0 = floor(b0)*2.0 + 1.0; vec4 s1 = floor(b1)*2.0 + 1.0; vec4 sh = -step(h, vec4(0.0)); vec4 a0 = b0.xzyw + s0.xzyw*sh.xxyy ; vec4 a1 = b1.xzyw + s1.xzyw*sh.zzww ; vec3 p0 = vec3(a0.xy,h.x); vec3 p1 = vec3(a0.zw,h.y); vec3 p2 = vec3(a1.xy,h.z); vec3 p3 = vec3(a1.zw,h.w); //Normalise gradients vec4 norm = taylorInvSqrt(vec4(dot(p0,p0), dot(p1,p1), dot(p2, p2), dot(p3,p3))); p0 *= norm.x; p1 *= norm.y; p2 *= norm.z; p3 *= norm.w; // Mix final noise value vec4 m = max(0.6 - vec4(dot(x0,x0), dot(x1,x1), dot(x2,x2), dot(x3,x3)), 0.0); m = m * m; return 42.0 * dot( m*m, vec4( dot(p0,x0), dot(p1,x1), dot(p2,x2), dot(p3,x3) ) ); } // Main float fbm(vec3 p) { float final = snoise(p); p *= 1.94; final += snoise(p) * 0.5; #ifdef DETAILED_NOISE p *= 3.75; final += snoise(p) * 0.25; return final / 1.75; #else return final / 1.5; #endif } float waterHeight(vec3 p) { float d = length(p.xz); float h = sin(d * 1.5 + iGlobalTime * 3.0) * 12.0 / d; // Island waves #ifdef SMALL_WAVES h += fbm(p*0.5); // Other waves #endif return h; } vec3 bump(vec3 pos, vec3 rayDir) { float s = 2.0; // Fade out waves to reduce aliasing float dist = dot(pos, rayDir); s *= dist < 2.0 ? 1.0 : 1.4142 / sqrt(dist); // Calculate normal from heightmap vec2 e = vec2(1e-2, 0.0); vec3 p = vec3(pos.x, iGlobalTime*0.5, pos.z)*0.7; float m = waterHeight(p)*s; return normalize(vec3( waterHeight(p+e.xyy)*s-m, 1.0, waterHeight(p+e.yxy)*s-m )); } // Ray intersections vec4 intersectSphere(vec3 rpos, vec3 rdir, vec3 pos, float rad) { vec3 op = pos - rpos; float b = dot(op, rdir); float det = b*b - dot(op, op) + rad*rad; if (det > 0.0) { det = sqrt(det); float t = b - det; if (t > eps) return vec4(-normalize(rpos+rdir*t-pos), t); } return vec4(0.0); } vec4 intersectCylinder(vec3 rpos, vec3 rdir, vec3 pos, float rad) { vec3 op = pos - rpos; vec2 rdir2 = normalize(rdir.yz); float b = dot(op.yz, rdir2); float det = b*b - dot(op.yz, op.yz) + rad*rad; if (det > 0.0) { det = sqrt(det); float t = b - det; if (t > eps) return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t); t = b + det; if (t > eps) return vec4(-normalize(rpos.yz+rdir2*t-pos.yz), 0.0, t); } return vec4(0.0); } vec4 intersectPlane(vec3 rayPos, vec3 rayDir, vec3 n, float d) { float t = -(dot(rayPos, n) + d) / dot(rayDir, n); return vec4(n * sign(dot(rayDir, n)), t); } // Helper functions vec3 rotate(vec3 p, float theta) { float c = cos(theta), s = sin(theta); return vec3(p.x * c + p.z * s, p.y, p.z * c - p.x * s); } float impulse(float k, float x) // by iq { float h = k*x; return h * exp(1.0 - h); } // Raymarched parts of scene float grass(vec3 pos) { float h = length(pos - vec3(0.0, -7.0, 0.0)) - 8.0; if (h > 2.0) return h; // Optimization (Avoid noise if too far away) return h + snoise(pos * 3.0) * 0.1 + pos.y * 0.9; } float tree(vec3 pos) { pos.y -= 0.5; float s = sin(pos.y*0.03); float c = cos(pos.y*0.03); mat2 m = mat2(c, -s, s, c); vec3 p = vec3(m*pos.xy, pos.z); float width = 1.0 - pos.y * 0.02 - clamp(sin(pos.y * 8.0) * 0.1, 0.05, 0.1); return max(length(p.xz) - width, pos.y - 12.5); } vec2 scene(vec3 pos) { float vtree = tree(pos); #ifdef GRASS float vgrass = grass(pos); float v = min(vtree, vgrass); #else float v = vtree; #endif return vec2(v, v == vtree ? 2.0 : 1.0); } vec3 normal(vec3 pos) { vec2 eps = vec2(1e-3, 0.0); float h = scene(pos).x; return normalize(vec3( scene(pos-eps.xyy).x-h, scene(pos-eps.yxy).x-h, scene(pos-eps.yyx).x-h )); } float plantsShadow(vec3 rayPos, vec3 rayDir) { // Soft shadow taken from iq float k = 6.0; float t = 0.0; float s = 1.0; for (int i = 0; i < 30; i++) { vec3 pos = rayPos+rayDir*t; vec2 res = scene(pos); if (res.x < 0.001) return 0.0; s = min(s, k*res.x/t); t += max(res.x, 0.01); } return s*s*(3.0 - 2.0*s); } // Ray-traced parts of scene vec4 intersectWater(vec3 rayPos, vec3 rayDir) { float h = sin(20.5 + iGlobalTime * 2.0) * 0.03; float t = -(rayPos.y + 2.5 + h) / rayDir.y; return vec4(0.0, 1.0, 0.0, t); } vec4 intersectSand(vec3 rayPos, vec3 rayDir) { return intersectSphere(rayPos, rayDir, vec3(0.0,-24.1,0.0), 24.1); } vec4 intersectTreasure(vec3 rayPos, vec3 rayDir) { return vec4(0.0); } vec4 intersectLeaf(vec3 rayPos, vec3 rayDir, float openAmount) { vec3 dir = normalize(vec3(0.0, 1.0, openAmount)); float offset = 0.0; vec4 res = intersectPlane(rayPos, rayDir, dir, 0.0); vec3 pos = rayPos+rayDir*res.w; #ifdef RAGGED_LEAVES offset = snoise(pos*0.8) * 0.3; #endif if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res.w = 0.0; vec4 res2 = intersectPlane(rayPos, rayDir, vec3(dir.xy, -dir.z), 0.0); pos = rayPos+rayDir*res2.w; #ifdef RAGGED_LEAVES offset = snoise(pos*0.8) * 0.3; #endif if (pos.y > 0.0 || length(pos * vec3(0.9, 2.0, 1.0)) > 4.0 - offset) res2.w = 0.0; if (res2.w > 0.0 && res2.w < res.w || res.w <= 0.0) res = res2; return res; } vec4 leaves(vec3 rayPos, vec3 rayDir) { float t = 1e20; vec3 n = vec3(0.0); rayPos -= leavesPos; float sway = impulse(15.0, fract(iGlobalTime / PI * 0.125)); float upDownSway = sway * -sin(iGlobalTime) * 0.06; float openAmount = sway * max(-cos(iGlobalTime) * 0.4, 0.0); float angleOffset = -0.1; for (float k = 0.0; k < 6.2; k += 0.75) { // Left-right float alpha = k + (k - PI) * sway * 0.015; vec3 p = rotate(rayPos, alpha); vec3 d = rotate(rayDir, alpha); // Up-down angleOffset *= -1.0; float theta = -0.4 + angleOffset + cos(k) * 0.35 + upDownSway + sin(iGlobalTime+k*10.0) * 0.03 * (sway + 0.2); p = rotate(p.xzy, theta).xzy; d = rotate(d.xzy, theta).xzy; // Shift p -= vec3(5.4, 0.0, 0.0); // Intersect individual leaf vec4 res = intersectLeaf(p, d, 1.0+openAmount); if (res.w > 0.0 && res.w < t) { t = res.w; n = res.xyz; } } return vec4(n, t); } // Lighting float shadow(vec3 rayPos, vec3 rayDir) { float s = 1.0; // Intersect sand //vec4 resSand = intersectSand(rayPos, rayDir); //if (resSand.w > 0.0) return 0.0; // Intersect plants s = min(s, plantsShadow(rayPos, rayDir)); if (s < 0.0001) return 0.0; // Intersect leaves vec4 resLeaves = leaves(rayPos, rayDir); if (resLeaves.w > 0.0 && resLeaves.w < 1e7) return 0.0; return s; } vec3 light(vec3 p, vec3 n) { float s = 1.0; #ifdef SHADOWS s = shadow(p-sunDir*0.01, -sunDir); #endif vec3 col = sunCol * min(max(dot(n, sunDir), 0.0), s); col += skyCol * (-n.y * 0.5 + 0.5) * 0.3; return col; } vec3 lightLeaves(vec3 p, vec3 n) { float s = 1.0; #ifdef SHADOWS s = shadow(p-sunDir*0.01, -sunDir); #endif float ao = min(length(p - leavesPos) * 0.1, 1.0); float ns = dot(n, sunDir); float d = sqrt(max(ns, 0.0)); vec3 col = sunCol * min(d, s); col += sunCol * max(-ns, 0.0) * vec3(0.3, 0.3, 0.1) * ao; col += skyCol * (-n.y * 0.5 + 0.5) * 0.3 * ao; return col; } vec3 sky(vec3 n) { return skyCol * (1.0 - n.y * 0.8); } // Ray-marching vec4 plants(vec3 rayPos, vec3 rayDir) { float t = 0.0; for (int i = 0; i < 40; i++) { vec3 pos = rayPos+rayDir*t; vec2 res = scene(pos); float h = res.x; if (h < 0.001) { vec3 col = res.y == 2.0 ? treeCol : grassCol; float uvFact = res.y == 2.0 ? 1.0 : 10.0; vec3 n = normal(pos); vec2 uv = vec2(n.x, pos.y * 0.5) * 0.2 * uvFact; vec3 tex = texture2D(iChannel0, uv).rgb * 0.6 + 0.4; float ao = min(length(pos - leavesPos) * 0.1, 1.0); return vec4(col * light(pos, n) * ao * tex, t); } t += h; } return vec4(sky(rayDir), 1e8); } // Final combination vec3 traceReflection(vec3 rayPos, vec3 rayDir) { vec3 col = vec3(0.0); float t = 1e20; // Intersect plants vec4 resPlants = plants(rayPos, rayDir); if (resPlants.w > 0.0 && resPlants.w < t) { t = resPlants.w; col = resPlants.xyz; } // Intersect leaves vec4 resLeaves = leaves(rayPos, rayDir); if (resLeaves.w > 0.0 && resLeaves.w < t) { vec3 pos = rayPos + rayDir * resLeaves.w; vec2 uv = (pos.xz - leavesPos.xz) * 0.3; float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5; t = resLeaves.w; col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex; } if (t > 1e7) return sky(rayDir); return col; } vec3 trace(vec3 rayPos, vec3 rayDir) { vec3 col = vec3(0.0); float t = 1e20; // Intersect sand vec4 resSand = intersectSand(rayPos, rayDir); if (resSand.w > 0.0) { vec3 pos = rayPos + rayDir * resSand.w; t = resSand.w; col = sandCol * light(pos, resSand.xyz); } // Intersect treasure chest vec4 resTreasure = intersectTreasure(rayPos, rayDir); if (resTreasure.w > 0.0 && resTreasure.w < t) { vec3 pos = rayPos + rayDir * resTreasure.w; t = resTreasure.w; col = leavesCol * light(pos, resTreasure.xyz); } // Intersect leaves vec4 resLeaves = leaves(rayPos, rayDir); if (resLeaves.w > 0.0 && resLeaves.w < t) { vec3 pos = rayPos + rayDir * resLeaves.w; vec2 uv = (pos.xz - leavesPos.xz) * 0.3; float tex = texture2D(iChannel0, uv).r * 0.6 + 0.5; t = resLeaves.w; col = leavesCol * lightLeaves(pos, resLeaves.xyz) * tex; } // Intersect plants vec4 resPlants = plants(rayPos, rayDir); if (resPlants.w > 0.0 && resPlants.w < t) { t = resPlants.w; col = resPlants.xyz; } // Intersect water vec4 resWater = intersectWater(rayPos, rayDir); if (resWater.w > 0.0 && resWater.w < t) { vec3 pos = rayPos + rayDir * resWater.w; float dist = t - resWater.w; vec3 n = bump(pos, rayDir); float ct = -min(dot(n,rayDir), 0.0); float fresnel = 0.9 - 0.9 * pow(1.0 - ct, 5.0); vec3 trans = col * exp(-dist * vec3(1.0, 0.7, 0.4) * 3.0); vec3 reflDir = normalize(reflect(rayDir, n)); vec3 refl = sky(reflDir); #ifdef REFLECTIONS if (dot(pos, rayDir) < -2.0) refl = traceReflection(pos, reflDir).rgb; #endif t = resWater.t; col = mix(refl, trans, fresnel); } if (t > 1e7) return sky(rayDir); return col; } // Ray-generation vec3 camera(vec2 px) { vec2 rd = (px / iResolution.yy - vec2(iResolution.x/iResolution.y*0.5-0.5, 0.0)) * 2.0 - 1.0; float t = sin(iGlobalTime * 0.1) * 0.2; vec3 rayDir = normalize(vec3(rd.x, rd.y, 1.0)); vec3 rayPos = vec3(0.0, 3.0, -18.0); return trace(rayPos, rayDir); } void main(void) { #ifdef HEAVY_AA vec3 col = camera(gl_FragCoord.xy+vec2(0.0,0.5))*0.25; col += camera(gl_FragCoord.xy+vec2(0.25,0.0))*0.25; col += camera(gl_FragCoord.xy+vec2(0.5,0.75))*0.25; col += camera(gl_FragCoord.xy+vec2(0.75,0.25))*0.25; #else vec3 col = camera(gl_FragCoord.xy); #ifdef LIGHT_AA col = col * 0.5 + camera(gl_FragCoord.xy+vec2(0.5,0.5))*0.5; #endif #endif #ifdef TONEMAP // Optimized Haarm-Peter Duiker’s curve vec3 x = max(vec3(0.0),col*exposure-0.004); col = (x*(6.2*x+.5))/(x*(6.2*x+1.7)+0.06); #else col = pow(col, vec3(0.4545)); #endif gl_FragColor = vec4(col, 1.0); } ================================================ FILE: samples/GLSL/main.vs ================================================ /* * This is the main vertex shader of surface materials. It can be invoked with * USE_OPTIMIZED_DEPTH_VERTEX_SHADER defined, and in this case we are guaranteed that the * DEPTH variant is active *AND* there is no custom vertex shader (i.e.: materialVertex() is * empty). * We can use this to remove all code that doesn't participate in the depth computation. */ void main() { #if defined(FILAMENT_HAS_FEATURE_INSTANCING) # if defined(TARGET_METAL_ENVIRONMENT) || defined(TARGET_VULKAN_ENVIRONMENT) instance_index = gl_InstanceIndex; # else // PowerVR drivers don't initialize gl_InstanceID correctly if it's assigned to the varying // directly and early in the shader. Adding a bit of extra integer math, works around it. // Using an intermediate variable doesn't work because of spirv-opt. if (CONFIG_POWER_VR_SHADER_WORKAROUNDS) { instance_index = (1 + gl_InstanceID) - 1; } else { instance_index = gl_InstanceID; } # endif logical_instance_index = instance_index; #endif #if defined(VARIANT_HAS_INSTANCED_STEREO) #if !defined(FILAMENT_HAS_FEATURE_INSTANCING) #error Instanced stereo not supported at this feature level #endif // The lowest bit of the instance index represents the eye. // This logic must be updated if CONFIG_STEREOSCOPIC_EYES changes logical_instance_index = instance_index >> 1; #endif initObjectUniforms(); // Initialize the inputs to sensible default values, see material_inputs.vs #if defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) // In USE_OPTIMIZED_DEPTH_VERTEX_SHADER mode, we can even skip this if we're already in // VERTEX_DOMAIN_DEVICE and we don't have VSM. #if !defined(VERTEX_DOMAIN_DEVICE) || defined(VARIANT_HAS_VSM) // Run initMaterialVertex to compute material.worldPosition. MaterialVertexInputs material; initMaterialVertex(material); // materialVertex() is guaranteed to be empty here, but we keep it to workaround some problem // in NVIDA drivers related to depth invariance. materialVertex(material); #endif #else // defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) MaterialVertexInputs material; initMaterialVertex(material); #if defined(HAS_ATTRIBUTE_TANGENTS) // If the material defines a value for the "normal" property, we need to output // the full orthonormal basis to apply normal mapping #if defined(MATERIAL_NEEDS_TBN) // Extract the normal and tangent in world space from the input quaternion // We encode the orthonormal basis as a quaternion to save space in the attributes toTangentFrame(mesh_tangents, material.worldNormal, vertex_worldTangent.xyz); #if defined(VARIANT_HAS_SKINNING_OR_MORPHING) if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) { #if defined(LEGACY_MORPHING) vec3 normal0, normal1, normal2, normal3; toTangentFrame(mesh_custom4, normal0); toTangentFrame(mesh_custom5, normal1); toTangentFrame(mesh_custom6, normal2); toTangentFrame(mesh_custom7, normal3); vec3 baseNormal = material.worldNormal; material.worldNormal += morphingUniforms.weights[0].xyz * (normal0 - baseNormal); material.worldNormal += morphingUniforms.weights[1].xyz * (normal1 - baseNormal); material.worldNormal += morphingUniforms.weights[2].xyz * (normal2 - baseNormal); material.worldNormal += morphingUniforms.weights[3].xyz * (normal3 - baseNormal); #else morphNormal(material.worldNormal); material.worldNormal = normalize(material.worldNormal); #endif } if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) { skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights); skinNormal(vertex_worldTangent.xyz, mesh_bone_indices, mesh_bone_weights); } #endif // We don't need to normalize here, even if there's a scale in the matrix // because we ensure the worldFromModelNormalMatrix pre-scales the normal such that // all its components are < 1.0. This prevents the bitangent to exceed the range of fp16 // in the fragment shader, where we renormalize after interpolation vertex_worldTangent.xyz = getWorldFromModelNormalMatrix() * vertex_worldTangent.xyz; vertex_worldTangent.w = mesh_tangents.w; material.worldNormal = getWorldFromModelNormalMatrix() * material.worldNormal; #else // MATERIAL_NEEDS_TBN // Without anisotropy or normal mapping we only need the normal vector toTangentFrame(mesh_tangents, material.worldNormal); #if defined(VARIANT_HAS_SKINNING_OR_MORPHING) if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_MORPHING_ENABLED_BIT) != 0) { #if defined(LEGACY_MORPHING) vec3 normal0, normal1, normal2, normal3; toTangentFrame(mesh_custom4, normal0); toTangentFrame(mesh_custom5, normal1); toTangentFrame(mesh_custom6, normal2); toTangentFrame(mesh_custom7, normal3); vec3 baseNormal = material.worldNormal; material.worldNormal += morphingUniforms.weights[0].xyz * (normal0 - baseNormal); material.worldNormal += morphingUniforms.weights[1].xyz * (normal1 - baseNormal); material.worldNormal += morphingUniforms.weights[2].xyz * (normal2 - baseNormal); material.worldNormal += morphingUniforms.weights[3].xyz * (normal3 - baseNormal); #else morphNormal(material.worldNormal); material.worldNormal = normalize(material.worldNormal); #endif } if ((object_uniforms_flagsChannels & FILAMENT_OBJECT_SKINNING_ENABLED_BIT) != 0) { skinNormal(material.worldNormal, mesh_bone_indices, mesh_bone_weights); } #endif material.worldNormal = getWorldFromModelNormalMatrix() * material.worldNormal; #endif // MATERIAL_HAS_ANISOTROPY || MATERIAL_HAS_NORMAL || MATERIAL_HAS_CLEAR_COAT_NORMAL #endif // HAS_ATTRIBUTE_TANGENTS // Invoke user code materialVertex(material); // Handle built-in interpolated attributes #if defined(HAS_ATTRIBUTE_COLOR) vertex_color = material.color; #endif #if defined(HAS_ATTRIBUTE_UV0) vertex_uv01.xy = material.uv0; #endif #if defined(HAS_ATTRIBUTE_UV1) vertex_uv01.zw = material.uv1; #endif // Handle user-defined interpolated attributes #if defined(VARIABLE_CUSTOM0) VARIABLE_CUSTOM_AT0 = material.VARIABLE_CUSTOM0; #endif #if defined(VARIABLE_CUSTOM1) VARIABLE_CUSTOM_AT1 = material.VARIABLE_CUSTOM1; #endif #if defined(VARIABLE_CUSTOM2) VARIABLE_CUSTOM_AT2 = material.VARIABLE_CUSTOM2; #endif #if defined(VARIABLE_CUSTOM3) VARIABLE_CUSTOM_AT3 = material.VARIABLE_CUSTOM3; #endif // The world position can be changed by the user in materialVertex() vertex_worldPosition.xyz = material.worldPosition.xyz; #ifdef HAS_ATTRIBUTE_TANGENTS vertex_worldNormal = material.worldNormal; #endif #if defined(VARIANT_HAS_SHADOWING) && defined(VARIANT_HAS_DIRECTIONAL_LIGHTING) vertex_lightSpacePosition = computeLightSpacePosition( vertex_worldPosition.xyz, vertex_worldNormal, frameUniforms.lightDirection, shadowUniforms.shadows[0].normalBias, shadowUniforms.shadows[0].lightFromWorldMatrix); #endif #endif // !defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) vec4 position; #if defined(VERTEX_DOMAIN_DEVICE) // The other vertex domains are handled in initMaterialVertex()->computeWorldPosition() position = getPosition(); #if !defined(USE_OPTIMIZED_DEPTH_VERTEX_SHADER) #if defined(MATERIAL_HAS_CLIP_SPACE_TRANSFORM) position = getMaterialClipSpaceTransform(material) * position; #endif #endif // !USE_OPTIMIZED_DEPTH_VERTEX_SHADER #if defined(MATERIAL_HAS_VERTEX_DOMAIN_DEVICE_JITTERED) // Apply the clip-space transform which is normally part of the projection position.xy = position.xy * frameUniforms.clipTransform.xy + (position.w * frameUniforms.clipTransform.zw); #endif #else position = getClipFromWorldMatrix() * getWorldPosition(material); #endif #if defined(VERTEX_DOMAIN_DEVICE) // GL convention to inverted DX convention (must happen after clipSpaceTransform) position.z = position.z * -0.5 + 0.5; #endif #if defined(VARIANT_HAS_VSM) // For VSM, we use the linear light-space Z coordinate as the depth metric, which works for both // directional and spot lights and can be safely interpolated. // The value is guaranteed to be between [-znear, -zfar] by construction of viewFromWorldMatrix, // (see ShadowMap.cpp). // Use vertex_worldPosition.w which is otherwise not used to store the interpolated // light-space depth. highp float z = (getViewFromWorldMatrix() * getWorldPosition(material)).z; // rescale [near, far] to [0, 1] highp float depth = -z * frameUniforms.oneOverFarMinusNear - frameUniforms.nearOverFarMinusNear; // remap depth between -1 and 1 depth = depth * 2.0 - 1.0; vertex_worldPosition.w = depth; #endif // this must happen before we compensate for vulkan below vertex_position = position; #if defined(VARIANT_HAS_INSTANCED_STEREO) // This logic must be updated if CONFIG_STEREOSCOPIC_EYES changes // We're transforming a vertex whose x coordinate is within the range (-w to w). // To move it to the correct half of the viewport, we need to modify the x coordinate: // Eye 0 (left half): (-w to 0) // Eye 1 (right half): ( 0 to w) // It's important to do this after computing vertex_position. int eyeIndex = instance_index % 2; float eyeShift = float(eyeIndex) * 2.0f - 1.0f; // eye 0: -1.0, eye 1: 1.0 position.x = position.x * 0.5f + (position.w * 0.5 * eyeShift); // A fragment is clipped when gl_ClipDistance is negative (outside the clip plane). So, // Eye 0 should have a positive value when x is < 0 // -position.x // Eye 1 should have a positive value when x is > 0 // position.x FILAMENT_CLIPDISTANCE[0] = position.x * eyeShift; #endif #if defined(TARGET_VULKAN_ENVIRONMENT) // In Vulkan, clip space is Y-down. In OpenGL and Metal, clip space is Y-up. position.y = -position.y; #endif #if !defined(TARGET_VULKAN_ENVIRONMENT) && !defined(TARGET_METAL_ENVIRONMENT) // This is not needed in Vulkan or Metal because clipControl is always (1, 0) // (We don't use a dot() here because it workaround a spirv-opt optimization that in turn // causes a crash on PowerVR, see #5118) position.z = position.z * frameUniforms.clipControl.x + position.w * frameUniforms.clipControl.y; #endif // some PowerVR drivers crash when gl_Position is written more than once gl_Position = position; #if defined(VARIANT_HAS_INSTANCED_STEREO) // Fragment shaders filter out the stereo variant, so we need to set instance_index here. instance_index = logical_instance_index; #endif } ================================================ FILE: samples/GLSL/miss.rmiss ================================================ #version 460 #extension GL_EXT_ray_tracing : require struct RayPayload { vec3 color; float distance; vec3 normal; float reflector; }; layout(location = 0) rayPayloadInEXT RayPayload rayPayload; void main() { // View-independent background gradient to simulate a basic sky background const vec3 gradientStart = vec3(0.5, 0.6, 1.0); const vec3 gradientEnd = vec3(1.0); vec3 unitDir = normalize(gl_WorldRayDirectionEXT); float t = 0.5 * (unitDir.y + 1.0); rayPayload.color = (1.0-t) * gradientStart + t * gradientEnd; rayPayload.distance = -1.0f; rayPayload.normal = vec3(0.0f); rayPayload.reflector = 0.0f; } ================================================ FILE: samples/GLSL/myfragment.frg ================================================ varying vec4 v_color; void main() { gl_FragColor = v_color; } ================================================ FILE: samples/GLSL/myvertex.vrx ================================================ uniform mat4 u_MVPMatrix; attribute vec4 a_position; attribute vec4 a_color; varying vec4 v_color; void main() { v_color = a_color; gl_Position = u_MVPMatrix * pos; } ================================================ FILE: samples/GLSL/pntriangles.tesc ================================================ /** * The MIT License (MIT) * * Copyright (c) 2016 Sascha Willems * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable // PN patch data struct PnPatch { float b210; float b120; float b021; float b012; float b102; float b201; float b111; float n110; float n011; float n101; }; // tessellation levels layout (binding = 0) uniform UBO { float tessLevel; } ubo; layout(vertices=3) out; layout(location = 0) in vec3 inNormal[]; layout(location = 1) in vec2 inUV[]; layout(location = 0) out vec3 outNormal[3]; layout(location = 3) out vec2 outUV[3]; layout(location = 6) out PnPatch outPatch[3]; float wij(int i, int j) { return dot(gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz, inNormal[i]); } float vij(int i, int j) { vec3 Pj_minus_Pi = gl_in[j].gl_Position.xyz - gl_in[i].gl_Position.xyz; vec3 Ni_plus_Nj = inNormal[i]+inNormal[j]; return 2.0*dot(Pj_minus_Pi, Ni_plus_Nj)/dot(Pj_minus_Pi, Pj_minus_Pi); } void main() { // get data gl_out[gl_InvocationID].gl_Position = gl_in[gl_InvocationID].gl_Position; outNormal[gl_InvocationID] = inNormal[gl_InvocationID]; outUV[gl_InvocationID] = inUV[gl_InvocationID]; // set base float P0 = gl_in[0].gl_Position[gl_InvocationID]; float P1 = gl_in[1].gl_Position[gl_InvocationID]; float P2 = gl_in[2].gl_Position[gl_InvocationID]; float N0 = inNormal[0][gl_InvocationID]; float N1 = inNormal[1][gl_InvocationID]; float N2 = inNormal[2][gl_InvocationID]; // compute control points outPatch[gl_InvocationID].b210 = (2.0*P0 + P1 - wij(0,1)*N0)/3.0; outPatch[gl_InvocationID].b120 = (2.0*P1 + P0 - wij(1,0)*N1)/3.0; outPatch[gl_InvocationID].b021 = (2.0*P1 + P2 - wij(1,2)*N1)/3.0; outPatch[gl_InvocationID].b012 = (2.0*P2 + P1 - wij(2,1)*N2)/3.0; outPatch[gl_InvocationID].b102 = (2.0*P2 + P0 - wij(2,0)*N2)/3.0; outPatch[gl_InvocationID].b201 = (2.0*P0 + P2 - wij(0,2)*N0)/3.0; float E = ( outPatch[gl_InvocationID].b210 + outPatch[gl_InvocationID].b120 + outPatch[gl_InvocationID].b021 + outPatch[gl_InvocationID].b012 + outPatch[gl_InvocationID].b102 + outPatch[gl_InvocationID].b201 ) / 6.0; float V = (P0 + P1 + P2)/3.0; outPatch[gl_InvocationID].b111 = E + (E - V)*0.5; outPatch[gl_InvocationID].n110 = N0+N1-vij(0,1)*(P1-P0); outPatch[gl_InvocationID].n011 = N1+N2-vij(1,2)*(P2-P1); outPatch[gl_InvocationID].n101 = N2+N0-vij(2,0)*(P0-P2); // set tess levels gl_TessLevelOuter[gl_InvocationID] = ubo.tessLevel; gl_TessLevelInner[0] = ubo.tessLevel; } ================================================ FILE: samples/GLSL/pntriangles.tese ================================================ /** * The MIT License (MIT) * * Copyright (c) 2016 Sascha Willems * * Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ #version 450 #extension GL_ARB_separate_shader_objects : enable #extension GL_ARB_shading_language_420pack : enable // PN patch data struct PnPatch { float b210; float b120; float b021; float b012; float b102; float b201; float b111; float n110; float n011; float n101; }; layout (binding = 1) uniform UBO { mat4 projection; mat4 model; float tessAlpha; } ubo; layout(triangles, fractional_odd_spacing, ccw) in; layout(location = 0) in vec3 iNormal[]; layout(location = 3) in vec2 iTexCoord[]; layout(location = 6) in PnPatch iPnPatch[]; layout(location = 0) out vec3 oNormal; layout(location = 1) out vec2 oTexCoord; #define uvw gl_TessCoord void main() { vec3 uvwSquared = uvw * uvw; vec3 uvwCubed = uvwSquared * uvw; // extract control points vec3 b210 = vec3(iPnPatch[0].b210, iPnPatch[1].b210, iPnPatch[2].b210); vec3 b120 = vec3(iPnPatch[0].b120, iPnPatch[1].b120, iPnPatch[2].b120); vec3 b021 = vec3(iPnPatch[0].b021, iPnPatch[1].b021, iPnPatch[2].b021); vec3 b012 = vec3(iPnPatch[0].b012, iPnPatch[1].b012, iPnPatch[2].b012); vec3 b102 = vec3(iPnPatch[0].b102, iPnPatch[1].b102, iPnPatch[2].b102); vec3 b201 = vec3(iPnPatch[0].b201, iPnPatch[1].b201, iPnPatch[2].b201); vec3 b111 = vec3(iPnPatch[0].b111, iPnPatch[1].b111, iPnPatch[2].b111); // extract control normals vec3 n110 = normalize(vec3(iPnPatch[0].n110, iPnPatch[1].n110, iPnPatch[2].n110)); vec3 n011 = normalize(vec3(iPnPatch[0].n011, iPnPatch[1].n011, iPnPatch[2].n011)); vec3 n101 = normalize(vec3(iPnPatch[0].n101, iPnPatch[1].n101, iPnPatch[2].n101)); // compute texcoords oTexCoord = gl_TessCoord[2]*iTexCoord[0] + gl_TessCoord[0]*iTexCoord[1] + gl_TessCoord[1]*iTexCoord[2]; // normal // Barycentric normal vec3 barNormal = gl_TessCoord[2]*iNormal[0] + gl_TessCoord[0]*iNormal[1] + gl_TessCoord[1]*iNormal[2]; vec3 pnNormal = iNormal[0]*uvwSquared[2] + iNormal[1]*uvwSquared[0] + iNormal[2]*uvwSquared[1] + n110*uvw[2]*uvw[0] + n011*uvw[0]*uvw[1]+ n101*uvw[2]*uvw[1]; oNormal = ubo.tessAlpha*pnNormal + (1.0-ubo.tessAlpha) * barNormal; // compute interpolated pos vec3 barPos = gl_TessCoord[2]*gl_in[0].gl_Position.xyz + gl_TessCoord[0]*gl_in[1].gl_Position.xyz + gl_TessCoord[1]*gl_in[2].gl_Position.xyz; // save some computations uvwSquared *= 3.0; // compute PN position vec3 pnPos = gl_in[0].gl_Position.xyz*uvwCubed[2] + gl_in[1].gl_Position.xyz*uvwCubed[0] + gl_in[2].gl_Position.xyz*uvwCubed[1] + b210*uvwSquared[2]*uvw[0] + b120*uvwSquared[0]*uvw[2] + b201*uvwSquared[2]*uvw[1] + b021*uvwSquared[0]*uvw[1] + b102*uvwSquared[1]*uvw[2] + b012*uvwSquared[1]*uvw[0] + b111*6.0*uvw[0]*uvw[1]*uvw[2]; // final position and normal vec3 finalPos = (1.0-ubo.tessAlpha)*barPos + ubo.tessAlpha*pnPos; gl_Position = ubo.projection * ubo.model * vec4(finalPos,1.0); } ================================================ FILE: samples/GLSL/project.vs ================================================ #version 100 attribute vec2 pos; attribute vec3 rayvtx; varying vec3 Ray; uniform vec4 split; void main() { Ray = rayvtx; gl_Position = vec4(pos * vec2(split.z, split.w) + vec2(split.x, split.y), 0.0, 1.0); } ================================================ FILE: samples/GLSL/recurse1.frag ================================================ #version 330 core // cross-unit recursion void main() {} // two-level recursion float cbar(int); void cfoo(float) { cbar(2); } // four-level, out of order void CB(); void CD(); void CA() { CB(); } void CC() { CD(); } // high degree void CBT(); void CDT(); void CAT() { CBT(); CBT(); CBT(); } void CCT() { CDT(); CDT(); CBT(); } // not recursive void norA() {} void norB() { norA(); } void norC() { norA(); } void norD() { norA(); } void norE() { norB(); } void norF() { norB(); } void norG() { norE(); } void norH() { norE(); } void norI() { norE(); } // not recursive, but with a call leading into a cycle if ignoring direction void norcA() { } void norcB() { norcA(); } void norcC() { norcB(); } void norcD() { norcC(); norcB(); } // head of cycle void norcE() { norcD(); } // lead into cycle ================================================ FILE: samples/GLSL/recurse1.fs ================================================ #version 330 core // cross-unit recursion void main() {} // two-level recursion float cbar(int); void cfoo(float) { cbar(2); } // four-level, out of order void CB(); void CD(); void CA() { CB(); } void CC() { CD(); } // high degree void CBT(); void CDT(); void CAT() { CBT(); CBT(); CBT(); } void CCT() { CDT(); CDT(); CBT(); } // not recursive void norA() {} void norB() { norA(); } void norC() { norA(); } void norD() { norA(); } void norE() { norB(); } void norF() { norB(); } void norG() { norE(); } void norH() { norE(); } void norI() { norE(); } // not recursive, but with a call leading into a cycle if ignoring direction void norcA() { } void norcB() { norcA(); } void norcC() { norcB(); } void norcD() { norcC(); norcB(); } // head of cycle void norcE() { norcD(); } // lead into cycle ================================================ FILE: samples/GLSL/shader.fp ================================================ /* * Copyright (C) 2010 Josh A. Beam * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * 1. Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * 2. Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in the * documentation and/or other materials provided with the distribution. * * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, * WHETHER IN CONTACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ const int NUM_LIGHTS = 3; const vec3 AMBIENT = vec3(0.1, 0.1, 0.1); const float MAX_DIST = 2.5; const float MAX_DIST_SQUARED = MAX_DIST * MAX_DIST; uniform vec3 lightColor[NUM_LIGHTS]; varying vec3 fragmentNormal; varying vec3 cameraVector; varying vec3 lightVector[NUM_LIGHTS]; void main() { // initialize diffuse/specular lighting vec3 diffuse = vec3(0.0, 0.0, 0.0); vec3 specular = vec3(0.0, 0.0, 0.0); // normalize the fragment normal and camera direction vec3 normal = normalize(fragmentNormal); vec3 cameraDir = normalize(cameraVector); // loop through each light for(int i = 0; i < NUM_LIGHTS; ++i) { // calculate distance between 0.0 and 1.0 float dist = min(dot(lightVector[i], lightVector[i]), MAX_DIST_SQUARED) / MAX_DIST_SQUARED; float distFactor = 1.0 - dist; // diffuse vec3 lightDir = normalize(lightVector[i]); float diffuseDot = dot(normal, lightDir); diffuse += lightColor[i] * clamp(diffuseDot, 0.0, 1.0) * distFactor; // specular vec3 halfAngle = normalize(cameraDir + lightDir); vec3 specularColor = min(lightColor[i] + 0.5, 1.0); float specularDot = dot(normal, halfAngle); specular += specularColor * pow(clamp(specularDot, 0.0, 1.0), 16.0) * distFactor; } vec4 sample = vec4(1.0, 1.0, 1.0, 1.0); gl_FragColor = vec4(clamp(sample.rgb * (diffuse + AMBIENT) + specular, 0.0, 1.0), sample.a); } ================================================ FILE: samples/GN/BUILD.2.gn ================================================ # Copyright 2016 the V8 project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("../gni/isolate.gni") group("gn_all") { testonly = true if (v8_test_isolation_mode != "noop") { deps = [ ":check-static-initializers_run", ":jsfunfuzz_run", ":run-deopt-fuzzer_run", ":run-gcmole_run", ":run-valgrind_run", ] } } v8_isolate_run("check-static-initializers") { deps = [ "..:d8_run", ] isolate = "check-static-initializers.isolate" } v8_isolate_run("jsfunfuzz") { deps = [ "..:d8_run", ] isolate = "jsfunfuzz/jsfunfuzz.isolate" } v8_isolate_run("run-deopt-fuzzer") { deps = [ "..:d8_run", ] isolate = "run-deopt-fuzzer.isolate" } v8_isolate_run("run-gcmole") { deps = [ "..:d8_run", ] isolate = "gcmole/run-gcmole.isolate" } v8_isolate_run("run-valgrind") { deps = [ "..:d8_run", ] isolate = "run-valgrind.isolate" } ================================================ FILE: samples/GN/BUILD.3.gn ================================================ # Copyright (c) 2013 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/android/config.gni") import("//build/config/chrome_build.gni") import("//build/config/compiler/compiler.gni") import("//build/config/nacl/config.gni") import("//build/toolchain/cc_wrapper.gni") import("//build/toolchain/toolchain.gni") import("//build_overrides/build.gni") if (current_cpu == "arm" || current_cpu == "arm64") { import("//build/config/arm.gni") } if (current_cpu == "mipsel" || current_cpu == "mips64el") { import("//build/config/mips.gni") } if (is_mac) { import("//build/config/mac/symbols.gni") } declare_args() { # Default to warnings as errors for default workflow, where we catch # warnings with known toolchains. Allow overriding this e.g. for Chromium # builds on Linux that could use a different version of the compiler. # With GCC, warnings in no-Chromium code are always not treated as errors. treat_warnings_as_errors = true # Normally, Android builds are lightly optimized, even for debug builds, to # keep binary size down. Setting this flag to true disables such optimization android_full_debug = false # Whether to use the binary binutils checked into third_party/binutils. # These are not multi-arch so cannot be used except on x86 and x86-64 (the # only two architectures that are currently checked in). Turn this off when # you are using a custom toolchain and need to control -B in cflags. linux_use_bundled_binutils = linux_use_bundled_binutils_override && is_linux && (current_cpu == "x64" || current_cpu == "x86") binutils_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin", root_build_dir) # Compile in such a way as to make it possible for the profiler to unwind full # stack frames. Setting this flag has a large effect on the performance of the # generated code than just setting profiling, but gives the profiler more # information to analyze. # Requires profiling to be set to true. enable_full_stack_frames_for_profiling = false # When we are going to use gold we need to find it. # This is initialized below, after use_gold might have been overridden. gold_path = false if (is_win) { # Whether the VS xtree header has been patched to disable warning 4702. If # it has, then we don't need to disable 4702 (unreachable code warning). # The patch is preapplied to the internal toolchain and hence all bots. msvs_xtree_patched = false } # Omit unwind support in official builds to save space. # We can use breakpad for these builds. exclude_unwind_tables = is_chrome_branded && is_official_build # If true, gold linker will save symbol table inside object files. # This speeds up gdb startup by 60% gdb_index = false # If true, optimize for size. Does not affect windows builds. # Linux & Mac favor speed over size. # TODO(brettw) it's weird that Mac and desktop Linux are different. We should # explore favoring size over speed in this case as well. optimize_for_size = is_android || is_ios # Enable fatal linker warnings. Building Chromium with certain versions # of binutils can cause linker warning. # See: https://bugs.chromium.org/p/chromium/issues/detail?id=457359 fatal_linker_warnings = true # AFDO (Automatic Feedback Directed Optimizer) is a form of profile-guided # optimization that GCC supports. It used by ChromeOS in their official # builds. To use it, set auto_profile_path to the path to a file containing # the needed gcov profiling data. auto_profile_path = "" # Optimize for coverage guided fuzzing (balance between speed and number of # branches) optimize_for_fuzzing = false } if (is_clang && !is_nacl) { update_args = [ "--print-revision" ] if (llvm_force_head_revision) { update_args += [ "--llvm-force-head-revision" ] } clang_revision = exec_script("//tools/clang/scripts/update.py", update_args, "trim string") } # Apply the default logic for these values if they were not set explicitly. if (gold_path == false) { if (use_gold) { gold_path = rebase_path("//third_party/binutils/Linux_x64/Release/bin", root_build_dir) } else { gold_path = "" } } if (use_debug_fission == "default") { use_debug_fission = is_debug && !is_win && use_gold && linux_use_bundled_binutils && cc_wrapper == "" } # default_include_dirs --------------------------------------------------------- # # This is a separate config so that third_party code (which would not use the # source root and might have conflicting versions of some headers) can remove # this and specify their own include paths. config("default_include_dirs") { include_dirs = [ "//", root_gen_dir, ] } # compiler --------------------------------------------------------------------- # # Base compiler configuration. # # See also "runtime_library" below for related stuff and a discussion about # where stuff should go. Put warning related stuff in the "warnings" config. config("compiler") { asmflags = [] cflags = [] cflags_c = [] cflags_cc = [] cflags_objc = [] cflags_objcc = [] ldflags = [] defines = [] configs = [] # System-specific flags. If your compiler flags apply to one of the # categories here, add it to the associated file to keep this shared config # smaller. if (is_win) { configs += [ "//build/config/win:compiler" ] } else if (is_android) { configs += [ "//build/config/android:compiler" ] } else if (is_linux) { configs += [ "//build/config/linux:compiler" ] } else if (is_nacl) { configs += [ "//build/config/nacl:compiler" ] } else if (is_ios || is_mac) { configs += [ "//build/config/mac:compiler" ] } # Applies to all Posix systems. if (is_posix) { configs += [ "//build/config/posix:compiler" ] } # See the definitions below. configs += [ ":compiler_cpu_abi", ":compiler_codegen", ] # In general, Windows is totally different, but all the other builds share # some common GCC configuration. if (!is_win) { # Common GCC compiler flags setup. # -------------------------------- cflags += [ "-fno-strict-aliasing" ] # See http://crbug.com/32204 cflags_cc += [ # If this is removed then remove the corresponding /Zc:threadSafeInit- for # Windows. "-fno-threadsafe-statics", # Not exporting C++ inline functions can generally be applied anywhere # so we do so here. Normal function visibility is controlled by # //build/config/gcc:symbol_visibility_hidden. "-fvisibility-inlines-hidden", ] # Stack protection. if (is_mac) { # The strong variant of the stack protector significantly increases # binary size, so only enable it in debug mode. if (is_debug) { cflags += [ "-fstack-protector-strong" ] } else { cflags += [ "-fstack-protector" ] } } else if (is_posix && !is_chromeos && !is_nacl) { # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it. # See also https://crbug.com/533294 cflags += [ "--param=ssp-buffer-size=4" ] # The x86 toolchain currently has problems with stack-protector. if (is_android && current_cpu == "x86") { cflags += [ "-fno-stack-protector" ] } else { cflags += [ "-fstack-protector" ] } } # Linker warnings. if (fatal_linker_warnings && !(is_chromeos && current_cpu == "arm") && !(is_android && use_order_profiling) && !is_mac && !is_ios) { # TODO(jochen): Enable this on chromeos on arm. http://crbug.com/356580 # TODO(lizeb,pasko): Fix link errors when linking with order_profiling=1 # crbug.com/485542 ldflags += [ "-Wl,--fatal-warnings" ] } } if (is_clang && is_debug) { # Allow comparing the address of references and 'this' against 0 # in debug builds. Technically, these can never be null in # well-defined C/C++ and Clang can optimize such checks away in # release builds, but they may be used in asserts in debug builds. cflags_cc += [ "-Wno-undefined-bool-conversion", "-Wno-tautological-undefined-compare", ] } if (is_clang && !is_nacl) { # This is here so that all files get recompiled after a clang roll and # when turning clang on or off. (defines are passed via the command line, # and build system rebuild things when their commandline changes). Nothing # should ever read this define. defines += [ "CR_CLANG_REVISION=$clang_revision" ] } # Non-Mac Posix compiler flags setup. # ----------------------------------- if (is_posix && !(is_mac || is_ios)) { if (enable_profiling) { if (!is_debug) { cflags += [ "-g" ] if (enable_full_stack_frames_for_profiling) { cflags += [ "-fno-inline", "-fno-optimize-sibling-calls", ] } } } defines += [ "_FILE_OFFSET_BITS=64" ] if (!is_android) { defines += [ "_LARGEFILE_SOURCE", "_LARGEFILE64_SOURCE", ] } if (!is_nacl) { if (exclude_unwind_tables) { cflags += [ "-fno-unwind-tables", "-fno-asynchronous-unwind-tables", ] defines += [ "NO_UNWIND_TABLES" ] } else { cflags += [ "-funwind-tables" ] } } } # Linux/Android common flags setup. # --------------------------------- if (is_linux || is_android) { cflags += [ "-fPIC", "-pipe", # Use pipes for communicating between sub-processes. Faster. ] ldflags += [ "-fPIC", "-Wl,-z,noexecstack", "-Wl,-z,now", "-Wl,-z,relro", ] if (!using_sanitizer) { if (!use_cfi_diag) { ldflags += [ "-Wl,-z,defs" ] } # Functions interposed by the sanitizers can make ld think # that some libraries aren't needed when they actually are, # http://crbug.com/234010. As workaround, disable --as-needed. if (!is_nacl && !is_android) { # TODO(pcc): Fix linker bug which requires us to link pthread # unconditionally here (crbug.com/623236). ldflags += [ "-Wl,--no-as-needed", "-lpthread", ] } ldflags += [ "-Wl,--as-needed" ] } } # Linux-specific compiler flags setup. # ------------------------------------ if (is_android && is_clang) { _rebased_android_toolchain_root = rebase_path(android_toolchain_root, root_build_dir) # Let clang find the linker in the NDK. ldflags += [ "--gcc-toolchain=$_rebased_android_toolchain_root" ] } if (is_posix && use_lld && !is_nacl) { ldflags += [ "-fuse-ld=lld" ] } else if (use_gold) { ldflags += [ "-fuse-ld=gold" ] if (is_android) { # Use -mstackrealign due to a bug on ia32 Jelly Bean. # See crbug.com/521527 if (current_cpu == "x86") { cflags += [ "-mstackrealign" ] } } else { # On Android, this isn't needed. gcc in the NDK knows to look next to # it with -fuse-ld=gold, and clang gets a --gcc-toolchain flag passed # above. ldflags += [ "-B$gold_path" ] if (linux_use_bundled_binutils) { ldflags += [ # Experimentation found that using four linking threads # saved ~20% of link time. # https://groups.google.com/a/chromium.org/group/chromium-dev/browse_thread/thread/281527606915bb36 # Only apply this to the target linker, since the host # linker might not be gold, but isn't used much anyway. "-Wl,--threads", "-Wl,--thread-count=4", ] } } if (gdb_index) { ldflags += [ "-Wl,--gdb-index" ] } # TODO(thestig): Make this flag work with GN. #if (!is_official_build && !is_chromeos && !(is_asan || is_lsan || is_tsan || is_msan)) { # ldflags += [ # "-Wl,--detect-odr-violations", # ] #} } else if (linux_use_bundled_binutils) { # Gold is the default linker for the bundled binutils so we explicitly # enable the bfd linker when use_gold is not set. ldflags += [ "-fuse-ld=bfd" ] } if (is_posix && (use_gold || (use_lld && !is_nacl)) && !using_sanitizer && !(is_android && use_order_profiling)) { # TODO(crbug.com/576197) - gcc on x86 platforms + gold + icf=all # doesn't currently work on non-chromeos platforms. # Additionally, on Android x86 --icf=safe seems to cause issues as well. # Additionally, on cast Android x86, --icf=all causes issues. if (is_android && current_cpu == "x86") { ldflags += [ "-Wl,--icf=none" ] } else if ((is_clang && !is_android) || is_chromeos || (current_cpu != "x86" && current_cpu != "x64")) { # TODO(thakis): Remove `!is_android` above once our gold has been rolled # with the fix for https://sourceware.org/bugzilla/show_bug.cgi?id=17704 # merged. See also https://crbug.com/663886 ldflags += [ "-Wl,--icf=all" ] } else if (!is_android || is_clang) { ldflags += [ "-Wl,--icf=safe" ] } } if (linux_use_bundled_binutils) { cflags += [ "-B$binutils_path" ] } # Clang-specific compiler flags setup. # ------------------------------------ if (is_clang) { cflags += [ "-fcolor-diagnostics" ] } # Print absolute paths in diagnostics. There is no precedent for doing this # on Linux/Mac (GCC doesn't support it), but MSVC does this with /FC and # Windows developers rely on it (crbug.com/636109) so only do this on Windows. if (is_clang && is_win) { cflags += [ "-fdiagnostics-absolute-paths" ] } # Makes builds independent of absolute file path. # clang-cl (used if is_win) doesn't expose this flag. # Currently disabled for nacl since its toolchain lacks this flag (too old). # TODO(zforman): Once nacl's toolchain is updated, remove check. if (is_clang && is_linux) { absolute_path = rebase_path("//.") cflags += [ "-fdebug-prefix-map=$absolute_path=." ] } # C++11 compiler flags setup. # --------------------------- if (is_linux || is_android || (is_nacl && is_clang)) { # gnu++11 instead of c++11 is needed because some code uses typeof() (a # GNU extension). # TODO(thakis): Eventually switch this to c++11 instead, # http://crbug.com/427584 cflags_cc += [ "-std=gnu++11" ] } else if (!is_win && !is_nacl) { # TODO(mcgrathr) - the NaCl GCC toolchain doesn't support either gnu++11 # or c++11; we technically don't need this toolchain any more, but there # are still a few buildbots using it, so until those are turned off # we need the !is_nacl clause and the (is_nacl && is_clang) clause, above. cflags_cc += [ "-std=c++11" ] } if (is_mac) { cflags_cc += [ "-stdlib=libc++" ] ldflags += [ "-stdlib=libc++" ] } # Add flags for link-time optimization. These flags enable # optimizations/transformations that require whole-program visibility at link # time, so they need to be applied to all translation units, and we may end up # with miscompiles if only part of the program is compiled with LTO flags. For # that reason, we cannot allow targets to enable or disable these flags, for # example by disabling the optimize configuration. # TODO(pcc): Make this conditional on is_official_build rather than on gn # flags for specific features. if (!is_debug && (allow_posix_link_time_opt || is_cfi) && !is_nacl) { if (use_thin_lto) { cflags += [ "-flto=thin" ] ldflags += [ "-flto=thin" ] # Limit the parallelism to avoid too agressive competition between # linker jobs. This is still suboptimal to a potential dynamic # resource allocation scheme, but should be good enough. if (use_lld) { ldflags += [ "-Wl,--thinlto-jobs=8" ] } else { ldflags += [ "-Wl,-plugin-opt,jobs=8" ] } } else { # Note: ThinLTO does not currently have this feature implemented # For Full LTO, it provides a measurable runtime speedup of Chrome. cflags += [ "-flto", "-fwhole-program-vtables", ] ldflags += [ "-flto", "-fwhole-program-vtables", ] # Apply a lower LTO optimization level as the default is too slow. if (is_linux) { if (use_lld) { ldflags += [ "-Wl,--lto-O1" ] } else { ldflags += [ "-Wl,-plugin-opt,O1" ] } } else if (is_mac) { ldflags += [ "-Wl,-mllvm,-O1" ] } } # Work-around for http://openradar.appspot.com/20356002 if (is_mac) { ldflags += [ "-Wl,-all_load" ] } # Allows the linker to apply ICF to the LTO object file. Also, when # targeting ARM, without this flag, LTO produces a .text section that is # larger than the maximum call displacement, preventing the linker from # relocating calls (http://llvm.org/PR22999). if (is_linux) { ldflags += [ "-Wl,-plugin-opt,-function-sections" ] } } # Pass the same C/C++ flags to the objective C/C++ compiler. cflags_objc += cflags_c cflags_objcc += cflags_cc # Assign any flags set for the C compiler to asmflags so that they are sent # to the assembler. The Windows assembler takes different types of flags # so only do so for posix platforms. if (is_posix) { asmflags += cflags asmflags += cflags_c } } # This is separate from :compiler (and not even a sub-config there) # so that some targets can remove it from the list with: # configs -= [ "//build/config/compiler:pthread" ] config("pthread") { if (is_linux) { cflags = [ "-pthread" ] ldflags = [ "-pthread" ] } } # This provides the basic options to select the target CPU and ABI. # It is factored out of "compiler" so that special cases can use this # without using everything that "compiler" brings in. Options that # tweak code generation for a particular CPU do not belong here! # See "compiler_codegen", below. config("compiler_cpu_abi") { cflags = [] ldflags = [] if (is_posix && !(is_mac || is_ios)) { # CPU architecture. We may or may not be doing a cross compile now, so for # simplicity we always explicitly set the architecture. if (current_cpu == "x64") { cflags += [ "-m64", "-march=x86-64", ] ldflags += [ "-m64" ] } else if (current_cpu == "x86") { cflags += [ "-m32" ] ldflags += [ "-m32" ] if (!is_nacl) { cflags += [ "-msse2", "-mfpmath=sse", "-mmmx", ] } } else if (current_cpu == "arm") { if (is_clang && !is_android && !is_nacl) { cflags += [ "--target=arm-linux-gnueabihf" ] ldflags += [ "--target=arm-linux-gnueabihf" ] } if (!is_nacl) { cflags += [ "-march=$arm_arch", "-mfloat-abi=$arm_float_abi", ] } if (arm_tune != "") { cflags += [ "-mtune=$arm_tune" ] } } else if (current_cpu == "arm64") { if (is_clang && !is_android && !is_nacl) { cflags += [ "--target=aarch64-linux-gnu" ] ldflags += [ "--target=aarch64-linux-gnu" ] } } else if (current_cpu == "mipsel" && !is_nacl) { if (mips_arch_variant == "r6") { if (is_clang) { cflags += [ "--target=mipsel-linux-gnu", "-march=mips32r6", ] ldflags += [ "--target=mipsel-linux-gnu" ] } else { cflags += [ "-mips32r6", "-Wa,-mips32r6", ] if (is_android) { ldflags += [ "-mips32r6", "-Wl,-melf32ltsmip", ] } } if (mips_use_msa == true) { cflags += [ "-mmsa", "-mfp64", ] } } else if (mips_arch_variant == "r2") { if (is_clang) { if (is_android) { cflags += [ "--target=mipsel-linux-android", "-march=mipsel", "-mcpu=mips32r2", ] ldflags += [ "--target=mipsel-linux-android" ] } else { cflags += [ "--target=mipsel-linux-gnu", "-march=mipsel", "-mcpu=mips32r2", ] ldflags += [ "--target=mipsel-linux-gnu" ] } } else { cflags += [ "-mips32r2", "-Wa,-mips32r2", ] if (mips_float_abi == "hard" && mips_fpu_mode != "") { cflags += [ "-m$mips_fpu_mode" ] } } } else if (mips_arch_variant == "r1") { if (is_clang) { if (is_android) { cflags += [ "--target=mipsel-linux-android", "-march=mipsel", "-mcpu=mips32", ] ldflags += [ "--target=mipsel-linux-android" ] } else { cflags += [ "--target=mipsel-linux-gnu", "-march=mipsel", "-mcpu=mips32", ] ldflags += [ "--target=mipsel-linux-gnu" ] } } else { cflags += [ "-mips32", "-Wa,-mips32", ] } } if (mips_dsp_rev == 1) { cflags += [ "-mdsp" ] } else if (mips_dsp_rev == 2) { cflags += [ "-mdspr2" ] } cflags += [ "-m${mips_float_abi}-float" ] } else if (current_cpu == "mips64el") { if (mips_arch_variant == "r6") { if (is_clang) { if (is_android) { cflags += [ "--target=mips64el-linux-android", "-march=mips64el", "-mcpu=mips64r6", ] ldflags += [ "--target=mips64el-linux-android" ] } } else { cflags += [ "-mips64r6", "-Wa,-mips64r6", ] ldflags += [ "-mips64r6" ] } if (mips_use_msa == true) { cflags += [ "-mmsa", "-mfp64", ] } } else if (mips_arch_variant == "r2") { cflags += [ "-mips64r2", "-Wa,-mips64r2", ] ldflags += [ "-mips64r2" ] } } else if (current_cpu == "pnacl" && is_nacl_nonsfi) { if (target_cpu == "x86" || target_cpu == "x64") { cflags += [ "-arch", "x86-32-nonsfi", "--pnacl-bias=x86-32-nonsfi", "--target=i686-unknown-nacl", ] ldflags += [ "-arch", "x86-32-nonsfi", "--target=i686-unknown-nacl", ] } else if (target_cpu == "arm") { cflags += [ "-arch", "arm-nonsfi", "-mfloat-abi=hard", "--pnacl-bias=arm-nonsfi", "--target=armv7-unknown-nacl-gnueabihf", ] ldflags += [ "-arch", "arm-nonsfi", "--target=armv7-unknown-nacl-gnueabihf", ] } } } asmflags = cflags } # This provides options to tweak code generation that are necessary # for particular Chromium code or for working around particular # compiler bugs (or the combination of the two). config("compiler_codegen") { configs = [] cflags = [] if (is_nacl) { configs += [ "//build/config/nacl:compiler_codegen" ] } else if (is_posix && !is_mac && !is_ios) { if (current_cpu == "x86") { if (is_clang) { cflags += [ # Else building libyuv gives clang's register allocator issues, # see llvm.org/PR15798 / crbug.com/233709 "-momit-leaf-frame-pointer", ] } } else if (current_cpu == "arm") { if (is_android && !is_clang) { # Clang doesn't support these flags. cflags += [ # The tree-sra optimization (scalar replacement for # aggregates enabling subsequent optimizations) leads to # invalid code generation when using the Android NDK's # compiler (r5-r7). This can be verified using # webkit_unit_tests' WTF.Checked_int8_t test. "-fno-tree-sra", # The following option is disabled to improve binary # size and performance in gcc 4.9. "-fno-caller-saves", ] } } } asmflags = cflags } # This is separate from :compiler_codegen (and not even a sub-config there) # so that some targets can remove it from the list with: # configs -= [ "//build/config/compiler:clang_stackrealign" ] # See https://crbug.com/556393 for details of where it must be avoided. config("clang_stackrealign") { if (is_clang && current_cpu == "x86" && is_linux) { cflags = [ # Align the stack on 16-byte boundaries, http://crbug.com/418554. "-mstack-alignment=16", "-mstackrealign", ] } } config("compiler_arm_fpu") { if (current_cpu == "arm" && !is_ios && !is_nacl) { cflags = [ "-mfpu=$arm_fpu" ] asmflags = cflags } } config("compiler_arm_thumb") { if (current_cpu == "arm" && arm_use_thumb && is_posix && !(is_mac || is_ios || is_nacl)) { cflags = [ "-mthumb" ] if (is_android && !is_clang) { # Clang doesn't support this option. cflags += [ "-mthumb-interwork" ] } } } config("compiler_arm") { if (current_cpu == "arm" && is_chromeos) { # arm is normally the default mode for clang, but on chromeos a wrapper # is used to pass -mthumb, and therefor change the default. cflags = [ "-marm" ] } } # runtime_library ------------------------------------------------------------- # # Sets the runtime library and associated options. # # How do you determine what should go in here vs. "compiler" above? Consider if # a target might choose to use a different runtime library (ignore for a moment # if this is possible or reasonable on your system). If such a target would want # to change or remove your option, put it in the runtime_library config. If a # target wants the option regardless, put it in the compiler config. config("runtime_library") { defines = [] configs = [] # System-specific flags. If your compiler flags apply to one of the # categories here, add it to the associated file to keep this shared config # smaller. if (is_win) { configs += [ "//build/config/win:runtime_library" ] } else if (is_linux) { configs += [ "//build/config/linux:runtime_library" ] } else if (is_ios) { configs += [ "//build/config/ios:runtime_library" ] } else if (is_mac) { configs += [ "//build/config/mac:runtime_library" ] } else if (is_android) { configs += [ "//build/config/android:runtime_library" ] } if (is_posix) { configs += [ "//build/config/posix:runtime_library" ] } if (is_component_build) { defines += [ "COMPONENT_BUILD" ] } } # default_warnings ------------------------------------------------------------ # # Collects all warning flags that are used by default. This is used as a # subconfig of both chromium_code and no_chromium_code. This way these # flags are guaranteed to appear on the compile command line after -Wall. config("default_warnings") { cflags = [] cflags_cc = [] if (is_win) { if (treat_warnings_as_errors) { cflags += [ "/WX" ] } cflags += [ # Warnings permanently disabled: # C4091: 'typedef ': ignored on left of 'X' when no variable is # declared. # This happens in a number of Windows headers. Dumb. "/wd4091", # C4127: conditional expression is constant # This warning can in theory catch dead code and other problems, but # triggers in far too many desirable cases where the conditional # expression is either set by macros or corresponds some legitimate # compile-time constant expression (due to constant template args, # conditionals comparing the sizes of different types, etc.). Some of # these can be worked around, but it's not worth it. "/wd4127", # C4251: 'identifier' : class 'type' needs to have dll-interface to be # used by clients of class 'type2' # This is necessary for the shared library build. "/wd4251", # C4351: new behavior: elements of array 'array' will be default # initialized # This is a silly "warning" that basically just alerts you that the # compiler is going to actually follow the language spec like it's # supposed to, instead of not following it like old buggy versions did. # There's absolutely no reason to turn this on. "/wd4351", # C4355: 'this': used in base member initializer list # It's commonly useful to pass |this| to objects in a class' initializer # list. While this warning can catch real bugs, most of the time the # constructors in question don't attempt to call methods on the passed-in # pointer (until later), and annotating every legit usage of this is # simply more hassle than the warning is worth. "/wd4355", # C4503: 'identifier': decorated name length exceeded, name was # truncated # This only means that some long error messages might have truncated # identifiers in the presence of lots of templates. It has no effect on # program correctness and there's no real reason to waste time trying to # prevent it. "/wd4503", # Warning C4589 says: "Constructor of abstract class ignores # initializer for virtual base class." Disable this warning because it # is flaky in VS 2015 RTM. It triggers on compiler generated # copy-constructors in some cases. "/wd4589", # C4611: interaction between 'function' and C++ object destruction is # non-portable # This warning is unavoidable when using e.g. setjmp/longjmp. MSDN # suggests using exceptions instead of setjmp/longjmp for C++, but # Chromium code compiles without exception support. We therefore have to # use setjmp/longjmp for e.g. JPEG decode error handling, which means we # have to turn off this warning (and be careful about how object # destruction happens in such cases). "/wd4611", # Warnings to evaluate and possibly fix/reenable later: "/wd4100", # Unreferenced formal function parameter. "/wd4121", # Alignment of a member was sensitive to packing. "/wd4244", # Conversion: possible loss of data. "/wd4505", # Unreferenced local function has been removed. "/wd4510", # Default constructor could not be generated. "/wd4512", # Assignment operator could not be generated. "/wd4610", # Class can never be instantiated, constructor required. "/wd4838", # Narrowing conversion. Doesn't seem to be very useful. "/wd4995", # 'X': name was marked as #pragma deprecated "/wd4996", # Deprecated function warning. # These are variable shadowing warnings that are new in VS2015. We # should work through these at some point -- they may be removed from # the RTM release in the /W4 set. "/wd4456", "/wd4457", "/wd4458", "/wd4459", ] cflags += [ # C4312 is a VS 2015 64-bit warning for integer to larger pointer. # TODO(brucedawson): fix warnings, crbug.com/554200 "/wd4312", ] if (current_cpu == "x86") { cflags += [ # VC++ 2015 changes 32-bit size_t truncation warnings from 4244 to # 4267. Example: short TruncTest(size_t x) { return x; } # Since we disable 4244 we need to disable 4267 during migration. # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. "/wd4267", ] } # VS xtree header file needs to be patched or 4702 (unreachable code # warning) is reported if _HAS_EXCEPTIONS=0. Disable the warning if xtree is # not patched. if (!msvs_xtree_patched && exec_script("../../win_is_xtree_patched.py", [], "value") == 0) { cflags += [ "/wd4702" ] # Unreachable code. } # Building with Clang on Windows is a work in progress and very # experimental. See crbug.com/82385. if (is_clang) { cflags += [ # TODO(hans): Make this list shorter eventually, http://crbug.com/504657 "-Wno-microsoft-enum-value", # http://crbug.com/505296 "-Wno-unknown-pragmas", # http://crbug.com/505314 "-Wno-microsoft-cast", # http://crbug.com/550065 ] } } else { if (is_mac && !is_nacl) { # When compiling Objective-C, warns if a method is used whose # availability is newer than the deployment target. This is not # required when compiling Chrome for iOS. cflags += [ "-Wpartial-availability" ] } # Suppress warnings about ABI changes on ARM (Clang doesn't give this # warning). if (current_cpu == "arm" && !is_clang) { cflags += [ "-Wno-psabi" ] } if (!is_clang) { cflags_cc += [ # See comment for -Wno-c++11-narrowing. "-Wno-narrowing", ] # Don't warn about the "typedef 'foo' locally defined but not used" # for gcc 4.8. # TODO: remove this flag once all builds work. See crbug.com/227506 cflags += [ "-Wno-unused-local-typedefs" ] # Don't warn about "maybe" uninitialized. Clang doesn't include this # in -Wall but gcc does, and it gives false positives. cflags += [ "-Wno-maybe-uninitialized" ] } } # Common Clang and GCC warning setup. if (!is_win || is_clang) { cflags += [ # Disables. "-Wno-missing-field-initializers", # "struct foo f = {0};" "-Wno-unused-parameter", # Unused function parameters. ] } if (is_chromeos) { # TODO(thakis): Remove, http://crbug.com/263960 if (is_clang) { cflags_cc += [ "-Wno-reserved-user-defined-literal" ] } else { cflags_cc += [ "-Wno-literal-suffix" ] } } if (is_clang) { cflags += [ # TODO(thakis): Consider -Wloop-analysis (turns on # -Wrange-loop-analysis too). # This warns on using ints as initializers for floats in # initializer lists (e.g. |int a = f(); CGSize s = { a, a };|), # which happens in several places in chrome code. Not sure if # this is worth fixing. "-Wno-c++11-narrowing", # Warns on switches on enums that cover all enum values but # also contain a default: branch. Chrome is full of that. "-Wno-covered-switch-default", # Clang considers the `register` keyword as deprecated, but e.g. # code generated by flex (used in angle) contains that keyword. # http://crbug.com/255186 "-Wno-deprecated-register", # TODO(thakis): This used to be implied by -Wno-unused-function, # which we no longer use. Check if it makes sense to remove # this as well. http://crbug.com/316352 "-Wno-unneeded-internal-declaration", # TODO(hans): Get this cleaned up, http://crbug.com/428099 "-Wno-inconsistent-missing-override", ] # Chrome's hermetic Clang compiler, NaCl's Clang compiler and Xcode's Clang # compiler will almost always have different versions. Certain flags may not # be recognized by one version or the other. if (!is_nacl) { # Flags NaCl (Clang 3.7) does not recognize. cflags += [ # TODO(thakis): Enable this, crbug.com/507717 "-Wno-shift-negative-value", ] } if (!is_nacl && !use_xcode_clang) { # Flags NaCl (Clang 3.7) and Xcode 7.3 (Clang clang-703.0.31) do not # recognize. cflags += [ # TODO(thakis): https://crbug.com/604888 "-Wno-undefined-var-template", # TODO(thakis): https://crbug.com/617318 "-Wno-nonportable-include-path", # TODO(hans): https://crbug.com/637306 "-Wno-address-of-packed-member", ] } } } # chromium_code --------------------------------------------------------------- # # Toggles between higher and lower warnings for code that is (or isn't) # part of Chromium. config("chromium_code") { if (is_win) { cflags = [ "/W4" ] # Warning level 4. # Assume UTF-8 by default to avoid code page dependencies. cflags += [ "/utf-8" ] } else { cflags = [ "-Wall" ] if (treat_warnings_as_errors) { cflags += [ "-Werror" ] # The compiler driver can sometimes (rarely) emit warnings before calling # the actual linker. Make sure these warnings are treated as errors as # well. ldflags = [ "-Werror" ] } if (is_clang) { # Enable -Wextra for chromium_code when we control the compiler. cflags += [ "-Wextra" ] } # In Chromium code, we define __STDC_foo_MACROS in order to get the # C99 macros on Mac and Linux. defines = [ "__STDC_CONSTANT_MACROS", "__STDC_FORMAT_MACROS", ] if (!is_debug && !using_sanitizer && (!is_linux || !is_clang || is_official_build)) { # _FORTIFY_SOURCE isn't really supported by Clang now, see # http://llvm.org/bugs/show_bug.cgi?id=16821. # It seems to work fine with Ubuntu 12 headers though, so use it in # official builds. # # Non-chromium code is not guaranteed to compile cleanly with # _FORTIFY_SOURCE. Also, fortified build may fail when optimizations are # disabled, so only do that for Release build. defines += [ "_FORTIFY_SOURCE=2" ] } if (is_mac || is_ios) { cflags_objc = [ "-Wobjc-missing-property-synthesis" ] cflags_objcc = [ "-Wobjc-missing-property-synthesis" ] } } configs = [ ":default_warnings" ] } config("no_chromium_code") { cflags = [] cflags_cc = [] defines = [] if (is_win) { cflags += [ "/W3", # Warning level 3. "/wd4800", # Disable warning when forcing value to bool. "/wd4267", # TODO(jschuh): size_t to int. "/wd4996", # Deprecated function warning. ] defines += [ "_CRT_NONSTDC_NO_WARNINGS", "_CRT_NONSTDC_NO_DEPRECATE", ] } else { # GCC may emit unsuppressible warnings so don't add -Werror for no chromium # code. crbug.com/589724 if (treat_warnings_as_errors && is_clang) { cflags += [ "-Werror" ] ldflags = [ "-Werror" ] } if (is_clang && !is_nacl) { # TODO(thakis): Remove !is_nacl once # https://codereview.webrtc.org/1552863002/ made its way into chromium. cflags += [ "-Wall" ] } } if (is_clang) { cflags += [ # Lots of third-party libraries have unused variables. Instead of # suppressing them individually, we just blanket suppress them here. "-Wno-unused-variable", ] } if (is_linux || is_android) { cflags_cc += [ # Don't warn about hash_map in third-party code. "-Wno-deprecated", ] } configs = [ ":default_warnings" ] } # rtti ------------------------------------------------------------------------ # # Allows turning Run-Time Type Identification on or off. config("rtti") { if (is_win) { cflags_cc = [ "/GR" ] } else { cflags_cc = [ "-frtti" ] } } config("no_rtti") { # CFI diagnostics and UBsan vptr require RTTI. if (!use_cfi_diag && !is_ubsan_vptr && !is_ubsan_security) { if (is_win) { cflags_cc = [ "/GR-" ] } else { cflags_cc = [ "-fno-rtti" ] cflags_objcc = cflags_cc } } } # Warnings --------------------------------------------------------------------- # This will generate warnings when using Clang if code generates exit-time # destructors, which will slow down closing the program. # TODO(thakis): Make this a blacklist instead, http://crbug.com/101600 config("wexit_time_destructors") { # TODO: Enable on Windows too, http://crbug.com/404525 if (is_clang && !is_win) { cflags = [ "-Wexit-time-destructors" ] } } # On Windows compiling on x64, VC will issue a warning when converting # size_t to int because it will truncate the value. Our code should not have # these warnings and one should use a static_cast or a checked_cast for the # conversion depending on the case. However, a lot of code still needs to be # fixed. Apply this config to such targets to disable the warning. # # Note that this can be applied regardless of platform and architecture to # clean up the call sites. This will only apply the flag when necessary. # # TODO(jschuh): crbug.com/167187 fix this and delete this config. config("no_size_t_to_int_warning") { if (is_win && current_cpu == "x64") { cflags = [ "/wd4267" ] } } # Some code presumes that pointers to structures/objects are compatible # regardless of whether what they point to is already known to be valid. # gcc 4.9 and earlier had no way of suppressing this warning without # supressing the rest of them. Here we centralize the identification of # the gcc 4.9 toolchains. config("no_incompatible_pointer_warnings") { cflags = [] if (is_clang) { cflags += [ "-Wno-incompatible-pointer-types" ] } else if (current_cpu == "mipsel") { cflags += [ "-w" ] } else if (is_chromeos && current_cpu == "arm") { cflags += [ "-w" ] } } # Optimization ----------------------------------------------------------------- # # The BUILDCONFIG file sets the "default_optimization" config on targets by # default. It will be equivalent to either "optimize" (release) or # "no_optimize" (debug) optimization configs. # # You can override the optimization level on a per-target basis by removing the # default config and then adding the named one you want: # # configs -= [ "//build/config/compiler:default_optimization" ] # configs += [ "//build/config/compiler:optimize_max" ] # Shared settings for both "optimize" and "optimize_max" configs. # IMPORTANT: On Windows "/O1" and "/O2" must go before the common flags. if (is_win) { common_optimize_on_cflags = [ "/Ob2", # Both explicit and auto inlining. "/Oy-", # Disable omitting frame pointers, must be after /O2. "/d2Zi+", # Improve debugging of optimized code. "/Zc:inline", # Remove unreferenced COMDAT (faster links). ] if (!is_asan) { common_optimize_on_cflags += [ # Put data in separate COMDATs. This allows the linker # to put bit-identical constants at the same address even if # they're unrelated constants, which saves binary size. # This optimization can't be used when ASan is enabled because # it is not compatible with the ASan ODR checker. "/Gw", ] } common_optimize_on_ldflags = [] if (!is_component_build) { common_optimize_on_ldflags += [ "/OPT:ICF" ] # Redundant COMDAT folding. } if (is_official_build) { common_optimize_on_ldflags += [ "/OPT:REF" ] # Remove unreferenced data. if (!use_lld) { common_optimize_on_ldflags += [ # Set the number of LTCG code-gen threads to eight. The default is four. # This gives a 5-10% link speedup. "/cgthreads:8", ] if (use_incremental_wpo) { # Incremental Link-time code generation. common_optimize_on_ldflags += [ "/LTCG:INCREMENTAL" ] } else { common_optimize_on_ldflags += [ "/LTCG" ] # Link-time code generation. } } if (full_wpo_on_official) { if (use_incremental_wpo) { arflags = [ "/LTCG:INCREMENTAL" ] } else { arflags = [ "/LTCG" ] } } } } else { common_optimize_on_cflags = [] common_optimize_on_ldflags = [] if (is_android) { # TODO(jdduke) Re-enable on mips after resolving linking # issues with libc++ (crbug.com/456380). if (current_cpu != "mipsel" && current_cpu != "mips64el") { common_optimize_on_ldflags += [ # Warn in case of text relocations. "-Wl,--warn-shared-textrel", ] } } if (is_mac || is_ios) { if (symbol_level == 2) { # Mac dead code stripping requires symbols. common_optimize_on_ldflags += [ "-Wl,-dead_strip" ] } } else { # Non-Mac Posix flags. common_optimize_on_cflags += [ # Don't emit the GCC version ident directives, they just end up in the # .comment section taking up binary size. "-fno-ident", # Put data and code in their own sections, so that unused symbols # can be removed at link time with --gc-sections. "-fdata-sections", "-ffunction-sections", ] common_optimize_on_ldflags += [ # Specifically tell the linker to perform optimizations. # See http://lwn.net/Articles/192624/ . "-Wl,-O1", "-Wl,--gc-sections", ] } } config("default_stack_frames") { if (is_posix && !(is_mac || is_ios)) { if (using_sanitizer || enable_profiling || is_debug || current_cpu == "arm64") { # Explicitly ask for frame pointers, otherwise: # * Stacks may be missing for sanitizer and profiling builds. # * Debug tcmalloc can crash (crbug.com/636489). # * Stacks may be missing for arm64 crash dumps (crbug.com/391706). cflags = [ "-fno-omit-frame-pointer" ] } else if (is_android) { cflags = [ "-fomit-frame-pointer" ] } } } # Default "optimization on" config. config("optimize") { if (is_win) { # TODO(thakis): Remove is_clang here, https://crbug.com/598772 if (is_official_build && full_wpo_on_official && !is_clang) { common_optimize_on_cflags += [ "/GL", # Whole program optimization. # Disable Warning 4702 ("Unreachable code") for the WPO/PGO builds. # Probably anything that this would catch that wouldn't be caught in a # normal build isn't going to actually be a bug, so the incremental # value of C4702 for PGO builds is likely very small. "/wd4702", ] } # Favor size over speed, /O1 must be before the common flags. The GYP # build also specifies /Os and /GF but these are implied by /O1. cflags = [ "/O1" ] + common_optimize_on_cflags + [ "/Oi" ] } else if (optimize_for_size) { # Favor size over speed. cflags = [ "-Os" ] + common_optimize_on_cflags } else { cflags = [ "-O2" ] + common_optimize_on_cflags } ldflags = common_optimize_on_ldflags } # Same config as 'optimize' but without the WPO flag. config("optimize_no_wpo") { if (is_win) { # Favor size over speed, /O1 must be before the common flags. The GYP # build also specifies /Os and /GF but these are implied by /O1. cflags = [ "/O1" ] + common_optimize_on_cflags + [ "/Oi" ] } else if (optimize_for_size) { # Favor size over speed. cflags = [ "-Os" ] + common_optimize_on_cflags } else if (optimize_for_fuzzing) { cflags = [ "-O1" ] + common_optimize_on_cflags } else { cflags = [ "-O2" ] + common_optimize_on_cflags } ldflags = common_optimize_on_ldflags } # Turn off optimizations. config("no_optimize") { if (is_win) { cflags = [ "/Od", # Disable optimization. "/Ob0", # Disable all inlining (on by default). ] } else if (is_android && !android_full_debug) { # On Android we kind of optimize some things that don't affect debugging # much even when optimization is disabled to get the binary size down. cflags = [ "-Os" ] } else { cflags = [ "-O0" ] ldflags = [] } } # Turns up the optimization level. On Windows, this implies whole program # optimization and link-time code generation which is very expensive and should # be used sparingly. config("optimize_max") { if (is_nacl_irt) { # The NaCl IRT is a special case and always wants its own config. # Various components do: # if (!is_debug) { # configs -= [ "//build/config/compiler:default_optimization" ] # configs += [ "//build/config/compiler:optimize_max" ] # } # So this config has to have the selection logic just like # "default_optimization", below. configs = [ "//build/config/nacl:irt_optimize" ] } else { ldflags = common_optimize_on_ldflags if (is_win) { # Favor speed over size, /O2 must be before the common flags. The GYP # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2. cflags = [ "/O2" ] + common_optimize_on_cflags if (is_official_build) { if (!is_clang) { cflags += [ "/GL", # Whole program optimization. # Disable Warning 4702 ("Unreachable code") for the WPO/PGO builds. # Probably anything that this would catch that wouldn't be caught # in a normal build isn't going to actually be a bug, so the # incremental value of C4702 for PGO builds is likely very small. "/wd4702", ] } else if (is_clang && use_lld) { cflags += [ "-flto" ] # Link-time optimization (whole program optimization). } } } else if (optimize_for_fuzzing) { cflags = [ "-O1" ] + common_optimize_on_cflags } else { cflags = [ "-O2" ] + common_optimize_on_cflags } } } # This config can be used to override the default settings for per-component # and whole-program optimization, optimizing the particular target for speed # instead of code size. This config is exactly the same as "optimize_max" # except that we use -O3 instead of -O2 on non-win, non-IRT platforms. # # TODO(crbug.com/621335) - rework how all of these configs are related # so that we don't need this disclaimer. config("optimize_speed") { if (is_nacl_irt) { # The NaCl IRT is a special case and always wants its own config. # Various components do: # if (!is_debug) { # configs -= [ "//build/config/compiler:default_optimization" ] # configs += [ "//build/config/compiler:optimize_max" ] # } # So this config has to have the selection logic just like # "default_optimization", below. configs = [ "//build/config/nacl:irt_optimize" ] } else { ldflags = common_optimize_on_ldflags if (is_win) { # Favor speed over size, /O2 must be before the common flags. The GYP # build also specifies /Ot, /Oi, and /GF, but these are implied by /O2. cflags = [ "/O2" ] + common_optimize_on_cflags # TODO(thakis): Remove is_clang here, https://crbug.com/598772 if (is_official_build && !is_clang) { cflags += [ "/GL", # Whole program optimization. # Disable Warning 4702 ("Unreachable code") for the WPO/PGO builds. # Probably anything that this would catch that wouldn't be caught in a # normal build isn't going to actually be a bug, so the incremental # value of C4702 for PGO builds is likely very small. "/wd4702", ] } } else if (optimize_for_fuzzing) { cflags = [ "-O1" ] + common_optimize_on_cflags } else { cflags = [ "-O3" ] + common_optimize_on_cflags } } } config("optimize_fuzzing") { cflags = [ "-O1" ] + common_optimize_on_cflags ldflags = common_optimize_on_ldflags visibility = [ ":default_optimization" ] } # The default optimization applied to all targets. This will be equivalent to # either "optimize" or "no_optimize", depending on the build flags. config("default_optimization") { if (is_nacl_irt) { # The NaCl IRT is a special case and always wants its own config. # It gets optimized the same way regardless of the type of build. configs = [ "//build/config/nacl:irt_optimize" ] } else if (is_debug) { configs = [ ":no_optimize" ] } else if (optimize_for_fuzzing) { assert(!is_win, "Fuzzing optimize level not supported on Windows") configs = [ ":optimize_fuzzing" ] } else { configs = [ ":optimize" ] } } # GCC supports a form of profile-guided optimization called AFDO, which # is used by ChromeOS in their official builds. However, # //base/allocator:tcmalloc currently doesn't work correctly with AFDO # so we provide separate config so that the flag can be disabled per-target. # TODO(crbug.com/633719): Remove this config once tcmalloc works with AFDO # or we remove tcmalloc or we stop using AFDO. config("afdo") { if (auto_profile_path != "" && current_toolchain == default_toolchain) { cflags = [ "-fauto-profile=${auto_profile_path}" ] } } # Symbols ---------------------------------------------------------------------- # The BUILDCONFIG file sets the "default_symbols" config on targets by # default. It will be equivalent to one the three specific symbol levels. # # You can override the symbol level on a per-target basis by removing the # default config and then adding the named one you want: # # configs -= [ "//build/config/compiler:default_symbols" ] # configs += [ "//build/config/compiler:symbols" ] # Full symbols. config("symbols") { if (is_win) { cflags = [ "/Zi" ] # Produce PDB file, no edit and continue. if (is_win_fastlink) { # Tell VS 2015+ to create a PDB that references debug # information in .obj and .lib files instead of copying # it all. This flag is incompatible with /PROFILE ldflags = [ "/DEBUG:FASTLINK" ] } else { ldflags = [ "/DEBUG" ] } } else { if (is_mac || is_ios) { cflags = [ "-gdwarf-2" ] if (is_mac && enable_dsyms) { # If generating dSYMs, specify -fno-standalone-debug. This was # originally specified for https://crbug.com/479841 because dsymutil # could not handle a 4GB dSYM file. But dsymutil from Xcodes prior to # version 7 also produces debug data that is incompatible with Breakpad # dump_syms, so this is still required (https://crbug.com/622406). cflags += [ "-fno-standalone-debug" ] } } else if (is_android) { # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3 # explicitly on android where we are hitting https://crbug.com/638485. # The arguments MUST be in this order because of a gcc arg parsing bug. cflags = [ "-gdwarf-3", "-g2", ] } else { cflags = [ "-g2" ] } if (use_debug_fission) { cflags += [ "-gsplit-dwarf" ] } asmflags = cflags ldflags = [] } } # Minimal symbols. config("minimal_symbols") { if (is_win) { # Linker symbols for backtraces only. cflags = [] ldflags = [ "/DEBUG" ] } else { if (is_android) { # Breakpad can't handle DWARF 4 symbols properly yet, so use DWARF 3 # explicitly on android where we are hitting https://crbug.com/638485. # The arguments MUST be in this order because of a gcc arg parsing bug. cflags = [ "-gdwarf-3", "-g1", ] } else { cflags = [ "-g1" ] } if (use_debug_fission) { cflags += [ "-gsplit-dwarf" ] } asmflags = cflags ldflags = [] } } # No symbols. config("no_symbols") { if (!is_win) { cflags = [ "-g0" ] asmflags = cflags } } # Default symbols. config("default_symbols") { if (symbol_level == 0) { configs = [ ":no_symbols" ] } else if (symbol_level == 1) { configs = [ ":minimal_symbols" ] } else if (symbol_level == 2) { configs = [ ":symbols" ] } else { assert(false) } } if (is_ios || is_mac) { # On Mac and iOS, this enables support for ARC (automatic ref-counting). # See http://clang.llvm.org/docs/AutomaticReferenceCounting.html. config("enable_arc") { common_flags = [ "-fobjc-arc" ] cflags_objc = common_flags cflags_objcc = common_flags } } ================================================ FILE: samples/GN/BUILD.gn ================================================ # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/android/config.gni") import("//build/config/arm.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/mips.gni") import("//build/config/sanitizers/sanitizers.gni") if (is_android) { import("//build/config/android/rules.gni") } import("gni/v8.gni") import("gni/isolate.gni") import("//build_overrides/v8.gni") import("snapshot_toolchain.gni") declare_args() { # Print to stdout on Android. v8_android_log_stdout = false # Sets -DVERIFY_HEAP. v8_enable_verify_heap = false # Enable compiler warnings when using V8_DEPRECATED apis. v8_deprecation_warnings = false # Enable compiler warnings when using V8_DEPRECATE_SOON apis. v8_imminent_deprecation_warnings = "" # Embeds the given script into the snapshot. v8_embed_script = "" # Sets -dENABLE_DISASSEMBLER. v8_enable_disassembler = "" # Sets -dENABLE_GDB_JIT_INTERFACE. v8_enable_gdbjit = "" # Sets -dENABLE_HANDLE_ZAPPING. v8_enable_handle_zapping = is_debug # Enable ECMAScript Internationalization API. Enabling this feature will # add a dependency on the ICU library. v8_enable_i18n_support = true # Enable slow dchecks. v8_enable_slow_dchecks = false # Interpreted regexp engine exists as platform-independent alternative # based where the regular expression is compiled to a bytecode. v8_interpreted_regexp = false # Sets -dOBJECT_PRINT. v8_object_print = "" # With post mortem support enabled, metadata is embedded into libv8 that # describes various parameters of the VM for use by debuggers. See # tools/gen-postmortem-metadata.py for details. v8_postmortem_support = false # Similar to vfp but on MIPS. v8_can_use_fpu_instructions = true # Similar to the ARM hard float ABI but on MIPS. v8_use_mips_abi_hardfloat = true } # Set project-specific defaults for some args if not provided in args.gn. The # defaults can be set in the respective build_overrides files. if (v8_imminent_deprecation_warnings == "") { if (defined(v8_imminent_deprecation_warnings_default)) { v8_imminent_deprecation_warnings = v8_imminent_deprecation_warnings_default } else { v8_imminent_deprecation_warnings = false } } if (v8_enable_gdbjit == "") { if (defined(v8_enable_gdbjit_default)) { v8_enable_gdbjit = v8_enable_gdbjit_default } else { v8_enable_gdbjit = false } } # Derived defaults. if (v8_object_print == "") { v8_object_print = is_debug && !v8_optimized_debug } if (v8_enable_disassembler == "") { v8_enable_disassembler = is_debug && !v8_optimized_debug } v8_generated_peephole_source = "$target_gen_dir/bytecode-peephole-table.cc" v8_random_seed = "314159265" v8_toolset_for_shell = "host" ############################################################################### # Configurations # config("internal_config") { visibility = [ ":*" ] # Only targets in this file can depend on this. include_dirs = [ "." ] if (is_component_build) { defines = [ "V8_SHARED", "BUILDING_V8_SHARED", ] } } config("internal_config_base") { visibility = [ ":*" ] # Only targets in this file can depend on this. include_dirs = [ "." ] } # This config should be applied to code using the libplatform. config("libplatform_config") { include_dirs = [ "include" ] } # This config should be applied to code using the libsampler. config("libsampler_config") { include_dirs = [ "include" ] } # This config should only be applied to code using V8 and not any V8 code # itself. config("external_config") { if (is_component_build) { defines = [ "V8_SHARED", "USING_V8_SHARED", ] } include_dirs = [ "include" ] libs = [] if (is_android && current_toolchain != host_toolchain) { libs += [ "log" ] } } # This config should only be applied to code that needs to be explicitly # aware of whether we are using startup data or not. config("external_startup_data") { if (v8_use_external_startup_data) { defines = [ "V8_USE_EXTERNAL_STARTUP_DATA" ] } } config("features") { visibility = [ ":*" ] # Only targets in this file can depend on this. defines = [] if (v8_enable_disassembler) { defines += [ "ENABLE_DISASSEMBLER" ] } if (v8_enable_gdbjit) { defines += [ "ENABLE_GDB_JIT_INTERFACE" ] } if (v8_object_print) { defines += [ "OBJECT_PRINT" ] } if (v8_enable_verify_heap) { defines += [ "VERIFY_HEAP" ] } if (v8_interpreted_regexp) { defines += [ "V8_INTERPRETED_REGEXP" ] } if (v8_deprecation_warnings) { defines += [ "V8_DEPRECATION_WARNINGS" ] } if (v8_imminent_deprecation_warnings) { defines += [ "V8_IMMINENT_DEPRECATION_WARNINGS" ] } if (v8_enable_i18n_support) { defines += [ "V8_I18N_SUPPORT" ] } if (v8_enable_handle_zapping) { defines += [ "ENABLE_HANDLE_ZAPPING" ] } if (v8_use_external_startup_data) { defines += [ "V8_USE_EXTERNAL_STARTUP_DATA" ] } } config("toolchain") { visibility = [ ":*" ] # Only targets in this file can depend on this. defines = [] cflags = [] ldflags = [] if (v8_current_cpu == "arm") { defines += [ "V8_TARGET_ARCH_ARM" ] if (arm_version == 7) { defines += [ "CAN_USE_ARMV7_INSTRUCTIONS" ] } if (arm_fpu == "vfpv3-d16") { defines += [ "CAN_USE_VFP3_INSTRUCTIONS" ] } else if (arm_fpu == "vfpv3") { defines += [ "CAN_USE_VFP3_INSTRUCTIONS", "CAN_USE_VFP32DREGS", ] } else if (arm_fpu == "neon") { defines += [ "CAN_USE_VFP3_INSTRUCTIONS", "CAN_USE_VFP32DREGS", "CAN_USE_NEON", ] } # TODO(jochen): Add support for arm_test_noprobe. if (current_cpu != "arm") { # These defines ares used for the ARM simulator. if (arm_float_abi == "hard") { defines += [ "USE_EABI_HARDFLOAT=1" ] } else if (arm_float_abi == "softfp") { defines += [ "USE_EABI_HARDFLOAT=0" ] } } } if (v8_current_cpu == "arm64") { defines += [ "V8_TARGET_ARCH_ARM64" ] } # TODO(jochen): Add support for mips. if (v8_current_cpu == "mipsel") { defines += [ "V8_TARGET_ARCH_MIPS" ] if (v8_can_use_fpu_instructions) { defines += [ "CAN_USE_FPU_INSTRUCTIONS" ] } if (v8_use_mips_abi_hardfloat) { defines += [ "__mips_hard_float=1", "CAN_USE_FPU_INSTRUCTIONS", ] } else { defines += [ "__mips_soft_float=1" ] } if (mips_arch_variant == "r6") { defines += [ "_MIPS_ARCH_MIPS32R6", "FPU_MODE_FP64", ] } else if (mips_arch_variant == "r2") { defines += [ "_MIPS_ARCH_MIPS32R2" ] if (mips_fpu_mode == "fp64") { defines += [ "FPU_MODE_FP64" ] } else if (mips_fpu_mode == "fpxx") { defines += [ "FPU_MODE_FPXX" ] } else if (mips_fpu_mode == "fp32") { defines += [ "FPU_MODE_FP32" ] } } else if (mips_arch_variant == "r1") { defines += [ "FPU_MODE_FP32" ] } # TODO(jochen): Add support for mips_arch_variant rx and loongson. } # TODO(jochen): Add support for mips64. if (v8_current_cpu == "mips64el") { defines += [ "V8_TARGET_ARCH_MIPS64" ] if (v8_can_use_fpu_instructions) { defines += [ "CAN_USE_FPU_INSTRUCTIONS" ] } # TODO(jochen): Add support for big endian host byteorder. defines += [ "V8_TARGET_ARCH_MIPS64_LE" ] if (v8_use_mips_abi_hardfloat) { defines += [ "__mips_hard_float=1", "CAN_USE_FPU_INSTRUCTIONS", ] } else { defines += [ "__mips_soft_float=1" ] } if (mips_arch_variant == "r6") { defines += [ "_MIPS_ARCH_MIPS64R6" ] } else if (mips_arch_variant == "r2") { defines += [ "_MIPS_ARCH_MIPS64R2" ] } } if (v8_current_cpu == "s390" || v8_current_cpu == "s390x") { defines += [ "V8_TARGET_ARCH_S390" ] if (v8_current_cpu == "s390x") { defines += [ "V8_TARGET_ARCH_S390X" ] } if (host_cpu == "x64" || host_cpu == "x86") { defines += [ "V8_TARGET_ARCH_S390_LE_SIM" ] } } if (v8_current_cpu == "x86") { defines += [ "V8_TARGET_ARCH_IA32" ] if (is_win) { # Ensure no surprising artifacts from 80bit double math with x86. cflags += [ "/arch:SSE2" ] } } if (v8_current_cpu == "x64") { defines += [ "V8_TARGET_ARCH_X64" ] if (is_win) { # Increase the initial stack size. The default is 1MB, this is 2MB. This # applies only to executables and shared libraries produced by V8 since # ldflags are not pushed to dependants. ldflags += [ "/STACK:2097152" ] } } if (is_android && v8_android_log_stdout) { defines += [ "V8_ANDROID_LOG_STDOUT" ] } # TODO(jochen): Support v8_enable_prof on Windows. # TODO(jochen): Add support for compiling with simulators. if (is_debug) { if (is_linux && v8_enable_backtrace) { ldflags += [ "-rdynamic" ] } # TODO(jochen): Add support for different debug optimization levels. defines += [ "ENABLE_DISASSEMBLER", "V8_ENABLE_CHECKS", "OBJECT_PRINT", "VERIFY_HEAP", "DEBUG", "TRACE_MAPS", ] if (v8_enable_slow_dchecks) { defines += [ "ENABLE_SLOW_DCHECKS" ] } } else if (dcheck_always_on) { defines += [ "DEBUG" ] } } ############################################################################### # Actions # action("js2c") { visibility = [ ":*" ] # Only targets in this file can depend on this. script = "tools/js2c.py" # The script depends on this other script, this rule causes a rebuild if it # changes. inputs = [ "tools/jsmin.py", ] # NOSORT sources = [ "src/js/macros.py", "src/messages.h", "src/js/prologue.js", "src/js/runtime.js", "src/js/v8natives.js", "src/js/symbol.js", "src/js/array.js", "src/js/string.js", "src/js/math.js", "src/js/regexp.js", "src/js/arraybuffer.js", "src/js/typedarray.js", "src/js/iterator-prototype.js", "src/js/collection.js", "src/js/weak-collection.js", "src/js/collection-iterator.js", "src/js/promise.js", "src/js/messages.js", "src/js/array-iterator.js", "src/js/string-iterator.js", "src/js/templates.js", "src/js/spread.js", "src/js/proxy.js", "src/debug/mirrors.js", "src/debug/debug.js", "src/debug/liveedit.js", ] outputs = [ "$target_gen_dir/libraries.cc", ] if (v8_enable_i18n_support) { sources += [ "src/js/i18n.js" ] } args = [ rebase_path("$target_gen_dir/libraries.cc", root_build_dir), "CORE", ] + rebase_path(sources, root_build_dir) if (v8_use_external_startup_data) { outputs += [ "$target_gen_dir/libraries.bin" ] args += [ "--startup_blob", rebase_path("$target_gen_dir/libraries.bin", root_build_dir), ] } } action("js2c_experimental") { visibility = [ ":*" ] # Only targets in this file can depend on this. script = "tools/js2c.py" # The script depends on this other script, this rule causes a rebuild if it # changes. inputs = [ "tools/jsmin.py", ] # NOSORT sources = [ "src/js/macros.py", "src/messages.h", "src/js/harmony-async-await.js", "src/js/harmony-atomics.js", "src/js/harmony-simd.js", "src/js/harmony-string-padding.js", ] outputs = [ "$target_gen_dir/experimental-libraries.cc", ] if (v8_enable_i18n_support) { sources += [ "src/js/icu-case-mapping.js", "src/js/intl-extra.js", ] } args = [ rebase_path("$target_gen_dir/experimental-libraries.cc", root_build_dir), "EXPERIMENTAL", ] + rebase_path(sources, root_build_dir) if (v8_use_external_startup_data) { outputs += [ "$target_gen_dir/libraries_experimental.bin" ] args += [ "--startup_blob", rebase_path("$target_gen_dir/libraries_experimental.bin", root_build_dir), ] } } action("js2c_extras") { visibility = [ ":*" ] # Only targets in this file can depend on this. script = "tools/js2c.py" # The script depends on this other script, this rule causes a rebuild if it # changes. inputs = [ "tools/jsmin.py", ] sources = v8_extra_library_files outputs = [ "$target_gen_dir/extras-libraries.cc", ] args = [ rebase_path("$target_gen_dir/extras-libraries.cc", root_build_dir), "EXTRAS", ] + rebase_path(sources, root_build_dir) if (v8_use_external_startup_data) { outputs += [ "$target_gen_dir/libraries_extras.bin" ] args += [ "--startup_blob", rebase_path("$target_gen_dir/libraries_extras.bin", root_build_dir), ] } } action("js2c_experimental_extras") { visibility = [ ":*" ] # Only targets in this file can depend on this. script = "tools/js2c.py" # The script depends on this other script, this rule causes a rebuild if it # changes. inputs = [ "tools/jsmin.py", ] sources = v8_experimental_extra_library_files outputs = [ "$target_gen_dir/experimental-extras-libraries.cc", ] args = [ rebase_path("$target_gen_dir/experimental-extras-libraries.cc", root_build_dir), "EXPERIMENTAL_EXTRAS", ] + rebase_path(sources, root_build_dir) if (v8_use_external_startup_data) { outputs += [ "$target_gen_dir/libraries_experimental_extras.bin" ] args += [ "--startup_blob", rebase_path("$target_gen_dir/libraries_experimental_extras.bin", root_build_dir), ] } } action("d8_js2c") { visibility = [ ":*" ] # Only targets in this file can depend on this. script = "tools/js2c.py" # NOSORT inputs = [ "src/d8.js", "src/js/macros.py", ] outputs = [ "$target_gen_dir/d8-js.cc", ] args = rebase_path(outputs, root_build_dir) + [ "D8" ] + rebase_path(inputs, root_build_dir) } if (is_android && enable_java_templates) { android_assets("v8_external_startup_data_assets") { if (v8_use_external_startup_data) { deps = [ "//v8", ] sources = [ "$root_out_dir/natives_blob.bin", ] renaming_sources = [ "$root_out_dir/snapshot_blob.bin" ] if (current_cpu == "arm" || current_cpu == "x86" || current_cpu == "mipsel") { renaming_destinations = [ "snapshot_blob_32.bin" ] } else { renaming_destinations = [ "snapshot_blob_64.bin" ] } disable_compression = true } } } if (v8_use_external_startup_data) { action("natives_blob") { visibility = [ ":*" ] # Only targets in this file can depend on this. deps = [ ":js2c", ":js2c_experimental", ":js2c_experimental_extras", ":js2c_extras", ] # NOSORT sources = [ "$target_gen_dir/libraries.bin", "$target_gen_dir/libraries_experimental.bin", "$target_gen_dir/libraries_extras.bin", "$target_gen_dir/libraries_experimental_extras.bin", ] outputs = [ "$root_out_dir/natives_blob.bin", ] script = "tools/concatenate-files.py" args = rebase_path(sources + outputs, root_build_dir) } } action("postmortem-metadata") { # Only targets in this file and the top-level visibility target can # depend on this. visibility = [ ":*", "//:gn_visibility", ] script = "tools/gen-postmortem-metadata.py" # NOSORT sources = [ "src/objects.h", "src/objects-inl.h", ] outputs = [ "$target_gen_dir/debug-support.cc", ] args = rebase_path(outputs, root_build_dir) + rebase_path(sources, root_build_dir) } action("run_mksnapshot") { visibility = [ ":*" ] # Only targets in this file can depend on this. deps = [ ":mksnapshot($v8_snapshot_toolchain)", ] script = "tools/run.py" sources = [] outputs = [ "$target_gen_dir/snapshot.cc", ] args = [ "./" + rebase_path(get_label_info(":mksnapshot($v8_snapshot_toolchain)", "root_out_dir") + "/mksnapshot", root_build_dir), "--startup_src", rebase_path("$target_gen_dir/snapshot.cc", root_build_dir), ] if (v8_random_seed != "0") { args += [ "--random-seed", v8_random_seed, ] } if (v8_use_external_startup_data) { outputs += [ "$root_out_dir/snapshot_blob.bin" ] args += [ "--startup_blob", rebase_path("$root_out_dir/snapshot_blob.bin", root_build_dir), ] } if (v8_embed_script != "") { sources += [ v8_embed_script ] args += [ rebase_path(v8_embed_script, root_build_dir) ] } } action("run_mkpeephole") { visibility = [ ":*" ] # Only targets in this file can depend on this. deps = [ ":mkpeephole($v8_snapshot_toolchain)", ] outputs = [ v8_generated_peephole_source, ] sources = [] script = "tools/run.py" args = [ "./" + rebase_path(get_label_info(":mkpeephole($v8_snapshot_toolchain)", "root_out_dir") + "/mkpeephole", root_build_dir), rebase_path(v8_generated_peephole_source, root_build_dir), ] } action("v8_dump_build_config") { script = "tools/testrunner/utils/dump_build_config.py" outputs = [ "$root_out_dir/v8_build_config.json", ] args = [ rebase_path("$root_out_dir/v8_build_config.json", root_build_dir), "dcheck_always_on=$dcheck_always_on", "is_asan=$is_asan", "is_cfi=$is_cfi", "is_component_build=$is_component_build", "is_debug=$is_debug", "is_msan=$is_msan", "is_tsan=$is_tsan", "target_cpu=\"$target_cpu\"", "v8_enable_i18n_support=$v8_enable_i18n_support", "v8_target_cpu=\"$v8_target_cpu\"", "v8_use_snapshot=$v8_use_snapshot", ] } ############################################################################### # Source Sets (aka static libraries) # source_set("v8_maybe_snapshot") { if (v8_use_snapshot && v8_use_external_startup_data) { public_deps = [ ":v8_external_snapshot", ] } else if (v8_use_snapshot) { public_deps = [ ":v8_snapshot", ] } else { # Ignore v8_use_external_startup_data setting if no snapshot is used. public_deps = [ ":v8_nosnapshot", ] } } v8_source_set("v8_nosnapshot") { visibility = [ ":*" ] # Only targets in this file can depend on this. deps = [ ":js2c", ":js2c_experimental", ":js2c_experimental_extras", ":js2c_extras", ":v8_base", ] sources = [ "$target_gen_dir/experimental-extras-libraries.cc", "$target_gen_dir/experimental-libraries.cc", "$target_gen_dir/extras-libraries.cc", "$target_gen_dir/libraries.cc", "src/snapshot/snapshot-empty.cc", ] configs = [ ":internal_config" ] } v8_source_set("v8_snapshot") { # Only targets in this file and the top-level visibility target can # depend on this. visibility = [ ":*", "//:gn_visibility", ] deps = [ ":js2c", ":js2c_experimental", ":js2c_experimental_extras", ":js2c_extras", ":v8_base", ] public_deps = [ # This should be public so downstream targets can declare the snapshot # output file as their inputs. ":run_mksnapshot", ] sources = [ "$target_gen_dir/experimental-extras-libraries.cc", "$target_gen_dir/experimental-libraries.cc", "$target_gen_dir/extras-libraries.cc", "$target_gen_dir/libraries.cc", "$target_gen_dir/snapshot.cc", ] configs = [ ":internal_config" ] } if (v8_use_external_startup_data) { v8_source_set("v8_external_snapshot") { visibility = [ ":*" ] # Only targets in this file can depend on this. deps = [ ":js2c", ":js2c_experimental", ":js2c_experimental_extras", ":js2c_extras", ":v8_base", ] public_deps = [ ":natives_blob", ":run_mksnapshot", ] sources = [ "src/snapshot/natives-external.cc", "src/snapshot/snapshot-external.cc", ] configs = [ ":internal_config" ] } } v8_source_set("v8_base") { visibility = [ ":*" ] # Only targets in this file can depend on this. sources = [ "//base/trace_event/common/trace_event_common.h", "include/v8-debug.h", "include/v8-experimental.h", "include/v8-platform.h", "include/v8-profiler.h", "include/v8-testing.h", "include/v8-util.h", "include/v8-version.h", "include/v8.h", "include/v8config.h", "src/accessors.cc", "src/accessors.h", "src/address-map.cc", "src/address-map.h", "src/allocation-site-scopes.cc", "src/allocation-site-scopes.h", "src/allocation.cc", "src/allocation.h", "src/api-arguments-inl.h", "src/api-arguments.cc", "src/api-arguments.h", "src/api-experimental.cc", "src/api-experimental.h", "src/api-natives.cc", "src/api-natives.h", "src/api.cc", "src/api.h", "src/arguments.cc", "src/arguments.h", "src/asmjs/asm-js.cc", "src/asmjs/asm-js.h", "src/asmjs/asm-typer.cc", "src/asmjs/asm-typer.h", "src/asmjs/asm-types.cc", "src/asmjs/asm-types.h", "src/asmjs/asm-wasm-builder.cc", "src/asmjs/asm-wasm-builder.h", "src/assembler.cc", "src/assembler.h", "src/assert-scope.cc", "src/assert-scope.h", "src/ast/ast-expression-rewriter.cc", "src/ast/ast-expression-rewriter.h", "src/ast/ast-literal-reindexer.cc", "src/ast/ast-literal-reindexer.h", "src/ast/ast-numbering.cc", "src/ast/ast-numbering.h", "src/ast/ast-traversal-visitor.h", "src/ast/ast-type-bounds.h", "src/ast/ast-value-factory.cc", "src/ast/ast-value-factory.h", "src/ast/ast.cc", "src/ast/ast.h", "src/ast/context-slot-cache.cc", "src/ast/context-slot-cache.h", "src/ast/modules.cc", "src/ast/modules.h", "src/ast/prettyprinter.cc", "src/ast/prettyprinter.h", "src/ast/scopeinfo.cc", "src/ast/scopeinfo.h", "src/ast/scopes.cc", "src/ast/scopes.h", "src/ast/variables.cc", "src/ast/variables.h", "src/background-parsing-task.cc", "src/background-parsing-task.h", "src/bailout-reason.cc", "src/bailout-reason.h", "src/basic-block-profiler.cc", "src/basic-block-profiler.h", "src/bignum-dtoa.cc", "src/bignum-dtoa.h", "src/bignum.cc", "src/bignum.h", "src/bit-vector.cc", "src/bit-vector.h", "src/bootstrapper.cc", "src/bootstrapper.h", "src/builtins/builtins-api.cc", "src/builtins/builtins-array.cc", "src/builtins/builtins-arraybuffer.cc", "src/builtins/builtins-boolean.cc", "src/builtins/builtins-call.cc", "src/builtins/builtins-callsite.cc", "src/builtins/builtins-conversion.cc", "src/builtins/builtins-dataview.cc", "src/builtins/builtins-date.cc", "src/builtins/builtins-debug.cc", "src/builtins/builtins-error.cc", "src/builtins/builtins-function.cc", "src/builtins/builtins-generator.cc", "src/builtins/builtins-global.cc", "src/builtins/builtins-handler.cc", "src/builtins/builtins-internal.cc", "src/builtins/builtins-interpreter.cc", "src/builtins/builtins-json.cc", "src/builtins/builtins-math.cc", "src/builtins/builtins-number.cc", "src/builtins/builtins-object.cc", "src/builtins/builtins-proxy.cc", "src/builtins/builtins-reflect.cc", "src/builtins/builtins-sharedarraybuffer.cc", "src/builtins/builtins-string.cc", "src/builtins/builtins-symbol.cc", "src/builtins/builtins-typedarray.cc", "src/builtins/builtins-utils.h", "src/builtins/builtins.cc", "src/builtins/builtins.h", "src/cached-powers.cc", "src/cached-powers.h", "src/cancelable-task.cc", "src/cancelable-task.h", "src/char-predicates-inl.h", "src/char-predicates.cc", "src/char-predicates.h", "src/checks.h", "src/code-events.h", "src/code-factory.cc", "src/code-factory.h", "src/code-stub-assembler.cc", "src/code-stub-assembler.h", "src/code-stubs-hydrogen.cc", "src/code-stubs.cc", "src/code-stubs.h", "src/codegen.cc", "src/codegen.h", "src/collector.h", "src/compilation-cache.cc", "src/compilation-cache.h", "src/compilation-dependencies.cc", "src/compilation-dependencies.h", "src/compilation-statistics.cc", "src/compilation-statistics.h", "src/compiler-dispatcher/compiler-dispatcher-job.cc", "src/compiler-dispatcher/compiler-dispatcher-job.h", "src/compiler-dispatcher/optimizing-compile-dispatcher.cc", "src/compiler-dispatcher/optimizing-compile-dispatcher.h", "src/compiler.cc", "src/compiler.h", "src/compiler/access-builder.cc", "src/compiler/access-builder.h", "src/compiler/access-info.cc", "src/compiler/access-info.h", "src/compiler/all-nodes.cc", "src/compiler/all-nodes.h", "src/compiler/ast-graph-builder.cc", "src/compiler/ast-graph-builder.h", "src/compiler/ast-loop-assignment-analyzer.cc", "src/compiler/ast-loop-assignment-analyzer.h", "src/compiler/basic-block-instrumentor.cc", "src/compiler/basic-block-instrumentor.h", "src/compiler/branch-elimination.cc", "src/compiler/branch-elimination.h", "src/compiler/bytecode-branch-analysis.cc", "src/compiler/bytecode-branch-analysis.h", "src/compiler/bytecode-graph-builder.cc", "src/compiler/bytecode-graph-builder.h", "src/compiler/bytecode-loop-analysis.cc", "src/compiler/bytecode-loop-analysis.h", "src/compiler/c-linkage.cc", "src/compiler/checkpoint-elimination.cc", "src/compiler/checkpoint-elimination.h", "src/compiler/code-assembler.cc", "src/compiler/code-assembler.h", "src/compiler/code-generator-impl.h", "src/compiler/code-generator.cc", "src/compiler/code-generator.h", "src/compiler/common-node-cache.cc", "src/compiler/common-node-cache.h", "src/compiler/common-operator-reducer.cc", "src/compiler/common-operator-reducer.h", "src/compiler/common-operator.cc", "src/compiler/common-operator.h", "src/compiler/control-builders.cc", "src/compiler/control-builders.h", "src/compiler/control-equivalence.cc", "src/compiler/control-equivalence.h", "src/compiler/control-flow-optimizer.cc", "src/compiler/control-flow-optimizer.h", "src/compiler/dead-code-elimination.cc", "src/compiler/dead-code-elimination.h", "src/compiler/diamond.h", "src/compiler/effect-control-linearizer.cc", "src/compiler/effect-control-linearizer.h", "src/compiler/escape-analysis-reducer.cc", "src/compiler/escape-analysis-reducer.h", "src/compiler/escape-analysis.cc", "src/compiler/escape-analysis.h", "src/compiler/frame-elider.cc", "src/compiler/frame-elider.h", "src/compiler/frame-states.cc", "src/compiler/frame-states.h", "src/compiler/frame.cc", "src/compiler/frame.h", "src/compiler/gap-resolver.cc", "src/compiler/gap-resolver.h", "src/compiler/graph-reducer.cc", "src/compiler/graph-reducer.h", "src/compiler/graph-replay.cc", "src/compiler/graph-replay.h", "src/compiler/graph-trimmer.cc", "src/compiler/graph-trimmer.h", "src/compiler/graph-visualizer.cc", "src/compiler/graph-visualizer.h", "src/compiler/graph.cc", "src/compiler/graph.h", "src/compiler/instruction-codes.h", "src/compiler/instruction-scheduler.cc", "src/compiler/instruction-scheduler.h", "src/compiler/instruction-selector-impl.h", "src/compiler/instruction-selector.cc", "src/compiler/instruction-selector.h", "src/compiler/instruction.cc", "src/compiler/instruction.h", "src/compiler/int64-lowering.cc", "src/compiler/int64-lowering.h", "src/compiler/js-builtin-reducer.cc", "src/compiler/js-builtin-reducer.h", "src/compiler/js-call-reducer.cc", "src/compiler/js-call-reducer.h", "src/compiler/js-context-specialization.cc", "src/compiler/js-context-specialization.h", "src/compiler/js-create-lowering.cc", "src/compiler/js-create-lowering.h", "src/compiler/js-frame-specialization.cc", "src/compiler/js-frame-specialization.h", "src/compiler/js-generic-lowering.cc", "src/compiler/js-generic-lowering.h", "src/compiler/js-global-object-specialization.cc", "src/compiler/js-global-object-specialization.h", "src/compiler/js-graph.cc", "src/compiler/js-graph.h", "src/compiler/js-inlining-heuristic.cc", "src/compiler/js-inlining-heuristic.h", "src/compiler/js-inlining.cc", "src/compiler/js-inlining.h", "src/compiler/js-intrinsic-lowering.cc", "src/compiler/js-intrinsic-lowering.h", "src/compiler/js-native-context-specialization.cc", "src/compiler/js-native-context-specialization.h", "src/compiler/js-operator.cc", "src/compiler/js-operator.h", "src/compiler/js-typed-lowering.cc", "src/compiler/js-typed-lowering.h", "src/compiler/jump-threading.cc", "src/compiler/jump-threading.h", "src/compiler/linkage.cc", "src/compiler/linkage.h", "src/compiler/live-range-separator.cc", "src/compiler/live-range-separator.h", "src/compiler/liveness-analyzer.cc", "src/compiler/liveness-analyzer.h", "src/compiler/load-elimination.cc", "src/compiler/load-elimination.h", "src/compiler/loop-analysis.cc", "src/compiler/loop-analysis.h", "src/compiler/loop-peeling.cc", "src/compiler/loop-peeling.h", "src/compiler/loop-variable-optimizer.cc", "src/compiler/loop-variable-optimizer.h", "src/compiler/machine-operator-reducer.cc", "src/compiler/machine-operator-reducer.h", "src/compiler/machine-operator.cc", "src/compiler/machine-operator.h", "src/compiler/memory-optimizer.cc", "src/compiler/memory-optimizer.h", "src/compiler/move-optimizer.cc", "src/compiler/move-optimizer.h", "src/compiler/node-aux-data.h", "src/compiler/node-cache.cc", "src/compiler/node-cache.h", "src/compiler/node-marker.cc", "src/compiler/node-marker.h", "src/compiler/node-matchers.cc", "src/compiler/node-matchers.h", "src/compiler/node-properties.cc", "src/compiler/node-properties.h", "src/compiler/node.cc", "src/compiler/node.h", "src/compiler/opcodes.cc", "src/compiler/opcodes.h", "src/compiler/operation-typer.cc", "src/compiler/operation-typer.h", "src/compiler/operator-properties.cc", "src/compiler/operator-properties.h", "src/compiler/operator.cc", "src/compiler/operator.h", "src/compiler/osr.cc", "src/compiler/osr.h", "src/compiler/pipeline-statistics.cc", "src/compiler/pipeline-statistics.h", "src/compiler/pipeline.cc", "src/compiler/pipeline.h", "src/compiler/raw-machine-assembler.cc", "src/compiler/raw-machine-assembler.h", "src/compiler/redundancy-elimination.cc", "src/compiler/redundancy-elimination.h", "src/compiler/register-allocator-verifier.cc", "src/compiler/register-allocator-verifier.h", "src/compiler/register-allocator.cc", "src/compiler/register-allocator.h", "src/compiler/representation-change.cc", "src/compiler/representation-change.h", "src/compiler/schedule.cc", "src/compiler/schedule.h", "src/compiler/scheduler.cc", "src/compiler/scheduler.h", "src/compiler/select-lowering.cc", "src/compiler/select-lowering.h", "src/compiler/simplified-lowering.cc", "src/compiler/simplified-lowering.h", "src/compiler/simplified-operator-reducer.cc", "src/compiler/simplified-operator-reducer.h", "src/compiler/simplified-operator.cc", "src/compiler/simplified-operator.h", "src/compiler/source-position.cc", "src/compiler/source-position.h", "src/compiler/state-values-utils.cc", "src/compiler/state-values-utils.h", "src/compiler/store-store-elimination.cc", "src/compiler/store-store-elimination.h", "src/compiler/tail-call-optimization.cc", "src/compiler/tail-call-optimization.h", "src/compiler/type-hint-analyzer.cc", "src/compiler/type-hint-analyzer.h", "src/compiler/type-hints.cc", "src/compiler/type-hints.h", "src/compiler/typer.cc", "src/compiler/typer.h", "src/compiler/unwinding-info-writer.h", "src/compiler/value-numbering-reducer.cc", "src/compiler/value-numbering-reducer.h", "src/compiler/verifier.cc", "src/compiler/verifier.h", "src/compiler/wasm-compiler.cc", "src/compiler/wasm-compiler.h", "src/compiler/wasm-linkage.cc", "src/compiler/zone-pool.cc", "src/compiler/zone-pool.h", "src/context-measure.cc", "src/context-measure.h", "src/contexts-inl.h", "src/contexts.cc", "src/contexts.h", "src/conversions-inl.h", "src/conversions.cc", "src/conversions.h", "src/counters-inl.h", "src/counters.cc", "src/counters.h", "src/crankshaft/compilation-phase.cc", "src/crankshaft/compilation-phase.h", "src/crankshaft/hydrogen-alias-analysis.h", "src/crankshaft/hydrogen-bce.cc", "src/crankshaft/hydrogen-bce.h", "src/crankshaft/hydrogen-canonicalize.cc", "src/crankshaft/hydrogen-canonicalize.h", "src/crankshaft/hydrogen-check-elimination.cc", "src/crankshaft/hydrogen-check-elimination.h", "src/crankshaft/hydrogen-dce.cc", "src/crankshaft/hydrogen-dce.h", "src/crankshaft/hydrogen-dehoist.cc", "src/crankshaft/hydrogen-dehoist.h", "src/crankshaft/hydrogen-environment-liveness.cc", "src/crankshaft/hydrogen-environment-liveness.h", "src/crankshaft/hydrogen-escape-analysis.cc", "src/crankshaft/hydrogen-escape-analysis.h", "src/crankshaft/hydrogen-flow-engine.h", "src/crankshaft/hydrogen-gvn.cc", "src/crankshaft/hydrogen-gvn.h", "src/crankshaft/hydrogen-infer-representation.cc", "src/crankshaft/hydrogen-infer-representation.h", "src/crankshaft/hydrogen-infer-types.cc", "src/crankshaft/hydrogen-infer-types.h", "src/crankshaft/hydrogen-instructions.cc", "src/crankshaft/hydrogen-instructions.h", "src/crankshaft/hydrogen-load-elimination.cc", "src/crankshaft/hydrogen-load-elimination.h", "src/crankshaft/hydrogen-mark-deoptimize.cc", "src/crankshaft/hydrogen-mark-deoptimize.h", "src/crankshaft/hydrogen-mark-unreachable.cc", "src/crankshaft/hydrogen-mark-unreachable.h", "src/crankshaft/hydrogen-osr.cc", "src/crankshaft/hydrogen-osr.h", "src/crankshaft/hydrogen-range-analysis.cc", "src/crankshaft/hydrogen-range-analysis.h", "src/crankshaft/hydrogen-redundant-phi.cc", "src/crankshaft/hydrogen-redundant-phi.h", "src/crankshaft/hydrogen-removable-simulates.cc", "src/crankshaft/hydrogen-removable-simulates.h", "src/crankshaft/hydrogen-representation-changes.cc", "src/crankshaft/hydrogen-representation-changes.h", "src/crankshaft/hydrogen-sce.cc", "src/crankshaft/hydrogen-sce.h", "src/crankshaft/hydrogen-store-elimination.cc", "src/crankshaft/hydrogen-store-elimination.h", "src/crankshaft/hydrogen-types.cc", "src/crankshaft/hydrogen-types.h", "src/crankshaft/hydrogen-uint32-analysis.cc", "src/crankshaft/hydrogen-uint32-analysis.h", "src/crankshaft/hydrogen.cc", "src/crankshaft/hydrogen.h", "src/crankshaft/lithium-allocator-inl.h", "src/crankshaft/lithium-allocator.cc", "src/crankshaft/lithium-allocator.h", "src/crankshaft/lithium-codegen.cc", "src/crankshaft/lithium-codegen.h", "src/crankshaft/lithium.cc", "src/crankshaft/lithium.h", "src/crankshaft/typing.cc", "src/crankshaft/typing.h", "src/crankshaft/unique.h", "src/date.cc", "src/date.h", "src/dateparser-inl.h", "src/dateparser.cc", "src/dateparser.h", "src/debug/debug-evaluate.cc", "src/debug/debug-evaluate.h", "src/debug/debug-frames.cc", "src/debug/debug-frames.h", "src/debug/debug-scopes.cc", "src/debug/debug-scopes.h", "src/debug/debug.cc", "src/debug/debug.h", "src/debug/liveedit.cc", "src/debug/liveedit.h", "src/deoptimize-reason.cc", "src/deoptimize-reason.h", "src/deoptimizer.cc", "src/deoptimizer.h", "src/disasm.h", "src/disassembler.cc", "src/disassembler.h", "src/diy-fp.cc", "src/diy-fp.h", "src/double.h", "src/dtoa.cc", "src/dtoa.h", "src/effects.h", "src/eh-frame.cc", "src/eh-frame.h", "src/elements-kind.cc", "src/elements-kind.h", "src/elements.cc", "src/elements.h", "src/execution.cc", "src/execution.h", "src/extensions/externalize-string-extension.cc", "src/extensions/externalize-string-extension.h", "src/extensions/free-buffer-extension.cc", "src/extensions/free-buffer-extension.h", "src/extensions/gc-extension.cc", "src/extensions/gc-extension.h", "src/extensions/ignition-statistics-extension.cc", "src/extensions/ignition-statistics-extension.h", "src/extensions/statistics-extension.cc", "src/extensions/statistics-extension.h", "src/extensions/trigger-failure-extension.cc", "src/extensions/trigger-failure-extension.h", "src/external-reference-table.cc", "src/external-reference-table.h", "src/factory.cc", "src/factory.h", "src/fast-accessor-assembler.cc", "src/fast-accessor-assembler.h", "src/fast-dtoa.cc", "src/fast-dtoa.h", "src/field-index-inl.h", "src/field-index.h", "src/field-type.cc", "src/field-type.h", "src/fixed-dtoa.cc", "src/fixed-dtoa.h", "src/flag-definitions.h", "src/flags.cc", "src/flags.h", "src/frames-inl.h", "src/frames.cc", "src/frames.h", "src/full-codegen/full-codegen.cc", "src/full-codegen/full-codegen.h", "src/futex-emulation.cc", "src/futex-emulation.h", "src/gdb-jit.cc", "src/gdb-jit.h", "src/global-handles.cc", "src/global-handles.h", "src/globals.h", "src/handles-inl.h", "src/handles.cc", "src/handles.h", "src/heap-symbols.h", "src/heap/array-buffer-tracker-inl.h", "src/heap/array-buffer-tracker.cc", "src/heap/array-buffer-tracker.h", "src/heap/code-stats.cc", "src/heap/code-stats.h", "src/heap/gc-idle-time-handler.cc", "src/heap/gc-idle-time-handler.h", "src/heap/gc-tracer.cc", "src/heap/gc-tracer.h", "src/heap/heap-inl.h", "src/heap/heap.cc", "src/heap/heap.h", "src/heap/incremental-marking-job.cc", "src/heap/incremental-marking-job.h", "src/heap/incremental-marking.cc", "src/heap/incremental-marking.h", "src/heap/mark-compact-inl.h", "src/heap/mark-compact.cc", "src/heap/mark-compact.h", "src/heap/marking.h", "src/heap/memory-reducer.cc", "src/heap/memory-reducer.h", "src/heap/object-stats.cc", "src/heap/object-stats.h", "src/heap/objects-visiting-inl.h", "src/heap/objects-visiting.cc", "src/heap/objects-visiting.h", "src/heap/page-parallel-job.h", "src/heap/remembered-set.cc", "src/heap/remembered-set.h", "src/heap/scavenge-job.cc", "src/heap/scavenge-job.h", "src/heap/scavenger-inl.h", "src/heap/scavenger.cc", "src/heap/scavenger.h", "src/heap/slot-set.h", "src/heap/spaces-inl.h", "src/heap/spaces.cc", "src/heap/spaces.h", "src/heap/store-buffer.cc", "src/heap/store-buffer.h", "src/i18n.cc", "src/i18n.h", "src/ic/access-compiler.cc", "src/ic/access-compiler.h", "src/ic/call-optimization.cc", "src/ic/call-optimization.h", "src/ic/handler-compiler.cc", "src/ic/handler-compiler.h", "src/ic/ic-compiler.cc", "src/ic/ic-compiler.h", "src/ic/ic-inl.h", "src/ic/ic-state.cc", "src/ic/ic-state.h", "src/ic/ic.cc", "src/ic/ic.h", "src/ic/stub-cache.cc", "src/ic/stub-cache.h", "src/icu_util.cc", "src/icu_util.h", "src/identity-map.cc", "src/identity-map.h", "src/interface-descriptors.cc", "src/interface-descriptors.h", "src/interpreter/bytecode-array-builder.cc", "src/interpreter/bytecode-array-builder.h", "src/interpreter/bytecode-array-iterator.cc", "src/interpreter/bytecode-array-iterator.h", "src/interpreter/bytecode-array-writer.cc", "src/interpreter/bytecode-array-writer.h", "src/interpreter/bytecode-dead-code-optimizer.cc", "src/interpreter/bytecode-dead-code-optimizer.h", "src/interpreter/bytecode-decoder.cc", "src/interpreter/bytecode-decoder.h", "src/interpreter/bytecode-flags.cc", "src/interpreter/bytecode-flags.h", "src/interpreter/bytecode-generator.cc", "src/interpreter/bytecode-generator.h", "src/interpreter/bytecode-label.cc", "src/interpreter/bytecode-label.h", "src/interpreter/bytecode-peephole-optimizer.cc", "src/interpreter/bytecode-peephole-optimizer.h", "src/interpreter/bytecode-peephole-table.h", "src/interpreter/bytecode-pipeline.cc", "src/interpreter/bytecode-pipeline.h", "src/interpreter/bytecode-register-allocator.cc", "src/interpreter/bytecode-register-allocator.h", "src/interpreter/bytecode-register-optimizer.cc", "src/interpreter/bytecode-register-optimizer.h", "src/interpreter/bytecode-register.cc", "src/interpreter/bytecode-register.h", "src/interpreter/bytecode-traits.h", "src/interpreter/bytecodes.cc", "src/interpreter/bytecodes.h", "src/interpreter/constant-array-builder.cc", "src/interpreter/constant-array-builder.h", "src/interpreter/control-flow-builders.cc", "src/interpreter/control-flow-builders.h", "src/interpreter/handler-table-builder.cc", "src/interpreter/handler-table-builder.h", "src/interpreter/interpreter-assembler.cc", "src/interpreter/interpreter-assembler.h", "src/interpreter/interpreter-intrinsics.cc", "src/interpreter/interpreter-intrinsics.h", "src/interpreter/interpreter.cc", "src/interpreter/interpreter.h", "src/isolate-inl.h", "src/isolate.cc", "src/isolate.h", "src/json-parser.cc", "src/json-parser.h", "src/json-stringifier.cc", "src/json-stringifier.h", "src/keys.cc", "src/keys.h", "src/layout-descriptor-inl.h", "src/layout-descriptor.cc", "src/layout-descriptor.h", "src/list-inl.h", "src/list.h", "src/log-inl.h", "src/log-utils.cc", "src/log-utils.h", "src/log.cc", "src/log.h", "src/lookup.cc", "src/lookup.h", "src/machine-type.cc", "src/machine-type.h", "src/macro-assembler.h", "src/messages.cc", "src/messages.h", "src/msan.h", "src/objects-body-descriptors-inl.h", "src/objects-body-descriptors.h", "src/objects-debug.cc", "src/objects-inl.h", "src/objects-printer.cc", "src/objects.cc", "src/objects.h", "src/ostreams.cc", "src/ostreams.h", "src/parsing/expression-classifier.h", "src/parsing/func-name-inferrer.cc", "src/parsing/func-name-inferrer.h", "src/parsing/parameter-initializer-rewriter.cc", "src/parsing/parameter-initializer-rewriter.h", "src/parsing/parse-info.cc", "src/parsing/parse-info.h", "src/parsing/parser-base.h", "src/parsing/parser.cc", "src/parsing/parser.h", "src/parsing/pattern-rewriter.cc", "src/parsing/preparse-data-format.h", "src/parsing/preparse-data.cc", "src/parsing/preparse-data.h", "src/parsing/preparser.cc", "src/parsing/preparser.h", "src/parsing/rewriter.cc", "src/parsing/rewriter.h", "src/parsing/scanner-character-streams.cc", "src/parsing/scanner-character-streams.h", "src/parsing/scanner.cc", "src/parsing/scanner.h", "src/parsing/token.cc", "src/parsing/token.h", "src/pending-compilation-error-handler.cc", "src/pending-compilation-error-handler.h", "src/perf-jit.cc", "src/perf-jit.h", "src/profiler/allocation-tracker.cc", "src/profiler/allocation-tracker.h", "src/profiler/circular-queue-inl.h", "src/profiler/circular-queue.h", "src/profiler/cpu-profiler-inl.h", "src/profiler/cpu-profiler.cc", "src/profiler/cpu-profiler.h", "src/profiler/heap-profiler.cc", "src/profiler/heap-profiler.h", "src/profiler/heap-snapshot-generator-inl.h", "src/profiler/heap-snapshot-generator.cc", "src/profiler/heap-snapshot-generator.h", "src/profiler/profile-generator-inl.h", "src/profiler/profile-generator.cc", "src/profiler/profile-generator.h", "src/profiler/profiler-listener.cc", "src/profiler/profiler-listener.h", "src/profiler/sampling-heap-profiler.cc", "src/profiler/sampling-heap-profiler.h", "src/profiler/strings-storage.cc", "src/profiler/strings-storage.h", "src/profiler/tick-sample.cc", "src/profiler/tick-sample.h", "src/profiler/unbound-queue-inl.h", "src/profiler/unbound-queue.h", "src/property-descriptor.cc", "src/property-descriptor.h", "src/property-details.h", "src/property.cc", "src/property.h", "src/prototype.h", "src/regexp/bytecodes-irregexp.h", "src/regexp/interpreter-irregexp.cc", "src/regexp/interpreter-irregexp.h", "src/regexp/jsregexp-inl.h", "src/regexp/jsregexp.cc", "src/regexp/jsregexp.h", "src/regexp/regexp-ast.cc", "src/regexp/regexp-ast.h", "src/regexp/regexp-macro-assembler-irregexp-inl.h", "src/regexp/regexp-macro-assembler-irregexp.cc", "src/regexp/regexp-macro-assembler-irregexp.h", "src/regexp/regexp-macro-assembler-tracer.cc", "src/regexp/regexp-macro-assembler-tracer.h", "src/regexp/regexp-macro-assembler.cc", "src/regexp/regexp-macro-assembler.h", "src/regexp/regexp-parser.cc", "src/regexp/regexp-parser.h", "src/regexp/regexp-stack.cc", "src/regexp/regexp-stack.h", "src/register-configuration.cc", "src/register-configuration.h", "src/runtime-profiler.cc", "src/runtime-profiler.h", "src/runtime/runtime-array.cc", "src/runtime/runtime-atomics.cc", "src/runtime/runtime-classes.cc", "src/runtime/runtime-collections.cc", "src/runtime/runtime-compiler.cc", "src/runtime/runtime-date.cc", "src/runtime/runtime-debug.cc", "src/runtime/runtime-error.cc", "src/runtime/runtime-forin.cc", "src/runtime/runtime-function.cc", "src/runtime/runtime-futex.cc", "src/runtime/runtime-generator.cc", "src/runtime/runtime-i18n.cc", "src/runtime/runtime-internal.cc", "src/runtime/runtime-interpreter.cc", "src/runtime/runtime-literals.cc", "src/runtime/runtime-liveedit.cc", "src/runtime/runtime-maths.cc", "src/runtime/runtime-numbers.cc", "src/runtime/runtime-object.cc", "src/runtime/runtime-operators.cc", "src/runtime/runtime-proxy.cc", "src/runtime/runtime-regexp.cc", "src/runtime/runtime-scopes.cc", "src/runtime/runtime-simd.cc", "src/runtime/runtime-strings.cc", "src/runtime/runtime-symbol.cc", "src/runtime/runtime-test.cc", "src/runtime/runtime-typedarray.cc", "src/runtime/runtime-utils.h", "src/runtime/runtime-wasm.cc", "src/runtime/runtime.cc", "src/runtime/runtime.h", "src/safepoint-table.cc", "src/safepoint-table.h", "src/signature.h", "src/simulator.h", "src/small-pointer-list.h", "src/snapshot/code-serializer.cc", "src/snapshot/code-serializer.h", "src/snapshot/deserializer.cc", "src/snapshot/deserializer.h", "src/snapshot/natives-common.cc", "src/snapshot/natives.h", "src/snapshot/partial-serializer.cc", "src/snapshot/partial-serializer.h", "src/snapshot/serializer-common.cc", "src/snapshot/serializer-common.h", "src/snapshot/serializer.cc", "src/snapshot/serializer.h", "src/snapshot/snapshot-common.cc", "src/snapshot/snapshot-source-sink.cc", "src/snapshot/snapshot-source-sink.h", "src/snapshot/snapshot.h", "src/snapshot/startup-serializer.cc", "src/snapshot/startup-serializer.h", "src/source-position-table.cc", "src/source-position-table.h", "src/source-position.h", "src/splay-tree-inl.h", "src/splay-tree.h", "src/startup-data-util.cc", "src/startup-data-util.h", "src/string-builder.cc", "src/string-builder.h", "src/string-search.h", "src/string-stream.cc", "src/string-stream.h", "src/strtod.cc", "src/strtod.h", "src/tracing/trace-event.cc", "src/tracing/trace-event.h", "src/transitions-inl.h", "src/transitions.cc", "src/transitions.h", "src/type-cache.cc", "src/type-cache.h", "src/type-feedback-vector-inl.h", "src/type-feedback-vector.cc", "src/type-feedback-vector.h", "src/type-info.cc", "src/type-info.h", "src/types.cc", "src/types.h", "src/unicode-cache-inl.h", "src/unicode-cache.h", "src/unicode-decoder.cc", "src/unicode-decoder.h", "src/unicode-inl.h", "src/unicode.cc", "src/unicode.h", "src/uri.cc", "src/uri.h", "src/utils-inl.h", "src/utils.cc", "src/utils.h", "src/v8.cc", "src/v8.h", "src/v8memory.h", "src/v8threads.cc", "src/v8threads.h", "src/value-serializer.cc", "src/value-serializer.h", "src/version.cc", "src/version.h", "src/vm-state-inl.h", "src/vm-state.h", "src/wasm/ast-decoder.cc", "src/wasm/ast-decoder.h", "src/wasm/decoder.h", "src/wasm/encoder.cc", "src/wasm/encoder.h", "src/wasm/leb-helper.h", "src/wasm/module-decoder.cc", "src/wasm/module-decoder.h", "src/wasm/switch-logic.cc", "src/wasm/switch-logic.h", "src/wasm/wasm-debug.cc", "src/wasm/wasm-debug.h", "src/wasm/wasm-external-refs.cc", "src/wasm/wasm-external-refs.h", "src/wasm/wasm-function-name-table.cc", "src/wasm/wasm-function-name-table.h", "src/wasm/wasm-interpreter.cc", "src/wasm/wasm-interpreter.h", "src/wasm/wasm-js.cc", "src/wasm/wasm-js.h", "src/wasm/wasm-macro-gen.h", "src/wasm/wasm-module.cc", "src/wasm/wasm-module.h", "src/wasm/wasm-opcodes.cc", "src/wasm/wasm-opcodes.h", "src/wasm/wasm-result.cc", "src/wasm/wasm-result.h", "src/zone-allocator.h", "src/zone-containers.h", "src/zone.cc", "src/zone.h", ] if (v8_current_cpu == "x86") { sources += [ "src/builtins/ia32/builtins-ia32.cc", "src/compiler/ia32/code-generator-ia32.cc", "src/compiler/ia32/instruction-codes-ia32.h", "src/compiler/ia32/instruction-scheduler-ia32.cc", "src/compiler/ia32/instruction-selector-ia32.cc", "src/crankshaft/ia32/lithium-codegen-ia32.cc", "src/crankshaft/ia32/lithium-codegen-ia32.h", "src/crankshaft/ia32/lithium-gap-resolver-ia32.cc", "src/crankshaft/ia32/lithium-gap-resolver-ia32.h", "src/crankshaft/ia32/lithium-ia32.cc", "src/crankshaft/ia32/lithium-ia32.h", "src/debug/ia32/debug-ia32.cc", "src/full-codegen/ia32/full-codegen-ia32.cc", "src/ia32/assembler-ia32-inl.h", "src/ia32/assembler-ia32.cc", "src/ia32/assembler-ia32.h", "src/ia32/code-stubs-ia32.cc", "src/ia32/code-stubs-ia32.h", "src/ia32/codegen-ia32.cc", "src/ia32/codegen-ia32.h", "src/ia32/cpu-ia32.cc", "src/ia32/deoptimizer-ia32.cc", "src/ia32/disasm-ia32.cc", "src/ia32/frames-ia32.cc", "src/ia32/frames-ia32.h", "src/ia32/interface-descriptors-ia32.cc", "src/ia32/macro-assembler-ia32.cc", "src/ia32/macro-assembler-ia32.h", "src/ic/ia32/access-compiler-ia32.cc", "src/ic/ia32/handler-compiler-ia32.cc", "src/ic/ia32/ic-compiler-ia32.cc", "src/ic/ia32/ic-ia32.cc", "src/ic/ia32/stub-cache-ia32.cc", "src/regexp/ia32/regexp-macro-assembler-ia32.cc", "src/regexp/ia32/regexp-macro-assembler-ia32.h", ] } else if (v8_current_cpu == "x64") { sources += [ "src/builtins/x64/builtins-x64.cc", "src/compiler/x64/code-generator-x64.cc", "src/compiler/x64/instruction-codes-x64.h", "src/compiler/x64/instruction-scheduler-x64.cc", "src/compiler/x64/instruction-selector-x64.cc", "src/compiler/x64/unwinding-info-writer-x64.cc", "src/compiler/x64/unwinding-info-writer-x64.h", "src/crankshaft/x64/lithium-codegen-x64.cc", "src/crankshaft/x64/lithium-codegen-x64.h", "src/crankshaft/x64/lithium-gap-resolver-x64.cc", "src/crankshaft/x64/lithium-gap-resolver-x64.h", "src/crankshaft/x64/lithium-x64.cc", "src/crankshaft/x64/lithium-x64.h", "src/debug/x64/debug-x64.cc", "src/full-codegen/x64/full-codegen-x64.cc", "src/ic/x64/access-compiler-x64.cc", "src/ic/x64/handler-compiler-x64.cc", "src/ic/x64/ic-compiler-x64.cc", "src/ic/x64/ic-x64.cc", "src/ic/x64/stub-cache-x64.cc", "src/regexp/x64/regexp-macro-assembler-x64.cc", "src/regexp/x64/regexp-macro-assembler-x64.h", "src/x64/assembler-x64-inl.h", "src/x64/assembler-x64.cc", "src/x64/assembler-x64.h", "src/x64/code-stubs-x64.cc", "src/x64/code-stubs-x64.h", "src/x64/codegen-x64.cc", "src/x64/codegen-x64.h", "src/x64/cpu-x64.cc", "src/x64/deoptimizer-x64.cc", "src/x64/disasm-x64.cc", "src/x64/eh-frame-x64.cc", "src/x64/frames-x64.cc", "src/x64/frames-x64.h", "src/x64/interface-descriptors-x64.cc", "src/x64/macro-assembler-x64.cc", "src/x64/macro-assembler-x64.h", ] } else if (v8_current_cpu == "arm") { sources += [ "src/arm/assembler-arm-inl.h", "src/arm/assembler-arm.cc", "src/arm/assembler-arm.h", "src/arm/code-stubs-arm.cc", "src/arm/code-stubs-arm.h", "src/arm/codegen-arm.cc", "src/arm/codegen-arm.h", "src/arm/constants-arm.cc", "src/arm/constants-arm.h", "src/arm/cpu-arm.cc", "src/arm/deoptimizer-arm.cc", "src/arm/disasm-arm.cc", "src/arm/eh-frame-arm.cc", "src/arm/frames-arm.cc", "src/arm/frames-arm.h", "src/arm/interface-descriptors-arm.cc", "src/arm/interface-descriptors-arm.h", "src/arm/macro-assembler-arm.cc", "src/arm/macro-assembler-arm.h", "src/arm/simulator-arm.cc", "src/arm/simulator-arm.h", "src/builtins/arm/builtins-arm.cc", "src/compiler/arm/code-generator-arm.cc", "src/compiler/arm/instruction-codes-arm.h", "src/compiler/arm/instruction-scheduler-arm.cc", "src/compiler/arm/instruction-selector-arm.cc", "src/compiler/arm/unwinding-info-writer-arm.cc", "src/compiler/arm/unwinding-info-writer-arm.h", "src/crankshaft/arm/lithium-arm.cc", "src/crankshaft/arm/lithium-arm.h", "src/crankshaft/arm/lithium-codegen-arm.cc", "src/crankshaft/arm/lithium-codegen-arm.h", "src/crankshaft/arm/lithium-gap-resolver-arm.cc", "src/crankshaft/arm/lithium-gap-resolver-arm.h", "src/debug/arm/debug-arm.cc", "src/full-codegen/arm/full-codegen-arm.cc", "src/ic/arm/access-compiler-arm.cc", "src/ic/arm/handler-compiler-arm.cc", "src/ic/arm/ic-arm.cc", "src/ic/arm/ic-compiler-arm.cc", "src/ic/arm/stub-cache-arm.cc", "src/regexp/arm/regexp-macro-assembler-arm.cc", "src/regexp/arm/regexp-macro-assembler-arm.h", ] } else if (v8_current_cpu == "arm64") { sources += [ "src/arm64/assembler-arm64-inl.h", "src/arm64/assembler-arm64.cc", "src/arm64/assembler-arm64.h", "src/arm64/code-stubs-arm64.cc", "src/arm64/code-stubs-arm64.h", "src/arm64/codegen-arm64.cc", "src/arm64/codegen-arm64.h", "src/arm64/constants-arm64.h", "src/arm64/cpu-arm64.cc", "src/arm64/decoder-arm64-inl.h", "src/arm64/decoder-arm64.cc", "src/arm64/decoder-arm64.h", "src/arm64/deoptimizer-arm64.cc", "src/arm64/disasm-arm64.cc", "src/arm64/disasm-arm64.h", "src/arm64/eh-frame-arm64.cc", "src/arm64/frames-arm64.cc", "src/arm64/frames-arm64.h", "src/arm64/instructions-arm64.cc", "src/arm64/instructions-arm64.h", "src/arm64/instrument-arm64.cc", "src/arm64/instrument-arm64.h", "src/arm64/interface-descriptors-arm64.cc", "src/arm64/interface-descriptors-arm64.h", "src/arm64/macro-assembler-arm64-inl.h", "src/arm64/macro-assembler-arm64.cc", "src/arm64/macro-assembler-arm64.h", "src/arm64/simulator-arm64.cc", "src/arm64/simulator-arm64.h", "src/arm64/utils-arm64.cc", "src/arm64/utils-arm64.h", "src/builtins/arm64/builtins-arm64.cc", "src/compiler/arm64/code-generator-arm64.cc", "src/compiler/arm64/instruction-codes-arm64.h", "src/compiler/arm64/instruction-scheduler-arm64.cc", "src/compiler/arm64/instruction-selector-arm64.cc", "src/compiler/arm64/unwinding-info-writer-arm64.cc", "src/compiler/arm64/unwinding-info-writer-arm64.h", "src/crankshaft/arm64/delayed-masm-arm64-inl.h", "src/crankshaft/arm64/delayed-masm-arm64.cc", "src/crankshaft/arm64/delayed-masm-arm64.h", "src/crankshaft/arm64/lithium-arm64.cc", "src/crankshaft/arm64/lithium-arm64.h", "src/crankshaft/arm64/lithium-codegen-arm64.cc", "src/crankshaft/arm64/lithium-codegen-arm64.h", "src/crankshaft/arm64/lithium-gap-resolver-arm64.cc", "src/crankshaft/arm64/lithium-gap-resolver-arm64.h", "src/debug/arm64/debug-arm64.cc", "src/full-codegen/arm64/full-codegen-arm64.cc", "src/ic/arm64/access-compiler-arm64.cc", "src/ic/arm64/handler-compiler-arm64.cc", "src/ic/arm64/ic-arm64.cc", "src/ic/arm64/ic-compiler-arm64.cc", "src/ic/arm64/stub-cache-arm64.cc", "src/regexp/arm64/regexp-macro-assembler-arm64.cc", "src/regexp/arm64/regexp-macro-assembler-arm64.h", ] } else if (v8_current_cpu == "mipsel") { sources += [ "src/builtins/mips/builtins-mips.cc", "src/compiler/mips/code-generator-mips.cc", "src/compiler/mips/instruction-codes-mips.h", "src/compiler/mips/instruction-scheduler-mips.cc", "src/compiler/mips/instruction-selector-mips.cc", "src/crankshaft/mips/lithium-codegen-mips.cc", "src/crankshaft/mips/lithium-codegen-mips.h", "src/crankshaft/mips/lithium-gap-resolver-mips.cc", "src/crankshaft/mips/lithium-gap-resolver-mips.h", "src/crankshaft/mips/lithium-mips.cc", "src/crankshaft/mips/lithium-mips.h", "src/debug/mips/debug-mips.cc", "src/full-codegen/mips/full-codegen-mips.cc", "src/ic/mips/access-compiler-mips.cc", "src/ic/mips/handler-compiler-mips.cc", "src/ic/mips/ic-compiler-mips.cc", "src/ic/mips/ic-mips.cc", "src/ic/mips/stub-cache-mips.cc", "src/mips/assembler-mips-inl.h", "src/mips/assembler-mips.cc", "src/mips/assembler-mips.h", "src/mips/code-stubs-mips.cc", "src/mips/code-stubs-mips.h", "src/mips/codegen-mips.cc", "src/mips/codegen-mips.h", "src/mips/constants-mips.cc", "src/mips/constants-mips.h", "src/mips/cpu-mips.cc", "src/mips/deoptimizer-mips.cc", "src/mips/disasm-mips.cc", "src/mips/frames-mips.cc", "src/mips/frames-mips.h", "src/mips/interface-descriptors-mips.cc", "src/mips/macro-assembler-mips.cc", "src/mips/macro-assembler-mips.h", "src/mips/simulator-mips.cc", "src/mips/simulator-mips.h", "src/regexp/mips/regexp-macro-assembler-mips.cc", "src/regexp/mips/regexp-macro-assembler-mips.h", ] } else if (v8_current_cpu == "mips64el") { sources += [ "src/builtins/mips64/builtins-mips64.cc", "src/compiler/mips64/code-generator-mips64.cc", "src/compiler/mips64/instruction-codes-mips64.h", "src/compiler/mips64/instruction-scheduler-mips64.cc", "src/compiler/mips64/instruction-selector-mips64.cc", "src/crankshaft/mips64/lithium-codegen-mips64.cc", "src/crankshaft/mips64/lithium-codegen-mips64.h", "src/crankshaft/mips64/lithium-gap-resolver-mips64.cc", "src/crankshaft/mips64/lithium-gap-resolver-mips64.h", "src/crankshaft/mips64/lithium-mips64.cc", "src/crankshaft/mips64/lithium-mips64.h", "src/debug/mips64/debug-mips64.cc", "src/full-codegen/mips64/full-codegen-mips64.cc", "src/ic/mips64/access-compiler-mips64.cc", "src/ic/mips64/handler-compiler-mips64.cc", "src/ic/mips64/ic-compiler-mips64.cc", "src/ic/mips64/ic-mips64.cc", "src/ic/mips64/stub-cache-mips64.cc", "src/mips64/assembler-mips64-inl.h", "src/mips64/assembler-mips64.cc", "src/mips64/assembler-mips64.h", "src/mips64/code-stubs-mips64.cc", "src/mips64/code-stubs-mips64.h", "src/mips64/codegen-mips64.cc", "src/mips64/codegen-mips64.h", "src/mips64/constants-mips64.cc", "src/mips64/constants-mips64.h", "src/mips64/cpu-mips64.cc", "src/mips64/deoptimizer-mips64.cc", "src/mips64/disasm-mips64.cc", "src/mips64/frames-mips64.cc", "src/mips64/frames-mips64.h", "src/mips64/interface-descriptors-mips64.cc", "src/mips64/macro-assembler-mips64.cc", "src/mips64/macro-assembler-mips64.h", "src/mips64/simulator-mips64.cc", "src/mips64/simulator-mips64.h", "src/regexp/mips64/regexp-macro-assembler-mips64.cc", "src/regexp/mips64/regexp-macro-assembler-mips64.h", ] } else if (v8_current_cpu == "s390" || v8_current_cpu == "s390x") { sources += [ "src/builtins/s390/builtins-s390.cc", "src/compiler/s390/code-generator-s390.cc", "src/compiler/s390/instruction-codes-s390.h", "src/compiler/s390/instruction-scheduler-s390.cc", "src/compiler/s390/instruction-selector-s390.cc", "src/crankshaft/s390/lithium-codegen-s390.cc", "src/crankshaft/s390/lithium-codegen-s390.h", "src/crankshaft/s390/lithium-gap-resolver-s390.cc", "src/crankshaft/s390/lithium-gap-resolver-s390.h", "src/crankshaft/s390/lithium-s390.cc", "src/crankshaft/s390/lithium-s390.h", "src/debug/s390/debug-s390.cc", "src/full-codegen/s390/full-codegen-s390.cc", "src/ic/s390/access-compiler-s390.cc", "src/ic/s390/handler-compiler-s390.cc", "src/ic/s390/ic-compiler-s390.cc", "src/ic/s390/ic-s390.cc", "src/ic/s390/stub-cache-s390.cc", "src/regexp/s390/regexp-macro-assembler-s390.cc", "src/regexp/s390/regexp-macro-assembler-s390.h", "src/s390/assembler-s390-inl.h", "src/s390/assembler-s390.cc", "src/s390/assembler-s390.h", "src/s390/code-stubs-s390.cc", "src/s390/code-stubs-s390.h", "src/s390/codegen-s390.cc", "src/s390/codegen-s390.h", "src/s390/constants-s390.cc", "src/s390/constants-s390.h", "src/s390/cpu-s390.cc", "src/s390/deoptimizer-s390.cc", "src/s390/disasm-s390.cc", "src/s390/frames-s390.cc", "src/s390/frames-s390.h", "src/s390/interface-descriptors-s390.cc", "src/s390/macro-assembler-s390.cc", "src/s390/macro-assembler-s390.h", "src/s390/simulator-s390.cc", "src/s390/simulator-s390.h", ] } configs = [ ":internal_config" ] defines = [] deps = [ ":v8_libbase", ":v8_libsampler", ] sources += [ v8_generated_peephole_source ] deps += [ ":run_mkpeephole" ] if (is_win) { # TODO(jschuh): crbug.com/167187 fix size_t to int truncations. cflags = [ "/wd4267" ] } if (v8_enable_i18n_support) { deps += [ "//third_party/icu" ] if (is_win) { deps += [ "//third_party/icu:icudata" ] } } else { sources -= [ "src/i18n.cc", "src/i18n.h", ] } if (v8_postmortem_support) { sources += [ "$target_gen_dir/debug-support.cc" ] deps += [ ":postmortem-metadata" ] } } v8_source_set("v8_libbase") { visibility = [ ":*" ] # Only targets in this file can depend on this. sources = [ "src/base/accounting-allocator.cc", "src/base/accounting-allocator.h", "src/base/adapters.h", "src/base/atomic-utils.h", "src/base/atomicops.h", "src/base/atomicops_internals_arm64_gcc.h", "src/base/atomicops_internals_arm_gcc.h", "src/base/atomicops_internals_atomicword_compat.h", "src/base/atomicops_internals_mac.h", "src/base/atomicops_internals_mips64_gcc.h", "src/base/atomicops_internals_mips_gcc.h", "src/base/atomicops_internals_s390_gcc.h", "src/base/atomicops_internals_tsan.h", "src/base/atomicops_internals_x86_gcc.cc", "src/base/atomicops_internals_x86_gcc.h", "src/base/atomicops_internals_x86_msvc.h", "src/base/bits.cc", "src/base/bits.h", "src/base/build_config.h", "src/base/cpu.cc", "src/base/cpu.h", "src/base/debug/stack_trace.cc", "src/base/debug/stack_trace.h", "src/base/division-by-constant.cc", "src/base/division-by-constant.h", "src/base/file-utils.cc", "src/base/file-utils.h", "src/base/flags.h", "src/base/format-macros.h", "src/base/free_deleter.h", "src/base/functional.cc", "src/base/functional.h", "src/base/hashmap.h", "src/base/ieee754.cc", "src/base/ieee754.h", "src/base/iterator.h", "src/base/lazy-instance.h", "src/base/logging.cc", "src/base/logging.h", "src/base/macros.h", "src/base/once.cc", "src/base/once.h", "src/base/platform/condition-variable.cc", "src/base/platform/condition-variable.h", "src/base/platform/elapsed-timer.h", "src/base/platform/mutex.cc", "src/base/platform/mutex.h", "src/base/platform/platform.h", "src/base/platform/semaphore.cc", "src/base/platform/semaphore.h", "src/base/platform/time.cc", "src/base/platform/time.h", "src/base/safe_conversions.h", "src/base/safe_conversions_impl.h", "src/base/safe_math.h", "src/base/safe_math_impl.h", "src/base/sys-info.cc", "src/base/sys-info.h", "src/base/utils/random-number-generator.cc", "src/base/utils/random-number-generator.h", ] configs = [ ":internal_config_base" ] defines = [] if (is_posix) { sources += [ "src/base/platform/platform-posix.cc" ] } if (is_linux) { sources += [ "src/base/debug/stack_trace_posix.cc", "src/base/platform/platform-linux.cc", ] libs = [ "dl", "rt", ] } else if (is_android) { if (current_toolchain == host_toolchain) { libs = [ "dl", "rt", ] if (host_os == "mac") { sources += [ "src/base/debug/stack_trace_posix.cc", "src/base/platform/platform-macos.cc", ] } else { sources += [ "src/base/debug/stack_trace_posix.cc", "src/base/platform/platform-linux.cc", ] } } else { sources += [ "src/base/debug/stack_trace_android.cc", "src/base/platform/platform-linux.cc", ] } } else if (is_mac) { sources += [ "src/base/debug/stack_trace_posix.cc", "src/base/platform/platform-macos.cc", ] } else if (is_win) { # TODO(jochen): Add support for cygwin. sources += [ "src/base/debug/stack_trace_win.cc", "src/base/platform/platform-win32.cc", "src/base/win32-headers.h", ] defines += [ "_CRT_RAND_S" ] # for rand_s() libs = [ "dbghelp.lib", "shlwapi.lib", "winmm.lib", "ws2_32.lib", ] } # TODO(jochen): Add support for qnx, freebsd, openbsd, netbsd, and solaris. } v8_source_set("v8_libplatform") { sources = [ "//base/trace_event/common/trace_event_common.h", "include/libplatform/libplatform.h", "include/libplatform/v8-tracing.h", "src/libplatform/default-platform.cc", "src/libplatform/default-platform.h", "src/libplatform/task-queue.cc", "src/libplatform/task-queue.h", "src/libplatform/tracing/trace-buffer.cc", "src/libplatform/tracing/trace-buffer.h", "src/libplatform/tracing/trace-config.cc", "src/libplatform/tracing/trace-object.cc", "src/libplatform/tracing/trace-writer.cc", "src/libplatform/tracing/trace-writer.h", "src/libplatform/tracing/tracing-controller.cc", "src/libplatform/worker-thread.cc", "src/libplatform/worker-thread.h", ] configs = [ ":internal_config_base" ] public_configs = [ ":libplatform_config" ] deps = [ ":v8_libbase", ] } v8_source_set("v8_libsampler") { sources = [ "src/libsampler/sampler.cc", "src/libsampler/sampler.h", ] configs = [ ":internal_config_base" ] public_configs = [ ":libsampler_config" ] deps = [ ":v8_libbase", ] } v8_source_set("fuzzer_support") { visibility = [ ":*" ] # Only targets in this file can depend on this. sources = [ "test/fuzzer/fuzzer-support.cc", "test/fuzzer/fuzzer-support.h", ] configs = [ ":internal_config_base" ] deps = [ ":v8_maybe_snapshot", ] public_deps = [ ":v8_libplatform", ] } v8_source_set("simple_fuzzer") { sources = [ "test/fuzzer/fuzzer.cc", ] configs = [ ":internal_config_base" ] } ############################################################################### # Executables # if (current_toolchain == v8_snapshot_toolchain) { v8_executable("mksnapshot") { visibility = [ ":*" ] # Only targets in this file can depend on this. sources = [ "src/snapshot/mksnapshot.cc", ] configs = [ ":internal_config" ] deps = [ ":v8_base", ":v8_libplatform", ":v8_nosnapshot", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] } } v8_executable("mkpeephole") { # mkpeephole needs to be built for the build host so the peephole lookup # table can built during build. The table depends on the properties of # bytecodes that are described in bytecodes.{cc,h}. visibility = [ ":*" ] # Only targets in this file can depend on this. sources = [ "src/interpreter/bytecode-peephole-optimizer.h", "src/interpreter/bytecodes.cc", "src/interpreter/bytecodes.h", "src/interpreter/mkpeephole.cc", ] configs = [ ":external_config", ":internal_config", ] deps = [ ":v8_libbase", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] } ############################################################################### # Public targets # want_v8_shell = (current_toolchain == host_toolchain && v8_toolset_for_shell == "host") || (current_toolchain == v8_snapshot_toolchain && v8_toolset_for_shell == "host") || (current_toolchain != host_toolchain && v8_toolset_for_shell == "target") group("gn_all") { testonly = true deps = [ ":d8", ":v8_hello_world", ":v8_parser_shell", ":v8_sample_process", ":v8_simple_json_fuzzer", ":v8_simple_parser_fuzzer", ":v8_simple_regexp_fuzzer", ":v8_simple_wasm_asmjs_fuzzer", ":v8_simple_wasm_fuzzer", "test:gn_all", "tools:gn_all", ] if (want_v8_shell) { deps += [ ":v8_shell" ] } if (v8_test_isolation_mode != "noop") { deps += [ ":d8_run" ] } } if (is_component_build) { v8_component("v8") { sources = [ "src/v8dll-main.cc", ] deps = [ ":v8_dump_build_config", ] public_deps = [ ":v8_base", ":v8_maybe_snapshot", ] configs = [ ":internal_config" ] public_configs = [ ":external_config" ] } } else { group("v8") { deps = [ ":v8_dump_build_config", ] public_deps = [ ":v8_base", ":v8_maybe_snapshot", ] public_configs = [ ":external_config" ] } } v8_executable("d8") { sources = [ "src/d8.cc", "src/d8.h", ] configs = [ # Note: don't use :internal_config here because this target will get # the :external_config applied to it by virtue of depending on :v8, and # you can't have both applied to the same target. ":internal_config_base", ] deps = [ ":d8_js2c", ":v8", ":v8_libplatform", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] # TODO(jochen): Add support for vtunejit. if (is_posix) { sources += [ "src/d8-posix.cc" ] } else if (is_win) { sources += [ "src/d8-windows.cc" ] } if (!is_component_build) { sources += [ "$target_gen_dir/d8-js.cc" ] } if (v8_enable_i18n_support) { deps += [ "//third_party/icu" ] } } v8_isolate_run("d8") { deps = [ ":d8", ] isolate = "//src/d8.isolate" } v8_executable("v8_hello_world") { sources = [ "samples/hello-world.cc", ] configs = [ # Note: don't use :internal_config here because this target will get # the :external_config applied to it by virtue of depending on :v8, and # you can't have both applied to the same target. ":internal_config_base", ] deps = [ ":v8", ":v8_libplatform", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] if (v8_enable_i18n_support) { deps += [ "//third_party/icu" ] } } v8_executable("v8_sample_process") { sources = [ "samples/process.cc", ] configs = [ # Note: don't use :internal_config here because this target will get # the :external_config applied to it by virtue of depending on :v8, and # you can't have both applied to the same target. ":internal_config_base", ] deps = [ ":v8", ":v8_libplatform", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] if (v8_enable_i18n_support) { deps += [ "//third_party/icu" ] } } v8_executable("v8_parser_shell") { sources = [ "tools/parser-shell.cc", "tools/shell-utils.h", ] configs = [ ":external_config", ":internal_config_base", ] deps = [ ":v8_libplatform", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] if (is_component_build) { # v8_parser_shell can't be built against a shared library, so we # need to depend on the underlying static target in that case. deps += [ ":v8_maybe_snapshot" ] } else { deps += [ ":v8" ] } if (v8_enable_i18n_support) { deps += [ "//third_party/icu" ] } if (is_win) { # Suppress warnings about importing locally defined symbols. if (is_component_build) { ldflags = [ "/ignore:4049", "/ignore:4217", ] } } } if (want_v8_shell) { v8_executable("v8_shell") { sources = [ "samples/shell.cc", ] configs = [ # Note: don't use :internal_config here because this target will get # the :external_config applied to it by virtue of depending on :v8, and # you can't have both applied to the same target. ":internal_config_base", ] deps = [ ":v8", ":v8_libplatform", "//build/config/sanitizers:deps", "//build/win:default_exe_manifest", ] if (v8_enable_i18n_support) { deps += [ "//third_party/icu" ] } } } template("v8_fuzzer") { name = target_name forward_variables_from(invoker, "*") v8_executable("v8_simple_" + name) { deps = [ ":" + name, ":simple_fuzzer", "//build/win:default_exe_manifest", ] configs = [ ":external_config" ] } } v8_source_set("json_fuzzer") { sources = [ "test/fuzzer/json.cc", ] deps = [ ":fuzzer_support", ] configs = [ ":internal_config" ] } v8_fuzzer("json_fuzzer") { } v8_source_set("parser_fuzzer") { sources = [ "test/fuzzer/parser.cc", ] deps = [ ":fuzzer_support", ] configs = [ ":internal_config" ] } v8_fuzzer("parser_fuzzer") { } v8_source_set("regexp_fuzzer") { sources = [ "test/fuzzer/regexp.cc", ] deps = [ ":fuzzer_support", ] configs = [ ":internal_config" ] } v8_fuzzer("regexp_fuzzer") { } v8_source_set("wasm_fuzzer") { sources = [ "test/fuzzer/wasm.cc", ] deps = [ ":fuzzer_support", ] configs = [ ":internal_config" ] } v8_fuzzer("wasm_fuzzer") { } v8_source_set("wasm_asmjs_fuzzer") { sources = [ "test/fuzzer/wasm-asmjs.cc", ] deps = [ ":fuzzer_support", ] configs = [ ":internal_config" ] } v8_fuzzer("wasm_asmjs_fuzzer") { } ================================================ FILE: samples/GN/android-rules.gni ================================================ # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # Do not add any imports to non-//build directories here. # Some projects (e.g. V8) do not have non-build directories DEPS'ed in. import("//build/config/android/config.gni") import("//build/config/android/internal_rules.gni") import("//build/config/compiler/compiler.gni") import("//build/config/dcheck_always_on.gni") import("//build/toolchain/toolchain.gni") assert(is_android) # Creates a dist directory for a native executable. # # Running a native executable on a device requires all the shared library # dependencies of that executable. To make it easier to install and run such an # executable, this will create a directory containing the native exe and all # it's library dependencies. # # Note: It's usually better to package things as an APK than as a native # executable. # # Variables # dist_dir: Directory for the exe and libraries. Everything in this directory # will be deleted before copying in the exe and libraries. # binary: Path to (stripped) executable. # extra_files: List of extra files to copy in (optional). # # Example # create_native_executable_dist("foo_dist") { # dist_dir = "$root_build_dir/foo_dist" # binary = "$root_build_dir/foo" # deps = [ ":the_thing_that_makes_foo" ] # } template("create_native_executable_dist") { forward_variables_from(invoker, [ "testonly" ]) _libraries_list = "${target_gen_dir}/${target_name}_library_dependencies.list" _find_deps_target_name = "${target_name}__find_library_dependencies" # TODO(agrieve): Extract dependent libs from GN rather than readelf. action(_find_deps_target_name) { forward_variables_from(invoker, [ "deps" ]) script = "//build/android/gyp/write_ordered_libraries.py" depfile = "$target_gen_dir/$target_name.d" inputs = [ invoker.binary, android_readelf, ] outputs = [ _libraries_list, ] rebased_binaries = rebase_path([ invoker.binary ], root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), "--input-libraries=$rebased_binaries", "--libraries-dir", rebase_path(root_shlib_dir, root_build_dir), "--output", rebase_path(_libraries_list, root_build_dir), "--readelf", rebase_path(android_readelf, root_build_dir), ] } copy_ex(target_name) { clear_dir = true inputs = [ _libraries_list, invoker.binary, ] dest = invoker.dist_dir data = [ "${invoker.dist_dir}/", ] _rebased_libraries_list = rebase_path(_libraries_list, root_build_dir) _rebased_binaries_list = rebase_path([ invoker.binary ], root_build_dir) args = [ "--files=@FileArg($_rebased_libraries_list:lib_paths)", "--files=$_rebased_binaries_list", ] if (defined(invoker.extra_files)) { _rebased_extra_files = rebase_path(invoker.extra_files, root_build_dir) args += [ "--files=$_rebased_extra_files" ] } deps = [ ":$_find_deps_target_name", ] if (defined(invoker.deps)) { deps += invoker.deps } } } # Writes a script to root_out_dir/bin that passes --output-directory to the # wrapped script, in addition to forwarding arguments. Most / all of these # wrappers should be made deps of //tools/android:android_tools. # # Variables # target: Script to wrap. # flag_name: Default is "--output-directory" # # Example # wrapper_script("foo_wrapper") { # target = "//pkg/foo.py" # } template("wrapper_script") { action(target_name) { _name = get_path_info(invoker.target, "name") _output = "$root_out_dir/bin/$_name" script = "//build/android/gyp/create_tool_wrapper.py" outputs = [ _output, ] # The target isn't actually used by the script, but it's nice to have GN # check that it exists. inputs = [ invoker.target, ] args = [ "--output", rebase_path(_output, root_build_dir), "--target", rebase_path(invoker.target, root_build_dir), "--output-directory", rebase_path(root_out_dir, root_build_dir), ] if (defined(invoker.flag_name)) { args += [ "--flag-name=${invoker.flag_name}" ] } } } if (enable_java_templates) { import("//build/config/sanitizers/sanitizers.gni") import("//tools/grit/grit_rule.gni") # Declare a jni target # # This target generates the native jni bindings for a set of .java files. # # See base/android/jni_generator/jni_generator.py for more info about the # format of generating JNI bindings. # # Variables # sources: list of .java files to generate jni for # jni_package: subdirectory path for generated bindings # # Example # generate_jni("foo_jni") { # sources = [ # "android/java/src/org/chromium/foo/Foo.java", # "android/java/src/org/chromium/foo/FooUtil.java", # ] # jni_package = "foo" # } template("generate_jni") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.sources)) assert(defined(invoker.jni_package)) jni_package = invoker.jni_package base_output_dir = "${target_gen_dir}/${target_name}" package_output_dir = "${base_output_dir}/${jni_package}" jni_output_dir = "${package_output_dir}/jni" jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h" foreach_target_name = "${target_name}__jni_gen" action_foreach(foreach_target_name) { script = "//base/android/jni_generator/jni_generator.py" depfile = "$target_gen_dir/$target_name.{{source_name_part}}.d" sources = invoker.sources outputs = [ "${jni_output_dir}/{{source_name_part}}_jni.h", ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--input_file={{source}}", "--optimize_generation=1", "--ptr_type=long", "--output_dir", rebase_path(jni_output_dir, root_build_dir), "--includes", rebase_path(jni_generator_include, jni_output_dir), "--native_exports_optional", ] if (enable_profiling) { args += [ "--enable_profiling" ] } } config("jni_includes_${target_name}") { # TODO(cjhopman): #includes should probably all be relative to # base_output_dir. Remove that from this config once the includes are # updated. include_dirs = [ base_output_dir, package_output_dir, ] } group(target_name) { forward_variables_from(invoker, [ "deps", "public_deps", "visibility", ]) if (!defined(public_deps)) { public_deps = [] } public_deps += [ ":$foreach_target_name" ] public_configs = [ ":jni_includes_${target_name}" ] } } # Declare a jni target for a prebuilt jar # # This target generates the native jni bindings for a set of classes in a .jar. # # See base/android/jni_generator/jni_generator.py for more info about the # format of generating JNI bindings. # # Variables # classes: list of .class files in the jar to generate jni for. These should # include the full path to the .class file. # jni_package: subdirectory path for generated bindings # jar_file: the path to the .jar. If not provided, will default to the sdk's # android.jar # # deps, public_deps: As normal # # Example # generate_jar_jni("foo_jni") { # classes = [ # "android/view/Foo.class", # ] # jni_package = "foo" # } template("generate_jar_jni") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.classes)) assert(defined(invoker.jni_package)) if (defined(invoker.jar_file)) { jar_file = invoker.jar_file } else { jar_file = android_sdk_jar } jni_package = invoker.jni_package base_output_dir = "${root_gen_dir}/${target_name}/${jni_package}" jni_output_dir = "${base_output_dir}/jni" jni_generator_include = "//base/android/jni_generator/jni_generator_helper.h" # TODO(cjhopman): make jni_generator.py support generating jni for multiple # .class files from a .jar. jni_actions = [] foreach(class, invoker.classes) { _classname_list = [] _classname_list = process_file_template([ class ], "{{source_name_part}}") classname = _classname_list[0] jni_target_name = "${target_name}__jni_${classname}" jni_actions += [ ":$jni_target_name" ] action(jni_target_name) { # The sources aren't compiled so don't check their dependencies. check_includes = false depfile = "$target_gen_dir/$target_name.d" script = "//base/android/jni_generator/jni_generator.py" sources = [ jar_file, ] outputs = [ "${jni_output_dir}/${classname}_jni.h", ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--jar_file", rebase_path(jar_file, root_build_dir), "--input_file", class, "--optimize_generation=1", "--ptr_type=long", "--output_dir", rebase_path(jni_output_dir, root_build_dir), "--includes", rebase_path(jni_generator_include, jni_output_dir), "--native_exports_optional", ] if (enable_profiling) { args += [ "--enable_profiling" ] } } } config("jni_includes_${target_name}") { include_dirs = [ base_output_dir ] } group(target_name) { public_deps = [] forward_variables_from(invoker, [ "deps", "public_deps", "visibility", ]) public_deps += jni_actions public_configs = [ ":jni_includes_${target_name}" ] } } # Declare a target for c-preprocessor-generated java files # # NOTE: For generating Java conterparts to enums prefer using the java_cpp_enum # rule instead. # # This target generates java files using the host C pre-processor. Each file in # sources will be compiled using the C pre-processor. If include_path is # specified, it will be passed (with --I) to the pre-processor. # # This target will create a single .srcjar. Adding this target to an # android_library target's srcjar_deps will make the generated java files be # included in that library's final outputs. # # Variables # sources: list of files to be processed by the C pre-processor. For each # file in sources, there will be one .java file in the final .srcjar. For a # file named FooBar.template, a java file will be created with name # FooBar.java. # inputs: additional compile-time dependencies. Any files # `#include`-ed in the templates should be listed here. # package_name: this will be the subdirectory for each .java file in the # .srcjar. # # Example # java_cpp_template("foo_generated_enum") { # sources = [ # "android/java/templates/Foo.template", # ] # inputs = [ # "android/java/templates/native_foo_header.h", # ] # # package_name = "org/chromium/base/library_loader" # include_path = "android/java/templates" # } template("java_cpp_template") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _include_path = "//" if (defined(invoker.include_path)) { _include_path = invoker.include_path } _apply_gcc_target_name = "${target_name}__apply_gcc" _base_gen_dir = "${target_gen_dir}/${target_name}/java_cpp_template" action_foreach(_apply_gcc_target_name) { forward_variables_from(invoker, [ "deps", "public_deps", "data_deps", ]) script = "//build/android/gyp/gcc_preprocess.py" if (defined(invoker.inputs)) { inputs = invoker.inputs + [] } depfile = "${target_gen_dir}/${invoker.target_name}_{{source_name_part}}.d" sources = invoker.sources outputs = [ "$_base_gen_dir/${invoker.package_name}/{{source_name_part}}.java", ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--include-path", rebase_path(_include_path, root_build_dir), "--output", rebase_path(outputs[0], root_build_dir), "--template={{source}}", ] if (defined(invoker.defines)) { foreach(def, invoker.defines) { args += [ "--defines", def, ] } } } # Filter out .d files. set_sources_assignment_filter([ "*.d" ]) sources = get_target_outputs(":$_apply_gcc_target_name") zip(target_name) { forward_variables_from(invoker, [ "visibility" ]) inputs = sources output = "${target_gen_dir}/${target_name}.srcjar" base_dir = _base_gen_dir deps = [ ":$_apply_gcc_target_name", ] } } # Declare a target for generating Java classes from C++ enums. # # This target generates Java files from C++ enums using a script. # # This target will create a single .srcjar. Adding this target to an # android_library target's srcjar_deps will make the generated java files be # included in that library's final outputs. # # Variables # sources: list of files to be processed by the script. For each annotated # enum contained in the sources files the script will generate a .java # file with the same name as the name of the enum. # # Example # java_cpp_enum("foo_generated_enum") { # sources = [ # "src/native_foo_header.h", # ] # } template("java_cpp_enum") { action(target_name) { # The sources aren't compiled so don't check their dependencies. check_includes = false set_sources_assignment_filter([]) assert(defined(invoker.sources)) forward_variables_from(invoker, [ "sources", "testonly", "visibility", ]) script = "//build/android/gyp/java_cpp_enum.py" depfile = "$target_gen_dir/$target_name.d" _srcjar_path = "${target_gen_dir}/${target_name}.srcjar" _rebased_srcjar_path = rebase_path(_srcjar_path, root_build_dir) _rebased_sources = rebase_path(invoker.sources, root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), "--srcjar=$_rebased_srcjar_path", ] + _rebased_sources outputs = [ _srcjar_path, ] } } # Declare a target for processing a Jinja template. # # Variables # input: The template file to be processed. # output: Where to save the result. # variables: (Optional) A list of variables to make available to the template # processing environment, e.g. ["name=foo", "color=red"]. # # Example # jinja_template("chrome_public_manifest") { # input = "java/AndroidManifest.xml" # output = "$target_gen_dir/AndroidManifest.xml" # } template("jinja_template") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.input)) assert(defined(invoker.output)) action(target_name) { forward_variables_from(invoker, [ "visibility", "deps", ]) sources = [ invoker.input, ] script = "//build/android/gyp/jinja_template.py" depfile = "$target_gen_dir/$target_name.d" outputs = [ invoker.output, ] args = [ "--loader-base-dir", rebase_path("//", root_build_dir), "--inputs", rebase_path(invoker.input, root_build_dir), "--output", rebase_path(invoker.output, root_build_dir), "--depfile", rebase_path(depfile, root_build_dir), ] if (defined(invoker.variables)) { variables = invoker.variables args += [ "--variables=${variables}" ] } } } # Declare a target for processing Android resources as Jinja templates. # # This takes an Android resource directory where each resource is a Jinja # template, processes each template, then packages the results in a zip file # which can be consumed by an android resources, library, or apk target. # # If this target is included in the deps of an android resources/library/apk, # the resources will be included with that target. # # Variables # resources: The list of resources files to process. # res_dir: The resource directory containing the resources. # variables: (Optional) A list of variables to make available to the template # processing environment, e.g. ["name=foo", "color=red"]. # # Example # jinja_template_resources("chrome_public_template_resources") { # res_dir = "res_template" # resources = ["res_template/xml/syncable.xml"] # variables = ["color=red"] # } template("jinja_template_resources") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.resources)) assert(defined(invoker.res_dir)) _base_path = "$target_gen_dir/$target_name" _resources_zip = _base_path + ".resources.zip" _build_config = _base_path + ".build_config" write_build_config("${target_name}__build_config") { build_config = _build_config resources_zip = _resources_zip type = "android_resources" if (defined(invoker.deps)) { possible_config_deps = invoker.deps } } action("${target_name}__template") { forward_variables_from(invoker, [ "deps" ]) sources = invoker.resources script = "//build/android/gyp/jinja_template.py" depfile = "$target_gen_dir/$target_name.d" outputs = [ _resources_zip, ] rebased_resources = rebase_path(invoker.resources, root_build_dir) args = [ "--inputs=${rebased_resources}", "--inputs-base-dir", rebase_path(invoker.res_dir, root_build_dir), "--outputs-zip", rebase_path(_resources_zip, root_build_dir), "--depfile", rebase_path(depfile, root_build_dir), ] if (defined(invoker.variables)) { variables = invoker.variables args += [ "--variables=${variables}" ] } } group(target_name) { public_deps = [ ":${target_name}__build_config", ":${target_name}__template", ] } } # Declare an Android resources target # # This creates a resources zip file that will be used when building an Android # library or apk and included into a final apk. # # To include these resources in a library/apk, this target should be listed in # the library's deps. A library/apk will also include any resources used by its # own dependencies. # # Variables # deps: Specifies the dependencies of this target. Any Android resources # listed in deps will be included by libraries/apks that depend on this # target. # resource_dirs: List of directories containing resources for this target. # generated_resource_dirs: List of directories containing resources for this # target which are *generated* by a dependency. |generated_resource_files| # must be specified if |generated_resource_dirs| is specified. # generated_resource_files: List of all files in |generated_resource_dirs|. # |generated_resource_dirs| must be specified in |generated_resource_files| # is specified. # android_manifest: AndroidManifest.xml for this target. Defaults to # //build/android/AndroidManifest.xml. # android_manifest_dep: Target that generates AndroidManifest (if applicable) # custom_package: java package for generated .java files. # v14_skip: If true, don't run v14 resource generator on this. Defaults to # false. (see build/android/gyp/generate_v14_compatible_resources.py) # shared_resources: If true make a resource package that can be loaded by a # different application at runtime to access the package's resources. # app_as_shared_lib: If true make a resource package that can be loaded as # both shared_resources and normal application. # Example: # android_resources("foo_resources") { # deps = [":foo_strings_grd"] # resource_dirs = ["res"] # custom_package = "org.chromium.foo" # } # # android_resources("foo_resources_overrides") { # deps = [":foo_resources"] # resource_dirs = ["res_overrides"] # } template("android_resources") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.resource_dirs)) base_path = "$target_gen_dir/$target_name" zip_path = base_path + ".resources.zip" srcjar_path = base_path + ".srcjar" r_text_path = base_path + "_R.txt" build_config = base_path + ".build_config" build_config_target_name = "${target_name}__build_config" process_resources_target_name = "${target_name}__process_resources" final_target_name = target_name write_build_config(build_config_target_name) { type = "android_resources" forward_variables_from(invoker, [ "android_manifest", "custom_package", ]) resource_dirs = [] if (defined(invoker.resource_dirs)) { resource_dirs += invoker.resource_dirs } if (defined(invoker.generated_resource_dirs)) { resource_dirs += invoker.generated_resource_dirs } if (defined(invoker.deps)) { possible_config_deps = invoker.deps } if (defined(invoker.android_manifest_dep)) { deps = [ invoker.android_manifest_dep, ] } # No package means resources override their deps. if (defined(custom_package) || defined(android_manifest)) { r_text = r_text_path } else { assert(defined(invoker.deps), "Must specify deps when custom_package is omitted.") } resources_zip = zip_path srcjar = srcjar_path } process_resources(process_resources_target_name) { forward_variables_from(invoker, [ "app_as_shared_lib", "android_manifest", "custom_package", "deps", "generated_resource_dirs", "generated_resource_files", "resource_dirs", "shared_resources", "v14_skip", ]) if (!defined(deps)) { deps = [] } deps += [ ":$build_config_target_name" ] if (defined(invoker.android_manifest_dep)) { deps += [ invoker.android_manifest_dep ] } # Always generate R.onResourcesLoaded() method, it is required for # compiling ResourceRewriter, there is no side effect because the # generated R.class isn't used in final apk. shared_resources = true if (!defined(android_manifest)) { android_manifest = "//build/android/AndroidManifest.xml" } } group(final_target_name) { forward_variables_from(invoker, [ "visibility" ]) public_deps = [ ":${target_name}__process_resources", ] } } # Declare an Android assets target. # # Defines a set of files to include as assets in a dependent apk. # # To include these assets in an apk, this target should be listed in # the apk's deps, or in the deps of a library target used by an apk. # # Variables # deps: Specifies the dependencies of this target. Any Android assets # listed in deps will be included by libraries/apks that depend on this # target. # sources: List of files to include as assets. # renaming_sources: List of files to include as assets and be renamed. # renaming_destinations: List of asset paths for files in renaming_sources. # disable_compression: Whether to disable compression for files that are # known to be compressable (default: false). # # Example: # android_assets("content_shell_assets") { # deps = [ # ":generates_foo", # ":other_assets", # ] # sources = [ # "//path/asset1.png", # "//path/asset2.png", # "$target_gen_dir/foo.dat", # ] # } # # android_assets("overriding_content_shell_assets") { # deps = [ ":content_shell_assets" ] # # Override foo.dat from content_shell_assets. # sources = [ "//custom/foo.dat" ] # renaming_sources = [ "//path/asset2.png" ] # renaming_destinations = [ "renamed/asset2.png" ] # } template("android_assets") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _build_config = "$target_gen_dir/$target_name.build_config" _build_config_target_name = "${target_name}__build_config" write_build_config(_build_config_target_name) { type = "android_assets" build_config = _build_config forward_variables_from(invoker, [ "disable_compression" ]) if (defined(invoker.deps)) { possible_config_deps = invoker.deps } if (defined(invoker.sources)) { asset_sources = invoker.sources } if (defined(invoker.renaming_sources)) { assert(defined(invoker.renaming_destinations)) _source_count = 0 foreach(_, invoker.renaming_sources) { _source_count += 1 } _dest_count = 0 foreach(_, invoker.renaming_destinations) { _dest_count += 1 } assert( _source_count == _dest_count, "android_assets() renaming_sources.length != renaming_destinations.length") asset_renaming_sources = invoker.renaming_sources asset_renaming_destinations = invoker.renaming_destinations } } group(target_name) { forward_variables_from(invoker, [ "deps", "visibility", ]) public_deps = [ ":$_build_config_target_name", ] } } # Declare a group() that supports forwarding java dependency information. # # Example # java_group("conditional_deps") { # if (enable_foo) { # deps = [":foo_java"] # } # } template("java_group") { forward_variables_from(invoker, [ "testonly" ]) write_build_config("${target_name}__build_config") { type = "group" build_config = "$target_gen_dir/${invoker.target_name}.build_config" if (defined(invoker.deps)) { possible_config_deps = invoker.deps } } group(target_name) { forward_variables_from(invoker, "*") if (!defined(deps)) { deps = [] } deps += [ ":${target_name}__build_config" ] } } # Declare a target that generates localized strings.xml from a .grd file. # # If this target is included in the deps of an android resources/library/apk, # the strings.xml will be included with that target. # # Variables # deps: Specifies the dependencies of this target. # grd_file: Path to the .grd file to generate strings.xml from. # outputs: Expected grit outputs (see grit rule). # # Example # java_strings_grd("foo_strings_grd") { # grd_file = "foo_strings.grd" # } template("java_strings_grd") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) base_path = "$target_gen_dir/$target_name" resources_zip = base_path + ".resources.zip" build_config = base_path + ".build_config" write_build_config("${target_name}__build_config") { type = "android_resources" } # Put grit files into this subdirectory of target_gen_dir. extra_output_path = target_name + "_grit_output" grit_target_name = "${target_name}__grit" grit_output_dir = "$target_gen_dir/$extra_output_path" grit(grit_target_name) { forward_variables_from(invoker, [ "deps" ]) grit_flags = [ "-E", "ANDROID_JAVA_TAGGED_ONLY=false", ] output_dir = grit_output_dir resource_ids = "" source = invoker.grd_file outputs = invoker.outputs } # This needs to get outputs from grit's internal target, not the final # source_set. generate_strings_outputs = get_target_outputs(":${grit_target_name}_grit") zip("${target_name}__zip") { base_dir = grit_output_dir inputs = generate_strings_outputs output = resources_zip deps = [ ":$grit_target_name", ] } group(target_name) { public_deps = [ ":${target_name}__build_config", ":${target_name}__zip", ] } } # Declare a target that packages strings.xml generated from a grd file. # # If this target is included in the deps of an android resources/library/apk, # the strings.xml will be included with that target. # # Variables # grit_output_dir: directory containing grit-generated files. # generated_files: list of android resource files to package. # # Example # java_strings_grd_prebuilt("foo_strings_grd") { # grit_output_dir = "$root_gen_dir/foo/grit" # generated_files = [ # "values/strings.xml" # ] # } template("java_strings_grd_prebuilt") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) base_path = "$target_gen_dir/$target_name" resources_zip = base_path + ".resources.zip" build_config = base_path + ".build_config" build_config_target_name = "${target_name}__build_config" zip_target_name = "${target_name}__zip" final_target_name = target_name write_build_config(build_config_target_name) { type = "android_resources" } zip(zip_target_name) { visibility = [ ":$final_target_name" ] base_dir = invoker.grit_output_dir inputs = rebase_path(invoker.generated_files, ".", base_dir) output = resources_zip deps = [ ":$build_config_target_name", ] if (defined(invoker.deps)) { deps += invoker.deps } } group(final_target_name) { forward_variables_from(invoker, [ "visibility" ]) public_deps = [ ":$zip_target_name", ] } } # Declare a Java executable target # # This target creates an executable from java code and libraries. The executable # will be in the output folder's /bin/ directory. # # Variables # deps: Specifies the dependencies of this target. Java targets in this list # will be included in the executable (and the javac classpath). # java_files: List of .java files included in this library. # srcjar_deps: List of srcjar dependencies. The .java files in the srcjars # will be added to java_files and be included in this library. # srcjars: List of srcjars to be included in this library, together with the # ones obtained from srcjar_deps. # bypass_platform_checks: Disables checks about cross-platform (Java/Android) # dependencies for this target. This will allow depending on an # android_library target, for example. # chromium_code: If true, extra analysis warning/errors will be enabled. # enable_errorprone: If true, enables the errorprone compiler. # enable_incremental_javac_override: Overrides the # global enable_incremental_javac. # main_class: When specified, a wrapper script is created within # $root_build_dir/bin to launch the binary with the given class as the # entrypoint. # wrapper_script_args: List of additional arguments for the wrapper script. # # data_deps, testonly # # Example # java_binary("foo") { # java_files = [ "org/chromium/foo/FooMain.java" ] # deps = [ ":bar_java" ] # main_class = "org.chromium.foo.FooMain" # } template("java_binary") { set_sources_assignment_filter([]) java_library_impl(target_name) { forward_variables_from(invoker, "*") supports_android = false main_class = invoker.main_class is_java_binary = true } } # Declare a Junit executable target # # This target creates an executable from java code for running as a junit test # suite. The executable will be in the output folder's /bin/ directory. # # Variables # deps: Specifies the dependencies of this target. Java targets in this list # will be included in the executable (and the javac classpath). # # java_files: List of .java files included in this library. # srcjar_deps: List of srcjar dependencies. The .java files in the srcjars # will be added to java_files and be included in this library. # srcjars: List of srcjars to be included in this library, together with the # ones obtained from srcjar_deps. # # chromium_code: If true, extra analysis warning/errors will be enabled. # # Example # junit_binary("foo") { # java_files = [ "org/chromium/foo/FooTest.java" ] # deps = [ ":bar_java" ] # } template("junit_binary") { set_sources_assignment_filter([]) testonly = true _java_binary_target_name = "${target_name}__java_binary" _test_runner_target_name = "${target_name}__test_runner_script" test_runner_script(_test_runner_target_name) { test_name = invoker.target_name test_suite = invoker.target_name test_type = "junit" ignore_all_data_deps = true } java_binary(_java_binary_target_name) { deps = [] output_name = invoker.target_name forward_variables_from(invoker, "*") testonly = true bypass_platform_checks = true main_class = "org.chromium.testing.local.JunitTestMain" wrapper_script_name = "helper/$target_name" deps += [ "//testing/android/junit:junit_test_support", "//third_party/junit", "//third_party/mockito:mockito_java", "//third_party/robolectric:robolectric_all_java", ] } group(target_name) { public_deps = [ ":$_java_binary_target_name", ":$_test_runner_target_name", ] } } # Declare a java library target # # Variables # deps: Specifies the dependencies of this target. Java targets in this list # will be added to the javac classpath. # # java_files: List of .java files included in this library. # srcjar_deps: List of srcjar dependencies. The .java files in the srcjars # will be added to java_files and be included in this library. # srcjars: List of srcjars to be included in this library, together with the # ones obtained from srcjar_deps. # # input_jars_paths: A list of paths to the jars that should be included # in the classpath. These are in addition to library .jars that # appear in deps. # # chromium_code: If true, extra analysis warning/errors will be enabled. # enable_errorprone: If true, enables the errorprone compiler. # enable_incremental_javac_override: Overrides the global # enable_incremental_javac. # # jar_excluded_patterns: List of patterns of .class files to exclude from the # final jar. # # output_name: File name for the output .jar (not including extension). # Defaults to the input .jar file name. # # proguard_preprocess: If true, proguard preprocessing will be run. This can # be used to remove unwanted parts of the library. # proguard_preprocess_config: Path to the proguard config for preprocessing. # proguard_configs: List of proguard configs to use in final apk step for # any apk that depends on this library. # # supports_android: If true, Android targets (android_library, android_apk) # may depend on this target. Note: if true, this target must only use the # subset of Java available on Android. # bypass_platform_checks: Disables checks about cross-platform (Java/Android) # dependencies for this target. This will allow depending on an # android_library target, for example. # # additional_jar_files: Use to package additional files into the output jar. # Pass a list of length-2 lists with format # [ [ path_to_file, path_to_put_in_jar ] ] # # # data_deps, testonly # # Example # java_library("foo_java") { # java_files = [ # "org/chromium/foo/Foo.java", # "org/chromium/foo/FooInterface.java", # "org/chromium/foo/FooService.java", # ] # deps = [ # ":bar_java" # ] # srcjar_deps = [ # ":foo_generated_enum" # ] # jar_excluded_patterns = [ # "*/FooService.class", "*/FooService\$*.class" # ] # } template("java_library") { set_sources_assignment_filter([]) java_library_impl(target_name) { forward_variables_from(invoker, "*") } } # Declare a java library target for a prebuilt jar # # Variables # deps: Specifies the dependencies of this target. Java targets in this list # will be added to the javac classpath. # jar_path: Path to the prebuilt jar. # jar_dep: Target that builds jar_path (optional). # main_class: When specified, a wrapper script is created within # $root_build_dir/bin to launch the binary with the given class as the # entrypoint. # output_name: File name for the output .jar (not including extension). # Defaults to the input .jar file name. # proguard_preprocess: If true, proguard preprocessing will be run. This can # be used to remove unwanted parts of the library. # proguard_preprocess_config: Path to the proguard config for preprocessing. # proguard_configs: List of proguard configs to use in final apk step for # any apk that depends on this library. # supports_android: If true, Android targets (android_library, android_apk) # may depend on this target. Note: if true, this target must only use the # subset of Java available on Android. # # Example # java_prebuilt("foo_java") { # jar_path = "foo.jar" # deps = [ # ":foo_resources", # ":bar_java" # ] # } template("java_prebuilt") { set_sources_assignment_filter([]) java_prebuilt_impl(target_name) { forward_variables_from(invoker, "*") } } # Declare an Android library target # # This target creates an Android library containing java code and Android # resources. # # Variables # deps: Specifies the dependencies of this target. Java targets in this list # will be added to the javac classpath. Android resources in dependencies # will be used when building this library. # # java_files: List of .java files included in this library. # srcjar_deps: List of srcjar dependencies. The .java files in the srcjars # will be added to java_files and be included in this library. # srcjars: List of srcjars to be included in this library, together with the # ones obtained from srcjar_deps. # # input_jars_paths: A list of paths to the jars that should be included # in the classpath. These are in addition to library .jars that # appear in deps. # # chromium_code: If true, extra analysis warning/errors will be enabled. # enable_errorprone: If true, enables the errorprone compiler. # enable_incremental_javac_override: Overrides the global # enable_incremental_javac. # # jar_excluded_patterns: List of patterns of .class files to exclude from the # final jar. # # proguard_preprocess: If true, proguard preprocessing will be run. This can # be used to remove unwanted parts of the library. # proguard_preprocess_config: Path to the proguard config for preprocessing. # proguard_configs: List of proguard configs to use in final apk step for # any apk that depends on this library. # # output_name: File name for the output .jar (not including extension). # Defaults to the input .jar file name. # dex_path: If set, the resulting .dex.jar file will be placed under this # path. # # alternative_android_sdk_ijar: if set, the given android_sdk_ijar file # replaces the default android_sdk_ijar. # # alternative_android_sdk_ijar_dep: the target that generates # alternative_android_sdk_ijar, must be set if alternative_android_sdk_ijar # is used. # # emma_never_instrument: Disables EMMA Java code coverage for this target. # # Example # android_library("foo_java") { # java_files = [ # "android/org/chromium/foo/Foo.java", # "android/org/chromium/foo/FooInterface.java", # "android/org/chromium/foo/FooService.java", # ] # deps = [ # ":bar_java" # ] # srcjar_deps = [ # ":foo_generated_enum" # ] # jar_excluded_patterns = [ # "*/FooService.class", "*/FooService\$*.class" # ] # } template("android_library") { set_sources_assignment_filter([]) assert(!defined(invoker.jar_path), "android_library does not support a custom jar path") if (defined(invoker.alternative_android_sdk_ijar)) { assert(defined(invoker.alternative_android_sdk_ijar_dep)) } java_library_impl(target_name) { forward_variables_from(invoker, "*") supports_android = true requires_android = true if (!defined(jar_excluded_patterns)) { jar_excluded_patterns = [] } jar_excluded_patterns += [ "*/R.class", "*/R\$*.class", "*/Manifest.class", "*/Manifest\$*.class", ] } } # Declare a target that packages a set of Java dependencies into a standalone # .dex.jar. # # Variables # deps: specifies the dependencies of this target. Android libraries in deps # will be packaged into the resulting .dex.jar file. # dex_path: location at which the output file will be put template("android_standalone_library") { set_sources_assignment_filter([]) deps_dex(target_name) { forward_variables_from(invoker, [ "deps", "dex_path", "excluded_jars", ]) } } # Declare an Android library target for a prebuilt jar # # This target creates an Android library containing java code and Android # resources. # # Variables # deps: Specifies the dependencies of this target. Java targets in this list # will be added to the javac classpath. Android resources in dependencies # will be used when building this library. # jar_path: Path to the prebuilt jar. # output_name: File name for the output .jar (not including extension). # Defaults to the input .jar file name. # proguard_preprocess: If true, proguard preprocessing will be run. This can # be used to remove unwanted parts of the library. # proguard_preprocess_config: Path to the proguard config for preprocessing. # proguard_configs: List of proguard configs to use in final apk step for # any apk that depends on this library. # # Example # android_java_prebuilt("foo_java") { # jar_path = "foo.jar" # deps = [ # ":foo_resources", # ":bar_java" # ] # } template("android_java_prebuilt") { set_sources_assignment_filter([]) java_prebuilt_impl(target_name) { forward_variables_from(invoker, "*") supports_android = true requires_android = true strip_resource_classes = true } } # Declare an Android apk target # # This target creates an Android APK containing java code, resources, assets, # and (possibly) native libraries. # # Variables # alternative_android_sdk_jar: The alternative android sdk jar used in # proguard. # android_aapt_path: Android aapt tool to replace default one to build # resource. # android_manifest: Path to AndroidManifest.xml. # android_manifest_dep: Target that generates AndroidManifest (if applicable) # chromium_code: If true, extra analysis warning/errors will be enabled. # dist_ijar_path: Path to create "${target_name}_dist_ijar" target # (used by instrumentation_test_apk). # data_deps: List of dependencies needed at runtime. These will be built but # won't change the generated .apk in any way (in fact they may be built # after the .apk is). # deps: List of dependencies. All Android java resources and libraries in the # "transitive closure" of these dependencies will be included in the apk. # Note: this "transitive closure" actually only includes such targets if # they are depended on through android_library or android_resources targets # (and so not through builtin targets like 'action', 'group', etc). # install_script_name: Name of wrapper script (default=target_name). # java_files: List of .java files to include in the apk. # srcjar_deps: List of srcjar dependencies. The .java files in the srcjars # will be added to java_files and be included in this apk. # apk_name: Name for final apk. # final_apk_path: Path to final built apk. Default is # $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name. # loadable_modules: List of paths to native libraries to include. Different # from |shared_libraries| in that: # * dependencies of this .so are not automatically included # * ".cr.so" is never added # * they are not side-loaded for _incremental targets. # * load_library_from_apk, use_chromium_linker, # and enable_relocation_packing do not apply # Use this instead of shared_libraries when you are going to load the library # conditionally, and only when shared_libraries doesn't work for you. # shared_libraries: List shared_library targets to bundle. If these # libraries depend on other shared_library targets, those dependencies will # also be included in the apk (e.g. for is_component_build). # secondary_abi_shared_libraries: secondary abi shared_library targets to # bundle. If these libraries depend on other shared_library targets, those # dependencies will also be included in the apk (e.g. for is_component_build). # native_lib_placeholders: List of placeholder filenames to add to the apk # (optional). # apk_under_test: For an instrumentation test apk, this is the target of the # tested apk. # include_all_resources - If true include all resource IDs in all generated # R.java files. # testonly: Marks this target as "test-only". # write_asset_list: Adds an extra file to the assets, which contains a list of # all other asset files. # requires_sdk_api_level_23: If defined and true, the apk is intended for # installation only on Android M or later. In these releases the system # linker does relocation unpacking, so we can enable it unconditionally. # secondary_native_libs (deprecated): The path of native libraries for secondary # app abi. # run_findbugs_override: Forces run_findbugs on or off. If undefined, the # default will use the build arg run_findbugs. # proguard_jar_path: The path to proguard.jar you wish to use. If undefined, # the proguard used will be the checked in one in //third_party/proguard. # # Example # android_apk("foo_apk") { # android_manifest = "AndroidManifest.xml" # java_files = [ # "android/org/chromium/foo/FooApplication.java", # "android/org/chromium/foo/FooActivity.java", # ] # deps = [ # ":foo_support_java" # ":foo_resources" # ] # srcjar_deps = [ # ":foo_generated_enum" # ] # shared_libraries = [ # ":my_shared_lib", # ] # } template("android_apk") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.final_apk_path) || defined(invoker.apk_name)) assert(defined(invoker.android_manifest)) gen_dir = "$target_gen_dir/$target_name" base_path = "$gen_dir/$target_name" _build_config = "$target_gen_dir/$target_name.build_config" resources_zip_path = "$base_path.resources.zip" _all_resources_zip_path = "$base_path.resources.all.zip" _jar_path = "$base_path.jar" _lib_dex_path = "$base_path.dex.jar" _rebased_lib_dex_path = rebase_path(_lib_dex_path, root_build_dir) _template_name = target_name enable_multidex = defined(invoker.enable_multidex) && invoker.enable_multidex if (enable_multidex) { final_dex_path = "$gen_dir/classes.dex.zip" } else { final_dex_path = "$gen_dir/classes.dex" } final_dex_target_name = "${_template_name}__final_dex" _final_apk_path = "" if (defined(invoker.final_apk_path)) { _final_apk_path = invoker.final_apk_path } else if (defined(invoker.apk_name)) { _final_apk_path = "$root_build_dir/apks/" + invoker.apk_name + ".apk" } _final_apk_path_no_ext_list = process_file_template([ _final_apk_path ], "{{source_dir}}/{{source_name_part}}") _final_apk_path_no_ext = _final_apk_path_no_ext_list[0] assert(_final_apk_path_no_ext != "") # Mark as used. _install_script_name = "install_$_template_name" if (defined(invoker.install_script_name)) { _install_script_name = invoker.install_script_name } _incremental_install_script_path = "${root_out_dir}/bin/${_install_script_name}_incremental" _version_code = android_default_version_code if (defined(invoker.version_code)) { _version_code = invoker.version_code } _version_name = android_default_version_name if (defined(invoker.version_name)) { _version_name = invoker.version_name } _keystore_path = android_keystore_path _keystore_name = android_keystore_name _keystore_password = android_keystore_password if (defined(invoker.keystore_path)) { _keystore_path = invoker.keystore_path _keystore_name = invoker.keystore_name _keystore_password = invoker.keystore_password } _srcjar_deps = [] if (defined(invoker.srcjar_deps)) { _srcjar_deps += invoker.srcjar_deps } _use_chromium_linker = defined(invoker.use_chromium_linker) && invoker.use_chromium_linker _enable_relocation_packing = defined(invoker.enable_relocation_packing) && invoker.enable_relocation_packing _load_library_from_apk = defined(invoker.load_library_from_apk) && invoker.load_library_from_apk _requires_sdk_api_level_23 = defined(invoker.requires_sdk_api_level_23) && invoker.requires_sdk_api_level_23 assert(_use_chromium_linker || true) # Mark as used. assert(_requires_sdk_api_level_23 || true) if (_enable_relocation_packing) { assert(_use_chromium_linker || _requires_sdk_api_level_23, "enable_relocation_packing requires either use_chromium_linker " + "or requires_sdk_api_level_23") } if (_load_library_from_apk) { assert(_use_chromium_linker || _requires_sdk_api_level_23, "load_library_from_apk requires use_chromium_linker " + "or requires_sdk_api_level_23") } # The dependency that makes the chromium linker, if any is needed. _native_libs_deps = [] _shared_libraries_is_valid = defined(invoker.shared_libraries) && invoker.shared_libraries != [] _secondary_abi_native_libs_deps = [] assert(_secondary_abi_native_libs_deps == []) # mark as used. _secondary_abi_shared_libraries_is_valid = defined(invoker.secondary_abi_shared_libraries) && invoker.secondary_abi_shared_libraries != [] if (is_component_build || is_asan) { if (_shared_libraries_is_valid) { _native_libs_deps += [ "//build/android:cpplib_stripped" ] } if (_secondary_abi_shared_libraries_is_valid) { _secondary_abi_native_libs_deps += [ "//build/android:cpplib_stripped($android_secondary_abi_toolchain)" ] } } if (_shared_libraries_is_valid) { _native_libs_deps += invoker.shared_libraries # To determine the filenames of all dependent shared libraries, write the # runtime deps of |shared_libraries| to a file during "gn gen". # write_build_config.py will then grep this file for *.so to obtain the # complete list. _runtime_deps_file = "$target_gen_dir/${_template_name}.native.runtimedeps" group("${_template_name}__runtime_deps") { deps = _native_libs_deps write_runtime_deps = _runtime_deps_file } _native_lib_version_rule = "" if (defined(invoker.native_lib_version_rule)) { _native_lib_version_rule = invoker.native_lib_version_rule } _native_lib_version_arg = "\"\"" if (defined(invoker.native_lib_version_arg)) { _native_lib_version_arg = invoker.native_lib_version_arg } } if (_secondary_abi_shared_libraries_is_valid) { _secondary_abi_native_libs_deps += invoker.secondary_abi_shared_libraries # To determine the filenames of all dependent shared libraries, write the # runtime deps of |shared_libraries| to a file during "gn gen". # write_build_config.py will then grep this file for *.so to obtain the # complete list. _secondary_abi_runtime_deps_file = "$target_gen_dir/${_template_name}.secondary.abi.native.runtimedeps" group("${_template_name}_secondary_abi__runtime_deps") { deps = _secondary_abi_native_libs_deps write_runtime_deps = _secondary_abi_runtime_deps_file } } if (defined(invoker.deps)) { set_sources_assignment_filter([ "*manifest*" ]) sources = invoker.deps set_sources_assignment_filter([]) if (sources != invoker.deps) { _bad_deps = invoker.deps - sources assert( false, "Possible manifest-generating dep found in deps. Use android_manifest_dep for this instead. Found: $_bad_deps") } sources = [] } _android_manifest_deps = [] if (defined(invoker.android_manifest_dep)) { _android_manifest_deps = [ invoker.android_manifest_dep ] } _android_manifest = invoker.android_manifest _rebased_build_config = rebase_path(_build_config, root_build_dir) _create_abi_split = defined(invoker.create_abi_split) && invoker.create_abi_split _create_density_splits = defined(invoker.create_density_splits) && invoker.create_density_splits _create_language_splits = defined(invoker.language_splits) && invoker.language_splits != [] # Help GN understand that _create_abi_split is not unused (bug in GN). assert(_create_abi_split || true) _proguard_enabled = defined(invoker.proguard_enabled) && invoker.proguard_enabled if (_proguard_enabled) { _proguard_output_jar_path = "$base_path.proguard.jar" } _emma_never_instrument = defined(invoker.testonly) && invoker.testonly build_config_target = "${_template_name}__build_config" write_build_config(build_config_target) { forward_variables_from(invoker, [ "apk_under_test" ]) type = "android_apk" jar_path = _jar_path dex_path = final_dex_path apk_path = _final_apk_path incremental_apk_path = "${_final_apk_path_no_ext}_incremental.apk" incremental_install_script_path = _incremental_install_script_path resources_zip = resources_zip_path build_config = _build_config android_manifest = _android_manifest deps = _android_manifest_deps if (defined(invoker.deps)) { possible_config_deps = invoker.deps } # Added emma to the target's classpath via its .build_config. if (emma_coverage && !_emma_never_instrument) { possible_config_deps += [ "//third_party/android_tools:emma_device_java" ] } proguard_enabled = _proguard_enabled if (_proguard_enabled) { proguard_info = "$_proguard_output_jar_path.info" } # Don't depend on the runtime_deps target in order to avoid having to # build the native libraries just to create the .build_config file. # The dep is unnecessary since the runtime_deps file is created by gn gen # and the runtime_deps file is added to write_build_config.py's depfile. if (_native_libs_deps != []) { shared_libraries_runtime_deps_file = _runtime_deps_file } if (_secondary_abi_native_libs_deps != []) { secondary_abi_shared_libraries_runtime_deps_file = _secondary_abi_runtime_deps_file } } _final_deps = [] _generated_proguard_config = "$base_path.resources.proguard.txt" process_resources_target = "${_template_name}__process_resources" process_resources(process_resources_target) { forward_variables_from(invoker, [ "alternative_android_sdk_jar", "android_aapt_path", "app_as_shared_lib", "include_all_resources", "shared_resources", ]) srcjar_path = "${target_gen_dir}/${target_name}.srcjar" r_text_path = "${target_gen_dir}/${target_name}_R.txt" android_manifest = _android_manifest resource_dirs = [ "//build/android/ant/empty/res" ] zip_path = resources_zip_path all_resources_zip_path = _all_resources_zip_path generate_constant_ids = true proguard_file = _generated_proguard_config build_config = _build_config deps = _android_manifest_deps + [ ":$build_config_target" ] if (defined(invoker.deps)) { deps += invoker.deps } } _srcjar_deps += [ ":$process_resources_target" ] if (_native_libs_deps != []) { _enable_chromium_linker_tests = false if (defined(invoker.enable_chromium_linker_tests)) { _enable_chromium_linker_tests = invoker.enable_chromium_linker_tests } _ordered_libraries_json = "$target_gen_dir/$target_name.ordered_libararies.json" _rebased_ordered_libraries_json = rebase_path(_ordered_libraries_json, root_build_dir) _ordered_libraries_target = "${_template_name}__write_ordered_libraries" # TODO(agrieve): Make GN write runtime deps in dependency order so as to # not need this manual sorting step. action(_ordered_libraries_target) { script = "//build/android/gyp/write_ordered_libraries.py" deps = _native_libs_deps + [ ":$build_config_target" ] outputs = [ _ordered_libraries_json, ] _rebased_android_readelf = rebase_path(android_readelf, root_build_dir) args = [ "--readelf=$_rebased_android_readelf", "--output=$_rebased_ordered_libraries_json", "--libraries-dir=.", "--input-libraries=@FileArg($_rebased_build_config:native:libraries)", ] } java_cpp_template("${_template_name}__native_libraries_java") { package_name = "org/chromium/base/library_loader" sources = [ "//base/android/java/templates/NativeLibraries.template", ] inputs = [ _ordered_libraries_json, ] deps = [ ":${_ordered_libraries_target}", ] if (_native_lib_version_rule != "") { deps += [ _native_lib_version_rule ] } defines = [ "NATIVE_LIBRARIES_LIST=" + "@FileArg($_rebased_ordered_libraries_json:java_libraries_list)", "NATIVE_LIBRARIES_VERSION_NUMBER=$_native_lib_version_arg", ] if (_use_chromium_linker) { defines += [ "ENABLE_CHROMIUM_LINKER" ] } if (_load_library_from_apk) { defines += [ "ENABLE_CHROMIUM_LINKER_LIBRARY_IN_ZIP_FILE" ] } if (_enable_chromium_linker_tests) { defines += [ "ENABLE_CHROMIUM_LINKER_TESTS" ] } } _srcjar_deps += [ ":${_template_name}__native_libraries_java" ] } if (!defined(invoker.apk_under_test)) { java_cpp_template("${_template_name}__build_config_java") { package_name = "org/chromium/base" sources = [ "//base/android/java/templates/BuildConfig.template", ] deps = [ ":$build_config_target", ] defines = [] if (enable_multidex) { defines += [ "ENABLE_MULTIDEX" ] } if (is_java_debug || dcheck_always_on) { defines += [ "_DCHECK_IS_ON" ] } defines += [ "COMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:compressed_locales_java_list)", "UNCOMPRESSED_LOCALE_LIST=" + "@FileArg($_rebased_build_config:uncompressed_locales_java_list)", ] } _srcjar_deps += [ ":${_template_name}__build_config_java" ] } java_target = "${_template_name}__java" java_library_impl(java_target) { forward_variables_from(invoker, [ "chromium_code", "java_files", "run_findbugs_override", ]) supports_android = true requires_android = true override_build_config = _build_config deps = _android_manifest_deps + [ ":$build_config_target" ] android_manifest = _android_manifest srcjar_deps = _srcjar_deps jar_path = _jar_path dex_path = _lib_dex_path emma_never_instrument = _emma_never_instrument if (defined(invoker.deps)) { deps += invoker.deps } if (defined(invoker.apk_under_test)) { deps += [ "${invoker.apk_under_test}__java" ] } if (emma_coverage && !_emma_never_instrument) { deps += [ "//third_party/android_tools:emma_device_java" ] } } # TODO(cjhopman): This is only ever needed to calculate the list of tests to # run. See build/android/pylib/instrumentation/test_jar.py. We should be # able to just do that calculation at build time instead. if (defined(invoker.dist_ijar_path)) { _dist_ijar_path = invoker.dist_ijar_path action("${_template_name}_dist_ijar") { script = "//build/android/gyp/create_dist_jar.py" depfile = "$target_gen_dir/$target_name.d" inputs = [ _build_config, ] outputs = [ "${_dist_ijar_path}", ] data = [ _dist_ijar_path, ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--output", rebase_path("${_dist_ijar_path}", root_build_dir), "--inputs=@FileArg($_rebased_build_config:dist_jar:all_interface_jars)", ] deps = [ ":$build_config_target", # Generates the build config file. ":$java_target", # Generates the jar file. ] } } if (_proguard_enabled) { _proguard_configs = [ _generated_proguard_config ] if (defined(invoker.proguard_configs)) { _proguard_configs += invoker.proguard_configs } assert(_proguard_configs != []) # Mark as used. _proguard_target = "${_template_name}__proguard" proguard(_proguard_target) { forward_variables_from(invoker, [ "alternative_android_sdk_jar", "deps", "proguard_jar_path", ]) if (!defined(deps)) { deps = [] } deps += [ ":$build_config_target", ":$java_target", ":$process_resources_target", ] inputs = [ _build_config, _jar_path, ] + _proguard_configs output_jar_path = _proguard_output_jar_path _rebased_proguard_configs = rebase_path(_proguard_configs, root_build_dir) args = [ "--proguard-configs=$_rebased_proguard_configs", "--proguard-configs=@FileArg($_rebased_build_config:proguard:lib_configs)", "--input-paths=@FileArg($_rebased_build_config:proguard:input_paths)", "--classpath=@FileArg($_rebased_build_config:proguard:lib_paths)", ] if (defined(invoker.apk_under_test)) { deps += [ "${invoker.apk_under_test}__build_config", "${invoker.apk_under_test}__proguard", ] _apk_under_test_build_config = get_label_info(invoker.apk_under_test, "target_gen_dir") + "/" + get_label_info(invoker.apk_under_test, "name") + ".build_config" _rebased_apk_under_test_build_config = rebase_path(_apk_under_test_build_config, root_build_dir) args += [ "--tested-apk-info=@FileArg($_rebased_apk_under_test_build_config:deps_info:proguard_info)" ] } } _dex_sources = [ _proguard_output_jar_path ] _dex_deps = [ ":$_proguard_target" ] _copy_proguard_mapping_target = "${_template_name}__copy_proguard_mapping" copy(_copy_proguard_mapping_target) { sources = [ "$_proguard_output_jar_path.mapping", ] outputs = [ "$_final_apk_path.mapping", ] deps = [ ":$_proguard_target", ] } } else { if (enable_multidex) { _dex_sources = [ _jar_path ] } else { _dex_sources = [ _lib_dex_path ] } _dex_deps = [ ":$java_target" ] } dex("$final_dex_target_name") { deps = _dex_deps + [ ":$build_config_target" ] inputs = [ _build_config, ] sources = _dex_sources output = final_dex_path # All deps are already included in _dex_sources when proguard is used. if (!_proguard_enabled) { if (enable_multidex) { _dex_arg_key = "${_rebased_build_config}:dist_jar:dependency_jars" } else { _dex_arg_key = "${_rebased_build_config}:final_dex:dependency_dex_files" } args = [ "--inputs=@FileArg($_dex_arg_key)" ] } } _native_libs_file_arg_dep = ":$build_config_target" _native_libs_file_arg = "@FileArg($_rebased_build_config:native:libraries)" _secondary_abi_native_libs_file_arg_dep = ":$build_config_target" _secondary_abi_native_libs_file_arg = "@FileArg($_rebased_build_config:native:secondary_abi_libraries)" assert(_secondary_abi_native_libs_file_arg != "" && _secondary_abi_native_libs_file_arg_dep != "") # Mark as used. if (_native_libs_deps != [] && _enable_relocation_packing) { _prepare_native_target_name = "${_template_name}__prepare_native" _native_libs_json = "$gen_dir/packed-libs/filelist.json" _rebased_native_libs_json = rebase_path(_native_libs_json, root_build_dir) _native_libs_file_arg_dep = ":$_prepare_native_target_name" _native_libs_file_arg = "@FileArg($_rebased_native_libs_json:files)" pack_relocation_section(_prepare_native_target_name) { forward_variables_from(invoker, [ "deps", "public_deps", ]) file_list_json = _native_libs_json libraries_filearg = "@FileArg(${_rebased_build_config}:native:libraries)" inputs = [ _build_config, ] deps += _native_libs_deps deps += [ ":$build_config_target" ] } if (_secondary_abi_native_libs_deps != []) { _prepare_native_target_name = "${_template_name}_secondary_abi__prepare_native" _native_libs_json = "$gen_dir/packed-libs/$android_secondary_abi_cpu/filelist.json" _rebased_native_libs_json = rebase_path(_native_libs_json, root_build_dir) _secondary_abi_native_libs_file_arg_dep = ":$_prepare_native_target_name" _secondary_abi_native_libs_file_arg = "@FileArg($_rebased_native_libs_json:files)" pack_relocation_section(_prepare_native_target_name) { forward_variables_from(invoker, [ "deps", "public_deps", ]) file_list_json = _native_libs_json libraries_filearg = "@FileArg(${_rebased_build_config}:native:secondary_abi_libraries)" inputs = [ _build_config, ] deps += _secondary_abi_native_libs_deps deps += [ ":$build_config_target" ] } } } _extra_native_libs = [] _extra_native_libs_deps = [] _extra_native_libs_even_when_incremental = [] _extra_native_libs_even_when_incremental_deps = [] assert(_extra_native_libs_even_when_incremental_deps == []) # Mark as used. if (_native_libs_deps != []) { # zipalign can't align gdb_server, don't pack gdbserver temporarily. if (is_debug && (!defined(invoker.page_align_shared_libraries) || !invoker.page_align_shared_libraries)) { _extra_native_libs_even_when_incremental = [ android_gdbserver ] } if (_use_chromium_linker) { _extra_native_libs = [ "$root_shlib_dir/libchromium_android_linker$shlib_extension" ] _extra_native_libs_deps += [ "//base/android/linker:chromium_android_linker" ] } } if (defined(invoker.loadable_modules) && invoker.loadable_modules != []) { _extra_native_libs_even_when_incremental += invoker.loadable_modules } _final_deps += [ ":${_template_name}__create" ] create_apk("${_template_name}__create") { forward_variables_from(invoker, [ "alternative_android_sdk_jar", "android_aapt_path", "app_as_shared_lib", "deps", "extensions_to_not_compress", "language_splits", "page_align_shared_libraries", "public_deps", "secondary_native_libs", "shared_resources", "uncompress_shared_libraries", "write_asset_list", ]) if (!defined(deps)) { deps = [] } apk_path = _final_apk_path android_manifest = _android_manifest assets_build_config = _build_config resources_zip = _all_resources_zip_path dex_path = final_dex_path load_library_from_apk = _load_library_from_apk create_density_splits = _create_density_splits emma_instrument = emma_coverage && !_emma_never_instrument if (!defined(extensions_to_not_compress)) { # Allow icu data, v8 snapshots, and pak files to be loaded directly from # the .apk. # Note: These are actually suffix matches, not necessarily extensions. extensions_to_not_compress = ".dat,.bin,.pak" } version_code = _version_code version_name = _version_name keystore_name = _keystore_name keystore_path = _keystore_path keystore_password = _keystore_password # Incremental apk does not use native libs nor final dex. incremental_deps = deps + _android_manifest_deps + [ ":$build_config_target", ":$process_resources_target", ] # This target generates the input file _all_resources_zip_path. deps += _android_manifest_deps + [ ":$build_config_target", ":$process_resources_target", ":$final_dex_target_name", ] if ((_native_libs_deps != [] || _extra_native_libs_even_when_incremental != []) && !_create_abi_split) { deps += _native_libs_deps + _extra_native_libs_deps + _extra_native_libs_even_when_incremental_deps + [ _native_libs_file_arg_dep ] native_libs_filearg = _native_libs_file_arg native_libs = _extra_native_libs native_libs_even_when_incremental = _extra_native_libs_even_when_incremental } if (_secondary_abi_native_libs_deps != [] && !_create_abi_split) { deps += _secondary_abi_native_libs_deps + [ _secondary_abi_native_libs_file_arg_dep ] secondary_abi_native_libs_filearg = _secondary_abi_native_libs_file_arg } # Placeholders necessary for some older devices. # http://crbug.com/395038 forward_variables_from(invoker, [ "native_lib_placeholders" ]) } if ((_native_libs_deps != [] || _extra_native_libs_even_when_incremental != []) && _create_abi_split) { _manifest_rule = "${_template_name}__split_manifest_abi_${android_app_abi}" generate_split_manifest(_manifest_rule) { main_manifest = _android_manifest out_manifest = "$gen_dir/split-manifests/${android_app_abi}/AndroidManifest.xml" split_name = "abi_${android_app_abi}" deps = _android_manifest_deps } _apk_rule = "${_template_name}__split_apk_abi_${android_app_abi}" _final_deps += [ ":$_apk_rule" ] create_apk(_apk_rule) { apk_path = "${_final_apk_path_no_ext}-abi-${android_app_abi}.apk" base_path = "$gen_dir/$_apk_rule" manifest_outputs = get_target_outputs(":${_manifest_rule}") android_manifest = manifest_outputs[1] load_library_from_apk = _load_library_from_apk version_code = _version_code version_name = _version_name keystore_name = _keystore_name keystore_path = _keystore_path keystore_password = _keystore_password # Placeholders necessary for some older devices. # http://crbug.com/395038 deps = [] forward_variables_from(invoker, [ "alternative_android_sdk_jar", "android_aapt_path", "deps", "native_lib_placeholders", "public_deps", ]) incremental_deps = deps + _extra_native_libs_even_when_incremental_deps + [ ":$_manifest_rule" ] deps = [] deps = incremental_deps + _native_libs_deps + _extra_native_libs_deps + [ _native_libs_file_arg_dep ] native_libs_filearg = _native_libs_file_arg native_libs = _extra_native_libs native_libs_even_when_incremental = _extra_native_libs_even_when_incremental } } _create_incremental_script_rule_name = "${_template_name}__incremental_script" action(_create_incremental_script_rule_name) { script = "//build/android/incremental_install/create_install_script.py" depfile = "$target_gen_dir/$target_name.d" deps = [ _native_libs_file_arg_dep, ] outputs = [ _incremental_install_script_path, ] _rebased_apk_path_no_ext = rebase_path(_final_apk_path_no_ext, root_build_dir) _rebased_incremental_install_script_path = rebase_path(_incremental_install_script_path, root_build_dir) _rebased_depfile = rebase_path(depfile, root_build_dir) _dex_arg_key = "${_rebased_build_config}:final_dex:dependency_dex_files" args = [ "--apk-path=${_rebased_apk_path_no_ext}_incremental.apk", "--script-output-path=$_rebased_incremental_install_script_path", "--dex-file=$_rebased_lib_dex_path", "--dex-file-list=@FileArg($_dex_arg_key)", "--depfile=$_rebased_depfile", ] if (_proguard_enabled) { args += [ "--show-proguard-warning" ] } if (defined(_native_libs_file_arg)) { args += [ "--native-libs=$_native_libs_file_arg" ] } if (_extra_native_libs != []) { # Don't pass in _extra_native_libs_even_when_incremental, since these are # end up in the apk and are not side-loaded. _rebased_extra_native_libs = rebase_path(_extra_native_libs, root_build_dir) args += [ "--native-libs=$_rebased_extra_native_libs" ] } if (_create_density_splits) { args += [ "--split=${_rebased_apk_path_no_ext}-density-*.apk" ] } if (_create_language_splits) { args += [ "--split=${_rebased_apk_path_no_ext}-language-*.apk" ] } if (_load_library_from_apk) { args += [ "--dont-even-try=Incremental builds do not work with load_library_from_apk. Try setting is_component_build=true in your GN args." ] } } group(target_name) { forward_variables_from(invoker, [ "data", "data_deps", ]) public_deps = _final_deps # Make the proguard .mapping file easy to find by putting it beside the .apk. if (_proguard_enabled) { deps = [ ":$_copy_proguard_mapping_target", ] } } group("${target_name}_incremental") { forward_variables_from(invoker, [ "data", "data_deps", ]) if (!defined(data_deps)) { data_deps = [] } # device/commands is used by the installer script to push files via .zip. data_deps += [ "//build/android/pylib/device/commands" ] + _native_libs_deps + _extra_native_libs_deps # Since the _incremental.apk does not include use .so nor .dex from the # actual target, but instead loads them at runtime, we need to explicitly # depend on them here. public_deps = [ ":${_create_incremental_script_rule_name}", ":${_template_name}__create_incremental", ":${java_target}", ] } } # Declare an Android instrumentation test apk # # This target creates an Android instrumentation test apk. # # Variables # android_manifest: Path to AndroidManifest.xml. # data_deps: List of dependencies needed at runtime. These will be built but # won't change the generated .apk in any way (in fact they may be built # after the .apk is). # deps: List of dependencies. All Android java resources and libraries in the # "transitive closure" of these dependencies will be included in the apk. # Note: this "transitive closure" actually only includes such targets if # they are depended on through android_library or android_resources targets # (and so not through builtin targets like 'action', 'group', etc). # java_files: List of .java files to include in the apk. # srcjar_deps: List of srcjar dependencies. The .java files in the srcjars # will be added to java_files and be included in this apk. # apk_name: Name for final apk. # final_apk_path: Path to final built apk. Default is # $root_out_dir/apks/$apk_name.apk. Setting this will override apk_name. # shared_libraries: List shared_library targets to bundle. If these # libraries depend on other shared_library targets, those dependencies will # also be included in the apk (e.g. for is_component_build). # apk_under_test: The apk being tested. # # Example # instrumentation_test_apk("foo_test_apk") { # android_manifest = "AndroidManifest.xml" # apk_name = "FooTest" # apk_under_test = "Foo" # java_files = [ # "android/org/chromium/foo/FooTestCase.java", # "android/org/chromium/foo/FooExampleTest.java", # ] # deps = [ # ":foo_test_support_java" # ] # } template("instrumentation_test_apk") { assert(defined(invoker.apk_name)) testonly = true _apk_target_name = "${target_name}__apk" _test_runner_target_name = "${target_name}__test_runner_script" _install_script_name = "install_$target_name" _dist_ijar_path = "$root_build_dir/test.lib.java/" + invoker.apk_name + ".jar" test_runner_script(_test_runner_target_name) { forward_variables_from(invoker, [ "additional_apks", "apk_under_test", "data", "data_deps", "deps", "ignore_all_data_deps", "public_deps", ]) test_name = invoker.target_name test_type = "instrumentation" apk_target = ":$_apk_target_name" test_jar = _dist_ijar_path } test_runner_script("${_test_runner_target_name}_incremental") { forward_variables_from(invoker, [ "additional_apks", "apk_under_test", "data", "data_deps", "deps", "ignore_all_data_deps", "public_deps", ]) test_name = "${invoker.target_name}_incremental" test_type = "instrumentation" apk_target = ":$_apk_target_name" test_jar = _dist_ijar_path incremental_install = true } android_apk(_apk_target_name) { deps = [] data_deps = [] forward_variables_from(invoker, "*") install_script_name = _install_script_name deps += [ "//testing/android/broker:broker_java" ] data_deps += [ "//build/android/pylib/device/commands", "//tools/android/forwarder2", "//tools/android/md5sum", ] if (defined(invoker.additional_apks)) { data_deps += invoker.additional_apks } if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) { # When ProGuard is on, we use ProGuard to combine the under test java # code and the test java code. This is to allow us to apply all ProGuard # optimizations that we ship with, but not have them break tests. The # apk under test will still have the same resources, assets, and # manifest, all of which are the ones used in the tests. if (!defined(invoker.proguard_configs)) { proguard_configs = [] } proguard_configs += [ "//testing/android/proguard_for_test.flags" ] } dist_ijar_path = _dist_ijar_path if (defined(invoker.run_findbugs_override)) { # Only allow findbugs when there are java files. run_findbugs_override = invoker.run_findbugs_override && defined(invoker.java_files) } } group(target_name) { public_deps = [ ":$_apk_target_name", ":$_test_runner_target_name", # Required by test runner to enumerate test list. ":${_apk_target_name}_dist_ijar", ] if (defined(invoker.apk_under_test)) { public_deps += [ invoker.apk_under_test ] } } # TODO: Delete once recipes no longer use this target. group("${target_name}_run") { public_deps = [ ":${invoker.target_name}", ] } group("${target_name}_incremental") { public_deps = [ ":${_apk_target_name}_dist_ijar", ":${_apk_target_name}_incremental", ":${_test_runner_target_name}_incremental", ] if (defined(invoker.apk_under_test)) { public_deps += [ "${invoker.apk_under_test}_incremental" ] } } } # Declare an Android gtest apk # # This target creates an Android apk for running gtest-based unittests. # # Variables # deps: Specifies the dependencies of this target. These will be passed to # the underlying android_apk invocation and should include the java and # resource dependencies of the apk. # shared_library: shared_library target that contains the unit tests. # apk_name: The name of the produced apk. If unspecified, it uses the name # of the shared_library target suffixed with "_apk" # use_default_launcher: Whether the default activity (NativeUnitTestActivity) # should be used for launching tests. # use_native_activity: Test implements ANativeActivity_onCreate(). # # Example # unittest_apk("foo_unittests_apk") { # deps = [ ":foo_java", ":foo_resources" ] # shared_library = ":foo_unittests" # } template("unittest_apk") { _use_native_activity = defined(invoker.use_native_activity) && invoker.use_native_activity _android_manifest = "$target_gen_dir/$target_name/AndroidManifest.xml" assert(invoker.shared_library != "") # This trivial assert is needed in case android_manifest is defined, # as otherwise _use_native_activity and _android_manifest would not be used. assert(_use_native_activity != "" && _android_manifest != "") if (!defined(invoker.android_manifest)) { jinja_template("${target_name}_manifest") { _native_library_name = get_label_info(invoker.shared_library, "name") input = "//testing/android/native_test/java/AndroidManifest.xml.jinja2" output = _android_manifest variables = [ "is_component_build=${is_component_build}", "native_library_name=${_native_library_name}", "use_native_activity=${_use_native_activity}", ] } } android_apk(target_name) { set_sources_assignment_filter([]) data_deps = [] deps = [] forward_variables_from(invoker, "*") testonly = true assert(!defined(invoker.proguard_enabled) || !invoker.proguard_enabled || invoker.proguard_configs != []) if (!defined(apk_name)) { apk_name = get_label_info(invoker.shared_library, "name") } if (!defined(android_manifest)) { android_manifest_dep = ":${target_name}_manifest" android_manifest = _android_manifest } final_apk_path = "$root_build_dir/${apk_name}_apk/${apk_name}-debug.apk" if (!defined(use_default_launcher) || use_default_launcher) { deps += [ "//testing/android/native_test:native_test_java" ] } shared_libraries = [ invoker.shared_library ] deps += [ "//base:base_java", "//testing/android/appurify_support:appurify_support_java", "//testing/android/reporter:reporter_java", ] data_deps += [ "//build/android/pylib/device/commands", "//tools/android/md5sum", ] if (host_os == "linux") { data_deps += [ "//tools/android/forwarder2" ] } } } # Generate .java files from .aidl files. # # This target will store the .java files in a srcjar and should be included in # an android_library or android_apk's srcjar_deps. # # Variables # sources: Paths to .aidl files to compile. # import_include: Path to directory containing .java files imported by the # .aidl files. # interface_file: Preprocessed aidl file to import. # # Example # android_aidl("foo_aidl") { # import_include = "java/src" # sources = [ # "java/src/com/foo/bar/FooBarService.aidl", # "java/src/com/foo/bar/FooBarServiceCallback.aidl", # ] # } template("android_aidl") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) srcjar_path = "${target_gen_dir}/${target_name}.srcjar" aidl_path = "${android_sdk_build_tools}/aidl" framework_aidl = "$android_sdk/framework.aidl" action(target_name) { script = "//build/android/gyp/aidl.py" sources = invoker.sources imports = [ framework_aidl ] if (defined(invoker.interface_file)) { assert(invoker.interface_file != "") imports += [ invoker.interface_file ] } inputs = [ aidl_path ] + imports depfile = "${target_gen_dir}/${target_name}.d" outputs = [ srcjar_path, ] rebased_imports = rebase_path(imports, root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), "--aidl-path", rebase_path(aidl_path, root_build_dir), "--imports=$rebased_imports", "--srcjar", rebase_path(srcjar_path, root_build_dir), ] if (defined(invoker.import_include) && invoker.import_include != "") { # TODO(cjhopman): aidl supports creating a depfile. We should be able to # switch to constructing a depfile for the overall action from that # instead of having all the .java files in the include paths as inputs. rebased_import_includes = rebase_path([ invoker.import_include ], root_build_dir) args += [ "--includes=$rebased_import_includes" ] _java_files_build_rel = exec_script("//build/android/gyp/find.py", rebase_path([ invoker.import_include ], root_build_dir), "list lines") _java_files = rebase_path(_java_files_build_rel, ".", root_build_dir) inputs += _java_files } args += rebase_path(sources, root_build_dir) } } # Compile a protocol buffer to java. # # This generates java files from protocol buffers and creates an Android library # containing the classes. # # Variables # sources: Paths to .proto files to compile. # proto_path: Root directory of .proto files. # # Example: # proto_java_library("foo_proto_java") { # proto_path = "src/foo" # sources = [ "$proto_path/foo.proto" ] # } template("proto_java_library") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _protoc_dep = "//third_party/android_protobuf:android_protoc($host_toolchain)" _protoc_out_dir = get_label_info(_protoc_dep, "root_out_dir") _protoc_bin = "$_protoc_out_dir/android_protoc" _proto_path = invoker.proto_path _template_name = target_name action("${_template_name}__protoc_java") { srcjar_path = "$target_gen_dir/$target_name.srcjar" script = "//build/protoc_java.py" deps = [ _protoc_dep, ] if (defined(invoker.deps)) { deps += invoker.deps } sources = invoker.sources depfile = "$target_gen_dir/$target_name.d" outputs = [ srcjar_path, ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--protoc", rebase_path(_protoc_bin, root_build_dir), "--proto-path", rebase_path(_proto_path, root_build_dir), "--srcjar", rebase_path(srcjar_path, root_build_dir), ] + rebase_path(sources, root_build_dir) } android_library(target_name) { chromium_code = false java_files = [] srcjar_deps = [ ":${_template_name}__protoc_java" ] deps = [ "//third_party/android_protobuf:protobuf_nano_javalib", ] } } # Declare an Android library target for a prebuilt AAR. # # This target creates an Android library containing java code and Android # resources. For libraries without resources, it will not generate # corresponding android_resources targets. # # Variables # aar_path: Path to the AAR. # proguard_configs: List of proguard configs to use in final apk step for # any apk that depends on this library. # ignore_aidl: Whether to ignore .aidl files found with the .aar. # ignore_assets: Whether to ignore assets found in the .aar. # ignore_manifest: Whether to ignore merging of AndroidManifest.xml. # ignore_native_libraries: Whether to ignore .so files found in the .aar. # TODO(jbudorick@): remove this arguments after crbug.com/522043 is fixed. # requires_android: Whether this target can only be used for compiling Android related targets. # # Example # android_aar_prebuilt("foo_java") { # aar_path = "foo.aar" # } template("android_aar_prebuilt") { _output_path = "${target_gen_dir}/${target_name}" _unpack_target_name = "${target_name}__unpack_aar" _ignore_aidl = defined(invoker.ignore_aidl) && invoker.ignore_aidl _ignore_assets = defined(invoker.ignore_assets) && invoker.ignore_assets _ignore_manifest = defined(invoker.ignore_manifest) && invoker.ignore_manifest _ignore_native_libraries = defined(invoker.ignore_native_libraries) && invoker.ignore_native_libraries # Scan the AAR file and determine the resources and jar files. # Some libraries might not have resources; others might have two jars. _scanned_files = exec_script("//build/android/gyp/aar.py", [ "--input-file", rebase_path(invoker.aar_path, root_build_dir), "--list", ], "scope") assert(_ignore_aidl || _scanned_files.aidl == [], "android_aar_prebuilt() aidl not yet supported." + " Implement or use ignore_aidl = true." + " http://crbug.com/644439") assert(_ignore_assets || _scanned_files.assets == [], "android_aar_prebuilt() assets not yet supported." + " Implement or use ignore_assets = true." + " http://crbug.com/643966") assert(_ignore_native_libraries || !_scanned_files.has_native_libraries, "android_aar_prebuilt() with .so files is not supported." + " Use ignore_native_libraries = true to silence this error.") assert(_ignore_manifest || _scanned_files.is_manifest_empty, "android_aar_prebuilt() manifest merging not yet supported and" + " non-trivial AndroidManifest.xml detected." + " Implement or use ignore_manifest = true." + " http://crbug.com/643967") assert(_scanned_files.has_classes_jar || _scanned_files.subjars == []) action(_unpack_target_name) { script = "//build/android/gyp/aar.py" # Unzips the AAR args = [ "--input-file", rebase_path(invoker.aar_path, root_build_dir), "--output-dir", rebase_path(_output_path, root_build_dir), "--extract", ] inputs = [ invoker.aar_path, ] outputs = [ "${_output_path}/AndroidManifest.xml", ] if (_scanned_files.resources != []) { outputs += [ "${_output_path}/R.txt" ] outputs += get_path_info( rebase_path(_scanned_files.resources, "", _output_path), "abspath") } if (_scanned_files.has_classes_jar) { outputs += [ "${_output_path}/classes.jar" ] } outputs += get_path_info(rebase_path(_scanned_files.subjars, "", _output_path), "abspath") if (_scanned_files.has_proguard_flags) { outputs += [ "${_output_path}/proguard.txt" ] } } # Create the android_resources target for resources. if (_scanned_files.resources != []) { _res_target_name = "${target_name}__res" android_resources(_res_target_name) { forward_variables_from(invoker, [ "deps" ]) if (!defined(deps)) { deps = [] } deps += [ ":$_unpack_target_name" ] resource_dirs = [] generated_resource_dirs = [ "${_output_path}/res" ] generated_resource_files = rebase_path(_scanned_files.resources, "", _output_path) android_manifest_dep = ":$_unpack_target_name" android_manifest = "${_output_path}/AndroidManifest.xml" v14_skip = true } } # Create android_java_prebuilt target for extra jars within jars/. _subjar_targets = [] foreach(_tuple, _scanned_files.subjar_tuples) { _current_target = "${target_name}__subjar_${_tuple[0]}" _subjar_targets += [ ":$_current_target" ] java_prebuilt(_current_target) { forward_variables_from(invoker, [ "jar_excluded_patterns", "requires_android", ]) deps = [ ":$_unpack_target_name", ] if (!defined(requires_android)) { requires_android = true } supports_android = true jar_path = "$_output_path/${_tuple[1]}" _base_output_name = get_path_info(jar_path, "name") output_name = "${invoker.target_name}-$_base_output_name" } } # Create android_java_prebuilt target for classes.jar. if (_scanned_files.has_classes_jar) { _jar_target_name = "${target_name}__classes" java_prebuilt(_jar_target_name) { forward_variables_from(invoker, [ "deps", "input_jars_paths", "jar_excluded_patterns", "proguard_configs", "requires_android", ]) if (!defined(deps)) { deps = [] } deps += _subjar_targets + [ ":$_unpack_target_name" ] if (defined(_res_target_name)) { deps += [ ":$_res_target_name" ] } if (!defined(requires_android)) { requires_android = true } supports_android = true jar_path = "$_output_path/classes.jar" output_name = invoker.target_name if (_scanned_files.has_proguard_flags) { if (!defined(proguard_configs)) { proguard_configs = [] } proguard_configs += [ "$_output_path/proguard.txt" ] } } } java_group(target_name) { deps = [] if (defined(_jar_target_name)) { deps += [ ":$_jar_target_name" ] # Although subjars are meant to be private, we add them as deps here # because in practice they seem to contain classes required to be in the # classpath. deps += _subjar_targets } if (defined(_res_target_name)) { deps += [ ":$_res_target_name" ] } } } } ================================================ FILE: samples/GN/clang.gni ================================================ # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/toolchain/toolchain.gni") declare_args() { # Indicates if the build should use the Chrome-specific plugins for enforcing # coding guidelines, etc. Only used when compiling with Clang. clang_use_chrome_plugins = is_clang && !is_nacl && !use_xcode_clang clang_base_path = "//third_party/llvm-build/Release+Asserts" } ================================================ FILE: samples/GN/filenames/.gn ================================================ # This file is used by the GN meta build system to find the root of the source # tree and to set startup options. For documentation on the values set in this # file, run "gn help dotfile" at the command line. import("//build/dotfile_settings.gni") # The location of the build configuration file. buildconfig = "//build/config/BUILDCONFIG.gn" # The secondary source root is a parallel directory tree where # GN build files are placed when they can not be placed directly # in the source tree, e.g. for third party source trees. secondary_source = "//build/secondary/" # These are the targets to check headers for by default. The files in targets # matching these patterns (see "gn help label_pattern" for format) will have # their includes checked for proper dependencies when you run either # "gn check" or "gn gen --check". check_targets = [] # These are the list of GN files that run exec_script. This whitelist exists # to force additional review for new uses of exec_script, which is strongly # discouraged except for gypi_to_gn calls. exec_script_whitelist = build_dotfile_settings.exec_script_whitelist + [ "//test/test262/BUILD.gn" ] ================================================ FILE: samples/GN/gcc_toolchain.gni ================================================ # Copyright (c) 2013 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/android/config.gni") import("//build/config/clang/clang.gni") import("//build/config/nacl/config.gni") import("//build/config/sanitizers/sanitizers.gni") import("//build/config/v8_target_cpu.gni") import("//build/toolchain/cc_wrapper.gni") import("//build/toolchain/goma.gni") import("//build/toolchain/toolchain.gni") # This template defines a toolchain for something that works like gcc # (including clang). # # It requires the following variables specifying the executables to run: # - ar # - cc # - cxx # - ld # # Optional parameters that control the tools: # # - extra_cflags # Extra flags to be appended when compiling C files (but not C++ files). # - extra_cppflags # Extra flags to be appended when compiling both C and C++ files. "CPP" # stands for "C PreProcessor" in this context, although it can be # used for non-preprocessor flags as well. Not to be confused with # "CXX" (which follows). # - extra_cxxflags # Extra flags to be appended when compiling C++ files (but not C files). # - extra_ldflags # Extra flags to be appended when linking # # - libs_section_prefix # - libs_section_postfix # The contents of these strings, if specified, will be placed around # the libs section of the linker line. It allows one to inject libraries # at the beginning and end for all targets in a toolchain. # - solink_libs_section_prefix # - solink_libs_section_postfix # Same as libs_section_{pre,post}fix except used for solink instead of link. # - link_outputs # The content of this array, if specified, will be added to the list of # outputs from the link command. This can be useful in conjunction with # the post_link parameter. # - post_link # The content of this string, if specified, will be run as a separate # command following the the link command. # - deps # Just forwarded to the toolchain definition. # - executable_extension # If this string is specified it will be used for the file extension # for an executable, rather than using no extension; targets will # still be able to override the extension using the output_extension # variable. # - rebuild_define # The contents of this string, if specified, will be passed as a #define # to the toolchain. It can be used to force recompiles whenever a # toolchain is updated. # - shlib_extension # If this string is specified it will be used for the file extension # for a shared library, rather than default value specified in # toolchain.gni # - strip # Location of the strip executable. When specified, strip will be run on # all shared libraries and executables as they are built. The pre-stripped # artifacts will be put in lib.unstripped/ and exe.unstripped/. template("gcc_toolchain") { toolchain(target_name) { assert(defined(invoker.ar), "gcc_toolchain() must specify a \"ar\" value") assert(defined(invoker.cc), "gcc_toolchain() must specify a \"cc\" value") assert(defined(invoker.cxx), "gcc_toolchain() must specify a \"cxx\" value") assert(defined(invoker.ld), "gcc_toolchain() must specify a \"ld\" value") # This define changes when the toolchain changes, forcing a rebuild. # Nothing should ever use this define. if (defined(invoker.rebuild_define)) { rebuild_string = "-D" + invoker.rebuild_define + " " } else { rebuild_string = "" } # GN's syntax can't handle more than one scope dereference at once, like # "invoker.toolchain_args.foo", so make a temporary to hold the toolchain # args so we can do "invoker_toolchain_args.foo". assert(defined(invoker.toolchain_args), "Toolchains must specify toolchain_args") invoker_toolchain_args = invoker.toolchain_args assert(defined(invoker_toolchain_args.current_cpu), "toolchain_args must specify a current_cpu") assert(defined(invoker_toolchain_args.current_os), "toolchain_args must specify a current_os") # When invoking this toolchain not as the default one, these args will be # passed to the build. They are ignored when this is the default toolchain. toolchain_args = { # Populate toolchain args from the invoker. forward_variables_from(invoker_toolchain_args, "*") # The host toolchain value computed by the default toolchain's setup # needs to be passed through unchanged to all secondary toolchains to # ensure that it's always the same, regardless of the values that may be # set on those toolchains. host_toolchain = host_toolchain if (!defined(invoker_toolchain_args.v8_current_cpu)) { v8_current_cpu = invoker_toolchain_args.current_cpu } } # When the invoker has explicitly overridden use_goma or cc_wrapper in the # toolchain args, use those values, otherwise default to the global one. # This works because the only reasonable override that toolchains might # supply for these values are to force-disable them. if (defined(toolchain_args.use_goma)) { toolchain_uses_goma = toolchain_args.use_goma } else { toolchain_uses_goma = use_goma } if (defined(toolchain_args.cc_wrapper)) { toolchain_cc_wrapper = toolchain_args.cc_wrapper } else { toolchain_cc_wrapper = cc_wrapper } # Compute the compiler prefix. if (toolchain_uses_goma) { assert(toolchain_cc_wrapper == "", "Goma and cc_wrapper can't be used together.") compiler_prefix = "$goma_dir/gomacc " } else if (toolchain_cc_wrapper != "") { compiler_prefix = toolchain_cc_wrapper + " " } else { compiler_prefix = "" } cc = compiler_prefix + invoker.cc cxx = compiler_prefix + invoker.cxx ar = invoker.ar ld = invoker.ld if (defined(invoker.readelf)) { readelf = invoker.readelf } else { readelf = "readelf" } if (defined(invoker.nm)) { nm = invoker.nm } else { nm = "nm" } if (defined(invoker.shlib_extension)) { default_shlib_extension = invoker.shlib_extension } else { default_shlib_extension = shlib_extension } if (defined(invoker.executable_extension)) { default_executable_extension = invoker.executable_extension } else { default_executable_extension = "" } # Bring these into our scope for string interpolation with default values. if (defined(invoker.libs_section_prefix)) { libs_section_prefix = invoker.libs_section_prefix } else { libs_section_prefix = "" } if (defined(invoker.libs_section_postfix)) { libs_section_postfix = invoker.libs_section_postfix } else { libs_section_postfix = "" } if (defined(invoker.solink_libs_section_prefix)) { solink_libs_section_prefix = invoker.solink_libs_section_prefix } else { solink_libs_section_prefix = "" } if (defined(invoker.solink_libs_section_postfix)) { solink_libs_section_postfix = invoker.solink_libs_section_postfix } else { solink_libs_section_postfix = "" } if (defined(invoker.extra_cflags) && invoker.extra_cflags != "") { extra_cflags = " " + invoker.extra_cflags } else { extra_cflags = "" } if (defined(invoker.extra_cppflags) && invoker.extra_cppflags != "") { extra_cppflags = " " + invoker.extra_cppflags } else { extra_cppflags = "" } if (defined(invoker.extra_cxxflags) && invoker.extra_cxxflags != "") { extra_cxxflags = " " + invoker.extra_cxxflags } else { extra_cxxflags = "" } if (defined(invoker.extra_ldflags) && invoker.extra_ldflags != "") { extra_ldflags = " " + invoker.extra_ldflags } else { extra_ldflags = "" } # These library switches can apply to all tools below. lib_switch = "-l" lib_dir_switch = "-L" # Object files go in this directory. object_subdir = "{{target_out_dir}}/{{label_name}}" tool("cc") { depfile = "{{output}}.d" command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_c}}${extra_cppflags}${extra_cflags} -c {{source}} -o {{output}}" depsformat = "gcc" description = "CC {{output}}" outputs = [ # The whitelist file is also an output, but ninja does not # currently support multiple outputs for tool("cc"). "$object_subdir/{{source_name_part}}.o", ] if (enable_resource_whitelist_generation) { compile_wrapper = rebase_path("//build/toolchain/gcc_compile_wrapper.py", root_build_dir) command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command" } } tool("cxx") { depfile = "{{output}}.d" command = "$cxx -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{cflags}} {{cflags_cc}}${extra_cppflags}${extra_cxxflags} -c {{source}} -o {{output}}" depsformat = "gcc" description = "CXX {{output}}" outputs = [ # The whitelist file is also an output, but ninja does not # currently support multiple outputs for tool("cxx"). "$object_subdir/{{source_name_part}}.o", ] if (enable_resource_whitelist_generation) { compile_wrapper = rebase_path("//build/toolchain/gcc_compile_wrapper.py", root_build_dir) command = "$python_path \"$compile_wrapper\" --resource-whitelist=\"{{output}}.whitelist\" $command" } } tool("asm") { # For GCC we can just use the C compiler to compile assembly. depfile = "{{output}}.d" command = "$cc -MMD -MF $depfile ${rebuild_string}{{defines}} {{include_dirs}} {{asmflags}} -c {{source}} -o {{output}}" depsformat = "gcc" description = "ASM {{output}}" outputs = [ "$object_subdir/{{source_name_part}}.o", ] } tool("alink") { rspfile = "{{output}}.rsp" whitelist_flag = " " if (enable_resource_whitelist_generation) { whitelist_flag = " --resource-whitelist=\"{{output}}.whitelist\"" } # This needs a Python script to avoid using simple sh features in this # command, in case the host does not use a POSIX shell (e.g. compiling # POSIX-like toolchains such as NaCl on Windows). ar_wrapper = rebase_path("//build/toolchain/gcc_ar_wrapper.py", root_build_dir) command = "$python_path \"$ar_wrapper\"$whitelist_flag --output={{output}} --ar=\"$ar\" {{arflags}} rcsD @\"$rspfile\"" description = "AR {{output}}" rspfile_content = "{{inputs}}" outputs = [ "{{output_dir}}/{{target_output_name}}{{output_extension}}", ] # Shared libraries go in the target out directory by default so we can # generate different targets with the same name and not have them collide. default_output_dir = "{{target_out_dir}}" default_output_extension = ".a" output_prefix = "lib" } tool("solink") { soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". sofile = "{{output_dir}}/$soname" # Possibly including toolchain dir. rspfile = sofile + ".rsp" pool = "//build/toolchain:link_pool($default_toolchain)" whitelist_flag = " " if (enable_resource_whitelist_generation) { whitelist_file = "$sofile.whitelist" whitelist_flag = " --resource-whitelist=\"$whitelist_file\"" } if (defined(invoker.strip)) { unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" } else { unstripped_sofile = sofile } # These variables are not built into GN but are helpers that # implement (1) linking to produce a .so, (2) extracting the symbols # from that file (3) if the extracted list differs from the existing # .TOC file, overwrite it, otherwise, don't change it. tocfile = sofile + ".TOC" link_command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" assert(defined(readelf), "to solink you must have a readelf") assert(defined(nm), "to solink you must have an nm") strip_switch = "" if (defined(invoker.strip)) { strip_switch = "--strip=${invoker.strip}" } # This needs a Python script to avoid using a complex shell command # requiring sh control structures, pipelines, and POSIX utilities. # The host might not have a POSIX shell and utilities (e.g. Windows). solink_wrapper = rebase_path("//build/toolchain/gcc_solink_wrapper.py") command = "$python_path \"$solink_wrapper\" --readelf=\"$readelf\" --nm=\"$nm\" $strip_switch --sofile=\"$unstripped_sofile\" --tocfile=\"$tocfile\" --output=\"$sofile\"$whitelist_flag -- $link_command" rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" description = "SOLINK $sofile" # Use this for {{output_extension}} expansions unless a target manually # overrides it (in which case {{output_extension}} will be what the target # specifies). default_output_extension = default_shlib_extension default_output_dir = "{{root_out_dir}}" if (shlib_subdir != ".") { default_output_dir += "/$shlib_subdir" } output_prefix = "lib" # Since the above commands only updates the .TOC file when it changes, ask # Ninja to check if the timestamp actually changed to know if downstream # dependencies should be recompiled. restat = true # Tell GN about the output files. It will link to the sofile but use the # tocfile for dependency management. outputs = [ sofile, tocfile, ] if (enable_resource_whitelist_generation) { outputs += [ whitelist_file ] } if (sofile != unstripped_sofile) { outputs += [ unstripped_sofile ] } link_output = sofile depend_output = tocfile } tool("solink_module") { soname = "{{target_output_name}}{{output_extension}}" # e.g. "libfoo.so". sofile = "{{output_dir}}/$soname" rspfile = sofile + ".rsp" pool = "//build/toolchain:link_pool($default_toolchain)" if (defined(invoker.strip)) { unstripped_sofile = "{{root_out_dir}}/lib.unstripped/$soname" } else { unstripped_sofile = sofile } command = "$ld -shared {{ldflags}}${extra_ldflags} -o \"$unstripped_sofile\" -Wl,-soname=\"$soname\" @\"$rspfile\"" if (defined(invoker.strip)) { strip_command = "${invoker.strip} --strip-unneeded -o \"$sofile\" \"$unstripped_sofile\"" command += " && " + strip_command } rspfile_content = "-Wl,--whole-archive {{inputs}} {{solibs}} -Wl,--no-whole-archive $solink_libs_section_prefix {{libs}} $solink_libs_section_postfix" description = "SOLINK_MODULE $sofile" # Use this for {{output_extension}} expansions unless a target manually # overrides it (in which case {{output_extension}} will be what the target # specifies). if (defined(invoker.loadable_module_extension)) { default_output_extension = invoker.loadable_module_extension } else { default_output_extension = default_shlib_extension } default_output_dir = "{{root_out_dir}}" if (shlib_subdir != ".") { default_output_dir += "/$shlib_subdir" } output_prefix = "lib" outputs = [ sofile, ] if (sofile != unstripped_sofile) { outputs += [ unstripped_sofile ] } } tool("link") { exename = "{{target_output_name}}{{output_extension}}" outfile = "{{output_dir}}/$exename" rspfile = "$outfile.rsp" unstripped_outfile = outfile pool = "//build/toolchain:link_pool($default_toolchain)" # Use this for {{output_extension}} expansions unless a target manually # overrides it (in which case {{output_extension}} will be what the target # specifies). default_output_extension = default_executable_extension default_output_dir = "{{root_out_dir}}" if (defined(invoker.strip)) { unstripped_outfile = "{{root_out_dir}}/exe.unstripped/$exename" } command = "$ld {{ldflags}}${extra_ldflags} -o \"$unstripped_outfile\" -Wl,--start-group @\"$rspfile\" {{solibs}} -Wl,--end-group $libs_section_prefix {{libs}} $libs_section_postfix" if (defined(invoker.strip)) { link_wrapper = rebase_path("//build/toolchain/gcc_link_wrapper.py", root_build_dir) command = "$python_path \"$link_wrapper\" --strip=\"${invoker.strip}\" --unstripped-file=\"$unstripped_outfile\" --output=\"$outfile\" -- $command" } description = "LINK $outfile" rspfile_content = "{{inputs}}" outputs = [ outfile, ] if (outfile != unstripped_outfile) { outputs += [ unstripped_outfile ] } if (defined(invoker.link_outputs)) { outputs += invoker.link_outputs } } # These two are really entirely generic, but have to be repeated in # each toolchain because GN doesn't allow a template to be used here. # See //build/toolchain/toolchain.gni for details. tool("stamp") { command = stamp_command description = stamp_description } tool("copy") { command = copy_command description = copy_description } forward_variables_from(invoker, [ "deps" ]) } } # This is a shorthand for gcc_toolchain instances based on the Chromium-built # version of Clang. Only the toolchain_cpu and toolchain_os variables need to # be specified by the invoker, and optionally toolprefix if it's a # cross-compile case. Note that for a cross-compile case this toolchain # requires a config to pass the appropriate -target option, or else it will # actually just be doing a native compile. The invoker can optionally override # use_gold too. template("clang_toolchain") { if (defined(invoker.toolprefix)) { toolprefix = invoker.toolprefix } else { toolprefix = "" } gcc_toolchain(target_name) { prefix = rebase_path("$clang_base_path/bin", root_build_dir) cc = "$prefix/clang" cxx = "$prefix/clang++" ld = cxx readelf = "${toolprefix}readelf" ar = "${toolprefix}ar" nm = "${toolprefix}nm" forward_variables_from(invoker, [ "strip" ]) toolchain_args = { if (defined(invoker.toolchain_args)) { forward_variables_from(invoker.toolchain_args, "*") } is_clang = true } } } ================================================ FILE: samples/GN/icu.gn ================================================ # Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/linux/pkg_config.gni") import("//build/shim_headers.gni") group("icu") { public_deps = [ ":icui18n", ":icuuc", ] } config("icu_config") { defines = [ "USING_SYSTEM_ICU=1", "ICU_UTIL_DATA_IMPL=ICU_UTIL_DATA_STATIC", ] } pkg_config("system_icui18n") { packages = [ "icu-i18n" ] } pkg_config("system_icuuc") { packages = [ "icu-uc" ] } source_set("icui18n") { deps = [ ":icui18n_shim", ] public_configs = [ ":icu_config", ":system_icui18n", ] } source_set("icuuc") { deps = [ ":icuuc_shim", ] public_configs = [ ":icu_config", ":system_icuuc", ] } shim_headers("icui18n_shim") { root_path = "source/i18n" headers = [ # This list can easily be updated using the command below: # find third_party/icu/source/i18n/unicode \ # -iname '*.h' -printf '"%p",\n' | \ # sed -e 's|third_party/icu/i18n/common/||' | sort -u "unicode/alphaindex.h", "unicode/basictz.h", "unicode/calendar.h", "unicode/choicfmt.h", "unicode/coleitr.h", "unicode/coll.h", "unicode/compactdecimalformat.h", "unicode/curramt.h", "unicode/currpinf.h", "unicode/currunit.h", "unicode/datefmt.h", "unicode/dcfmtsym.h", "unicode/decimfmt.h", "unicode/dtfmtsym.h", "unicode/dtitvfmt.h", "unicode/dtitvinf.h", "unicode/dtptngen.h", "unicode/dtrule.h", "unicode/fieldpos.h", "unicode/fmtable.h", "unicode/format.h", "unicode/fpositer.h", "unicode/gender.h", "unicode/gregocal.h", "unicode/locdspnm.h", "unicode/measfmt.h", "unicode/measunit.h", "unicode/measure.h", "unicode/msgfmt.h", "unicode/numfmt.h", "unicode/numsys.h", "unicode/plurfmt.h", "unicode/plurrule.h", "unicode/rbnf.h", "unicode/rbtz.h", "unicode/regex.h", "unicode/region.h", "unicode/reldatefmt.h", "unicode/scientificnumberformatter.h", "unicode/search.h", "unicode/selfmt.h", "unicode/simpletz.h", "unicode/smpdtfmt.h", "unicode/sortkey.h", "unicode/stsearch.h", "unicode/tblcoll.h", "unicode/timezone.h", "unicode/tmunit.h", "unicode/tmutamt.h", "unicode/tmutfmt.h", "unicode/translit.h", "unicode/tzfmt.h", "unicode/tznames.h", "unicode/tzrule.h", "unicode/tztrans.h", "unicode/ucal.h", "unicode/ucol.h", "unicode/ucoleitr.h", "unicode/ucsdet.h", "unicode/ucurr.h", "unicode/udat.h", "unicode/udateintervalformat.h", "unicode/udatpg.h", "unicode/udisplaycontext.h", "unicode/ufieldpositer.h", "unicode/uformattable.h", "unicode/ugender.h", "unicode/uldnames.h", "unicode/ulocdata.h", "unicode/umsg.h", "unicode/unirepl.h", "unicode/unum.h", "unicode/unumsys.h", "unicode/upluralrules.h", "unicode/uregex.h", "unicode/uregion.h", "unicode/usearch.h", "unicode/uspoof.h", "unicode/utmscale.h", "unicode/utrans.h", "unicode/vtzone.h", ] } shim_headers("icuuc_shim") { root_path = "source/common" headers = [ # This list can easily be updated using the command below: # find third_party/icu/source/common/unicode \ # -iname '*.h' -printf '"%p",\n' | \ # sed -e 's|third_party/icu/source/common/||' | sort -u "unicode/appendable.h", "unicode/brkiter.h", "unicode/bytestream.h", "unicode/bytestrie.h", "unicode/bytestriebuilder.h", "unicode/caniter.h", "unicode/chariter.h", "unicode/dbbi.h", "unicode/docmain.h", "unicode/dtintrv.h", "unicode/enumset.h", "unicode/errorcode.h", "unicode/filteredbrk.h", "unicode/icudataver.h", "unicode/icuplug.h", "unicode/idna.h", "unicode/listformatter.h", "unicode/localpointer.h", "unicode/locid.h", "unicode/messagepattern.h", "unicode/normalizer2.h", "unicode/normlzr.h", "unicode/parseerr.h", "unicode/parsepos.h", "unicode/platform.h", "unicode/ptypes.h", "unicode/putil.h", "unicode/rbbi.h", "unicode/rep.h", "unicode/resbund.h", "unicode/schriter.h", "unicode/std_string.h", "unicode/strenum.h", "unicode/stringpiece.h", "unicode/stringtriebuilder.h", "unicode/symtable.h", "unicode/ubidi.h", "unicode/ubrk.h", "unicode/ucasemap.h", "unicode/ucat.h", "unicode/uchar.h", "unicode/ucharstrie.h", "unicode/ucharstriebuilder.h", "unicode/uchriter.h", "unicode/uclean.h", "unicode/ucnv.h", "unicode/ucnv_cb.h", "unicode/ucnv_err.h", "unicode/ucnvsel.h", "unicode/uconfig.h", "unicode/udata.h", "unicode/uenum.h", "unicode/uidna.h", "unicode/uiter.h", "unicode/ulistformatter.h", "unicode/uloc.h", "unicode/umachine.h", "unicode/umisc.h", "unicode/unifilt.h", "unicode/unifunct.h", "unicode/unimatch.h", "unicode/uniset.h", "unicode/unistr.h", "unicode/unorm.h", "unicode/unorm2.h", "unicode/uobject.h", "unicode/urename.h", "unicode/urep.h", "unicode/ures.h", "unicode/uscript.h", "unicode/uset.h", "unicode/usetiter.h", "unicode/ushape.h", "unicode/usprep.h", "unicode/ustring.h", "unicode/ustringtrie.h", "unicode/utext.h", "unicode/utf.h", "unicode/utf16.h", "unicode/utf32.h", "unicode/utf8.h", "unicode/utf_old.h", "unicode/utrace.h", "unicode/utypes.h", "unicode/uvernum.h", "unicode/uversion.h", ] } ================================================ FILE: samples/GN/internal_rules.gni ================================================ # Copyright 2014 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. # Do not add any imports to non-//build directories here. # Some projects (e.g. V8) do not have non-build directories DEPS'ed in. import("//build_overrides/build.gni") import("//build/config/android/config.gni") import("//build/config/dcheck_always_on.gni") import("//build/config/sanitizers/sanitizers.gni") assert(is_android) # These identify targets that have .build_config files (except for android_apk, # java_binary, resource_rewriter, since we never need to depend on these). _java_target_whitelist = [ "*:*_java", "*:*_javalib", "*:*_java_*", # e.g. java_test_support "*:java", "*:junit", "*:junit_*", "*:*_junit_*", "*:*javatests", "*:*_assets", "*android*:assets", "*:*_apk_*resources", "*android*:resources", "*:*_resources", "*:*_grd", "*:*locale_paks", # TODO(agrieve): Rename targets below to match above patterns. "*android_webview/glue:glue", "//build/android/rezip:rezip", "//chrome/test/android/cast_emulator:cast_emulator", ] # Targets that match the whitelist but are not actually java targets. _java_target_blacklist = [ "//chrome:packed_resources", "//remoting/android:remoting_android_raw_resources", "*:*_unpack_aar", ] # Write the target's .build_config file. This is a json file that contains a # dictionary of information about how to build this target (things that # require knowledge about this target's dependencies and cannot be calculated # at gn-time). There is a special syntax to add a value in that dictionary to # an action/action_foreachs args: # --python-arg=@FileArg($rebased_build_config_path:key0:key1) # At runtime, such an arg will be replaced by the value in the build_config. # See build/android/gyp/write_build_config.py and # build/android/gyp/util/build_utils.py:ExpandFileArgs template("write_build_config") { type = invoker.type _is_prebuilt_binary = defined(invoker.is_prebuilt_binary) && invoker.is_prebuilt_binary # Don't need to enforce naming scheme for these targets since we never # consider them in dependency chains. if (!_is_prebuilt_binary && type != "android_apk" && type != "java_binary" && type != "resource_rewriter") { set_sources_assignment_filter(_java_target_whitelist) _parent_invoker = invoker.invoker _target_label = get_label_info(":${_parent_invoker.target_name}", "label_no_toolchain") sources = [ _target_label, ] if (sources != []) { set_sources_assignment_filter(_java_target_blacklist) sources = [] sources = [ _target_label, ] if (sources != []) { assert(false, "Invalid java target name: $_target_label") } } sources = [] } action(target_name) { set_sources_assignment_filter([]) build_config = invoker.build_config assert(type == "android_apk" || type == "java_library" || type == "android_resources" || type == "deps_dex" || type == "android_assets" || type == "resource_rewriter" || type == "java_binary" || type == "group" || type == "java_prebuilt") forward_variables_from(invoker, [ "deps", "testonly", ]) if (!defined(deps)) { deps = [] } script = "//build/android/gyp/write_build_config.py" depfile = "$target_gen_dir/$target_name.d" inputs = [] _deps_configs = [] if (defined(invoker.possible_config_deps)) { foreach(_possible_dep, invoker.possible_config_deps) { set_sources_assignment_filter(_java_target_whitelist) _target_label = get_label_info(_possible_dep, "label_no_toolchain") sources = [ _target_label, ] if (sources == []) { set_sources_assignment_filter(_java_target_blacklist) sources = [] sources = [ _target_label, ] if (sources != []) { deps += [ "${_target_label}__build_config" ] _dep_gen_dir = get_label_info(_possible_dep, "target_gen_dir") _dep_name = get_label_info(_possible_dep, "name") _deps_configs += [ "$_dep_gen_dir/$_dep_name.build_config" ] } } sources = [] } set_sources_assignment_filter([]) } _rebased_deps_configs = rebase_path(_deps_configs, root_build_dir) outputs = [ build_config, ] args = [ "--type", type, "--depfile", rebase_path(depfile, root_build_dir), "--deps-configs=$_rebased_deps_configs", "--build-config", rebase_path(build_config, root_build_dir), ] is_java = type == "java_library" || type == "java_binary" || type == "java_prebuilt" is_apk = type == "android_apk" is_android_assets = type == "android_assets" is_android_resources = type == "android_resources" is_deps_dex = type == "deps_dex" is_group = type == "group" supports_android = is_apk || is_android_assets || is_android_resources || is_deps_dex || is_group || (is_java && defined(invoker.supports_android) && invoker.supports_android) requires_android = is_apk || is_android_assets || is_android_resources || is_deps_dex || (is_java && defined(invoker.requires_android) && invoker.requires_android) assert(!requires_android || supports_android, "requires_android requires" + " supports_android") # Mark these variables as used. assert(is_java || true) assert(is_apk || true) assert(is_android_resources || true) assert(is_deps_dex || true) assert(is_group || true) if (is_java || is_apk) { args += [ "--jar-path", rebase_path(invoker.jar_path, root_build_dir), ] } if (is_apk || is_deps_dex || (is_java && supports_android)) { args += [ "--dex-path", rebase_path(invoker.dex_path, root_build_dir), ] } if (supports_android) { args += [ "--supports-android" ] } if (requires_android) { args += [ "--requires-android" ] } if (defined(invoker.bypass_platform_checks) && invoker.bypass_platform_checks) { args += [ "--bypass-platform-checks" ] } if (defined(invoker.apk_under_test)) { deps += [ "${invoker.apk_under_test}__build_config" ] apk_under_test_gen_dir = get_label_info(invoker.apk_under_test, "target_gen_dir") apk_under_test_name = get_label_info(invoker.apk_under_test, "name") apk_under_test_config = "$apk_under_test_gen_dir/$apk_under_test_name.build_config" args += [ "--tested-apk-config", rebase_path(apk_under_test_config, root_build_dir), ] } if (is_android_assets) { if (defined(invoker.asset_sources)) { _rebased_asset_sources = rebase_path(invoker.asset_sources, root_build_dir) args += [ "--asset-sources=$_rebased_asset_sources" ] } if (defined(invoker.asset_renaming_sources)) { _rebased_asset_renaming_sources = rebase_path(invoker.asset_renaming_sources, root_build_dir) args += [ "--asset-renaming-sources=$_rebased_asset_renaming_sources" ] # These are zip paths, so no need to rebase. args += [ "--asset-renaming-destinations=${invoker.asset_renaming_destinations}" ] } if (defined(invoker.disable_compression) && invoker.disable_compression) { args += [ "--disable-asset-compression" ] } } if (is_android_resources || is_apk) { assert(defined(invoker.resources_zip)) args += [ "--resources-zip", rebase_path(invoker.resources_zip, root_build_dir), ] if (defined(invoker.android_manifest)) { inputs += [ invoker.android_manifest ] args += [ "--android-manifest", rebase_path(invoker.android_manifest, root_build_dir), ] } else { assert(!is_apk, "apk build configs require an android_manifest") } if (defined(invoker.custom_package)) { args += [ "--package-name", invoker.custom_package, ] } if (defined(invoker.r_text)) { args += [ "--r-text", rebase_path(invoker.r_text, root_build_dir), ] } } if (is_android_resources && defined(invoker.resource_dirs)) { resource_dirs = rebase_path(invoker.resource_dirs, root_build_dir) args += [ "--resource-dirs=$resource_dirs" ] } if (is_apk) { if (defined(invoker.shared_libraries_runtime_deps_file)) { # Don't list shared_libraries_runtime_deps_file as an input in order to # avoid having to depend on the runtime_deps target. See comment in # rules.gni for why we do this. args += [ "--shared-libraries-runtime-deps", rebase_path(invoker.shared_libraries_runtime_deps_file, root_build_dir), ] } if (defined(invoker.secondary_abi_shared_libraries_runtime_deps_file)) { # Don't list secondary_abi_shared_libraries_runtime_deps_file as an # input in order to avoid having to depend on the runtime_deps target. # See comment in rules.gni for why we do this. args += [ "--secondary-abi-shared-libraries-runtime-deps", rebase_path(invoker.secondary_abi_shared_libraries_runtime_deps_file, root_build_dir), ] } if (defined(invoker.proguard_enabled) && invoker.proguard_enabled) { args += [ "--proguard-enabled", "--proguard-info", rebase_path(invoker.proguard_info, root_build_dir), ] } if (defined(invoker.apk_path)) { _rebased_apk_path = rebase_path(invoker.apk_path, root_build_dir) _rebased_incremental_apk_path = rebase_path(invoker.incremental_apk_path, root_build_dir) _rebased_incremental_install_script_path = rebase_path(invoker.incremental_install_script_path, root_build_dir) args += [ "--apk-path=$_rebased_apk_path" ] args += [ "--incremental-apk-path=$_rebased_incremental_apk_path" ] args += [ "--incremental-install-script-path=$_rebased_incremental_install_script_path" ] } } if (defined(invoker.java_sources_file)) { args += [ "--java-sources-file", rebase_path(invoker.java_sources_file, root_build_dir), ] } if (defined(invoker.srcjar)) { args += [ "--srcjar", rebase_path(invoker.srcjar, root_build_dir), ] } if (defined(invoker.bundled_srcjars)) { _rebased_bundled_srcjars = rebase_path(invoker.bundled_srcjars, root_build_dir) args += [ "--bundled-srcjars=$_rebased_bundled_srcjars" ] } if (defined(invoker.input_jars_paths)) { _rebased_input_jars_paths = rebase_path(invoker.input_jars_paths, root_build_dir) args += [ "--extra-classpath-jars=$_rebased_input_jars_paths" ] } if (defined(invoker.proguard_configs)) { _rebased_proguard_configs = rebase_path(invoker.proguard_configs, root_build_dir) args += [ "--proguard-configs=$_rebased_proguard_configs" ] } if (defined(invoker.gradle_treat_as_prebuilt) && invoker.gradle_treat_as_prebuilt) { args += [ "--gradle-treat-as-prebuilt" ] } if (defined(invoker.main_class)) { args += [ "--main-class", invoker.main_class, ] } if (current_toolchain != default_toolchain) { # This has to be a built-time error rather than a GN assert because many # packages have a mix of java and non-java targets. For example, the # following would fail even though nothing depends on :bar(//baz): # # shared_library("foo") { # } # # android_library("bar") { # deps = [ ":foo(//baz)" ] # assert(current_toolchain == default_toolchain) # } _msg = [ "Tried to build an Android target in a non-default toolchain.", "target: " + get_label_info(":$target_name", "label_with_toolchain"), "default_toolchain: $default_toolchain", ] args += [ "--fail=$_msg" ] } } } template("copy_ex") { set_sources_assignment_filter([]) action(target_name) { forward_variables_from(invoker, [ "data", "deps", "inputs", "sources", "testonly", "visibility", ]) if (!defined(sources)) { sources = [] } script = "//build/android/gyp/copy_ex.py" depfile = "$target_gen_dir/$target_name.d" _stamp_file = "$target_gen_dir/$target_name.stamp" outputs = [ _stamp_file, ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--stamp", rebase_path(_stamp_file, root_build_dir), "--dest", rebase_path(invoker.dest, root_build_dir), ] rebased_sources = rebase_path(sources, root_build_dir) args += [ "--files=$rebased_sources" ] if (defined(invoker.clear_dir) && invoker.clear_dir) { args += [ "--clear" ] } if (defined(invoker.args)) { args += invoker.args } if (defined(invoker.renaming_sources) && defined(invoker.renaming_destinations)) { sources += invoker.renaming_sources rebased_renaming_sources = rebase_path(invoker.renaming_sources, root_build_dir) args += [ "--renaming-sources=$rebased_renaming_sources" ] renaming_destinations = invoker.renaming_destinations args += [ "--renaming-destinations=$renaming_destinations" ] } } } # Generates a script in the build bin directory which runs the test # target using the test runner script in build/android/test_runner.py. template("test_runner_script") { testonly = true _test_name = invoker.test_name _test_type = invoker.test_type _incremental_install = defined(invoker.incremental_install) && invoker.incremental_install _runtime_deps = !defined(invoker.ignore_all_data_deps) || !invoker.ignore_all_data_deps if (_runtime_deps) { # This runtime_deps file is used at runtime and thus cannot go in # target_gen_dir. _target_dir_name = get_label_info(":$target_name", "dir") _runtime_deps_file = "$root_out_dir/gen.runtime/$_target_dir_name/$target_name.runtime_deps" _runtime_deps_target = "${target_name}__write_deps" group(_runtime_deps_target) { forward_variables_from(invoker, [ "data", "data_deps", "deps", "public_deps", ]) write_runtime_deps = _runtime_deps_file } } action(target_name) { forward_variables_from(invoker, [ "data_deps", "deps", ]) if (!defined(deps)) { deps = [] } if (!defined(data_deps)) { data_deps = [] } script = "//build/android/gyp/create_test_runner_script.py" depfile = "$target_gen_dir/$target_name.d" data_deps += [ "//build/android:test_runner_py" ] data = [] test_runner_args = [ _test_type, "--output-directory", rebase_path(root_build_dir, root_build_dir), ] if (_runtime_deps) { deps += [ ":$_runtime_deps_target" ] data += [ _runtime_deps_file ] test_runner_args += [ "--runtime-deps-path", rebase_path(_runtime_deps_file, root_build_dir), ] } # apk_target is not used for native executable tests # (e.g. breakpad_unittests). if (defined(invoker.apk_target)) { assert(!defined(invoker.executable_dist_dir)) deps += [ "${invoker.apk_target}__build_config" ] _apk_build_config = get_label_info(invoker.apk_target, "target_gen_dir") + "/" + get_label_info(invoker.apk_target, "name") + ".build_config" _rebased_apk_build_config = rebase_path(_apk_build_config, root_build_dir) assert(_rebased_apk_build_config != "") # Mark as used. } else if (_test_type == "gtest") { assert( defined(invoker.executable_dist_dir), "Must define either apk_target or executable_dist_dir for test_runner_script()") test_runner_args += [ "--executable-dist-dir", rebase_path(invoker.executable_dist_dir, root_build_dir), ] } if (_test_type == "gtest") { assert(defined(invoker.test_suite)) test_runner_args += [ "--suite", invoker.test_suite, ] } else if (_test_type == "instrumentation") { _test_apk = "@FileArg($_rebased_apk_build_config:deps_info:apk_path)" if (_incremental_install) { _test_apk = "@FileArg($_rebased_apk_build_config:deps_info:incremental_apk_path)" } test_runner_args += [ "--test-apk=$_test_apk", "--test-jar", rebase_path(invoker.test_jar, root_build_dir), ] if (defined(invoker.apk_under_test)) { deps += [ "${invoker.apk_under_test}__build_config" ] _apk_under_test_build_config = get_label_info(invoker.apk_under_test, "target_gen_dir") + "/" + get_label_info(invoker.apk_under_test, "name") + ".build_config" _rebased_apk_under_test_build_config = rebase_path(_apk_under_test_build_config, root_build_dir) _apk_under_test = "@FileArg($_rebased_apk_under_test_build_config:deps_info:apk_path)" if (_incremental_install) { _apk_under_test = "@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_apk_path)" } test_runner_args += [ "--apk-under-test=$_apk_under_test" ] } if (emma_coverage) { # Set a default coverage output directory (can be overridden by user # passing the same flag). test_runner_args += [ "--coverage-dir", rebase_path("$root_out_dir/coverage", root_build_dir), ] } } else if (_test_type == "junit") { assert(defined(invoker.test_suite)) test_runner_args += [ "--test-suite", invoker.test_suite, ] } else { assert(false, "Invalid test type: $_test_type.") } if (defined(invoker.additional_apks)) { foreach(additional_apk, invoker.additional_apks) { deps += [ "${additional_apk}__build_config" ] _build_config = get_label_info(additional_apk, "target_gen_dir") + "/" + get_label_info(additional_apk, "name") + ".build_config" _rebased_build_config = rebase_path(_build_config, root_build_dir) test_runner_args += [ "--additional-apk", "@FileArg($_rebased_build_config:deps_info:apk_path)", ] } } if (defined(invoker.shard_timeout)) { test_runner_args += [ "--shard-timeout=${invoker.shard_timeout}" ] } if (_incremental_install) { test_runner_args += [ "--test-apk-incremental-install-script", "@FileArg($_rebased_apk_build_config:deps_info:incremental_install_script_path)", ] if (defined(invoker.apk_under_test)) { test_runner_args += [ "--apk-under-test-incremental-install-script", "@FileArg($_rebased_apk_under_test_build_config:deps_info:incremental_install_script_path)", ] } test_runner_args += [ "--fast-local-dev" ] } if (is_asan) { test_runner_args += [ "--tool=asan" ] } generated_script = "$root_build_dir/bin/run_${_test_name}" outputs = [ generated_script, ] data += [ generated_script ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--script-output-path", rebase_path(generated_script, root_build_dir), ] if (defined(android_test_runner_script)) { args += [ "--test-runner-path", android_test_runner_script, ] } args += test_runner_args } } if (enable_java_templates) { import("//build/config/zip.gni") import("//third_party/ijar/ijar.gni") import("//third_party/android_platform/config.gni") rebased_android_sdk = rebase_path(android_sdk, root_build_dir) rebased_android_sdk_build_tools = rebase_path(android_sdk_build_tools, root_build_dir) android_sdk_jar = "$android_sdk/android.jar" rebased_android_sdk_jar = rebase_path(android_sdk_jar, root_build_dir) android_default_aapt_path = "$rebased_android_sdk_build_tools/aapt" android_configuration_name = "Release" if (is_debug) { android_configuration_name = "Debug" } template("android_lint") { action(target_name) { forward_variables_from(invoker, [ "deps", "data_deps", "public_deps", "testonly", ]) if (!defined(deps)) { deps = [] } if (!defined(lint_suppressions_file)) { lint_suppressions_file = "//build/android/lint/suppressions.xml" } _cache_dir = "$root_build_dir/android_lint_cache" _result_path = "$target_gen_dir/$target_name/result.xml" _config_path = "$target_gen_dir/$target_name/config.xml" _suppressions_file = lint_suppressions_file _platform_xml_path = "${android_sdk_root}/platform-tools/api/api-versions.xml" _rebased_lint_android_sdk_root = rebase_path(lint_android_sdk_root, root_build_dir) script = "//build/android/gyp/lint.py" depfile = "$target_gen_dir/$target_name.d" inputs = [ _platform_xml_path, _suppressions_file, invoker.android_manifest, ] outputs = [ _result_path, _config_path, ] args = [ "--lint-path=$_rebased_lint_android_sdk_root/tools/lint", "--cache-dir", rebase_path(_cache_dir, root_build_dir), "--platform-xml-path", rebase_path(_platform_xml_path, root_build_dir), "--android-sdk-version=${lint_android_sdk_version}", "--depfile", rebase_path(depfile, root_build_dir), "--config-path", rebase_path(_suppressions_file, root_build_dir), "--manifest-path", rebase_path(invoker.android_manifest, root_build_dir), "--product-dir=.", "--processed-config-path", rebase_path(_config_path, root_build_dir), "--result-path", rebase_path(_result_path, root_build_dir), "--enable", ] if (defined(invoker.create_cache) && invoker.create_cache) { args += [ "--create-cache", "--silent", ] } else { inputs += invoker.java_files inputs += [ invoker.jar_path, invoker.build_config, ] if (invoker.java_files != []) { inputs += [ invoker.java_sources_file ] _rebased_java_sources_file = rebase_path(invoker.java_sources_file, root_build_dir) args += [ "--java-sources-file=$_rebased_java_sources_file" ] } deps += [ "//build/android:prepare_android_lint_cache" ] _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) args += [ "--jar-path", rebase_path(invoker.jar_path, root_build_dir), "--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)", "--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_dirs)", "--resource-sources=@FileArg($_rebased_build_config:deps_info:owned_resources_zips)", "--can-fail-build", ] } } } template("proguard") { action(target_name) { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "deps", "data_deps", "public_deps", "testonly", ]) script = "//build/android/gyp/proguard.py" if (defined(invoker.proguard_jar_path)) { _proguard_jar_path = invoker.proguard_jar_path } else { _proguard_jar_path = "//third_party/proguard/lib/proguard.jar" } _output_jar_path = invoker.output_jar_path inputs = [ _proguard_jar_path, ] if (defined(invoker.alternative_android_sdk_jar)) { inputs += [ invoker.alternative_android_sdk_jar ] _rebased_android_sdk_jar = rebase_path(invoker.alternative_android_sdk_jar) } else { inputs += [ android_sdk_jar ] _rebased_android_sdk_jar = rebased_android_sdk_jar } if (defined(invoker.inputs)) { inputs += invoker.inputs } depfile = "${target_gen_dir}/${target_name}.d" outputs = [ _output_jar_path, "$_output_jar_path.dump", "$_output_jar_path.seeds", "$_output_jar_path.mapping", "$_output_jar_path.usage", ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--proguard-path", rebase_path(_proguard_jar_path, root_build_dir), "--output-path", rebase_path(_output_jar_path, root_build_dir), "--classpath", _rebased_android_sdk_jar, ] if (proguard_verbose) { args += [ "--verbose" ] } if (defined(invoker.args)) { args += invoker.args } if (defined(invoker.proguard_jar_path)) { # We assume that if we are using a different ProGuard, this new version # can handle the 'dangerous' optimizaions. args += [ "--enable-dangerous-optimizations" ] } } } template("findbugs") { action(target_name) { forward_variables_from(invoker, [ "deps", "testonly", ]) script = "//build/android/findbugs_diff.py" depfile = "$target_gen_dir/$target_name.d" _result_path = "$target_gen_dir/$target_name/result.xml" _exclusions_file = "//build/android/findbugs_filter/findbugs_exclude.xml" _rebased_build_config = rebase_path(invoker.build_config, root_build_dir) inputs = [ "//build/android/pylib/utils/findbugs.py", _exclusions_file, invoker.jar_path, invoker.build_config, ] outputs = [ _result_path, ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--exclude", rebase_path(_exclusions_file, root_build_dir), "--auxclasspath-gyp", "@FileArg($_rebased_build_config:javac:classpath)", "--output-file", rebase_path(_result_path, root_build_dir), rebase_path(invoker.jar_path, root_build_dir), ] if (findbugs_verbose) { args += [ "-vv" ] } } } # Generates a script in the build bin directory to run a java binary. # # Variables # main_class: The class containing the program entry point. # jar_path: The path to the jar to run. # script_name: Name of the script to generate. # build_config: Path to .build_config for the jar (contains classpath). # wrapper_script_args: List of extra arguments to pass to the executable. # template("java_binary_script") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _main_class = invoker.main_class _build_config = invoker.build_config _jar_path = invoker.jar_path _script_name = invoker.script_name action(target_name) { script = "//build/android/gyp/create_java_binary_script.py" depfile = "$target_gen_dir/$_script_name.d" java_script = "$root_build_dir/bin/$_script_name" inputs = [ _build_config, ] outputs = [ java_script, ] forward_variables_from(invoker, [ "deps" ]) _rebased_build_config = rebase_path(_build_config, root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), "--output", rebase_path(java_script, root_build_dir), "--classpath=@FileArg($_rebased_build_config:deps_info:java:full_classpath)", "--jar-path", rebase_path(_jar_path, root_build_dir), "--main-class", _main_class, ] if (emma_coverage) { args += [ "--classpath", rebase_path("//third_party/android_tools/sdk/tools/lib/emma.jar", root_build_dir), ] args += [ "--noverify" ] } if (defined(invoker.wrapper_script_args)) { args += [ "--" ] + invoker.wrapper_script_args } if (defined(invoker.bootclasspath)) { args += [ "--bootclasspath", rebase_path(invoker.bootclasspath, root_build_dir), ] } } } template("dex") { set_sources_assignment_filter([]) _enable_multidex = defined(invoker.enable_multidex) && invoker.enable_multidex if (_enable_multidex) { _main_dex_list_path = invoker.output + ".main_dex_list" _main_dex_list_target_name = "${target_name}__main_dex_list" action(_main_dex_list_target_name) { forward_variables_from(invoker, [ "deps", "inputs", "sources", "testonly", ]) script = "//build/android/gyp/main_dex_list.py" depfile = "$target_gen_dir/$target_name.d" main_dex_rules = "//build/android/main_dex_classes.flags" if (!defined(inputs)) { inputs = [] } inputs += [ main_dex_rules ] outputs = [ _main_dex_list_path, ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--android-sdk-tools", rebased_android_sdk_build_tools, "--main-dex-list-path", rebase_path(_main_dex_list_path, root_build_dir), "--main-dex-rules-path", rebase_path(main_dex_rules, root_build_dir), ] if (defined(invoker.args)) { args += invoker.args } if (defined(invoker.sources)) { args += rebase_path(invoker.sources, root_build_dir) } } } assert(defined(invoker.output)) action(target_name) { forward_variables_from(invoker, [ "deps", "inputs", "sources", "testonly", ]) script = "//build/android/gyp/dex.py" depfile = "$target_gen_dir/$target_name.d" outputs = [ invoker.output, ] rebased_output = rebase_path(invoker.output, root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), "--android-sdk-tools", rebased_android_sdk_build_tools, "--dex-path", rebased_output, ] if (enable_incremental_dx) { args += [ "--incremental" ] } # EMMA requires --no-locals. if (emma_coverage) { args += [ "--no-locals=1" ] } if (_enable_multidex) { args += [ "--multi-dex", "--main-dex-list-path", rebase_path(_main_dex_list_path, root_build_dir), ] deps += [ ":${_main_dex_list_target_name}" ] inputs += [ _main_dex_list_path ] } if (defined(invoker.args)) { args += invoker.args } if (defined(invoker.sources)) { args += rebase_path(invoker.sources, root_build_dir) } } } template("process_java_prebuilt") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(invoker.build_config != "") _build_config = invoker.build_config _rebased_build_config = rebase_path(_build_config, root_build_dir) assert(_rebased_build_config != "" || true) # Mark used. _input_jar_path = invoker.input_jar_path _output_jar_path = invoker.output_jar_path _jar_excluded_patterns = [] if (defined(invoker.jar_excluded_patterns)) { _jar_excluded_patterns = invoker.jar_excluded_patterns } _strip_resource_classes = defined(invoker.strip_resource_classes) && invoker.strip_resource_classes _filter_jar = _jar_excluded_patterns != [] || _strip_resource_classes _proguard_preprocess = defined(invoker.proguard_preprocess) && invoker.proguard_preprocess _enable_assert = defined(invoker.supports_android) && invoker.supports_android && (is_java_debug || dcheck_always_on) _retrolambda = defined(invoker.supports_android) && invoker.supports_android && use_java8 _deps = [] _previous_output_jar = _input_jar_path if (_filter_jar) { _filter_target = "${target_name}__filter" _filter_input_jar = _previous_output_jar _filter_output_jar = "$target_out_dir/$target_name-filtered.jar" action(_filter_target) { script = "//build/android/gyp/jar.py" deps = _deps if (defined(invoker.deps)) { deps += invoker.deps } if (defined(invoker.public_deps)) { public_deps = invoker.public_deps } inputs = [ _build_config, _filter_input_jar, ] outputs = [ _filter_output_jar, ] args = [ "--input-jar", rebase_path(_filter_input_jar, root_build_dir), "--jar-path", rebase_path(_filter_output_jar, root_build_dir), "--excluded-classes=$_jar_excluded_patterns", ] if (_strip_resource_classes) { args += [ "--strip-resource-classes-for=@FileArg($_rebased_build_config:javac:resource_packages)" ] } } _deps = [] _deps = [ ":$_filter_target" ] _previous_output_jar = _filter_output_jar } if (_proguard_preprocess) { _proguard_target = "${target_name}__proguard_process" _proguard_input_jar = _previous_output_jar _proguard_output_jar = "$target_out_dir/$target_name-proguarded.jar" _proguard_config_path = invoker.proguard_preprocess_config proguard(_proguard_target) { deps = _deps if (defined(invoker.deps)) { deps += invoker.deps } if (defined(invoker.public_deps)) { public_deps = invoker.public_deps } inputs = [ _build_config, _proguard_config_path, _proguard_input_jar, ] output_jar_path = _proguard_output_jar _rebased_input_paths = [ rebase_path(_proguard_input_jar, root_build_dir) ] _rebased_proguard_configs = [ rebase_path(_proguard_config_path, root_build_dir) ] args = [ "--input-paths=$_rebased_input_paths", "--proguard-configs=$_rebased_proguard_configs", "--classpath=@FileArg($_rebased_build_config:javac:classpath)", ] } _deps = [] _deps = [ ":$_proguard_target" ] _previous_output_jar = _proguard_output_jar } if (_enable_assert) { _assert_target = "${target_name}__assert" _assert_input_jar = _previous_output_jar _assert_output_jar = "$target_out_dir/$target_name-asserted.jar" action(_assert_target) { script = "$root_build_dir/bin/helper/java_assertion_enabler" deps = [ "//build/android/java_assertion_enabler($default_toolchain)", ] deps += _deps if (defined(invoker.deps)) { deps += invoker.deps } if (defined(invoker.public_deps)) { public_deps = invoker.public_deps } inputs = [ _assert_input_jar, ] outputs = [ _assert_output_jar, ] args = [ rebase_path(_assert_input_jar, root_build_dir), rebase_path(_assert_output_jar, root_build_dir), ] } _deps = [] _deps = [ ":$_assert_target" ] _previous_output_jar = _assert_output_jar } if (_retrolambda) { _retrolambda_target = "${target_name}__retrolambda" _retrolambda_input_jar = _previous_output_jar _retrolambda_output_jar = "$target_out_dir/$target_name-retrolambda.jar" android_sdk_jar = "$android_sdk/android.jar" action(_retrolambda_target) { script = "//build/android/gyp/retrolambda.py" deps = _deps if (defined(invoker.deps)) { deps += invoker.deps } if (defined(invoker.public_deps)) { public_deps = invoker.public_deps } inputs = [ _build_config, _retrolambda_input_jar, ] outputs = [ _retrolambda_output_jar, ] args = [ "--input-jar", rebase_path(_retrolambda_input_jar, root_build_dir), "--output-jar", rebase_path(_retrolambda_output_jar, root_build_dir), "--classpath=@FileArg($_rebased_build_config:javac:classpath)", "--android-sdk-jar", rebase_path(android_sdk_jar, root_build_dir), ] } _deps = [] _deps = [ ":$_retrolambda_target" ] _previous_output_jar = _retrolambda_output_jar } _output_jar_target = "${target_name}__copy" copy(_output_jar_target) { deps = _deps if (defined(invoker.deps)) { deps += invoker.deps } if (defined(invoker.public_deps)) { public_deps = invoker.public_deps } sources = [ _previous_output_jar, ] outputs = [ _output_jar_path, ] } group(target_name) { forward_variables_from(invoker, [ "data_deps", "visibility", ]) public_deps = [ ":$_output_jar_target", ] } } template("emma_instr") { action(target_name) { forward_variables_from(invoker, [ "deps", "testonly", ]) _coverage_file = "$target_out_dir/${target_name}.em" _source_dirs_listing_file = "$target_out_dir/${target_name}_sources.txt" _emma_jar = "${android_sdk_root}/tools/lib/emma.jar" script = "//build/android/gyp/emma_instr.py" depfile = "${target_gen_dir}/${target_name}.d" inputs = invoker.java_files + [ _emma_jar, invoker.input_jar_path, ] outputs = [ _coverage_file, _source_dirs_listing_file, invoker.output_jar_path, ] args = [ "instrument_jar", "--input-path", rebase_path(invoker.input_jar_path, root_build_dir), "--output-path", rebase_path(invoker.output_jar_path, root_build_dir), "--depfile", rebase_path(depfile, root_build_dir), "--coverage-file", rebase_path(_coverage_file, root_build_dir), "--sources-list-file", rebase_path(_source_dirs_listing_file, root_build_dir), "--src-root", rebase_path("//", root_build_dir), "--emma-jar", rebase_path(_emma_jar, root_build_dir), ] _rebased_java_sources_file = rebase_path(invoker.java_sources_file, root_build_dir) args += [ "--java-sources-file=$_rebased_java_sources_file" ] if (emma_filter != "") { args += [ "--filter-string", emma_filter, ] } } } # Creates an unsigned .apk. # # Variables # assets_build_config: Path to android_apk .build_config containing merged # asset information. # deps: Specifies the dependencies of this target. # dex_path: Path to classes.dex file to include (optional). # resource_packaged_apk_path: Path to .ap_ to use. # output_apk_path: Output path for the generated .apk. # native_lib_placeholders: List of placeholder filenames to add to the apk # (optional). # native_libs: List of native libraries. # native_libs_filearg: @FileArg() of additionaly native libraries. # write_asset_list: Adds an extra file to the assets, which contains a list of # all other asset files. template("package_apk") { action(target_name) { forward_variables_from(invoker, [ "deps", "public_deps", "testonly", ]) _native_lib_placeholders = [] if (defined(invoker.native_lib_placeholders)) { _native_lib_placeholders = invoker.native_lib_placeholders } script = "//build/android/gyp/apkbuilder.py" depfile = "$target_gen_dir/$target_name.d" data_deps = [ "//tools/android/md5sum", ] # Used when deploying APKs inputs = invoker.native_libs + [ invoker.resource_packaged_apk_path ] if (defined(invoker.dex_path)) { inputs += [ invoker.dex_path ] } outputs = [ invoker.output_apk_path, ] _rebased_resource_packaged_apk_path = rebase_path(invoker.resource_packaged_apk_path, root_build_dir) _rebased_packaged_apk_path = rebase_path(invoker.output_apk_path, root_build_dir) args = [ "--depfile", rebase_path(depfile, root_build_dir), "--resource-apk=$_rebased_resource_packaged_apk_path", "--output-apk=$_rebased_packaged_apk_path", ] if (defined(invoker.assets_build_config)) { inputs += [ invoker.assets_build_config ] _rebased_build_config = rebase_path(invoker.assets_build_config, root_build_dir) args += [ "--assets=@FileArg($_rebased_build_config:assets)", "--uncompressed-assets=@FileArg($_rebased_build_config:uncompressed_assets)", ] } if (defined(invoker.write_asset_list) && invoker.write_asset_list) { args += [ "--write-asset-list" ] } if (defined(invoker.dex_path)) { _rebased_dex_path = rebase_path(invoker.dex_path, root_build_dir) args += [ "--dex-file=$_rebased_dex_path" ] } if (invoker.native_libs != [] || defined(invoker.native_libs_filearg) || _native_lib_placeholders != []) { args += [ "--android-abi=$android_app_abi" ] } if (invoker.native_libs != []) { _rebased_native_libs = rebase_path(invoker.native_libs, root_build_dir) args += [ "--native-libs=$_rebased_native_libs" ] } if (defined(invoker.native_libs_filearg)) { args += [ "--native-libs=${invoker.native_libs_filearg}" ] } if (_native_lib_placeholders != []) { args += [ "--native-lib-placeholders=$_native_lib_placeholders" ] } # TODO (michaelbai): Remove the secondary_native_libs variable. if (defined(invoker.secondary_abi_native_libs_filearg)) { assert(defined(android_app_secondary_abi)) args += [ "--secondary-native-libs=${invoker.secondary_abi_native_libs_filearg}", "--secondary-android-abi=$android_app_secondary_abi", ] } else if (defined(invoker.secondary_native_libs) && invoker.secondary_native_libs != []) { assert(defined(android_app_secondary_abi)) inputs += invoker.secondary_native_libs _secondary_native_libs = rebase_path(invoker.secondary_native_libs) args += [ "--secondary-native-libs=$_secondary_native_libs", "--secondary-android-abi=$android_app_secondary_abi", ] } if (defined(invoker.emma_instrument) && invoker.emma_instrument) { _emma_device_jar = "$android_sdk_root/tools/lib/emma_device.jar" _rebased_emma_device_jar = rebase_path(_emma_device_jar, root_build_dir) args += [ "--emma-device-jar=$_rebased_emma_device_jar" ] } if (defined(invoker.uncompress_shared_libraries) && invoker.uncompress_shared_libraries) { args += [ "--uncompress-shared-libraries" ] } } } # Signs & zipaligns an apk. # # Variables # input_apk_path: Path of the .apk to be finalized. # output_apk_path: Output path for the generated .apk. # keystore_path: Path to keystore to use for signing. # keystore_name: Key alias to use. # keystore_password: Keystore password. # rezip_apk: Whether to add crazy-linker alignment. template("finalize_apk") { action(target_name) { deps = [] script = "//build/android/gyp/finalize_apk.py" depfile = "$target_gen_dir/$target_name.d" forward_variables_from(invoker, [ "deps", "data_deps", "public_deps", "testonly", ]) sources = [ invoker.input_apk_path, ] inputs = [ invoker.keystore_path, ] outputs = [ invoker.output_apk_path, ] data = [ invoker.output_apk_path, ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--zipalign-path", rebase_path(zipalign_path, root_build_dir), "--unsigned-apk-path", rebase_path(invoker.input_apk_path, root_build_dir), "--final-apk-path", rebase_path(invoker.output_apk_path, root_build_dir), "--key-path", rebase_path(invoker.keystore_path, root_build_dir), "--key-name", invoker.keystore_name, "--key-passwd", invoker.keystore_password, ] if (defined(invoker.rezip_apk) && invoker.rezip_apk) { deps += [ "//build/android/rezip" ] _rezip_jar_path = "$root_build_dir/lib.java/rezip_apk.jar" args += [ "--load-library-from-zip=1", "--rezip-apk-jar-path", rebase_path(_rezip_jar_path, root_build_dir), ] } if (defined(invoker.page_align_shared_libraries) && invoker.page_align_shared_libraries) { args += [ "--page-align-shared-libraries" ] } } } # Packages resources, assets, dex, and native libraries into an apk. Signs and # zipaligns the apk. template("create_apk") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _android_manifest = invoker.android_manifest _base_path = invoker.base_path _final_apk_path = invoker.apk_path _incremental_final_apk_path_helper = process_file_template( [ _final_apk_path ], "{{source_dir}}/{{source_name_part}}_incremental.apk") _incremental_final_apk_path = _incremental_final_apk_path_helper[0] if (defined(invoker.resources_zip)) { _resources_zip = invoker.resources_zip assert(_resources_zip != "") # Mark as used. } if (defined(invoker.dex_path)) { _dex_path = invoker.dex_path } _load_library_from_apk = invoker.load_library_from_apk _deps = [] if (defined(invoker.deps)) { _deps = invoker.deps } _incremental_deps = [] if (defined(invoker.incremental_deps)) { _incremental_deps = invoker.incremental_deps } _native_libs = [] if (defined(invoker.native_libs)) { _native_libs = invoker.native_libs } _native_libs_even_when_incremental = [] if (defined(invoker.native_libs_even_when_incremental)) { _native_libs_even_when_incremental = invoker.native_libs_even_when_incremental } _version_code = invoker.version_code _version_name = invoker.version_name assert(_version_code != -1) # Mark as used. assert(_version_name != "") # Mark as used. _base_apk_path = _base_path + ".apk_intermediates" _resource_packaged_apk_path = _base_apk_path + ".ap_" _incremental_resource_packaged_apk_path = _base_apk_path + "_incremental.ap_" _packaged_apk_path = _base_apk_path + ".unfinished.apk" _incremental_packaged_apk_path = _base_apk_path + "_incremental.unfinished.apk" _shared_resources = defined(invoker.shared_resources) && invoker.shared_resources assert(_shared_resources || true) # Mark as used. _app_as_shared_lib = defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib assert(_app_as_shared_lib || true) # Mark as used. assert(!(_shared_resources && _app_as_shared_lib)) _keystore_path = invoker.keystore_path _keystore_name = invoker.keystore_name _keystore_password = invoker.keystore_password _split_densities = [] if (defined(invoker.create_density_splits) && invoker.create_density_splits) { _split_densities = [ "hdpi", "xhdpi", "xxhdpi", "xxxhdpi", "tvdpi", ] } _split_languages = [] if (defined(invoker.language_splits)) { _split_languages = invoker.language_splits } template("package_resources_helper") { action(target_name) { deps = invoker.deps script = "//build/android/gyp/package_resources.py" depfile = "${target_gen_dir}/${target_name}.d" inputs = [ invoker.android_manifest, ] if (defined(_resources_zip)) { inputs += [ _resources_zip ] } outputs = [ invoker.resource_packaged_apk_path, ] if (defined(invoker.android_aapt_path)) { _android_aapt_path = invoker.android_aapt_path } else { _android_aapt_path = android_default_aapt_path } if (defined(invoker.alternative_android_sdk_jar)) { _rebased_android_sdk_jar = rebase_path(invoker.alternative_android_sdk_jar) } else { _rebased_android_sdk_jar = rebased_android_sdk_jar } args = [ "--depfile", rebase_path(depfile, root_build_dir), "--android-sdk-jar", _rebased_android_sdk_jar, "--aapt-path", _android_aapt_path, "--configuration-name=$android_configuration_name", "--android-manifest", rebase_path(invoker.android_manifest, root_build_dir), "--version-code", _version_code, "--version-name", _version_name, "--apk-path", rebase_path(invoker.resource_packaged_apk_path, root_build_dir), ] if (defined(_resources_zip)) { args += [ "--resource-zips", rebase_path(_resources_zip, root_build_dir), ] } if (_shared_resources) { args += [ "--shared-resources" ] } if (_app_as_shared_lib) { args += [ "--app-as-shared-lib" ] } if (_split_densities != []) { args += [ "--create-density-splits" ] foreach(_density, _split_densities) { outputs += [ "${invoker.resource_packaged_apk_path}_${_density}" ] } } if (_split_languages != []) { args += [ "--language-splits=$_split_languages" ] foreach(_language, _split_languages) { outputs += [ "${invoker.resource_packaged_apk_path}_${_language}" ] } } if (defined(invoker.extensions_to_not_compress)) { args += [ "--no-compress", invoker.extensions_to_not_compress, ] } } } _package_resources_target_name = "${target_name}__package_resources" package_resources_helper(_package_resources_target_name) { forward_variables_from(invoker, [ "alternative_android_sdk_jar", "android_aapt_path", "extensions_to_not_compress", ]) deps = _deps android_manifest = _android_manifest resource_packaged_apk_path = _resource_packaged_apk_path } _generate_incremental_manifest_target_name = "${target_name}_incremental_generate_manifest" _incremental_android_manifest = get_label_info(_generate_incremental_manifest_target_name, "target_gen_dir") + "/AndroidManifest.xml" action(_generate_incremental_manifest_target_name) { deps = _incremental_deps script = "//build/android/incremental_install/generate_android_manifest.py" depfile = "${target_gen_dir}/${target_name}.d" inputs = [ _android_manifest, ] outputs = [ _incremental_android_manifest, ] _rebased_src_manifest = rebase_path(_android_manifest, root_build_dir) _rebased_incremental_manifest = rebase_path(_incremental_android_manifest, root_build_dir) _rebased_depfile = rebase_path(depfile, root_build_dir) args = [ "--src-manifest=$_rebased_src_manifest", "--out-manifest=$_rebased_incremental_manifest", "--depfile=$_rebased_depfile", ] if (disable_incremental_isolated_processes) { args += [ "--disable-isolated-processes" ] } } _incremental_package_resources_target_name = "${target_name}_incremental__package_resources" # TODO(agrieve): See if we can speed up this step by swapping the manifest # from the result of the main package_resources step. package_resources_helper(_incremental_package_resources_target_name) { forward_variables_from(invoker, [ "alternative_android_sdk_jar", "android_aapt_path", "extensions_to_not_compress", ]) deps = _incremental_deps + [ ":$_generate_incremental_manifest_target_name" ] android_manifest = _incremental_android_manifest resource_packaged_apk_path = _incremental_resource_packaged_apk_path } package_target = "${target_name}__package" package_apk(package_target) { forward_variables_from(invoker, [ "assets_build_config", "emma_instrument", "native_lib_placeholders", "native_libs_filearg", "secondary_abi_native_libs_filearg", "secondary_native_libs", "uncompress_shared_libraries", "write_asset_list", ]) deps = _deps + [ ":${_package_resources_target_name}" ] native_libs = _native_libs + _native_libs_even_when_incremental if (defined(_dex_path)) { dex_path = _dex_path } output_apk_path = _packaged_apk_path resource_packaged_apk_path = _resource_packaged_apk_path } _incremental_package_target = "${target_name}_incremental__package" package_apk(_incremental_package_target) { forward_variables_from(invoker, [ "assets_build_config", "emma_instrument", "secondary_native_libs", "uncompress_shared_libraries", ]) _dex_target = "//build/android/incremental_install:bootstrap_java__dex" deps = _incremental_deps + [ ":${_incremental_package_resources_target_name}", _dex_target, ] if (defined(_dex_path)) { dex_path = get_label_info(_dex_target, "target_gen_dir") + "/bootstrap.dex" } native_libs = _native_libs_even_when_incremental # http://crbug.com/384638 _has_native_libs = defined(invoker.native_libs_filearg) || _native_libs != [] if (_has_native_libs && _native_libs_even_when_incremental == []) { native_lib_placeholders = [ "libfix.crbug.384638.so" ] } output_apk_path = _incremental_packaged_apk_path resource_packaged_apk_path = _incremental_resource_packaged_apk_path } _finalize_apk_rule_name = "${target_name}__finalize" finalize_apk(_finalize_apk_rule_name) { forward_variables_from(invoker, [ "page_align_shared_libraries" ]) input_apk_path = _packaged_apk_path output_apk_path = _final_apk_path keystore_path = _keystore_path keystore_name = _keystore_name keystore_password = _keystore_password rezip_apk = _load_library_from_apk public_deps = [ # Generator of the _packaged_apk_path this target takes as input. ":$package_target", ] } _incremental_finalize_apk_rule_name = "${target_name}_incremental__finalize" finalize_apk(_incremental_finalize_apk_rule_name) { input_apk_path = _incremental_packaged_apk_path output_apk_path = _incremental_final_apk_path keystore_path = _keystore_path keystore_name = _keystore_name keystore_password = _keystore_password public_deps = [ ":$_incremental_package_target", ] } _split_deps = [] template("finalize_split") { finalize_apk(target_name) { _config = invoker.split_config _type = invoker.split_type input_apk_path = "${_resource_packaged_apk_path}_${_config}" _output_paths = process_file_template( [ _final_apk_path ], "{{source_dir}}/{{source_name_part}}-${_type}-${_config}.apk") output_apk_path = _output_paths[0] keystore_path = _keystore_path keystore_name = _keystore_name keystore_password = _keystore_password deps = [ ":${_package_resources_target_name}", ] } } foreach(_split, _split_densities) { _split_rule = "${target_name}__finalize_${_split}_split" finalize_split(_split_rule) { split_type = "density" split_config = _split } _split_deps += [ ":$_split_rule" ] } foreach(_split, _split_languages) { _split_rule = "${target_name}__finalize_${_split}_split" finalize_split(_split_rule) { split_type = "lang" split_config = _split } _split_deps += [ ":$_split_rule" ] } group(target_name) { public_deps = [ ":${_finalize_apk_rule_name}" ] + _split_deps } group("${target_name}_incremental") { public_deps = [ ":${_incremental_finalize_apk_rule_name}" ] + _split_deps } } template("java_prebuilt_impl") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _supports_android = defined(invoker.supports_android) && invoker.supports_android assert(defined(invoker.jar_path)) if (defined(invoker.output_name)) { _output_name = invoker.output_name } else { _output_name = get_path_info(invoker.jar_path, "name") } _base_path = "${target_gen_dir}/$target_name" # Jar files can be needed at runtime (by Robolectric tests or java binaries), # so do not put them under gen/. _target_dir_name = get_label_info(":$target_name", "dir") _jar_path = "$root_out_dir/lib.java$_target_dir_name/$_output_name.jar" _ijar_path = "$root_out_dir/lib.java$_target_dir_name/$_output_name.interface.jar" _build_config = _base_path + ".build_config" if (_supports_android) { _dex_path = _base_path + ".dex.jar" } _deps = [] if (defined(invoker.deps)) { _deps = invoker.deps } _jar_deps = [] if (defined(invoker.jar_dep)) { _jar_deps = [ invoker.jar_dep ] } _template_name = target_name _build_config_target_name = "${_template_name}__build_config" _process_jar_target_name = "${_template_name}__process_jar" _ijar_target_name = "${_template_name}__ijar" if (_supports_android) { _dex_target_name = "${_template_name}__dex" } write_build_config(_build_config_target_name) { type = "java_prebuilt" is_prebuilt_binary = defined(invoker.main_class) forward_variables_from(invoker, [ "input_jars_paths", "proguard_configs", ]) supports_android = _supports_android requires_android = defined(invoker.requires_android) && invoker.requires_android if (defined(invoker.deps)) { possible_config_deps = _deps } build_config = _build_config jar_path = _jar_path if (_supports_android) { dex_path = _dex_path } } process_java_prebuilt(_process_jar_target_name) { forward_variables_from(invoker, [ "jar_excluded_patterns", "proguard_preprocess", "proguard_preprocess_config", "strip_resource_classes", ]) visibility = [ ":$_ijar_target_name", ":$_template_name", ] if (_supports_android) { visibility += [ ":$_dex_target_name" ] } supports_android = _supports_android build_config = _build_config input_jar_path = invoker.jar_path output_jar_path = _jar_path deps = [ ":$_build_config_target_name" ] + _deps + _jar_deps } generate_interface_jar(_ijar_target_name) { if (!defined(invoker.proguard_preprocess) || !invoker.proguard_preprocess) { # Always used the unfiltered .jar to create the interface jar so that # other targets will resolve filtered classes when depending on # BuildConfig, NativeLibraries, etc. input_jar = invoker.jar_path deps = _deps + _jar_deps } else { # However, still apply pre-proguarding, since ignoring that can break # compiles. input_jar = _jar_path deps = [ ":$_process_jar_target_name", ] } output_jar = _ijar_path } if (_supports_android) { dex(_dex_target_name) { sources = [ _jar_path, ] output = _dex_path deps = [ ":$_process_jar_target_name" ] + _deps + _jar_deps } } if (defined(invoker.main_class)) { _binary_script_target_name = "${_template_name}__java_binary_script" java_binary_script(_binary_script_target_name) { forward_variables_from(invoker, [ "bootclasspath", "deps", "main_class", "wrapper_script_args", ]) if (!defined(deps)) { deps = [] } build_config = _build_config jar_path = _jar_path script_name = _template_name if (defined(invoker.wrapper_script_name)) { script_name = invoker.wrapper_script_name } deps += [ ":$_build_config_target_name" ] } } group(target_name) { forward_variables_from(invoker, [ "data_deps" ]) public_deps = [ ":$_ijar_target_name", ":$_process_jar_target_name", ] if (_supports_android) { public_deps += [ ":$_dex_target_name" ] } if (defined(invoker.main_class)) { # Some targets use the generated script while building, so make it a dep # rather than a data_dep. public_deps += [ ":$_binary_script_target_name" ] } } } # Compiles and jars a set of java files. # # Outputs: # $jar_path.jar # $jar_path.interface.jar # # Variables # java_files: List of .java files to compile (same as exists in java_sources_file) # java_sources_file: Path to file containing list of files to compile. # chromium_code: If true, enable extra warnings. # srcjar_deps: List of srcjar dependencies. The .java files contained in the # dependencies srcjar outputs will be compiled and added to the output jar. # jar_path: Use this to explicitly set the output jar path. Defaults to # "${target_gen_dir}/${target_name}.jar. template("compile_java") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) assert(defined(invoker.build_config)) assert(defined(invoker.jar_path)) _build_config = invoker.build_config _chromium_code = false if (defined(invoker.chromium_code)) { _chromium_code = invoker.chromium_code } _supports_android = true if (defined(invoker.supports_android)) { _supports_android = invoker.supports_android } _requires_android = defined(invoker.requires_android) && invoker.requires_android _enable_errorprone = use_errorprone_java_compiler if (!_chromium_code) { _enable_errorprone = false } else if (defined(invoker.enable_errorprone)) { _enable_errorprone = invoker.enable_errorprone } _provider_configurations = [] if (defined(invoker.provider_configurations)) { _provider_configurations = invoker.provider_configurations } _processors = [] _enable_interface_jars_javac = true if (defined(invoker.processors_javac)) { _processors = invoker.processors_javac _enable_interface_jars_javac = _processors == [] } _processor_args = [] if (defined(invoker.processor_args_javac)) { _processor_args = invoker.processor_args_javac } _additional_jar_files = [] if (defined(invoker.additional_jar_files)) { _additional_jar_files = invoker.additional_jar_files } if (defined(invoker.enable_incremental_javac_override)) { # Use invoker-specified override. _enable_incremental_javac = invoker.enable_incremental_javac_override } else { # Default to build arg if not overridden. _enable_incremental_javac = enable_incremental_javac } _manifest_entries = [] if (defined(invoker.manifest_entries)) { _manifest_entries = invoker.manifest_entries } _srcjar_deps = [] if (defined(invoker.srcjar_deps)) { _srcjar_deps += invoker.srcjar_deps } _java_srcjars = [] if (defined(invoker.srcjars)) { _java_srcjars = invoker.srcjars } foreach(dep, _srcjar_deps) { _dep_gen_dir = get_label_info(dep, "target_gen_dir") _dep_name = get_label_info(dep, "name") _java_srcjars += [ "$_dep_gen_dir/$_dep_name.srcjar" ] } # Mark srcjar_deps as used. assert(_srcjar_deps == [] || true) _javac_target_name = "${target_name}__javac" _process_prebuilt_target_name = "${target_name}__process_prebuilt" _ijar_target_name = "${target_name}__ijar" _final_target_name = target_name _final_jar_path = invoker.jar_path _javac_jar_path = "$target_gen_dir/$target_name.javac.jar" _process_prebuilt_jar_path = _final_jar_path _final_ijar_path = get_path_info(_final_jar_path, "dir") + "/" + get_path_info(_final_jar_path, "name") + ".interface.jar" _emma_instrument = defined(invoker.emma_instrument) && invoker.emma_instrument && invoker.java_files != [] if (_emma_instrument) { _emma_instr_target_name = "${target_name}__emma_instr" _process_prebuilt_jar_path = "$target_gen_dir/$target_name.process_prebuilt.jar" } _rebased_build_config = rebase_path(_build_config, root_build_dir) _rebased_jar_path = rebase_path(_javac_jar_path, root_build_dir) action(_javac_target_name) { script = "//build/android/gyp/javac.py" depfile = "$target_gen_dir/$target_name.d" deps = _srcjar_deps if (defined(invoker.deps)) { deps += invoker.deps } outputs = [ _javac_jar_path, _javac_jar_path + ".md5.stamp", ] sources = invoker.java_files + _java_srcjars inputs = [ _build_config, ] if (invoker.java_files != []) { inputs += [ invoker.java_sources_file ] } _rebased_java_srcjars = rebase_path(_java_srcjars, root_build_dir) _rebased_depfile = rebase_path(depfile, root_build_dir) args = [ "--depfile=$_rebased_depfile", "--jar-path=$_rebased_jar_path", "--java-srcjars=$_rebased_java_srcjars", "--java-srcjars=@FileArg($_rebased_build_config:javac:srcjars)", ] if (_enable_interface_jars_javac) { args += [ "--classpath=@FileArg($_rebased_build_config:javac:interface_classpath)" ] } else { args += [ "--classpath=@FileArg($_rebased_build_config:javac:classpath)" ] } if (_enable_incremental_javac) { args += [ "--incremental" ] deps += [ "//third_party/jmake($default_toolchain)" ] inputs += [ "$root_build_dir/bin/jmake" ] outputs += [ "${_javac_jar_path}.pdb" ] } if (_requires_android) { if (defined(invoker.alternative_android_sdk_ijar)) { deps += [ invoker.alternative_android_sdk_ijar_dep ] _android_sdk_ijar = invoker.alternative_android_sdk_ijar } else { deps += [ "//build/android:android_ijar" ] _android_sdk_ijar = "$root_out_dir/lib.java/android.interface.jar" } inputs += [ _android_sdk_ijar ] _rebased_android_sdk_ijar = rebase_path(_android_sdk_ijar, root_build_dir) args += [ "--bootclasspath=$_rebased_android_sdk_ijar" ] } if (use_java8) { args += [ "--java-version=1.8" ] } else if (_supports_android) { args += [ "--java-version=1.7" ] } foreach(e, _manifest_entries) { args += [ "--manifest-entry=" + e ] } if (_chromium_code) { args += [ "--chromium-code=1" ] } if (_enable_errorprone) { deps += [ "//third_party/errorprone:chromium_errorprone" ] args += [ "--use-errorprone-path", "bin/chromium_errorprone", ] } foreach(e, _provider_configurations) { args += [ "--provider-configuration=" + rebase_path(e, root_build_dir) ] } foreach(e, _processors) { args += [ "--processor=" + e ] } foreach(e, _processor_args) { args += [ "--processor-arg=" + e ] } foreach(file_tuple, _additional_jar_files) { # Each element is of length two, [ path_to_file, path_to_put_in_jar ] inputs += [ file_tuple[0] ] args += [ "--additional-jar-file=" + file_tuple[0] + ":" + file_tuple[1] ] } if (invoker.java_files != []) { args += [ "@" + rebase_path(invoker.java_sources_file, root_build_dir) ] } } process_java_prebuilt(_process_prebuilt_target_name) { forward_variables_from(invoker, [ "jar_excluded_patterns", "proguard_preprocess", "proguard_preprocess_config", ]) supports_android = _supports_android build_config = _build_config input_jar_path = _javac_jar_path output_jar_path = _process_prebuilt_jar_path deps = [ ":$_javac_target_name", ] if (defined(invoker.deps)) { deps += invoker.deps } } if (_emma_instrument) { emma_instr(_emma_instr_target_name) { forward_variables_from(invoker, [ "deps", "java_files", "java_sources_file", ]) input_jar_path = _process_prebuilt_jar_path output_jar_path = _final_jar_path if (!defined(deps)) { deps = [] } deps += [ ":$_process_prebuilt_target_name" ] } } generate_interface_jar(_ijar_target_name) { if (!defined(invoker.proguard_preprocess) || !invoker.proguard_preprocess) { # Always used the unfiltered .jar to create the interface jar so that # other targets will resolve filtered classes when depending on # BuildConfig, NativeLibraries, etc. input_jar = _javac_jar_path deps = [ ":$_javac_target_name", ] } else { # However, still apply pre-proguarding, since ignoring that can break # compiles. input_jar = _process_prebuilt_jar_path deps = [ ":$_process_prebuilt_target_name", ] } output_jar = _final_ijar_path } group(_final_target_name) { forward_variables_from(invoker, [ "visibility" ]) public_deps = [ ":$_ijar_target_name", ] if (_emma_instrument) { public_deps += [ ":$_emma_instr_target_name" ] } else { public_deps += [ ":$_process_prebuilt_target_name" ] } } } template("java_library_impl") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) _accumulated_deps = [] if (defined(invoker.deps)) { _accumulated_deps = invoker.deps } assert(defined(invoker.java_files) || defined(invoker.srcjars) || defined(invoker.srcjar_deps)) _base_path = "$target_gen_dir/$target_name" if (defined(invoker.output_name)) { _output_name = invoker.output_name } else { _output_name = target_name } # Jar files can be needed at runtime (by Robolectric tests or java binaries), # so do not put them under gen/. target_dir_name = get_label_info(":$target_name", "dir") _jar_path = "$root_out_dir/lib.java$target_dir_name/$_output_name.jar" if (defined(invoker.jar_path)) { _jar_path = invoker.jar_path } _template_name = target_name _final_deps = [] _supports_android = defined(invoker.supports_android) && invoker.supports_android _requires_android = defined(invoker.requires_android) && invoker.requires_android assert(_requires_android || true) # Mark as used. _android_manifest = "//build/android/AndroidManifest.xml" if (defined(invoker.android_manifest)) { _android_manifest = invoker.android_manifest } assert(_android_manifest != "") # Mark as used. if (defined(invoker.run_findbugs_override)) { _run_findbugs = invoker.run_findbugs_override } else { _run_findbugs = run_findbugs # Default to build arg if not overridden. } assert(_run_findbugs || true) # Mark as used. # Don't enable coverage, lint, findbugs unless the target has some # non-generated files. if (defined(invoker.chromium_code)) { _chromium_code = invoker.chromium_code } else { _chromium_code = defined(invoker.java_files) && invoker.java_files != [] if (_chromium_code) { # Make chromium_code = false be the default for targets within # third_party which contain no chromium-namespaced java files. set_sources_assignment_filter([ "*\bthird_party\b*" ]) sources = [ get_label_info(":$target_name", "dir"), ] if (sources == []) { set_sources_assignment_filter([ "*\bchromium\b*" ]) sources = invoker.java_files _chromium_code = invoker.java_files != sources } set_sources_assignment_filter([]) sources = [] } } _emma_never_instrument = !_chromium_code if (defined(invoker.emma_never_instrument)) { _emma_never_instrument = invoker.emma_never_instrument } assert(_emma_never_instrument || true) # Mark as used _emma_instrument = emma_coverage && !_emma_never_instrument if (_supports_android) { _dex_path = _base_path + ".dex.jar" if (defined(invoker.dex_path)) { _dex_path = invoker.dex_path } } _java_files = [] if (defined(invoker.java_files)) { _java_files += invoker.java_files } if (_java_files != []) { _java_sources_file = "$_base_path.sources" write_file(_java_sources_file, rebase_path(_java_files, root_build_dir)) } # Define build_config_deps which will be a list of targets required to # build the _build_config. if (defined(invoker.override_build_config)) { _build_config = invoker.override_build_config } else { _build_config = _base_path + ".build_config" build_config_target_name = "${_template_name}__build_config" write_build_config(build_config_target_name) { forward_variables_from(invoker, [ "gradle_treat_as_prebuilt", "input_jars_paths", "main_class", "proguard_configs", ]) if (defined(invoker.is_java_binary) && invoker.is_java_binary) { type = "java_binary" } else { type = "java_library" } if (defined(invoker.deps)) { possible_config_deps = invoker.deps } supports_android = _supports_android requires_android = _requires_android bypass_platform_checks = defined(invoker.bypass_platform_checks) && invoker.bypass_platform_checks build_config = _build_config jar_path = _jar_path if (_supports_android) { dex_path = _dex_path } if (_java_files != []) { java_sources_file = _java_sources_file } if (defined(invoker.srcjar_deps)) { bundled_srcjars = [] foreach(d, invoker.srcjar_deps) { _dep_gen_dir = get_label_info(d, "target_gen_dir") _dep_name = get_label_info(d, "name") bundled_srcjars += [ "$_dep_gen_dir/$_dep_name.srcjar" ] } } } _accumulated_deps += [ ":$build_config_target_name" ] } _srcjar_deps = [] if (defined(invoker.srcjar_deps)) { _srcjar_deps = invoker.srcjar_deps } _srcjars = [] if (defined(invoker.srcjars)) { _srcjars = invoker.srcjars } assert(_java_files != [] || _srcjar_deps != [] || _srcjars != []) _compile_java_target = "${_template_name}__compile_java" _final_deps += [ ":$_compile_java_target" ] compile_java(_compile_java_target) { forward_variables_from(invoker, [ "additional_jar_files", "alternative_android_sdk_ijar", "alternative_android_sdk_ijar_dep", "dist_jar_path", "enable_errorprone", "enable_incremental_javac_override", "jar_excluded_patterns", "manifest_entries", "processors_javac", "processor_args_javac", "proguard_preprocess_config", "proguard_preprocess", "provider_configurations", ]) jar_path = _jar_path build_config = _build_config java_files = _java_files if (_java_files != []) { java_sources_file = _java_sources_file } srcjar_deps = _srcjar_deps srcjars = _srcjars chromium_code = _chromium_code supports_android = _supports_android requires_android = _requires_android emma_instrument = _emma_instrument deps = _accumulated_deps } _accumulated_deps += [ ":$_compile_java_target" ] assert(_accumulated_deps != []) # Mark used. if (defined(invoker.main_class)) { # Targets might use the generated script while building, so make it a dep # rather than a data_dep. _final_deps += [ ":${_template_name}__java_binary_script" ] java_binary_script("${_template_name}__java_binary_script") { forward_variables_from(invoker, [ "bootclasspath", "main_class", "wrapper_script_args", ]) build_config = _build_config jar_path = _jar_path script_name = _template_name if (defined(invoker.wrapper_script_name)) { script_name = invoker.wrapper_script_name } deps = _accumulated_deps } } _has_lint_target = false if (_supports_android) { if (_chromium_code) { _has_lint_target = true android_lint("${_template_name}__lint") { android_manifest = _android_manifest build_config = _build_config jar_path = _jar_path java_files = _java_files if (_java_files != []) { java_sources_file = _java_sources_file } deps = _accumulated_deps } if (_run_findbugs) { findbugs("${_template_name}__findbugs") { build_config = _build_config jar_path = _jar_path deps = _accumulated_deps } } # Use an intermediate group() rather as the data_deps target in order to # avoid lint artifacts showing up as runtime_deps (while still having lint # run in parallel to other targets). group("${_template_name}__analysis") { public_deps = [ ":${_template_name}__lint", ] if (_run_findbugs) { public_deps += [ ":${_template_name}__findbugs" ] } } } _final_deps += [ ":${_template_name}__dex" ] dex("${_template_name}__dex") { sources = [ _jar_path, ] output = _dex_path deps = [ ":$_compile_java_target", ] } } group(target_name) { forward_variables_from(invoker, [ "data", "data_deps", "visibility", ]) if (!defined(data_deps)) { data_deps = [] } public_deps = _final_deps if (_has_lint_target) { data_deps += [ ":${_template_name}__analysis" ] } } } # Runs process_resources.py template("process_resources") { set_sources_assignment_filter([]) forward_variables_from(invoker, [ "testonly" ]) zip_path = invoker.zip_path srcjar_path = invoker.srcjar_path r_text_path = invoker.r_text_path build_config = invoker.build_config android_manifest = invoker.android_manifest non_constant_id = true if (defined(invoker.generate_constant_ids) && invoker.generate_constant_ids) { non_constant_id = false } action(target_name) { forward_variables_from(invoker, [ "deps", "visibility", ]) script = "//build/android/gyp/process_resources.py" depfile = "$target_gen_dir/$target_name.d" outputs = [ zip_path, srcjar_path, r_text_path, ] _all_resource_dirs = [] sources = [] if (defined(invoker.resource_dirs)) { _all_resource_dirs += invoker.resource_dirs # Speed up "gn gen" by short-circuiting the empty directory. if (invoker.resource_dirs != [ "//build/android/ant/empty/res" ] && invoker.resource_dirs != []) { _sources_build_rel = exec_script("//build/android/gyp/find.py", rebase_path(invoker.resource_dirs, root_build_dir), "list lines") sources += rebase_path(_sources_build_rel, ".", root_build_dir) } } if (defined(invoker.generated_resource_dirs)) { assert(defined(invoker.generated_resource_files)) _all_resource_dirs += invoker.generated_resource_dirs sources += invoker.generated_resource_files } inputs = [ build_config, android_manifest, ] _rebased_all_resource_dirs = rebase_path(_all_resource_dirs, root_build_dir) rebase_build_config = rebase_path(build_config, root_build_dir) if (defined(invoker.android_aapt_path)) { _android_aapt_path = invoker.android_aapt_path } else { _android_aapt_path = android_default_aapt_path } if (defined(invoker.alternative_android_sdk_jar)) { _rebased_android_sdk_jar = rebase_path(invoker.alternative_android_sdk_jar) } else { _rebased_android_sdk_jar = rebased_android_sdk_jar } args = [ "--depfile", rebase_path(depfile, root_build_dir), "--android-sdk-jar", _rebased_android_sdk_jar, "--aapt-path", _android_aapt_path, "--android-manifest", rebase_path(android_manifest, root_build_dir), "--resource-dirs=$_rebased_all_resource_dirs", "--srcjar-out", rebase_path(srcjar_path, root_build_dir), "--resource-zip-out", rebase_path(zip_path, root_build_dir), "--r-text-out", rebase_path(r_text_path, root_build_dir), "--dependencies-res-zips=@FileArg($rebase_build_config:resources:dependency_zips)", "--extra-res-packages=@FileArg($rebase_build_config:resources:extra_package_names)", "--extra-r-text-files=@FileArg($rebase_build_config:resources:extra_r_text_files)", ] if (non_constant_id) { args += [ "--non-constant-id" ] } if (defined(invoker.custom_package)) { args += [ "--custom-package", invoker.custom_package, ] } if (defined(invoker.v14_skip) && invoker.v14_skip) { args += [ "--v14-skip" ] } if (defined(invoker.shared_resources) && invoker.shared_resources) { args += [ "--shared-resources" ] } if (defined(invoker.app_as_shared_lib) && invoker.app_as_shared_lib) { args += [ "--app-as-shared-lib" ] } if (defined(invoker.include_all_resources) && invoker.include_all_resources) { args += [ "--include-all-resources" ] } if (defined(invoker.all_resources_zip_path)) { all_resources_zip = invoker.all_resources_zip_path outputs += [ all_resources_zip ] args += [ "--all-resources-zip-out", rebase_path(all_resources_zip, root_build_dir), ] } if (defined(invoker.proguard_file)) { outputs += [ invoker.proguard_file ] args += [ "--proguard-file", rebase_path(invoker.proguard_file, root_build_dir), ] } if (defined(invoker.args)) { args += invoker.args } } } # Produces a single .dex.jar out of a set of Java dependencies. template("deps_dex") { set_sources_assignment_filter([]) build_config = "$target_gen_dir/${target_name}.build_config" build_config_target_name = "${target_name}__build_config" write_build_config(build_config_target_name) { forward_variables_from(invoker, [ "dex_path" ]) if (defined(invoker.deps)) { possible_config_deps = invoker.deps } type = "deps_dex" build_config = build_config } rebased_build_config = rebase_path(build_config, root_build_dir) dex(target_name) { inputs = [ build_config, ] output = invoker.dex_path dex_arg_key = "${rebased_build_config}:final_dex:dependency_dex_files" args = [ "--inputs=@FileArg($dex_arg_key)" ] if (defined(invoker.excluded_jars)) { excluded_jars = rebase_path(invoker.excluded_jars, root_build_dir) args += [ "--excluded-paths=${excluded_jars}" ] } deps = [ ":$build_config_target_name", ] } } # Creates an AndroidManifest.xml for an APK split. template("generate_split_manifest") { assert(defined(invoker.main_manifest)) assert(defined(invoker.out_manifest)) assert(defined(invoker.split_name)) action(target_name) { forward_variables_from(invoker, [ "deps", "testonly", ]) depfile = "$target_gen_dir/$target_name.d" args = [ "--main-manifest", rebase_path(invoker.main_manifest, root_build_dir), "--out-manifest", rebase_path(invoker.out_manifest, root_build_dir), "--split", invoker.split_name, ] if (defined(invoker.version_code)) { args += [ "--version-code", invoker.version_code, ] } if (defined(invoker.version_name)) { args += [ "--version-name", invoker.version_name, ] } if (defined(invoker.has_code)) { args += [ "--has-code", invoker.has_code, ] } args += [ "--depfile", rebase_path(depfile, root_build_dir), ] script = "//build/android/gyp/generate_split_manifest.py" outputs = [ invoker.out_manifest, ] inputs = [ invoker.main_manifest, ] } } template("pack_relocation_section") { assert(defined(invoker.file_list_json)) assert(defined(invoker.libraries_filearg)) action(target_name) { forward_variables_from(invoker, [ "deps", "public_deps", "inputs", "testonly", ]) script = "//build/android/gyp/pack_relocations.py" depfile = "$target_gen_dir/$target_name.d" _packed_libraries_dir = "$target_gen_dir/$target_name/packed-libs" outputs = [ invoker.file_list_json, ] deps += [ relocation_packer_target ] args = [ "--depfile", rebase_path(depfile, root_build_dir), "--enable-packing=1", "--android-pack-relocations", rebase_path(relocation_packer_exe, root_build_dir), "--stripped-libraries-dir", rebase_path(root_build_dir, root_build_dir), "--packed-libraries-dir", rebase_path(_packed_libraries_dir, root_build_dir), "--libraries=${invoker.libraries_filearg}", "--filelistjson", rebase_path(invoker.file_list_json, root_build_dir), ] } } } ================================================ FILE: samples/GN/ios-rules.gni ================================================ # Copyright 2015 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/ios/ios_sdk.gni") import("//build/config/mac/base_rules.gni") import("//build/config/mac/symbols.gni") import("//build/toolchain/toolchain.gni") # Invokes lipo on multiple arch-specific binaries to create a fat binary. # # Arguments # # arch_binary_target # name of the target generating the arch-specific binaries, they must # be named $target_out_dir/$toolchain_cpu/$arch_binary_output. # # arch_binary_output # (optional, defaults to the name of $arch_binary_target) base name of # the arch-specific binary generated by arch_binary_target. # # output_name # (optional, defaults to $target_name) base name of the target output, # the full path will be $target_out_dir/$output_name. # # configs # (optional) a list of configurations, this is used to check whether # the binary should be stripped, when "enable_stripping" is true. # template("lipo_binary") { assert(defined(invoker.arch_binary_target), "arch_binary_target must be defined for $target_name") _target_name = target_name _output_name = target_name if (defined(invoker.output_name)) { _output_name = invoker.output_name } _all_target_cpu = [ current_cpu ] + additional_target_cpus _all_toolchains = [ current_toolchain ] + additional_toolchains _arch_binary_target = invoker.arch_binary_target _arch_binary_output = get_label_info(_arch_binary_target, "name") if (defined(invoker.arch_binary_output)) { _arch_binary_output = invoker.arch_binary_output } action(_target_name) { forward_variables_from(invoker, "*", [ "arch_binary_output", "arch_binary_target", "configs", "output_name", ]) script = "//build/toolchain/mac/linker_driver.py" outputs = [ "$target_out_dir/$_output_name", ] deps = [] _index = 0 inputs = [] foreach(_cpu, _all_target_cpu) { _toolchain = _all_toolchains[_index] _index = _index + 1 inputs += [ get_label_info("$_arch_binary_target($_toolchain)", "target_out_dir") + "/$_cpu/$_arch_binary_output" ] deps += [ "$_arch_binary_target($_toolchain)" ] } args = [] if (!use_system_xcode) { args += [ "--developer_dir", hermetic_xcode_path, ] } args += [ "xcrun", "lipo", "-create", "-output", rebase_path("$target_out_dir/$_output_name", root_build_dir), ] + rebase_path(inputs, root_build_dir) if (enable_dsyms) { _dsyms_output_dir = "$root_out_dir/$_output_name.dSYM" outputs += [ "$_dsyms_output_dir/", "$_dsyms_output_dir/Contents/Info.plist", "$_dsyms_output_dir/Contents/Resources/DWARF/$_output_name", ] args += [ "-Wcrl,dsym," + rebase_path("$root_out_dir/.", root_build_dir) ] } if (enable_stripping) { # Check whether //build/config/mac:strip_all has been removed from the # configs variables (as this is how stripping is disabled for a single # target). _strip_all_in_config = false if (defined(invoker.configs)) { foreach(_config, invoker.configs) { if (_config == "//build/config/mac:strip_all") { _strip_all_in_config = true } } } if (_strip_all_in_config) { args += [ "-Wcrl,strip,-x,-S" ] if (save_unstripped_output) { outputs += [ "$root_out_dir/$_output_name.unstripped" ] args += [ "-Wcrl,unstripped," + rebase_path("$root_out_dir/.", root_build_dir) ] } } } } } # Wrapper around create_bundle taking care of code signature settings. # # Arguments # # product_type # string, product type for the generated Xcode project. # # bundle_deps # (optional) list of additional dependencies # # bundle_deps_filter # (optional) list of dependencies to filter (for more information # see "gn help bundle_deps_filter") # # bundle_extension # string, extension of the bundle, used to generate bundle name. # # bundle_binary_target # string, label of the target generating the bundle main binary. # # bundle_binary_output # (optional) string, base name of the binary generated by the # bundle_binary_target target, defaults to the target name. # # extra_system_frameworks # (optional) list of system framework to copy to the bundle. # # enable_code_signing # (optional) boolean, control whether code signing is enabled or not, # default to ios_enable_code_signing if not defined. # # entitlements_path: # (optional) path to the template to use to generate the application # entitlements by performing variable substitutions, defaults to # //build/config/ios/entitlements.plist. # # entitlements_target: # (optional) label of the target generating the application # entitlements (must generate a single file as output); cannot be # defined if entitlements_path is set. # template("create_signed_bundle") { assert(defined(invoker.product_type), "product_type must be defined for $target_name") assert(defined(invoker.bundle_extension), "bundle_extension must be defined for $target_name") assert(defined(invoker.bundle_binary_target), "bundle_binary_target must be defined for $target_name") _target_name = target_name _output_name = target_name if (defined(invoker.output_name)) { _output_name = invoker.output_name } _bundle_binary_target = invoker.bundle_binary_target _bundle_binary_output = get_label_info(_bundle_binary_target, "name") if (defined(invoker.bundle_binary_output)) { _bundle_binary_output = invoker.bundle_binary_output } _bundle_extension = invoker.bundle_extension _bundle_root_dir = "$root_out_dir/$_output_name$_bundle_extension" if (!defined(invoker.entitlements_target)) { _entitlements_path = "//build/config/ios/entitlements.plist" if (defined(invoker.entitlements_path)) { _entitlements_path = invoker.entitlements_path } } else { assert(!defined(invoker.entitlements_path), "Cannot define both entitlements_path and entitlements_target " + "for $target_name") _entitlements_target_outputs = get_target_outputs(invoker.entitlements_target) _entitlements_path = _entitlements_target_outputs[0] } _enable_code_signing = ios_enable_code_signing if (defined(invoker.enable_code_signing)) { _enable_code_signing = invoker.enable_code_signing } create_bundle(_target_name) { forward_variables_from(invoker, [ "bundle_deps_filter", "data_deps", "deps", "product_type", "public_configs", "public_deps", "testonly", "visibility", ]) bundle_root_dir = _bundle_root_dir bundle_resources_dir = _bundle_root_dir bundle_executable_dir = _bundle_root_dir bundle_plugins_dir = "$_bundle_root_dir/PlugIns" if (!defined(public_deps)) { public_deps = [] } public_deps += [ _bundle_binary_target ] if (defined(invoker.bundle_deps)) { if (!defined(deps)) { deps = [] } deps += invoker.bundle_deps } if (defined(invoker.entitlements_target)) { if (!defined(deps)) { deps = [] } deps += [ invoker.entitlements_target ] } code_signing_script = "//build/config/ios/codesign.py" code_signing_sources = [ _entitlements_path, get_label_info(_bundle_binary_target, "target_out_dir") + "/$_bundle_binary_output", ] code_signing_outputs = [ "$_bundle_root_dir/$_output_name" ] if (_enable_code_signing) { code_signing_outputs += [ "$_bundle_root_dir/_CodeSignature/CodeResources" ] } if (ios_code_signing_identity != "" && !use_ios_simulator) { code_signing_outputs += [ "$_bundle_root_dir/embedded.mobileprovision" ] } if (defined(invoker.extra_system_frameworks)) { foreach(_framework, invoker.extra_system_frameworks) { code_signing_outputs += [ "$bundle_root_dir/Frameworks/" + get_path_info(_framework, "file") ] } } code_signing_args = [] if (!use_system_xcode) { code_signing_args += [ "--developer_dir", hermetic_xcode_path, ] } code_signing_args += [ "code-sign-bundle", "-t=" + ios_sdk_name, "-i=" + ios_code_signing_identity, "-e=" + rebase_path(_entitlements_path, root_build_dir), "-b=" + rebase_path("$target_out_dir/$_output_name", root_build_dir), rebase_path(bundle_root_dir, root_build_dir), ] if (!_enable_code_signing) { code_signing_args += [ "--disable-code-signature" ] } if (defined(invoker.extra_system_frameworks)) { # All framework in extra_system_frameworks are expected to be # system framework and the path to be already system absolute # so do not use rebase_path here. foreach(_framework, invoker.extra_system_frameworks) { code_signing_args += [ "-F=" + _framework ] } } } } # Generates Info.plist files for Mac apps and frameworks. # # Arguments # # info_plist: # (optional) string, path to the Info.plist file that will be used for # the bundle. # # info_plist_target: # (optional) string, if the info_plist is generated from an action, # rather than a regular source file, specify the target name in lieu # of info_plist. The two arguments are mutually exclusive. # # executable_name: # string, name of the generated target used for the product # and executable name as specified in the output Info.plist. # # extra_substitutions: # (optional) string array, 'key=value' pairs for extra fields which are # specified in a source Info.plist template. template("ios_info_plist") { assert(defined(invoker.info_plist) != defined(invoker.info_plist_target), "Only one of info_plist or info_plist_target may be specified in " + target_name) if (defined(invoker.info_plist)) { _info_plist = invoker.info_plist } else { _info_plist_target_output = get_target_outputs(invoker.info_plist_target) _info_plist = _info_plist_target_output[0] } info_plist(target_name) { format = "binary1" extra_substitutions = [] if (defined(invoker.extra_substitutions)) { extra_substitutions = invoker.extra_substitutions } extra_substitutions += [ "IOS_BUNDLE_ID_PREFIX=$ios_app_bundle_id_prefix", "IOS_DEPLOYMENT_TARGET=$ios_deployment_target", "IOS_PLATFORM_BUILD=$ios_platform_build", "IOS_PLATFORM_NAME=$ios_sdk_name", "IOS_PLATFORM_VERSION=$ios_sdk_version", "IOS_SDK_BUILD=$ios_sdk_build", "IOS_SDK_NAME=$ios_sdk_name$ios_sdk_version", "IOS_SUPPORTED_PLATFORM=$ios_sdk_platform", ] plist_templates = [ "//build/config/ios/BuildInfo.plist", _info_plist, ] if (defined(invoker.info_plist_target)) { deps = [ invoker.info_plist_target, ] } forward_variables_from(invoker, [ "executable_name", "output_name", "visibility", ]) } } # Template to build an application bundle for iOS. # # This should be used instead of "executable" built-in target type on iOS. # As the template forward the generation of the application executable to # an "executable" target, all arguments supported by "executable" targets # are also supported by this template. # # Arguments # # output_name: # (optional) string, name of the generated application, if omitted, # defaults to the target_name. # # extra_substitutions: # (optional) list of string in "key=value" format, each value will # be used as an additional variable substitution rule when generating # the application Info.plist # # info_plist: # (optional) string, path to the Info.plist file that will be used for # the bundle. # # info_plist_target: # (optional) string, if the info_plist is generated from an action, # rather than a regular source file, specify the target name in lieu # of info_plist. The two arguments are mutually exclusive. # # entitlements_path: # (optional) path to the template to use to generate the application # entitlements by performing variable substitutions, defaults to # //build/config/ios/entitlements.plist. # # entitlements_target: # (optional) label of the target generating the application # entitlements (must generate a single file as output); cannot be # defined if entitlements_path is set. # # bundle_extension: # (optional) bundle extension including the dot, default to ".app". # # product_type # (optional) string, product type for the generated Xcode project, # default to "com.apple.product-type.application". Should generally # not be overridden. # # enable_code_signing # (optional) boolean, control whether code signing is enabled or not, # default to ios_enable_code_signing if not defined. # # For more information, see "gn help executable". template("ios_app_bundle") { _output_name = target_name _target_name = target_name if (defined(invoker.output_name)) { _output_name = invoker.output_name } _arch_executable_source = _target_name + "_arch_executable_sources" _arch_executable_target = _target_name + "_arch_executable" _lipo_executable_target = _target_name + "_executable" source_set(_arch_executable_source) { forward_variables_from(invoker, "*", [ "bundle_deps", "bundle_deps_filter", "bundle_extension", "enable_code_signing", "entitlements_path", "entitlements_target", "extra_substitutions", "extra_system_frameworks", "info_plist", "info_plist_target", "output_name", "product_type", "visibility", ]) visibility = [ ":$_arch_executable_target" ] } if (current_toolchain == default_toolchain || use_ios_simulator) { _generate_entitlements_target = _target_name + "_gen_entitlements" _generate_entitlements_output = get_label_info(":$_generate_entitlements_target($default_toolchain)", "target_out_dir") + "/$_output_name.xcent" } executable(_arch_executable_target) { forward_variables_from(invoker, "*", [ "bundle_deps", "bundle_deps_filter", "bundle_extension", "enable_code_signing", "entitlements_path", "entitlements_target", "extra_substitutions", "extra_system_frameworks", "info_plist", "info_plist_target", "output_name", "product_type", "sources", "visibility", ]) visibility = [ ":$_lipo_executable_target($default_toolchain)" ] if (current_toolchain != default_toolchain) { visibility += [ ":$_target_name" ] } if (!defined(deps)) { deps = [] } deps += [ ":$_arch_executable_source" ] if (!defined(libs)) { libs = [] } libs += [ "UIKit.framework" ] if (!defined(ldflags)) { ldflags = [] } ldflags += [ "-Xlinker", "-rpath", "-Xlinker", "@executable_path/Frameworks", "-Xlinker", "-objc_abi_version", "-Xlinker", "2", ] if (use_ios_simulator) { deps += [ ":$_generate_entitlements_target($default_toolchain)" ] if (!defined(inputs)) { inputs = [] } inputs += [ _generate_entitlements_output ] if (!defined(ldflags)) { ldflags = [] } ldflags += [ "-Xlinker", "-sectcreate", "-Xlinker", "__TEXT", "-Xlinker", "__entitlements", "-Xlinker", rebase_path(_generate_entitlements_output, root_build_dir), ] } output_name = _output_name output_prefix_override = true output_dir = "$target_out_dir/$current_cpu" } if (current_toolchain != default_toolchain) { # For fat builds, only the default toolchain will generate an application # bundle. For the other toolchains, the template is only used for building # the arch-specific binary, thus the default target is just a group(). group(_target_name) { forward_variables_from(invoker, [ "visibility", "testonly", ]) public_deps = [ ":$_arch_executable_target", ] } } else { lipo_binary(_lipo_executable_target) { forward_variables_from(invoker, [ "configs", "testonly", ]) visibility = [ ":$_target_name" ] output_name = _output_name arch_binary_target = ":$_arch_executable_target" arch_binary_output = _output_name } _generate_info_plist = target_name + "_generate_info_plist" ios_info_plist(_generate_info_plist) { forward_variables_from(invoker, [ "extra_substitutions", "info_plist", "info_plist_target", ]) executable_name = _output_name } if (current_toolchain == default_toolchain) { if (!defined(invoker.entitlements_target)) { _entitlements_path = "//build/config/ios/entitlements.plist" if (defined(invoker.entitlements_path)) { _entitlements_path = invoker.entitlements_path } } else { assert(!defined(invoker.entitlements_path), "Cannot define both entitlements_path and entitlements_target" + "for $_target_name") _entitlements_target_outputs = get_target_outputs(invoker.entitlements_target) _entitlements_path = _entitlements_target_outputs[0] } action(_generate_entitlements_target) { _gen_info_plist_outputs = get_target_outputs(":$_generate_info_plist") _info_plist_path = _gen_info_plist_outputs[0] script = "//build/config/ios/codesign.py" deps = [ ":$_generate_info_plist", ] if (defined(invoker.entitlements_target)) { deps += [ invoker.entitlements_target ] } sources = [ _entitlements_path, _info_plist_path, ] outputs = [ _generate_entitlements_output, ] args = [] if (!use_system_xcode) { args += [ "--developer_dir", hermetic_xcode_path, ] } args += [ "generate-entitlements", "-e=" + rebase_path(_entitlements_path, root_build_dir), "-p=" + rebase_path(_info_plist_path, root_build_dir), ] + rebase_path(outputs, root_build_dir) } } _bundle_data_info_plist = target_name + "_bundle_data_info_plist" bundle_data(_bundle_data_info_plist) { forward_variables_from(invoker, [ "testonly" ]) sources = get_target_outputs(":$_generate_info_plist") outputs = [ "{{bundle_root_dir}}/Info.plist", ] public_deps = [ ":$_generate_info_plist", ] } create_signed_bundle(_target_name) { forward_variables_from(invoker, [ "bundle_deps", "bundle_deps_filter", "bundle_extension", "data_deps", "deps", "enable_code_signing", "entitlements_path", "entitlements_target", "extra_system_frameworks", "product_type", "public_configs", "public_deps", "testonly", "visibility", ]) output_name = _output_name bundle_binary_target = ":$_lipo_executable_target" bundle_binary_output = _output_name if (!defined(bundle_deps)) { bundle_deps = [] } bundle_deps += [ ":$_bundle_data_info_plist" ] if (use_ios_simulator) { if (!defined(data_deps)) { data_deps = [] } data_deps += [ "//testing/iossim" ] } if (!defined(product_type)) { product_type = "com.apple.product-type.application" } if (!defined(bundle_extension)) { bundle_extension = ".app" } } } } set_defaults("ios_app_bundle") { configs = default_executable_configs } # Template to build an application extension bundle for iOS. # # This should be used instead of "executable" built-in target type on iOS. # As the template forward the generation of the application executable to # an "executable" target, all arguments supported by "executable" targets # are also supported by this template. # # Arguments # # output_name: # (optional) string, name of the generated application, if omitted, # defaults to the target_name. # # extra_substitutions: # (optional) list of string in "key=value" format, each value will # be used as an additional variable substitution rule when generating # the application Info.plist # # info_plist: # (optional) string, path to the Info.plist file that will be used for # the bundle. # # info_plist_target: # (optional) string, if the info_plist is generated from an action, # rather than a regular source file, specify the target name in lieu # of info_plist. The two arguments are mutually exclusive. # # For more information, see "gn help executable". template("ios_appex_bundle") { ios_app_bundle(target_name) { forward_variables_from(invoker, "*", [ "bundle_extension", "product_type", ]) bundle_extension = ".appex" product_type = "com.apple.product-type.app-extension" # Add linker flags required for an application extension (determined by # inspecting the link command-line when using Xcode 9.0+). if (!defined(ldflags)) { ldflags = [] } ldflags += [ "-e", "_NSExtensionMain", "-fapplication-extension", ] } } set_defaults("ios_appex_bundle") { configs = default_executable_configs } # Compile a xib or storyboard file and add it to a bundle_data so that it is # available at runtime in the bundle. # # Arguments # # source: # string, path of the xib or storyboard to compile. # # Forwards all variables to the bundle_data target. template("bundle_data_xib") { assert(defined(invoker.source), "source needs to be defined for $target_name") _source_extension = get_path_info(invoker.source, "extension") assert(_source_extension == "xib" || _source_extension == "storyboard", "source must be a .xib or .storyboard for $target_name") _target_name = target_name _compile_xib = target_name + "_compile_xib" compile_xibs(_compile_xib) { sources = [ invoker.source, ] visibility = [ ":$_target_name" ] ibtool_flags = [ "--minimum-deployment-target", ios_deployment_target, "--auto-activate-custom-fonts", "--target-device", "iphone", "--target-device", "ipad", ] } bundle_data(_target_name) { forward_variables_from(invoker, "*", [ "source" ]) if (!defined(public_deps)) { public_deps = [] } public_deps += [ ":$_compile_xib" ] sources = get_target_outputs(":$_compile_xib") outputs = [ "{{bundle_resources_dir}}/{{source_file_part}}", ] } } # Compile a strings file and add it to a bundle_data so that it is available # at runtime in the bundle. # # Arguments # # source: # string, path of the strings file to compile. # # output: # string, path of the compiled file in the final bundle. # # Forwards all variables to the bundle_data target. template("bundle_data_strings") { assert(defined(invoker.source), "source needs to be defined for $target_name") assert(defined(invoker.output), "output needs to be defined for $target_name") _source_extension = get_path_info(invoker.source, "extension") assert(_source_extension == "strings", "source must be a .strings for $target_name") _target_name = target_name _convert_target = target_name + "_compile_strings" convert_plist(_convert_target) { visibility = [ ":$_target_name" ] source = invoker.source output = "$target_gen_dir/$_target_name/" + get_path_info(invoker.source, "file") format = "binary1" } bundle_data(_target_name) { forward_variables_from(invoker, "*", [ "source", "output", ]) if (!defined(public_deps)) { public_deps = [] } public_deps += [ ":$_convert_target" ] sources = get_target_outputs(":$_convert_target") outputs = [ invoker.output, ] } } # Template to package a shared library into an iOS framework bundle. # # By default, the bundle target this template generates does not link the # resulting framework into anything that depends on it. If a dependency wants # a link-time (as well as build-time) dependency on the framework bundle, # depend against "$target_name+link". If only the build-time dependency is # required (e.g., for copying into another bundle), then use "$target_name". # # Arguments # # output_name: # (optional) string, name of the generated framework without the # .framework suffix. If omitted, defaults to target_name. # # public_headers: # (optional) list of paths to header file that needs to be copied # into the framework bundle Headers subdirectory. If omitted or # empty then the Headers subdirectory is not created. # # sources # (optional) list of files. Needs to be defined and non-empty if # public_headers is defined and non-empty. # # enable_code_signing # (optional) boolean, control whether code signing is enabled or not, # default to ios_enable_code_signing if not defined. # # This template provides two targets for the resulting framework bundle. The # link-time behavior varies depending on which of the two targets below is # added as a dependency: # - $target_name only adds a build-time dependency. Targets that depend on # it will not link against the framework. # - $target_name+link adds a build-time and link-time dependency. Targets # that depend on it will link against the framework. # # The build-time-only dependency is used for when a target needs to use the # framework either only for resources, or because the target loads it at run- # time, via dlopen() or NSBundle. The link-time dependency will cause the # dependee to have the framework loaded by dyld at launch. # # Example of build-time only dependency: # # framework_bundle("CoreTeleportation") { # sources = [ ... ] # } # # bundle_data("core_teleportation_bundle_data") { # deps = [ ":CoreTeleportation" ] # sources = [ "$root_out_dir/CoreTeleportation.framework" ] # outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ] # } # # app_bundle("GoatTeleporter") { # sources = [ ... ] # deps = [ # ":core_teleportation_bundle_data", # ] # } # # The GoatTeleporter.app will not directly link against # CoreTeleportation.framework, but it will be included in the bundle's # Frameworks directory. # # Example of link-time dependency: # # framework_bundle("CoreTeleportation") { # sources = [ ... ] # ldflags = [ # "-install_name", # "@executable_path/../Frameworks/$target_name.framework" # ] # } # # bundle_data("core_teleportation_bundle_data") { # deps = [ ":CoreTeleportation+link" ] # sources = [ "$root_out_dir/CoreTeleportation.framework" ] # outputs = [ "{{bundle_root_dir}}/Frameworks/{{source_file_part}}" ] # } # # app_bundle("GoatTeleporter") { # sources = [ ... ] # deps = [ # ":core_teleportation_bundle_data", # ] # } # # Note that the framework is still copied to the app's bundle, but dyld will # load this library when the app is launched because it uses the "+link" # target as a dependency. This also requires that the framework set its # install_name so that dyld can locate it. # # See "gn help shared_library" for more information on arguments supported # by shared library target. template("ios_framework_bundle") { _target_name = target_name _output_name = target_name if (defined(invoker.output_name)) { _output_name = invoker.output_name } _has_public_headers = defined(invoker.public_headers) && invoker.public_headers != [] if (_has_public_headers) { _framework_headers_target = _target_name + "_framework_headers" _framework_headers_config = _target_name + "_framework_headers_config" _headers_map_config = _target_name + "_headers_map" } _arch_shared_library_source = _target_name + "_arch_shared_library_sources" _arch_shared_library_target = _target_name + "_arch_shared_library" _lipo_shared_library_target = _target_name + "_shared_library" source_set(_arch_shared_library_source) { forward_variables_from(invoker, "*", [ "bundle_deps", "bundle_deps_filter", "data_deps", "enable_code_signing", "info_plist", "info_plist_target", "output_name", "visibility", ]) visibility = [ ":$_arch_shared_library_target" ] if (_has_public_headers) { configs += [ ":$_framework_headers_config($default_toolchain)", ":$_headers_map_config($default_toolchain)", ] if (!defined(deps)) { deps = [] } deps += [ ":$_framework_headers_target($default_toolchain)" ] } } shared_library(_arch_shared_library_target) { forward_variables_from(invoker, "*", [ "bundle_deps", "bundle_deps_filter", "data_deps", "enable_code_signing", "info_plist", "info_plist_target", "output_name", "sources", "visibility", ]) visibility = [ ":$_lipo_shared_library_target($default_toolchain)" ] if (current_toolchain != default_toolchain) { visibility += [ ":$_target_name" ] } if (!defined(deps)) { deps = [] } deps += [ ":$_arch_shared_library_source" ] if (!defined(ldflags)) { ldflags = [] } ldflags += [ "-Xlinker", "-install_name", "-Xlinker", "@rpath/$_output_name.framework/$_output_name", "-Xlinker", "-objc_abi_version", "-Xlinker", "2", ] output_extension = "" output_name = _output_name output_prefix_override = true output_dir = "$target_out_dir/$current_cpu" } if (current_toolchain != default_toolchain) { # For fat builds, only the default toolchain will generate a framework # bundle. For the other toolchains, the template is only used for building # the arch-specific binary, thus the default target is just a group(). group(_target_name) { forward_variables_from(invoker, [ "visibility", "testonly", ]) public_deps = [ ":$_arch_shared_library_target", ] } group(_target_name + "+link") { forward_variables_from(invoker, [ "visibility", "testonly", ]) public_deps = [ ":$_target_name+link($default_toolchain)", ] } if (defined(invoker.bundle_deps)) { assert(invoker.bundle_deps != [], "mark bundle_deps as used") } } else { if (_has_public_headers) { _public_headers = invoker.public_headers _framework_root = "$root_out_dir/$_output_name.framework" _header_map_filename = "$target_gen_dir/$_output_name.headers.hmap" _compile_headers_map_target = _target_name + "_compile_headers_map" action(_compile_headers_map_target) { visibility = [ ":$_framework_headers_target" ] script = "//build/config/ios/write_framework_hmap.py" outputs = [ _header_map_filename, ] # The header map generation only wants the list of headers, not all of # sources, so filter any non-header source files from "sources". It is # less error prone that having the developer duplicate the list of all # headers in addition to "sources". set_sources_assignment_filter([ "*.c", "*.cc", "*.cpp", "*.m", "*.mm", ]) sources = invoker.sources set_sources_assignment_filter([]) args = [ rebase_path(_header_map_filename), rebase_path(_framework_root, root_build_dir), ] + rebase_path(sources, root_build_dir) } _create_module_map_target = _target_name + "_module_map" action(_create_module_map_target) { visibility = [ ":$_framework_headers_target" ] script = "//build/config/ios/write_framework_modulemap.py" outputs = [ "$_framework_root/Modules/module.modulemap", ] args = [ rebase_path("$_framework_root", root_build_dir) ] } _copy_public_headers_target = _target_name + "_copy_public_headers" copy(_copy_public_headers_target) { visibility = [ ":$_framework_headers_target" ] sources = _public_headers outputs = [ "$_framework_root/Headers/{{source_file_part}}", ] } config(_headers_map_config) { visibility = [ ":$_target_name" ] include_dirs = [ _header_map_filename ] } group(_framework_headers_target) { deps = [ ":$_compile_headers_map_target", ":$_copy_public_headers_target", ":$_create_module_map_target", ] } config(_framework_headers_config) { # The link settings are inherited from the framework_bundle config. cflags = [ "-F", rebase_path("$root_out_dir/.", root_build_dir), ] } } lipo_binary(_lipo_shared_library_target) { forward_variables_from(invoker, [ "configs", "testonly", ]) visibility = [ ":$_target_name" ] output_name = _output_name arch_binary_target = ":$_arch_shared_library_target" arch_binary_output = _output_name } _framework_public_config = _target_name + "_public_config" config(_framework_public_config) { # TODO(sdefresne): should we have a framework_dirs similar to lib_dirs # and include_dirs to avoid duplicate values on the command-line. visibility = [ ":$_target_name" ] ldflags = [ "-F", rebase_path("$root_out_dir/.", root_build_dir), ] lib_dirs = [ root_out_dir ] libs = [ "$_output_name.framework" ] } _info_plist_target = _target_name + "_info_plist" _info_plist_bundle = _target_name + "_info_plist_bundle" ios_info_plist(_info_plist_target) { visibility = [ ":$_info_plist_bundle" ] executable_name = _output_name forward_variables_from(invoker, [ "extra_substitutions", "info_plist", "info_plist_target", ]) } bundle_data(_info_plist_bundle) { visibility = [ ":$_target_name" ] forward_variables_from(invoker, [ "testonly" ]) sources = get_target_outputs(":$_info_plist_target") outputs = [ "{{bundle_root_dir}}/Info.plist", ] public_deps = [ ":$_info_plist_target", ] } create_signed_bundle(_target_name) { forward_variables_from(invoker, [ "bundle_deps", "bundle_deps_filter", "data_deps", "deps", "enable_code_signing", "public_configs", "public_deps", "testonly", "visibility", ]) product_type = "com.apple.product-type.framework" bundle_extension = ".framework" output_name = _output_name bundle_binary_target = ":$_lipo_shared_library_target" bundle_binary_output = _output_name if (!defined(deps)) { deps = [] } deps += [ ":$_info_plist_bundle" ] } group(_target_name + "+link") { forward_variables_from(invoker, [ "public_deps", "public_configs", "testonly", "visibility", ]) if (!defined(public_deps)) { public_deps = [] } public_deps += [ ":$_target_name" ] if (!defined(public_configs)) { public_configs = [] } public_configs += [ ":$_framework_public_config" ] if (_has_public_headers) { public_configs += [ ":$_framework_headers_config" ] } } bundle_data(_target_name + "+bundle") { forward_variables_from(invoker, [ "testonly", "visibility", ]) public_deps = [ ":$_target_name", ] sources = [ "$root_out_dir/$_output_name.framework", ] outputs = [ "{{bundle_resources_dir}}/Frameworks/$_output_name.framework", ] } } } set_defaults("ios_framework_bundle") { configs = default_shared_library_configs } # For Chrome on iOS we want to run XCTests for all our build configurations # (Debug, Release, ...). In addition, the symbols visibility is configured to # private by default. To simplify testing with those constraints, our tests are # compiled in the TEST_HOST target instead of the .xctest bundle. template("ios_xctest_test") { _target_name = target_name _output_name = target_name if (defined(invoker.output_name)) { _output_name = invoker.output_name } _xctest_target = _target_name + "_module" _xctest_output = _output_name + "_module" _host_target = _target_name _host_output = _output_name _xctest_arch_loadable_module_target = _xctest_target + "_arch_loadable_module" _xctest_lipo_loadable_module_target = _xctest_target + "_loadable_module" loadable_module(_xctest_arch_loadable_module_target) { visibility = [ ":$_xctest_lipo_loadable_module_target($default_toolchain)" ] if (current_toolchain != default_toolchain) { visibility += [ ":$_xctest_target" ] } sources = [ "//build/config/ios/xctest_shell.mm", ] configs += [ "//build/config/ios:xctest_config" ] output_dir = "$target_out_dir/$current_cpu" output_name = _xctest_output output_prefix_override = true output_extension = "" } if (current_toolchain != default_toolchain) { # For fat builds, only the default toolchain will generate a test bundle. # For the other toolchains, the template is only used for building the # arch-specific binary, thus the default target is just a group(). group(_xctest_target) { forward_variables_from(invoker, [ "visibility", "testonly", ]) public_deps = [ ":$_xctest_arch_loadable_module_target", ] } } else { _xctest_info_plist_target = _xctest_target + "_info_plist" _xctest_info_plist_bundle = _xctest_target + "_info_plist_bundle" ios_info_plist(_xctest_info_plist_target) { visibility = [ ":$_xctest_info_plist_bundle" ] info_plist = "//build/config/ios/Module-Info.plist" extra_substitutions = [ "MODULE_NAME=$_xctest_output" ] executable_name = _host_output } bundle_data(_xctest_info_plist_bundle) { visibility = [ ":$_xctest_target" ] public_deps = [ ":$_xctest_info_plist_target", ] sources = get_target_outputs(":$_xctest_info_plist_target") outputs = [ "{{bundle_root_dir}}/Info.plist", ] } lipo_binary(_xctest_lipo_loadable_module_target) { forward_variables_from(invoker, [ "configs", "testonly", ]) visibility = [ ":$_xctest_target" ] output_name = _xctest_output arch_binary_target = ":$_xctest_arch_loadable_module_target" arch_binary_output = _xctest_output } _xctest_bundle = _xctest_target + "_bundle" create_signed_bundle(_xctest_target) { forward_variables_from(invoker, [ "enable_code_signing" ]) visibility = [ ":$_xctest_bundle" ] product_type = "com.apple.product-type.bundle.unit-test" bundle_extension = ".xctest" output_name = _xctest_output bundle_binary_target = ":$_xctest_lipo_loadable_module_target" bundle_binary_output = _xctest_output deps = [ ":$_xctest_info_plist_bundle", ] } bundle_data(_xctest_bundle) { visibility = [ ":$_host_target" ] public_deps = [ ":$_xctest_target", ] sources = [ "$root_out_dir/$_xctest_output.xctest", ] outputs = [ "{{bundle_plugins_dir}}/$_xctest_output.xctest", ] } } ios_app_bundle(_host_target) { forward_variables_from(invoker, "*", [ "testonly" ]) testonly = true output_name = _host_output configs += [ "//build/config/ios:xctest_config" ] if (!defined(invoker.info_plist) && !defined(invoker.info_plist_target)) { info_plist = "//build/config/ios/Host-Info.plist" } # Xcode needs those two framework installed in the application (and signed) # for the XCTest to run, so install them using extra_system_frameworks. _ios_platform_library = "$ios_sdk_platform_path/Developer/Library" extra_system_frameworks = [ "$_ios_platform_library/Frameworks/XCTest.framework", "$_ios_platform_library/PrivateFrameworks/IDEBundleInjection.framework", ] if (current_toolchain == default_toolchain) { if (!defined(bundle_deps)) { bundle_deps = [] } bundle_deps += [ ":$_xctest_bundle" ] } if (!defined(ldflags)) { ldflags = [] } ldflags += [ "-Xlinker", "-rpath", "-Xlinker", "@executable_path/Frameworks", "-Xlinker", "-rpath", "-Xlinker", "@loader_path/Frameworks", ] } } set_defaults("ios_xctest_test") { configs = default_executable_configs } ================================================ FILE: samples/GN/isolate.gni ================================================ # Copyright 2016 the V8 project authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. import("//build/config/sanitizers/sanitizers.gni") import("//third_party/icu/config.gni") import("v8.gni") declare_args() { # Sets the test isolation mode (noop|prepare|check). v8_test_isolation_mode = "noop" } template("v8_isolate_run") { forward_variables_from(invoker, "*", [ "deps", "isolate", ]) # Remember target name as within the action scope the target name will be # different. name = target_name assert(defined(invoker.deps)) assert(defined(invoker.isolate)) if (name != "" && v8_test_isolation_mode != "noop") { action(name + "_run") { testonly = true deps = invoker.deps script = "//tools/isolate_driver.py" sources = [ invoker.isolate, ] inputs = [ # Files that are known to be involved in this step. "//tools/swarming_client/isolate.py", "//tools/swarming_client/run_isolated.py", ] if (v8_test_isolation_mode == "prepare") { outputs = [ "$root_out_dir/$name.isolated.gen.json", ] } else if (v8_test_isolation_mode == "check") { outputs = [ "$root_out_dir/$name.isolated", "$root_out_dir/$name.isolated.state", ] } # Translate gn to gyp variables. if (is_asan) { asan = "1" } else { asan = "0" } if (is_msan) { msan = "1" } else { msan = "0" } if (is_tsan) { tsan = "1" } else { tsan = "0" } if (is_cfi) { cfi_vptr = "1" } else { cfi_vptr = "0" } if (target_cpu == "x86") { target_arch = "ia32" } else { target_arch = target_cpu } if (is_debug) { configuration_name = "Debug" } else { configuration_name = "Release" } if (is_component_build) { component = "shared_library" } else { component = "static_library" } if (icu_use_data_file) { icu_use_data_file_flag = "1" } else { icu_use_data_file_flag = "0" } if (v8_enable_inspector) { enable_inspector = "1" } else { enable_inspector = "0" } if (v8_use_external_startup_data) { use_external_startup_data = "1" } else { use_external_startup_data = "0" } if (v8_use_snapshot) { use_snapshot = "true" } else { use_snapshot = "false" } if (v8_has_valgrind) { has_valgrind = "1" } else { has_valgrind = "0" } if (v8_gcmole) { gcmole = "1" } else { gcmole = "0" } # Note, all paths will be rebased in isolate_driver.py to be relative to # the isolate file. args = [ v8_test_isolation_mode, "--isolated", rebase_path("$root_out_dir/$name.isolated", root_build_dir), "--isolate", rebase_path(invoker.isolate, root_build_dir), # Path variables are used to replace file paths when loading a .isolate # file "--path-variable", "DEPTH", rebase_path("//", root_build_dir), "--path-variable", "PRODUCT_DIR", rebase_path(root_out_dir, root_build_dir), # TODO(machenbach): Set variables for remaining features. "--config-variable", "CONFIGURATION_NAME=$configuration_name", "--config-variable", "OS=$target_os", "--config-variable", "asan=$asan", "--config-variable", "cfi_vptr=$cfi_vptr", "--config-variable", "gcmole=$gcmole", "--config-variable", "has_valgrind=$has_valgrind", "--config-variable", "icu_use_data_file_flag=$icu_use_data_file_flag", "--config-variable", "is_gn=1", "--config-variable", "msan=$msan", "--config-variable", "tsan=$tsan", "--config-variable", "coverage=0", "--config-variable", "sanitizer_coverage=0", "--config-variable", "component=$component", "--config-variable", "target_arch=$target_arch", "--config-variable", "v8_enable_inspector=$enable_inspector", "--config-variable", "v8_use_external_startup_data=$use_external_startup_data", "--config-variable", "v8_use_snapshot=$use_snapshot", ] if (is_win) { args += [ "--config-variable", "msvs_version=2015", ] } else { args += [ "--config-variable", "msvs_version=0", ] } } } } ================================================ FILE: samples/GSC/_spiderbot_ride.csc ================================================ #include clientscripts\_utility; #include clientscripts\_filter; #using_animtree("player"); init() { clientscripts\_driving_fx::add_vehicletype_callback( "spiderbot_large", ::drive_spiderbot ); } // // drive_spiderbot( localClientNum ) { self endon( "entityshutdown" ); while( 1 ) { self waittill( "enter_vehicle", player ); init_filter_karma_spiderbot( player ); enable_filter_karma_spiderbot( player, 0 ); SetSavedDvar( "r_stereo3DEyeSeparationScaler", 0.01); //TODO: Get this to work in the vehicle GDT, somehow overcoming the lack of wheels if( isdefined( level._audio_spiderbot_override ) ) { self thread [[level._audio_spiderbot_override]](player); } // This compass isn't working they way it needs to. // Create the compass // spider_compass = Spawn( player GetLocalClientNumber(), player GetOrigin(), "script_model" ); // spider_compass SetModel( "p6_3d_gizmo" ); // spider_compass SetViewmodelRenderflag( true ); // spider_compass LinkToCamera( 5, (16, 0, 12) ); // in/out, left/right, up/down self waittill( "exit_vehicle" ); disable_filter_karma_spiderbot( player, 0 ); SetSavedDvar( "r_stereo3DEyeSeparationScaler", 1); // spider_compass delete(); } } ================================================ FILE: samples/GSC/array_override_common.gsc ================================================ #using scripts\shared\array_shared; #using scripts\shared\callbacks_shared; #using scripts\shared\flag_shared; #using scripts\shared\util_shared; #insert scripts\shared\shared.gsh; #insert scripts\zm\array_override\array_override_common.gsh; #namespace array_override; #define NOTIFY_SELF(n_add) self notify("override_state_change",n_type,str_name,n_add,is_override_exluded_from_notif(str_name)) function register(str_name,n_type,func) { switch(n_type) { case ARRAY_RANDOM: DEFAULT(self.array_random_override,array()); self.array_random_override[str_name] = func; break; case ARRAY_RANDOMIZE: DEFAULT(self.array_randomize_override,array()); self.array_randomize_override[str_name] = func; break; } NOTIFY_SELF(1); } function unregister(str_name,n_type) { switch(n_type) { case ARRAY_RANDOM: ArrayRemoveIndex(self.array_random_override,str_name,1); break; case ARRAY_RANDOMIZE: ArrayRemoveIndex(self.array_randomize_override,str_name,1); break; } NOTIFY_SELF(-1); } function private reregister(str_name,n_type) { switch(n_type) { case ARRAY_RANDOM: func = self.array_random_override[str_name]; break; case ARRAY_RANDOMIZE: func = self.array_randomize_override[str_name]; break; } if (!isdefined(func)) return; increment_exclude_from_notif(str_name); unregister(str_name,n_type); register(str_name,n_type,func); decrement_exclude_from_notif(str_name); } #define EXCLUDE_FROM_NOTIF_DEFAULTS MAKE_ARRAY(self.override_notif_exclude) DEFAULT(self.override_notif_exclude[str_name],0); function increment_exclude_from_notif(str_name) { EXCLUDE_FROM_NOTIF_DEFAULTS self.override_notif_exclude[str_name]++; } function decrement_exclude_from_notif(str_name) { EXCLUDE_FROM_NOTIF_DEFAULTS self.override_notif_exclude[str_name]--; if (self.override_notif_exclude[str_name] <= 0) ArrayRemoveIndex(self.override_notif_exclude,str_name,1); } function private is_override_exluded_from_notif(str_name) { MAKE_ARRAY(self.override_notif_exclude) return IS_TRUE(self.override_notif_exclude[str_name]); } function autoexec init_player_overrides() { callback::on_connect(&on_player_connect); } function private on_player_connect() { self.array_random_override = array(); self.array_randomize_override = array(); } function register_recursive(str_name,n_type,func,b_ex_notif = false) { switch(n_type) { case ARRAY_RANDOM: DEFAULT(level.recursive_random_override,array()); level.recursive_random_override[str_name] = SpawnStruct(); struct = level.recursive_random_override[str_name]; break; case ARRAY_RANDOMIZE: DEFAULT(level.recursive_randomize_override,array()); level.recursive_randomize_override[str_name] = SpawnStruct(); struct = level.recursive_randomize_override[str_name]; break; } struct.func = func; struct.b_ex_notif = b_ex_notif; struct.count = 0; struct.a_flag = array(); } #define RECURSIVE_SWITCHBLOCK switch(n_type){\ case ARRAY_RANDOM: struct = level.recursive_random_override[str_name];break;\ case ARRAY_RANDOMIZE: struct = level.recursive_randomize_override[str_name];break;}\ if (!isdefined(struct)) return; function increment_register(str_name,n_type) { RECURSIVE_SWITCHBLOCK if (struct.count <= 0) { struct.count = 0; if (struct.b_ex_notif) level increment_exclude_from_notif(str_name); level register(str_name,n_type,struct.func); } struct.count++; thread update_recursive_flags(struct); } function decrement_register(str_name,n_type,b_unregister = false) { RECURSIVE_SWITCHBLOCK struct.count--; if (b_unregister || struct.count <= 0) { level unregister(str_name,n_type); if (struct.b_ex_notif) level decrement_exclude_from_notif(str_name); struct.count = 0; } thread update_recursive_flags(struct); } function run_recursive_override_instance(str_name,n_type,func) { //fix this id = self GetEntityNumber() + 1; wait(.05 * id); // increment_register(str_name,n_type); [[func]](); decrement_register(str_name,n_type); } function add_recursive_override_flag(str_name,n_type,a_flags) { RECURSIVE_SWITCHBLOCK DEFAULT(struct.a_flag,array()); foreach (flag in a_flags) { if (!IsArray(flag)) flag_array = array(flag); else flag_array = flag; str_flag = flag_array[0]; if (!IsString(str_flag)) continue; n_count = VAL(flag_array[1],0); flag_struct = SpawnStruct(); flag_struct.flag = str_flag; flag_struct.required_count = n_count; flag_struct.comparison = flag_array[2]; struct.a_flag[struct.a_flag.size] = flag_struct; level flag::init(str_flag); update_specific_flag(flag_struct,struct.count); } } function update_recursive_flags(struct) { foreach (flag_struct in struct.a_flag) { update_specific_flag(flag_struct,struct.count); } } function private update_specific_flag(flag_struct,n_count) { if (IsFunctionPtr(flag_struct.required_count)) required_count = [[flag_struct.required_count]](); else required_count = flag_struct.required_count; if (IsFunctionPtr(flag_struct.comparison)) b_val = [[flag_struct.comparison]](n_count,required_count); else b_val = n_count === required_count; if (isdefined(b_val)) level flag::set_val(flag_struct.flag,b_val); } function link_to_recursive_flag(str_name,n_type,a_flag,b_waitForAll = false) { level endon("end_game"); if (!isdefined(a_flag)) return; if (!IsArray(a_flag)) a_flag = array(a_flag); if (b_waitForAll) {waitFunc = &flag::wait_till_all; waitClearFunc = &flag::wait_till_clear_all;} else {waitFunc = &flag::wait_till_any; waitClearFunc = &flag::wait_till_clear_all;} while(1) { level [[waitFunc]](a_flag); level [[waitClearFunc]](a_flag); wait .05; level reregister(str_name,n_type); } } ================================================ FILE: samples/GSC/array_override_common.gsh ================================================ #define NUM_TYPES 2 #define ARRAY_RANDOM 0 #define ARRAY_RANDOMIZE 1 #define REGISTER_OVERRIDE(str_name,n_type,func) array_override::register(str_name,n_type,func) #define UNREGISTER_OVERRIDE(str_name,n_type) array_override::unregister(str_name,n_type) #define NOTIF_EXLUDE(str_name) array_override::increment_exclude_from_notif(str_name) #define REMOVE_NOTIF_EXCLUDE(str_name) array_override::decrement_exclude_from_notif(str_name) #define REGISTER_OVERRIDE_EX_NOTIF(str_name,n_type,func) NOTIF_EXLUDE(str_name);REGISTER_OVERRIDE(str_name,n_type,func) #define UNREGISTER_OVERRIDE_EX_NOTIF(str_name,n_type) UNREGISTER_OVERRIDE(str_name,n_type);REMOVE_NOTIF_EXCLUDE(str_name) #define REGISTER_RECURSIVE(str_name,n_type,func) array_override::register_recursive(str_name,n_type,func) #define REGISTER_RECURSIVE_EX_NOTIF(str_name,n_type,func) array_override::register_recursive(str_name,n_type,func,true) #define INCREMENT_REGISTER(str_name,n_type) array_override::increment_register(str_name,n_type) #define DECREMENT_REGISTER(str_name,n_type) array_override::decrement_register(str_name,n_type) #define RESET_RECURSIVE(str_name,n_type) array_override::decrement_register(str_name,n_type,true) #define RUN_RECURSIVE(str_name,n_type,func) array_override::run_recursive_override_instance(str_name,n_type,func) #define ADD_RECURSIVE_FLAG(str_name,n_type,a_flag) array_override::add_recursive_override_flag(str_name,n_type,a_flag) #define LINK_TO_RECURSIVE_FLAG(str_name,n_type,a_flag) thread array_override::link_to_recursive_flag(str_name,n_type,a_flag) #define RECURSIVE_ENDON self endon("disconnect"); #define CALL_ONCE_FLAG(__name) if (isdefined(level.__name)) return; level.__name = 1; #define IS_FIELD_OBJECT(_val) (isdefined(_val) && (IsEntity(_val) || (!IsInt(_val) && !IsFloat(_val) && !IsString(_val) && !IsArray(_val) && !IsFunctionPtr(_val) && !IsVec(_val)))) #define IF_KVP_MATCH(__key,__val,__ent) struct_or_ent = __ent; if (!IS_FIELD_OBJECT(struct_or_ent)) return; if (struct_or_ent.__key === __val) #define IF_TARGETNAME_MATCH(__targetname,__ent) IF_KVP_MATCH(targetname,__targetname,__ent) #define IF_NOTEWORTHY_MATCH(__noteworthy,__ent) IF_KVP_MATCH(script_noteworthy,__noteworthy,__ent) #define RETURN_IF_ARRAY(__ret) if (IsArray(__ret)) return __ret; #define ARRAY_SAFE_RETURN(__listName) i = self GetEntityNumber();\ RETURN_IF_ARRAY(__listName[i])\ RETURN_IF_ARRAY(__listName[0])\ RETURN_IF_ARRAY(__listName)\ return array(); // for entries which specify which category it should be valid for (spawn requests, forced drops, dig rewards) #define BGB_CLASSIC 0 #define BGB_MEGA 1 #define BGB_ALL 2 #define MAP_ASSIGN_LIST(varname) switch(GetDvarString("mapname")){\ case "zm_zod":varname = ZOD;break;\ case "zm_factory":varname = FACTORY;break;\ case "zm_castle":varname = CASTLE;break;\ case "zm_island":varname = ISLAND;break;\ case "zm_stalingrad":varname = STALINGRAD;break;\ case "zm_genesis":varname = GENESIS;break;\ case "zm_prototype":varname = PROTOTYPE;break;\ case "zm_asylum":varname = ASYLUM;break;\ case "zm_sumpf":varname = SUMPF;break;\ case "zm_theater":varname = THEATER;break;\ case "zm_cosmodrome":varname = COSMODROME;break;\ case "zm_temple":varname = TEMPLE;break;\ case "zm_moon":varname = MOON;break;\ case "zm_tomb":varname = TOMB;break;\ default:return;} #define MAP_ASSIGN_LIST_RETURN(varname) MAP_ASSIGN_LIST(varname) if(!isdefined(varname)) return; #define MAP_ASSIGN_LIST_2(varname1,varname2) switch(GetDvarString("mapname")){\ case "zm_zod":varname1 = ZOD;varname2 = ZOD_2;break;\ case "zm_factory":varname1 = FACTORY;varname2 = FACTORY_2;break;\ case "zm_castle":varname1 = CASTLE;varname2 = CASTLE_2;break;\ case "zm_island":varname1 = ISLAND;varname2 = ISLAND_2;break;\ case "zm_stalingrad":varname1 = STALINGRAD;varname2 = STALINGRAD_2;break;\ case "zm_genesis":varname1 = GENESIS;varname2 = GENESIS_2;break;\ case "zm_prototype":varname1 = PROTOTYPE;varname2 = PROTOTYPE_2;break;\ case "zm_asylum":varname1 = ASYLUM;varname2 = ASYLUM_2;break;\ case "zm_sumpf":varname1 = SUMPF;varname2 = SUMPF_2;break;\ case "zm_theater":varname1 = THEATER;varname2 = THEATER_2;break;\ case "zm_cosmodrome":varname1 = COSMODROME;varname2 = COSMODROME_2;break;\ case "zm_temple":varname1 = TEMPLE;varname2 = TEMPLE_2;break;\ case "zm_moon":varname1 = MOON;varname2 = MOON_2;break;\ case "zm_tomb":varname1 = TOMB;varname2 = TOMB_2;break;\ default:return;} #define MAP_ASSIGN_LIST_2_RETURN(varname1,varname2) MAP_ASSIGN_LIST_2(varname1,varname2) if(!isdefined(varname1)) return; #define MAP_ASSIGN_FUNC(varname) switch(GetDvarString("mapname")){\ case "zm_zod":varname = ZOD_FUNC;break;\ case "zm_factory":varname = FACTORY_FUNC;break;\ case "zm_castle":varname = CASTLE_FUNC;break;\ case "zm_island":varname = ISLAND_FUNC;break;\ case "zm_stalingrad":varname = STALINGRAD_FUNC;break;\ case "zm_genesis":varname = GENESIS_FUNC;break;\ case "zm_prototype":varname = PROTOTYPE_FUNC;break;\ case "zm_asylum":varname = ASYLUM_FUNC;break;\ case "zm_sumpf":varname = SUMPF_FUNC;break;\ case "zm_theater":varname = THEATER_FUNC;break;\ case "zm_cosmodrome":varname = COSMODROME_FUNC;break;\ case "zm_temple":varname = TEMPLE_FUNC;break;\ case "zm_moon":varname = MOON_FUNC;break;\ case "zm_tomb":varname = TOMB_FUNC;break;\ default:return;} #define MAP_ASSIGN_FUNC_RETURN(varname) MAP_ASSIGN_FUNC(varname) if (!isdefined(varname)) return; #define MAP_ASSIGN_FUNC_2(varname1,varname2) switch(GetDvarString("mapname")){\ case "zm_zod":varname1 = ZOD_FUNC;varname2 = ZOD_FUNC_2;break;\ case "zm_factory":varname1 = FACTORY_FUNC;varname2 = FACTORY_FUNC_2;break;\ case "zm_castle":varname1 = CASTLE_FUNC;varname2 = CASTLE_FUNC_2;break;\ case "zm_island":varname1 = ISLAND_FUNC;varname2 = ISLAND_FUNC_2;break;\ case "zm_stalingrad":varname1 = STALINGRAD_FUNC;varname2 = STALINGRAD_FUNC_2;break;\ case "zm_genesis":varname1 = GENESIS_FUNC;varname2 = GENESIS_FUNC_2;break;\ case "zm_prototype":varname1 = PROTOTYPE_FUNC;varname2 = PROTOTYPE_FUNC_2;break;\ case "zm_asylum":varname1 = ASYLUM_FUNC;varname2 = ASYLUM_FUNC_2;break;\ case "zm_sumpf":varname1 = SUMPF_FUNC;varname2 = SUMPF_FUNC_2;break;\ case "zm_theater":varname1 = THEATER_FUNC;varname2 = THEATER_FUNC_2;break;\ case "zm_cosmodrome":varname1 = COSMODROME_FUNC;varname2 = COSMODROME_FUNC_2;break;\ case "zm_temple":varname1 = TEMPLE_FUNC;varname2 = TEMPLE_FUNC_2;break;\ case "zm_moon":varname1 = MOON_FUNC;varname2 = MOON_FUNC_2;break;\ case "zm_tomb":varname1 = TOMB_FUNC;varname2 = TOMB_FUNC_2;break;\ default:return;} #define MAP_ASSIGN_FUNC_2_RETURN(varname1,varname2) MAP_ASSIGN_FUNC_2(varname1,varname2) if (!isdefined(varname1)) return; ================================================ FILE: samples/GSC/math_shared.gsc ================================================ #using scripts\shared\util_shared; #insert scripts\shared\shared.gsh; #namespace math; function cointoss() { return RandomInt( 100 ) >= 50; } /@ "Name: clamp(val, val_min, val_max)" "Summary: Clamps a value between a min and max value." "Module: Math" "MandatoryArg: val: the value to clamp." "MandatoryArg: val_min: the min value to clamp to." "MandatoryArg: val_max: the mac value to clamp to." "Example: clamped_val = clamp(8, 0, 5); // returns 5 * clamped_val = clamp(-1, 0, 5); // returns 0" "SPMP: both" @/ function clamp( val, val_min, val_max ) { DEFAULT( val_max, val ); if (val < val_min) { val = val_min; } else if (val > val_max) { val = val_max; } return val; } /@ "Name: linear_map(val, min_a, max_a, min_b, max_b)" "Summary: Maps a value within one range to a value in another range." "Module: Math" "MandatoryArg: val: the value to map." "MandatoryArg: min_a: the min value of the range in which exists." "MandatoryArg: max_a: the max value of the range in which exists." "MandatoryArg: min_b: the min value of the range in which the return value should exist." "MandatoryArg: max_b: the max value of the range in which the return value should exist." "Example: fov = linear_map(speed, min_speed, max_speed, min_fov, max_fov);" "SPMP: both" @/ function linear_map(num, min_a, max_a, min_b, max_b) { return clamp(( (num - min_a) / (max_a - min_a) * (max_b - min_b) + min_b ), min_b, max_b); } /@ "Name: lag(desired, curr, k, dt)" "Summary: Changes a value from current to desired using 1st order differential lag." "Module: Math" "MandatoryArg: desired: desired value." "MandatoryArg: curr: the current value." "MandatoryArg: k: the strength of the lag ( lower = slower, higher = faster)." "MandatoryArg: dt: time step to lag over ( usually 1 server frame )." "Example: speed = lag(max_speed, speed, 1, 0.05);" "SPMP: both" @/ function lag(desired, curr, k, dt) { r = 0.0; if (((k * dt) >= 1.0) || (k <= 0.0)) { r = desired; } else { err = desired - curr; r = curr + k * err * dt; } return r; } function find_box_center( mins, maxs ) { center = ( 0, 0, 0 ); center = maxs - mins; center = ( center[0]/2, center[1]/2, center[2]/2 ) + mins; return center; } function expand_mins( mins, point ) { if ( mins[0] > point[0] ) { mins = ( point[0], mins[1], mins[2] ); } if ( mins[1] > point[1] ) { mins = ( mins[0], point[1], mins[2] ); } if ( mins[2] > point[2] ) { mins = ( mins[0], mins[1], point[2] ); } return mins; } function expand_maxs( maxs, point ) { if ( maxs[0] < point[0] ) { maxs = ( point[0], maxs[1], maxs[2] ); } if ( maxs[1] < point[1] ) { maxs = ( maxs[0], point[1], maxs[2] ); } if ( maxs[2] < point[2] ) { maxs = ( maxs[0], maxs[1], point[2] ); } return maxs; } // ---------------------------------------------------------------------------------------------------- // -- Vectors ----------------------------------------------------------------------------------------- // ---------------------------------------------------------------------------------------------------- /@ "Name: vector_compare( , )" "Summary: For 3D vectors. Returns true if the vectors are the same" "MandatoryArg: : A 3D vector (origin)" "MandatoryArg: : A 3D vector (origin)" "Example: if (vector_compare(self.origin, node.origin){print(\"yay, i'm on the node!\");}" "SPMP: both" @/ function vector_compare(vec1, vec2) { return (abs(vec1[0] - vec2[0]) < .001) && (abs(vec1[1] - vec2[1]) < .001) && (abs(vec1[2] - vec2[2]) < .001); } function random_vector(max_length) { return (RandomFloatRange(-1 * max_length, max_length), RandomFloatRange(-1 * max_length, max_length), RandomFloatRange(-1 * max_length, max_length)); } function angle_dif(oldangle, newangle) { outvalue = ( oldangle - newangle ) % 360; if ( outvalue < 0 ) { outvalue+=360; } if ( outvalue > 180 ) { outvalue=(outvalue-360)*-1; } return outvalue; } function sign( x ) { return ( x >= 0 ? 1 : -1 ); } function randomSign() { return ( RandomIntRange( -1, 1 ) >= 0 ? 1 : -1 ); } /@ "Name: get_dot_direction( , [b_ignore_z], [b_normalize], [str_direction], [ b_use_eye] )" "Summary: Calculates and returns dot between an entity's directional vector and a point." "Module: Math" "CallOn: Entity. Must have origin and angles parameters." "MandatoryArg: vector position to check against entity origin and angles" "OptionalArg: specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot." "OptionalArg: specify which vector type to use on angles. Valid options are "forward", "backward", "right", "left", "up" and "down". Defaults to "forward"." "OptionalArg: specify if the function should normalize the vector to target point. Defaults to true." "OptionalArg: if self a player or AI, use tag_eye rather than .angles. Defaults to true on players, defaults to false on everything else. "Example: n_dot = player get_dot_direction( woods.origin );" "SPMP: singleplayer" @/ function get_dot_direction( v_point, b_ignore_z, b_normalize, str_direction, b_use_eye ) { assert( isdefined( v_point ), "v_point is a required parameter for get_dot" ); if ( !isdefined( b_ignore_z ) ) { b_ignore_z = false; } if ( !isdefined( b_normalize ) ) { b_normalize = true; } if ( !isdefined( str_direction ) ) { str_direction = "forward"; } if ( !isdefined( b_use_eye ) ) { b_use_eye = false; if ( IsPlayer( self ) ) { b_use_eye = true; } } v_angles = self.angles; v_origin = self.origin; if ( b_use_eye ) { v_origin = self util::get_eye(); } if ( IsPlayer( self ) ) { v_angles = self GetPlayerAngles(); if ( level.wiiu ) { v_angles = self GetGunAngles(); } } if ( b_ignore_z ) { v_angles = ( v_angles[ 0 ], v_angles[ 1 ], 0 ); v_point = ( v_point[ 0 ], v_point[ 1 ], 0 ); v_origin = ( v_origin[ 0 ], v_origin[ 1 ], 0 ); } switch ( str_direction ) { case "forward": v_direction = AnglesToForward( v_angles ); break; case "backward": v_direction = AnglesToForward( v_angles ) * ( -1 ); break; case "right": v_direction = AnglesToRight( v_angles ); break; case "left": v_direction = AnglesToRight( v_angles ) * ( -1 ); break; case "up": v_direction = AnglesToUp( v_angles ); break; case "down": v_direction = AnglesToUp( v_angles ) * ( -1 ); break; default: AssertMsg( str_direction + " is not a valid str_direction for get_dot!" ); v_direction = AnglesToForward( v_angles ); // have to initialize variable for default case break; } v_to_point = v_point - v_origin; if ( b_normalize ) { v_to_point = VectorNormalize( v_to_point ); } n_dot = VectorDot( v_direction, v_to_point ); return n_dot; } /@ "Name: get_dot_right( , [b_ignore_z], [b_normalize] )" "Summary: Calculates and returns dot between an entity's right vector and a point." "Module: Math" "CallOn: Entity. Must have origin and angles parameters." "MandatoryArg: vector position to check against entity origin and angles" "OptionalArg: specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot." "OptionalArg: specify if the function should normalize the vector to target point. Defaults to true." "Example: n_dot = player get_dot_direction( woods.origin );" "SPMP: singleplayer" @/ function get_dot_right( v_point, b_ignore_z, b_normalize ) { // get_dot will assert if missing, but scripter should know it's coming from get_dot_right assert( isdefined( v_point ), "v_point is a required parameter for get_dot_right" ); n_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, "right" ); return n_dot; } /@ "Name: get_dot_up( , [b_ignore_z], [b_normalize] )" "Summary: Calculates and returns dot between an entity's up vector and a point." "Module: Math" "CallOn: Entity. Must have origin and angles parameters." "MandatoryArg: vector position to check against entity origin and angles" "OptionalArg: specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot." "OptionalArg: specify if the function should normalize the vector to target point. Defaults to true." "Example: n_dot = player get_dot_direction( woods.origin );" "SPMP: singleplayer" @/ function get_dot_up( v_point, b_ignore_z, b_normalize ) { // get_dot will assert if missing, but scripter should know it's coming from get_dot_up assert( isdefined( v_point ), "v_point is a required parameter for get_dot_up" ); n_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, "up" ); return n_dot; } /@ "Name: get_dot_forward( , [b_ignore_z], [b_normalize] )" "Summary: Calculates and returns dot between an entity's forward vector and a point." "Module: Math" "CallOn: Entity. Must have origin and angles parameters." "MandatoryArg: vector position to check against entity origin and angles" "OptionalArg: specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot." "OptionalArg: specify if the function should normalize the vector to target point. Defaults to true." "Example: n_dot = player get_dot_direction( woods.origin );" "SPMP: singleplayer" @/ function get_dot_forward( v_point, b_ignore_z, b_normalize ) { // get_dot will assert if missing, but scripter should know it's coming from get_dot_forward assert( isdefined( v_point ), "v_point is a required parameter for get_dot_forward" ); n_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, "forward" ); return n_dot; } /@ "Name: get_dot_from_eye( , [b_ignore_z], [b_normalize], [str_direction] )" "Summary: Calculates and returns dot between an entity's forward vector and a point based on tag_eye. Only use on players or AI" "Module: Math" "CallOn: Entity. Must have origin and angles parameters." "MandatoryArg: vector position to check against entity origin and angles" "OptionalArg: [b_ignore_z] specify if get_dot should consider 2d or 3d dot. Defaults to false for 3d dot." "OptionalArg: [b_normalize] specify if the function should normalize the vector to target point. Defaults to true." "OptionalArg: [str_direction] specify which vector type to use on angles. Valid options are "forward", "backward", "right", "left", "up" and "down". Defaults to "forward"." "Example: n_dot = player get_dot_from_eye( woods.origin );" "SPMP: singleplayer" @/ function get_dot_from_eye( v_point, b_ignore_z, b_normalize, str_direction ) { assert( isdefined( v_point ), "v_point is a required parameter for get_dot_forward" ); Assert( ( IsPlayer( self ) || IsAI( self ) ), "get_dot_from_eye was used on a " + self.classname + ". Valid ents are players and AI, since they have tag_eye." ); n_dot = get_dot_direction( v_point, b_ignore_z, b_normalize, str_direction, true ); return n_dot; } // ---------------------------------------------------------------------------------------------------- // -- Arrays ------------------------------------------------------------------------------------------ // ---------------------------------------------------------------------------------------------------- /@ "Name: array_average( )" "Summary: Given an array of numbers, returns the average (mean) value of the array" "Module: Utility" "MandatoryArg: : the array of numbers which will be averaged" "Example: array_average( numbers );" "SPMP: both" @/ function array_average( array ) { assert( IsArray( array ) ); assert( array.size > 0 ); total = 0; for ( i = 0; i < array.size; i++ ) { total += array[i]; } return ( total / array.size ); } /@ "Name: array_std_deviation( , )" "Summary: Given an array of numbers and the average of the array, returns the standard deviation value of the array" "Module: Utility" "MandatoryArg: : the array of numbers" "MandatoryArg: : the average (mean) value of the array" "Example: array_std_deviation( numbers, avg );" "SPMP: both" @/ function array_std_deviation( array, mean ) { assert( IsArray( array ) ); assert( array.size > 0 ); tmp = []; for ( i = 0; i < array.size; i++ ) { tmp[i] = ( array[i] - mean ) * ( array[i] - mean ); } total = 0; for ( i = 0; i < tmp.size; i++ ) { total = total + tmp[i]; } return Sqrt( total / array.size ); } /@ "Name: random_normal_distribution( , , , )" "Summary: Given the mean and std deviation of a set of numbers, returns a random number from the normal distribution" "Module: Utility" "MandatoryArg: : the average (mean) value of the array" "MandatoryArg: : the standard deviation value of the array" "OptionalArg: the minimum value that will be returned" "OptionalArg: the maximum value that will be returned" "Example: random_normal_distribution( avg, std_deviation );" "SPMP: both" @/ function random_normal_distribution( mean, std_deviation, lower_bound, upper_bound ) { //pixbeginevent( "random_normal_distribution" ); // implements the Box-Muller transform for Gaussian random numbers (http://en.wikipedia.org/wiki/Box-Muller_transform) x1 = 0; x2 = 0; w = 1; y1 = 0; while ( w >= 1 ) { x1 = 2 * RandomFloatRange( 0, 1 ) - 1; x2 = 2 * RandomFloatRange( 0, 1 ) - 1; w = x1 * x1 + x2 * x2; } w = Sqrt( ( -2.0 * Log( w ) ) / w ); y1 = x1 * w; number = mean + y1 * std_deviation; if ( isdefined( lower_bound ) && number < lower_bound ) { number = lower_bound; } if ( isdefined( upper_bound ) && number > upper_bound ) { number = upper_bound; } //pixendevent(); return( number ); } function closest_point_on_line( point, lineStart, lineEnd ) { lineMagSqrd = lengthsquared(lineEnd - lineStart); t = ( ( ( point[0] - lineStart[0] ) * ( lineEnd[0] - lineStart[0] ) ) + ( ( point[1] - lineStart[1] ) * ( lineEnd[1] - lineStart[1] ) ) + ( ( point[2] - lineStart[2] ) * ( lineEnd[2] - lineStart[2] ) ) ) / ( lineMagSqrd ); if( t < 0.0 ) { return lineStart; } else if( t > 1.0 ) { return lineEnd; } start_x = lineStart[0] + t * ( lineEnd[0] - lineStart[0] ); start_y = lineStart[1] + t * ( lineEnd[1] - lineStart[1] ); start_z = lineStart[2] + t * ( lineEnd[2] - lineStart[2] ); return (start_x,start_y,start_z); } function get_2d_yaw( start, end ) { vector = (end[0] - start[0], end[1] - start[1], 0); return vec_to_angles( vector ); } function vec_to_angles( vector ) { yaw = 0; vecX = vector[0]; vecY = vector[1]; if ( vecX == 0 && vecY == 0 ) return 0; if ( vecY < 0.001 && vecY > -0.001 ) vecY = 0.001; yaw = atan( vecX / vecY ); if ( vecY < 0 ) yaw += 180; return ( 90 - yaw ); } function pow( base, exp ) { if( exp == 0 ) { return 1; } result = base; for( i = 0; i < ( exp - 1 ); i++ ) { result *= base; } return result; } ================================================ FILE: samples/GSC/struct.gsc ================================================ function init() {} function delete() {} /@ "Name: get( , [kvp_key] )" "Summary: Returns a struct with the specified kvp." "MandatoryArg: : kvp value" "OptionalArg: [kvp_key] : defaults to targetname" "Example: struct::get( "some_value", "targetname" );" "SPMP: both" @/ function get( kvp_value, kvp_key = "targetname" ){} /@ "Name: spawn( [v_origin], [v_angles] )" "Summary: Returns a new struct." "OptionalArg: [v_origin] : optional origin" "OptionalArg: [v_angles] : optional angles" "Example: s = struct::spawn( self GetTagOrigin( "tag_origin" ) );" @/ function spawn( v_origin = (0, 0, 0), v_angles = (0, 0, 0) ){} /@ "Name: get_array( , [kvp_key] )" "Summary: Returns an array of structs with the specified kvp." "MandatoryArg: : kvp value" "OptionalArg: [kvp_key] : defaults to targetname" "Example: fxemitters = struct::get_array( "streetlights", "targetname" )" "SPMP: both" @/ function get_array( kvp_value, kvp_key = "targetname" ){} /@ "Name: get_script_bundle( , )" "Summary: Returns a struct with the specified script bundle definition. This is the GDT data for the bundle." "MandatoryArg: : The type of the script bundle" "MandatoryArg: : The name of the script bundle" "Example: struct::get_script_bundle( "scene", "my_scene" );" "SPMP: both" @/ function get_script_bundle( str_type, str_name ){} /@ "Name: delete_script_bundle( , )" "Summary: Deletes the specified script bundle definition. This is the GDT data for the bundle." "MandatoryArg: : The type of the script bundle" "MandatoryArg: : The name of the script bundle" "Example: struct::delete_script_bundle( "scene", "my_scene" );" "SPMP: both" @/ function delete_script_bundle( str_type, str_name ){} /@ "Name: get_script_bundles( )" "Summary: Returns all of the script bundle definition structs for the specified type." "MandatoryArg: : The type of the script bundle" "Example: struct::get_script_bundles( "scene" );" "SPMP: both" @/ function get_script_bundles( str_type ){} /@ "Name: get_script_bundle_list( , )" "Summary: Returns a string array with the items specified by the script bundle list." "MandatoryArg: : The type of the script bundle in the list" "MandatoryArg: : The name of the script bundle list" "Example: struct::get_script_bundle_list( "collectible", "completecollectibleslist" );" "SPMP: both" @/ function get_script_bundle_list( str_type, str_name ){} /@ "Name: get_script_bundle_instances( , [str_name] )" "Summary: Returns an array of all the script bundle instances with the specified script bundle definition and name." "MandatoryArg: : The type of the script bundle" "MandatoryArg: [str_name] : The name of the script bundle" "Example: struct::get_script_bundle_instances( "scene", "my_scene" );" "SPMP: both" @/ function get_script_bundle_instances( str_type, str_name = "" ){} ================================================ FILE: samples/GSC/zm_init.gsc ================================================ // Notes about scripts //===================== // // Anim variables // -------------- // Anim variables keep track of what the character is doing with respect to his // animations. They know if he's standing, crouching, kneeling, walking, running, etc, // so that he can play appropriate transitions to get to the animation he wants. // anim_movement - "stop", "walk", "run" // anim_pose - "stand", "crouch", some others for pain poses. // I'm putting functions to do the basic animations to change these variables in // zombie_SetPoseMovement.gsc, // // Error Reporting // --------------- // To report a script error condition (similar to assert(0)), I assign a non-existent variable to // the variable homemade_error I use the name of the non-existent variable to try to explain the // error. For example: // homemade_error = Unexpected_anim_pose_value + self.a.pose; // I also have a kind of assert, called as follows: // [[anim.assert(condition, message_string); // If condition evaluates to 0, the assert fires, prints message_string and stops the server. Since // I don't have stack traces of any kind, the message string needs to say from where the assert was // called. // #include maps\mp\animscripts\zm_utility; // #include maps\_utility; // #include animscripts\Combat_utility; // #include common_scripts\Utility; // #include common_scripts\utility; #include maps\mp\animscripts\shared; #include maps\mp\animscripts\utility; #include maps\mp\animscripts\zm_utility; main() { self.a = SpawnStruct(); self.team = level.zombie_team; firstInit(); // Set initial states for poses self.a.pose = "stand"; self.a.movement = "stop"; self.a.state = "stop"; self.a.special = "none"; self.a.combatEndTime = GetTime(); self.a.script = "init"; self.a.alertness = "casual"; // casual, alert, aiming self.a.lastEnemyTime = GetTime(); self.a.forced_cover = "none"; self.a.desired_script = "none"; self.a.current_script = "none"; self.a.lookangle = 0; self.a.painTime = 0; self.a.nextGrenadeTryTime = 0; // setup the speed variables self.walk = false; self.sprint = false; // WW (11/16/2010): Setting variable for run blend speed. This allows the black hole bomb to snap guys 180 with less pop. self.a.runBlendTime = 0.2; // MikeD (9/28/2007): Flame pain time... Tracks when the AI gets hit with flame. self.a.flamepainTime = 0; self.a.postScriptFunc = undefined; self.a.stance = "stand"; self._animActive = 0; self thread deathNotify(); // use the GDT settings to start with self.baseAccuracy = self.accuracy; // set default accuracy mod if( !IsDefined(self.script_accuracy) ) { self.script_accuracy = 1; } self.a.missTime = 0; self.a.yawTransition = "none"; self.a.nodeath = false; self.a.missTime = 0; self.a.missTimeDebounce = 0; self.a.disablePain = false; self.accuracyStationaryMod = 1; self.chatInitialized = false; self.sightPosTime = 0; self.sightPosLeft = true; self.preCombatRunEnabled = true; self.is_zombie = true; self.a.crouchpain = false; // for dying pain guys self.a.nextStandingHitDying = false; // Makes AI able to throw grenades at other AI. if (!IsDefined (self.script_forcegrenade)) { self.script_forcegrenade = 0; } /# self.a.lastDebugPrint = ""; #/ // state tracking self.lastEnemySightTime = 0; // last time we saw our current enemy self.combatTime = 0; // how long we've been in/out of combat // Random range makes the grenades less accurate and do less damage, but also makes it difficult to throw back. // if ( self.team == "allies" ) // { // self.randomGrenadeRange = 0; // } // else // { // self.randomGrenadeRange = 128; // } self.coverIdleSelectTime = -696969; self.old = SpawnStruct(); self.reacquire_state = 0; self.a.allow_shooting = false; } DoNothing() { } empty(one, two, three, whatever) { } clearEnemy() { self notify ("stop waiting for enemy to die"); self endon ("stop waiting for enemy to die"); self.sightEnemy waittill ("death"); self.sightpos = undefined; self.sightTime = 0; self.sightEnemy = undefined; } // Cleans up scripts on death deathNotify() { self waittill( "death", other ); self notify( anim.scriptChange ); } firstInit() { // Initialization that should happen once per level if ( IsDefined (anim.NotFirstTime) ) // Use this to trigger the first init { return; } anim.NotFirstTime = true; anim.useFacialAnims = false; // remove me when facial anims are fixed if ( !IsDefined( anim.dog_health ) ) { anim.dog_health = 1; } if ( !IsDefined( anim.dog_presstime ) ) { anim.dog_presstime = 350; } if ( !IsDefined( anim.dog_hits_before_kill ) ) { anim.dog_hits_before_kill = 1; } level.nextGrenadeDrop = RandomInt(3); level.lastPlayerSighted = 100; anim.defaultException = maps\mp\animscripts\zm_init::empty; SetDvar( "scr_expDeathMayMoveCheck", "on" ); // Global constants anim.lastSideStepAnim = 0; anim.meleeRange = 64; anim.meleeRangeSq = anim.meleeRange * anim.meleeRange; anim.standRangeSq = 512*512; anim.chargeRangeSq = 200*200; anim.chargeLongRangeSq = 512*512; anim.aiVsAiMeleeRangeSq = 400*400; anim.combatMemoryTimeConst = 10000; anim.combatMemoryTimeRand = 6000; anim.scriptChange = "script_change"; // MikeD (10/23/2007 10:38:58): Gib Support anim.lastGibTime = 0; anim.gibDelay = 3 * 1000; // 3 seconds anim.minGibs = 2; anim.maxGibs = 4; anim.totalGibs = RandomIntRange( anim.minGibs, anim.maxGibs ); anim.corner_straight_yaw_limit = 36; if (!IsDefined(anim.optionalStepEffectFunction)) { anim.optionalStepEffects = []; anim.optionalStepEffectFunction = ::empty; } // string based array for notetracks anim.notetracks = []; maps\mp\animscripts\zm_shared::registerNoteTracks(); if ( !IsDefined( level.flag ) ) { level.flag = []; level.flags_lock = []; } level.painAI = undefined; anim.maymoveCheckEnabled = true; // corner_axis doesnt do the check if this is false, for credits anim.badPlaces = []; // queue for animscript badplaces anim.badPlaceInt = 0; // assigns unique names to animscript badplaces since we cant save a badplace as an entity anim.coverCrouchLeanPitch = -55; anim.lastCarExplosionTime = -100000; } onPlayerConnect() { player = self; // make sure the init has been called firstInit(); player.invul = false; } ================================================ FILE: samples/Game Maker Language/GMLmenus.gml ================================================ // Source - https://github.com/faissaloo/GMLmenus/blob/master/GMLmenus.gml #define draw_menu ///draw_menu(str,background,foreground,x,y,hpadding,vpadding,height,mouse_button) //Distributed under the MIT licence: ///////////////////////////////////////// /*Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ ///////////////////////////////////////// //Height is the height of 1 box //Menu syntax: // |s = seperator (Bug: if |s is placed next to a |n an extra menu item would be added) // |n = new item var str, background, foreground,xx,yy, width, height; str = " "+argument0 //A hacky thing so that it draws the first item properly, I should probably properly fix this later background = argument1 foreground = argument2 xx = argument3 yy = argument4 width = 0//argument5 hpadding = argument5 vpadding = argument6 height = argument7 mb=argument8 //This is the main mouse button, I added this to give more choice to the dev //xx and yy should be corrected if they are placed outside of the room or if they will lead to the menu being cut off by the edge of the room item_list = ds_list_create() item_string = "" /////////////////////////////////// for (i=0;iwidth { width=string_width(item_string) } ds_list_add(item_list,item_string) //Add a new item to the list item_string="" //Reset the item_string } } } draw_set_color(background) //draw_rectangle(xx,yy,xx+width,yy+(height*ds_list_size(item_list)),false) //Background, temporary? draw_button(xx,yy,xx+width+(hpadding*2),yy+(height*(ds_list_size(item_list)-1))+vpadding,true) //Background, temporary? for (i=0;ixx) and (mouse_xyy) and mouse_check_button_released(mb) { //show_message(i+1) //Debugging return i+1; //Returns the number of the item in the list, we're adding 1 because 0 is reserved for if nothing is clicked } } if mouse_check_button_released(mb) and !(mouse_x>xx and mouse_y>yy and mouse_x ***********************************************************************************/ /* This event should be placed in the draw event of the platform character. */ //draws the sprite draw = true; if (facing == RIGHT) image_xscale = -1; else image_xscale = 1; if (blinkToggle != 1) { if ((state == CLIMBING or (sprite_index == sPExit or sprite_index == sDamselExit or sprite_index == sTunnelExit)) and global.hasJetpack and not whipping) { draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha); //draw_sprite(sprite_index,-1,x,y); draw_sprite(sJetpackBack,-1,x,y); draw = false; } else if (global.hasJetpack and facing == RIGHT) draw_sprite(sJetpackRight,-1,x-4,y-1); else if (global.hasJetpack) draw_sprite(sJetpackLeft,-1,x+4,y-1); if (draw) { if (redColor > 0) draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, make_color_rgb(200 + redColor,0,0), image_alpha); else draw_sprite_ext(sprite_index, -1, x, y, image_xscale, image_yscale, image_angle, image_blend, image_alpha); } if (facing == RIGHT) { if (holdArrow == ARROW_NORM) { draw_sprite(sArrowRight, -1, x+4, y+1); } else if (holdArrow == ARROW_BOMB) { if (holdArrowToggle) draw_sprite(sBombArrowRight, 0, x+4, y+2); else draw_sprite(sBombArrowRight, 1, x+4, y+2); } } else if (facing == LEFT) { if (holdArrow == ARROW_NORM) { draw_sprite(sArrowLeft, -1, x-4, y+1); } else if (holdArrow == ARROW_BOMB) { if (holdArrowToggle) draw_sprite(sBombArrowLeft, 0, x-4, y+2); else draw_sprite(sBombArrowLeft, 1, x-4, y+2); } } } /* if canRun { xOffset=80 if player=1 yOffset=120 else yOffset=143 //draw the "flySpeed" bar, which shows how much speed the character has acquired while holding the "run" button //draw_healthbar(view_xview[0]+224+xOffset,view_yview[0]+432+yOffset,view_xview[0]+400+xOffset,view_yview[0]+450+yOffset,flySpeed,make_color_rgb(0,64,128),c_blue,c_aqua,0,1,1) } */ ================================================ FILE: samples/Game Maker Language/characterStepEvent.gml ================================================ // Originally from /spelunky/Scripts/Platform Engine/characterStepEvent.gml in the Spelunky Community Update Project /********************************************************************************** Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC This file is part of Spelunky. You can redistribute and/or modify Spelunky, including its source code, under the terms of the Spelunky User License. Spelunky is distributed in the hope that it will be entertaining and useful, but WITHOUT WARRANTY. Please see the Spelunky User License for more details. The Spelunky User License should be available in "Game Information", which can be found in the Resource Explorer, or as an external file called COPYING. If not, please obtain a new copy of Spelunky from ***********************************************************************************/ /* This script should be placed in the step event for the platform character. It updates the keys used by the character, moves all of the solids, moves the character, sets the sprite index, and sets the animation speed for the sprite. */ hangCountMax = 3; ////////////////////////////////////// // KEYS ////////////////////////////////////// kLeft = checkLeft(); if (kLeft) kLeftPushedSteps += 1; else kLeftPushedSteps = 0; kLeftPressed = checkLeftPressed(); kLeftReleased = checkLeftReleased(); kRight = checkRight(); if (kRight) kRightPushedSteps += 1; else kRightPushedSteps = 0; kRightPressed = checkRightPressed(); kRightReleased = checkRightReleased(); kUp = checkUp(); kDown = checkDown(); //key "run" if canRun kRun = 0; // kRun=runKey else kRun=0 kJump = checkJump(); kJumpPressed = checkJumpPressed(); kJumpReleased = checkJumpReleased(); if (cantJump > 0) { kJump = 0; kJumpPressed = 0; kJumpReleased = 0; cantJump -= 1; } else { if (global.isTunnelMan and sprite_index == sTunnelAttackL and !holdItem) { kJump = 0; kJumpPressed = 0; kJumpReleased = 0; cantJump -= 1; } } kAttack = checkAttack(); kAttackPressed = checkAttackPressed(); kAttackReleased = checkAttackReleased(); kItemPressed = checkItemPressed(); xPrev = x; yPrev = y; if (stunned or dead) { kLeft = false; kLeftPressed = false; kLeftReleased = false; kRight = false; kRightPressed = false; kRightReleased = false; kUp = false; kDown = false; kJump = false; kJumpPressed = false; kJumpReleased = false; kAttack = false; kAttackPressed = false; kAttackReleased = false; kItemPressed = false; } ////////////////////////////////////////// // Collisions ////////////////////////////////////////// colSolidLeft = false; colSolidRight = false; colLeft = false; colRight = false; colTop = false; colBot = false; colLadder = false; colPlatBot = false; colPlat = false; colWaterTop = false; colIceBot = false; runKey = false; if (isCollisionMoveableSolidLeft(1)) colSolidLeft = true; if (isCollisionMoveableSolidRight(1)) colSolidRight = true; if (isCollisionLeft(1)) colLeft = true; if (isCollisionRight(1)) colRight = true; if (isCollisionTop(1)) colTop = true; if (isCollisionBottom(1)) colBot = true; if (isCollisionLadder()) colLadder = true; if (isCollisionPlatformBottom(1)) colPlatBot = true; if (isCollisionPlatform()) colPlat = true; if (isCollisionWaterTop(1)) colWaterTop = true; if (collision_point(x, y+8, oIce, 0, 0)) colIceBot = true; if (checkRun()) { runHeld = 100; runKey = true; } if (checkAttack() and not whipping) { runHeld += 1; runKey = true; } if (not runKey or (not kLeft and not kRight)) runHeld = 0; // allows the character to run left and right // if state!=DUCKING and state!=LOOKING_UP and state!=CLIMBING if (state != CLIMBING and state != HANGING) { if (kLeftReleased and approximatelyZero(xVel)) xAcc -= 0.5 if (kRightReleased and approximatelyZero(xVel)) xAcc += 0.5 if (kLeft and not kRight) { if (colSolidLeft) { // xVel = 3; if (platformCharacterIs(ON_GROUND) and state != DUCKING) { xAcc -= 1; pushTimer += 10; //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush); } } else if (kLeftPushedSteps > 2) and (facing=LEFT or approximatelyZero(xVel)) { xAcc -= runAcc; } facing = LEFT; //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/-xVel); } if (kRight and not kLeft) { if (colSolidRight) { // xVel = 3; if (platformCharacterIs(ON_GROUND) and state != DUCKING) { xAcc += 1; pushTimer += 10; //if (not SS_IsSoundPlaying(global.sndPush)) playSound(global.sndPush); } } else if (kRightPushedSteps > 2 or colSolidLeft) and (facing=RIGHT or approximatelyZero(xVel)) { xAcc += runAcc; } facing = RIGHT; //if (platformCharacterIs(ON_GROUND) and abs(xVel) > 0 and alarm[3] < 1) alarm[3] = floor(16/xVel); } } /****************************************** LADDERS *******************************************/ if (state == CLIMBING) { if (instance_exists(oCape)) { oCape.open = false; } kJumped = false; ladderTimer = 10; ladder = collision_point(x, y, oLadder, 0, 0); if (ladder) x = ladder.x + 8; if (kLeft) facing = LEFT; else if (kRight) facing = RIGHT; if (kUp) { if (collision_point(x, y-8, oLadder, 0, 0) or collision_point(x, y-8, oLadderTop, 0, 0)) { yAcc -= climbAcc; if (alarm[2] < 1) alarm[2] = 8; } } else if (kDown) { if (collision_point(x, y+8, oLadder, 0, 0) or collision_point(x, y+8, oLadderTop, 0, 0)) { yAcc += climbAcc; if (alarm[2] < 1) alarm[2] = 8; } else state = FALLING; if (colBot) state = STANDING; } if (kJumpPressed and not whipping) { if (kLeft) xVel = -departLadderXVel; else if (kRight) xVel = departLadderXVel; else xVel = 0; yAcc += departLadderYVel; state = JUMPING; jumpButtonReleased = 0; jumpTime = 0; ladderTimer = 5; } } else { if (ladderTimer > 0) ladderTimer -= 1; } if (platformCharacterIs(IN_AIR) and state != HANGING) { yAcc += gravityIntensity; } // Player has landed if ((colBot or colPlatBot) and platformCharacterIs(IN_AIR) and yVel >= 0) { if (not colPlat or colBot) { yVel = 0; yAcc = 0; state = RUNNING; jumps = 0; } //playSound(global.sndLand); } if ((colBot or colPlatBot) and not colPlat) yVel = 0; // Player has just walked off of the edge of a solid if (colBot == 0 and (not colPlatBot or colPlat) and platformCharacterIs(ON_GROUND)) { state = FALLING; yAcc += grav; kJumped = true; if (global.hasGloves) hangCount = 5; } if (colTop) { if (dead or stunned) yVel = -yVel * 0.8; else if (state == JUMPING) yVel = abs(yVel*0.3) } if (colLeft and facing == LEFT) or (colRight and facing == RIGHT) { if (dead or stunned) xVel = -xVel * 0.5; else xVel = 0; } /****************************************** JUMPING *******************************************/ if (kJumpReleased and platformCharacterIs(IN_AIR)) { kJumped = true; } else if (platformCharacterIs(ON_GROUND)) { oCape.open = false; kJumped = false; } if (kJumpPressed and collision_point(x, y, oWeb, 0, 0)) { obj = instance_place(x, y, oWeb); obj.life -= 1; yAcc += initialJumpAcc * 2; yVel -= 3; xAcc += xVel/2; state = JUMPING; jumpButtonReleased = 0; jumpTime = 0; grav = gravNorm; } else if (kJumpPressed and colWaterTop) { yAcc += initialJumpAcc * 2; yVel -= 3; xAcc += xVel/2; state = JUMPING; jumpButtonReleased = 0; jumpTime = 0; grav = gravNorm; } else if (global.hasCape and kJumpPressed and kJumped and platformCharacterIs(IN_AIR)) { if (not oCape.open) oCape.open = true; else oCape.open = false; } else if (global.hasJetpack and kJump and kJumped and platformCharacterIs(IN_AIR) and jetpackFuel > 0) { yAcc += initialJumpAcc; yVel = -1; jetpackFuel -= 1; if (alarm[10] < 1) alarm[10] = 3; state = JUMPING; jumpButtonReleased = 0; jumpTime = 0; grav = 0; } else if (platformCharacterIs(ON_GROUND) and kJumpPressed and fallTimer == 0) { if (xVel > 3 or xVel < -3) { yAcc += initialJumpAcc * 2; xAcc += xVel * 2; } else { yAcc += initialJumpAcc * 2; xAcc += xVel/2; } if (global.hasJordans) { yAcc *= 3; yAccLimit = 12; grav = 0.5; } else if (global.hasSpringShoes) yAcc *= 1.5; else { yAccLimit = 6; grav = gravNorm; } playSound(global.sndJump); pushTimer = 0; // the "state" gets changed to JUMPING later on in the code state = FALLING; // "variable jumping" states jumpButtonReleased = 0; jumpTime = 0; } if (jumpTime < jumpTimeTotal) jumpTime += 1; //let the character continue to jump if (kJump == 0) jumpButtonReleased = 1; if (jumpButtonReleased) jumpTime = jumpTimeTotal; gravityIntensity = (jumpTime/jumpTimeTotal) * grav; if (kUp and platformCharacterIs(ON_GROUND) and not colLadder) { looking = UP; if (xVel == 0 and xAcc == 0) state = LOOKING_UP; } else looking = 0; if (not kUp and state == LOOKING_UP) { state=STANDING } /****************************************** HANGING *******************************************/ if (not colTop) { if (global.hasGloves and yVel > 0) { if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0))) { state = HANGING; move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0))) { state = HANGING; move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } } else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and (collision_point(x+9, y-5, oTree, 0, 0) or collision_point(x+9, y-6, oTree, 0, 0))) { state = HANGING; move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and (collision_point(x-9, y-5, oTree, 0, 0) or collision_point(x-9, y-6, oTree, 0, 0))) { state = HANGING; move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kRight and colRight and (collision_point(x+9, y-5, oSolid, 0, 0) or collision_point(x+9, y-6, oSolid, 0, 0)) and not collision_point(x+9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0)) { state = HANGING; move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } else if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and kLeft and colLeft and (collision_point(x-9, y-5, oSolid, 0, 0) or collision_point(x-9, y-6, oSolid, 0, 0)) and not collision_point(x-9, y-9, oSolid, 0, 0) and not collision_point(x, y+9, oSolid, 0, 0)) { state = HANGING; move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and (collision_point(x, y-5, oArrow, 0, 0) or collision_point(x, y-6, oArrow, 0, 0)) and not collision_point(x, y-9, oArrow, 0, 0) and not collision_point(x, y+9, oArrow, 0, 0)) { obj = instance_nearest(x, y-5, oArrow); if (obj.stuck) { state = HANGING; // move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } } /* if (hangCount == 0 and y > 16 and !platformCharacterIs(ON_GROUND) and state == FALLING and (collision_point(x, y-5, oTreeBranch, 0, 0) or collision_point(x, y-6, oTreeBranch, 0, 0)) and not collision_point(x, y-9, oTreeBranch, 0, 0) and not collision_point(x, y+9, oTreeBranch, 0, 0)) { state = HANGING; // move_snap(1, 8); yVel = 0; yAcc = 0; grav = 0; } */ } if (hangCount > 0) hangCount -= 1; if (state == HANGING) { if (instance_exists(oCape)) oCape.open = false; kJumped = false; if (kDown and kJumpPressed) { grav = gravNorm; state = FALLING; yAcc -= grav; hangCount = 5; if (global.hasGloves) hangCount = 10; } else if (kJumpPressed) { grav = gravNorm; if ((facing == RIGHT and kLeft) or (facing == LEFT and kRight)) { state = FALLING; yAcc -= grav; } else { state = JUMPING; yAcc += initialJumpAcc * 2; if (facing == RIGHT) x -= 2; else x += 2; } hangCount = hangCountMax; } if ((facing == LEFT and not isCollisionLeft(2)) or (facing == RIGHT and not isCollisionRight(2))) { grav = gravNorm; state = FALLING; yAcc -= grav; hangCount = 4; } } else { grav = gravNorm; } // pressing down while standing if (kDown and platformCharacterIs(ON_GROUND) and not whipping) { if (colBot) { state = DUCKING; } else if colPlatBot { // climb down ladder if possible, else jump down fallTimer = 0; if (not colBot) { ladder = 0; ladder = instance_place(x, y+16, oLadder); if (instance_exists(ladder)) { if (abs(x-(ladder.x+8)) < 4) { x = ladder.x + 8; xVel = 0; yVel = 0; xAcc = 0; yAcc = 0; state = CLIMBING; } } else { y += 1; state = FALLING; yAcc += grav; } } else { //the character can't move down because there is a solid in the way state = RUNNING; } } } if (not kDown and state == DUCKING) { state = STANDING; xVel = 0; xAcc = 0; } if (xVel == 0 and xAcc == 0 and state == RUNNING) { state = STANDING; } if (xAcc != 0 and state == STANDING) { state = RUNNING; } if (yVel < 0 and platformCharacterIs(IN_AIR) and state != HANGING) { state = JUMPING; } if (yVel > 0 and platformCharacterIs(IN_AIR) and state != HANGING) { state = FALLING; setCollisionBounds(-5, -6, 5, 8); } else setCollisionBounds(-5, -8, 5, 8); // CLIMB LADDER colPointLadder = collision_point(x, y, oLadder, 0, 0) or collision_point(x, y, oLadderTop, 0, 0); if ((kUp and platformCharacterIs(IN_AIR) and collision_point(x, y-8, oLadder, 0, 0) and ladderTimer == 0) or (kUp and colPointLadder and ladderTimer == 0) or (kDown and colPointLadder and ladderTimer == 0 and platformCharacterIs(ON_GROUND) and collision_point(x, y+9, oLadderTop, 0, 0) and xVel == 0)) { ladder = 0; ladder = instance_place(x, y-8, oLadder); if (instance_exists(ladder)) { if (abs(x-(ladder.x+8)) < 4) { x = ladder.x + 8; if (not collision_point(x, y, oLadder, 0, 0) and not collision_point(x, y, oLadderTop, 0, 0)) { y = ladder.y + 14; } xVel = 0; yVel = 0; xAcc = 0; yAcc = 0; state = CLIMBING; } } } /* if (sprite_index == sDuckToHangL or sprite_index == sDamselDtHL) { ladder = 0; if (facing == LEFT and collision_rectangle(x-8, y, x, y+16, oLadder, 0, 0) and not collision_point(x-4, y+16, oSolid, 0, 0)) { ladder = instance_nearest(x-4, y+16, oLadder); } else if (facing == RIGHT and collision_rectangle(x, y, x+8, y+16, oLadder, 0, 0) and not collision_point(x+4, y+16, oSolid, 0, 0)) { ladder = instance_nearest(x+4, y+16, oLadder); } if (ladder) { x = ladder.x + 8; xVel = 0; yVel = 0; xAcc = 0; yAcc = 0; state = CLIMBING; } } */ /* if (colLadder and state == CLIMBING and kJumpPressed and not whipping) { if (kLeft) xVel = -departLadderXVel; else if (kRight) xVel = departLadderXVel; else xVel = 0; yAcc += departLadderYVel; state = JUMPING; jumpButtonReleased = 0; jumpTime = 0; ladderTimer = 5; } */ // Calculate horizontal/vertical friction if (state == CLIMBING) { xFric = frictionClimbingX; yFric = frictionClimbingY; } else { if (runKey and platformCharacterIs(ON_GROUND) and runHeld >= 10) { if (kLeft) // run { xVel -= 0.1; xVelLimit = 6; xFric = frictionRunningFastX; } else if (kRight) { xVel += 0.1; xVelLimit = 6; xFric = frictionRunningFastX; } } else if (state == DUCKING) { if (xVel<2 and xVel>-2) { xFric = 0.2 xVelLimit = 3; image_speed = 0.8; } else if (kLeft and global.downToRun) // run { xVel -= 0.1; xVelLimit = 6; xFric = frictionRunningFastX; } else if (kRight and global.downToRun) { xVel += 0.1; xVelLimit = 6; xFric = frictionRunningFastX; } else { xVel *= 0.8; if (xVel < 0.5) xVel = 0; xFric = 0.2 xVelLimit = 3; image_speed = 0.8; } } else { //decrease the friction when the character is "flying" if (platformCharacterIs(IN_AIR)) { if (dead or stunned) xFric = 1.0; else xFric = 0.8; } else { xFric = frictionRunningX; } } // Stuck on web or underwater if (collision_point(x, y, oWeb, 0, 0)) { xFric = 0.2; yFric = 0.2; fallTimer = 0; } else if (collision_point(x, y, oWater, -1, -1)) { if (instance_exists(oCape)) oCape.open = false; if (state == FALLING and yVel > 0) { yFric = 0.5; } else if (not collision_point(x, y-9, oWater, -1, -1)) { yFric = 1; } else { yFric = 0.9; } } else { swimming = false; yFric = 1; } } if (colIceBot and state != DUCKING and not global.hasSpikeShoes) { xFric = 0.98; yFric = 1; } // RUNNING if (platformCharacterIs(ON_GROUND)) { if (state == RUNNING and kLeft and colLeft) { pushTimer += 1; } else if (state == RUNNING and kRight and colRight) { pushTimer += 1; } else { pushTimer = 0; } if (platformCharacterIs(ON_GROUND) and not kJump and not kDown and not runKey) { xVelLimit = 3; } // ledge flip if (state == DUCKING and abs(xVel) < 3 and facing == LEFT and collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x-1, y+9, x-10, y+9, oSolid, 0, 0) and kLeft) { state = DUCKTOHANG; if (holdItem) { holdItem.held = false; if (holdItem.type == "Gold Idol") holdItem.y -= 8; scrDropItem(-1, -4); } with oMonkey { // knock off monkeys that grabbed you if (status == 7) { xVel = -1; yVel = -4; status = 1; vineCounter = 20; grabCounter = 60; } } } else if (state == DUCKING and abs(xVel) < 3 and facing == RIGHT and collision_point(x, y+9, oSolid, 0, 0) and not collision_line(x+1, y+9, x+10, y+9, oSolid, 0, 0) and kRight) { state = DUCKTOHANG; if (holdItem) { // holdItem.held = false; if (holdItem.type == "Gold Idol") holdItem.y -= 8; scrDropItem(1, -4); } with oMonkey { // knock off monkeys that grabbed you if (status == 7) { xVel = 1; yVel = -4; status = 1; vineCounter = 20; grabCounter = 60; } } } } if (state == DUCKTOHANG) { x = xPrev; y = yPrev; xVel = 0; yVel = 0; xAcc = 0; yAcc = 0; grav = 0; } // PARACHUTE AND CAPE if (instance_exists(oParachute)) { yFric = 0.5; } if (instance_exists(oCape)) { if (oCape.open) yFric = 0.5; } if (pushTimer > 100) pushTimer = 100; // limits the acceleration if it is too extreme if (xAcc > xAccLimit) xAcc = xAccLimit; else if (xAcc < -xAccLimit) xAcc = -xAccLimit; if (yAcc > yAccLimit) yAcc = yAccLimit; else if (yAcc < -yAccLimit) yAcc = -yAccLimit; // applies the acceleration xVel += xAcc; if (dead or stunned) yVel += 0.6; else yVel += yAcc; // nullifies the acceleration xAcc = 0; yAcc = 0; // applies the friction to the velocity, now that the velocity has been calculated xVel *= xFric; yVel *= yFric; // apply ball and chain if (instance_exists(oBall)) { if (distance_to_object(oBall) >= 24) { if (xVel > 0 and oBall.x < x and abs(oBall.x-x) > 24) xVel = 0; if (xVel < 0 and oBall.x > x and abs(oBall.x-x) > 24) xVel = 0; if (yVel > 0 and oBall.y < y and abs(oBall.y-y) > 24) { if (abs(oBall.x-x) < 1) { x = oBall.x; } else if (oBall.x < x and not kRight) { if (xVel > 0) xVel *= -0.25; else if (xVel == 0) xVel -= 1; } else if (oBall.x > x and not kLeft) { if (xVel < 0) xVel *= -0.25; else if (xVel == 0) xVel += 1; } yVel = 0; fallTimer = 0; } if (yVel < 0 and oBall.y > y and abs(oBall.y-y) > 24) yVel = 0; } } // apply the limits since the velocity may be too extreme if (not dead and not stunned) { if (xVel > xVelLimit) xVel = xVelLimit; else if (xVel < -xVelLimit) xVel = -xVelLimit; } if (yVel > yVelLimit) yVel = yVelLimit; else if (yVel < -yVelLimit) yVel = -yVelLimit; // approximates the "active" variables if approximatelyZero(xVel) xVel=0 if approximatelyZero(yVel) yVel=0 if approximatelyZero(xAcc) xAcc=0 if approximatelyZero(yAcc) yAcc=0 // prepares the character to move up a hill // we need to use the "slopeYPrev" variable later to know the "true" y previous value // keep this condition the same if maxSlope>0 and platformCharacterIs(ON_GROUND) and xVel!=0 { slopeYPrev=y for(y=y;y>=slopeYPrev-maxSlope;y-=1) if colTop break slopeChangeInY=slopeYPrev-y } else slopeChangeInY=0 // moves the character, and balances out the effects caused by other processes // keep this condition the same if maxSlope*abs(xVel)>0 and platformCharacterIs(ON_GROUND) { // we need to check if we should dampen out the speed as the character runs on upward slopes xPrev=x yPrev=slopeYPrev // we don't want to use y, because y is too high yPrevHigh=y // we'll use the higher previous variable later moveTo(xVel,yVel+slopeChangeInY) dist=point_distance(xPrev,yPrev,x,y)// overall distance that has been traveled // we should have only ran at xVel if dist>abs(xVelInteger) { // show_message(string(dist)+ " "+string(abs(xVelInteger))) excess=dist-abs(xVelInteger) if(xVelInteger<0) excess*=-1 // move back since the character moved too far x=xPrev y=yPrevHigh // we need the character to be high so the character can move down // this time we'll move the correct distance, but we need to shorten out the xVel a little // these lines can be changed for different types of slowing down when running up hills ratio=abs(xVelInteger)/dist*0.9 //can be changed moveTo( round(xVelInteger*ratio),round(yVelInteger*ratio+slopeChangeInY) ) } } else { // we simply move xVel and yVel while in the air or on a ladder moveTo(xVel,yVel) } // move the character downhill if possible // we need to multiply maxDownSlope by the absolute value of xVel since the character normally runs at an xVel larger than 1 if not colBot and maxDownSlope>0 and xVelInteger!=0 and platformCharacterIs(ON_GROUND) { //the character is floating just above the slope, so move the character down upYPrev=y for(y=y;y<=upYPrev+maxDownSlope;y+=1) if colBot // we hit a solid below { upYPrev=y // I know that this doesn't seem to make sense, because of the name of the variable, but it all works out correctly after we break out of this loop break } y=upYPrev } //figures out what the sprite index of the character should be characterSprite(); //sets the previous state and the previously previous state statePrevPrev = statePrev; statePrev = state; //calculates the image_speed based on the character's velocity if (state == RUNNING or state == DUCKING or state == LOOKING_UP) { if (state == RUNNING or state == LOOKING_UP) image_speed = abs(xVel) * runAnimSpeed + 0.1; } if (state == CLIMBING) image_speed = sqrt(sqr(abs(xVel))+sqr(abs(yVel))) * climbAnimSpeed if (xVel >= 4 or xVel <= -4) { image_speed = 1; if (platformCharacterIs(ON_GROUND)) setCollisionBounds(-8, -8, 8, 8); else setCollisionBounds(-5, -8, 5, 8); } else setCollisionBounds(-5, -8, 5, 8); if (whipping) image_speed = 1; if (state == DUCKTOHANG) { image_index = 0; image_speed = 0.8; } //limit the image_speed at 1 so the animation always looks good if (image_speed > 1) image_speed = 1; ================================================ FILE: samples/Game Maker Language/draw_menu.gml ================================================ // Source - https://github.com/faissaloo/GMLmenus/blob/master/GMLmenus_example.gmx/scripts/draw_menu.gml ///draw_menu(str,background,foreground,x,y,hpadding,vpadding,height,mouse_button) //Distributed under the MIT licence: ///////////////////////////////////////// /*Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.*/ ///////////////////////////////////////// //Height is the height of 1 box //Menu syntax: // |s = seperator (Bug: if |s is placed next to a |n an extra menu item would be added) // |n = new item var str, background, foreground,xx,yy, width, height; str = " "+argument0 //A hacky thing so that it draws the first item properly, I should probably properly fix this later background = argument1 foreground = argument2 xx = argument3 yy = argument4 width = 0//argument5 hpadding = argument5 vpadding = argument6 height = argument7 mb=argument8 //This is the main mouse button, I added this to give more choice to the dev //xx and yy should be corrected if they are placed outside of the room or if they will lead to the menu being cut off by the edge of the room item_list = ds_list_create() item_string = "" /////////////////////////////////// for (i=0;iwidth { width=string_width(item_string) } ds_list_add(item_list,item_string) //Add a new item to the list item_string="" //Reset the item_string } } } draw_set_color(background) //draw_rectangle(xx,yy,xx+width,yy+(height*ds_list_size(item_list)),false) //Background, temporary? draw_button(xx,yy,xx+width+(hpadding*2),yy+(height*(ds_list_size(item_list)-1))+vpadding,true) //Background, temporary? for (i=0;ixx) and (mouse_xyy) and mouse_check_button_released(mb) { //show_message(i+1) //Debugging return i+1; //Returns the number of the item in the list, we're adding 1 because 0 is reserved for if nothing is clicked } } if mouse_check_button_released(mb) and !(mouse_x>xx and mouse_y>yy and mouse_x // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Creates global.__HttpClient // real __http_init() global.__HttpClient = object_add(); object_set_persistent(global.__HttpClient, true); #define __http_split // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // real __http_split(string text, delimeter delimeter, real limit) // Splits string into items // text - string comma-separated values // delimeter - delimeter to split by // limit if non-zero, maximum times to split text // When limited, the remaining text will be left as the last item. // E.g. splitting "1,2,3,4,5" with delimeter "," and limit 2 yields this list: // "1", "2", "3,4,5" // return value - ds_list containing strings of values var text, delimeter, limit; text = argument0; delimeter = argument1; limit = argument2; var list, count; list = ds_list_create(); count = 0; while (string_pos(delimeter, text) != 0) { ds_list_add(list, string_copy(text, 1, string_pos(delimeter,text) - 1)); text = string_copy(text, string_pos(delimeter, text) + string_length(delimeter), string_length(text) - string_pos(delimeter, text)); count += 1; if (limit and count == limit) break; } ds_list_add(list, text); return list; #define __http_parse_url // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Parses a URL into its components // real __http_parse_url(string url) // Return value is a ds_map containing keys for the different URL parts: (or -1 on failure) // "url" - the URL which was passed in // "scheme" - the URL scheme (e.g. "http") // "host" - the hostname (e.g. "example.com" or "127.0.0.1") // "port" - the port (e.g. 8000) - this is a real, unlike the others // "abs_path" - the absolute path (e.g. "/" or "/index.html") // "query" - the query string (e.g. "a=b&c=3") // Parts which are not included will not be in the map // e.g. http://example.com will not have the "port", "path" or "query" keys // This will *only* work properly for URLs of format: // scheme ":" "//" host [ ":" port ] [ abs_path [ "?" query ]]" // where [] denotes an optional component // file: URLs will *not* work as they lack the authority (host:port) component // It will not work correctly for IPv6 host values var url; url = argument0; var map; map = ds_map_create(); ds_map_add(map, 'url', url); // before scheme var colonPos; // Find colon for end of scheme colonPos = string_pos(':', url); // No colon - bad URL if (colonPos == 0) return -1; ds_map_add(map, 'scheme', string_copy(url, 1, colonPos - 1)); url = string_copy(url, colonPos + 1, string_length(url) - colonPos); // before double slash // remove slashes (yes this will screw up file:// but who cares) while (string_char_at(url, 1) == '/') url = string_copy(url, 2, string_length(url) - 1); // before hostname var slashPos, colonPos; // Find slash for beginning of path slashPos = string_pos('/', url); // No slash ahead - http://host format with no ending slash if (slashPos == 0) { // Find : for beginning of port colonPos = string_pos(':', url); } else { // Find : for beginning of port prior to / colonPos = string_pos(':', string_copy(url, 1, slashPos - 1)); } // No colon - no port if (colonPos == 0) { // There was no slash if (slashPos == 0) { ds_map_add(map, 'host', url); return map; } // There was a slash else { ds_map_add(map, 'host', string_copy(url, 1, slashPos - 1)); url = string_copy(url, slashPos, string_length(url) - slashPos + 1); } } // There's a colon - port specified else { // There was no slash if (slashPos == 0) { ds_map_add(map, 'host', string_copy(url, 1, colonPos - 1)); ds_map_add(map, 'port', real(string_copy(url, colonPos + 1, string_length(url) - colonPos))); return map; } // There was a slash else { ds_map_add(map, 'host', string_copy(url, 1, colonPos - 1)); url = string_copy(url, colonPos + 1, string_length(url) - colonPos); slashPos = string_pos('/', url); ds_map_add(map, 'port', real(string_copy(url, 1, slashPos - 1))); url = string_copy(url, slashPos, string_length(url) - slashPos + 1); } } // before path var queryPos; queryPos = string_pos('?', url); // There's no ? - no query if (queryPos == 0) { ds_map_add(map, 'abs_path', url); return map; } else { ds_map_add(map, 'abs_path', string_copy(url, 1, queryPos - 1)); ds_map_add(map, 'query', string_copy(url, queryPos + 1, string_length(url) - queryPos)); return map; } // Return -1 upon unlikely error ds_map_destroy(map); return -1; #define __http_resolve_url // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Takes a base URL and a URL reference and applies it to the base URL // Returns resulting absolute URL // string __http_resolve_url(string baseUrl, string refUrl) // Return value is a string containing the new absolute URL, or "" on failure // Works only for restricted URL syntax as understood by by http_resolve_url // The sole restriction of which is that only scheme://authority/path URLs work // This notably excludes file: URLs which lack the authority component // As described by RFC3986: // URI-reference = URI / relative-ref // relative-ref = relative-part [ "?" query ] [ "#" fragment ] // relative-part = "//" authority path-abempty // / path-absolute // / path-noscheme // / path-empty // However http_resolve_url does *not* deal with fragments // Algorithm based on that of section 5.2.2 of RFC 3986 var baseUrl, refUrl; baseUrl = argument0; refUrl = argument1; // Parse base URL var urlParts; urlParts = __http_parse_url(baseUrl); if (urlParts == -1) return ''; // Try to parse reference URL var refUrlParts, canParseRefUrl; refUrlParts = __http_parse_url(refUrl); canParseRefUrl = (refUrlParts != -1); if (refUrlParts != -1) ds_map_destroy(refUrlParts); var result; result = ''; // Parsing of reference URL succeeded - it's absolute and we're done if (canParseRefUrl) { result = refUrl; } // Begins with '//' - scheme-relative URL else if (string_copy(refUrl, 1, 2) == '//' and string_length(refUrl) > 2) { result = ds_map_find_value(urlParts, 'scheme') + ':' + refUrl; } // Is or begins with '/' - absolute path relative URL else if (((string_char_at(refUrl, 1) == '/' and string_length(refUrl) > 1) or refUrl == '/') // Doesn't begin with ':' and is not blank - relative path relative URL or (string_char_at(refUrl, 1) != ':' and string_length(refUrl) > 0)) { // Find '?' for query var queryPos; queryPos = string_pos('?', refUrl); // No query if (queryPos == 0) { refUrl = __http_resolve_path(ds_map_find_value(urlParts, 'abs_path'), refUrl); ds_map_replace(urlParts, 'abs_path', refUrl); if (ds_map_exists(urlParts, 'query')) ds_map_delete(urlParts, 'query'); } // Query exists, split else { var path, query; path = string_copy(refUrl, 1, queryPos - 1); query = string_copy(refUrl, queryPos + 1, string_length(relUrl) - queryPos); path = __http_resolve_path(ds_map_find_value(urlParts, 'abs_path'), path); ds_map_replace(urlParts, 'abs_path', path); if (ds_map_exists(urlParts, 'query')) ds_map_replace(urlParts, 'query', query); else ds_map_add(urlParts, 'query', query); } result = __http_construct_url(urlParts); } ds_map_destroy(urlParts); return result; #define __http_resolve_path // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Takes a base path and a path reference and applies it to the base path // Returns resulting absolute path // string __http_resolve_path(string basePath, string refPath) // Return value is a string containing the new absolute path // Deals with UNIX-style / paths, not Windows-style \ paths // Can be used to clean up .. and . in non-absolute paths too ('' as basePath) var basePath, refPath; basePath = argument0; refPath = argument1; // refPath begins with '/' (is absolute), we can ignore all of basePath if (string_char_at(refPath, 1) == '/') { basePath = refPath; refPath = ''; } var parts, refParts; parts = __http_split(basePath, '/', 0); refParts = __http_split(refPath, '/', 0); if (refPath != '') { // Find last part of base path var lastPart; lastPart = ds_list_find_value(parts, ds_list_size(parts) - 1); // If it's not blank (points to a file), remove it if (lastPart != '') { ds_list_delete(parts, ds_list_size(parts) - 1); } // Concatenate refParts to end of parts var i; for (i = 0; i < ds_list_size(refParts); i += 1) ds_list_add(parts, ds_list_find_value(refParts, i)); } // We now don't need refParts any more ds_list_destroy(refParts); // Deal with '..' and '.' for (i = 0; i < ds_list_size(parts); i += 1) { var part; part = ds_list_find_value(parts, i); if (part == '.') { if (i == 1 or i == ds_list_size(parts) - 1) ds_list_replace(parts, i, ''); else ds_list_delete(parts, i); i -= 1; continue; } else if (part == '..') { if (i > 1) { ds_list_delete(parts, i - 1); ds_list_delete(part, i); i -= 2; } else { ds_list_replace(parts, i, ''); i -= 1; } continue; } else if (part == '' and i != 0 and i != ds_list_size(parts) - 1) { ds_list_delete(parts, i); i -= 1; continue; } } // Reconstruct path from parts var path; path = ''; for (i = 0; i < ds_list_size(parts); i += 1) { if (i != 0) path += '/'; path += ds_list_find_value(parts, i); } ds_map_destroy(parts); return path; #define __http_parse_hex // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Takes a lowercase hexadecimal string and returns its integer value // real __http_parse_hex(string hexString) // Return value is the whole number value (or -1 if invalid) // Only works for whole numbers (non-fractional numbers >= 0) and lowercase hex var hexString; hexString = argument0; var result, hexValues; result = 0; hexValues = "0123456789abcdef"; var i; for (i = 1; i <= string_length(hexString); i += 1) { result *= 16; var digit; digit = string_pos(string_char_at(hexString, i), hexValues) - 1; if (digit == -1) return -1; result += digit; } return result; #define __http_construct_url // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Constructs an URL from its components (as http_parse_url would return) // string __http_construct_url(real parts) // Return value is the string of the constructed URL // Keys of parts map: // "scheme" - the URL scheme (e.g. "http") // "host" - the hostname (e.g. "example.com" or "127.0.0.1") // "port" - the port (e.g. 8000) - this is a real, unlike the others // "abs_path" - the absolute path (e.g. "/" or "/index.html") // "query" - the query string (e.g. "a=b&c=3") // Parts which are omitted will be omitted in the URL // e.g. http://example.com lacks "port", "path" or "query" keys // This will *only* work properly for URLs of format: // scheme ":" "//" host [ ":" port ] [ abs_path [ "?" query ]]" // where [] denotes an optional component // file: URLs will *not* work as they lack the authority (host:port) component // Should work correctly for IPv6 host values, but bare in mind parse_url won't var parts; parts = argument0; var url; url = ''; url += ds_map_find_value(parts, 'scheme'); url += '://'; url += ds_map_find_value(parts, 'host'); if (ds_map_exists(parts, 'port')) url += ':' + string(ds_map_find_value(parts, 'port')); if (ds_map_exists(parts, 'abs_path')) { url += ds_map_find_value(parts, 'abs_path'); if (ds_map_exists(parts, 'query')) url += '?' + ds_map_find_value(parts, 'query'); } return url; #define __http_prepare_request // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Internal function - prepares request // void __http_prepare_request(real client, string url, real headers) // client - HttpClient object to prepare // url - URL to send GET request to // headers - ds_map of extra headers to send, -1 if none var client, url, headers; client = argument0; url = argument1; headers = argument2; var parsed; parsed = __http_parse_url(url); if (parsed == -1) show_error("Error when making HTTP GET request - can't parse URL: " + url, true); if (!ds_map_exists(parsed, 'port')) ds_map_add(parsed, 'port', 80); if (!ds_map_exists(parsed, 'abs_path')) ds_map_add(parsed, 'abs_path', '/'); with (client) { destroyed = false; CR = chr(13); LF = chr(10); CRLF = CR + LF; socket = tcp_connect(ds_map_find_value(parsed, 'host'), ds_map_find_value(parsed, 'port')); state = 0; errored = false; error = ''; linebuf = ''; line = 0; statusCode = -1; reasonPhrase = ''; responseBody = buffer_create(); responseBodySize = -1; responseBodyProgress = -1; responseHeaders = ds_map_create(); requestUrl = url; requestHeaders = headers; // Request = Request-Line ; Section 5.1 // *(( general-header ; Section 4.5 // | request-header ; Section 5.3 // | entity-header ) CRLF) ; Section 7.1 // CRLF // [ message-body ] ; Section 4.3 // "The Request-Line begins with a method token, followed by the // Request-URI and the protocol version, and ending with CRLF. The // elements are separated by SP characters. No CR or LF is allowed // except in the final CRLF sequence." if (ds_map_exists(parsed, 'query')) write_string(socket, 'GET ' + ds_map_find_value(parsed, 'abs_path') + '?' + ds_map_find_value(parsed, 'query') + ' HTTP/1.1' + CRLF); else write_string(socket, 'GET ' + ds_map_find_value(parsed, 'abs_path') + ' HTTP/1.1' + CRLF); // "A client MUST include a Host header field in all HTTP/1.1 request // messages." // "A "host" without any trailing port information implies the default // port for the service requested (e.g., "80" for an HTTP URL)." if (ds_map_find_value(parsed, 'port') == 80) write_string(socket, 'Host: ' + ds_map_find_value(parsed, 'host') + CRLF); else write_string(socket, 'Host: ' + ds_map_find_value(parsed, 'host') + ':' + string(ds_map_find_value(parsed, 'port')) + CRLF); // "An HTTP/1.1 server MAY assume that a HTTP/1.1 client intends to // maintain a persistent connection unless a Connection header including // the connection-token "close" was sent in the request." write_string(socket, 'Connection: close' + CRLF); // "If no Accept-Encoding field is present in a request, the server MAY // assume that the client will accept any content coding." write_string(socket, 'Accept-Encoding:' + CRLF); // If headers specified if (headers != -1) { var key; // Iterate over headers map for (key = ds_map_find_first(headers); is_string(key); key = ds_map_find_next(headers, key)) { write_string(socket, key + ': ' + ds_map_find_value(headers, key) + CRLF); } } // Send extra CRLF to terminate request write_string(socket, CRLF); socket_send(socket); ds_map_destroy(parsed); } #define __http_parse_header // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Internal function - parses header // real __http_parse_header(string linebuf, real line) // Returns false if it errored (caller should return and destroy) var linebuf, line; linebuf = argument0; line = argument1; // "HTTP/1.1 header field values can be folded onto multiple lines if the // continuation line begins with a space or horizontal tab." if ((string_char_at(linebuf, 1) == ' ' or ord(string_char_at(linebuf, 1)) == 9)) { if (line == 1) { errored = true; error = "First header line of response can't be a continuation, right?"; return false; } headerValue = ds_map_find_value(responseHeaders, string_lower(headerName)) + string_copy(linebuf, 2, string_length(linebuf) - 1); } // "Each header field consists // of a name followed by a colon (":") and the field value. Field names // are case-insensitive. The field value MAY be preceded by any amount // of LWS, though a single SP is preferred." else { var colonPos; colonPos = string_pos(':', linebuf); if (colonPos == 0) { errored = true; error = "No colon in a header line of response"; return false; } headerName = string_copy(linebuf, 1, colonPos - 1); headerValue = string_copy(linebuf, colonPos + 1, string_length(linebuf) - colonPos); // "The field-content does not include any leading or trailing LWS: // linear white space occurring before the first non-whitespace // character of the field-value or after the last non-whitespace // character of the field-value. Such leading or trailing LWS MAY be // removed without changing the semantics of the field value." while (string_char_at(headerValue, 1) == ' ' or ord(string_char_at(headerValue, 1)) == 9) headerValue = string_copy(headerValue, 2, string_length(headerValue) - 1); } ds_map_add(responseHeaders, string_lower(headerName), headerValue); if (string_lower(headerName) == 'content-length') { responseBodySize = real(headerValue); responseBodyProgress = 0; } return true; #define __http_client_step // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Steps the HTTP client (needs to be called each step or so) var client; client = argument0; with (client) { if (errored) exit; // Socket error if (socket_has_error(socket)) { errored = true; error = "Socket error: " + socket_error(socket); return __http_client_destroy(); } var available; available = tcp_receive_available(socket); switch (state) { // Receiving lines case 0: if (!available && tcp_eof(socket)) { errored = true; error = "Unexpected EOF when receiving headers/status code"; return __http_client_destroy(); } var bytesRead, c; for (bytesRead = 1; bytesRead <= available; bytesRead += 1) { c = read_string(socket, 1); // Reached end of line // "HTTP/1.1 defines the sequence CR LF as the end-of-line marker for all // protocol elements except the entity-body (see appendix 19.3 for // tolerant applications)." if (c == LF and string_char_at(linebuf, string_length(linebuf)) == CR) { // Strip trailing CR linebuf = string_copy(linebuf, 1, string_length(linebuf) - 1); // First line - status code if (line == 0) { // "The first line of a Response message is the Status-Line, consisting // of the protocol version followed by a numeric status code and its // associated textual phrase, with each element separated by SP // characters. No CR or LF is allowed except in the final CRLF sequence." var httpVer, spacePos; spacePos = string_pos(' ', linebuf); if (spacePos == 0) { errored = true; error = "No space in first line of response"; return __http_client_destroy(); } httpVer = string_copy(linebuf, 1, spacePos); linebuf = string_copy(linebuf, spacePos + 1, string_length(linebuf) - spacePos); spacePos = string_pos(' ', linebuf); if (spacePos == 0) { errored = true; error = "No second space in first line of response"; return __http_client_destroy(); } statusCode = real(string_copy(linebuf, 1, spacePos)); reasonPhrase = string_copy(linebuf, spacePos + 1, string_length(linebuf) - spacePos); } // Other line else { // Blank line, end of response headers if (linebuf == '') { state = 1; // write remainder write_buffer_part(responseBody, socket, available - bytesRead); responseBodyProgress = available - bytesRead; break; } // Header else { if (!__http_parse_header(linebuf, line)) return __http_client_destroy(); } } linebuf = ''; line += 1; } else linebuf += c; } break; // Receiving response body case 1: write_buffer(responseBody, socket); responseBodyProgress += available; if (tcp_eof(socket)) { if (ds_map_exists(responseHeaders, 'transfer-encoding')) { if (ds_map_find_value(responseHeaders, 'transfer-encoding') == 'chunked') { // Chunked transfer, let's decode it var actualResponseBody, actualResponseSize; actualResponseBody = buffer_create(); actualResponseBodySize = 0; // Parse chunks // chunk = chunk-size [ chunk-extension ] CRLF // chunk-data CRLF // chunk-size = 1*HEX while (buffer_bytes_left(responseBody)) { var chunkSize, c; chunkSize = ''; // Read chunk size byte by byte while (buffer_bytes_left(responseBody)) { c = read_string(responseBody, 1); if (c == CR or c == ';') break; else chunkSize += c; } // We found a semicolon - beginning of chunk-extension if (c == ';') { // skip all extension stuff while (buffer_bytes_left(responseBody) && c != CR) { c = read_string(responseBody, 1); } } // Reached end of header if (c == CR) { c += read_string(responseBody, 1); // Doesn't end in CRLF if (c != CRLF) { errored = true; error = 'header of chunk in chunked transfer did not end in CRLF'; buffer_destroy(actualResponseBody); return __http_client_destroy(); } // chunk-size is empty - something's up! if (chunkSize == '') { errored = true; error = 'empty chunk-size in a chunked transfer'; buffer_destroy(actualResponseBody); return __http_client_destroy(); } chunkSize = __http_parse_hex(chunkSize); // Parsing of size failed - not hex? if (chunkSize == -1) { errored = true; error = 'chunk-size was not hexadecimal in a chunked transfer'; buffer_destroy(actualResponseBody); return __http_client_destroy(); } // Is the chunk bigger than the remaining response? if (chunkSize + 2 > buffer_bytes_left(responseBody)) { errored = true; error = 'chunk-size was greater than remaining data in a chunked transfer'; buffer_destroy(actualResponseBody); return __http_client_destroy(); } // OK, everything's good, read the chunk write_buffer_part(actualResponseBody, responseBody, chunkSize); actualResponseBodySize += chunkSize; // Check for CRLF if (read_string(responseBody, 2) != CRLF) { errored = true; error = 'chunk did not end in CRLF in a chunked transfer'; return __http_client_destroy(); } } else { errored = true; error = 'did not find CR after reading chunk header in a chunked transfer, Faucet HTTP bug?'; return __http_client_destroy(); } // if the chunk size is zero, then it was the last chunk if (chunkSize == 0 // trailer headers will be present and ds_map_exists(responseHeaders, 'trailer')) { // Parse header lines var line; line = 1; while (buffer_bytes_left(responseBody)) { var linebuf; linebuf = ''; while (buffer_bytes_left(responseBody)) { c = read_string(responseBody, 1); if (c != CR) linebuf += c; else break; } c += read_string(responseBody, 1); if (c != CRLF) { errored = true; error = 'trailer header did not end in CRLF in a chunked transfer'; return __http_client_destroy(); } if (!__http_parse_header(linebuf, line)) return __http_client_destroy(); line += 1; } } } responseBodySize = actualResponseBodySize; buffer_destroy(responseBody); responseBody = actualResponseBody; } else { errored = true; error = 'Unsupported Transfer-Encoding: "' + ds_map_find_value(responseHaders, 'transfer-encoding') + '"'; return __http_client_destroy(); } } else if (responseBodySize != -1) { if (responseBodyProgress < responseBodySize) { errored = true; error = "Unexpected EOF, response body size is less than expected"; return __http_client_destroy(); } } // 301 Moved Permanently/302 Found/303 See Other/307 Moved Temporarily if (statusCode == 301 or statusCode == 302 or statusCode == 303 or statusCode == 307) { if (ds_map_exists(responseHeaders, 'location')) { var location, resolved; location = ds_map_find_value(responseHeaders, 'location'); resolved = __http_resolve_url(requestUrl, location); // Resolving URL didn't fail and it's http:// if (resolved != '' and string_copy(resolved, 1, 7) == 'http://') { // Restart request __http_client_destroy(); __http_prepare_request(client, resolved, requestHeaders); } else { errored = true; error = "301, 302, 303 or 307 response with invalid or unsupported Location URL ('" + location + "') - can't redirect"; return __http_client_destroy(); } exit; } else { errored = true; error = "301, 302, 303 or 307 response without Location header - can't redirect"; return __http_client_destroy(); } } else state = 2; } break; // Done. case 2: break; } } #define __http_client_destroy // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Clears up contents of an httpClient prior to destruction or after error if (!destroyed) { socket_destroy(socket); buffer_destroy(responseBody); ds_map_destroy(responseHeaders); } destroyed = true; #define http_new_get // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Makes a GET HTTP request // real http_new_get(string url) // url - URL to send GET request to // Return value is an HttpClient instance that can be passed to // fct_http_request_status etc. // (errors on failure to parse URL) var url, client; url = argument0; if (!variable_global_exists('__HttpClient')) __http_init(); client = instance_create(0, 0, global.__HttpClient); __http_prepare_request(client, url, -1); return client; #define http_new_get_ex // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Makes a GET HTTP request with custom headers // real http_new_get_ex(string url, real headers) // url - URL to send GET request to // headers - ds_map of extra headers to send // Return value is an HttpClient instance that can be passed to // fct_http_request_status etc. // (errors on failure to parse URL) var url, headers, client; url = argument0; headers = argument1; if (!variable_global_exists('__HttpClient')) __http_init(); client = instance_create(0, 0, global.__HttpClient); __http_prepare_request(client, url, headers); return client; #define http_step // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Steps the HTTP client. This is what makes everything actually happen. // Call it each step. Returns whether or not the request has finished. // real http_step(real client) // client - HttpClient object // Return value is either: // 0 - In progress // 1 - Done or Errored // Example usage: // req = http_new_get("http://example.com/x.txt"); // while (http_step(req)) {} // if (http_status_code(req) != 200) { // // Errored! // } else { // // Hasn't errored, do stuff here. // } var client; client = argument0; __http_client_step(client); if (client.errored || client.state == 2) return 1; else return 0; #define http_status_code // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Gets the status code // real http_status_code(real client) // client - HttpClient object // Return value is either: // * 0, if the request has not yet finished // * a negative value, if there was an internal Faucet HTTP error // * a positive value, the status code of the HTTP request // "The Status-Code element is a 3-digit integer result code of the // attempt to understand and satisfy the request. These codes are fully // defined in section 10. The Reason-Phrase is intended to give a short // textual description of the Status-Code. The Status-Code is intended // for use by automata and the Reason-Phrase is intended for the human // user. The client is not required to examine or display the Reason- // Phrase." // See also: http_reason_phrase, gets the Reason-Phrase var client; client = argument0; if (client.errored) return -1; else if (client.state == 2) return client.statusCode; else return 0; #define http_reason_phrase // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Gets the reason phrase // string http_reason_phrase(real client) // client - HttpClient object // Return value is either: // * "", if the request has not yet finished // * an internal Faucet HTTP error message, if there was one // * the reason phrase of the HTTP request // "The Status-Code element is a 3-digit integer result code of the // attempt to understand and satisfy the request. These codes are fully // defined in section 10. The Reason-Phrase is intended to give a short // textual description of the Status-Code. The Status-Code is intended // for use by automata and the Reason-Phrase is intended for the human // user. The client is not required to examine or display the Reason- // Phrase." // See also: http_status_code, gets the Status-Code var client; client = argument0; if (client.errored) return client.error; else if (client.state == 2) return client.reasonPhrase; else return ""; #define http_response_body // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Gets the response body returned by an HTTP request as a buffer // real http_response_body(real client) // client - HttpClient object // Return value is a buffer if client hasn't errored and is finished var client; client = argument0; return client.responseBody; #define http_response_body_size // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Gets the size of response body returned by an HTTP request // real http_response_body_size(real client) // client - HttpClient object // Return value is the size in bytes, or -1 if we don't know or don't know yet // Call this each time you use the size - it may have changed in the case of redirect var client; client = argument0; return client.responseBodySize; #define http_response_body_progress // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Gets the size of response body returned by an HTTP request which is so far downloaded // real http_response_body_progress(real client) // client - HttpClient object // Return value is the size in bytes, or -1 if we haven't started yet or client has errored var client; client = argument0; return client.responseBodyProgress; #define http_response_headers // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Gets the response headers returned by an HTTP request as a ds_map // real http_response_headers(real client) // client - HttpClient object // Return value is a ds_map if client hasn't errored and is finished // All headers will have lowercase keys // The ds_map is owned by the HttpClient, do not use ds_map_destroy() yourself // Call when the request has finished - otherwise may be incomplete or missing var client; client = argument0; return client.responseHeaders; #define http_destroy // *** // This function forms part of Faucet HTTP v1.0 // https://github.com/TazeTSchnitzel/Faucet-HTTP-Extension // // Copyright (c) 2013-2014, Andrea Faulds // // Permission to use, copy, modify, and/or distribute this software for any // purpose with or without fee is hereby granted, provided that the above // copyright notice and this permission notice appear in all copies. // // THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES // WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF // MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR // ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES // WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN // ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF // OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. // *** // Cleans up HttpClient // void http_destroy(real client) // client - HttpClient object var client; client = argument0; with (client) { __http_client_destroy(); instance_destroy(); } ================================================ FILE: samples/Game Maker Language/jsonion.gml ================================================ // Originally from /jsonion.gml in JSOnion // JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects. #define __jso_gmt_tuple { /** tuple(>element_0<, >element_1<, ..., >element_n<): Return an n-tuple @author: GameGeisha @version: 1.2 (GMTuple) */ //Position, address table and data var pos, addr_table, data; pos = 6*argument_count+4; addr_table = ""; data = ""; //Build the tuple element-by-element var i, ca, isstr, datastr; for (i=0; ith element of @author: GameGeisha @version: 1.2 (GMTuple) */ //Capture arguments var t, n, size; t = argument0; n = argument1; size = __jso_gmt_size(t); //Search for the bounding positions for the th element in the address table var start, afterend, isstr; isstr = ord(string_char_at(t, 4+6*n))-$30; start = real(string_copy(t, 5+6*n, 5)); if (n < size-1) { afterend = real(string_copy(t, 11+6*n, 5)); } else { afterend = string_length(t)+1; } //Return the th element with the correct type if (isstr) { return string_copy(t, start, afterend-start); } else { return real(string_copy(t, start, afterend-start)); } } #define __jso_gmt_size { /** size(tuple_source): Return the size of @author: GameGeisha @version: 1.2 (GMTuple) */ return real(string_copy(argument0, 1, 3)); } #define __jso_gmt_numtostr { /** __gmt_numtostr(num): Return string representation of . Decimal numbers expressed as scientific notation with double precision (i.e. 15 digits) @author: GameGeisha @version: 1.2 (edited) */ if (frac(argument0) == 0) { return string(argument0); } var mantissa, exponent; exponent = floor(log10(abs(argument0))); mantissa = string_format(argument0/power(10,exponent), 15, 14); var i, ca; i = string_length(mantissa); do { ca = string_char_at(mantissa, i); i -= 1; } until (ca != "0") if (ca != ".") { mantissa = string_copy(mantissa, 1, i+1); } else { mantissa = string_copy(mantissa, 1, i); } if (exponent != 0) { return mantissa + "e" + string(exponent); } else { return mantissa; } } #define __jso_gmt_test_all { /** test_all(): Runs all test suites @author: GameGeisha @version: 1.2 (GMTuple) */ //Automated testing sequence __jso_gmt_test_elem(); __jso_gmt_test_size(); __jso_gmt_test_numtostr(); } #define __jso_gmt_test_numtostr { /** _test_numtostr(): Runs number-to-string tests @author: GameGeisha @version: 1.2 (GMTuple) */ var tolerance; tolerance = 1/10000000000; if (real(__jso_gmt_numtostr(9)) != 9) { show_message("Scientific notation conversion failed for 1-digit integer! Result: " + __jso_gmt_numtostr(9)); } if (real(__jso_gmt_numtostr(500)) != 500) { show_message("Scientific notation conversion failed for 3-digit integer! Result: " + __jso_gmt_numtostr(500)); } if (abs(real(__jso_gmt_numtostr(pi))-pi) > tolerance) { show_message("Scientific notation conversion failed for pi! Result: " + __jso_gmt_numtostr(pi)); } if (abs(real(__jso_gmt_numtostr(104729.903455))-104729.903455) > tolerance) { show_message("Scientific notation conversion failed for large decimal number! Result: " + __jso_gmt_numtostr(104729.903455)); } if (abs(real(__jso_gmt_numtostr(-pi))+pi) > tolerance) { show_message("Scientific notation conversion failed for -pi! Result: " + __jso_gmt_numtostr(-pi)); } if (abs(real(__jso_gmt_numtostr(1/pi))-1/pi) > tolerance) { show_message("Scientific notation conversion failed for 1/pi! Result: " + __jso_gmt_numtostr(1/pi)); } } #define __jso_gmt_test_elem { /** _test_elem(): Runs tuple element retrieval tests @author: GameGeisha @version: 1.2 (GMTuple) */ if (__jso_gmt_elem(__jso_gmt_tuple("Qblock", "kll"), 0) != "Qblock") { show_message("Element retrieval failed for simple string. #Should be:Qblock#Actual:" + __jso_gmt_elem(__jso_gmt_tuple("Qblock"), 0)); } if (__jso_gmt_elem(__jso_gmt_tuple(9, "Q", -7), 0) != 9) { show_message("Element retrieval failed for simple number. #Should be 9#Actual:" + string(__jso_gmt_elem(__jso_gmt_tuple(9, "Q", 7), 0))); } if (__jso_gmt_elem(__jso_gmt_tuple("Qblock", "", "Negg"), 1) != "") { show_message("Element retrieval failed for empty string#Should be empty string#Actual:"+string(__jso_gmt_elem(__jso_gmt_tuple("Qblock", "", "Negg"), 0))); } if (__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple("Not this", __jso_gmt_tuple(0, 1, 2, 3), "Waahoo"), 1), 3) != 3) { show_message("Element retrieval failed in nested tuple. #Should be 3#Actual:" + string(__jso_gmt_elem(__jso_gmt_elem(__jso_gmt_tuple("Not this", __jso_gmt_tuple(0, 1, 2, 3), "Waahoo"), 1), 3))); } } #define __jso_gmt_test_size { /** _test_size(): Runs tuple size tests @author: GameGeisha @version: 1.2 (GMTuple) */ if (__jso_gmt_size(__jso_gmt_tuple("Waahoo", "Negg", 0)) != 3) { show_message("Bad size for 3-tuple"); } if (__jso_gmt_size(__jso_gmt_tuple()) != 0) { show_message("Bad size for null tuple"); } if (__jso_gmt_size(__jso_gmt_tuple(7)) != 1) { show_message("Bad size for 1-tuple"); } if (__jso_gmt_size(__jso_gmt_tuple(1,2,3,4,5,6,7,8,9,10)) != 10) { show_message("Bad size for 10-tuple"); } } #define jso_new_map { /** jso_new_map(): Create a new map. JSOnion version: 1.0.0d */ return ds_map_create(); } #define jso_new_list { /** jso_new_list(): Create a new list. JSOnion version: 1.0.0d */ return ds_list_create(); } #define jso_map_add_real { /** jso_map_add_real(map, key, val): Add the key-value pair : to , where is a real value. JSOnion version: 1.0.0d */ ds_map_add(argument0, argument1, argument2); } #define jso_map_add_string { /** jso_map_add_string(map, key, str): Add the key-value pair : to , where is a string value. JSOnion version: 1.0.0d */ ds_map_add(argument0, argument1, "s" + argument2); } #define jso_map_add_sublist { /** jso_map_add_sublist(map, key, sublist): Add the key-value pair : to , where is a list. JSOnion version: 1.0.0d */ ds_map_add(argument0, argument1, "l" + string(argument2)); } #define jso_map_add_submap { /** jso_map_add_submap(map, key, submap): Add the key-value pair : to , where is a map. JSOnion version: 1.0.0d */ ds_map_add(argument0, argument1, "m" + string(argument2)); } #define jso_map_add_integer { /** jso_map_add_integer(map, key, int): Add the key-value pair : to , where is a integer value. JSOnion version: 1.0.0d */ ds_map_add(argument0, argument1, floor(argument2)); } #define jso_map_add_boolean { /** jso_map_add_boolean(map, key, bool): Add the key-value pair : to , where is a boolean value. JSOnion version: 1.0.0d */ if (argument2) { ds_map_add(argument0, argument1, "btrue"); } else { ds_map_add(argument0, argument1, "bfalse"); } } #define jso_list_add_real { /** jso_list_add_real(list, val): Append the real value to . JSOnion version: 1.0.0d */ ds_list_add(argument0, argument1); } #define jso_list_add_string { /** jso_list_add_string(list, str): Append the string value to . JSOnion version: 1.0.0d */ ds_list_add(argument0, "s" + argument1); } #define jso_list_add_sublist { /** jso_list_add_sublist(list, sublist): Append the list to . JSOnion version: 1.0.0d */ ds_list_add(argument0, "l" + string(argument1)); } #define jso_list_add_submap { /** jso_list_add_submap(list, submap): Append the map to . JSOnion version: 1.0.0d */ ds_list_add(argument0, "m" + string(argument1)); } #define jso_list_add_integer { /** jso_list_add_integer(list, int): Append the integer to . JSOnion version: 1.0.0d */ ds_list_add(argument0, floor(argument1)); } #define jso_list_add_boolean { /** jso_list_add_boolean(list, bool): Append the boolean value to . JSOnion version: 1.0.0d */ if (argument1) { ds_list_add(argument0, "btrue"); } else { ds_list_add(argument0, "bfalse"); } } #define jso_map_get { /** jso_map_get(map, key): Retrieve the value stored in with the key value , with the correct type. JSOnion version: 1.0.0d */ //Grab the value var v; v = ds_map_find_value(argument0, argument1); //String; could be string, map or list if (is_string(v)) { switch (string_char_at(v, 1)) { case "s": return string_delete(v, 1, 1); break; case "l": case "m": return real(string_delete(v, 1, 1)); break; case "b": if (v == "btrue") { return true; } else if (v == "bfalse") { return false; } else { show_error("Invalid boolean value.", true); } break; default: show_error("Invalid map contents.", true); break; } } //Real; return real value as-is else { return v; } } #define jso_map_get_type { /** jso_map_get_type(map, key): Return the type of value to which the key value is mapped to in . JSOnion version: 1.0.0d */ //Grab the value var v; v = ds_map_find_value(argument0, argument1); //String; could be string, map or list if (is_string(v)) { switch (string_char_at(v, 1)) { case "s": return jso_type_string; break; case "l": return jso_type_list; break; case "m": return jso_type_map; break; case "b": return jso_type_boolean; break; default: show_error("Invalid map content type.", true); break; } } //Real else { return jso_type_real; } } #define jso_list_get { /** jso_list_get(list, index): Retrieve the value stored in at position , with the correct type. JSOnion version: 1.0.0d */ //Grab the value var v; v = ds_list_find_value(argument0, argument1); //String; could be string, map or list if (is_string(v)) { switch (string_char_at(v, 1)) { case "s": return string_delete(v, 1, 1); break; case "l": case "m": return real(string_delete(v, 1, 1)); break; case "b": if (v == "btrue") { return true; } else if (v == "bfalse") { return false; } else { show_error("Invalid boolean value.", true); } break; default: show_error("Invalid list contents.", true); break; } } //Real; return real value as-is else { return v; } } #define jso_list_get_type { /** jso_list_get_type(list, index): Retrieve the type of value found at position of . JSOnion version: 1.0.0d */ //Grab the value var v; v = ds_list_find_value(argument0, argument1); //String; could be string, map or list if (is_string(v)) { switch (string_char_at(v, 1)) { case "s": return jso_type_string; break; case "l": return jso_type_list; break; case "m": return jso_type_map; break; case "b": return jso_type_boolean; break; default: show_error("Invalid list content type.", true); break; } } //Real else { return jso_type_real; } } #define jso_cleanup_map { /** jso_cleanup_map(map): Recursively free up . JSOnion version: 1.0.0d */ //Loop through all keys var i, l, k; l = ds_map_size(argument0); k = ds_map_find_first(argument0); for (i=0; i. JSOnion version: 1.0.0d */ //Loop through all elements var i, l, v; l = ds_list_size(argument0); for (i=0; i): Return a JSON-encoded version of real value . This uses scientific notation with up to 15 significant digits for decimal values. For integers, it just uses string(). This is adapted from the same algorithm used in GMTuple. JSOnion version: 1.0.0d */ return __jso_gmt_numtostr(argument0); } #define jso_encode_string { /** jso_encode_string(str): Return a JSON-encoded version of string . JSOnion version: 1.0.0d */ //Iteratively reconstruct the string var i, l, s, c; s = ""; l = string_length(argument0); for (i=1; i<=l; i+=1) { //Replace escape characters c = string_char_at(argument0, i); switch (ord(c)) { case 34: case 92: case 47: //Double quotes, backslashes and slashes s += "\" + c; break; case 8: //Backspace s += "\b"; break; case 12: //Form feed s += "\f"; break; case 10: //New line s += "\n"; break; case 13: //Carriage return s += "\r"; break; case 9: //Horizontal tab s += "\t"; break; default: //Not an escape character s += c; break; } } //Add quotes return '"' + s + '"'; } #define jso_encode_list { /** jso_encode_list(list): Return a JSON-encoded version of list . JSOnion version: 1.0.0d */ //Iteratively encode each element var i, l, s; s = ""; l = ds_list_size(argument0); for (i=0; i 0) { s += ","; } //Select correct encoding for each element, then recursively encode each switch (jso_list_get_type(argument0, i)) { case jso_type_real: s += jso_encode_real(jso_list_get(argument0, i)); break; case jso_type_string: s += jso_encode_string(jso_list_get(argument0, i)); break; case jso_type_map: s += jso_encode_map(jso_list_get(argument0, i)); break; case jso_type_list: s += jso_encode_list(jso_list_get(argument0, i)); break; case jso_type_boolean: s += jso_encode_boolean(jso_list_get(argument0, i)); break; } } //Done, add square brackets return "[" + s + "]"; } #define jso_encode_map { /** jso_encode_map(map): Return a JSON-encoded version of map . JSOnion version: 1.0.0d */ //Go through every key-value pair var i, l, k, s; s = ""; l = ds_map_size(argument0); k = ds_map_find_first(argument0); for (i=0; i 0) { s += ","; } //Find the key and encode it if (is_real(k)) { s += jso_encode_real(k); } else { s += jso_encode_string(k); } //Add the : separator s += ":"; //Select correct encoding for each value, then recursively encode each switch (jso_map_get_type(argument0, k)) { case jso_type_real: s += jso_encode_real(jso_map_get(argument0, k)); break; case jso_type_string: s += jso_encode_string(jso_map_get(argument0, k)); break; case jso_type_map: s += jso_encode_map(jso_map_get(argument0, k)); break; case jso_type_list: s += jso_encode_list(jso_map_get(argument0, k)); break; case jso_type_boolean: s += jso_encode_boolean(jso_map_get(argument0, k)); break; } //Get next key k = ds_map_find_next(argument0, k); } //Done, add braces return "{" + s + "}"; } #define jso_encode_integer { /** jso_encode_integer(int): Return a JSON-encoded version of the integer value . JSOnion version: 1.0.0d */ return string(floor(argument0)); } #define jso_encode_boolean { /** jso_encode_boolean(bool): Return a JSON-encoded version of the boolean value . JSOnion version: 1.0.0d */ if (argument0) { return "true"; } else { return "false"; } } #define jso_decode_map { /** jso_decode_map(json): Return a JSOnion-compatible map representing the JSON string . JSOnion version: 1.0.0d */ return __jso_gmt_elem(_jso_decode_map(argument0, 1), 0); } #define jso_decode_list { /** jso_decode_list(json): Return a JSOnion-compatible list representing the JSON string . JSOnion version: 1.0.0d */ return __jso_gmt_elem(_jso_decode_list(argument0, 1), 0); } #define jso_decode_string { /** jso_decode_string(json): Return a string representing the JSON string . JSOnion version: 1.0.0d */ return __jso_gmt_elem(_jso_decode_string(argument0, 1), 0); } #define jso_decode_boolean { /** jso_decode_boolean(json): Return a boolean value representing the JSON string . JSOnion version: 1.0.0d */ return __jso_gmt_elem(_jso_decode_boolean(argument0, 1), 0); } #define jso_decode_real { /** jso_decode_real(json): Return a real value representing the JSON string . JSOnion version: 1.0.0d */ return __jso_gmt_elem(_jso_decode_real(argument0, 1), 0); } #define jso_decode_integer { /** jso_decode_integer(json): Return an integer value representing the JSON string . JSOnion version: 1.0.0d */ return __jso_gmt_elem(_jso_decode_integer(argument0, 1), 0); } #define _jso_decode_map { /** _jso_decode_map(json, startindex): Extract a map from JSON string starting at position . Return a 2-tuple of the extracted map handle and the position after the ending }. JSOnion version: 1.0.0d */ var i, len, map; i = argument1; len = string_length(argument0); map = jso_new_map(); //Seek to first { var c; c = string_char_at(argument0, i); if (c != "{") { do { i += 1; c = string_char_at(argument0, i); if (!_jso_is_whitespace_char(c)) && (c != "{") { show_error("Cannot parse map at position " + string(i), true); } } until (c == "{") } i += 1; //Read until end of JSON or ending } var found_end, state, found, current_key; found_end = false; state = 0; for (i=i; i<=len && !found_end; i+=1) { c = string_char_at(argument0, i); switch (state) { //0: Looking for a key or closing } case 0: switch (c) { case "}": found_end = true; break; case '"': found = _jso_decode_string(argument0, i); current_key = __jso_gmt_elem(found, 0); i = __jso_gmt_elem(found, 1)-1; state = 1; break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": case "+": case "-": found = _jso_decode_real(argument0, i); current_key = __jso_gmt_elem(found, 0); i = __jso_gmt_elem(found, 1)-1; state = 1; break; default: if (!_jso_is_whitespace_char(c)) { show_error("Unexpected character at position " + string(i) + ".", true); } break; } break; //1: Looking for the : separator case 1: switch (c) { case ":": state = 2; break; default: if (!_jso_is_whitespace_char(c)) { show_error("Unexpected character at position " + string(i) + ".", true); } break; } break; //2: Looking for a value case 2: switch (c) { case "[": found = _jso_decode_list(argument0, i); jso_map_add_sublist(map, current_key, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 3; break; case "{": found = _jso_decode_map(argument0, i); jso_map_add_submap(map, current_key, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 3; break; case '"': found = _jso_decode_string(argument0, i); jso_map_add_string(map, current_key, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 3; break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": case "+": case "-": found = _jso_decode_real(argument0, i); jso_map_add_real(map, current_key, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 3; break; case "t": case "f": found = _jso_decode_boolean(argument0, i); jso_map_add_boolean(map, current_key, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 3; break; default: if (!_jso_is_whitespace_char(c)) { show_error("Unexpected character at position " + string(i) + ".", true); } break; } break; //3: Done looking for an entry, want comma or } case 3: switch (c) { case "}": found_end = true; break; case ",": state = 0; break; default: if (!_jso_is_whitespace_char(c)) { show_error("Unexpected character at position " + string(i) + ".", true); } break; } break; } } //Return extracted map with ending position if the ending } is found if (found_end) { return __jso_gmt_tuple(map, i); } //Ended too early, throw error else { show_error("Unexpected end of map in JSON string.", true); } } #define _jso_decode_list { /** _jso_decode_list(json, startindex): Extract a list from JSON string starting at position . Return a 2-tuple of the extracted list handle and the position after the ending ]. JSOnion version: 1.0.0d */ var i, len, list; i = argument1; len = string_length(argument0); list = jso_new_list(); //Seek to first [ var c; c = string_char_at(argument0, i); if (c != "[") { do { i += 1; c = string_char_at(argument0, i); if (!_jso_is_whitespace_char(c)) && (c != "[") { show_error("Cannot parse list at position " + string(i), true); } } until (c == "[") } i += 1; //Read until end of JSON or ending ] var found_end, state, found; found_end = false; state = 0; for (i=i; i<=len && !found_end; i+=1) { c = string_char_at(argument0, i); switch (state) { //0: Looking for an item case 0: switch (c) { case "]": found_end = true; break; case "[": found = _jso_decode_list(argument0, i); jso_list_add_sublist(list, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 1; break; case "{": found = _jso_decode_map(argument0, i); jso_list_add_submap(list, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 1; break; case '"': found = _jso_decode_string(argument0, i); jso_list_add_string(list, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 1; break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": case "+": case "-": found = _jso_decode_real(argument0, i); jso_list_add_real(list, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 1; break; case "t": case "f": found = _jso_decode_boolean(argument0, i); jso_list_add_boolean(list, __jso_gmt_elem(found, 0)); i = __jso_gmt_elem(found, 1)-1; state = 1; break; default: if (!_jso_is_whitespace_char(c)) { show_error("Unexpected character at position " + string(i) + ".", true); } break; } break; //1: Done looking for an item, want comma or ] case 1: switch (c) { case "]": found_end = true; break; case ",": state = 0; break; default: if (!_jso_is_whitespace_char(c)) { show_error("Unexpected character at position " + string(i) + ".", true); } break; } break; } } //Return extracted list with ending position if the ending ] is found if (found_end) { return __jso_gmt_tuple(list, i); } //Ended too early, throw error else { show_error("Unexpected end of list in JSON string.", true); } } #define _jso_decode_string { /** _jso_decode_string(json, startindex): Extract a string from JSON string starting at position . Return a 2-tuple of the extracted string and the position after the ending double quote. JSOnion version: 1.0.0d */ var i, len, str; i = argument1; len = string_length(argument0); str = ""; //Seek to first double quote var c; c = string_char_at(argument0, i); if (c != '"') { do { i += 1; c = string_char_at(argument0, i); } until (c == '"') } i += 1; //Read until end of JSON or ending double quote var found_end, escape_mode; found_end = false; escape_mode = false; for (i=i; i<=len && !found_end; i+=1) { c = string_char_at(argument0, i); //Escape mode if (escape_mode) { switch (c) { case '"': case "\": case "/": str += c; escape_mode = false; break; case "b": str += chr(8); escape_mode = false; break; case "f": str += chr(12); escape_mode = false; break; case "n": str += chr(10); escape_mode = false; break; case "r": str += chr(13); escape_mode = false; break; case "t": str += chr(9); escape_mode = false; break; case "u": var u; if (len-i < 5) { show_error("Invalid escape character at position " + string(i) + ".", true); } else { str += chr(_jso_hex_to_decimal(string_copy(argument0, i+1, 4))); escape_mode = false; i += 4; } break; default: show_error("Invalid escape character at position " + string(i) + ".", true); break; } } //Regular mode else { switch (c) { case '"': found_end = true; break; case "\": escape_mode = true; break; default: str += c; break; } } } //Return extracted string with ending position if the ending double quote is found if (found_end) { return __jso_gmt_tuple(str, i); } //Ended too early, throw error else { show_error("Unexpected end of string in JSON string.", true); } } #define _jso_decode_boolean { /** _jso_decode_boolean(json, startindex): Extract a boolean from JSON string starting at position . Return a 2-tuple of the extracted boolean and the position after the last e. JSOnion version: 1.0.0d */ var i, len, str; i = argument1; len = string_length(argument0); //Seek to first t or f that can be found var c; c = string_char_at(argument0, i); if (c != "t") && (c != "f") { do { i += 1; c = string_char_at(argument0, i); if (!_jso_is_whitespace_char(c)) && (c != "t") && (c != "f") { show_error("Cannot parse boolean value at position " + string(i), true); } } until (c == "t") || (c == "f") } //Look for true if t is found if (c == "t") && (string_copy(argument0, i, 4) == "true") { return __jso_gmt_tuple(true, i+4); } //Look for false if f is found else if (c == "f") && (string_copy(argument0, i, 5) == "false") { return __jso_gmt_tuple(false, i+5); } //Error: unexpected ending else { show_error("Unexpected end of boolean in JSON string.", true); } } #define _jso_decode_real { /** _jso_decode_real(json, startindex): Extract a real value from JSON string starting at position . Return a 2-tuple of the extracted real value and the position after the real value. JSOnion version: 1.0.0d */ var i, len, str; i = argument1; len = string_length(argument0); str = ""; //Seek to first character: +, -, or 0-9 var c; c = string_char_at(argument0, i); if (string_pos(c, "0123456789+-") == 0) { do { i += 1; c = string_char_at(argument0, i); if (!_jso_is_whitespace_char(c)) && (string_pos(c, "0123456789+-") == 0) { show_error("Cannot parse real value at position " + string(i), true); } } until (string_pos(c, "0123456789+-") > 0) } //Determine starting state var state; switch (c) { case "+": case "-": state = 0; break; default: state = 1; break; } str += c; i += 1; //Loop until no more digits found var done; done = false; for (i=i; i<=len && !done; i+=1) { c = string_char_at(argument0, i); switch (state) { //0: Found a sign, looking for a starting number case 0: switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; state = 1; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a digit.", true); break; } break; //1: Found a starting digit, looking for decimal dot, e, E, or more digits case 1: if (_jso_is_whitespace_char(c)) || (string_pos(c, ":,]}") > 0) { done = true; i -= 1; } else { switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; break; case ".": str += c; state = 2; break; case "e": case "E": str += c; state = 3; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a dot, e, E or a digit.", true); break; } } break; //2: Found a decimal dot, looking for more digits case 2: switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; state = -2; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a digit.", true); break; } break; //-2: Found a decimal dot and a digit after it, looking for more digits, e, or E case -2: if (_jso_is_whitespace_char(c)) || (string_pos(c, ":,]}") > 0) { done = true; i -= 1; } else { switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; break; case "e": case "E": str += c; state = 3; break; default: show_error("Unexpected character at position " + string(i) + ", expecting an e, E or a digit.", true); break; } } break; //3: Found an e/E, looking for +, - or more digits case 3: switch (c) { case "+": case "-": str += c; state = 4; break; case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; state = 5; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a +, - or a digit.", true); break; } break; //4: Found an e/E exponent sign, looking for more digits case 4: switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; state = 5; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a digit.", true); break; } break; //5: Looking for final digits of the exponent case 5: if (_jso_is_whitespace_char(c)) || (string_pos(c, ":,]}") > 0) { done = true; i -= 1; } else { switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; state = 5; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a digit.", true); break; } } break; } } //Am I still expecting more characters? if (done) || (state == 1) || (state == -2) || (state == 5) { return __jso_gmt_tuple(real(str), i); } //Error: unexpected ending else { show_error("Unexpected end of real in JSON string.", true); } } #define _jso_decode_integer { /** _jso_decode_real(json, startindex): Extract a real value from JSON string starting at position . Return a 2-tuple of the extracted integer value (with leading i) and the position after the real value. JSOnion version: 1.0.0d */ var i, len, str; i = argument1; len = string_length(argument0); str = ""; //Seek to first character: +, -, or 0-9 var c; c = string_char_at(argument0, i); if (string_pos(c, "0123456789+-") == 0) { do { i += 1; c = string_char_at(argument0, i); if (!_jso_is_whitespace_char(c)) && (string_pos(c, "0123456789+-") == 0) { show_error("Cannot parse integer value at position " + string(i), true); } } until (string_pos(c, "0123456789+-") > 0) } //Determine starting state var state; switch (c) { case "+": case "-": state = 0; break; default: state = 1; break; } str += c; i += 1; //Loop until no more digits found var done; done = false; for (i=i; i<=len && !done; i+=1) { c = string_char_at(argument0, i); switch (state) { //0: Found a sign, looking for a starting number case 0: switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; state = 1; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a digit.", true); break; } break; //1: Found a starting digit, looking for decimal dot, e, E, or more digits case 1: if (_jso_is_whitespace_char(c)) || (string_pos(c, ":,]}") > 0) { done = true; i -= 1; } else { switch (c) { case "0": case "1": case "2": case "3": case "4": case "5": case "6": case "7": case "8": case "9": str += c; break; default: show_error("Unexpected character at position " + string(i) + ", expecting a digit.", true); break; } } break; } } //Am I still expecting more characters? if (done) || (state == 1) { return __jso_gmt_tuple(floor(real(str)), i); } //Error: unexpected ending else { show_error("Unexpected end of integer in JSON string.", true); } } #define jso_compare_maps { /** jso_compare_maps(map1, map2): Return whether the contents of JSOnion-compatible maps and are the same. JSOnion version: 1.0.0d */ //If they aren't the same size, they can't be the same var size; size = ds_map_size(argument0); if (size != ds_map_size(argument1)) { return false; } //Compare contents pairwise var i, k, type, a, b; k = ds_map_find_first(argument0); for (i=0; i and are the same. JSOnion version: 1.0.0d */ //If they aren't the same size, they can't be the same var size; size = ds_list_size(argument0); if (size != ds_list_size(argument1)) { return false; } //Compare contents pairwise var i, type, a, b; for (i=0; i, return whether a value exists there. JSOnion version: 1.0.0d */ //Catch empty calls if (argument_count < 2) { show_error("Expected at least 2 arguments, got " + string(argument_count) + ".", true); } //Build list of keys/indices var i, key_list; key_list = ds_list_create(); for (i=1; i, return whether a value exists there. JSOnion version: 1.0.0d */ //Catch empty calls if (argument_count < 2) { show_error("Expected at least 2 arguments, got " + string(argument_count) + ".", true); } //Build list of keys/indices var i, key_list; key_list = ds_list_create(); for (i=1; i, return the value that exists there. JSOnion version: 1.0.0d */ //Catch empty calls if (argument_count < 2) { show_error("Expected at least 2 arguments, got " + string(argument_count) + ".", true); } //Build list of keys/indices var i, key_list; key_list = ds_list_create(); for (i=1; i, return the type of value that exists there. JSOnion version: 1.0.0d */ //Catch empty calls if (argument_count < 2) { show_error("Expected at least 2 arguments, got " + string(argument_count) + ".", true); } //Build list of keys/indices var i, key_list; key_list = ds_list_create(); for (i=1; i, return the value that exists there. JSOnion version: 1.0.0d */ //Catch empty calls if (argument_count < 2) { show_error("Expected at least 2 arguments, got " + string(argument_count) + ".", true); } //Build list of keys/indices var i, key_list; key_list = ds_list_create(); for (i=1; i, return the type of value that exists there. JSOnion version: 1.0.0d */ //Catch empty calls if (argument_count < 2) { show_error("Expected at least 2 arguments, got " + string(argument_count) + ".", true); } //Build list of keys/indices var i, key_list; key_list = ds_list_create(); for (i=1; i= ds_list_size(data)) { switch (task_type) { case 0: return false; break; default: show_error("Index overflow for nested lists in " + type_string + " lookup.", true); break; } } type = jso_list_get_type(data, k); data = jso_list_get(data, k); break; //Trying to go through a leaf; don't attempt to look further default: switch (task_type) { case 0: return false; break; default: show_error("Recursive overflow in " + type_string + " lookup.", true); break; } break; } } //Can find something, return the value requested by the task switch (task_type) { case 0: return true; break; case 1: return data; break; case 2: return type; break; } } #define _jso_is_whitespace_char { /** _jso_is_whitespace_char(char): Return whether is a whitespace character. Definition of whitespace is given by Unicode 6.0, Chapter 4.6. JSOnion version: 1.0.0d */ switch (ord(argument0)) { case $0009: case $000A: case $000B: case $000C: case $000D: case $0020: case $0085: case $00A0: case $1680: case $180E: case $2000: case $2001: case $2002: case $2003: case $2004: case $2005: case $2006: case $2007: case $2008: case $2009: case $200A: case $2028: case $2029: case $202F: case $205F: case $3000: return true; } return false; } #define _jso_hex_to_decimal { /** _jso_hex_to_decimal(hex_string): Return the decimal value of the hex number represented by JSOnion version: 1.0.0d */ var hex_string, hex_digits; hex_string = string_lower(argument0); hex_digits = "0123456789abcdef"; //Convert digit-by-digit var i, len, digit_value, num; len = string_length(hex_string); num = 0; for (i=1; i<=len; i+=1) { digit_value = string_pos(string_char_at(hex_string, i), hex_digits)-1; if (digit_value >= 0) { num *= 16; num += digit_value; } //Unknown character else { show_error("Invalid hex number: " + argument0, true); } } return num; } ================================================ FILE: samples/Game Maker Language/jsonion_test.gml ================================================ // Originally from /jsonion_test.gml in JSOnion // JSOnion v1.0.0d is licensed under the MIT licence. You may freely adapt and use this library in commercial and non-commercial projects. #define assert_true { /** assert_true(result, errormsg): Display error unless is true. */ if (!argument0) { _assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + "Expected true, got false."); } } #define assert_false { /** assert_false(result, errormsg): Display error unless is false. */ if (argument0) { _assert_error_popup(argument1 + string_repeat(_assert_newline(), 2) + "Expected false, got true."); } } #define assert_equal { /** assert_equal(expected, result, errormsg): Display error unless and are equal. */ //Safe equality check; won't crash even if the two are different types var match; match = is_string(argument0) == is_string(argument1); if (match) { match = argument0 == argument1; } //No match? if (!match) { //Data types var type; type[0] = "(Real)"; type[1] = "(String)"; //Construct message var msg; msg = argument2; //Add expected value msg += string_repeat(_assert_newline(), 2); msg += "Expected " + type[is_string(argument0)] + ":" + _assert_newline(); msg += _assert_debug_value(argument0); //Add actual value msg += string_repeat(_assert_newline(), 2); msg += "Actual " + type[is_string(argument1)] + ":" + _assert_newline(); msg += _assert_debug_value(argument1); //Display message _assert_error_popup(msg); } } #define _assert_error_popup { /** _assert_error_popup(msg): Display an assertion error. */ //Display message if (os_browser == browser_not_a_browser) { show_error(argument0, false); //Full-fledged error message for non-browser environments } else { show_message(argument0); //Browsers don't support show_error(), use show_message() instead } } #define _assert_debug_value { /** _assert_debug_value(val): Returns a low-level debug value for the value . can be a string or a real value. */ //String if (is_string(argument0)) { if (os_browser == browser_not_a_browser) { return argument0; } else { return string_replace_all(argument0, "#", "\#"); } } //Numeric --- use GMTuple's algorithm else { //Integers if (frac(argument0) == 0) { return string(argument0); } //Decimal numbers; get exponent and mantissa var mantissa, exponent; exponent = floor(log10(abs(argument0))); mantissa = string_format(argument0/power(10,exponent), 15, 14); //Look for trailing zeros in the mantissa var i, ca; i = string_length(mantissa); do { ca = string_char_at(mantissa, i); i -= 1; } until (ca != "0") //Remove the dot if only the first digit of the normalized mantissa is nonzero if (ca != ".") { mantissa = string_copy(mantissa, 1, i+1); } else { mantissa = string_copy(mantissa, 1, i); } //Remove the exponent if it is 0 if (exponent != 0) { return mantissa + "e" + string(exponent); } else { return mantissa; } //GMTuple algorithm done } } #define _assert_newline { /** _assert_newline(): Returns a system-appropriate newline character sequence. */ if (os_browser == browser_not_a_browser) { return chr(13) + chr(10); } else { return "#"; } } #define jso_test_all { /** jso_test_all(): Run the test suite for the JSOnion library. JSOnion version: 1.0.0d */ var a, b; a = current_time; _test_jso_new(); _test_jso_map_add(); _test_jso_list_add(); _test_jso_encode(); _test_jso_compare(); _test_jso_decode(); _test_jso_lookup(); _test_jso_bugs(); __jso_gmt_test_all(); b = current_time; show_debug_message("JSOnion: Tests completed in " + string(b-a) + "ms."); } #define _test_jso_new { /** _test_jso_new(): Test jso_new_*() functions. JSOnion version: 1.0.0d */ var expected, actual; //jso_new_map() actual = jso_new_map(); assert_true(actual >= 0, "jso_new_map() failed to create a new map."); ds_map_destroy(actual); //jso_new_list() actual = jso_new_list(); assert_true(actual >= 0, "jso_new_list() failed to create a new list."); ds_list_destroy(actual); } #define _test_jso_map_add { /** _test_jso_map_add(): Test jso_map_add_*() functions. JSOnion version: 1.0.0d */ var expected, actual, key, map; map = jso_new_map(); //jso_map_add_real() expected = pi; key = "pi"; jso_map_add_real(map, key, expected); actual = jso_map_get(map, key); assert_true(ds_map_exists(map, key), "jso_map_add_real() failed to add the number."); assert_equal(expected, actual, "jso_map_add_real() added the wrong number."); ds_map_delete(map, key); //jso_map_add_string() expected = "waahoo"; key = "str"; jso_map_add_string(map, key, expected); actual = jso_map_get(map, key); assert_true(ds_map_exists(map, key), "jso_map_add_string() failed to add the string."); assert_equal(expected, actual, "jso_map_add_string() added the wrong string."); ds_map_delete(map, key); //jso_map_add_sublist() expected = jso_new_list(); key = "sublist"; jso_map_add_sublist(map, key, expected); actual = jso_map_get(map, key); assert_true(ds_map_exists(map, key), "jso_map_add_sublist() failed to add the new sublist."); assert_equal(expected, actual, "jso_map_add_sublist() added the wrong sublist."); ds_map_delete(map, key); ds_list_destroy(expected); //jso_map_add_submap() expected = jso_new_map(); key = "sublist"; jso_map_add_sublist(map, key, expected); actual = jso_map_get(map, key); assert_true(ds_map_exists(map, key), "jso_map_add_submap() failed to add the new submap."); assert_equal(expected, actual, "jso_map_add_submap() added the wrong submap."); ds_map_delete(map, key); ds_map_destroy(expected); //jso_map_add_integer() expected = 2345; key = "integer"; jso_map_add_integer(map, key, expected); actual = jso_map_get(map, key); assert_true(ds_map_exists(map, key), "jso_map_add_integer() failed to add the new integer."); assert_equal(expected, actual, "jso_map_add_integer() added the wrong integer."); ds_map_delete(map, key); //jso_map_add_boolean() --- true expected = true; key = "booleantrue"; jso_map_add_boolean(map, key, expected); actual = jso_map_get(map, key); assert_true(ds_map_exists(map, key), "jso_map_add_boolean() failed to add true."); assert_true(actual, "jso_map_add_boolean() added the wrong true."); ds_map_delete(map, key); //jso_map_add_boolean() --- false expected = false; key = "booleanfalse"; jso_map_add_boolean(map, key, expected); actual = jso_map_get(map, key) assert_true(ds_map_exists(map, key), "jso_map_add_boolean() failed to add false."); assert_false(actual, "jso_map_add_boolean() added the wrong false."); ds_map_delete(map, key); //Cleanup ds_map_destroy(map); } #define _test_jso_list_add { /** _test_jso_list_add(): Test jso_list_add_*() functions. JSOnion version: 1.0.0d */ var expected, actual, list; list = jso_new_list(); //jso_list_add_real() expected = pi; jso_list_add_real(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_real() failed to add the number."); assert_equal(expected, actual, "jso_list_add_real() added the wrong number."); ds_list_clear(list); //jso_list_add_string() expected = "waahoo"; jso_list_add_string(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_string() failed to add the string."); assert_equal(expected, actual, "jso_list_add_string() added the wrong string."); ds_list_clear(list); //jso_list_add_sublist() expected = jso_new_list(); jso_list_add_sublist(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_sublist() failed to add the sublist."); assert_equal(expected, actual, "jso_list_add_sublist() added the wrong sublist."); ds_list_clear(list); ds_list_destroy(expected); //jso_list_add_submap() expected = jso_new_map(); jso_list_add_submap(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_submap() failed to add the submap."); assert_equal(expected, actual, "jso_list_add_submap() added the wrong submap."); ds_list_clear(list); ds_map_destroy(expected); //jso_list_add_integer() expected = 2345; jso_list_add_integer(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_integer() failed to add integer."); assert_equal(expected, actual, "jso_list_add_integer() added the wrong integer."); ds_list_clear(list); //jso_list_add_boolean() --- true expected = true; jso_list_add_boolean(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_boolean() failed to add boolean true."); assert_true(actual, "jso_list_add_boolean() added the wrong boolean true."); ds_list_clear(list); //jso_list_add_boolean() --- false expected = false; jso_list_add_boolean(list, expected); actual = jso_list_get(list, 0); assert_false(ds_list_empty(list), "jso_list_add_boolean() failed to add boolean false."); assert_false(actual, "jso_list_add_boolean() added the wrong boolean false."); ds_list_clear(list); //Cleanup ds_list_destroy(list); } #define _test_jso_encode { /** _test_jso_encode(): Tests jso_encode_*() functions. JSOnion version: 1.0.0d */ var original, expected, actual; //jso_encode_real() --- Positive expected = 3.1415; actual = jso_encode_real(3.1415); assert_equal(expected, real(actual), "jso_encode_real() failed to encode positive real!"); //jso_encode_real() --- Negative expected = -2.71828; actual = jso_encode_real(-2.71828); assert_equal(expected, real(actual), "jso_encode_real() failed to encode negative real!"); //jso_encode_real() --- Zero expected = 0; actual = jso_encode_integer(0); assert_equal(expected, real(actual), "jso_encode_real() failed to encode zero!"); //jso_encode_integer() --- Positive expected = "2345"; actual = jso_encode_integer(2345); assert_equal(expected, actual, "jso_encode_integer() failed to encode positive integer!"); //jso_encode_integer() --- Negative expected = "-45"; actual = jso_encode_integer(-45); assert_equal(expected, actual, "jso_encode_integer() failed to encode negative integer!"); //jso_encode_integer() --- Zero expected = "0"; actual = jso_encode_integer(0); assert_equal(expected, actual, "jso_encode_integer() failed to encode zero!"); //jso_encode_boolean() --- true expected = "true"; actual = jso_encode_boolean(true); assert_equal(expected, actual, "jso_encode_boolean() failed to encode true!"); //jso_encode_boolean() --- false expected = "false"; actual = jso_encode_boolean(false); assert_equal(expected, actual, "jso_encode_boolean() failed to encode false!"); //jso_encode_string() --- Simple string expected = '"waahoo"'; actual = jso_encode_string("waahoo"); assert_equal(expected, actual, "jso_encode_string() failed to encode simple string!"); //jso_encode_string() --- Empty string expected = '""'; actual = jso_encode_string(""); assert_equal(expected, actual, "jso_encode_string() failed to encode empty string!"); //jso_encode_string() --- Basic escape characters expected = '"\\\"\b\f\n\r\t"'; actual = jso_encode_string('\"' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9)); assert_equal(expected, actual, "jso_encode_string() failed to encode escape character string!"); //jso_encode_map() --- Empty map var empty_map; empty_map = jso_new_map(); expected = "{}"; actual = jso_encode_map(empty_map); assert_equal(expected, actual, "jso_encode_map() failed to encode empty map!"); jso_cleanup_map(empty_map); //jso_encode_map() --- One-element map var one_map; one_map = jso_new_map(); jso_map_add_string(one_map, "key", "value"); expected = '{"key":"value"}'; actual = jso_encode_map(one_map); assert_equal(expected, actual, "jso_encode_map() failed to encode one-element map!"); jso_cleanup_map(one_map); //jso_encode_map() --- Multi-element map var multi_map, ok1, ok2; multi_map = jso_new_map(); jso_map_add_string(multi_map, "key1", "value\1"); jso_map_add_integer(multi_map, "key2", 2); ok1 = '{"key1":"value\\1","key2":2}'; ok2 = '{"key2":2,"key1":"value\\1"}'; actual = jso_encode_map(multi_map); assert_true((actual == ok1) || (actual == ok2), "jso_encode_map() failed to encode multi-element map!"); jso_cleanup_map(multi_map); //jso_encode_list() --- Empty list var empty_list; empty_list = jso_new_list(); expected = "[]"; actual = jso_encode_list(empty_list); assert_equal(expected, actual, "jso_encode_list() failed to encode empty list!"); jso_cleanup_list(empty_list); //jso_encode_list() --- One-element nested list var one_list; one_list = jso_new_list(); jso_list_add_submap(one_list, jso_new_map()); expected = "[{}]"; actual = jso_encode_list(one_list); assert_equal(expected, actual, "jso_encode_list() failed to encode one-element nested list!"); jso_cleanup_list(one_list); //jso_encode_list() --- Multi-element nested list var multi_list, submap, sublist; multi_list = jso_new_list(); submap = jso_new_map(); jso_map_add_string(submap, "1", "one"); jso_list_add_submap(multi_list, submap); jso_list_add_integer(multi_list, 2); sublist = jso_new_list(); jso_list_add_string(sublist, "three"); jso_list_add_boolean(sublist, true); jso_list_add_sublist(multi_list, sublist); expected = '[{"1":"one"},2,["three",true]]'; actual = jso_encode_list(multi_list); assert_equal(expected, actual, "jso_encode_list() failed to encode one-element nested list!"); jso_cleanup_list(multi_list); } #define _test_jso_decode { /** _test_jso_decode(): Test core _jso_decode_*() functions. The formatting is intentionally erratic here to simulate actual formatting deviations. JSOnion version: 1.0.0d */ var json, expected, actual, expected_structure, actual_structure; ////Primitives //_jso_decode_string(): Empty string json = '""'; expected = __jso_gmt_tuple("", 3); actual = _jso_decode_string(json, 1); assert_equal(expected, actual, "_jso_decode_string() failed to decode an empty string!"); //_jso_decode_string(): Small string json = '"key" '; expected = __jso_gmt_tuple("key", 6); actual = _jso_decode_string(json, 1); assert_equal(expected, actual, "_jso_decode_string() failed to decode a small string!"); //_jso_decode_string(): Simple string json = ' "The quick brown fox jumps over the lazy dog." '; expected = __jso_gmt_tuple("The quick brown fox jumps over the lazy dog.", 49); actual = _jso_decode_string(json, 1); assert_equal(expected, actual, "_jso_decode_string() failed to decode a simple string!"); //_jso_decode_string(): Escape characters json = ' "\"\\\b\f\n\r\t\u003A"'; expected = __jso_gmt_tuple('"\' + chr(8) + chr(12) + chr(10) + chr(13) + chr(9) + chr($003a), 24); actual = _jso_decode_string(json, 1); assert_equal(expected, actual, "_jso_decode_string() failed to decode a string with escape characters!"); //_jso_decode_string(): Mixed characters json = ' "\"\\\bWaahoo\f\n\r\tnegg\u003a"'; expected = __jso_gmt_tuple('"\' + chr(8) + "Waahoo" + chr(12) + chr(10) + chr(13) + chr(9) + "negg" + chr($003a), 34); actual = _jso_decode_string(json, 1); assert_equal(expected, actual, "_jso_decode_string() failed to decode a string with mixed characters!"); //_jso_decode_boolean(): True json = 'true'; expected = __jso_gmt_tuple(true, 5); actual = _jso_decode_boolean(json, 1); assert_equal(expected, actual, "_jso_decode_boolean() failed to decode true!"); //_jso_decode_boolean(): False json = ' false '; expected = __jso_gmt_tuple(false, 8); actual = _jso_decode_boolean(json, 1); assert_equal(expected, actual, "_jso_decode_boolean() failed to decode false!"); //_jso_decode_real(): Zero json = '0'; expected = __jso_gmt_tuple(0, 2); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode standard zero!"); //_jso_decode_real(): Signed zero json = ' +0 '; expected = __jso_gmt_tuple(0, 5); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode signed zero!"); //_jso_decode_real(): Signed zero with decimal digits json = ' -0.000'; expected = __jso_gmt_tuple(0, 8); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode signed zero with decimal digits!"); //_jso_decode_real(): Positive real json = '3.14159'; expected = __jso_gmt_tuple(3.14159, 8); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode positive real number!"); //_jso_decode_real(): Negative real json = ' -2.71828'; expected = __jso_gmt_tuple(-2.71828, 10); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode negative real number!"); //_jso_decode_real(): Positive real with positive exponent json = ' 3.14159e2'; expected = __jso_gmt_tuple(3.14159*100, 11); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode positive real number with positive exponent!"); //_jso_decode_real(): Negative real with positive exponent json = ' -2.71828E2'; expected = __jso_gmt_tuple(-2.71828*100, 12); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode negative real number with positive exponent!"); //_jso_decode_real(): Positive real with negative exponent json = ' 314.159e-2'; expected = __jso_gmt_tuple(3.14159, 12); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode positive real number with negative exponent!"); //_jso_decode_real(): Negative real with negative exponent json = ' -271.828E-2'; expected = __jso_gmt_tuple(-2.71828, 13); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode negative real number with negative exponent!"); //_jso_decode_real(): Positive integer json = ' +1729'; expected = __jso_gmt_tuple(1729, 7); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode positive integer!"); //_jso_decode_real(): Negative integer json = '-583'; expected = __jso_gmt_tuple(-583, 5); actual = _jso_decode_real(json, 1); assert_equal(expected, actual, "_jso_decode_real() failed to decode negative integer!"); //_jso_decode_integer(): Zero json = ' 0 '; expected = __jso_gmt_tuple(0, 3); actual = _jso_decode_integer(json, 1); assert_equal(expected, actual, "_jso_decode_integer() failed to decode zero!"); //_jso_decode_integer(): Positive integer json = ' 1729 '; expected = __jso_gmt_tuple(1729, 6); actual = _jso_decode_integer(json, 1); assert_equal(expected, actual, "_jso_decode_integer() failed to decode positive integer!"); //_jso_decode_integer(): Negative integer json = ' -583'; expected = __jso_gmt_tuple(-583, 8); actual = _jso_decode_integer(json, 1); assert_equal(expected, actual, "_jso_decode_integer() failed to decode negative integer!"); ////Data structures //_jso_decode_map(): Empty map #1 json = '{}'; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 3); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (#1)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (#1)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode an empty map! (#1)"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_map(): Empty map #2 json = ' { } '; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 7); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (#2)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (#2)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode an empty map! (#2)"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_map(): One-entry map json = ' {"key": "value"} '; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 18); jso_map_add_string(expected_structure, "key", "value"); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (one-entry map)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (one-entry map)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a one-entry map!"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_map(): Multi-entry map json = ' {"key" : "value", "pi":3.14, "bool" : true} '; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 48); jso_map_add_string(expected_structure, "key", "value"); jso_map_add_real(expected_structure, "pi", 3.14); jso_map_add_boolean(expected_structure, "bool", true); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (multi-entry map)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (multi-entry map)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a multi-entry map!"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_map(): Nested maps var submap; json = '{ "waahoo" : { "woohah" : 3 } , "woohah" : 4 }'; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 47); jso_map_add_integer(expected_structure, "woohah", 4); submap = jso_new_map(); jso_map_add_integer(submap, "woohah", 3); jso_map_add_submap(expected_structure, "waahoo", submap); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (nested map)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (nested map)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a nested map!"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_map(): Map with nested lists var sublist, subsublist; json = '{ "waahoo" : [ "woohah", [true] ] , "woohah" : 4 }'; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 51); jso_map_add_real(expected_structure, "woohah", 4); sublist = jso_new_list(); jso_list_add_string(sublist, "woohah"); subsublist = jso_new_list(); jso_list_add_boolean(subsublist, true); jso_list_add_sublist(sublist, subsublist); jso_map_add_sublist(expected_structure, "waahoo", sublist); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (map with nested lists)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (map with nested lists)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a map with nested lists!"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_map(): Mix-up nested map var sublist; json = ' { "waahoo" : [{}, "a", 1] }'; expected_structure = jso_new_map(); expected = __jso_gmt_tuple(expected_structure, 30); sublist = jso_new_list(); jso_list_add_submap(sublist, jso_new_map()); jso_list_add_string(sublist, "a"); jso_list_add_real(sublist, 1); jso_map_add_sublist(expected_structure, "waahoo", sublist); actual = _jso_decode_map(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_map() didn't stop at the right place! (mix-up nested map)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_map() didn't include the right prefix! (mix-up nested map)"); assert_true(jso_compare_maps(expected_structure, actual_structure), "_jso_decode_map() failed to decode a mix-up nested map!"); jso_cleanup_map(expected_structure); jso_cleanup_map(actual_structure); //_jso_decode_list(): Empty list #1 json = '[]'; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 3); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (#1)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (#1)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode an empty list! (#1)"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure) //_jso_decode_list(): Empty list #2 json = ' [ ] '; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 6); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (#2)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (#2)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode an empty list! (#2)"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure); //_jso_decode_list(): One-entry list json = '[3]'; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 4); jso_list_add_integer(expected_structure, 3); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (one-entry list)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (one-entry list)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a one-entry list!"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure); //_jso_decode_list(): Multi-entry list json = ' [4,"multi-entry",true]'; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 24); jso_list_add_real(expected_structure, 4); jso_list_add_string(expected_structure, "multi-entry"); jso_list_add_boolean(expected_structure, true); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (multi-entry list)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (multi-entry list)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a multi-entry list!"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure); //_jso_decode_list(): Nested list var sublist; json = ' [ [], 3, false, ["waahoo"]]'; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 29); jso_list_add_sublist(expected_structure, jso_new_list()); jso_list_add_integer(expected_structure, 3); jso_list_add_boolean(expected_structure, false); sublist = jso_new_list(); jso_list_add_string(sublist, "waahoo"); jso_list_add_sublist(expected_structure, sublist); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (nested list)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (nested list)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a nested list!"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure); //_jso_decode_list(): List with nested maps var submap; json = ' [3, false, { "waahoo":"woo"}]'; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 31); jso_list_add_integer(expected_structure, 3); jso_list_add_boolean(expected_structure, false); submap = jso_new_map(); jso_map_add_string(submap, "waahoo", "woo"); jso_list_add_submap(expected_structure, submap); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (list with nested maps)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (list with nested maps)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a list with nested maps!"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure); //_jso_decode_list(): Mix-up nested list var submap; json = '[{}, {"a":[]}]'; expected_structure = jso_new_list(); expected = __jso_gmt_tuple(expected_structure, 15); jso_list_add_submap(expected_structure, jso_new_map()); submap = jso_new_map(); jso_map_add_sublist(submap, "a", jso_new_list()); jso_list_add_submap(expected_structure, submap); actual = _jso_decode_list(json, 1); actual_structure = __jso_gmt_elem(actual, 0); assert_equal(__jso_gmt_elem(expected, 1), __jso_gmt_elem(actual, 1), "_jso_decode_list() didn't stop at the right place! (mix-up nested list)"); assert_equal(actual_structure, __jso_gmt_elem(actual, 0), "_jso_decode_list() didn't include the right prefix! (mix-up nested list)"); assert_true(jso_compare_lists(expected_structure, actual_structure), "_jso_decode_list() failed to decode a mix-up nested list!"); jso_cleanup_list(expected_structure); jso_cleanup_list(actual_structure); } #define _test_jso_compare { /** _test_jso_compare(): Test basic jso_compare_*() functions. JSOnion version: 1.0.0d */ var a, b; //jso_compare_maps(): Empty maps should equal each other a = jso_new_map(); b = jso_new_map(); assert_true(jso_compare_maps(a, b), "Empty maps should equal each other. (#1)"); assert_true(jso_compare_maps(b, a), "Empty maps should equal each other. (#2)"); jso_cleanup_map(a); jso_cleanup_map(b); //jso_compare_maps(): An empty map should not equal a filled map a = jso_new_map(); b = jso_new_map(); jso_map_add_string(b, "junk", "info"); jso_map_add_integer(b, "taxi", 1729); assert_false(jso_compare_maps(a, b), "An empty map should not equal a filled map. (#1)"); assert_false(jso_compare_maps(b, a), "An empty map should not equal a filled map. (#2)"); jso_cleanup_map(a); jso_cleanup_map(b); //jso_compare_maps(): Maps with same content entered in different orders should equal each other a = jso_new_map(); b = jso_new_map(); jso_map_add_real(a, "A", 1); jso_map_add_real(a, "B", 2); jso_map_add_real(a, "C", 3); jso_map_add_real(b, "C", 3); jso_map_add_real(b, "A", 1); jso_map_add_real(b, "B", 2); assert_true(jso_compare_maps(a, b), "Maps with same content entered in different orders should equal each other. (#1)"); assert_true(jso_compare_maps(b, a), "Maps with same content entered in different orders should equal each other. (#2)"); jso_cleanup_map(a); jso_cleanup_map(b); //jso_compare_maps(): Maps with different keys should not equal each other a = jso_new_map(); b = jso_new_map(); jso_map_add_real(a, "A", 1); jso_map_add_real(a, "B", 2); jso_map_add_real(a, "C", 3); jso_map_add_real(b, "D", 3); jso_map_add_real(b, "A", 1); jso_map_add_real(b, "B", 2); assert_false(jso_compare_maps(a, b), "Maps with different keys should not equal each other. (#1)"); assert_false(jso_compare_maps(b, a), "Maps with different keys should not equal each other. (#2)"); jso_cleanup_map(a); jso_cleanup_map(b); //jso_compare_maps(): Maps with different values should not equal each other a = jso_new_map(); b = jso_new_map(); jso_map_add_real(a, "A", 5); jso_map_add_real(a, "B", 6); jso_map_add_real(a, "C", 9); jso_map_add_real(b, "A", 5); jso_map_add_real(b, "B", 6); jso_map_add_real(b, "C", 8); assert_false(jso_compare_maps(a, b), "Maps with different values should not equal each other. (#1)"); assert_false(jso_compare_maps(b, a), "Maps with different values should not equal each other. (#2)"); jso_cleanup_map(a); jso_cleanup_map(b); //jso_compare_maps(): Maps with corresponding values of different types should not equal each other, and should not crash. a = jso_new_map(); b = jso_new_map(); jso_map_add_real(a, "A", 5); jso_map_add_real(a, "B", 6); jso_map_add_real(a, "C", 8); jso_map_add_real(b, "A", 5); jso_map_add_string(b, "B", "six"); jso_map_add_real(b, "C", 8); assert_false(jso_compare_maps(a, b), "Maps with corresponding values of different types should not equal each other, and should not crash. (#1)"); assert_false(jso_compare_maps(b, a), "Maps with corresponding values of different types should not equal each other, and should not crash. (#2)"); jso_cleanup_map(a); jso_cleanup_map(b); //jso_compare_lists(): Empty lists should equal each other a = jso_new_list(); b = jso_new_list(); assert_true(jso_compare_lists(a, b), "Empty lists should equal each other. (#1)"); assert_true(jso_compare_lists(b, a), "Empty lists should equal each other. (#2)"); jso_cleanup_list(a); jso_cleanup_list(b); //jso_compare_lists(): An empty list should not equal a filled list a = jso_new_list(); b = jso_new_list(); jso_list_add_string(b, "junk"); jso_list_add_integer(b, 1729); assert_false(jso_compare_lists(a, b), "An empty list should not equal a filled list. (#1)"); assert_false(jso_compare_lists(b, a), "An empty list should not equal a filled list. (#2)"); jso_cleanup_list(a); jso_cleanup_list(b); //jso_compare_lists(): Lists with same content entered in different orders should not equal each other a = jso_new_list(); b = jso_new_list(); jso_list_add_real(a, 1); jso_list_add_real(a, 2); jso_list_add_real(a, 3); jso_list_add_real(b, 3); jso_list_add_real(b, 1); jso_list_add_real(b, 2); assert_false(jso_compare_lists(a, b), "Lists with same content entered in different orders should not equal each other. (#1)"); assert_false(jso_compare_lists(b, a), "Lists with same content entered in different orders should not equal each other. (#2)"); jso_cleanup_list(a); jso_cleanup_list(b); //jso_compare_lists(): Lists with corresponding entries of different types should not equal each other, should also not crash. a = jso_new_list(); b = jso_new_list(); jso_list_add_real(a, 1); jso_list_add_real(a, 2); jso_list_add_real(a, 3); jso_list_add_real(b, 1); jso_list_add_string(b, "two"); jso_list_add_real(b, 3); assert_false(jso_compare_lists(a, b), "Lists with corresponding entries of different types should not equal each other, should also not crash. (#1)"); assert_false(jso_compare_lists(b, a), "Lists with corresponding entries of different types should not equal each other, should also not crash. (#2)"); jso_cleanup_list(a); jso_cleanup_list(b); } #define _test_jso_lookup { /** _test_jso_lookup(): Test core jso_*_lookup() and jso_*_check() functions for nested structures. JSOnion version: 1.0.0d */ var json, structure, expected, actual; //jso_map_check(): Single argument --- exists json = '{ "one" : 1, "two" : 2, "three" : 3 }'; structure = jso_decode_map(json); assert_true(jso_map_check(structure, "one"), "jso_map_check() failed to find existing entry! (single argument)"); jso_cleanup_map(structure); //jso_map_lookup(): Single argument --- exists json = '{ "one" : 1, "two" : 2, "three" : 3 }'; structure = jso_decode_map(json); expected = 1; actual = jso_map_lookup(structure, "one") assert_equal(expected, actual, "jso_map_lookup() found the wrong entry! (single argument)"); jso_cleanup_map(structure); //jso_map_lookup_type(): Single argument --- exists json = '{ "one" : -1, "two" : true, "three" : "trap" }'; structure = jso_decode_map(json); expected = jso_type_real; actual = jso_map_lookup_type(structure, "one") assert_equal(expected, actual, "jso_map_lookup_type() found the wrong type! (single argument)"); jso_cleanup_map(structure); //jso_map_check(): Single argument --- doesn't exist json = '{ "one" : 1, "two" : 2, "three" : 3 }'; structure = jso_decode_map(json); assert_false(jso_map_check(structure, "four"), "jso_map_check() found an inexistent entry! (single argument)"); jso_cleanup_map(structure); //jso_map_check(): Single argument --- doesn't exist json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }'; structure = jso_decode_map(json); assert_false(jso_map_check(structure, "A"), "jso_map_check() found an inexistent entry! (single argument, nested)"); jso_cleanup_map(structure); //jso_map_check(): Multiple arguments (recurse) --- exists json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }'; structure = jso_decode_map(json); assert_true(jso_map_check(structure, "four", "A"), "jso_map_check() failed to find existing entry! (multiple arguments)"); jso_cleanup_map(structure); //jso_map_lookup(): Multiple arguments (recurse) --- exists json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }'; structure = jso_decode_map(json); expected = true; actual = jso_map_lookup(structure, "four", "A"); assert_equal(expected, actual, "jso_map_lookup() found the wrong entry! (multiple arguments)"); jso_cleanup_map(structure); //jso_map_lookup_type(): Multiple arguments (recurse) --- exists json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":"trap" } }'; structure = jso_decode_map(json); expected = jso_type_boolean; actual = jso_map_lookup_type(structure, "four", "A"); assert_equal(expected, actual, "jso_map_lookup_type() found the wrong type! (multiple arguments)"); jso_cleanup_map(structure); //jso_map_check(): Multiple arguments (recurse) --- doesn't exist json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }'; structure = jso_decode_map(json); assert_false(jso_map_check(structure, "four", "C"), "jso_map_check() found an inexistent entry! (multiple arguments, 1)"); jso_cleanup_map(structure); //jso_map_check(): Multiple arguments (recurse) --- doesn't exist json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : { "A":true, "B":false } }'; structure = jso_decode_map(json); assert_false(jso_map_check(structure, "three", ""), "jso_map_check() found an inexistent entry! (multiple arguments, 2)"); jso_cleanup_map(structure); //jso_map_check(): Multiple arguments with nested list --- exists json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }'; structure = jso_decode_map(json); assert_true(jso_map_check(structure, "four", 2, 1), "jso_map_check() failed to find an existing entry! (multiple arguments, nested)"); jso_cleanup_map(structure); //jso_map_lookup(): Multiple arguments with nested list --- exists json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }'; structure = jso_decode_map(json); expected = false; actual = jso_map_lookup(structure, "four", 2, 1); assert_equal(expected, actual, "jso_map_lookup() failed to find an existing entry! (multiple arguments, nested)"); jso_cleanup_map(structure); //jso_map_lookup_type(): Multiple arguments with nested list --- exists json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, [false, "false"] ] }'; structure = jso_decode_map(json); expected = jso_type_string; actual = jso_map_lookup_type(structure, "four", 2, 1); assert_equal(expected, actual, "jso_map_lookup_type() found the wrong type! (multiple arguments, nested)"); jso_cleanup_map(structure); //jso_map_check(): Multiple arguments with nested list --- wrong type json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }'; structure = jso_decode_map(json); assert_false(jso_map_check(structure, "four", "A", 1), "jso_map_check() found an inexistent entry! (multiple arguments, nested, wrong type)"); jso_cleanup_map(structure); //jso_map_check(): Multiple arguments with nested list --- index overflow json = '{ "one" : 1, "two" : 2, "three" : 3, "four" : [ "A", true, ["B", false] ] }'; structure = jso_decode_map(json); assert_false(jso_map_check(structure, "four", 2, 3), "jso_map_check() found an inexistent entry! (multiple arguments, nested, index overflow)"); jso_cleanup_map(structure); //jso_list_check(): Single argument --- exists json = '["one", 2, "three", true, 5]'; structure = jso_decode_list(json); assert_true(jso_list_check(structure, 2), "jso_list_check() failed to find an existing index! (single argument)"); jso_cleanup_list(structure); //jso_list_lookup(): Single argument --- exists json = '["one", 2, "three", true, 5]'; structure = jso_decode_list(json); expected = "three"; actual = jso_list_lookup(structure, 2); assert_equal(expected, actual, "jso_list_lookup() found the wrong index! (single argument)"); jso_cleanup_list(structure); //jso_list_lookup_type(): Single argument --- exists json = '["one", 2, "three", true, 5]'; structure = jso_decode_list(json); expected = jso_type_string; actual = jso_list_lookup_type(structure, 2); assert_equal(expected, actual, "jso_list_lookup_type() found the wrong type! (single argument)"); jso_cleanup_list(structure); //jso_list_check(): Single argument --- doesn't exist json = '["one", 2, "three", true, 5]'; structure = jso_decode_list(json); assert_false(jso_list_check(structure, 5), "jso_list_check() found an inexistent index! (single argument)"); jso_cleanup_list(structure); //jso_list_check(): Multiple arguments (recurse) --- exists json = '["one", 2, ["three", 3], true, 5]'; structure = jso_decode_list(json); assert_true(jso_list_check(structure, 2, 1), "jso_list_check() failed to find an existing index! (multiple arguments)"); jso_cleanup_list(structure); //jso_list_lookup(): Multiple arguments (recurse) --- exists json = '["one", 2, ["three", 3], true, 5]'; structure = jso_decode_list(json); expected = 3; actual = jso_list_lookup(structure, 2, 1); assert_equal(expected, actual, "jso_list_lookup() failed to find an existing index! (multiple arguments)"); jso_cleanup_list(structure); //jso_list_lookup_type(): Multiple arguments (recurse) --- exists json = '["one", 2, ["three", 3], true, 5]'; structure = jso_decode_list(json); expected = jso_type_real; actual = jso_list_lookup_type(structure, 2, 1); assert_equal(expected, actual, "jso_list_lookup_type() found the wrong type! (multiple arguments)"); jso_cleanup_list(structure); //jso_list_check(): Multiple arguments (recurse) --- doesn't exist, inner index overflow json = '["one", 2, ["three", 3], true, 5]'; structure = jso_decode_list(json); assert_false(jso_list_check(structure, 2, 2), "jso_list_check() found an inexistent index! (multiple arguments, inner index overflow)"); jso_cleanup_list(structure); //jso_list_check(): Multiple arguments (recurse) --- doesn't exist, trying to index single entry json = '["one", 2, ["three", 3], true, 5]'; structure = jso_decode_list(json); assert_false(jso_list_check(structure, 1, 0), "jso_list_check() found an inexistent index! (multiple arguments, indexing single entry)"); jso_cleanup_list(structure); //jso_list_check(): Multiple arguments with nested map --- exists json = '["one", 2, {"three":3}, true, 5]'; structure = jso_decode_list(json); assert_true(jso_list_check(structure, 2, "three"), "jso_list_check() failed to find an existing entry! (multiple arguments, nested map)"); jso_cleanup_list(structure); //jso_list_lookup(): Multiple arguments with nested map --- exists json = '["one", 2, {"three":3}, true, 5]'; structure = jso_decode_list(json); expected = 3; actual = jso_list_lookup(structure, 2, "three"); assert_equal(expected, actual, "jso_list_lookup() failed to find an existing entry! (multiple arguments, nested map)"); jso_cleanup_list(structure); //jso_list_lookup_type(): Multiple arguments with nested map --- exists json = '["one", 2, {"three":false}, true, 5]'; structure = jso_decode_list(json); expected = jso_type_boolean; actual = jso_list_lookup_type(structure, 2, "three"); assert_equal(expected, actual, "jso_list_lookup_type() found the wrong type! (multiple arguments, nested map)"); jso_cleanup_list(structure); //jso_list_exists(): Multiple arguments with nested map --- doesn't exist, key on single entry json = '["one", 2, {"three":3}, true, 5]'; structure = jso_decode_list(json); assert_false(jso_list_check(structure, 1, ""), "jso_list_check() found an inexistent entry! (multiple arguments, nested map, key on single entry)"); jso_cleanup_list(structure); //jso_list_exists(): Multiple arguments with nested map --- doesn't exist, bad key json = '["one", 2, {"three":3}, true, 5]'; structure = jso_decode_list(json); assert_false(jso_list_check(structure, 2, ""), "jso_list_check() found an inexistent entry! (multiple arguments, nested map, bad key)"); jso_cleanup_list(structure); } #define _test_jso_bugs { /** _test_jso_bugs(): Test reported bugs. JSOnion version: 1.0.0d */ var expected, actual; //jso_encode_map() --- One-element map //Bug 1: Crash when encoding boolean-valued entries in maps, unknown variable jso_type_integer var one_map; one_map = jso_new_map(); jso_map_add_boolean(one_map, "true", true); expected = '{"true":true}'; actual = jso_encode_map(one_map); assert_equal(expected, actual, "jso_encode_map() failed to encode one-element map with boolean entry!"); jso_cleanup_map(one_map); } ================================================ FILE: samples/Game Maker Language/scrInitLevel.gml ================================================ // Originally from /spelunky/Scripts/Level Generation/scrInitLevel.gml in the Spelunky Community Update Project // // scrInitLevel() // // Calls scrLevelGen(), scrRoomGen*(), and scrEntityGen() to build level. // /********************************************************************************** Copyright (c) 2008, 2009 Derek Yu and Mossmouth, LLC This file is part of Spelunky. You can redistribute and/or modify Spelunky, including its source code, under the terms of the Spelunky User License. Spelunky is distributed in the hope that it will be entertaining and useful, but WITHOUT WARRANTY. Please see the Spelunky User License for more details. The Spelunky User License should be available in "Game Information", which can be found in the Resource Explorer, or as an external file called COPYING. If not, please obtain a new copy of Spelunky from ***********************************************************************************/ global.levelType = 0; //global.currLevel = 16; if (global.currLevel > 4 and global.currLevel < 9) global.levelType = 1; if (global.currLevel > 8 and global.currLevel < 13) global.levelType = 2; if (global.currLevel > 12 and global.currLevel < 16) global.levelType = 3; if (global.currLevel == 16) global.levelType = 4; if (global.currLevel <= 1 or global.currLevel == 5 or global.currLevel == 9 or global.currLevel == 13) { global.hadDarkLevel = false; } // global.levelType = 3; // debug // DEBUG MODE // /* if (global.currLevel == 2) global.levelType = 4; if (global.currLevel == 3) global.levelType = 2; if (global.currLevel == 4) global.levelType = 3; if (global.currLevel == 5) global.levelType = 4; */ // global.levelType = 0; global.startRoomX = 0; global.startRoomY = 0; global.endRoomX = 0; global.endRoomY = 0; oGame.levelGen = false; // this is used to determine the path to the exit (generally no bombs required) for (i = 0; i < 4; i += 1) { for (j = 0; j < 4; j += 1) { global.roomPath[i,j] = 0; } } // side walls if (global.levelType == 4) k = 54; else if (global.levelType == 2) k = 38; else if (global.lake) k = 41; else k = 33; for (i = 0; i <= 42; i += 1) { for (j = 0; j <= k; j += 1) { if (not isLevel()) { i = 999; j = 999; } else if (global.levelType == 2) { if (i*16 == 0 or i*16 == 656 or j*16 == 0) { obj = instance_create(i*16, j*16, oDark); obj.invincible = true; obj.sprite_index = sDark; } } else if (global.levelType == 4) { if (i*16 == 0 or i*16 == 656 or j*16 == 0) { obj = instance_create(i*16, j*16, oTemple); obj.invincible = true; if (not global.cityOfGold) obj.sprite_index = sTemple; } } else if (global.lake) { if (i*16 == 0 or i*16 == 656 or j*16 == 0 or j*16 >= 656) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; obj.invincible = true; } } else if (i*16 == 0 or i*16 == 656 or j*16 == 0 or j*16 >= 528) { if (global.levelType == 0) { obj = instance_create(i*16, j*16, oBrick); obj.sprite_index = sBrick; } else if (global.levelType == 1) { obj = instance_create(i*16, j*16, oLush); obj.sprite_index = sLush; } else { obj = instance_create(i*16, j*16, oTemple); if (not global.cityOfGold) obj.sprite_index = sTemple; } obj.invincible = true; } } } if (global.levelType == 2) { for (i = 0; i <= 42; i += 1) { instance_create(i*16, 40*16, oDark); //instance_create(i*16, 35*16, oSpikes); } } if (global.levelType == 3) { background_index = bgTemple; } global.temp1 = global.gameStart; scrLevelGen(); global.cemetary = false; if (global.levelType == 1 and rand(1,global.probCemetary) == 1) global.cemetary = true; with oRoom { if (global.levelType == 0) scrRoomGen(); else if (global.levelType == 1) { if (global.blackMarket) scrRoomGenMarket(); else scrRoomGen2(); } else if (global.levelType == 2) { if (global.yetiLair) scrRoomGenYeti(); else scrRoomGen3(); } else if (global.levelType == 3) scrRoomGen4(); else scrRoomGen5(); } global.darkLevel = false; //if (not global.hadDarkLevel and global.currLevel != 0 and global.levelType != 2 and global.currLevel != 16 and rand(1,1) == 1) if (not global.hadDarkLevel and not global.noDarkLevel and global.currLevel != 0 and global.currLevel != 1 and global.levelType != 2 and global.currLevel != 16 and rand(1,global.probDarkLevel) == 1) { global.darkLevel = true; global.hadDarkLevel = true; //instance_create(oPlayer1.x, oPlayer1.y, oFlare); } if (global.blackMarket) global.darkLevel = false; global.genUdjatEye = false; if (not global.madeUdjatEye) { if (global.currLevel == 2 and rand(1,3) == 1) global.genUdjatEye = true; else if (global.currLevel == 3 and rand(1,2) == 1) global.genUdjatEye = true; else if (global.currLevel == 4) global.genUdjatEye = true; } global.genMarketEntrance = false; if (not global.madeMarketEntrance) { if (global.currLevel == 5 and rand(1,3) == 1) global.genMarketEntrance = true; else if (global.currLevel == 6 and rand(1,2) == 1) global.genMarketEntrance = true; else if (global.currLevel == 7) global.genMarketEntrance = true; } //////////////////////////// // ENTITY / TREASURES //////////////////////////// global.temp2 = global.gameStart; if (not isRoom("rTutorial") and not isRoom("rLoadLevel")) scrEntityGen(); if (instance_exists(oEntrance) and not global.customLevel) { oPlayer1.x = oEntrance.x+8; oPlayer1.y = oEntrance.y+8; } if (global.darkLevel or global.blackMarket or global.snakePit or global.cemetary or global.lake or global.yetiLair or global.alienCraft or global.sacrificePit or global.cityOfGold) { if (not isRoom("rLoadLevel")) { with oPlayer1 { alarm[0] = 10; } } } if (global.levelType == 4) scrSetupWalls(864); else if (global.lake) scrSetupWalls(656); else scrSetupWalls(528); // add background details if (global.graphicsHigh) { repeat(20) { // bg = instance_create(16*rand(1,42), 16*rand(1,33), oCaveBG); if (global.levelType == 1 and rand(1,3) < 3) tile_add(bgExtrasLush, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); else if (global.levelType == 2 and rand(1,3) < 3) tile_add(bgExtrasIce, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); else if (global.levelType == 3 and rand(1,3) < 3) tile_add(bgExtrasTemple, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); else tile_add(bgExtras, 32*rand(0,1), 0, 32, 32, 16*rand(1,42), 16*rand(1,33), 10002); } } oGame.levelGen = true; // generate angry shopkeeper at exit if murderer or thief if ((global.murderer or global.thiefLevel > 0) and isRealLevel()) { with oExit { if (type == "Exit") { obj = instance_create(x, y, oShopkeeper); obj.status = 4; } } // global.thiefLevel -= 1; } with oTreasure { if (collision_point(x, y, oSolid, 0, 0)) { obj = instance_place(x, y, oSolid); if (obj.invincible) instance_destroy(); } } with oWater { if (sprite_index == sWaterTop or sprite_index == sLavaTop) { scrCheckWaterTop(); } /* obj = instance_place(x-16, y, oWater); if (instance_exists(obj)) { if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop) { if (type == "Lava") sprite_index = sLavaTop; else sprite_index = sWaterTop; } } obj = instance_place(x+16, y, oWater); if (instance_exists(obj)) { if (obj.sprite_index == sWaterTop or obj.sprite_index == sLavaTop) { if (type == "Lava") sprite_index = sLavaTop; else sprite_index = sWaterTop; } } */ } global.temp3 = global.gameStart; ================================================ FILE: samples/Gemini/instructions.gmi ================================================ # Astrobotany - FAQ ``` .--'} _ , ,<{.-'{:} -====;o`\/ } __ (( '--.} \-`\-'----. \_\ \\ __ \ |-..-'` ___\_))_/_/ /\/\ /_/ (( `--` jgs \\ ``` => / 🚶 Go back ## Creating an Account Astrobotany uses self-signed (TOFU) client certificates for authentication. In order to join in the fun, use your preferred gemini client to generate a new certificate. The subject fields in the certificate (name, location, email, CN, ...) don't matter. You can either leave them blank, or you can enter in values for your own records. Once you have generated your certificate, attempt to login and you will be guided through the process of creating an account. ## Gardening Basics You've been given a seed that will grow into a beautiful plant! * Check back every 24 hours to water your plant. * Your score will increase as long as the soil remains damp. * Your plant will die after 5 days without water. ## Plant Stages Your plant will continue to grow and evolve over time. * seed (0 days) * seedling (3 day) * young (3 days) * mature (10 days) * flowering (20 days) * seed-bearing (30 days) ## Generations Once your plant reaches the seed-bearing stage, you will be given the option to either keep going or harvest your plant. If you chose to harvest, your score will reset and you will start over with a generation score multiplier. ``` generation | multiplier ---------- | ---------- 1 | 1.00 2 | 1.20 3 | 1.40 4 | 1.60 5 | 1.80 6 | 2.00 7 | 2.20 8 | 2.40 9 | 2.60 10 | 2.80 ``` ## Registration (Legacy) The original guide for astrobotany user registration involved using certificate signing requests (CSRs). It's documented here for historical reference. => /static/register_old.gmi Legacy Registration Guide ## Credits Astrobotany is a fork of the tilde.town pubnix game, botany. Botany, by Jake Funke => https://github.com/jifunks/botany Astrobotany, by Michael Lazar => https://github.com/michael-lazar/astrobotany Most of the ASCII art on this capsule (besides the plants) was created by Joan G. Stark. ANSI colorization added by Michael Lazar. => https://web.archive.org/web/20091028031718/http://www.geocities.com/SoHo/7373/indexother.htm jgs geocities site (internet archive) ================================================ FILE: samples/Genero 4gl/books1.4gl ================================================ -- To test the sample: -- -- $ sed -n 's/\#\# \(.*\)/\1/p' books1.4gl > library.sch -- $ fglform -M ../"Genero Forms"/books1.per -- $ mv ../"Genero Forms"/books1.42f . -- $ fglcomp -M books1.4gl -- $ fglrun books1.42m -- SCHEMA library PUBLIC TYPE t_book RECORD LIKE book.* PUBLIC TYPE t_book_array DYNAMIC ARRAY OF t_book PRIVATE CONSTANT ID_UNKNOWN = 100 MAIN DEFINE books t_book_array DEFINE brec t_book DEFINE f_plot LIKE book.b_plot CONNECT TO ":memory:+driver='dbmsqt'" CALL create_tables() OPEN FORM f1 FROM "books1" DISPLAY FORM f1 CALL fill_book_array(books) DIALOG ATTRIBUTES(UNBUFFERED) DISPLAY ARRAY books TO sr1.* BEFORE ROW LET f_plot = books[ arr_curr() ].b_plot ON ACTION nbrows ATTRIBUTES(TEXT="Row count") MESSAGE SFMT("Number of books: %1",books.getLength()) ON INSERT LET f_plot = NULL INITIALIZE brec.* TO NULL LET brec.b_author = ID_UNKNOWN LET brec.b_pub_date = TODAY LET brec.b_price = 0 CLEAR formonly.f_plot INPUT brec.* FROM sr1[ scr_line() ].* ATTRIBUTES(WITHOUT DEFAULTS); IF NOT int_flag THEN TRY INSERT INTO book VALUES brec.* LET brec.book_id = sqlca.sqlerrd[2] LET books[ DIALOG.getCurrentRow("sr1") ] = brec MESSAGE SFMT("New book record created (id=%1)",brec.book_id) CATCH ERROR "Could not insert new book row into database:", SQLERRMESSAGE END TRY END IF ON DELETE IF mbox_yn("Delete the current row?") THEN TRY DELETE FROM book WHERE book_id = books[arr_curr()].book_id MESSAGE "Book record was deleted" CATCH ERROR "Could not delete the book row from database:", SQLERRMESSAGE END TRY END IF END DISPLAY INPUT BY NAME f_plot ON ACTION clear_plot ATTRIBUTES(TEXT="Clear") IF NOT mbox_yn("Are you sure you want to clear the plot summary?") THEN CONTINUE DIALOG END IF LET f_plot = NULL LET books[ arr_curr() ].b_plot = NULL UPDATE book SET b_plot = NULL WHERE book_id = books[ arr_curr() ].book_id ON ACTION update_plot ATTRIBUTES(TEXT="Save") LET books[ arr_curr() ].b_plot = f_plot UPDATE book SET b_plot = f_plot WHERE book_id = books[ arr_curr() ].book_id MESSAGE SFMT("Plot summary saved (%1)",CURRENT HOUR TO SECOND) END INPUT ON ACTION close ACCEPT DIALOG END DIALOG END MAIN PRIVATE FUNCTION mbox_yn(question STRING) RETURNS BOOLEAN DEFINE r BOOLEAN MENU "Books" ATTRIBUTES(STYLE="dialog", COMMENT=question) COMMAND "Yes" LET r = TRUE COMMAND "No" LET r = FALSE END MENU RETURN r END FUNCTION FUNCTION fill_book_array(ba t_book_array) RETURNS () DEFINE x INTEGER DECLARE c1 CURSOR FOR SELECT * FROM book ORDER BY b_title LET x = 1 FOREACH c1 INTO ba[x].* LET x = x + 1 END FOREACH CALL ba.deleteElement(x) END FUNCTION FUNCTION init_authors(e ui.ComboBox) RETURNS () DEFINE id LIKE author.auth_id DEFINE name LIKE author.a_name DECLARE c2 CURSOR FOR SELECT auth_id, a_name FROM author ORDER BY a_name FOREACH c2 INTO id, name CALL e.addItem( id, name ) END FOREACH END FUNCTION FUNCTION create_tables() RETURNS () CREATE TABLE author ( auth_id SERIAL NOT NULL PRIMARY KEY, a_name VARCHAR(50) ); CREATE TABLE book ( book_id SERIAL NOT NULL PRIMARY KEY, b_title VARCHAR(100) NOT NULL, b_author INTEGER NOT NULL REFERENCES author(auth_id), b_isbn VARCHAR(20) NOT NULL UNIQUE, b_pub_date DATE, b_price DECIMAL(10,2), b_plot VARCHAR(500) ); INSERT INTO author VALUES ( 100, '?UNDEFINED?' ); INSERT INTO author VALUES ( 101, 'Stephen KING' ); INSERT INTO book VALUES ( 10101, 'The Talisman', 101, '978-0-670-69199-9', '1984-11-08', 15.60, NULL ); INSERT INTO book VALUES ( 10102, 'Doctor Sleep', 101, '978-1-4767-2765-3', '2013-09-24', 12.00, NULL ); INSERT INTO book VALUES ( 10103, 'The Long Walk', 101, '978-0-451-08754-6', '1979-07-11', 14.30, NULL ); INSERT INTO author VALUES ( 103, 'Dan Brown' ); INSERT INTO book VALUES ( 10301, 'Digital Fortress', 103, '0-312-18087-X', '1998-01-01', 10.20, NULL ); INSERT INTO book VALUES ( 10302, 'Angels & Demons', 103, '0-671-02735-2 ', '2000-04-01', 14.55, NULL ); -- For PostgreSQL -- SELECT setval( pg_get_serial_sequence('author','auth_id'), 200 ); -- SELECT setval( pg_get_serial_sequence('book','book_id'), 20000 ); END FUNCTION ## author^auth_id^262^4^1^ ## author^a_name^201^50^2^ ## book^book_id^262^4^1^ ## book^b_title^457^100^2^ ## book^b_author^258^4^3^ ## book^b_isbn^457^20^4^ ## book^b_pub_date^7^4^5^ ## book^b_price^5^2562^6^ ## book^b_plot^201^500^7^ ================================================ FILE: samples/Genero 4gl/webserv1.4gl ================================================ -- Testing the web service: -- -- Define FGLAPPSERVER to a free TCP port: -- $ export FGLAPPSERVER=8089 -- -- Compile and start the server program: -- $ fglcomp WebService.4gl -- $ fglrun WebService.42m -- -- Open a browser, and fetch the OpenAPI doc with: -- -- http://localhost:8089/api?openapi.json -- OPTIONS SHORT CIRCUIT IMPORT com IMPORT FGL webserv1_api MAIN DEFER INTERRUPT CALL startServer() END MAIN PRIVATE FUNCTION startServer() RETURNS() DEFINE returnCode INTEGER CALL com.WebServiceEngine.RegisterRestService("webserv_api", "api") DISPLAY "Server started" CALL com.WebServiceEngine.Start() LET int_flag = FALSE WHILE TRUE LET returnCode = com.WebServiceEngine.ProcessServices(-1) CASE returnCode WHEN 0 DISPLAY "Request processed." WHEN -1 DISPLAY "Timeout reached." WHEN -2 DISPLAY "Disconnected from application server." # the application server has closed the connection EXIT PROGRAM WHEN -3 DISPLAY "Client connection lost." WHEN -4 DISPLAY "Server interrupted with ctrl-c." WHEN -9 DISPLAY "Unsupported operation." WHEN -10 DISPLAY "Internal server error." WHEN -23 DISPLAY "Deserialization error." WHEN -35 DISPLAY "No such REST operation found." WHEN -36 DISPLAY "Missing REST parameter." OTHERWISE DISPLAY SFMT("Unexpected server error: %1",returnCode) EXIT WHILE END CASE IF int_flag THEN EXIT WHILE END IF END WHILE DISPLAY "Server stopped" END FUNCTION ================================================ FILE: samples/Genero 4gl/webserv1_api.4gl ================================================ OPTIONS SHORT CIRCUIT IMPORT com PUBLIC TYPE UserAccount RECORD id INTEGER, name STRING, dob DATE, isActive BOOLEAN END RECORD PUBLIC DEFINE userError RECORD ATTRIBUTE(WSError = "User error") message STRING END RECORD PUBLIC FUNCTION getNumberUsers() ATTRIBUTES(WSGet, WSPath = "/users/count", WSDescription = "Returns a count of users.") RETURNS INTEGER DEFINE returnCount INTEGER SELECT COUNT(*) INTO returnCount FROM UserAccounts RETURN returnCount END FUNCTION PUBLIC FUNCTION createUser(newUser UserAccount) ATTRIBUTES(WSPost, WSPath = "/users", WSDescription = "Create a user profile", WSThrows = "400:@userError") RETURNS STRING DEFINE returnMessage STRING TRY INSERT INTO UserAccounts VALUES (newUser.*) LET returnMessage = SFMT("Created user: %1", newUser.name) CATCH LET userError.message = SFMT("SQL error:%1 [%2]", sqlca.sqlcode, SQLERRMESSAGE) CALL com.WebServiceEngine.SetRestError(400, userError) END TRY RETURN returnMessage END FUNCTION ================================================ FILE: samples/Genero per/books1.per ================================================ SCHEMA library LAYOUT HBOX ( ORIENTATION@SMALL = VERTICAL ) TABLE { [c1 |c2 |c3 |c4 |c5 ] } END GRID { Plot [f1 ] [ ] [ ] } END END END TABLES book END ATTRIBUTES PHANTOM book.book_id; EDIT c1 = book.b_title, TITLE="Name", SCROLL; COMBOBOX c2 = book.b_author, TITLE="Author", INITIALIZER=init_authors; EDIT c3 = book.b_isbn, TITLE="ISBN", SCROLL; DATEEDIT c4 = book.b_pub_date, TITLE="Publication"; EDIT c5 = book.b_price, TITLE="Price"; TEXTEDIT f1 = FORMONLY.f_plot, STRETCH=BOTH; PHANTOM book.b_plot; END INSTRUCTIONS SCREEN RECORD sr1(book.*); END ================================================ FILE: samples/Genie/Class.gs ================================================ init new Demo( "Demonstration class" ).run() class Demo _message:string = "" construct ( message:string = "Optional argument - no message passed in constructor" ) _message = message def run() print( _message ) ================================================ FILE: samples/Genie/Hello.gs ================================================ init print( "Hello, World!" ) ================================================ FILE: samples/Genie/IDataLoader.gs ================================================ /** * IDataLoader.gs * * * */ [indent=4] uses Gee uses sdx uses sdx.math uses sdx.graphics.s2d uses o2d.data namespace o2d.resources interface IDataLoader : Object def abstract loadSceneVO(sceneName: string): SceneVO def abstract loadProjectVO(): ProjectInfoVO ================================================ FILE: samples/Genie/web.gs ================================================ [indent=4] // valac --pkg gtk+-3.0 --pkg webkitgtk-3.0 web.gs uses Gtk WebKit class ValaBrowser : Window webview: WebView button: ToolButton spinner: Spinner init window_position = WindowPosition.CENTER set_default_size(1024, 768) create_widgets() connect_signals () webview.grab_focus () var settings = new WebSettings() settings.set("enable-default-context-menu",false) webview.set_settings(settings) def create_widgets () : void var toolbar = new Toolbar () toolbar.set_style(ToolbarStyle.BOTH) toolbar.get_style_context().add_class(STYLE_CLASS_PRIMARY_TOOLBAR) this.button = new ToolButton(null,"Refresh") toolbar.add (this.button) this.webview = new WebView () this.spinner = new Spinner() this.spinner.set_margin_left(5) this.spinner.set_margin_right(5) this.spinner.set_margin_bottom(5) this.spinner.set_margin_top(5) this.spinner.start() var fixed = new Fixed() fixed.add(this.spinner) fixed.set_halign(Align.START) fixed.set_valign(Align.END) var overlay = new Overlay() overlay.add(this.webview) overlay.add_overlay(fixed) var vbox = new Box (Orientation.VERTICAL, 0) vbox.pack_start (toolbar, false, true, 0) vbox.pack_start(overlay,true,true,0) add (vbox) def connect_signals () : void this.destroy.connect (Gtk.main_quit) this.button.clicked.connect (this.start) this.webview.document_load_finished.connect(this.loaded) this.webview.load_started.connect(this.started) def start () : void show_all () //URL to show this.webview.open ("https://google.com") def loaded () : void this.spinner.hide() //Use the next command to run some javascript on page load //this.webview.execute_script("$('body').show()") def started () : void show_all() def main (arg: array of string[]) : int Gtk.init (ref arg) var browser = new ValaBrowser () browser.start () Gtk.main () return 0 ================================================ FILE: samples/Gerber Image/AGV_GPIO.gml ================================================ G75* %MOIN*% %OFA0B0*% %FSLAX25Y25*% %IPPOS*% %LPD*% %AMOC8* 5,1,8,0,0,1.08239X$1,22.5* % %ADD10C,0.00000*% D10* X0013311Y0038461D02* X0013311Y0254996D01* X0229846Y0254996D01* X0229846Y0038461D01* X0013311Y0038461D01* X0018823Y0050272D02* X0018825Y0050430D01* X0018831Y0050588D01* X0018841Y0050746D01* X0018855Y0050904D01* X0018873Y0051061D01* X0018894Y0051218D01* X0018920Y0051374D01* X0018950Y0051530D01* X0018983Y0051685D01* X0019021Y0051838D01* X0019062Y0051991D01* X0019107Y0052143D01* X0019156Y0052294D01* X0019209Y0052443D01* X0019265Y0052591D01* X0019325Y0052737D01* X0019389Y0052882D01* X0019457Y0053025D01* X0019528Y0053167D01* X0019602Y0053307D01* X0019680Y0053444D01* X0019762Y0053580D01* X0019846Y0053714D01* X0019935Y0053845D01* X0020026Y0053974D01* X0020121Y0054101D01* X0020218Y0054226D01* X0020319Y0054348D01* X0020423Y0054467D01* X0020530Y0054584D01* X0020640Y0054698D01* X0020753Y0054809D01* X0020868Y0054918D01* X0020986Y0055023D01* X0021107Y0055125D01* X0021230Y0055225D01* X0021356Y0055321D01* X0021484Y0055414D01* X0021614Y0055504D01* X0021747Y0055590D01* X0021882Y0055674D01* X0022018Y0055753D01* X0022157Y0055830D01* X0022298Y0055902D01* X0022440Y0055972D01* X0022584Y0056037D01* X0022730Y0056099D01* X0022877Y0056157D01* X0023026Y0056212D01* X0023176Y0056263D01* X0023327Y0056310D01* X0023479Y0056353D01* X0023632Y0056392D01* X0023787Y0056428D01* X0023942Y0056459D01* X0024098Y0056487D01* X0024254Y0056511D01* X0024411Y0056531D01* X0024569Y0056547D01* X0024726Y0056559D01* X0024885Y0056567D01* X0025043Y0056571D01* X0025201Y0056571D01* X0025359Y0056567D01* X0025518Y0056559D01* X0025675Y0056547D01* X0025833Y0056531D01* X0025990Y0056511D01* X0026146Y0056487D01* X0026302Y0056459D01* X0026457Y0056428D01* X0026612Y0056392D01* X0026765Y0056353D01* X0026917Y0056310D01* X0027068Y0056263D01* X0027218Y0056212D01* X0027367Y0056157D01* X0027514Y0056099D01* X0027660Y0056037D01* X0027804Y0055972D01* X0027946Y0055902D01* X0028087Y0055830D01* X0028226Y0055753D01* X0028362Y0055674D01* X0028497Y0055590D01* X0028630Y0055504D01* X0028760Y0055414D01* X0028888Y0055321D01* X0029014Y0055225D01* X0029137Y0055125D01* X0029258Y0055023D01* X0029376Y0054918D01* X0029491Y0054809D01* X0029604Y0054698D01* X0029714Y0054584D01* X0029821Y0054467D01* X0029925Y0054348D01* X0030026Y0054226D01* X0030123Y0054101D01* X0030218Y0053974D01* X0030309Y0053845D01* X0030398Y0053714D01* X0030482Y0053580D01* X0030564Y0053444D01* X0030642Y0053307D01* X0030716Y0053167D01* X0030787Y0053025D01* X0030855Y0052882D01* X0030919Y0052737D01* X0030979Y0052591D01* X0031035Y0052443D01* X0031088Y0052294D01* X0031137Y0052143D01* X0031182Y0051991D01* X0031223Y0051838D01* X0031261Y0051685D01* X0031294Y0051530D01* X0031324Y0051374D01* X0031350Y0051218D01* X0031371Y0051061D01* X0031389Y0050904D01* X0031403Y0050746D01* X0031413Y0050588D01* X0031419Y0050430D01* X0031421Y0050272D01* X0031419Y0050114D01* X0031413Y0049956D01* X0031403Y0049798D01* X0031389Y0049640D01* X0031371Y0049483D01* X0031350Y0049326D01* X0031324Y0049170D01* X0031294Y0049014D01* X0031261Y0048859D01* X0031223Y0048706D01* X0031182Y0048553D01* X0031137Y0048401D01* X0031088Y0048250D01* X0031035Y0048101D01* X0030979Y0047953D01* X0030919Y0047807D01* X0030855Y0047662D01* X0030787Y0047519D01* X0030716Y0047377D01* X0030642Y0047237D01* X0030564Y0047100D01* X0030482Y0046964D01* X0030398Y0046830D01* X0030309Y0046699D01* X0030218Y0046570D01* X0030123Y0046443D01* X0030026Y0046318D01* X0029925Y0046196D01* X0029821Y0046077D01* X0029714Y0045960D01* X0029604Y0045846D01* X0029491Y0045735D01* X0029376Y0045626D01* X0029258Y0045521D01* X0029137Y0045419D01* X0029014Y0045319D01* X0028888Y0045223D01* X0028760Y0045130D01* X0028630Y0045040D01* X0028497Y0044954D01* X0028362Y0044870D01* X0028226Y0044791D01* X0028087Y0044714D01* X0027946Y0044642D01* X0027804Y0044572D01* X0027660Y0044507D01* X0027514Y0044445D01* X0027367Y0044387D01* X0027218Y0044332D01* X0027068Y0044281D01* X0026917Y0044234D01* X0026765Y0044191D01* X0026612Y0044152D01* X0026457Y0044116D01* X0026302Y0044085D01* X0026146Y0044057D01* X0025990Y0044033D01* X0025833Y0044013D01* X0025675Y0043997D01* X0025518Y0043985D01* X0025359Y0043977D01* X0025201Y0043973D01* X0025043Y0043973D01* X0024885Y0043977D01* X0024726Y0043985D01* X0024569Y0043997D01* X0024411Y0044013D01* X0024254Y0044033D01* X0024098Y0044057D01* X0023942Y0044085D01* X0023787Y0044116D01* X0023632Y0044152D01* X0023479Y0044191D01* X0023327Y0044234D01* X0023176Y0044281D01* X0023026Y0044332D01* X0022877Y0044387D01* X0022730Y0044445D01* X0022584Y0044507D01* X0022440Y0044572D01* X0022298Y0044642D01* X0022157Y0044714D01* X0022018Y0044791D01* X0021882Y0044870D01* X0021747Y0044954D01* X0021614Y0045040D01* X0021484Y0045130D01* X0021356Y0045223D01* X0021230Y0045319D01* X0021107Y0045419D01* X0020986Y0045521D01* X0020868Y0045626D01* X0020753Y0045735D01* X0020640Y0045846D01* X0020530Y0045960D01* X0020423Y0046077D01* X0020319Y0046196D01* X0020218Y0046318D01* X0020121Y0046443D01* X0020026Y0046570D01* X0019935Y0046699D01* X0019846Y0046830D01* X0019762Y0046964D01* X0019680Y0047100D01* X0019602Y0047237D01* X0019528Y0047377D01* X0019457Y0047519D01* X0019389Y0047662D01* X0019325Y0047807D01* X0019265Y0047953D01* X0019209Y0048101D01* X0019156Y0048250D01* X0019107Y0048401D01* X0019062Y0048553D01* X0019021Y0048706D01* X0018983Y0048859D01* X0018950Y0049014D01* X0018920Y0049170D01* X0018894Y0049326D01* X0018873Y0049483D01* X0018855Y0049640D01* X0018841Y0049798D01* X0018831Y0049956D01* X0018825Y0050114D01* X0018823Y0050272D01* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-B.Cu.gbl ================================================ G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% %ADD11C,0.175000*% %ADD12R,1.727200X2.032000*% %ADD13O,1.727200X2.032000*% %ADD14R,2.032000X1.727200*% %ADD15O,2.032000X1.727200*% %ADD16C,1.300000*% %ADD17C,2.800000*% %ADD18C,0.685800*% %ADD19C,0.800000*% %ADD20C,0.400000*% %ADD21C,0.800000*% %ADD22C,0.300000*% %ADD23C,0.500000*% %ADD24C,0.180000*% G04 APERTURE END LIST* D10* D11* X162816666Y-95670833D02* X162883333Y-95637500D01* X163016666Y-95637500D01* X163083333Y-95670833D01* X163150000Y-95737500D01* X163183333Y-95804166D01* X163183333Y-95937500D01* X163150000Y-96004166D01* X163083333Y-96070833D01* X163016666Y-96104166D01* X162883333Y-96104166D01* X162816666Y-96070833D01* X162950000Y-95404166D02* X163116666Y-95437500D01* X163283333Y-95537500D01* X163383333Y-95704166D01* X163416666Y-95870833D01* X157450000Y-95870833D01* X157483333Y-95837500D01* X157550000Y-95804166D01* X156816666Y-95504166D02* X156950000Y-95504166D01* X157016666Y-95537500D01* X157050000Y-95570833D01* X157116666Y-95670833D01* X157150000Y-95804166D01* X157150000Y-96070833D01* X157116666Y-96137500D01* X157083333Y-96170833D01* X157016666Y-96204166D01* X156883333Y-96204166D01* X156816666Y-96170833D01* X156783333Y-96137500D01* X156750000Y-96070833D01* X156750000Y-95904166D01* X156783333Y-95837500D01* X156816666Y-95804166D01* X156883333Y-95770833D01* X157016666Y-95770833D01* X157083333Y-95804166D01* X157116666Y-95837500D01* X157150000Y-95904166D01* X156450000Y-95937500D02* X155916666Y-95937500D01* X155616666Y-96170833D02* X155516666Y-96204166D01* X155350000Y-96204166D01* X155283333Y-96170833D01* X155250000Y-96137500D01* X155216666Y-96070833D01* X155216666Y-96004166D01* X155250000Y-95937500D01* X155283333Y-95904166D01* X155350000Y-95870833D01* X155483333Y-95837500D01* X155550000Y-95804166D01* X155583333Y-95770833D01* X155616666Y-95704166D01* X155616666Y-95637500D01* X155583333Y-95570833D01* X155550000Y-95537500D01* X155483333Y-95504166D01* X155316666Y-95504166D01* X155216666Y-95537500D01* X155016666Y-95737500D02* X154750000Y-95737500D01* X154916666Y-95504166D02* X154916666Y-96104166D01* X154883333Y-96170833D01* X154816666Y-96204166D01* X154750000Y-96204166D01* X154216666Y-95737500D02* X154216666Y-96204166D01* X154516666Y-95737500D02* X154516666Y-96104166D01* X154483333Y-96170833D01* X154416666Y-96204166D01* X154316666Y-96204166D01* X154250000Y-96170833D01* X154216666Y-96137500D01* X153583333Y-96204166D02* X153583333Y-95504166D01* X153583333Y-96170833D02* X153650000Y-96204166D01* X153783333Y-96204166D01* X156883333Y-96795833D01* X156850000Y-96762500D01* X156883333Y-96729166D01* X156883333Y-96795833D01* X156450000Y-97429166D02* X156516666Y-97395833D01* X156550000Y-97329166D01* X156550000Y-96729166D01* X156183333Y-96962500D02* X155650000Y-97162500D01* X156183333Y-97362500D01* X154883333Y-96729166D02* X154483333Y-96729166D01* X154683333Y-97429166D02* X154683333Y-96729166D01* X154250000Y-97429166D02* X154250000Y-96962500D01* X154250000Y-97095833D02* X154216666Y-97029166D01* X154183333Y-96995833D01* X154116666Y-96962500D01* X154050000Y-96962500D01* X153516666Y-97429166D02* X153516666Y-97062500D01* X153550000Y-96995833D01* X153616666Y-96962500D01* X153750000Y-96962500D01* X153816666Y-96995833D01* X153516666Y-97395833D02* X153583333Y-97429166D01* X153750000Y-97429166D01* X153816666Y-97395833D01* X153850000Y-97329166D01* X153850000Y-97262500D01* X153816666Y-97195833D01* X153750000Y-97162500D01* X153583333Y-97162500D01* X153516666Y-97129166D01* X153183333Y-96962500D02* X153183333Y-97662500D01* X153183333Y-96995833D02* X153116666Y-96962500D01* X152983333Y-96962500D01* X152916666Y-96995833D01* X152883333Y-97029166D01* X152850000Y-97095833D01* X152850000Y-97295833D01* X152883333Y-97362500D01* X152916666Y-97395833D01* X152983333Y-97429166D01* X153116666Y-97429166D01* X153183333Y-97395833D01* X152550000Y-97429166D02* X152550000Y-96962500D01* X152550000Y-96729166D02* X152583333Y-96762500D01* X152550000Y-96795833D01* X152516666Y-96762500D01* X152550000Y-96729166D01* X152550000Y-96795833D01* X151950000Y-97395833D02* X152016666Y-97429166D01* X152150000Y-97429166D01* X152216666Y-97395833D01* X152250000Y-97329166D01* X152250000Y-97062500D01* X152216666Y-96995833D01* X152150000Y-96962500D01* X152016666Y-96962500D01* X151950000Y-96995833D01* X151916666Y-97062500D01* X151916666Y-97129166D01* X152250000Y-97195833D01* X151616666Y-97429166D02* X151616666Y-96962500D01* X151616666Y-97095833D02* X151583333Y-97029166D01* X151550000Y-96995833D01* X151483333Y-96962500D01* X151416666Y-96962500D01* D12* X175640000Y-81600000D03* D13* X173100000Y-81600000D03* X170560000Y-81600000D03* D14* X184000000Y-86460000D03* D15* X184000000Y-89000000D03* X184000000Y-91540000D03* D16* X152900000Y-88350000D03* X152900000Y-90350000D03* X152900000Y-92850000D03* X152900000Y-85850000D03* D17* X150800000Y-83500000D03* X150800000Y-95200000D03* D18* X173700000Y-89200000D03* X162300004Y-87000000D03* X159600000Y-82700000D03* X161700000Y-94600000D03* X176200000Y-96600000D03* X179600000Y-91700000D03* X158100000Y-83900000D03* X168600000Y-89399998D03* X167200000Y-85000000D03* X159600000Y-81100000D03* X163800000Y-81100000D03* D19* X159300000Y-87400000D03* X167300000Y-96600000D03* X167300000Y-94500000D03* X160900000Y-87400000D03* D18* X174900000Y-90299999D03* X174900000Y-85300000D03* D19* X166500002Y-90900000D03* X177200000Y-90200000D03* X168000000Y-87400000D03* X173800000Y-87400000D03* D18* X154500000Y-89792900D03* X154500000Y-88907100D03* D20* X167200000Y-87999998D02* X168257101Y-89057099D01* X167200000Y-85000000D02* X167200000Y-87999998D01* X168257101Y-89057099D02* X168600000Y-89399998D01* D21* X163800000Y-81100000D02* X159600000Y-81100000D01* D22* X159300000Y-87965685D02* X159300000Y-87400000D01* X159300000Y-88600000D02* X159300000Y-87965685D01* X167300000Y-96600000D02* X159300000Y-88600000D01* X167300000Y-94500000D02* X160900000Y-88100000D01* X160900000Y-88100000D02* X160900000Y-87400000D01* D23* X174900000Y-85300000D02* X174900000Y-90299999D01* D22* X177200000Y-90200000D02* X175300000Y-92100000D01* X175300000Y-92100000D02* X167700002Y-92100000D01* X167700002Y-92100000D02* X166500002Y-90900000D01* X173800000Y-87400000D02* X168000000Y-87400000D01* X154500000Y-88907100D02* X154342900Y-88907100D01* X154342900Y-88907100D02* X152900000Y-90350000D01* D24* G36* X159316814Y-80416329D02* X159076741Y-80576741D01* X158916329Y-80816814D01* X158860000Y-81100000D01* X158916329Y-81383186D01* X159076741Y-81623259D01* X159316814Y-81783671D01* X159600000Y-81840000D01* X163800000Y-81840000D01* X164083186Y-81783671D01* X176823872Y-82748661D01* X176850260Y-82616000D01* X176850260Y-82265373D01* X151860838Y-81760869D01* X151114549Y-81487287D01* X150320374Y-81520123D01* X149739162Y-81760869D01* X149586248Y-82054317D01* X148415000Y-82054317D01* X148415000Y-81040874D01* X148467041Y-80779242D01* X148592092Y-80592091D01* X148779241Y-80467042D01* X149040874Y-80415000D01* X159323495Y-80415000D01* X159316814Y-80416329D01* X159316814Y-80416329D01* G37* X159316814Y-80416329D02* X159076741Y-80576741D01* X158916329Y-80816814D01* X158860000Y-81100000D01* X158916329Y-81383186D01* X159076741Y-81623259D01* X159323495Y-80415000D01* X159316814Y-80416329D01* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-B.Mask.gbs ================================================ G04 #@! TF.FileFunction,Soldermask,Bot* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% %ADD11R,1.727200X2.032000*% %ADD12O,1.727200X2.032000*% %ADD13R,2.032000X1.727200*% %ADD14O,2.032000X1.727200*% %ADD15C,1.300000*% %ADD16C,2.800000*% %ADD17C,1.200000*% G04 APERTURE END LIST* D10* D11* X175640000Y-81600000D03* D12* X173100000Y-81600000D03* X170560000Y-81600000D03* D13* X184000000Y-86460000D03* D14* X184000000Y-89000000D03* X184000000Y-91540000D03* D15* X152900000Y-88350000D03* X152900000Y-90350000D03* X152900000Y-92850000D03* X152900000Y-85850000D03* D16* X150800000Y-83500000D03* X150800000Y-95200000D03* D17* X150800000Y-87100000D03* X150800000Y-91600000D03* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-B.SilkS.gbo ================================================ G04 #@! TF.FileFunction,Legend,Bot* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% %ADD11C,0.175000*% %ADD12C,0.375000*% %ADD13C,0.254000*% %ADD14R,1.727200X2.032000*% %ADD15O,1.727200X2.032000*% %ADD16R,2.032000X1.727200*% %ADD17O,2.032000X1.727200*% %ADD18C,1.300000*% %ADD19C,2.800000*% %ADD20C,1.200000*% G04 APERTURE END LIST* D10* D11* X164233333Y-82450000D02* X164133333Y-82483333D01* X164100000Y-82516666D01* X164066666Y-82583333D01* X164066666Y-82683333D01* X164100000Y-82750000D01* X164133333Y-82783333D01* X164200000Y-82816666D01* X164466666Y-82816666D01* X164466666Y-82116666D01* X164233333Y-82116666D01* X164166666Y-82150000D01* X164133333Y-82183333D01* X164100000Y-82250000D01* X164100000Y-82316666D01* X164133333Y-82383333D01* X164166666Y-82416666D01* X164233333Y-82450000D01* X164466666Y-82450000D01* X163666666Y-82816666D02* X163733333Y-82783333D01* X163766666Y-82750000D01* X163800000Y-82683333D01* X163800000Y-82483333D01* X163766666Y-82416666D01* X163733333Y-82383333D01* X163666666Y-82350000D01* X163566666Y-82350000D01* X163500000Y-82383333D01* X163466666Y-82416666D01* X163433333Y-82483333D01* X163433333Y-82683333D01* X163466666Y-82750000D01* X163500000Y-82783333D01* X163566666Y-82816666D01* X163666666Y-82816666D01* X162833333Y-82816666D02* X162833333Y-82450000D01* X162866666Y-82383333D01* X162933333Y-82350000D01* X163066666Y-82350000D01* X163133333Y-82383333D01* X162833333Y-82783333D02* X162900000Y-82816666D01* X163066666Y-82816666D01* X163133333Y-82783333D01* X163166666Y-82716666D01* X163166666Y-82650000D01* X163133333Y-82583333D01* X163066666Y-82550000D01* X162900000Y-82550000D01* X162833333Y-82516666D01* X162500000Y-82816666D02* X162500000Y-82350000D01* X162500000Y-82483333D02* X162466666Y-82416666D01* X162433333Y-82383333D01* X162366666Y-82350000D01* X162300000Y-82350000D01* X161766666Y-82816666D02* X161766666Y-82116666D01* X161766666Y-82783333D02* X161833333Y-82816666D01* X161966666Y-82816666D01* X162033333Y-82783333D01* X162066666Y-82750000D01* X162100000Y-82683333D01* X162100000Y-82483333D01* X162066666Y-82416666D01* X162033333Y-82383333D01* X161966666Y-82350000D01* X161833333Y-82350000D01* X161766666Y-82383333D01* X160933333Y-82350000D02* X160433333Y-82350000D01* X160733333Y-82050000D02* X160933333Y-82950000D01* X160500000Y-82650000D02* X161000000Y-82650000D01* X160700000Y-82950000D02* X160500000Y-82050000D01* D12* X181899107Y-86482142D02* X180756250Y-86482142D01* X181327678Y-87053571D02* X181327678Y-85910714D01* X179327678Y-85553571D02* X180041964Y-85553571D01* X180113392Y-86267857D01* X180041964Y-86196428D01* X179899107Y-86125000D01* X179541964Y-86125000D01* X179399107Y-86196428D01* X179327678Y-86267857D01* X179256250Y-86410714D01* X179256250Y-86767857D01* X179327678Y-86910714D01* X179399107Y-86982142D01* X179541964Y-87053571D01* X179899107Y-87053571D01* X180041964Y-86982142D01* X180113392Y-86910714D01* X178827678Y-85553571D02* X178327678Y-87053571D01* X177827678Y-85553571D01* X176184821Y-87053571D02* X176184821Y-85553571D01* X175827678Y-85553571D01* X175613392Y-85625000D01* X175470535Y-85767857D01* X175399107Y-85910714D01* X175327678Y-86196428D01* X175327678Y-86410714D01* X175399107Y-86696428D01* X175470535Y-86839285D01* X175613392Y-86982142D01* X175827678Y-87053571D01* X176184821Y-87053571D01* X174684821Y-86267857D02* X174184821Y-86267857D01* X173970535Y-87053571D02* X174684821Y-87053571D01* X174684821Y-85553571D01* X173970535Y-85553571D01* X173541964Y-85553571D02* X173041964Y-87053571D01* X172541964Y-85553571D01* X181041964Y-89678571D02* X181541964Y-88964285D01* X181899107Y-89678571D02* X181899107Y-88178571D01* X181327678Y-88178571D01* X181184821Y-88250000D01* X181113392Y-88321428D01* X181041964Y-88464285D01* X181041964Y-88678571D01* X181113392Y-88821428D01* X181184821Y-88892857D01* X181327678Y-88964285D01* X181899107Y-88964285D01* X180541964Y-88178571D02* X179541964Y-89678571D01* X179541964Y-88178571D02* X180541964Y-89678571D01* X179184821Y-88178571D02* X178327678Y-88178571D01* X178756250Y-89678571D02* X178756250Y-88178571D01* X177970535Y-88178571D02* X176970535Y-89678571D01* X176970535Y-88178571D02* X177970535Y-89678571D01* X181113392Y-90875000D02* X181256250Y-90803571D01* X181470535Y-90803571D01* X181684821Y-90875000D01* X181827678Y-91017857D01* X181899107Y-91160714D01* X181970535Y-91446428D01* X181970535Y-91660714D01* X181899107Y-91946428D01* X181827678Y-92089285D01* X181684821Y-92232142D01* X181470535Y-92303571D01* X181327678Y-92303571D01* X181113392Y-92232142D01* X181041964Y-92160714D01* X181041964Y-91660714D01* X181327678Y-91660714D01* X180399107Y-92303571D02* X180399107Y-90803571D01* X179541964Y-92303571D01* X179541964Y-90803571D01* X178827678Y-92303571D02* X178827678Y-90803571D01* X178470535Y-90803571D01* X178256250Y-90875000D01* X178113392Y-91017857D01* X178041964Y-91160714D01* X177970535Y-91446428D01* X177970535Y-91660714D01* X178041964Y-91946428D01* X178113392Y-92089285D01* X178256250Y-92232142D01* X178470535Y-92303571D01* X178827678Y-92303571D01* D13* G36* X164873000Y-87373000D02* X154627000Y-87373000D01* X154627000Y-83127000D01* X164873000Y-83127000D01* X164873000Y-87373000D01* X164873000Y-87373000D01* G37* X164873000Y-87373000D02* X154627000Y-87373000D01* X154627000Y-83127000D01* X164873000Y-83127000D01* X164873000Y-87373000D01* %LPC*% D14* X175640000Y-81600000D03* D15* X173100000Y-81600000D03* X170560000Y-81600000D03* D16* X184000000Y-86460000D03* D17* X184000000Y-89000000D03* X184000000Y-91540000D03* D18* X152900000Y-88350000D03* X152900000Y-90350000D03* X152900000Y-92850000D03* X152900000Y-85850000D03* D19* X150800000Y-83500000D03* X150800000Y-95200000D03* D20* X150800000Y-87100000D03* X150800000Y-91600000D03* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-F.Cu.gtl ================================================ G04 #@! TF.FileFunction,Copper,L1,Top,Signal* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% %ADD11R,0.800000X0.750000*% %ADD12R,0.750000X0.800000*% %ADD13R,1.198880X1.198880*% %ADD14R,1.727200X2.032000*% %ADD15O,1.727200X2.032000*% %ADD16R,0.500000X0.900000*% %ADD17R,0.450000X1.750000*% %ADD18R,1.060000X0.650000*% %ADD19R,2.032000X1.727200*% %ADD20O,2.032000X1.727200*% %ADD21R,0.900000X0.500000*% %ADD22C,1.300000*% %ADD23C,2.800000*% %ADD24C,0.685800*% %ADD25C,0.800000*% %ADD26C,0.500000*% %ADD27C,0.300000*% %ADD28C,0.400000*% %ADD29C,0.800000*% %ADD30C,0.250000*% %ADD31C,0.180000*% %ADD32C,0.160000*% G04 APERTURE END LIST* D10* D11* X165350000Y-82700000D03* X163850000Y-82700000D03* X162350000Y-82700000D03* X160850000Y-82700000D03* D12* X172700000Y-87350000D03* X172700000Y-88850000D03* D11* X181100000Y-90600000D03* X179600000Y-90600000D03* D13* X168800000Y-94500000D03* X168800000Y-96598040D03* X170800000Y-94500000D03* X170800000Y-96598040D03* X172800000Y-94500000D03* X172800000Y-96598040D03* D14* X175640000Y-81600000D03* D15* X173100000Y-81600000D03* X170560000Y-81600000D03* D16* X181100000Y-89000000D03* X179600000Y-89000000D03* X179600000Y-87300000D03* X181100000Y-87300000D03* D17* X156775000Y-92600000D03* X157425000Y-92600000D03* X158075000Y-92600000D03* X158725000Y-92600000D03* X159375000Y-92600000D03* X160025000Y-92600000D03* X160675000Y-92600000D03* X161325000Y-92600000D03* X161975000Y-92600000D03* X162625000Y-92600000D03* X163275000Y-92600000D03* X163925000Y-92600000D03* X164575000Y-92600000D03* X165225000Y-92600000D03* X165225000Y-85400000D03* X164575000Y-85400000D03* X163925000Y-85400000D03* X163275000Y-85400000D03* X162625000Y-85400000D03* X161975000Y-85400000D03* X161325000Y-85400000D03* X160675000Y-85400000D03* X160025000Y-85400000D03* X159375000Y-85400000D03* X158725000Y-85400000D03* X158075000Y-85400000D03* X157425000Y-85400000D03* X156775000Y-85400000D03* D18* X175000000Y-87150000D03* X175000000Y-88100000D03* X175000000Y-89050000D03* X177200000Y-89050000D03* X177200000Y-87150000D03* D19* X184000000Y-86460000D03* D20* X184000000Y-89000000D03* X184000000Y-91540000D03* D13* X174900000Y-94501960D03* X174900000Y-96600000D03* D11* X159000000Y-94600000D03* X160500000Y-94600000D03* X162350000Y-81100000D03* X160850000Y-81100000D03* D21* X171150000Y-88600000D03* X171150000Y-90100000D03* X169550000Y-88600000D03* X169550000Y-90100000D03* X168800000Y-91300000D03* X168800000Y-92800000D03* X170800000Y-91300000D03* X170800000Y-92800000D03* X172800000Y-91300000D03* X172800000Y-92800000D03* X174900000Y-91300000D03* X174900000Y-92800000D03* X176600000Y-91300000D03* X176600000Y-92800000D03* D22* X152900000Y-88350000D03* X152900000Y-90350000D03* X152900000Y-92850000D03* X152900000Y-85850000D03* D23* X150800000Y-83500000D03* X150800000Y-95200000D03* D24* X173700000Y-89200000D03* X162300004Y-87000000D03* X159600000Y-82700000D03* X161700000Y-94600000D03* X176200000Y-96600000D03* X179600000Y-91700000D03* X158100000Y-83900000D03* X168600000Y-89399998D03* X167200000Y-85000000D03* X159600000Y-81100000D03* X163800000Y-81100000D03* D25* X159300000Y-87400000D03* X167300000Y-96600000D03* X167300000Y-94500000D03* X160900000Y-87400000D03* D24* X174900000Y-90299999D03* X174900000Y-85300000D03* D25* X166500002Y-90900000D03* X177200000Y-90200000D03* X168000000Y-87400000D03* X173800000Y-87400000D03* D24* X154500000Y-89792900D03* X154500000Y-88907100D03* D26* X165325000Y-82700000D02* X165325000Y-83475000D01* X165325000Y-83475000D02* X164900000Y-83900000D01* X164900000Y-83900000D02* X164250677Y-83900000D01* X163947598Y-84375049D02* X163927410Y-84395237D01* X164250677Y-83900000D02* X163947598Y-84203079D01* X163947598Y-84203079D02* X163947598Y-84375049D01* X163927410Y-84395237D02* X163927410Y-85400000D01* D27* X165325000Y-82700000D02* X165325000Y-82826415D01* D26* X165350000Y-82700000D02* X165325000Y-82700000D01* X172700000Y-88850000D02* X173350000Y-88850000D01* X173350000Y-88850000D02* X173700000Y-89200000D01* X175000000Y-89050000D02* X173850000Y-89050000D01* X173850000Y-89050000D02* X173700000Y-89200000D01* X175000000Y-88100000D02* X175000000Y-89050000D01* X163850000Y-82700000D02* X163850000Y-83378030D01* X163850000Y-83378030D02* X163295188Y-83932842D01* X163275000Y-84125000D02* X163295188Y-84104812D01* X163295188Y-84104812D02* X163295188Y-83932842D01* X163275000Y-85400000D02* X163275000Y-84125000D01* X160850000Y-82700000D02* X160850000Y-83575000D01* X160850000Y-83575000D02* X160875000Y-83600000D01* X160875000Y-83600000D02* X160900000Y-83600000D01* X161325000Y-85400000D02* X161325000Y-84025000D01* X161325000Y-84025000D02* X160900000Y-83600000D01* X160675000Y-92600000D02* X160675000Y-93800000D01* X160500000Y-94600000D02* X160500000Y-93975000D01* X160500000Y-93975000D02* X160675000Y-93800000D01* X163275000Y-85400000D02* X163275000Y-86509937D01* X163275000Y-86509937D02* X162784937Y-87000000D01* X162784937Y-87000000D02* X162300004Y-87000000D01* X161325000Y-86509929D02* X161815071Y-87000000D01* X161325000Y-85400000D02* X161325000Y-86509929D01* X161815071Y-87000000D02* X162300004Y-87000000D01* X159700000Y-82700000D02* X159600000Y-82700000D01* X160850000Y-82700000D02* X159700000Y-82700000D01* X160850000Y-82700000D02* X160850000Y-81100000D01* X160500000Y-94600000D02* X161700000Y-94600000D01* X158075000Y-85400000D02* X158075000Y-83925000D01* X158075000Y-83925000D02* X158100000Y-83900000D01* X158075000Y-85400000D02* X158725000Y-85400000D01* X179600000Y-90600000D02* X179600000Y-91700000D01* X174900000Y-96600000D02* X176200000Y-96600000D01* X172800000Y-96598040D02* X174898040Y-96598040D01* X174898040Y-96598040D02* X174900000Y-96600000D01* X169250000Y-85000000D02* X170560000Y-83690000D01* X170560000Y-83690000D02* X170560000Y-81600000D01* X167200000Y-85000000D02* X169250000Y-85000000D01* X168600000Y-90500000D02* X168600000Y-89399998D01* X168800000Y-91300000D02* X168800000Y-90700000D01* X168800000Y-90700000D02* X168600000Y-90500000D01* D28* X170500000Y-88600000D02* X171150000Y-88600000D01* D26* X169550000Y-88600000D02* X170500000Y-88600000D01* X168600000Y-89399998D02* X168750002Y-89399998D01* X168750002Y-89399998D02* X169550000Y-88600000D01* X162350000Y-82700000D02* X162350000Y-83575000D01* X162350000Y-83575000D02* X161977410Y-83947590D01* X161977410Y-83947590D02* X161977410Y-85400000D01* D29* X162350000Y-81100000D02* X163800000Y-81100000D01* D30* X174222599Y-89677401D02* X175726921Y-89677401D01* X175726921Y-89677401D02* X176250000Y-89154322D01* X176250000Y-89154322D02* X176250000Y-88675000D01* X176250000Y-88675000D02* X177200000Y-87725000D01* X177200000Y-87725000D02* X177200000Y-87150000D01* D26* X177200000Y-87150000D02* X179450000Y-87150000D01* X179450000Y-87150000D02* X179600000Y-87300000D01* X159000000Y-94600000D02* X159000000Y-94000000D01* X159000000Y-94000000D02* X158725000Y-93725000D01* X158725000Y-93725000D02* X158725000Y-92600000D01* D28* X174222599Y-89677401D02* X173800000Y-90100000D01* X159600000Y-96600000D02* X159000000Y-96000000D01* D27* X181100000Y-87300000D02* X181100000Y-89000000D01* X181100000Y-90600000D02* X181100000Y-89000000D01* X181100000Y-89000000D02* X184000000Y-89000000D01* D26* X168800000Y-94500000D02* X168800000Y-92800000D01* X168800000Y-96598040D02* X167301960Y-96598040D01* X167301960Y-96598040D02* X167300000Y-96600000D01* D27* X159300000Y-87400000D02* X160025000Y-86675000D01* X160025000Y-86675000D02* X160025000Y-85400000D01* D26* X170800000Y-92800000D02* X170800000Y-94500000D01* X167300000Y-94500000D02* X167300000Y-95065685D01* X167300000Y-95065685D02* X167734314Y-95499999D01* X167734314Y-95499999D02* X167876797Y-95499999D01* X167876797Y-95499999D02* X167878639Y-95501841D01* X167878639Y-95501841D02* X170603241Y-95501841D01* X170603241Y-95501841D02* X170800000Y-95698600D01* X170800000Y-95698600D02* X170800000Y-96598040D01* D27* X160675000Y-85400000D02* X160675000Y-86400000D01* X160900000Y-86900000D02* X160675000Y-86675000D01* X160675000Y-86675000D02* X160675000Y-86400000D01* X160900000Y-87400000D02* X160900000Y-86900000D01* D26* X172800000Y-92800000D02* X172800000Y-94500000D01* D27* X175640000Y-81600000D02* X175640000Y-84560000D01* X175640000Y-84560000D02* X174900000Y-85300000D01* D26* X176600000Y-91300000D02* X175599999Y-90299999D01* X175599999Y-90299999D02* X174900000Y-90299999D01* D29* X175640000Y-81600000D02* X180803600Y-81600000D01* X180803600Y-81600000D02* X184000000Y-84796400D01* X184000000Y-84796400D02* X184000000Y-86460000D01* D26* X174900000Y-92800000D02* X174900000Y-94501960D01* D27* X165934317Y-90900000D02* X166500002Y-90900000D01* X159900000Y-90900000D02* X165934317Y-90900000D01* X159375000Y-91425000D02* X159900000Y-90900000D01* X159375000Y-92600000D02* X159375000Y-91425000D01* X177200000Y-90200000D02* X177200000Y-89050000D01* X177200000Y-89050000D02* X179550000Y-89050000D01* X179550000Y-89050000D02* X179600000Y-89000000D01* X166000000Y-89400000D02* X167600001Y-87799999D01* X158400000Y-89400000D02* X166000000Y-89400000D01* X167600001Y-87799999D02* X168000000Y-87400000D01* X156775000Y-91025000D02* X158400000Y-89400000D01* X175000000Y-87150000D02* X174050000Y-87150000D01* X174050000Y-87150000D02* X173800000Y-87400000D01* X156775000Y-91025000D02* X156800000Y-91000000D01* X156775000Y-92600000D02* X156775000Y-91025000D01* D26* X169550000Y-90100000D02* X169600000Y-90100000D01* X169600000Y-90100000D02* X170800000Y-91300000D01* X174900000Y-91300000D02* X175100000Y-91300000D01* X175100000Y-91300000D02* X176600000Y-92800000D01* X171150000Y-90100000D02* X171600000Y-90100000D01* X171600000Y-90100000D02* X172800000Y-91300000D01* D27* X154500000Y-89792900D02* X154342900Y-89792900D01* X154342900Y-89792900D02* X152900000Y-88350000D01* X157560197Y-89599999D02* X154692901Y-89599999D01* X154692901Y-89599999D02* X154500000Y-89792900D01* X165225000Y-86712500D02* X165150000Y-86787500D01* X165225000Y-85400000D02* X165225000Y-86712500D01* X165150000Y-86787500D02* X165150000Y-87703552D01* X165150000Y-87703552D02* X163905962Y-88947590D01* X163905962Y-88947590D02* X158212605Y-88947591D01* X158212605Y-88947591D02* X157560197Y-89599999D01* X157353101Y-89100001D02* X154692901Y-89100001D01* X154692901Y-89100001D02* X154500000Y-88907100D01* X164650000Y-86787500D02* X164650000Y-87496448D01* X158005501Y-88447601D02* X157353101Y-89100001D01* X164575000Y-85400000D02* X164575000Y-86712500D01* X164575000Y-86712500D02* X164650000Y-86787500D01* X164650000Y-87496448D02* X163698847Y-88447601D01* X163698847Y-88447601D02* X158005501Y-88447601D01* D31* G36* X161443040Y-80386260D02* X161404451Y-80479422D01* X161363152Y-80451826D01* X161250000Y-80429319D01* X160450000Y-80429319D01* X160336848Y-80451826D01* X160240922Y-80515922D01* X160176826Y-80611848D01* X160154319Y-80725000D01* X160154319Y-81475000D01* X160176826Y-81588152D01* X160240922Y-81684078D01* X160310000Y-81730235D01* X160310000Y-82069765D01* X160240922Y-82115922D01* X160211470Y-82160000D01* X159949905Y-82160000D01* X159726444Y-82067210D01* X159474661Y-82066991D01* X159241959Y-82163141D01* X159063767Y-82341023D01* X158967210Y-82573556D01* X158966991Y-82825339D01* X159063141Y-83058041D01* X159241023Y-83236233D01* X159473556Y-83332790D01* X159725339Y-83333009D01* X159950439Y-83240000D01* X160211470Y-83240000D01* X160240922Y-83284078D01* X160310000Y-83330235D01* X160310000Y-83575000D01* X160351105Y-83781649D01* X160468162Y-83956838D01* X160493160Y-83981835D01* X160493162Y-83981838D01* X160568503Y-84032179D01* X160765644Y-84229319D01* X160450000Y-84229319D01* X160350000Y-84249210D01* X160250000Y-84229319D01* X159800000Y-84229319D01* X159700000Y-84249210D01* X159600000Y-84229319D01* X159150000Y-84229319D01* X159050000Y-84249210D01* X158950000Y-84229319D01* X158648548Y-84229319D01* X158732790Y-84026444D01* X172906000Y-81774000D01* X172906000Y-81426000D01* X172926000Y-81426000D01* X172926000Y-81406000D01* X173274000Y-81406000D01* X173274000Y-81426000D01* X173274000Y-81426000D01* G37* X173274000Y-81426000D02* X180070000Y-89624732D01* X180070000Y-89953439D01* X180000000Y-89939515D01* X179200000Y-89939515D01* X179090750Y-89961246D01* X178998132Y-90023132D01* X178936246Y-90115750D01* X172926000Y-81774000D01* X172906000Y-81774000D01* X172906000Y-81426000D01* X172926000Y-81426000D01* X172926000Y-81406000D01* X173274000Y-81406000D01* X173274000Y-81426000D01* D31* G36* X181810000Y-87900000D02* X181816851Y-87934442D01* X181836360Y-87963640D01* X181865558Y-87983149D01* X181900000Y-87990000D01* X185210000Y-87990000D01* X185210000Y-89910000D01* X182100000Y-89910000D01* X182065558Y-89916851D01* X182036360Y-89936360D01* X182016851Y-89965558D01* X182010000Y-90000000D01* X182010000Y-91310000D01* X180490000Y-91310000D01* X180490000Y-86190000D01* X181810000Y-86190000D01* X181810000Y-87900000D01* X181810000Y-87900000D01* G37* X181810000Y-87900000D02* X181816851Y-87934442D01* X181836360Y-87963640D01* X181865558Y-87983149D01* X181900000Y-87990000D01* X185210000Y-87990000D01* X185210000Y-89910000D01* X182100000Y-89910000D01* X182065558Y-89916851D01* X182036360Y-89936360D01* X182016851Y-89965558D01* X182010000Y-90000000D01* X182010000Y-91310000D01* X180490000Y-91310000D01* X180490000Y-86190000D01* X181810000Y-86190000D01* X181810000Y-87900000D01* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-F.Mask.gts ================================================ G04 #@! TF.FileFunction,Soldermask,Top* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% %ADD11R,0.800000X0.750000*% %ADD12R,0.750000X0.800000*% %ADD13R,1.198880X1.198880*% %ADD14R,1.727200X2.032000*% %ADD15O,1.727200X2.032000*% %ADD16R,0.500000X0.900000*% %ADD17R,0.450000X1.750000*% %ADD18R,1.060000X0.650000*% %ADD19R,2.032000X1.727200*% %ADD20O,2.032000X1.727200*% %ADD21R,0.900000X0.500000*% %ADD22C,1.300000*% %ADD23C,2.800000*% %ADD24C,1.200000*% G04 APERTURE END LIST* D10* D11* X165350000Y-82700000D03* X163850000Y-82700000D03* X162350000Y-82700000D03* X160850000Y-82700000D03* D12* X172700000Y-87350000D03* X172700000Y-88850000D03* D11* X181100000Y-90600000D03* X179600000Y-90600000D03* D13* X168800000Y-94500000D03* X168800000Y-96598040D03* X170800000Y-94500000D03* X170800000Y-96598040D03* X172800000Y-94500000D03* X172800000Y-96598040D03* D14* X175640000Y-81600000D03* D15* X173100000Y-81600000D03* X170560000Y-81600000D03* D16* X181100000Y-89000000D03* X179600000Y-89000000D03* X179600000Y-87300000D03* X181100000Y-87300000D03* D17* X156775000Y-92600000D03* X157425000Y-92600000D03* X158075000Y-92600000D03* X158725000Y-92600000D03* X159375000Y-92600000D03* X160025000Y-92600000D03* X160675000Y-92600000D03* X161325000Y-92600000D03* X161975000Y-92600000D03* X162625000Y-92600000D03* X163275000Y-92600000D03* X163925000Y-92600000D03* X164575000Y-92600000D03* X165225000Y-92600000D03* X165225000Y-85400000D03* X164575000Y-85400000D03* X163925000Y-85400000D03* X163275000Y-85400000D03* X162625000Y-85400000D03* X161975000Y-85400000D03* X161325000Y-85400000D03* X160675000Y-85400000D03* X160025000Y-85400000D03* X159375000Y-85400000D03* X158725000Y-85400000D03* X158075000Y-85400000D03* X157425000Y-85400000D03* X156775000Y-85400000D03* D18* X175000000Y-87150000D03* X175000000Y-88100000D03* X175000000Y-89050000D03* X177200000Y-89050000D03* X177200000Y-87150000D03* D19* X184000000Y-86460000D03* D20* X184000000Y-89000000D03* X184000000Y-91540000D03* D13* X174900000Y-94501960D03* X174900000Y-96600000D03* D11* X159000000Y-94600000D03* X160500000Y-94600000D03* X162350000Y-81100000D03* X160850000Y-81100000D03* D21* X171150000Y-88600000D03* X171150000Y-90100000D03* X169550000Y-88600000D03* X169550000Y-90100000D03* X168800000Y-91300000D03* X168800000Y-92800000D03* X170800000Y-91300000D03* X170800000Y-92800000D03* X172800000Y-91300000D03* X172800000Y-92800000D03* X174900000Y-91300000D03* X174900000Y-92800000D03* X176600000Y-91300000D03* X176600000Y-92800000D03* D22* X152900000Y-88350000D03* X152900000Y-90350000D03* X152900000Y-92850000D03* X152900000Y-85850000D03* D23* X150800000Y-83500000D03* X150800000Y-95200000D03* D24* X150800000Y-87100000D03* X150800000Y-91600000D03* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-F.Paste.gtp ================================================ G04 #@! TF.FileFunction,Paste,Top* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% G04 APERTURE END LIST* D10* M02* ================================================ FILE: samples/Gerber Image/FelinaePurr-F.SilkS.gto ================================================ G04 #@! TF.FileFunction,Legend,Top* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW (2016-07-14 BZR 6980)-product) date Sunday, 23 April 2017 'PMt' 23:49:01* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.150000*% %ADD11C,0.200000*% %ADD12C,0.500000*% %ADD13C,0.175000*% %ADD14C,0.120000*% %ADD15R,0.800000X0.750000*% %ADD16R,0.750000X0.800000*% %ADD17R,1.198880X1.198880*% %ADD18R,1.727200X2.032000*% %ADD19O,1.727200X2.032000*% %ADD20R,0.500000X0.900000*% %ADD21R,0.450000X1.750000*% %ADD22R,1.060000X0.650000*% %ADD23R,2.032000X1.727200*% %ADD24O,2.032000X1.727200*% %ADD25R,0.900000X0.500000*% %ADD26C,1.300000*% %ADD27C,2.800000*% %ADD28C,1.200000*% G04 APERTURE END LIST* D10* D11* X181000000Y-96250000D02* X181000000Y-96750000D01* X180750000Y-96500000D02* X181250000Y-96500000D01* X180750000Y-97250000D02* X181250000Y-97250000D01* D12* X156000000Y-92800000D02* G75* G03X156000000Y-92800000I-200000J0D01* G01* D13* X174800000Y-84116666D02* X174800000Y-83416666D01* X174966666Y-83416666D01* X175066666Y-83450000D01* X175133333Y-83516666D01* X175166666Y-83583333D01* X175200000Y-83716666D01* X175200000Y-83816666D01* X175166666Y-83950000D01* X175133333Y-84016666D01* X175066666Y-84083333D01* X174966666Y-84116666D01* X174800000Y-84116666D01* X175500000Y-83750000D02* X175733333Y-83750000D01* X157483333Y-97316666D02* X161783333Y-96816666D01* X162450000Y-97116666D02* X162783333Y-97116666D01* X162383333Y-97316666D02* X162616666Y-96616666D01* X162850000Y-97316666D01* D10* X164950000Y-83300000D02* X164250000Y-83300000D01* X164250000Y-82100000D02* X164950000Y-82100000D01* X161950000Y-83300000D02* X161250000Y-83300000D01* X161250000Y-82100000D02* X161950000Y-82100000D01* X173300000Y-87750000D02* X173300000Y-88450000D01* X172100000Y-88450000D02* X172100000Y-87750000D01* X180700000Y-91200000D02* X180000000Y-91200000D01* X180000000Y-90000000D02* X180700000Y-90000000D01* X169550000Y-97149020D02* X169550000Y-94449020D01* X168050000Y-97149020D02* X168050000Y-94449020D01* X168950000Y-95649020D02* X168700000Y-95649020D01* X168700000Y-95649020D02* X168850000Y-95799020D01* X168450000Y-95899020D02* X169150000Y-95899020D01* X168800000Y-95549020D02* X168800000Y-95199020D01* X168800000Y-95899020D02* X168450000Y-95549020D01* X168450000Y-95549020D02* X169150000Y-95549020D01* X169150000Y-95549020D02* X168800000Y-95899020D01* X171550000Y-97149020D02* X171550000Y-94449020D01* X170050000Y-97149020D02* X170050000Y-94449020D01* X170950000Y-95649020D02* X170700000Y-95649020D01* X170700000Y-95649020D02* X170850000Y-95799020D01* X170450000Y-95899020D02* X171150000Y-95899020D01* X170800000Y-95549020D02* X170800000Y-95199020D01* X175900000Y-86400000D02* G75* G03X175900000Y-86400000I-100000J0D01* G01* X176350000Y-86650000D02* X175850000Y-86650000D01* X176350000Y-89550000D02* X176350000Y-86650000D01* X175850000Y-89550000D02* X176350000Y-89550000D01* X175850000Y-86650000D02* X175850000Y-89550000D01* X182730000Y-87730000D02* X182730000Y-92810000D01* X182730000Y-92810000D02* X185270000Y-92810000D01* X185270000Y-92810000D02* X185270000Y-87730000D01* X185550000Y-84910000D02* X185550000Y-86460000D01* X185270000Y-87730000D02* X182730000Y-87730000D01* X175580000Y-92550000D01* X175920000Y-92550000D02* X175920000Y-91550000D01* X177280000Y-91550000D02* X177280000Y-92550000D01* D10* X148000000Y-95350000D02* X148000000Y-83350000D01* X134100000Y-83350000D02* X152800000Y-83350000D01* X134100000Y-95350000D02* X134100000Y-83350000D01* X152900000Y-95350000D02* X141352380Y-88850000D02* X140352380Y-88850000D01* X140495238Y-88945238D01* X140590476Y-89040476D01* X140638095Y-89135714D01* %LPC*% D15* X165350000Y-82700000D03* X163850000Y-82700000D03* X162350000Y-82700000D03* X160850000Y-82700000D03* D16* X172700000Y-87350000D03* X172700000Y-88850000D03* D15* X181100000Y-90600000D03* X179600000Y-90600000D03* D17* X168800000Y-94500000D03* X168800000Y-96598040D03* X170800000Y-94500000D03* X170800000Y-96598040D03* X172800000Y-94500000D03* X172800000Y-96598040D03* D18* X175640000Y-81600000D03* D19* X173100000Y-81600000D03* X170560000Y-81600000D03* D20* X181100000Y-89000000D03* X179600000Y-89000000D03* X179600000Y-87300000D03* X181100000Y-87300000D03* D21* X156775000Y-92600000D03* X157425000Y-92600000D03* X158075000Y-92600000D03* X158725000Y-92600000D03* X159375000Y-92600000D03* X160025000Y-92600000D03* X160675000Y-92600000D03* X161325000Y-92600000D03* X161975000Y-92600000D03* X162625000Y-92600000D03* X163275000Y-92600000D03* X163925000Y-92600000D03* X164575000Y-92600000D03* X165225000Y-92600000D03* X165225000Y-85400000D03* X164575000Y-85400000D03* X163925000Y-85400000D03* X163275000Y-85400000D03* X162625000Y-85400000D03* X161975000Y-85400000D03* X161325000Y-85400000D03* X160675000Y-85400000D03* X160025000Y-85400000D03* X159375000Y-85400000D03* X158725000Y-85400000D03* X158075000Y-85400000D03* X157425000Y-85400000D03* X156775000Y-85400000D03* D22* X175000000Y-87150000D03* X175000000Y-88100000D03* X175000000Y-89050000D03* X177200000Y-89050000D03* X177200000Y-87150000D03* D23* X184000000Y-86460000D03* D24* X184000000Y-89000000D03* X184000000Y-91540000D03* D17* X174900000Y-94501960D03* X174900000Y-96600000D03* D15* X159000000Y-94600000D03* X160500000Y-94600000D03* X162350000Y-81100000D03* X160850000Y-81100000D03* D25* X171150000Y-88600000D03* X171150000Y-90100000D03* X169550000Y-88600000D03* X169550000Y-90100000D03* X168800000Y-91300000D03* X168800000Y-92800000D03* X170800000Y-91300000D03* X170800000Y-92800000D03* X172800000Y-91300000D03* X172800000Y-92800000D03* X174900000Y-91300000D03* X174900000Y-92800000D03* X176600000Y-91300000D03* X176600000Y-92800000D03* D26* X152900000Y-88350000D03* X152900000Y-90350000D03* X152900000Y-92850000D03* X152900000Y-85850000D03* D27* X150800000Y-83500000D03* X150800000Y-95200000D03* D28* X150800000Y-87100000D03* X150800000Y-91600000D03* M02* ================================================ FILE: samples/Gerber Image/GOLMain_RevA-B.Paste.gbp ================================================ G04 #@! TF.FileFunction,Paste,Bot* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.4-stable) date 03/23/17 03:26:40* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11R,1.100000X2.400000*% %ADD12O,1.100000X2.400000*% %ADD13R,2.000000X2.032000*% %ADD14R,1.727200X2.032000*% G04 APERTURE END LIST* D10* D11* X153000000Y-135000000D03* D12* X151000000Y-135000000D03* X149000000Y-135000000D03* X147000000Y-135000000D03* X145000000Y-135000000D03* X143000000Y-135000000D03* X141000000Y-135000000D03* X139000000Y-135000000D03* X139000000Y-119000000D03* X141000000Y-119000000D03* X143000000Y-119000000D03* X145000000Y-119000000D03* X147000000Y-119000000D03* X149000000Y-119000000D03* X151000000Y-119000000D03* X153000000Y-119000000D03* D13* X94500000Y-125500000D03* X97040000Y-125500000D03* X99580000Y-125500000D03* X94500000Y-128500000D03* X97040000Y-128500000D03* X99580000Y-128500000D03* X94500000Y-131500000D03* X97040000Y-131500000D03* X99580000Y-131500000D03* X94500000Y-134500000D03* X97040000Y-134500000D03* X99580000Y-134500000D03* X97040000Y-137500000D03* X99580000Y-137500000D03* D14* X94500000Y-140500000D03* D13* X97040000Y-140500000D03* X99580000Y-140500000D03* X94500000Y-143500000D03* X97040000Y-143500000D03* X99580000Y-143500000D03* X94500000Y-146500000D03* X97040000Y-146500000D03* X99580000Y-146500000D03* M02* ================================================ FILE: samples/Gerber Image/LIDARLite.ncl ================================================ G04 DipTrace 2.4.0.2* %INLIDARLite.ncl*% %MOIN*% %ADD11C,0.0394*% %FSLAX44Y44*% G04* G70* G90* G75* G01* %LNBoardOutline*% %LPD*% X0Y23622D2* D11* X27953D1* Y0D1* X0D1* Y23622D1* X591Y23110D2* X13819D1* X591Y591D2* Y11614D1* Y12087D2* Y23110D1* X14291D2* X27520D1* X591Y591D2* X13819D1* X14291D2* X27520D1* Y11614D1* Y12087D2* Y23110D1* M02* ================================================ FILE: samples/Gerber Image/nonaprs_contour.gko ================================================ G04 MADE WITH FRITZING* G04 WWW.FRITZING.ORG* G04 DOUBLE SIDED* G04 HOLES PLATED* G04 CONTOUR ON CENTER OF CONTOUR VECTOR* %ASAXBY*% %FSLAX23Y23*% %MOIN*% %OFA0B0*% %SFA1.0B1.0*% %ADD10R,1.267940X2.408830*% %ADD11C,0.008000*% %ADD10C,0.008*% %LNCONTOUR*% G90* G70* G54D10* G54D11* X4Y2405D02* X1264Y2405D01* X1264Y4D01* X4Y4D01* X4Y2405D01* D02* G04 End of contour* M02* ================================================ FILE: samples/Gerber Image/simonShield-B.Cu.gbr ================================================ G04 #@! TF.FileFunction,Copper,L2,Bot,Signal* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:18 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11C,0.150000*% %ADD12C,0.300000*% %ADD13C,1.600000*% %ADD14O,1.600000X1.600000*% %ADD15R,2.000000X1.524000*% %ADD16O,2.000000X1.524000*% %ADD17R,1.300000X1.300000*% %ADD18C,1.300000*% %ADD19C,1.998980*% %ADD20R,1.900000X2.000000*% %ADD21C,1.900000*% %ADD22R,1.727200X1.727200*% %ADD23O,1.727200X1.727200*% %ADD24C,1.000760*% %ADD25C,1.397000*% %ADD26C,1.600200*% %ADD27C,1.270000*% %ADD28C,1.500000*% %ADD29C,1.200000*% %ADD30C,0.900000*% %ADD31C,0.600000*% %ADD32C,0.304800*% %ADD33C,0.635000*% %ADD34C,0.450000*% G04 APERTURE END LIST* D10* D11* X196250000Y-118000000D02* X113000000Y-118000000D01* X196250000Y-52750000D02* X196250000Y-118000000D01* X113000000Y-52750000D02* X196250000Y-52750000D01* X113000000Y-118000000D02* X113000000Y-52750000D01* D12* X189307143Y-112775000D02* X188592857Y-112775000D01* X189450000Y-113203571D02* X188950000Y-111703571D01* X191107143Y-58571429D01* X191178571Y-58714286D01* X191321429Y-58857143D01* X191535714Y-58928571D01* X191892857Y-58928571D01* X190392857Y-57428571D02* X190392857Y-58642857D01* X190321429Y-58785714D01* X190250000Y-58857143D01* X190107143Y-58928571D01* X189821429Y-58928571D01* X189678571Y-58857143D01* X189607143Y-58785714D01* X189535714Y-58642857D01* X189535714Y-57428571D01* X188821428Y-58357143D02* X170107142Y-55928571D01* X170392856Y-55928571D01* X170535713Y-55857143D01* X170678570Y-55714286D01* X170749999Y-55428571D01* X170749999Y-54928571D01* X170678570Y-54642857D01* X170535713Y-54500000D01* X170392856Y-54428571D01* X169107141Y-55928571D02* X169107141Y-54428571D01* X168249998Y-55928571D01* X168249998Y-54428571D01* D13* X145400000Y-68800000D03* D14* X145400000Y-58640000D03* D15* X189230000Y-61468000D03* D16* X191770000Y-61468000D03* X189230000Y-74168000D03* X191770000Y-64008000D03* X189230000Y-76708000D03* X191770000Y-66548000D03* X189230000Y-79248000D03* X191770000Y-69088000D03* X189230000Y-81788000D03* X191770000Y-71628000D03* X189230000Y-84328000D03* X191770000Y-74168000D03* X189230000Y-86868000D03* X191770000Y-76708000D03* X189230000Y-89408000D03* X191770000Y-79248000D03* X189230000Y-91948000D03* X191770000Y-81788000D03* X189230000Y-94488000D03* X191770000Y-84328000D03* X189230000Y-97028000D03* X191770000Y-86868000D03* X189230000Y-99568000D03* X191770000Y-89408000D03* X191770000Y-91948000D03* X189230000Y-102108000D03* X191770000Y-94488000D03* X191770000Y-99568000D03* X191770000Y-102108000D03* X191770000Y-104648000D03* X191770000Y-107188000D03* X189230000Y-104648000D03* X189230000Y-107188000D03* X189230000Y-64008000D03* X189230000Y-66548000D03* X189230000Y-69088000D03* X189230000Y-71628000D03* X189230000Y-109728000D03* X191770000Y-109728000D03* X191770000Y-97028000D03* D15* X118110000Y-61468000D03* D16* X120650000Y-61468000D03* X118110000Y-64008000D03* X120650000Y-64008000D03* X118110000Y-66548000D03* X120650000Y-66548000D03* X118110000Y-69088000D03* X120650000Y-69088000D03* X118110000Y-71628000D03* X120650000Y-71628000D03* X118110000Y-74168000D03* X120650000Y-74168000D03* X118110000Y-76708000D03* X120650000Y-76708000D03* X118110000Y-79248000D03* X120650000Y-79248000D03* X118110000Y-81788000D03* X120650000Y-81788000D03* X118110000Y-84328000D03* X120650000Y-84328000D03* X118110000Y-86868000D03* X120650000Y-86868000D03* X118110000Y-89408000D03* X120650000Y-89408000D03* X118110000Y-91948000D03* X120650000Y-91948000D03* X118110000Y-94488000D03* X120650000Y-94488000D03* X118110000Y-97028000D03* X120650000Y-97028000D03* X118110000Y-99568000D03* X120650000Y-99568000D03* X118110000Y-102108000D03* X120650000Y-102108000D03* X118110000Y-104648000D03* X120650000Y-104648000D03* X118110000Y-107188000D03* X120650000Y-107188000D03* X118110000Y-109728000D03* X120650000Y-109728000D03* D17* X135255000Y-64008000D03* D18* X135255000Y-61508000D03* D19* X164465000Y-85471000D03* X164465000Y-77851000D03* D20* X136017000Y-72644000D03* D21* X133477000Y-72644000D03* D20* X173863000Y-72644000D03* D21* X176403000Y-72644000D03* D20* X136017000Y-96139000D03* D21* X133477000Y-96139000D03* D20* X173863000Y-96012000D03* D21* X176403000Y-96012000D03* D22* X127007800Y-61542700D03* D23* X129547800Y-61542700D03* X127007800Y-64082700D03* X129547800Y-64082700D03* D24* X166243000Y-67056000D03* X164973000Y-68326000D03* X164973000Y-65786000D03* X128143000Y-71374000D03* X129413000Y-72644000D03* X126873000Y-72644000D03* X181737000Y-73914000D03* X180467000Y-72644000D03* X183007000Y-72644000D03* X128143000Y-94742000D03* X129413000Y-96012000D03* X126873000Y-96012000D03* X181737000Y-97282000D03* X180467000Y-96012000D03* X183007000Y-96012000D03* D19* X134239000Y-85344000D03* X134239000Y-77724000D03* X145415000Y-85344000D03* X145415000Y-77724000D03* X175641000Y-85217000D03* X175641000Y-77597000D03* X145415000Y-108966000D03* X145415000Y-101346000D03* X134239000Y-108458000D03* X134239000Y-100838000D03* X175641000Y-108585000D03* X175641000Y-100965000D03* X164465000Y-108839000D03* X164465000Y-101219000D03* X169164000Y-62611000D03* X161544000Y-62611000D03* X169164000Y-59563000D03* X161544000Y-59563000D03* X129921000Y-85217000D03* X129921000Y-77597000D03* X126365000Y-85217000D03* X126365000Y-77597000D03* X180086000Y-85217000D03* X180086000Y-77597000D03* X183515000Y-85217000D03* X183515000Y-77597000D03* X129921000Y-108458000D03* X129921000Y-100838000D03* X126365000Y-108458000D03* X126365000Y-100838000D03* X179959000Y-108585000D03* X179959000Y-100965000D03* X183515000Y-108585000D03* X183515000Y-100965000D03* D13* X155000000Y-99000000D03* D14* X155000000Y-88840000D03* D25* X137287000Y-77724000D03* X142367000Y-77724000D03* X137287000Y-85344000D03* X142367000Y-85344000D03* X148463000Y-77724000D03* X153543000Y-77724000D03* X148463000Y-85344000D03* X153543000Y-85344000D03* X172593000Y-85344000D03* X167513000Y-85344000D03* X172593000Y-77724000D03* X167513000Y-77724000D03* X161417000Y-85344000D03* X156337000Y-85344000D03* X161417000Y-77724000D03* X156337000Y-77724000D03* X148463000Y-101219000D03* X153543000Y-101219000D03* X148463000Y-108839000D03* X153543000Y-108839000D03* X137287000Y-101219000D03* X142367000Y-101219000D03* X137287000Y-108839000D03* X142367000Y-108839000D03* X172593000Y-108712000D03* X167513000Y-108712000D03* X172593000Y-101092000D03* X167513000Y-101092000D03* X161417000Y-108712000D03* X156337000Y-108712000D03* X161417000Y-101092000D03* X156337000Y-101092000D03* D26* X157178971Y-64124429D03* X150828971Y-64124429D03* D27* X137287000Y-80137000D03* X137287000Y-83439000D03* X148336000Y-79629000D03* X148463000Y-83185000D03* X172593000Y-80137000D03* X172593000Y-83312000D03* X161417000Y-80010000D03* X161417000Y-83439000D03* X137287000Y-103505000D03* X137287000Y-106680000D03* X172593000Y-103378000D03* X172593000Y-106934000D03* X148463000Y-103505000D03* X148463000Y-106934000D03* X161417000Y-103759000D03* X161417000Y-106934000D03* D28* X145400000Y-68800000D02* X145400000Y-70800000D01* X148800000Y-74200000D02* X153200000Y-74200000D01* X153200000Y-74200000D02* X154947800Y-75947800D01* X154947800Y-75947800D02* X154947800Y-77858800D01* X145400000Y-70800000D02* X148800000Y-74200000D01* X145400000Y-61508000D02* X145400000Y-58640000D01* D29* X135255000Y-61508000D02* X142600000Y-61508000D01* X142600000Y-61508000D02* X145400000Y-61508000D01* X145400000Y-61508000D02* X148212542Y-61508000D01* X148212542Y-61508000D02* X150828971Y-64124429D01* D30* X118110000Y-64008000D02* X116908002Y-64008000D01* D28* X131147000Y-57400000D02* X135255000Y-61508000D01* D29* X118100000Y-57400000D02* X131147000Y-57400000D01* D30* X116100002Y-59399998D02* X118100000Y-57400000D01* X116100002Y-63200000D02* X116100002Y-59399998D01* X116908002Y-64008000D02* X116100002Y-63200000D01* X167513000Y-101092000D02* X167513000Y-108712000D01* D31* X156337000Y-101092000D02* X156337000Y-104037000D01* X177103500Y-105300000D02* X177998300Y-104405200D01* X157600000Y-105300000D02* X177103500Y-105300000D01* X156337000Y-104037000D02* X157600000Y-105300000D01* D30* X142367000Y-85344000D02* X142367000Y-81661000D01* D32* X142367000Y-81661000D02* X142367000Y-81608700D01* D28* X154947800Y-85598000D02* X154947800Y-77858800D01* D33* X154947800Y-85418700D02* X154947800Y-85598000D01* X154947800Y-77858800D02* X154940000Y-77851000D01* X154940000Y-77851000D02* X154940000Y-77798700D01* D30* X167513000Y-85344000D02* X167513000Y-81534000D01* D32* X167513000Y-81534000D02* X167520800Y-81534000D01* D29* X154940000Y-108786700D02* X154940000Y-101219000D01* D33* X154940000Y-101219000D02* X154940000Y-101166700D01* D29* X142367000Y-108839000D02* X142367000Y-105029000D01* D32* X142367000Y-105029000D02* X142367000Y-104976700D01* D33* X153550800Y-108786700D02* X154940000Y-108786700D01* X154940000Y-108786700D02* X156344800Y-108786700D01* D30* X153550800Y-85418700D02* X154947800Y-85418700D01* X154947800Y-85418700D02* X156344800Y-85418700D01* D33* X153550800Y-101166700D02* X154940000Y-101166700D01* X154940000Y-101166700D02* X155074800Y-101166700D01* X155074800Y-101166700D02* X156344800Y-101166700D01* D31* X174632800Y-98118700D02* X173870800Y-97356700D01* X173870800Y-97356700D02* X173870800Y-96086700D01* X132468800Y-104976700D02* X142367000Y-104976700D01* D32* X142367000Y-104976700D02* X142374800Y-104976700D01* X136024800Y-96086700D02* X136024800Y-96856700D01* D29* X131960800Y-98880700D02* X131960800Y-104468700D01* D31* X132422800Y-98418700D02* X131960800Y-98880700D01* X134462800Y-98418700D02* X132422800Y-98418700D01* X136024800Y-96856700D02* X134462800Y-98418700D01* X131960800Y-104468700D02* X132468800Y-104976700D01* D29* X142374800Y-101166700D02* X142374800Y-104976700D01* D30* X153550800Y-104214700D02* X153550800Y-101166700D01* X152788800Y-104976700D02* X153550800Y-104214700D01* D31* X142374800Y-104976700D02* X152788800Y-104976700D01* D32* X177426800Y-104976700D02* X177998300Y-104405200D01* X177998300Y-104405200D02* X177934800Y-104468700D01* D30* X177934800Y-104468700D02* X177934800Y-98880700D01* X177934800Y-98880700D02* X177172800Y-98118700D01* D31* X177172800Y-98118700D02* X174632800Y-98118700D01* X173870800Y-73988700D02* X173870800Y-72718700D01* D30* X174632800Y-74750700D02* X173870800Y-73988700D01* D32* X131960800Y-81100700D02* X132024300Y-81164200D01* D33* X132024300Y-81164200D02* X132468800Y-81608700D01* X131960800Y-75512700D02* X131960800Y-81100700D01* D30* X177172800Y-74750700D02* X174632800Y-74750700D01* X177934800Y-75512700D02* X177172800Y-74750700D01* X177934800Y-81100700D02* X177934800Y-75512700D01* D31* X177426800Y-81608700D02* X177934800Y-81100700D01* D33* X132722800Y-74750700D02* X131960800Y-75512700D01* X135262800Y-74750700D02* X132722800Y-74750700D01* X136024800Y-73988700D02* X135262800Y-74750700D01* X136024800Y-72718700D02* X136024800Y-73988700D01* X132468800Y-81608700D02* X142367000Y-81608700D01* D32* X142367000Y-81608700D02* X142374800Y-81608700D01* X167520800Y-81608700D02* X167520800Y-81534000D01* D30* X167520800Y-81534000D02* X167520800Y-77798700D01* D31* X157106800Y-81608700D02* X167520800Y-81608700D01* X167520800Y-81608700D02* X177426800Y-81608700D01* D33* X153550800Y-77798700D02* X154940000Y-77798700D01* X154940000Y-77798700D02* X156344800Y-77798700D01* X142374800Y-81608700D02* X152788800Y-81608700D01* D30* X152788800Y-81608700D02* X153550800Y-80846700D01* X153550800Y-80846700D02* X153550800Y-77798700D01* X156344800Y-77798700D02* X156344800Y-80846700D01* X156344800Y-80846700D02* X157106800Y-81608700D01* X142374800Y-77798700D02* X142374800Y-81608700D01* D32* X133484800Y-72718700D02* X133738800Y-72464700D01* X133738800Y-72464700D02* X133484800Y-72718700D01* D29* X129420800Y-72718700D02* X133484800Y-72718700D01* D30* X180474800Y-72718700D02* X176410800Y-72718700D01* X180474800Y-96086700D02* X176410800Y-96086700D01* D32* X166410164Y-67016464D02* X166936536Y-67016464D01* D30* X169235300Y-64717700D02* X169235300Y-62558700D01* X166936536Y-67016464D02* X169235300Y-64717700D01* X165140164Y-68286464D02* X163616164Y-68286465D01* X159552164Y-64222465D02* X157266164Y-64222465D01* X163616164Y-68286465D02* X159552164Y-64222465D01* D32* X157266164Y-64222465D02* X157178971Y-64124429D01* X157262972Y-64194429D02* X157178971Y-64124429D01* D34* X128150800Y-75004700D02* X128150800Y-71448700D01* D33* X128658800Y-75512700D02* X128150800Y-75004700D01* X129420800Y-75512700D02* X128658800Y-75512700D01* X129928800Y-76020700D02* X129420800Y-75512700D01* X129928800Y-77544700D02* X129928800Y-76020700D01* D31* X127084050Y-75715950D02* X127084050Y-75584050D01* X126873000Y-75373000D02* X126873000Y-72644000D01* X127084050Y-75584050D02* X126873000Y-75373000D01* D34* X128150800Y-76782700D02* X127084050Y-75715950D01* X127084050Y-75715950D02* X126880800Y-75512700D01* X128150800Y-79576700D02* X128150800Y-76782700D01* D30* X126372800Y-81354700D02* X128150800Y-79576700D01* X126372800Y-85164700D02* X126372800Y-81354700D01* X181744800Y-73988700D02* X181744800Y-75004700D01* X179966800Y-76020700D02* X179966800Y-77290700D01* X180474800Y-75512700D02* X179966800Y-76020700D01* X181236800Y-75512700D02* X180474800Y-75512700D01* X181744800Y-75004700D02* X181236800Y-75512700D01* D32* X179966800Y-77290700D02* X180220800Y-77544700D01* D30* X183522800Y-85164700D02* X183522800Y-81354700D01* D34* X183014800Y-75512700D02* X183014800Y-72718700D01* X181744800Y-76782700D02* X183014800Y-75512700D01* X181744800Y-79576700D02* X181744800Y-76782700D01* D30* X183522800Y-81354700D02* X181744800Y-79576700D01* D32* X179966800Y-100658700D02* X180220800Y-100912700D01* D31* X179966800Y-99388700D02* X179966800Y-100658700D01* X180474800Y-98880700D02* X179966800Y-99388700D01* X181236800Y-98880700D02* X180474800Y-98880700D01* X181744800Y-98372700D02* X181236800Y-98880700D01* X181744800Y-97356700D02* X181744800Y-98372700D01* X183515000Y-108585000D02* X183515000Y-106115000D01* X183600000Y-96605000D02* X183007000Y-96012000D01* X183600000Y-98100000D02* X183600000Y-96605000D01* X181700000Y-100000000D02* X183600000Y-98100000D01* X181700000Y-104300000D02* X181700000Y-100000000D01* X183515000Y-106115000D02* X181700000Y-104300000D01* D30* X120650000Y-84328000D02* X122828000Y-84328000D01* D34* X127000000Y-88100000D02* X131483000Y-88100000D01* X131483000Y-88100000D02* X134239000Y-85344000D01* X125100000Y-88100000D02* X123200000Y-86200000D01* X123200000Y-86200000D02* X123200000Y-84700000D01* X123200000Y-84700000D02* X122900000Y-84400000D01* X127000000Y-88100000D02* X125100000Y-88100000D01* D30* X122828000Y-84328000D02* X122900000Y-84400000D01* D29* X137287000Y-85344000D02* X137287000Y-83439000D01* X137287000Y-80137000D02* X137287000Y-77724000D01* D32* X137040800Y-85164700D02* X137294800Y-85418700D01* D29* X134246800Y-85164700D02* X137040800Y-85164700D01* D30* X120650000Y-86868000D02* X121668000Y-86868000D01* D34* X123900000Y-89100000D02* X122800000Y-88000000D01* X141659000Y-89100000D02* X145415000Y-85344000D01* X141659000Y-89100000D02* X123900000Y-89100000D01* D30* X121668000Y-86868000D02* X122800000Y-88000000D01* X148463000Y-85344000D02* X148463000Y-83185000D01* X148463000Y-79502000D02* X148463000Y-77724000D01* D32* X148336000Y-79629000D02* X148463000Y-79502000D01* D30* X148470800Y-85418700D02* X145422800Y-85418700D01* X120650000Y-91948000D02* X123152000Y-91948000D01* D34* X141100000Y-91300000D02* X123800000Y-91300000D01* X123800000Y-91300000D02* X123300000Y-91800000D01* D30* X165237000Y-92700000D02* X172593000Y-85344000D01* X142500000Y-92700000D02* X165237000Y-92700000D01* D34* X142050000Y-92250000D02* X142500000Y-92700000D01* X142050000Y-92250000D02* X141100000Y-91300000D01* D30* X123152000Y-91948000D02* X123300000Y-91800000D01* X175641000Y-85217000D02* X172720000Y-85217000D01* X172720000Y-85217000D02* X172593000Y-85344000D01* X172593000Y-85344000D02* X172593000Y-83312000D01* X172593000Y-80137000D02* X172593000Y-77724000D01* D32* X172600800Y-85418700D02* X172854800Y-85164700D01* D30* X120650000Y-89408000D02* X122108000Y-89408000D01* X122108000Y-89408000D02* X122800000Y-90100000D01* D34* X142100000Y-90100000D02* X122800000Y-90100000D01* X142100000Y-90100000D02* X143000000Y-91000000D01* D30* X143000000Y-91000000D02* X158936000Y-91000000D01* X164465000Y-85471000D02* X158936000Y-91000000D01* D34* X122800000Y-90100000D02* X122900000Y-90200000D01* D30* X161417000Y-85344000D02* X161417000Y-83439000D01* X161417000Y-80010000D02* X161417000Y-77724000D01* X161424800Y-85418700D02* X165234800Y-85418700D01* X120650000Y-104648000D02* X122548000Y-104648000D01* D34* X123500000Y-105600000D02* X122750000Y-104850000D01* X123500000Y-110100000D02* X123500000Y-105600000D01* X124900000Y-111500000D02* X123500000Y-110100000D01* D31* X131100000Y-111500000D02* X124900000Y-111500000D01* X131100000Y-111500000D02* X134142000Y-108458000D01* D30* X122548000Y-104648000D02* X122750000Y-104850000D01* D34* X134239000Y-108458000D02* X134142000Y-108458000D01* D30* X137287000Y-108839000D02* X137287000Y-106680000D01* X137287000Y-103505000D02* X137287000Y-101219000D01* D32* X137040800Y-108532700D02* X137294800Y-108786700D01* D30* X134246800Y-108532700D02* X137040800Y-108532700D01* D32* X120653400Y-104651400D02* X120650000Y-104648000D01* D30* X116100000Y-105700000D02* X116100000Y-105400000D01* D31* X175641000Y-110559000D02* X171100000Y-115100000D01* X171100000Y-115100000D02* X119900000Y-115100000D01* X119900000Y-115100000D02* X116100000Y-111300000D01* X116100000Y-111300000D02* X116100000Y-105700000D01* X175641000Y-108585000D02* X175641000Y-110559000D01* D30* X116852000Y-104648000D02* X118110000Y-104648000D01* X116100000Y-105400000D02* X116852000Y-104648000D01* X172593000Y-108712000D02* X172593000Y-106934000D01* X172593000Y-103378000D02* X172593000Y-101092000D01* X175641000Y-108585000D02* X172720000Y-108585000D01* D32* X172720000Y-108585000D02* X172593000Y-108712000D01* D28* X164973000Y-65786000D02* X164973000Y-61515307D01* X164700000Y-61242307D02* X163108164Y-59650464D01* X163108164Y-59650464D02* X161584164Y-59650465D01* X164973000Y-61515307D02* X164700000Y-61242307D01* D30* X129420800Y-96086700D02* X133484800Y-96086700D01* D32* X133738800Y-95832700D02* X133484800Y-96086700D01* X133484800Y-96086700D02* X133738800Y-95832700D01* D31* X129928800Y-99388700D02* X129420800Y-98880700D01* X129420800Y-98880700D02* X128658800Y-98880700D01* X128658800Y-98880700D02* X128150800Y-98372700D01* X129928800Y-100912700D02* X129928800Y-99388700D01* D34* X128150800Y-98372700D02* X128150800Y-94816700D01* D28* X126372800Y-104722700D02* X128150800Y-102944700D01* D34* X128150800Y-102944700D02* X128150800Y-100150700D01* X128150800Y-100150700D02* X126880800Y-98880700D01* D28* X126372800Y-108532700D02* X126372800Y-104722700D01* D31* X126880800Y-98880700D02* X126880800Y-96086700D01* D34* X120650000Y-107188000D02* X122488000Y-107188000D01* D31* X141800000Y-112700000D02* X145415000Y-109085000D01* X141800000Y-112700000D02* X124100000Y-112700000D01* D34* X124100000Y-112700000D02* X122600000Y-111200000D01* X122600000Y-107300000D02* X122600000Y-111200000D01* X122488000Y-107188000D02* X122600000Y-107300000D01* D30* X145415000Y-108966000D02* X145415000Y-109085000D01* X148463000Y-108839000D02* X148463000Y-106934000D01* X148463000Y-103505000D02* X148463000Y-101219000D01* X148470800Y-108786700D02* X145422800Y-108786700D01* D32* X145422800Y-108786700D02* X144660800Y-108786700D01* D30* X120650000Y-109728000D02* X120650000Y-111350000D01* D31* X160300000Y-113900000D02* X123200000Y-113900000D01* X123200000Y-113900000D02* X120900000Y-111600000D01* X160300000Y-113900000D02* X164465000Y-109735000D01* D30* X120650000Y-111350000D02* X120900000Y-111600000D01* D34* X164465000Y-108839000D02* X164465000Y-109735000D01* D30* X161417000Y-108712000D02* X161417000Y-106934000D01* X161417000Y-103759000D02* X161417000Y-101092000D01* X164465000Y-108839000D02* X161544000Y-108839000D01* D32* X161544000Y-108839000D02* X161417000Y-108712000D01* D29* X118110000Y-61468000D02* X118110000Y-60190000D01* X124665100Y-59200000D02* X127007800Y-61542700D01* X119100000Y-59200000D02* X124665100Y-59200000D01* X118110000Y-60190000D02* X119100000Y-59200000D01* X120650000Y-61468000D02* X122968000Y-61468000D01* X124882700Y-64082700D02* X127007800Y-64082700D01* X124000000Y-63200000D02* X124882700Y-64082700D01* X124000000Y-62500000D02* X124000000Y-63200000D01* X122968000Y-61468000D02* X124000000Y-62500000D01* D30* X120650000Y-81788000D02* X122488000Y-81788000D01* X122488000Y-81788000D02* X122600000Y-81900000D01* D34* X127400000Y-87100000D02* X125500000Y-87100000D01* X122600000Y-81900000D02* X122500000Y-81900000D01* X124300000Y-83600000D02* X122600000Y-81900000D01* X124300000Y-85900000D02* X124300000Y-83600000D01* X125500000Y-87100000D02* X124300000Y-85900000D01* D31* X129921000Y-86579000D02* X129921000Y-85217000D01* X129400000Y-87100000D02* X129921000Y-86579000D01* D34* X127400000Y-87100000D02* X129400000Y-87100000D01* D30* X120650000Y-94488000D02* X123012000Y-94488000D01* D34* X140500000Y-93400000D02* X139400000Y-92300000D01* X139400000Y-92300000D02* X125200000Y-92300000D01* X125200000Y-92300000D02* X123200000Y-94300000D01* D30* X180086000Y-87214000D02* X180086000Y-85217000D01* D34* X142700000Y-94900000D02* X141200000Y-93400000D01* D30* X166500000Y-94900000D02* X142700000Y-94900000D01* X171100000Y-90300000D02* X166500000Y-94900000D01* X177000000Y-90300000D02* X171100000Y-90300000D01* X180086000Y-87214000D02* X177000000Y-90300000D01* D34* X141200000Y-93400000D02* X140500000Y-93400000D01* D30* X123012000Y-94488000D02* X123200000Y-94300000D01* D32* X179966800Y-85164700D02* X180220800Y-85164700D01* D30* X120650000Y-102108000D02* X123408000Y-102108000D01* D34* X124500000Y-103200000D02* X123250000Y-101950000D01* X124500000Y-109300000D02* X124500000Y-103200000D01* X125600000Y-110400000D02* X124500000Y-109300000D01* X127900000Y-110400000D02* X125600000Y-110400000D01* D31* X127900000Y-110400000D02* X129842000Y-108458000D01* D30* X123408000Y-102108000D02* X123250000Y-101950000D01* D34* X129921000Y-108458000D02* X129842000Y-108458000D01* D30* X115800000Y-102600000D02* X116300000Y-102100000D01* D31* X179959000Y-110841000D02* X174400000Y-116400000D01* X174400000Y-116400000D02* X118500000Y-116400000D01* X118500000Y-116400000D02* X114800000Y-112700000D01* X114800000Y-112700000D02* X114800000Y-103600000D01* X114800000Y-103600000D02* X115800000Y-102600000D01* X179959000Y-108585000D02* X179959000Y-110841000D01* D30* X116300000Y-102100000D02* X118102000Y-102100000D01* X118102000Y-102100000D02* X118110000Y-102108000D01* X118110000Y-71628000D02* X115400000Y-71628000D01* X114600000Y-64700000D02* X115400000Y-65500000D01* X115400000Y-65500000D02* X115400000Y-71800000D01* D28* X159811000Y-62611000D02* X161544000Y-62611000D01* X157600000Y-60400000D02* X159811000Y-62611000D01* X157600000Y-58667000D02* X157600000Y-60400000D01* X153733000Y-54800000D02* X157600000Y-58667000D01* X117400000Y-54800000D02* X153733000Y-54800000D01* D30* X114600000Y-57600000D02* X117400000Y-54800000D01* X114600000Y-57600000D02* X114600000Y-64700000D01* X115400000Y-71628000D02* X115400000Y-71800000D01* D29* X145415000Y-97300000D02* X151200000Y-97300000D01* X158600000Y-97200000D02* X169200000Y-97200000D01* X158200000Y-96800000D02* X158600000Y-97200000D01* D30* X151700000Y-96800000D02* X158200000Y-96800000D01* X151200000Y-97300000D02* X151700000Y-96800000D01* X170900000Y-98900000D02* X169200000Y-97200000D01* X173500000Y-98900000D02* X170900000Y-98900000D01* X175565000Y-100965000D02* X173500000Y-98900000D01* D29* X164465000Y-97965000D02* X164400000Y-97900000D01* X164465000Y-101219000D02* X164465000Y-97965000D01* X145415000Y-101346000D02* X145415000Y-97300000D01* X145415000Y-97300000D02* X145415000Y-97200000D01* D30* X175641000Y-100965000D02* X175565000Y-100965000D01* D29* X138400000Y-98900000D02* X138700000Y-98900000D01* D30* X136200000Y-98900000D02* X138400000Y-98900000D01* X134262000Y-100838000D02* X136200000Y-98900000D01* D29* X138700000Y-98900000D02* X140400000Y-97200000D01* X145500000Y-97500000D02* X145500000Y-97200000D01* X145500000Y-97285000D02* X145500000Y-97500000D01* X145415000Y-97200000D02* X145500000Y-97285000D01* X139400000Y-94700000D02* X139400000Y-96200000D01* X139400000Y-96200000D02* X140400000Y-97200000D01* X171700000Y-93200000D02* X183300000Y-93200000D01* X169200000Y-97200000D02* X171100000Y-95300000D01* X171100000Y-95300000D02* X171100000Y-93800000D01* X171100000Y-93800000D02* X171700000Y-93200000D01* X140400000Y-97200000D02* X145500000Y-97200000D01* D30* X183250000Y-93150000D02* X183300000Y-93200000D01* D28* X183300000Y-93200000D02* X185900000Y-95800000D01* X183515000Y-100965000D02* X185900000Y-98580000D01* X185900000Y-95800000D02* X185900000Y-98580000D01* X183700000Y-92900000D02* X186316800Y-90283200D01* D29* X186316800Y-90283200D02* X186316800Y-75004700D01* D28* X185618300Y-68273700D02* X180093800Y-68273700D01* D29* X186316800Y-68972200D02* X185935800Y-68591200D01* D33* X185935800Y-68591200D02* X185618300Y-68273700D01* D29* X186316800Y-75004700D02* X186316800Y-68972200D01* D31* X134239000Y-100838000D02* X134262000Y-100838000D01* X126365000Y-100838000D02* X126338000Y-100838000D01* X126338000Y-100838000D02* X125000000Y-99500000D01* X125000000Y-99500000D02* X125000000Y-95200000D01* X125000000Y-95200000D02* X126700000Y-93500000D01* X126700000Y-93500000D02* X138200000Y-93500000D01* X138200000Y-93500000D02* X139400000Y-94700000D01* D30* X139400000Y-94700000D02* X139200000Y-94500000D01* D28* X170500000Y-75500000D02* X170500000Y-68273700D01* D29* X170500000Y-68273700D02* X170010000Y-68273700D01* D28* X164465000Y-77851000D02* X164465000Y-76285000D01* X165250000Y-75500000D02* X170500000Y-75500000D01* D30* X170500000Y-75500000D02* X171250000Y-75500000D01* D28* X164465000Y-76285000D02* X165250000Y-75500000D01* D30* X173544000Y-75500000D02* X175641000Y-77597000D01* X171250000Y-75500000D02* X173544000Y-75500000D01* D28* X145415000Y-77724000D02* X145415000Y-75665000D01* X144000000Y-74250000D02* X140500000Y-74250000D01* X145415000Y-75665000D02* X144000000Y-74250000D01* D31* X134239000Y-77724000D02* X134239000Y-77511000D01* X134239000Y-77511000D02* X136500000Y-75250000D01* D29* X136500000Y-75250000D02* X139500000Y-75250000D01* X139500000Y-75250000D02* X140500000Y-74250000D01* D28* X140500000Y-74250000D02* X140500000Y-71250000D01* X140500000Y-71250000D02* X137750000Y-68500000D01* X137750000Y-68500000D02* X129250000Y-68500000D01* D30* X129250000Y-68500000D02* X129250000Y-68750000D01* D31* X126365000Y-77597000D02* X126347000Y-77597000D01* D29* X126347000Y-77597000D02* X123200000Y-74450000D01* X123200000Y-74450000D02* X123200000Y-73050000D01* D28* X123200000Y-73050000D02* X127500000Y-68750000D01* X127500000Y-68750000D02* X129250000Y-68750000D01* D30* X129250000Y-68750000D02* X129000000Y-68750000D01* X129000000Y-68750000D02* X129547800Y-68202200D01* D28* X129547800Y-68202200D02* X129547800Y-64082700D01* X129547800Y-61542700D02* X129547800Y-64082700D01* X131000000Y-64082700D02* X129547800Y-64082700D01* X159974000Y-67750000D02* X150322000Y-67750000D01* X150322000Y-67750000D02* X146642000Y-64070000D01* X146642000Y-64070000D02* X142070000Y-64070000D01* D33* X142070000Y-64070000D02* X142070000Y-64082700D01* D28* X170010000Y-68273700D02* X168726300Y-68273700D01* X163224000Y-71000000D02* X159974000Y-67750000D01* X166000000Y-71000000D02* X163224000Y-71000000D01* X168726300Y-68273700D02* X166000000Y-71000000D01* D33* X171457800Y-68273700D02* X170010000Y-68273700D01* D28* X180093800Y-68273700D02* X171457800Y-68273700D01* D33* X170010000Y-68273700D02* X169806800Y-68273700D01* X142438300Y-64082700D02* X142070000Y-64082700D01* D28* X142070000Y-64082700D02* X131000000Y-64082700D01* D33* X131000000Y-64082700D02* X130817800Y-64082700D01* X132722800Y-64082700D02* X130817800Y-64082700D01* D28* X171521300Y-59637700D02* X171521300Y-59650464D01* D29* X169204164Y-59650464D02* X171521300Y-59650464D01* D33* X171521300Y-59650464D02* X171534064Y-59650464D01* D28* X171534064Y-59650464D02* X180093800Y-68210200D01* D33* X180093800Y-68210200D02* X180093800Y-68273700D01* D32* X145422800Y-101166700D02* X145422800Y-100658700D01* M02* ================================================ FILE: samples/Gerber Image/simonShield-B.Mask.gbr ================================================ G04 #@! TF.FileFunction,Soldermask,Bot* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:18 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11C,0.150000*% %ADD12C,2.000000*% %ADD13O,2.000000X2.000000*% %ADD14R,2.400000X1.924000*% %ADD15O,2.400000X1.924000*% %ADD16R,1.700000X1.700000*% %ADD17C,1.700000*% %ADD18C,2.398980*% %ADD19R,2.300000X2.400000*% %ADD20C,2.300000*% %ADD21R,2.127200X2.127200*% %ADD22O,2.127200X2.127200*% %ADD23C,1.400760*% %ADD24C,1.797000*% %ADD25C,2.000200*% G04 APERTURE END LIST* D10* D11* X196250000Y-118000000D02* X113000000Y-118000000D01* X196250000Y-52750000D02* X196250000Y-118000000D01* X113000000Y-52750000D02* X196250000Y-52750000D01* X113000000Y-118000000D02* X113000000Y-52750000D01* D12* X145400000Y-68800000D03* D13* X145400000Y-58640000D03* D14* X189230000Y-61468000D03* D15* X191770000Y-61468000D03* X189230000Y-74168000D03* X189230000Y-109728000D03* X191770000Y-109728000D03* X191770000Y-97028000D03* D14* X118110000Y-61468000D03* D15* X120650000Y-61468000D03* X118110000Y-64008000D03* X120650000Y-64008000D03* X118110000Y-66548000D03* X120650000Y-66548000D03* X118110000Y-69088000D03* X120650000Y-69088000D03* X118110000Y-71628000D03* X120650000Y-71628000D03* X118110000Y-74168000D03* X120650000Y-74168000D03* X118110000Y-76708000D03* X120650000Y-76708000D03* X118110000Y-79248000D03* X120650000Y-79248000D03* X118110000Y-81788000D03* X120650000Y-81788000D03* X118110000Y-84328000D03* X120650000Y-84328000D03* X118110000Y-86868000D03* X120650000Y-86868000D03* X118110000Y-89408000D03* X120650000Y-89408000D03* X118110000Y-91948000D03* X120650000Y-91948000D03* X118110000Y-94488000D03* X120650000Y-94488000D03* X118110000Y-97028000D03* X120650000Y-97028000D03* X118110000Y-99568000D03* X120650000Y-99568000D03* X118110000Y-102108000D03* X120650000Y-102108000D03* X118110000Y-104648000D03* X120650000Y-104648000D03* X118110000Y-107188000D03* X120650000Y-107188000D03* X118110000Y-109728000D03* X120650000Y-109728000D03* D16* X135255000Y-64008000D03* D17* X135255000Y-61508000D03* D18* X164465000Y-85471000D03* X164465000Y-77851000D03* D19* X136017000Y-72644000D03* D20* X133477000Y-72644000D03* D19* X173863000Y-72644000D03* D20* X176403000Y-72644000D03* D19* X136017000Y-96139000D03* D20* X133477000Y-96139000D03* D19* X173863000Y-96012000D03* D20* X176403000Y-96012000D03* D21* X127007800Y-61542700D03* D22* X129547800Y-61542700D03* X127007800Y-64082700D03* X129547800Y-64082700D03* D23* X166243000Y-67056000D03* X164973000Y-68326000D03* X164973000Y-65786000D03* X128143000Y-71374000D03* X129413000Y-72644000D03* X126873000Y-72644000D03* X181737000Y-73914000D03* X180467000Y-72644000D03* X183007000Y-72644000D03* X128143000Y-94742000D03* X129413000Y-96012000D03* X126873000Y-96012000D03* X181737000Y-97282000D03* X180467000Y-96012000D03* X183007000Y-96012000D03* D18* X134239000Y-85344000D03* X134239000Y-77724000D03* X145415000Y-85344000D03* X145415000Y-77724000D03* X175641000Y-85217000D03* X175641000Y-77597000D03* X145415000Y-108966000D03* X145415000Y-101346000D03* X134239000Y-108458000D03* X134239000Y-100838000D03* X175641000Y-108585000D03* X175641000Y-100965000D03* X164465000Y-108839000D03* X164465000Y-101219000D03* X169164000Y-62611000D03* X161544000Y-62611000D03* X169164000Y-59563000D03* X161544000Y-59563000D03* X129921000Y-85217000D03* X129921000Y-77597000D03* X126365000Y-85217000D03* X126365000Y-77597000D03* X180086000Y-85217000D03* X180086000Y-77597000D03* X183515000Y-85217000D03* X183515000Y-77597000D03* X129921000Y-108458000D03* X129921000Y-100838000D03* X126365000Y-108458000D03* X126365000Y-100838000D03* X179959000Y-108585000D03* X179959000Y-100965000D03* X183515000Y-108585000D03* X183515000Y-100965000D03* D12* X155000000Y-99000000D03* D13* X155000000Y-88840000D03* D24* X137287000Y-77724000D03* X142367000Y-77724000D03* X137287000Y-85344000D03* X142367000Y-85344000D03* X148463000Y-77724000D03* X153543000Y-77724000D03* X148463000Y-85344000D03* X153543000Y-85344000D03* X172593000Y-85344000D03* X167513000Y-85344000D03* X172593000Y-77724000D03* X167513000Y-77724000D03* X161417000Y-85344000D03* X156337000Y-85344000D03* X161417000Y-77724000D03* X156337000Y-77724000D03* X148463000Y-101219000D03* X153543000Y-101219000D03* X148463000Y-108839000D03* X153543000Y-108839000D03* X137287000Y-101219000D03* X142367000Y-101219000D03* X137287000Y-108839000D03* X142367000Y-108839000D03* X172593000Y-108712000D03* X167513000Y-108712000D03* X172593000Y-101092000D03* X167513000Y-101092000D03* X161417000Y-108712000D03* X156337000Y-108712000D03* X161417000Y-101092000D03* X156337000Y-101092000D03* D25* X157178971Y-64124429D03* X150828971Y-64124429D03* M02* ================================================ FILE: samples/Gerber Image/simonShield-Edge.Cuts.gbr ================================================ G04 #@! TF.FileFunction,Profile,NP* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:18 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11C,0.150000*% G04 APERTURE END LIST* D10* D11* X196250000Y-118000000D02* X113000000Y-118000000D01* X196250000Y-52750000D02* X196250000Y-118000000D01* X113000000Y-52750000D02* X196250000Y-52750000D01* X113000000Y-118000000D02* X113000000Y-52750000D01* M02* ================================================ FILE: samples/Gerber Image/simonShield-F.Cu.gbr ================================================ G04 #@! TF.FileFunction,Copper,L1,Top,Signal* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:18 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11C,0.150000*% %ADD12C,1.600000*% %ADD13O,1.600000X1.600000*% %ADD14R,2.000000X1.524000*% %ADD15O,2.000000X1.524000*% %ADD16R,1.300000X1.300000*% %ADD17C,1.300000*% %ADD18C,1.998980*% %ADD19R,1.900000X2.000000*% %ADD20C,1.900000*% %ADD21C,1.000000*% %ADD22R,1.727200X1.727200*% %ADD23O,1.727200X1.727200*% %ADD24C,1.000760*% %ADD25C,1.397000*% %ADD26C,1.600200*% %ADD27C,1.270000*% %ADD28C,0.304800*% G04 APERTURE END LIST* D10* D11* X196250000Y-118000000D02* X113000000Y-118000000D01* X196250000Y-52750000D02* X196250000Y-118000000D01* X113000000Y-52750000D02* X196250000Y-52750000D01* X113000000Y-118000000D02* X113000000Y-52750000D01* D12* X145400000Y-68800000D03* D13* X145400000Y-58640000D03* D14* X189230000Y-61468000D03* D15* X191770000Y-61468000D03* X189230000Y-74168000D03* X191770000Y-64008000D03* X189230000Y-76708000D03* X191770000Y-66548000D03* X189230000Y-79248000D03* X191770000Y-69088000D03* X189230000Y-81788000D03* X191770000Y-71628000D03* X189230000Y-84328000D03* X191770000Y-74168000D03* X189230000Y-86868000D03* X191770000Y-76708000D03* X189230000Y-89408000D03* X191770000Y-79248000D03* X189230000Y-91948000D03* X191770000Y-81788000D03* X189230000Y-94488000D03* X191770000Y-84328000D03* X189230000Y-97028000D03* X191770000Y-86868000D03* X189230000Y-99568000D03* X191770000Y-89408000D03* X191770000Y-91948000D03* X189230000Y-102108000D03* X191770000Y-94488000D03* X191770000Y-99568000D03* X191770000Y-102108000D03* X191770000Y-104648000D03* X191770000Y-107188000D03* X189230000Y-104648000D03* X189230000Y-107188000D03* X189230000Y-64008000D03* X189230000Y-66548000D03* X189230000Y-69088000D03* X189230000Y-71628000D03* X189230000Y-109728000D03* X191770000Y-109728000D03* X191770000Y-97028000D03* D14* X118110000Y-61468000D03* D15* X120650000Y-61468000D03* X118110000Y-64008000D03* X120650000Y-64008000D03* X118110000Y-66548000D03* X120650000Y-66548000D03* X118110000Y-69088000D03* X120650000Y-69088000D03* X118110000Y-71628000D03* X120650000Y-71628000D03* X118110000Y-74168000D03* X120650000Y-74168000D03* X118110000Y-76708000D03* X120650000Y-76708000D03* X118110000Y-79248000D03* X120650000Y-79248000D03* X118110000Y-81788000D03* X120650000Y-81788000D03* X118110000Y-84328000D03* X120650000Y-84328000D03* X118110000Y-86868000D03* X120650000Y-86868000D03* X118110000Y-89408000D03* X120650000Y-89408000D03* X118110000Y-91948000D03* X120650000Y-91948000D03* X118110000Y-94488000D03* X120650000Y-94488000D03* X118110000Y-97028000D03* X120650000Y-97028000D03* X118110000Y-99568000D03* X120650000Y-99568000D03* X118110000Y-102108000D03* X120650000Y-102108000D03* X118110000Y-104648000D03* X120650000Y-104648000D03* X118110000Y-107188000D03* X120650000Y-107188000D03* X118110000Y-109728000D03* X120650000Y-109728000D03* D16* X135255000Y-64008000D03* D17* X135255000Y-61508000D03* D18* X164465000Y-85471000D03* X164465000Y-77851000D03* D19* X136017000Y-72644000D03* D20* X133477000Y-72644000D03* D19* X173863000Y-72644000D03* D20* X176403000Y-72644000D03* D19* X136017000Y-96139000D03* D20* X133477000Y-96139000D03* D19* X173863000Y-96012000D03* D20* X176403000Y-96012000D03* D21* X125250000Y-112250000D03* X160500000Y-70500000D03* X167250000Y-92250000D03* D22* X127007800Y-61542700D03* D23* X129547800Y-61542700D03* X127007800Y-64082700D03* X129547800Y-64082700D03* D24* X166243000Y-67056000D03* X164973000Y-68326000D03* X164973000Y-65786000D03* X128143000Y-71374000D03* X129413000Y-72644000D03* X126873000Y-72644000D03* X181737000Y-73914000D03* X180467000Y-72644000D03* X183007000Y-72644000D03* X128143000Y-94742000D03* X129413000Y-96012000D03* X126873000Y-96012000D03* X181737000Y-97282000D03* X180467000Y-96012000D03* X183007000Y-96012000D03* D18* X134239000Y-85344000D03* X134239000Y-77724000D03* X145415000Y-85344000D03* X145415000Y-77724000D03* X175641000Y-85217000D03* X175641000Y-77597000D03* X145415000Y-108966000D03* X145415000Y-101346000D03* X134239000Y-108458000D03* X134239000Y-100838000D03* X175641000Y-108585000D03* X175641000Y-100965000D03* X164465000Y-108839000D03* X164465000Y-101219000D03* X169164000Y-62611000D03* X161544000Y-62611000D03* X169164000Y-59563000D03* X161544000Y-59563000D03* X129921000Y-85217000D03* X129921000Y-77597000D03* X126365000Y-85217000D03* X126365000Y-77597000D03* X180086000Y-85217000D03* X180086000Y-77597000D03* X183515000Y-85217000D03* X183515000Y-77597000D03* X129921000Y-108458000D03* X129921000Y-100838000D03* X126365000Y-108458000D03* X126365000Y-100838000D03* X179959000Y-108585000D03* X179959000Y-100965000D03* X183515000Y-108585000D03* X183515000Y-100965000D03* D12* X155000000Y-99000000D03* D13* X155000000Y-88840000D03* D25* X137287000Y-77724000D03* X142367000Y-77724000D03* X137287000Y-85344000D03* X142367000Y-85344000D03* X148463000Y-77724000D03* X153543000Y-77724000D03* X148463000Y-85344000D03* X153543000Y-85344000D03* X172593000Y-85344000D03* X167513000Y-85344000D03* X172593000Y-77724000D03* X167513000Y-77724000D03* X161417000Y-85344000D03* X156337000Y-85344000D03* X161417000Y-77724000D03* X156337000Y-77724000D03* X148463000Y-101219000D03* X153543000Y-101219000D03* X148463000Y-108839000D03* X153543000Y-108839000D03* X137287000Y-101219000D03* X142367000Y-101219000D03* X137287000Y-108839000D03* X142367000Y-108839000D03* X172593000Y-108712000D03* X167513000Y-108712000D03* X172593000Y-101092000D03* X167513000Y-101092000D03* X161417000Y-108712000D03* X156337000Y-108712000D03* X161417000Y-101092000D03* X156337000Y-101092000D03* D26* X157178971Y-64124429D03* X150828971Y-64124429D03* D27* X137287000Y-80137000D03* X137287000Y-83439000D03* X148336000Y-79629000D03* X148463000Y-83185000D03* X172593000Y-80137000D03* X172593000Y-83312000D03* X161417000Y-80010000D03* X161417000Y-83439000D03* X137287000Y-103505000D03* X137287000Y-106680000D03* X172593000Y-103378000D03* X172593000Y-106934000D03* X148463000Y-103505000D03* X148463000Y-106934000D03* X161417000Y-103759000D03* X161417000Y-106934000D03* D28* X137287000Y-83439000D02* X137287000Y-80137000D01* X148336000Y-83058000D02* X148336000Y-79629000D01* X148463000Y-83185000D02* X148336000Y-83058000D01* X172593000Y-83312000D02* X172593000Y-80137000D01* X161417000Y-83439000D02* X161417000Y-80010000D01* X137287000Y-106680000D02* X137287000Y-103505000D01* X172593000Y-106934000D02* X172593000Y-103378000D01* X148463000Y-106934000D02* X148463000Y-103505000D01* X161417000Y-106934000D02* X161417000Y-103759000D01* M02* ================================================ FILE: samples/Gerber Image/simonShield-F.Mask.gbr ================================================ G04 #@! TF.FileFunction,Soldermask,Top* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:18 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11C,0.150000*% %ADD12C,2.000000*% %ADD13O,2.000000X2.000000*% %ADD14R,2.400000X1.924000*% %ADD15O,2.400000X1.924000*% %ADD16R,1.700000X1.700000*% %ADD17C,1.700000*% %ADD18C,2.398980*% %ADD19R,2.300000X2.400000*% %ADD20C,2.300000*% %ADD21C,4.000000*% %ADD22R,2.127200X2.127200*% %ADD23O,2.127200X2.127200*% %ADD24C,1.400760*% %ADD25C,1.797000*% %ADD26C,2.000200*% G04 APERTURE END LIST* D10* D11* X196250000Y-118000000D02* X113000000Y-118000000D01* X196250000Y-52750000D02* X196250000Y-118000000D01* X113000000Y-52750000D02* X196250000Y-52750000D01* X113000000Y-118000000D02* X113000000Y-52750000D01* D12* X145400000Y-68800000D03* D13* X145400000Y-58640000D03* D14* X189230000Y-61468000D03* D15* X191770000Y-61468000D03* X189230000Y-74168000D03* X191770000Y-64008000D03* X189230000Y-76708000D03* X191770000Y-66548000D03* X189230000Y-79248000D03* X191770000Y-69088000D03* X189230000Y-81788000D03* X191770000Y-71628000D03* X189230000Y-84328000D03* X191770000Y-74168000D03* X189230000Y-86868000D03* X191770000Y-76708000D03* X189230000Y-89408000D03* X191770000Y-79248000D03* X189230000Y-91948000D03* X191770000Y-81788000D03* X189230000Y-94488000D03* X191770000Y-84328000D03* X189230000Y-97028000D03* X191770000Y-86868000D03* X189230000Y-99568000D03* X191770000Y-89408000D03* X191770000Y-91948000D03* X189230000Y-102108000D03* X191770000Y-94488000D03* X191770000Y-99568000D03* X191770000Y-102108000D03* X191770000Y-104648000D03* X191770000Y-107188000D03* X189230000Y-104648000D03* X189230000Y-107188000D03* X189230000Y-64008000D03* X189230000Y-66548000D03* X189230000Y-69088000D03* X189230000Y-71628000D03* X189230000Y-109728000D03* X191770000Y-109728000D03* X191770000Y-97028000D03* D14* X118110000Y-61468000D03* D15* X120650000Y-61468000D03* X118110000Y-64008000D03* X120650000Y-64008000D03* X118110000Y-66548000D03* X120650000Y-66548000D03* X118110000Y-69088000D03* X120650000Y-69088000D03* X118110000Y-71628000D03* X120650000Y-71628000D03* X118110000Y-74168000D03* X120650000Y-74168000D03* X118110000Y-76708000D03* X120650000Y-76708000D03* X118110000Y-79248000D03* X120650000Y-79248000D03* X118110000Y-81788000D03* X120650000Y-81788000D03* X118110000Y-84328000D03* X120650000Y-84328000D03* X118110000Y-86868000D03* X120650000Y-86868000D03* X118110000Y-89408000D03* X120650000Y-89408000D03* X118110000Y-91948000D03* X120650000Y-91948000D03* X118110000Y-94488000D03* X120650000Y-94488000D03* X118110000Y-97028000D03* X120650000Y-97028000D03* X118110000Y-99568000D03* X120650000Y-99568000D03* X118110000Y-102108000D03* X120650000Y-102108000D03* X118110000Y-104648000D03* X120650000Y-104648000D03* X118110000Y-107188000D03* X120650000Y-107188000D03* X118110000Y-109728000D03* X120650000Y-109728000D03* D16* X135255000Y-64008000D03* D17* X135255000Y-61508000D03* D18* X164465000Y-85471000D03* X164465000Y-77851000D03* D19* X136017000Y-72644000D03* D20* X133477000Y-72644000D03* D19* X173863000Y-72644000D03* D20* X176403000Y-72644000D03* D19* X136017000Y-96139000D03* D20* X133477000Y-96139000D03* D19* X173863000Y-96012000D03* D20* X176403000Y-96012000D03* D21* X125250000Y-112250000D03* X160500000Y-70500000D03* X167250000Y-92250000D03* D22* X127007800Y-61542700D03* D23* X129547800Y-61542700D03* X127007800Y-64082700D03* X129547800Y-64082700D03* D24* X166243000Y-67056000D03* X164973000Y-68326000D03* X164973000Y-65786000D03* X128143000Y-71374000D03* X129413000Y-72644000D03* X126873000Y-72644000D03* X181737000Y-73914000D03* X180467000Y-72644000D03* X183007000Y-72644000D03* X128143000Y-94742000D03* X129413000Y-96012000D03* X126873000Y-96012000D03* X181737000Y-97282000D03* X180467000Y-96012000D03* X183007000Y-96012000D03* D18* X134239000Y-85344000D03* X134239000Y-77724000D03* X145415000Y-85344000D03* X145415000Y-77724000D03* X175641000Y-85217000D03* X175641000Y-77597000D03* X145415000Y-108966000D03* X145415000Y-101346000D03* X134239000Y-108458000D03* X134239000Y-100838000D03* X175641000Y-108585000D03* X175641000Y-100965000D03* X164465000Y-108839000D03* X164465000Y-101219000D03* X169164000Y-62611000D03* X161544000Y-62611000D03* X169164000Y-59563000D03* X161544000Y-59563000D03* X129921000Y-85217000D03* X129921000Y-77597000D03* X126365000Y-85217000D03* X126365000Y-77597000D03* X180086000Y-85217000D03* X180086000Y-77597000D03* X183515000Y-85217000D03* X183515000Y-77597000D03* X129921000Y-108458000D03* X129921000Y-100838000D03* X126365000Y-108458000D03* X126365000Y-100838000D03* X179959000Y-108585000D03* X179959000Y-100965000D03* X183515000Y-108585000D03* X183515000Y-100965000D03* D12* X155000000Y-99000000D03* D13* X155000000Y-88840000D03* D25* X137287000Y-77724000D03* X142367000Y-77724000D03* X137287000Y-85344000D03* X142367000Y-85344000D03* X148463000Y-77724000D03* X153543000Y-77724000D03* X148463000Y-85344000D03* X153543000Y-85344000D03* X172593000Y-85344000D03* X167513000Y-85344000D03* X172593000Y-77724000D03* X167513000Y-77724000D03* X161417000Y-85344000D03* X156337000Y-85344000D03* X161417000Y-77724000D03* X156337000Y-77724000D03* X148463000Y-101219000D03* X153543000Y-101219000D03* X148463000Y-108839000D03* X153543000Y-108839000D03* X137287000Y-101219000D03* X142367000Y-101219000D03* X137287000Y-108839000D03* X142367000Y-108839000D03* X172593000Y-108712000D03* X167513000Y-108712000D03* X172593000Y-101092000D03* X167513000Y-101092000D03* X161417000Y-108712000D03* X156337000Y-108712000D03* X161417000Y-101092000D03* X156337000Y-101092000D03* D26* X157178971Y-64124429D03* X150828971Y-64124429D03* M02* ================================================ FILE: samples/Gerber Image/simonShield-F.SilkS.gbr ================================================ G04 #@! TF.FileFunction,Legend,Top* %FSLAX46Y46*% G04 Gerber Fmt 4.6, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:18 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.100000*% %ADD11C,0.150000*% %ADD12C,0.187500*% %ADD13C,0.125000*% %ADD14C,0.300000*% %ADD15C,0.120000*% %ADD16C,0.002540*% %ADD17C,0.200000*% %ADD18C,0.170000*% %ADD19C,0.175000*% %ADD20C,0.180000*% %ADD21C,0.190000*% G04 APERTURE END LIST* D10* D11* X196250000Y-118000000D02* X113000000Y-118000000D01* X196250000Y-52750000D02* X196250000Y-118000000D01* X113000000Y-52750000D02* X196250000Y-52750000D01* X113000000Y-118000000D02* X113000000Y-52750000D01* D12* X171964285Y-68083333D02* X123317001Y-106767381D01* X123650334Y-106767381D02* X123745572Y-106767381D01* X123793191Y-106815000D01* X123840810Y-106910238D01* X123864619Y-107100714D01* X123864619Y-107434048D01* X123840810Y-107624524D01* X123793191Y-107719762D01* X123745572Y-107767381D01* X123650334Y-107767381D01* X123602715Y-107719762D01* X123555096Y-107624524D01* X123531286Y-107434048D01* X123531286Y-107100714D01* X123555096Y-106910238D01* X123602715Y-106815000D01* X123650334Y-106767381D01* X124031287Y-106767381D02* X196102429Y-69431810D01* D13* X193274334Y-66254381D02* X193393381Y-67254381D01* X193488619Y-66540095D01* X193583857Y-67254381D01* X193702905Y-66254381D01* X193869572Y-66968667D02* X194107667Y-66968667D01* X193821953Y-67254381D02* X193988620Y-66254381D01* X194155286Y-67254381D01* X194321953Y-67254381D02* X194321953Y-66254381D01* X194607667Y-67254381D02* X194393381Y-66682952D01* X194607667Y-66254381D02* X194321953Y-66825810D01* X194821953Y-66730571D02* X194988619Y-66730571D01* X195060048Y-67254381D02* X194821953Y-67254381D01* X194821953Y-66254381D01* X195060048Y-66254381D01* X195274334Y-66254381D02* X195274334Y-67063905D01* X195298143Y-67159143D01* X195321953Y-67206762D01* X195369572Y-67254381D01* X195464810Y-67254381D01* X195512429Y-67206762D01* X195536238Y-67159143D01* X195560048Y-67063905D01* X195560048Y-66254381D01* X195798144Y-67254381D02* X195798144Y-66254381D01* X195988620Y-66254381D01* X196036239Y-66302000D01* X196060048Y-66349619D01* X196083858Y-66444857D01* X196083858Y-66587714D01* X196060048Y-66682952D01* X196036239Y-66730571D01* X195988620Y-66778190D01* X195798144Y-66778190D01* D17* X193929096Y-64016000D02* X193833858Y-63968381D01* X193691001Y-63968381D01* X193548143Y-64016000D01* X193452905Y-64111238D01* X193405286Y-64206476D01* X193357667Y-64396952D01* X193357667Y-64539810D01* X193405286Y-64730286D01* X193452905Y-64825524D01* X193548143Y-64920762D01* X193691001Y-64968381D01* X193786239Y-64968381D01* X193929096Y-64920762D01* X193976715Y-64873143D01* X193976715Y-64539810D01* X193786239Y-64539810D01* X194405286Y-64968381D02* X194405286Y-63968381D01* X194976715Y-64968381D01* X194976715Y-63968381D01* X195452905Y-64968381D02* X195452905Y-63968381D01* X195691000Y-63968381D01* X195833858Y-64016000D01* X195929096Y-64111238D01* X195976715Y-64206476D01* X196024334Y-64396952D01* X196024334Y-64539810D01* X195976715Y-64730286D01* X195929096Y-64825524D01* X195833858Y-64920762D01* X195691000Y-64968381D01* X195452905Y-64968381D01* X193278286Y-61539429D02* X194040191Y-61539429D01* X193659239Y-61920381D02* X193659239Y-61158476D01* X194992572Y-60920381D02* X194516381Y-60920381D01* X194468762Y-61396571D01* X194516381Y-61348952D01* X194611619Y-61301333D01* X194849715Y-61301333D01* X194944953Y-61348952D01* X194992572Y-61396571D01* X186697905Y-84637524D01* X186602667Y-84732762D01* X186459809Y-84780381D01* X186221714Y-84780381D01* X187174095Y-84494667D02* X187650286Y-84494667D01* X187078857Y-84780381D02* X187412190Y-83780381D01* X187745524Y-84780381D01* D13* X185555048Y-81240381D02* X185721715Y-82240381D01* X185888381Y-81240381D01* X186055048Y-82240381D02* X186055048Y-81240381D01* X186174095Y-81240381D01* X186245524Y-81288000D01* X186293143Y-81383238D01* X186316952Y-81478476D01* X186340762Y-81668952D01* X186340762Y-81811810D01* X186316952Y-82002286D01* X186293143Y-82097524D01* X186245524Y-82192762D01* X186174095Y-82240381D01* X186055048Y-82240381D01* X186555048Y-82240381D02* X186555048Y-81240381D01* X186674095Y-81240381D01* X186745524Y-81288000D01* X186793143Y-81383238D01* X186816952Y-81478476D01* X186840762Y-81668952D01* X186840762Y-81811810D01* X186816952Y-82002286D01* X186793143Y-82097524D01* X186745524Y-82192762D01* X186674095Y-82240381D01* X186555048Y-82240381D01* X187031238Y-81954667D02* X187269333Y-81954667D01* X186983619Y-82240381D02* X187150286Y-81240381D01* X187316952Y-82240381D01* D17* X185245524Y-79700381D02* X185245524Y-78700381D01* X185483619Y-78700381D01* X185626477Y-78748000D01* X185721715Y-78843238D01* X185769334Y-78938476D01* X185816953Y-79128952D01* X185816953Y-79271810D01* X185769334Y-79462286D01* X185721715Y-79557524D01* X185626477Y-79652762D01* X185483619Y-79700381D01* X185245524Y-79700381D01* X186197905Y-79414667D02* X186674096Y-79414667D01* X186102667Y-79700381D02* X186436000Y-78700381D01* X186769334Y-79700381D01* X187674096Y-79605143D02* X187626477Y-79652762D01* X187483620Y-79700381D01* X187388382Y-79700381D01* X187245524Y-79652762D01* X187150286Y-79557524D01* X187102667Y-79462286D01* X187055048Y-79271810D01* X187055048Y-79128952D01* X187102667Y-78938476D01* X187150286Y-78843238D01* X187245524Y-78748000D01* X187388382Y-78700381D01* X187483620Y-78700381D01* X187626477Y-78748000D01* X187674096Y-78795619D01* X185745524Y-77065143D02* X185697905Y-77112762D01* X185555048Y-77160381D01* X185459810Y-77160381D01* X185316952Y-77112762D01* X185221714Y-77017524D01* X185174095Y-76922286D01* X185126476Y-76731810D01* X185126476Y-76588952D01* X185174095Y-76398476D01* X185221714Y-76303238D01* X185316952Y-76208000D01* X185459810Y-76160381D01* X185555048Y-76160381D01* X185697905Y-76208000D01* X185745524Y-76255619D01* X186174095Y-77160381D02* X186174095Y-76160381D01* X186174095Y-76636571D02* X186745524Y-76636571D01* X186745524Y-77160381D02* X186745524Y-76160381D01* X187745524Y-77160381D02* X187174095Y-77160381D01* X187459809Y-77160381D02* X187459809Y-76160381D01* X187364571Y-76303238D01* X187269333Y-76398476D01* X187174095Y-76446095D01* X185491524Y-74525143D02* X185443905Y-74572762D01* X185301048Y-74620381D01* X185205810Y-74620381D01* X185062952Y-74572762D01* X184967714Y-74477524D01* X184920095Y-74382286D01* X184872476Y-74191810D01* X184872476Y-74048952D01* X184920095Y-73858476D01* X184967714Y-73763238D01* X185062952Y-73668000D01* X185205810Y-73620381D01* X185301048Y-73620381D01* X185443905Y-73668000D01* X185491524Y-73715619D01* X185920095Y-74620381D02* X185920095Y-73620381D01* X185920095Y-74096571D02* X186491524Y-74096571D01* X186491524Y-74620381D02* X186491524Y-73620381D01* X186920095Y-73715619D02* X186967714Y-73668000D01* X187062952Y-73620381D01* X187301048Y-73620381D01* X187396286Y-73668000D01* X187443905Y-73715619D01* X187491524Y-73810857D01* X187491524Y-73906095D01* X187443905Y-74048952D01* X186872476Y-74620381D01* X187491524Y-74620381D01* X185491524Y-71985143D02* X185443905Y-72032762D01* X185301048Y-72080381D01* X185205810Y-72080381D01* X185062952Y-72032762D01* X184967714Y-71937524D01* X184920095Y-71842286D01* X184872476Y-71651810D01* X184872476Y-71508952D01* X184920095Y-71318476D01* X184967714Y-71223238D01* X185062952Y-71128000D01* X185205810Y-71080381D01* X185301048Y-71080381D01* X185443905Y-71128000D01* X185491524Y-71175619D01* X185920095Y-72080381D02* X185920095Y-71080381D01* X185920095Y-71556571D02* X186491524Y-71556571D01* X186491524Y-72080381D02* X186491524Y-71080381D01* X186872476Y-71080381D02* X187491524Y-71080381D01* X187158190Y-71461333D01* X187301048Y-71461333D01* X187396286Y-71508952D01* X187443905Y-71556571D01* X187491524Y-71651810D01* X187491524Y-71889905D01* X187443905Y-71985143D01* X187396286Y-72032762D01* X187301048Y-72080381D01* X187015333Y-72080381D01* X186920095Y-72032762D01* X186872476Y-71985143D01* D13* X186094762Y-68588000D02* X186047143Y-68540381D01* X185975715Y-68540381D01* X185904286Y-68588000D01* X185856667Y-68683238D01* X185832858Y-68778476D01* X185809048Y-68968952D01* X185809048Y-69111810D01* X185832858Y-69302286D01* X185856667Y-69397524D01* X185904286Y-69492762D01* X185975715Y-69540381D01* X186023334Y-69540381D01* X186094762Y-69492762D01* X186118572Y-69445143D01* X186118572Y-69111810D01* X186023334Y-69111810D01* X186332858Y-69540381D02* X186332858Y-68540381D01* X186618572Y-69540381D01* X186618572Y-68540381D01* X186856668Y-69540381D02* X186856668Y-68540381D01* X186975715Y-68540381D01* X187047144Y-68588000D01* X187094763Y-68683238D01* X187118572Y-68778476D01* X187142382Y-68968952D01* X187142382Y-69111810D01* X187118572Y-69302286D01* X187094763Y-69397524D01* X187047144Y-69492762D01* X186975715Y-69540381D01* X186856668Y-69540381D01* X187332858Y-69254667D02* X187570953Y-69254667D01* X187285239Y-69540381D02* X187451906Y-68540381D01* X187618572Y-69540381D01* D17* X185459810Y-67000381D02* X185459810Y-66000381D01* X185888381Y-66952762D02* X186031238Y-67000381D01* X186269334Y-67000381D01* X186364572Y-66952762D01* X186412191Y-66905143D01* X186459810Y-66809905D01* X186459810Y-66714667D01* X186412191Y-66619429D01* X186364572Y-66571810D01* X186269334Y-66524190D01* X186078857Y-66476571D01* X185983619Y-66428952D01* X185936000Y-66381333D01* X185888381Y-66286095D01* X185888381Y-66190857D01* X185936000Y-66095619D01* X185983619Y-66048000D01* X186078857Y-66000381D01* X186316953Y-66000381D01* X186459810Y-66048000D01* X186888381Y-67000381D02* X186888381Y-66000381D01* X170488095Y-97273810D01* X146122399Y-64195858D02* X146884304Y-64195858D01* X146503352Y-64576810D02* X146503352Y-63814905D01* M02* ================================================ FILE: samples/Gerber Image/simonShield-drl_map.gbr ================================================ %FSLAX45Y45*% G04 Gerber Fmt 4.5, Leading zero omitted, Abs format (unit mm)* G04 Created by KiCad (PCBNEW 4.0.6-e0-6349~53~ubuntu16.04.1) date Sat Jul 1 03:26:22 2017* %MOMM*% %LPD*% G01* G04 APERTURE LIST* %ADD10C,0.127000*% %ADD11C,0.150000*% %ADD12C,0.200000*% %ADD13C,0.300000*% G04 APERTURE END LIST* D10* D11* X19625000Y-11800000D02* X11300000Y-11800000D01* X19625000Y-5275000D02* X19625000Y-11800000D01* X11300000Y-5275000D02* X19625000Y-5275000D01* X11300000Y-11800000D02* X11300000Y-5275000D01* D12* X12657300Y-7234400D02* X12717300Y-7294400D01* X12717300Y-7234400D02* X12657300Y-7294400D01* X12657300Y-9571200D02* X18270700Y-9571200D02* X18330700Y-9631200D01* X18330700Y-9571200D02* X18270700Y-9631200D01* X13764260Y-8013700D02* G75* G03X13764260Y-8013700I-35560J0D01* G01* X13764260Y-8343900D02* G75* G03X13764260Y-8343900I-35560J0D01* G01* X13764260Y-10350500D02* G75* G03X13764260Y-10350500I-35560J0D01* G01* X13764260Y-10668000D02* G75* G03X13764260Y-10668000I-35560J0D01* G01* X14869160Y-7962900D02* G75* G03X14869160Y-7962900I-35560J0D01* G01* X14881860Y-8318500D02* G75* G03X14881860Y-8318500I-35560J0D01* G01* X14881860Y-10350500D02* G75* G03X14881860Y-10350500I-35560J0D01* G01* X14881860Y-10693400D02* G75* G03X14881860Y-10693400I-35560J0D01* G01* X16177260Y-8001000D02* G75* G03X16177260Y-8001000I-35560J0D01* G01* X16177260Y-8343900D02* G75* G03X16177260Y-8343900I-35560J0D01* G01* X16177260Y-10375900D02* G75* G03X16177260Y-10375900I-35560J0D01* G01* X16177260Y-10693400D02* G75* G03X16177260Y-10693400I-35560J0D01* G01* X17294860Y-8013700D02* G75* G03X17294860Y-8013700I-35560J0D01* G01* X17294860Y-8331200D02* G75* G03X17294860Y-8331200I-35560J0D01* G01* X17294860Y-10337800D02* G75* G03X17294860Y-10337800I-35560J0D01* G01* X17294860Y-10693400D02* G75* G03X17294860Y-10693400I-35560J0D01* G01* X13525500Y-6360800D02* X13525500Y-6440800D01* X13485500Y-6400800D02* X13565500Y-6400800D01* X14540000Y-5824000D02* X14540000Y-5904000D01* X14500000Y-5864000D02* X14580000Y-5864000D01* X14540000Y-6840000D02* X14540000Y-6920000D01* X14500000Y-6880000D02* X14580000Y-6880000D01* X15500000Y-8844000D02* X15500000Y-8924000D01* X15460000Y-8884000D02* X15540000Y-8884000D01* X15500000Y-9860000D02* X15500000Y-9940000D01* X15460000Y-9900000D02* X15540000Y-9900000D01* X12586462Y-7809738D01* X12686538Y-7759700D02* G75* G03X12686538Y-7759700I-50038J0D01* G01* X12586462Y-8471662D02* X12686538Y-8571738D01* X12686538Y-8471662D02* X12586462Y-8571738D01* X12686538Y-8521700D02* G75* G03X12686538Y-8521700I-50038J0D01* G01* X12586462Y-10033762D02* X12686538Y-10133838D01* X12686538Y-10033762D02* X12586462Y-10133838D01* X12686538Y-10083800D02* G75* G03X12686538Y-10083800I-50038J0D01* G01* X12586462Y-10795762D02* X12686538Y-10895838D01* X12686538Y-10795762D02* X12586462Y-10895838D01* X12686538Y-10845800D02* G75* G03X12686538Y-10845800I-50038J0D01* G01* X12942062Y-7709662D02* X13042138Y-7809738D01* X13042138Y-7709662D02* X12942062Y-7809738D01* X13042138Y-7759700D02* G75* G03X13042138Y-7759700I-50038J0D01* G01* X12942062Y-8471662D02* X13042138Y-8571738D01* X13042138Y-8471662D02* X12942062Y-8571738D01* X13042138Y-8521700D02* G75* G03X13042138Y-8521700I-50038J0D01* G01* X12942062Y-10033762D02* X13042138Y-10133838D01* X13042138Y-10033762D02* X12942062Y-10133838D01* X13042138Y-10083800D02* G75* G03X13042138Y-10083800I-50038J0D01* G01* X12942062Y-10795762D02* X13042138Y-10895838D01* X13042138Y-10795762D02* X12942062Y-10895838D01* X13042138Y-10845800D02* G75* G03X13042138Y-10845800I-50038J0D01* G01* X13297662Y-7214362D02* X13397738Y-7314438D01* X13397738Y-7214362D02* X13297662Y-7314438D01* X13397738Y-7264400D02* G75* G03X13397738Y-7264400I-50038J0D01* G01* X13297662Y-9563862D02* X13397738Y-9663938D01* X13397738Y-9563862D02* X13297662Y-9663938D01* X13397738Y-9613900D02* G75* G03X13397738Y-9613900I-50038J0D01* G01* X13373862Y-7722362D02* X13473938Y-7822438D01* X13473938Y-7722362D02* X13373862Y-7822438D01* X13473938Y-7772400D02* G75* G03X13473938Y-7772400I-50038J0D01* G01* X13373862Y-8484362D02* X13473938Y-8584438D01* X13473938Y-8484362D02* X13373862Y-8584438D01* X13473938Y-8534400D02* G75* G03X13473938Y-8534400I-50038J0D01* G01* X13373862Y-10033762D02* X13473938Y-10133838D01* X13473938Y-10033762D02* X13373862Y-10133838D01* X13473938Y-10083800D02* G75* G03X13473938Y-10083800I-50038J0D01* G01* X13373862Y-10795762D02* X13473938Y-10895838D01* X13473938Y-10795762D02* X13373862Y-10895838D01* X13473938Y-10845800D02* G75* G03X13473938Y-10845800I-50038J0D01* G01* X13551662Y-7214362D02* X13651738Y-7314438D01* X13651738Y-7214362D02* X13551662Y-7314438D01* X13651738Y-7264400D02* G75* G03X13651738Y-7264400I-50038J0D01* G01* X13551662Y-9563862D02* X13651738Y-9663938D01* X13651738Y-9563862D02* X13551662Y-9663938D01* X13651738Y-9613900D02* G75* G03X13651738Y-9613900I-50038J0D01* G01* X14491462Y-7722362D02* X14591538Y-7822438D01* X14591538Y-7722362D02* X14491462Y-7822438D01* X14591538Y-7772400D02* G75* G03X14591538Y-7772400I-50038J0D01* G01* X14491462Y-8484362D02* X14591538Y-8584438D01* X14591538Y-8484362D02* X14491462Y-8584438D01* X14591538Y-8534400D02* G75* G03X14591538Y-8534400I-50038J0D01* G01* X14491462Y-10084562D02* X14591538Y-10184638D01* X14591538Y-10084562D02* X14491462Y-10184638D01* X14591538Y-10134600D02* G75* G03X14591538Y-10134600I-50038J0D01* G01* X14491462Y-10846562D02* X14591538Y-10946638D01* X14591538Y-10846562D02* X14491462Y-10946638D01* X14591538Y-10896600D02* G75* G03X14591538Y-10896600I-50038J0D01* G01* X15032859Y-6362405D02* X15132935Y-6462481D01* X15132935Y-6362405D02* X15032859Y-6462481D01* X15132935Y-6412443D02* G75* G03X15132935Y-6412443I-50038J0D01* G01* X15667859Y-6362405D02* X15767935Y-6462481D01* X15767935Y-6362405D02* X15667859Y-6462481D01* X15767935Y-6412443D02* G75* G03X15767935Y-6412443I-50038J0D01* G01* X16104362Y-5906262D02* X16204438Y-6006338D01* X16204438Y-5906262D02* X16104362Y-6006338D01* X16204438Y-5956300D02* G75* G03X16204438Y-5956300I-50038J0D01* G01* X16104362Y-6211062D02* X16204438Y-6311138D01* X16204438Y-6211062D02* X16104362Y-6311138D01* X16204438Y-6261100D02* G75* G03X16204438Y-6261100I-50038J0D01* G01* X16396462Y-7735062D02* X16496538Y-7835138D01* X16496538Y-7735062D02* X16396462Y-7835138D01* X16496538Y-7785100D02* G75* G03X16496538Y-7785100I-50038J0D01* G01* X16396462Y-8497062D02* X16496538Y-8597138D01* X16496538Y-8497062D02* X16396462Y-8597138D01* X16496538Y-8547100D02* G75* G03X16496538Y-8547100I-50038J0D01* G01* X16396462Y-10071862D02* X16496538Y-10171938D01* X16496538Y-10071862D02* X16396462Y-10171938D01* X16496538Y-10121900D02* G75* G03X16496538Y-10121900I-50038J0D01* G01* X16396462Y-10833862D02* X16496538Y-10933938D01* X16496538Y-10833862D02* X16396462Y-10933938D01* X16496538Y-10883900D02* G75* G03X16496538Y-10883900I-50038J0D01* G01* X16866362Y-5906262D02* X16966438Y-6006338D01* X16966438Y-5906262D02* X16866362Y-6006338D01* X16966438Y-5956300D02* G75* G03X16966438Y-5956300I-50038J0D01* G01* X16866362Y-6211062D02* X16966438Y-6311138D01* X16966438Y-6211062D02* X16866362Y-6311138D01* X16966438Y-6261100D02* G75* G03X16966438Y-6261100I-50038J0D01* G01* X17336262Y-7214362D02* X17436338Y-7314438D01* X17436338Y-7214362D02* X17336262Y-7314438D01* X17436338Y-7264400D02* G75* G03X17436338Y-7264400I-50038J0D01* G01* X17336262Y-9551162D02* X17436338Y-9651238D01* X17436338Y-9551162D02* X17336262Y-9651238D01* X17436338Y-9601200D02* G75* G03X17436338Y-9601200I-50038J0D01* G01* X17514062Y-7709662D02* X17614138Y-7809738D01* X17614138Y-7709662D02* X17514062Y-7809738D01* X17614138Y-7759700D02* G75* G03X17614138Y-7759700I-50038J0D01* G01* X17514062Y-8471662D02* X17614138Y-8571738D01* X17614138Y-8471662D02* X17514062Y-8571738D01* X17614138Y-8521700D02* G75* G03X17614138Y-8521700I-50038J0D01* G01* X17514062Y-10046462D02* X17614138Y-10146538D01* X17614138Y-10046462D02* X17514062Y-10146538D01* X17614138Y-10096500D02* G75* G03X17614138Y-10096500I-50038J0D01* G01* X17514062Y-10808462D02* X17614138Y-10908538D01* X17614138Y-10808462D02* X17514062Y-10908538D01* X17614138Y-10858500D02* G75* G03X17614138Y-10858500I-50038J0D01* G01* X17590262Y-7214362D02* X17690338Y-7314438D01* X17690338Y-7214362D02* X17590262Y-7314438D01* X17690338Y-7264400D02* G75* G03X17690338Y-7264400I-50038J0D01* G01* X17590262Y-9551162D02* X17690338Y-9651238D01* X17690338Y-9551162D02* X17590262Y-9651238D01* X17690338Y-9601200D02* G75* G03X17690338Y-9601200I-50038J0D01* G01* X17945862Y-10046462D02* X18045938Y-10146538D01* X18045938Y-10046462D02* X17945862Y-10146538D01* X18045938Y-10096500D02* G75* G03X18045938Y-10096500I-50038J0D01* G01* X17945862Y-10808462D02* X18045938Y-10908538D01* X18045938Y-10808462D02* X17945862Y-10908538D01* X18045938Y-10858500D02* G75* G03X18045938Y-10858500I-50038J0D01* G01* X17958562Y-7709662D02* X18058638Y-7809738D01* X18058638Y-7709662D02* X17958562Y-7809738D01* X18058638Y-7759700D02* G75* G03X18058638Y-7759700I-50038J0D01* G01* X17958562Y-8471662D02* X18058638Y-8571738D01* X18058638Y-8471662D02* X17958562Y-8571738D01* X18058638Y-8521700D02* G75* G03X18058638Y-8521700I-50038J0D01* G01* X18301462Y-7709662D02* X18401538Y-7809738D01* X18401538Y-7709662D02* X18301462Y-7809738D01* X18401538Y-7759700D02* G75* G03X18401538Y-7759700I-50038J0D01* G01* X18301462Y-8471662D02* X18401538Y-8571738D01* X18401538Y-8471662D02* X18301462Y-8571738D01* X18401538Y-8521700D02* G75* G03X18401538Y-8521700I-50038J0D01* G01* X18301462Y-10046462D02* X18401538Y-10146538D01* X18401538Y-10046462D02* X18301462Y-10146538D01* X18401538Y-10096500D02* G75* G03X18401538Y-10096500I-50038J0D01* G01* X18301462Y-10808462D02* X18401538Y-10908538D01* X18401538Y-10808462D02* X18301462Y-10908538D01* X18401538Y-10858500D02* G75* G03X18401538Y-10858500I-50038J0D01* G01* X11760200Y-6096000D02* X11861800Y-6197600D01* X11861800Y-6096000D02* X18872200Y-10668000D02* X18973800Y-10769600D01* X18973800Y-10668000D02* X18872200Y-10769600D01* X18923000Y-10668000D02* X18923000Y-10769600D01* X18872200Y-10718800D02* X18973800Y-10718800D01* X18872200Y-10922000D02* X18973800Y-11023600D01* X18973800Y-10922000D02* X18872200Y-11023600D01* X18923000Y-10922000D02* X18923000Y-11023600D01* X18872200Y-10972800D02* X18973800Y-10972800D01* X19126200Y-6096000D02* X19227800Y-6197600D01* X19227800Y-6096000D02* X19126200Y-6197600D01* X19177000Y-6096000D02* X19177000Y-6197600D01* X19126200Y-6146800D02* X19227800Y-6146800D01* X19126200Y-6350000D02* X19227800Y-6451600D01* X19227800Y-6350000D02* X19126200Y-6451600D01* X19177000Y-6350000D02* X19177000Y-6451600D01* X19126200Y-6400800D02* X19227800Y-6400800D01* X19126200Y-6604000D02* X19227800Y-6705600D01* X19227800Y-6604000D02* X19126200Y-6705600D01* X19177000Y-6604000D02* X19177000Y-6705600D01* X19126200Y-6654800D02* X19227800Y-6654800D01* X19126200Y-6858000D02* X19227800Y-6959600D01* X19227800Y-6858000D02* X19126200Y-6959600D01* X19177000Y-6858000D02* X19177000Y-6959600D01* X19126200Y-6908800D02* X19227800Y-6908800D01* X19126200Y-7112000D02* X19227800Y-7213600D01* X19227800Y-7112000D02* X19126200Y-7213600D01* X19177000Y-7112000D02* X19177000Y-7213600D01* X19126200Y-7162800D02* X19227800Y-7162800D01* X19126200Y-7366000D02* X19227800Y-7467600D01* X19227800Y-7366000D02* X19126200Y-7467600D01* X19177000Y-7366000D02* X19177000Y-7467600D01* X19126200Y-7416800D02* X19227800Y-7416800D01* X19126200Y-7620000D02* X19227800Y-7721600D01* X19227800Y-7620000D02* X19126200Y-7721600D01* X19177000Y-7620000D02* X19177000Y-7721600D01* X19126200Y-7670800D02* X19227800Y-7670800D01* X19126200Y-7874000D02* X19227800Y-7975600D01* X19227800Y-7874000D02* X19126200Y-7975600D01* X19177000Y-7874000D02* X19177000Y-7975600D01* X19126200Y-7924800D02* X19227800Y-7924800D01* X19126200Y-8128000D02* X19227800Y-8229600D01* X19227800Y-8128000D02* X19126200Y-8229600D01* X19177000Y-8128000D02* X19177000Y-8229600D01* X19126200Y-8178800D02* X19227800Y-8178800D01* X19126200Y-8382000D02* X19227800Y-8483600D01* X19227800Y-8382000D02* X19126200Y-8483600D01* X19177000Y-8382000D02* X19177000Y-8483600D01* X19126200Y-8432800D02* X19227800Y-8432800D01* X19126200Y-8636000D02* X19227800Y-8737600D01* X19227800Y-8636000D02* X19126200Y-8737600D01* X19177000Y-8636000D02* X19177000Y-8737600D01* X19126200Y-8686800D02* X19227800Y-8686800D01* X19126200Y-8890000D02* X19227800Y-8991600D01* X19227800Y-8890000D02* X19126200Y-8991600D01* X19177000Y-8890000D02* X19177000Y-8991600D01* X19126200Y-8940800D02* X19227800Y-8940800D01* X19126200Y-9144000D02* X19227800Y-9245600D01* X19227800Y-9144000D02* X19126200Y-9245600D01* X19177000Y-9144000D02* X19177000Y-9245600D01* X19126200Y-9194800D02* X19227800Y-9194800D01* X19126200Y-9398000D02* X19227800Y-9499600D01* X19227800Y-9398000D02* X19126200Y-9499600D01* X19177000Y-9398000D02* X19177000Y-9499600D01* X19126200Y-9448800D02* X19227800Y-9448800D01* X19126200Y-9652000D02* X19227800Y-9753600D01* X19227800Y-9652000D02* X19126200Y-9753600D01* X19177000Y-9652000D02* X19177000Y-9753600D01* X19126200Y-9702800D02* X19227800Y-9702800D01* X19126200Y-9906000D02* X19227800Y-10007600D01* X19227800Y-9906000D02* X19126200Y-10007600D01* X19177000Y-9906000D02* X19177000Y-10007600D01* X19126200Y-9956800D02* X19227800Y-9956800D01* X19126200Y-10160000D02* X19227800Y-10261600D01* X19227800Y-10160000D02* X19126200Y-10261600D01* X19177000Y-10160000D02* X19177000Y-10261600D01* X19126200Y-10210800D02* X19227800Y-10210800D01* X19126200Y-10414000D02* X19227800Y-10515600D01* X19227800Y-10414000D02* X19126200Y-10515600D01* X19177000Y-10414000D02* X19177000Y-10515600D01* X19126200Y-10464800D02* X19227800Y-10464800D01* X19126200Y-10668000D02* X19227800Y-10769600D01* X19227800Y-10668000D02* X19126200Y-10769600D01* X19177000Y-10668000D02* X19177000Y-10769600D01* X19126200Y-10718800D02* X19227800Y-10718800D01* X19126200Y-10922000D02* X19227800Y-11023600D01* X19227800Y-10922000D02* X19126200Y-11023600D01* X19177000Y-10922000D02* X19177000Y-11023600D01* X19126200Y-10972800D02* X19227800Y-10972800D01* D13* X11563928Y-12273214D02* X11563928Y-11973214D01* X11635357Y-11973214D01* X11678214Y-11987500D01* X11706786Y-12016071D01* X11721071Y-12044643D01* X11735357Y-12101786D01* X11735357Y-12144643D01* X11721071Y-12201786D01* X11706786Y-12230357D01* X11678214Y-12258929D01* X11635357Y-12273214D01* X11563928Y-12273214D01* X11863928Y-12273214D02* X11863928Y-12073214D01* X11863928Y-12130357D02* X11878214Y-12101786D01* X11892500Y-12087500D01* X11921071Y-12073214D01* X11949643Y-12073214D01* X12049643Y-12273214D02* X12049643Y-12073214D01* X12049643Y-11973214D02* X12035357Y-11987500D01* X12049643Y-12001786D01* X12063928Y-11987500D01* X12049643Y-11973214D01* X18121071Y-12688929D01* X18106786Y-12646071D01* X18092500Y-12617500D01* X18063929Y-12574643D01* X18049643Y-12560357D01* X11292500Y-13163500D02* G75* G03X11292500Y-13163500I-35560J0D01* G01* X11621071Y-12999214D02* X11649643Y-12999214D01* X11678214Y-13013500D01* X11692500Y-13027786D01* X11706786Y-13056357D01* X11721071Y-13113500D01* X11721071Y-13184929D01* X11706786Y-13242071D01* X11692500Y-13270643D01* X12706786Y-13509500D01* X12735357Y-13495214D01* X12778214Y-13495214D01* X12806786Y-13509500D01* X12821071Y-13538071D01* X12821071Y-13695214D01* X12963928Y-13695214D02* X12963928Y-13495214D01* X12963928Y-13523786D02* X12978214Y-13509500D01* X13006786Y-13495214D01* X13049643Y-13495214D01* X13078214Y-13509500D01* X13092500Y-13538071D01* X13092500Y-13695214D01* X13092500Y-13538071D02* X13106786Y-13509500D01* X13135357Y-13495214D01* X13178214Y-13495214D01* X13206786Y-13509500D01* X13221071Y-13538071D01* X13221071Y-13695214D01* X13806786Y-13380929D02* X13549643Y-13766643D01* X14192500Y-13395214D02* X14221071Y-13395214D01* X14249643Y-13409500D01* X14263928Y-13423786D01* X14278214Y-13452357D01* X14292500Y-13509500D01* X14292500Y-13580929D01* X14278214Y-13638071D01* X14263928Y-13666643D01* X14249643Y-13680929D01* X14221071Y-13695214D01* X14192500Y-13695214D01* X14163928Y-13680929D01* X14149643Y-13666643D01* X14135357Y-13638071D01* X14121071Y-13580929D01* X14121071Y-13509500D01* X14135357Y-13452357D01* X14149643Y-13423786D01* X14163928Y-13409500D01* X14192500Y-13395214D01* X14421071Y-13666643D02* X14435357Y-13680929D01* X14421071Y-13695214D01* X14406786Y-13680929D01* X14421071Y-13666643D01* X14421071Y-13695214D01* X14621071Y-13395214D02* X14649643Y-13395214D01* X14678214Y-13409500D01* X14692500Y-13423786D01* X14706785Y-13452357D01* X14721071Y-13509500D01* X14721071Y-13580929D01* X14706785Y-13638071D01* X14692500Y-13666643D01* X14678214Y-13680929D01* X14649643Y-13695214D01* X14621071Y-13695214D01* X14592500Y-13680929D01* X14578214Y-13666643D01* X14563928Y-13638071D01* X14549643Y-13580929D01* X14549643Y-13509500D01* X14563928Y-13452357D01* X14578214Y-13423786D01* X14592500Y-13409500D01* X14621071Y-13395214D01* X14821071Y-13395214D02* X15006785Y-13395214D01* X14906785Y-13509500D01* X14949643Y-13509500D01* X14978214Y-13523786D01* X14992500Y-13538071D01* X15006785Y-13566643D01* X11292500Y-14797538D01* X11292500Y-14697462D02* X11192424Y-14797538D01* X11292500Y-14747500D02* G75* G03X11292500Y-14747500I-50038J0D01* G01* X11721071Y-14883214D02* X11549643Y-14883214D01* X11635357Y-14883214D02* X11635357Y-14583214D01* X11606786Y-14626071D01* X11578214Y-14654643D01* X18135357Y-15136357D01* X18121071Y-15064929D01* X18106786Y-15022071D01* X18092500Y-14993500D01* X18063929Y-14950643D01* X18049643Y-14936357D01* M02* ================================================ FILE: samples/Gherkin/resources.story ================================================ Feature: Some awesome title In order to realize a named business value As a explicit system actor I want to gain some beneficial outcome which furthers the goal Prologue: Given this step is played once in the begin of the story #-- awesome comment!!!! Scenario: parametrized scenario Given a system state named When I do Then system is in state Examples: |systemState |Nameaction |newSystemStateName | |currentState |nothing |currentState | |currentState |pushButton |newState | Scenario: title Given an scenario with a table |this|will|be|headers| |this|is |a |row | ================================================ FILE: samples/Gherkin/tables.feature ================================================ Feature: Todo List Scenario: Adding an item to my todo list Given my todo list currently looks as follows: | TaskName | Priority | | Fix bugs in my code | medium | | Document my hours | medium | When I add the following task: | TaskName | Priority | | Watch cat videos on YouTube all day | high | Then I should see the following todo list: | TaskName | Priority | | Watch cat videos on YouTube all day | high | | Sign up for unemployment | high | ================================================ FILE: samples/Git Attributes/filenames/.gitattributes ================================================ # Stuff I didn't write .emacs.d/lisp/* linguist-vendored # Documentation share/man/* linguist-documentation # Unrecognised filetypes *.colorscheme linguist-language=INI Shell.profile linguist-language=INI sessionui.rc linguist-language=XML konsoleui.rc linguist-language=XML ================================================ FILE: samples/Git Commit/filenames/COMMIT_EDITMSG ================================================ updated css for all pages # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit. # # On branch master # Changes to be committed: # new file: cv.css # modified: cv.html # new file: cvdraft.html # modified: index.css # modified: index.html # # Changes not staged for commit: # deleted: home.css # ================================================ FILE: samples/Git Config/aliases.gitconfig ================================================ [alias] br = branch ci = commit co = checkout d = diff -w HEAD dc = diff -w --cached ds = diff -w --staged g = grep --break --heading --line-number h = log --pretty=oneline --decorate --abbrev-commit --date=short hist = log --pretty=format:\"%h %ad | %s%d [%an]\" --graph --date=short lgp = log -p lgs = log --stat lol = log --graph --decorate --pretty=oneline --abbrev-commit lola = log --graph --decorate --pretty=oneline --abbrev-commit --all lolar = log --decorate --pretty=oneline --abbrev-commit --all --reverse ls = ls-files p = push pr = pull --rebase st = status sta = status sts = status -s wc = whatchanged -p --abbrev-commit --pretty=medium ga = add gb = branch gba = branch -a gc = commit -v gca = commit -v -a gcf = commit --fixup gcl = config --list gclean = reset --hard && git clean -dfx gcm = checkout master gcmsg = commit -m gco = checkout gcount = shortlog -sn gcp = cherry-pick gf = fetch gfr = fetch && git rebase remotes/origin/master gg = gui citool gga = gui citool --amend ggpnp = pull origin $(current_branch) && git push origin $(current_branch) ggpull = pull origin $(current_branch) ggpur = pull --rebase origin $(current_branch) ggpush = push origin $(current_branch) gignore = update-index --assume-unchanged gignored = ls-files -v | grep "^[[:lower:]]" gl = pull glg = log --stat --max-count=10 glgg = log --graph --max-count=10 glgga = log --graph --decorate --all glo = log --oneline --decorate --color glog = log --oneline --decorate --color --graph glp = _git_log_prettily gm = merge gmt = mergetool --no-prompt gpoat = push origin --all && git push origin --tags gr = remote grba = rebase --abort grbc = rebase --continue grbi = rebase -i grh = reset HEAD grhh = reset HEAD --hard gri = rebase --interactive grmv = remote rename grrm = remote remove grset = remote set-url grt = 'cd $(git rev-parse --show-toplevel || echo ".")' grup = remote update grv = remote -v gss = status -s gst = status gsta = stash gstd = stash drop gstp = stash pop gsts = stash show --text gunignore = update-index --no-assume-unchanged # 'gc!' = commit -v --amend # 'gca!' = commit -v -a --amend # gk = k --all --branches # gunwip = log -n 1 | grep -q -c "\-\-wip\-\-" && git reset HEAD~1 # gwip = add -A; git ls-files --deleted -z | xargs -r0 git rm; git commit -m "--wip--" gsd = svn dcommit gsr = svn rebase git-svn-dcommit-push = svn dcommit && git push github master:svntrunk # Blog Post: Human Git Aliases; http://gggritso.com/human-git-aliases # https://github.com/gggritso/dotfiles/blob/master/gitconfig.symlink # BEGIN HUMAN #---- amend = commit --amend back = checkout "-" branches = branch -a branchout = checkout -b branch-name = rev-parse --abbrev-ref HEAD contributors= shortlog -s -n down = pull --rebase discard = checkout -- dump = cat-file -p filetrail = git log --follow -p -w graph = log --graph -10 --branches --remotes --tags\ --format=format:'%Cgreen%h %Creset %<(75,trunc)%s (%cN, %ar) %Cred%d' --date-order hist = log -10 --format=format:'%Cgreen%h %Creset %s (%cN, %ar)' history = log --pretty=format:"%C(yellow)%h\\ %ad%Cred%d\\ %Creset%s%Cblue\\ [%cn]" --graph --date=short ignore = update-index --assume-unchanged ignored = ls-files -o -i --exclude-standard # Show files ignored by git: invert = revert incoming = log orgin/master ^master # show only what is in orgin/master that isn't in master last = log -1 HEAD --format=format:"%Cred%H" logs = log --stat mergetrail = log --ancestry-path --merges move = mv nevermind = !git reset --hard HEAD && git clean -d -f outgoing = log master ^orgin/master # show only what is in master that isn't in orgin/master praise = blame precommit = diff --cached -w --word-diff=color --word-diff-regex='[^[:space:]<>]+' prestage = diff -w --word-diff=color remotes = remote -v remove = rm resave = commit --amend rewrite = rebase -i ru = log --since=\"one week ago\" --all --no-merges --oneline #--author=\"Mark Fernandes\" #rushes = log --since=\"1970-01-01 00:00:00\" --all --no-merges --oneline #--author=\"Mark Fernandes\" rushes = log --since=\"one week ago\" --all --no-merges --oneline #--author=\"Mark Fernandes\" save = commit -am show-all = log --follow shop-all = log --follow -p stashes = stash list summary = status -u -s tags = tag type = cat-file -t uncommit = reset --mixed HEAD~ undo = reset --soft HEAD~1 unignore = update-index --no-assume-changed unmerged = branch --no-merged unmerged = diff -w --name-only --diff-filter=U unstage = reset -q HEAD -- unstash = stash pop untrack = rm -r --cached up = push up master what = show -w #---- # END HUMAN pup = "!git remote update -p && git merge --ff-only @{u}" pupup = "!git remote update up -p && git merge --ff-only @{u}" # vim: et:nonu:nospell:ft=gitconfig ================================================ FILE: samples/Git Config/filenames/.gitconfig ================================================ [alias] # View abbreviated SHA, description, and history graph of the latest 20 commits l = log --pretty=oneline -n 20 --graph --abbrev-commit # View the current working tree status using the short format s = status -s # Show the diff between the latest commit and the current state d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat" # `git di $number` shows the diff between the state `$number` revisions ago and the current state di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d" # Pull in remote changes for the current repository and all its submodules p = !"git pull; git submodule foreach git pull origin master" # Clone a repository including all submodules c = clone --recursive # Commit all changes ca = !git add -A && git commit -av # Switch to a branch, creating it if necessary go = "!f() { git checkout -b \"$1\" 2> /dev/null || git checkout \"$1\"; }; f" # Show verbose output about tags, branches or remotes tags = tag -l branches = branch -a remotes = remote -v # List aliases aliases = config --get-regexp alias # Amend the currently staged files to the latest commit amend = commit --amend --reuse-message=HEAD # Credit an author on the latest commit credit = "!f() { git commit --amend --author \"$1 <$2>\" -C HEAD; }; f" # Interactive rebase with the given number of latest commits reb = "!r() { git rebase -i HEAD~$1; }; r" # Remove the old tag with this name and tag the latest commit with it. retag = "!r() { git tag -d $1 && git push origin :refs/tags/$1 && git tag $1; }; r" # Find branches containing commit fb = "!f() { git branch -a --contains $1; }; f" # Find tags containing commit ft = "!f() { git describe --always --contains $1; }; f" # Find commits by source code fc = "!f() { git log --pretty=format:'%C(yellow)%h %Cblue%ad %Creset%s%Cgreen [%cn] %Cred%d' --decorate --date=short -S$1; }; f" # Find commits by commit message fm = "!f() { git log --pretty=format:'%C(yellow)%h %Cblue%ad %Creset%s%Cgreen [%cn] %Cred%d' --decorate --date=short --grep=$1; }; f" # Remove branches that have already been merged with master # a.k.a. ‘delete merged’ dm = "!git branch --merged | grep -v '\\*' | xargs -n 1 git branch -d" # List contributors with number of commits contributors = shortlog --summary --numbered # Merge GitHub pull request on top of the current branch or, # if a branch name is specified, on top of the specified branch mpr = "!f() { \ declare currentBranch=\"$(git symbolic-ref --short HEAD)\"; \ declare branch=\"${2:-$currentBranch}\"; \ if [ $(printf \"%s\" \"$1\" | grep '^[0-9]\\+$' > /dev/null; printf $?) -eq 0 ]; then \ git fetch origin refs/pull/$1/head:pr/$1 && \ git checkout -B $branch && \ git rebase $branch pr/$1 && \ git checkout -B $branch && \ git merge pr/$1 && \ git branch -D pr/$1 && \ git commit --amend -m \"$(git log -1 --pretty=%B)\n\nCloses #$1.\"; \ fi \ }; f" [apply] # Detect whitespace errors when applying a patch whitespace = fix [core] # Use custom `.gitignore` and `.gitattributes` excludesfile = ~/.gitignore attributesfile = ~/.gitattributes # Treat spaces before tabs and all kinds of trailing whitespace as an error # [default] trailing-space: looks for spaces at the end of a line # [default] space-before-tab: looks for spaces before tabs at the beginning of a line whitespace = space-before-tab,-indent-with-non-tab,trailing-space # Make `git rebase` safer on macOS # More info: trustctime = false # Prevent showing files whose names contain non-ASCII symbols as unversioned. # http://michael-kuehnel.de/git/2014/11/21/git-mac-osx-and-german-umlaute.html precomposeunicode = false # Speed up commands involving untracked files such as `git status`. # https://git-scm.com/docs/git-update-index#_untracked_cache untrackedCache = true [color] # Use colors in Git commands that are capable of colored output when # outputting to the terminal. (This is the default setting in Git ≥ 1.8.4.) ui = auto [color "branch"] current = yellow reverse local = yellow remote = green [color "diff"] meta = yellow bold frag = magenta bold # line info old = red # deletions new = green # additions [color "status"] added = yellow changed = green untracked = cyan [commit] # https://help.github.com/articles/signing-commits-using-gpg/ gpgsign = true [diff] # Detect copies as well as renames renames = copies [diff "bin"] # Use `hexdump` to diff binary files textconv = hexdump -v -C [help] # Automatically correct and execute mistyped commands autocorrect = 1 [merge] # Include summaries of merged commits in newly created merge commit messages log = true [push] # https://git-scm.com/docs/git-config#git-config-pushdefault default = simple # Make `git push` push relevant annotated tags when pushing branches out. followTags = true # URL shorthands [url "git@github.com:"] insteadOf = "gh:" pushInsteadOf = "github:" pushInsteadOf = "git://github.com/" [url "git://github.com/"] insteadOf = "github:" [url "git@gist.github.com:"] insteadOf = "gst:" pushInsteadOf = "gist:" pushInsteadOf = "git://gist.github.com/" [url "git://gist.github.com/"] insteadOf = "gist:" ================================================ FILE: samples/Git Config/filenames/.gitmodules ================================================ [submodule "vendor/CodeMirror"] path = vendor/CodeMirror url = https://github.com/codemirror/CodeMirror [submodule "vendor/grammars/ABNF.tmbundle"] path = vendor/grammars/ABNF.tmbundle url = https://github.com/sanssecours/ABNF.tmbundle [submodule "vendor/grammars/Agda.tmbundle"] path = vendor/grammars/Agda.tmbundle url = https://github.com/mokus0/Agda.tmbundle [submodule "vendor/grammars/Alloy.tmbundle"] path = vendor/grammars/Alloy.tmbundle url = https://github.com/macekond/Alloy.tmbundle [submodule "vendor/grammars/Assembly-Syntax-Definition"] path = vendor/grammars/Assembly-Syntax-Definition url = https://github.com/calculuswhiz/Assembly-Syntax-Definition [submodule "vendor/grammars/AutoHotkey"] path = vendor/grammars/AutoHotkey url = https://github.com/ahkscript/SublimeAutoHotkey ================================================ FILE: samples/Git Revision List/filenames/.git-blame-ignore-revs ================================================ # git-blame ignored revisions # To configure, run # git config blame.ignoreRevsFile .git-blame-ignore-revs # Requires Git > 2.23 # See https://git-scm.com/docs/git-blame#Documentation/git-blame.txt---ignore-revs-fileltfilegt # Use prettier (#600) 5180ecdca48e486b4b0f347fcbd752f865df5e55 # Update prettier to v2 (#11579) 41085248560b1403b8d0f99f108491e679531c6c ================================================ FILE: samples/Gleam/contributor.gleam ================================================ import gleam/result import gleam/option.{Option} import gleam/dynamic.{DecodeError, Dynamic} import gleam_contributors/json pub type Contributor { Contributor(name: String, github: Option(String)) } // Could include avatarURl and websiteUrl if required pub type Contributorspage { Contributorspage( nextpage_cursor: Result(String, Nil), contributor_list: List(Contributor), ) } // This is still parsing the response json into Gleam types, see // parse_contributors, but it is the contributor section only. To make the parse // function more readable pub fn decode(json_obj: Dynamic) -> Result(Contributor, DecodeError) { try author = dynamic.field(json_obj, "author") try dynamic_name = dynamic.field(author, "name") try name = dynamic.string(dynamic_name) let github = { try user = dynamic.field(author, "user") try dynamic_github = dynamic.field(user, "url") dynamic.string(dynamic_github) } Ok(Contributor(name: name, github: option.from_result(github))) } /// Converts response json into Gleam type. Represents one page of contributors pub fn decode_page( response_json: String, ) -> Result(Contributorspage, DecodeError) { let res = json.decode(response_json) try data = dynamic.field(res, "data") try repo = dynamic.field(data, "repository") try object = dynamic.field(repo, "object") try history = dynamic.field(object, "history") try pageinfo = dynamic.field(history, "pageInfo") try dynamic_nextpage = dynamic.field(pageinfo, "hasNextPage") try nextpage = dynamic.bool(dynamic_nextpage) let cursor = case nextpage { False -> Error(Nil) True -> dynamic.field(pageinfo, "endCursor") |> result.then(dynamic.string) |> result.map_error(fn(_) { Nil }) } try nodes = dynamic.field(history, "nodes") try contributors = dynamic.typed_list(nodes, of: decode) Ok(Contributorspage(nextpage_cursor: cursor, contributor_list: contributors)) } ================================================ FILE: samples/Gleam/websocket.gleam ================================================ import gleam/uri.{Uri} import gleam/http.{Header} import gleam/dynamic.{Dynamic} import gleam/result import nerf/gun.{ConnectionPid, StreamReference} pub opaque type Connection { Connection(ref: StreamReference, pid: ConnectionPid) } pub type Frame { Close Text(String) Binary(BitString) } pub fn connect( hostname: String, path: String, on port: Int, with headers: List(Header), ) -> Result(Connection, ConnectError) { try pid = gun.open(hostname, port) |> result.map_error(ConnectionFailed) try _ = gun.await_up(pid) |> result.map_error(ConnectionFailed) // Upgrade to websockets let ref = gun.ws_upgrade(pid, path, headers) let conn = Connection(pid: pid, ref: ref) try _ = await_upgrade(conn, 1000) |> result.map_error(ConnectionFailed) Ok(conn) } pub fn send(to conn: Connection, this message: String) -> Nil { gun.ws_send(conn.pid, gun.Text(message)) } pub external fn receive(from: Connection, within: Int) -> Result(Frame, Nil) = "nerf_ffi" "ws_receive" external fn await_upgrade(from: Connection, within: Int) -> Result(Nil, Dynamic) = "nerf_ffi" "ws_await_upgrade" pub fn close(conn: Connection) -> Nil { gun.ws_send(conn.pid, gun.Close) } /// The URI of the websocket server to connect to pub type ConnectError { ConnectionRefused(status: Int, headers: List(Header)) ConnectionFailed(reason: Dynamic) } ================================================ FILE: samples/Glimmer JS/class.gjs ================================================ import Component from "@glimmer/component"; import { action } from "@ember/object"; import DButton from "discourse/components/d-button"; import DModal from "discourse/components/d-modal"; import DModalCancel from "discourse/components/d-modal-cancel"; import I18n from "I18n"; import { htmlSafe } from "@ember/template"; const t = I18n.t.bind(I18n); export default class ModalDiffModal extends Component { @action triggerConfirmChanges() { this.args.closeModal(); this.args.confirm(); } } ================================================ FILE: samples/Glimmer JS/template-only.gjs ================================================ import { ExternalLink, Link } from '@crowdstrike/ember-oss-docs'; export const Footer = export default Footer; ================================================ FILE: samples/Glimmer TS/class.gts ================================================ import Component from '@glimmer/component'; import FreestyleUsage from 'ember-freestyle/components/freestyle/usage'; import BoxelInputTime, { Time } from './index'; import { tracked } from '@glimmer/tracking'; import { cssVariable, CSSVariableInfo } from 'ember-freestyle/decorators/css-variable'; import { fn } from '@ember/helper'; import { action } from '@ember/object'; export default class BoxelInputTimeUsage extends Component { cssClassName = 'boxel-input-time'; @cssVariable declare boxelInputTimeBackgroundColor: CSSVariableInfo; // TODO: replace or remove @tracked value = new Date(2022,2,3,13,45); @tracked minValue = new Date(2022,2,3,11,0); @tracked minuteInterval = 5; @action timeChanged(val: Time) { this.value = val as Date; //TODO: casting??? } } ================================================ FILE: samples/Glimmer TS/template-only.gts ================================================ import { LinkTo } from '@ember/routing'; import { TOC } from '@ember/component/template-only'; import Resource from 'ember-crate/models/resource'; import HeroIcon from 'ember-heroicons/components/hero-icon'; const formatDate = (date: Date) => { const options: Intl.DateTimeFormatOptions = { month: 'short', day: 'numeric', year: 'numeric' }; return new Intl.DateTimeFormat('en-US', options).format(new Date(date)); }; export const ResourceCard: TOC<{ Args: { resource: Resource } }> = ; export default ResourceCard; ================================================ FILE: samples/Glyph Bitmap Distribution Format/bitbuntu.bdf ================================================ STARTFONT 2.1 COMMENT Copyright (c) 2011, Aaron Christianson ninjaaron@gmail.com COMMENT licenced under the OFL 1.1 COMMENT 1 FONT -aaron-bitbuntu-medium-r-normal--10-100-72-72-C-90-iSO8859-1 SIZE 10 72 72 FONTBOUNDINGBOX 7 11 0 -2 STARTPROPERTIES 25 FONTNAME_REGISTRY "" FOUNDRY "aaron" FAMILY_NAME "bitbuntu" WEIGHT_NAME "medium" SLANT "r" SETWIDTH_NAME "normal" ADD_STYLE_NAME "" PIXEL_SIZE 10 POINT_SIZE 100 RESOLUTION_X 72 RESOLUTION_Y 72 SPACING "C" AVERAGE_WIDTH 90 CHARSET_REGISTRY "iSO8859" CHARSET_ENCODING "1" COPYRIGHT "CC, Aaron Christianson" FACE_NAME "bitbuntu" WEIGHT 10 X_HEIGHT 6 QUAD_WIDTH 6 _ORIGINAL_FONT_NAME "bitbuntu" _GBDFED_INFO "Edited with gbdfed 1.6." DEFAULT_CHAR 63 FONT_DESCENT 2 FONT_ASCENT 8 ENDPROPERTIES CHARS 190 STARTCHAR char32 ENCODING 32 SWIDTH 600 0 DWIDTH 6 0 BBX 0 0 0 0 BITMAP ENDCHAR STARTCHAR char33 ENCODING 33 SWIDTH 600 0 DWIDTH 6 0 BBX 1 6 3 0 BITMAP 80 80 80 80 00 80 ENDCHAR STARTCHAR char34 ENCODING 34 SWIDTH 600 0 DWIDTH 6 0 BBX 3 2 2 5 BITMAP A0 A0 ENDCHAR STARTCHAR char35 ENCODING 35 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 1 1 BITMAP 50 F8 50 F8 50 ENDCHAR STARTCHAR char36 ENCODING 36 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 1 -1 BITMAP 20 78 80 70 08 F0 20 ENDCHAR STARTCHAR char37 ENCODING 37 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP C0 D8 30 60 D8 18 ENDCHAR STARTCHAR char38 ENCODING 38 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 1 0 BITMAP 30 40 40 68 90 90 68 ENDCHAR STARTCHAR char39 ENCODING 39 SWIDTH 600 0 DWIDTH 6 0 BBX 1 2 2 5 BITMAP 80 80 ENDCHAR STARTCHAR char40 ENCODING 40 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 2 -1 BITMAP 40 80 80 80 80 80 80 40 ENDCHAR STARTCHAR char41 ENCODING 41 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 2 -1 BITMAP 80 40 40 40 40 40 40 80 ENDCHAR STARTCHAR char42 ENCODING 42 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 1 1 BITMAP 20 A8 70 A8 20 ENDCHAR STARTCHAR char43 ENCODING 43 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 1 0 BITMAP 20 20 F8 20 20 ENDCHAR STARTCHAR char44 ENCODING 44 SWIDTH 600 0 DWIDTH 6 0 BBX 2 3 2 -1 BITMAP 40 C0 80 ENDCHAR STARTCHAR char45 ENCODING 45 SWIDTH 600 0 DWIDTH 6 0 BBX 5 1 1 2 BITMAP F8 ENDCHAR STARTCHAR char46 ENCODING 46 SWIDTH 600 0 DWIDTH 6 0 BBX 2 2 2 0 BITMAP C0 C0 ENDCHAR STARTCHAR char47 ENCODING 47 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 10 10 20 20 40 40 80 80 ENDCHAR STARTCHAR char48 ENCODING 48 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 60 90 90 90 90 90 60 ENDCHAR STARTCHAR char49 ENCODING 49 SWIDTH 600 0 DWIDTH 6 0 BBX 2 7 2 0 BITMAP 40 C0 40 40 40 40 40 ENDCHAR STARTCHAR char50 ENCODING 50 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 60 90 10 20 40 80 F0 ENDCHAR STARTCHAR char51 ENCODING 51 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP E0 10 10 60 10 10 E0 ENDCHAR STARTCHAR char52 ENCODING 52 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 1 0 BITMAP 10 30 50 90 F8 10 10 ENDCHAR STARTCHAR char53 ENCODING 53 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP F0 80 80 E0 10 10 E0 ENDCHAR STARTCHAR char54 ENCODING 54 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 60 80 80 E0 90 90 60 ENDCHAR STARTCHAR char55 ENCODING 55 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP F0 10 10 20 20 40 40 ENDCHAR STARTCHAR char56 ENCODING 56 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 60 90 90 60 90 90 60 ENDCHAR STARTCHAR char57 ENCODING 57 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 60 90 90 70 10 10 60 ENDCHAR STARTCHAR char58 ENCODING 58 SWIDTH 600 0 DWIDTH 6 0 BBX 2 5 2 0 BITMAP C0 C0 00 C0 C0 ENDCHAR STARTCHAR char59 ENCODING 59 SWIDTH 600 0 DWIDTH 6 0 BBX 2 6 2 -1 BITMAP C0 C0 00 40 C0 80 ENDCHAR STARTCHAR char60 ENCODING 60 SWIDTH 600 0 DWIDTH 6 0 BBX 3 5 1 0 BITMAP 20 60 C0 60 20 ENDCHAR STARTCHAR char61 ENCODING 61 SWIDTH 600 0 DWIDTH 6 0 BBX 4 3 1 1 BITMAP F0 00 F0 ENDCHAR STARTCHAR char62 ENCODING 62 SWIDTH 600 0 DWIDTH 6 0 BBX 3 5 1 0 BITMAP 80 C0 60 C0 80 ENDCHAR STARTCHAR char63 ENCODING 63 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -1 BITMAP 60 90 10 20 40 00 40 ENDCHAR STARTCHAR char64 ENCODING 64 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 60 90 B0 D0 D0 B0 80 60 ENDCHAR STARTCHAR char65 ENCODING 65 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 70 90 90 90 F0 90 ENDCHAR STARTCHAR char66 ENCODING 66 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP E0 90 E0 90 90 E0 ENDCHAR STARTCHAR char67 QUOTE THIS SHIT ENCODING 67 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 70 80 80 80 80 70 ENDCHAR STARTCHAR char68 ENCODING 68 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP E0 90 90 90 90 E0 ENDCHAR STARTCHAR char69 ENCODING 69 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP F0 80 E0 80 80 F0 ENDCHAR STARTCHAR char70 ENCODING 70 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP F0 80 E0 80 80 80 ENDCHAR STARTCHAR char71 ENCODING 71 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 70 80 80 90 90 70 ENDCHAR STARTCHAR char72 ENCODING 72 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 90 90 90 F0 90 90 ENDCHAR STARTCHAR char73 ENCODING 73 SWIDTH 600 0 DWIDTH 6 0 BBX 1 6 3 0 BITMAP 80 80 80 80 80 80 ENDCHAR STARTCHAR char74 ENCODING 74 SWIDTH 600 0 DWIDTH 6 0 BBX 3 6 2 0 BITMAP 20 20 20 20 20 C0 ENDCHAR STARTCHAR char75 ENCODING 75 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 90 A0 C0 C0 A0 90 ENDCHAR STARTCHAR char76 ENCODING 76 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 80 80 80 80 80 F0 ENDCHAR STARTCHAR char77 ENCODING 77 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP D8 A8 A8 88 88 88 ENDCHAR STARTCHAR char78 ENCODING 78 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 90 90 D0 B0 90 90 ENDCHAR STARTCHAR char79 ENCODING 79 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 60 90 90 90 90 60 ENDCHAR STARTCHAR char80 ENCODING 80 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 2 0 BITMAP E0 90 90 E0 80 80 ENDCHAR STARTCHAR char81 ENCODING 81 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -1 BITMAP 60 90 90 90 90 60 30 ENDCHAR STARTCHAR char82 ENCODING 82 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP E0 90 90 E0 A0 90 ENDCHAR STARTCHAR char83 ENCODING 83 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 70 80 60 10 10 E0 ENDCHAR STARTCHAR char84 ENCODING 84 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP F8 20 20 20 20 20 ENDCHAR STARTCHAR char85 ENCODING 85 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 90 90 90 90 90 70 ENDCHAR STARTCHAR char86 ENCODING 86 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 90 90 90 90 60 60 ENDCHAR STARTCHAR char87 ENCODING 87 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP 88 88 88 A8 A8 78 ENDCHAR STARTCHAR char88 ENCODING 88 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP 90 90 60 60 90 90 ENDCHAR STARTCHAR char89 ENCODING 89 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP 88 88 50 20 20 20 ENDCHAR STARTCHAR char90 ENCODING 90 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 0 BITMAP F0 10 20 40 80 F0 ENDCHAR STARTCHAR char91 ENCODING 91 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 2 -1 BITMAP C0 80 80 80 80 80 80 C0 ENDCHAR STARTCHAR char92 ENCODING 92 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 80 80 40 40 20 20 10 10 ENDCHAR STARTCHAR char93 ENCODING 93 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 2 -1 BITMAP C0 40 40 40 40 40 40 C0 ENDCHAR STARTCHAR char94 ENCODING 94 SWIDTH 600 0 DWIDTH 6 0 BBX 5 3 1 3 BITMAP 20 50 88 ENDCHAR STARTCHAR char95 ENCODING 95 SWIDTH 600 0 DWIDTH 6 0 BBX 5 1 1 -1 BITMAP F8 ENDCHAR STARTCHAR char96 ENCODING 96 SWIDTH 600 0 DWIDTH 6 0 BBX 2 2 2 5 BITMAP 80 40 ENDCHAR STARTCHAR char97 ENCODING 97 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 60 10 70 90 70 ENDCHAR STARTCHAR char98 ENCODING 98 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 80 80 E0 90 90 90 E0 ENDCHAR STARTCHAR char99 ENCODING 99 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 70 80 80 80 70 ENDCHAR STARTCHAR char100 ENCODING 100 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 10 10 70 90 90 90 70 ENDCHAR STARTCHAR char101 ENCODING 101 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 60 90 F0 80 70 ENDCHAR STARTCHAR char102 ENCODING 102 SWIDTH 600 0 DWIDTH 6 0 BBX 3 7 2 0 BITMAP 60 80 E0 80 80 80 80 ENDCHAR STARTCHAR char103 ENCODING 103 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 -1 BITMAP 70 90 90 70 10 60 ENDCHAR STARTCHAR char104 ENCODING 104 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 80 80 E0 90 90 90 90 ENDCHAR STARTCHAR char105 ENCODING 105 SWIDTH 600 0 DWIDTH 6 0 BBX 1 7 3 0 BITMAP 80 00 80 80 80 80 80 ENDCHAR STARTCHAR char106 ENCODING 106 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 2 -1 BITMAP 40 00 40 40 40 40 40 80 ENDCHAR STARTCHAR char107 ENCODING 107 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 80 80 90 A0 C0 A0 90 ENDCHAR STARTCHAR char108 ENCODING 108 SWIDTH 600 0 DWIDTH 6 0 BBX 3 7 2 0 BITMAP 80 80 80 80 80 80 60 ENDCHAR STARTCHAR char109 ENCODING 109 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 1 0 BITMAP F0 A8 A8 A8 88 ENDCHAR STARTCHAR char110 ENCODING 110 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP E0 90 90 90 90 ENDCHAR STARTCHAR char111 ENCODING 111 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 60 90 90 90 60 ENDCHAR STARTCHAR char112 ENCODING 112 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 -1 BITMAP E0 90 90 E0 80 80 ENDCHAR STARTCHAR char113 ENCODING 113 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 -1 BITMAP 70 90 90 70 10 10 ENDCHAR STARTCHAR char114 ENCODING 114 SWIDTH 600 0 DWIDTH 6 0 BBX 3 5 2 0 BITMAP E0 80 80 80 80 ENDCHAR STARTCHAR char115 ENCODING 115 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 70 80 60 10 E0 ENDCHAR STARTCHAR char116 ENCODING 116 SWIDTH 600 0 DWIDTH 6 0 BBX 3 7 2 0 BITMAP 80 80 E0 80 80 80 60 ENDCHAR STARTCHAR char117 ENCODING 117 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 90 90 90 90 70 ENDCHAR STARTCHAR char118 ENCODING 118 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 90 90 90 60 60 ENDCHAR STARTCHAR char119 ENCODING 119 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 1 0 BITMAP 88 A8 A8 A8 78 ENDCHAR STARTCHAR char120 ENCODING 120 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP 90 90 60 90 90 ENDCHAR STARTCHAR char121 ENCODING 121 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 -1 BITMAP 90 90 90 70 10 60 ENDCHAR STARTCHAR char122 ENCODING 122 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 0 BITMAP F0 10 60 80 F0 ENDCHAR STARTCHAR char123 ENCODING 123 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 2 -1 BITMAP 20 40 40 C0 40 40 40 20 ENDCHAR STARTCHAR char124 ENCODING 124 SWIDTH 600 0 DWIDTH 6 0 BBX 1 7 3 -1 BITMAP 80 80 80 80 80 80 80 ENDCHAR STARTCHAR char125 ENCODING 125 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 1 -1 BITMAP 80 40 40 60 40 40 40 80 ENDCHAR STARTCHAR char126 ENCODING 126 SWIDTH 600 0 DWIDTH 6 0 BBX 5 2 1 2 BITMAP 68 B0 ENDCHAR STARTCHAR char128 ENCODING 128 SWIDTH 600 0 DWIDTH 6 0 BBX 0 0 0 0 BITMAP ENDCHAR STARTCHAR char33 ENCODING 161 SWIDTH 600 0 DWIDTH 6 0 BBX 1 7 4 -1 BITMAP 80 00 80 80 80 80 80 ENDCHAR STARTCHAR char99 ENCODING 162 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 1 -1 BITMAP 10 70 A8 A0 C8 70 40 ENDCHAR STARTCHAR char163 ENCODING 163 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP 38 40 40 F0 40 F8 ENDCHAR STARTCHAR char164 ENCODING 164 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 0 0 BITMAP 84 78 48 48 78 84 ENDCHAR STARTCHAR char165 ENCODING 165 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 1 -1 BITMAP 88 50 20 70 20 70 20 ENDCHAR STARTCHAR char166 ENCODING 166 SWIDTH 600 0 DWIDTH 6 0 BBX 1 7 3 -1 BITMAP 80 80 80 80 80 80 80 ENDCHAR STARTCHAR char167 ENCODING 167 SWIDTH 600 0 DWIDTH 6 0 BBX 4 6 1 -1 BITMAP 70 40 A0 50 20 E0 ENDCHAR STARTCHAR char168 ENCODING 168 SWIDTH 600 0 DWIDTH 6 0 BBX 4 1 2 5 BITMAP 90 ENDCHAR STARTCHAR char169 ENCODING 169 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 30 48 B4 C4 B4 48 30 ENDCHAR STARTCHAR char170 ENCODING 170 SWIDTH 600 0 DWIDTH 6 0 BBX 3 5 1 1 BITMAP 40 20 60 A0 60 ENDCHAR STARTCHAR char187 ENCODING 171 SWIDTH 600 0 DWIDTH 6 0 BBX 5 3 1 1 BITMAP 48 90 48 ENDCHAR STARTCHAR char172 ENCODING 172 SWIDTH 600 0 DWIDTH 6 0 BBX 5 3 1 0 BITMAP F8 08 08 ENDCHAR STARTCHAR char169 ENCODING 174 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 30 48 BC B4 AC 48 30 ENDCHAR STARTCHAR char175 ENCODING 175 SWIDTH 600 0 DWIDTH 6 0 BBX 3 1 2 5 BITMAP E0 ENDCHAR STARTCHAR char176 ENCODING 176 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 1 3 BITMAP 40 A0 40 ENDCHAR STARTCHAR char177 ENCODING 177 SWIDTH 600 0 DWIDTH 6 0 BBX 3 5 2 1 BITMAP 40 E0 40 00 E0 ENDCHAR STARTCHAR char178 ENCODING 178 SWIDTH 600 0 DWIDTH 6 0 BBX 4 5 1 2 BITMAP 60 90 20 40 F0 ENDCHAR STARTCHAR char179 ENCODING 179 SWIDTH 600 0 DWIDTH 6 0 BBX 3 5 1 2 BITMAP C0 20 C0 20 C0 ENDCHAR STARTCHAR char180 ENCODING 180 SWIDTH 600 0 DWIDTH 6 0 BBX 2 2 2 6 BITMAP 40 80 ENDCHAR STARTCHAR char181 ENCODING 181 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -2 BITMAP 90 90 90 B0 D0 80 80 ENDCHAR STARTCHAR char182 ENCODING 182 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 0 -1 BITMAP 78 E8 E8 68 28 28 28 ENDCHAR STARTCHAR char183 ENCODING 183 SWIDTH 600 0 DWIDTH 6 0 BBX 2 2 3 1 BITMAP C0 C0 ENDCHAR STARTCHAR char184 ENCODING 184 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 2 0 BITMAP 40 20 E0 ENDCHAR STARTCHAR char185 ENCODING 185 SWIDTH 600 0 DWIDTH 6 0 BBX 2 5 1 1 BITMAP 40 C0 40 40 40 ENDCHAR STARTCHAR char186 ENCODING 186 SWIDTH 600 0 DWIDTH 6 0 BBX 4 4 1 2 BITMAP 60 90 90 60 ENDCHAR STARTCHAR char187 ENCODING 187 SWIDTH 600 0 DWIDTH 6 0 BBX 5 3 1 1 BITMAP 90 48 90 ENDCHAR STARTCHAR char179 ENCODING 188 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 -1 BITMAP 40 C0 40 48 18 28 3C 08 ENDCHAR STARTCHAR char189 ENCODING 189 SWIDTH 600 0 DWIDTH 6 0 BBX 6 7 0 0 BITMAP 40 C0 40 58 04 08 1C ENDCHAR STARTCHAR char179 ENCODING 190 SWIDTH 600 0 DWIDTH 6 0 BBX 6 8 0 -1 BITMAP C0 20 40 28 D8 28 3C 08 ENDCHAR STARTCHAR char63 ENCODING 191 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -1 BITMAP 20 00 20 40 80 90 60 ENDCHAR STARTCHAR char196 ENCODING 192 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 40 20 70 90 90 90 F0 90 ENDCHAR STARTCHAR char196 ENCODING 193 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 10 20 70 90 90 90 F0 90 ENDCHAR STARTCHAR char196 ENCODING 194 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 60 90 90 90 F0 90 ENDCHAR STARTCHAR char196 ENCODING 195 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 50 A0 70 90 90 90 F0 90 ENDCHAR STARTCHAR char196 ENCODING 196 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 90 00 70 90 90 90 F0 90 ENDCHAR STARTCHAR char197 ENCODING 197 SWIDTH 600 0 DWIDTH 6 0 BBX 4 9 1 0 BITMAP 20 50 20 70 90 90 90 F0 90 ENDCHAR STARTCHAR char65 ENCODING 198 SWIDTH 600 0 DWIDTH 6 0 BBX 6 6 0 0 BITMAP 7C 90 98 90 F0 9C ENDCHAR STARTCHAR char67 ENCODING 199 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -2 BITMAP 70 80 80 80 80 70 20 40 ENDCHAR STARTCHAR char69 ENCODING 200 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 40 20 F0 80 E0 80 80 F0 ENDCHAR STARTCHAR char69 ENCODING 201 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 20 40 F0 80 E0 80 80 F0 ENDCHAR STARTCHAR char69 ENCODING 202 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 70 80 80 E0 80 F0 ENDCHAR STARTCHAR char69 ENCODING 203 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 90 00 F0 80 E0 80 80 F0 ENDCHAR STARTCHAR char73 ENCODING 204 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 2 0 BITMAP 80 40 E0 40 40 40 40 E0 ENDCHAR STARTCHAR char73 ENCODING 205 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 2 0 BITMAP 20 40 E0 40 40 40 40 E0 ENDCHAR STARTCHAR char73 ENCODING 206 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 2 0 BITMAP 40 A0 00 E0 40 40 40 E0 ENDCHAR STARTCHAR char73 ENCODING 207 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 2 0 BITMAP A0 00 E0 40 40 40 40 E0 ENDCHAR STARTCHAR char68 ENCODING 208 SWIDTH 600 0 DWIDTH 6 0 BBX 5 6 1 0 BITMAP 70 48 E8 48 48 70 ENDCHAR STARTCHAR char110 ENCODING 209 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 50 A0 90 90 D0 B0 90 90 ENDCHAR STARTCHAR char214 ENCODING 210 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 40 20 60 90 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 211 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 20 40 60 90 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 212 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 60 90 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 213 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 50 A0 60 90 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 214 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 90 00 60 90 90 90 90 60 ENDCHAR STARTCHAR char215 ENCODING 215 SWIDTH 600 0 DWIDTH 6 0 BBX 3 3 2 2 BITMAP A0 40 A0 ENDCHAR STARTCHAR char248 ENCODING 216 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 10 70 B0 B0 D0 D0 E0 80 ENDCHAR STARTCHAR char85 ENCODING 217 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 40 20 90 90 90 90 90 70 ENDCHAR STARTCHAR char85 ENCODING 218 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 20 40 90 90 90 90 90 70 ENDCHAR STARTCHAR char85 ENCODING 219 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 00 90 90 90 90 70 ENDCHAR STARTCHAR char85 ENCODING 220 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 90 00 90 90 90 90 90 70 ENDCHAR STARTCHAR char89 ENCODING 221 SWIDTH 600 0 DWIDTH 6 0 BBX 5 8 1 0 BITMAP 10 20 88 88 50 20 20 20 ENDCHAR STARTCHAR char112 ENCODING 222 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 80 80 E0 90 90 E0 80 80 ENDCHAR STARTCHAR char223 ENCODING 223 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 60 A0 A0 90 90 90 A0 80 ENDCHAR STARTCHAR char228 ENCODING 224 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 40 20 60 10 70 90 70 ENDCHAR STARTCHAR char228 ENCODING 225 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 10 20 60 10 70 90 70 ENDCHAR STARTCHAR char228 ENCODING 226 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 20 50 00 60 10 70 90 70 ENDCHAR STARTCHAR char228 ENCODING 227 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 50 A0 00 60 10 70 90 70 ENDCHAR STARTCHAR char228 ENCODING 228 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 50 00 60 10 70 90 70 ENDCHAR STARTCHAR char229 ENCODING 229 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 20 50 20 60 10 70 90 70 ENDCHAR STARTCHAR char97 ENCODING 230 SWIDTH 600 0 DWIDTH 6 0 BBX 6 5 0 0 BITMAP 28 14 7C 90 6C ENDCHAR STARTCHAR char99 ENCODING 231 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -2 BITMAP 70 80 80 80 70 20 40 ENDCHAR STARTCHAR char101 ENCODING 232 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 40 20 60 90 F0 80 70 ENDCHAR STARTCHAR char101 ENCODING 233 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 20 40 60 90 F0 80 70 ENDCHAR STARTCHAR char101 ENCODING 234 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 00 60 90 F0 80 70 ENDCHAR STARTCHAR char101 ENCODING 235 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 90 00 60 90 F0 80 70 ENDCHAR STARTCHAR char105 ENCODING 236 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 2 0 BITMAP 80 40 00 40 40 40 40 40 ENDCHAR STARTCHAR char105 ENCODING 237 SWIDTH 600 0 DWIDTH 6 0 BBX 2 8 3 0 BITMAP 40 80 00 80 80 80 80 80 ENDCHAR STARTCHAR char105 ENCODING 238 SWIDTH 600 0 DWIDTH 6 0 BBX 3 8 2 0 BITMAP 40 A0 00 40 40 40 40 40 ENDCHAR STARTCHAR char105 ENCODING 239 SWIDTH 600 0 DWIDTH 6 0 BBX 3 7 2 0 BITMAP A0 00 40 40 40 40 40 ENDCHAR STARTCHAR char240 ENCODING 240 SWIDTH 600 0 DWIDTH 6 0 BBX 5 7 1 0 BITMAP 20 18 30 10 70 90 60 ENDCHAR STARTCHAR char110 ENCODING 241 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 50 A0 00 E0 90 90 90 90 ENDCHAR STARTCHAR char246 ENCODING 242 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 40 20 60 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 243 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 20 40 60 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 244 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 00 60 90 90 90 60 ENDCHAR STARTCHAR char214 ENCODING 245 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 50 A0 00 60 90 90 90 60 ENDCHAR STARTCHAR char246 ENCODING 246 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 90 00 60 90 90 90 60 ENDCHAR STARTCHAR char247 ENCODING 247 SWIDTH 600 0 DWIDTH 6 0 BBX 5 5 1 1 BITMAP 20 00 F8 00 20 ENDCHAR STARTCHAR char248 ENCODING 248 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -1 BITMAP 10 70 B0 90 D0 E0 80 ENDCHAR STARTCHAR char117 ENCODING 249 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 40 20 90 90 90 90 70 ENDCHAR STARTCHAR char117 ENCODING 250 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 20 40 90 90 90 90 70 ENDCHAR STARTCHAR char117 ENCODING 251 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 0 BITMAP 60 90 00 90 90 90 90 70 ENDCHAR STARTCHAR char117 ENCODING 252 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 0 BITMAP 90 00 90 90 90 90 70 ENDCHAR STARTCHAR char121 ENCODING 253 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 20 40 90 90 90 70 10 60 ENDCHAR STARTCHAR char112 ENCODING 254 SWIDTH 600 0 DWIDTH 6 0 BBX 4 7 1 -1 BITMAP 80 80 E0 90 E0 80 80 ENDCHAR STARTCHAR char121 ENCODING 255 SWIDTH 600 0 DWIDTH 6 0 BBX 4 8 1 -1 BITMAP 90 00 90 90 90 70 10 60 ENDCHAR ENDFONT ================================================ FILE: samples/Gnuplot/dashcolor.1.gnu ================================================ # set terminal pngcairo background "#ffffff" fontscale 1.0 dashed size 640, 480 # set output 'dashcolor.1.png' set label 1 "set style line 1 lt 2 lc rgb \"red\" lw 3" at -0.4, -0.25, 0 left norotate back textcolor rgb "red" nopoint offset character 0, 0, 0 set label 2 "set style line 2 lt 2 lc rgb \"orange\" lw 2" at -0.4, -0.35, 0 left norotate back textcolor rgb "orange" nopoint offset character 0, 0, 0 set label 3 "set style line 3 lt 2 lc rgb \"yellow\" lw 3" at -0.4, -0.45, 0 left norotate back textcolor rgb "yellow" nopoint offset character 0, 0, 0 set label 4 "set style line 4 lt 2 lc rgb \"green\" lw 2" at -0.4, -0.55, 0 left norotate back textcolor rgb "green" nopoint offset character 0, 0, 0 set label 5 "plot ... lt 1 lc 3 " at -0.4, -0.65, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0 set label 6 "plot ... lt 3 lc 3 " at -0.4, -0.75, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0 set label 7 "plot ... lt 5 lc 3 " at -0.4, -0.85, 0 left norotate back textcolor lt 3 nopoint offset character 0, 0, 0 set style line 1 linetype 2 linecolor rgb "red" linewidth 3.000 pointtype 2 pointsize default pointinterval 0 set style line 2 linetype 2 linecolor rgb "orange" linewidth 2.000 pointtype 2 pointsize default pointinterval 0 set style line 3 linetype 2 linecolor rgb "yellow" linewidth 3.000 pointtype 2 pointsize default pointinterval 0 set style line 4 linetype 2 linecolor rgb "green" linewidth 2.000 pointtype 2 pointsize default pointinterval 0 set noxtics set noytics set title "Independent colors and dot/dash styles" set xlabel "You will only see dashed lines if your current terminal setting permits it" set xrange [ -0.500000 : 3.50000 ] noreverse nowriteback set yrange [ -1.00000 : 1.40000 ] noreverse nowriteback set bmargin 7 unset colorbox plot cos(x) ls 1 title 'ls 1', cos(x-.2) ls 2 title 'ls 2', cos(x-.4) ls 3 title 'ls 3', cos(x-.6) ls 4 title 'ls 4', cos(x-.8) lt 1 lc 3 title 'lt 1 lc 3', cos(x-1.) lt 3 lc 3 title 'lt 3 lc 3', cos(x-1.2) lt 5 lc 3 title 'lt 5 lc 3' ================================================ FILE: samples/Gnuplot/defense_plotter.p ================================================ # # defense_plotter.p # # This is a gnuplot script that creates the graphs for defense values. # # Defense values are from: # # http://wiki.starsautohost.org/wiki/Guts_of_bombing # Author: Leonard Dickens # Date: 1998/07/17 # Forums: rec.games.computer.stars # # :author: Brandon Arrendondo # :license: MIT # set terminal pngcairo transparent truecolor font "Arial Bold,10" size 350, 250 set output "out.png" set title "Shield Coverage vs. Defense Quantity" set grid set xrange [0:100] set xlabel "Number of Defenses" set format y '%2.0f%%' set yrange [0:100] set key right bottom sdi = 0.0099 missile_battery = 0.0199 laser_battery = 0.0239 planetary_shield = 0.0299 neutron_shield = 0.0379 val = neutron_shield f(x) = (1.0 - ((1.0 - (val)) ** x)) * 100.0 g(x) = (1.0 - ((1.0 - (val/2.0)) ** x)) * 100.0 plot f(x) title "Standard" lt rgb "#000080", g(x) title "Smart" lt rgb "#000000" ================================================ FILE: samples/Gnuplot/defense_plotter.plt ================================================ # # defense_plotter.plt # # This is a gnuplot script that creates the graphs for defense values. # # Defense values are from: # # http://wiki.starsautohost.org/wiki/Guts_of_bombing # Author: Leonard Dickens # Date: 1998/07/17 # Forums: rec.games.computer.stars # # :author: Brandon Arrendondo # :license: MIT # set terminal pngcairo transparent truecolor font "Arial Bold,10" size 350, 250 set output "out.png" set title "Shield Coverage vs. Defense Quantity" set grid set xrange [0:100] set xlabel "Number of Defenses" set format y '%2.0f%%' set yrange [0:100] set key right bottom sdi = 0.0099 missile_battery = 0.0199 laser_battery = 0.0239 planetary_shield = 0.0299 neutron_shield = 0.0379 val = neutron_shield f(x) = (1.0 - ((1.0 - (val)) ** x)) * 100.0 g(x) = (1.0 - ((1.0 - (val/2.0)) ** x)) * 100.0 plot f(x) title "Standard" lt rgb "#000080", g(x) title "Smart" lt rgb "#000000" ================================================ FILE: samples/Gnuplot/histograms.2.gnu ================================================ # set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350 # set output 'histograms.2.png' set boxwidth 0.9 absolute set style fill solid 1.00 border lt -1 set key inside right top vertical Right noreverse noenhanced autotitles nobox set style histogram clustered gap 1 title offset character 0, 0, 0 set datafile missing '-' set style data histograms set xtics border in scale 0,0 nomirror rotate by -45 offset character 0, 0, 0 autojustify set xtics norangelimit font ",8" set xtics () set title "US immigration from Northern Europe\nPlot selected data columns as histogram of clustered boxes" set yrange [ 0.00000 : 300000. ] noreverse nowriteback i = 22 plot 'immigration.dat' using 6:xtic(1) ti col, '' u 12 ti col, '' u 13 ti col, '' u 14 ti col ================================================ FILE: samples/Gnuplot/rates.gp ================================================ #!/usr/bin/env gnuplot reset set terminal png set output 'rates100.png' set xlabel "A2A price" set ylabel "Response Rate" #set xr [0:5] #set yr [0:6] plot 'rates100.dat' pt 7 notitle ================================================ FILE: samples/Gnuplot/surface1.16.gnu ================================================ # set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350 # set output 'surface1.16.png' set dummy u,v set label 1 "increasing v" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0 set label 2 "u=0" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0 set label 3 "u=1" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0 set arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000 set arrow 2 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000 set arrow 3 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000 set parametric set view 70, 20, 1, 1 set samples 51, 51 set isosamples 2, 33 set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover set ztics -1.00000,0.25,1.00000 norangelimit set title "\"fence plot\" using separate parametric surfaces" set xlabel "X axis" set xlabel offset character -3, -2, 0 font "" textcolor lt -1 norotate set xrange [ -5.00000 : 5.00000 ] noreverse nowriteback set ylabel "Y axis" set ylabel offset character 3, -2, 0 font "" textcolor lt -1 rotate by -270 set yrange [ -5.00000 : 5.00000 ] noreverse nowriteback set zlabel "Z axis" set zlabel offset character -5, 0, 0 font "" textcolor lt -1 norotate set zrange [ -1.00000 : 1.00000 ] noreverse nowriteback sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2) GPFUN_sinc = "sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)" xx = 6.08888888888889 dx = 1.10888888888889 x0 = -5 x1 = -3.89111111111111 x2 = -2.78222222222222 x3 = -1.67333333333333 x4 = -0.564444444444444 x5 = 0.544444444444445 x6 = 1.65333333333333 x7 = 2.76222222222222 x8 = 3.87111111111111 x9 = 4.98 splot [u=0:1][v=-4.99:4.99] x0, v, (u<0.5) ? -1 : sinc(x0,v) notitle, x1, v, (u<0.5) ? -1 : sinc(x1,v) notitle, x2, v, (u<0.5) ? -1 : sinc(x2,v) notitle, x3, v, (u<0.5) ? -1 : sinc(x3,v) notitle, x4, v, (u<0.5) ? -1 : sinc(x4,v) notitle, x5, v, (u<0.5) ? -1 : sinc(x5,v) notitle, x6, v, (u<0.5) ? -1 : sinc(x6,v) notitle, x7, v, (u<0.5) ? -1 : sinc(x7,v) notitle, x8, v, (u<0.5) ? -1 : sinc(x8,v) notitle, x9, v, (u<0.5) ? -1 : sinc(x9,v) notitle ================================================ FILE: samples/Gnuplot/surface1.17.gnu ================================================ # set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350 # set output 'surface1.17.png' set dummy u,v set label 1 "increasing v" at 6, 0, -1 left norotate back nopoint offset character 0, 0, 0 set label 2 "increasing u" at 0, -5, -1.5 left norotate back nopoint offset character 0, 0, 0 set label 3 "floor(u)%3=0" at 5, 6.5, -1 left norotate back nopoint offset character 0, 0, 0 set label 4 "floor(u)%3=1" at 5, 6.5, 0.100248 left norotate back nopoint offset character 0, 0, 0 set arrow 1 from 5, -5, -1.2 to 5, 5, -1.2 head back nofilled linetype -1 linewidth 1.000 set arrow 2 from -5, -5, -1.2 to 5, -5, -1.2 head back nofilled linetype -1 linewidth 1.000 set arrow 3 from 5, 6, -1 to 5, 5, -1 head back nofilled linetype -1 linewidth 1.000 set arrow 4 from 5, 6, 0.100248 to 5, 5, 0.100248 head back nofilled linetype -1 linewidth 1.000 set parametric set view 70, 20, 1, 1 set samples 51, 51 set isosamples 30, 33 set hidden3d back offset 1 trianglepattern 3 undefined 1 altdiagonal bentover set ztics -1.00000,0.25,1.00000 norangelimit set title "\"fence plot\" using single parametric surface with undefined points" set xlabel "X axis" set xlabel offset character -3, -2, 0 font "" textcolor lt -1 norotate set xrange [ -5.00000 : 5.00000 ] noreverse nowriteback set ylabel "Y axis" set ylabel offset character 3, -2, 0 font "" textcolor lt -1 rotate by -270 set yrange [ -5.00000 : 5.00000 ] noreverse nowriteback set zlabel "Z axis" set zlabel offset character -5, 0, 0 font "" textcolor lt -1 norotate set zrange [ -1.00000 : 1.00000 ] noreverse nowriteback sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2) GPFUN_sinc = "sinc(u,v) = sin(sqrt(u**2+v**2)) / sqrt(u**2+v**2)" xx = 6.08888888888889 dx = 1.11 x0 = -5 x1 = -3.89111111111111 x2 = -2.78222222222222 x3 = -1.67333333333333 x4 = -0.564444444444444 x5 = 0.544444444444445 x6 = 1.65333333333333 x7 = 2.76222222222222 x8 = 3.87111111111111 x9 = 4.98 xmin = -4.99 xmax = 5 n = 10 zbase = -1 splot [u=.5:3*n-.5][v=-4.99:4.99] xmin+floor(u/3)*dx, v, ((floor(u)%3)==0) ? zbase : (((floor(u)%3)==1) ? sinc(xmin+u/3.*dx,v) : 1/0) notitle ================================================ FILE: samples/Gnuplot/world2.1.gnu ================================================ # set terminal pngcairo transparent enhanced font "arial,10" fontscale 1.0 size 500, 350 # set output 'world2.1.png' unset border set dummy u,v set angles degrees set parametric set view 60, 136, 1.22, 1.26 set samples 64, 64 set isosamples 13, 13 set mapping spherical set noxtics set noytics set noztics set title "Labels colored by GeV plotted in spherical coordinate system" set urange [ -90.0000 : 90.0000 ] noreverse nowriteback set vrange [ 0.00000 : 360.000 ] noreverse nowriteback set cblabel "GeV" set cbrange [ 0.00000 : 8.00000 ] noreverse nowriteback set colorbox user set colorbox vertical origin screen 0.9, 0.2, 0 size screen 0.02, 0.75, 0 front bdefault splot cos(u)*cos(v),cos(u)*sin(v),sin(u) notitle with lines lt 5, 'world.dat' notitle with lines lt 2, 'srl.dat' using 3:2:(1):1:4 with labels notitle point pt 6 lw .1 left offset 1,0 font "Helvetica,7" tc pal ================================================ FILE: samples/Go/api.pb.go ================================================ // Code generated by protoc-gen-gogo. // source: api.proto // DO NOT EDIT! /* Package proto is a generated protocol buffer package. It is generated from these files: api.proto config.proto data.proto errors.proto gossip.proto heartbeat.proto internal.proto It has these top-level messages: ClientCmdID RequestHeader ResponseHeader ContainsRequest ContainsResponse GetRequest GetResponse PutRequest PutResponse ConditionalPutRequest ConditionalPutResponse IncrementRequest IncrementResponse DeleteRequest DeleteResponse DeleteRangeRequest DeleteRangeResponse ScanRequest ScanResponse EndTransactionRequest EndTransactionResponse ReapQueueRequest ReapQueueResponse EnqueueUpdateRequest EnqueueUpdateResponse EnqueueMessageRequest EnqueueMessageResponse RequestUnion ResponseUnion BatchRequest BatchResponse AdminSplitRequest AdminSplitResponse AdminMergeRequest AdminMergeResponse */ package proto import proto1 "github.com/gogo/protobuf/proto" import math "math" // discarding unused import gogoproto "github.com/gogo/protobuf/gogoproto/gogo.pb" // Reference imports to suppress errors if they are not otherwise used. var _ = proto1.Marshal var _ = math.Inf // ClientCmdID provides a unique ID for client commands. Clients which // provide ClientCmdID gain operation idempotence. In other words, // clients can submit the same command multiple times and always // receive the same response. This is common on retries over flaky // networks. However, the system imposes a limit on how long // idempotence is provided. Retries over an hour old are not // guaranteed idempotence and may be executed more than once with // potentially different results. // // ClientCmdID contains the client's timestamp and a client-generated // random number. The client Timestamp is specified in unix // nanoseconds and is used for some uniqueness but also to provide a // rough ordering of requests, useful for data locality on the // server. The Random is specified for additional uniqueness. // NOTE: An accurate time signal IS NOT required for correctness. type ClientCmdID struct { // Nanoseconds since Unix epoch. WallTime int64 `protobuf:"varint,1,opt,name=wall_time" json:"wall_time"` Random int64 `protobuf:"varint,2,opt,name=random" json:"random"` XXX_unrecognized []byte `json:"-"` } func (m *ClientCmdID) Reset() { *m = ClientCmdID{} } func (m *ClientCmdID) String() string { return proto1.CompactTextString(m) } func (*ClientCmdID) ProtoMessage() {} func (m *ClientCmdID) GetWallTime() int64 { if m != nil { return m.WallTime } return 0 } func (m *ClientCmdID) GetRandom() int64 { if m != nil { return m.Random } return 0 } // RequestHeader is supplied with every storage node request. type RequestHeader struct { // Timestamp specifies time at which read or writes should be // performed. If the timestamp is set to zero value, its value // is initialized to the wall time of the receiving node. Timestamp Timestamp `protobuf:"bytes,1,opt,name=timestamp" json:"timestamp"` // CmdID is optionally specified for request idempotence // (i.e. replay protection). CmdID ClientCmdID `protobuf:"bytes,2,opt,name=cmd_id" json:"cmd_id"` // The key for request. If the request operates on a range, this // represents the starting key for the range. Key Key `protobuf:"bytes,3,opt,name=key,customtype=Key" json:"key"` // End key is empty if request spans only a single key. EndKey Key `protobuf:"bytes,4,opt,name=end_key,customtype=Key" json:"end_key"` // User is the originating user. Used to lookup priority when // scheduling queued operations at target node. User string `protobuf:"bytes,5,opt,name=user" json:"user"` // Replica specifies the destination for the request. This is a specific // instance of the available replicas belonging to RangeID. Replica Replica `protobuf:"bytes,6,opt,name=replica" json:"replica"` // RaftID specifies the ID of the Raft consensus group which the key // range belongs to. This is used by the receiving node to route the // request to the correct range. RaftID int64 `protobuf:"varint,7,opt,name=raft_id" json:"raft_id"` // UserPriority specifies priority multiple for non-transactional // commands. This value should be a positive integer [1, 2^31-1). // It's properly viewed as a multiple for how likely this // transaction will be to prevail if a write conflict occurs. // Commands with UserPriority=100 will be 100x less likely to be // aborted as conflicting transactions or non-transactional commands // with UserPriority=1. This value is ignored if Txn is // specified. If neither this value nor Txn is specified, the value // defaults to 1. UserPriority *int32 `protobuf:"varint,8,opt,name=user_priority,def=1" json:"user_priority,omitempty"` // Txn is set non-nil if a transaction is underway. To start a txn, // the first request should set this field to non-nil with name and // isolation level set as desired. The response will contain the // fully-initialized transaction with txn ID, priority, initial // timestamp, and maximum timestamp. Txn *Transaction `protobuf:"bytes,9,opt,name=txn" json:"txn,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *RequestHeader) Reset() { *m = RequestHeader{} } func (m *RequestHeader) String() string { return proto1.CompactTextString(m) } func (*RequestHeader) ProtoMessage() {} const Default_RequestHeader_UserPriority int32 = 1 func (m *RequestHeader) GetTimestamp() Timestamp { if m != nil { return m.Timestamp } return Timestamp{} } func (m *RequestHeader) GetCmdID() ClientCmdID { if m != nil { return m.CmdID } return ClientCmdID{} } func (m *RequestHeader) GetUser() string { if m != nil { return m.User } return "" } func (m *RequestHeader) GetReplica() Replica { if m != nil { return m.Replica } return Replica{} } func (m *RequestHeader) GetRaftID() int64 { if m != nil { return m.RaftID } return 0 } func (m *RequestHeader) GetUserPriority() int32 { if m != nil && m.UserPriority != nil { return *m.UserPriority } return Default_RequestHeader_UserPriority } func (m *RequestHeader) GetTxn() *Transaction { if m != nil { return m.Txn } return nil } // ResponseHeader is returned with every storage node response. type ResponseHeader struct { // Error is non-nil if an error occurred. Error *Error `protobuf:"bytes,1,opt,name=error" json:"error,omitempty"` // Timestamp specifies time at which read or write actually was // performed. In the case of both reads and writes, if the timestamp // supplied to the request was 0, the wall time of the node // servicing the request will be set here. Additionally, in the case // of writes, this value may be increased from the timestamp passed // with the RequestHeader if the key being written was either read // or written more recently. Timestamp Timestamp `protobuf:"bytes,2,opt,name=timestamp" json:"timestamp"` // Transaction is non-nil if the request specified a non-nil // transaction. The transaction timestamp and/or priority may have // been updated, depending on the outcome of the request. Txn *Transaction `protobuf:"bytes,3,opt,name=txn" json:"txn,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *ResponseHeader) Reset() { *m = ResponseHeader{} } func (m *ResponseHeader) String() string { return proto1.CompactTextString(m) } func (*ResponseHeader) ProtoMessage() {} func (m *ResponseHeader) GetError() *Error { if m != nil { return m.Error } return nil } func (m *ResponseHeader) GetTimestamp() Timestamp { if m != nil { return m.Timestamp } return Timestamp{} } func (m *ResponseHeader) GetTxn() *Transaction { if m != nil { return m.Txn } return nil } // A ContainsRequest is arguments to the Contains() method. type ContainsRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *ContainsRequest) Reset() { *m = ContainsRequest{} } func (m *ContainsRequest) String() string { return proto1.CompactTextString(m) } func (*ContainsRequest) ProtoMessage() {} // A ContainsResponse is the return value of the Contains() method. type ContainsResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Exists bool `protobuf:"varint,2,opt,name=exists" json:"exists"` XXX_unrecognized []byte `json:"-"` } func (m *ContainsResponse) Reset() { *m = ContainsResponse{} } func (m *ContainsResponse) String() string { return proto1.CompactTextString(m) } func (*ContainsResponse) ProtoMessage() {} func (m *ContainsResponse) GetExists() bool { if m != nil { return m.Exists } return false } // A GetRequest is arguments to the Get() method. type GetRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *GetRequest) Reset() { *m = GetRequest{} } func (m *GetRequest) String() string { return proto1.CompactTextString(m) } func (*GetRequest) ProtoMessage() {} // A GetResponse is the return value from the Get() method. // If the key doesn't exist, returns nil for Value.Bytes. type GetResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Value *Value `protobuf:"bytes,2,opt,name=value" json:"value,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *GetResponse) Reset() { *m = GetResponse{} } func (m *GetResponse) String() string { return proto1.CompactTextString(m) } func (*GetResponse) ProtoMessage() {} func (m *GetResponse) GetValue() *Value { if m != nil { return m.Value } return nil } // A PutRequest is arguments to the Put() method. Note that to write // an empty value, the value parameter is still specified, but both // Bytes and Integer are set to nil. type PutRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Value Value `protobuf:"bytes,2,opt,name=value" json:"value"` XXX_unrecognized []byte `json:"-"` } func (m *PutRequest) Reset() { *m = PutRequest{} } func (m *PutRequest) String() string { return proto1.CompactTextString(m) } func (*PutRequest) ProtoMessage() {} func (m *PutRequest) GetValue() Value { if m != nil { return m.Value } return Value{} } // A PutResponse is the return value from the Put() method. type PutResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *PutResponse) Reset() { *m = PutResponse{} } func (m *PutResponse) String() string { return proto1.CompactTextString(m) } func (*PutResponse) ProtoMessage() {} // A ConditionalPutRequest is arguments to the ConditionalPut() method. // // - Returns true and sets value if ExpValue equals existing value. // - If key doesn't exist and ExpValue is nil, sets value. // - If key exists, but value is empty and ExpValue is not nil but empty, sets value. // - Otherwise, returns error and the actual value of the key in the response. type ConditionalPutRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // The value to put. Value Value `protobuf:"bytes,2,opt,name=value" json:"value"` // ExpValue.Bytes empty to test for non-existence. Specify as nil // to indicate there should be no existing entry. This is different // from the expectation that the value exists but is empty. ExpValue *Value `protobuf:"bytes,3,opt,name=exp_value" json:"exp_value,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *ConditionalPutRequest) Reset() { *m = ConditionalPutRequest{} } func (m *ConditionalPutRequest) String() string { return proto1.CompactTextString(m) } func (*ConditionalPutRequest) ProtoMessage() {} func (m *ConditionalPutRequest) GetValue() Value { if m != nil { return m.Value } return Value{} } func (m *ConditionalPutRequest) GetExpValue() *Value { if m != nil { return m.ExpValue } return nil } // A ConditionalPutResponse is the return value from the // ConditionalPut() method. type ConditionalPutResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *ConditionalPutResponse) Reset() { *m = ConditionalPutResponse{} } func (m *ConditionalPutResponse) String() string { return proto1.CompactTextString(m) } func (*ConditionalPutResponse) ProtoMessage() {} // An IncrementRequest is arguments to the Increment() method. It // increments the value for key, and returns the new value. If no // value exists for a key, incrementing by 0 is not a noop, but will // create a zero value. IncrementRequest cannot be called on a key set // by Put() or ConditionalPut(). Similarly, Get(), Put() and // ConditionalPut() cannot be invoked on an incremented key. type IncrementRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Increment int64 `protobuf:"varint,2,opt,name=increment" json:"increment"` XXX_unrecognized []byte `json:"-"` } func (m *IncrementRequest) Reset() { *m = IncrementRequest{} } func (m *IncrementRequest) String() string { return proto1.CompactTextString(m) } func (*IncrementRequest) ProtoMessage() {} func (m *IncrementRequest) GetIncrement() int64 { if m != nil { return m.Increment } return 0 } // An IncrementResponse is the return value from the Increment // method. The new value after increment is specified in NewValue. If // the value could not be decoded as specified, Error will be set. type IncrementResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` NewValue int64 `protobuf:"varint,2,opt,name=new_value" json:"new_value"` XXX_unrecognized []byte `json:"-"` } func (m *IncrementResponse) Reset() { *m = IncrementResponse{} } func (m *IncrementResponse) String() string { return proto1.CompactTextString(m) } func (*IncrementResponse) ProtoMessage() {} func (m *IncrementResponse) GetNewValue() int64 { if m != nil { return m.NewValue } return 0 } // A DeleteRequest is arguments to the Delete() method. type DeleteRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *DeleteRequest) Reset() { *m = DeleteRequest{} } func (m *DeleteRequest) String() string { return proto1.CompactTextString(m) } func (*DeleteRequest) ProtoMessage() {} // A DeleteResponse is the return value from the Delete() method. type DeleteResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *DeleteResponse) Reset() { *m = DeleteResponse{} } func (m *DeleteResponse) String() string { return proto1.CompactTextString(m) } func (*DeleteResponse) ProtoMessage() {} // A DeleteRangeRequest is arguments to the DeleteRange method. It // specifies the range of keys to delete. type DeleteRangeRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // If 0, *all* entries between Key (inclusive) and EndKey // (exclusive) are deleted. Must be >= 0 MaxEntriesToDelete int64 `protobuf:"varint,2,opt,name=max_entries_to_delete" json:"max_entries_to_delete"` XXX_unrecognized []byte `json:"-"` } func (m *DeleteRangeRequest) Reset() { *m = DeleteRangeRequest{} } func (m *DeleteRangeRequest) String() string { return proto1.CompactTextString(m) } func (*DeleteRangeRequest) ProtoMessage() {} func (m *DeleteRangeRequest) GetMaxEntriesToDelete() int64 { if m != nil { return m.MaxEntriesToDelete } return 0 } // A DeleteRangeResponse is the return value from the DeleteRange() // method. type DeleteRangeResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // Number of entries removed. NumDeleted int64 `protobuf:"varint,2,opt,name=num_deleted" json:"num_deleted"` XXX_unrecognized []byte `json:"-"` } func (m *DeleteRangeResponse) Reset() { *m = DeleteRangeResponse{} } func (m *DeleteRangeResponse) String() string { return proto1.CompactTextString(m) } func (*DeleteRangeResponse) ProtoMessage() {} func (m *DeleteRangeResponse) GetNumDeleted() int64 { if m != nil { return m.NumDeleted } return 0 } // A ScanRequest is arguments to the Scan() method. It specifies the // start and end keys for the scan and the maximum number of results. type ScanRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // Must be > 0. MaxResults int64 `protobuf:"varint,2,opt,name=max_results" json:"max_results"` XXX_unrecognized []byte `json:"-"` } func (m *ScanRequest) Reset() { *m = ScanRequest{} } func (m *ScanRequest) String() string { return proto1.CompactTextString(m) } func (*ScanRequest) ProtoMessage() {} func (m *ScanRequest) GetMaxResults() int64 { if m != nil { return m.MaxResults } return 0 } // A ScanResponse is the return value from the Scan() method. type ScanResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // Empty if no rows were scanned. Rows []KeyValue `protobuf:"bytes,2,rep,name=rows" json:"rows"` XXX_unrecognized []byte `json:"-"` } func (m *ScanResponse) Reset() { *m = ScanResponse{} } func (m *ScanResponse) String() string { return proto1.CompactTextString(m) } func (*ScanResponse) ProtoMessage() {} func (m *ScanResponse) GetRows() []KeyValue { if m != nil { return m.Rows } return nil } // An EndTransactionRequest is arguments to the EndTransaction() method. // It specifies whether to commit or roll back an extant transaction. type EndTransactionRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // False to abort and rollback. Commit bool `protobuf:"varint,2,opt,name=commit" json:"commit"` // Optional commit triggers. Note that commit triggers are for // internal use only and will be ignored if requested through the // public-facing KV API. SplitTrigger *SplitTrigger `protobuf:"bytes,3,opt,name=split_trigger" json:"split_trigger,omitempty"` MergeTrigger *MergeTrigger `protobuf:"bytes,4,opt,name=merge_trigger" json:"merge_trigger,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *EndTransactionRequest) Reset() { *m = EndTransactionRequest{} } func (m *EndTransactionRequest) String() string { return proto1.CompactTextString(m) } func (*EndTransactionRequest) ProtoMessage() {} func (m *EndTransactionRequest) GetCommit() bool { if m != nil { return m.Commit } return false } func (m *EndTransactionRequest) GetSplitTrigger() *SplitTrigger { if m != nil { return m.SplitTrigger } return nil } func (m *EndTransactionRequest) GetMergeTrigger() *MergeTrigger { if m != nil { return m.MergeTrigger } return nil } // An EndTransactionResponse is the return value from the // EndTransaction() method. The final transaction record is returned // as part of the response header. In particular, transaction status // and timestamp will be updated to reflect final committed // values. Clients may propagate the transaction timestamp as the // final txn commit timestamp in order to preserve causal ordering // between subsequent transactions. CommitWait specifies the commit // wait, which is the remaining time the client MUST wait before // signalling completion of the transaction to another distributed // node to maintain consistency. type EndTransactionResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // Remaining time (ns). CommitWait int64 `protobuf:"varint,2,opt,name=commit_wait" json:"commit_wait"` XXX_unrecognized []byte `json:"-"` } func (m *EndTransactionResponse) Reset() { *m = EndTransactionResponse{} } func (m *EndTransactionResponse) String() string { return proto1.CompactTextString(m) } func (*EndTransactionResponse) ProtoMessage() {} func (m *EndTransactionResponse) GetCommitWait() int64 { if m != nil { return m.CommitWait } return 0 } // A ReapQueueRequest is arguments to the ReapQueue() method. It // specifies the recipient inbox key to which messages are waiting // to be reapted and also the maximum number of results to return. type ReapQueueRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // Maximum results to return; must be > 0. MaxResults int64 `protobuf:"varint,2,opt,name=max_results" json:"max_results"` XXX_unrecognized []byte `json:"-"` } func (m *ReapQueueRequest) Reset() { *m = ReapQueueRequest{} } func (m *ReapQueueRequest) String() string { return proto1.CompactTextString(m) } func (*ReapQueueRequest) ProtoMessage() {} func (m *ReapQueueRequest) GetMaxResults() int64 { if m != nil { return m.MaxResults } return 0 } // A ReapQueueResponse is the return value from the ReapQueue() method. type ReapQueueResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Messages []Value `protobuf:"bytes,2,rep,name=messages" json:"messages"` XXX_unrecognized []byte `json:"-"` } func (m *ReapQueueResponse) Reset() { *m = ReapQueueResponse{} } func (m *ReapQueueResponse) String() string { return proto1.CompactTextString(m) } func (*ReapQueueResponse) ProtoMessage() {} func (m *ReapQueueResponse) GetMessages() []Value { if m != nil { return m.Messages } return nil } // An EnqueueUpdateRequest is arguments to the EnqueueUpdate() method. // It specifies the update to enqueue for asynchronous execution. // Update is an instance of one of the following messages: PutRequest, // IncrementRequest, DeleteRequest, DeleteRangeRequest, or // AccountingRequest. type EnqueueUpdateRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *EnqueueUpdateRequest) Reset() { *m = EnqueueUpdateRequest{} } func (m *EnqueueUpdateRequest) String() string { return proto1.CompactTextString(m) } func (*EnqueueUpdateRequest) ProtoMessage() {} // An EnqueueUpdateResponse is the return value from the // EnqueueUpdate() method. type EnqueueUpdateResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *EnqueueUpdateResponse) Reset() { *m = EnqueueUpdateResponse{} } func (m *EnqueueUpdateResponse) String() string { return proto1.CompactTextString(m) } func (*EnqueueUpdateResponse) ProtoMessage() {} // An EnqueueMessageRequest is arguments to the EnqueueMessage() method. // It specifies the recipient inbox key and the message (an arbitrary // byte slice value). type EnqueueMessageRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` // Message value to delivery to inbox. Msg Value `protobuf:"bytes,2,opt,name=msg" json:"msg"` XXX_unrecognized []byte `json:"-"` } func (m *EnqueueMessageRequest) Reset() { *m = EnqueueMessageRequest{} } func (m *EnqueueMessageRequest) String() string { return proto1.CompactTextString(m) } func (*EnqueueMessageRequest) ProtoMessage() {} func (m *EnqueueMessageRequest) GetMsg() Value { if m != nil { return m.Msg } return Value{} } // An EnqueueMessageResponse is the return value from the // EnqueueMessage() method. type EnqueueMessageResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *EnqueueMessageResponse) Reset() { *m = EnqueueMessageResponse{} } func (m *EnqueueMessageResponse) String() string { return proto1.CompactTextString(m) } func (*EnqueueMessageResponse) ProtoMessage() {} // A RequestUnion contains exactly one of the optional requests. type RequestUnion struct { Contains *ContainsRequest `protobuf:"bytes,1,opt,name=contains" json:"contains,omitempty"` Get *GetRequest `protobuf:"bytes,2,opt,name=get" json:"get,omitempty"` Put *PutRequest `protobuf:"bytes,3,opt,name=put" json:"put,omitempty"` ConditionalPut *ConditionalPutRequest `protobuf:"bytes,4,opt,name=conditional_put" json:"conditional_put,omitempty"` Increment *IncrementRequest `protobuf:"bytes,5,opt,name=increment" json:"increment,omitempty"` Delete *DeleteRequest `protobuf:"bytes,6,opt,name=delete" json:"delete,omitempty"` DeleteRange *DeleteRangeRequest `protobuf:"bytes,7,opt,name=delete_range" json:"delete_range,omitempty"` Scan *ScanRequest `protobuf:"bytes,8,opt,name=scan" json:"scan,omitempty"` EndTransaction *EndTransactionRequest `protobuf:"bytes,9,opt,name=end_transaction" json:"end_transaction,omitempty"` ReapQueue *ReapQueueRequest `protobuf:"bytes,10,opt,name=reap_queue" json:"reap_queue,omitempty"` EnqueueUpdate *EnqueueUpdateRequest `protobuf:"bytes,11,opt,name=enqueue_update" json:"enqueue_update,omitempty"` EnqueueMessage *EnqueueMessageRequest `protobuf:"bytes,12,opt,name=enqueue_message" json:"enqueue_message,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *RequestUnion) Reset() { *m = RequestUnion{} } func (m *RequestUnion) String() string { return proto1.CompactTextString(m) } func (*RequestUnion) ProtoMessage() {} func (m *RequestUnion) GetContains() *ContainsRequest { if m != nil { return m.Contains } return nil } func (m *RequestUnion) GetGet() *GetRequest { if m != nil { return m.Get } return nil } func (m *RequestUnion) GetPut() *PutRequest { if m != nil { return m.Put } return nil } func (m *RequestUnion) GetConditionalPut() *ConditionalPutRequest { if m != nil { return m.ConditionalPut } return nil } func (m *RequestUnion) GetIncrement() *IncrementRequest { if m != nil { return m.Increment } return nil } func (m *RequestUnion) GetDelete() *DeleteRequest { if m != nil { return m.Delete } return nil } func (m *RequestUnion) GetDeleteRange() *DeleteRangeRequest { if m != nil { return m.DeleteRange } return nil } func (m *RequestUnion) GetScan() *ScanRequest { if m != nil { return m.Scan } return nil } func (m *RequestUnion) GetEndTransaction() *EndTransactionRequest { if m != nil { return m.EndTransaction } return nil } func (m *RequestUnion) GetReapQueue() *ReapQueueRequest { if m != nil { return m.ReapQueue } return nil } func (m *RequestUnion) GetEnqueueUpdate() *EnqueueUpdateRequest { if m != nil { return m.EnqueueUpdate } return nil } func (m *RequestUnion) GetEnqueueMessage() *EnqueueMessageRequest { if m != nil { return m.EnqueueMessage } return nil } // A ResponseUnion contains exactly one of the optional responses. type ResponseUnion struct { Contains *ContainsResponse `protobuf:"bytes,1,opt,name=contains" json:"contains,omitempty"` Get *GetResponse `protobuf:"bytes,2,opt,name=get" json:"get,omitempty"` Put *PutResponse `protobuf:"bytes,3,opt,name=put" json:"put,omitempty"` ConditionalPut *ConditionalPutResponse `protobuf:"bytes,4,opt,name=conditional_put" json:"conditional_put,omitempty"` Increment *IncrementResponse `protobuf:"bytes,5,opt,name=increment" json:"increment,omitempty"` Delete *DeleteResponse `protobuf:"bytes,6,opt,name=delete" json:"delete,omitempty"` DeleteRange *DeleteRangeResponse `protobuf:"bytes,7,opt,name=delete_range" json:"delete_range,omitempty"` Scan *ScanResponse `protobuf:"bytes,8,opt,name=scan" json:"scan,omitempty"` EndTransaction *EndTransactionResponse `protobuf:"bytes,9,opt,name=end_transaction" json:"end_transaction,omitempty"` ReapQueue *ReapQueueResponse `protobuf:"bytes,10,opt,name=reap_queue" json:"reap_queue,omitempty"` EnqueueUpdate *EnqueueUpdateResponse `protobuf:"bytes,11,opt,name=enqueue_update" json:"enqueue_update,omitempty"` EnqueueMessage *EnqueueMessageResponse `protobuf:"bytes,12,opt,name=enqueue_message" json:"enqueue_message,omitempty"` XXX_unrecognized []byte `json:"-"` } func (m *ResponseUnion) Reset() { *m = ResponseUnion{} } func (m *ResponseUnion) String() string { return proto1.CompactTextString(m) } func (*ResponseUnion) ProtoMessage() {} func (m *ResponseUnion) GetContains() *ContainsResponse { if m != nil { return m.Contains } return nil } func (m *ResponseUnion) GetGet() *GetResponse { if m != nil { return m.Get } return nil } func (m *ResponseUnion) GetPut() *PutResponse { if m != nil { return m.Put } return nil } func (m *ResponseUnion) GetConditionalPut() *ConditionalPutResponse { if m != nil { return m.ConditionalPut } return nil } func (m *ResponseUnion) GetIncrement() *IncrementResponse { if m != nil { return m.Increment } return nil } func (m *ResponseUnion) GetDelete() *DeleteResponse { if m != nil { return m.Delete } return nil } func (m *ResponseUnion) GetDeleteRange() *DeleteRangeResponse { if m != nil { return m.DeleteRange } return nil } func (m *ResponseUnion) GetScan() *ScanResponse { if m != nil { return m.Scan } return nil } func (m *ResponseUnion) GetEndTransaction() *EndTransactionResponse { if m != nil { return m.EndTransaction } return nil } func (m *ResponseUnion) GetReapQueue() *ReapQueueResponse { if m != nil { return m.ReapQueue } return nil } func (m *ResponseUnion) GetEnqueueUpdate() *EnqueueUpdateResponse { if m != nil { return m.EnqueueUpdate } return nil } func (m *ResponseUnion) GetEnqueueMessage() *EnqueueMessageResponse { if m != nil { return m.EnqueueMessage } return nil } // A BatchRequest contains one or more requests to be executed in // parallel, or if applicable (based on write-only commands and // range-locality), as a single update. type BatchRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Requests []RequestUnion `protobuf:"bytes,2,rep,name=requests" json:"requests"` XXX_unrecognized []byte `json:"-"` } func (m *BatchRequest) Reset() { *m = BatchRequest{} } func (m *BatchRequest) String() string { return proto1.CompactTextString(m) } func (*BatchRequest) ProtoMessage() {} func (m *BatchRequest) GetRequests() []RequestUnion { if m != nil { return m.Requests } return nil } // A BatchResponse contains one or more responses, one per request // corresponding to the requests in the matching BatchRequest. The // error in the response header is set to the first error from the // slice of responses, if applicable. type BatchResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` Responses []ResponseUnion `protobuf:"bytes,2,rep,name=responses" json:"responses"` XXX_unrecognized []byte `json:"-"` } func (m *BatchResponse) Reset() { *m = BatchResponse{} } func (m *BatchResponse) String() string { return proto1.CompactTextString(m) } func (*BatchResponse) ProtoMessage() {} func (m *BatchResponse) GetResponses() []ResponseUnion { if m != nil { return m.Responses } return nil } // An AdminSplitRequest is arguments to the AdminSplit() method. The // existing range which contains RequestHeader.Key is split by // split_key. If split_key is not specified, then this method will // determine a split key that is roughly halfway through the // range. The existing range is resized to cover only its start key to // the split key. The new range created by the split starts at the // split key and extends to the original range's end key. If split_key // is known, header.key should also be set to split_key. // // New range IDs for each of the split range's replica and a new Raft // ID are generated by the operation. Split requests are done in the // context of a distributed transaction which updates range addressing // records, range metadata and finally, provides a commit trigger to // update bookkeeping and instantiate the new range on commit. // // The new range contains range replicas located on the same stores; // no range data is moved during this operation. The split can be // thought of as a mostly logical operation, though some other // metadata (e.g. response cache and range stats must be copied or // recomputed). type AdminSplitRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` SplitKey Key `protobuf:"bytes,2,opt,name=split_key,customtype=Key" json:"split_key"` XXX_unrecognized []byte `json:"-"` } func (m *AdminSplitRequest) Reset() { *m = AdminSplitRequest{} } func (m *AdminSplitRequest) String() string { return proto1.CompactTextString(m) } func (*AdminSplitRequest) ProtoMessage() {} // An AdminSplitResponse is the return value from the AdminSplit() // method. type AdminSplitResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *AdminSplitResponse) Reset() { *m = AdminSplitResponse{} } func (m *AdminSplitResponse) String() string { return proto1.CompactTextString(m) } func (*AdminSplitResponse) ProtoMessage() {} // An AdminMergeRequest is arguments to the AdminMerge() method. A // merge is always performed by calling AdminMerge on the range // that is subsuming the passed in subsumed_range. The ranges must // be consecutive in the key space, such that the end_key of the // subsuming range must match the start_key of the range being subsumed. // After the merge operation, the subsumed_range will no longer exist and // the subsuming range will now encompass all keys from its original // start_key to the end_key of the subsumed_range. type AdminMergeRequest struct { RequestHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` SubsumedRange RangeDescriptor `protobuf:"bytes,2,opt,name=subsumed_range" json:"subsumed_range"` XXX_unrecognized []byte `json:"-"` } func (m *AdminMergeRequest) Reset() { *m = AdminMergeRequest{} } func (m *AdminMergeRequest) String() string { return proto1.CompactTextString(m) } func (*AdminMergeRequest) ProtoMessage() {} func (m *AdminMergeRequest) GetSubsumedRange() RangeDescriptor { if m != nil { return m.SubsumedRange } return RangeDescriptor{} } // An AdminMergeResponse is the return value from the AdminMerge() // method. type AdminMergeResponse struct { ResponseHeader `protobuf:"bytes,1,opt,name=header,embedded=header" json:"header"` XXX_unrecognized []byte `json:"-"` } func (m *AdminMergeResponse) Reset() { *m = AdminMergeResponse{} } func (m *AdminMergeResponse) String() string { return proto1.CompactTextString(m) } func (*AdminMergeResponse) ProtoMessage() {} func init() { } func (this *RequestUnion) GetValue() interface{} { if this.Contains != nil { return this.Contains } if this.Get != nil { return this.Get } if this.Put != nil { return this.Put } if this.ConditionalPut != nil { return this.ConditionalPut } if this.Increment != nil { return this.Increment } if this.Delete != nil { return this.Delete } if this.DeleteRange != nil { return this.DeleteRange } if this.Scan != nil { return this.Scan } if this.EndTransaction != nil { return this.EndTransaction } if this.ReapQueue != nil { return this.ReapQueue } if this.EnqueueUpdate != nil { return this.EnqueueUpdate } if this.EnqueueMessage != nil { return this.EnqueueMessage } return nil } func (this *RequestUnion) SetValue(value interface{}) bool { switch vt := value.(type) { case *ContainsRequest: this.Contains = vt case *GetRequest: this.Get = vt case *PutRequest: this.Put = vt case *ConditionalPutRequest: this.ConditionalPut = vt case *IncrementRequest: this.Increment = vt case *DeleteRequest: this.Delete = vt case *DeleteRangeRequest: this.DeleteRange = vt case *ScanRequest: this.Scan = vt case *EndTransactionRequest: this.EndTransaction = vt case *ReapQueueRequest: this.ReapQueue = vt case *EnqueueUpdateRequest: this.EnqueueUpdate = vt case *EnqueueMessageRequest: this.EnqueueMessage = vt default: return false } return true } func (this *ResponseUnion) GetValue() interface{} { if this.Contains != nil { return this.Contains } if this.Get != nil { return this.Get } if this.Put != nil { return this.Put } if this.ConditionalPut != nil { return this.ConditionalPut } if this.Increment != nil { return this.Increment } if this.Delete != nil { return this.Delete } if this.DeleteRange != nil { return this.DeleteRange } if this.Scan != nil { return this.Scan } if this.EndTransaction != nil { return this.EndTransaction } if this.ReapQueue != nil { return this.ReapQueue } if this.EnqueueUpdate != nil { return this.EnqueueUpdate } if this.EnqueueMessage != nil { return this.EnqueueMessage } return nil } func (this *ResponseUnion) SetValue(value interface{}) bool { switch vt := value.(type) { case *ContainsResponse: this.Contains = vt case *GetResponse: this.Get = vt case *PutResponse: this.Put = vt case *ConditionalPutResponse: this.ConditionalPut = vt case *IncrementResponse: this.Increment = vt case *DeleteResponse: this.Delete = vt case *DeleteRangeResponse: this.DeleteRange = vt case *ScanResponse: this.Scan = vt case *EndTransactionResponse: this.EndTransaction = vt case *ReapQueueResponse: this.ReapQueue = vt case *EnqueueUpdateResponse: this.EnqueueUpdate = vt case *EnqueueMessageResponse: this.EnqueueMessage = vt default: return false } return true } ================================================ FILE: samples/Go/embedded.go ================================================ // Code generated by go-bindata. // sources: // ui/css/app.css // ui/css/graph.css // ui/css/libs/nvd3/1.7.1/nv.d3.min.css // ui/css/rest_explorer.css // ui/index.html // ui/js/app.js // ui/js/libs/d3/3.3.5/d3.min.js // ui/js/libs/mithriljs/0.2.0/mithril.min.js // ui/js/libs/mithriljs/0.2.0/mithril.min.js.map // ui/js/libs/nvd3/1.7.1/nv.d3.min.js // ui/ts/app.ts // ui/ts/components/metrics.ts // ui/ts/header.ts // ui/ts/models/node_status.ts // ui/ts/models/stats.ts // ui/ts/models/store_status.ts // ui/ts/models/timeseries.ts // ui/ts/pages/graph.ts // ui/ts/pages/monitor.ts // ui/ts/pages/nodes.ts // ui/ts/pages/rest_explorer.ts // ui/ts/pages/stores.ts // ui/ts/tsconfig.json // ui/ts/typings/d3/d3.d.ts // ui/ts/typings/jquery/jquery.d.ts // ui/ts/typings/mithriljs/mithril.d.ts // DO NOT EDIT! package resource import ( "bytes" "compress/gzip" "fmt" "io" "io/ioutil" "os" "path" "path/filepath" "strings" "time" ) func bindataRead(data []byte, name string) ([]byte, error) { gz, err := gzip.NewReader(bytes.NewBuffer(data)) if err != nil { return nil, fmt.Errorf("Read %q: %v", name, err) } var buf bytes.Buffer _, err = io.Copy(&buf, gz) clErr := gz.Close() if err != nil { return nil, fmt.Errorf("Read %q: %v", name, err) } if clErr != nil { return nil, err } return buf.Bytes(), nil } type asset struct { bytes []byte info os.FileInfo } type bindataFileInfo struct { name string size int64 mode os.FileMode modTime time.Time } func (fi bindataFileInfo) Name() string { return fi.name } func (fi bindataFileInfo) Size() int64 { return fi.size } func (fi bindataFileInfo) Mode() os.FileMode { return fi.mode } func (fi bindataFileInfo) ModTime() time.Time { return fi.modTime } func (fi bindataFileInfo) IsDir() bool { return false } func (fi bindataFileInfo) Sys() interface{} { return nil } var _uiCssAppCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x54\xdb\x6e\xdb\x38\x10\x7d\xe7\x57\x0c\x52\x2c\x72\x81\x65\x3b\x4e\x16\x58\xd8\x2f\xab\xba\x59\xc4\x68\xa1\x2c\x22\x67\x8b\x3e\x52\xd2\x48\x22\x42\x91\x5c\x92\xb2\xec\x2e\xfa\xef\x3b\x94\xe4\x34\xee\xcd\x0f\x86\x67\xe6\x78\xe6\x9c\xb9\x70\x76\x75\xc5\xd6\xda\x1c\xac\xa8\x6a\x0f\x8b\xf9\xf5\x2d\x6c\x6b\x84\xb5\xce\x9f\xad\xe6\x79\x0d\x71\xeb\x6b\x6d\xdd\x94\xb1\x0f\x22\x47\xe5\xb0\x80\x56\x15\x68\xc1\x13\x2c\x36\x04\x41\x18\x23\x13\xf8\x07\xad\x13\x5a\xc1\x62\x3a\x87\x8b\x00\x38\x1b\x43\x67\x97\x2b\x76\xd0\x2d\x34\xfc\x00\x4a\x7b\x68\x1d\x52\x02\xe1\xa0\x14\x12\x01\xf7\x39\x1a\x0f\x42\x41\xae\x1b\x23\x05\x57\x39\x42\x27\x7c\xdd\x17\x19\x53\x4c\xd9\xa7\x31\x81\xce\x3c\x27\x2c\x27\xb4\x21\xab\x7c\x8d\x02\xee\x19\x03\xfa\xd4\xde\x9b\xe5\x6c\xd6\x75\xdd\x94\xf7\x2c\xa7\xda\x56\x33\x39\xa0\xdc\xec\xc3\x66\x7d\x97\xa4\x77\x11\x31\x65\xec\x49\x49\x74\x0e\x2c\xfe\xdb\x0a\x4b\x02\xb3\x03\x70\x43\x3c\x72\x9e\x11\x3b\xc9\x3b\xd0\x16\x78\x65\x91\x62\x5e\x07\x9e\x9d\x15\x5e\xa8\x6a\x02\x4e\x97\xbe\xe3\x16\x59\x21\x9c\xb7\x22\x6b\xfd\x49\x83\x8e\xac\x48\xe9\x6b\x00\xb5\x88\x2b\x38\x8b\x53\xd8\xa4\x67\xf0\x36\x4e\x37\xe9\x84\x7d\xdc\x6c\xef\x1f\x9e\xb6\xf0\x31\x7e\x7c\x8c\x93\xed\xe6\x2e\x85\x87\x47\x58\x3f\x24\xef\x36\xdb\xcd\x43\x42\xd6\x5f\x10\x27\x9f\xe0\xfd\x26\x79\x37\x01\xa4\xf6\x50\x11\xdc\x1b\x1b\xb8\x6b\xcb\x44\x68\x1d\x16\x53\x48\x11\x4f\x8a\x97\x7a\x20\xe3\x0c\xe6\xa2\x14\x39\x29\x52\x55\xcb\x2b\x84\x4a\xef\xd0\x2a\x12\xc2\x0c\xda\x46\xb8\x30\x3c\x47\xd4\x0a\x90\xa2\x11\x9e\xfb\xde\xfe\x4e\xce\xd7\x12\xf1\x13\x71\x7e\x4c\xfb\x31\xb2\x50\x47\xf1\x06\x5d\x98\x49\xae\xd5\x20\x77\x58\x9e\x61\x8d\x96\x10\xab\xc2\x62\x07\x6f\xb5\xda\x21\x01\x10\x2e\xa8\xda\x21\xa3\x32\x7f\x56\x0d\x17\x72\x4a\x1b\x70\xc9\xae\x66\xec\x0a\xfe\xa3\x39\x36\xdc\x56\x42\x2d\x61\xbe\x22\xc3\xf0\xa2\x20\xae\xa3\x15\x35\xfa\x73\x94\xe9\x7d\xe4\xc4\xe7\xde\x9b\x69\x4b\x3c\x83\xab\x0f\x77\x98\x3d\x0b\xff\x0b\xc4\xcf\x22\x5f\x58\xed\x1b\x39\x61\x99\x2e\x0e\x3d\x89\x1a\xc3\x71\x2c\xe1\x7a\x3e\xff\xed\x5b\x1e\x5f\xbe\xc2\x32\x9e\x3f\x57\x56\x53\xb7\xa2\x5c\xcb\x20\xf6\x4d\x79\x5d\x2e\xca\x9b\xf0\x9f\xa3\xe7\xe6\xa6\x37\x4b\xea\x4e\x54\xf2\x46\xc8\xc3\x12\xce\x53\xdd\x5a\xda\xf8\x94\x53\xb3\xff\xb6\xfa\x7c\x02\xe7\xf7\x28\x77\xe8\x69\x03\x21\xc1\x16\xc9\xf3\xe2\xa0\x9d\x23\x5c\xe4\xd0\x8a\xf2\x25\x55\x37\x52\xbc\x9d\xcf\x5f\x7c\xa4\x0d\x89\xf4\xad\xe9\x35\x4d\xcb\x56\xca\xfb\x1e\xb6\xa6\x28\x1d\x10\xcd\xf4\xb5\xba\x9c\xcb\xfc\x22\x48\x84\x08\x7e\x9f\x9b\xfd\xe5\x0a\x66\x57\xf0\x1e\xd1\x84\x85\x97\x84\x1f\x4e\x72\xc0\x87\x11\xd3\x61\x99\x84\xef\x80\xa6\x45\xf9\x47\xe3\x75\xca\x90\x66\xf5\x93\xce\x94\xe5\x30\x83\xb1\xef\xde\xeb\x86\xc8\x9a\x3d\x5d\x94\x14\x05\xbc\x29\x8a\xe2\xa4\xd7\xd7\x94\x8b\xde\xa7\x51\xcc\x50\x2c\x22\x56\xcf\xcb\xf0\x35\x39\x75\xed\x84\x13\xe1\xce\x02\x19\x8f\x7b\x1f\x15\x98\x6b\xdb\xaf\xf3\x92\xde\x1f\x85\xab\x63\xc0\x5b\x6a\x26\x2d\x2e\x15\x6f\x0d\x1d\x41\xce\x1d\xfe\x60\x5e\x74\xbc\x46\x72\x9a\x95\x50\xa1\x13\x51\x26\xe9\x81\x5c\xbd\x2c\x68\x64\x07\xc1\x3f\xe2\x77\xfc\x5d\xeb\x06\x13\xba\x8e\x9e\xd4\xc9\xd0\xfe\xf8\x6e\x68\x8b\xc5\xd0\xb8\x6f\x29\x1e\xa9\xd3\xd5\x86\x55\x90\x11\x97\xa2\x22\x49\xd1\x62\xa8\xfb\x7f\x00\x00\x00\xff\xff\x4c\xec\x61\x77\xce\x05\x00\x00") func uiCssAppCssBytes() ([]byte, error) { return bindataRead( _uiCssAppCss, "ui/css/app.css", ) } func uiCssAppCss() (*asset, error) { bytes, err := uiCssAppCssBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/css/app.css", size: 1486, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiCssGraphCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x8d\x31\x0e\xc2\x30\x0c\x45\xf7\x9c\xc2\x12\x2b\xad\xd2\x81\x25\x9d\x39\x48\x20\x9f\xc6\x22\x72\x23\x27\x88\x4a\x88\xbb\x03\x29\x12\x4c\xdd\xfc\xf4\x9e\xed\x3e\xb1\x80\x1e\x86\xe8\xc2\x29\x39\x92\x59\x30\xbe\xa9\x54\x9d\xaf\xe8\xee\x1c\x6a\x74\x34\xf4\x87\xbc\x8c\xe6\x69\x4c\xeb\x6d\x5b\x58\x13\xa7\x08\x3f\x33\xfc\x9b\x53\xba\x61\x55\x7e\xe1\x42\xd9\xd7\xb8\xff\xce\x9b\x5f\x1d\xed\xac\xb5\x8d\xa3\xcf\xe8\x14\x12\xa0\x2c\x93\xa3\xb3\x72\xc9\xc7\x30\xa1\x7c\x0e\xbf\x02\x00\x00\xff\xff\xd9\x8a\x57\x81\xbd\x00\x00\x00") func uiCssGraphCssBytes() ([]byte, error) { return bindataRead( _uiCssGraphCss, "ui/css/graph.css", ) } func uiCssGraphCss() (*asset, error) { bytes, err := uiCssGraphCssBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/css/graph.css", size: 189, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiCssLibsNvd3171NvD3MinCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xcc\x5a\x4f\x6f\xe3\xba\x11\xff\x2a\x2a\x16\x05\x1a\x40\x12\x24\xc5\x4e\x62\xe9\xf4\x5e\x1b\xb4\x87\x3e\xa0\x87\xa2\x77\x5a\xa2\x6d\xc2\x94\x28\x50\x74\x6c\xc7\xd8\xef\x5e\xfe\x11\x25\x52\xa4\x64\x67\x91\xc3\x83\x91\x0d\x43\xfe\x66\x38\x1c\xce\x5f\x7a\xe3\xe6\xa3\x7a\x0e\xf8\xbf\x11\xb8\xa0\xee\xd6\x12\xd4\x30\x48\x23\xf8\x01\x1b\xd6\xe5\x0d\x69\x60\x41\x5a\x50\x22\x76\xcd\xd3\x9f\x36\x38\x68\x01\x3b\xdc\x76\x08\x63\x85\xeb\x18\x25\x47\x98\xff\x48\x92\xa4\x1f\x47\x9a\x34\x7e\x5d\x17\xdd\x01\xb4\x30\xa2\xb0\xa9\x20\x45\xcd\x3e\x2f\x29\xea\xda\xf7\x6a\x0f\x3b\x1f\xdf\xb8\x22\x35\x40\xcd\xcd\x65\x34\x41\x8b\xdf\x97\x25\x92\x64\xca\x1e\xa3\x06\x7a\xc4\x86\x6b\xf1\xf9\x82\x98\xf1\x27\xa4\x44\x72\x0b\x3d\x3b\xc8\xd5\xfb\xe2\x0f\x83\x3f\xc0\xe5\x0f\xd4\x04\x0c\x5e\xd8\x6d\x47\x1a\x16\x9d\x21\xda\x1f\x58\xfe\x9a\x0c\x07\xb8\x2c\x52\x69\x21\x2e\xd9\x63\xb0\x3b\x32\x88\x7f\x22\xd0\x94\x07\x42\xf3\x1a\x55\x15\x86\x1e\xc5\x57\xa8\x03\x5b\x0c\xab\x9b\x4f\xd9\x5b\x40\xbb\x80\xc2\x92\x49\x65\x5b\xb6\xc0\x28\x68\x3a\xc4\x10\x69\x72\x73\x2d\xc8\xd6\x49\xad\xd4\x07\x68\x11\xd5\xe4\x33\x7a\x0c\x79\x86\xdb\x23\x62\x0f\x81\x7d\x02\xc6\x07\xf2\x01\xa9\x2d\x66\x3a\x05\x2a\xd0\x78\xa0\xfc\x07\xa8\xaa\x37\xf8\x32\xc5\xa9\x1b\x14\x00\xba\xdf\x82\xbf\x25\xa1\xfc\x3c\xcd\xb0\xf3\xa2\x53\x13\x5d\x9f\x30\x43\x9c\x44\xfe\xb1\xa7\xe4\xd4\x2a\xa1\x43\x17\xf2\x2f\x42\xd1\x27\xb7\x1d\x80\x17\xc0\xfc\xce\x4a\x0a\x19\xf4\xb0\x74\x5c\xe7\x4f\x72\x51\x73\x2a\xc8\xa5\x0e\xbf\xa4\x08\x87\x64\x41\x1d\xf9\x1d\xb3\x98\x21\x35\xbd\xec\xae\x4c\x3e\x7f\x2f\x5c\x7b\xd0\x51\xca\x63\x52\xd2\xa2\x4e\x18\x43\xc5\x27\x4f\x93\xf6\x12\x74\x5c\xbf\x51\xc7\x23\xd8\x6e\x0a\x52\x32\x41\xd0\x9d\x28\x9c\x38\xe6\xdb\x12\x76\x41\x19\x53\x02\x40\x8f\x1c\xe9\x49\x07\x67\x54\xb1\x43\x9e\xb5\x97\x05\xba\xff\x52\x04\x9a\x3d\x86\x16\xbd\xf2\xb7\xdd\x6e\x67\x73\x4a\xe3\xf5\x0c\x2f\x86\xca\xa3\x0a\xf4\x9a\xcd\xcb\xcb\x8b\x4d\x3c\x4b\xcb\x6d\x73\x0f\xc5\xa0\x4b\x7a\x47\x87\x10\xde\x41\xa6\x3d\xb2\xaa\xaa\x3b\xc8\xac\x47\x96\x65\x39\x23\x39\xe3\x87\x97\x16\xd1\xa1\x4f\x98\xa7\xab\xf6\x52\x78\x13\xc2\x84\xb0\x3b\x6d\x7b\x5a\xc9\x7f\xb3\xd9\xcc\x4b\xd2\x63\xb6\x40\x7c\x0a\xdb\x0a\x56\xf3\x64\x3e\x1b\x88\x5f\x47\xbc\x50\xf8\x7f\xf0\xa9\xfb\xbd\x77\x08\xe1\x18\xde\x04\x70\x9f\xe4\x9e\xef\xf5\xee\x23\xf3\x7e\xcf\x66\xcc\xe9\xf3\x38\x40\x21\xd0\x26\x31\x22\x35\x87\x60\xf8\xab\x2b\x01\xe3\x75\x90\xc9\x42\x0c\x65\x79\x64\x0b\xe5\xd4\x3a\xc6\xed\xf4\x5c\xe4\x10\x09\xa3\x56\x0c\x1e\xe0\x1a\xaf\xff\x82\xea\x96\x50\x06\x1a\xe6\x14\x53\xc6\xda\xcf\xf8\x8c\xd8\xc1\x88\xa7\x5d\xe0\x9c\x7d\xdc\xc2\x08\xbb\xa6\x2b\x58\x61\x37\xb4\x77\x5b\x8e\xf4\xbf\xc8\xc5\xcd\x02\xbf\xc4\xc8\x51\xb4\xf7\xd4\xf1\x34\xe2\xfb\x01\x37\x2b\x38\xbc\x0a\xa7\xb3\x2e\x64\xb3\x74\x23\x1b\xeb\x4a\x86\x9d\x24\xfb\x48\xd8\x5e\x5f\x2c\xeb\x60\x04\x00\x70\xcc\xa6\x18\x62\x8d\xbd\xb3\x59\x52\x21\x5e\x95\x5e\xfe\x2d\x6c\xbd\x3c\xd1\x8e\x57\x66\xf0\xcc\x4b\x55\x11\x27\x7e\x76\x1f\x7b\x89\x8b\xf8\xe0\x36\x68\x98\x9c\xca\x43\x54\x02\x8c\xc9\x89\xa9\x72\x57\x2f\x9d\x78\x76\xe0\x19\x02\x0b\x5f\x53\x0b\xc7\x03\xab\xb1\x67\xbe\xee\x7c\x93\xdc\x10\x9c\x59\x67\x82\x67\xc8\x16\x83\x6b\xbe\xc5\xa4\x3c\x16\x7d\xd0\x4e\x92\xbf\x16\x07\x15\xcb\xc4\x58\x1c\x8f\x11\xc2\x93\x64\xab\x8c\xf9\xb9\x8a\x78\x11\x5e\x91\x73\x38\xf9\x3b\x18\x91\x37\x29\xc0\x96\x5c\xfa\xa5\x3c\x09\x78\x38\x0f\x64\xee\x33\x72\x64\x9c\x3d\x0d\x07\x7e\x08\xfc\x45\x8e\x94\x37\x09\x3c\x34\x56\xe8\xd4\xe5\x1c\x5d\xf4\x52\x4d\xa7\x9d\x99\xfe\x4a\x87\xe4\x9f\xaf\x92\x24\x48\x79\x62\x0c\x7e\xe3\xe9\x0f\xeb\x1b\x1f\x73\x81\x88\xfa\x81\x48\x05\x36\x40\x06\xcc\xf2\x28\x2c\xba\xa9\x6e\x63\x96\xf4\x19\x90\x00\x37\xe4\x1f\x80\x01\x33\xbb\xbc\xf9\xb3\x4b\xb4\xa5\xa7\xee\x10\xc4\x5c\x40\xe8\xc4\xa6\x34\xbb\xd7\x26\x69\x72\x65\x9b\x46\xa3\x28\xcd\xdb\x48\xc9\xc6\x41\x30\xdc\x73\x6e\x2a\x95\x71\x9e\xb0\xd3\x36\xde\xf7\xa4\x7e\xa8\xee\x40\x82\x12\xd1\x12\x4f\x2a\x1a\xab\x1b\x99\x3f\x50\xe2\x75\x5e\x49\xf0\xfb\xa0\x5d\xb3\x40\xf6\x14\x35\xf1\xaa\x98\x51\xbf\x99\x20\xc9\x01\x97\x3a\xd3\x89\x12\xa5\x1b\x46\x76\xf8\x49\xcd\xd2\x64\x9e\xc8\x17\xb9\xb2\x07\x49\x5b\x22\x42\xef\xc7\x58\x20\x65\x25\x48\xb2\xf2\x21\xda\x06\xee\x81\x45\x5b\xbd\x64\xaf\xd9\x9b\x56\xde\x68\x92\x73\x4f\x04\xef\xef\xef\x4e\x0c\x5d\x3d\xd0\x7a\xef\x08\x85\x4b\x9c\x1d\xa5\xab\x30\x0c\x28\x8f\x80\x10\xff\x9d\x70\x3f\x44\x0d\x60\xb0\xf3\x98\x83\xef\xea\x74\xc9\x98\xef\x29\xb8\x3e\xf6\x34\xe0\xd9\x2c\xf0\xf6\x97\xb6\xfd\x3c\x0f\x41\x21\xae\x51\x27\xaa\x85\xff\x01\x7c\x82\x9d\x2c\x4b\x66\x5e\x2c\x1c\x23\x4c\xa7\x6a\x18\x26\x2a\xc0\x85\xa7\xfc\x10\xf9\x3a\x34\xaa\xaf\x16\x41\x33\x31\x7d\xb1\xf1\x0b\xbf\xa7\x88\xf8\x76\xfe\x5f\x68\x32\x7f\x6d\x0b\x5b\x81\xfd\x6f\xa7\x72\xcf\x56\x7d\x11\xa1\xba\xb6\x74\x13\xa6\x9b\x97\x30\x5b\x6d\xc2\x78\xbd\x79\x72\x79\xf0\xbb\x2e\xa1\xca\x09\xb3\x37\x9c\xcc\xde\x9d\xaf\x3d\xe2\xfb\x4f\x0d\x62\xb2\xad\x7a\x84\x18\x7c\xc9\x1b\xb4\xb4\x7c\x18\x6c\x21\xf6\xbd\x10\xce\x40\x3d\xa5\xff\x5c\xb1\xfc\x70\x5d\x96\x25\xee\x99\x62\xf3\x4d\xcd\xac\x04\x4d\x2e\x6e\x23\xc1\x93\x61\x23\x8f\x02\x4a\x19\xcb\x66\x0e\x26\x32\x0c\xbb\x84\x7a\x74\x5d\x56\x40\xc7\xdd\xff\x28\x7d\xd6\x8e\x4f\x1e\x44\xcb\xbb\x9e\x40\xd4\x6c\x91\x94\x50\xba\xfb\x83\xcc\x25\xa9\x4d\x69\x37\xbb\xcf\xcf\xcf\x8b\x9d\xb2\xc5\x29\x9c\x93\x6d\x2a\x0d\x8f\x6b\x86\xa6\xe5\xde\xbf\x89\x7e\xea\xf1\x7e\xc8\x39\xc0\x45\x0a\x3f\x27\x81\x98\xb9\x2a\xc5\xd8\x5e\x50\x8c\x5e\x16\x6f\x60\x6d\x55\x30\xab\x64\x71\x47\x8b\x1f\x77\x1a\x5d\x83\xf8\xd1\x35\xb8\xd8\x78\x95\x25\xfb\x5c\x3f\x4d\x99\x1e\x7a\xd4\xd8\xf4\x2a\x53\xf6\xf4\x66\xda\xf4\xd3\xf3\x12\x88\xe7\x1b\xa6\x78\x38\xcf\x44\x63\x19\x17\xa7\xb0\x36\xf8\x30\x9e\x81\x61\x25\x9a\x5d\xbb\xf3\x9d\xf8\xb8\xdb\x83\x7c\x25\x66\x7e\x4f\x70\xff\xb6\x10\x7e\xa7\x43\x9c\x51\x89\x2f\x3c\xc4\x1b\x3f\x9d\xb7\xa7\xf6\xb6\x71\xb6\xf1\xeb\x9e\x45\x95\x5c\xfc\x2c\x60\xdb\x11\x7c\x62\xb0\x18\x2b\xa5\xa8\x24\x98\xd7\xba\x32\x53\x64\xeb\x75\xa8\x7f\xd2\xa7\xc2\x58\x19\x9e\x03\x5b\x50\x55\xa2\x04\x49\x87\xee\x42\x0c\x03\xce\x16\x55\xd3\x76\xe5\x53\xb5\x8d\xa2\xd9\xe2\x46\x63\xb7\x64\xd2\x84\x76\xa0\x46\xf8\x9a\xcb\xce\xc2\x34\x2a\x5e\x93\x14\xea\x6b\x00\x8c\xf6\x4d\x8e\xe1\x8e\x15\xbe\x2f\x88\xce\x07\xc4\xa0\x30\xde\x52\x3c\xaa\x9c\x29\x68\x8b\xef\x6d\x40\x7d\xbd\xa6\xb7\x2d\x9d\x4e\x98\xda\x1f\x75\xed\x6a\x39\x7e\x7b\x5a\x56\xe3\xfa\x69\xd2\xc4\xad\x54\x38\xb5\x1a\x57\xe3\x15\x26\xf4\xbe\xcb\x68\x51\x0c\xb3\xd6\x56\xbb\xe4\x43\x5e\x8c\xeb\x21\x3e\xd8\xb8\x1c\x55\x50\x5c\x7b\x96\xf0\xd5\xe9\x0e\xf6\x9a\xc3\xd9\x5c\x36\x0f\x7d\x89\x86\x71\x68\x4c\x5f\x23\xc3\xe4\x7b\x3b\x7d\xb3\xd4\x15\x1c\x9e\x6f\x35\xa0\x7b\xd4\x70\x7f\xd1\x10\xd1\xdc\xca\xc7\x4e\x21\x7a\xa4\x1f\x08\xa6\xfd\x29\x8f\xee\x73\x5e\xb3\x7a\x0d\xf5\x4f\xfc\xba\xf6\xfb\x8d\x61\xce\x25\x14\x86\xac\xaf\x75\x4b\x18\x23\xb5\x71\xfb\x3f\xe0\x56\x7c\xe6\x9b\x7d\xf9\x3c\x90\x04\xc9\x4c\xd3\x3f\x2c\xdb\x2b\xe9\xb8\x62\x2a\xa4\x75\xf5\xb1\xd6\xfa\x70\x64\x36\x09\xb9\xd7\x35\x37\xed\xd3\xa8\x91\xba\x53\xae\xdd\x33\x14\x8f\x0a\xd6\x56\x4c\xf4\xcb\x7a\xbb\x97\xf1\x75\x42\xf8\xaf\xd8\xd7\x05\x07\xac\x1a\x2e\x52\xb0\xdb\xf0\x1f\xc9\xb6\xe0\xa1\x93\x37\x84\x00\xf7\xe2\x8d\xdf\x13\x4e\xe9\xe3\x23\xbc\xde\x3c\x59\xda\xc1\x7d\xc8\x4c\x67\x1c\x99\x0a\xb8\xef\x89\x62\x42\x4a\xe3\x03\x5f\xc5\x02\x61\xca\x9b\xf6\xf2\xa6\x52\x5e\xeb\xb2\x79\x6c\xbf\x62\x98\xcb\xeb\x9e\xac\x8c\xf5\x73\x3f\xcf\x48\xeb\x83\x8b\x69\xab\x63\x77\xce\xa3\x9e\x2a\x94\x9d\x46\xfb\x13\xaa\x60\x50\xa1\x8f\x9b\x22\x12\xc6\xdd\x1b\xba\x18\x3e\xae\xcd\x45\xae\xe2\x1d\x69\x78\x60\xcb\x7c\x09\x42\x7f\x39\xa0\xf9\xf2\xbe\x9a\x70\xbb\x1a\x94\xf6\x7c\xc7\xea\xa2\x96\xef\xce\x81\xbc\x17\xae\x09\xbf\x31\xef\x7f\x1b\xd0\x46\x39\x79\x90\x37\x4a\xee\x7f\x0a\xc1\xe5\x6b\xe6\x6c\xd9\xab\xbe\x4a\x17\x79\x57\x60\xad\x1a\x57\x7c\x81\xf2\xff\x00\x00\x00\xff\xff\x04\x28\x3d\x62\xbe\x20\x00\x00") func uiCssLibsNvd3171NvD3MinCssBytes() ([]byte, error) { return bindataRead( _uiCssLibsNvd3171NvD3MinCss, "ui/css/libs/nvd3/1.7.1/nv.d3.min.css", ) } func uiCssLibsNvd3171NvD3MinCss() (*asset, error) { bytes, err := uiCssLibsNvd3171NvD3MinCssBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/css/libs/nvd3/1.7.1/nv.d3.min.css", size: 8382, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiCssRest_explorerCss = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x54\xdd\x6f\xdb\x36\x10\x7f\xe7\x5f\x71\xc8\x30\xa4\x0d\xfc\x91\xb6\xdb\x8b\x02\x0c\x53\xdc\x0c\x13\x16\x38\x83\xe5\xac\xe8\x23\x45\x9d\x24\xa2\x14\x8f\x23\xa9\xc8\xc6\xb0\xff\x7d\x47\xc9\xd9\x9a\x64\x5f\xf5\x93\x8f\xbc\xbb\xdf\xc7\x1d\xb5\xbe\xb8\x10\x1b\x72\x47\xaf\xdb\x2e\xc2\xdb\xcb\x37\xdf\xc0\xbe\x43\xd8\x90\xfa\xe4\x49\xaa\x0e\xf2\x21\x76\xe4\xc3\x4a\x88\x5b\xad\xd0\x06\xac\x61\xb0\x35\x7a\x88\x9c\x96\x3b\x4e\x41\x38\xdd\x2c\xe0\x17\xf4\x41\x93\x85\xb7\xab\x4b\x78\x95\x12\xce\x4e\x57\x67\xaf\xaf\xc4\x91\x06\xe8\xe5\x11\x2c\x45\x18\x02\x72\x03\x1d\xa0\xd1\x06\x01\x0f\x0a\x5d\x04\x6d\x41\x51\xef\x8c\x96\x56\x21\x8c\x3a\x76\x13\xc8\xa9\xc5\x4a\x7c\x3c\x35\xa0\x2a\x4a\xce\x95\x9c\xed\x38\x6a\x3e\xcf\x02\x19\x85\x00\xfe\x75\x31\xba\x6c\xbd\x1e\xc7\x71\x25\x27\x96\x2b\xf2\xed\xda\xcc\x59\x61\x7d\x5b\x6c\x6e\xb6\xe5\xcd\x92\x99\x0a\x71\x6f\x0d\x86\x00\x1e\x7f\x1d\xb4\x67\x81\xd5\x11\xa4\x63\x1e\x4a\x56\xcc\xce\xc8\x11\xc8\x83\x6c\x3d\xf2\x5d\xa4\xc4\x73\xf4\x3a\x6a\xdb\x2e\x20\x50\x13\x47\xe9\x51\xd4\x3a\x44\xaf\xab\x21\x3e\x31\xe8\x91\x15\x2b\xfd\x3c\x81\x2d\x92\x16\xce\xf2\x12\x8a\xf2\x0c\xae\xf3\xb2\x28\x17\xe2\x43\xb1\xff\xf1\xee\x7e\x0f\x1f\xf2\xdd\x2e\xdf\xee\x8b\x9b\x12\xee\x76\xb0\xb9\xdb\xbe\x2f\xf6\xc5\xdd\x96\xa3\x1f\x20\xdf\x7e\x84\x9f\x8a\xed\xfb\x05\x20\xdb\xc3\x20\x78\x70\x3e\x71\x27\x2f\x74\xb2\x0e\xeb\x15\x94\x88\x4f\xc0\x1b\x9a\xc9\x04\x87\x4a\x37\x5a\xb1\x22\xdb\x0e\xb2\x45\x68\xe9\x01\xbd\x65\x21\xc2\xa1\xef\x75\x48\xc3\x0b\x4c\xad\x06\xa3\x7b\x1d\x65\x9c\xe2\x17\x72\xfe\x82\xc8\xef\x99\xf3\xae\x9c\xc6\x28\x12\x8e\x95\x3d\x86\x34\x13\x45\x76\x96\x3b\x2f\xcf\xbc\x46\x19\xe4\xb6\xf6\x38\xc2\x35\xd9\x07\xe4\x04\x84\x57\x8c\x76\xac\x18\xe6\xfb\xb6\x97\xda\xac\x78\x03\x5e\x8b\x8b\xb5\x58\xb1\xac\x78\x73\x70\x86\x3c\xfa\xc5\xd3\x70\x93\x7a\x93\x09\xcf\x8e\x6f\xa9\x85\xdf\x78\xf8\x1d\xa6\x65\xce\xe0\xcd\xe5\xe5\xd7\x57\xe2\xf7\x2f\xaa\x6d\x0c\x49\x2e\x35\xd8\xc4\x2b\x0e\x9d\xac\x6b\xb6\x27\xf5\x72\x07\x7e\x1e\xee\x90\x4e\x47\x5d\xc7\x2e\x83\x6f\xff\xa5\xfd\xd4\xac\x92\xea\x53\xeb\x89\xfd\x5b\x2a\x32\x49\xfe\x57\x4d\xd3\xfc\x63\xcd\x52\xcd\x7f\xa6\xda\x5e\xfa\x56\xdb\x65\x45\x31\x52\x9f\x9d\xa0\xff\xab\xf0\x3b\xe8\xde\xcd\x32\xf8\x60\x39\x9e\x7c\xb0\xe4\x7b\x69\x12\xf1\x88\x87\xb8\x8c\x5e\xda\xc0\xb3\xe2\xae\x83\xe3\xb9\x2b\x19\xf0\xea\x25\xe2\xbb\xff\x03\xa8\xad\x1b\xe2\x9f\x88\x19\xc7\xbc\x94\x3a\xbe\x28\x7c\xb4\xd7\x51\xd0\x69\xa9\x32\x7e\x6c\x86\xd7\xeb\x61\x42\x9e\xd8\x36\xb2\xd7\xe6\x98\xc1\x79\x49\x83\x57\xe9\x13\x54\x23\xfc\xec\xe9\x7c\x01\xe7\x1b\x3e\xd2\xbc\x83\x5b\x1c\x39\x3c\x45\x0b\xe8\xc9\x52\xe0\xc7\x8d\x7f\x87\xb7\x54\x06\xa5\xbf\x1e\x58\x8d\x7d\x86\x2d\xab\x40\x86\x1f\x62\xc2\xf6\xb3\x47\x8f\xa3\x8d\xe4\xe6\x61\xa7\x96\x7f\x04\x00\x00\xff\xff\x29\xec\xd5\x5f\x1d\x05\x00\x00") func uiCssRest_explorerCssBytes() ([]byte, error) { return bindataRead( _uiCssRest_explorerCss, "ui/css/rest_explorer.css", ) } func uiCssRest_explorerCss() (*asset, error) { bytes, err := uiCssRest_explorerCssBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/css/rest_explorer.css", size: 1309, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiIndexHtml = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x55\x51\x93\x9b\x36\x10\x7e\xe7\x57\x6c\xe8\x83\x93\x89\x0d\xbe\x5c\x3a\x6d\xaf\xf6\xb5\xc4\x71\x1b\x4f\x53\xae\x63\x7c\xcd\xe4\xa9\x23\xc3\x02\x4a\x84\x44\x25\x61\x1f\x33\xfd\xf1\x5d\x01\xbe\xf8\x5a\x2e\x93\xf8\xc5\x48\xfb\xed\xee\xb7\xbb\xdf\xc2\xe2\xc9\x6c\xe6\xad\x54\xdd\x6a\x5e\x94\x16\x5e\xcc\x2f\x5e\xc2\xae\x44\x58\xa9\xf4\xa3\x56\x2c\x2d\x21\x6a\x6c\xa9\xb4\x09\x3c\xef\x2d\x4f\x51\x1a\xcc\xa0\x91\x19\x6a\xb0\x04\x8b\x6a\x82\x20\x0c\x96\x29\xfc\x89\xda\x70\x25\xe1\x45\x30\x87\xa7\x0e\xe0\x0f\x26\xff\xd9\x8f\x5e\xab\x1a\xa8\x58\x0b\x52\x59\x68\x0c\x52\x00\x6e\x20\xe7\x02\x01\xef\x52\xac\x2d\x70\x09\xa9\xaa\x6a\xc1\x99\x4c\x11\x8e\xdc\x96\x5d\x92\x21\x44\xe0\xbd\x1f\x02\xa8\xbd\x65\x84\x65\x84\xae\xe9\x94\x9f\xa3\x80\x59\xcf\x03\xfa\x95\xd6\xd6\x57\x61\x78\x3c\x1e\x03\xd6\xb1\x0c\x94\x2e\x42\xd1\xa3\x4c\xf8\x76\xb3\x5a\xc7\xc9\x7a\x46\x4c\x3d\xef\x56\x0a\x34\x06\x34\xfe\xdd\x70\x4d\x05\xee\x5b\x60\x35\xf1\x48\xd9\x9e\xd8\x09\x76\x04\xa5\x81\x15\x1a\xc9\x66\x95\xe3\x79\xd4\xdc\x72\x59\x4c\xc1\xa8\xdc\x1e\x99\x46\x2f\xe3\xc6\x6a\xbe\x6f\xec\x83\x06\x9d\x58\x51\xa5\xe7\x00\x6a\x11\x93\xe0\x47\x09\x6c\x12\x1f\x5e\x45\xc9\x26\x99\x7a\xef\x36\xbb\x37\x37\xb7\x3b\x78\x17\x6d\xb7\x51\xbc\xdb\xac\x13\xb8\xd9\xc2\xea\x26\x7e\xbd\xd9\x6d\x6e\x62\x3a\xfd\x02\x51\xfc\x1e\x7e\xdb\xc4\xaf\xa7\x80\xd4\x1e\x4a\x82\x77\xb5\x76\xdc\x95\xf6\xb8\x6b\x1d\x66\x01\x24\x88\x0f\x92\xe7\xaa\x27\x63\x6a\x4c\x79\xce\x53\xaa\x48\x16\x0d\x2b\x10\x0a\x75\x40\x2d\xa9\x10\xaf\x46\x5d\x71\xe3\x86\x67\x88\x5a\x06\x82\x57\xdc\x32\xdb\x9d\xff\x57\xce\xa7\x14\xd1\x2d\x71\xde\x26\xdd\x18\x3d\x97\x47\xb2\x0a\x8d\x9b\x49\xaa\x64\x5f\x6e\x2f\x9e\x5e\x46\x57\x10\xc9\x4c\xe3\x11\x5e\x29\x79\x40\x02\x20\x3c\xa5\x6c\xed\x9e\xd2\xfc\x5c\x54\x8c\x8b\x80\x14\xf0\xcc\x9b\xcd\xae\xbd\xc5\x93\x4c\xa5\xb6\xad\x91\x46\x59\x09\x3a\xf7\x7f\x00\x8b\x12\x59\x76\xdd\x0d\x79\x51\xa1\x25\x19\x94\x4c\x1b\xb4\x4b\xbf\xb1\xf9\xec\x7b\x7f\x30\x09\x2e\x3f\x42\xa9\x31\x5f\x4e\x9c\x16\x0c\x89\x21\x27\x4e\x26\x28\x94\x2a\x04\xb2\x9a\x1b\x97\x2c\x4c\x8d\xf9\x29\x67\x15\x17\xed\x32\x51\x8d\x4e\xf1\x79\xc2\xa4\x79\xfe\x87\x56\x57\x2f\xe7\xf3\xe9\x0f\xf3\xf9\x3f\xc3\xfd\x4a\x65\xe8\xee\x27\xa4\x14\xb1\x9c\x18\xdb\x92\x6c\x4a\x44\x3b\x01\xc7\x73\x39\xb1\x78\x67\x5d\xbc\xc9\x39\x05\x87\xf5\x3f\x61\xfd\x9e\x93\xef\x70\x24\xc7\xbd\x09\xe5\x21\xbb\x0c\x2f\x82\xef\x82\x0b\x7a\x0c\xb2\xcb\xa0\xe2\x32\x20\xab\xff\xa5\x51\x48\xab\x5f\x85\x27\xc1\xd8\xbf\x48\x38\x42\x69\xd4\x5f\xe5\x59\x68\x56\x97\xe7\x1e\x26\xd5\x9c\x36\xd7\xe8\x94\x10\x1f\x86\x82\xa8\x9c\xcb\xe0\x32\xf8\x36\x1c\x6a\xf9\x40\xf0\x45\xd8\x43\x3f\xe7\x37\xda\x88\x2f\x75\x26\xb9\x96\x9a\x0b\x3a\xce\x03\x5a\xea\xd3\xf9\xb1\x18\x96\x5b\x81\xd7\xf7\xaf\xb9\x45\xd8\x5f\x38\x79\x85\x27\x7d\x2d\xf6\x2a\x6b\x07\xbc\xbb\xa3\x25\x48\x05\x33\x66\xe9\x53\xc7\x63\x76\x18\x9a\x40\x56\x36\x34\xe9\x9b\xd0\x7f\x08\x99\x75\x2d\x1d\x9e\x4b\x55\x61\x4c\xfb\xe1\x9f\xe7\x65\x23\x41\x2a\x25\x39\xed\xcd\x58\x2c\xff\xfa\xf7\xde\x38\xee\xe9\x46\x3b\x3b\x8d\x76\xdc\x7f\xbb\x4e\x76\xb0\x1e\x20\xe3\x51\x24\x09\xdd\x8c\x7b\xc7\xce\x34\xee\x65\x88\xd5\x63\x6e\x49\x67\x1b\xf7\xeb\x44\x35\xee\xf6\xab\x33\xdd\x7b\xf5\x93\x41\x3d\x9c\x32\x7e\x00\x9e\x2d\x7d\xad\x94\xbd\x77\xcf\x1b\x21\xde\xa0\xfb\x98\xad\x68\xd9\xe9\x33\x41\x6d\xa0\xd9\x13\xf6\x11\xf1\xb8\xe5\xf9\xaf\x3e\x16\x61\x3f\x79\x4a\xd8\xbd\x73\xfe\x0d\x00\x00\xff\xff\xee\xd4\x3d\x5f\x26\x07\x00\x00") func uiIndexHtmlBytes() ([]byte, error) { return bindataRead( _uiIndexHtml, "ui/index.html", ) } func uiIndexHtml() (*asset, error) { bytes, err := uiIndexHtmlBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/index.html", size: 1830, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiJsAppJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x3d\x7f\x73\xdb\x36\xb2\x7f\x5f\x3f\x05\xaa\x99\x9c\xa9\x8b\x4c\xd9\xed\xdc\xcd\x7b\xf2\xb9\x77\x6e\xec\xa6\xbe\x4b\xec\x3c\xdb\xc9\xbd\x8e\xc7\xe3\xa1\x45\x58\x62\x4b\x91\x2a\x49\xf9\xc7\xf5\xfc\xdd\xdf\x2e\x7e\x90\x00\x08\x90\x94\x6c\x39\x69\x5e\x38\x99\x48\x02\x17\x8b\xc5\x62\xb1\xd8\x5d\x00\xeb\xe1\x90\xbc\xa6\x09\xcd\x82\x82\x86\xe4\xea\x9e\x14\xf9\xd8\xff\x0a\x0a\xf3\x74\x91\x8d\xe9\x88\x8c\xd3\xf1\x2f\x59\x1a\x8c\xa7\xc3\x8c\xf2\xb2\xe1\x22\x1f\x16\xf9\xd0\xf7\x19\xdc\xfe\x31\x39\x3a\x3e\x23\x07\xfb\x87\x67\x5f\xc3\x6f\x2c\x7a\x95\xce\xef\xb3\x68\x32\x2d\xc8\x37\x5b\xdb\x7f\x26\x67\x53\x0a\x45\x02\x0b\xd9\x5b\x14\xd3\x34\xcb\x7d\x01\xfb\x26\x1a\xd3\x24\x87\xa6\x17\x49\x48\x33\x52\x00\xec\xde\x1c\xe0\xa8\x7c\x33\x20\x1f\x68\x96\x47\x69\x42\xbe\xf1\xb7\x88\x87\x00\x3d\xf1\xaa\xd7\xdf\x41\x14\xf7\xe9\x82\xcc\x82\x7b\x92\xa4\x05\x59\xe4\x14\x70\x44\x39\xb9\x8e\x62\x4a\xe8\xdd\x98\xce\x0b\x12\x25\xd0\x8b\xd9\x3c\x8e\x82\x64\x4c\xc9\x6d\x54\x4c\x59\x3b\x02\x0b\xeb\xc5\x4f\x02\x47\x7a\x55\x04\x00\x1e\x40\x85\x39\xfc\xba\x56\x01\x49\x50\x08\xa2\xf1\x99\x16\xc5\x7c\x34\x1c\xde\xde\xde\xfa\x01\x23\xd8\x4f\xb3\xc9\x30\xe6\xa0\xf9\xf0\xcd\xe1\xab\x83\xa3\xd3\x83\x4d\x20\x5a\x54\x7a\x9f\xc4\x34\xcf\x49\x46\x7f\x5d\x44\x19\xe7\x75\x30\x07\xa2\xc6\xc1\x15\x90\x1a\x07\xb7\x24\xcd\x48\x30\xc9\x28\xbc\x2b\x52\x24\xfa\x36\x8b\x8a\x28\x99\x0c\x60\x2c\xae\x8b\xdb\x20\xa3\x88\x26\x8c\xf2\x22\x8b\xae\x16\x85\xc6\x33\x49\x22\xf4\x5c\x05\x00\xae\x05\x09\xe9\xed\x9d\x92\xc3\xd3\x1e\xf9\x7e\xef\xf4\xf0\x74\x80\x48\xfe\x75\x78\xf6\xe3\xf1\xfb\x33\xf2\xaf\xbd\x93\x93\xbd\xa3\xb3\xc3\x83\x53\x72\x7c\x42\x5e\x1d\x1f\xc1\x28\x1e\x1e\x1f\xc1\xaf\x1f\xc8\xde\xd1\x4f\xe4\x9f\x87\x47\xfb\x03\x42\x81\x63\xd0\x0e\xbd\x9b\x67\xd8\x83\x34\x43\x14\x11\x32\x94\x86\x3e\x39\xa5\x54\x23\xe1\x3a\xe5\x24\xe5\x73\x3a\x8e\xae\xa3\x31\x74\x2d\x99\x2c\x82\x09\x25\x93\xf4\x86\x66\x09\xf4\x08\xeb\xcf\x69\x36\x8b\x72\x1c\xd8\x1c\x68\x0c\x49\x1c\xcd\xa2\x22\x28\xd8\xef\x5a\xbf\xaa\x56\xf6\xde\x03\xe5\x27\xa7\x6c\x7c\x11\x0d\xb6\x96\x04\x33\x9a\xe3\x60\x8d\xd3\x84\x77\x5d\x11\x30\x21\x6f\x23\xf2\x7d\x16\xcc\xc8\xeb\x6c\x91\xd0\x28\x23\xde\x15\xfc\xf2\x27\xfc\xd7\xdf\x27\xb3\x20\x8a\x7d\x90\x91\x3e\xd4\xf8\xc3\x1f\x70\x78\xf7\x92\x30\xa3\xb7\xe4\xfb\x34\xb9\xa1\x80\x94\x12\x0f\x88\xbc\xbf\x02\xea\x6c\xd0\x6f\x83\xa2\x20\x67\x59\x30\xbe\x27\xde\x0c\xbe\xff\xbd\x9c\x35\x71\x70\x95\x4b\xd8\xaf\x6e\x82\x8c\x4c\x69\x00\x9d\xdb\xa7\xf9\x38\x8b\xe6\xd8\x5d\xb2\x4b\x36\xce\x4a\x91\xc5\x01\xa4\x79\x34\x49\xb8\x14\x04\x61\xc8\xba\xcd\x6b\x61\x09\xfe\x2a\xd2\xb9\x94\x4d\x40\x7d\x15\x21\xf0\xcf\x1c\x81\xbf\xb1\xa3\xce\xde\x59\x1a\xd2\x18\xa6\x6b\x04\x1c\xa2\x59\x44\x73\xbf\xc8\xe1\xfd\x90\xfc\x35\xa3\xd7\x34\xa3\x38\x21\xe6\x41\x31\xdd\xed\xf9\xfe\xb0\xb8\x9f\xc3\xe0\xe4\x43\x18\x88\x69\x16\xc5\x3f\x97\xdf\xfc\x10\xaa\xf5\xc8\xf0\xbb\x8a\xa1\xa3\x4e\x7d\xc6\x0e\xbf\x65\x24\xec\x7c\xe5\x5d\x2f\x92\x31\xeb\xb0\xc7\x8b\xfa\xe4\xb7\xaf\x90\x79\x0c\x88\xc2\xc0\x8d\x01\x0a\x0b\x54\x48\x5e\x2e\x41\x8d\xb7\xff\xb3\xa0\xd9\xfd\xde\x04\xe6\xcc\x24\x80\x31\x57\xa1\xf0\x31\x5e\x9f\x9b\xbf\x7b\x7b\x1f\x5e\xf7\x2e\x80\xff\xdb\xf8\x1f\xfb\xb5\xb3\x34\x82\xcb\x93\xbd\xb3\x03\x86\xe5\x1b\x89\x85\x17\x55\xa8\x1e\xfa\xb2\x1f\xbe\x81\x81\xfc\xe7\x3f\xc4\xf9\x6e\x97\xfc\xf6\xd0\xef\x57\x68\x90\x4f\x75\x18\x47\xed\xaa\x5a\xc9\xae\x5f\x11\xc2\xcb\x8b\x20\x2b\x60\x4e\x27\xe1\x00\xb4\x0d\x2a\x17\x26\x17\x26\xef\xb0\xb1\x45\x16\x63\x8f\x50\xd9\xb3\xba\x06\x77\x10\x24\x0c\x8a\x00\x09\xd5\x5e\xe0\xc3\x9a\xb9\x4c\x82\x24\x85\xa9\xc7\x7e\xf8\x13\x5a\x9c\x81\x1c\x7a\x7d\xf2\x27\xb2\xed\x6f\xd1\xbf\x0c\x6a\xb5\x80\x2a\x59\x07\xbe\x76\xa9\x81\x84\x01\xf9\x23\xd1\x0d\x7f\x16\xcc\x15\x01\xa9\x89\x84\x7c\x32\x5a\x2c\xb2\xc4\xf1\x12\x1f\xd4\x29\x23\x92\xd5\x1b\x94\x4f\x50\xb2\x7a\xc4\xf8\x68\x05\x7c\xd8\xa9\x15\x3f\xf4\x75\x50\x03\x44\x10\x36\xf3\x71\x9d\xa0\x79\xe1\xfd\x86\xc3\x30\xc2\xff\x06\x64\x46\x61\xea\x85\x23\xd2\x7b\x77\x7c\x7a\xd6\x83\x41\xbc\x2b\x60\xfe\x15\x23\x58\xfa\x92\x7f\xe4\x69\x72\x90\x65\xa0\xea\x06\x6c\x54\x46\x7c\x6c\x1e\xfa\x35\x0a\x7c\xd0\x1b\x89\xc2\xa4\xd0\xc6\xa4\xe8\x9a\x78\x5f\x87\x40\x45\xbe\x88\x8b\x9a\x74\xc8\xa7\x04\x00\x19\x38\xbf\xb0\x74\xb6\x56\x52\xd6\xf0\x41\x73\x1f\x80\xb2\xe8\x32\x5a\x8c\x98\xcc\xc7\x0e\xcd\xd3\x28\x71\xd3\xc3\x38\xa8\xc0\x39\xc8\xb2\x93\xf6\xd0\xaf\x43\x8a\xe1\x08\xf5\x37\x2a\xe4\x83\x36\x3f\x4f\x28\xac\x57\x05\x9b\x8b\xd0\xb6\xd2\x37\x93\xe2\xf2\x8d\x52\xc3\xbb\x8d\x92\x30\xbd\xdd\x5f\x64\x6c\x1d\x1c\x90\x4b\x10\x2c\x5b\x57\xb1\x25\x2e\xef\x8e\x0e\xe2\xaa\xe8\x21\xd4\x65\x84\x8a\x69\x07\x3f\xff\x4a\x82\x6c\xb2\x98\x41\x63\xb9\x1f\xd3\x64\x52\x4c\xb1\xf8\xe5\x4b\x17\x2f\x79\x03\xe7\x50\x73\x93\xab\xb6\xb2\x3a\x94\x75\x1a\x6b\x34\xc4\x7c\xbd\x4f\x80\x46\x2f\xa8\xe3\x61\xb5\xb0\xe7\x00\x8b\x1f\x2e\x88\x92\x01\xfc\x8b\x31\x42\xda\x2f\x85\xc7\xfe\x3c\x4b\x8b\x14\x56\x3a\xea\xff\x2a\x46\xc9\x3d\x48\x92\xd7\xa0\x8b\x50\x0f\x01\x6c\x02\x36\xc1\x3e\x98\xca\x9e\x45\x56\xd8\xa8\xa0\xa6\x33\x61\x45\x75\x45\x9d\x6d\xda\x78\xe3\x16\x3f\x45\x73\x23\x82\x81\x24\x68\x50\x31\x6b\xa0\x71\xc5\x40\x65\xd7\x31\x0a\x57\xb4\xb5\x4a\xa9\x2c\x17\x17\x5d\xac\xad\x15\xcb\xd5\xe9\x6d\x90\x80\xb1\x97\x75\x14\x7f\xb5\x8a\x77\xc9\x3a\x6a\x1b\x05\xde\x39\x39\x62\xfc\x8b\x4b\x30\xb8\x82\xc1\x01\x58\xc4\xb1\x0b\x88\xa2\xaa\x6c\x81\xe1\x88\x0e\xe6\x29\xb8\x2d\xbb\x64\xcb\x05\x96\x2e\x0a\x18\x9a\x24\x04\xdb\xc9\x8a\xf0\xa1\x6e\x53\x88\x0e\x2b\xc2\x08\xdf\xc6\x60\x5c\x1f\x6b\xb8\x9a\x25\x13\xb5\x62\x8d\x02\xd7\x6c\xc6\xe1\x61\x4e\x10\x45\xbf\x60\xd7\x52\xd3\x67\x2c\x81\x96\xbe\xe6\x9d\x40\xdb\xa4\x0e\xc4\x79\x52\x41\x59\x84\x56\xd2\x56\x36\xd7\xa4\xad\x8d\x21\x73\x37\x68\x6f\xa7\x42\x21\x07\xd4\xd9\xaf\x36\x04\x6d\xc3\xe8\xa2\x9a\xc9\xc7\xcb\x97\x9d\x57\x99\xa6\x99\xe9\x10\x8e\x9c\x96\x73\xaf\x12\x89\x5f\xdb\xe7\xc9\xaf\x8d\x6a\xc0\xd1\x58\x39\x16\xcd\xd2\xc7\x5a\xaa\x4b\xad\x8d\xcf\x42\xdf\xa8\x4c\x5b\x85\x30\x2a\x26\xe2\x3a\xe9\x62\x83\xb9\x12\x71\x42\xfc\xd6\x43\x1c\xc3\xbe\xda\x60\x5e\x43\xc7\x3a\x72\xcd\x3d\xd5\x98\x01\xd6\x59\xd7\xd8\xe6\x53\x83\xbd\xc6\x5a\x1d\xa9\xa2\xcb\x97\x66\xaf\xef\xb6\xbe\x19\x43\xc0\xbd\xc5\xae\xce\x3d\xa6\x88\x3a\x5b\xe0\x56\x12\x45\xe7\xb9\x6d\x8c\xf8\x06\x2e\x4d\x62\x61\x4f\x7d\x96\x6b\xa3\x57\x6f\xa6\xcb\xf2\xac\x8e\x68\xdb\xfa\x6c\x2c\xbc\xf6\xaa\xa5\x04\x68\xde\x82\x77\x37\xcd\x06\x24\x9d\xd7\x8d\x6a\x41\x07\xbc\xf7\x81\xfc\x62\x91\x93\xef\xc8\x37\x5b\x5b\xe4\x6f\xe4\x1f\xa7\xc7\x47\x3e\x46\x99\x92\x49\x74\x7d\x8f\x18\xb0\x5f\xf3\x34\xc9\xe9\x19\xf8\x24\x7d\x32\x22\x66\x99\x69\x30\x57\x3e\x31\xfa\xb0\x2c\x1e\xe0\xcb\x02\xe6\x14\xeb\x45\xd2\x17\xc6\x6a\xec\x8d\x02\x54\xbe\xd4\xa2\x96\x33\x68\x1a\x8d\xd5\xe1\x4c\xf0\xe8\xb1\x81\x8f\xe6\xaa\xe1\xb7\xf0\xaf\x1d\xdc\x16\x8f\x61\x15\x70\x7d\x7e\x55\x12\xad\x45\x4b\xaa\xe2\x15\x23\x26\x08\xfe\x26\x4a\xe8\xeb\x2c\x98\x2b\xca\x4d\xa9\x54\xbe\xb5\x85\x01\x5e\x61\x54\x2d\x8d\xe3\x36\x9b\x4e\x93\xb1\xaa\x92\x77\x33\x6b\x32\x4a\x2e\x59\xb8\x96\xaf\xdb\x0d\x73\xf5\x66\x06\x30\x37\xb3\x06\x88\xf1\x14\xcc\x63\x5c\xb9\x6f\x7c\xce\x65\x3f\x86\x5e\xbd\xc2\x52\xaf\xee\x04\xcb\xc7\xbf\x33\x3c\x61\x29\xf6\xa5\xf5\x0e\x63\x8a\xa3\x55\x04\xb3\x39\x8f\x4d\x90\x21\x0f\x46\xf4\x77\x6c\xde\x75\x89\xf8\xde\x81\x38\xf4\x6f\x82\x78\x41\x9b\x2b\x2f\x72\x7a\x98\x14\x14\xbd\xfb\xe8\x86\xbe\x5e\x44\xd0\x21\xe8\x8d\x57\x64\x0b\xda\x50\x2d\x9f\xa6\xb7\x6f\xe8\x04\xdc\x83\x2e\x90\x3f\xed\xdd\x45\x79\x17\xc0\xff\xed\x02\x78\x77\x3a\x0e\x62\x60\xd7\xb7\x8c\x5f\x7e\xce\x7e\xf5\x1d\x66\x17\x1b\xb1\x30\x0b\x6e\x99\xd4\x69\xcb\x13\x8d\x29\x7a\x99\x03\x12\xe5\x87\x49\x54\x44\x41\x1c\xfd\x9b\x86\x03\x16\xdc\x65\xca\xc5\xbd\x94\xb0\x65\x4a\xab\xd6\x04\x8d\x0f\x08\x4b\x10\x86\x8c\x08\xef\xb2\x12\xa3\x06\x63\xb1\xae\xeb\xd5\xd6\x39\x0e\xe0\xd9\x22\x0e\x4f\x28\x86\xb1\x41\x86\x02\x60\x43\x0b\x1d\x38\x13\xc0\x69\xc7\x38\x2a\x0d\xf7\x79\x50\xcd\x15\xb9\xa8\xb7\x77\x33\xe3\x2b\x66\xb9\x82\xb7\x35\x87\x8f\xd9\x9c\x03\x55\x19\xaf\xd1\x23\x6b\xad\x9c\x95\x4f\x6b\xa4\xad\xce\x0a\x98\x1d\xf9\x08\xe6\x49\x15\xc7\x71\x1b\x02\xe6\xf3\x0b\xbd\xc7\xaa\x18\xbe\xeb\x5e\x69\x9c\xc6\x68\x4d\x54\x3a\xcb\x67\x25\xb9\xc7\x11\x35\xd8\x21\xe6\x13\x64\x34\x00\x53\x06\x66\x4a\xf7\x3a\xd7\x51\x1c\x1f\xcf\x83\x71\x54\x00\xe9\xfe\x76\xb7\x8a\x0e\xbb\x46\x03\x69\x90\x62\xf6\xbe\xf1\x2d\xcc\xe3\x1c\xa6\xe2\xb8\x90\x13\xd2\x3d\xf5\xe5\x83\x03\xb6\x98\x79\x9a\x60\x75\xa8\x55\x64\x41\x92\x47\x28\x56\x20\x6d\xa1\x08\x86\x78\x7f\xde\xda\xea\x50\x17\x94\x4c\xfc\xa8\x89\xdb\x64\x1f\x32\x8c\xfe\x1d\x2a\x3f\xb7\xda\x2b\xa2\xf1\x2f\x3f\xb0\x1e\x97\xaa\x8f\x33\xc0\xdb\x78\x71\x38\x7a\xf1\x76\xf4\xe2\x74\xa3\xdf\xa2\x5f\xdf\x06\x77\x6f\xa3\xc4\xbb\x0e\xe2\x9c\x76\x32\x2f\x15\x49\x55\xbc\x44\x43\xeb\xb4\x1a\xfd\xf8\xb0\xf0\x96\x70\xac\x74\x05\xc0\x4a\x5d\x6e\x33\xea\x1e\x5e\xed\xbb\xb2\x5a\x1c\xe4\xdc\x7f\x6a\xf5\xf7\x55\x60\x68\x97\xd6\x9d\x2e\xf5\x91\xb6\x34\x4c\xaa\xae\x4e\xb6\x52\x8d\x31\xd5\xc2\xd3\x7a\x91\x95\xa9\xd3\x20\xef\xcc\x4b\xd5\xe8\x37\xd9\x08\x7c\xb2\x04\x90\x9a\xa9\xe0\x4a\x08\x9a\xc6\xb9\x88\xcb\x29\x88\x7b\x41\x27\x69\x76\xbf\xbd\xd5\xe0\x32\x56\x18\xcc\xa8\xb5\x59\xa9\xec\xd2\xb8\xb2\xd6\x98\xed\x64\xeb\xa1\x62\x17\xbd\x32\xc1\x9b\x02\x5e\xa5\x6d\xe9\x8f\x55\x43\x72\xec\xa0\xb2\xa4\xe9\x26\xa2\xb7\xde\xb8\xc8\xac\xc4\xb0\xf8\x12\xbc\x93\xe3\xe3\x5e\xf2\xe4\x86\x8a\xd7\x63\xf6\xe0\x04\x29\xe9\x0d\xc0\x1c\xcb\x8b\xfb\x18\x3c\x85\xde\x6d\x14\x16\xd3\x11\xa8\x9b\xf9\xdd\xce\x94\xe2\xb1\x85\xd1\xb7\xec\x47\x8f\x3c\x0c\xb0\x5e\x7e\x33\xf1\xab\x6a\x40\xf7\x75\x34\x01\x0f\x03\x5b\xaf\x2c\x98\x07\x9b\xa5\x53\x17\x4c\x30\x4b\x69\x2b\xa1\xd0\x4e\x2f\x4e\x03\xe6\x2f\xfa\x7e\xaf\x15\xb1\x8b\xdf\xc8\x41\xb4\x9a\xe1\xc3\x35\xee\xb0\x5c\x81\x89\xcb\x24\x75\x80\x6b\xa7\x2b\x02\xce\xcc\xef\xdf\x48\x39\x6b\x47\x64\x6b\xc0\xc3\xd2\x23\xfe\x61\x13\x65\x1c\x24\x07\x4e\x86\x77\xe6\xc3\x5b\xc0\x0b\xff\x2f\xe1\x53\xcf\xfc\xd2\xb9\xab\xfc\x96\x01\x60\xeb\x2a\x85\xac\xcf\x28\x81\xec\x8b\xe6\x5a\x97\x50\xca\xc6\x6a\x55\xa6\x6e\xd6\xaa\x90\xd5\x36\xad\xe6\xd5\x56\x7e\x9b\xe6\xd9\x5a\x8a\x15\xef\xb6\x7a\x6b\x00\xdb\xbc\xdc\x39\x38\xf8\xf9\x90\xc9\xe6\x27\xee\xde\xba\x2a\x58\xfd\xf4\xd2\x21\xde\x0b\x67\x51\xf2\x01\xc4\x57\x77\x88\xab\x62\xd5\x21\x56\xbc\x5b\x05\xb6\xe6\xd5\x22\xe8\x3b\xe0\x9b\xd5\x0f\xc6\x17\xeb\x70\x81\x9f\xc0\x01\xce\x17\x33\x19\xd6\x45\x15\xac\xc7\x47\xd4\x0d\x1a\x6f\x7b\x8b\xfc\x89\xfc\x05\xff\xdb\xde\xda\x82\x69\x6a\x80\x1a\x07\x05\xfc\xbd\x0f\xaf\x41\xdf\x8c\x33\x3f\x01\x38\x66\x50\x61\x63\x63\x0c\x51\xfa\xdb\x36\xe5\x53\x92\x84\x67\xc6\xd6\x46\x13\x3b\x44\xb1\x22\x61\x45\x3a\x99\xc4\xb4\xee\x5a\x36\x19\x26\xa5\xe7\x76\x7b\x02\xdd\xc2\x01\xf9\xda\x28\x72\x5b\x28\x9a\xe7\xc7\x81\xdb\xdc\x23\x0e\x3e\x13\x01\x5b\x19\xe0\x17\x58\x4a\xc6\xae\xe4\x87\x36\xac\x31\x9d\x5a\x97\x92\xb6\x52\xe3\x3a\x66\x11\x7e\x76\x59\x91\x4d\xc6\xf7\xac\x8c\x66\x5a\x44\x4b\xdb\x35\xec\x42\xf4\x32\x54\x31\xd8\x08\xa3\x2f\xe0\x8a\xb2\xfd\xe5\xe2\x50\xfc\xd2\xa7\xbe\x5c\x91\x5c\x7d\x46\xfb\x01\xc5\x7d\x6b\x75\x9b\x3e\x4d\x16\x09\x9a\x02\x9d\xc4\x78\x1c\xd3\x20\x2b\x49\xd5\xba\x61\xa3\x60\x4d\x06\x64\x77\xdb\xb1\x71\xc1\x46\x55\xfc\x94\x16\x23\xaa\xda\xab\x45\x51\xa4\x89\x1e\x8e\x96\x4f\x69\x51\xb6\x4e\xe1\x0a\x0b\x9e\x8e\x3a\x05\x70\x72\x96\x16\xe0\x66\xf4\x1e\x69\x01\x5a\x10\x33\x42\x3a\xe1\x55\xec\x5c\x66\x10\x20\xff\xc0\x90\x3c\xb7\xb6\x04\x50\x3f\x7e\x8b\x66\x26\xd7\x91\xfb\x74\x96\xf6\x1c\x51\x8e\xba\xb9\xe2\x9b\xb6\x14\xe7\x9b\x90\xff\xf5\xa2\xe1\xd6\x31\xfc\x1f\x25\xf3\x45\x71\x8e\x73\x64\x97\xb3\xed\x02\xad\x73\xa7\x5a\x62\x41\xa5\x91\xc2\x61\x77\x94\x25\x4d\xc6\x31\xf8\xf4\xc2\xc2\x57\x96\x12\xc7\x06\x53\xdf\x42\xea\x45\xbb\x68\x5b\x8d\x73\x98\x61\xf8\x12\xca\x39\x63\xd8\x0f\xb4\x03\x95\x9f\x86\xbd\x29\x57\xb9\xca\x28\xf2\x2b\x6b\xb5\x56\xa8\x58\x9a\xd5\x3b\x03\xd4\x6d\x69\xce\xd2\x24\xc2\xe5\xf9\x71\xb6\xe6\xd2\x96\xdd\x5b\xde\x6c\x7d\xab\x83\x97\x3f\xca\xba\x73\x68\xb0\x27\x52\x46\x0d\xba\x10\x64\x78\xca\xa6\xa0\xe8\x05\x79\x17\x07\x63\x3a\x4d\xe3\x90\x66\xa6\x71\xb3\xbc\xf8\x08\xa4\x95\x00\x69\x05\xa6\xcb\x22\x28\xd0\x84\x48\x16\x1a\x62\x54\xc1\xae\x26\x48\xc2\x43\xc0\x0d\xc5\x27\x3c\x8b\xdc\xf5\x6c\xb7\x49\x06\x5a\x96\x97\x7c\x73\x73\x1d\x0e\x94\xec\xe5\x6a\xe4\x76\x3e\x3c\x7d\x04\x25\xa7\xac\x13\xb5\x29\x52\xbd\x32\x67\x09\xbe\xc9\x3b\x1e\xd2\x62\xb0\xee\x73\x03\x97\xe2\x14\xb0\xd8\x8d\xff\xcd\x16\x78\xe6\x1b\x3e\x34\x1f\x77\x81\xe3\x23\xc2\xc8\x73\xc1\xea\x53\x82\x11\xa8\x98\x4d\xf5\xd3\x32\x2e\x93\xa0\xd9\xfb\x52\x4f\x41\x0b\x39\x61\x32\x93\x0f\x2d\x6b\x72\xb7\xa3\xbb\xaf\x0f\xdc\x27\x77\x5d\x5b\x82\xe6\x89\xdd\x96\x53\xb9\x72\xc7\x26\xb4\x9c\xb1\xcd\x6b\xc2\x60\xeb\x33\xf6\xf1\x10\x8d\x4e\x31\x37\x70\xe0\x98\x1b\x76\x19\x85\x5d\xdc\x20\x26\x11\x5e\xff\x9c\xe3\xb9\x20\xbb\xe2\xb0\x58\x27\xb7\xa4\x56\xb9\x71\x27\xcc\xed\x8a\x88\xf3\x98\x40\xff\x9b\x28\x2f\xca\x1d\x2e\x03\x7d\x73\x77\xbc\x0a\x81\x38\x34\x8b\x7d\xd9\xea\x83\xa6\x6b\xec\x89\x52\xef\xbc\x8e\x62\x93\x6c\x5f\xf8\x8b\x79\x88\x77\xae\x2e\x83\x82\xfc\x55\xf2\xb9\x2a\x6b\xdd\xc2\xb3\x76\xc6\x9f\x2f\xc0\xf3\x10\x63\xdc\xbc\xfb\x73\xa9\xcd\x34\x8d\xdd\xb9\xa2\x4b\x6c\x8f\x63\x27\xc5\xd1\xa0\x20\x74\x8e\x0a\xee\x38\x0e\x0f\xf0\x8a\x0e\x36\xd8\x08\xcd\x19\xa1\xdc\x92\x71\x56\x10\xb3\x4e\xc8\xbc\xc5\x52\x6e\x3e\x0b\x6b\x6a\x0e\x4b\xcb\xdd\x0e\x4f\xe1\x14\xb1\xab\xb4\x6a\x42\xd5\xdf\xb1\x83\xda\x62\xb6\x45\x09\x51\xc7\xb4\xf1\x74\x15\x6b\x4d\x1d\x33\x9b\x34\x9c\x5b\x45\x44\x95\x41\x44\xd3\x1a\x5d\x6e\x61\x98\x31\xb0\x9d\xb4\xee\x13\xb2\xa3\x9a\xe5\x0e\x2e\xb8\x37\xb0\xc4\xa4\x13\x0c\xf9\x4e\x74\x8d\x55\x7f\x83\xb7\xd1\x9a\xa6\x60\xd9\xa4\x40\x92\xa3\xd3\x40\x0d\x94\x9b\x2a\xca\x77\xc8\xa7\xf0\x34\xfa\x37\x1d\x10\x13\x6c\xdb\x15\x20\x79\xe4\xd8\x04\x37\x60\x4d\x04\x57\x51\x1c\x15\xfa\x72\xc8\x79\xd3\x34\x3c\x92\x9b\x75\x0d\x61\xf7\x9d\x59\x90\x2e\x66\xd7\xd4\x2e\xb3\x20\x99\xd0\xcb\x71\xba\x48\x0a\xa1\x2e\x1b\xb7\x3c\x7a\xdb\x5b\x5b\x2f\x96\x71\x72\x79\x63\xa2\x73\x31\xd5\xda\x1b\x12\x17\x25\x2c\xf6\xd8\x07\x8f\xee\x94\x9d\x5c\x03\xe1\x7c\x49\x7a\x66\xbb\x6d\x1c\xcd\x28\xbb\xb2\xc9\x0f\x51\x7f\x5e\xfc\xac\xba\xb6\x76\x86\x5e\xf2\x2d\xf2\x7d\xbe\x11\xa3\xb0\x11\xcf\x57\xb9\xb8\x88\x7a\xb9\x30\xae\x56\x18\x07\xb2\x5c\x1d\xac\xa6\x21\xc3\xc0\xf7\xeb\xc1\xd3\x93\x05\xcb\xad\x11\xfb\xb4\x00\xc9\xcb\x9f\x41\x00\xda\x0c\xa7\xca\x97\x0c\xa3\x1b\x74\x26\x8f\x52\x7e\xed\x0b\x6f\xea\x52\x18\xa2\x7b\x5a\x74\xd8\x40\xb4\xa1\x72\x06\x8e\x0a\x9c\x72\x4e\x00\x09\x94\x21\x04\x7e\x09\x91\xac\x53\x70\x19\x61\x69\xf0\x7a\x20\x21\x4c\x9a\x72\x2c\x00\x63\xb2\xd4\x81\x20\x39\xfd\x91\x2b\x06\xa5\x22\x46\x7c\xe7\x06\x0e\xfd\x68\x12\x2b\xb7\x8f\x45\x17\x1e\xba\xfb\x65\x21\x27\x38\x9f\x82\xd3\xb7\x3b\x64\x6d\x82\x57\x00\xfd\x10\xcd\x63\x8f\x2e\xb4\x1d\x63\x70\x0c\xd2\x05\x08\xfc\xc3\x40\xc2\x2c\x71\xb0\xa8\x07\xd8\x5a\x2c\x3a\x7c\x1e\xfa\x17\xee\xb3\x26\x17\x0d\xed\xd5\xc7\xec\x88\x16\xb7\x69\xf6\x0b\x0e\x4a\xc9\x78\xc6\x77\xe6\x0c\x04\x61\x88\x97\xc1\xfd\x84\x43\xf5\x97\xc3\xbd\xc7\x6b\xb7\xe0\x16\x9f\x4b\xe2\x3e\xc5\x6b\x52\xa0\x9e\x83\x42\x43\x5f\x53\x3c\x9e\x10\x22\x06\xcd\x2c\xee\xe5\xda\x79\xcf\x6d\xf5\x8e\xed\xa8\x96\xfd\x72\xed\x9c\xa0\xc6\xb5\xb0\x4a\xd1\xc4\x4b\x62\x7c\xc3\x2f\x93\xbb\x10\xd7\x35\xfd\xb2\xa3\x2b\x17\x66\x67\x13\xd6\xa5\x7b\xc5\x56\x98\x71\xa3\x35\x21\x2e\xc5\x29\xb6\x8f\x54\xcf\xcb\x0e\x31\x1e\xa5\xda\x3c\xa9\x96\xfc\xee\x2c\x03\xa3\xae\x61\x51\x5d\x92\x8e\x1f\x60\x09\xb8\x27\x15\x1d\x96\xde\x56\xed\x28\x7d\xb5\x36\x61\x29\xae\x85\xab\xad\x6b\x76\x69\x17\xe3\x8d\x79\xdc\xd6\xda\x72\x82\x55\xb6\x2e\xc0\xfe\x77\x13\xa8\xb6\x1e\xf3\xa3\x4e\xea\x19\xba\xde\x8b\x9f\x36\x5f\xcc\x36\x5f\x84\xe4\xc5\x8f\xfc\x30\x9d\xb9\x9a\xa9\x2b\xbc\x16\x09\x55\xe0\xaa\x28\x98\x2f\xc3\x5e\x06\xfc\xa7\x76\x37\xa2\xa2\xb8\xba\x1e\xa1\x94\x29\x37\x24\x34\xc8\xe5\x2e\x49\xf0\xa0\x3e\x8b\x67\xad\xe9\xf8\x88\x35\xcc\xba\xda\x26\x80\x32\x60\x46\x7c\x53\x1b\x1c\x2e\x59\x49\xc9\x14\x36\xd8\xca\x0e\xb2\x29\x0a\x9e\x91\x60\xa1\xeb\x49\x8f\xae\xa7\x3c\xea\xf4\xf0\xe0\xa4\x2d\x9c\xc1\x67\xf2\x32\x3b\xcf\x0d\xd8\xd1\xcc\x50\xb6\x94\xf9\xc5\xaa\x83\x1b\xdc\x37\x3f\x6d\x8c\xa5\x3e\x6e\x1f\xda\xb2\x07\x7d\xe9\xd8\x84\x36\xb4\x8c\x8b\x58\xa9\x6d\xac\xd3\xde\xb6\x55\x5d\x9f\xfb\xb9\xaf\x0d\xab\xad\x52\x29\x62\xce\xdd\xa3\xf2\x6d\xc7\x2d\x24\x97\x85\xbd\xcc\x26\x78\xd9\xe6\xd3\x6f\x3e\xb5\x58\xf9\xd3\x6f\xb8\x3b\x81\xda\x12\x43\x97\x2e\xd3\x1c\x40\x17\x71\xa3\xd5\x7c\x7c\xf5\x33\x1d\x17\x78\xd4\x2f\xf7\x2c\xf2\xca\x23\x59\x7d\x3f\x4f\xf1\x9e\x8e\x61\xca\xbb\xbd\x2a\xf5\x61\xce\x21\xdf\x5a\x70\x36\xd0\x1e\xee\xd5\xd9\x13\x47\xcc\x76\xe7\xd7\x09\x94\xe8\xb7\x38\x13\xda\xd5\x55\x98\xf9\x45\xb6\xc8\x61\x1d\xfb\x63\x72\x95\xcf\x77\xfe\x78\x85\xd7\x8a\xf9\xf7\x36\x67\x87\x55\xaf\x3c\x0c\xb1\xed\x00\x6e\x85\x46\x4e\x93\x97\xc1\x86\x6f\x64\x56\xe9\xd0\x6c\x8f\x27\xc9\x2a\xad\x74\x89\xc1\x30\xfa\xb1\xf1\xcd\xda\x4b\xf1\xd9\xd8\xc8\x85\xeb\x5e\x10\x3e\x66\x86\x94\xaa\xd2\xb2\x1b\xed\xd5\xf4\x71\x6d\x97\x96\x10\xa5\xec\x54\x25\xb8\x78\x9a\x65\xb6\x9c\x3c\xf8\xb6\x51\x6b\x7c\x04\xa5\xf1\x94\x3a\x43\xdb\x10\x12\xe2\xe5\xcf\x83\x2c\x00\xe9\x14\x32\x65\x0b\x31\xac\xa0\x6a\x08\x9f\xb4\x0d\xba\xa6\x6d\xde\x95\xbb\xea\x4c\xf4\x89\x8c\x37\x34\xba\xda\x16\x9d\x21\x22\x3c\x52\xff\xac\x6c\x47\xdb\xc7\xa5\x49\x18\x6b\xb2\x68\x11\x45\xdb\x1e\xbe\xb4\x6b\x95\xad\x7a\x5e\x64\xec\xdf\x4b\xb8\xc7\x1c\x03\x81\xe9\x5d\x5c\xd2\xbb\x79\x9c\x66\xf4\xd9\x0f\x83\x9c\x40\xe3\x07\xa2\xed\x9a\x39\xa8\xbe\x34\x37\xbc\x99\x01\x68\x9d\xa3\xec\x8d\x29\xf9\xac\xd0\xcf\x81\xfe\x98\xfe\x93\x1d\x53\x17\x5b\xd1\x3d\x53\xd8\x55\xc8\x0f\x78\xce\xa8\x23\xec\x2b\xf4\x04\xd9\xdc\x14\xd0\xe6\x39\x41\x0e\xcc\xdc\x46\x16\xd4\x68\xc5\xcb\x40\x0f\x92\xb0\x1d\x50\x78\x1f\x6f\xd2\x49\x05\x7b\x6e\x8a\x6f\xc9\xa1\x38\x9d\x9c\x88\x1a\x6e\x97\x48\xf2\x19\xfd\x3f\x7b\x44\x53\xf3\x7b\xc0\xaa\x24\xbb\xbb\xbb\xa4\xf7\x33\xb8\x5b\x3d\x67\x82\x29\x7e\xb2\xa0\xc1\xa9\x7a\xec\xb5\x0b\xd1\x82\xdb\x27\x73\x63\x15\x55\xf1\xa3\xda\x44\x42\x1f\x90\xbd\x00\xed\x03\xfa\x83\x48\xa4\xe4\x2a\x0d\xef\xfb\x96\xa8\xbc\xc0\x72\xbe\x71\xbe\xc1\x19\xeb\xf3\xb3\x02\x03\xb2\x71\x41\xa0\xa8\xf2\x31\xa1\x84\x48\x18\x76\xa8\x60\x63\x84\xbf\x11\xc1\x85\xff\x73\x1a\x25\xde\xc6\x86\x85\x1d\xb5\x21\x07\x33\x8b\xed\x13\x63\x45\xb7\xe2\x36\x78\x6e\x01\x7e\xb0\x4b\x4b\x3e\x0e\x12\x8f\xf7\xa1\x21\xa1\x12\xbb\xd8\xc9\x0e\x56\xfc\x72\xc3\x34\xca\x90\x49\xef\xdf\x58\x40\x6e\x17\x15\x37\xe8\x12\xa0\xfc\xfd\xc9\x61\x79\x76\xd0\x33\x67\x84\xf5\x7e\x31\xbb\x05\xfc\xb5\x3e\x23\xdc\xfb\x87\x25\x29\x2f\x77\xc9\xc6\x1f\xe1\xd7\xee\x46\x6b\xdb\x1c\xe1\x32\x51\xf5\xea\x4c\x88\x7d\x65\x13\xa7\x43\xc4\xc8\x5b\x61\xd8\x59\x12\x49\xad\x1d\xa4\x3c\x55\xa2\x4c\xd8\x3a\x64\xf3\x51\x1a\xa1\xa1\x60\x0c\xd1\x01\x85\x0f\x87\x4e\xc0\xac\x98\xf7\xab\x0c\x33\xab\xc8\x0c\x59\x43\xc5\xba\x72\x6a\x09\xd6\x39\x93\x88\x3c\x2b\xf3\xf0\xc1\xab\x2d\xec\x7a\xf9\x48\x71\x86\xd9\xfc\x50\x6e\xf9\xa3\x16\x04\x23\xbc\xce\x7d\xbb\xc0\x72\xe2\xb9\x46\x64\xd9\xfd\xdc\x5b\x3e\x8c\x1b\x3e\xb7\xf7\x35\x7f\xbc\x51\x35\xcb\x87\xa9\x13\x5a\x9c\x70\x34\x3f\xb2\xc0\xa5\xd7\x43\xdb\x12\x06\x66\x13\xd5\x32\x9a\x4f\x78\xd3\x7e\x38\x8f\x83\x28\xd9\x21\x78\x0d\x16\x6a\xec\xbe\x3f\xfb\x61\xf3\xbf\x5c\xf7\x2e\x38\x69\x32\x28\xe6\xd8\xcd\xb6\x17\xcb\x1e\x09\x45\x58\x5b\x4e\x6d\x72\xd1\x61\xa6\x89\xcf\x0e\xc2\xce\x24\x12\xef\xa1\xe2\xa7\x43\xdc\xc7\x7c\xb1\x5e\x45\xe0\x45\xd5\x2f\x22\xaf\x3c\x9f\xa0\xc8\x8b\x64\xcc\x88\x77\x78\xb7\x79\x7b\x7b\xbb\x89\x31\xe8\x4d\x60\x23\x5f\x0c\xc2\x8f\x3a\x13\x84\xb1\xb8\xf6\xb9\x30\x2e\x8d\x52\xf1\xcd\x35\x1f\x30\xce\xc7\x6c\x09\x0b\xe3\xeb\x16\x47\xcd\xb6\xb4\xb6\x2d\x70\x62\xe3\xe2\xab\x5e\x49\xf3\x96\x58\x9d\x2a\xc2\x5d\x73\xcd\x4b\x52\xf9\xa1\x7f\x0f\x55\xda\x40\x9e\xee\x1f\x60\x9a\x6c\xdc\x80\xaa\x4d\xe5\xca\x6d\xed\x78\xc5\x40\x5c\x2d\x28\xac\x97\x0a\x64\x2b\xa3\xf2\x9b\x2d\xab\x55\x79\xe5\x40\x52\xa7\xb3\xca\x9a\x6d\xb4\xec\xde\x75\x44\xe3\x50\xf4\x8e\xd1\xb2\x64\xdf\xb0\xa6\xbd\x67\xf3\xea\x44\xfa\xe3\xfa\x27\x58\x74\xc3\xb5\xb9\xb5\xff\x53\xb4\xab\x30\x7a\x85\x91\xa7\xbd\xa2\x80\x09\xca\xc0\x7b\xa2\x53\x66\xd6\x5c\x67\x06\x56\x3c\x86\x76\x5f\x5a\x6d\x56\x7f\x4f\x07\xf9\x44\xef\x7b\xca\xd9\xf3\x8e\xca\x14\x6a\xc2\x4d\x73\x65\x89\x28\x6b\xf2\x4b\xd5\xc6\x4a\xd3\x00\xcf\xf7\x1a\x6a\xcb\x6e\x43\x0d\x99\xd9\xd1\xdc\x0d\xd0\x2f\xc4\x19\x3d\x90\x84\x37\xde\xfa\x9b\xd0\x5a\xe6\x41\x13\x29\xd7\x68\xec\x1c\x75\x0b\xb2\x79\x9a\x77\xc5\xc6\xd7\x9f\x66\x74\x98\x83\xbd\x23\xba\x1f\x0f\xf6\xf6\xdb\xd0\x01\xbb\x3b\xb0\x50\x20\xdc\x3f\x78\x73\x70\x76\xe0\x40\xd9\xf1\x2e\x61\x65\x54\x54\x2d\xba\xcd\x99\x92\x4e\x73\x18\x59\x1a\x28\x7b\xbf\x14\x73\x4a\x62\xe6\x47\xd7\x35\xa9\x19\xe8\x42\xf4\xfb\xbb\x9a\xa8\xeb\x8f\xa7\xbc\xa4\x58\x29\xe8\x9c\x32\x70\xe4\x7e\x19\xd1\x12\xf4\xe5\x9b\xa2\x91\xc6\xa0\x2a\x8b\x82\xfe\x73\xf8\x81\xbc\x0b\xa2\xac\x21\xa2\x8a\x46\x4e\x63\x48\x95\xaf\x2f\x3d\xd0\x21\x00\xc6\xee\xc4\x81\x82\x11\xdf\x0c\xd9\x68\x3a\xd4\x50\x6e\x84\x64\x41\x96\x35\x6e\x7e\x88\x06\x3f\x08\xf5\xcf\x1a\x02\x1d\xb5\x74\x93\x62\xdd\xef\xbd\xa6\x85\x44\x03\xea\x65\x65\x34\x68\x37\x4a\x3c\xa8\x0a\x56\x46\xf4\x6e\x51\xd2\x83\x1a\x6a\x65\x3c\xfb\x4c\x81\x48\x54\x5c\x9d\x2c\x85\x6c\xe9\x08\xb6\x21\xf8\xae\x38\xb6\x0e\xc6\x4c\x34\xa3\xc8\xb6\x8d\xc2\xce\xd6\x34\x2f\xdc\x3a\xc8\x67\xb7\x70\x6b\x91\x5e\x33\xd4\xd5\x56\x8f\x87\x7d\xf5\x20\xd5\xef\x7f\x09\xff\x6c\x17\x49\x35\x48\xfa\x39\xae\x91\xfa\x54\xfd\x94\xd7\x48\x46\xe9\x13\x2c\x90\x6c\x96\x4a\x6d\x5c\xcd\xdb\x67\x58\x29\x61\xa6\x6b\xed\x1e\x24\xab\x2f\x4e\x4f\xb4\x58\x3e\xff\xda\x64\x08\x9c\x6b\x6d\xd2\xc1\xd8\xda\x64\x14\xd9\xd6\x26\x11\x7d\x69\x5e\x9d\x4c\xa0\xcf\x6e\x7d\x7a\xbc\x63\xf9\xca\x16\x53\xd2\xea\xfc\x4e\xd6\xa5\x2f\xae\xe5\x47\x59\x35\x8d\x28\xfc\xe7\xb8\x70\x9a\x5a\xe4\x53\x5e\x3a\x05\xad\x5f\xbc\xcb\x2f\xde\x65\xfd\x59\x7a\x05\xaf\x49\xbe\x6b\x0d\x37\x01\x45\xa6\x44\xa3\xd0\xb6\x8e\xbf\x49\x27\xcd\x6b\xb8\x0a\xf0\xc8\x23\x7b\x76\xbd\x17\xa7\x93\x51\x7d\x7f\xc4\xce\x41\xb6\x09\x32\x32\x36\x47\x5a\xb7\xd7\x8c\xbc\x97\x4a\x87\xd6\xa3\x4a\x34\x1d\x02\xcd\x75\x51\x1b\x49\x9e\xc6\x4e\x9b\x5b\x4a\xe0\x2b\xec\xb1\x14\x40\xd6\xfd\x81\x7d\x41\xe3\x29\x7e\x9d\xe7\x46\x59\xfd\x98\x1d\x7b\x31\x2f\x0a\x3a\xff\xe2\x9c\xde\xc5\x1e\xde\xd8\xb3\xfd\xe1\x0f\xc6\xef\x65\xe5\x5c\x1b\x12\x97\x8c\xab\x40\x4c\xbe\xb5\x02\x9b\x6c\xff\x6e\xd2\x1e\x69\x02\xd3\x24\x2d\xd6\xd5\xa9\x71\x35\xd1\xc3\x4c\x6e\x25\xa7\x9b\xfc\x6e\x38\x53\xa9\x74\x3f\x98\x8c\x8f\x3a\x64\xeb\xc8\x11\xa6\x9e\x76\xac\x32\x3d\xd5\x4b\x8d\xa3\xa2\x2a\x80\x7e\x62\x54\x7b\x63\x1c\x1c\x35\x6a\x3d\x32\xfb\x13\xde\xdc\x5d\x5f\xde\xa5\x25\x13\xd7\x5a\xae\x27\x7d\xcc\x74\x4e\xec\xb2\xb4\x23\x9f\x93\xf2\xce\x3c\xdf\x2a\xee\x58\x77\xbb\xb5\xc4\x81\x3f\xe5\x94\x4e\x9c\xc2\x67\xca\xe9\x24\xaf\x6f\x3b\x5d\x83\xcf\x21\xa9\x93\xbc\x98\xae\x67\x75\x92\xb7\xe8\xed\x8b\x1b\x3e\xf5\xb4\x4e\x02\xd3\x8a\x79\x9d\xaa\xda\xeb\x49\xec\x24\xf1\x37\xf7\xe8\xf7\x92\xd9\x49\xf6\xe6\x31\xa9\x9d\x14\x8e\xff\x7f\xca\xed\x54\x53\x21\x5f\x92\x3b\xb5\x24\x10\xaa\x73\xec\xf3\xc9\xee\x24\xfa\xf6\xa4\xe9\x9d\x54\x9c\xcf\x90\xdf\xa9\x3e\x3c\xce\x04\x4f\x0d\x49\x50\xca\xb5\xc0\x92\x91\xc6\xad\x3b\x39\x4b\xe1\xed\xb3\x25\x25\xe2\xad\xb9\xb2\x3c\x39\x69\x59\x25\x2b\x51\x9d\xb1\x8e\x3c\x4f\x9f\x0d\x5b\x9d\xc9\x9e\xd6\xc1\xd7\xe7\x4e\xf7\xa4\x4c\xcb\x55\xf2\x3d\xd5\xa4\xc1\x96\xf0\x69\x7d\x92\xf0\xb9\x24\x7d\x62\x37\x3a\x0f\xf5\x64\x25\xd6\x0b\xcd\x5c\xe4\xca\x3b\xca\x9d\xee\x36\x3b\xea\x2c\x9b\xe1\x85\xd1\x68\xcb\x74\x64\xe2\x7f\x5c\xbe\x23\xd6\x8c\x2d\xe9\x91\xab\x99\x27\x4d\x7d\x54\x9f\x85\x42\x09\x3c\x79\xf2\x23\x67\x4b\x4f\x9a\xfe\x48\x68\xb0\x35\xe4\x3f\x72\x29\xbf\xa7\x4c\x80\xd4\xb0\xac\xad\x33\x03\x92\xd4\x57\x6b\x48\x81\xe4\x5c\x32\x36\x49\xd3\x62\xb3\xd6\x24\x48\x4a\x77\x57\xde\x9d\xb0\xaf\x65\x6d\x69\x90\xec\x36\xa1\x3d\x0f\x92\x6b\xa1\x7a\x44\x22\x24\x8e\x52\x0b\x17\x2a\x80\x4a\xfc\xc8\x2f\x03\x46\x66\x95\x4f\x2d\x19\x92\x42\x74\x95\x0d\x49\x2d\x54\xd2\x21\xe9\xb0\xab\xe4\x43\xe2\xb1\xa0\xf5\x26\x44\x32\x02\xa0\xab\xdd\x84\x57\x87\xcd\x0c\x11\x6a\x63\x24\xa4\x2c\xaf\x58\x63\x66\x45\xaa\x8b\xc5\xba\xf3\x22\xd9\x68\x7a\xca\xcc\x48\x8d\xf8\xbf\xe4\x46\xd2\x06\xa1\x53\x72\x24\x0e\xeb\xdc\x64\xaa\x5e\x3f\x63\xa6\x93\xaa\xd1\x8f\x94\x1f\x49\xa8\xd0\xa7\x4b\x90\x64\x15\xdb\xc6\x14\x49\x1d\xb3\x9d\x2a\x39\x92\x1a\xda\xe8\x10\x3b\xd5\xb9\x54\x4b\x93\x24\xc3\xc9\x1f\x2d\x4f\xd2\x92\x99\x58\xf9\x10\x8e\x14\xf0\x4e\xf9\x91\x80\xf3\xbd\xc7\xa6\x6f\x5a\x35\x87\xd3\x13\x24\x72\xb2\xb9\x34\x7a\x36\x27\x9b\x37\xd2\xd8\xdc\x33\xa5\x74\x52\xa6\xbc\x6b\x77\xb4\x02\xa9\x84\x5d\x29\x43\x1b\xa0\x5e\x6a\xdb\x51\x67\xaf\x9b\x35\xde\xc7\x50\x78\x4f\x9d\xdb\xa9\xda\x17\x32\x92\x3b\xc9\xb9\xfc\x04\xd9\x9d\x18\xe1\x4f\x98\xde\x89\xcf\x5a\xd2\x6d\xda\x5a\x15\x9e\x4c\xf1\x24\xab\xaf\xec\x25\x38\x06\xa8\x51\x3a\x2d\xc2\x69\x95\x4d\xdb\xf6\x7d\x69\xb6\x2b\x9b\xf3\xa2\xcc\xd8\xb2\x2f\x21\x57\xdb\xac\x0f\xe6\x73\xa7\x15\xbc\xaa\x09\xac\xff\xc5\xda\x36\xb8\xea\xef\x8d\xb5\x41\xca\x24\xa6\x6d\x70\x66\xea\xaa\x36\xf8\xd2\x19\x60\x80\x72\x7e\xa0\x15\x8f\xfb\xc7\xd3\x20\x9f\xf6\x76\x64\xb1\x17\xa6\xe3\x05\xfe\xa5\x7c\x3c\x08\x78\xc0\xff\x68\xfe\xf7\xf7\x87\xa1\xd7\xcb\xd2\x14\xed\x03\xd2\x63\xed\x6f\xd2\xea\xec\x0b\x9f\x91\x3d\xce\x91\xde\xa8\xf6\x57\xdc\xd8\x01\x8e\x81\x00\x12\xec\xd0\xc1\xd4\x3f\xec\x25\x01\x91\x1b\x3a\x94\x91\xc7\x4e\x05\xcc\x3b\x43\x0e\x47\x32\xdd\x9b\xa3\x46\x0d\xf5\x52\x35\x74\xde\x8c\x5c\x07\x53\xb4\x9e\xb2\xf1\xd1\x61\xcd\xf9\xa3\x81\xe6\x6e\xd8\xbc\x06\x3c\x1c\x95\x1a\x70\x89\x16\xba\xd6\xfa\x0a\xb7\x13\xff\x2f\x00\x00\xff\xff\x1f\x41\x30\x6b\x7e\x9d\x00\x00") func uiJsAppJsBytes() ([]byte, error) { return bindataRead( _uiJsAppJs, "ui/js/app.js", ) } func uiJsAppJs() (*asset, error) { bytes, err := uiJsAppJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/js/app.js", size: 40318, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiJsLibsD3335D3MinJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xbc\xbd\x69\x77\xdb\x46\xd2\x28\xfc\xfd\xfd\x15\x16\x6f\xa2\x83\xa5\xc1\x4d\xde\x02\xaa\xc9\xe3\x38\xce\x32\xb1\x1c\xc7\xca\xce\x61\x74\x20\xb0\x49\x22\x06\x01\x1a\x8b\x44\xda\xd2\xf3\xdb\xdf\xaa\xea\x6e\xa0\x01\x52\xb2\x3d\xf3\xdc\x3b\x19\x8b\x00\x7a\xdf\x6a\xaf\xea\xa3\x45\x99\x84\x45\x94\x26\x96\xfd\x41\x3f\x3e\x48\xac\xc4\xfe\x90\x89\xa2\xcc\xe0\xf9\xf8\xd8\x4a\xba\xe9\x75\x22\xb2\x6f\xd2\xb0\x5c\x8b\xa4\xb8\xb9\x49\xba\xf3\xfa\xd9\xae\x5e\x5e\xc4\x02\x7f\x6e\xab\x8a\x8a\xfb\x2b\x3a\x3e\x6e\x7d\xe8\xce\xc5\x22\x28\xe3\xe2\xb7\x48\x5c\x9b\xad\x40\x46\x7a\xad\x53\xed\xba\x11\x61\x25\xac\xa8\x9a\x29\xc6\xc9\xc4\x1b\xf8\xc9\xb8\x98\xe0\x5f\x5e\x4c\xfa\x7e\xbf\xd7\xaf\xb3\x67\x66\x9f\xca\x38\xe6\x9c\x27\x13\xc8\xe1\xbb\x49\x9d\xa9\xac\x33\x1d\x45\xf9\xab\xe0\x15\xbc\xd7\xa9\x51\x9d\xfa\x21\x16\x8b\xc2\xaf\x26\xb1\x60\x82\x65\xac\x84\xb9\x4c\x33\x2b\xc8\x96\xd4\xfb\xbc\x1b\x8b\x64\x59\xac\x4e\x4f\x60\x0a\x32\xde\xb7\xd9\x5e\xca\x43\x48\x29\x79\xa1\x5e\xed\x51\x39\xce\x46\xf6\x87\xab\x20\x7b\x10\xf1\xcc\x2d\xc7\xe3\xf1\x60\x04\xb5\x4f\xa3\x19\x13\xf6\x69\x7f\x92\xf1\xc8\x1d\xf8\x25\x8f\x6e\xd5\x48\xb2\x5b\x96\x45\xcb\xd5\xff\xeb\xae\x8c\xfb\x13\xe8\x84\x4f\xdd\xa9\xbb\x72\x5b\x4f\x55\x6a\xce\xb6\xaa\xb3\x4e\x0d\x30\x15\xfb\x87\xd5\x17\x1c\x2a\x76\x8a\x2f\x07\x23\xbb\x70\xf8\xa0\x3f\xd2\x2b\x5a\xe7\x0f\xe5\x52\xeb\x12\xe2\x41\x04\xc9\xf6\x4f\x97\xff\x88\x90\xf6\x4e\x94\x88\xd7\x59\xba\x11\x59\xb1\x83\xbd\xb6\xc9\xd2\x22\x2d\x76\x1b\x01\x33\x01\x03\x88\x4b\xe1\x17\x53\x01\xdd\x4e\x60\xc4\x59\x70\x19\x0b\xff\x68\x70\x6b\xac\x6b\x0c\x87\xa0\x58\x45\x79\xf7\x82\xab\x3a\xc3\x4c\x04\x05\x6c\x30\xd8\x27\x46\xbe\xbc\x1e\x94\x95\xb8\xbc\xd3\xb1\x61\x13\x6d\x02\xd8\xa2\xd3\xfe\x0c\x1e\xaf\x82\xc9\x55\xe0\x26\xbe\xb1\xa1\x16\x7b\x45\xaa\xac\x49\x37\x8f\xa3\x50\x58\x03\xdb\x2c\xb0\x32\x26\x0e\xdb\xc3\x91\x52\xd7\xea\x2c\x4b\xb3\x4e\x8e\x99\xea\x5c\xc7\xc7\x73\x11\x8b\x42\xa8\xd7\x69\x32\xab\xcb\x6d\x2c\xb9\x9e\x09\x9f\xce\x46\xd5\xec\x3f\xa8\xca\xda\x30\x75\x65\xbe\xb2\x16\x56\x61\xdb\x7a\x15\x8c\xae\x5d\x55\xe5\xfb\x07\x8b\xbb\x6e\x72\xa0\xd4\xdc\xaa\x17\x2e\x31\x72\xab\x53\x36\x50\x45\x8e\x8c\xa3\xba\xfe\xc4\xf5\xd8\x99\x9b\xac\xfe\x7c\x86\xbb\x05\x36\xa9\x4e\x32\x40\x1d\x76\x22\xe3\xa2\x1b\x6c\x36\xf1\x0e\x8e\x4a\x75\x0a\xaa\xf1\x66\xb0\x38\xc5\x24\xf1\x33\x63\x33\x6f\xe5\xf6\x8b\x60\x62\x70\x00\x89\xad\x77\xe8\xa8\x80\x03\x13\xae\x82\xec\x59\x61\xf5\xed\x6e\x91\xfe\xba\x81\x4d\xf8\x3c\xc8\x85\x65\xbb\x45\xb5\xbe\xd5\x6c\x09\xde\x67\x19\x9f\x07\xea\x40\x8c\xb2\xb1\x18\xb9\xae\x90\xfd\x2a\x21\x01\xb6\xa9\x5b\x8c\xa0\xa1\xb2\xd1\x50\x69\x74\xe6\x12\x86\x51\xbf\x5d\x34\xde\xae\xe9\x5c\xd5\x50\xd8\x38\x64\xd0\xae\x60\x25\xf7\x06\x0c\x8e\xb3\x6e\xdf\x75\xcb\xd3\x68\x64\x5b\x05\xcf\xa6\xe5\xac\x9b\x26\xf6\xf1\x71\xa1\x27\x07\x16\xe0\xc0\xfc\x24\xb7\x72\x20\xd3\x19\xd4\x98\x88\xeb\x07\x71\x75\x5e\xa1\x3c\x37\xc0\x50\xa9\xa0\x07\x4b\xa1\xc1\xa5\x28\x60\x57\xe9\xac\x7b\xc0\x67\x38\x49\x8f\x8f\x53\xa8\xc0\xb7\xe0\xc1\xc2\x27\x8e\x8b\xcd\x04\x2c\x96\x9c\xc6\x3e\x74\x5c\x74\xa3\x64\x2e\xb6\x3f\x2d\xac\xd4\xb6\xbb\x61\x9a\x84\x41\x61\xe9\x0c\x00\x8a\x6c\x9b\x65\xdd\x4c\xac\xd3\x2b\x81\x7b\x98\x95\xc7\xc7\x42\xee\xe9\xac\x9b\x63\x0f\xd8\x07\x68\xa2\xbc\x85\x24\x80\xeb\xcc\x80\x30\xe7\xb8\xe5\x82\xae\xb8\x42\x6c\xb4\xc9\xe8\xf7\x1b\x89\x76\x2c\x63\xc7\xbd\x35\x37\x33\x83\xd5\x57\x45\x46\x09\x6c\x84\x3c\x2d\xb3\x50\xbc\xa0\x77\xbb\xe0\xc9\x01\x40\xf6\xa2\x09\xf8\x70\xfe\x2e\x98\xdc\x15\xed\x39\xc1\x8d\x71\x0a\x20\xb8\x98\x56\x29\xb0\x3b\x66\xfc\xda\x98\x47\x98\xf2\x45\x3d\xe5\x00\xf7\xf7\xf7\x3c\xac\x42\x91\xed\x14\x1c\x2f\xcd\x3e\xd6\x9d\x2f\xbb\x05\xb4\x21\xa0\x3f\x4c\x7f\xe3\x25\x2b\xa6\xf0\x1d\xa0\xe8\x4c\x6d\x08\xac\xfe\x16\x40\x6d\x10\xc7\xbb\x6a\xae\x00\x13\xdd\x36\x26\xf2\x99\x71\x26\x77\x00\xe7\xd9\x45\x00\x93\x5d\xa7\xbf\xaa\xd3\x3b\xfa\x63\x07\x8e\x1c\x34\x94\x2e\x1e\x24\x70\xf2\x8c\xe3\xaa\xea\x39\xc3\x7a\x70\x3f\xda\xc6\x39\x78\xfe\x1f\x54\xb4\x3d\x54\xd1\x7b\x85\x5c\x6a\xba\x42\x41\x1f\xb9\x91\x9e\x15\x45\x16\x5d\x96\x08\x7d\x6c\x93\x9a\x38\x9c\xe9\xd5\x39\x20\xa0\x7c\x13\x84\x82\x01\xda\x4b\xc3\xc0\x84\x57\xa5\x2e\x04\x7b\xd1\xa8\x16\x5a\x37\x69\x8c\x03\x79\xf6\x6b\x6d\x94\x49\x15\x64\x13\xfc\xae\xc3\x2b\x09\x1e\x31\xb9\x63\x5c\xfe\xa1\x5e\x09\xdb\x44\xd8\xff\x4d\x0b\x07\x26\x65\xbf\xc5\x03\x63\x84\x1e\x68\xa8\x83\x9b\x35\xc9\xbb\xef\xca\x20\x8e\x16\x08\xf7\x99\x6c\x10\x40\xb5\xcc\x3c\xc9\x7c\xe1\x1f\xd8\x08\x75\x86\xc0\x4f\x7d\xfd\x1c\x01\x10\xa8\x06\xf7\xae\x41\xab\x40\x77\x00\xff\xc0\x10\x36\x31\xf4\xc5\xea\xfd\x3b\x77\x7b\x4b\xd6\x79\xd0\x31\xa6\xe3\xa5\x59\x02\xce\xf0\x1b\xb1\x7c\xb1\xdd\x58\x1d\x6b\xe2\xff\x7d\xf3\x6f\x28\x61\x77\x5c\xe8\x70\x26\xde\x95\x29\x4d\xb0\x8b\x49\x98\x70\xf3\x85\xdd\x61\x9d\xa5\x59\xd9\x2f\x0d\x12\x01\x28\x04\xdd\x85\x7c\x13\x47\x85\xd5\x83\x1a\xa1\x0b\x46\x81\x37\x07\x36\x6c\x8d\x61\xbc\x01\x41\x8e\x72\x64\x27\x00\x2f\xe4\x3a\x15\xad\x9d\x6b\xe6\x06\xd0\x73\xd7\x9a\xee\xd5\x03\x00\x20\xe1\xd8\xdf\xee\x3a\xd8\x58\xdf\xd8\x23\x89\xb7\x92\x0a\x9f\xdd\x75\x1c\x0b\x5c\x9e\xba\x0f\xdf\xe0\x90\x25\x08\xc4\xa9\x1c\xb5\x81\x16\x41\x32\xc4\x82\x00\xf1\xc3\x38\xc8\xf3\x97\x51\x5e\x68\x64\x98\x4d\xca\x6e\x30\x9f\xe3\xb6\x2d\x35\xb0\x4f\x74\x57\x04\x62\x9a\x7a\x17\x77\xa8\x74\xc7\xbe\xb9\xe9\x74\x46\xd9\xc4\x02\xf2\x36\xc8\x8b\x1f\x10\x89\x00\xd0\x2d\xba\x85\xc8\x0b\x00\x91\x37\x37\xa2\xb9\xfb\x55\x39\xf6\xce\x2a\x5d\x58\x7a\x17\x48\x2c\xdb\xbf\x3b\x4f\xb5\x5b\x0a\xda\x28\xb6\x09\x5e\x5e\x6b\x6a\x64\x1f\x76\xe4\xc5\x2e\x16\x6a\x08\x35\xfd\x7a\x10\x60\x50\x4e\x68\xbe\xce\x46\x95\x36\xe1\x86\xa4\x6e\xee\x3f\xa1\xd9\xe4\xbe\xa6\xfd\x3b\x5b\xcb\xcc\xd3\xa8\x8e\x5e\x76\xf8\xc0\x35\x0e\xd7\xaf\x07\x36\xab\x41\xa2\x36\x08\x54\x3d\x31\xf0\x91\x17\xcd\x59\xf8\x34\xe0\xd3\xac\xd8\xd7\x75\x89\x76\xc7\xef\x80\x14\x25\x50\x7d\x55\xab\xff\xec\xd1\x52\x72\xc3\xd2\x0c\x35\xb8\x57\x40\xe0\xf4\x31\x09\xd6\x82\x00\xd8\xaf\x6f\x7e\xd0\x5b\x1a\x00\xa2\x22\x5e\x15\x93\x0c\x60\x0e\x00\x1c\x4c\x74\xf3\x73\x63\xd9\x45\x8d\xb1\xf6\x5b\xdb\xab\x6e\x0f\xdf\xdc\x8b\x14\xad\x7d\x50\x6a\x2b\xa0\x08\x6c\x52\xdd\x87\x6f\x2b\x62\x9f\xba\xb0\x09\x32\x6c\x2d\x9d\x8b\x51\x82\xec\xbb\xdc\x39\xcf\x57\x51\x3c\xb7\x24\x42\xad\x4a\x7e\x6f\x70\xc9\x17\x17\xf3\xa0\x08\x2e\x2e\x80\xc3\xa9\x33\xfc\x64\x40\xcf\x7d\x1c\x7d\x19\xc8\xe5\x4d\xcc\x43\xf4\x83\x51\xa4\x4d\x28\xdd\xdc\xc0\x98\x84\xcd\x4c\x0e\xb8\x9e\x3f\xa0\x00\x27\xf0\xa9\xab\x7b\xc2\x44\xf5\x68\xfb\x47\x85\x77\x24\x8c\x66\xfe\x6c\xf1\x99\x44\x98\x25\x26\xb5\x2e\x5c\xd7\xd6\xc9\x25\x50\xa4\x08\x1b\x81\xc0\xed\xb3\x80\x47\x3a\x5f\x30\x4e\x47\x29\xe4\x03\xf0\x15\x4d\xd3\x19\xd2\xd4\x56\xc9\x52\xe8\xd5\x01\xf6\xe8\xaf\x36\xbd\x74\xde\xa4\x97\x7e\xab\x40\x25\x13\x7b\x70\x12\xf8\x7c\x16\xc9\xe4\x14\x7a\x90\x00\x73\xde\x2d\x37\x30\x3a\xc1\x42\x5e\x71\x19\xd8\xdf\xe8\x88\x0b\x20\xac\x05\x8f\x80\x6a\x05\xf6\xbf\x1c\x73\x98\x1a\x20\xfc\x4b\xa0\x9a\x47\x47\x56\xca\x83\x69\x81\x5d\x75\xdd\xe2\x34\x1c\x55\x3d\x4d\x8d\xd9\xf9\xe3\x20\x24\xab\x4f\x05\x8c\x75\x44\x95\xd6\x24\x00\x11\x9a\x08\xbc\x05\xec\x60\x2a\x5e\x74\xbf\xb0\x99\x79\x4e\x61\x82\xf6\x8f\x7a\xc9\x43\x58\xc6\x2c\xa8\x05\x18\xc8\x91\x76\x61\x97\xc6\x72\xbb\x11\x15\x87\x68\x60\xaf\x05\x59\x27\xd0\xaf\x65\xf7\x0b\xdc\x16\x25\x70\x91\xc5\x3e\x9c\xc4\x53\x6b\xa2\xee\xbf\x2f\x2e\x60\x42\xa7\x7f\x77\x67\x07\x90\xf7\x17\x9d\x9a\x87\xcb\x34\x0f\x6b\x23\x3f\x08\xac\xcd\x3a\x28\xc2\x95\x25\x6c\xdd\x73\xea\x41\x06\x53\x71\xd7\x34\x14\xd3\xc1\x8c\x51\xff\x9a\x33\x91\xcd\x6e\x89\xb9\x4a\x79\x07\x3b\x03\x58\x07\xd7\xb4\x62\x79\x3a\xdd\x8e\x0d\xcb\xfa\x05\xec\xaf\x3e\xca\xd4\x78\x52\x71\x46\x81\x2d\xf1\x5f\xcc\xdf\x06\xc4\x6a\xd5\x38\x35\xa6\xac\x31\x14\xfc\xda\x66\xc1\x84\x80\x9c\x5f\x4c\x2e\xfd\xa8\x9e\x93\x2f\x1a\x92\xb4\x1a\x0b\x57\x18\x45\x33\x0a\x15\xd5\x2f\x80\x3b\xe8\xcf\x24\x68\xd0\xc7\x69\x84\x7c\x46\x62\x42\xe8\xe2\x00\xbf\xd0\x90\x12\x7d\x2d\x1b\x96\x67\x4d\xf6\x62\x6f\x8f\x27\xe6\x16\xa3\xe3\x98\x89\x18\x76\xf8\xfc\x17\xe2\x59\x46\x19\x49\xb4\x00\xc6\xdd\xdc\x3c\x3d\x86\x2d\x92\xae\x11\x56\x69\x68\xf9\x3a\xcd\x23\x09\x14\x6c\xc2\xf2\x72\x07\x35\x81\xcb\xef\xf5\x48\x3b\xdd\x79\x16\x2c\xf3\x72\x03\x2c\x60\x9e\x7b\x1d\xf7\x81\xeb\x3e\x0b\x80\x6f\x06\x64\x1f\x85\x6f\x3b\x6e\x06\x67\x1e\xc6\x92\xc3\xb2\x85\xc0\x4f\xe2\xb2\x03\xaf\x6a\x75\x8a\xb4\x0c\x57\xb8\xd4\x98\xe5\x5c\x7e\xa3\xaa\x80\xb3\x2a\x8c\x6f\xb2\xa0\xf1\x15\x99\x7d\x89\x96\x5e\x04\x30\x92\x17\x01\xef\xa4\x89\x99\x2b\x42\x24\x72\x34\xf0\xb7\xc8\xe8\x22\x62\x66\x9d\x32\x17\xd9\x39\x65\x01\x5a\x83\xbd\x08\x14\x04\xe0\xb8\x64\x2a\x4f\xc0\xd3\xe9\x8b\x60\x36\xa2\xbf\xbc\x93\xa4\x89\xe8\xdc\x1e\x98\x5a\x68\x3d\xea\x12\x24\x21\xd9\x0a\xa3\x4e\xc8\x42\x08\x87\xf4\xdc\x1b\x60\x9a\xb2\x97\x32\xfb\xed\x48\xbd\x19\xe9\xc0\x49\x33\xe4\x99\xd9\x11\x80\x19\xa0\x21\x7e\x89\xd6\x22\x2d\x91\xf7\xee\xdb\xe6\xda\xff\x8b\x58\x8c\x0f\x02\xe5\x27\xc9\x12\x96\x13\x67\x50\xe4\x04\xa4\xda\x1f\x61\xaf\xc9\x0d\x8e\xcb\x4f\xd8\xf0\xfc\xb7\xef\x14\x06\xbc\xb9\x49\x70\x0e\x33\x85\x17\x21\xe1\x75\x1a\x25\x85\x3e\x8d\xed\xef\x16\xcd\x78\x7f\xfc\x2a\xd0\xc2\x4d\x3a\x2d\x34\x0f\x79\x98\xa5\x71\xfc\xc7\xcd\x8d\x7e\xfc\x13\x0e\x85\xb1\xdc\x9d\xcb\x74\xbe\x03\xfa\x1c\xb6\xb8\x48\xe6\xb0\x98\x57\x40\xc8\xcb\x09\xb7\x3e\x6c\xd4\x4e\xf3\x3b\xc1\x65\x9e\xc6\x40\x21\x76\x58\x91\x6e\xfc\x3e\x23\x51\x71\x9f\xad\x61\xbf\x46\x09\x3c\x6c\x00\x6c\x45\xc9\x12\x9e\x2e\xd3\x6c\x2e\x80\x8a\x92\xcb\xc3\x3a\xd1\x7a\x93\x66\x45\x90\xc0\xba\x8e\xe4\x92\x66\x30\x74\xf8\x3f\x1e\xea\x73\x18\x88\x48\x9e\xff\x72\x06\x43\x78\x15\x70\x80\xd9\xdd\xc5\xcd\x4d\xda\x15\x86\xd0\x03\x66\x58\x2d\xf2\xab\x60\x02\x74\xe9\x16\xa6\x72\x13\x2c\xc5\x1f\x00\x6d\x76\xea\xf9\x4f\xdb\x57\x29\xb0\xa7\x61\x02\x75\x9a\x7c\xfb\x13\x20\x26\x2f\x11\xa8\x65\xd1\xf6\x97\x2c\x48\x72\x00\x7c\x6b\x20\x32\x9a\x3d\x00\xa8\x74\x25\x32\x94\x73\xd9\x6c\x0a\xb5\x61\x1d\x33\x82\x5e\x08\xb2\x20\xef\xd7\x69\x99\xe0\x28\x9f\x53\xad\x6f\x70\xfa\xf4\xd9\x9e\x56\x2d\x7b\x88\xa3\x16\x85\x97\xa8\x0f\x2f\xe1\x85\x55\x3d\x81\x54\x98\xc0\x2a\xf1\x97\x74\x63\xd0\x8a\xdf\x19\x34\x92\x96\xdb\xec\x6d\x9a\x6e\x34\x87\xef\xd1\x22\x12\x06\x61\xf7\xa3\xc9\xbc\x8d\xfb\x93\x81\xdf\x97\xba\x03\x43\x02\xf9\x73\x53\x84\x68\x21\xb4\xf3\x50\xca\x6b\x3b\x96\x00\xf0\x0d\xcf\x83\x99\xed\x11\x28\x97\xcf\xf8\x5d\xe7\xa9\xeb\x49\x1a\x9a\x90\xf1\x60\xd2\xf7\xbd\x01\xb4\xf6\x2e\xf0\xcf\x82\x62\xd5\x0d\xc2\x34\x6f\x90\x7e\x45\xbb\xc0\x9b\x40\x96\xf0\xde\xe8\x22\x79\x94\x34\xa9\x45\xa3\x88\x05\xb0\x9e\x72\x09\xc0\x69\x40\xd9\x79\x83\x5e\x62\xf7\x86\x06\x89\x7d\x4f\x66\xb7\x9d\xb9\xbc\x2b\xf3\xd0\xa1\xba\xed\x1e\x30\xac\x03\x93\x09\x29\x1a\xa2\x69\xca\x4f\xdd\xed\x0d\x6d\xdb\x31\xa8\x9a\xb4\x68\xc8\x2d\x83\xa2\x25\xb2\x45\x58\x0f\x78\x16\x20\x60\x12\x22\xe5\x1a\x14\x13\x49\x56\xac\xb8\x2b\x71\x7c\x37\xe7\x6e\xc1\xae\xd2\x48\xd2\x9f\xdd\x98\xbb\x00\x8b\xfd\x03\x92\xc5\xa4\x55\x11\x62\x7d\x6c\xb0\xbb\x02\x92\x39\x47\xb2\xd9\xf6\x2f\xe1\x70\x23\xbe\xbd\x28\x58\x50\xd8\xbe\xce\xd2\xe2\xb1\xc2\xe2\x00\x05\x64\x2e\xd7\xc9\xe3\xfe\x24\xf1\x38\xfc\xe0\x9e\x42\xcc\xeb\xe2\x8b\xcd\x1e\xe3\x16\x8b\x5c\x2b\xf5\x22\x98\x87\x1e\xa4\x0f\x9e\xe2\xa7\xd4\x1f\x3e\x34\x93\x2c\x78\xf5\x60\x11\x20\x43\x74\x50\x2b\xf5\x80\xe6\x34\xc3\xc3\x65\x0d\x1f\x3d\x72\xb0\x7d\xfb\x56\xc9\x59\x2b\xf2\x92\x6b\xdd\x15\xec\x37\x2b\xf9\x92\xfa\x70\x0a\x5d\x73\xb1\x67\x28\xb7\x94\xe9\x05\xa6\xf7\xc7\xa8\x2a\x2b\x60\xab\x0d\x7c\x24\x8a\xfa\x63\x01\xef\x82\xde\x05\x90\xb6\xdd\x47\x63\xe0\xac\x84\x63\x0d\x5c\x98\x19\xe1\x16\x9e\x70\x0a\xc0\x82\x43\x47\x78\x29\xc3\x99\x5a\x03\x79\x8b\x1b\x61\x88\x74\x25\x8a\x66\xe0\x8f\x87\x6f\xa6\x8a\xe5\x63\x2b\x1c\xef\xaf\x70\xf8\x1f\xad\x70\x2c\x57\x38\xd6\x2b\x1c\xca\x15\x6e\xe4\x59\x14\x93\x25\xa6\xc7\x90\x16\xc0\xbf\x4b\xdb\x87\x77\xd8\xb1\xd7\xf4\x17\xa9\xbf\xe5\x25\x71\x46\x80\x17\xbb\x4b\xca\x61\x9b\xb9\x75\x0b\xad\x0d\x92\xb7\x47\xa9\xd7\x81\x88\x30\x98\x1e\x3d\xef\x44\x7a\xc3\x3b\xd6\xb3\x00\x2a\x82\xd1\xb2\x12\x30\x70\xf8\x37\x81\x0d\x33\x5c\x1f\x1e\x78\x33\xda\x58\x7c\x6c\x26\x17\x7a\x26\xe3\x6a\x26\x83\xe6\x4c\x5e\x7e\xda\x4c\x2e\xe4\x4c\x2e\x5a\x33\xd5\x9e\xed\xbc\x35\xd3\x72\x0e\xd7\x45\x6b\xfe\x7c\x5d\x57\x6b\xce\x56\xd5\x78\x24\x82\xc7\x9d\xf4\xd8\xee\x0d\x06\x8f\x01\x11\x65\x6e\xd1\x7b\xd4\x47\xd1\x7f\xe6\x89\xde\xb0\x5f\x29\x07\x4b\xbe\x41\xc1\x8d\xf3\x47\x00\x24\x21\x3c\x66\xb6\xf3\x45\x00\xd9\xe0\x11\x8e\xd1\xd7\x81\xde\x98\xf3\xc2\x3a\xe9\xc2\xa1\x7a\xf8\xe8\xe1\xd0\x29\xbd\x41\xf7\xd1\xc9\x93\xc1\xc9\x53\x38\x38\x5e\xf7\xe1\x57\x4f\x1f\x9d\x0c\x1e\x3a\x11\x90\xe1\x85\xe5\x75\xbf\x7a\xfc\xd5\xf0\xf1\x63\x07\x38\xa2\xee\xd3\x27\x8f\xfb\x83\xfe\x53\x27\x73\xbb\xfd\x87\x83\x47\x8f\x1e\xab\x4c\xdd\x3e\x3c\x3f\x3c\x79\x08\x55\x75\x87\xfd\x87\xfd\xe1\xa3\xaf\x20\xcf\x00\x3e\x3f\x19\x0e\x1f\x0d\x21\x97\x31\xb2\x65\x7b\xa5\x10\xdb\xa8\x9d\x23\x41\x39\xcc\xe2\x10\x16\xbf\xb0\x9d\xd7\x81\x5a\xf0\x77\x00\xa1\x0b\xa7\x70\x85\x23\x90\xfe\xd2\x3b\xad\xdf\xeb\x33\xfc\x67\x02\xfe\x4d\x13\x57\x40\x87\x1e\x3f\xfd\xea\xa4\x7f\xf2\x70\x92\x38\xf0\x1f\x9c\x7c\xef\x61\x6f\xf8\x95\xdd\x7b\xd2\x7d\xf2\xf4\x49\xff\xe4\x89\xa1\xca\x6b\x15\xed\xf7\x9f\x3e\x7d\xf4\x78\x42\x5d\xd8\xa4\xd7\xd0\xef\x41\xef\xc4\xf6\x75\x41\x27\x71\xb1\x26\x43\xa9\x57\xdc\x0d\x92\x60\x92\xfa\x27\xfd\x87\x63\x9e\x4c\x06\xc3\xee\x57\x80\x2b\x7c\x9c\xa0\x47\x4e\xa3\xf6\x61\xf7\xa1\xed\xe1\x67\x73\xc6\xd6\x1f\xdb\xdb\x6b\xbd\xb7\x33\xfe\x3f\xff\xa3\x36\xf7\x12\x1e\x9b\xbb\xfb\x7f\xfe\xe7\x53\xb6\xf7\x5a\x6e\x6f\x6c\xd3\xdc\xa6\x1a\x15\xac\x0b\x16\x2a\x54\xb0\xde\xdf\xb5\xbb\xa2\x25\x02\xc6\x3c\xe3\x31\x6c\x5a\xf8\xfb\xf4\x18\xe6\x81\xc1\xbf\x63\x73\xb9\xce\xcc\x22\x54\xde\xed\x74\x0c\x25\xa3\x99\x3c\x78\x0c\x48\xa1\xd3\xef\xb8\x34\x67\xeb\x60\x6b\xe1\xd2\x03\x39\x74\x0e\x64\x59\xb2\xb4\xe0\x84\x48\x6a\x60\x0d\x00\x02\x1b\x6b\x25\x1a\xea\xc2\xe6\xf1\x42\x81\x81\x92\x57\xf4\x81\x27\xec\x13\xe9\xcc\x7b\xd6\x34\xf0\xde\x03\xe7\xfb\x6f\xcb\xea\x3a\xf6\xbf\xed\x5e\x04\x78\x5e\x84\x78\x84\xf3\xeb\x08\xf9\x5b\x38\x8b\xd3\xe1\x4c\xc9\xa4\x3b\x0c\x58\xd1\x0c\xc9\x9e\x0f\x61\x90\x8b\xce\x2a\x8f\x3b\xbe\x96\x78\x59\xc0\x7f\xe5\xe2\xdb\x38\x05\x0c\x5a\x22\x39\xc4\x1a\x1f\xa0\x50\x6f\xd0\xef\x37\x3f\x0e\xe5\x47\x7b\x44\xd5\x01\xf0\xad\xaa\x2b\xac\xb7\xba\x9a\xb7\xaa\xb8\x7c\x80\x22\x5a\xd4\x65\x45\xfc\x3b\xc5\xf7\xc2\x2c\xbc\x4c\xaf\xb5\x0e\xd6\xb6\x27\x00\x0f\x60\x75\x23\x58\xdd\x08\x57\x57\xf1\x5a\xc9\xcd\x4d\xe7\xff\x74\x8e\xe0\xa1\x56\xdf\x02\xd9\x4f\xd0\x19\x80\x08\x76\xed\x07\xa4\xdd\x2a\x15\x2e\x83\x49\x85\x1c\xd6\x43\x34\x1b\x51\x1b\x6a\x62\xa5\xdc\x3a\x79\xfa\xb0\x7f\x1c\xd9\xe3\xf1\x43\x98\xd6\x14\x7e\x6e\x50\x12\x33\xc4\x8f\xf0\x1b\xe0\x87\x00\x26\x7a\xf0\x08\xde\x43\x1e\x9e\x9e\x3e\xbc\x09\xe1\x60\x19\xd5\x20\xc3\xc5\x61\xd1\x9e\x00\xc8\x7b\x2a\xeb\x82\x6d\x14\x70\xeb\xf1\xa3\xa1\x7a\x7f\x0a\x45\x71\x3b\x01\x78\x01\xde\x0a\x1a\x60\xa1\x79\x6c\x2e\xf6\xd7\x98\x57\xbb\x23\xe9\x61\x51\x56\xc8\x1f\x41\x3f\x36\xf4\xb5\xda\x59\xb2\x28\x72\x8c\x1e\x76\xd1\x4a\xdd\x08\xa8\xc0\x4a\x55\x0b\x6c\x04\xd2\x00\xe1\x24\xe8\x51\x92\x0f\xbf\x43\x0f\xa9\x15\x64\xc6\x39\x4f\xe1\x44\x7a\xc2\xee\x05\xae\x25\x80\x94\x78\xec\xf7\x6d\xbf\xa0\xcf\x02\x29\x99\xc0\x1d\x22\x20\x2a\xf0\xe9\x21\xcb\x1c\x0e\xa4\x88\x8f\x26\x28\x00\xcc\x4a\x1e\xa2\x28\x63\x00\x95\xf7\xfd\x4c\x62\x43\xd8\x0e\x38\x80\xd0\x18\xde\x75\x35\xbc\x84\x9f\xe3\x29\x01\x02\xe6\x1c\xd5\xc9\x40\xad\x9c\x23\x0b\xae\x58\x43\x00\x6a\x56\xf7\xe1\x60\xf8\x10\x40\x34\x40\xac\xee\xc9\xa3\x27\x8f\x9e\x3c\x1e\x00\x30\xed\x02\xb5\xf5\xf0\xe4\xc9\x23\x80\xa9\xbd\x3f\x02\xe4\x70\x28\xef\x70\x30\x7c\xfc\x64\xf8\x15\xe6\x7d\x32\x78\x34\x78\x34\x1c\x62\xde\xfe\x93\xe1\x40\x66\xfd\x02\xb2\x46\x32\x6b\x7f\xf0\xd5\xc9\xc9\x09\x65\x1d\x0c\xbe\x1a\x7c\x45\x39\xbf\x7a\x84\x80\x6e\x80\x59\xbf\x0e\x6a\xc9\x45\x61\xc1\x4a\x22\xb2\x79\xcc\x00\x77\x39\x56\xe6\x95\x36\x1b\xe2\x53\xe9\x35\x10\xc4\x79\x83\x5c\x96\x2b\x73\xca\x01\xe3\x00\xba\x9a\x24\x3d\x82\x9e\x7e\x05\x35\x01\x31\x12\xbc\xec\x11\x34\x65\x08\x40\x0d\xc5\x74\x51\x0b\x4a\x8c\x93\x55\xc9\x81\x3a\x5f\x76\xb8\xb1\xdb\xf5\xde\x03\x1a\x7e\x62\x82\xef\x2e\x80\x69\x00\x7a\xa6\xc6\xba\xf8\x0f\xf4\xac\xa6\xb4\xf7\x59\x71\x48\xdc\x4b\x56\x4a\xd5\xe7\x21\xf4\xad\x0d\xae\x8f\x8f\x0f\x34\x27\x48\xd8\x23\x50\x76\x47\xe2\x8a\x57\x05\xd5\x94\xa0\x66\xca\xd0\x31\xab\x0d\x83\x2d\xec\x89\x16\x91\xfc\x0d\x81\x69\x0f\x8a\x32\x47\xe8\x77\x54\x1c\x1f\xbf\x2f\xac\x10\x4e\x77\x31\xe6\xb0\x4c\xc7\xc7\x27\x7d\x20\x8a\x6f\x6e\x60\x6d\x51\xae\x24\x15\xe8\x09\x57\xc2\xa3\x08\xf7\x66\x48\x32\xbf\x7a\x00\x88\x7d\x1e\x00\x2b\x9e\x65\x69\xa6\xb3\x41\x97\xd2\x2e\xac\xc2\x5c\x7f\x00\x64\x20\xe2\x5c\xb4\xf3\x85\x8a\x7e\xe7\x1f\x6e\xe1\x58\x02\xed\x39\x8f\xf2\x0d\xd5\xdf\xb9\x14\xc0\x7c\x8b\x5c\x24\x73\x80\xb8\x9b\x2c\x5d\xa2\x54\x0a\x1e\xb1\x56\xf8\xa1\x6a\x3a\x78\x74\xa1\x68\x48\xe2\xcc\x3f\xce\x5e\x7e\x5f\x14\x9b\x37\xe2\x5d\x29\xf2\x82\xc5\x34\x4f\xda\xc4\x86\xd0\xe3\x1f\xdf\xa4\xeb\x20\x4a\x54\x0e\x80\x83\x00\xdf\x57\xcf\x33\x41\x9c\x72\x10\xe7\x28\x70\x0a\x6f\x6e\x8e\x7a\x7f\x5b\x2b\xa8\xc9\xca\xed\x89\x6f\x4f\xfe\xdd\xfb\x77\xaf\x27\xd5\x65\x09\xc2\x41\xd5\x5a\xa3\x2e\x9b\x75\xd2\x84\xba\x86\x55\x4c\xc2\xae\x7c\xe3\xf8\x40\x5d\xe5\xa5\x8f\xcf\x99\x08\xe6\x3b\x5c\x00\x21\x19\x76\x53\xba\x14\x76\x29\xf5\x1c\x53\xc7\x27\xc7\xc7\x25\x4a\x92\xb0\x90\x1e\x3d\x3f\x20\x18\xdc\x13\x4f\x26\x24\x8b\x4c\xbb\xba\x90\x31\xd5\x7b\x02\xc9\xe2\xf6\x16\x50\xc3\x0a\x5a\x15\x99\x51\xb9\x21\x10\x4d\xb8\xd6\xcb\x9a\xb8\x65\xdf\x82\x6e\x38\x09\x50\xeb\x64\x69\x2d\x93\x92\xed\xd2\xc7\x80\x74\x5a\x50\x0b\x8b\x6c\x6c\x6f\x1d\xad\xc5\x2f\xb0\xa7\x1b\xc3\xb9\x43\xc1\x01\x00\x96\x2b\xb4\x35\xc1\x5f\x3f\x91\xf5\xc0\x31\x85\x9a\x60\x7c\x1b\x94\x18\x7e\x7a\x6d\xb0\x29\xb0\x74\x6c\x96\x3e\x54\x52\x60\xbe\x5b\x36\xed\x00\x66\xc5\xfd\x97\xe6\x45\x67\xd6\x85\x1d\xf9\x22\x80\xcd\xd9\x90\x22\xe2\xe8\xf6\xc1\x40\xd4\xc5\xad\xab\x24\xc2\x11\x83\x4c\xda\x66\xa7\x29\xd9\x87\xb3\x0b\x80\x96\x32\x37\xac\x59\xd0\x84\x08\x4e\xe8\x27\x43\x87\x8c\x4c\x18\x33\xc4\x4b\x04\x1d\x60\xdf\x6c\x04\xd6\x94\x90\x30\x52\xad\x0b\x6c\xf9\x20\x0c\xc5\x86\x44\xab\x01\xec\xe5\xa0\x2b\xdf\x71\x7d\x98\xd3\x73\x50\xcc\x8e\xda\x4f\xb5\xad\xbf\xa7\xad\x51\x69\x7d\x90\x1e\x7d\x10\xd8\xfb\x39\xac\x9c\x05\xd3\x7c\x56\x2b\x79\xa0\xb9\x23\xd4\xb2\x40\x37\xae\x60\xff\x47\x73\x71\xa6\x56\xfd\xd0\x37\xc4\x67\xb2\x08\x8a\xec\xc3\xe6\xba\xc6\x3a\xad\x3c\x3e\x26\x91\xab\x3a\xfb\x30\x43\xf4\x26\x01\x82\xb9\x24\x25\x6d\x43\x84\x39\x80\xec\xbb\x35\x20\xa9\x8f\x02\x0d\x12\x80\xbe\xd6\x0b\xd3\xd6\x02\x2c\x1c\xe1\xbe\x08\x2e\xd3\xac\x38\xb0\xa4\xa1\x4c\xb1\x28\x1b\x69\x49\x2e\x23\xa8\x03\x68\x4a\x3c\xfc\x1d\x3d\xc9\xd9\x24\xf2\x23\xa2\xc8\x9e\x23\x6f\x66\x20\xaa\xe7\x0d\x32\xd7\xa4\xa6\x9a\xfa\xbb\xc4\xaa\x95\xb5\x52\xd6\x6c\x5a\x49\xbe\x37\xd0\x5d\xd2\x98\xaa\x51\xad\xf8\xeb\x14\x62\x5b\x20\x91\x87\x36\x20\x3a\x8f\x6f\x64\x87\x64\xc3\x0a\xa4\xa8\x34\x9e\x2f\x71\x7c\x05\xff\x05\x7e\x3c\x00\x25\xe3\xe1\xc3\x89\x15\xe5\xdf\x46\x49\x54\x08\xc9\xbc\x87\xb1\x08\xb2\x4a\xb2\x0d\x73\x59\x84\xdc\x90\x75\xbf\x2b\x18\x9a\x9f\x25\x40\x60\x23\xc9\x09\xe4\x1f\xcb\x42\xf8\x6a\x4e\xc4\xcb\xba\xbd\x6f\x00\xd8\x75\x13\x40\xf1\x52\xcb\x24\x42\xfe\x63\x30\x12\xe1\xc8\x4e\xc6\x5c\x84\x5d\xd4\xa9\xc1\xcf\x02\x9f\x81\x24\xf7\xf0\x13\xd4\x0e\xd9\xe0\xe9\x90\xc9\xe5\x2f\x45\xcb\x4c\xed\xc7\x00\x30\xe6\xa0\xd7\x1f\xa1\x61\x5a\x77\x31\x29\x10\x92\x74\xd1\x66\x2d\xf1\x7f\x0c\xe8\xc7\x2a\xba\xc5\xa9\x54\x11\xc2\x13\x0e\x1f\x05\x21\x76\xb7\xd6\x24\xfd\x1c\x00\x3c\x30\x8c\x38\xde\x14\x4d\x03\x6c\xcf\x4a\x24\x2d\x11\x8a\x28\x96\x0c\x6e\x9c\xa2\xad\x6a\x8f\x9e\x5f\xbe\x1a\xc0\x64\x98\xd2\xc2\x6f\x0a\x53\xfd\x53\xd1\x39\x83\x3e\x3b\x71\x96\x81\xf5\xd4\xab\xcd\x50\x3f\xe4\xb0\x6d\x85\x5f\x8c\x9f\x4e\x0e\x00\xaa\xa4\x27\x6e\xfd\x43\xdf\x1d\x71\xcb\xf2\xdd\xfa\x32\x8d\x1b\x0a\xe8\xd7\x8d\xdd\x33\x17\x61\xb4\x46\x6b\x23\x78\x2e\x56\x69\x99\x07\xc9\x5c\x2a\x9a\x96\x40\x15\x6d\x80\xa3\x62\x68\xe2\x12\x96\x59\x26\x92\x70\x87\xb2\x08\x54\x2a\x37\x51\x45\xa5\x13\xae\xf6\x33\xe4\x9b\x6a\xd5\x30\x4a\xf1\x89\xdb\x2a\x91\xde\x95\xfa\xbb\xd0\x0d\xdc\xc1\x18\xd7\x36\xa8\x69\xf1\x01\x2b\x3c\x20\xed\xe1\x00\x92\xd5\x22\xf0\x1f\xe5\x65\x2e\xb9\xba\xd2\xe3\x01\x2b\xdd\x00\x52\x8f\x2c\x28\xcd\xa1\xb8\x3d\xc6\x29\xb2\xb1\x81\x14\x09\xf7\x81\xfd\xa5\xb6\xed\x9c\x8d\x2a\x20\x8c\xd6\x8c\x24\xaa\xef\xfe\x93\x46\xa8\x23\xba\xf5\x77\x77\xa9\xd9\x04\x8f\x42\xcd\xfa\xa1\xc9\x28\xf0\x5b\x00\x2f\x1f\x74\x60\x20\x02\x58\x2e\x78\x1e\x77\x60\x40\x62\x7a\x82\xcf\x5e\x07\x46\x25\xa6\x0f\xf1\xb9\x03\xc4\x86\x98\x3e\x9a\xb1\x9c\xbb\x62\xfa\x78\xc6\x60\xbf\x4e\x9f\xcc\xd8\x0a\x7e\x9e\xce\xd8\x12\x7e\xbe\x9a\xb1\x0d\x1c\x85\x2b\x0e\x99\xe7\xf8\x67\xcd\x8f\x06\x6c\xc7\x8f\xfa\x23\xc5\x65\x22\x33\xb4\xe2\xee\xca\x18\x37\x1a\x75\x5a\x31\x34\xd0\x47\x0a\x16\xa6\xbe\xc3\xf1\x21\xc5\x63\x18\xf3\x8c\xc3\x77\xe8\x1c\x7c\xb4\xd9\x52\xb1\xa3\x49\xc7\x5f\x40\xa5\xd0\x66\x67\xd9\x19\x5d\x02\x45\xf1\x56\x32\x96\x5f\x76\x7c\xe8\x00\x30\x9f\xd0\xfa\x97\x1d\x4c\x5f\x34\xd2\x37\x7b\xe9\x59\x23\x1d\xd8\x52\xfa\x4d\xd5\xef\x56\xfd\xfe\xd1\xf1\x81\x9d\x84\x5e\x85\xd0\xa9\x2b\xec\x92\xbb\x6c\x71\xa2\xb2\x82\xb0\xe3\xc3\x70\x07\xf2\x65\xde\xf1\xd7\xd8\xcd\x15\x6c\x0c\xa3\x91\x1c\x3b\xe1\x0d\x64\xeb\xb7\x9d\x2f\xea\x7a\x91\x0d\x86\xae\x49\x26\x18\x12\x8f\xf8\xf2\xe6\x06\xed\x1f\x68\xa0\x1a\x45\xe0\x1c\xc2\x2b\xe7\xcb\xc9\xca\xdc\x59\xb5\xbc\x60\xc0\x56\x36\xc0\xa5\x8e\xc0\x4c\x30\xb3\x0b\xfc\xb5\x69\xea\x0d\x79\x43\x9d\xbf\x8f\xf9\x61\x19\x96\x3c\x0d\x09\xa8\x2f\x81\x04\xfc\xb5\x20\xb6\xeb\x0c\xd1\xd5\xe2\xee\xed\x34\x47\x1a\x7b\x7d\x7c\x9c\x7c\x39\x50\x06\x5c\x9d\x8e\xb2\xd5\xea\x8f\x81\x0d\xef\x23\x0a\x38\x3e\xee\x8f\x07\xbd\x64\x02\x20\xc7\x4b\x18\x6c\x2b\xdb\x87\x3f\x88\xf6\x27\x9d\x8e\x1f\x48\x8d\xdd\x46\x56\x19\x22\xbd\x87\x3a\xa9\xa0\x78\x9d\x89\x45\x84\x0c\xec\xca\x1e\x25\x48\xd4\x23\x90\xc0\x8d\x2b\xf0\x85\xce\xbd\x3b\x97\x34\x77\xe2\xf0\x0d\xe4\x59\xca\xcc\x58\xcf\x96\x5d\xb2\x0b\x3c\xad\xda\x20\x4c\xa9\xd8\x65\x63\x17\xb2\xb1\x6b\xbe\x9b\xb4\xb2\x08\xe8\x9c\x37\x18\xf5\xc7\xd7\x13\x6b\x0b\x10\xf1\x12\x8d\xfa\x7d\x7c\x34\x36\x6d\x9f\x5d\xdb\x90\x62\x7e\xba\xb6\x15\xf9\xdf\xce\x79\x81\x39\x0b\xd7\xfc\x78\x41\x46\x19\x38\xb1\xb0\x28\x5b\x1e\x59\x5b\x06\xd0\x5b\x29\xf9\xcf\xf9\x95\x3a\xe3\xee\x56\x3f\x5c\xea\x07\xeb\x0c\x58\xe9\x52\x3b\x71\xb0\xb7\x3c\x1f\x9f\x93\x98\xeb\x59\x96\x05\x3b\xeb\x9c\xe7\xde\x39\x54\x2e\x21\x41\x06\xd3\xdc\xd1\x4b\x77\xa6\x9a\x7a\xeb\x6e\xd9\x5b\x8d\x93\x73\x4f\xd7\xec\x53\x07\x00\x00\xf1\x2b\x96\xf0\xad\x7b\xc9\xac\xce\x29\x1d\xc4\x49\xe9\x26\xee\x5b\x1f\x00\x03\xbd\xbd\x75\xe1\xdd\xef\xfc\xad\xde\x1a\x43\x3d\x1f\x8f\xf9\xc0\x76\xa9\x80\x91\x70\x6e\xfb\x25\xf6\x3c\xf1\xdf\xa2\xa5\x9d\x2b\x4c\x3d\xf1\xaf\x0d\x49\x5b\x43\x64\xf6\x4f\x51\x3b\x0a\xe0\x18\x11\x8f\xee\xb9\xbc\x8c\x07\x13\xc2\xaf\xbf\xfe\xf2\xfc\xb0\xf5\x58\x2d\x28\x6c\xea\xee\xbe\x3d\xa4\xed\xa9\xd0\x15\x5a\x14\x00\x80\x8c\x80\xba\x1c\xd4\xce\x03\x5e\x31\x2e\x3c\x01\x24\x4b\x66\x6a\x6f\x0c\x79\xa6\x85\x25\xb1\xaf\x61\x68\x09\x0f\x61\xdb\xc0\x36\x91\x6a\x24\xb5\xe2\x55\xf6\x84\xab\xcc\x2e\x6e\xeb\x86\x65\x50\x4a\x56\x79\xda\xfc\x87\x93\xe6\x25\x40\xd7\x0e\xd4\x65\x8f\x07\x44\xb0\x8e\xb2\x71\x3a\xb2\x85\x95\xda\x5f\x46\x37\x37\x81\xc2\x2a\x7a\xaa\xdc\x54\xc9\x93\x60\x04\xb4\x35\xeb\x22\xf7\x65\xd5\x8c\x45\xc3\x9f\x47\xce\x14\xb2\x5d\x61\xc8\xff\x29\xb4\xb6\x1e\xca\xc3\x8b\x9e\x1e\x5c\x27\x96\x5a\x99\x12\xa6\x2a\x56\x0c\x0a\x60\x1b\xb7\xb7\x49\x77\x11\xa7\xc0\x26\x26\x2c\x91\x02\x09\x8e\x72\x59\x24\x27\x78\x09\x0f\xe9\x62\x01\x34\x16\x8f\x30\x95\xf8\xc6\x74\x24\x01\x42\xd2\x2d\x81\xfe\xfa\xde\x34\x7b\x09\x55\x55\x21\x50\xb9\xb2\xaa\xef\x91\x10\x85\x37\xaa\xee\x7b\x54\x1e\x20\x7f\x20\xab\xfc\x1e\xb5\x06\x98\x93\xaa\x0d\xcc\x59\xfe\xfe\x2e\xf1\xc5\xa7\x0c\xb6\x60\x68\x59\x21\x6c\xf4\xde\x69\x0f\xd6\xb0\x87\x2b\x5a\xa6\x86\xcd\x37\xd3\x20\x4d\x89\x6f\x81\xb0\x08\x10\x45\x20\x49\xe1\xba\x01\xba\x09\x9c\x3c\xa9\xe4\x3b\xcf\xd3\xb9\x78\x56\x58\x81\x4d\x9e\x14\x9a\x90\x20\x41\x66\x88\xa6\x42\x0a\x4f\x00\xab\x94\x87\x53\x51\x0b\x85\xa0\x26\x1b\x4d\xc0\xac\xd6\x37\xc0\xbf\x11\x7f\x35\x15\x2a\x2d\x42\xfb\x19\xa2\xcd\xcb\x09\xa1\x10\x2e\x26\x40\x21\xf8\x80\xf5\xfc\xd2\x46\x6e\x83\x9a\x14\x68\xac\x84\x34\x4a\x65\x4a\x76\xa8\x2b\xa9\x84\x44\x00\x42\x6f\xb5\x7d\x47\xc3\x96\xf8\x41\xd1\x25\x71\x96\xe1\x58\xa2\x15\x45\x1f\x76\xfe\xe0\x2b\xc0\xd5\x6b\x1f\xf0\xb5\x3f\x60\xdf\xc3\xef\x19\xfc\x3b\x87\x7f\x2f\xe1\xdf\x5f\xc4\x37\xdc\x02\xf1\x26\xd0\xbc\x85\xa1\x01\x0a\xb9\xd6\x1c\xd5\x5e\x6e\x06\xab\x36\x02\xec\x0f\x9c\x1d\x99\x13\x75\xbf\xe7\xf0\xef\xcb\xc1\xd0\x1d\x0c\x9d\xac\xbb\x91\x80\x37\xe2\x72\xe2\xb2\xee\x5f\xc0\xc0\x85\xc0\x58\xfc\x53\xc0\x62\xc0\xb2\x5b\xd1\xe4\x9f\xc2\x0f\xc3\x4a\xda\xf6\x0f\x55\x35\x49\x91\x49\xfc\x16\x0a\xfd\x09\xec\x02\x54\xbb\x63\x7d\x96\x75\xff\x01\xb0\x7b\xad\xdb\xea\xfc\x4e\x4f\x80\x85\x7f\xa5\x07\x7b\x62\x1d\x2a\x35\xc0\xa9\xda\xff\xac\x4a\x4f\xe0\xf5\xda\x7d\x6c\x7f\xf9\xc4\x7d\x02\xfd\xfd\xdd\x83\x3a\x00\x4f\x7f\x03\x10\xdf\x76\x1f\xc1\x67\x1f\xd3\x31\xe9\xd7\x46\x12\x96\x00\x4a\x60\xbf\xe6\xac\xbb\x86\x7f\x73\xd5\xe8\xf7\x69\x99\xe5\x38\x2b\x2e\xfc\xf9\x0b\x05\xf5\x37\x7d\x34\x3a\x39\x73\xe1\xf5\x4b\xa4\x97\xb2\xee\x39\xfc\x7b\x09\x84\x2b\x8c\xf9\xc2\x4f\x6f\xd1\xb6\x5a\xe9\x23\x0e\x70\x91\x49\xc3\x65\x44\x18\xd2\xba\xda\xb4\x92\xa5\x4a\x47\xa1\x17\x0b\xe9\x4b\xbd\x39\xc2\x71\x30\x22\xd9\x40\x36\x06\xde\x58\xd6\x0a\x48\x99\x4c\xc6\x8b\xc6\x21\x70\x5d\x9b\xd1\xd9\x90\xb2\x84\xb4\x76\xd8\xa2\xa4\x88\x3f\x9f\xa6\xc8\xd1\xe7\xe1\xa4\x91\xe2\xa7\x33\x76\x04\x30\xd3\x42\x18\x9f\x50\xef\xec\xd3\x7e\xd5\x94\x44\xe5\x72\x37\x09\xb3\xc1\x0c\xca\xd6\xb9\x34\x2c\x68\xb8\xa1\x4a\x50\x79\x61\x9a\xa2\x2b\x08\x72\x21\x49\x6f\xed\x39\x26\x6a\x37\x3c\x58\xe2\xa4\x7b\xcd\xaf\x89\xfc\x42\x76\xa2\x45\x5e\x32\xe1\xd2\x57\xb5\xaf\x81\x42\x69\x98\x0f\xc8\x26\xb7\x07\x9a\xdc\x7e\xac\xc9\xcb\xff\xa4\xc9\x48\x37\xf9\xe2\x40\x93\x2f\xee\x6f\x72\xcd\x9f\xfd\x27\x4d\xa6\xba\xc9\xf3\x03\x4d\x9e\x7f\xac\xc9\xb7\xff\x49\x93\x12\xed\xd5\x52\x60\xdc\xc8\xaf\xba\x61\xad\x89\xb3\x29\xb9\xe5\xc7\xba\x57\x60\x7b\x77\x81\xf8\x60\x81\x3f\xee\x2e\x90\x37\x95\xe9\x67\xd2\xf1\x4e\x0f\x1b\x06\xc3\x87\x76\x9b\x33\x69\x18\xc7\x67\x68\x09\x85\x4e\xb4\x9c\x2c\xfe\xb1\x9a\x05\x32\xc9\x80\xb3\x50\xba\x01\xcc\x8a\x7c\x01\x66\x00\xd8\x65\xfc\xb2\x81\x87\x8d\xc8\xa2\x14\xb8\xe6\x2b\x4a\xdd\xe5\xc0\xa5\x00\x9c\x5f\xa5\x19\x02\x9a\x1c\xf8\x3c\x98\xe3\x34\x29\x56\x39\x70\x7b\x2a\xe1\x8c\xde\x47\x05\xe1\x6e\x93\x6f\x30\xe1\x42\x1b\xc9\x16\x8a\x1c\xaa\xb1\x03\x52\x14\x48\x96\xed\x23\x58\x65\xbb\x6a\x10\x05\xa2\x8d\x4b\x0e\xd4\x9f\xc9\x3c\x46\xa9\x02\x7d\x22\x0f\x20\x70\x26\x6a\x10\x97\x55\x8f\x40\xcc\x01\xec\x5b\x97\x71\x11\x71\x1a\x9b\x7a\x0e\x84\x62\x97\x80\x7b\x41\xe7\x19\x9b\x6d\xf9\x9f\x85\x75\x85\xc4\xff\x5f\xf4\x7b\x81\xef\x00\x72\xaf\xf1\x1d\x7e\xcf\xf1\x7d\x8d\x34\xfc\x5f\xf4\xfb\x02\xdf\x77\x36\x7b\x86\xef\x3b\x7b\xb4\x39\x20\x8a\x45\x51\xc4\x19\xb9\x3a\xb6\x34\xa1\x68\x8b\x2b\xb1\xd8\x2b\xfe\x21\x38\x24\x2c\x99\x4f\x93\x0a\x31\xcc\x6e\xd9\xb3\x43\x79\xae\x9a\x79\x2e\x0f\xe5\xd9\xc9\x3c\xb4\xbc\x94\xeb\xeb\x43\xb9\xd6\xed\x5c\xa1\x5f\x58\x0b\x1b\x10\xf9\x41\x11\xfc\x0f\x85\xa5\x5a\x2e\x68\x30\x6c\x68\xc3\xfc\x7f\x46\xde\xef\xef\xcf\x2b\x31\x9c\xce\xfc\xc3\x27\x65\x06\xf2\xe0\xe6\x66\x30\x54\x65\xfe\xb9\xb3\xcc\xc0\x0d\x42\x3c\x14\x3f\x2d\x08\xbd\xa2\xfa\x92\x9d\x40\x89\x97\xf7\xb7\x72\x16\xc5\x71\x94\x8b\x30\x4d\xe6\xb2\x67\x58\x66\xfd\x91\x32\x72\x3a\xdd\x81\xea\xd4\xd9\xc7\x9a\x48\xca\x42\xd4\xe3\xde\x1c\x5a\xa9\xcd\xd4\x6d\x0c\x1b\x38\xb8\x21\x2e\xd8\xf9\xfd\x75\x9f\x1b\x3d\xc7\xba\x7f\xbd\x33\x3b\xcc\x4e\x0e\x04\x7a\x73\x82\xb0\xc8\xf5\x41\x99\x5e\xb5\x01\x6f\xd9\xef\xf7\xd5\x09\xf0\xe6\x40\x9d\x5b\xd8\x66\xc0\x17\xff\xe1\xa3\x10\x83\xed\xee\x1f\x43\x45\x12\xd9\x44\xe4\xc8\x1a\xfe\xfc\xf4\x32\xe2\x21\x94\x79\x08\x65\xfe\xf2\x23\xc1\x50\xfa\xb4\x47\x0a\xc1\x47\x80\x24\xcf\xf1\x4c\x66\x70\xe6\x4a\x38\x53\x11\x9c\x98\x14\xce\x43\x00\x87\xe1\x67\x80\xe5\xf8\xe7\x7b\x1f\x20\xee\x0f\xf8\xe7\x1f\x3f\x11\xb0\x75\x4a\x01\x7b\xe1\xc7\x02\x56\x58\x00\x04\xf6\x73\x58\x8e\x4c\xc0\x24\xff\x51\xc0\xb4\xfd\x56\xc0\xd4\x7c\x51\xc0\x60\x43\x18\x69\x0c\xc3\xfc\xbd\x80\x7e\x7f\x5d\x40\x47\xfe\x55\x50\x47\x52\x71\x7b\xc0\x3d\xf9\x87\x96\x2d\x16\x9a\x26\x76\x3c\x20\xed\x3b\x40\x45\x5b\x80\x1a\x12\x9f\xac\x56\x18\xba\x12\x37\xe9\xf4\x0c\xd5\xff\x91\x21\x6a\x10\x5e\x54\x09\x1a\x0a\xe0\xf9\x81\x37\x30\x1c\x6d\xda\xe6\x33\x95\x1b\x86\x35\xf1\x3b\x6e\x42\x20\xb2\x76\xc2\x50\xd5\x74\x6e\x3a\xd0\x3a\x3a\x50\x46\xa6\x03\xe5\x5f\xc5\xbe\x57\x35\x8a\x73\xc9\xb7\x31\x69\xbb\x53\x4b\xe8\x08\xdc\x4c\x0b\x40\xd6\xde\x39\xc6\x84\xfc\x56\xcb\x00\xc2\x03\x64\xc5\x22\x6c\xd1\x15\x80\x60\x07\x7b\x14\x14\x11\x10\xf7\xd1\x11\x7f\x7c\x66\x2b\xad\x16\x7e\xfd\x78\x0b\x5f\xfc\x77\x2d\xfc\xfe\xf1\x16\xbe\xfe\xfc\x99\x7a\xd8\x6a\x65\xf7\xf1\x56\x7e\xff\xfc\x56\x86\x7b\xad\x7c\x07\x6c\x6d\x46\x16\x45\xf7\xb4\xf4\xaf\x96\x29\x5a\xef\xef\xa9\xeb\xcd\xfe\x3d\xff\xf0\xf0\xf6\x0b\xa5\x08\xc7\xe0\x0f\x75\x3b\x8f\x6c\x1b\xab\xff\x8b\x7b\x05\xbd\x35\x6a\xfb\xae\x29\xc4\xb2\x92\xf1\xe3\xa7\x13\xe4\x5e\xfd\xa1\x38\x31\xb6\xf2\x8f\xff\xfd\xf8\xd6\xa4\x6d\x80\xbd\x7f\xcf\xe0\x7e\xfe\xef\x9b\x99\x7f\x7c\xb1\x12\xf1\xd9\xad\x9c\xb4\x5a\xf9\xe7\xe3\xad\x14\x9f\xdf\x4a\x7b\x2c\xdf\x7f\xbc\x15\xf1\xdf\xb7\x72\xf6\xf1\x56\xb2\xff\xbe\x95\xf3\x8f\xb7\x52\xfe\xf7\xeb\xf2\xf2\xe3\xad\x44\xc2\x54\xb2\x2d\xa5\x72\xf4\x7d\x9a\x88\x9f\x48\xe6\x86\x10\x97\x17\xe3\xbe\xc4\x2f\x6e\x07\x40\xf5\x32\x00\x44\xd1\x7b\xdc\xbf\x41\xcb\x30\x7a\xf9\xf2\x71\x65\xf0\x2b\xdc\x1f\xd0\x32\x0c\xb5\x3d\x43\x1b\x9f\x4b\xf5\x6c\x70\x80\xd5\xb8\x56\x87\xc6\xb5\xfa\x18\xb0\x6e\x0c\xa6\xc9\xe8\x89\x16\x86\xd1\x22\x89\xca\xdd\xbe\x90\x6e\xf2\xda\x29\xce\x52\x2f\xfb\xee\x6c\xfb\xee\xa5\x90\x73\x74\x84\xc6\x94\x18\xd8\xc3\xc6\x0f\x50\x61\xa5\xbe\xc3\x2e\x21\x7b\x63\x30\x91\xa2\xe1\x3b\x11\x8b\x26\xce\x16\xdd\x9c\x27\x6e\x81\xc6\xd3\x5e\x42\x86\xd3\xe5\x08\x38\x15\x9e\x00\x3e\xb6\x0a\xcf\xc4\xc2\xb9\x0a\xa1\x95\x1c\x1f\xcf\xc3\xee\x2a\xc8\x7f\xba\x4e\x8c\x38\x4a\x68\x55\x61\x63\xd2\x54\x3e\xcf\x5a\xa1\x2a\x16\xa2\x65\x76\x28\xa3\xcb\x54\xb6\x65\x82\xb4\xd9\x45\x37\x8e\x12\x71\x8e\xbe\x6c\x96\xad\x23\xce\xe0\x28\xcb\x19\x30\x4a\x1b\xf2\xc9\xa2\xbd\x84\x53\xc0\xd0\xc8\xd4\x1e\xc9\x32\x2f\x92\xb9\x19\x7b\x65\x25\x4c\x75\x71\x13\xb9\xcb\x86\x36\x69\xbc\x5b\xa6\x49\xdd\x16\x61\x7c\xec\x26\x7a\xe9\x16\x28\xbb\xae\x32\xb5\x2a\x5f\x8a\x56\x20\x34\x9a\x17\xb4\xc5\xc7\x28\x2f\xce\x37\x41\x6f\xe8\xbe\x0b\x7a\x0f\x47\x4a\xfa\xef\x65\xa8\x11\x1d\x73\x74\x1f\x82\xae\x04\x3c\x75\xd0\xe7\xb6\x32\xe3\x2f\x6c\x16\xd7\xfe\x2f\xf0\x96\xf3\xc8\x89\xd9\x82\x97\x4e\xe8\xe6\x4e\x95\x2f\xb0\x81\xa3\xce\x9d\xd4\xa9\xf2\x06\xf6\x68\x17\x52\x80\x03\xc3\x46\x7c\xc5\x16\x36\xd9\x5b\xa2\xcd\x24\xcc\x71\x7c\xab\x7c\x58\x19\x59\x7b\x8e\xce\x42\x39\x93\x35\x6b\x9b\xb2\x00\x58\x41\xfd\x19\x78\x64\x0e\xf8\x2a\xb5\x61\x24\x50\x45\xdd\x3c\xb7\x04\x0f\xec\x7a\x7c\xb6\x36\x1d\x95\x5d\x01\x16\x22\xd4\x6b\x61\xca\xf1\xa4\x04\xdc\xd8\x94\x1b\xf3\xb4\x13\x64\xe0\x09\xad\x67\xdd\x56\x45\x60\x4d\x33\xc7\x9c\xa7\xcc\x31\xe7\xa9\x7a\x16\xb6\xe1\xed\x75\xd5\x0c\xf6\x86\x2d\x38\xe8\x93\xe5\x62\x23\x0e\x7a\x61\xc1\xd3\x10\x9f\x86\x46\xa9\x79\xa3\xd4\x54\xe5\x1d\xa2\x97\xd6\x50\x96\x62\xea\x49\x79\x6e\x51\x2a\x53\x4f\xca\xb3\x8b\x52\x8d\x4a\xd7\xfa\xd0\x60\xf3\x1c\x13\x19\x66\xc3\x47\x55\x1f\x3e\x9a\xdd\xd8\xb5\xbb\x81\xd5\x33\x59\xb7\xea\x80\x91\xfb\xcc\x98\xc9\xda\x25\x80\x0a\x25\xd5\x88\x93\x6a\xc4\x09\x1d\x18\x4c\xe9\x71\x59\xa9\xfc\x1d\xe2\xaf\x61\x5d\x2e\x6a\x02\x64\x6a\x6c\xac\x44\x76\x1a\x89\x21\x74\x3d\xc3\xca\x8c\xbe\x5c\x36\xa7\x1d\x60\x32\x66\xf5\x70\xd0\xf6\xe9\xf3\xe0\xf8\x98\xbe\x0c\xf0\xcb\x80\xbe\x18\x36\xc9\xc2\x38\x43\x23\xc3\xc4\x83\x56\x9d\x9c\x5c\x46\xd7\x00\x84\xeb\xad\x80\x0a\x2e\xc7\xf0\x7a\x61\xc6\xb6\x30\xad\x81\x2b\xa8\xe3\xba\xdb\x90\x5d\x84\x2e\xb7\x12\xef\x22\xb4\x7b\xf0\x76\x8d\x6f\x85\x77\x2d\xdf\xce\xf1\x4d\x78\xe7\xf4\x66\x98\xdd\xee\x9d\xf5\xd2\xec\x67\x54\xf7\xb3\xa4\x7e\xc2\x49\x8f\x1a\xdd\x0c\xf4\xbb\xea\x68\x58\x1f\x99\xb2\x3a\xf7\x72\x7e\xeb\x15\xb4\x62\x2e\x9c\xd0\xcb\x1c\x38\x6e\xb1\x8b\xa6\x0b\x4e\xea\x15\x4e\xa8\xde\x0a\x27\xf0\x84\x03\x07\x34\x86\x95\x70\x52\x57\x38\x81\x9b\x41\xea\xe8\x12\x06\x11\xb3\xb7\xf8\xd7\xb1\x0a\x97\x4e\xb1\xcd\x5e\xc8\x77\xe1\xd2\xf9\xb5\xd9\x33\xf9\x0e\x5c\x58\xc6\xd1\x80\xe4\x5a\x28\x13\xdb\x1a\x50\x8c\xde\xed\x01\x09\x8a\x1e\x50\x56\x23\x4f\xeb\x91\x47\x72\x85\xa0\xb1\x7a\xe4\x25\xa2\x6c\x03\x52\x95\xb6\x3e\xde\xf8\x16\xd9\xec\x5d\x0d\x6e\xea\xf6\x0d\x1b\x65\x9c\xf7\x2a\xcf\x85\xa1\xf5\x7c\x71\x27\xf4\x3d\xbc\x73\x10\xf6\xb6\x56\x44\xdc\xb5\x22\x04\x89\x01\xea\x7a\x91\x13\x10\x14\x4e\x61\x0d\x42\x80\xc4\xb0\x12\x5e\xe9\xa4\x6c\x65\x1c\xb3\x18\x16\x23\x77\x72\x77\xe1\x2c\xd0\xdc\x01\x96\xc8\x2d\x61\x21\x22\x28\xb0\x41\xc3\x0a\x2f\x41\xb9\x41\x6f\xc5\xae\x78\x03\x3a\x2f\xed\xd1\x2b\x58\x81\x0d\x80\xf8\xe7\xf4\x9b\xb3\xf7\xf4\xbb\x60\xb8\x7e\x57\xb4\x7e\x57\x6a\x7d\xf4\xfa\xc1\x7b\xe9\x5a\x65\xb5\x7e\xf0\x0e\x28\x3a\xd2\xeb\x27\x83\x3b\xb4\x00\xfd\xfe\x1a\x12\xa0\x87\x75\x62\xa8\xb8\x34\x56\x20\xad\xa6\xcf\x40\x4b\x81\x5c\x56\xd8\x23\xf5\xf4\xa5\x68\x0f\x1f\xd6\xd3\x97\xb6\x70\x80\xd1\x17\xac\xff\x4e\x6c\x60\x26\xbe\x15\xcc\x5c\x68\xc3\x1a\x5c\xec\xc5\x83\x31\x0d\xc1\x51\x3b\x8e\xef\xac\x20\x77\x5a\x86\xf6\x47\x75\xd8\x19\xe9\x74\x4c\xf2\x58\xfd\x64\x09\xf5\xd8\x30\x1c\x35\xea\xd3\x59\x65\xb5\x02\x63\x97\xe8\x0f\x75\x03\x0d\x15\xfc\xab\x3a\xfc\x8a\x19\x94\xf0\x79\xa5\xa6\xaa\x22\xdb\x49\x03\x2f\xa9\x71\x4f\x0e\x1b\xc6\x2e\xac\x23\xcb\xaa\x09\x46\x6f\x60\x9f\xf2\xbe\x6d\x84\xa0\x20\xca\x07\x7e\x0a\xaa\xe5\x52\x4e\x07\x1c\xca\x06\xd5\xa4\x29\xc6\x00\x88\xd9\x62\x1c\xa0\xce\xd7\x2e\x15\xed\x84\xda\xda\x69\x30\xb3\xab\xd1\x8c\x4c\x9b\xf4\xd2\xa0\xa4\x94\xb2\x5c\x5c\x3f\x78\x27\xc8\x28\x96\x2c\x44\xd1\x32\x36\x36\xbe\xe2\xb7\x90\x1d\x01\xad\x14\x76\x53\x80\x3c\xca\x14\x2d\xac\x14\xbb\x68\x58\xab\xf3\x67\x55\x2d\x03\xa3\x96\xac\xaa\xa5\x4f\x4a\xf6\xc3\xb5\xdc\x92\x65\x6a\x8e\xd6\xa4\x70\x46\xdf\x0b\x84\x20\xef\x05\x6d\x3f\xcd\x50\x7c\x30\x06\x8e\x96\x66\xd0\x44\xaa\x49\xbe\x58\xcd\x43\x0a\x83\xef\x0a\x1e\xf2\xa3\xb0\x9a\xa7\x9c\x2d\xe0\x58\x47\x30\x25\xa3\x51\x5d\xc9\x92\xaf\xe0\x14\x1f\xf5\x47\xcb\xee\xd5\x08\xa3\x77\x58\x4b\xbe\xec\x26\x18\xc4\x53\x6b\x82\x47\x39\x7c\x79\xcf\x9a\xb3\x3f\x4f\x71\x1d\xa1\x10\xa4\xa5\xf0\x17\x2d\xcb\xba\x82\x16\x77\x63\x9b\x3d\x8c\x79\xde\xee\x5d\xb5\x4a\x0b\x9e\xeb\x55\x5a\xd0\x2a\x91\x02\x31\x83\x6a\xb7\x50\x5b\x02\x7f\x07\xb0\xaf\x46\xd4\x23\x52\x2e\xca\xea\x3f\x60\x87\x36\xdd\xf7\xc6\x16\xc8\xab\xbd\x34\x0a\x80\x00\x1d\x79\xde\x3d\xcd\xdc\x36\x9a\xd9\xc0\x5f\xaf\x6a\x67\x73\x8b\x7f\x53\x26\xc7\x0c\x33\xb3\xb9\xbd\x5e\x45\xc0\x4f\x1c\xc1\x58\xed\x91\xb9\x75\xcc\x70\x79\x42\x6d\xec\x7a\x57\x9b\x61\x26\x61\xfb\x72\xe4\xdf\x70\x63\xc3\x0c\x64\xc8\x19\x95\xdd\x84\xe3\x2e\xcd\x60\x87\x76\x37\x18\x9a\x85\x8b\x91\xfe\xd8\x57\x1f\x8d\x26\xde\x19\x1a\x61\x32\xef\x41\x3b\x2b\x7a\x78\x0f\xb4\x8d\x0c\x89\x84\x21\x48\xf0\x41\xf0\x4c\x3e\x5c\xa1\x2d\xa1\x8c\xc3\xa4\x42\x16\x91\xba\xde\x30\xb8\x35\x6a\x6d\x73\x65\x84\x08\x0d\x55\xa2\xc1\x4f\x95\xf4\x82\xa1\x6f\xa5\x19\x27\x34\x88\x13\x8b\x76\xd8\x72\xce\x8b\x56\xa4\x3c\x83\x49\x29\x65\x48\x93\xb9\xca\x69\x40\x1c\x43\x25\x68\x7f\xd8\x29\x48\x19\xb0\xb9\xb9\xf1\x4c\x35\x60\x9d\x29\x55\x99\x5a\x0c\x4c\xae\xda\x95\xa7\x6b\x0a\x2f\x2a\x64\x46\xd5\x8b\xed\x3d\xbd\x58\x58\xa4\x1d\xae\xdb\x06\x04\x37\x35\x08\xc1\x15\xa4\xe7\xd6\x95\x0c\x46\xc1\xe8\x17\x6d\x10\xb7\x75\x4f\x46\xda\xd6\x78\xdb\x45\xe3\xe8\x84\xf8\xfb\xb3\xee\x65\xb9\x58\x88\xcc\x22\x5b\x52\x7d\x36\x60\xef\x40\x37\x53\xd4\x81\x6d\x64\x77\xaf\xb0\x3d\x82\x19\x19\x9e\xcb\xc1\x31\xa2\x7f\x8e\x1d\x95\xa6\x82\x06\xab\x07\xdb\x37\xe5\x52\xd5\x9f\x8d\xfb\x72\xe7\x5d\xde\xdc\x58\x51\x8b\xfb\x63\x97\x1c\xa1\x4f\xd4\xe2\x3e\x53\xe4\x08\xf5\xca\x59\xb8\x4d\x53\x79\x5a\xc8\xa8\x72\x14\x99\x7b\x5e\x1e\x9d\xf1\xe0\xf8\x78\x78\x5c\x54\x91\x44\x85\xec\xba\x11\x7d\x74\x15\x2d\x0a\x8b\xec\x23\x75\x8e\x45\x14\x17\x30\xea\x5f\x84\xf2\xcd\x5f\xb2\x0d\xbb\x62\x73\x4e\x66\x46\x6b\x5e\x6a\x14\x54\xf1\xbd\x36\xdb\xf1\x0f\xd4\x29\x3f\x65\x55\x8f\xfd\x90\xa9\xee\xf8\x31\x33\x87\x67\xea\x11\xf4\xbe\xc8\xd9\xae\x1e\x2b\x5f\xa8\x37\x44\xc6\x40\x9e\x20\xa6\xda\xe0\x8a\xb2\x9a\xfd\x3d\x54\x49\xda\xa8\x24\x34\x2a\x89\xa1\x12\x54\x5d\x8a\x0c\x58\xe5\xa5\x5a\x6e\xfe\xad\xb0\xd6\x6c\x03\xe0\xa4\x72\x2e\xb9\x67\x2d\x00\x83\x2e\xd9\x37\x88\x78\x04\x1c\x37\xdb\xc7\x00\x09\x9f\xba\x74\x4c\x28\x7f\x06\xfc\x33\x80\xe2\xcc\x58\x2a\x28\x01\x55\x45\x0d\xd6\x1e\x2b\x19\x20\x0d\xa7\xc0\x00\xcb\x37\x2b\x91\x09\x73\xd0\x7b\xed\x7e\x7a\x8b\xac\xd9\xd8\x2d\xf0\xc9\xfc\x8d\x20\xa5\x6e\x61\x9d\xc9\xc6\x35\x1e\xde\x19\x90\xed\x17\x71\x20\x2e\xf6\xd8\x90\x34\x61\x25\x95\x9b\xda\x54\x4b\x81\x3e\xd4\x5b\xc2\xe8\x7f\xa1\x0c\xaa\x20\x1f\x2a\xef\x68\xf7\x34\x2d\xd4\x54\x40\xe7\x29\xbc\x60\x16\xbd\x99\x2e\x99\x3c\x96\x66\x65\x2a\xc0\x5e\xa5\x03\xc1\x1d\xa3\x63\xf0\xde\xb2\x4c\xa0\x02\xa6\xd9\xb8\xee\x3c\x92\x63\xd4\x4c\xd1\x3c\x19\x45\x7d\x32\x4c\xfc\xf1\x4d\x83\xa7\xb4\x28\x8e\xd5\x16\x8f\x20\x06\xa8\x40\x5e\xf2\x4d\xe0\x3d\x0f\x7c\xf8\xab\x62\xac\x90\x9c\x5d\xe7\x28\x1a\x39\x8a\x26\x14\x7b\x2d\x8c\x60\x69\xe4\x61\xaa\xfd\x4c\xe1\xef\xbd\x53\x99\x34\x56\xbe\xe0\x83\xbd\xf9\x8c\x58\x2a\xab\x06\xe6\x6f\xdc\xc7\x00\x2e\xde\x3b\x74\xec\x05\x0e\x38\xf2\x00\x3f\xc0\x6f\x08\x5f\x90\x09\x46\x01\xa9\x02\xb5\x28\x76\xc9\xdc\xd4\xee\x0d\xa1\x0c\x86\x72\x79\x83\x51\x95\x54\x6a\x89\x14\x69\x62\x6c\xaa\x66\x2f\x74\xb6\x40\x66\x93\x2f\x11\x11\xc7\xe8\x56\x52\x1e\x71\x0e\x1c\x78\x38\xe6\xef\x30\x66\x13\xb4\x2f\xbc\x52\x72\xe5\xf0\x04\x1c\xcf\x73\x68\x8a\x7a\x17\xa8\xaf\x91\xc7\x03\xfa\x9a\xf1\x5f\x89\xce\x44\x23\xab\xff\xac\x3b\x32\x78\x85\x1e\x25\x87\x5e\x71\x62\x23\x82\x7a\x93\xed\xcd\xae\xac\x14\xd0\x27\xae\xc6\x2d\x23\x2c\x71\xc0\x77\x74\xe8\x15\x0d\xf3\x5f\x03\x6b\x57\x96\x61\x46\x64\x19\xaf\xd6\xdb\xc1\x60\x53\x7b\x0c\xf3\x5f\xb1\x66\x96\x65\xb0\x81\xc0\x5d\xd5\x8c\x10\xd0\xd8\x8e\x21\x6a\xf2\xaa\xe7\x0c\xf2\x95\xa6\x1c\xcf\x36\x19\x4b\xbb\x67\x95\x0e\xb0\x90\x68\x3e\x5f\xb8\x59\x23\x5a\xce\x3f\xed\x9e\xd6\xa1\xbd\x12\x1b\x28\x1e\xe7\x0d\x4c\x9d\x9a\x32\xdc\x3b\xc8\x3e\xab\xd7\xbe\xf9\xd2\x4c\x82\xb7\x7e\xe3\xcd\x6b\x94\x33\xdf\xbc\x56\xaa\xd7\x2c\x2b\xdb\x1c\x69\xc3\xb5\x86\x30\x07\x66\x4d\xf3\x34\xf8\xf1\x14\x3f\xaa\x3d\x3e\xc2\xae\x47\xbd\x61\x5d\x4f\x74\x67\xd7\x31\x45\xa1\x4d\x4d\x1c\x21\x86\x6b\x1d\xd3\x6f\x1b\x82\xdc\x8a\x03\xc2\xa0\x78\x7c\x6a\x2c\x0a\xf3\x0c\xd9\x21\x83\x5c\x11\x50\x96\x29\x50\xbc\x3b\xf2\x8e\x13\x2d\xce\xc8\x30\x15\x24\xfb\x40\x24\xbf\x3f\xc8\xa8\x78\x05\xd0\xc4\x40\xe6\xc6\x06\x05\x92\x57\x94\xfb\x82\xc7\xd8\x85\x15\x5f\xe0\xcf\x92\x23\xdd\xac\xa4\xa1\x80\x33\xab\xfe\x2c\x6d\xcd\xf4\x63\x87\xe0\x6d\xce\x07\xc8\x5d\xcc\x81\x7d\xc0\xa8\x65\x73\x3a\x12\x50\xd7\x5c\x12\x2d\x6b\x39\xb2\x1d\x8d\x4c\xd7\x77\x56\xd7\xb7\x43\x64\x51\xd5\xb7\x43\x9c\xb1\xf6\x56\xec\x82\x5f\x56\x52\xe5\x6b\x7e\xe1\x5c\xb2\x73\x7e\x3d\x86\xa5\x7b\xcb\x37\xce\x19\xf6\x7c\x5f\x3a\xfc\xd6\xb9\xa8\x37\xe9\x35\xf4\xd3\xd9\xba\x6f\x6b\x06\xff\x1a\x69\x93\xc8\xe5\xe7\x93\x4b\xf7\xc2\x79\x19\x00\xfc\x3f\xff\x7b\x35\xe6\xe2\xef\x35\xfc\x91\x73\xf4\x82\xcf\x85\xb5\x11\x68\x82\x43\xa2\x5c\x7b\x74\x26\xac\x17\x12\xcd\x3f\xc3\xb4\x92\xbd\xa0\x6f\xcf\xb4\x15\x91\x75\xfe\x37\xf5\xd4\x1b\xf8\x03\xdb\x29\x0a\xeb\x19\x49\x22\x81\x2a\x7b\x75\x73\x83\x01\xf9\x5e\x61\x38\x3b\x98\x82\x9b\x9b\x17\xb8\xfe\x64\x8d\x0c\x9d\xf8\xbb\x1a\x9f\x7d\x8b\xec\xf1\xdc\x75\x6d\xe9\xfd\xb2\xe2\x6b\x9c\x70\x98\xe6\x2d\x5b\xf0\x44\x87\x32\xb3\x00\xd8\x8f\xa3\x9b\x1b\xfc\x8b\x8e\x22\xbb\xd0\xfe\x7b\x70\x9c\x1a\x26\xda\xa2\x6d\x3f\x6d\xc8\x2c\x0d\x29\x91\x29\x75\x1e\x47\xb7\x4d\x3b\x33\x69\x5e\x1d\x01\xd3\x1a\xb3\xfc\x5e\x5c\x11\x23\xaf\x39\x80\xed\xb4\x8f\x24\x80\xeb\x94\x35\x2d\x91\xda\x82\x37\xa0\x95\x81\x20\xc0\xcf\xb0\x5d\xd2\xc9\x15\x3a\x67\xd0\xab\x7f\x35\x81\x07\xd7\xea\x8f\x17\xea\x9c\xd9\xf8\x95\xe2\x71\x1c\x09\x72\x6d\x0a\xf9\x95\x8d\xe2\x8a\x06\x55\x7e\x24\x7d\x81\x96\x3c\x03\x00\xbe\xb1\x99\x94\x18\xa0\x3f\x0e\x3c\x6c\xe0\x01\xa7\x79\x43\xa2\xe9\xe7\x01\xdb\x90\x60\x1a\x1e\xb0\x17\xf8\x95\xbe\xe0\x76\xa0\x8a\xec\x1c\x4e\xcd\x15\xa2\x2b\xb3\x0d\xac\x7b\x43\xbe\x06\xea\x0c\x2f\xe9\x5c\x50\x41\xbf\x6e\x79\x3f\xd5\x44\x1e\x08\xe8\x97\x15\xac\x01\xec\x03\x63\x4a\xff\xbe\x92\xb3\xb3\x1e\xcd\x8f\x61\x41\x8f\xac\xb5\x6c\x0a\xe5\x04\xe8\x54\x8e\xdd\x49\xdb\xdd\xd1\xed\xac\x15\xf3\xb1\xd6\xcc\x47\x9d\x30\x50\x09\x83\xd9\x5e\x37\x7c\xeb\x53\xb2\xdd\x81\xea\xda\x4d\x02\x21\x73\x74\x75\x73\x03\x43\xa1\x59\xdf\xd8\x78\x39\x8d\xcc\x5a\x4f\x2e\x0c\x7c\x03\xa0\xe8\x0a\xa0\xd5\xfc\x20\x36\x0c\xf5\xa2\x6a\x84\x28\xe9\xd3\xbb\xf0\x61\x7e\x63\xc5\x80\xe6\xed\xd3\xd3\x81\x89\x17\xb3\xa6\xd6\x8f\x0e\x2d\xc0\x4f\xe9\x47\x9c\xf2\xe9\x80\xf5\x11\x64\x06\x78\x76\x51\x62\x85\x5d\x12\x80\xbc\x03\x94\xd3\x04\xd8\xdb\x9c\x87\x5e\xec\xc4\xb4\xe3\x72\x7d\x1d\x07\x0a\xc8\x46\x12\x2a\x46\x4e\xd8\xcb\x01\x2c\x7a\x91\x13\xc3\xc3\x12\x6b\x42\x61\x23\x6c\xed\x1d\x3e\x2d\x10\x20\xee\xb0\xce\x95\x3d\x5a\xe3\xee\xbb\x92\xb0\x61\xce\x97\xc0\xe4\x5c\xe1\x97\x39\x32\x36\xf0\x34\xc7\xa7\x33\xbe\x76\xd6\xde\xce\xb1\x28\x69\x83\x01\xe4\xa8\x71\x38\x04\x67\x4a\x24\xb6\x35\x64\xb1\x44\x46\xef\xb0\xac\xe5\xad\xbd\xad\xdd\xdb\x51\x76\x68\xe9\x12\xf7\xdf\x25\xdf\xc2\x93\xcd\x8e\x84\xb6\xe2\xbf\xa4\xd6\x2f\x00\x6c\x12\xe4\x3d\x97\xca\x99\xb7\x12\xb5\xbc\x20\xfd\xcc\xe8\x7a\x7c\x0e\x07\xe4\x82\x5f\x43\xae\x73\xc8\x72\xa1\x41\xdc\xb9\x77\xcd\x5e\x21\x35\xf7\x4c\x51\x71\xec\x39\x7f\x45\x40\xe7\x19\x75\x12\xa0\xd9\xdb\xf1\x0b\x2a\xfb\x16\xea\x7c\x01\x15\x5e\x00\x4b\x33\x79\x35\x79\xeb\xbe\x18\xf7\xff\xbe\x84\xda\x4f\x11\xa9\x5e\x22\x52\xbd\x26\x3a\xf0\xad\xff\xc2\xf6\xdf\x9e\x72\x4c\x83\x3d\x83\x39\xf8\x0b\xff\x19\x40\xf3\xbf\xad\x6b\xfc\xdc\xa7\xcf\x80\x6f\xf9\xb9\x9a\x80\xf7\xd5\x88\x5d\x39\x62\x6d\x2f\x29\xac\xf7\x38\xea\xe9\x25\x83\x61\xbf\xb7\x67\xe6\x5e\x28\x4d\x79\x45\x3a\x49\xfc\x77\x40\x3c\x23\xd5\xab\x4a\x7b\xd9\xb8\x98\x94\x37\x7c\xe0\x17\x63\xf2\x91\xbf\xe1\x43\xc0\xae\xd9\x58\xe0\xd7\x87\xbe\xd0\x5f\x9f\xc2\x16\xba\x6d\xe9\x40\x12\xd2\x7f\x8c\xd1\x8d\x15\xa9\x49\x24\x15\x90\xec\xc5\xfd\xf7\xd8\xf9\xa6\x0e\x7b\xf2\x52\x4a\xfc\x43\x38\xc1\x53\xa0\x4b\x92\x99\x3f\x45\x8a\x23\x81\x3f\x26\xf2\xff\xe9\x3e\x29\x4c\x7d\x63\x48\xd9\x85\xad\x0a\x7f\x2f\xa1\xad\xb4\xbb\x25\xc1\xdf\x0e\xb6\x6c\xd0\x45\xdc\x10\xc0\xf3\x8a\xa3\x83\xe7\x00\x76\x63\xee\x85\xb0\x13\x17\x1e\x6d\x65\x20\x60\xe0\x75\x83\xd0\x05\x3a\x6d\xcb\x08\xa7\x3d\x38\x92\xe4\x40\x08\x2f\xab\x71\xa4\x85\x7d\x4b\x44\x28\x00\xd1\x22\xbb\x32\xe7\xdf\xa0\x4c\x81\x1c\xa8\x96\x3a\x57\x34\x96\x5e\xa9\x11\xe1\xab\x88\x0b\x5d\x7f\x1f\x6a\xda\xaf\xff\x70\xc9\x76\xfd\x87\x7b\x41\xf5\x17\x5e\xcc\xae\xda\xfd\xbf\x82\xfa\xaf\x3e\xa1\xff\x57\x1f\xef\x7f\xa6\xeb\x37\xfb\x5f\xd7\x7f\x7f\xff\xaf\xee\xed\xbf\x5a\xd0\x15\x39\x38\xc3\x12\xf2\x0f\x5b\x3f\x74\x57\xce\x86\xed\xfc\x18\x7e\xaf\x6e\x6d\x36\x18\x2f\x29\xf1\x52\x26\x2e\x55\xe2\x92\x12\xcb\x5b\xfa\x5f\x6d\x90\x28\x0e\x46\x72\x21\x11\x7c\x4d\xf5\x93\xc1\x53\x42\x47\xae\x04\x3e\xab\xef\x9f\xf8\xfa\xab\xa8\xbe\x0e\xfd\x81\xfc\x8a\xea\xca\xea\xeb\xc0\x07\x8c\x0c\xbf\x27\xfe\xb0\xe5\xbd\x50\x35\x90\x5a\x28\x9d\x45\x16\xb4\xe5\x6c\x60\x4a\xf9\x06\xc8\x55\xe1\x39\xac\xfd\x9d\xc4\x11\x5a\xd3\x0b\x2f\xf3\xfb\xe4\x23\x55\x69\x94\xfd\x01\xbd\x57\xd4\xb7\x3f\x54\xef\x4a\x91\xea\x57\xfa\xe8\xbd\x88\xbd\x81\x31\x0d\x61\xd3\x26\xa5\x0f\x98\x64\xae\xed\x52\x2a\x7a\xba\x3f\x12\xe3\x12\xad\x2e\x2a\x72\x17\x4f\x17\x1a\x2c\xcc\xd1\x00\xa3\x8e\x12\xae\xb0\x02\x50\xce\x29\x8a\xc9\xec\x08\x5e\xd3\x19\x8b\x09\x68\x65\x93\x08\x7e\x11\x4a\xfc\x6c\xc5\x0c\x23\xd9\xe0\x0a\xbb\x6e\xe1\x47\x32\xbd\x4e\x38\x85\x04\xcf\xc3\xc8\x33\x91\x9e\x88\x3e\x86\x60\x30\x85\x99\x11\x06\xb0\x62\xb1\x9c\x3f\x44\xfa\x0b\x19\x88\x4c\x32\x4b\x11\x51\x02\x25\xc5\xa8\xb0\xa1\xa8\xb5\x80\x17\x8a\x78\x75\x73\x93\x62\x59\x68\xe3\xef\x10\xf7\xe1\x3c\x7d\x10\x6b\x36\x04\xa9\xf0\x9b\x9b\x13\xfc\x01\x00\x28\x58\x3e\x1e\x4c\x32\xbf\xb0\x47\x52\xa4\x0d\x35\x5a\xb9\x1b\xba\x0f\xed\x2f\x1f\x62\xa5\x0b\xb5\xa5\x75\x79\xc2\x88\x41\x93\x4f\xc9\xa5\x58\x58\x8d\xa2\x1c\xa3\x9f\xb2\x18\x53\x08\x0e\x8a\x9e\x9e\x8d\x79\x64\x8a\x50\x69\x4b\x48\x39\xec\xf1\x71\xa0\x2a\x6e\x9a\xcc\xa0\x1c\xf5\xb9\x92\xb5\x01\x76\x3c\x3e\x9e\x4b\xd1\xc9\x1a\x65\x38\x80\x8e\x8e\xfa\x80\x97\x80\xb8\xbc\xe4\x17\xbc\x71\x7b\xdd\x12\x45\x34\x48\xda\x59\x3b\x06\x88\x71\x7b\x7c\x7c\x7d\x7c\xfc\xac\x2b\xe5\x32\x48\x18\xca\x7a\x9e\x55\x02\x57\xa0\xc0\x74\x43\x0b\x76\x8d\xfd\x39\x20\x34\xde\x28\x4d\x6b\xed\xf6\xed\xfd\x12\xd6\x8e\xdf\xf0\x9c\xa0\xdb\xe7\xdd\xc9\x85\xad\x85\xcc\x72\xdc\xb8\x8a\x30\xaa\xb5\x29\x85\x66\xe7\x36\x30\x41\x80\xfd\x0b\x60\x78\x04\x0e\x72\x80\x7a\x38\x2b\x68\xd0\x5c\xe6\x7c\xd5\x4c\x2a\xe4\xbb\xb6\xcd\x24\x4a\xd1\x0e\x80\x81\x0f\x20\xe4\x12\xc0\xc7\x05\xfa\x22\xc0\x73\x02\xcf\xc5\xed\xed\xe8\x95\x85\x7e\x74\xd7\x14\xdb\xe5\x50\x23\x59\x17\xf1\x08\xfe\xdd\xd9\xe6\xd7\x4b\xfa\x7a\x09\x5f\x99\x40\x77\xd9\x9a\x4a\x7b\x8b\xd2\x44\xff\xfe\x6e\xcb\x4c\xb7\x97\x30\x58\x74\xfd\xbc\xe6\x82\x70\xe9\x15\x9b\xb3\x35\x83\x65\x63\xe4\x72\xce\xae\xd9\x39\x7b\x0b\xe4\x43\xc0\x9e\x49\x99\xe1\x2b\x6e\x20\x45\xb4\x05\x57\x5c\x85\x21\x08\x5e\x55\x84\xe4\xf2\x4e\x41\x70\xc0\x9f\x91\xd4\x1e\x38\x8d\x29\x92\x3d\x47\xfd\xbb\xa4\xbd\x01\x90\x2f\x57\xb5\x34\x57\x91\x6d\x05\x0f\x71\xc5\x32\x22\x61\xdf\x1e\x1f\xa3\x09\x99\xf6\x34\x1f\x59\x30\x1f\xa5\x4d\xc3\x6f\x09\x4d\xf7\xe7\x24\x6e\x08\x4e\x03\x9c\x24\x83\x2f\x80\xe3\xf3\x1c\xda\x04\x60\x01\x40\x42\xa6\x9a\xa2\x54\x24\x2a\xe7\x7c\x2d\x89\xe2\xca\x46\xfd\xb9\x79\x49\x83\x61\x20\x83\x40\x0f\x18\xeb\x13\xf4\xc4\xce\x24\x05\x9c\x49\x7d\x8d\x3e\xb5\xe8\xce\x13\xc4\x31\x6c\x9b\x4f\x0a\x8e\x94\x59\xd2\x7e\xc9\x81\x5a\x07\x4f\xfb\xca\x8c\x49\xbd\xd9\xfe\xb4\xe8\xbd\x0b\x1c\x4a\x50\x0f\xb3\x5b\x66\xdc\x76\xf2\xd7\xbe\x7a\xbb\x1d\xe2\x84\x68\xdb\xc8\x1b\x3a\xa5\x69\xf7\x64\xf7\x4a\x6d\x1d\x65\x5a\x32\x38\x1c\x28\xf7\xd4\x6b\x18\x3b\xcc\x94\x67\x93\x69\xef\x80\xd6\xf9\x6e\xa3\xba\x21\xf0\x1f\x03\x37\x73\x2c\x0c\x7b\x9a\x55\x01\xff\x64\xeb\x75\x6b\x0f\xf6\xf5\xe7\x46\x87\x53\x4f\x0b\x84\x1b\x36\x43\x30\xbf\xbd\x12\xed\x85\x60\x1c\xd0\xc7\x84\x82\x95\xc2\x78\x4a\xbb\x87\xcd\xd9\xe8\x1e\x62\x28\xd4\x7f\x3b\x64\xdd\xf1\x4d\xe8\xf2\xd2\x01\xd2\xd4\x29\x94\x5d\x5b\x61\x9a\x3a\x8c\xbe\xdf\x33\x74\x20\x09\xec\xf7\xb5\x81\x43\xc1\x61\xd1\x61\x81\x4a\x9e\xde\xb2\xef\x3f\xcd\x4c\xed\x0f\xb5\x1e\xaf\x43\x0a\xcf\xfc\x3a\xe4\x78\x93\xd4\xf8\x1f\xe4\xa9\xff\xa1\x97\x5f\x43\x8a\xc9\xf2\x6b\xc8\x31\x08\xce\xf8\x5b\x4c\xf9\x16\x5f\x0c\x63\xfa\x43\xe3\x51\x6a\xed\xce\x59\x87\x25\xac\x03\xff\x15\x68\x30\xd1\x16\x4a\xec\xe7\xaa\x40\x08\x17\xb7\xed\x5d\xa3\x73\xbf\xac\x73\x9b\x0c\x20\x1c\x64\x3d\x19\x26\x2f\x50\x97\xfb\xab\xa3\x43\xcb\x7d\x2d\xac\x87\x5d\x0a\xfb\x48\xae\xe3\x0a\xc2\x24\xec\xa0\x80\x43\xd7\x5a\xd4\xec\x6b\x76\x37\xd4\xa9\xe6\xbd\xbc\x13\xdc\x54\x59\x32\x56\xf7\x58\xca\x4e\xde\x04\xf3\xa8\xcc\x0f\x39\xfa\x50\xa7\xd1\xb4\x07\xb5\x0f\x79\x19\x37\x5a\x45\x4f\xde\x4a\xf9\x2c\x55\x51\xb5\x27\x79\xe5\x70\x4e\x3a\x8c\xdb\x1a\x8a\x18\xe6\x69\x5f\x1b\x8a\x98\xce\xba\xcf\x3a\x6e\xe2\x76\x02\xfa\x2b\x9f\x1f\xf4\x1f\x0c\xd8\xe0\x01\xa6\xc0\x59\xbd\x3b\x91\xd2\xde\x1b\x41\x29\x7e\x57\x8b\x87\x86\x69\x09\x19\xa4\x15\xcc\x75\xcf\x0d\xfb\xb3\x7f\xed\xed\x1f\x2d\x31\x06\xde\xa5\x90\xb1\x8e\x1b\xe7\x15\x4e\x96\x1b\x39\x91\x3d\x42\x2b\xa2\x14\xad\xc0\x30\x4e\x3b\xd9\x10\xa5\x68\x03\x86\x72\x68\xb2\x20\x4a\x19\xb4\x8e\x67\x43\xf0\xda\xf2\x6b\xf4\xc3\xde\x51\x22\xfa\xf9\x87\xfa\x28\x51\xa9\x0c\xcf\x92\x79\x58\xbe\xc3\x7e\x56\xb9\x7e\x37\xf6\xe7\x8f\x87\x4e\x40\x6d\x19\x8b\x3c\x4c\xd9\x18\x01\x00\x88\xc6\x08\xb2\xc6\x08\x4a\xb7\xa8\x47\x90\x56\x60\xe1\x55\x9d\x97\xac\xaa\x54\x4e\xb2\xac\x3a\x71\x68\xac\x0a\x72\x34\xac\xa4\x0e\x8c\x97\x40\xc7\xde\x78\x35\xf4\x40\x8f\xbf\x4f\x03\x1f\x3f\xb7\x25\x8d\x4a\xcb\x86\x77\x2f\xfc\x92\xc2\xba\xa4\x52\x6e\x16\x64\x21\x31\xc3\x29\xeb\xb3\x97\x41\xe3\x66\xa7\x56\x09\x8a\xbc\xaa\xfa\xd5\xf0\x12\x57\xf9\xb0\x57\x2a\x5f\xf3\x8c\xd7\x87\xd4\x60\x5b\xb0\x44\x18\xa7\xb9\x78\x1d\xa0\x1f\xa0\xba\x4d\x06\x4e\x7e\x7d\xe6\x8b\xfb\xcf\xbc\xa8\xcf\x7c\xf9\x09\x67\x3e\xfa\xf8\x99\x2f\x99\x01\x4f\x3e\x72\xe6\x53\x58\x9b\xfa\xbc\x5f\x1e\x3a\xb8\x49\xb6\x1f\x2c\x43\xc9\x89\x03\xbc\x64\xce\x6e\xdd\xa4\x55\xf3\x71\x19\x4e\x6a\xd3\x4a\xac\x36\x37\xdb\xb7\x8d\x68\x80\xda\x03\x16\x6b\xf7\x95\x6d\x00\xe9\x33\xd2\x41\x9e\xab\x49\x00\xb2\xe7\xb0\x8d\x47\x64\x55\x9a\xa3\x08\xc5\x78\x53\x41\xa4\x58\xaa\x9a\x19\x95\x16\x12\x90\x3b\x45\x42\x9e\xf1\x14\x9b\xdb\xc2\xcf\x00\x95\x0c\x02\x58\x06\xb4\x77\x02\xca\x13\x59\x32\x20\x3e\x23\x34\x65\x0e\x10\xc1\xe8\x0e\x42\xf9\xd6\xa5\x91\xba\x53\x82\x1d\xb4\xb8\x47\xdb\x14\xb4\xdd\xd0\xd9\x62\x78\xd2\xcb\x9a\xb7\x9c\xd4\x01\x26\x03\xa3\x96\xb0\x15\xe2\xcd\x25\x3f\x63\x1b\xbe\x05\x52\xee\x12\xa8\xd1\x0b\xb6\xe6\xd7\xf5\x04\x98\x0c\x16\xc6\x29\x34\x87\x85\x86\x12\x0b\x26\x29\x66\xea\x7b\xdd\x20\x40\x06\xb5\xa3\x17\x6c\xc5\x94\x45\x45\x9b\xb0\xd6\xbb\x5c\x18\xbb\x3c\xab\x76\x74\x7a\xe7\x8e\x6e\xfb\x0e\xa8\x76\x95\x19\xc4\xff\x77\xd7\x2e\x6f\x7a\x13\x34\x0a\x65\x35\xda\x39\x6f\x49\xea\x00\x48\x05\x52\xcf\xc0\x1a\x43\x91\x8b\xbf\xe3\x39\x20\x81\x33\xbe\x00\x24\xb0\xe5\x3b\x67\xe7\x9e\x49\xbd\xcf\x76\xfc\xd0\x89\x80\x63\xf4\x3c\x99\xf1\x92\x07\xee\x12\xd6\x3b\x74\x37\xb0\xdc\xb1\x7b\x05\xc3\xaf\x21\xee\xa5\x83\xca\x9e\x0b\xf7\xda\xb9\x46\xc6\xa4\xbe\x3a\xe4\xba\xc7\xcf\xd1\x99\x7c\x19\xa0\xb4\xf2\x1a\xa5\xb0\xa7\xcf\x83\x9b\x1b\x94\x8d\x78\x2b\xa9\xbf\xce\xdc\x15\x00\x64\xdf\xa0\xf9\x2e\xd8\x25\x7a\x9e\x27\xd6\x0b\xf6\x16\x39\x96\x67\xb8\xd7\x9e\xc3\x0f\xec\xb5\xf7\xfc\x15\xf4\xf8\x1d\x7f\x0e\x3d\x7e\xc9\xcf\x9c\xf7\xde\xce\x79\x37\xb2\x5e\x3a\x2f\x7b\x5b\x54\xdc\x40\xcd\xd6\xce\x79\x0f\xe3\x78\x67\xf7\xb6\x1e\xd0\x21\xe3\xee\x09\xf0\xf2\xe3\xc0\x59\xba\xa1\xb3\x71\x63\x07\x35\x1d\x56\x73\x72\x5e\xb1\xe7\xec\x05\xbb\x84\xde\xb2\x0b\xfc\x73\x4d\x53\xc4\xd6\x6a\x33\x43\x32\x5e\x34\xa1\x72\xd1\xea\xb7\xa7\xd3\xbe\x55\xd4\x0f\xc0\x3f\xc3\xb4\xf9\xa4\x8f\x62\x4b\x80\x88\x83\xc7\x46\x90\x99\x4c\x84\x51\x1e\x99\x37\x18\xdf\x17\x42\x35\xe0\x28\x68\x74\xa4\x1c\x64\xf0\x18\x76\xaa\x6f\x92\xd7\x8d\xf0\x26\x45\x66\xb8\x46\x64\x56\xd3\x42\x43\x9b\x82\x58\xd3\x02\xef\x00\x10\xf0\x07\x61\xcf\xa1\x78\x6a\x1a\x46\x02\x34\xa2\x4b\x3f\x0c\x28\x47\x2d\xa8\xab\x1b\x33\x11\xac\x4d\x82\x30\xcb\x4c\x69\x56\x85\x05\xf6\xcd\x61\xf0\x1e\x41\xfc\x66\x29\x4b\x91\xfb\x8d\x24\x3e\xa6\xe8\xbf\xbd\xf3\xac\x25\xad\xb3\x76\xd7\xe1\x4a\x5a\x26\x36\xc6\x29\x32\x6f\x5d\x89\x8c\x29\x35\x02\xcc\xd8\x0d\xd8\x7a\x27\xd2\x00\xc2\x51\xea\xc1\xd1\x31\x86\x58\x3d\xdc\x1b\xd2\x47\x63\xe5\xc2\x3e\x94\x3e\x20\xab\x59\x4b\x5d\x58\x97\xd6\xb6\x5c\x52\x9b\x1e\xa2\x71\xb8\x25\x4b\xc1\x23\x10\x03\xc7\xc7\xb2\xb6\xd7\xaa\x7e\x58\xe0\x16\x11\xcf\x9f\x09\x2b\xe5\x71\x66\xad\x11\x94\xd9\xc0\x37\x28\xeb\xaa\x08\xd8\xe4\x79\x1d\xd2\x8a\x2f\xa5\x93\x0a\xca\xea\x36\xd2\x0f\x64\xc5\x4a\xab\x45\x18\x68\xb5\x11\x1c\xa8\xbc\x7b\x15\xc4\xd1\x5c\x6a\x2b\x65\x48\xdc\x42\xdf\x15\x53\x83\xa0\xc6\xa6\x6c\xc6\x3d\x96\x82\xd0\x83\xd3\x81\x7e\x4b\x83\x47\x28\x82\x7f\x08\xdc\xf0\x86\x0f\xe1\xf9\x8a\x63\xe4\xc4\x3e\x80\xfb\x3e\x00\xb0\x3e\xc3\x3b\x56\x2f\xf9\xcb\x10\x80\xd4\x0e\xb5\x32\x28\x10\x38\x37\x23\x52\xc3\xc1\x53\x1b\xf6\xc0\x46\x6f\x8e\x00\x3d\xa8\xd0\xd4\x0f\x15\x4f\xd6\x05\x1e\x00\x1b\x3e\xe9\xe4\x3e\xcb\x31\xec\x46\x18\x47\x9b\x67\xc9\x32\xfe\xc4\x40\xc8\x97\x55\x58\x65\x0b\x7a\xc7\x5e\x86\xb6\xff\xbd\xb0\xe0\x19\x28\x4e\xda\x07\x25\x6a\x10\xaf\x75\xcd\x2f\xb6\x85\x30\xa9\xca\xfb\xaa\x3e\x27\x21\x50\x32\x41\x01\xb6\xd2\x22\x26\x52\x8b\x48\xbb\x40\x7b\x0d\xe1\x2e\xf1\x77\xb2\x9d\x73\x6c\x87\x42\x18\x7e\x5a\x13\x74\x51\x0e\x4a\xfa\xfc\x15\x85\x5b\xc2\xbb\xba\xf0\x62\xbc\x4f\x2b\xbd\x84\xd2\xa4\xb3\xe4\xae\x74\xd4\xc2\x8a\xa6\x00\x3c\x67\x34\x5c\xc8\xdb\x08\x87\x7d\x4f\x4d\x57\x24\x30\xf9\xf2\xe4\x31\xc2\x55\x0c\xfc\x02\xd5\xe9\x37\x59\xeb\x15\x6e\xfe\x39\xed\x7c\xa8\x3b\x4b\x8b\x4f\xee\xe5\xba\x51\xf7\x59\xa3\xee\x6d\x65\x13\x3a\x1e\x4e\xd0\x73\x49\x25\xf8\x7d\xd5\xec\x9a\x6e\x55\xc1\x3f\x5b\xd5\x76\x15\xaf\x18\x08\x41\x0c\xa8\xae\x60\x7e\xc7\x66\xfb\x20\x04\x1d\x19\x0f\xc6\x0b\x64\xda\xa5\x80\x47\x95\x1b\x82\xc0\x26\x0d\x08\x95\x9a\x10\x8a\x20\xf0\x9e\x61\x9e\x34\x8f\xc1\x81\x08\xdc\x6b\x26\xbd\x19\x64\x4d\x87\x31\x66\xfa\x87\x85\xad\xc4\xf1\xbb\x60\x92\x78\x2f\xc9\x86\x60\x9c\x4c\x12\x17\x1e\x9b\x25\xe2\xac\x7d\x0f\xcd\xa4\xb8\xb9\x11\x13\x00\x3b\x0b\x12\x9a\xad\x24\xbb\x61\xfb\xf4\xea\x53\xa2\xfa\xe6\x87\x06\x57\x92\x67\x77\xc6\xc2\xd3\xe7\x19\x79\xde\x69\x81\x7d\x2a\x74\x9f\x8a\x49\x81\x7d\x42\x1b\x44\x63\x86\x16\x06\x56\xa4\x7a\x6b\x90\xa0\x66\x17\xbe\x7a\x18\xb7\xc3\x90\x9e\x67\x1f\x95\xae\x29\x9f\xc2\xc0\xd4\x5f\xd6\x9e\x99\xea\x3a\x25\xb1\xe7\x9b\x19\x3b\x99\x1b\x38\xe5\x01\x61\x57\xe8\x44\x5e\x0e\xcc\x66\xe0\x64\x5e\xec\x94\xe4\x26\x97\x3b\x11\xd0\x2d\x69\x53\x12\xa7\x74\xa5\x65\x43\x2e\x17\x35\x7a\x95\x9a\xad\x7e\x92\x00\xee\xbf\x1b\x53\xe4\x41\x2f\x0f\x8f\x09\x68\x2e\x1a\x93\x9b\x57\x63\xca\x3c\x98\x81\x96\xe8\x6e\x99\x1d\xec\x4d\xd2\xf0\xfc\x3a\x70\x81\xb7\x8a\xdf\xa6\x23\xb6\xa6\x4e\x31\x52\xf1\xcb\xf1\x3a\x91\x0d\x9a\x90\x94\x38\x3b\xf4\x14\xd9\xcc\x4a\xc7\xfd\x49\x34\x2e\xfd\x72\x1c\x11\x29\x88\xdc\x3e\x70\xce\x78\x55\x21\x4f\x5c\x7c\x46\xcf\x62\xa0\x1d\xd1\x25\x4e\xab\xb2\x00\x7d\xf1\x72\x84\x45\xf3\x71\xe4\x47\xe3\x7c\x94\x7b\x3c\xac\xf4\x05\x56\x8c\x26\x02\xc0\x47\x79\x86\xc3\x69\x6e\x57\xaf\xd8\xf7\xdc\x9e\xd9\x64\xff\x1d\x13\xe3\x66\xa8\x46\x1a\x23\x27\xb3\x8a\x11\xdd\xf0\x87\xaa\x0c\x51\x5f\x3a\x82\x06\x71\xa6\xdb\x8d\x85\xaf\x43\x34\x55\xf5\x32\x3f\xb3\xdd\xa1\x6c\xeb\xf5\x0f\xde\xf3\xc0\xfe\xd2\xaa\x5e\x8d\xe3\x7e\xd5\xb2\xe5\x40\x30\x85\x81\x28\xf1\x2b\x94\xc2\xf8\x91\xda\xa4\xf6\x3e\xc2\x30\xa3\xa0\x29\xf5\xb1\x6c\xc2\x0f\x73\x6c\xf3\xff\xcb\x0d\x16\x2c\x69\x36\xb8\x6e\x5c\x93\xd7\xcd\xd3\x32\x0b\x8d\x5d\xb6\x6b\x26\x17\x74\xb1\xab\xe1\x11\x9b\xb5\x0c\x2b\x1b\xc7\x22\x6a\x6c\xfb\xd4\x34\xf1\xd4\x47\x46\xda\x75\xc2\x81\x29\x1b\x4e\x83\x31\x2f\x1b\x4e\x83\xb9\xe9\xec\x88\x17\x4a\x9b\xce\x8e\x02\x09\x1e\xb5\x7a\xc4\x47\x19\xf4\x7e\x01\x9c\x13\x86\xb8\x71\x52\x07\x9e\xf1\xda\x1b\x0a\x96\x3c\xe8\x55\xa5\x57\x68\x35\xb3\x6a\xc4\x2e\x37\x3d\x7c\xa5\xa8\x7f\x65\x3b\x4b\x26\xea\x4f\x2b\xa8\x08\xbe\x64\xe8\x37\xea\x16\x4e\x8e\x6e\x33\x4e\x0c\x4f\x0b\xf2\x7f\x8c\xe0\x29\x38\x70\xba\xd1\x8e\xb7\xba\x4f\x4c\x7e\x4a\x8d\xcb\xc5\x32\x38\xf4\x28\xaa\xb7\x09\x27\xee\x1b\x1c\x4d\x13\x2c\x5c\x50\xaa\x5e\xfc\x0d\xde\x49\x42\xf7\x66\xa1\x0b\x95\xe1\x55\x9c\x1d\xf0\xa4\x35\xec\x47\xc8\x4b\x54\x7b\x6c\x9a\x7e\xa4\x64\x4b\xa2\xee\xba\x83\xa9\x33\x3d\xe7\x03\x7b\xf4\x67\xe8\xde\xe1\x43\x1b\xf0\x86\xa7\xbc\xed\x04\x2e\x7c\xcb\x00\xd2\x09\x98\xfc\x10\xde\xd1\x89\x38\x72\x33\x7a\x63\x52\x14\x4a\xd6\xc9\x86\x1f\xec\x5f\x87\xfd\x60\x0b\xd8\x0e\x88\x8d\x0d\x97\x56\xd9\x75\x03\xc0\x03\xa8\xaa\x4a\x27\xb7\xf8\x7c\x40\x6c\x58\xe5\x30\x92\x2f\x8d\xd3\x70\xb9\x8f\xc6\xcc\x90\x7d\xc6\xde\x2e\x4d\xef\x79\x04\x80\xb0\x7a\x65\xe5\x46\x1f\x35\x55\x48\x2c\x72\x1a\xce\xf3\xf7\xe0\x97\x66\x63\xd2\xc1\x5c\xa9\x71\x50\x9c\x8a\x87\x25\x6a\xf8\x34\x37\x56\xef\x90\x4a\xc8\x81\x49\x06\x8c\xc8\xea\xf3\x81\x41\xf2\x9d\xa8\x97\xb5\x30\xca\xc5\x1d\x38\x1c\xa1\xb8\xf7\x26\x70\x9f\x07\x63\x79\x31\xb9\x7c\x01\x6a\x64\x4c\xe6\xfe\xf4\x8d\x9e\xb4\xc6\x39\x95\xc7\x0b\xaf\x0c\x28\x69\xf8\xf6\x01\x0d\x5a\xe4\x24\x2d\x05\x1a\x7e\x39\x8c\xb8\x0f\x80\x38\xca\x80\x86\xe4\x68\xbd\xeb\xe2\x35\xa6\xb7\xb8\x0c\x78\x2d\xd0\xc4\x00\x1d\x92\xf9\xc7\xdb\x0e\xb2\x9e\x69\x3a\xde\xab\xbe\x63\x0f\x7b\x18\xa2\x19\xe7\x32\x73\x8c\x9e\x23\x95\x60\xf7\x2a\x63\x89\x68\x72\xc0\xa5\xb5\xa9\x92\x83\x0d\xf9\x23\xde\x72\xb8\xbf\x78\x77\x29\xeb\x22\xa6\x21\x17\x8e\xa5\x6a\x3c\xed\x65\x6c\xd0\x8b\x6c\x1b\xe6\x1a\x57\x09\x78\x10\x83\xda\xbb\xbe\x97\xda\x8a\x6a\xd5\xa0\x31\xdd\x25\x4e\x77\x64\x4e\x77\x79\xe7\x74\xef\xcf\x22\x80\xd1\xc6\xec\x59\x85\x47\x34\x54\xd6\x2b\xdd\xc4\xb0\xf2\x27\x37\x87\x49\x90\xf9\xf7\x4f\x55\x74\x9f\xf6\x32\xf2\x7e\xc4\xfb\x23\xf7\xe7\x90\x26\xc2\x08\x16\xd0\xa6\xc5\xab\x25\x6d\xee\x8d\x02\xaf\xb8\x35\x88\xee\xb7\x99\xe9\x8b\x42\x12\x0b\xf2\x81\x23\x06\x0f\x21\x79\xcd\xb0\xc1\x08\x85\xc1\x60\xd6\x84\x61\x8b\x19\xd4\x9a\xae\x4c\xf1\x25\xc2\x60\x4a\x46\x15\xcf\x4e\xa6\x46\x13\xb3\x42\x52\xc7\xdb\xbe\xf0\x13\x8a\x59\xb9\xcf\x27\xea\x8a\xcb\xff\xaa\xe2\x3b\x58\x64\xa9\x83\x88\x0e\x55\x4d\xf1\x78\x39\x17\xda\x9d\x54\xf9\x4a\x28\x37\x9b\x77\x40\x9e\x5a\x84\xb5\xf1\xce\x6e\x6b\x3a\x0d\x91\xfc\x0a\x58\x88\x76\x52\xc1\x8c\xd1\xbb\x2b\xdf\xdd\x60\x36\xd3\x1e\x7b\x05\x5d\xa8\x47\x5d\xab\x34\x81\xcd\xfe\xc9\x7e\x1b\xe1\x07\x9a\x6b\x7c\xdf\x0a\xa3\x61\xa3\xe1\xcd\xde\x20\x5c\xd0\x60\xab\x4a\x7a\xd5\x4c\x1a\x18\x49\xcf\xb3\x3b\xa3\x09\x4d\xfb\x8c\x82\xa6\x0c\x61\x87\x0c\x47\xc5\xb8\x1c\x95\xae\x2b\xf3\x8e\xc8\x13\xf1\x67\x8c\x65\x33\xcd\xbc\xe1\x0c\x05\x08\xf8\x34\xa0\xa7\x72\x86\x8e\xe5\x23\xdb\xf3\x32\x20\x53\x33\xd7\x9d\xf1\xb2\xc6\x00\x32\xe0\x51\xbf\x11\x29\xf6\x7d\xb6\x17\x52\x85\xac\xd1\x6e\x6e\x2a\x43\x34\xc3\x23\xb7\xc5\x42\xca\xcb\xae\xc9\x75\xc4\x31\x23\x80\xc8\xcb\xb1\x0b\x79\x21\x76\xed\x5e\x62\x38\xe1\xee\xd1\x72\x24\x85\x88\xc8\xd9\x13\xaf\x3f\xc3\x32\xa5\xba\x32\x85\xee\x23\x24\xe9\x44\x4c\x37\x91\x00\x85\x46\x46\x74\x14\xbd\x01\x1f\x62\xa0\xc9\xac\xc0\xb1\x42\x2f\xb6\xbd\x85\xba\x5f\xaf\x67\x2d\x9c\x14\x78\x99\x6a\xef\x4e\x4b\x77\x05\xdc\x0e\x1a\x22\xe6\xc6\x98\x7e\xc9\x0e\x84\xac\xa9\xdd\x4c\xb5\xef\xdd\x91\xbc\xfc\x5b\xd0\xd4\x50\xf3\x2d\x1d\xcf\x1b\x24\x82\x8a\x92\xc4\x04\xb6\x72\x4a\x9e\x2f\x85\x74\x42\xce\xa3\x42\x3d\x85\x51\x16\xc6\xa2\xe5\x93\xfc\x8d\xd1\x07\x11\x4b\xff\x39\x58\x00\x0c\x88\x98\x19\x32\x32\xac\x24\x31\x39\xe1\xd7\x54\xee\x0f\x82\x2a\x3f\x87\xfa\xf6\x77\x8c\xa0\x12\x2b\xa7\x40\xe8\x49\xd9\x50\x85\xfd\x6a\x0e\x57\xf5\x06\x43\x70\xa1\xc9\x13\x06\xc5\xde\xc1\x96\xfb\xb0\xf5\x05\xdb\xf9\x19\x21\xb9\xee\x6b\x54\x3e\x75\x5f\xe1\xa5\x02\xc9\x6c\x44\x4d\x56\xac\x57\xc8\xa3\x51\xa8\x6a\xa1\x30\x30\xc2\xd3\xaf\xdd\x6d\x15\x1b\x26\xab\x3f\x86\x3b\xfc\x3a\xb2\x23\x1e\x42\xc5\x41\xb7\x4c\xa4\x77\x20\x50\x69\x50\x33\xde\x46\x05\x35\x36\x3e\xff\x81\x9f\x6b\x5e\x8f\xa7\xa3\xb8\xd9\x60\x7c\xa8\xc1\xb8\xdd\x60\xca\x63\x1c\x43\x15\xbb\x00\x5a\x8b\x91\xf6\x4f\x47\xf5\xb7\x3f\xf0\xdb\x48\x45\x0e\xa8\x4c\x22\xa9\xed\x9c\x0f\x46\x0b\xe0\x2c\x5d\x37\xb7\xd1\x44\x32\x27\xa3\xc9\x69\x0e\x1b\x84\xfd\x08\xc5\x68\xad\xf1\x2a\x2d\x58\x23\x16\xcb\x1f\x20\x91\x42\x69\x63\x8f\x25\x16\x98\x55\xe6\xe3\xff\x82\x31\x35\xb2\x92\x4c\x14\x08\xac\xdf\x68\x0e\x7e\xc3\x7e\x18\x1e\x65\x4d\x40\xa1\x83\x80\xa0\xc3\x24\x2d\xcd\x0e\x96\x06\x56\xff\x62\x14\x50\x38\x83\x8c\x7f\x9b\x59\x01\x4b\x6d\x38\x37\x19\x7a\x74\x05\x30\x94\x97\x23\x1d\x4c\xa0\x04\x84\xf8\xbd\xcc\xc0\x8e\xac\x12\x33\xc0\x71\x1e\x7b\xa8\xf0\x29\x20\xe7\x6b\x8c\x20\x62\x03\x07\xae\xbf\xe0\x7b\xf7\x15\xde\xe6\x09\x0f\xf2\x86\x1a\xf2\xd8\x09\xba\x6f\x90\x5a\xd6\x9f\xb0\x95\x37\x2a\xb8\x04\xed\x67\x84\xeb\xd0\xad\x28\xc9\x51\x2e\x5e\xe0\x55\x63\x28\x52\x52\x50\x1e\xe1\xbd\xda\xd9\x7f\x64\xf2\x12\xcf\x6f\x30\x78\x17\x4e\x07\x6d\x66\x55\x2e\x44\xd5\x78\x28\xa7\x4d\x54\xb3\x27\xf3\xa9\xf9\xa6\x09\x83\x1a\x28\xd2\x05\x3c\x0a\xe9\x4f\x50\xd5\x4f\x77\x02\x87\x77\x94\xb5\x47\xb2\xf9\x3f\x32\xcd\xcc\xc7\x5c\xe5\x40\x4f\x31\x34\x33\x8f\xc9\xcc\x1c\x66\xdb\xcb\x29\xdc\xf5\xce\x5b\x00\x1b\x27\x64\xa6\x2b\xbe\xa1\x84\x39\xfc\x62\xc2\x1a\xb8\x43\x6b\xe5\xcc\xbd\xa5\x73\x85\x5e\x0f\x2b\x67\xe5\x2e\x81\x7d\x3b\xe3\x57\xce\x95\x3b\x77\xe6\x6c\x8b\xe7\xcb\x9a\x3b\x3b\xc8\x72\x66\xf7\xd6\x6e\x0e\x67\x0d\x8a\x9c\x79\x57\xce\x0e\xdf\x17\xb7\x23\xd8\x52\x72\xb0\x2c\x66\x1b\x54\x06\xd4\xdd\x8f\x75\xac\x0d\xf8\x5a\x4f\x48\x02\xd9\xf4\x57\x39\x1b\x34\x11\x06\xbb\xf1\x6d\x43\x92\x91\xc8\xde\x23\x29\xb2\x25\x32\x04\x2f\xb4\x2a\x81\x52\xc2\x99\xd3\x36\xdd\x0f\x32\x15\x0f\x08\x80\x00\x25\xa4\x55\x48\xfb\x5e\x7f\x04\x44\x28\x55\x32\x92\x78\x1a\x2b\x0a\xa9\xa2\x98\x87\xaa\x22\x1d\x93\xff\x81\x8c\x40\x93\xf3\xc0\xcb\x60\x42\x81\xd8\x84\x1a\x10\x6a\xe7\xbd\x4a\x07\xb0\x98\x58\xde\xca\xad\x09\x31\x98\x38\x6f\xe8\x00\x34\xcf\x9d\xbc\x67\xc1\x23\xc0\xf6\xd0\x8d\x7b\x43\x17\xc0\x3b\xe2\x60\xbb\xb7\x70\x81\xf6\xcb\xdc\xa0\xe1\x7f\xf9\x7d\x6b\x9c\xaf\xb0\x27\xd5\x5e\xf8\x36\xa3\x8b\xb6\xb5\xd4\x46\x0e\xa0\x12\x64\xec\x88\x16\xcd\xba\x5b\xbc\xe6\xc6\x70\x56\x30\x14\x6b\x0a\x06\x6b\xf0\x9e\x37\xe2\x23\xfc\x70\xf8\xa4\x36\xd5\x2c\x4a\x0f\xb0\xe2\x5a\x03\xb0\xe4\x5a\x27\xb0\xe1\x4a\x1b\x00\xdb\xea\xc7\x10\xf6\x54\x65\x78\x39\xf7\x3c\x3a\xdc\x11\xbf\x9a\xce\x01\x51\x52\xdc\x89\x4c\x6c\x02\x54\xd4\x91\x51\x77\x00\xc4\x15\xf5\xc8\xb4\xe6\x46\x37\x49\x34\xe5\xb6\x73\xb2\xe3\xee\x0a\x52\x50\x67\x3c\xa7\x55\xcf\x69\xb1\x82\xa9\xeb\xa6\x5f\x86\x33\xbc\x0c\x55\xf9\x3d\xe3\xbe\x17\xb4\xef\x2d\x82\xa6\x05\xba\x7b\x90\x06\xb7\xf4\x04\x79\x89\x92\xb5\x27\xde\x02\x1d\xa2\x0f\x50\x9f\xee\xec\xfd\x39\xb3\xbe\xcb\xac\x48\x1d\x1e\x46\x25\x17\x12\x26\x6f\x3c\x04\x34\x13\xd8\xf8\x0b\xd8\xec\x18\xd4\x51\xa6\x4c\x84\xbf\xb9\xf5\xa9\xde\x8d\xcc\xb9\xf2\x32\x95\x93\x80\x3b\x7d\x9d\xa0\xe5\xeb\x4e\xe5\x54\xda\xe9\xe3\xe3\xd2\x5b\xaa\x9c\x2b\x5d\xe7\x4a\xd5\xb9\x54\x75\x2e\x65\x4e\xe8\x86\x59\xe7\x52\xd5\x49\x5d\xb9\x95\xd7\x0a\xb2\xa8\x06\xc4\x40\xde\xb9\xae\x79\xf3\xf0\x9f\x4d\x1a\xa9\xe8\x06\xa8\x5c\xf2\x12\xf9\x6b\x98\x7d\xee\x93\x00\x5b\x89\xf5\x77\xf2\x27\xc8\xc2\x3d\x7a\x60\xd7\xa2\x05\x7e\x6b\x20\xe8\xd7\xac\xda\xc3\xa8\x5f\xa8\x44\x75\x0a\xc3\xe8\x73\x1c\x29\x70\x44\xf1\x30\x8e\x38\xaf\xaf\x03\x82\x95\x44\x07\x9a\x1d\xec\x0a\xd8\xd7\x5e\x0a\x0b\x0e\xfb\xdc\xa3\x18\x58\xf4\xbe\x80\x5f\x7c\x47\xb1\x96\x15\x3a\x0b\x2f\x76\x72\xe5\x90\xb5\x1a\x73\xef\x7d\xa0\x5c\x92\x96\x3c\x74\xe0\xfc\x39\x31\xba\xda\xc8\xd8\x58\xb0\x4b\x81\xc8\x5a\x42\x89\x0d\xea\x3b\xe7\x1c\xca\x6f\xbc\xdc\xa1\xd0\x58\x0b\x3e\x07\xaa\x7c\xcd\xb3\x06\x3d\xf3\x57\x36\x5a\xd3\x34\x24\x6c\x2d\x67\xa1\x84\x87\x2d\xbf\x72\x53\xf8\xdd\xf1\x85\x01\x01\x14\xc0\x44\x65\x3f\xcc\xd2\x82\x69\x72\x85\xaf\x2b\x72\x40\x4e\x1e\x1a\x95\xc7\x80\xff\xce\xe8\x88\x40\x35\xa7\x67\xdd\xdd\xcd\xcd\x9a\xce\x33\x3c\xa2\x25\xfa\xf6\x14\x9e\xb6\x32\x14\xd3\x59\xf7\xa5\xfd\x61\x07\xef\xaf\x15\xee\x3a\x83\xe7\x97\x55\xb8\x1d\x48\x7f\x43\xe9\x46\xea\x9b\x5b\x68\x41\xa1\xa4\x1d\x1a\x20\x40\xfd\x56\x12\xf3\xb5\xdd\x70\x54\xf9\xe3\x00\x75\x35\x22\x41\x46\xf7\xb5\x2c\x50\x00\x2a\x65\x50\x97\xa2\xd5\x30\xf0\xa1\xa2\xd5\x0a\xa2\xd5\xf0\xfa\x4f\x93\x48\x34\x0d\x4e\xdb\xd0\x85\x7f\x17\xc2\x59\xfe\xe9\xe3\xba\x45\x82\xf0\x0a\x92\x94\x08\x49\x00\x97\xa3\xdf\x87\x75\xf4\x35\xea\x77\xf0\x2a\xdf\x23\x44\x1a\x74\xc4\x0b\xb4\x8a\xf7\x0a\xb4\x82\xaf\x08\x2a\xfc\xb6\xa3\x6f\x44\x4e\xd9\x34\x22\xbc\x31\xf2\x52\xc5\x86\xd0\xb0\xa0\x64\x03\x33\x4a\xdf\xd7\x2d\x60\x7c\x69\x02\xe3\x23\x15\x92\x55\x11\x33\x81\xa2\xfb\xc9\x05\x83\x28\xfc\x29\x5d\x97\x58\xa8\x41\xc5\xf2\x1b\xd1\xff\x40\x9f\x23\x28\xed\x66\x88\x43\x30\xa6\x11\xc1\xb2\x0d\x5f\x74\xd1\xda\x68\x01\xcf\xb0\x19\x57\xee\x06\xed\x09\xd7\xdc\x5a\xba\x57\x78\x97\x39\x3a\x2e\x71\xbc\xe3\x8e\x0c\x47\xc7\xf3\x9b\x9b\xf9\x18\x68\x1d\xed\xe6\x84\xee\x4c\xca\x79\x4b\xfe\xed\xee\xea\x6b\x65\x94\xeb\x13\xe2\xee\x39\xc0\x8d\xf0\x16\xf0\x9f\x7a\x8e\x6f\xab\xad\x53\x15\x3c\x0d\x0f\x97\x8b\x8d\x72\xe1\xed\x6d\xe5\x50\x95\x41\x77\x01\xd8\xf5\xac\x2b\x00\x4f\xb0\x5c\x6b\x2f\x03\x52\xc1\x1b\x8c\xb3\x9b\x1b\xe0\xf8\xec\x4f\xee\x1c\x30\x41\xa5\xdd\xcb\x8c\x2e\x5a\xb1\xfe\xf2\xa9\x1d\x35\x4b\xa8\x3a\x8c\x5a\x0d\x27\xb0\x65\xa3\x43\xdb\x7a\x32\x8d\xca\x52\xe4\x24\x30\x80\x9e\xaa\x2a\xa0\xf7\x00\xde\xf7\x3a\xb3\x3d\x4d\xf7\xcb\xd7\xf9\x65\xf9\xba\xbe\x3a\x20\x5c\x40\xb7\x81\x5d\x72\x74\x21\x36\x4c\x70\xd5\xe6\x23\x38\x1b\x6b\xac\x9d\xe9\xd8\x51\x81\x04\xc0\x97\x2d\xf8\xfb\xaf\x7d\xd6\x14\xe0\x96\xaa\x4b\x93\x0a\xdf\x85\xf2\xcc\x96\xe4\xf8\x00\xd4\x5a\xc9\x24\x63\xcc\x32\xf5\x5a\xd0\x6d\xe4\xec\x47\x8c\x9a\x1b\xcd\x24\x66\xae\x2f\x53\xfb\x59\x95\xb0\x29\x47\x71\x57\x8e\x82\x1c\x6f\x0c\xc7\x82\xef\x5a\x2a\x9b\xaa\x6b\x0d\x39\x47\x86\x63\x43\x0f\x16\x98\x10\xdd\x53\xe8\x8b\x21\xd4\xfb\xd1\x18\x24\x4c\x1f\x3a\x30\x5f\xe2\x0d\x87\xd2\x03\x0d\x0a\x66\x3e\xce\x6a\x86\x7e\xd3\x01\x5d\xbf\x16\x63\x38\x51\x98\x3c\x53\x28\xf6\x73\xbb\x37\xdd\x80\x50\xd2\xe5\xa8\x66\x7f\xd5\xac\x4b\x84\xa7\x26\x9e\x4c\x33\xc4\xc4\x90\xc6\x09\x82\x2e\x3b\x80\x23\x08\x79\xb6\xb6\x2f\xfb\x52\x98\x79\x00\x95\x79\x19\x79\xe6\xec\x3c\x40\x68\xb6\x69\x97\x86\xa8\x0d\x51\x1d\x7c\x87\x3c\x3b\xa3\x8f\x49\x69\x5c\x0e\xd8\x58\x68\x62\x8c\x3f\x60\xdc\xfc\xa4\xfb\x9c\x63\x30\xeb\xa4\xfb\x06\x51\x2e\x22\xdc\x56\x5e\x51\x9a\x70\xac\x20\x56\xf9\x0d\x41\xd5\x5f\x47\xe5\xa4\x84\xb2\x38\x71\xf8\x9b\xf9\x25\xd4\x82\xd3\x77\x81\x57\x50\x43\xed\x25\x8c\xea\x57\x34\xab\xc6\xef\xdd\x97\xf8\x4b\x01\x0b\xdf\xc0\x57\xdc\x30\x50\xc8\xa0\x21\xb2\x03\x2d\xbd\xfc\xec\x96\x20\x15\xfa\x07\xbf\xd4\xd2\x4b\xdd\xd2\x1b\xb3\xa5\xb2\xd4\xe8\x64\x04\x83\x1f\xd9\x18\x81\xe7\x65\x25\xe7\x33\xac\xa6\xcc\x1e\x55\xac\x27\x05\xec\x4b\x4b\x5b\x22\x77\x42\xc8\xdf\x85\x68\x69\xff\xa3\x8c\x0a\x28\x6f\x7f\xa8\x42\xc3\x01\x47\x47\x9f\x13\xd8\xd4\xb1\x7a\x1a\x11\xba\x86\x0d\x13\x23\x3d\x6b\x1d\x95\x37\x37\x08\x90\x4a\xc4\xdd\x11\xe1\xee\x12\x71\x37\xc2\x05\x58\x5b\xdb\x46\x08\x01\xb4\x8d\xa0\x54\xf4\xaa\x44\x34\x04\xc7\x27\x82\xe3\x43\x55\x02\x9d\x1e\xd9\xec\x1f\xfa\x2b\x90\xbc\x41\x7f\x20\xf4\xe2\xc2\x0e\xcb\x7e\x56\x38\xbe\x54\xd1\x26\x7e\xcd\xd0\x43\x35\x03\x72\x0f\xd1\xf4\x17\xc4\x3a\xfd\x80\x7f\x6d\xc5\xfb\x7c\x08\x45\x1c\xe7\x3e\x90\xe3\x74\x42\xfd\xef\xc2\x4a\x1f\x06\x63\x82\xc1\xc0\xb0\x71\xcc\x88\x06\x8d\x68\x14\x69\xd9\xa2\x19\x77\x40\x2f\xc2\xc0\x60\x77\xc3\xc3\xd6\xb0\xf2\x28\x5b\x32\x35\x64\x34\x51\x98\xe1\x58\xaa\x90\xed\xd1\xb7\x82\xbe\x09\xf5\xcd\xb0\x04\x29\x1b\x6a\x53\xa3\xea\xb8\x99\xb2\x33\x4c\x38\x6a\x13\xb1\x0f\xb1\x08\x16\xfe\x11\x90\xf0\xe9\x1c\x86\x87\x11\xc2\xa4\x57\x08\x71\x93\xf2\x67\x27\xef\xd0\x33\xcc\x36\xca\x3a\x0a\x26\x93\xe0\xfb\x28\xb1\xea\x0f\x9a\xfc\xec\x3e\x42\xc7\x04\xd2\xf4\xe1\x63\xe6\xe2\xfd\x8a\x78\xd1\x34\xb6\x35\x0a\xc9\xf3\x9d\xea\x0a\x49\xf2\x06\xa5\x29\xb4\x40\x48\x9e\xf2\x2a\x01\x10\x7e\x4a\xd5\x52\xc2\xb0\x4e\x18\x62\x09\xa0\x1a\xd0\x72\x20\x9c\x9e\xd4\x09\x27\x33\xe2\xb8\x28\x56\xa9\x61\x36\xd2\xe8\x73\x15\xc7\x09\xfa\x33\xa8\xc2\x42\x3d\x68\x58\x33\x2b\x4b\x52\x15\xbf\x33\x47\x23\xd6\xc5\x38\x45\x84\xbc\xba\xb9\x29\x01\xfb\xc9\xe0\x8f\x5c\x99\xf1\xc8\x0a\x37\xe8\x53\x87\x4b\x0c\x24\x08\xf2\x08\x3b\x0c\x82\x20\x29\x59\x24\x31\xc2\x71\x65\xe0\x5b\x53\xba\x21\xd0\x91\x23\x38\xe9\x1e\x4a\xdf\x84\x87\xbc\x78\xe1\xee\x50\xbd\xeb\xa2\x70\x67\x03\xa3\x50\x54\xdf\x19\x34\x46\x93\xc7\xb6\x34\xa3\xb9\xbb\xc2\x18\x08\xf8\xb8\x70\x97\x78\x7b\x54\x31\xe6\x5b\x74\x3a\x1c\x73\x8a\x19\x73\x7a\x3a\xb8\xb9\x60\x6f\xf9\xb9\xfb\x70\xf4\x76\x7c\x3e\x72\xdd\x73\x3c\x75\x09\x3f\x9b\x9e\x1c\x9f\xcf\x6c\x75\xe3\x32\x3c\xcb\x5b\x93\x1f\xf4\x7d\x3d\xf4\x2d\xbb\xb4\x8d\x1b\x89\x1f\x0c\x28\x65\x4b\x93\xd2\x4c\x19\xaa\x32\x97\x90\xba\x6c\xa4\x9c\xa8\x32\x97\x34\x91\x40\xf0\xa0\x9b\x8b\x9a\x7f\x66\xd8\xf3\x2f\x4b\xed\x83\x8a\x56\x08\xcb\x4b\x92\x5c\xea\xe7\x42\xeb\xfa\x90\xe0\xa3\x1b\xb9\x25\x9a\xc1\x69\xea\x4a\x2f\x99\xa2\xbb\xf4\x32\x46\x14\xa9\x57\xde\x6d\xac\xd0\xf9\x3f\x1d\x77\x5b\x48\x89\x3e\xdd\x07\x6a\xa1\x43\x0a\x5e\x36\xdb\xfc\x9a\xb9\xe9\x81\xaf\xa5\x1b\x38\x4d\x93\xdb\x4d\x13\x36\xf2\x0f\x78\xcf\xe4\x87\x5b\x79\x7f\x3b\xde\x27\x98\xd8\xf4\x53\x4c\xb2\xa9\x98\xf1\x75\xa9\x62\xd0\xe3\x2d\x9a\x7e\x89\x9f\x28\xee\x7f\x95\xbd\x90\xd9\x13\xe0\x15\x28\x95\x32\x1e\x1a\x4e\x55\x22\xb3\x29\x23\x56\x6f\x58\xe0\x98\x61\x34\xaf\xca\x96\x39\xa7\x8b\x4e\x73\xae\xe9\x04\x61\x5c\x95\x6e\x0d\x80\xc3\x77\x0b\xc7\x8c\xd6\x3b\x3f\x80\x01\xa2\xd8\xb8\x5b\x21\x35\x5f\xfa\x14\x99\x91\xee\xa0\x65\x88\x11\x68\x74\x89\x8b\x17\x7d\x17\xf8\x77\x84\x91\xc2\x62\x7d\xbb\x38\xc2\xf0\x0c\x2b\x90\x97\x32\xe0\x3d\xe6\x80\x12\x32\xe0\xb5\xa0\x2e\x9b\x62\x0a\x94\xd5\x05\x2b\x14\x72\x0a\x05\x19\x13\xfc\xe3\xf2\xd2\x27\xe1\xc5\x0c\xdd\x23\xa1\x56\x14\xce\x63\x18\x57\xa8\x90\x2e\x76\x99\x18\x59\x33\x9d\x15\x68\x1a\xf5\x24\xa3\xd3\x4a\xf2\xe8\x43\x04\x84\xe5\xd6\x87\xb9\xa2\x68\xd5\x18\x29\xa9\x31\xaa\x4a\x2f\x7b\xaa\x83\x4b\x35\x3b\x76\x67\xb7\xb4\x28\xe6\x74\x38\x41\x18\x87\x12\x55\xfc\x45\xc1\xe2\xbe\x9e\x19\x2d\x92\xf1\x6a\x63\xfb\x40\x00\x98\xe2\xd6\xc7\xb2\x5a\xb2\xd3\xde\x0c\x7a\x07\x62\x64\xe0\x0c\x23\xae\xda\xc1\x14\xa6\x24\x9c\x66\x33\x1b\xf1\x23\x60\x14\x63\x7f\x04\xf5\x7d\xab\x06\x26\x59\xab\x75\x36\xeb\x2b\xd0\xb2\xb9\x10\xd9\x26\x8d\x83\x22\xcd\xaa\xc8\xb6\x9e\x97\x8d\x79\xff\xf8\xf8\x08\x1a\x69\xe7\x81\x36\x95\x03\x77\x6d\xde\x66\x98\xf9\xb4\xce\xcc\x94\x02\x7e\xcd\x8c\x2b\x23\xe8\x3c\xab\x47\x7d\x2b\x3e\xaa\x86\xf5\xb7\xea\xde\x56\x79\x70\x60\xcc\xc1\x58\xe0\x3d\x0f\x76\xa6\xfc\xe8\xcd\x73\x26\x73\x8d\x22\x95\xa5\x79\xea\x46\xa9\xf9\x19\xf3\xdf\x79\xda\x8c\x66\x3e\x76\xe4\xce\xca\x83\x16\x92\xd5\xa7\xfe\x18\x48\xdb\xbe\x0f\xa0\x7a\x30\x19\xf8\x49\xf3\x62\x8f\xed\x47\x0a\x0f\xbc\x04\x0e\x69\xa3\xc8\xe5\xfd\x45\x10\x3b\x74\x1f\x8d\x8b\x49\x62\x0d\x9d\xc2\xf6\x87\x50\xc3\xd0\xc3\x47\xb3\x92\x8b\x06\xb5\xe0\x18\x14\xe0\x75\x2b\xc5\x4c\x3b\x2f\x55\x1c\x60\x18\x53\xa2\xa5\xac\x32\x8c\x03\x5e\xf2\xad\xfb\xac\x5c\xcb\xa1\x28\x2a\x9b\x9c\x4a\x8d\xff\x90\x7a\x96\x4c\x84\x7f\xe2\x58\x09\x9a\x4f\x09\xaf\xfb\xe4\x91\xb1\x29\xdf\x7e\x64\x3a\x2a\x33\x06\x64\x96\x8c\xe1\xbc\x30\xcb\x0d\x6a\x8b\x82\xc4\x79\x63\xba\xe2\x3d\x2b\xdb\x76\x1e\x58\xd7\x90\x0d\xfa\xd8\x9f\x86\x30\xe3\xd5\x81\x1a\x09\x7d\xc3\x8a\x38\xa6\x8e\xed\xb9\xb9\xc3\x47\x77\x58\x35\x9f\x0e\xc9\x96\xa5\xfb\xf0\x91\xcd\xf6\x2c\x9e\x61\x8e\x7a\x2f\x03\xc3\xcc\x6c\xd0\x43\xc3\x88\x84\x0f\x70\xfa\xf0\x7e\x8e\x6a\x26\xea\x00\x3a\x03\x37\x71\x8c\x11\x78\x30\x84\xcc\x08\x5b\x68\x01\xa6\xb4\x9d\x97\x41\xaf\xb1\x75\xde\x37\xd6\x16\x65\x54\x7c\xd0\x7d\xd2\x1f\x3c\x7a\x6a\xb4\x61\xd0\xb1\x4e\xe1\x58\x00\xcd\x31\xd6\x9b\xd7\x98\xef\x77\x8d\xd9\xe9\x0d\x61\x15\x61\x5d\x9f\x74\x1f\x3d\x1e\x3e\xc2\x2d\xe3\x0f\x5b\xdf\x60\x7a\xa1\xa9\x47\xf4\xd5\x76\x12\x17\x7e\xfc\xa1\x7a\x6f\xe6\x1a\x76\x87\x46\xb6\xaf\x4e\x20\x63\x23\xf5\x71\x23\xf9\xe9\x43\xc8\x60\xa8\x9a\x4d\xca\x62\x15\xc6\x15\x65\x81\xcf\x06\x65\x41\xd1\x52\xba\x21\x51\x16\x31\x51\x16\x2b\x45\x59\x84\x8a\xb2\x88\x6b\xca\x22\xca\x5f\x05\xaf\xac\x94\x82\xd9\xd1\xf5\x3d\xf2\x43\x66\xe3\xed\xc1\x3e\xda\x4d\xd1\x7b\x64\x4f\xac\x88\xa2\x13\xc8\x77\x81\xe9\x2b\x5f\xd8\x7e\x34\x1e\x3c\xed\x4f\x22\x8f\x9f\x3c\xee\xfb\x1e\x3c\x13\xa6\x8b\x5c\x7c\xb7\x0f\xa1\x86\xbc\x90\xa4\x0a\x23\xd2\x84\x49\x52\x04\x71\x85\xa1\xc9\x6e\x8c\x34\x37\x46\x9a\x1f\x18\x69\x7e\x60\xa4\xf9\xe7\x8d\x34\xff\xbf\x32\xd2\xf0\xe3\x23\x7d\x63\x8e\x34\x0e\x6a\x6a\x11\x9f\x8d\x91\xc6\xcc\x10\x4a\xd0\x48\x63\x35\xd2\xe0\x53\xa8\xc5\x07\xab\x8f\x77\xe5\x9b\x16\x9f\x87\x86\xc1\x07\x08\x2b\x83\x8a\x4c\x90\xba\x32\x4f\xce\xeb\xb2\x16\x1a\x4f\xb1\xbb\xd0\x59\x34\x43\x98\xe2\x76\x4c\xba\x73\xb4\x04\xf9\xa7\x94\x86\x80\xbf\xca\x20\x5f\x30\x16\xf8\xf2\x2d\x52\x2b\x05\x06\xfb\xb4\x6f\x6e\x00\xf1\xa3\x7b\x0e\x5a\x25\x9c\x0a\x7d\x75\x0d\x82\x18\x7c\x46\x82\x0c\xdf\xe9\x21\xa3\xbf\x25\xfe\x55\x5a\x0a\xe5\x8b\x61\x65\xa6\xbc\x85\x2e\xb2\x21\xbb\x0d\x53\xd2\xe2\xd5\xfe\xad\x64\x5e\x4a\xe5\x6b\x63\x22\xe8\xb3\x80\x3e\x2f\x66\x4a\xec\x43\xa6\x4b\xd3\x8c\x45\xfa\xc3\x5b\x71\xcd\xa3\x86\x58\x07\xb8\x34\xa8\xc8\x37\x04\x77\xbf\x96\x1f\xbb\xe6\xc7\x50\x8e\x97\x6d\x2b\x5a\x84\xc8\x54\x43\x62\x9b\x97\xf7\x5a\xad\xcb\x71\x1a\x2e\x05\xdf\x96\x6d\xdf\x08\x8a\x9d\x28\x1c\xe3\x62\x1f\xa1\xae\x0a\x32\x54\x8d\x77\x52\x32\xb0\x15\x69\x4e\x80\x70\x58\xcb\xd0\x69\x8d\x2f\x64\xc6\x1f\x19\xa6\x5f\x18\xdd\xac\x7e\x8b\x21\x4d\x2e\x09\x1a\x23\xeb\x47\x54\xd4\xe0\xf4\xb1\x15\x2a\x5e\xf1\x61\x89\x5f\xc8\x90\x6c\x83\x9f\xf0\xa9\xc2\x36\xd0\xef\x23\xa2\x34\x6f\x6e\x30\x9e\x11\x3e\x0f\x66\x78\x41\xbc\x8c\x09\x51\x35\x66\x75\xa4\xde\x18\xe3\x4a\xc8\x07\xbb\x03\x1b\xad\xa2\x8a\x07\x92\x2a\x26\x33\x86\x90\x8c\x78\x18\x7c\x3d\xd1\x5f\x07\x33\xe2\xd0\x91\x62\xf6\x55\xdd\xb2\x51\x6a\xce\x6c\xc6\x0d\xf1\xce\x4e\x1f\x48\x4e\x16\x1f\xf1\x7c\x62\xc5\x5e\x4e\xa0\x21\x27\x50\xe0\xe7\x5e\x8c\xaf\x18\xf3\x52\xc1\x86\xba\x13\xaa\xe6\x4c\x0a\x71\xdc\x8e\x9c\x11\xcb\xe8\xb1\x37\x94\x3d\x8a\x59\x4e\x7d\xc9\x8f\x8f\xef\x2a\xe4\xe6\x2e\x8d\x71\x71\xc4\x57\x93\xbb\xdb\xc0\x19\xfe\xe3\x50\x13\x18\xb7\x13\x28\xf4\xd5\x7e\x0b\xaa\x88\xbb\x92\x0d\x2c\x69\x0d\x36\x34\x1d\x4b\x5a\x83\x0d\xad\x81\xe0\x7b\x05\x71\xe9\x3e\xb6\x12\xc2\x7b\x28\x3b\xb0\x94\x41\x26\xf5\x5a\x08\xdd\xb1\x25\xa9\x90\xf5\x6a\x58\x03\xdd\xf6\x40\x36\x6c\x1f\xe8\xb0\x6c\xd7\xdd\xc8\x0e\x8b\xea\x3a\xd7\x83\xec\x05\xc6\xa4\xa0\x7b\xee\xa2\x53\x31\xb2\xb3\x29\x50\x2f\xe5\x34\x92\xec\x45\xd1\x60\x2f\xb2\x9a\xbd\x30\xb4\xe8\x2d\x48\x89\x37\x34\x71\xe4\x46\x01\x78\x0d\x7a\x87\xd8\x51\xb2\xa1\xef\x15\x66\x20\xb8\xcf\xae\xe3\x41\x15\xb4\xaa\x5f\x87\xac\x1a\x30\x55\x75\x83\x00\xfe\xb3\x6c\x1b\xe4\x49\x0f\x05\x52\xc1\x4a\x6f\x04\x38\xe4\xbf\x29\x08\x0c\x27\xbd\x98\x8d\x0a\x94\x43\xa2\x3e\xad\xc0\x08\x43\x40\xc2\xe9\x05\x2b\x6a\x9b\x25\xe3\x96\x5c\x21\xb3\x97\x5a\x5d\x16\xb1\x3e\xd6\x85\xa6\x2d\xb2\x78\xcd\x4d\xd4\x5a\xe5\x56\xb7\xa6\x64\xa2\xa6\xf3\x4b\x7f\x1a\x81\x37\xda\x6a\x8b\xaf\x84\x8b\x03\x35\xd6\xe9\xe6\xc5\xb6\x6a\x3e\x49\x22\xc4\x01\x28\x6a\xf0\x37\xaa\x6f\x27\xa4\xf6\x61\xe0\x7f\x29\x14\xa4\x6e\x3e\x40\x83\x5c\xf5\x24\xcd\x2c\x47\x25\xd4\x10\xa1\xa5\x55\x79\x28\x57\x6d\x84\x59\x6b\x4b\x95\x04\x7e\x11\x6d\xc5\xfc\x86\x1b\x46\x1c\x5f\x98\x29\xc7\xdc\x7b\x62\xa8\x14\x9b\x85\x1e\x62\x98\xd6\x2d\xd9\x42\xc1\x03\x5e\x2b\x6f\x88\x39\x7f\x6f\x55\x63\x90\x85\xff\x2a\x9b\xba\x0b\x0a\x0f\x2f\x6f\xf0\x09\x57\xb8\xd6\xf0\xe5\x08\x39\xce\x60\xd1\x88\x99\xa7\xc5\x6f\x41\x75\x05\x0d\x00\x6f\x3a\x15\xe1\x29\xd9\xb5\xa5\xd3\x70\xc6\xe4\xaa\x20\xa1\xf3\x2f\x8c\x60\x57\xc8\x78\x20\xb2\x62\x17\xa0\xb6\x7c\x02\xb2\xa2\x7a\x76\xe0\x61\x0b\x14\x46\xe3\x83\x0c\x75\x5a\x89\x17\x65\x77\x90\x46\x97\x5f\xba\x5b\xe5\x20\x01\x50\x76\x9e\xae\x2d\xdb\xeb\x3e\xd2\x51\x6b\xbb\xbb\xfd\xb4\xca\xbe\x09\xa8\x04\x9d\x8d\xe4\x2c\xb3\x51\xdd\x39\x95\xf0\x5c\x4e\x42\x8c\x7d\x8c\x9d\xaa\x41\xec\x61\xfd\xba\xbb\x85\x72\x5b\x9e\xf5\x74\x71\x1c\xe4\x8e\x97\xd5\xbb\xa1\xb9\x6a\x9d\xdc\xca\x07\x13\x57\xa1\x83\xda\x04\x80\x7b\xe1\x2a\x8a\xe7\xb0\x69\xe1\xf1\x2a\x88\x4b\xd1\xc1\x59\xa3\xf9\x06\xaa\x8a\xbc\xca\xdf\xe6\x3c\x8b\x4c\x1c\xfc\x63\x5b\x66\x41\x56\x8a\x72\xfe\x61\x4f\xab\x6d\x68\x93\xaa\x01\xc5\x2b\x0c\x15\x0e\x5d\xdd\x90\x94\x3e\xe9\xe3\x69\x57\x2b\x8d\xf1\x63\xa4\x84\x63\x64\xab\x0b\x3f\x4a\x94\xa4\x18\xba\xaf\x43\xed\x12\x0d\x70\x47\xe3\x59\x75\xfe\x30\x66\x40\xa3\x07\x25\x8f\xf6\x7a\x20\x03\xdc\xd3\xc6\x4a\x4f\xcb\xaa\x17\x11\x5e\x54\x22\x25\x17\x55\x33\x59\xd5\x4c\xd1\x30\xf5\x4c\xa2\x86\xf8\x5f\xb7\x68\x68\xc0\x9a\x19\x68\xca\x0d\x9d\x57\xd4\xd2\x60\x50\xba\xb7\x97\x2f\x33\x6b\xa9\xa2\xc9\x25\x4d\xaf\xb0\xc4\x50\x6f\xe8\x8e\xdc\xdc\x4c\x01\x79\x1c\x76\x1e\xfb\x20\x41\x2f\xba\xb0\x12\xe0\xc5\x78\x7e\x88\xd6\x0c\xf5\x55\x74\x97\xda\x23\x8a\xee\x52\x7b\xa4\x91\x3e\xf4\xf0\xb9\x4f\x1a\xcd\x9d\xa9\x12\x0b\x5a\x43\x51\xee\x70\x7a\x71\x0c\x9d\x4b\xd4\x84\xc9\x78\xcf\x32\x59\x71\xd5\x91\x37\xa7\x78\xef\x51\x21\x31\x65\x31\xab\x82\xf0\x3e\x30\xb4\xb0\x71\xd4\x36\xe8\x18\x18\xd7\x26\x21\x36\xaf\x65\x62\x95\xfc\x8a\x22\xd3\x09\x32\xeb\x18\x97\xb4\x7d\x05\xc5\x3e\x3a\x50\x7f\xde\x9c\x88\x4c\xcc\x4b\xc0\x39\x0b\x40\x3a\xe6\x9d\x3f\xcd\x65\x06\xee\xa4\x41\x5f\xaf\x9a\xc9\x4b\x7c\x95\xb2\x14\x11\xc5\x56\x65\x23\x5f\x89\xe4\xa4\xaf\xcb\xcb\x57\x43\xb7\x21\x3b\x59\x46\xed\xe3\x42\x37\xb7\x4a\xe7\xf3\x92\x4b\xe3\xf1\x0c\x30\x32\x8b\xe4\xcc\x89\x53\x5e\xc0\xb9\x41\x41\x5b\xe9\x08\xb7\x32\x83\x36\xe2\xc6\x6c\x8c\xe1\x4d\x71\xe3\x49\xff\x3d\x7c\x0a\x90\x1a\x31\x2f\x0e\x6d\x0d\x52\xed\xe5\xa2\xbd\x97\xe7\x51\xd3\x5e\xe5\x62\x13\x84\x6f\x2f\x12\xb1\x05\x44\x6b\xbc\xa0\x26\x5b\xbd\x6e\x32\x71\x85\x4a\x6e\x33\x15\xd0\xaf\x99\x6a\xe0\xdb\xb5\xaa\xff\xde\xca\x0c\x51\x69\xa3\x3b\x4a\x75\x48\x2a\x61\x52\x02\x12\x5f\x9b\xb9\x45\x57\xcf\x4e\xf7\xab\xaf\xbe\xc2\x00\x7c\x63\x0c\xb4\x95\x39\xc6\x56\x38\x8b\xf6\x43\x5f\xe4\xa6\x68\x15\xab\xce\x80\x78\x06\x36\xa3\xa2\x98\xe0\xab\x8b\x5f\x17\xb6\xbe\x1d\x51\xe6\xdd\x51\xde\x15\x05\xf8\xa9\xf3\xee\x28\xef\x92\xc2\x0b\xe3\x6d\x74\x0d\x10\x17\x57\x06\x48\x76\x43\x8f\x50\x9b\x46\xa2\x16\x0e\x1a\x47\xd3\x52\x8c\x29\xd1\xc3\x98\x12\x64\x67\x8a\x16\x43\xd5\xad\x7a\xdb\x88\xfc\x67\xe8\xb2\x88\xee\x96\x7b\x19\x6a\x84\xe0\x10\xf7\x19\xb9\xab\xc5\xe8\x1c\x01\xf0\x94\xdc\x04\x4a\xc8\x50\x42\x7a\xa9\xd2\xf1\x52\xce\xf1\x50\x82\x58\xf4\x34\x18\xce\xd8\x75\xa4\xee\x34\x64\x74\x27\xd3\x1c\x5f\xb1\x05\x73\x3d\x22\xfc\x4c\x9a\x07\xd4\x4b\xd4\xeb\x06\xe0\xf9\x64\x14\x8f\xd3\x51\x8a\xbe\x19\xba\x26\xa8\x37\x55\x57\x6e\x6d\x30\xac\x3e\x1c\x69\xbc\x21\x42\x5a\x68\x96\xe6\x86\x0a\x80\x16\x2c\x47\x68\x36\x6d\xd4\x79\x05\x75\xe1\xe5\x0e\x91\x15\x90\x1a\x75\x03\x65\x2b\x93\xeb\x01\xe7\xf2\xa6\xb9\x90\x9b\x3d\x1c\x85\x78\x07\x8c\xf1\xe1\xf8\xf8\x08\x2a\x08\xd1\x15\x2e\xe4\xa1\x91\xc0\xf0\x96\x85\xd1\x66\x62\xcd\xc7\x57\x37\x37\x57\x9c\xcf\x8f\x8f\x61\x86\x4e\x61\x16\x27\x6b\x1a\x00\x9a\x7e\xe3\x13\x0f\x19\x85\x9c\xf4\x80\x91\xd0\xb3\x52\x62\xd4\x2a\x98\x26\x19\x7e\x69\x8d\x91\x74\x17\x68\x60\xb5\x43\x53\xab\x25\x3e\x9d\x01\x98\xc3\xfe\xa1\xd9\xa9\x9e\x19\x39\x23\x0c\x8d\x0d\xf9\x9a\xa1\xad\x21\xdf\xe9\x0b\x30\x70\xe3\x9c\xc1\xb7\xcc\xb0\xfa\x83\x8c\x40\xfa\x6c\x5d\xc8\xe9\xa0\xf2\xde\x1e\xa1\xd9\xc9\x19\xab\xf7\xc0\x65\x43\xad\xbb\x8d\x24\x8d\x67\x1c\xa8\xe4\x8e\xe3\x74\x49\x59\xe7\x22\x16\x85\x78\x60\x96\x60\xad\x6f\x58\xd0\x10\x8c\x47\x7b\x16\x41\xd5\xde\x96\xf4\xd9\x96\x17\x2e\xcf\x1c\x49\x84\x02\x46\x91\x2f\x3b\x34\x98\x71\x38\x46\xd9\xab\x59\x01\xba\xb8\xac\xe2\x07\x90\x97\x4a\x47\x36\xb4\x80\x9c\x94\x6a\xc4\x10\xbc\x47\x6d\x03\x9b\xcc\x15\xb8\xa3\x2b\x58\x10\x69\x58\x40\x96\x9f\x14\xbe\xfd\xa6\x56\xbf\x17\x2a\x3f\xec\x3c\x19\x3b\x70\x94\x3a\x3c\x45\x01\x50\xa6\xae\x04\xed\x3e\x72\xad\xcc\x4b\x29\x62\x67\x50\x5f\x56\x4d\x81\xf7\x6b\xc6\x69\xe8\x50\x00\xbe\xc0\xf6\x20\x33\x5e\x14\x0d\x45\xf0\xf6\x1b\x59\x6a\x24\xba\x44\x80\xbb\x21\x34\x12\x3b\x11\x2c\x15\xd1\xe1\x2e\x06\x4d\x88\x9d\x52\x1a\x73\xe9\x4c\x99\x4e\x36\x74\x08\x6d\xe8\x2c\x39\x17\x5e\x31\x55\x93\x81\x19\x97\xfb\x6d\xd4\x30\xb2\xd4\x2b\x51\xd1\x29\x4a\x86\x4e\x31\xb5\x81\x71\x33\x54\x02\x91\xe9\x8c\xb7\x57\x14\x30\x6b\x05\xa4\x26\x62\x5a\x78\x83\x56\xf9\x67\xad\xe5\x10\x3d\xc0\x7b\x11\xcc\x7e\x84\x37\x8a\x87\x1e\xde\x41\xd8\xcd\x5d\x4e\x64\xb0\x4b\x6f\xef\x5d\x8a\xaa\xb6\x76\x4d\x32\xe3\xd5\x1e\xde\xef\x6b\xbc\x5f\xf5\x89\x19\x5c\xa3\xe7\x45\x44\x89\x4a\x7e\xbb\x59\x2b\x83\xcd\x86\x8d\xc2\xf2\xa0\xa8\xda\xd4\x42\x44\x6d\x99\x56\x37\xa8\x66\xb6\x9e\x5a\xf8\xea\x1b\x7d\x7b\x6f\xd2\x0c\x03\x57\x23\xd3\x43\x82\x5a\x5c\x43\xa3\xbd\x77\x87\xa9\x8d\xaa\x5c\x93\xc8\x00\x82\x0d\xc8\x90\x9e\x26\x6f\x0c\x79\xfd\xfd\xab\x8b\xd7\x8c\xa9\x05\x86\x9c\x52\x3c\x69\x1c\xf1\x5f\xee\x5f\xe2\x07\x82\x94\x2e\xf5\x32\x43\x7e\xb9\xd2\x8d\x5a\xde\x18\x43\xc1\x78\xd2\x70\xd0\x76\x3e\x1e\xe8\x39\xbe\xcc\xb7\x6c\x8e\xaf\x73\xf3\x4a\xb7\x6f\x5a\x94\xc3\x16\xe8\xa8\x13\xba\xd1\x08\x0e\x42\x21\xa9\x1c\x2c\x4a\x5e\x71\x1e\xa5\x21\x71\x37\xdf\x91\x6b\x9c\x87\x57\x85\x8f\x2a\xed\x20\xd2\x75\xb0\xae\x65\x0f\x1d\x00\xfb\x36\x93\x32\x73\xe4\x16\x29\xa0\x2f\x7c\xd1\x2e\x5a\xd8\xa3\x12\xbb\x13\x99\x02\xe5\xe8\x93\x5c\xda\x1e\x88\x71\x31\xa1\x4b\xe1\xfc\xa9\x68\x84\x8a\xf9\xb5\xb5\x94\x48\x06\x4b\x9f\xc9\x49\xe3\xcd\xb2\x7d\x6c\x4b\xd1\xc9\x26\xbd\xf7\xcf\x1e\xcc\x94\x56\xca\x24\x4b\x25\xa9\x80\x71\x27\xd4\x3d\x12\xf8\x88\x5c\xa3\x1b\x7e\x2c\x51\x53\xe8\x2a\x8f\x4d\x75\x2b\x64\x24\x2f\x18\x05\x46\x7d\x5a\x56\x03\x8d\xc6\x29\xce\x28\x9a\xc9\x49\xe1\x04\x85\x03\x88\x28\xcc\x28\x72\xe6\x50\x02\x0e\xc4\x22\x4e\x53\xb2\x1d\xc3\xa2\x78\x98\x90\xc2\xc5\x9b\xd1\x0c\x89\x6f\x63\x62\x26\x1f\xa8\x88\x7f\x97\x56\x52\x56\x58\xf4\x12\xdb\x49\x6e\x19\x56\x77\x67\x56\x6a\x4b\xe5\xbc\xf5\xd7\x86\xe9\xe1\x4f\x7b\x33\x49\x12\x66\xba\x73\xb8\x7f\xbf\x7a\xdc\x93\x74\x07\xde\x0b\x7c\x9a\x90\xad\x15\x5d\xb3\x27\x4d\x16\x6c\x38\xa1\x57\x22\xcb\x05\x79\x7c\x14\xfb\x5f\xe5\x3d\x99\x3c\x40\x71\x95\xbc\xd0\x12\x6a\x4a\x3d\x32\x2f\x07\x12\xc7\xd6\x97\xf9\xe2\x4a\xd2\xe7\x82\x3e\xef\x2d\x66\x4d\xbf\x06\xdd\xcb\x28\x17\x21\x05\x41\xa6\x90\xe0\x5e\x75\x3b\x22\x12\xfa\x64\xf2\x62\x35\x65\x72\x3f\x18\xa3\xaf\x59\x3f\xab\x11\x01\xe4\xf0\xe0\xc7\xc3\xc9\x4f\x91\xff\x0f\xfa\x8e\x66\x93\x1f\x4a\xff\xa7\x4a\xd1\x93\xca\xab\x50\x19\xb9\x96\x05\x74\x5d\x43\x02\x2f\x6b\x0c\x45\x63\x70\x91\xc6\x4a\xa7\xc8\x57\x13\x4a\x65\x41\xd5\xe3\x7d\x9f\xf3\x3a\x82\x15\xe6\x87\xf9\x99\xa7\xeb\x20\x32\x62\x09\x16\xf7\xc4\xb8\x4a\x60\x0d\x90\x17\x7e\x55\xae\x2f\x45\xa6\x82\x8e\x25\x58\x0b\x9d\xae\x83\xcd\xec\x55\x82\x91\x2e\xa8\x60\x51\x15\x7c\x83\x4a\xa7\x43\xa5\x23\xcd\xde\xda\x86\xf5\x86\xb0\xbe\x29\xa9\xeb\x61\x1c\xac\x37\x9f\xd6\x68\xa6\x1b\x45\x87\x51\xb3\xae\x4f\x2b\x2e\x74\x71\x81\xc5\x8b\x28\x7c\x9b\x1f\x9a\xb1\x3f\xe4\xb9\xd7\x79\xbe\x4d\xb3\x75\x60\x4c\xbe\x89\xe8\xbe\xd0\x98\x0f\x33\x27\xb0\xad\x0f\xd5\xf7\x97\x8a\x6a\x87\x91\xf3\x70\xbc\xe9\x66\xc7\xf7\xad\x6e\x8c\xfd\x77\xdb\x0c\xb2\xf7\x67\x74\x9f\x40\x8b\xa6\xb6\xa3\x7e\x69\x09\xe0\xc5\x98\x1a\x14\x76\xe1\x0c\x77\x8c\x1a\xff\x6a\xd6\x48\x80\x0e\x00\xce\x6f\xf2\x33\x5e\xab\x66\x64\xfe\x4d\x73\x92\xe4\x2d\x2f\x63\x65\x0c\xfa\x5a\xf5\x49\x18\x80\x18\xa5\x81\xf4\x59\xd6\x31\x44\xd0\x34\x60\xa0\x24\xe1\x12\x3c\x19\x31\x2b\x8a\x8a\x7b\x87\x9a\x10\x48\x17\xbd\xac\x8a\x86\xd5\x1d\x3c\x1a\xf3\x68\x52\x3a\xd0\x8c\xdf\x3d\xd1\x2f\x8f\x7c\x54\xd7\x93\xa8\x13\xde\x86\x36\xc3\xd6\x78\x0d\xd3\xf0\xb5\x57\xda\x4e\x49\x3a\x43\x6e\x34\x8c\xef\x94\xe2\x76\x1f\x51\xf2\x70\x86\x16\xcc\x86\x78\x78\x7f\x86\x71\x36\x75\x38\xb6\x80\xa9\x39\x30\x5d\x64\x5a\x14\x9a\xca\x21\xbd\x4e\x14\xcc\x88\x42\x69\x6b\x26\xdd\x44\x4b\x7d\x3d\x29\xeb\xe4\x1d\x34\x39\x9e\x3e\x9d\xe9\xe0\x35\xd0\xe2\x82\xb6\xd9\xeb\x4c\x2c\xa2\x6d\x4d\x11\xab\x6b\x65\xe8\x62\xcd\x4c\x5e\x09\x56\x09\xee\xa7\x4f\x66\x64\xbd\xf7\x64\xc6\x3b\xdd\x8e\xfb\x75\x64\x29\x25\x1d\xe4\x1c\xd2\xa5\x6b\xd8\x04\xef\x2c\x3a\x4c\xd4\x2d\x40\x3f\xb4\xca\xe4\xa0\x52\x5c\x54\xb5\xa0\x59\x22\x3c\xef\xd6\x97\x69\x7c\x7b\xdb\x6e\xee\x77\xe4\x24\x9e\xce\xf0\xf2\x78\x52\xe7\x54\x7a\x18\x49\x83\xf3\x0e\x93\x7d\xa2\xbe\xb8\xd0\x89\x51\x3d\xbb\xaa\x27\xa6\x85\xff\xd7\x06\x14\xf4\x0e\x6d\x9a\xc4\xd8\x32\x6e\xb7\x3f\x30\xca\xfe\xde\xa0\x88\xbe\x46\x62\x6d\x58\xe3\xfa\x04\x8d\x17\x77\xb1\xd2\x04\x5f\xe6\x96\xf0\x20\x8b\x39\xc3\x85\x9e\xe1\x42\xce\xb0\xed\x3e\x70\xad\x8e\xe8\x1c\x61\x70\x08\xd4\x7a\x39\x56\xe7\x4b\x5c\x32\x53\xe6\xf9\xaf\xc3\xf8\xa2\x16\x3f\x2a\xb7\x03\xec\x7b\x7f\x9c\x4c\xfa\x3e\xd4\xe5\xd5\xc3\xa1\x7b\x83\x30\x72\x53\x1d\xb3\xa5\xb0\x0f\x23\x05\x55\x93\x36\x3d\x52\xb5\xc8\x57\x2f\x69\x84\x58\x36\x28\x5f\x0a\x01\x53\x5d\x91\x94\xee\x21\x91\xc2\x20\x7d\x12\x1d\x54\x14\x4b\xb0\xf4\xb3\xd0\x89\x20\xbf\x29\x60\x1b\xd0\x82\x80\xca\x59\x56\xd6\x44\x31\x52\xf6\x5a\x62\x2c\x1a\x82\xdd\x69\xf7\x32\xc8\x0d\x58\x29\xee\x45\x34\xae\xa8\x6b\xce\xcc\x9a\x0a\xac\xa9\x09\x75\x35\x31\x0a\x20\x4d\x67\x65\x72\xfa\xfc\x6d\xed\xb6\x52\x55\x87\x4e\x71\xaa\xab\x40\x8d\xa5\x58\x5f\x0b\x2d\xe8\x50\x25\x00\xe7\xb2\xea\x3a\x83\x44\xfa\x8b\xa9\x48\x11\xc6\x6e\x2d\x31\x46\x14\xcb\x0d\xa8\x54\x5a\x21\x9e\x33\x5e\x7c\x39\x98\x0c\x7d\x72\x56\x8e\xf2\x6f\xa3\x24\x02\x04\x98\x7b\xb1\x34\xec\x16\xca\x3b\x22\x1f\xc7\xa3\xd8\x75\x2b\x26\x7e\x45\xb1\x00\x56\xa3\x15\x7c\x53\x77\x2c\x44\x56\x6c\x3b\x2b\x7b\x64\xbc\xaa\x23\x47\xe2\x10\xe3\x2b\xd6\x74\x9a\x8f\x8c\xca\x16\x40\x05\xad\xc6\xfd\xd1\xca\xf3\xda\xd5\x61\xa6\x18\x38\xbf\x74\x1a\xcf\x4e\x03\xea\x84\x8a\x46\xa0\x95\x4f\x90\x84\x31\x08\xc6\xe1\x28\x87\xe2\xa3\x14\xed\x00\x88\x90\x23\x45\x78\xa5\x72\x53\x33\xd8\x46\x9a\x5a\xf7\x77\xd4\x5e\x60\xad\x07\x3c\x8b\x47\xfb\x76\x6b\x93\x82\x9f\xc5\x7e\x47\xd7\x02\x07\xb2\xd8\x6d\x44\xba\x78\x20\xb1\x50\x0d\x49\xb4\x13\x45\x56\x91\xa9\x70\xb2\xbb\x03\x96\xf4\xd4\x82\x02\xb9\xa9\xfd\x43\x42\x2e\x90\x92\x18\x08\x6f\x30\xac\x05\xcc\x18\x0c\x88\x7b\xc6\x47\x5a\xd0\xfb\x18\x86\xa4\x17\x59\x21\x31\x0d\x2e\xec\x70\x20\x5f\x27\x28\xeb\xf4\xd1\x66\x07\x26\xe1\x0e\x2c\x8f\x50\x83\xd2\x90\x16\x56\xc8\x1e\xf0\x7b\xca\xcc\x63\xfc\x5d\x85\x5b\x6a\xd5\xc7\x81\x93\x2d\x91\xcc\x8f\x91\x0c\x4a\x07\xbf\x83\x9e\x21\x9c\xff\x8c\xf3\x9e\x7d\x1e\xf9\x58\x9d\x72\x71\xd7\x29\xcf\x88\xc4\xca\xda\x67\x29\x31\x49\x2c\x81\x43\x56\x79\x0e\xee\x96\x9a\xc4\x12\x4c\xd2\x63\x59\xeb\xb0\x9b\x91\x01\x55\x9f\xfe\x92\x15\x53\x66\xb1\xdd\xa4\x49\x23\x3a\x50\x7a\xcf\xb0\xe4\x4c\xe2\xad\xd2\xd5\x5c\xd6\x60\x47\x98\x43\x2b\xb0\xf2\x3b\xd6\xf7\xbb\xe6\xfa\xca\xd5\xcd\x1a\xab\xfb\x63\xf4\x31\x93\xdd\x62\x52\x43\x78\x8f\x20\xfe\x5d\xa6\xa7\x3f\x47\x7b\x21\xb3\x6a\x58\x1a\x4d\x2d\x40\xf6\x4b\x81\x88\x16\x30\xb7\xa2\x14\x49\x22\x53\x4c\x80\x1a\xc1\x04\xa6\x6e\x6c\xc7\x60\xac\xfd\x1e\xd0\x62\xde\xc0\xfe\x52\xeb\x08\x1b\x71\xa3\x1b\x51\x57\xf7\x14\x56\x77\xe8\xe0\x1e\x14\xae\x00\x3e\x53\xed\x55\x14\xc2\x57\x12\x81\xbd\x3d\x97\xdd\x0f\x20\x92\x51\x22\xcd\x9e\xd0\xff\x2a\x1e\x99\x9a\x72\xf2\x01\xc8\x6a\x49\x67\x7a\x4a\xac\xe4\x2a\xc8\xf1\xf6\x41\xe4\x15\x6f\x6e\xe4\x78\x23\x3d\xde\xa8\xa6\xa3\xc4\x14\xe6\x63\x56\x85\x8b\x2a\xba\x81\x8d\xd1\x9b\x3e\x83\x17\x8a\x80\xaf\x40\x16\xb9\xe0\x1f\x0a\x5f\x13\xe4\x81\x5f\x65\xa4\x48\x67\x51\x55\xe9\x6b\xd4\x68\x1b\xc7\x02\xfd\x8d\x3e\x1c\x34\xda\x0d\xb8\xa2\xb3\x43\xa0\x16\x29\xba\x4b\x59\x79\x25\x6b\x10\x69\x85\xdc\x0a\xdd\x18\x85\xe2\x7d\x1b\x1d\x6a\x43\xbb\x67\xd5\x62\x0a\xb7\xbe\x30\x13\x45\x21\xa1\x9b\x3b\x01\x64\xcd\xed\x76\x8f\x65\xaf\xda\xfd\xae\x3a\x4d\x9c\xc5\xff\x7a\xcf\x15\xf2\x94\xe6\x8a\x6a\x18\xf6\x5d\xe3\xb8\xe9\x37\x47\x62\x14\xa5\x41\xb9\x58\xc8\x6b\x96\x71\x72\xaa\x71\x7f\xb8\xc6\x78\xee\x1c\xf3\xd7\x41\x32\x6f\x8e\x96\x85\xf7\x8c\x77\xcf\xb8\xfa\xf4\x04\x52\x42\x1e\x68\x6b\x08\x9c\x82\xd3\x52\x5e\x85\x5b\x4e\x63\x0f\x1e\x16\xf8\xd1\x8b\x31\x48\x87\xb5\xf0\x72\x73\xc8\x81\x3b\xc4\xd8\xb3\xc6\x90\x73\x77\xe5\x84\xa8\x0d\x8b\xd1\x57\xb1\x16\xaa\xa4\x7c\x85\xde\x34\x81\x6d\x0e\x90\x3a\x7f\xff\x72\xfe\xbf\x1d\x9f\x41\x26\x1d\x1e\x6a\x6b\xac\xe6\xce\x80\xfc\xc6\xc2\x06\x48\xb2\xe0\xb2\x1e\x9a\x0a\xa3\x98\x9a\x15\x7b\x6f\xdd\xef\x9f\x1b\x4c\x3d\x00\xda\xd3\x2a\x43\x3b\xe8\x5c\x95\x05\x88\x44\x00\x1f\xd2\x5e\x4e\xdc\x85\x22\x7e\xd6\xe2\x05\x0d\x02\x9b\xa6\x14\x69\x0b\xa2\x47\x96\x66\x6c\xfa\x44\xab\x1a\xa1\xa2\x02\xad\xc0\xce\x46\x76\x30\x05\xd2\x65\x86\x24\xd1\xbb\x32\x48\x0a\xbc\x82\x32\x61\xa2\x97\x1d\xb2\x86\x4a\x4d\xd9\x0c\x19\x51\x93\x61\xdb\x84\xc2\x1a\xf5\xfd\x62\x5a\xcb\xcf\x02\xa6\xa3\x29\x56\xe2\xa8\xcf\xe3\x0e\xb4\xb0\x29\xb3\xbb\x8b\x28\x2e\x04\xd0\xc8\xb6\x74\xe9\x45\xdb\x62\x25\x79\x4a\x3f\x57\xf2\x14\x29\xc9\x53\x5a\x8d\x36\x3f\x30\xd3\x01\x66\x90\x84\x4e\x7b\xc9\x6a\x5c\x86\x44\x0c\x99\x26\xfd\xb4\xa0\x5b\xff\xc7\x62\x32\xc5\xfb\x73\xe0\x1f\x4a\xab\x81\x4d\x93\x53\xeb\x4b\xf9\xf6\xa9\x76\xb3\xc2\xcf\xf8\xd1\x90\x76\xcf\xee\x21\xfc\xd4\xba\xde\x62\xd7\x0d\xbb\x98\xf4\x5e\x4a\x4f\x4c\x0f\xd9\x14\xa6\xa6\x50\x25\x72\x28\x68\xa5\xdd\x88\x05\x59\x9a\x51\xe5\xb5\x0a\x42\x45\xb7\x4c\xab\x0f\x68\x17\xa1\x6f\x67\x18\xb5\x08\xa9\x4f\xe3\xcd\x60\xdb\x90\xc8\x07\x79\xb4\x69\x5d\xed\x4c\x4a\xd9\x64\x1c\x68\xa0\x95\x3e\x63\x71\x4d\x11\x5d\x76\xc7\xda\x99\x56\x99\xa2\x5a\x3b\x34\xb3\xe6\x48\x3b\xc1\xc2\xf9\x45\x2f\x72\x31\x2e\x3c\x2b\xdc\x41\x2f\x9a\xdd\x43\xb0\x55\x2b\xd0\x12\xba\x89\xf6\x39\x34\x29\x2b\x31\xa6\xeb\x75\x4d\x31\xb3\xb0\x67\xbe\x3c\x3f\xb7\x77\x52\x38\x1f\x39\x27\x48\x25\x24\x9f\x49\x7a\x50\xc0\x61\x3a\x0a\xe2\x73\x77\xfa\x34\xa1\x7d\x8d\x51\x1d\x71\xe7\xde\x09\xaf\x84\xde\xb9\xa6\x25\x56\xba\x6f\xe4\x21\xb3\xbb\xc9\x6d\xa5\x1e\x55\x1c\x08\x5a\x9d\xa8\xa9\x28\xda\x63\xbb\x7f\x77\x49\xb2\x1b\x57\x96\x66\xa6\xf8\x04\x99\x6d\xf1\x39\x32\xdb\xe2\xae\x31\xd3\xf8\x1a\x97\xea\x94\x69\x9d\x6a\x38\x10\x44\x69\x43\x7f\x15\x25\x89\xc8\xe4\x75\x63\x06\xb8\x6d\xe6\x49\xcb\x62\x3f\x4f\xd0\xcc\x43\x01\xb2\x9e\x35\x63\x3e\x85\xcd\x2c\x22\x99\xb7\x32\xc4\x8d\x0c\x78\xe9\xff\x26\x68\xe7\xc9\xd3\x5a\x6a\xa5\xe4\x54\x09\x3a\x6b\x15\x1e\x40\x87\xcc\x76\xa4\x58\x6a\x60\x18\x6d\xa5\xb5\x2f\xbb\x96\x56\x56\x71\x36\x49\xf9\xa5\xe2\x6f\x02\x09\x6e\x95\x93\xcc\x47\xdb\x2a\xc3\xc6\xc2\x89\x5c\x54\xe0\x63\xa8\x30\x07\x43\x42\x79\x81\x13\x21\x19\x88\x5e\x0f\x21\x05\x29\x1b\xcc\x5c\x0c\xd0\x56\xc8\x2f\x4b\x8a\xbd\xe3\x62\xec\x27\x72\x39\x07\x5a\x15\x63\x3f\x49\xab\x8f\x39\x5f\x79\x39\x5b\xf3\xa5\xb7\x60\x3b\x3e\x77\xe6\xee\xda\x59\xb3\x33\x2e\xbc\x8c\x6d\x79\xee\x2c\xbd\x95\xb3\x60\x97\xdc\xea\x8f\xd7\x13\x6f\xe0\x0f\xcc\x78\xbb\x67\xce\x99\xb3\xf3\xb6\xce\x16\x7d\xd7\xad\xad\xb3\xf6\xe6\xce\xa5\xdd\xc3\x8b\x62\x2c\xf8\x3c\xf7\xd6\xf2\xf5\x9c\x12\x5d\x95\xf8\x56\x26\xba\x2a\xf1\x05\xbf\xf0\x36\xec\x19\xbf\xf6\xae\xd8\x2b\x7e\x0e\xcf\xcf\xf9\x5b\xef\x4a\x83\xcf\x17\xce\x0b\xf7\x99\xf3\x6c\xfc\xca\x79\xe5\x3e\x77\x9e\xd3\xed\xfd\xe7\xd0\xc0\x5b\x38\x6e\xd3\x0b\x2f\x64\xd7\x48\x0b\x4d\x2f\x1c\xd1\x3b\x63\xd7\xf8\x77\x66\x5a\xc0\xb5\x4f\x95\x09\x7f\x70\xff\xc5\xf5\x6d\x9e\xb0\x89\xf1\x6a\x81\x00\x65\xd2\x3a\x44\x26\x4c\xef\x14\x69\xaf\xe9\x8c\xcc\x9b\x70\x52\xb5\xb2\x6a\xc9\x5f\x10\xc6\xdd\xe0\x6f\x86\x0a\xb7\xc5\xe9\x0a\x99\xa4\x30\x88\x63\x79\xe1\x08\xc6\x3f\x5a\x40\x49\x7b\xa2\x82\xc3\x4c\xdd\xa5\x99\x8c\xc6\x59\xee\xa6\xf5\x65\x66\xfb\x79\xed\xa6\x0c\x7d\xa4\xe6\x2b\xa2\xa3\x4e\xc3\xa4\x58\x1f\xed\xb8\x92\x16\xcb\x70\x0f\x92\xbe\x79\x86\x4a\xd3\x57\x68\x73\xf2\x0a\xe3\x8c\x2d\x51\x67\x1a\x75\xdf\x0a\x0c\x4c\xd0\x7d\x52\x5b\x5d\x6c\x3f\x1d\x95\x14\x84\x48\x8a\xee\xee\xd3\xf5\x4b\x05\x49\x28\x01\x62\x89\x45\x94\x88\x83\xfa\xac\x43\xc2\x03\x2a\x58\xde\xd2\x5d\x2d\x9f\xa9\x96\x4a\x79\x2d\xe1\xe2\x5a\xc2\x95\x4c\xe0\x9c\xf9\xc0\x5a\xbe\x88\x89\x85\x47\xbf\x83\x65\x6a\xd3\x74\x40\x4b\x29\x41\x3a\x91\x7c\xce\x0d\x62\xd4\xc5\xa0\x01\xd5\x96\x4d\x98\x22\x57\xe5\xa5\xa9\x2a\xda\x98\x39\x28\xbb\xdb\xf9\xcb\xb8\x7d\xf4\x2a\x6d\xda\xa7\xd2\x0d\xc6\xe6\xad\xf0\xa4\x11\x9a\xa2\x12\x83\xfc\x4d\x50\x89\x51\xd9\xab\x2a\x75\x6f\xe7\xfb\x0e\x23\x35\x87\x8b\x2b\x30\x2d\x66\x78\x41\x06\x9e\xf7\xce\x6f\xb2\x40\xcd\xab\xa3\xd5\x9d\x51\x4a\xea\x46\x0c\xe5\x43\xd5\xaf\xf5\xff\x46\xbf\x7e\xc3\x7e\xa9\x1e\x01\x84\xab\x5a\xac\x54\x30\x07\x1a\xde\xfd\xaf\x4d\x48\x35\x15\xfb\xf3\x70\xa8\xe1\xb3\xb4\x65\xdb\xa4\x98\xb4\x87\x13\x5a\x36\x9f\x20\xed\x05\x3c\x2a\xb9\xed\x80\xa1\x57\xde\x75\xda\xd6\x6c\x6d\xef\xa8\xe7\xa4\xaa\xa7\x4f\xf5\x58\x4a\x94\x92\xd0\x1a\x24\x54\xd5\xd4\xa0\x87\x87\xb3\x99\xbe\xd5\x23\x41\x62\x03\x86\x69\x37\x5b\xba\xfc\xc4\x96\x92\x03\xbd\xbc\x48\x2b\x99\xb2\x06\x72\xa7\x03\x8c\x2e\x25\x9f\x8f\x78\x1d\x3d\x61\xff\x9b\x3b\xb4\xcd\x1d\x5d\x7b\x71\xb6\xf2\xc1\x7a\x75\x3a\xac\x0a\x19\x4d\xf2\x7e\x19\x3a\x0e\xbd\x32\x30\x9e\xcb\x48\xde\x19\x8f\x16\x33\x9d\x9f\x3b\xae\x85\x57\x62\x7a\x43\x07\xef\xca\xec\x9d\xd8\x74\x7d\xaf\x85\xf7\x63\xd2\xb7\x41\xf5\x0d\xb3\xa9\x87\x01\xc9\xb4\xc8\xbd\x0d\x95\x9a\xba\xe9\xf1\x00\x2f\x6a\x2b\x94\x69\x36\x7a\x7a\x84\xae\x8b\x2e\x12\x9d\xe7\x50\x25\x32\xd9\x2e\x36\xa2\x9a\x40\xce\xdb\xc5\x06\xaa\x26\x31\x72\x79\x9d\x4e\x5d\x08\xaa\xf4\x46\xf3\x46\xc4\xe3\xe1\x28\xae\xa2\x4e\xa0\x0e\x00\xdb\xb4\x55\xf3\xd8\x19\xc0\x5d\xd8\x83\xf3\xcf\x6c\xe1\xb6\x56\x8a\xe6\x54\xd9\xc8\x9c\x2e\xe0\xfd\x83\xf6\x74\xd1\xb7\x7a\xba\x72\x5d\x5b\x8e\xb5\x69\x1a\xcd\xb0\x5e\x4c\xf7\xc3\x49\x90\xac\x90\xc2\x17\x90\x25\x53\x52\x93\x2b\x78\x13\x23\x6a\x6f\x6a\x81\x61\x70\x1a\x8e\xec\xda\x50\x07\xcd\x58\x98\xf2\xa2\x98\x96\x8e\x95\xea\x78\xdc\x00\x6a\xf0\x4d\x87\xe4\x9e\x1d\x32\x85\x3f\x4f\x55\x98\x82\x7a\x3b\xef\x6f\xb6\x82\xdc\xeb\xf7\xc1\x42\x26\x37\x5a\x26\x37\xda\xb4\x64\xf8\x1f\x41\x82\x01\x41\x02\xec\xfb\x14\xba\x09\xff\x11\xdc\xc0\xb0\x27\x25\x81\x91\x88\xe1\xad\xdd\xaf\x52\xeb\x79\x8c\x01\x6f\xf0\x93\x7c\x09\x6c\x15\x17\x45\x9f\x56\x24\xfa\x6d\x02\x38\xe8\xcc\x25\xa1\x0c\xf0\xad\x5a\x39\xad\x14\x43\x12\xb2\x06\xd5\xe7\x40\x7f\x46\xa3\xaa\xe7\xa9\x15\x52\xfc\xa4\x5a\xa1\x26\x7d\xb0\xc2\xfa\x02\x71\xbc\xff\xe6\x00\x94\x7a\xbb\x37\x3d\x0f\x9b\xd3\x63\x1a\x2b\x4e\xd1\xac\x0d\x3d\x88\xeb\xa9\x8a\xb8\x5c\x48\xf8\x8b\xb1\x47\x4e\x4f\xd0\x58\x91\x0c\xb1\x94\x91\x90\x54\xe6\xa6\xfa\x65\xa0\x9c\x58\x94\x57\x8b\x9c\x93\x48\x6e\x2b\x3d\x5b\x36\xc3\x28\xf6\x58\x5b\x69\xd4\xa6\x47\xde\xaa\xb7\x35\x4f\x85\x9e\x10\x41\x91\x86\x6a\xf1\xf6\xfe\xd0\x5f\xa4\x56\x3b\x66\xef\xde\xe0\x4a\xf7\xa1\x56\x32\x4e\xe5\x00\x1f\xe2\xce\x84\x2e\x7d\x59\xce\x74\x9b\x42\xad\x8d\x7a\xd1\x43\x2c\xf8\xf4\xf0\xfa\x57\xc3\x8b\x1a\x75\xb5\x46\x22\x0e\xaf\xb8\xd0\x03\x2c\x1a\x2b\x5e\x1c\x18\xe0\xb3\xb4\x69\x99\xa8\xe5\x01\xd2\x28\xc2\xf0\x78\x52\xe7\x51\x1f\x49\xe9\x81\x12\x48\x6f\x93\x2a\x0a\x3f\x79\x9e\x50\x18\x59\xf2\x4d\x8a\xab\xed\x1a\xe3\x49\x89\x7b\x82\x70\x31\x2f\x1c\x49\x39\xe0\x49\x77\xac\xc8\x2d\xd1\xba\x18\xb7\x29\xa5\x0c\xaa\x94\x14\x52\x6a\x71\x2a\x9d\x52\xc3\x4e\x36\xfd\x98\x1f\xb8\x8b\x17\xfe\x39\x68\x58\x00\x4f\x27\xf8\x74\x62\xde\xb0\x90\xd6\xee\x3e\xf2\x04\x3c\xa7\xf9\x7f\x16\xa3\xe1\x8f\x5a\x0c\x78\x11\xd5\xcb\x2b\x33\xe5\x95\x99\xf2\xdc\x4c\x79\x8e\x29\xe6\x25\x0a\x8d\x8e\xd2\xee\x53\x57\x7f\xca\x5b\x03\x08\x19\x1b\x96\xb2\xf7\x10\x23\xe4\x16\x23\x35\x2a\x0d\xf4\x46\xb3\x0a\xed\xa0\xb3\x42\xc3\xb1\x08\xa6\x10\x68\x55\x4c\x21\x48\x09\x70\xc3\x25\x73\x89\xde\xb0\x02\x83\x98\x2d\x35\xc3\x3f\xbe\xdc\xdf\xf3\xb4\xfc\x64\x54\x48\xbd\x83\x75\xf7\x4c\x70\x4c\x8b\x4d\x00\xb9\xc0\xb6\x08\x16\xc3\x1f\x6c\x8a\x4c\x34\x28\xa4\x72\x0a\x5f\x79\x4a\x5f\x79\xdf\x07\x52\x1f\x3f\xf4\xd0\x69\x56\x7e\x84\x47\xbc\xbb\x8a\x5c\x53\x58\x39\xfe\x8a\x5c\x35\x4e\x9c\xc2\xe0\x4c\xd1\xe9\x00\x6b\x29\x1d\xc1\x54\x4d\xa5\x93\xa9\x18\x3e\x01\x57\xdd\xe0\xd0\x0f\x72\x1a\xaa\xa4\x6f\x21\x83\xbc\xf6\x4c\x4e\xb6\x21\x9e\x0b\x3c\xf9\x15\x56\xe2\xb1\x63\x0d\x5c\xac\xdc\xc1\x3f\xb5\xfd\xe2\xb4\xbc\xb9\xe9\x53\xab\x0e\x3e\xd5\xe8\xc3\x30\x06\xfc\xa5\x49\x91\xdf\x49\x11\xd1\xc4\x9a\x97\x42\x1c\x9a\x68\x2e\xcd\x54\x6b\x44\x57\x22\x08\x28\xc8\x62\x95\x49\xbb\x0d\x94\x29\xe3\x26\x7a\x13\x50\x04\x06\x6e\xdc\xa4\x83\x57\x8d\xe3\x39\x32\xae\xdb\xa9\xc5\xc9\x86\xa9\xea\x37\xf7\xb1\xad\x78\xa5\xf7\x55\xcd\xb6\x06\xc0\xb6\xae\x6d\x64\x25\x73\x16\xc3\xf3\xdc\xb0\x02\xc5\xaf\xc0\x5b\xd4\x0c\xad\xba\x5b\x19\x37\xcb\x1c\xff\xac\xf1\xcf\x0e\x07\x75\x56\x93\x68\x5b\xc5\xd9\x5e\xe2\x6f\x89\xbc\xbd\xe0\x9c\x67\x93\x7d\xa1\xce\xf2\xd6\x27\xe6\x17\xf8\x71\x72\x20\x3e\x90\x65\x43\x59\x68\xdf\xef\x4e\xcf\x46\x76\x6a\xb0\xbb\x28\xa2\xd8\x41\xfb\xf6\x04\x7a\x2d\xd7\x73\xc9\xdd\xad\x99\x03\x12\xf1\x7e\xd3\xcb\xd6\xb7\x19\xdd\x22\x2d\x59\xea\x8b\x76\x7e\xf7\x7a\x2f\xb7\xed\xcf\x6b\x9e\x1a\x26\xb0\x1e\x7d\x35\xfd\x75\x06\x4c\xd7\xc1\xdb\x27\x57\x77\x33\xd6\xcf\x70\x3f\xf4\x61\x3b\x00\x87\x9d\x22\x87\x1d\x20\x87\x8d\x11\xdc\x91\xa5\x8c\x39\xc6\xe9\x46\xbc\xbd\xf8\xcf\x78\x6d\x93\x75\xde\xf6\x3f\x9f\x43\xdf\x0e\x3e\x8f\x45\xff\xff\x3e\x83\xad\x07\x78\x25\x4b\x45\x54\xe8\x13\x7b\x67\xf2\xf4\xbb\x4f\xec\x9d\xd9\xce\x67\x09\x10\x52\x59\x30\xfd\x8f\x04\x08\xe1\x61\x01\x42\x80\x02\x84\xe0\x90\x00\x01\x56\x5b\x9f\xbb\x9b\x1b\x5c\xf8\xa0\x1b\xc6\x69\x2e\xe6\x13\x38\xa3\x3e\xee\x02\xe8\x4b\xf8\xd9\x22\x86\x85\x1c\xc4\xa2\x21\x62\x78\x9d\xb6\x2c\xfc\x9b\x82\xcf\x5f\x8d\xe4\xa9\x72\x6b\x32\x83\xae\xa4\x87\x8c\x25\x6a\xaf\x8d\xc3\x17\xe6\xb6\x41\x9b\xda\xcf\xd3\x26\x70\x6b\xc0\x35\xf3\xaa\xd8\x6f\x0d\x59\xef\xe3\x87\x86\x4d\x7e\xfd\xbd\x23\x03\xa7\x1b\x82\x90\x9f\xd2\x43\xe1\x61\x92\xde\xbb\x8a\x66\xea\x9c\xf5\x81\xe8\x2c\xdc\xce\x33\xfa\x2b\x9f\x1f\xf4\x1f\x0c\xd8\xe0\x01\xa6\x78\x77\x27\x15\x4d\xa1\xcb\x0f\xf7\xcd\x0a\x13\x23\xb4\x8d\x82\x29\x99\x26\x18\x8a\x83\x0c\xf4\x8a\x6e\x00\x99\xae\x04\x7d\xf0\x3c\x14\x7c\x97\x49\x31\x51\xde\x68\x46\xba\xaf\x3f\xc9\xf2\x4c\x27\xb8\x78\xa9\xbd\xe8\xc2\xa6\x49\xf0\x7a\x00\xf9\x20\xb7\x6a\x56\x6e\x0a\x03\x86\xc9\x10\xc8\x17\xf3\xa0\x08\x2e\x2e\x98\x52\xd0\x34\xc3\x5f\xa4\x2d\x7f\xa1\x1d\xa0\x05\xf6\x3a\x26\x1f\xfc\x60\x2d\xf2\x4d\x10\x0a\xf2\x99\x8e\xe6\xe8\xe2\x64\x18\x2e\xa7\xfb\x0e\x72\xd1\x9c\x70\x5c\x55\x50\x03\xaf\x3f\x21\xeb\x81\x73\x21\x8c\x4b\x31\xe5\x95\xb1\xc9\x34\x9a\x01\x42\xec\x16\xd7\x42\x24\x64\x26\x02\x84\x04\x30\x0c\x34\x24\x8c\x06\x50\x0d\x06\xb3\xc3\x48\x90\xe0\xc8\xe8\xc2\x4e\xe3\x54\x1c\xaa\x45\x34\x1d\xc9\x7f\x6b\x1c\x05\x79\xf9\x18\x79\x4a\x74\x9a\x17\x42\xcb\x48\x47\x62\x5b\x3c\x4f\x13\x52\xe6\x24\x66\xe0\xff\x03\x95\x4c\x3a\x17\x17\x14\x00\x27\xc2\x2c\x17\x17\x70\x86\x1b\x1f\x3a\x6e\xe2\xc2\x17\x63\x07\x7d\x71\x50\xac\x2f\xd0\xc2\x17\x7f\xf8\x07\xb9\xea\x7e\x9f\xd1\x46\xf1\xfb\xb7\xa8\x39\x8c\x80\x33\x52\xd7\xb3\xa8\x3b\xd3\xca\x6e\x11\xad\xc5\x48\x26\xf1\x0f\x34\x78\x9f\x2c\x74\x18\x26\xf8\x01\x3a\x3c\x06\x3b\xbf\xec\xd2\x2f\x9b\x97\x59\x80\x1d\xc0\x0f\xea\x91\x89\x20\x17\xf0\x8e\x3f\x8c\x36\x0b\xaa\xb3\x4a\x19\x34\xd3\x75\x23\xb9\x55\xd1\xd9\x1a\x6b\x34\xae\x8e\x2f\x1b\x64\x86\x50\xa1\xdd\x65\xc7\xc7\x99\xe6\x2a\x73\x4b\xb2\xdc\x80\x04\xa6\x3a\x75\x36\x2a\xe9\x18\xe8\xba\xd5\x9e\x37\x32\xb0\x52\x6f\xf5\xf2\xf0\x56\x6f\xec\x8b\x52\x6f\x72\xa6\x2b\xe0\x80\x64\x75\x0d\xea\x41\x2a\x75\x0e\x94\xc6\x5b\x64\xd5\xb6\xd1\x8e\xa7\xb5\x7e\x0c\x77\x3a\x46\x19\x3d\x58\x0e\x0e\xf3\x95\x0e\xba\x4e\x17\xe4\xa7\x72\x16\x17\xf0\x50\x4d\xef\xfe\xc4\xd5\xe4\x4e\x37\xe4\xb1\x05\x38\x60\x60\x4f\x5e\x09\x3f\x66\x83\x5b\x06\x94\xac\xb1\x65\xe3\xd6\xbc\x52\x30\x6c\x55\x7a\x50\xf1\xea\x40\x6b\xf7\x16\x40\x50\x50\x98\xfa\xb0\xbe\x4b\x26\x1c\xf7\x47\xf6\xd5\xd4\xf3\xc2\x99\xee\x7f\xcd\x41\x96\x18\x93\xd2\xda\x9b\x25\x91\xcc\x0f\xcf\x51\x8e\x6a\x61\xa5\x62\xad\xf5\x59\xd5\x60\xaa\xd5\x9c\x54\xab\x99\x55\xd0\xec\xff\x67\xee\xcf\xbb\xdb\xc6\x91\x87\x51\xf8\xef\xf7\xf9\x14\x1d\xfd\xa6\x3d\xa4\x04\x49\xd4\x6a\x9b\x0a\xac\x93\x49\xd2\xdb\xc4\xe9\x74\x9c\x5e\x15\x8d\x0f\x4d\x51\x12\xdb\x14\xa9\x70\xb1\xad\xd8\xfa\xee\x6f\x55\x01\x20\x41\x89\x72\x9c\xb9\xbf\xfb\x9c\x3b\xd3\xb1\x48\x10\x6b\x01\x28\x54\x15\x6a\x21\x1f\x9d\x1d\x22\x87\xc8\xd1\x32\xc2\x87\xd6\xe3\x9a\x7b\x2e\x51\x98\xa3\x1c\x24\x29\x5f\x34\x1c\x60\x1a\xf8\x62\xec\x52\x64\x17\x6a\xd4\x40\x58\xb9\xa6\x84\x8f\xa6\xb7\xae\x71\x7e\x4e\x9a\xc6\xd2\xe1\x15\xea\xa5\xd6\x4a\xf8\x41\x86\x53\x31\x72\xdf\x45\x25\x97\x55\x85\x52\x70\x6c\x8e\x63\x5b\x28\xdf\xd7\x98\x65\xd6\x74\xc3\xc7\xdf\xff\x37\x1a\xb3\xd8\xa1\xe6\xca\x8d\xfd\x54\x3e\xb8\xd3\xe8\xc7\x8b\x9f\x2f\xd2\xd8\x0f\x17\xfa\x3d\xf9\xf7\x8f\x6b\x30\x84\x25\xa5\xf6\xcc\xd0\x42\xc1\x86\x82\x77\x15\x72\xaf\xb6\x27\x7c\x99\xc9\xfb\xf4\xdf\x30\x46\x59\xa1\x0e\xc4\x7f\xcb\xaf\x8e\xe0\xa4\xda\x78\x4e\x4c\x16\x19\x87\x94\x0e\xc3\x76\xaf\x33\xe8\x0d\xbd\x21\xec\x09\x0f\xcd\x59\xa6\xb6\x3f\x4e\x27\x59\xfb\xb7\x60\xe2\x37\x3b\xd3\xe7\xf8\x3b\x6d\x67\x63\x78\xb1\xfd\xa9\x3d\xf9\x57\x20\x2c\x3c\x44\xe6\xed\x13\x54\x68\xff\x1d\xfd\xef\xe8\xd0\xa6\xa4\x51\x9a\xbf\x0a\x3d\xca\x7f\x47\x55\xca\xae\x87\xb4\x11\x9e\x29\x3f\x88\x47\x47\xcf\x94\x81\xa4\xc7\xa0\x83\x0d\xaf\x81\x6e\xf7\x94\xe6\xb3\x50\xf5\xe0\xb9\xaa\x2c\x22\xf4\x77\x3e\x39\x14\x56\x91\x30\xc7\x99\x11\xb1\x8e\x65\xda\xb5\x90\x54\x7a\x35\x6a\x12\x10\x21\x69\x29\xab\x49\x71\xe8\xe0\x72\x84\xf6\x07\xc9\x7d\x73\x10\x18\xdf\xa1\x17\x83\xf4\xac\x53\x65\xb5\x48\x7a\xee\x1e\xea\x2d\x28\xa3\x45\x72\x27\xc3\xa1\xbf\x29\x70\xd0\x39\xe7\x51\x61\xc5\xa8\x15\x15\x46\x8c\x79\x49\xa0\x8f\xf4\xa2\x5b\x5b\x6a\x00\xef\xea\x1f\x17\xc2\x29\x54\xe7\xcf\x01\x41\x6e\xfb\x73\x08\x78\x07\x20\x40\x9f\x80\x07\x57\x40\x3e\x3a\x9a\xdc\xd3\x03\xa9\x26\x14\x16\xa0\x04\x18\x5f\x00\xc6\x27\xc0\xe4\xb3\x82\x89\x34\x31\x28\x50\x82\xb9\xe9\x9c\xa1\xc1\x79\x7a\x50\x0f\xba\xd0\xc1\x78\x4c\xe5\x38\xfa\xb2\xca\x71\x69\x2b\xc3\xe9\xfc\x0a\x11\x81\x9e\xe3\x17\x3d\xc7\x4f\x17\x3f\xbf\x45\xa3\xed\x04\x15\x7c\x63\xa0\xaa\xa2\x30\xf1\x3e\x00\x3d\xa2\xeb\xa9\x39\x05\xb9\x9b\x01\xfb\x10\x7b\x50\xe5\x7b\x61\x9d\x5b\xb0\x8f\x09\xa0\x5f\x37\x7d\x1b\xcd\x3c\x03\x32\x5d\x45\xb3\x0d\xde\x70\x88\xcc\x44\xdc\xdc\xa5\x99\x13\x7c\x17\x3b\x8b\x15\x85\x49\xdd\x69\x8d\xaa\x77\xf8\x3d\x72\x2a\x48\x34\xd4\x7a\xad\x41\x6b\x50\xdb\x02\xc9\x00\x28\x5b\xdc\x63\xb1\xd8\xa9\xe2\x4e\x3c\x47\x9e\x22\xa8\xd8\x23\x03\xb0\xcc\x22\x97\xf6\x21\x59\x63\x39\x66\x1a\x6f\x60\x02\xb1\x63\xea\xc3\xeb\xc0\xc3\x1f\x61\xcb\x8d\xbd\x4e\x50\xe8\x4e\x7e\xa1\x3e\xc0\x2a\xd8\xba\x0e\x7a\xb0\xf7\x81\x66\xdc\x69\xb4\x32\xb6\x6a\x11\x9c\x22\x35\x47\x29\x06\x43\xf2\x50\x3e\x86\xf2\xf6\x5c\x4c\xbc\xc5\xbb\x11\x9c\x0d\x68\xe4\x16\x88\x2f\xf5\xb8\x3f\xcf\x0d\x35\x6f\x80\xd4\x64\xe7\x73\xb8\xcb\x7e\x1b\xb5\x57\x3f\xfe\x56\x33\x81\xd0\xd8\x04\x1e\x92\xa0\xef\xe2\x68\x0d\x18\x6a\x63\xd4\x22\xa0\x8c\xfd\x74\x03\x27\x0a\x43\x91\xad\x18\x48\xe4\x48\x32\x4e\xc2\x47\x0d\x7f\x1d\x47\x69\x84\xcb\x9e\xb9\x0e\x77\x1c\xac\xe9\x05\x9c\x36\xfe\x55\x86\x2e\x23\xf7\x92\xde\x5e\xb0\x44\xd6\xf0\xf2\xe2\xe2\x02\x1b\x7f\xe5\xb9\x81\x23\xe8\x0f\xad\xb6\xb9\xc3\x13\x47\xef\xd7\x68\xa7\xa6\x9d\xad\xea\x3a\x1a\x5b\x01\x29\x0d\xec\x3a\xdb\x6b\xbd\x54\x0a\xcf\x97\x60\xa7\x1c\xf3\x44\xc9\x72\xe3\x7b\xc5\xe6\xfb\xcd\xe1\x76\xda\xc2\xb1\xe4\x24\x2e\xd0\x25\x70\xf4\xa1\x37\x04\x58\x2f\x5e\xfe\x5e\xee\xb1\xda\x62\xa8\xc2\x0f\x1b\xfb\x2c\xc4\xed\x7d\xc6\xd1\xfa\xcb\x6a\x5b\x5b\x26\x7c\x07\x55\x61\xa4\x0a\x71\x9d\xf0\xc3\xc2\xf7\x14\xe2\x05\x22\x94\xc2\x3c\xbc\x49\x11\xee\xb9\x62\x12\xeb\xa1\xef\xc5\x33\xa0\xd1\xee\x81\x04\x95\xfe\x5c\xf4\xec\xbb\x79\x81\x50\x16\xf6\xea\xc2\x88\xe8\x60\xd5\x05\xdd\x8a\xa2\xc3\xcc\x7c\x6a\x33\x15\xe5\xb4\x26\x0b\xec\x26\xbc\x3f\xfc\x7f\x08\x30\xf1\x99\xf7\x7f\x1b\x30\x5a\x93\x25\xc0\x78\xbb\x31\xae\x77\x23\x24\x90\xa7\x97\x27\x43\x87\xfc\xc0\x94\xa1\xe3\xeb\xd0\xc9\x76\x3b\x4e\x05\x76\x73\x1b\xc5\x34\xb2\x98\xdc\x48\x40\x39\xb3\x0c\xac\xbd\x96\xb4\x41\xfb\x53\xf4\x3a\xf4\xe4\x56\x2b\x4a\x1e\xea\x81\x92\xf5\xb0\x6c\x4a\xe0\x4b\xb2\x55\x35\xec\x48\x1a\xaa\x45\x02\x10\x17\x55\x95\xb0\x93\x7d\x8a\x70\x0a\x81\x0c\x40\x6f\x62\x11\x41\x21\x6e\x70\x4f\xc4\xfa\xf9\x66\x2f\x8f\xd6\xe7\x68\x8a\xd7\x8c\x79\xfe\xfc\xd6\x98\xd6\xbd\xe7\x54\x63\x04\x9f\x02\x5c\xe4\x1d\x94\xf7\x24\xd1\x97\x3a\xe9\x20\xe0\x32\x12\x51\x84\x74\xfd\x30\xf6\xa1\x51\x1b\x98\xb0\x52\x3f\xb5\x6c\x5a\x47\x9d\x29\x89\x38\x8a\x22\xb2\xab\xee\xd8\x6f\xbb\x8a\xfb\x62\x9a\x96\x79\x25\x75\xa5\xd9\x60\x98\x75\xa0\xcd\x58\x5c\x32\xc7\x46\x07\x4f\x00\x41\x0c\x25\x8e\x6e\xac\x9a\x85\xcb\xb5\x31\xfa\x0e\x32\xf0\x02\xb6\x99\x09\xd1\x2b\xc2\x67\xe6\x57\x42\xc8\xcf\xcd\x31\x15\x88\xdc\x27\xcc\x21\x39\xcf\xcc\xd0\x30\xc8\x40\x55\x04\x9c\x15\x65\x0b\x59\x9e\x48\x2d\xa3\x06\x20\x54\xc4\x30\xcb\x85\x72\xbd\x78\xe5\x0e\x48\xd3\xc1\x8f\x72\x5d\xf7\xd6\xc0\xd4\xe1\x07\x03\x80\x51\xed\x11\xf8\x72\xe6\xcb\xf3\x6e\xc1\xc0\x2c\xba\x07\x65\x89\x70\x1d\xfa\xd8\x00\x03\x7d\xfe\x03\x1a\x20\x3a\x21\x6b\x3a\xcc\x41\xb7\x2e\x8d\x46\xc2\x5c\x78\xa8\x1b\x1e\xda\x46\x94\x86\x1c\x54\xae\x89\x60\xca\x02\xf3\x4b\xd5\x28\x69\x0b\x50\xfd\x6e\xdb\x48\x60\xe2\xf5\xd1\xce\xbc\x1b\x9f\xa8\x01\xbe\x23\xad\x24\xbf\xea\x0a\x16\xd5\xd2\xdc\xfc\xc6\x69\xac\x89\x55\x51\x1f\x98\xc4\x3a\x4b\x87\xfb\x68\x60\x9f\xf3\x8e\x6f\xbc\x79\xca\x97\xa8\xa5\x3f\x27\xa1\x91\x48\x2d\x78\xcb\xf7\xfe\x62\x49\x19\x62\x7c\x28\x72\x44\x71\x15\x19\xe9\x13\xa8\xd5\x5c\x8c\x35\x85\xe2\x58\xb3\x98\x97\x7c\x1c\xf2\x1d\x02\xe5\x2c\xb3\xf9\x7c\x67\x6f\x20\x85\x01\x00\xdc\x9b\x35\x32\xa2\xd1\x74\x41\xba\xe4\x81\x27\xe5\x96\x59\xe8\x42\x48\x7f\x6f\x18\xeb\x18\xaf\x23\x4b\xde\x56\xeb\x7e\xb3\xf9\x60\x91\x0a\x89\xdf\x48\xf1\xae\x14\x7f\xf0\x18\x13\x6f\xf8\xc3\xe3\xe2\xda\x0e\xfb\x07\xf4\xcf\x6a\x9f\xdc\x2a\x3c\x26\x6a\xfa\x4f\x05\x11\x8b\x78\x0e\x89\xd8\x58\x84\x35\xc1\x08\x26\xd3\x32\x26\x5b\x3b\x7e\x9c\x54\xd3\xc5\xd2\xf3\x94\x76\xf7\x5c\x5c\x3b\xe7\x2d\x58\x67\x31\x10\x4a\x78\xc7\x78\xe6\x49\x8f\x8c\x93\x94\xdc\xe8\x84\x93\x46\x43\x6b\xce\xa7\xe6\x3e\xfb\x6b\x7d\x39\x51\xe8\xac\x78\x1f\xc0\x52\x5c\x35\x29\x14\x9d\x42\x72\x52\xcf\xa5\x23\xc7\xbc\x00\xea\x4d\xec\x50\xed\x8d\x46\xf8\x3c\x1d\xe9\xaa\x0b\x82\x14\xf1\x26\xe1\x54\xcb\x49\x0a\xb5\x19\x9a\xe1\xf8\xe8\xd0\x27\xaf\x11\x5e\xd0\x47\x6c\xe9\x34\x27\x41\xcc\x3a\x4a\x2a\xef\x76\xc4\xa8\x0a\xbf\x13\x72\x3d\x5d\x7b\x9b\x32\x5c\x95\x7f\xe6\xc2\x79\xb2\x08\x01\x95\x2a\x6b\x4e\x8d\x8f\xa6\x0d\x16\x64\xde\x57\xd5\x10\xea\xe1\xa0\x44\x25\x30\xa0\xd8\xff\xba\x5a\xee\xa1\xe3\xb6\xc7\xa8\x79\x1b\xab\xdc\xee\xd4\x49\x1e\x5c\x0f\xad\x18\xa2\xfc\x34\xdd\x18\x22\x73\x2c\x22\x0d\xb2\x91\x19\x35\x88\x14\xd1\xed\xa1\xf4\xc9\x8b\xcc\x51\xb3\x99\x91\x33\x33\xfc\x24\xe8\x3a\x98\xf4\xdc\x4c\xb4\xd9\x4c\x85\xd3\xdd\x49\xb3\x89\xc1\x9a\x4a\x5c\x19\xa1\x96\x85\xb4\x25\x77\xae\x92\x91\xb2\x78\xdd\xdb\xd2\xb0\xea\x2a\xcd\xe2\xd0\xc3\xea\x81\x40\x2c\x80\x53\x71\x77\x33\xb2\xc7\x69\xe3\x6d\x75\xa7\x6d\x99\xe9\x32\x8e\x6e\x89\x39\x7f\x1d\xc7\xd0\xe3\x9a\x1f\xce\x49\x44\xf7\x8d\x30\x28\x55\x06\xee\xd2\x2b\x93\x83\x8e\x2b\x3c\xf4\x83\x20\xcf\xbc\xb0\x8e\x4e\x13\xf1\x8f\x87\x7f\xac\x33\xa1\x71\x33\xc2\xa1\x37\xbc\x3a\x10\x26\xe6\x59\x9a\x6b\x98\xc6\xed\xd2\x69\xa7\x65\x7a\xbe\x93\x49\x49\x6b\x25\x8d\xbe\xae\x3c\xf0\x85\x4d\x2e\xf6\x02\xe6\x3f\x49\x11\x99\x47\xf3\x6f\x02\xb3\x42\xa2\x4d\xa5\x88\x3b\x15\x16\x1b\xb2\x1b\x50\x96\x26\xae\xe5\x27\x32\xa0\xa3\xf4\x2d\xf8\x74\xf2\x5f\xa7\xb3\x45\x03\x19\x51\xd7\xe5\x33\x4e\xfb\x9c\x9f\x71\x72\x75\x64\x84\xc4\xf3\xcc\xe4\x86\x49\x86\x56\xa3\xfc\x91\xf0\x47\xb5\xb3\x4c\xd6\x0e\xaf\x5d\x5e\x12\x97\x7b\x79\x59\x83\xc5\xce\x6b\x1f\xef\x2c\xab\x36\x72\x8d\x80\xdd\x2f\x9d\xc4\x5e\x32\xf4\x2b\x5c\xb5\xdd\xe9\xaa\x6c\x92\x18\x68\x64\xc7\x92\x52\x26\xdd\x1f\x8d\x96\x8d\xa3\xf5\x39\x45\x74\xb6\x17\x0c\xf1\x82\xbd\x16\xfb\x2b\xb1\xf7\x8e\x56\x6d\x5f\xa6\x14\xf3\x8d\xea\x31\xa5\x8a\x92\xac\x35\xd5\x3c\xa5\x6c\x99\xdc\xe4\x5f\x5b\x17\x6d\x74\xb2\xc1\x12\x7b\x3d\xaf\x7b\xab\x57\x9e\xf8\x9f\x3d\xfb\x86\x79\xab\x75\xba\xb1\x67\x4c\x2e\x0d\xbb\x72\xfb\x97\xda\x28\xd8\x72\x61\xe7\x95\xf7\x7c\xbb\x25\x2f\xbc\xa1\x97\x94\xa4\x66\x85\x94\x4a\x6a\xad\xd1\x36\x3d\x2b\x9c\x5f\xab\x63\x6b\x2c\xef\x55\x32\x74\x27\xe2\x8d\x73\x6a\xcd\x8e\x46\x85\x55\x85\x0c\xce\x88\xab\x70\x5d\xf8\x62\xbf\xe1\xfe\xc4\x69\x34\x50\x35\x45\xac\xfe\x46\x63\xf1\x7c\x3d\x32\x8d\x25\x9f\xd1\x85\xbb\xcb\x6f\xd0\x7d\xc6\x64\x81\x3a\x52\xe3\xa5\x00\x54\x82\xba\x1d\xb8\x96\x5c\x36\x49\x34\x0c\x3b\x86\xac\xa8\x74\x37\xe7\xe5\xab\x9f\x44\x99\xe9\x23\xc5\x41\xd6\x1e\xa6\x0d\x59\xef\xb7\xfb\x39\xe9\x58\x96\xd9\x00\x2c\xb3\x62\xeb\x99\x4c\xbb\x70\x17\xc6\x6a\xe4\x75\x64\x1f\x20\xa1\x40\x32\x42\x2d\x2c\x9a\x78\x30\xbe\x42\xc5\xb3\x62\x2b\x67\xb0\x46\xb5\x15\x10\xaa\xa5\x88\x5b\x0f\x2f\x3f\x51\x56\x05\x30\x26\xa8\x56\x2e\xed\x0c\x58\x05\x32\x69\xc0\xbf\x38\x38\x61\x91\x28\x70\x3f\x8c\x52\x6a\x8a\x15\xf7\x33\x59\x19\x07\x95\xbc\x4e\x52\x8c\x1a\x0b\x05\x7e\xfb\x87\x95\xe6\xbc\x00\xc9\x35\x42\x65\x70\xc4\xa0\xcb\x43\x2a\x00\xcd\x57\xd2\x7f\xb9\x2f\xf5\x0c\x73\xe1\x40\xfe\xbd\x7b\x18\x2b\xfa\x7f\xe2\x17\x16\x90\x68\xc6\xa8\x0a\xfc\xb6\x7f\xfa\x2a\x0c\xa2\xb2\xc5\x51\x10\x64\x95\x4e\xd0\x62\x99\x45\xd0\x95\x5e\x5a\x71\xfc\xe2\xf2\x5b\x11\xf2\x35\x0b\x12\x4e\xa7\xb6\x88\x9e\x42\x8f\xde\x69\xcb\x99\xcd\xf6\xce\x76\xd7\x58\x29\x3c\x05\x9f\x1f\xc7\x53\x18\x56\x11\x90\x10\x06\x71\xd5\xf0\x90\x9c\xf5\xf5\xff\xd6\x0e\x57\xfb\xfa\xca\x5b\x3a\x37\x7e\x44\xd1\x2e\x73\xb7\x67\x87\xa8\x56\x18\x30\x52\x95\xbb\xc7\x82\xd2\xeb\x85\x51\x6b\x84\x59\x3c\x9d\xf2\x73\x3a\xc3\x4b\x81\x2f\x25\x53\x31\x73\xf8\xa4\x76\xeb\x5d\x5d\xfb\x18\x2b\x60\x95\xe0\x9f\xe8\x33\xfc\x3d\xa7\xbf\x11\xfc\xfb\xb9\x36\x45\xa2\x60\xe6\x27\x6b\x94\xa5\x96\xb0\x4f\x4e\x66\xe2\xcc\x5c\x32\xe9\xb4\xbd\xa2\x63\xa4\x5b\x09\x4c\x77\xde\xad\x14\xba\x75\x5b\xdc\xda\x21\xd2\xbc\x2c\x04\xa8\xad\xa8\x52\x50\x80\x3a\x10\xd2\xac\xb3\xd6\xaa\x99\x64\xb4\x30\x12\xfb\xdb\x22\xb7\xed\xca\xe2\x83\xee\x83\x0a\xbf\x8c\x18\x10\x04\x0d\x37\x0e\xdc\x52\xa1\xfb\x1d\xa1\x04\xd2\x22\xef\x1c\xb6\xfe\x26\x5d\x9d\x75\x2b\x05\x4d\x52\xe4\x83\x51\x3e\x48\xf3\x5c\xcd\xb4\x49\xd3\x0d\x2b\xed\xe7\xdb\x30\x17\x4d\xa3\xd3\xee\x52\xcd\xa5\x00\xe3\xf8\x65\x2b\xc8\xcf\x1b\xd2\x84\x40\xa5\x00\x5a\x0a\x9f\xb2\xa8\x5a\x3f\x0a\x2f\x11\xd6\x81\x03\x03\x5c\x39\xac\xf6\xf1\xe3\x3f\x8e\x6a\xa6\x98\xd6\x95\xc3\xdb\x93\x8f\x1f\x3f\xfe\xe7\xe3\x3f\x3e\xd6\x3f\x36\x3e\x8e\x3f\x3e\x7c\x9c\x7c\x9c\x7e\x34\x3e\x9a\x1f\x5b\x1f\xef\x3f\x6e\xa7\xed\x05\xdb\x38\xb0\xda\x5a\xf9\x81\x3e\x2e\x03\x3c\x2c\xbe\xc0\x49\x6c\x1f\x58\x8a\x22\xc0\x6a\xa8\x02\x3d\x6e\xd9\xb9\x53\x2d\x28\x4e\x5b\x9f\x32\x2f\xde\x5c\xd0\x35\x09\x82\x0a\x70\xd1\xdd\xd3\xf2\xbe\x90\x97\x1b\x57\xbb\xd9\xd5\x9a\x58\xe1\xba\xf4\x92\x87\x87\x70\x82\x6e\x75\x6b\xf2\x5d\x95\x87\x6d\x2c\x81\x6c\xec\x55\x91\x2b\xb1\x4b\xfa\x08\xc9\x34\xf1\x33\xaa\xd0\xa8\xb9\xf0\x3f\x7f\x0e\x50\x74\x79\x68\x94\x22\x83\xf0\x2d\x88\x61\x82\x48\x35\x11\xc7\x29\x3e\xe0\x10\xc4\x53\x6b\xa7\x8f\xa6\x40\x7a\xf8\xb2\x23\x3b\x28\xf8\x25\xf1\xb9\xe2\x16\x47\x4e\xfa\xa5\xc3\xf5\x4a\x8a\xdd\x84\x87\xca\xa5\xfa\xb2\x8f\x56\x35\x55\xe5\x51\xc8\xdf\xea\xa6\x09\xd2\xe3\x8c\x88\xf6\x5f\x72\x3a\x73\xaf\x8c\x05\x50\x57\x93\x29\xcf\xc7\x78\x93\x44\x42\x4c\x5c\xe6\x40\x40\x6a\xc9\x05\x99\x81\x75\x06\xba\x17\x1b\xf7\x79\x20\x22\xd4\xa2\x94\x6a\x6c\x28\xd6\x8e\x87\x8a\x64\xc9\x0a\xf5\x08\x97\xac\x18\x60\x0e\x6a\x2a\x09\xd8\x87\x6f\xc8\xb9\x6f\x9e\x89\x17\xf9\xd1\x79\x82\x3c\xd8\x70\xb3\x29\x71\xf3\x0b\xc3\x87\x05\x95\xc3\x04\x56\x58\x35\x58\x04\x48\x5e\xea\x20\x91\x34\x7a\x19\x24\x44\x6a\x17\x40\xa3\xe1\x67\xd3\x5c\x90\xb9\x63\x7f\x23\xb5\xb8\x49\x4a\xaa\xa0\x18\x3b\x86\x1c\x2e\x45\x3a\x50\xc3\x75\x50\x60\xbe\x03\xdf\x82\xe7\x7d\x81\xda\x30\x34\xf7\xb7\xb0\x97\x93\x9b\x85\x5d\x5b\xa6\xe9\xda\x6e\xb7\x6f\x6f\x6f\x5b\xb7\xbd\x56\x14\x2f\xda\x5d\xcb\xb2\xda\xf0\xad\xc6\xee\x96\xe9\x2a\xa8\xca\xd2\x39\x3d\x3d\x6d\xd3\x57\xc8\x84\x11\x61\x0e\x67\xc2\xaf\x90\xa9\xba\x9e\x3f\xce\xdf\x60\xb6\x93\x76\xae\xa2\x46\x59\xc3\xe4\x60\xbf\xe8\x6b\xbb\xb6\xc5\x13\x26\x04\x6a\x6f\x4d\x5e\x21\xed\x5b\x87\x7d\xca\x9c\xc0\x9f\x6f\xec\x0a\x2a\xa0\x38\x04\x6c\x8a\xb0\x55\x78\xb2\x16\xe7\x80\xa7\x21\xfe\x54\x3f\x07\xf0\xf2\xdc\x64\xb7\xce\x2e\x66\xf6\xcc\xf1\x3d\x75\x17\x1a\x46\xfd\x99\x20\x82\x99\xb0\xc3\x2d\xfc\x47\xab\x04\x35\x50\x76\x36\x7c\x15\x37\xdc\xa5\xe4\x5a\x42\xaa\x23\xda\x7d\x7a\xee\xac\x17\xd7\x0c\x5e\xb1\x16\x17\xc7\x24\x15\x0c\x93\x96\x1c\x2d\x92\x5f\x40\xcb\x60\xf3\x63\x0f\x69\x6b\xed\xf2\x0f\xcd\x19\xb1\x8f\x2a\x03\x90\xf1\xa5\x1c\x74\xcb\x8d\x6a\x06\x52\x30\x81\x8d\x79\x48\xc5\x7e\x46\x5f\x5a\xc8\x43\x94\xcf\x1a\x9d\xe2\x91\xf9\x84\xe5\x21\x8e\xd8\x0d\x9c\x24\xf1\x76\x29\x90\xff\x87\x83\x86\xfd\x64\x84\xfc\x03\x32\xbc\x8a\xb7\xc8\x24\x4f\x8f\xfe\x2d\xa8\xcd\x37\x7e\x92\x6a\xd7\x5b\x31\x5d\xab\x3c\x43\x2d\xce\x30\x75\x80\xe3\x36\x88\xcf\x95\x27\xf9\xb3\x4e\xc1\xc3\x62\x0d\x25\x70\xd4\xa8\xbe\x9a\xa9\xd7\xf3\x46\x14\x6f\xa5\xc0\x46\x21\xf5\xa5\xaa\x91\x80\x79\x66\x55\x43\xf0\xfd\x13\x21\xf8\x5e\x83\x20\x5d\x4d\xeb\xf0\xd3\x54\x39\xf7\x08\x24\xe8\x5b\xef\x2c\x2b\x41\xf2\x99\x06\xc9\xae\xf0\x5e\x8e\x14\x29\xe1\xa1\x78\xb7\x83\xef\x90\x9a\x40\x63\x2e\x6f\xa7\x8b\x48\xb9\x9c\xe5\x7a\x8f\x15\x0b\x10\x6d\x00\x10\x6e\x2f\xa3\xd5\x1a\xa0\x36\xa3\x4b\x6d\xf4\x1e\x86\xe8\x12\x3f\xa8\x4d\x42\xb4\x3d\xae\x31\x24\xba\xf6\x87\xfe\x4e\x8e\x50\x0c\x7e\x5d\x75\xf3\xfc\x95\xeb\x47\x6f\x42\xf4\x19\x25\x8c\x95\xf3\xf3\xeb\x13\xe7\xe7\x57\x6d\x7e\x50\x23\xe3\x49\xca\xde\x45\xf1\x4a\xdd\xf3\xa7\xaa\x6a\x8f\xf6\x75\x5d\x05\xe5\x38\xae\xd5\x6c\x20\xb0\x94\x5a\xce\x63\xda\xb1\x00\x78\xfb\x71\xed\x59\x41\xbb\x4a\x78\xe9\xdf\x68\xcc\x88\xe1\xff\xef\x8f\x99\x5c\x85\xfc\xf0\xe1\xfc\xcd\x13\x47\x5c\xe4\xaf\x1a\xaf\x56\xdb\xce\x68\xf3\x2f\x02\x67\xaf\xd7\x5e\xb5\x93\xee\x90\xff\x8d\x78\x56\xc4\x4e\x15\x34\x55\x05\xbd\x85\x5f\x45\x1d\x2f\x51\x47\xc6\x38\x30\x44\x64\xfd\xb1\x39\x40\x4d\x65\xc7\xe5\xba\x92\x84\x6c\x10\x68\xab\xf4\x49\xed\x8a\xca\xfe\xe5\xc1\x62\xf7\x0e\x35\x8c\xfa\xea\x55\xe9\x82\xe8\x54\xdd\x12\x8c\x6b\x15\x3d\x99\xcf\xf0\x77\x22\x27\x12\x1c\x87\x75\xf0\x0a\x6d\x46\x11\x61\xa8\x90\x56\xcf\x73\x2f\x4b\x7a\x40\xa3\x08\x4d\x9c\x16\x9a\x94\x7a\x8e\xf6\x42\xa5\xd7\x9b\xb2\x0c\x1b\x0f\x01\xd1\xc4\x8c\xad\x84\xa0\x89\x6d\xca\x59\x84\x78\x9b\xec\xd5\x62\xbc\xbf\x5b\x91\xe3\xc3\x99\xba\x32\xcf\x84\x3d\xab\x46\x2c\x02\x3a\x1a\xdf\xa0\xba\x76\x66\xaf\x48\xbc\x34\x43\xc9\xe7\x06\x53\x66\xe5\xda\xe6\x44\x80\xae\x48\x9c\x95\x57\xe8\xd1\xfd\x47\x4c\x9e\x9f\xcd\x71\xf6\x8c\xf3\x67\x48\x5e\x2c\xa8\x46\xad\x1d\xee\x9b\xf6\x1a\x13\x7f\x40\x1d\x43\xd5\xd2\x33\xab\xaa\xc7\xd8\x00\x76\xc0\x54\xb5\x51\xff\x42\x0a\x84\x97\x6b\x14\xe4\x45\xd0\x71\x89\xb4\xd2\x15\x3d\xc9\xc6\x86\xde\x2e\x13\x7d\xd1\x9a\x17\x71\xec\xe6\x67\x64\x06\x6b\xca\x64\x2c\x6a\xaa\xd8\xfc\xe2\x4b\xde\xec\x76\xdd\xca\xd6\x33\xb4\xc0\x59\xb0\xb5\x4e\x66\x2e\xf4\x97\x1b\xfd\x25\xd4\x5e\x94\xf1\xec\x3a\x37\x89\x5e\x98\x4c\xba\x55\xb9\x11\x7a\x6d\x9a\xea\x86\x4e\x35\x57\xba\xc0\xa4\xe1\x87\xfa\xb4\xe7\xec\x84\x35\xcd\x3d\xdb\x2a\xa5\x09\xe2\x19\x84\x92\x06\xde\x90\xe8\x74\x7f\x21\x57\x10\xea\xfb\x7f\x19\xc8\xa7\xb8\xfc\x05\xfd\x26\xe2\x17\xfb\x50\x85\xe0\x4c\x5d\x33\xc3\x53\x1d\xf0\xa7\x4c\x92\xe8\x18\x1f\xab\x00\x41\xb1\xde\xfc\x9d\x5b\xe6\xfd\xf2\x79\xbf\x5c\x14\xdc\x79\x71\xc5\xce\x74\xb6\x0c\xbd\xa9\xfb\x55\xda\x91\x09\x7c\x53\xbb\xb5\xa4\xec\xf1\x05\x54\xbe\xce\xd5\xe3\x72\xae\x09\x15\x3c\x0f\x7d\x13\x18\x41\x78\xb1\x3b\xc4\x2f\x22\x6b\x54\xe1\xaf\x58\x98\x79\xfc\x8c\x34\x9e\x16\xac\xd5\xda\x99\xfb\xe8\xcc\x1f\xf9\x18\xe2\x2b\x3b\xcc\x45\x7a\x0a\x6a\x95\x5c\xa4\xd0\x15\xf0\x0a\xfd\x7b\x67\xe4\x40\x85\x18\xba\x4f\xb0\x56\xda\x54\x69\xdc\x94\x8f\x32\x98\xdc\x90\x20\x67\xa3\x32\x31\xe2\x28\x9e\x95\xa7\x64\xf7\x1e\xb5\xc4\xf4\x95\x2e\x4c\x91\x59\x54\x96\x44\x59\xce\xdc\x12\xab\x18\x63\xd4\x14\x75\x45\x87\x2a\x07\x42\xef\xca\xf0\x8f\x8e\x7c\xc0\x02\x5e\x0b\xc3\x65\x5d\xf8\x57\xc0\x5a\x2d\xd0\xc7\xa3\xb6\xb2\x4a\x07\x81\x87\x01\xc3\x7c\x8d\xfd\x23\x22\x87\x68\xcd\x68\x27\x66\x46\xc8\x7f\x3c\x70\x22\xcf\xcb\xf1\x15\xcb\x23\x22\x29\x1d\x8d\x22\x9d\x0a\x51\x76\x58\x6a\x4c\x00\xc8\x10\xc0\xc2\xc3\xa3\x6a\x05\xfe\x29\xa5\x9b\x9a\xe0\x1a\x29\x5f\x25\xf9\xc4\xc0\x7c\xb9\xc9\x14\xde\x42\x49\x86\xc3\xa9\xe2\xc1\x91\x2d\xae\xd0\x8f\x50\x63\x23\xab\x78\xb2\xc4\x12\xc7\xaa\xe8\x17\x8a\x64\xf7\xf7\xce\x33\x8d\x54\xa0\x7c\xf8\x58\x3d\xd7\xd6\xce\x54\xa7\x67\xe1\x28\xd4\x9c\x95\x7b\xf9\x4c\x8b\x50\x39\xf9\x2a\xcc\x00\xb9\xc6\xb8\xac\xc5\xaa\xf7\xa4\x11\x91\x6f\xe6\xb7\xf9\x9a\x35\x93\x98\x39\xff\xf3\x9e\x4f\xf7\xb0\x08\x6c\xb9\x0b\x4b\xf3\x1e\x96\xdd\x16\xc3\xe7\x10\xd7\x7f\x41\xbe\x13\x4a\x42\x1f\x81\x55\xfe\x62\xfb\x89\x9a\x3c\xe8\xc2\x61\x17\x39\x85\x94\xd3\x4a\x98\x26\x80\xa7\xa0\x88\x29\x04\x26\x09\x2e\x7c\xa7\x89\x92\x13\x86\xef\x34\x02\x39\x12\x7a\xdf\x97\x32\xed\x19\xc5\x2b\x75\x26\x92\x8e\x94\x97\x20\x09\x48\xee\x81\x51\xcc\x04\x90\x61\x2f\xcb\xf3\x29\xf7\x43\xb1\x8f\x2b\xb2\x2a\x0c\x21\xb5\x88\xb4\xb8\x70\x01\x3a\x89\x37\x7c\xf4\xd8\xaa\xc9\x99\x62\x78\xe3\x85\xb0\x49\x3f\xdb\xfc\x62\xa9\xa2\x7b\x09\x53\x93\xcc\xf0\xe2\xdb\x21\x11\x13\xda\x36\x5c\x3c\x4e\x19\x1e\xb8\x37\xff\x8d\xa6\x1d\xda\xcb\x09\xcb\xb2\xbe\xae\xd4\xbd\xd9\x81\xb4\x92\x88\x2a\x43\x98\x5d\x96\x2a\x45\x3b\xe4\xc9\xb9\x03\x7b\x30\x43\x5f\x19\x5e\x09\x84\xfb\x52\x45\x34\xfe\x43\x8f\x29\xa5\x7c\xd8\x8c\xc9\xe0\xf4\xf4\xa6\x7a\x2f\x2a\x25\x68\x87\x3a\x12\x8e\x85\xc0\xeb\x0e\x8d\x21\x33\x67\x57\xbe\x55\xd9\x95\x94\x02\x82\xea\x1d\x41\x60\x63\x47\xf0\x72\x94\x90\x77\xb8\xa7\xb2\x20\xae\xf8\xaa\xb9\xed\xf8\x11\x6e\x3b\xa6\x59\x78\xd6\x91\x0e\x55\x76\xd9\xcd\x3f\xf0\x9a\x12\xe5\x44\x69\x15\xb7\xad\xac\xc6\xe4\xb1\xaf\x78\x57\x38\x5d\xe1\x9c\x6c\x84\x22\x66\xfc\xe5\xc8\x83\xfa\xf7\x39\xd4\x3f\x64\xd7\xa5\x58\xef\x9a\x44\xba\x68\x29\x73\xbf\x8a\xb2\xc4\xa3\x8d\x6c\xd7\xe8\x19\xe8\xfa\xb8\xc6\xe8\x31\xf0\x9c\x1b\x4f\x25\x67\x69\x6d\x6b\x8e\x32\xe7\xe8\xe8\xda\xa9\xb8\xc9\x34\xef\x6b\xd4\x0f\x1c\x94\xcc\x24\x98\x04\xe4\xed\x85\xea\xc5\x6b\x87\xbd\x80\xf3\x15\x11\x0b\x55\x59\x85\xe5\x7f\x82\x8e\x5e\x1b\xaa\x9f\x6f\xa5\x8c\x38\x74\x6e\xfc\x85\x93\x46\x00\xc0\xf6\xef\xde\xd5\xbf\xfd\xb4\x2d\x65\x2d\xa5\xaf\x2d\xa8\x34\x7e\xb1\xc0\x99\x45\xed\x71\x6a\x29\x8d\xb2\xd2\x79\xf2\x25\xa5\x13\x38\x48\x38\x74\x00\x83\x62\x87\x0b\x6f\xf6\x01\x8b\x7b\xc8\x16\x95\x74\x98\x2c\x8a\xe6\xa8\xe6\xfd\x2c\x43\x61\x10\x4a\x82\x70\x72\x48\x12\xe4\xcf\xa0\x6a\x7f\xee\x03\xd2\x84\xa3\xd8\xd4\x46\x17\x8b\xf5\xad\x6e\xe6\x5a\xb3\xd8\x59\x1c\xb8\x7a\x97\xac\x29\x24\x8b\x39\x98\x45\xb7\x21\xe5\xaf\xc1\x91\x4d\xc9\x34\x3a\x61\x16\x29\xd2\x23\xdd\x03\xab\xb4\x50\x45\xb7\x3a\x15\xb6\xce\x79\x3e\x47\x1d\x10\x24\x9a\x4e\x8d\x25\xbb\x81\xf5\x47\x04\x17\xba\x32\x69\x9e\x8b\xb8\x74\xe8\x0b\x06\x9e\x3b\x53\xb6\x7e\xe0\xe1\x83\xc7\xce\x79\xcc\x16\xc6\x3d\xae\x70\xbb\x26\x9a\xbf\xb3\xc9\x97\x4c\x80\x25\x36\x36\x79\x8f\x09\xb0\x04\x06\xe3\xc3\xd0\x77\x5e\xc9\x9c\x17\x5d\x5b\x88\xe6\xa0\xb1\x15\x0e\xc8\x6f\xcc\xa4\x88\x08\x5e\x22\xf5\xc2\x36\xc6\x1a\xe8\x2b\x79\x85\x25\xe3\xfb\x03\x5c\x91\x17\xd4\xdb\x87\xc3\xa6\xb6\x95\x71\x1d\x30\x4c\xad\x38\xe4\xf8\x4e\x41\xe0\x27\x13\x1d\x1b\x2f\x80\xac\x8a\xe6\x46\x89\x09\x16\xf1\x60\x43\xf2\x1c\x51\x13\xa0\x6d\xc8\x2b\xb9\x1b\x14\x33\xd4\x9a\xb5\xc6\x0d\xf0\x64\xc5\xcd\x88\xe1\x01\xf3\x69\xaa\x31\x38\xf9\x00\x5c\xe8\x3d\xff\x1d\x19\xd3\x73\x05\x5a\x60\xb6\x02\x38\x3f\x04\xb1\x51\x6a\x36\xe0\x93\xa0\x75\x27\x00\x1e\xb4\x36\x04\xed\xa9\x69\x43\xb2\xc5\x20\xa9\x34\x58\x9a\x75\xb4\x37\x14\xcc\x10\x7f\x8d\x57\x54\x62\x16\xb4\xef\x2c\x07\x8c\xa9\x2c\x82\x81\x80\x30\xae\x98\xda\x84\x18\x01\x8b\x1e\x70\xaf\xd6\xe4\x73\xb6\xae\x91\x9f\x63\xe3\x7b\xa6\xb6\x10\xdb\x30\xb1\xda\x64\x3e\x7a\xa6\x7a\x0b\xf2\x29\x8a\xfd\xc5\x53\x0d\xf8\x32\x4e\x71\x19\x32\xed\x5e\x1a\x37\x07\x43\x2c\x22\x76\x88\x68\x61\xd7\xfa\xec\xf1\x13\x0e\x77\x6e\x9a\x6f\xd9\x71\x8c\xee\x6e\xf6\xc2\x96\x0b\x5a\xeb\x27\x11\x6e\x2a\xbf\xa9\xd3\x76\x6c\xaa\xbd\x30\x58\xb2\xf6\x64\x2a\xf0\xd1\x4b\x07\xa3\x9e\x0c\xd9\x67\x87\xbf\x74\xea\x2f\x1d\xf6\x49\x6a\xb8\xbd\xfb\x91\xbd\x71\x78\xb7\xfe\xc9\x61\x1f\x1c\xfe\xc6\x69\xc2\xb7\xf7\x0e\xff\x84\x91\x02\x5e\xd1\x6f\xe7\xc4\x62\xef\xa0\xf8\x89\xd5\x86\x4c\xbf\xca\x72\x17\xbf\xbc\xff\xd0\x65\x7f\x43\x51\xf6\x9d\xc3\xfb\x88\xb0\x34\xe7\x15\x7f\x45\xd1\xae\xe6\xbd\xbe\xb9\x73\x29\x59\x9d\x42\xca\xae\xd4\xc8\x80\xbe\xbe\x21\x63\xf3\xb6\xf1\xb7\x53\x5f\x9a\x75\xc3\xab\x67\xa9\xf1\xab\x53\x4f\x61\xd1\x36\x3d\xfc\xac\x06\x3e\x89\x1b\x51\x3d\x60\x19\xfc\x4d\x98\x5f\xf7\xda\x71\x9e\x51\x99\x71\x42\x96\x90\xb2\x84\x94\x85\xfa\xed\xdd\xad\x29\x9b\x74\x6d\x9e\xbb\x5f\x0b\x95\xbb\xbd\xae\xe6\xe7\x2f\x15\xbe\xf9\xd0\xf5\x13\xac\xf0\xa8\x19\xa3\xbf\x8c\x66\x06\x3b\x33\xa8\x07\x8d\xa4\x9e\x28\x09\x0f\x69\x26\x93\x80\xc7\x70\xeb\x6e\x13\x5d\xdf\x7e\xe7\xd4\xe7\x14\xbb\xd6\xaf\xd3\x58\xd0\xab\xad\xfc\xd6\xcc\xbf\xb9\xf2\xdb\x0d\xcf\x23\x41\x15\xf5\x2d\xea\x8b\x46\xc7\x6c\x2e\x70\x2b\x57\x7c\x5e\xd7\xd7\xf8\x79\x8d\x9b\x79\xd6\xbc\xc1\x08\xc9\xab\x87\x87\x3c\xa3\xdb\x06\xe6\xbb\xfd\xab\x53\xac\x13\x65\x16\x0e\x2b\xa1\x57\xdf\x30\xaf\x8c\xcd\x3f\x97\xa6\xac\x84\xcd\x29\xf4\x31\x24\x7e\x62\x73\xc2\x0e\x3f\x3b\x8d\x1a\xe5\xaf\xb1\x85\xc0\xe6\xb3\xab\xc0\x0d\x7c\xf7\x5a\xa6\xae\x29\xf5\x3d\x5b\x96\x71\x7a\xee\xec\x83\x1c\x47\x36\xaf\x5b\x77\x66\xfb\xba\x75\xcd\x44\x60\xf6\xeb\xd6\x86\x5e\x4b\xa1\x47\x34\x07\x21\xe8\x98\x0b\x3e\x37\xae\xd1\x53\x08\xfa\xe6\x12\x2f\x9b\x92\xf3\x73\xc8\x0f\xc9\x45\x20\xa0\xb7\x38\x91\xb9\x10\xee\x2d\xce\x67\xc9\x77\x92\x0c\xa2\x92\xa2\xda\xbb\xc9\xa0\xea\x86\xe6\xe2\x18\x2a\x6f\x14\x5e\x8e\x8b\x42\x91\x60\xe1\xf0\x70\x42\xde\x0d\x0e\xdc\x38\x05\x02\xf8\xfe\xce\xbe\xa6\x20\xae\x50\x8e\x5d\xc3\xdf\x6b\x74\x2c\x9e\xc7\x6f\xe9\xd2\x45\xad\x6f\xa0\x5f\x8b\xd8\x14\x4a\xc8\x12\x03\x43\xd3\x2f\xcf\x2c\x11\xd8\xa8\x55\x38\x6f\x00\x94\xa0\xe6\xcc\x78\x49\x44\xa1\xb8\x94\x17\x87\x82\x36\x0a\x3c\x07\xaf\x8e\x8e\xae\x94\x59\xeb\x9d\x0a\x96\x7a\xc0\x4c\xda\x08\x73\xe0\x6f\x45\x9e\x3b\x69\xd1\x8c\xb7\x81\x47\x47\xb7\xaa\xa2\xcb\xa7\x54\xb4\xd1\x2b\xba\xcc\x2b\xd2\x4f\x4b\x28\xf0\xb9\xd1\x78\x78\x08\xd5\x39\x80\xeb\x24\x3f\x07\xf2\x8c\xa8\xd6\x70\x0f\x83\x61\xa5\x7c\x35\x46\x41\xe9\x10\xa0\x2c\xb7\x65\xb7\x27\x08\x6b\x9a\x7e\x53\xf7\x09\x00\x15\x34\x9b\x9f\x77\x5a\x12\xc7\x2b\xaa\xeb\x21\x9b\x99\xe7\x9e\xef\x12\x2d\x73\xde\x81\x09\x52\x07\x0c\x7a\x34\x80\xcd\x17\x18\xba\x57\x04\x60\xf6\xef\x97\xb8\xba\xdf\x14\xc7\xfd\x07\x79\xd8\x03\x84\xaa\x0e\xfb\x08\x1d\x18\x38\x2a\x68\x13\x1d\xed\xd1\xde\xd1\xee\xf0\x57\x78\x96\x67\xfa\xa1\x3a\xe7\x18\xa5\x5e\x5b\x26\x18\x86\x48\xb6\x2d\x1b\x8e\x11\xe7\x78\x7a\x97\x11\xd1\xfc\x0e\xbf\xa3\x57\x81\x64\xe0\x4c\xe6\x96\x86\xb0\xdc\x1d\x76\x6e\x8d\x21\x0f\x20\x63\x9d\x9f\x2e\x0b\x8e\x50\xaf\x52\x00\x44\x9c\x50\x1c\x36\x48\x3c\xcf\x60\x01\xcf\x26\x7a\xea\x94\x93\x7b\x81\x6d\x29\xbc\x6d\x9a\x5f\x92\xec\xc0\x60\xa4\x6f\x08\x1c\xde\x1d\x0c\x0f\x7f\xaf\x80\x2a\x41\x65\x28\x62\x76\x0b\x89\x8d\x57\x54\x50\xa6\x79\x25\x99\xeb\xed\x92\xb9\xb3\x89\x87\x6e\x5a\xf4\xfe\xe1\xc4\xc9\x60\x35\x48\x33\x05\x5c\x59\xe1\x1a\xa6\x52\x36\x76\x75\xe5\xa6\x81\x65\x9d\x05\xcd\x73\xe5\xd1\xd4\x45\x5f\x94\x91\xb1\x66\x09\x9b\x4d\x12\xbd\xe6\xca\xe8\x97\x00\xcb\x3c\x94\x61\xd7\x44\x95\xac\x0b\xc3\xdc\x9e\xf3\x60\xab\x14\xa1\x5d\xcd\x07\x6c\xd1\x04\xac\x04\x17\x51\x17\xd0\x7f\x88\x9c\xe6\x98\xb4\xe0\xe8\x11\x15\x9e\x3b\xd3\xd1\x8a\x2f\xeb\xcb\x06\x9c\x17\xdb\xf2\x42\x15\xb4\xb1\x44\x56\x3b\x13\xac\x96\xc7\xda\xdc\x11\x21\x46\xba\x08\xb1\xd1\x70\x50\x9b\x10\x97\x37\xaa\x95\x91\x9a\x06\x24\x00\x24\xf5\xc1\x0a\x5f\xbc\x26\x19\xf1\x8d\x42\x34\x94\xe5\x31\xf2\x7e\xb1\x1a\x84\x91\x70\x2f\xf7\x51\x58\x4f\x1a\xf4\xae\xfc\x17\xd6\x91\xd4\x5d\x1d\x1d\x15\x47\x5b\xd2\x5e\x99\x18\xf3\x89\xce\x09\x8a\x33\x81\x9e\x5c\xe9\x98\x20\x03\x7a\x78\x43\x85\xfe\x09\x09\xbc\x1a\xb1\xfa\x4e\xce\x1a\x63\xf5\x3d\x33\xe6\xf5\x05\x42\x57\xd0\x8e\x84\xe8\x61\x33\xdf\xec\xe0\x4d\xec\x79\xbe\x0e\x05\x78\x4a\xb2\xf7\x9d\xa5\xba\xb3\xd2\x76\x42\xb3\x28\x6d\x4b\xe9\x7b\x64\x46\xa6\x32\x3a\xa4\x0a\xad\x19\xda\x31\x8a\xbd\x22\x7b\x29\x58\x80\x5b\x5d\x7e\x60\x5c\xd2\xea\xdf\x48\xec\x72\xab\x1f\xc1\x78\xb6\xb2\xd7\xe8\x73\x5d\x5d\x2a\x2c\x60\xdf\x13\x6e\xb9\x11\x98\x64\xad\x63\x92\x19\xaa\x51\xae\xa0\xaf\x1b\x2e\x4e\x6e\xe0\x02\x0e\x0c\x09\xad\xde\x35\x22\xf2\x8e\x6b\xc4\x73\x63\xc3\xae\x78\x41\x40\xc3\xeb\x25\xca\xad\x6e\x35\x1c\x05\xe4\xc8\x6b\xc0\x3f\xb0\xaa\x50\xa7\xd9\x45\x7a\x4e\x76\x3c\x47\x97\xef\x99\x7e\x76\x2d\x72\x04\x44\xdd\xde\x15\xcf\x6e\xc6\x2e\x30\xf3\xf1\x07\x7f\x85\x8c\xbc\xb1\x31\x6d\xe3\x06\xb0\xca\x8c\x03\xad\x93\x63\x3d\x29\x1c\x52\x4b\x9a\x5e\x19\x9e\x3a\xc8\xc2\x24\x5e\xaa\x4a\x6b\xe4\xcd\x46\x2c\x8b\x84\x14\xe9\x06\x16\xed\xc4\xf2\x69\xdd\xb2\xac\x6e\xfd\x07\x58\x22\x26\x52\x1a\x74\x72\x03\x0f\xc4\x82\x92\xf3\x84\xb5\x8e\x3e\xb5\xce\xb0\x94\x57\xef\x7a\xc0\x16\x52\x68\xe5\xd1\x15\xa8\x9a\x04\x72\xbd\xfa\x6f\x6f\x33\xd6\x22\x75\x9b\xcd\x8e\xad\xc7\xf8\x46\x8c\x41\x73\x7d\xc3\x66\x6c\x05\x7c\xcd\x39\xbb\x63\x57\xec\x92\xdd\xb2\x6b\xa4\x3e\x60\x7a\xe1\xdf\xb5\xdd\xd9\xb2\x17\x7c\x72\x3a\xb4\x60\x60\x80\x29\xde\xf2\x1f\x1d\xf6\x92\x77\x07\x16\xfb\x0c\x4b\xe0\x13\xd7\x78\x72\x71\xbe\xbe\xe1\x05\x27\x25\x93\x3e\x70\xc5\x50\xc9\x84\xf7\x5c\xe7\xd9\x45\xda\x2b\xc1\xbb\x15\x87\x39\x93\x07\x76\x7e\xea\xe6\x07\xc9\xcf\xce\xc3\x03\x10\x8e\x1c\xb8\xa4\xdb\xa5\xe7\x05\xa4\xa4\xe6\x8c\x8d\x1f\x9c\x7d\xc9\x74\x33\x87\x0a\xec\xa3\xd4\xf9\xb3\x6e\x94\x13\xce\x81\xf9\x1d\x77\xba\x96\x0d\xe0\x60\x35\x51\x9d\x69\x43\xcd\xd4\xe3\x2f\x56\xff\x4d\x5e\x1b\x65\x7d\x85\x55\x6e\x25\xff\xa8\x2a\xfb\x62\xbf\x52\xc7\x0f\xb6\xa4\x15\x7c\x8e\xe5\xde\xf9\x77\x5e\x70\xe1\xa2\x32\x37\x06\xd7\x95\x24\x5a\xf9\x0a\x42\x08\xb4\xf6\x64\xdb\x55\xcb\x1e\x45\x39\xa3\x0f\xc1\x58\x3b\x11\x71\x55\x95\x69\x43\xa1\x8e\xa0\xcf\x87\x56\xf7\x35\x97\xce\xd8\x24\x75\xfa\xf0\x50\x5e\x20\x2e\x49\xb7\x84\xef\x29\x83\xa6\xcb\xde\xab\x43\x1c\xb2\x2f\x84\x3f\xbd\x17\xc2\x5d\xf9\x6c\x3c\x83\x77\xdb\x23\xcf\xda\xf8\xd2\x99\xda\x31\xbc\xd0\xf1\xb2\xc3\x01\x1a\x13\x23\xd3\xa8\x7c\x3f\xa7\x15\x99\x47\x84\x3e\xc3\xef\x29\x7e\x4f\xc5\xf7\x14\xbf\xa7\xf4\x1d\xfe\x56\xc4\xec\x4f\x95\x08\x13\xc3\xdd\x02\xcd\x04\x5c\x1f\xf0\x66\xa3\xf2\x50\x39\x6d\x86\xac\x89\xe7\x42\xdd\x81\x21\xfb\x4d\x3c\x14\xe0\xf1\x1a\x63\x20\xd0\x06\xde\x2a\xf0\x15\xbe\xbd\xf6\x86\x9f\x08\x10\x89\x7c\xe8\x9b\xea\x40\x0e\xdb\xd8\x6d\x9f\xa0\x4b\x0d\x11\x82\xa1\x2b\x9d\xb0\x95\xd3\xae\x4f\x93\x33\xd0\x28\x1a\xa9\x10\x48\x35\x88\x15\x95\x4c\x05\x51\xc8\xa6\x46\x01\x43\xe5\x44\x22\x7f\x45\xc5\x3a\xa7\xd2\x48\xf3\x3a\xa9\x7e\x59\xdb\xe1\xe0\x4b\xfb\x75\xbe\xcd\x55\x59\x7e\x74\xec\x89\xe8\x35\xf5\x19\xf9\x2d\xfb\x2d\xd6\xe9\xee\xdc\xef\x3e\x56\xdd\x0a\x83\x8d\xef\x55\xb3\xa2\xae\x95\x2e\x88\x1e\xab\xe4\x45\x65\x25\x2f\xb0\x92\x9c\x15\x7e\x52\x45\x2f\x79\x83\x44\x3e\x2f\xb1\xe8\xdd\xd3\xca\x5c\xf1\x14\xce\xce\x54\x79\xe7\xd9\xc5\xcf\x50\xdb\x15\xd6\xb6\x79\x5a\x6d\x70\xc2\xc2\x51\xfb\x58\x6d\xb7\x65\x71\xd4\x2b\x29\x8e\x22\xda\xf6\x07\x87\xfd\xec\xb0\x1f\x1d\x14\xc6\x75\xda\x16\x5d\x90\xb9\x51\x10\xc1\x36\x4a\x59\xa4\x39\x7d\x01\x02\x48\xb8\xf9\x3a\xa4\x1f\x13\x2f\xae\x0c\xb3\x51\xab\x51\x63\xcb\x24\xe0\x4e\x4a\x2d\xfc\xe9\xc0\x93\x76\x9f\x86\xea\x0a\x51\x3a\xfa\xd3\x69\x5d\x91\xad\xb5\x57\x69\x61\x1d\x16\xe1\xe2\x5b\xc7\x7b\x26\x93\xe3\xd0\x46\x9b\x05\xa8\xc9\x91\xe2\xf2\xa5\x54\x15\x12\x3f\x41\x1b\x8f\xee\x3f\xf1\xea\x3f\xbe\xfe\x5f\x6e\x20\xac\x8b\x26\x44\x03\x30\xea\x0a\x80\xb8\xd5\xbd\x12\x22\xc0\xa5\x1b\xf0\x40\xc0\xe6\x2f\x07\x9e\xf6\x61\xf3\xd7\x17\x60\x83\xfa\x3e\xe5\x16\xdc\x42\x90\xd1\xb1\x2c\xd9\x5c\xe3\x37\xa7\xbe\x77\x23\x40\x23\x43\xb5\xbe\xbf\x1e\x85\xce\xe1\x26\xc8\xad\xb5\x68\xa0\xf9\xa5\x06\xaa\xa1\x93\xec\x56\x2c\xa1\x23\x96\x10\xc1\x28\x70\xa0\xa0\x80\xd1\x6f\x28\x5f\x64\x7f\x38\xbc\x75\x3a\xb0\xfa\xc7\xec\x1f\x18\xa7\xe1\x5f\xf0\xa7\x65\x9d\x9c\x9c\xf4\xd8\xef\x70\x1a\x57\xc0\xf0\xf7\x2f\xc3\x70\x9e\x1a\x5f\x07\x35\x91\xc3\x11\x3f\x57\xd0\xd3\xdf\xbf\x04\xc3\xbc\x89\xa7\x41\xad\xaa\x81\x6a\x18\x2e\x25\x0c\x83\xbd\x22\xa9\x28\xb2\x12\xd0\xfb\xc9\x81\xa7\x7d\xe8\xfc\x74\x00\x3a\x4f\xd8\x15\x32\x52\x85\xd8\xf3\x4a\x2b\x62\x21\x35\x3a\x5a\x57\x40\x07\xf4\xf2\x2b\xf9\xf4\xe1\xc1\x7b\x78\x88\xc7\x06\x7a\xcc\x3c\x13\xe1\xb9\x33\xb2\x48\xc8\xa4\x57\x1b\x34\xae\xc5\xb7\x98\x4c\x92\x32\xb1\xe7\x56\xda\xc4\x74\x07\x03\x96\xc2\x76\x66\xa5\x14\x6f\x2f\x25\x6e\x63\xb8\x43\x5b\x16\xa7\x10\x19\x00\x8c\x9f\xfe\x37\x50\x00\xd4\x27\x37\x7d\xac\x76\xff\x42\x3d\x5c\x89\x46\x10\xdf\xed\x4f\xd2\xa5\x9c\xa4\x98\xc9\x42\x7a\x91\xc3\xf8\xb4\xf6\x3f\xb5\xc6\x9d\x2a\x6a\xe6\x8f\x8b\xe2\xf1\x4a\x62\xef\xef\x8b\x2b\x4f\x07\x95\xf6\xaf\xd0\xca\xb6\x33\x38\x3e\xed\xf6\x60\x67\xa0\xb3\x91\x4f\x19\xd0\xad\x7e\x0a\xa9\xc3\x7e\xbf\xdf\x3b\x1e\x30\xe7\x53\xe6\xd8\xc3\xc1\xa0\x27\x1e\x57\x0e\x74\xc2\xb3\x4f\x7a\x27\x27\x83\x61\x9f\x39\x9f\xb3\x58\x54\xd1\xef\x40\xe6\x2b\xcf\x5f\x60\xd9\x4e\xe7\xb4\x0b\x3c\xc3\x95\x9f\x7c\xc2\x16\x86\xc7\xc7\x56\xb7\xdf\x67\x57\x81\xe3\x5e\xc3\x49\x03\xbf\x21\xf0\x7d\x33\x27\x58\x45\xe1\x8c\xbe\x77\xad\x3e\x14\xc7\xfe\xe0\xec\xe0\xc3\x8d\x1f\x01\xe7\x6b\x9f\x5a\x83\x41\xd7\xea\xb2\xab\x18\x98\x0c\xbb\x63\x9d\x74\xfb\xdd\x1e\x54\x95\xc5\xc1\xe6\x36\x8a\xa0\x74\x7f\x70\x3a\xec\xf6\x3a\xcc\x75\x80\x96\xa6\x2a\x86\xdd\xe1\x70\xd0\x3d\x61\x44\x45\xc5\x1e\x10\xd5\xd4\xe1\xde\xa0\x0b\x49\x91\x4b\x54\xa5\xdd\xe9\x1d\x9f\x9c\xf6\x8f\xd1\x37\x6d\xec\x04\xd8\x89\x7e\xbf\x7b\xdc\xc5\xd7\x10\xb8\xa4\x5b\x2f\x16\x75\x0d\x4e\x3b\xa7\x27\x1d\x4a\x4e\xfc\xe0\x9a\x7a\x3b\x80\xda\x98\x1b\xfb\xab\x24\x82\x3e\x41\xb9\x1e\x22\x04\x77\xe3\x84\x12\x54\xb8\x8a\x04\x74\x7b\xa7\xf4\x42\xdf\x7a\x83\xe3\x6e\x8f\x5e\x17\x51\x00\x8c\x71\x8c\xdd\xef\x5a\xa7\xdd\x53\x99\x6b\x11\x3b\x1b\xbb\x03\xff\x3b\xb5\x3a\xc7\x32\x05\x7d\xe1\x76\x07\x43\xa8\x5f\xbe\xef\xe4\xb8\x5e\x3a\xd7\x3e\x54\xd3\xef\xf5\xba\x03\x51\xcd\x0a\x6f\xbb\x52\xc7\x3e\xed\x58\xa7\xc3\xbe\x68\x31\x0a\xfc\x1b\x4f\xd4\x36\x18\x9c\x1e\x9f\x9e\x8a\xac\x91\x70\x3e\x88\xa3\x3f\x06\x38\xcb\x34\x77\xe9\x43\xcf\x2c\xab\x6f\x59\x9d\x2e\xa5\xc5\xde\x8c\xaa\x03\x9c\x4a\xef\x09\xcd\x1d\xcc\x7c\xcf\x3a\xe9\x77\x44\xb9\xc4\x73\x44\x03\xb0\x18\x4e\x01\x6a\x22\x11\x81\x4d\xa0\xe8\x1f\xf7\xfa\xbd\xfe\x71\x91\x4a\xa3\x45\xc8\xf5\x4f\x07\x7a\xaa\x57\x4e\x85\x35\xfe\x29\x8b\x7c\x98\xc4\x41\xf7\xb4\x2f\xd2\xd4\xe2\x18\x9e\x9e\x0e\x10\x76\x9e\xb7\x5e\xa3\x6d\x0d\x8c\xa3\x33\x3c\xc5\x46\x20\x25\xb9\xde\x88\x86\x4f\x3b\x83\x0e\x9b\xf9\x2b\x6a\x70\x78\x0a\x6b\x68\x38\x10\xef\x9e\xf6\x1e\xcd\x16\x72\xce\xbb\x96\xd5\x83\x11\xb0\xb9\x0f\x54\x50\xec\xc3\x9a\xed\x20\x80\x3a\xfd\x21\x83\x95\x01\xab\x45\xed\x11\x58\x09\xa7\x00\x34\x54\x21\x4b\x52\x39\x55\xdd\x61\xef\xa4\xdf\x05\xda\x1e\x18\x5c\xdf\xa1\x1e\x75\x4e\x61\x49\x2c\xd0\xc4\xe2\x2a\x8a\x23\x5c\x30\xb0\xd6\x60\x7f\x2c\x96\x51\x92\xaa\xba\x7a\x9d\x21\x64\x65\xb8\x32\xb0\x10\xbc\x40\xcd\xda\x3a\xe9\xf7\xba\xa7\x1d\x4c\xc2\x41\x40\x0b\x1d\x9c\x0a\xd1\x66\xaf\x7b\x3c\x3c\x11\xcf\x1b\x2f\x80\xb5\x0b\xfd\xed\x5b\x3d\xd8\x39\x8c\x86\xa8\x72\x2f\xa3\xd0\xdb\xcc\xbc\x5b\xb9\x61\xa1\x07\xcb\x28\x55\x70\xeb\x9d\x1c\xf7\x2d\x74\x9d\xec\x3b\x21\xce\x76\xa7\xd7\x1f\x9c\x0c\xba\x7d\x4a\x5a\x44\x04\xc5\x5e\x0f\x72\xdc\x44\xf1\x86\xc6\x0e\x1d\x04\xaa\x51\x2c\xbf\xc1\xf1\x09\x74\xd9\x62\x81\x03\xdc\xea\xcc\x8b\x21\xa5\xd3\xeb\xe2\xca\x50\x29\x00\xd9\x64\x49\xe5\x7a\x3d\x00\x77\xe0\xdc\x86\xa2\xf7\x27\xb0\x96\x4f\x8f\x87\x2c\xf0\x60\x45\xc1\xca\x9b\xcf\x71\x61\x21\x6c\x01\xc7\xb0\x00\x8f\x1d\xb1\x95\x60\x2f\xc1\x12\xef\x8b\x24\xb9\x6b\x07\xc7\x43\xf4\xd2\x2a\xd3\x70\x93\x75\x00\xb8\xb0\xc2\x4f\x45\x52\x0e\x40\x05\x18\xc0\x6b\x27\x5d\xec\x16\x7d\xa5\xfd\x06\x9b\xb9\xdb\x83\x8d\x29\x93\xc4\x0a\x3e\x3d\x81\x4d\x97\x27\xed\xe6\x52\x40\x1b\x9c\xf4\x87\xb2\x8f\x6a\x47\x40\x22\x4c\x47\x57\x26\xaa\x2d\xd1\xed\xf4\xbb\x27\xa7\xb2\x59\xb5\x30\x21\xc1\xea\xf5\x65\x2b\xc5\x96\x38\x3e\xe9\x01\xe6\xed\x95\x92\xbd\xdd\xe4\xd4\xf3\x02\x09\x16\xe8\x04\x6c\x2d\x91\x9e\x0f\x13\xa6\xa7\x73\x82\x89\x2b\xc4\x61\xdd\x13\x8b\x1e\xe5\x7a\x81\xa5\x84\x53\x19\x00\x2a\x0f\x09\x24\x83\x21\x20\x42\x85\x36\xf2\x25\x0b\xc8\x3e\x82\x21\x21\xee\x1c\x5a\x27\x0c\x7d\x68\x65\x2b\xed\x14\x80\x45\x73\xdc\xeb\x76\xe5\x07\xb9\x75\x06\xf2\x55\x61\x91\x6e\xb7\x83\x2b\x5b\xa6\xae\xb3\x78\x1d\x78\xb0\x71\x01\x47\xc3\x99\x23\x12\x73\x28\xf5\x4e\x8f\x4f\x60\x2d\xa8\xe4\x1c\x75\x9c\x58\x27\xc7\xc7\x00\x3d\x99\xbe\xc6\x83\x50\x94\x18\xf6\x3b\xb0\x22\x44\x7a\x81\x28\xfa\xb0\x36\x7b\x96\xca\x2f\x90\x85\x58\xd3\x40\x12\x76\x8e\xa1\x5d\x7f\x16\x16\x0b\x0b\x00\x00\x5b\x0b\x12\xc3\x14\x5d\x61\xae\xf0\x04\xeb\x76\x4e\x06\x50\x81\x9f\xa4\x9b\x38\x4a\xd4\x21\x86\x45\x23\xd7\x75\x12\x3f\x94\x29\xdd\x53\x16\x3a\x37\xce\xdf\x51\x8e\x13\x86\x27\x43\x58\xb7\x90\x08\x8b\x06\x0e\x21\x58\x80\x68\x47\x0c\x5f\x00\x15\x0f\x06\x98\x80\x3e\xd1\x71\x4f\xf6\x60\xd5\xd3\xdb\x2c\x76\xae\xec\x63\xab\x7f\x72\x0c\xc8\xac\x40\xc9\x80\xda\x60\xc3\x8b\x77\xea\x3e\xe0\x84\xd3\x1e\x1c\xa4\x0a\xb6\xfd\x1e\x6c\x00\x98\xfa\x35\xf0\xd8\x1a\xaa\x18\x0c\x07\xc7\x30\x54\x91\x4c\x60\x02\x74\xda\x85\xed\x24\x92\x0a\x38\xc1\xda\xe9\x9e\xc2\x5c\x50\xb2\x06\xa6\x7e\xef\x04\x50\x4d\x0f\x92\xd7\xce\xc6\x81\x91\xad\xc5\xc6\xb5\x8e\x8f\xd9\x1a\xa5\x18\xeb\x6c\x3e\xa7\xb1\xc2\xff\x21\x9b\x17\x67\x88\x2f\x86\x27\x80\xf6\x99\xda\x1b\xc3\x8e\x05\x6b\x68\x1d\x64\x2b\x3c\xa3\xbb\xfd\x61\x0f\x0a\x47\xb7\x33\x89\x64\xa1\x6d\x38\x23\x60\x27\xca\x25\x81\xab\xec\x18\x76\x32\xa0\x5c\x0f\x20\x2c\x53\x87\x43\x58\x12\x70\xfc\xca\xe1\xc3\x52\x82\x41\xc0\x84\x6c\x24\x3d\xd0\x85\x33\x75\x00\x47\x4d\x1c\x6d\x1c\xb1\x1f\x60\x9f\x0d\xf1\x98\x48\x9c\xd9\x2c\xf0\x44\x36\x98\x5d\xd8\x0d\xc7\x2c\xdf\xa3\x80\xfc\x60\x3b\xc3\x7b\x38\x53\x35\x0d\xad\x1e\x94\xec\xb3\x62\x31\x5a\x03\x48\x3a\xc6\x84\x64\x09\xdb\x8a\x40\x00\xa3\x38\x61\x89\xef\x85\x21\xec\x13\xc8\x30\x3c\x86\xe5\x0a\x74\xc1\x0d\xa2\x3c\x40\xfd\x5d\xc4\x1a\xa5\xfd\x0d\x94\x49\xb1\x90\x61\x34\x96\x35\x94\x29\x62\xb3\xf7\x60\x4e\x61\x4a\xb5\x7d\xae\x52\x42\xb9\x91\x07\xa7\x30\x97\xa5\x45\x3f\xe8\x5b\xd0\x6a\x8e\x02\xfa\x43\x20\x22\x00\x2e\x29\xa2\xbf\x1e\x6e\x16\x7c\xf1\x00\x3f\xc2\x90\x4e\x87\x44\x47\xa6\x00\x4c\xc0\x41\xb0\xc6\x80\x74\x49\xa3\x95\x93\x46\x84\xf5\x8f\xe1\x4c\x67\xda\xce\xe9\x0e\x60\xe1\x0f\x99\x3c\x60\x61\x29\xc1\x51\x7c\x32\x64\xb7\x4b\xcf\x49\x89\xb2\xeb\xe1\x88\x8a\x03\xf0\x18\x8e\x16\xf1\x9a\xac\xa2\x6b\x45\xfc\xc1\x06\xd0\x30\xd1\x10\x05\xc8\xe2\x5d\x2d\x47\x58\x11\xd6\x71\x7f\x6b\x8e\xbe\xaf\x52\xa4\xc3\x8b\xf4\xef\x1d\xe9\xde\x67\x23\x9c\x63\x93\x84\x9b\xb2\x44\x31\x7f\x4d\x3e\xd7\xee\x96\x31\x7f\x81\x92\x7c\xf2\x0e\x97\xdc\x3c\x6a\x63\xc3\x7c\xf3\xbe\x52\xdf\xcd\xe7\x1e\x93\x3a\x8f\x23\x61\x63\xfc\x96\xbc\x0a\x31\x21\x87\xf2\xc6\xb1\x9d\x51\x9c\x79\xcd\x49\x5f\xac\x3b\xd7\x7d\xc4\x42\x20\xca\x7d\x11\x4b\xcd\x29\x34\xa0\x35\xa9\xc6\x50\xc4\x27\x8f\x2a\x75\x14\xbe\xf1\xbe\xe4\x3a\x39\xab\x0a\xde\x91\xee\x95\x4f\x4b\xe5\xd1\x15\x98\xae\xb1\xa0\xfb\x05\x40\xb6\x20\x32\x45\xe8\x1f\xfd\x5e\x42\xf7\xe9\xec\x08\x8d\x43\x18\xc1\x3f\x6b\xff\x6c\x14\x3e\x12\xda\x1f\x6b\xed\x05\xfb\x67\xad\xf6\x4f\xb3\x01\x5f\x6c\x65\x19\x82\xec\xd0\x7b\x6f\xf1\xfa\x6e\x6d\xfc\x73\x82\x25\x1a\xb5\x8f\xe1\xb4\x66\x52\xa4\x2e\xa4\xce\x5f\x46\x33\x0f\x66\xd0\xd2\x74\x90\xa8\xdf\x15\xde\x08\xe2\x9d\x2c\xef\xa3\xdb\x04\xbe\xea\x56\xa0\x74\x05\x97\x47\x16\x88\x31\xa9\xd9\x51\x81\x1b\xb0\x2f\xdf\xa9\xcc\xb5\x59\x8d\xd5\x64\xbe\xfb\x5a\x63\xd7\x09\xbc\xa6\x64\x45\x6e\xac\x85\x26\xab\x30\x22\x6e\xd4\xec\x6f\x66\x13\x8a\xa6\x32\xad\x6d\x25\xc0\xa0\x36\xf8\xb0\xc5\x4b\x0a\x9e\x8e\xcb\x7d\xca\xad\x41\x71\xca\xd0\xa1\x8d\x9d\xa1\x14\x57\x1b\xc6\xe1\x75\x4b\x23\x4a\xce\x78\xa0\x06\x45\x8e\x3b\x33\xf5\x96\xf1\x67\x1d\xe6\x4b\x16\x3b\x21\xe5\xdb\x3e\x79\x1a\xd4\x60\x0b\x7b\x47\x77\xca\x37\xf2\x1a\x0d\xf4\x09\x50\x99\xd7\x33\xa9\xc1\x5e\xff\xd9\xee\x07\xb4\xee\x16\x97\xb2\x8d\x86\xb7\x4d\xb8\xd7\xe8\x4a\x2f\x3f\x7b\xf9\xd4\x3c\x75\x7a\x14\x42\xcb\xc8\xd0\xd1\x4b\xc7\xda\x6b\xab\xd1\x35\x8f\x8e\x1a\x8d\xc4\xb4\xe9\x63\x4c\xbe\x57\x9f\x59\x78\xe5\x91\x9b\x94\x03\xb8\x8a\x45\x56\x13\x8b\xec\x9f\xc2\x16\x7b\x14\x9c\x25\xa3\x3c\x0c\x80\x5e\x73\xd2\x68\xa0\x44\x5f\x38\xf1\xa4\xaa\x4d\xac\x38\x77\x11\x26\x3a\x66\x1e\xe8\x57\x82\x8a\x98\xe8\x98\xb2\xd1\x70\x0a\xb7\x62\x31\x40\xc4\x35\xd1\x52\xda\x0f\x33\xaf\x50\xf7\x93\x3d\x65\x49\xd3\xc9\xd5\xd3\xf3\xd4\x22\x08\x99\xb0\xd3\xba\x87\xed\x8e\x7f\xd0\xb4\x80\x05\x85\x9d\x5f\xc2\x2d\xd4\xd0\x40\x07\x6a\x18\xc2\x0c\x9a\x8a\x46\xc5\xa4\x2d\xc9\x71\x11\x24\xfa\x47\x47\xb1\xf8\xb6\x54\x66\x36\x8c\x4a\x8c\xd2\xa3\x23\x89\x5e\x96\xa4\x60\x39\x07\x08\x98\x0f\x0f\xd2\x7e\x6c\x99\xf7\xcc\xc1\x65\x37\xdf\x0d\x6b\x4f\x73\x5e\xf6\x9b\x46\x71\x2a\xcd\x7c\xc3\x89\x22\xb4\xe3\x52\x53\xcd\x3b\x8a\x3a\x84\xad\x52\x8e\x43\xaa\x74\x3b\x4a\xae\x7a\x42\x33\x26\xc3\xc2\x14\x7a\xa7\xfc\xc3\x91\x3b\x21\x81\xe1\x27\xd9\x0e\x1a\xca\x83\xff\xa6\x7b\x1a\x8c\x6a\x0b\x1c\x8a\xdf\x10\xc1\x20\xc2\xa9\xb9\x2d\x50\x9a\xa9\x36\xeb\x47\x52\xaf\xd4\x87\x55\xed\x02\x06\x6b\xf6\x77\x0a\x91\xc4\xcc\x85\xb3\x46\x1c\x39\xb8\xf3\x59\x0d\x8d\x81\xdb\x90\x58\xa3\x93\x28\xd5\xbe\xfe\xff\xd4\xd7\xd4\xb9\x6a\x26\xde\x1a\xfd\x99\x7b\xb3\xa6\xf0\x75\x24\xdd\xf1\xfd\xdb\x61\xbf\x38\x2c\x74\x59\xea\x32\xcf\x65\xb1\xb0\xdb\x98\xdc\x89\xab\xbc\x1a\x7a\xa9\x01\xac\xfb\x22\xf4\x57\x74\xd3\xf0\x5d\xec\xac\xbc\x9a\x39\x7d\x78\xd0\x3b\xad\xdd\x4d\x87\xac\x73\x6c\x92\xdb\x07\x0a\xd9\xf2\x54\xd5\x7d\xa5\x9b\x0f\x3b\xb0\x27\x9d\x22\x17\x2a\x2c\x0a\x8b\x7a\x8d\x14\x17\xb2\x6b\x43\x5d\x76\xc6\xe6\x36\x20\xa0\x50\x84\x89\x1b\xfd\xe2\x8c\x7f\x71\x5a\x21\xf7\xed\x7f\x3b\xdc\x87\x31\xc1\x9f\xd0\x7d\x78\x30\x52\x97\x97\xae\xde\x53\x17\x36\xb9\xcb\x81\xaa\x73\x8d\x4f\x64\x34\xae\xfa\xda\x9a\x23\x97\xa8\xcb\xb8\xde\xe0\xe5\xff\x87\x54\x0a\x7a\xe3\x28\xdb\xf3\xdd\xa4\x56\x9f\xb8\xef\xa6\x1c\x46\x58\x37\xd2\x42\x5c\xd7\x41\x5f\x15\xa6\xd9\x4e\x6d\x3d\x8b\x14\x8a\x65\x2e\x9f\xd4\x36\x78\xd1\x0c\xff\x1c\xf8\x37\x87\x7f\x6b\xf8\x17\xc2\xbf\x8f\x77\x57\x03\x54\x08\x86\x7f\xf0\xdf\x35\x3a\x6f\x82\x7f\xdf\xc3\xbf\x0f\xf0\xef\x1d\xfc\x7b\x5d\xc3\x70\x83\xac\xf6\x67\x6d\x4a\xeb\xe5\x55\x4a\x6e\x64\xc5\xd2\x7a\x47\x2e\x37\x2a\x5d\xeb\xe4\x42\x4f\xb4\xea\xb3\xce\xc8\xb6\xaf\xce\x31\x98\x76\x4a\x5a\xe7\x6a\xb0\x50\xe6\xbd\x70\x72\x88\x36\x32\xbc\xd3\xd0\xae\xf1\x3b\x70\xbc\x75\x1b\xb9\x76\x40\x98\xeb\x06\x74\x2c\xcc\x9b\x8b\x92\x9b\xc0\xc5\x17\xd2\xcf\x3e\xeb\xd5\xb5\x4a\x0c\x3c\x23\xdb\x3d\x13\xeb\xcf\xdc\xc9\x49\xc3\x6b\xf7\xa4\xaa\xaf\xef\xf2\xb6\x31\xb6\x8d\xc9\x7f\xee\xd1\xa8\x67\xf2\xfc\x8c\xff\x07\x5d\x41\x1b\x93\xc6\xc7\xe6\x37\x94\xf4\x8f\xff\xc1\x1f\x0b\xfe\x7d\x9c\x35\xe0\x2f\xc3\xa7\x56\x73\x2c\xde\x26\x4e\xf3\xf3\xb7\x90\xa1\xed\xb3\xc8\xcd\x65\x8f\x57\x55\xde\xc1\xc2\x5c\xc2\x69\x74\x61\xae\xdd\xaa\x3c\xe2\x7b\x6b\x1e\x47\xab\x97\x12\x61\x93\xd2\x45\xf4\x85\x0a\x4f\xd0\x21\xd2\x17\xf2\x74\x86\x90\xe9\x8f\x2f\x67\x82\x97\x5f\xd7\xc0\xf0\xbc\x74\x12\xb2\x76\x5b\x54\x7b\x5b\xc4\x42\x30\xfb\xae\x9f\x08\x74\x05\x98\xe3\x70\x46\xa0\x8f\xa2\x10\xf5\x64\x9c\x80\xb2\xce\x0f\x67\xfd\xce\xbf\xf3\x66\x94\x29\xae\xcc\x74\x60\xe5\xe4\x25\xb5\xeb\x85\x62\x45\x58\x94\x11\xe3\x8d\xe2\x8a\x1a\x50\x80\x75\xe1\x3e\xcd\xa1\x59\xc3\xad\x89\xe7\x96\xeb\x12\x46\x18\xfd\xad\x5f\x11\xdc\x2f\xbc\x14\x53\xed\x03\x17\x7d\x97\x68\x97\xfd\xeb\x87\x97\x14\x2d\x04\x01\x86\xd9\x37\x5f\xce\xbd\x91\x99\xbf\x03\xdc\xf2\x27\x20\x8f\x2f\x95\x50\xf9\x64\xb1\x1f\xa2\x2c\x4e\xbe\x54\x86\x32\xc9\x02\xe7\x7e\x10\xa0\x0f\xe7\x28\x9c\x7d\xb1\x9c\x9e\x37\x2f\x1e\x66\xa9\xf7\x84\x92\x94\x4d\x15\x02\x7a\x62\xf9\xc5\x22\x98\x49\x16\xb8\x78\x5a\xff\x2e\x4a\x5d\x43\xb4\xfb\x68\x09\xcc\xa0\xe5\xfd\x0c\x8b\xf1\xe7\xf9\xbc\xe4\x49\x34\x2f\x65\x6d\x85\xa3\xbe\x9f\xe7\x87\xab\x94\x19\xb0\xca\x64\x7f\x71\x04\x2e\x32\x76\x72\x45\x68\xa6\xb4\xad\x4b\x4d\x6d\x45\x96\xdc\x1c\x28\xb8\x79\xb4\x5c\xd5\x92\xc9\x0b\xab\x8f\x8f\xd6\xb0\xb7\x7a\xf2\xe2\xf4\xe5\xd1\xb2\x87\x16\x52\x5e\x85\x9e\xe1\x0b\x35\xed\xad\x29\xad\x12\xfa\xf6\x78\xf9\xdd\xe5\x55\x94\xc6\x2f\x8f\x96\xad\x58\x69\x79\xe9\x8b\x27\xf4\x7d\x77\xd1\x89\xc2\x98\x7a\xb0\x98\x38\x74\x02\x81\x64\x0a\x0c\x33\x72\x5c\x8a\xd6\xc5\xbf\x4b\x2b\xe3\x74\x71\xf8\x3e\x73\xa4\x7f\x27\x35\x6a\xc0\x6f\x78\x1d\xb7\x65\x65\x24\x49\x19\x72\x4c\x11\xb6\x34\xfc\x62\x98\x0d\xc2\xbd\x55\x07\x40\x29\x1b\xa1\x45\xea\x51\xc2\xe5\x83\xd0\x6d\xcf\x93\x5b\x19\x50\x3c\xea\x13\x3c\x17\x9f\xa1\x9f\xbb\xc3\x28\xdc\x6f\xba\xae\xd1\xf5\x7a\xcc\x2a\x85\x3e\x3a\xd8\x5b\x46\xef\x12\x39\x88\x17\x81\x62\x01\x7d\x57\x0e\x5b\x84\x6b\x2a\xf2\x3d\x3a\x5c\x91\xa5\xd9\x11\x83\x85\x6e\x27\x12\xcc\xa5\xb1\xe4\x23\xc5\x0f\xbb\x03\xfd\x79\x8e\x1d\xad\x30\x3c\x97\x90\xd1\x0c\xe0\x75\x72\x24\x6c\xa6\xcd\xa1\xd7\xaf\x8b\xae\x96\xf1\x11\xf4\x28\xad\x4a\x05\xda\xee\x64\xd8\xf7\x06\x30\xa0\x49\x2d\x81\xb3\xcf\xd9\x90\x19\x97\x7c\x48\x81\x7e\x16\x4f\xb7\xde\x2c\x54\xcf\xe9\x12\x76\xb2\x78\x9c\xc7\xbe\x78\x48\x1c\xe8\x0f\x3e\x4e\x0f\x48\xa5\x52\x7e\xdc\x14\x57\xe5\x1e\x8c\x03\x1d\xb8\x57\xae\x4a\x43\x5b\x95\x66\x15\xf0\x9b\xea\x65\x43\x13\xf1\xed\xf1\xa1\xc5\xba\x37\x6b\xc7\xf5\x92\x22\xe7\xce\x1c\xaa\x9e\x29\x08\xe7\x8d\x54\x81\x5a\x9f\x27\x94\x6c\x00\x4f\x4e\x5d\x69\x1f\x43\xff\x30\x4a\x23\x79\xd6\xc6\x61\x36\x6a\x49\x6d\xca\xbd\x7c\x7e\x65\x0a\x4d\xbf\x57\x9a\x79\xfc\x22\x6a\x84\x02\xff\x6f\xf4\x4c\x90\x25\xad\x5b\xcf\xbb\xc6\xda\xc4\x6c\xab\x94\xa4\x48\x2a\xd6\x22\x7d\x50\x2b\x55\x7e\x2c\x2d\x56\xcc\x20\x57\x6b\x9e\x43\xbc\xd3\x4c\x27\x2e\xbf\xaf\x35\x6b\x36\xb0\x00\x97\x76\xed\x9b\x1a\xb3\xec\x9a\x55\x03\xb8\x03\x79\xfc\x9f\x8f\x49\x1d\x68\xdd\x36\x5b\xe2\xcb\xb7\x6d\xa4\xfd\xc9\x85\x5c\x95\x65\xef\xbd\x08\x07\x27\x02\xb4\xd9\xef\x52\x52\xdb\x85\xa5\x2c\x13\x7e\x4e\x49\x9f\x50\xb8\x8d\x27\xc2\x4b\xd4\x64\xdc\xcf\x80\x90\x5c\x39\x81\x5d\x6b\xd5\x58\xba\x8c\x32\x94\x5b\x27\x36\xb2\x9e\x0b\x20\xf5\xd6\x40\x9a\xda\x93\xde\x94\xb9\x59\x1c\x7b\xa1\xbb\xb1\x27\xb5\x7f\x20\xc7\x32\x65\x68\xdc\x4f\x98\xb8\xf6\xad\xf3\xcd\xb7\x57\xdf\x7c\xeb\x7d\xf3\xed\x1f\xdf\x7c\xfb\x67\x8d\xbe\x40\xea\xaa\xfd\xed\xac\x8d\xef\xa9\xc8\xf5\x83\xfd\xed\xb9\xfd\xed\x45\x0d\x65\xfa\x7e\x04\x8d\x4c\x6a\x2f\x90\xe5\x79\x77\x4e\xb5\x6d\x30\xe1\x42\x6d\xb0\x73\xb5\xc1\x3e\xe4\x1b\xec\x77\x6d\x83\x7d\x28\x36\xd8\x77\x6a\x83\x5d\xe4\x1b\x8c\x25\xcb\x28\xc6\x15\x20\xab\x14\xf5\x89\xca\x44\x45\xa2\x0a\x51\x5a\x14\x85\x52\x2b\x44\x78\x58\xe4\x27\x27\xcc\x9c\x98\x2a\xf7\xae\x62\xf9\x78\xee\xc4\xee\x12\x7e\x5f\xac\x63\x3f\xa0\x77\x4c\xfd\x29\x0b\x3d\xfa\x09\xf0\xed\x45\xb6\xc8\x12\x54\x30\xbe\xf0\xd6\xa9\x47\xf1\xf9\x58\xed\x67\x37\x8d\xc4\xd3\xdb\xe8\x46\x25\xbe\xf2\x5c\xf1\x28\x3b\x7b\xae\xb5\x2d\xda\x15\x4d\x8a\x06\xf5\xe6\x44\x6b\xa2\x31\xd1\x92\x68\x43\xd4\x2f\xaa\xae\xa1\x5f\xf3\x9c\x55\xe4\x0b\xb7\xa5\x2f\x0f\xe4\x76\x17\x1e\x89\x8b\x5c\x4f\x27\xb7\x13\x1b\xb8\x59\xf8\xb7\xeb\x65\x59\xf8\x46\x25\xb7\x65\x6c\x0d\x0c\x36\xbc\xaf\x5d\xa5\x4b\x26\x7e\x94\x83\x2c\xe1\xb8\x26\x6d\x70\xc8\x90\x0a\x4f\x35\x09\x3d\xff\x1f\x74\xc7\xbc\x43\xf7\xc9\xcf\xa2\x08\xff\x32\xf9\x97\xc8\x15\xbc\x76\xc5\xa1\xe6\x8d\xc4\x48\x50\x88\xea\x39\xbb\xb6\x9c\xc0\xf7\xde\xb8\x7b\xde\x7c\x5b\x38\x54\x73\x7c\x03\xd8\x84\x1e\xa7\x94\xd9\x4e\x3c\xe9\x3f\x96\x34\xd7\x61\x57\x7e\xe7\xe1\x72\xda\xe5\xac\x12\x81\x30\xa3\x95\x97\xc6\x1b\xf2\xe8\x20\xf3\xbd\x8c\x02\xe9\xb6\xe3\x90\xcf\x5d\x0c\x28\x29\xf2\x26\x0c\x3d\x45\xe9\x1e\x48\xa4\x0b\xe8\xc4\x23\x9f\x4f\xa5\x06\xb6\x6c\x06\xbd\xb9\x58\x2f\xbd\xbd\xce\xc0\x19\x4e\xc9\x48\x0c\xbf\x8b\xfc\x70\xd7\x3b\x3f\x7a\xd0\x74\x01\xe7\xcd\xfc\x10\x76\x64\x82\x8e\x18\x30\x17\xd9\xab\x90\x71\x22\x43\x43\x52\x28\x7c\x9e\x05\xa9\x5f\x55\x83\xde\x79\xbd\xa6\x03\xfd\x0f\x85\xb7\xab\x83\xed\xbc\xf1\x43\x4f\xb0\xbb\xbb\xed\x78\xc6\x4e\x57\xc9\xeb\x39\xf5\xeb\x70\xa1\xaf\xeb\xdc\x5c\x00\x57\x56\xfd\x2e\x0a\x36\x8b\xbd\xc9\x5a\xee\xf5\xa3\x80\x4e\x55\xfe\xaf\xec\xc2\x52\x75\x01\x6a\xfd\x5e\xce\xf1\x93\x16\x8e\x5c\x10\xfe\x17\x97\x0e\xad\x18\xb5\x2b\x1c\xd8\x14\x55\xd2\xc7\x15\x46\x6b\x2a\xed\x1c\x68\xf1\x1c\xf6\xf5\xca\x95\x7e\xa8\x5d\xb6\x51\x5b\x0c\x3e\x00\x62\xd8\x59\x7e\xe6\xfd\xca\x6d\xf0\x7e\xfd\x93\xb3\x65\x34\xd7\xf6\x15\xdd\xf8\x5f\xa0\x9a\xbf\x7c\x7e\x1d\xce\xe0\x69\x2d\xe0\x26\x3e\xe8\x96\x2d\x6e\x8b\xd0\x01\xd0\x97\xe7\x6e\x2b\x2f\xcb\x17\xde\x56\x95\xc1\x0a\xf6\xec\x10\xba\xf5\x8d\x3b\xc2\xc6\xad\xb3\x70\x8c\x1d\x68\x84\x76\x58\xae\x42\xbe\x40\x71\x7c\xa4\xee\xf1\xab\x02\x2a\x57\x28\xc0\x48\x0e\x19\x11\x23\xe4\xcf\x85\xf4\xf8\x8e\x4f\x12\x1e\xb2\x25\x0f\xa7\x26\x9b\x93\xce\xe0\x9c\xa3\xcb\xa2\xb3\x05\xba\x93\xe3\xfa\x95\x99\x08\xa6\x2e\xc5\x9f\x6b\xcf\x98\xa4\xf5\x57\x0e\xf3\xe0\x8f\x70\x57\xb6\x52\x3e\x44\x67\x9e\xb1\x42\x7b\x48\x9f\x4f\x32\xdc\x19\xcd\x0c\x37\x89\x85\xe6\xdc\x33\x74\xe0\x99\x99\xa3\x73\xcf\x88\xd0\xbe\xfc\x0e\x7f\xa5\xd9\x5f\xda\x5c\xb3\x80\xbb\x67\xd6\xb8\x63\xc3\xfc\xdf\xf0\x08\xcd\x06\xde\x39\xf5\x80\xcd\xf8\xc2\x31\x5c\xf3\xac\x73\x42\x91\xb7\x66\xff\x31\x6e\xce\x82\xfa\xfa\xe8\x28\xa8\xa7\x67\x37\x32\x48\xc9\x06\x0a\x74\xb0\xc0\x68\x23\x7b\xbf\x31\x73\x73\xbe\x1b\x6e\xdc\x34\x7a\x43\xcb\xfc\x16\xfe\x34\xd1\x92\xfe\x50\x25\x4d\x55\xcb\xfc\x6c\x43\xe0\x50\xb5\xcc\x49\x89\x72\xce\x3d\x93\x79\xb2\x01\xcf\x1c\xcd\xc6\xeb\xb3\x74\xec\x18\xb8\x8f\xce\xf0\x67\x89\x17\x20\x4b\x80\x9c\x8d\xee\x6c\x96\x5a\x62\x82\x89\xcb\x33\x9e\x8c\x8d\x84\x40\x9d\x08\x50\x2f\x65\x01\xd3\x4e\xcf\xd6\x4f\xaf\x4a\xf4\x4a\x84\x5f\x18\xad\x78\x8c\x66\x67\xdb\xd2\xe5\xd7\x95\x5c\x19\x69\xd9\x18\xf1\x0e\x9d\x53\x25\xec\x0e\xc6\xc9\x97\x4c\x65\x0a\xd1\xb7\x61\xc9\x2a\x37\xcb\x2f\x05\x57\xf9\x45\x51\x73\x3d\xda\x34\x70\x36\x62\x9a\x8d\x71\xdc\x30\x62\x98\x31\x00\xaa\xdd\x44\xf0\xda\xb1\xe8\xd6\x0d\xd4\x37\xe3\xde\x48\xad\x4e\xaa\x8a\x89\x1f\xfd\x0a\x15\x56\xa2\xb6\xae\x8d\xd2\xc5\xa9\x79\x9f\x19\x37\x6c\x96\xef\x1e\x58\xed\xb0\x95\xa0\xed\x8d\x79\xf6\xd2\x21\x28\x34\x01\x3c\xd0\x0d\x60\xda\xca\x83\xda\x1d\x8a\x53\x12\xf2\xa5\x4d\x1e\x9a\xcf\xad\x71\x8a\x2b\xc2\x4e\x4b\xf6\xd1\xba\xc0\x50\xd9\x9f\x97\xec\xa2\x75\x99\x39\x7c\x7b\x4e\xbe\x09\xc6\xe2\x11\x8e\xe3\x50\x24\xd8\xe1\xf3\x94\xfc\xac\xe3\xcb\x73\x71\xa1\x2b\x63\x98\xb0\x35\x2b\x99\x8d\xf1\x7b\x81\x5e\x42\x0d\xbd\x78\x39\x7a\x89\x0f\xa2\x17\x35\x71\x19\x4c\x61\x81\x19\x7c\xf9\x86\xa8\x21\x62\x1b\xc0\x82\x34\x05\x45\x15\x78\x92\x56\x63\x9f\x22\xa3\x80\x74\xb1\x32\xf4\x06\x3c\xad\x81\x98\x59\x67\x1b\x77\xac\x4d\x04\x9b\xc3\xe3\x82\x9f\xc2\x94\xd8\x1b\x98\xa5\x31\x3e\xdb\xcd\x97\x8e\xdc\x4c\x4d\xf8\x52\x9e\x2b\xc0\x5a\xbb\xf7\xf0\x80\xc6\x17\x7c\x09\x15\x01\x0a\xa3\xb8\x4c\xec\x1c\xaf\xfc\x76\xd1\xf9\x95\xd2\x8e\x3e\xd7\xdc\x27\x11\x6e\x23\x07\x71\xae\x66\xa0\x2c\xe3\x52\x9c\x8b\x68\x67\xe8\xf5\x2e\x95\xde\x26\x3d\x48\x84\x33\x25\x10\x81\xa1\x33\xf3\xe1\x01\x1f\xd1\xc2\xca\x1c\x1b\x8e\x41\xa8\x8b\x2c\x5d\xcf\xe4\x0b\xa2\x34\xdc\x82\xf8\x4b\xb6\xb3\xc0\x4f\xc9\xc2\xd5\xd9\xac\x29\x99\xdc\x02\x40\xa4\x63\xfa\x0c\xf1\x46\xee\x92\x9d\x79\xb0\x71\x9b\x30\x4a\x0c\x55\x5d\x38\xe7\x13\xfe\xdb\x7c\x8c\x88\x95\x9e\xf1\x78\x04\x85\x98\xe8\x2f\xc6\xd4\x67\x46\xc4\x1d\xea\x02\x13\x75\x9f\x01\x1e\x33\xd6\x30\xe3\xc2\xbe\x17\x30\x3a\x75\x40\xdd\x5c\x9e\xf3\x3b\x61\x66\x09\xed\x70\xce\x93\x87\x07\xf1\x30\x1f\x4f\x26\x16\x34\x0d\xff\xa6\x2c\x7f\x9a\xda\x93\x09\x2c\x56\x48\x81\xe5\x3a\x9d\x6e\xb7\x86\xa9\x80\x8f\xb6\x43\x71\xe4\x97\xbd\xd7\xde\xb9\xfc\xca\xe5\x97\x2e\xbf\x75\xf9\x85\xcb\xaf\x5d\xfe\xda\xe5\x2f\x5c\xfe\xd6\xe5\x2f\x5d\xfe\xb9\xea\x28\xfe\xe4\xaa\xc9\x7b\xeb\x32\x0f\xb2\xc1\x80\x3f\xbb\x30\xe2\xb4\x9e\x36\xbc\xba\xd7\x88\xeb\xb9\xc6\xc2\x67\x87\x9c\x4c\xa7\x50\x31\x64\x7d\x8d\x59\x5f\xb8\x0c\x96\xd4\x95\x4b\xc9\x97\x98\x7c\x8b\xc9\x17\xae\x59\xae\x82\x61\x59\x73\x9c\x8f\xcc\x9e\x88\x68\x62\xa9\x13\x76\x31\x52\x8d\x09\x88\x9e\xa5\xa9\x11\xb7\x0b\x9b\xe7\xcc\xc4\x54\x79\x87\x73\xe7\xb2\x2b\x97\x41\x0b\x50\xff\x85\xcb\xa0\x07\xd0\x3e\xb4\x0e\xbd\x86\x3e\x43\x8f\x3f\x15\xa4\xc3\x95\xa4\x13\x2e\x3d\x6d\x27\x5f\x14\x5b\xf9\xda\x3b\xb8\x97\x3f\xe9\x87\xfb\xeb\x83\xf4\x41\x29\xdb\x85\x07\x84\xf3\x1b\x97\xbf\xf1\x8c\xb7\x1e\x7b\xe7\xb1\xbf\x3d\x36\x69\x7e\x72\x58\x13\x7d\xc6\xc0\xb2\xfc\xe0\xf2\x8e\x77\xaa\x68\x02\x37\xf0\xd7\xbb\x86\x64\x65\xc3\x74\xe1\xfe\xee\x5e\xcc\x51\xd5\x55\x0e\xc5\x77\x45\xf1\x34\xcc\xff\xb3\x0e\x82\xda\xa7\xa8\x3c\x2a\xc9\xc2\x10\x39\x22\x52\x6e\x51\xdc\x79\xc4\x9a\xca\xe7\x3f\x02\x35\xca\x1b\x18\xc2\x5e\x04\x6b\x17\x8f\xb8\xac\xf1\xb1\x33\x15\x26\x8f\xe2\x11\xb7\x5a\xb9\x0b\xd2\x1f\x91\x89\x91\xa3\x26\x13\x18\x07\x2c\x59\x18\x09\x2e\xd9\x42\xd9\x48\x74\xc8\x98\x08\x07\x48\xb9\x35\x2e\x12\xeb\x86\x82\x4d\x14\xfa\xee\x6b\xf4\x74\xff\xa2\x44\x4f\x16\x9e\x23\x3d\xe3\x2f\x8c\xa5\xd4\x8a\x9d\x5b\xfe\x97\xa7\x96\xb3\x13\x00\xc3\x99\x54\x1b\xb6\xee\xd7\x6b\x40\xf1\x28\x45\x31\x14\x74\x82\xa1\xd3\x58\x61\x89\x67\x4c\x9a\xad\x21\xeb\x9d\xb4\x8e\x85\x43\x51\x07\xa8\xe5\x20\x31\x26\xdd\xd3\xd6\x80\xf5\x07\xad\x01\x24\x93\x1d\xa0\xd1\xb1\x8e\x2d\x71\x93\x5b\xb4\xfe\x6b\xe2\x1c\xf6\x16\x23\xbc\x3d\x12\x93\x12\x91\x03\x95\x5c\x36\x2a\xd0\x01\x92\x63\x40\x88\xa5\x0f\x0f\x46\x2c\x1f\x51\xb5\x40\x3e\x6e\xcb\x41\x38\x4a\xcd\x1a\xa6\xb0\x34\x7d\x74\x98\xa8\x5c\x5a\x1a\x67\x97\x0d\x4e\x68\x3c\xda\x30\x07\x03\x36\x1c\x20\x16\x7d\x42\x75\xc7\xe5\xea\x7a\xac\x73\xda\x3a\x2d\x57\x77\xc2\x3a\x27\xe4\x4f\x57\x1e\xab\x65\x6d\xa2\x94\xc3\x32\xf1\xb4\xf5\x11\x4a\x37\x29\x15\x82\x56\x5f\x42\x1d\x2f\x83\xfd\xc2\x68\x54\x46\x0b\x40\xe2\x40\x38\x44\x48\x61\x19\x0a\xcf\x39\xc2\x25\x82\xf2\x2e\x68\x64\x67\xbc\xd5\xe9\x1e\x1d\xb5\xba\xbd\x3e\xa2\xb0\xf8\x8c\x37\x5b\xfd\xee\xe0\xe8\xa8\xd9\xea\x76\xfa\x67\xf1\x38\xb2\x29\xcf\x70\xb8\x93\x09\xbe\x62\xa6\x4e\x67\x00\x99\x1c\xdb\x37\x65\x2f\xe9\xbe\x36\xdc\x97\x05\x68\x5d\x96\x18\x16\x3b\x1d\x69\x6f\x31\x77\x8a\x37\xd9\xc1\x7d\x08\x65\xc8\x71\x2b\x82\x0d\x6d\x87\xf4\x97\x58\x7b\xd9\xb2\x7d\x7e\xa9\xe0\xd5\xa1\x5c\xfe\x18\x6b\x1c\x7c\x81\x16\x4b\xc5\x34\xfa\x0f\x4a\xea\x6f\x71\x89\x36\xcc\x31\xe9\x5e\x69\x41\xb0\x78\xda\x73\x5c\x3c\x6f\x0f\xa2\xdd\x74\x87\x32\xa2\xf1\x96\x12\xe2\x27\xd2\x4e\x69\x99\x74\xf2\xca\xaf\x71\xe9\x75\xbb\xc5\x39\x5c\xab\xeb\xed\xa7\x19\x9e\xfa\x45\x01\xb4\xb8\x8e\xca\xaf\x4e\xf9\x35\x24\x5a\x23\x4f\x31\xbf\xd2\x2e\x59\x2d\x7c\x6a\x47\x3c\xb6\x7a\x83\x3a\xb5\x93\x7f\xd1\xcc\xa8\x8d\xd2\xee\x20\x42\x47\xee\x9c\xc3\xd6\xd6\x95\x3e\xb6\x95\x33\x5a\xbd\x3a\x71\xab\xa5\x6d\xc6\x84\x0b\x4b\xe2\x39\x27\x5b\xe2\x5c\xaf\xb1\xb4\x47\x53\x53\x3b\xf0\x00\xf7\x27\xb0\xf1\x06\x03\x60\x25\xe7\xb0\xb9\x7a\x27\xf5\x00\x4e\x82\xa4\xa1\xd2\x1a\x32\x0d\x11\xad\xd8\x23\xae\x29\x16\x3b\xec\x9b\x48\xab\x16\xeb\xe9\x59\xc7\xb2\x8c\xd5\x81\x32\x15\x0d\x75\xa1\xd2\xc6\x4b\x07\xf3\x74\xba\xf4\x88\xad\xd1\xae\xae\x07\x4d\xf1\x01\x76\x3b\x3d\x57\xb5\x99\x71\x67\xa7\xcd\xae\xa5\xfa\x89\x15\x56\xb4\x49\x55\xab\x36\x87\x43\xad\x51\xc0\x21\x4f\x6a\x34\xcc\x17\x89\x3c\x66\x08\xf0\xef\x5d\xf6\xca\x65\xef\x5c\xf6\xab\xcb\xfe\x76\xd9\x77\x2e\xfb\x21\xc7\xac\x5f\x2b\x0f\x79\x85\x84\xe0\x0f\x3a\x09\xf3\xdb\x41\x4a\xa7\x94\xed\x87\x42\xda\xf1\x43\x2e\xed\x60\xef\x5d\x62\x44\x5f\xb9\xed\x2e\x8a\x10\x7f\xce\xfb\xf5\x87\xf7\x94\x8e\x5d\xe9\x2d\x5f\x6d\xd9\x8f\x79\xf9\xdf\xf5\xf2\x3f\x15\xf4\xdb\xf7\x87\xe9\xb7\x1f\xf5\xee\xfe\xfb\xe0\xa8\x7e\x54\xbd\x87\x26\x4a\x45\x7e\xca\xdf\x71\x90\xdf\x7b\x85\x28\x67\x0d\x74\xe9\xe1\xf3\x5d\x53\x82\xaa\xf0\x16\xef\x90\xcf\x6e\x6c\xf0\xbd\x33\xf3\xb3\xc4\x68\x38\x07\x42\x45\xb0\x08\x83\xa9\x13\x59\x05\xa4\x40\xc4\x81\x02\x30\xcd\x3d\xa2\x9d\xdc\xa6\xa1\x4c\x2b\x0b\x4a\xac\x7a\x5a\x10\x3e\x91\xa0\x2b\xc2\x22\x82\x24\x12\x95\x70\xb6\xf7\x5b\x03\xcd\x49\xf6\x01\xa9\xdd\xfb\x2a\x56\x21\x33\x7e\x70\xa1\xe1\xf7\xae\xf2\x5d\xb0\xc7\x7f\x28\x03\xd0\xaf\x61\x40\x32\xe3\x47\xac\xf5\xb3\x3b\x9e\xbc\x75\xdb\x9f\x91\x9c\x87\xbf\x53\xfb\x05\x24\x5c\xbb\xed\x17\x48\xe8\xc3\xdf\xa9\x7d\x01\x09\x97\x6e\xfb\x02\x59\x00\xf8\x0b\x2c\x84\x62\x26\xb0\x3f\xbb\x92\xb6\xa2\x37\x7f\xbb\xfc\x3b\x17\x78\xd8\x77\x2e\xff\xd5\x15\x5c\xec\x7e\x1f\x7e\xc6\x3e\x4c\x26\xb4\xbf\x60\xbb\xd2\x0e\x9b\x4e\xc5\xf1\x10\xfd\xbd\x1b\x72\xed\x11\x4d\x79\x60\x2a\x85\x6e\xbc\x22\x0e\x1e\x1e\x52\xbc\xfa\xb3\x37\x0c\x2f\x78\x51\x55\x3e\xa4\x48\x45\x4f\x8d\x2d\x03\xb4\xb9\xd4\x89\x8d\xa9\x5a\xef\xf6\x9b\x7f\x78\x64\xf0\xfb\x0b\xf9\xcb\xa9\x70\xb0\xbf\xb7\xdc\x1c\x53\x34\x1e\xd3\x80\x8a\x0f\x4f\x3b\x85\x1c\x5e\xb1\xa4\xd3\x71\x6a\x1b\x3b\x8b\x1a\x0e\xa3\x86\x38\xf4\x9c\x32\xe4\x8c\x5d\x42\x19\x3a\xa3\x80\x20\x5d\x62\xab\x39\x21\x74\x8b\x57\x49\x55\xf7\x8e\xbb\x1c\x51\x29\xe4\xb2\x17\xeb\xae\xd0\x64\xfc\x23\x4f\xc5\xb0\xc8\x4f\x27\x3c\xf4\x4b\x9e\xce\xf7\x89\xaf\x54\xdd\x16\x51\x73\x39\xb1\x95\x56\x13\x5b\x5a\xce\x2f\x11\x58\x5a\xd6\x2f\x92\x53\x3b\x79\xbf\x44\x40\x95\xfa\xfb\x24\x42\x69\xbf\x84\x24\x8a\xd4\x54\x68\x2b\x3f\x8b\xf7\x13\xcf\xb3\x14\x1d\x35\x73\x3f\xce\xd9\x37\xef\x53\xe6\x03\xb1\x03\x4c\xfd\x22\x0b\x9c\xaa\xc8\x15\x59\x6c\x38\xb1\xe2\xdf\x9c\x58\xd1\xfc\x4e\x5e\x3f\xb1\x18\xbb\x9b\x4d\x17\x7d\x17\xac\x1d\x3a\x1a\x47\xc9\xf4\x2b\x87\x21\xfd\x01\xbf\xb0\xcc\x31\x81\xbf\x93\x29\xf4\x90\xab\xb3\xf3\x20\x26\x6e\x01\x25\xcf\x58\x28\x14\x85\x98\xd2\x5f\x3f\xeb\x8e\xf1\xee\x08\x92\x6c\xc4\x11\x7b\xfc\x48\xa9\x69\xc5\x07\x3c\xa9\x07\xf8\x9f\x5b\x31\x58\xd7\x8f\xdd\xc0\x3b\xe8\x31\x5a\xdc\x42\x54\x6c\x3e\x0c\xd5\x5c\x79\x7e\xd8\x50\x35\x0e\x93\xdc\xca\x61\xb7\x9a\x6a\x90\x96\xe2\x5c\x4a\xaa\xee\xc2\x9c\x87\x09\x89\x14\xab\x64\xd4\xa4\x7a\x7b\xc8\x85\xcc\x18\xb6\xb7\x1a\x60\x28\x07\x88\x9a\x0c\xd2\xb5\xa4\xbc\xb9\xaa\x31\xed\x82\xca\x9e\x64\xd3\xed\x56\x8b\x97\x48\xec\x7f\xc6\x87\xff\x9d\xb3\xe1\x58\x38\x1b\x26\x54\x06\xeb\x4c\x07\x5f\xfc\x48\x31\x8f\x2f\x62\xc3\x48\x79\x23\x36\x11\x1c\x19\xcd\x15\xc6\x37\x39\xc0\x02\x7c\xb1\x2e\xba\x74\x01\x6c\x2f\x2a\x34\xa5\x03\x64\xd9\x27\xe3\x54\x13\x0f\xcc\x7c\x11\x04\xbe\x4a\x7f\x1a\x39\xd8\xb4\xf0\x03\x88\x3d\xe3\x6a\xca\x7c\x2e\x17\x15\x30\xf8\x42\x2a\xe6\x63\xbf\x98\xf4\x37\xec\x46\x09\xbe\xb9\xc5\xb7\x0c\xdd\x35\xe6\xdf\x32\xa4\xd0\xf3\x6f\x3e\x4a\x84\xf3\x6f\x7e\x59\x5b\x45\x88\xe1\x0a\xc9\x1b\x8c\x70\x5e\x8f\xcc\xba\xd7\x80\xa7\xa0\x9e\x34\xdd\xfa\xbc\xee\xc0\x3b\x34\x57\x4f\x1a\x01\xbd\xe5\xe3\x5b\xa0\xe7\x20\x37\x7b\x64\x21\x4b\xf4\x2d\xd6\xc8\xce\x45\x6b\x79\xad\x20\xc2\xaa\xa4\x67\x50\x1b\x98\x1c\xaf\x16\xde\xe0\xfc\xf6\xcc\xac\xcf\x80\xb0\x99\x09\x47\xab\x4b\x33\xb7\xb2\xd8\xcf\x1c\xb4\x57\x66\x7d\xc5\x5c\xb6\x12\x99\x17\xe6\x63\xb9\xe3\xf6\xda\xac\x63\x48\xec\xb5\x29\x63\xdc\x54\xa9\xec\x01\xd1\x1b\x7e\x3b\xc3\x3b\x10\xe9\xea\x35\x79\xb4\x52\xa7\x7d\x63\xd6\x6f\x80\x08\xbb\xf9\x62\xa5\x2b\xad\xd2\xb9\xf4\x82\xae\x11\x71\x30\x8c\x80\xe5\xb7\x18\xbc\x83\x0e\xce\xd7\x6c\xc6\xd1\xb4\x98\xf7\xd0\x48\x91\x77\x75\x32\x0f\x0f\x90\x4a\xe9\xd8\x41\x37\xb6\x72\xae\x0e\x4d\x53\xb8\x15\x0e\xbc\xa2\x2c\xc5\xba\xf7\xab\x7e\x14\x1f\x2c\xd1\x1a\x45\xc2\x69\x81\x8c\x8f\xb0\x33\xea\x98\x6c\x09\xab\x16\xe8\x5a\xc0\x53\xa8\x95\x5e\xa4\x2f\x8c\xa0\x2a\xdd\x9c\x12\x07\xef\x3d\xdd\x2d\x17\x1a\xc3\xfc\x1d\xc5\x92\x63\x43\x87\xe2\x7e\xa8\xbd\xda\x61\x29\x81\xc6\xa8\x15\x78\x22\xd7\x2e\xf8\x62\xe1\x45\x9b\x58\x63\xf2\x01\x2f\x53\xc9\x7f\xb6\x48\x45\xff\xda\x52\xa2\xee\xc3\x6e\xcf\x50\x64\x0e\x5b\xf8\x4c\x48\xd3\x03\xbc\x84\x45\x5f\xdb\xa6\x8e\xa1\x8c\x8d\x89\x22\x56\x9f\x21\xe3\x9c\x31\x49\xa4\x6a\x9d\x7e\x2a\x16\xcd\xfb\xe8\x15\x7d\x74\x8a\x3e\x46\x45\x1f\x63\xba\x6f\x4d\x79\x8c\x56\x5a\xe8\xfa\x06\x50\xd0\x59\x44\x49\x0e\x14\x89\x50\xfe\x58\xd5\xc7\x98\x39\x24\x06\x8e\x44\x1f\x93\xd4\x5b\x7f\xcd\x1c\x5d\x40\xfe\x7c\x86\xe4\x8b\x9a\x1f\x7a\x2d\x66\xe7\xe2\xa9\x55\x1b\x33\x29\xb3\x58\x89\xe1\x91\xd3\xb8\x19\x5b\x15\x40\x7c\x7a\x55\x6b\x59\xd5\x8d\x56\xd5\x9a\xdd\x4c\xff\x0b\x99\xd2\x06\xdd\xa9\x25\xfc\x06\x88\x23\xd8\xde\xa7\x74\x7b\x37\x8b\x8d\x18\x10\xd0\x06\x36\x05\x7e\x08\x60\xcf\xe3\x87\x05\x7e\xf0\x01\x11\x6c\xe8\xc8\xd9\xec\xac\x50\x63\x32\xa1\x4b\xf5\xe6\xa9\x25\x04\x0f\xf8\x72\x6a\x49\x51\x83\xbe\xb6\x55\xc6\x13\xfa\x28\x32\x9e\x50\xa1\xa9\x8e\xda\x3d\x27\x7d\x11\xbb\x4f\xc3\xec\x87\xb0\xc5\x24\x7d\x78\x38\x40\xb0\x30\x0f\x0d\xe8\x2a\x3f\x95\x88\x86\x15\x46\xea\xd8\xc4\x05\x4a\xdb\x3f\x54\x77\x65\xfe\x2a\x87\xf1\x5f\xb5\x2e\x44\x75\x51\x16\xeb\x4d\x78\x8f\xee\x28\x74\xf2\x5b\x41\xac\x79\x63\x24\xaf\x6c\x2f\xa7\x5a\xa4\x1b\xec\x27\xad\x0c\x0c\xad\xe0\x55\xf3\x5f\x54\x6b\x9a\xd3\x1d\x15\x4b\xee\x91\x2d\x66\x5b\x5b\x14\x34\x49\x50\x69\x5e\x2a\xab\x8d\xd2\xce\x05\xe5\xac\x53\xcd\xbb\x84\x6f\x5e\x99\x68\xa2\x8a\xb7\xfd\xb3\x8a\xff\xff\xcb\x35\xd9\x9f\x52\x17\xe8\x4f\x17\x5e\xf7\xae\xf1\x74\xf1\xd6\x5d\xfc\x54\x31\xd2\x6f\x2e\xbf\xaa\x3c\x60\x0b\x32\xa7\xdb\x36\x3a\x8d\x70\x57\xf5\x58\x66\xeb\x0a\xfd\x64\x74\x91\x61\x84\x28\xd9\x32\x47\x39\x1b\xfb\xd9\x5f\x65\xe9\xd2\x09\x1e\xbb\xa9\x02\x4e\xe7\x37\x57\x71\x3a\xbf\xb9\x34\xbe\x3f\xf6\xfa\x24\xef\xcd\xa9\x25\x24\xcc\xb4\x60\x6a\x47\x47\x69\x3b\x27\xdf\x90\xf7\xdc\x54\xf7\xc0\x17\x0b\xbd\x2a\x16\x20\xf4\xe1\x8f\xbc\x0f\x7f\xb8\xe5\x6b\xb6\x97\x51\x48\x2a\x9b\x55\x2e\xbc\xfe\xf4\x8c\xcb\x9c\x4d\xbb\x8c\xf7\xee\xe7\x1e\x69\x13\x8a\xde\xe6\x45\x6f\x85\xe6\xf1\x3f\x0e\xcd\x45\xa7\x0d\x8b\x30\x27\x41\x8b\xf1\x2d\xc2\x68\x85\x4d\x55\x8f\xe9\x1f\xf9\x98\xfe\xe1\xb2\x8b\x78\xff\xe2\xa8\x58\xb9\x93\x90\xa9\x89\x84\x06\x8c\x3c\xe0\x45\x6a\x9a\xcd\xf7\xce\xb4\xb8\x79\x5c\x79\xb1\x4b\xec\xec\x7e\x8b\xd7\xb1\x71\x91\x8f\xe8\x42\x8c\xe8\x5f\xe5\x11\x15\x03\x52\xc3\x81\x49\x2b\x86\x13\xc5\xe9\x32\x02\x32\x79\xbd\x3c\x34\xa4\x7f\xe5\x43\xfa\x97\x58\x2a\xbf\x1f\x06\x19\x2d\xda\x47\xd7\x2c\x0e\x35\xd4\x57\x2c\x9c\xbd\xb1\xf7\x78\x0f\x7e\xcf\x7b\xf0\xbb\xcb\x5e\x3f\x0e\xd4\x66\x5a\x0d\xd5\x70\x17\xaa\x24\xcd\x21\xaa\xed\xbc\x02\xbe\x82\xbf\x05\xf0\xbe\xa6\xe8\x0f\xca\x21\x2a\x7a\xb1\x90\x57\x8d\x05\xbe\xdf\xf5\x95\xaa\xc9\x5c\xc7\x70\x98\x35\xa5\xea\x27\x5e\x27\xdb\xc4\xac\x9a\x6c\x42\x69\x4d\x91\x88\x28\x52\xd4\x59\x5d\x87\x67\x4c\x34\x15\xd2\xb2\x44\xa0\x71\x6a\xd9\xa7\x96\xa8\xd8\x13\x15\xeb\xca\xa6\x4d\xfc\xb6\x65\x50\x03\x70\xb6\x8c\x5e\x04\x20\x5f\x2b\x46\x7f\x85\xea\xcf\xf2\xb1\xb5\xcc\x76\x02\xa1\x69\xec\x4e\x48\xf7\x31\x61\xee\xd6\x43\x5e\xc4\x00\xc3\x2e\x8e\xc2\x8c\xbf\x4e\xc9\x87\x07\xfe\xc6\xa6\x1e\x64\x97\x8c\xf1\x5d\xe4\xed\x45\xa8\x73\x6b\x14\x9d\xa5\xa3\xb4\xd1\x30\xa5\xf9\xfc\xa4\x91\xe9\x21\xe2\x30\x6c\x1b\x0a\xec\xfc\x8a\xc4\x54\x86\x82\x15\x61\x23\x8d\xcf\x34\x3d\x45\x85\x32\x8a\xeb\xc4\x81\xec\x08\x89\x26\x3d\x60\x78\x23\x79\x47\xf4\x32\x46\x91\x63\x82\xbf\x2e\xd2\x32\xe8\x42\x9d\x73\x1e\x08\x85\x98\x64\x92\xe4\xea\x35\x22\x39\x28\xde\x81\xc0\xc9\x87\x50\x24\xa3\xea\x8d\x35\x6a\x36\x53\x73\x21\xc5\x11\xd0\x78\x00\xad\x4e\x01\xfe\xb2\xb3\xc0\xdb\xcf\x47\xe9\xf3\xbc\x6e\x8a\x56\xa9\xe7\x4f\x8a\xfc\x8a\xd7\xda\x4a\x87\xce\x48\xda\xbe\xcd\xa9\x8b\xfd\x00\xa9\x28\xc0\x35\x52\xdd\xd3\xed\x63\x12\x5b\x8f\x93\x9a\x37\xda\xd8\xeb\xee\x6c\x1f\x2b\x12\x8b\x22\x40\x1f\xa4\x66\xb1\x54\xe4\x89\x56\x55\xc5\x06\x35\xe9\x7e\x72\xf3\x38\x8f\x3f\xb9\x7c\xa7\x94\x26\xe2\x04\x88\xfe\xe4\xee\x08\xfb\xb5\x68\x96\x6c\x3f\xd2\xa7\x0a\x55\xea\x35\xc9\xc7\xb5\xa5\x22\x7f\x86\xc4\x05\xc8\xf8\x9f\x2c\x13\xc1\x60\xea\xb1\x92\x60\xd4\xe3\xe2\x22\xb0\x35\xa8\x03\x61\x02\xed\x56\x5e\x15\x14\xa4\x1d\xa9\x18\xeb\x4d\x8b\x58\xb0\x16\x13\x01\xe3\x26\x19\x74\x41\xac\xc6\x1d\xa8\x3d\x3c\x18\x18\x74\xb5\x6d\x0c\x85\x53\x4a\x87\x94\x14\x4c\x53\xa9\x29\x0b\xf6\x84\xea\xc0\xb0\xf7\x14\xc2\xa8\x8e\x0a\x2c\x4d\xd4\x6d\xa9\x13\xd1\xee\x37\x84\xfc\x85\xd4\x5d\xcc\x3a\x30\x2b\x94\xd0\x99\x92\xa6\x0b\x24\xc8\xc1\x4c\xfc\x7a\xc8\xa2\x7a\x38\x15\x23\x0a\xfc\x75\x79\x0b\xef\x87\xaf\x84\xa6\x3f\xa0\xe0\x1f\xf6\x24\x8c\x30\xd0\x47\xd8\x84\x0f\xc2\x8e\x41\xd8\x23\x4c\x02\x1c\x62\xa3\xe1\xa2\x43\x93\x7b\xb1\x96\x95\xf3\x0d\x33\x47\x46\xa4\x87\x46\xd9\xdd\x29\xc9\x86\x8c\x22\xcc\x42\xd3\x31\x9b\xa4\xab\x43\x41\xa1\xbd\xe7\xf1\xc8\xc4\x90\x4d\xde\x94\x7d\x8a\x8d\x88\x25\xa4\x44\xf7\x09\x19\x87\x84\x54\xeb\x42\xb1\x2b\xde\x90\xae\x09\xa5\x11\x03\x87\x69\x11\xf0\x6e\x79\x4e\x8c\x91\xbb\x9f\xd3\xe7\xd1\xc8\xc9\x3f\x91\xe4\x0a\xa3\x68\xe6\x82\x56\xe9\xa5\xd3\x65\xff\x76\xd9\x2f\x2e\x0b\x03\x96\x06\xcc\x0b\x10\x41\xc5\xf8\x77\xf4\xb3\x26\x7f\x47\xc2\x15\x23\xb8\x1d\x5a\x99\x22\xf0\xe1\x6c\x41\xa1\x25\xf2\xb0\x12\x5e\xb3\x89\x8b\x91\x82\x49\xe0\x47\xbc\x01\xc2\x1e\x39\x0f\x0f\xa8\xfd\x40\xa0\xf3\x58\x47\x37\x41\x44\x4c\xf6\x27\x62\x32\x59\xc7\x96\xfd\x52\xba\x06\x48\x76\x65\xea\xba\x35\x08\xb6\xd1\x0a\x00\x59\x09\xb1\xb9\x9f\x7a\xe3\x22\xdd\xb1\x8b\x67\xa0\x3c\xbd\xb2\xa0\xfd\xc9\xd5\x5c\x69\xd5\x38\x28\xd8\xc8\xf4\xee\x89\x20\x9f\x76\xa5\x0c\x91\x65\xa8\x71\x29\x0e\x8f\xb4\xf5\x8e\xe2\x60\xbe\x85\x25\xf4\x16\xc0\xf2\x16\xdd\x30\xb4\xde\x42\x2a\x31\xe9\x6f\x51\x7c\xda\x7a\x9f\x47\xd1\x6e\xbd\x1f\x85\xad\x37\x08\x4b\xfc\x81\x7f\x3c\x95\xfa\xcc\xad\xf7\xe8\x65\x87\x87\xe2\x55\x98\xb9\x8e\xa1\x48\x96\x49\x9b\x57\x04\xe5\x3b\x71\xcd\x48\xcd\x41\xbd\xef\x38\xd5\x80\x27\x38\x21\x4c\x68\xb4\xf5\x56\x66\xa1\x32\xe2\x1b\xf9\xa8\xa2\x75\x8e\xb9\xa1\x21\x59\xc9\xaf\xc8\x43\xb5\x5e\xa2\x02\x5b\x88\x8d\x1f\x1d\x79\xad\x97\x23\x13\x58\xab\xd6\xaf\x50\x8e\xf3\xb8\xf5\x06\x79\xa2\xb8\xf5\x1e\x15\xd0\xb2\xd6\x4b\x40\xb6\x90\x3f\xc3\x32\x1d\x16\xab\xa2\x31\x1d\xd5\x18\x37\xf9\x3d\xfa\xff\x10\x1d\x46\xbd\xe7\x50\xf8\xc8\x6a\xfd\x8a\x9a\x21\x7a\x99\x58\xe6\xc1\x30\xee\x36\xb5\xf0\xe6\x89\x2d\xbc\x41\x17\xbe\x4f\x68\xc1\xd3\x5a\x10\x39\xa4\x93\x7e\xca\x85\x06\x4b\x18\x6b\xa2\xa4\xed\xa7\x4f\x1e\xc0\x16\xa7\xef\x1d\x25\xbc\x13\xb3\x2b\xe6\x33\x94\x93\x30\xd2\x10\x10\x56\x8f\xb1\xdb\x60\x14\x11\xcd\x31\x85\xaa\xf1\xc7\xd1\x18\x66\x2f\x32\x6d\xdf\x8e\x58\x36\xce\x00\xfa\x9c\x87\xf4\xeb\xd9\x19\xcc\x83\x67\xcb\x69\xf2\x98\x7f\x74\x14\x11\x57\xdb\x7a\x49\x23\x09\xe9\xf7\x0d\x4a\xaa\x68\x9e\xd0\xae\x32\xc2\xc9\xa0\xb9\x81\x24\x6c\x32\x44\x90\x33\xac\x2f\x84\xb4\xf7\x28\x1b\xc2\xcc\x18\x27\x16\x7e\x51\xc0\xe5\x89\x3c\x08\xe5\x98\xea\x0c\x51\x8f\x9f\xdc\x86\x60\x0e\x93\x3d\x13\x51\x57\x51\x83\xbb\xf5\x52\x8f\x06\x03\x19\x5e\x52\xc0\xd5\x59\x44\x19\xd4\x2e\xba\x94\x0e\x9d\x64\x1a\x34\x2e\xf6\x01\x3c\xbd\xc7\xd5\x84\x82\x2a\x31\x13\x59\x79\x26\x32\xa4\x6a\x20\x13\xae\xe3\x37\x18\xf3\xfb\x4d\xeb\x25\xa2\x8f\xf7\xf8\xfc\x1e\x1a\xbf\x2f\x9e\xd1\xfb\x0b\x7e\xc7\x6a\xd2\xf2\x92\x49\xb5\x6a\x68\xa1\x50\x3b\x54\x0a\x73\x6b\xad\x85\xb2\xc3\x23\xea\xf0\x36\xb7\x89\xc0\xe2\x6f\x2a\xbb\x1a\x97\xbb\xfa\xe6\xb1\xae\x16\xe9\x46\xde\x78\x5a\x1e\x71\xaa\x55\xa3\x77\x55\x0e\x2c\x3e\xd8\xd5\x7c\x53\xe2\x14\x66\xad\x5f\xb7\xb7\x4b\x3f\xf0\x8c\x67\x38\x45\x23\x31\x79\x34\x37\xdb\x6d\x41\xbc\xdc\x44\x71\x14\x46\xfe\x23\xa4\x6e\x61\x32\x2e\xbc\x35\xa9\x93\x8e\x94\xe4\x72\x09\xaa\x52\x44\xf5\xb9\xd2\x43\x8d\xb8\x54\x43\x55\xd8\xdd\xcf\x0c\xba\x0b\x77\x50\x25\x31\x08\x92\x7d\xa3\x67\x0f\xbe\xdd\x0b\xf3\x16\x4f\x9e\x26\x01\x3c\x21\x06\xc6\x43\x78\xe2\x4c\xf3\xa8\x56\x63\x77\x4f\x26\x2e\x3b\xda\x4a\xc4\x95\xaa\xa2\x09\x80\x20\x44\x0a\x6f\xba\x35\xed\xa0\x75\x77\x86\xae\xbf\xe0\xf7\x39\x3a\xb8\x0a\x5a\x9b\x33\x9e\xd1\xef\x73\xd8\x26\x28\x0c\x8d\xa6\x6c\xe2\xcb\xbf\x19\xfc\x85\x6d\x8a\x0a\xde\xd3\x51\xa2\xd4\xfb\xa1\x17\xe8\x1e\x50\xb7\x1d\xd9\x75\xe3\x54\xc5\x8e\xdd\xdf\xe9\xfe\x80\x44\x58\xa7\xf6\x4b\xc7\xc4\xa0\x96\x1b\xfd\x53\x54\xfa\xe4\xdb\x29\x4a\xf1\x85\x3d\xc9\x0b\x44\x1a\x6f\x63\x0c\x45\x0f\xe0\xcd\x80\x78\xc9\x82\x91\xc6\x60\x09\x74\x1e\xf8\xe1\x75\xa5\x8e\x85\x9c\x00\x53\x80\xf6\x91\xdb\x0d\x98\x62\xdc\xd8\xf1\x76\x3f\x94\xa7\xba\xe3\x27\x99\x9b\x8d\xd0\x0d\x5a\x3e\x1a\x1b\xa0\xb4\x8c\xde\x81\x29\x9d\xd2\xc5\x03\x86\x04\xf4\xe9\xa2\x2d\xa9\xd0\xbd\x9c\xec\xae\x8b\x47\x56\x45\x5c\x10\x1b\x42\xeb\x5a\xae\x09\x47\x2d\x93\x82\x6e\x90\x74\x9c\x53\x78\x3b\x73\x88\x70\x13\xf4\x07\x30\x39\x74\xb0\x47\xe3\xa4\x15\xdb\xf0\xac\xe8\xb9\x8c\x27\x00\xd5\x39\x65\x77\x0f\x65\x66\xf1\x73\xbf\x85\x7e\xd1\x9e\xcf\xf1\xc7\x01\x24\x0d\xbd\x99\x9b\xcf\x2d\xdc\xd4\x82\xdb\x42\x2d\x06\xe0\xd0\x7c\x04\x4a\x38\x81\x7c\xc8\xd5\x92\x93\x84\x27\x33\x26\x82\x6d\xe4\x68\xae\x2d\x78\x8d\xa7\xb2\x27\x11\x16\xcc\x64\x41\x8c\xf3\x5a\xa9\xc5\xfe\x58\x0d\x8e\xd4\x62\x81\xd3\x26\xb0\x89\xd7\x71\x10\x59\x07\x42\x8c\xe9\x60\x95\xe5\x38\x26\x8f\x54\xa6\xb7\x8e\x07\x85\xd4\x28\x0f\xa7\x3b\x95\x02\x20\x31\x4a\x65\x6e\x6a\x9b\x01\xf1\x39\x69\x76\xbc\x21\xc3\x3f\x28\xf3\x86\x47\x7c\x9a\x8e\x14\xd2\x9a\x79\x81\x93\x85\x4e\x25\x58\x76\x10\x1b\x86\xa7\x55\xab\x90\xd4\x81\xd5\xf7\x4f\x99\x33\x4b\x63\xcf\xdb\x71\x58\x86\xe7\xb2\x86\x01\xfd\x12\x3e\xf4\x8d\x92\xf2\x3f\x62\x2b\x54\xcc\xf4\x93\xb7\xce\x5b\x60\xf8\x8f\x8e\xe4\x23\x50\x0f\x52\x40\xe0\xcc\x15\x42\x0b\x01\x0d\x25\xf0\x97\x22\xc7\xe2\xc8\x9f\x71\x17\x73\xa1\xa9\x5e\xd3\x33\x1b\xf0\x9b\x34\x63\xf3\x79\xcb\xea\x98\xc1\x5e\x3b\xe4\x1a\x90\x6a\x9a\x73\xa9\x1c\x34\xc2\x98\x2e\x18\x89\x25\x54\x98\x09\xc9\x33\x2c\x3a\x67\x2e\xf2\x00\xb2\x28\xdb\xaf\x4d\xd1\x8e\x77\x78\xd0\x43\x0d\xb1\x52\x38\x52\x64\x65\x45\x91\x1c\x08\xfa\x37\xba\xe5\x14\x23\x0c\x38\xb0\x92\x46\xd6\x20\x91\x02\x3e\x46\x0d\x92\x2a\x78\x67\x3c\x60\x4b\x1e\x9f\xc1\x0e\x5b\xf0\xe5\xf3\xe7\x9d\x87\xf9\x48\x80\x06\x4f\x33\xa4\x68\x31\xb0\x7a\x32\x59\x4c\x91\x55\xcc\x5f\x78\x92\xa1\x77\x91\xf9\x38\xe3\xb0\x48\xb0\x8e\x71\xc4\x13\xdb\xc5\x8d\xba\xd7\x83\x43\x06\x63\xb8\x21\xa0\x43\x77\xf8\xeb\x9a\x05\xe4\x53\xf3\x06\x68\x5c\x8c\x68\x8a\x96\x80\x1b\x9e\xe5\xae\x17\x57\x7c\xc3\x9b\xc6\x0d\x9f\x09\x1d\xb4\x39\xb2\x43\xe8\x13\x91\xad\x0b\x21\x4e\x44\x91\xc9\x17\xc0\x6f\xaf\xcf\x16\x80\x41\x16\x26\x4c\x2c\x74\x99\x25\x70\xae\xdc\xc0\x39\x7b\x03\x98\xe3\x0e\xe0\x00\xc7\x0a\x05\x97\x84\xd7\x0d\xbe\xde\x9d\xad\x30\xee\x76\xfe\x95\xac\xbc\x36\xe2\xeb\x5c\x20\x10\xfa\xb4\x54\xcf\x1b\xe9\x13\x72\xb7\x3d\x82\xf8\x15\x6f\x9c\x1b\xb2\xe5\x85\xc9\x2e\x79\xe3\xce\x00\x18\x9b\xa3\x9b\xb3\x2b\xea\xc4\x95\xc9\x66\x67\x97\xd4\x01\x60\x03\xae\x64\xe3\x90\x7a\x29\x1b\xbe\xcc\x9b\xbd\xca\x1b\xbd\x14\xc0\xbc\xe5\xab\xe6\x0d\xbb\xe0\x9b\xe6\x6c\x74\x7b\x76\x31\xde\xf0\x59\xe3\xd6\x5e\xf1\x9b\xc6\x85\x08\x68\x4f\xf3\x83\x10\xbd\x46\x97\x8a\xa5\x9d\xe8\x1b\xd7\x2c\x64\xd0\x39\xf8\x03\x9d\x65\xd0\xaf\x10\x7b\x28\xa7\x05\x36\xe1\x75\xeb\xc6\x07\x0c\xbe\x43\x75\x60\x24\xfa\x52\xa6\xb9\x1f\x56\xaa\x2e\x2e\x33\x6c\x21\x17\xef\x15\x45\x16\x88\xfd\x65\x44\x27\x71\x66\x20\xb8\x9e\xaf\x47\x26\xf5\x09\x21\x35\xc7\x3f\x4b\xfc\xa3\x8a\x8d\x9a\xcd\x85\xda\x11\xea\xf0\xa1\x41\x15\x71\xbc\xf8\x92\x87\x3c\x11\x3b\xec\x7a\x2b\x0c\xd1\x1c\x3c\x8e\xdd\x42\x20\x85\x36\x66\xbb\x1a\xda\x88\x51\xdd\x0c\x72\x05\x19\x43\x3f\xa0\x11\xb9\x1d\xa5\xa0\xef\xc8\x27\xa3\xf7\x43\x9f\x7c\xf3\x1a\xfe\x53\x4f\x07\x40\xd1\xcc\x27\xdd\x3d\xff\xa9\xe7\x82\x2b\x8a\xb8\x58\x64\xf7\x16\xfe\xb1\x72\xea\x2c\x48\xb9\xc7\x63\x2e\x8c\x87\x6c\x94\xe0\x85\xc5\xa5\x74\x28\xe9\xbe\x18\x1f\x3b\xea\x3a\x3d\x54\x06\x48\xd0\xac\x0a\xb0\x45\xa5\x27\x13\x18\xb8\x22\xab\xb0\x3f\x4f\x3e\x4e\x0e\xf6\x46\x84\xb2\x6c\x84\x5a\xd3\x15\xed\xc6\xcd\x94\x65\x4d\x0f\xdb\x14\x87\x80\x76\x9b\xf6\x7e\x71\xc5\x17\xd9\x4e\xe2\xcf\x57\xa8\x41\xc7\xd7\xbb\xe9\x6f\xc9\x6d\x06\xbf\xd9\x4d\x97\x01\x53\x66\x99\x70\x66\x18\xf0\xf6\xa4\xd9\x98\x8e\x8d\xb1\xfd\x71\xd6\xf8\xd8\x1a\x7f\x9c\xd5\x1f\xe8\xa7\x61\x42\xda\xc4\x7b\x3d\xa5\xef\xe4\xba\xb0\xbd\x60\x51\xa0\xfb\x2f\xf6\x03\x79\xab\xc9\x6a\x8b\x9a\xb9\x13\xa4\x9c\xaf\x76\xda\x8e\xe2\x84\x4f\x2a\x44\x0e\xf9\x2d\xa4\x5a\xa1\x35\xe1\x5a\xb8\x86\x2c\xf1\xf8\x7b\x27\x77\x8e\xda\xfe\x8f\xf1\x3f\x0f\xf1\xe2\xea\xa3\xf1\xb0\x4c\x82\x8f\x86\xd9\x16\xae\x97\x53\x73\xbc\xc8\xec\x59\x66\xa3\x3b\x55\x71\x4f\x0b\xd5\x45\x29\xa6\xee\xb8\x70\x35\xc7\x9b\xcc\xae\x45\x04\x34\xaa\xff\xe8\x48\x9c\x85\xf0\x65\x9d\xd9\x37\x99\x29\x74\x33\xa7\x3b\x60\xa3\xe2\x7c\x23\xa0\x56\x79\xcb\xb5\xd9\x32\x37\xc8\xdd\x39\xe2\xbd\xa2\x13\xdb\x4e\x40\x17\x89\xf6\x75\xc6\xf0\x20\xaf\x90\xe4\x5c\x02\x01\xe4\x66\x57\xbe\x5b\xf1\xed\x16\xbe\xa1\x53\xfd\xfd\x2f\xaf\xc9\x24\x6f\x5d\xf1\xe5\x05\xd6\x47\x9a\x80\x15\x1f\xdf\x62\xb1\xc0\x49\x52\x68\xee\x65\xc6\xae\x30\xf2\xcc\x67\xf8\x05\x82\xde\xad\xca\xff\x29\x43\x75\xbc\xa0\x18\x56\xcd\x0f\x6b\xf6\x86\x45\x59\x6a\xdf\x65\x0c\xde\x9a\xf0\x58\xb3\xaf\xe0\x19\x1e\x9a\xf8\xb5\x62\x93\x5c\x65\xc6\x1d\xf9\xf6\xde\x0a\xe7\x2e\x9e\x93\x78\x15\xa4\x36\xaa\x41\xce\xbc\xbb\x9f\xe7\x46\xad\x59\x43\xb1\x06\xca\xe9\xc7\x4a\x76\x89\xee\x4a\x81\xd6\x8b\xcb\xa9\x69\xa3\x63\xda\xd8\xab\xc2\x60\xc4\x0d\xd0\x8b\x12\xd0\x39\x0f\x0f\x00\xfe\x98\x07\xe2\x3d\x86\x77\x38\x6a\x33\x23\x36\x94\xb7\x35\x61\x2c\xe7\x88\x3b\x8b\x7c\x27\xb3\x0e\x39\x7a\xdc\x59\x00\x3f\xc0\xe4\xbe\xd9\xdd\x4c\x3f\x24\x01\xff\xb0\x9b\xf8\xc6\xb9\xe2\xef\x77\x13\xdf\x93\x8f\xd6\x57\x94\x5c\xad\x95\x2c\x60\x90\x41\x6f\x50\x4d\xc2\x7b\x1d\x78\xd8\x9b\xb7\x17\x78\xfb\x15\x26\x28\xd8\x9c\xfb\x77\xad\xe4\x66\x21\xf6\x9a\x32\x7a\x3f\x54\x5d\x4e\x43\x84\x64\xc2\xe5\xa5\x2f\x52\xd8\x54\x57\x59\xea\x19\xb5\xbc\x44\x8d\x85\xa6\xf4\xdb\x95\x16\xf5\xb4\xae\x60\x7e\x7e\x73\x02\xbc\xa0\x4d\xa2\xc0\x9f\x09\x27\x95\x8a\xe9\x82\xed\xff\x0e\x58\xa1\xb1\x07\x4b\x02\xaa\xbc\xb3\x93\x00\x58\x07\x22\x5a\xdf\x65\x4f\x0a\x76\x57\x2b\xcc\x60\x6a\x0d\xe1\x43\x47\x25\x34\x6a\xa6\xb4\x0b\x94\x5f\xc4\x1b\x24\x27\xd7\xde\xed\x1f\x2a\x15\x5f\x30\x8d\x0c\x5b\x54\x1a\xbe\x40\x62\x4d\xd0\xe7\x30\x35\xf7\x8e\xdd\x61\x57\xb6\xc5\x5c\xf8\x37\x83\x67\x0f\x7e\xe7\xb6\xb5\xdd\xc1\x54\x1f\x72\x08\xfe\x90\x89\xc8\x69\x1b\x58\xcd\xf2\x9a\x4d\xbc\xb4\xae\x60\xfe\x82\x2a\x05\x91\x4a\xc9\x3d\x52\x62\x28\x3f\xc7\xe0\xce\x85\xbf\x13\x12\xa5\x4b\x0e\xec\x4f\xd8\x10\x13\x6f\x6a\x16\x42\xe5\xad\xde\x9c\xbb\x8c\xe2\xd9\xe3\xba\xbc\x2c\xc8\x75\xf6\xa0\xa7\x37\xd8\xe4\x8c\xe7\x9a\x82\xbe\x09\x34\xa3\xbc\xfc\xf2\x48\x58\x8e\x7f\x42\x0a\x79\x4e\x72\xfd\xe5\x73\x5f\xde\x0f\x04\x90\xb8\x10\x89\x0b\x4c\x0c\x1a\x3c\x9b\x2c\xa7\x40\x7b\x8c\x6e\x44\x67\x03\xa8\x4c\xc6\x07\x2f\xea\x37\x59\xd8\xe0\x01\x79\xf3\x06\x7a\x61\x26\x78\xdb\x4a\x85\x8f\xc8\xb8\x99\x84\x40\xc8\x4c\x52\x62\x32\x81\x95\x5a\x1d\xf0\x24\x17\xee\xd5\xa2\x69\xc9\x18\x19\xde\x0c\x86\x68\x85\x0f\xbf\x1e\xd6\x85\xa1\xcf\xb9\xf1\xc6\x69\x26\x75\xdf\x6c\x03\x48\xaa\xc6\x37\x07\xaa\x5c\x1f\x9f\x74\x09\x32\x83\x31\x02\xe9\xbd\x9a\x6c\x70\xa8\x40\x7c\x67\xf8\x74\x3e\x65\x57\x90\xff\x92\x03\x14\xee\xea\xe1\x68\x3d\xd9\x34\x00\x1d\x35\xce\xa7\x28\x35\x07\xf4\x04\xe8\x2f\xc9\xae\xc4\xe3\x39\x23\x21\xce\x0b\x64\xdb\xec\x2b\x94\xd5\x8b\xc7\x4b\xe1\x0f\xca\xbe\xdb\x6e\x63\xa8\x54\x2b\x59\x64\x9f\x17\xd9\x03\x99\xdd\x08\x9a\x73\x13\x95\x18\xa0\xed\x84\x00\xab\x8f\x45\x10\xd7\xcb\x9d\x71\xdc\xf2\xf5\x64\x49\x3d\x84\x31\x5c\xc0\xcb\x82\x5e\x96\xd3\x91\x71\x2b\x7c\x8e\x3e\x3c\x5c\x88\x07\x13\x25\xe0\x34\x8b\xf2\xcb\x73\xf9\x61\xac\xe4\x24\x17\x4a\x40\x72\xbb\xb5\x55\xda\xad\x4a\xbb\x00\x70\xbb\x47\x47\x7b\x36\x42\xde\x23\x33\xef\x1a\x86\x52\x7c\x12\x4d\x35\x94\xc6\x92\xec\x12\xc5\x15\x2f\xe7\x48\x77\x73\x98\xdb\x4a\x9d\x55\x5c\xf5\x49\xe1\x32\x3a\x90\xe8\xe8\xa9\xc2\x0b\x92\x40\xa0\x50\x5e\x72\x4b\x48\xad\x09\xd6\x94\x84\x12\x41\x6b\x0d\xa4\x75\x09\x7d\x3d\x56\x1f\xfa\xdb\xd1\x6b\x48\xb0\x06\x84\xcb\xf7\xe8\x8b\xae\x52\xcc\x55\x25\x18\x29\x57\x12\xa9\x4a\x2e\xb2\xab\xc5\x57\xd4\xe3\x50\x3d\xaa\x16\x47\xd5\xf2\x12\x71\xca\x13\xab\x40\x5a\xdc\xa3\xc9\xc6\x2a\x5c\xac\xc2\xdd\x29\x9e\x97\x86\x15\x86\xc1\xfd\x3d\xcc\xb4\xdb\xcd\x3c\x53\x2c\x32\xc5\x90\x49\xc7\x73\xb0\xa8\xdd\x43\xaa\xde\x55\xb1\x3c\x94\xe4\x83\xee\xa6\x48\x16\x80\x51\x19\x94\x49\x3c\xe0\xcd\xbb\x26\x4a\x30\x22\x7c\xdc\xc0\xe3\x06\x85\x8f\x4d\x0f\x58\x1b\xbf\xee\x37\xa2\x3a\x85\x8a\x70\xcf\x9c\xba\xd3\x9e\x51\x2d\xeb\xb3\x5c\x30\x40\xa1\xda\x61\xe5\xb5\x5d\x60\xfc\xd7\x77\x4d\x28\x12\xa0\xc4\x61\xd3\xe4\x51\x3d\x90\xe7\xdf\x33\x6b\x5b\xb4\x7d\x74\x04\x1b\xa2\x54\x03\x25\xbf\x7c\xac\x1a\x55\x8f\x6a\xad\xa4\xa1\x4e\xf7\x34\xeb\xbb\x22\x1e\xfe\x1d\x95\x2c\xde\x61\x3c\x64\xaa\x47\xbe\x89\x77\xad\xf1\xd0\x2d\x1e\x39\xd9\xf7\x93\xb5\x93\xe6\xd1\xab\xd1\xad\xa7\xef\xa2\x9f\x76\x0a\x19\x0e\x3b\x67\xd2\x61\xc0\x0b\x25\xbc\x75\xca\xe6\x7c\x8e\x72\x8f\x25\xa1\x48\x0c\x8f\xc4\x17\x80\x8e\x78\xab\x03\x87\x49\x6b\xd8\xa7\x43\x84\x1c\xb5\xe4\xfa\x0c\x2d\xac\x4c\x9f\x32\x80\x87\x11\xd7\xa1\xb2\x53\x14\x0b\x59\x03\x75\xcf\xe2\xb6\xa0\x3d\x43\xaa\x73\x62\xd3\xcc\x09\xd6\x4b\xc7\x8e\xb9\x05\x78\xfb\x99\x95\xdf\x31\x39\x74\x90\xad\x81\xcf\xdd\x90\xeb\x9c\x95\xda\x93\x97\x85\x13\x18\x71\x8e\x59\xa3\xcb\x33\x0f\x4f\x52\xd3\xe1\xe7\x78\x23\x3d\x47\x03\x78\xc1\x82\x2c\xd1\xbe\x96\x30\x07\xdb\xf0\x65\xeb\xae\x39\x07\xe8\xdd\xc1\xd3\x06\x9e\x36\xcc\x58\xf3\x4d\x7d\xd3\xb8\xab\xdf\x99\xe4\x54\x25\xae\xfb\x50\x41\xdd\x80\xc7\x42\x89\x6f\x6d\x9a\xcd\x0c\x8f\x96\xf6\x9a\x6d\xea\x7c\xcd\xee\xf0\x0f\x56\x06\x85\x0d\x38\x90\x5b\xb7\x1e\x86\xc8\x6a\x1b\x4b\xf9\xd4\x50\x49\x26\x8a\x26\x60\x8e\xef\xea\x33\x06\x2d\x37\x44\x81\x4e\x73\x86\xc2\x8b\x0d\x1e\x26\x33\x92\x43\x40\x62\x5c\xbf\x31\x49\xb0\x81\x3a\x2c\x80\x01\xef\xe0\xa1\x83\x0f\x44\x32\xcc\x4c\x53\x4a\x04\xbc\xe7\x57\x23\x18\xe8\x0a\x07\xea\x60\x95\xc6\xa6\x09\xbf\x68\xa7\xe0\x60\x95\xc6\x1d\xbc\x6e\xe0\x15\xeb\x5d\x50\xa9\x9f\x32\x60\x35\x77\x65\x87\xc6\x0a\x36\x1e\xfa\x7e\xc8\xaf\xf4\xa1\x5e\x43\x54\x8c\xd6\x03\x77\xde\x0c\xef\x7f\x48\xd6\x61\xa0\x6f\x0f\x53\x82\xbb\xc8\x9d\xf7\x82\x72\x03\x8a\x69\xdd\x01\xb8\xd7\x77\xd8\x11\x7c\xd8\x98\x36\xa6\x35\xb9\x81\xa9\x4d\xfa\xcb\xb1\xaf\x66\x3d\xc1\x3c\xe2\xc3\x86\x3e\x60\x81\x0d\x7e\x30\x47\x2e\x2d\x26\xb5\x46\xc4\x2a\x95\x8b\x04\x45\xf3\x8e\x10\xb3\x3d\x0d\x65\xad\x00\x65\x39\x14\xc5\xda\x39\x7c\xb7\xb0\x5f\xec\x5c\x14\x3b\xc7\x62\x4f\xe7\xf2\x03\x51\x2a\x50\x8d\xbd\xda\x37\xcb\x79\xa4\xf4\xbc\x4a\x09\x37\x1c\x87\x76\x83\x6a\x9d\x63\xad\xb9\x4e\x72\xb9\x01\xd9\x1e\x90\xd6\x07\x35\x63\xf7\xdb\x5b\x3e\xde\xde\x12\xdb\x9b\xc7\x3e\x65\x78\xea\x79\x27\x8a\x26\x58\x54\x20\xb2\xa7\x15\x5c\x3c\xde\x95\x45\x51\xdf\xd7\x81\x74\xcd\xc3\xba\x98\x48\x6d\x33\x63\x65\x8b\xd8\xb9\xf1\xd3\x27\x8a\xa0\x6e\xe4\xb0\x6e\xb0\x64\xba\xf4\xd2\x4a\x83\xe6\x2a\x4b\x80\xbd\xd6\x67\xd4\x3a\x2d\xe6\x27\x0a\x8e\xb0\xed\x78\x0c\xc7\xff\x99\x85\x3a\xd5\x36\xfc\x02\x96\x70\xe5\x45\xa1\xdc\x23\x12\xa3\x2b\x4c\x1a\x8a\x10\x60\x14\x27\xc4\x10\xa8\xd9\xc4\xab\x4b\xbc\x90\x71\x44\xc9\x83\x0e\x03\xc5\xdd\xf8\x33\x4f\x50\xc9\x9e\x76\x77\xea\xa2\x5d\x98\x35\x82\x73\x72\x84\x01\x7f\x3c\xbc\xd1\x94\xbc\x04\xa6\x27\x32\x5d\x7a\x06\x3c\x87\xcf\x23\x6f\x92\x29\x32\x8e\x88\xdd\xa9\xf4\x8a\x25\x51\x32\xe0\x9e\x89\x7a\xde\xc9\x20\x4a\xa1\xa5\x96\xe4\x9e\xe8\xe6\x0c\x35\xc2\x1c\x71\x49\x16\x15\x1c\x94\x23\xa3\x34\xc9\x0b\x0c\x9f\x47\xd0\x36\x46\xb4\xc9\x9d\x4c\x94\x4c\xd1\x80\x55\x99\x45\x2b\xc3\xac\xc7\x9a\xd3\x1b\xb7\x38\x5f\x92\xfc\x7c\x81\x73\x2f\x10\xf6\x17\x88\x8a\x73\xad\x47\xf7\x2c\x25\xc5\x3f\x23\x06\xfc\x07\xdc\x8b\xe8\x3a\x4f\x59\x2c\xb1\x3e\xe4\x51\x79\x13\x99\x37\x06\x80\x40\xe7\x6b\xc2\x71\xad\x66\x67\x29\x47\x8a\x2a\x1e\xca\x18\x60\x35\x51\x8f\x53\xb3\xaa\x84\x00\x18\x95\x90\x8a\xfe\x58\x42\x3c\x42\x89\x46\x43\x15\x97\xdd\xa1\x14\x09\x65\x91\xb2\x37\x14\x31\x12\x26\x6f\x80\x5a\x74\x1a\xc6\x78\x45\x63\xd4\xee\x6a\x6c\x8d\x1a\x59\xf2\xd3\x46\x7c\xda\xe0\xa7\x4d\x8d\xdd\x68\x9f\xd6\xb2\x18\x20\x79\xac\xa2\x48\x97\x65\x00\xc7\x63\x79\x8a\xcb\x85\x04\x44\xc5\x9e\x9f\x9b\xbb\x80\x43\xb6\x8e\xc3\x79\x5a\xa8\x90\x9e\x0b\x15\xd2\xe2\x72\x61\x2f\xfb\x1c\x9b\xf0\x0f\x34\xb1\xdc\x6b\xc2\xa7\x26\x96\x4f\x6d\x82\xb2\x93\x03\xba\xe8\x40\x13\x0b\x73\x17\xbe\x11\x35\xb1\xd0\x9a\x58\x55\x35\x51\xca\xbe\x28\x88\xab\x9c\xb8\xcb\x09\xbd\x2a\x13\x0c\x81\x57\x8c\x56\xc7\x14\xdb\x3c\x5a\x3f\x92\xcb\xa2\x4c\xb3\xd8\xa9\x10\xc5\x20\xf1\x0e\x5b\x1f\x50\xc8\x95\xb7\x04\x44\x19\xc5\x94\xd1\x30\xa5\x19\xad\xb1\x81\x27\x0c\x0d\x07\x89\x84\x4d\x04\xc5\x5e\x63\x7f\x64\xc5\x07\x95\x96\x16\x49\x40\xee\xa9\xd4\x7f\xa0\x96\xdf\x1e\xba\x43\x25\x1c\xa1\x07\x86\x45\x56\x51\x96\x78\xd1\x0d\xc6\x3a\x12\x85\xfe\x25\xab\x17\x1f\xb2\xbc\xd9\xdf\x21\x9d\x20\xeb\x09\x95\x58\x04\x12\x32\xe3\x06\xb2\x84\xb5\x08\xc3\x51\x11\x59\x39\x0f\x78\xd7\x62\xcb\x80\x77\xd8\x22\xc0\x3b\xb2\x51\xc1\x73\x2c\x7d\x2f\x46\x97\xd8\x9b\x03\x98\x31\x93\xec\x04\xa0\xa1\x49\x36\x25\x5d\x68\xda\x45\x59\x6b\xe6\xad\x51\x75\x72\x24\x24\x6b\x88\x7e\x80\xe0\x5f\x63\x20\x28\x44\x4a\x52\x35\xda\x37\x99\x81\xea\x20\xd4\xcd\x90\xa1\x8a\x13\x95\x33\x71\x6b\xb8\xb9\x1e\xb2\x16\x81\x8e\x0c\x30\x47\xcd\xa6\x8b\x7a\xc9\x66\x24\x6f\xd5\x00\x13\xb9\xa8\x0b\x89\x6e\xb0\xf0\x2e\xc4\x87\x47\xd1\x01\x59\x61\xa3\x33\xc2\x88\x54\xbe\x60\x94\xe9\x92\x06\x8e\x4e\x3f\x98\x41\x76\x1e\x88\xab\x22\x3d\x03\xa0\x86\xbd\x3e\x3d\x3c\x40\xb1\x99\x17\x78\xa9\xf7\x4d\x51\x5a\x2d\xc7\x5f\x32\x23\xdb\xf7\xa4\xcf\x32\x8c\xad\x66\x90\xeb\x60\x59\x80\x44\x0b\x24\x06\x48\x29\x18\x3d\x32\xd7\xb2\xdf\xa6\xf2\xed\x06\xac\x3d\x24\x0a\xa6\x1e\xa5\x40\x02\x25\x73\xcf\x47\x5e\xd5\x47\xc1\xae\x5f\x68\xe8\x63\x5d\x4f\x33\x95\x42\xdf\x95\xca\xf4\x3a\x1f\xfd\x93\xcc\xa1\x3c\x61\xfc\x4d\x4e\x34\x04\x84\x9e\x54\x4c\xb7\x19\x8f\xbd\x83\x05\x11\x0a\xff\x06\x6a\x9c\x95\x95\xf0\x54\x17\x49\xcd\x49\x4d\x1c\x80\xe3\x97\x52\x56\x75\x35\x32\x4a\xf3\x02\xa4\x89\xb5\x3b\x91\x29\x4b\xf5\x89\xc4\x21\x69\x60\x57\x12\x15\x9e\xe6\x60\x27\x15\x8f\x50\xe7\xc0\x21\x7b\xea\x97\x09\xbf\xd2\x6e\xc8\x59\xee\x9c\xc5\x56\x8b\x84\xf8\xe0\x3b\xd2\xb2\x04\x0e\x55\xf4\xa3\x9e\x61\x8f\xe0\x54\xc0\x9f\x0d\xcf\x50\xf3\x0f\x90\xa7\x5f\x2c\x7a\x79\x2b\x49\x12\x1c\xe0\x2f\x70\x0f\xc4\xaa\x83\xe3\xb8\x2d\x9f\x6c\x54\x12\x0f\x9e\x47\x23\x13\xf8\x11\xee\x4f\x82\x29\x43\x26\xde\x11\x5f\xeb\x31\xb9\x31\x6b\x70\x77\x97\x7b\xce\x7d\x5a\xcb\x4e\xa2\xc7\x4d\xd2\x57\x14\x37\x9a\x79\x37\x34\x3d\x1d\xc1\xe5\xf8\xa8\xe4\x1d\x17\xe1\xc1\x60\x00\x86\x37\xf1\x35\x01\x6d\xa7\x11\xeb\xca\x54\x14\x3b\x55\x84\x46\x8d\x35\x64\xef\x69\x21\x51\x43\x23\x22\x1f\xc9\x2c\xf7\x1d\xda\x4e\x29\x09\x5d\xf3\x48\x5d\xa9\x0a\xb4\x64\xa0\x0f\x46\x62\xd1\xf3\x4b\x8d\xaf\xe0\x4c\x32\x94\xdc\x90\x08\xeb\xfb\x8c\x74\x92\x4a\x93\xed\x1f\x12\xb6\x44\x62\x30\x30\x2f\x39\xbd\x45\xa4\x57\x49\xb1\x8a\x54\x9c\x44\xcb\x8d\x54\xad\x41\x6a\x83\x1c\x78\x55\x79\x2b\x7a\xc4\xbb\x04\xaa\x2d\x54\x15\x41\x5d\xd2\xea\x22\x99\xd9\x4c\x80\xcf\xcf\x83\x74\x09\xab\xa1\xab\xc4\x98\x9b\x6d\x97\x55\xb6\xef\x8f\xfd\x03\x95\xa1\x04\x7b\xc1\x97\x75\xc3\x3a\x9b\x8f\x9b\x1d\xbb\x63\x02\x11\x68\xcc\x9b\x6e\x7d\x61\xb6\x01\x64\x70\xf6\xa2\xe0\xfb\xa6\x90\xa9\x03\x59\x3c\xd3\x24\x21\xe2\x14\x80\x95\x75\x23\x50\x1f\xea\x14\xaf\x83\x71\xa5\x20\x14\xcd\x4b\x9a\x01\x50\xaa\xdb\xea\x30\x66\x1e\xac\x8b\x70\xca\x22\x29\x22\xbf\xa9\x8c\x1a\x39\xc3\xd0\x2a\xf7\x33\x27\x75\x6c\xca\x2d\x76\x8a\xc3\xb1\x5e\x5d\xb4\x9c\x14\xa2\xe5\xa4\xc1\x9d\xfa\xba\xb1\x60\x6b\x47\xa6\x2c\xf1\x4a\x6f\x26\x91\xaf\xb8\x25\x06\x04\xbc\x0e\xa4\x6f\xda\x37\xe8\x2a\xa2\x88\xc3\xb7\x8b\x18\x9f\x8a\x89\xcb\xf8\xfb\xa9\x58\xb8\x18\xc3\xd7\xa3\x62\x35\xe4\xa7\x9b\xc2\xe6\xc6\xae\xce\xd7\x94\xf4\x45\x49\x7f\xab\x8c\x65\xd6\x28\x89\xd6\xc8\x0b\x18\x44\x59\x3e\xa6\xed\x32\x52\x43\x42\xfe\xc5\x58\xe6\xba\x7f\x39\xef\xe2\x48\x83\x27\xe7\xe0\xa6\xfb\x66\x7f\xd3\x05\x87\x62\x80\xee\x06\x07\x2d\x6e\x52\x26\x7e\x71\x7c\x78\xe8\x0c\x50\x7b\x9b\xd2\x9d\xca\xbc\x20\x5f\x12\xe8\xf1\x88\x2e\x80\xd7\x5e\xbc\xc2\xeb\xc3\x80\xcd\xc9\xd6\xa4\x48\x49\x20\x85\xfa\x9e\xab\x35\xf1\x58\x2f\xcf\x56\xc4\x5c\xe9\xa2\xbc\x35\xac\xb1\xd5\xd9\x1a\x10\xef\xda\x14\xb4\x95\xcc\x8f\x19\x27\x6b\x64\xc4\x66\xf8\x93\x88\x57\x52\x96\x58\xf0\xce\x68\x29\x35\x8b\xb4\xfc\x0b\x91\xbf\xc1\x93\xc9\xa2\xd9\x91\xb9\x59\x22\xd2\xb1\x60\x4e\x5c\xcb\x45\xbf\x81\xf5\xee\x20\xc1\xe1\xfa\xb0\xe0\x23\xf2\x96\x80\xc4\x9e\xef\xef\x2c\xfb\xe4\xeb\xd7\x7d\x14\xcf\x74\xc3\xc2\xc7\x17\xfe\x01\x4f\x58\x37\xe2\xc2\x1a\x35\x1e\xa0\x9b\x6a\x6f\x44\x14\xd6\xe9\xa9\xfb\xe2\x40\xd5\xb3\xa2\x6a\xd7\xcf\xb7\xce\xdd\x57\xaf\x7c\x5d\xa5\xe7\xb1\x22\x91\x28\x12\x49\xf7\x1e\x5f\xbd\x37\x65\x54\x93\x92\x02\x42\xe2\xcf\x3c\xa1\x76\xb0\x77\x7d\x4e\x26\x60\xb9\xfe\x1b\xd2\xa0\x58\x28\xf0\x4d\x32\x5f\x20\xa7\x2a\xbe\xf4\x70\x2b\x30\x7a\x6c\x3e\x72\x79\x95\x01\x5a\x6d\x22\x97\xb9\x25\x71\x08\x43\x83\x73\xb2\x3b\x4a\x74\xc3\xc8\x58\x32\x72\x1e\x47\xe4\xcd\xdc\x33\x67\x6c\x38\x0d\x8e\xc2\x65\xbc\x44\x42\x52\xde\x43\xcd\x29\x57\xa6\x25\x79\x9a\x5a\x6d\x89\xe6\x8c\x44\x3a\x32\x41\x1f\x66\x32\xb1\x4a\xa1\x22\xef\x7f\xae\xe4\x5e\x54\xb1\x65\xb5\x99\x37\x77\xb2\x00\x00\xe4\xf8\x88\xeb\x0b\xe8\x25\x7e\xb0\x8c\x32\x2f\x4d\xbd\x6a\xd8\x11\xc8\x72\xc3\xb9\xb0\xd8\xb3\x8c\xf8\x5f\x01\x84\xfc\x52\x19\x08\x2b\x29\x8c\x97\x66\x66\x16\x51\x5b\x99\x34\xec\x8c\xd1\x9e\x8f\x2e\x6a\x49\xb9\xfe\x0c\x7d\xfb\x3b\x3c\x26\x2f\xa7\x22\x50\xf3\x76\xb7\x1e\x17\x32\x73\xc3\x69\x46\x24\x82\xef\x2a\x00\xb9\x5b\x76\xeb\x2f\x16\xc1\xc1\x5e\xeb\x8e\x6c\x8a\x11\xcc\x85\x8b\xe4\x25\x9f\xab\x94\xdc\x1c\x74\x81\x36\xa4\xc0\x8b\x41\x97\x3d\xc2\x2a\x3b\xe3\xc8\x74\x39\x43\x69\x1c\x2a\x87\x4f\x36\x85\x73\x4c\xb5\xa6\xcd\x39\xd9\x36\xc2\x53\x5e\xea\x5e\x10\xb6\x68\x7c\x68\x14\xc5\x9b\xe2\xb1\x29\xd4\xce\xda\x46\xb7\xee\x98\xb9\xd3\x7a\xb4\x16\x44\xbd\xec\x3c\x6b\xac\x65\x75\x46\x7e\x83\x47\xf5\xa2\xaa\xed\x02\x81\xe5\x36\x79\x36\xf6\xdb\x59\xdd\xb1\x2d\xe9\xec\x25\xe0\x6e\x01\x59\x35\x32\xcc\xdc\xe4\x41\x61\xab\x8a\xea\x43\x4e\x38\xfb\xfa\x75\xd0\x69\x67\x05\x4b\xfc\x95\x8b\x80\x22\xd1\xab\x8d\xa3\xb2\x14\xdf\xdb\x3c\x2e\x0b\x49\xf6\xb3\xf0\x68\x6f\xd1\x38\x08\x07\xab\x40\xf2\xec\xb3\x17\x47\xb6\xeb\x0b\x5d\xa3\x9c\xb8\x4e\x52\x34\x59\x5f\x1d\x94\x86\xfa\x05\x3f\x4e\x6b\x49\x85\x23\xc7\x8d\xe3\x31\x65\x61\xa9\x93\xfa\x01\x23\x3f\x58\xba\x21\xb4\x4c\x44\x9e\x02\xd6\x5d\x50\xac\xbb\x79\x11\x03\x60\xcd\xd3\x31\x50\x9b\xed\x25\x71\x1d\x0b\x34\xae\x74\x81\xd1\xc0\xf6\x22\x64\x9d\xe6\x13\xbf\x01\xd3\x6f\x44\x2d\x7a\x9e\xe2\x86\xd9\x08\x2e\x66\x71\x66\x11\xf8\x72\x9e\x65\x89\x37\x33\x01\x64\x62\xce\x19\x19\x46\x1f\x1d\x39\xcf\xe1\xa1\x33\x25\xb6\xcb\x9d\xa0\x60\x07\xc3\x6a\x02\x8a\x83\x41\x75\xd8\x82\x4c\x3b\x23\xbc\x3d\x5a\xab\x8d\x18\x96\xd8\x1c\x57\x9e\x92\x68\xe9\xa3\xe8\xc3\x98\xaf\xf1\xa8\x5c\xee\x1e\x90\x5f\x4f\xe1\x11\xda\x7a\xea\x21\xf6\x3a\x95\x6e\x8f\xe9\x94\xba\x02\xd4\xff\xd4\x03\x64\x4f\x94\x9a\x8e\x2b\xd0\xe8\x42\x98\xb7\x6c\xed\xbc\x21\xa2\x07\xe7\x14\x5c\x3c\x74\x37\x4f\x3d\xfe\x9f\x3d\xcb\x09\x80\x32\x67\x7d\x90\x0e\x0c\x0b\xe6\xd1\xd3\x4d\xe6\x71\xf1\x38\x14\x22\x07\x16\x60\x26\x3c\x3d\x51\x3c\x88\x84\x2b\x3d\xd1\xfc\x86\xc1\x3e\x70\xc6\xef\xcb\xf8\xd2\xed\x88\xc4\x53\x78\x23\x87\xb1\x43\x7e\xc9\x80\x10\x2d\x8b\x25\x62\xde\x48\x0c\x4d\x3a\x43\x59\xce\xa1\x37\xb1\x29\xd5\xf9\xe3\xba\x81\xeb\x36\x67\x90\x01\x75\xb5\x62\xe0\xba\xc4\x6f\x60\x22\xbe\xae\xaa\xb8\xc1\xe7\x7a\x7d\x55\x59\x9a\x98\x45\xe9\x97\x5d\xfa\x48\x25\xb7\xbb\x2c\x80\x7f\x62\xa7\x1c\x6e\x53\xb2\xd1\xa4\xa5\x5c\xc5\x48\x8b\xd3\xfd\x06\xc7\x41\x58\xbd\xc4\x55\x87\x3b\x5c\xf5\x53\xf9\x85\x78\xc7\xdd\xe9\xe3\x8b\x43\xcc\x9b\xf7\xf0\x50\xe9\xcd\xc7\xb3\x1b\x05\xf1\xb8\xa7\x71\xf2\x25\xa7\x5b\x72\x6f\x7c\x2f\x62\xfa\xe8\x6b\xaf\x6c\x32\xb2\xb3\xf6\xa4\x30\x27\xe1\x51\x69\xed\x65\xca\xbb\x02\xa0\x2e\xc0\x17\x24\xbd\x87\xe9\x5a\x22\x93\xb0\x94\x62\xa5\xd6\x8a\x37\x97\xad\xcf\xec\xdf\x98\x1e\xa3\x72\x08\x3c\xcd\x51\xe6\x91\x5b\x7e\x40\xff\x01\xc7\xcd\x81\x82\x9f\x8f\xe8\x63\x79\xb6\xef\x9e\x2f\x5a\x77\x14\x67\x89\x62\xd3\xde\x9d\xad\xe9\x75\x2d\x5e\x49\x88\x74\x76\x23\x7e\xc9\x3a\x80\x5c\x8f\x60\xbd\x33\xee\x18\xc0\x5e\xc0\x3a\x6b\x42\x0d\xc0\x53\xb8\x78\x7b\x6e\x40\xf1\x86\x63\xac\x01\xb3\xb5\xbb\x8d\x99\xc9\x36\x90\x0e\x47\x89\x21\xeb\x78\x78\xe8\x98\x95\xdd\x80\xb3\x16\x4a\xce\xd0\x8f\x9f\xb0\x4e\x11\xf2\xab\x4d\xb1\x12\x93\x1d\xd9\x92\x66\x97\xcf\xef\x5f\x90\xe2\x36\x53\x72\x26\x1b\x59\x7b\xd4\xb1\xf3\xa6\x4a\x3a\x9c\xf2\x38\x97\x0e\xeb\xe2\xa6\x42\x82\x26\x1d\x13\x28\xe1\xd8\xc8\x39\x8b\x00\xab\x47\x66\x2c\xf0\xb2\xe1\x4f\xa2\x29\xcf\xf8\xfd\xa5\x8d\x4f\x4c\xcc\x80\x9d\x16\x8d\x1a\x18\x4b\x26\x9a\xea\x62\xd8\x4c\x99\xfa\x3f\x3c\xc0\x81\x22\x7b\xe9\x88\x9f\xcf\x40\x23\xac\xa4\x3a\xa4\x88\x98\x48\xc9\x3e\xd0\xe7\x66\xcb\xe1\x99\x59\xc8\x9b\x54\x8d\xa5\x38\x49\x9e\xae\xab\x9b\x0f\xc2\xcb\x45\xbd\xba\xd4\x2d\x6c\xf9\x63\x6f\x02\x7f\x9b\x18\x36\x09\x2d\x8a\x49\x5c\x28\xc9\xd5\xfb\xb7\x68\x4f\x20\x54\xd0\x85\xcf\x84\xd6\xe7\x46\x3a\x49\x0b\xd7\x1d\xad\xcf\x44\x00\x8e\x61\x96\x3e\x03\x20\x3f\xc3\x1c\x87\xad\x4b\x16\xa3\xa5\x38\x1c\xca\x50\xff\xe7\x26\x6a\xcf\xc3\x57\xbf\x10\x75\xef\x67\x36\x47\x79\xef\x5e\x70\xdc\x27\x64\x44\x24\x13\x1e\x1e\x28\xd6\x43\x31\xc2\x58\x2c\x8e\x4b\x32\x59\xfa\xdc\xc8\x73\xe2\x1a\x59\x35\x8a\x81\xae\x8a\x22\x99\xe4\x9c\xef\x45\x98\xa2\xdc\x65\x30\xd2\x50\x48\x3c\x21\xbb\x81\xc8\x7c\x17\x46\x12\xb9\x43\xd5\x09\xac\x80\x15\x6c\xbd\x08\xfe\x2e\xb9\xdb\x5a\x8d\x22\xfe\xda\xc7\x50\x6a\x19\xbf\xf6\xd1\xf5\x66\x04\xf3\x3a\x32\x5d\x7c\x73\xc9\x5f\x8b\x8f\xb7\x0c\x7e\x0b\x15\xbd\xd0\x95\xfd\xe7\xc6\xbc\x99\x01\x40\x02\x18\x78\x04\x03\xcf\x10\x4a\x31\x5d\x1f\xbf\xf0\x8d\x97\x50\x17\xa3\x48\x5d\x21\x6d\xd9\x06\x8f\x59\xd2\x40\x4a\x7c\xde\xa0\x46\x51\xe1\x13\xdb\x6e\x60\xe3\xf8\xc9\xc7\x3e\x1c\x1d\x3d\xa3\x76\xe8\x06\x21\xe5\x11\xb4\x07\x20\x98\x37\x13\x8a\xd7\xf2\x8c\xfa\x42\xf7\xd3\x18\xac\xca\xc5\x6f\x41\x73\x49\xc6\xfa\x6a\x03\x79\x05\x94\x7c\xb9\xeb\xea\xb4\x6b\x4b\x3b\x0e\xb7\xab\xb0\x55\x79\x0c\x87\x93\x99\xbf\x38\x9f\xc4\x33\x6c\x9c\x0b\x1f\xc9\x34\xd2\x65\x0a\x84\xd5\x7a\x81\xd9\xd1\x0d\xc4\x8e\xef\xdf\xc7\xdd\x52\xa7\xb9\xab\xe9\xa7\x9f\x0a\x81\xf2\xa6\x8d\x8e\x15\xc7\xbe\xd8\x4e\x50\x8d\xb4\x19\x24\xdf\xe6\xa8\xc1\x72\xf1\x5f\xd6\x48\xb5\xf8\xa2\x46\x97\x6a\x97\xc8\x3e\x2a\x21\x7b\x37\xc8\x92\x92\x3f\xa3\x03\xb4\x06\x3a\x30\xd9\xa5\x36\x5c\x32\x89\x46\xc5\x59\x3c\xbd\xdd\xbd\xdb\x1e\x7d\xab\xe3\xb5\x4f\x5a\xe8\x2b\xc0\x26\xf9\xe4\x8b\xa0\x11\x1b\xfe\x19\x9f\xd0\x8f\x01\xa4\x46\x63\x58\x51\x1e\x75\x13\xb0\x4c\x48\x34\x47\x54\x20\xf2\x84\xbf\xf1\x85\x2b\x9f\x0f\xf4\xbb\x44\x43\xb3\xa6\x10\x23\xc1\x99\x8f\xc4\xf2\x5d\xc3\x03\x8c\x9d\x68\x3c\x20\x75\x2e\x1b\x57\x21\xf1\xa6\x8b\x3a\x51\xb1\x5a\x57\xb0\x22\x49\xf3\xcf\x24\xff\x31\x5b\xbb\xb2\xc8\x12\x98\xaf\x05\xfc\xd5\x8a\x75\x9a\x58\x72\x0c\xcf\x6d\xf8\xb5\x3b\xa6\xac\xa0\xb8\xaa\xfa\xaa\xe5\xe9\xe1\xf2\x8c\xe5\xf2\xcc\xf8\xb3\xce\x7f\xbf\x38\x4b\x22\xd2\xaf\x20\x59\x72\x57\xef\x92\xb8\x15\xeb\x29\xfe\xfa\x55\x29\xaa\x7a\xa6\x57\x15\xeb\xcb\x31\xdd\xa3\x3d\x80\x6b\x3a\xb8\x1c\xf5\x10\xa1\xc4\x6b\x02\x53\xe4\xeb\x7a\xf2\x19\x6a\x37\xc7\xe4\xfa\x7e\x92\x4d\x25\x58\x51\x4e\x9f\x8e\x2d\x1b\x55\x49\x84\xf7\x21\x65\xc4\xfa\xf0\x60\x9d\xf1\x18\x3e\xc5\xfa\x81\xed\xa9\x1b\x2b\xaf\x74\x63\xe5\xa3\x3b\x7b\x75\x0a\xe9\x77\x51\x73\x74\x85\x95\x08\x3b\x4a\x3f\xf7\x97\xb3\xc6\xbb\x63\x20\x65\x6a\x94\x80\x16\x43\x8b\x71\x00\x5c\x9a\x5d\x9b\xe9\xef\x1b\x5b\x64\x68\x16\xa9\x9d\x23\x4f\x20\x38\xf1\x9d\x0a\xe5\x17\x17\xf8\xc6\x30\x5d\x68\xda\x85\x40\x4c\x61\x52\x1d\x93\xda\xf2\xda\x0e\xaf\x7e\x69\x9c\xd6\x08\xb0\xc1\x52\x75\xfa\xcc\x1a\x99\x52\x86\x14\xf1\xe5\xc4\x6d\x76\xa6\x2a\x27\x62\x73\xfc\x65\xb5\xe4\x53\xe6\xc4\xfe\x7c\x53\x7b\x06\x5d\x79\x78\x40\xb9\x0b\x6c\xaf\x1b\xd3\x7c\xce\xd7\x63\x63\x29\xe8\x12\x18\x9c\x03\x3b\x56\x94\x6d\xf2\x44\xa4\x8a\x1a\x32\xcc\x0e\xcc\x2c\x06\x04\xbb\xe1\x15\xfd\x66\x6a\x75\x70\xd5\x4b\x01\x2b\x73\xa4\x3e\xe0\x8d\x9b\xaa\xc5\xaa\xc8\x8f\x07\x98\xba\xe5\x48\x75\x47\xcd\x9e\xba\xfe\x8c\x77\x6e\x1b\xe1\x84\x8f\x4b\x73\x87\x52\xdb\x39\x45\xca\x81\x53\x5f\x4d\x59\x2e\xa1\x42\x71\x3b\x72\xd4\xf5\x08\xa1\xaa\xee\x40\x99\xab\xa0\xea\xa3\xe2\x22\x0e\x79\xa4\x9c\x90\xf9\xea\x2b\x1e\x81\x04\x07\xb1\xee\xfd\xd6\x67\x1a\x8d\x0b\x5d\xfe\x3c\xc6\x3a\x6d\xac\x93\x45\xec\x59\x2e\xc5\x67\xca\xe5\x03\x57\x0d\x00\x39\x95\x0f\xd0\xd3\x07\x18\xef\x6d\x02\x1e\x4a\xb0\x93\x64\x09\x97\x5c\x84\xbb\xc2\xd1\x77\x45\xf4\xdc\x19\x99\xb4\x27\x80\xe2\xc3\xdc\x74\x32\x93\x3b\x5d\x5f\x84\x2f\xcd\xc4\x25\x67\xc1\xcb\xc7\x75\xbc\x88\xad\xa3\xbe\xd2\x38\x67\xa2\xd2\x7a\x56\x5f\xb7\x81\xa9\x6f\xc3\xa3\x5f\x5f\x03\xd6\x86\x06\xf7\x08\x1a\xc5\xf9\x89\x1b\xd2\xb2\x73\x38\x0f\xe8\x6f\x54\x71\xd8\xe0\x3d\xc0\xd8\x35\x44\xef\xdb\x29\xa0\x7b\x22\xf3\xd0\x95\xcd\xec\x4e\x8c\xd0\x88\x1f\x1e\x92\x33\x0f\xd7\x0c\x05\xf7\xa4\x27\x12\x5e\x44\xe8\xcf\x00\x85\x0f\x40\xaf\x00\x6b\x0a\x7f\x37\x3c\x80\xbf\xb3\x0d\x4f\x98\x83\x34\xc9\xec\xae\x58\x7a\x1e\x1e\x0a\x90\xd2\x74\x58\x02\x4d\x66\xa2\xc9\x04\x9a\x34\x47\x40\xfb\x50\x9c\x3a\xf8\xdc\xe0\x5a\x46\x0f\xe5\x1c\x09\xc3\x26\x61\x7d\x13\x99\x58\xee\xd3\x5d\xde\xa7\xbb\x2f\xf4\xe9\x0e\xea\x21\x3a\x09\x7a\xa7\xf5\x69\xd3\xa0\xca\x83\x03\x7d\xea\xd0\x70\xb0\x4f\x79\x46\xec\x9e\xe8\xd3\x1d\xf6\x49\x27\x91\x14\xc4\x79\xf4\xf0\x80\xb1\x58\xf1\x62\x02\x65\x8a\x4a\xb7\x0d\x7a\x64\x91\x39\x2d\xfe\x9d\xdd\x09\x8d\x35\x1f\x7b\x14\x90\x97\xe5\xa3\x23\x47\x69\x24\xe0\x52\x0e\x0d\x1c\x07\xe6\xac\x63\xa6\xb6\xaf\x76\x80\x11\x01\xdf\x99\x9a\x98\x67\x49\x72\x22\x20\x31\xb3\xdc\x5c\xb8\xfa\x46\x5a\x7a\x86\x27\xdf\x1f\x9a\x06\x39\x51\x3c\x73\xfe\xde\x07\xac\x09\xa3\x5d\xf0\x02\xf5\x00\x3e\x40\xfb\xfa\x4e\xa3\xd0\x89\x1c\xc0\xd2\xfc\x3f\xf9\x68\xbe\x4e\xdb\xd6\x27\x6d\x5b\xbf\xd2\x2c\x43\x43\xfb\xa9\xa6\x03\x80\x94\x8e\xaf\xe9\x48\xe8\x17\xb7\x68\x5a\xfa\x1e\x69\x16\xfb\x15\xfc\xdd\xd7\xbd\xf3\xc6\x13\x8f\xd1\xff\xa7\xb6\x1e\xdc\xd6\xd3\x0e\x4a\x2a\x09\x64\xcd\x63\x51\xaf\x12\x22\x79\xe2\xc2\x44\x5b\x1e\xca\x09\xc6\x5f\x79\xef\x97\x84\x38\x78\xbc\x4a\x85\x58\x73\x9c\xda\x45\x9f\x38\xf2\x41\x18\xe3\x8e\xfe\x3f\xc5\xfb\x7d\x8f\xf9\x08\x0d\x9a\x8f\x27\x9b\x74\x8c\x8b\x39\xb4\xa5\x68\x0f\x0d\xae\x9f\x49\x39\x1f\x19\x3a\xa3\x0a\xe9\x13\xb5\x65\x97\xc4\xdd\x08\x1e\x92\xb4\x88\xa1\x3f\x48\xd6\x3c\x59\x63\x17\x8b\xad\xb1\xd8\x0a\xc8\x91\xa7\xea\x0f\x87\x8d\x5a\x0d\x0b\x2e\x88\xf8\xf0\x99\xf4\x16\x2c\x74\x3d\xf9\x7d\x48\x6e\x68\xab\x5c\x9b\xed\xd9\xbd\xab\x49\xe9\x4a\x9f\xe4\x70\xd6\x75\xe8\x31\xc4\xd3\x49\x23\x5f\x0a\xcf\x68\xb3\x08\xea\x91\xee\x4a\x95\x76\x29\x99\xf9\xed\xa7\x01\x26\x96\x11\x4f\xa5\x7f\xa3\xec\xe1\x21\x3b\x2b\xbc\xc8\x85\x8d\xb4\xee\xd5\x8b\xcd\xd1\x94\x55\x04\xd1\x02\x78\xbe\x76\x86\xc1\x53\xe0\xf9\xed\xce\x78\x94\xa7\xd3\x7c\xc8\x2d\x31\x62\xa5\xe5\xe0\x68\x3a\x0e\xa3\x5d\xfb\x99\xb2\xdf\x62\xf2\xb2\x6a\xa0\x59\x2e\xbb\x22\xdf\xda\xfb\xc4\x7f\xd1\x8a\x1f\xdf\xfa\xe1\x0f\x74\xe9\xfa\x48\xbd\xa9\x81\x06\x6c\x30\xa5\x2a\x77\xd5\xf5\x95\x4e\x18\xe6\x16\x93\x28\x6e\xb6\x46\xe1\x99\x37\xf2\x1a\x0d\x33\x6d\xf0\x12\x3c\x35\x2b\x49\x9a\x6d\x11\xf7\xee\x5e\x46\x7d\x0f\xf8\xfd\x3c\x88\xa2\xd8\xde\x30\x0c\x8e\x60\x6f\xe8\x3e\x9e\xf2\xb4\x84\x25\x76\x85\xe6\xe3\x8f\x3e\xfa\x58\xed\x60\x84\x5c\xfc\xbb\xca\x90\xd8\x11\x15\x6e\xa0\xc2\xc4\x06\x74\x06\xff\xd6\xf0\x2f\x26\xdb\xd1\x8e\x5e\x6b\x54\xa5\x4c\xf9\x93\x6f\xec\xb4\x0b\xf4\x14\xf4\xdf\x81\xb3\x82\x5a\x81\x05\x66\x01\x35\xc4\x10\x7d\xa2\xe0\x81\x5a\x3b\xa7\x0b\x3a\x72\x9f\x9c\x1a\xb5\x96\xe5\xd5\x4c\x76\x97\x0f\x69\x1f\x7e\xcd\x22\x0a\x44\x13\xad\x6e\x69\xc8\x87\xb2\x51\x25\x94\x4f\xeb\xfd\x3a\xba\xad\xe8\xfd\xf7\x15\xbd\x67\x1d\x01\x1e\xb3\x80\x3a\xad\xd6\x8a\xe2\x7a\xed\x30\x6c\x58\x5c\x51\x88\x3e\x75\x5a\x03\xbd\xb0\x70\xe4\x5e\x65\x40\xff\x0b\xcc\xc7\x94\xdd\x03\xde\xa3\x4b\x82\x1a\x73\xec\xc9\x64\x3a\xdd\xea\xa5\x5d\x58\xa6\x8b\x28\xde\x74\xac\xc7\x3a\x20\xdb\xc0\x18\xa3\x74\x4b\x7a\x15\x54\xd5\xd1\xfd\xaa\x3a\x2e\x0f\xd4\x71\xf5\x35\x95\xdc\x1e\xa8\xa4\xca\x8b\xf2\xc1\x4a\x2e\x02\xb9\x6e\xae\xe0\x18\xee\x5a\xc3\x6e\x77\x08\x33\x34\x3c\xee\xf7\xe1\x85\x75\x4f\xbb\xfd\xc1\xc9\x09\xeb\xf4\xad\x5e\xff\xb8\x7b\xc2\x4e\x8f\xbb\xf0\x3e\x60\xa7\x9d\xd3\xe3\x4e\x0f\xd6\x5d\xff\xd4\x3a\xee\xf5\x2c\x76\xd2\x1b\x0c\x8e\x3b\x90\xd0\xed\x0d\x4f\x3b\x27\x43\xd6\x19\x0c\x86\x9d\xe3\xc1\x94\xae\xbc\xce\x81\xaa\xbe\xd4\x1b\xe8\xf4\x07\xfd\x7e\x5f\x6b\x09\x1e\x06\xa7\xc3\xe3\x6e\xd1\xa4\x65\x41\x35\xa7\x5a\xdb\x98\xc5\x3a\xee\x77\xf3\x4e\x74\xba\xa7\x83\xc1\xc9\xb0\x53\xf4\xa6\x0b\xc9\x1d\xac\x56\x75\xab\x33\xec\xf6\xfa\x9d\xd3\x7e\xd1\xbf\x9e\x75\xda\x3d\xb1\x8e\xb5\x8e\x42\x3f\x4e\x06\x27\xa7\xaa\xc7\xd0\x72\xbf\x63\x41\x13\x45\xd7\x6f\xa1\xeb\x3d\x6c\xfc\xf8\x98\x0d\x7a\xa7\x90\xed\x94\x1d\x5b\x7d\xeb\x18\x7e\x3b\x56\x77\xd8\xef\x42\x3d\xc3\x41\xe7\xd4\x3a\x3d\x66\xa7\xdd\xce\x70\x00\x2d\x76\x3a\xa7\x9d\x41\xa7\x03\xf5\x41\xd3\xc3\x61\x6f\x08\x5f\xac\xee\xe9\x69\x0f\x9a\xee\x77\x87\x27\x16\xb6\x08\x1d\x80\x0e\xe3\x03\x94\xed\x75\xd9\xc9\x70\x38\xec\x0c\xe1\x0b\x14\x1a\xc2\x20\x70\xf4\xfd\xd3\x61\xbf\x87\x59\x8e\x8f\x7b\x00\x20\xe8\xfc\xf1\xf0\x04\x12\xac\x93\x5e\xbf\xd7\xed\x63\xfd\xdd\x93\x01\x56\x07\x80\x3b\x1d\x0e\xfa\x45\xc7\x2f\xb0\xe3\xdd\x7e\x1f\x60\x01\x1d\x46\x00\x58\x38\x3c\x6b\x38\xec\x62\xbf\x2c\xf8\x86\x60\x83\xc2\x03\x6b\x00\x55\x62\xe3\xc7\xc3\x3e\x3e\x74\x07\xdd\xc1\x29\x3e\xf4\xfa\x30\x11\xac\xd7\x1d\xf4\xac\xe3\x21\x3b\x1e\x0e\xba\xfd\x63\xac\x65\x68\x1d\x5b\x16\x94\xe9\x75\x2c\xa8\xa0\x0f\x5f\x4e\xa1\x1f\x88\x8a\x7a\xa7\x50\x6b\x57\x40\x18\x7b\xdc\xe9\xf7\x00\x42\xa7\x1d\x04\x51\x0f\xa0\xc8\x4e\x4f\x86\x27\xd0\x22\x02\xa2\xd7\x3f\x01\xa0\x76\xfa\xdd\xe3\x63\xeb\xa4\x93\xf7\xbc\xc0\x2e\x40\x00\x86\xa9\x5f\x69\x2c\x1f\x46\xb8\xc7\x27\x25\x74\x22\xb2\x7f\xae\x0c\xbe\x10\x19\x56\x15\x06\x4a\x97\xb1\x97\x2c\xa3\x60\x56\xa5\xd0\x0e\x4d\xb4\x06\xd3\xfd\x42\xfe\x0c\xb0\x51\xc9\x12\xa8\xd0\xd5\x8d\x0c\x3d\xfb\xcd\x42\xda\xfe\xc3\x13\x90\xf4\x87\x03\x56\x88\x93\x38\xe7\xac\x2c\xd6\xf0\x0e\x85\x62\x0c\x4a\xd9\x0e\xe8\x44\xa2\x00\x22\xaa\xfe\xd4\x7c\xef\x90\xb1\xe3\xc1\x8f\x52\x2d\x92\xb4\x21\x51\x46\xbb\xe0\xc9\xd9\x7c\x6c\xd9\x1d\x72\x27\x75\x16\xd0\x1d\x0b\x86\x81\x01\x0a\x92\xaf\x81\xf2\x3f\xe3\x1f\x1c\x33\x3f\xb6\x03\xb6\x30\x1b\x06\x79\xe7\x63\x9d\xe6\xc2\xb4\x6b\x35\xb3\x51\xfb\xab\x26\x54\xdc\x0a\x57\x55\x68\xa0\xc9\x2e\xd9\x2d\xbb\x60\xd7\xec\x35\x9c\xda\x2f\xe0\xdf\x5b\x64\xb9\xd1\xb6\x71\xc5\x8d\x86\x5b\xdd\x47\x54\x50\x6e\x77\x4d\x72\xf3\xe4\x03\x49\x7b\x1d\x14\x57\x99\x46\x58\x0f\x1b\x41\x3d\x30\xed\xc6\x01\x6d\x4d\x86\x52\x8c\x17\x75\xe0\x44\x01\x94\x28\xd6\xe6\x69\x6a\xcc\xda\x41\x3d\x0f\x6a\xb0\x42\x57\xa8\xa8\x56\xfd\x5a\x7c\x0a\xcb\x9f\xf0\xaa\xea\x1e\x18\xa5\x7a\x1e\xb6\x2a\x69\xbc\x30\xd9\x39\xd7\xaa\xa0\x94\x3b\x3d\xcf\xbc\x09\x29\x57\x7a\x1e\x4c\x21\x98\xbc\x2c\xc1\x1b\x88\xb7\x17\xe6\x73\xfe\xc9\x51\x10\x7f\x71\x74\x94\x44\x86\x04\x98\x89\x12\xa1\xff\xbc\x14\x0b\xe6\x33\x10\xff\x0d\x94\x74\x8e\x4a\xdd\xf9\xbc\xd3\x99\xcf\xd8\x95\x2b\xa2\xae\xa5\x73\x4f\x60\x3c\x85\x1a\x00\x1c\xf1\x97\x3c\xd4\x7b\xf9\x1a\x30\x1e\x0f\xf5\x5e\x42\xca\x85\x9e\x27\x69\x40\xca\xb5\x9e\x07\x53\x68\x24\x9f\x8a\x91\x24\xcd\x79\xa3\x5b\x7f\x5d\x1a\xc9\x6b\x1a\x89\x9c\x72\x1c\x09\x2c\x8f\xff\x7c\x12\x63\x79\x93\x8f\xa5\xd4\xa1\x37\x3b\xdd\x79\x83\x9d\xb9\xd6\xc7\x72\xc9\x6f\xc5\x58\x94\xf9\x6d\x49\x9d\x37\x00\x7a\xa5\xdd\x65\x8d\x43\xe1\x54\xcc\xb3\x16\x9c\x35\xd0\x05\x1e\x9c\x85\xff\x59\x50\x4f\xb1\x3b\x1f\x24\x77\x75\x31\x9e\x40\x7f\xa7\xd2\xb7\xd2\xdd\x78\x02\xf3\x30\xb5\xdf\xc4\x06\x3d\xb0\x09\x0c\x04\xfe\xc2\xc4\xc0\x5f\xcc\x68\xb2\xf7\x7c\xd3\xfc\x80\xec\xf4\x2b\x7e\x0e\x0f\x40\x0f\xbe\xe3\x77\x22\xe5\x57\x7e\x25\x52\xfe\xe6\x9d\x22\x86\x46\x11\x65\xc3\x78\x5f\x7f\xd7\x78\x55\xff\xd5\x6c\x6b\x41\xcf\xde\xd7\xdf\x43\xda\x2b\x53\xa3\xef\xdf\x41\xb6\x5f\x21\x1b\xde\x94\x9b\xec\x3b\xcd\xea\x18\x9b\xa9\xe3\x9f\x06\xb6\x53\xff\x40\x4a\x8b\xb9\x03\x97\x3b\x01\xea\x1f\x0a\x38\xad\x19\x40\xe8\x3b\x68\xef\xef\x46\x07\x16\xf6\xcf\x7c\x1e\x19\xe5\x81\xcb\x11\xd2\x68\x03\xf6\x03\x7a\x35\xfb\x11\x73\x69\x63\x96\xe9\xa3\x35\xcc\xe8\x0f\xe3\xb7\x42\x00\x56\x3b\xaf\xb1\x9f\x71\xd0\xb5\x17\x35\xf8\x5c\x63\xf4\xf7\x1b\xeb\x1b\x0b\x9e\x6e\xe0\x09\x3f\x77\xc4\xe7\x80\x3e\x07\xf4\xb9\x86\x38\xe3\x3f\xb0\x4c\x7e\x96\xce\xb5\x7e\x96\xe1\x9e\x7e\x94\xef\x3f\x2a\x4f\x5b\x58\x66\x41\x15\xfd\xa8\x2a\xaa\x6e\xe7\x47\xbc\x99\xb3\xbf\xd4\xaf\x4e\x39\xbf\x58\x5c\x5a\xa1\x0d\xe5\x3d\xd7\xc0\x79\x21\xc0\xf9\x67\x09\x9c\xa1\x00\x67\x13\xc1\xf9\x17\x01\x4a\x5b\x28\x21\x6b\xfe\x89\x10\xfc\x8d\x3e\x10\xec\xca\x0b\x4b\x40\x55\x66\x23\x80\xfe\x99\x03\xf4\x4d\x8d\xfd\xa6\x3a\xfe\x27\x75\xe6\xcf\x9d\x81\xfe\xa6\xe0\x10\xd2\xe7\x50\x02\x94\xc0\xf9\x9b\x04\xdf\x6f\x12\x9c\x7f\xc9\xf7\xbf\x74\x70\x02\xe8\xa9\xa2\xbf\x54\x45\xd5\xed\xfc\x55\x02\xe8\x97\xfb\xf5\xd7\x3e\x40\xa1\xd0\x25\xe5\xbd\x3d\x0c\x69\x29\x32\xbd\x3b\x3a\x52\x1f\xf7\xd6\xca\x4b\x6d\x15\xdc\xd1\xf3\x95\xc9\x2a\xda\x90\x55\x5d\x94\xaa\x2a\x43\xe9\x53\x09\x02\x17\xf4\x76\x9d\x73\x8b\xaa\xd8\x5f\x35\xac\xff\xef\x08\x26\x1b\x8e\xb5\xd2\xb5\x7e\xa1\xef\x59\x3b\x87\xb1\x37\xc2\x06\x34\x82\x7f\xc5\xb3\x58\x62\x8d\x14\x9f\xe0\xb7\xf9\xf8\x67\x19\x20\x99\xfb\x11\x5e\xcb\x46\xe8\xde\x38\x62\x3e\x1c\x75\xe8\x65\x18\x65\x6b\x6e\x84\x4e\xf6\xa2\xe2\x2a\xc8\x0f\x43\x2f\xfe\x9a\xf8\xb9\x5e\xa1\x15\xe5\x49\xad\xda\xaf\xab\x60\x57\xad\xca\x8d\xe2\xaf\xec\x42\xc6\xcb\xfa\x52\x6b\x67\xf6\x35\xc5\x7d\x9e\xd2\xe9\x7f\x1d\x14\x7a\x57\xfe\x7f\xa3\xfd\x1f\x15\xfd\x88\xbe\xde\x02\xc0\x29\x4a\x3b\x5f\x6f\x05\xe0\x16\xa5\x0f\x44\xb0\x56\xd4\xa1\x71\x88\x26\x6c\x7c\x73\x90\x0c\x44\xcd\x27\x28\x78\x80\x14\x84\x82\x87\x22\x7e\xb7\xbb\x40\x0a\xca\xd5\x35\xc9\x8f\xe3\xd4\xac\x87\x4c\x8b\xfe\x44\x91\x27\xa4\x6e\xf5\x75\xc0\x6b\x4e\x96\x46\xb5\x91\xa4\x77\xab\x43\x30\x7e\xb3\x04\x62\x46\xf2\x9d\xaf\xf7\xdc\xdc\x2d\x22\x56\x13\x8f\x4d\x37\x88\x12\x6f\x56\xb3\xd7\x11\xc3\x18\x7d\xf6\x0d\x7c\xc2\x87\xe6\x95\x37\x8f\x62\xaf\x66\xaf\x54\x82\x33\x87\x95\x5b\xb3\x37\x11\xbb\x72\x12\x3f\xb1\x2f\xe0\x03\x3d\x35\xa3\xb5\x17\xd6\xec\xeb\xfc\x5d\xd5\xf9\x1a\xb2\x92\x1b\x2e\xfb\x05\xec\x23\x47\xf0\xc5\xf6\x15\xe4\x53\x2f\xb2\xe8\xb9\x9e\xa4\x4a\xdf\x45\x6c\x15\x85\x51\x1a\x85\x9e\xfd\x21\xda\x9a\xa3\xd7\xc1\x01\x2f\x54\x69\xeb\xda\xdb\x50\xdc\x03\x51\x96\xb7\x65\x25\xff\x90\x0e\x07\xf3\xab\xec\x17\x01\x46\xa0\xed\xb6\x81\xa9\x82\x7f\x80\x4e\xdf\x52\x02\xbe\x74\x45\xc2\x4b\x99\x30\x94\xb9\x86\x53\x1d\xd0\xa4\x4b\x56\x96\x86\x88\x55\x03\xe0\x7e\x1f\x15\xa2\x42\xa5\x73\x86\xbe\x6d\xa4\xb5\x66\x48\xbe\x61\x44\xd0\x5a\xf4\x73\x93\x27\x6f\x50\x0b\x71\x15\x29\x8d\x70\x0e\x00\xde\x14\x6f\x00\xfe\x9c\xb1\xa9\x0c\x35\xf6\x8a\x26\x5a\xcf\x74\xb0\x93\xaf\x9e\xd8\x49\x1d\xc9\x41\x8a\xa5\x7d\xb5\x76\x50\x18\x24\x75\xb4\xcf\x9d\x83\x43\xd4\xb1\x05\x24\x68\x75\x6e\x2c\x1d\x17\xc0\xbb\x56\x21\x3c\x87\xf9\xd8\x1e\xf3\xb1\x16\x16\x2e\xde\x53\xb1\xcb\x7c\x16\x92\x97\x62\xf5\x1e\xd1\xfb\x48\x9d\x1d\x35\xe0\x7b\xd6\x56\x23\x36\xdc\x56\xcc\xe0\xb1\x83\x37\x89\x9d\x26\xfc\xb1\x80\xaf\xf2\x0c\x17\xf8\x8f\x71\xa6\x7f\xa5\x07\x0b\x70\x68\x91\x18\xc0\x43\x80\x89\x50\x8f\x7c\xc6\x44\xa8\x27\xa0\x7a\xb2\x22\x35\x2f\x4f\x5c\xda\xce\x91\xa6\xdd\xde\xf1\x92\xc9\x10\xfa\xbd\x57\xef\x19\xa3\x98\x4f\xae\xfe\x8e\x8c\x24\xda\x14\x95\x93\xe4\x20\xef\x63\xdb\x67\x8e\x65\xc3\x41\xd6\xb1\x13\xb6\xb6\xec\x89\x5f\xd0\xfc\x11\x54\x5e\x50\xfc\x91\x39\x65\xeb\x4e\x29\x43\x52\xca\x40\x21\x19\x75\xcd\x32\xcd\xf0\x02\xe6\xdc\xe2\xd0\x71\xc7\xa2\x28\x2c\x1d\x7a\xee\xec\xdc\x9f\x16\xf6\x4c\xbb\x27\x72\x0d\x10\xa4\xe1\x9d\x7d\x72\x00\x34\xac\x03\xaf\x69\xe5\xe5\xa6\x2c\xfc\x0b\x9c\xdc\x58\x46\xb8\x88\xf0\x31\x38\x64\xc4\x37\x31\x1c\xd6\xef\xf0\xb0\x86\x63\x3b\x80\x63\x7b\x6f\x91\xff\x57\x67\xcc\x6e\x08\xc8\xc7\x8f\xc9\xf2\xe9\xf8\x35\x81\x1e\x77\x4f\xc6\xaf\x3d\x59\x77\x4f\xb7\xaf\x3b\x59\x83\xa2\x74\xb0\xd5\xf6\x1b\x20\x91\x45\xb4\x23\xfb\xad\xd2\x4b\xf5\x77\xb4\x94\x50\x01\x6e\x47\x4d\x3a\xc3\x2b\x7f\xc3\x6f\x6d\xe0\x8c\xdc\xe0\x71\xe9\xf2\x89\xcf\xee\xef\x6c\x1f\x10\xce\x06\x81\x7d\x8f\x57\xf4\xf2\x39\xca\xaf\x50\x5d\x2e\xe2\x31\xc0\xca\xa7\x2d\x8b\x3c\x57\xed\xff\x4f\xdb\xd5\x38\xb5\xad\x2b\xfb\x7f\xa5\x78\x2e\x8c\xdd\x38\x21\x90\x53\x7a\x6f\xa8\xc9\xf4\xd0\x76\xe8\xb9\xd0\xf6\x95\x94\x7e\x30\x39\x8c\x49\x1c\xe2\xd6\xb1\x53\x7f\x00\x29\xe1\x7f\x7f\xfb\x5b\x49\xb6\xec\x38\x9c\xd0\x79\x6f\xce\x29\xb1\xbe\x77\xa5\xd5\x6a\x25\xad\x76\x0f\xf1\xb1\x43\x1f\x4f\xf0\xb1\xab\x3e\x3a\x03\xa9\xf6\x33\xc5\x03\xc9\x39\xb4\xe0\x3f\x45\xfa\x0b\xf5\xf5\xdd\x79\xa6\xd2\xd3\x9a\x52\xf4\x7d\xcc\x58\x56\x05\x3e\xcd\x91\xfe\x9a\xf2\x5e\xfe\x46\x72\x69\x24\x56\x72\xf6\x4a\x3e\x13\xae\x3e\x3e\x45\x42\xd5\x33\x6f\xbf\xe8\x8b\x3a\x98\x1e\xb8\xc4\xf3\xcc\xef\x11\x34\xa3\x2d\x4d\x67\x1e\xcd\x25\xf3\xe9\x65\xb4\x9a\x3c\xf2\x39\x6b\xfe\x92\xcf\xd8\x4a\x34\x11\x5b\xd6\x62\xf1\x3e\xb2\x4c\xaf\x1a\x2d\xc7\xf1\x08\x08\xbc\xd1\x86\x90\x7d\x21\xfd\xd6\x00\xae\xaf\x85\x55\x19\x3e\x21\x41\xfd\x2a\x24\x28\x69\xab\xf7\x3d\xf1\x9a\x38\x4a\xea\xae\xe0\xb4\x53\xb2\xed\x67\x85\x46\x1c\xe8\xb7\xd9\x79\x9a\x32\xe3\x6b\xd2\xcf\x91\xf8\x39\x53\xd1\x47\xbc\x2f\x39\xcb\x13\x39\xf2\x8c\x23\xf3\x24\x95\xb1\xa9\x27\x89\xe2\xb4\xa8\xd8\x34\xfe\x24\x32\xd5\x3c\x12\x2a\x01\x65\xee\x3e\x3d\x0e\xd8\x0f\x51\x4a\x1f\xfb\xfa\x6e\x0a\xf5\x1e\x1b\x0d\x8f\x80\xe4\xad\x25\xef\x94\x28\x9a\x23\xd0\x02\x6b\x0b\xd4\xbc\xeb\xd2\x1b\xa8\xe0\x5c\x60\x7c\xcc\xf5\xc9\xc0\x13\x15\x90\x4d\xe4\x01\x34\x63\x28\xe7\x0a\xcd\x51\x74\x13\xd6\xbc\x1c\x2c\x21\xf4\x33\x10\xc8\xfc\x0c\xb4\x96\x01\xbd\xa7\xb7\xe9\xe9\xed\x20\x54\x6e\x28\x9b\xfd\x76\x33\x4d\xbd\x9d\x52\x33\xa2\x15\xf1\xb2\xa9\x98\x31\x7d\xa2\xe3\xc4\xa1\x49\x41\x62\x6b\x62\xca\x43\xbd\x40\x6b\xab\x63\xd9\xc7\x32\x0c\x17\x9b\x9d\x36\x7c\xec\xee\x5f\x48\xdb\xc1\xfe\xd2\xc4\x2d\x79\xa0\x73\xfa\xc1\x62\xd1\x68\x7c\x0a\x68\x3b\xfb\x25\x82\x67\x1c\xb6\xb7\x13\x39\x1f\x29\xfe\x0e\x96\xa7\xba\xaf\xdc\xd4\x6b\x85\xb8\xf6\xb3\x61\xdb\xb9\x7b\x9a\x41\xe4\x72\xe7\x30\xbb\x9b\x09\x4d\xc7\xee\xee\xb3\xf6\xbd\xb0\xe8\x34\xd4\xdd\xd7\xb1\x51\xa7\xe1\xbe\x75\xe7\x4b\x03\xb3\x54\xb7\x50\x8a\x93\x26\x15\xe1\xa3\xce\x85\xaa\x09\x95\x1c\xe7\x4f\xaa\xa8\x58\xf2\x62\xcc\xfa\x50\xc1\x79\x32\xb0\xb6\xb6\xfe\x15\x99\x1e\xbb\x93\x60\x4b\x77\xa9\x7a\x65\xa9\x74\x91\xbf\x46\xec\xe8\x1a\xe6\x10\x2e\xa4\xf1\xdf\x38\x9b\xd5\x5a\x98\x17\x8e\xd3\xb0\x2d\x50\xb6\xdc\x5f\x05\xdd\xb7\x91\xc9\xc8\x5b\x72\x13\xd4\x0f\xec\x8f\x81\xfd\x2a\x70\x44\x02\x91\xff\x07\x7e\x1b\xfa\x09\x9a\xb4\x1f\x84\x04\xe5\x5c\x08\x61\x8b\x92\x5a\xde\x74\x96\xce\x11\xc1\x1f\x88\x81\x0a\x26\x22\xf0\x8b\x30\xf3\x94\x0b\x61\x84\x2e\x37\x13\x5d\x1d\x1b\x5d\x4a\x82\x70\x54\x64\xea\xf5\x83\x9e\x1e\x66\x07\xe7\x5d\xd0\x09\x09\xbf\x92\x9f\xea\xc9\xd2\xc9\x48\x11\xa3\xf9\x87\xfb\xc0\x20\x8b\x82\xce\xaa\x17\x82\xdc\x4d\xfe\x08\x2f\x1a\xf0\x15\xba\x53\x2f\x99\xb9\x43\x8f\xdf\x8a\xee\x87\xce\x3b\x28\x0a\xa8\x81\x7c\x60\xe0\xa3\xdf\x1b\xf8\x58\x0d\xbc\x99\xeb\xfa\xc4\xd0\xf8\xbf\x80\x7d\x84\x8b\x0b\x22\x05\xd7\xb2\x7a\xa6\xa1\x22\x0c\x5f\xd8\x64\xf1\xf2\x2c\x4e\x91\xdb\xb2\x25\xf9\x30\x8d\x9c\xfb\x03\xe8\x9d\x16\x44\x44\x5c\x5f\x3e\x95\x83\x6a\xaf\x46\x52\x70\xac\x93\xc1\xf0\xb5\xea\xad\x97\x15\x77\xac\x95\x47\xaa\x79\xa7\xb9\xd5\x4e\x1b\x8a\x4e\x3b\xd4\x3b\x0d\x06\x52\xa4\x57\xc7\x02\xfb\xe0\x45\x52\xbc\x27\x19\x4b\x97\x8f\x03\xb6\x7a\xac\xbd\x33\x64\xa3\xc1\x57\x6c\x96\x28\x76\xc6\xe7\x93\x01\x4d\x30\x27\x86\xb1\xb4\x68\x60\xd7\x77\xd8\x84\x76\x28\xf6\xb0\x6e\x30\x66\xa8\xfb\x3a\xb7\x9e\x82\x47\xfb\x2f\xae\x69\x08\x32\xc7\x3b\x9f\xc9\xb9\x97\xd9\x33\x1b\xfe\xe6\xfd\xbc\xdb\x32\xbd\xa3\x86\x48\x14\x1d\x25\xfc\x39\xad\x24\x2b\xea\x86\x42\x27\x6a\x23\x57\x88\x62\xad\x9c\xf7\x98\x80\x39\x58\xc2\xb5\xa7\xde\x3b\xd1\x81\xbf\xef\x37\x1a\xd6\x5d\x56\x87\x86\xf0\x49\xca\x8f\x25\xf9\x21\x73\x8e\x0f\xec\xdc\xb9\x54\x0c\x0e\xea\xa8\x8b\xd8\x51\xe5\x72\xff\xb8\x36\xde\x42\xa4\xf9\xe3\xe5\x02\xb9\xcc\xae\x0c\xa6\x1c\x65\x81\x6f\x7a\xe3\x79\xd5\x29\x5c\x80\x03\x62\x88\x2b\xc4\xb0\xbf\x42\x9a\x78\xb1\x2b\x1c\x3c\x82\x63\x98\x96\x78\x29\x2c\xaa\x67\x71\x88\x44\x8c\xaf\x52\xea\x91\x6f\x05\x75\x09\x25\x2d\xe5\x17\x0e\x02\xc1\x04\x8a\x45\x8a\xc4\xef\xac\x94\x29\xf1\xc4\x01\xe9\xbd\x40\xc4\x4d\xd3\xb8\x82\x87\xb6\x81\xa3\x16\xd8\x5e\x3b\x57\x5c\x18\x9b\x77\x4b\xaf\x6b\xea\x33\xbd\x3b\x85\x73\x60\xee\x39\xb7\x15\x44\xd4\xf5\x56\x69\xc7\x56\xb0\x3c\xc9\x8f\xbd\xae\x19\x36\x1c\xc3\xa8\xea\x68\xa5\xca\xef\xec\x95\x6e\xef\xde\x2d\xde\x35\xc1\x58\x30\xab\x7a\x61\xb6\x87\x56\xe9\xb5\x83\x30\x22\x5f\x2a\x68\xa7\xec\xb5\x00\xff\x95\x5f\xb2\x54\xe0\x89\x1f\x03\x4f\x0d\xb6\xbf\x07\xdf\x72\x45\x1a\xbc\x78\xf0\xb9\x44\x3e\xf2\x8d\xf6\x13\x62\x85\xa1\x25\xdc\xdc\x52\x65\x50\x62\x84\xdd\x99\x7d\x6d\xfd\x93\x0f\x72\x34\x57\x01\xc0\xf3\x28\xeb\x4e\x33\xa1\x22\x1a\x26\xb8\xb8\x0f\xfc\xf1\x5c\xd3\x07\xfb\x16\x09\xfa\x33\x50\x6d\x8b\xf6\xe3\xb4\xd7\x96\xa0\xf5\xfc\x6e\x56\x90\x51\xbf\x66\x4e\x94\x0e\x03\x3c\x4d\x03\x5c\x13\xe6\xe5\xd4\x2a\x0d\x6f\xa6\xe9\x3b\x6f\x6d\x3d\x3c\xa2\xc4\xdc\x85\x1f\x8a\xd2\x59\xc2\xfa\x8d\x51\x97\x67\xb2\xcb\x33\x39\x76\x6b\x37\xbe\x5c\x56\x01\x23\x0f\x6a\x56\x74\xaa\x70\x90\x80\x0e\x33\x8b\x7e\x95\x35\x10\xe5\x79\x72\xf9\x49\xe7\x41\xc9\x49\x98\x70\x47\x57\xcc\x22\x05\x11\xf2\xc9\x09\xf8\x21\x8e\x66\x5e\x9c\xa2\x31\x9d\xbe\xbd\x0a\x7d\x7b\xbd\xac\x6b\x7a\x75\xf4\xcd\xcf\x19\x85\xf7\x61\x74\xd3\x61\x34\x9d\x11\xa2\xa3\x53\xb4\x51\x70\x22\x4e\x53\x6d\x9d\x89\x27\x32\x39\x76\xfe\x06\x3b\x61\xa1\xb5\x64\x0a\x65\x4e\xcf\x2a\x19\x41\xd3\x40\x4e\x8a\x3a\x70\x54\xc0\x86\xe6\x04\xa9\x0b\x52\x5d\x52\xee\xa4\x19\xd0\x39\x88\xf8\x5d\x9e\x72\x28\x53\x2c\x27\xd6\xdd\xee\x41\xc4\xb2\x83\x61\x88\x15\x22\xd6\x66\x05\xb7\x48\xdc\x9f\xbd\xe4\x79\xe5\x89\x11\x53\x89\xfb\x2a\xbd\x0b\x10\x31\x30\x1e\x3b\xee\x51\x03\xb2\x44\xe7\xd5\x51\xc9\xea\x1f\x82\x43\x58\xf8\xcd\x8e\xcd\xa1\x8d\x34\x7a\x7c\xa8\x2b\x23\xd9\x95\xf7\xab\x56\x9d\x0e\x4c\x7a\xa2\x9f\x6c\x9d\x14\x0b\x94\xe5\xbc\x4e\xbd\xdb\x5a\x71\x3a\xef\x24\x64\xc0\xcd\xdd\x99\x14\x04\x04\x11\xd6\x1c\x3e\xd4\x2e\x86\x85\x54\x0e\x5b\xe2\x9a\xdc\xba\xcc\x75\xd9\x17\xee\x79\x38\x68\x0d\xa3\x2c\x4c\x5f\xec\x32\x47\xe5\xf2\xe2\x0d\xe6\x3b\x5a\x3f\x79\x29\x17\x10\x1c\xe2\x89\x89\xe8\x6c\xb9\xd2\xad\x70\x50\xa3\xd6\x6b\x6f\xdd\xf5\x7a\xa7\xb4\x5e\x7b\x03\xe2\xb2\x5c\x77\xd7\x5c\x29\xe2\x48\xf7\x38\x75\xda\xbc\x96\x2d\x97\xf7\x1c\x32\x9c\x88\x68\xd5\xc2\x1a\xb0\x40\x80\x77\x5f\xff\x5f\x18\x88\xad\x9d\x84\xa5\xd6\x9a\x73\x01\xa0\xcd\x04\x1e\xeb\x25\x9d\x46\x9d\x74\x85\x7c\xf7\x5d\x61\x04\xb9\x0e\x3f\x51\xb4\x40\x30\xab\x3e\xa0\xfb\x3f\xc6\x51\x6d\x5b\x7f\x0b\x4d\x05\x5c\xae\xf2\x85\x7b\x8c\x7a\x9c\x05\xd2\x7a\x46\xab\x1e\x7f\x55\x67\xde\x05\x98\x0b\x8f\x13\x2b\x57\xc8\x04\x62\xf9\xa1\xdd\xac\x4f\x5b\xfd\xfd\x34\x9e\xdf\xf5\x03\xc7\x5b\x22\xb6\x54\x20\xf9\x91\xb6\x66\x42\x4a\x54\x38\xe1\x81\x45\x79\x1c\x69\x39\xc1\xd5\x5b\x30\x47\xee\xcc\xa6\xea\x7c\xa9\xf7\x53\xad\x34\x3f\xf2\x95\x92\xe7\xbe\xe9\x0b\x4f\x07\x8b\x85\xfa\xaa\xf7\x68\xc0\xfe\x04\x8c\x7c\x1f\x6f\xd0\xc6\xbc\x25\xbb\xe1\xbe\xcc\xb0\x99\x37\xd5\xec\xa5\x4b\x9e\xe1\x97\xf6\xb4\x7c\xe0\x11\x55\x77\x69\x30\x7c\x23\xed\x40\xe9\xfb\x8e\xe0\x60\xb8\x3f\xc4\xbe\x43\x9a\x80\x0d\x4b\xfb\x8e\x34\x77\xb4\x9f\x50\xc9\x71\xe1\x77\x7e\x7c\x90\xec\x27\xd8\x77\xd0\x98\xc9\xbd\x2c\x76\x20\x11\x76\x9f\x6a\x43\x8a\x1d\xa6\x38\x64\x89\xd9\xca\xb7\x38\x60\x89\x79\xbe\xcb\x43\x96\x58\x4c\x8e\x46\x9c\x13\x49\x71\xea\x52\xc4\xdd\x17\x5e\xf9\x4b\xa7\x22\x62\xd3\x56\x5c\xf8\xdd\xfa\xc9\xaa\x13\x58\xbc\x9f\xf5\x4a\xd7\xa5\xb9\x2b\x22\x27\x3f\x68\x30\x95\xa9\x1c\xe1\xf3\xf9\x02\xc6\xdc\xd3\x8b\x8b\xc5\x02\x9e\x6a\xcb\x71\x58\xf2\xa2\x19\x5e\x17\x4d\xa4\xe2\xd6\xb0\x37\x66\x1b\xe6\x89\xfa\x95\x7c\x70\xcc\x66\xf1\x95\x2a\xbd\xd5\x1d\xd2\x56\x37\xdf\xe4\x70\xce\x37\xac\x3e\x5f\x0a\xe8\x65\xe7\xdd\x14\x26\xbe\x8b\x5d\xba\x69\x70\x4e\xc3\x6a\x81\x70\xcd\x09\x8c\xda\x5d\x3b\xb3\x96\x07\x8a\x32\x61\xe8\x1b\x1e\xf2\x4d\xe3\x8a\xa8\x4c\xb6\x4b\x79\x59\x5c\x36\x86\x81\x9b\x24\xca\xab\x86\x25\xa5\x05\x23\x22\x0a\xf1\xd3\xb9\x61\x1f\xba\x96\xf0\xc4\xa4\x9d\xb6\x50\xc5\xb7\x7e\x6a\x5a\xb5\xb9\xd5\x6e\x0c\x86\xf2\xaa\xc5\xd8\xa0\x5c\x5d\xb9\x1d\xe8\x0b\xe6\x7c\x23\xb3\xdb\x56\x23\xb2\x6f\x9d\x4f\xbe\x39\x66\x95\xc5\x12\xaa\x39\x02\x8c\x2c\x14\x7b\xec\x0b\xc7\xbc\xcc\xb1\xa5\x9e\x82\xaf\x0e\x83\x26\xd9\x64\x09\x4d\x55\xb8\x7c\x5c\x64\x5e\x92\xa8\x71\x9d\x97\xc4\x6d\xb6\x01\xc3\x95\x2a\x82\x57\x7b\x71\x16\x29\x95\x45\xed\x97\xce\xb5\x22\x12\x95\xff\x9d\x33\xad\x46\x1d\xd2\x28\xa8\x28\x51\x09\x8b\x16\xe6\x95\x65\xff\xd2\x2a\x10\x49\xf6\x4f\xad\x02\x19\x75\x4c\xdb\x96\x68\xc6\xcf\xa6\x16\x0b\x23\xf0\xc6\xa9\x78\x42\x05\x1b\x9f\xe0\x81\xc6\x65\x94\xa6\xd1\x54\x65\x50\x79\xf1\xc4\xea\xcf\xc8\xbe\x71\x60\x07\xfd\x87\x03\x93\xe7\xa7\xf4\xbd\x6b\xd8\xaf\x29\x40\x3f\x87\xb2\x5f\x46\x94\xd2\x3e\x38\xee\x19\x6d\x6f\x6a\x74\x8d\xd6\xf3\x1d\xfa\xcd\x07\x08\x40\x34\xdd\x10\x97\xcb\xd4\x77\x53\x7f\x34\x0a\x80\xd5\x85\x2a\x6c\xf0\xcd\xd3\x2d\xdf\x3c\xd9\x46\xe3\xf8\xa9\xdf\x30\xce\xda\x47\x88\xc2\x1d\xd4\x19\x47\xf1\x4b\x7a\xe7\x33\x43\x33\x67\x68\x6e\x19\x9a\xb9\x80\xe6\xb6\x02\x8d\xd1\xea\xec\xae\x84\x81\x41\x05\xbb\x54\xce\x03\x96\x80\x61\x18\x6c\x05\xd4\x51\xfb\x4c\x01\x73\x24\x81\xb1\x5f\x8a\x02\xaf\xed\xe3\xa7\x19\x0d\x83\x08\xfd\xa0\xd0\x09\x14\xab\x38\x74\x4a\x14\x58\xca\xf5\x53\x84\x6e\xf2\x78\x99\x7f\x2c\xde\x31\xfc\xe9\x86\x23\xc1\x3e\xfa\xce\xd8\xfe\xe8\xf4\x8b\x68\x13\x27\xfe\xc4\x85\xea\xa4\xc9\x3e\x7d\x37\x3e\xca\xd5\x24\x29\xca\xf4\x28\x7f\x77\xa4\x2e\xae\x61\x3b\x80\x88\x33\xb7\x41\x39\x86\x03\xb3\x3c\x6d\xac\x76\x0d\xd2\x6e\x50\xe5\xc9\x4b\xec\x7c\xc7\x59\xf7\x1e\xad\x02\x7b\xb4\x04\x74\xc0\xf5\x77\xd8\x22\x53\xc5\xc6\x04\xbf\x41\x5a\xf3\x16\xa8\x78\xc1\x1f\xc5\x7e\xc9\xb5\xe9\x3f\x5c\xde\x61\x5b\xf2\x26\xe8\xa5\x0d\xc3\xe8\x7e\x0f\x72\xb5\x2d\xe6\x8e\x35\xea\x1b\x75\x97\xd0\x85\x6b\x43\x75\x11\x8d\xd2\x67\x15\x13\x97\x0f\x5f\x08\xa7\xf9\x65\x70\xc1\x60\x1f\x6f\x1e\x13\x65\x97\xcc\x0e\x3c\xfc\x38\xcf\x83\xc2\x59\x23\xc5\x92\x9c\x67\x61\xb3\x78\xb9\xfe\x19\xab\x97\xf4\xeb\x6a\x7e\x40\x85\xad\x51\xd8\x73\x62\xfd\x93\xc7\x95\xf7\x65\x79\x5f\x21\xf5\xe1\x31\xa6\x9b\x22\x59\x3a\xca\xbb\x24\xbb\x1c\xf9\xd7\xfe\xa8\xd6\xd6\x7f\xa5\xf8\xd6\x56\x98\xdf\x23\x7e\x0f\x1c\xc5\xcc\xec\x37\x81\x73\x47\xac\x0c\xaf\xd5\xe0\xf7\x01\x9e\x0f\x39\x85\x3e\xc0\x02\xd5\xeb\x35\x5a\xe2\x2f\x63\x12\x02\x56\xac\xf1\xac\xfd\x54\xb7\xc6\xa7\xd5\x15\x5e\xf1\x1a\xf6\x78\xe5\xc5\x4d\x96\xd5\xb0\x5c\xd0\x2c\x2b\x38\x51\xf3\xc6\xbb\xfc\xe1\xa7\xcd\xd4\x9d\x35\x27\x04\x57\x00\xd8\x9a\xc3\x28\x60\xee\x18\x5f\x5d\xba\x66\xdb\xe6\xff\x2c\x43\xb3\xf8\x8f\x5b\x3a\x01\x27\x9e\x7a\x72\x7c\x1a\x65\xc3\x89\x70\x41\x90\x27\xb0\x9f\x2f\x7d\x9d\x83\x47\xd3\x2b\x7e\xdf\xaa\xaf\x75\xfb\xd1\xd2\x42\x17\xc3\xff\x6b\x75\xa1\x2b\x95\x96\x08\xc0\x29\xd2\xa5\x1f\xf0\x92\x6b\x4c\x88\x9b\x7b\x61\x91\x38\xcc\xe2\x84\x11\xe1\xbb\xdb\x89\xeb\xc7\x58\x25\x4b\x10\x09\x47\xc6\x3a\x34\xeb\xc1\x92\x97\xab\x36\x05\x49\x41\xae\xab\x6e\x05\xfb\xd8\xc3\xdd\x91\x6a\xeb\x1a\x3e\xa3\x5d\x29\x77\x14\x22\x86\xbb\xd4\xfe\x55\xb5\xf1\x65\xb6\x6b\x88\xaa\x9f\x40\xc5\x75\x09\xa4\x1a\x2e\x7d\xc4\xa6\xae\x57\xa0\x78\x5b\x57\x64\xfb\xdc\xbb\x19\x14\xfa\x75\xbd\x66\x47\x18\x18\x51\x85\xe6\xb5\x85\xfe\x3e\x0f\x93\xc1\xea\x42\x37\xfe\x88\xe4\x19\x7b\x4f\x85\x27\xec\x12\x85\x23\x1e\x1a\x5e\x76\xa9\xc1\xc9\xd8\x77\x90\x68\x6d\x40\x07\x06\xf7\x76\xa6\xd5\x33\xc2\x88\xc4\x14\x6e\x47\x8c\xc2\x10\x72\xad\x5b\xbe\x79\x83\x05\xb5\x52\x54\x64\xed\x07\xec\xfe\x81\xe4\xb3\x00\xe6\xd4\xf2\xae\x18\x32\x4d\x94\xe0\x85\x36\x4a\x93\xe3\xed\x98\xa4\x39\x12\xa6\x55\xd1\xa4\x28\x3a\x2f\x17\x55\xa8\x69\x65\x33\x2e\xeb\x99\xe3\xd2\xf9\xb5\x27\xe4\xf8\x5a\xba\x11\x55\x69\xee\x61\x6b\x28\x41\xf7\xdd\x3a\x3e\x6f\x6c\x7b\xc5\xa0\x09\x89\x66\x42\x91\x7f\x27\x7a\xa4\x65\xdc\x2f\xdb\xd8\x52\x42\x5b\x31\x43\x0a\xea\x60\xf0\xc3\x9a\x79\x64\xb7\xc2\x03\xd0\x92\xdd\x4a\x0e\x4a\x34\x25\x7b\x6e\x0c\xec\xc7\x65\x9b\x5e\xd9\xc3\xed\x51\x3f\x4e\x1e\x68\xcf\x93\xed\xdd\x94\xdb\x53\xdd\x3d\x41\x83\x93\x72\x83\xbe\xce\x52\x11\xe8\xec\x3a\x85\x07\xbf\x1f\xde\xfc\x30\x1a\xe1\xc8\xf3\x90\xf6\xb8\x27\xe2\xf9\xfc\x4f\x18\x91\x75\x00\x3d\x7d\x52\x8d\x0e\xea\x25\x49\x78\xd7\xb2\x4f\xf1\x40\x3b\xaf\xee\x7a\x65\x75\x14\x79\x48\x95\xa2\xa6\x46\x51\x53\x43\xd5\xd4\xae\x54\x34\xd2\x75\x7d\x98\xe7\xc2\xb9\x7e\x0a\x3b\x45\x30\xc7\x17\x72\x35\xb7\xca\x77\x3d\x3e\xf1\xdc\x00\x20\xe7\x4d\xbb\x41\xfa\x5f\x6f\xde\x33\x4f\x18\x8f\x73\x13\xfd\xde\x18\xb3\xb5\xda\x5d\xdb\x44\xa7\x34\x26\x22\x44\x25\x01\x17\x81\xd5\xe0\x9a\x5f\x9c\xa0\xc7\x04\x84\x04\x20\x22\x77\x10\x49\x99\x07\x56\x57\xf4\x09\x09\x9d\x5b\x5b\x53\x58\xf8\xa6\xb5\x01\x3b\x63\xf3\x07\xc3\xd7\x26\x89\x53\x24\xc0\x53\x33\x9b\x65\xc9\x13\xd8\x2d\x09\x82\x37\xca\x5d\x96\x5c\x2a\x60\x5f\xa0\x7b\xd8\x13\xcc\xb3\x2b\xb9\x99\x71\xaf\x77\xc8\x54\x29\x15\x4a\xeb\x6d\x24\x70\x7c\x62\xeb\x56\x43\xc7\x17\x16\xb2\x7c\x61\x88\xf3\x27\x8e\x3e\xae\x1d\xaf\x37\xe9\x8e\x69\x9f\x77\x8d\xf1\xba\xd6\xcc\x74\x60\x14\x86\x4d\x98\x0b\x69\x3a\xa3\x46\x02\x79\xd2\xf4\x7a\xb3\xee\x95\x55\xd8\x60\x19\xda\x85\x49\x1d\x5b\xf8\x01\xee\xe2\xc7\x3e\xec\x65\x8e\x19\x37\x9c\xc4\x6a\x8c\xba\xe6\x09\x5b\x27\xa9\x2f\xb5\xfb\x14\x0e\x10\x9b\x31\x9e\xb6\xc5\x07\x09\x64\x1a\xa8\xa8\xc1\x4b\x02\xfd\xb1\x01\xd1\x06\xf6\x37\x80\x6f\xc3\xc9\x48\x06\xed\xb9\xc2\x19\xbd\x34\xd9\x80\x1c\x54\x04\xe9\x4e\x06\x13\x3d\x5d\xf6\xc9\xa3\x59\x82\x21\x76\x77\x47\x74\x62\xff\xf8\xa7\xb5\xbe\x8e\x97\xac\xc7\x41\xed\x42\xaa\x20\x49\x86\xf6\x32\x4b\xab\x8b\xc8\x76\x5c\xc8\x06\x18\x43\x25\x02\x88\x53\xf0\x3c\x29\x9b\x2d\x27\xb0\xdc\x50\x5f\x86\x93\x70\x98\xbc\x94\x42\xb3\x4a\x17\x41\x4a\x09\x95\x46\xec\x5f\x66\x95\xde\xb0\xd9\x92\x3b\x0c\x7e\xfe\xc7\xc7\x1e\xb4\xe1\xd6\x24\x28\x35\x87\x94\x77\xb4\x1b\x67\xd8\x8a\xc6\xe6\xa5\xfe\xe4\xf1\x87\x56\x80\xe6\xe6\x6b\xe7\x02\x0b\x7b\x36\xa5\xf6\x5e\x3a\x1b\xdb\x7f\x9b\xe1\x22\xb1\x14\xf7\x7d\x4d\x53\x21\xa0\xed\x34\xe2\xbd\xc5\x4d\x29\x3e\xa1\xf9\x7f\xd1\xe2\xc5\xdd\xa3\xc5\x58\x31\x40\xda\x4e\x7f\x46\xc5\x3f\x4b\x2c\xe0\x58\x07\x13\x9b\xfc\xba\x0e\xf1\x6b\x7a\xe3\x9a\x1f\x59\xe5\x98\x0d\x27\xd8\x9a\x8d\xfa\xdc\xc7\x49\xef\xb8\x7e\x30\x46\xf5\x23\x31\xb7\xba\x2b\x46\x7c\x54\x3b\xdc\x73\x10\x69\x7e\x18\x68\x96\x48\xf2\xa9\x61\xe9\x49\xf6\xa1\x25\x79\x11\xb1\x5c\x7c\x29\x2e\xc4\xc1\x9d\x81\xb0\x40\x8d\x77\x8f\x6a\x77\xda\xd8\xbe\x29\x7a\x93\x76\xaa\xb4\xbc\x85\x79\x78\xff\xd6\x39\x27\x9e\xd7\xec\xcb\xca\x88\xe3\x35\x3f\x8a\x9a\x06\x8a\xe9\xf5\xf3\x36\x3e\x0e\xc4\xc6\xb5\xc2\x43\x69\x9a\x9f\x38\x3f\x95\x05\x2b\x6b\x7f\xf5\x84\xe3\xa9\xb3\xee\x8c\x5b\x6f\x82\x5d\x54\x22\xac\x2a\x39\x8b\x53\x03\x58\x92\x97\x3e\x67\x85\x7d\xec\xd7\xc4\x30\xf5\x0c\xb6\x62\xb6\xc5\x24\xb0\xa4\x5d\xc6\xc2\x50\xd0\x79\xdb\x66\xfb\xb2\xe2\xf7\x0a\x56\x9b\x66\xf8\x73\xed\xbc\x0f\x34\x1e\x1a\xca\xa3\x5f\x5d\xfe\x58\x71\xf6\x28\x26\x4e\xf5\xb9\x70\xea\xdc\xdd\x12\x7b\x9e\x77\x27\x30\x6f\x6a\x7f\xc7\xb6\xd7\x5b\x3a\x92\x14\x37\x45\xda\x81\x64\x6a\xf7\x69\xab\x5d\xd9\xe8\x68\x62\x9c\x25\x6f\xa0\x4a\xfb\x10\x0d\x22\xdc\xe2\xf9\x6c\x20\xeb\x3b\x3b\xd1\xb8\x25\x54\x61\x26\x2b\xac\xed\x50\x92\x53\xe5\x65\x1a\x47\x77\x97\xeb\x13\x5b\xe3\x39\xcc\xd7\xa6\xf0\xb3\x17\xe3\x7b\x02\x87\x4b\xc5\x35\x9f\xe3\xca\xce\xd5\xce\xd4\x71\xc8\x7c\xeb\xe0\x6e\x1c\x92\x68\x6b\xee\xc4\xf8\x0c\xeb\x56\xc5\x62\x31\xbc\xbf\xb7\xb4\x0b\xb6\x3a\xe4\x52\x46\x2e\x25\xe4\xfe\xa1\xaa\x4a\xba\x64\x88\x38\xd4\xaa\xa7\xac\xdf\xa9\x8e\x2f\xeb\xd6\x76\x5e\x11\xd0\xd8\x32\x91\x6d\x04\x2f\x5e\xec\x2c\x36\x92\x81\xd2\x4f\x5f\xd7\x97\x45\x52\x5b\x43\xc2\xaf\xbf\x02\x77\x3a\x5b\x13\x0e\x62\xc7\xb0\x62\xb4\xb1\x01\xab\xb7\x20\x7e\xfa\x20\xb9\xa7\x1b\xf4\x38\xb2\x9b\xf0\x43\x7d\xfa\x12\x0a\xf4\xc8\x7e\x7e\x65\xcf\x06\xc8\xd0\x4d\x48\x8e\x10\x76\x17\x43\x29\xa1\x2e\x9f\xa4\x48\x5d\xb3\xe1\xaa\xfb\x2e\x86\x81\xaf\x1c\xa8\xfd\xd8\x49\x59\xaa\xe1\x18\x4f\xc4\xc4\x2c\x0e\x47\xce\x39\x55\x05\x1f\x16\x7e\x78\xed\xc5\xc2\xe3\x1b\xfc\xee\x51\x8e\xc0\x8c\xb1\xb3\x38\x88\x79\x5f\xe2\xc1\x69\x39\xdc\xa9\xc0\x01\xd9\x06\x33\xd6\xc5\x22\xde\x60\x21\x14\x02\xda\x58\xd4\x24\xf7\x31\x99\x68\xd8\x17\x0d\x07\x1c\xc3\x26\xce\x7d\x16\xb0\xa0\xd8\x7f\x4e\xf0\xc3\x51\x46\xde\x30\x49\x34\xa0\x5f\x9f\x7e\x70\x1a\x99\x1d\xf8\xdc\x70\x66\x67\x0e\xbc\xb7\xa0\xe1\x6c\x83\x59\xf8\x62\xe1\x6f\xb0\xc8\x8b\x86\x27\xa2\x26\x8b\x7b\x92\xb1\x8e\x70\x14\x17\x09\x34\x23\xee\x76\x0a\x8f\x45\x98\x65\xe6\x32\xb6\x32\x20\x91\x56\xa1\x7a\xdc\x25\x7a\x2e\x04\x31\x57\x60\xe8\x8a\x16\x32\x86\x8c\xc2\x2c\x8a\x97\xd1\x52\x75\x0a\xec\x54\xa8\x1e\x49\x8b\x4d\x1f\x10\x39\x50\x77\x66\x03\xfb\x3c\x26\xdc\x40\x16\xdc\xbb\xa0\x1b\x81\xad\x20\xc8\x7a\x9b\x47\xb9\x10\x46\x22\x7b\x95\x19\x2b\x46\x62\x41\x23\x5f\x66\x5c\xae\x62\x63\x83\x60\x40\x8f\x39\xdc\x61\x8b\xc5\xc6\x06\xb5\x3c\xe1\x08\xe0\xa7\xfb\x64\x0c\xcb\x3e\x19\x8f\x02\xe7\x2e\xec\x1a\x61\xd2\x94\x13\xdb\x86\x5f\xf0\x9b\x3c\x94\x94\xd2\x6e\x4a\x69\x21\x05\xc3\x9b\xc4\x2b\x22\xa8\x6c\xe8\x25\x5a\x69\xaf\x92\x23\xb9\x29\xe7\xb8\xb7\xdf\x07\xce\xf9\xb9\x11\xe2\x74\x85\xfe\x61\x39\xbd\xc1\x92\xca\x7f\x38\x86\xff\xdc\x18\xd4\xb7\x9c\x43\x7c\x85\x9c\x17\x56\x4b\x06\xf6\xdb\xc0\x71\x87\xd2\x54\x93\x73\x35\xe4\x1b\x39\x71\x16\x6a\x7f\x0d\x9c\xb7\x41\x2b\x4b\x87\xf6\xb7\xc0\xf9\x4a\x0b\xf3\xe6\xd7\xe6\xe6\xb4\xb9\x39\xea\x6f\x1e\x75\x37\x4f\xba\x9b\xa7\xad\xcd\xe3\x6f\x86\xb5\x4f\xb9\xfc\x24\x72\x58\x67\x3a\x57\xb9\x6d\xa5\xd1\xdb\xd3\xf7\xa7\xac\xa6\xb2\xb5\xd5\x80\x2b\xde\x57\xbc\xc7\xde\x6d\xb7\xdb\xcd\xf6\x0e\xfd\xdf\x6f\xb7\xbb\xfc\x7f\x8b\xa2\xa8\xa2\xde\x5f\x51\xf7\x5b\x60\xff\x15\x41\xab\xa1\x56\x5f\x21\xaf\x45\x53\xb7\x61\x9b\xa9\xca\xb4\x70\x7a\x8f\xe2\x69\x24\xda\x75\xbe\x05\xf9\xb7\x4d\x68\x26\xde\x30\x0a\x47\xce\x9b\xd4\xac\x39\xe1\x41\xdd\xc3\xa1\xb9\xe3\x75\x9e\x6a\x76\xa6\xc2\x6d\x8a\xc0\xfd\x74\xf9\x5e\x9a\x55\x09\xfb\xd4\x57\x26\x6b\x2a\xf2\x97\xd5\xa8\x94\x4d\xcb\xe5\x34\x9a\xa5\x22\xa7\x0c\x4b\x62\xb2\xe7\x48\x05\x5a\xe2\xe4\x9f\xe2\x22\x40\x4b\xc2\x48\x68\xc9\x14\x2a\xb2\xd0\x06\x2a\x4b\xbd\x87\x11\xdb\xf3\xfe\x28\x23\x46\x11\xeb\x22\x56\x29\xfb\x20\x62\x27\x0c\x4b\x8e\x98\x00\x8d\x11\x13\x9f\x55\xa8\x73\xc4\x64\x72\x09\xb1\x49\x94\xc5\x55\xb4\x94\x11\x67\x09\xde\x2f\x12\x20\xdf\xb3\x2b\x29\xd3\xda\xde\x2b\x1c\xbd\x09\xac\x3b\x7b\xde\xb3\xa7\x66\x09\x6f\x44\x35\x53\xab\x91\xae\x8b\x3d\xd7\xb1\x2e\xfa\x47\x04\x71\x8e\x3c\xc0\x67\xd4\xf1\x51\xc6\x2a\x47\x9b\x93\xca\xa3\x19\x85\xe9\x64\xd5\x60\xa2\xc8\xc8\x85\x86\x1b\x9f\xef\xa4\x3c\x1d\x76\x98\xc5\xd5\xe0\x72\x82\xaa\x04\x32\xe2\x13\x68\x3f\x30\x76\x22\x8f\x1c\x39\x04\xc4\xc0\xe1\xab\x02\x5f\x31\x6c\x9c\x98\x23\xc0\x8c\xf1\x0c\xf6\x34\xbd\x8e\xfd\xcc\x83\xd1\x28\xfa\xd3\xf1\xfe\xb0\x89\x88\xe8\xf7\x99\xfd\x1f\xfa\xb7\xf3\x6f\xfa\x83\x7e\x85\x09\x29\xfa\xbb\xbb\x83\xef\x3f\x3a\xbb\xf4\xf7\xdf\x7b\x7f\x20\xfe\xf9\x2e\x12\xf6\xda\x7f\x70\xfa\xb3\xff\xec\x7a\x7b\xf6\xf3\xe7\xcf\xf7\xe8\xa7\xb3\xf3\x8c\xca\xee\x0d\xec\x2f\xe0\x7f\xf9\x9c\x60\xd3\x77\x45\xe8\x59\x29\xb4\x53\x0e\x76\xda\x22\x28\x88\x4e\x95\x94\xa1\x67\xe5\xb4\x72\x50\x95\xc4\xb8\xa9\x72\xfc\xdd\xd1\xbe\xf7\xf4\x3c\xbb\x22\x40\xa3\xa6\xf2\xe3\x53\xc6\x92\xb8\xfc\x23\x6f\x1e\x5d\x59\x0e\xc8\x4a\xe7\xb4\xfa\xd9\xd8\x80\xfd\x8b\x99\xf2\x34\x0b\x52\xdf\x24\xd6\x4f\x1c\xb8\xf6\xb8\x5a\xce\xc4\x20\xf0\x93\x9c\xcf\x80\xf5\x13\xd3\x5e\x9d\xff\xb4\x94\x75\xf3\x2d\x31\xf9\x87\x2a\x57\xd3\x5c\x64\x7e\xb2\x39\x5b\x9d\x59\x4d\x0a\xce\xea\x3e\xd9\x1c\xad\xce\xfa\x8a\x68\x9b\x44\x9d\x9d\x0d\x47\x06\x53\x4f\x15\xbc\x5c\x55\xb0\x2e\xf3\x9f\x0f\x80\x2e\xa9\x9c\xf3\x7d\x35\xec\x77\xde\x80\xa4\xb4\x3f\x69\x31\x67\x0a\x2e\x59\xda\x2c\x1e\xe5\x16\x3e\xca\x0a\x6b\x85\xe1\xb6\x67\x3d\xf5\xec\x06\xb2\xf1\xeb\xb7\xff\x42\x13\xb0\x6a\xb9\xf1\x4b\xc0\xe3\xe7\xa8\x71\x04\x15\x96\x6f\x5a\x0b\x8b\x85\x51\x8d\xc5\xc2\x2f\x01\x0d\xbb\x14\x39\x3e\x07\xce\x97\x8a\x87\xc4\x1c\xbb\x73\xf6\x6b\x85\x05\x1b\xa7\x8f\xb0\xf3\xfe\x17\x16\xee\x35\xa9\xe5\x53\xff\xf0\xb1\x04\x43\x45\x1e\x45\x33\xdc\xc4\x23\xc8\x86\xf2\x3f\x82\x72\x28\x77\x85\x78\x38\xe6\x11\xf4\x53\xc9\xff\x00\x09\x01\x93\x3a\x2a\xda\xff\x5c\x1e\x6b\x1e\x0d\x35\xde\xcc\x31\xd7\x1c\xf3\xcf\x24\x07\x49\xdb\x8a\xac\x86\xfa\xb2\x7e\x35\xc0\x59\xc9\x2c\x0a\x13\xaf\x4f\x99\xee\xf9\x6c\xe4\x7b\xb2\xea\x7d\xd5\x3b\x3c\x7e\x30\xa0\x43\xe4\x0f\x59\x83\x6a\x1b\x79\x0d\xfb\x7f\x22\x65\xef\x7e\x92\x4e\x83\x87\xca\x02\x94\x6d\x64\x22\x71\xd5\x55\x85\x6e\xa9\xcc\x3f\x81\xf7\xe5\xe4\x98\xa0\xab\xd1\x39\x1c\x79\x63\x42\x79\x6b\x4b\xfc\xb6\xdc\xe9\xa8\x27\x3e\xa9\x4f\xac\xae\x11\x5d\xe2\x19\x6e\x91\x9d\xb6\xd1\x59\x40\xd9\xc5\x2f\x9b\xe4\x8c\x53\xec\x52\xca\x11\x0e\x15\x16\xba\xbd\xa3\x0e\x7d\xdf\x9b\xd6\xfe\xff\x06\x00\x00\xff\xff\x3b\xc1\xeb\x31\x55\x4e\x02\x00") func uiJsLibsD3335D3MinJsBytes() ([]byte, error) { return bindataRead( _uiJsLibsD3335D3MinJs, "ui/js/libs/d3/3.3.5/d3.min.js", ) } func uiJsLibsD3335D3MinJs() (*asset, error) { bytes, err := uiJsLibsD3335D3MinJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/js/libs/d3/3.3.5/d3.min.js", size: 151125, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiJsLibsMithriljs020MithrilMinJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x7c\x79\x77\xdb\xb6\xd2\xf7\xff\xf9\x14\x32\xeb\xe3\x97\xac\x60\x5a\x4e\x9e\xf7\x9e\xe7\x52\x41\x78\x9c\xc4\x59\xda\x38\x8b\xe3\xb4\x4d\x14\x35\xe5\x02\x89\x94\xb9\xa8\x22\xe5\x25\x26\xbf\xfb\x33\x33\x00\xb8\x48\x72\x7a\xef\xe9\xa9\x45\x62\x1d\x0c\x66\xf9\xcd\x00\xcc\xd1\xcf\x0f\xce\xe2\x32\x5a\xc5\xc9\xe0\x6a\x64\x3f\xb4\x47\x0f\xa2\xb2\x5c\x3a\x47\x47\x73\x28\x5d\xfb\x76\x90\xa7\x47\x49\x94\xaf\x62\x71\x94\xca\x76\xf6\xa2\x78\x60\x06\xd6\xe0\x8d\xc8\x07\xaf\xb0\xe2\xc1\x9b\x38\x10\x59\x21\x9c\xc1\xd9\xeb\x8b\x07\x3f\x1f\x3d\xb8\xf2\x56\x83\x94\xcf\xd6\x59\x50\xc6\x79\x36\xf0\x4c\x9f\x05\xd6\x5d\xf3\x1e\x9a\x9e\x75\xf7\x9c\x7b\x76\x98\x07\xeb\x54\x64\x25\x3b\x85\x97\x24\x0f\x3c\xac\x66\x2f\xe1\x25\xf0\xb2\x40\x24\x27\x59\x9c\x52\xd9\x8b\x95\x97\x8a\xaa\x82\xf2\x44\x78\xab\x8b\x38\x15\xf9\xba\x64\x2f\xa0\xe1\x4a\xfc\xbd\x16\x45\xb9\xdd\xb2\x10\xa5\x6a\x57\x37\x13\x0b\xd3\xba\x43\xda\x3c\xe6\xf3\xc9\xd4\x2e\x12\xa0\x1b\xa6\x4a\x12\xd3\x5b\xcd\x89\x92\xc2\x62\x01\xdf\x33\xb3\x75\x92\x70\xee\x4f\x8e\xa7\x55\xf5\x46\xb6\xc0\x17\x6b\x8f\xf3\x57\x55\x65\x94\xde\xdc\x88\xb3\x81\xac\x37\xae\x62\x71\xdd\x79\x2d\xd6\x7e\xb9\x12\x42\x97\x58\x2c\xe4\x81\x8b\x4f\xce\x5d\xcd\x04\x37\x82\xc4\x2b\x0a\xac\x0d\x5d\xf5\xec\xc8\xdf\xb7\x40\xb9\xc1\x66\xfc\x0e\x86\x77\x8c\x30\xbe\x32\x98\x57\x96\xab\x02\xfa\xd5\x6c\x0e\x04\x8f\xe3\x99\xd9\x50\x33\x42\x6a\x7e\xb1\x60\x47\xf2\xeb\x41\x26\xae\x07\xa7\xab\x55\xbe\x32\x8d\x42\x24\x22\x28\xf3\xd5\x00\x66\x48\x4d\xfd\xc6\x06\x34\x14\x1b\x04\x51\x9c\x84\x2b\x91\x59\x83\x22\xca\xd7\x49\x38\xf0\xc5\xc0\x1b\x14\xe5\x2a\xce\xe6\x86\x35\x9e\xc1\x10\x63\x8f\x9f\xd9\xe2\x46\x04\x72\x96\xb1\x05\xd3\x1a\x06\xe7\xdc\x83\x45\x1c\x1c\x78\x93\x87\x53\x6b\x66\x03\x91\x1c\x1f\xc7\x22\x29\xc4\x00\x9b\xfc\xa4\xdb\x40\x2d\xcd\x66\xc7\xe1\x46\x13\xbb\x69\x32\xb7\x97\xeb\x22\x32\x69\xb0\xb6\x7e\x22\xeb\x1f\x4d\x71\x62\xda\xaa\x88\xbf\x95\xb4\x60\x29\xd0\x27\x47\x9e\x44\x30\xc6\x94\x47\x50\x56\x55\x66\x04\x83\xb8\x86\xe1\xec\x8d\xac\x1a\xfb\xc4\xdc\x97\x7b\x6b\x06\xee\x43\xe7\x18\x7b\xe9\x65\xf3\x63\x98\x20\xb6\x13\x91\xcd\xcb\xe8\xe0\x40\x71\x33\xc6\xe9\xa0\xe2\xb5\x8b\x4f\x4e\x4c\x6c\xc0\x91\x16\xc8\xc5\xd0\x0a\xed\xc8\x2b\xde\x5d\x67\xef\x57\xf9\x52\xac\xca\x5b\x73\x61\x1d\x1c\x98\x0b\xe8\x21\x0e\x0e\x50\x56\xf6\x78\x38\x59\x00\x6f\x0c\x03\x24\x04\x1f\x5d\x53\x2d\x10\x5f\x2c\xa6\xc9\x5e\x4c\xb9\x61\x58\x4e\xe7\x95\xea\xc7\x2b\x51\xae\x57\xd9\x60\xae\x08\x7b\x32\x82\xe1\x75\x23\x31\xe5\x73\x7b\x91\xc7\x99\x69\x0c\x0c\x0b\xc6\x6a\xe5\x79\x66\x82\x24\xb3\x90\x2d\x58\xc2\x52\x96\xb1\x9c\x2d\xd9\xdf\x6c\x65\xdd\x95\xab\xdb\x3b\x25\xc4\x49\x55\xa9\x07\xbb\xcc\x3f\xd2\x3e\x9b\x16\x92\x9f\x20\x29\x35\xe8\x5c\x10\x99\x85\x75\x87\xaf\x35\xee\x01\xd0\xe2\xc5\x19\x6e\x44\x62\x2b\x59\xb6\x14\x7d\xe9\x18\x99\x52\x72\xc5\xb6\xd4\x62\x6b\xfd\x9c\x58\x28\x9d\x72\xa6\xb4\xaa\x4a\xe0\xc3\xda\xba\x53\x45\x7b\x3c\x45\x21\x0a\x0f\x0e\x42\x3b\xcb\x43\x51\xc8\xbd\xbd\xe2\xf9\xe1\x82\x5d\xf3\xab\xa1\xb9\x26\xee\x27\x4e\xaa\xea\x15\x23\xc6\xb1\xa9\x7a\xa8\x0d\xbd\x62\xd7\xa0\x50\x9d\x17\xab\x26\xe1\x51\xfd\x0e\x0e\x62\x53\x3d\xb2\xd4\x1a\xa7\x1c\x15\x23\x01\x1b\x96\x81\x84\xaf\x49\x11\x52\x94\x5c\x58\x7e\xca\xef\x6a\x8b\xa9\xc6\xa0\x5c\xb8\x76\xa2\x02\x0c\x95\xda\xfd\x1b\x3e\x62\xb7\xc0\x05\x45\xcb\xed\x93\x9b\xf1\xcd\x70\x68\xe9\x15\x4f\x6e\xa4\xd0\x10\x2f\x69\x12\x60\xa6\xed\x2d\x97\xc9\xad\x39\x99\xb2\xc4\x62\x37\x87\x87\x9d\x01\xac\x46\xac\xbe\xc3\x7c\xec\x84\xa7\xaa\x82\x58\x2d\x1f\xd9\x53\x98\xf3\x19\x3f\x06\x8b\xf8\x10\xec\xdb\x23\x30\x86\x60\x35\xce\xf8\xde\x31\x03\x6a\xc6\x37\x8f\x75\x1f\xa2\x24\x05\x12\x0e\x0e\xf0\xaf\x94\x15\x2d\x8c\x6d\x89\x7d\x29\x6e\x81\x3e\x18\x60\xc4\x5e\x4e\xfa\xe5\x53\x7e\xe7\x91\x1c\x39\xcf\x58\x9c\x85\xe2\xc6\xb9\xa9\x5b\x1a\xdf\x02\x21\xf7\x30\x00\x38\x95\xd0\xcc\xc9\xd6\xcc\x49\x6f\x86\x96\x95\x1f\x36\x47\xfa\x30\xfe\x00\x23\x25\x93\x0f\x34\xcc\x87\xde\x30\xc0\x8e\xa6\x44\x2d\xa0\x5f\xc0\x8d\x6f\xdf\x94\x33\xfa\xf6\xcd\x18\xbe\x85\x91\xc6\xfe\x4a\x78\x97\xb8\x89\x67\x52\xb8\xce\x81\x67\x28\x92\x7a\xce\xbd\x86\xdd\x16\x54\x8d\xa4\xcd\xd1\xe4\x7d\x64\x17\xc4\xdf\x8f\xc4\x3a\x76\x41\xeb\xd0\x6b\xfd\xa8\x69\xbb\xd0\x0f\x1f\x5b\x52\xf6\xf8\x45\x77\xbd\x34\x74\x43\xca\xf9\x3f\xca\xd2\x7f\xc1\x4a\x1c\xe5\xd3\x46\xe9\xf8\xe5\xe4\xd3\x94\xe3\x1f\x57\xef\xe5\x0b\xbd\x97\x6c\xb6\xca\x53\x07\xeb\x6c\x2a\x61\xe0\x0a\xd0\xc5\x69\x1d\x9b\xb4\x55\x60\x44\x9f\xdb\x01\x50\x5d\x8a\x53\xd9\xc8\x24\xff\x63\xd5\x8e\x1e\xf6\xb4\x11\x11\x32\xb1\xbf\xa1\x3b\xd2\x6b\xfb\x1d\xad\xe4\x4b\xeb\x37\x69\xf1\x5e\x4e\x7e\x07\x8b\x86\xe5\x7f\xf0\xdf\xec\x22\x5f\x95\xe6\xdc\x62\x9f\x49\x15\x4f\x56\x2b\xef\xd6\x6c\x36\x62\xfc\x59\xa9\x5f\xda\x53\xf2\x56\x08\xbf\xd0\xae\x7c\xe1\x7f\xe8\xed\x40\x8b\xf2\xc5\x96\x34\x81\xda\x3c\x03\xd1\x00\x8d\x9f\x7c\x51\xeb\xd0\xaa\xdf\x14\xc0\xc4\x76\xb1\xa4\x51\x55\x11\x3b\x06\x1b\xda\x19\xe2\x54\x72\x76\x9f\xef\xe6\xc0\x78\x9f\x04\x2e\x69\xa7\x68\x98\xcf\x3c\x28\x2a\xc0\x1f\x3c\x15\x40\xaf\x30\xf7\xa1\x80\xfc\xcc\x5b\x62\xef\x97\x86\xb7\xb8\x9f\x3b\x08\x19\xb1\x3b\xe5\xdf\x61\x30\x67\xd7\x0c\x35\xa3\xf5\x38\x93\xfd\x69\x8d\x03\x64\xbd\x81\xf9\x7e\xdd\x59\xc7\x0b\x60\xc5\xce\xf9\xc1\x12\x7f\xb1\xd5\xde\x6b\xd9\xea\x96\x6c\xac\xa2\xa9\xf9\x87\xd5\xb4\x64\x20\xb7\x51\xd6\xa6\xdb\x14\x36\x83\x59\x75\xca\x3f\xd7\x75\x57\x1b\xbe\xed\xd6\x08\xda\x0d\xdf\xe7\xd2\xb7\xa5\xe0\xd3\x50\xe4\x61\x4b\xbf\x4d\xd1\xc3\x0d\x9f\x56\xd5\x53\xe5\xe6\xc6\xbe\x0f\x4b\x09\x60\xe1\xbe\xaf\x04\x28\xce\x4a\xe0\x08\x60\x82\x13\x50\x7f\x8b\x3d\x1d\x72\xa8\xda\x07\xdb\x5f\x94\x22\x74\xb1\x5d\x4a\x0e\xef\xe8\xf1\xe4\xcf\xaf\x47\xd3\xea\xeb\x93\xaf\xc5\xcf\x93\x3f\x1f\x4f\x8f\xe6\x56\x55\x21\x0c\x50\xf4\x38\x1a\x68\xf9\x12\x18\x40\x4f\x55\x71\x8c\xb4\x0c\x87\x53\x18\xd9\x42\x25\xdf\x3b\xf9\x47\x2d\x6f\xad\xf2\xc1\xc1\x77\xd2\x12\xe5\x26\xbe\x33\x32\xc9\xd2\xe7\x35\x52\x1f\xf8\x24\xf6\x81\xaf\xf5\x42\x4b\xbf\x1c\x27\xf0\xed\xa5\x07\x58\xa6\xc4\x9d\xc1\x01\x89\xd9\xef\x66\x66\xe0\x5b\x8f\x47\xe8\x02\x27\x81\x3f\x65\x64\xed\x41\x13\x35\x35\x8d\xeb\x40\xe7\xa7\x3d\x4f\xe3\x9b\x1a\x4f\xf8\xbd\xae\x35\x1c\x53\x76\xe8\xe0\x00\xfd\xe2\xab\x76\x95\x02\xd1\x33\x9b\xe1\x5f\x18\x1d\xe1\xef\x58\x6e\xdb\xdc\xe7\xf2\xdd\xde\x87\xb8\x60\x1e\x67\x1e\xa0\x0f\x59\xc2\x22\x9f\x83\x46\xcd\x66\x00\x2c\x04\xa0\xf6\x70\xe5\x5d\xdb\xe0\x94\x41\xe1\xe6\xb7\x26\xe0\x91\x94\x9a\x15\xae\xfa\x6d\x16\x35\xf7\x2d\xe7\xf0\x98\xc5\x3e\x8f\xfc\x27\x87\xc7\x50\x0f\x8e\xb6\x5c\xe5\x49\x22\x10\x07\xfa\x53\x07\x0c\x8b\x99\x74\x4a\xab\xea\xbd\xc5\x3e\x21\xdd\x89\xb6\xa8\x49\xc7\x64\xa2\xc9\xe5\x23\x80\x69\x7e\x55\xa5\x38\x6f\x67\xbc\x8d\xd7\x86\x88\xd8\xb7\x70\x6e\xb9\x14\x7c\x73\x24\x48\x5f\x26\x5e\x20\xa2\x3c\x09\xc5\xca\xa8\xd9\x8f\xa1\xd3\x27\x74\x63\x92\x0e\x90\x4f\xf5\x44\x20\xa4\x43\x1d\xff\x64\xc1\x52\xed\x3c\x5b\x67\x49\xee\x01\x60\xf2\x7c\x69\x55\xef\x5a\xb2\x9c\xd8\x67\x91\x97\x85\xf2\xb1\x69\x0b\x03\x09\xd5\x18\x78\x06\xdb\x23\x9f\x63\x25\xa5\x89\xc4\x3d\x33\x2d\xc7\xdb\x91\xc3\xb3\x3c\x5d\xe6\x19\xc8\xd5\xa0\x14\x29\xac\xac\x04\x58\x05\x7a\x33\x50\x2b\xf0\x06\x57\xf1\xaa\x5c\x7b\xc9\x40\x1b\x88\x41\x96\x97\x03\x0f\x6a\xd0\xaa\x33\x15\x44\xb0\x81\x28\x03\xdb\x40\xb9\xdb\xb5\xd6\xb4\x29\x4d\xdb\x52\xf2\x16\x0b\x9f\xbf\xf3\x17\x10\xad\x20\x1f\x0a\xdd\xc9\x62\x97\x3e\x5f\x68\xa2\x9f\x98\x06\x54\x62\xf0\xa4\xaa\xdd\x63\x67\x44\xc8\xd3\xa4\xf5\xa1\x93\x87\x9f\xaa\x82\x1e\xe4\x79\x2c\x89\x9c\x21\x54\xea\x8e\xad\xa6\xb6\xfa\x6d\x50\x54\x75\xdc\x82\x03\xe9\xe7\xb6\x9c\xfc\x7d\xda\xbe\x40\xb4\x07\x36\xe2\x3e\x89\x36\xf7\x48\x98\x66\xf1\xfc\x19\xec\x9d\xb8\x01\xb3\xb4\x51\x60\x4b\x81\x01\x23\x06\xa1\x0b\x0c\xf6\x63\xfd\xe8\x75\xdd\x2a\x50\x63\x81\xec\x81\xe1\x23\x15\x97\x16\x51\xeb\x7c\x03\x8c\x71\x0f\x36\x86\x2a\x6f\x97\x22\x9f\x0d\x36\x47\xd4\x92\x05\x63\xfe\xba\x3d\x9f\xae\x35\xd5\x80\x5a\x69\x2c\x4b\xdb\x89\x58\xda\xb1\x18\xed\x58\x57\x69\x95\x35\x53\xb3\x76\x44\x58\x4e\xd4\x29\x30\xef\x96\x2b\x71\x05\xb2\xf6\x5c\xcc\xbc\x75\x52\x3a\xef\x6b\xab\x13\x05\xd3\x9e\x53\x18\x2c\x65\x74\xac\xac\x67\xe2\xa3\x82\xf3\x3e\x0b\x24\x18\x94\x7b\x77\x93\x26\x59\xe1\xfe\xcd\x7b\xef\x8e\x51\x5c\xcd\xa5\xf2\xc2\xb0\x50\x6b\xa8\x4c\xc8\xf5\xf5\xb5\x7d\xfd\xc8\xce\x57\xf3\xa3\x87\xa3\xd1\xe8\x08\x9b\x39\x06\x38\x92\xa8\x69\x0d\x0c\xdf\xd9\xfe\xf8\xdf\xff\xfe\xdf\xa3\x33\x68\x49\x7f\xce\xde\x18\xa0\xed\x3e\xa1\x98\xc0\x6f\x66\x8f\x91\x14\x70\x64\xee\x26\x04\xa1\xa1\x59\xdb\xcc\x72\x36\x5a\xbc\xfd\x68\xfe\xcd\xb6\x5b\xfd\x60\xb4\x1f\x0c\x01\xfb\x28\x73\x0f\x72\x40\x89\x4d\x2e\x7d\x37\x32\x91\xa5\xdd\x49\x18\xc4\x24\x7f\x5b\x8e\x7e\xd3\xc1\xb5\xa3\x1c\x46\x13\x6d\xa3\xe1\xd5\xcf\x4d\x68\xeb\xce\xda\xf1\x02\xf8\xaf\x6d\x82\x72\xa4\x1f\x21\x5e\x19\x35\x6b\x42\xe1\x01\x52\x45\x18\x97\x9e\x9f\x08\x37\xf0\x1d\x89\x00\x9c\x4e\x67\x05\x95\xc0\xf5\xd5\xac\xb5\x72\x77\xca\x9f\x70\xe1\xf7\xc5\x94\xcf\xfc\xf1\xb6\xa0\xce\xfc\x0e\xf0\xef\x19\xe2\xce\x0b\x78\xb7\x24\x44\xe4\xd9\x91\xdc\xcd\x6a\x88\x52\xfd\x5e\x27\xe9\x21\x53\xbf\xdb\x72\xdc\x1d\xe1\x3d\xdb\x1c\x83\xa7\x7e\x5d\xa7\x1d\x6e\xee\xb5\x2f\x3a\xde\x35\x37\x8b\xc0\x29\x5b\x4c\x65\x81\x3a\xe2\x69\x5c\x79\xc9\x5a\x74\x2c\xe7\xc1\x41\x67\x5f\xef\xa8\x56\x6f\xa8\x4d\x6f\xb5\xdc\xe5\x4d\x94\x0b\x7d\x7a\xc0\x30\xd7\x90\x50\xc2\x86\x0e\x68\x19\x4d\xc1\x76\xf7\xa6\xd1\x02\xa3\x4c\x28\x8e\xde\x92\xcf\xff\x33\xb9\x38\xfe\x4f\xe4\x42\xa3\x19\x85\x07\x31\xfa\x6d\x44\x82\x78\x76\xaf\x4c\x58\x8c\x4c\xe8\x48\x23\xe5\xc0\xdf\x42\xc8\xf7\x72\x00\x2d\x8c\x32\x6a\x1d\x0a\xc1\x64\xa2\x5d\x93\xfb\x9f\x29\x5b\xd8\xda\xd1\xcd\xf7\xaa\x02\xb6\xe7\x7e\x93\x3d\x45\x18\x6c\xdd\x29\x1f\xdc\x14\x36\x25\x5e\x6f\x22\x05\x2b\xb1\x4b\x5d\x8f\x57\x12\x01\xe4\xbe\x99\x30\xd0\x0b\xb6\x97\xf8\x2c\x83\x25\x4f\x2d\xab\x05\x79\x9a\xe0\x3d\x4d\xe2\xf7\xf1\xb6\xed\x74\xc1\x78\x34\x28\xfa\x3b\xbf\x84\x19\x00\x97\x5b\x8e\xf9\x9d\x4f\xb4\x3d\xb9\x00\xe2\x91\x21\x66\x62\x4d\x81\x41\xd8\x1d\x33\x9a\x0a\x70\xbf\xb3\x30\x29\xdb\xe3\xe3\x77\x94\x90\xdd\x9c\x44\x53\x64\x48\x3c\x31\xc8\xd6\xa9\x2f\x20\x24\xc8\xf3\x44\x78\x99\xd1\x60\x32\x4d\x38\x21\xb3\xad\x3c\x0f\x50\xe1\x24\x2d\xa8\xb5\x20\xea\x25\xa9\x86\x8e\x98\xc5\x4d\xda\x37\x98\x92\x76\xdc\x85\xc5\xe8\xdc\xd1\xf2\xe0\x60\x09\x85\xcf\x29\xbc\xba\xd2\xa6\x92\xa0\x4c\x1b\x4c\xc4\x08\xdf\x2d\xd6\xb2\xc3\x72\x0c\xdc\x41\xc0\xe6\x1e\x6a\x9e\xef\x7a\x72\x16\x9e\x38\x4b\x77\x09\x84\x67\x62\xf5\xea\xe2\xec\x0d\xbc\x9b\x26\x26\x22\x91\x03\x34\xe3\x05\xac\xa5\xaa\xbe\x6b\x1b\x49\x0e\xbc\x9b\xc9\x62\xf7\xf0\x79\x4b\x3b\x7f\xc0\x53\xd6\xcc\xf6\x9b\x24\x8a\xb8\xbc\x8b\x71\x7d\xb6\x6d\x28\x52\xad\x01\x6d\x9b\x86\x9c\xf7\x64\xd4\x53\x31\xe9\xa1\xaf\x1e\xe4\xc6\xc3\xa6\x41\x09\xfd\xb6\x3d\x23\x0a\xf2\x02\x16\x32\xd1\x86\x17\x33\x4c\x27\x04\x2a\xa2\xe0\xc1\x64\x36\x65\x11\x0f\xe1\x07\xf5\x8b\x2a\xc1\xf8\x62\xd2\x6c\x6e\x29\xab\x06\xcf\x33\x30\x71\x71\xb6\x5c\x93\xcd\x23\x9d\xa5\xaa\x3d\x3e\xa7\xb8\x58\xee\xc3\x5c\xa6\x9a\xef\x70\x30\x3e\x1f\x63\x96\x14\x33\x9e\x52\x77\x68\x14\x00\x61\x08\x30\xe1\xc9\x42\xbb\x10\x67\x6b\xd1\xd1\xea\xb9\x04\x28\xa8\x1f\xb3\x46\x0e\x8d\x3c\x33\x2c\xcb\xc3\x21\x13\x13\xdc\x66\x27\x9d\x5d\x94\xb7\x89\xa6\x4e\x9a\x93\x79\x93\x73\x9e\x5b\xfd\xa0\x2a\xc6\x85\xcd\x2d\x95\x42\x8d\xaa\x2a\x9a\xc4\x18\xbb\xcf\xe1\xc7\xa2\x35\xd0\x68\xf0\x26\x8b\xc6\xbd\x8e\x91\x25\xfb\x83\x88\x76\x1a\x62\x82\x97\x88\x91\x93\x0b\xd7\x88\x56\x62\x46\x04\xb9\x74\x42\x72\x02\xb6\x23\xf6\xd7\xa5\x00\x14\xb0\x1b\xbd\xfc\xfb\xe8\x26\x89\xb3\x4b\x83\xc9\xae\x0c\x00\x44\xe7\xb4\x62\xc7\x48\xa6\x3a\xd4\xc0\x96\x1b\x35\x33\x2c\xa3\x0d\xf4\x60\xb7\x92\xb8\x28\x31\x5d\x8e\x3b\x27\x19\xa5\x5e\x60\x61\xa9\x7e\x46\xc6\xeb\xe7\xeb\x38\x04\xc4\xa5\x5e\x22\x11\xcf\x23\xd9\xdf\x35\xd5\xce\xc3\x0b\xc4\x74\xb8\x13\xc8\x37\x62\x1a\x6d\xf4\x4e\x42\x54\xe6\x7b\x41\x60\x6c\x61\xa7\xa2\x28\xbc\xb9\x68\x77\xf5\x75\x06\x32\x13\x87\x03\x7d\x32\x64\x40\x6c\xad\x62\xa6\x45\x5d\x6b\x2d\x08\x5b\x59\x8e\xa5\x16\x34\x41\x3c\x1e\x69\x91\x3a\x1f\x1e\x8f\x83\x27\xf8\xe7\xf0\x10\x51\x85\x37\x09\xe8\x14\x25\x98\x76\xc2\x78\x99\xb2\xdf\x28\x04\x48\x9f\xe6\x57\xe2\x19\x2a\x33\x75\xd3\x44\x03\x98\xa8\xe9\x04\x4b\xe6\x9c\x4d\xf0\x5a\x3e\x8d\xba\x30\x7d\x6a\x36\xda\x6b\x66\x27\xd1\x51\xd1\xfe\xc8\x6a\xc9\x5d\xe0\x21\x1c\x92\x73\x4f\x30\xe0\xfd\x30\x18\xd8\xec\xd6\x8d\x06\xee\xed\x29\xcd\x90\xd7\x0b\x16\x34\xbb\xc0\x0a\x00\x02\xf3\x79\xaf\x16\xd6\x32\x0e\xda\x48\x61\x33\x50\xf8\xe7\x38\xc1\x6b\x80\x83\xd5\x46\x0d\x9d\x42\xca\xf7\x6b\x12\x42\x22\x21\xe4\x6d\xbd\x9e\x7f\x01\x1c\x97\x5a\xdd\xd6\x49\x58\xb5\xe8\x8e\xd6\x32\xf7\x52\xda\x35\x69\xc3\x9a\x11\xa5\x41\xf6\xc9\x8e\x29\x3c\x28\xf8\xf1\x1e\x0f\x1b\x1f\xc0\x66\xdb\x69\xc8\x62\x09\x5e\x0f\xa6\x77\xcd\x0d\x5b\x3f\x63\xa1\x36\xed\x33\x55\x73\x12\x2e\xbc\x00\x7a\xa1\x97\x31\x0d\x9f\xda\xf9\x62\x1e\x67\x06\x10\xc3\xbc\x9e\x40\xcd\xc0\x5f\x85\xff\x49\xbf\x5a\xad\xfc\xfe\xa6\x22\x0b\xb1\x61\x63\x92\xe8\xb0\x72\x63\xd1\x78\x30\x36\x6e\x8e\xfd\xfa\x75\x20\xbe\xc3\x61\x73\x08\xd6\xb2\x31\xd9\x0d\x7e\x80\xaf\x01\x0f\xaa\x8a\x76\x9c\x6d\x47\xcb\x32\x8e\xb6\xa0\xa6\x00\x67\x5c\x62\x5e\x63\x5d\x7a\x12\x37\x91\xd1\x6f\x3c\x95\x4c\xf1\xe1\x1a\x67\x98\xac\x4a\x6e\xef\x84\x6f\x02\x38\x6a\x49\x48\x51\x4d\x48\x40\xf9\xc7\xc6\x38\x78\xcd\x89\xdd\xe8\x89\xef\x7e\x54\x6b\xb2\x0e\x8f\x1d\xbf\xed\x99\xb5\x3d\x77\xc0\x36\x7d\xde\xdc\xd1\x52\xde\x14\x62\x1e\x92\x79\xb5\x9e\xc4\xb7\xcb\xfc\x97\x8f\xef\xde\xee\x1a\xa7\x66\x9d\x29\x73\xc9\x2f\x69\x7e\xb6\x1a\x9b\xde\x46\x92\x4c\xa1\xc5\x32\x8a\x0b\xe8\x56\x55\xf8\x50\xb3\x90\x77\x19\x7d\x0f\xbd\x4f\x8e\x31\xeb\xca\x7d\x6d\x81\xee\x39\x4d\xc7\x64\x3b\xca\x1d\xe5\x04\x1b\x6c\xea\xa2\x99\x6b\x4c\x97\x43\x16\x6b\x1c\xb6\x39\x43\x2e\x3b\x8c\xa5\x82\x74\x33\x5f\x01\xc3\x0a\x27\x6c\x59\x03\xac\xd2\xbe\x15\x9f\xd5\x71\x91\xd0\xb9\x25\xcc\xac\xeb\x72\x4c\x90\xb5\xbc\x5a\x02\x5f\xf6\xa1\xe9\x3e\x58\xac\x7d\x69\x9a\x1a\xf9\xc5\xfb\x01\xa3\xb1\xc7\x7f\x43\x65\xf5\x65\x30\xf8\x07\xca\xa9\x62\xed\xef\xf0\xdc\xe1\xe5\xc1\xc1\x46\x81\xbd\xbf\x0f\x2c\x28\xdc\x09\x76\x6a\x96\xba\xbb\x11\xac\x9f\x5a\x8d\x51\x8e\x41\xbe\x56\xc0\x21\x6a\x89\x2b\x75\x9b\x27\x9a\x1f\x04\xd5\x41\x9f\xfe\x0d\xe8\xfe\x06\x74\x7f\x53\x26\xf5\x33\xfd\xb2\x2f\x84\xe6\x9e\x83\x12\xdc\xaf\x14\x2d\x03\xfe\x46\xf9\x6c\x34\x41\x9e\xbc\x44\xfe\x04\x7a\xe6\xe0\x23\xed\x14\x74\x73\xaa\xa3\xe8\xb6\xd7\x4a\x5b\xb6\x99\xcf\xef\xea\xb1\xb4\x6f\x41\xeb\x36\x5d\x30\x55\x87\xc7\xa8\xec\x78\x84\xed\xf3\x2b\x33\xc0\x54\x28\x90\x61\x86\xc3\x63\x16\xe8\x11\xf1\x9e\x45\x53\x33\x62\xa1\x25\x93\x80\xb3\x5e\x9e\x0e\xfc\xda\xbc\x83\xb4\x02\xb2\xe9\x34\xfa\x5c\xe7\x55\x91\xd0\x35\x98\x49\xa0\x6a\x32\x9b\xcc\xa7\xa0\x38\x7b\xa3\x66\x23\x23\x04\x1b\x32\xdf\x82\x80\x31\xd8\xd5\x2b\x92\x5d\xe4\xc5\x01\x64\xe0\xb9\x98\x9f\xde\x2c\x4d\xe3\x4f\x63\x18\x01\x1b\x29\xc7\x6b\x1e\x39\x74\x60\x30\x74\xbf\xda\x77\x8f\xea\xa3\x39\x33\x4c\xfb\x67\xd7\x32\xac\xad\x16\x54\x07\x8f\xf8\x0c\xf5\x43\xe3\xc8\xdd\x37\x88\xf2\xd8\x2e\x45\x51\xc2\x32\x34\x19\x41\xd3\x39\x66\x1d\x75\x6d\x21\x44\xa4\x8f\x2b\x9a\xb1\xf1\x94\x62\x0a\x3a\x7a\xaf\xc2\xb1\xc3\x87\xe0\x0f\xf8\x08\x38\xa7\x99\x3d\x9e\x3f\x99\x8d\x67\x20\xc6\x33\x40\x07\x80\x88\x3a\x24\x57\x5f\x6d\xa4\xd7\xb0\xa6\x3c\x14\x01\x6c\xf9\xa7\xf3\xd7\x4d\x1e\xd8\x44\x9c\x0c\x9e\xa7\xcf\xac\x1a\xd9\xd5\xb1\x90\x85\x06\x12\xdc\xd3\x26\x79\x0f\x2c\x4d\xb9\x4a\x7e\x45\x5d\x84\xe7\x54\x94\x1e\x3d\x3f\x84\x9d\xf3\xec\xeb\x28\x0e\x22\xeb\xce\xb3\xfb\x3e\xdb\xdd\x2c\x30\x11\xb7\x49\x4e\xc9\x88\x65\xef\xb8\xd9\x58\x02\x0a\xeb\x15\x22\xa5\x0b\x58\xbc\x28\xe9\xca\xcf\x2a\x50\x5e\x13\x84\xcb\x58\x7a\x65\x94\x29\x90\xda\x15\x6a\xc4\x0d\x85\xf0\x56\x41\xe4\x5e\x99\xfa\x51\xc9\x3f\x98\x2b\x07\xa4\x1a\xe2\x07\xe3\x04\xe0\xa4\xdf\x46\xb1\x65\xfe\x69\xb9\x14\xab\x67\x5e\x81\xe7\x93\x16\x9a\xbe\x16\xa8\x8d\xd5\xf8\xe6\xa6\xfa\xfc\x58\xab\xd0\xef\xb4\x7c\x84\xf5\xde\x19\x91\x57\x20\xc4\xed\xd3\x7b\x8a\xd7\x4f\x22\x57\xfe\x70\xf9\xe3\x00\xe5\x01\x1a\x92\x8b\x1c\xd4\xa7\x0b\xec\xd6\xad\x13\x08\x39\x5d\x39\xea\x1c\xd5\x4a\xf4\xad\x63\x2b\xdf\xf5\x87\xc6\xc4\x18\xce\x86\xc6\xd4\x70\x66\x10\x66\x21\x60\x66\xb1\xbe\xd4\x01\x24\x2e\xb8\x0c\x48\x78\xe4\x8a\x6c\x4b\x40\x00\x5a\xc7\x18\xc6\xb8\x6b\x33\x62\xea\xe5\xb5\x8b\x5a\x13\xae\x61\xe1\x3b\x73\x18\x21\x68\x29\x84\x29\xf8\x43\x27\x02\xf8\x00\xb6\xcd\xf5\x1c\x53\x3d\x62\xba\xc6\xd3\x56\x73\xe7\xac\x43\x83\x1b\xc3\x1d\x35\x3e\xb8\x9b\x9a\x4d\xa6\x2a\xa5\x6f\x1c\x18\x96\xf3\x5f\x0d\x10\x59\xe3\x48\x9e\x29\x0a\xe9\xd5\x17\x56\xdd\xd8\x8c\x66\xcc\x96\xd9\x57\x28\xfc\x60\xf4\xf0\xda\x12\x60\x1a\x6f\x75\x52\x9a\x23\x4b\x7a\x73\x65\xdd\xf0\xc2\x0d\xc8\x55\x4f\x74\xf1\x24\xb8\xa4\xa1\x40\x52\xef\xd0\xe7\x8e\x60\x9f\x74\x86\x6a\x2c\x9e\x84\xe3\x50\x9f\x85\xce\xc0\xb1\x85\x53\xdd\x85\x1b\x68\x13\x77\xe8\xea\x8c\x40\x43\xc4\x1f\x62\x6c\xaa\xb2\x36\x3b\x9b\x1d\x4f\x2d\x4a\xd4\x8e\x55\x82\x0b\x78\xee\x6a\x68\x8c\x2f\x98\x1e\xc1\x3b\x2d\xf8\xcc\x27\x81\xb4\xa9\xf8\x23\x19\x02\xa6\xdb\xa1\xaa\x48\x33\x26\x68\xd9\x71\xdd\x62\x1e\x04\x4e\xe3\xb8\x87\xf4\xd8\x05\x61\x3d\xfc\xcb\x3b\x9d\x6e\xba\xa8\x05\xd8\xbe\xca\x97\xb0\x91\xe3\xc6\x35\x95\x91\x40\x28\x02\xbe\x03\x9f\x3a\xe8\x04\xbc\x86\x16\x2a\x18\x43\xb5\x83\x42\xcc\x7e\xb1\xce\x04\xb7\x2a\x32\xd3\xef\x01\x52\x99\xa0\xb9\x5a\xb0\x0c\x2c\xec\xb2\x23\xa8\x58\xc1\x79\x8c\x09\x84\x95\x28\xf2\xe4\x4a\x98\x29\xa5\xae\x56\x02\xfd\x12\xbc\xd4\x9d\xed\x0f\x75\xfe\x82\x2c\xa0\xbe\xeb\xd4\xc4\xf8\x29\xc5\xf8\x00\xac\xd4\xf9\x0a\xe5\x01\xdb\x08\x8b\x5e\x11\x8f\xca\x6d\x1e\x8d\x15\x20\x4d\x59\x97\x1e\x30\xdc\x78\x5a\xc6\x61\x26\x13\xa5\x7b\x77\x5d\x80\x75\x3a\x3e\x9c\x5b\x77\xc2\x0e\xc5\x4c\x80\x81\x0c\x21\x48\x12\x74\xc0\x47\x09\xfe\x39\xb6\x94\x88\x1e\x62\xb5\xee\x55\x32\xb9\x03\x0b\x02\xc8\x0b\x4e\x27\xa3\xc8\x51\x35\x64\xd6\xb0\x7a\xc7\xc8\x19\x65\x92\x58\xc2\x23\x06\xe3\xd4\xa1\xb9\xe8\xba\xb3\x04\x26\xc5\xe2\x7e\x59\xb4\x55\x86\x13\x23\xf3\xe7\x7d\x0e\xb9\xb0\x3c\xe0\xa4\x43\x46\x08\xd3\x03\xaa\x07\xe8\x9c\x8e\x0b\xe9\x3a\x97\x8f\xf7\xd1\x60\x2e\xcd\x84\xd9\x8f\x28\x9e\x21\xc5\x33\xe2\x05\xee\xca\xa5\x0b\x03\x60\x00\x26\x8f\x42\x2d\x62\xa7\xb3\xb1\x8e\xc0\x8c\x51\xae\xfa\x45\x8a\xe0\x18\x99\x2f\x6f\x1f\xce\xf9\x31\xaa\x21\x58\xd1\x47\x60\x3d\xff\x87\x5d\x72\x02\xd8\x09\xa8\x78\x0a\xff\x67\x68\x8e\x2f\x51\xca\xd3\xb8\x10\xa8\xfc\x97\x5a\xd2\x78\x77\x6b\x15\xed\x89\xda\x5f\xc5\x44\x8b\x49\x90\x7e\xa9\xe4\xf1\xc7\x5d\xa2\x7e\x17\x35\xe7\x86\x1a\x75\x94\x0f\xd1\x8f\x54\x16\xad\x7d\xa4\x0c\x6e\xd0\xd1\x05\xda\x87\x05\x15\x29\x85\x70\x32\x69\x19\x48\x45\xd5\x1c\x1d\xbf\xf6\xbd\x8b\x33\xdb\xe2\x13\x05\x1b\x00\x1f\x84\x5e\xe9\xc9\x0c\xa8\xb1\x28\xf2\x6c\x69\x10\x4c\xd0\xa5\xe0\x7a\xdf\xe4\xd7\xda\xf5\x6a\xc7\x86\xa4\xfa\xf6\x1f\x67\x6f\x5e\x95\xe5\xf2\x5c\x5e\x02\xa6\xb8\xda\xce\x97\x02\x43\x1d\x00\x1d\x51\x1e\x82\x1f\x59\xaf\x12\x46\x0e\x65\x0d\xe1\x2b\xfc\x2c\xbd\xa2\xb8\xce\x57\x78\x42\x03\xe2\x00\xb1\x76\x78\x0b\x61\x62\x29\xc0\x7a\x67\x73\xd1\x0d\x9b\xfe\x07\x56\x1a\xda\xd4\xe2\x23\xb6\x00\x31\x0b\x31\xa4\x2c\xd7\xc5\x13\xfe\x70\x34\xc2\xeb\x8c\xf2\xf5\xf1\xa3\xd1\x08\xf0\x4b\xae\x92\x11\x28\x97\x8e\x81\xcf\x06\x2b\x09\x9e\x40\xc8\x82\x68\x46\x8b\x9f\x6a\x41\x2f\xdd\x26\x20\x5f\x98\xaa\x5a\xc5\x5e\x12\x7f\x17\x30\x3d\x86\x7d\xb6\x74\x22\xf1\xec\x16\xad\x12\xb2\x05\xb4\xe0\xe5\xe9\x85\x64\x93\x5c\x27\x91\x22\x4a\xc5\x88\x57\x40\xb2\xa0\x13\x7d\x3a\x1f\x39\x44\x36\x1a\xcc\xc0\x00\x2c\x96\x97\xac\x8f\x90\xd1\xe3\x01\x7a\x2c\xe8\xc6\xd7\xe5\xec\xf0\x7f\x0d\x8c\xd4\xc0\x4c\x6f\x4e\xbf\xc4\x36\xbb\x27\x38\x09\x02\xb1\x2c\x77\x0c\xcd\x06\x98\xfa\x39\xfa\x19\xc6\xdc\xc8\x27\xb5\x67\x21\x82\xeb\x32\x33\xc4\xb4\xa9\x4a\x52\x22\x97\xb9\x90\xba\x34\xe3\xdb\x0b\x95\x2c\x70\xe5\x0f\x84\x43\x94\x15\x6e\x4c\xee\x0c\x8f\x83\x0f\x0e\x66\xdd\x94\x36\x02\xb9\x17\xf9\x2a\x85\xc8\xc8\x93\x29\x3c\x43\xad\x63\x80\x63\x74\x6e\x42\x8b\x18\x74\x63\xd5\xbd\x13\x3d\xc8\x57\x03\xdd\xd7\x1e\x3c\x8b\x44\x70\x39\x80\x36\x83\xbf\x1a\x36\xfd\x35\xc8\x97\x32\x01\x98\x0d\xfe\x4a\xf5\x85\xf4\xbf\x0c\xad\x42\xc8\xb7\x0c\xd3\x2d\x2c\x54\xf6\xc1\xd0\x77\x17\x91\x62\xdf\x0b\x2e\xbf\x19\x43\x53\x87\x6e\x96\x3d\x97\x37\xd7\x4d\x00\x29\x50\x81\xe7\xc6\x88\x06\x61\x88\x63\x71\xfc\xaf\x9f\xe5\xbb\x97\x85\x79\x0a\xda\xd0\xde\xe9\x7d\xf4\x2f\xf4\xfe\xdb\xd9\xa3\x60\x15\xc3\x0e\x59\x63\x1f\x7d\x76\x23\xdc\xe0\xb0\xa2\xfb\x32\x8d\x11\xca\xc1\x0f\x44\x19\x94\xb9\x00\x34\x51\xd0\x49\x04\x48\x6d\x8d\xd9\xc7\x39\xba\x74\x16\x69\x09\xdf\x91\xaa\xf8\xa7\xf9\x7e\xa0\x19\x77\x52\xcb\x9c\xff\x3f\x1a\xb1\xde\xe4\x7d\xf5\x30\xef\xa8\x9b\x63\x90\x15\x1f\xa4\xde\x25\x6e\x20\x99\x94\x81\xda\x16\x03\x8c\x74\x43\x2f\xdb\x3b\x96\x24\x53\x4a\x71\x8b\x62\x59\x0b\x41\x05\x27\x23\x32\x34\xe9\xa7\x17\xea\x3e\x19\xb9\x00\xe2\x1c\x7c\xc4\x6a\xbd\x9f\x10\xec\xb8\xbd\x37\xc7\xd0\x2f\x86\x84\x9e\xf3\x21\xf4\x1b\x02\x54\x27\x29\xc6\x33\x3f\x8b\x3d\xb7\xfd\x3c\xbc\xc5\x34\x09\xc8\x8b\x66\x4d\x6b\x30\x9f\xea\xc8\x1b\x4f\x16\x50\x2b\x78\x57\x2b\x1a\xcb\xd9\x1a\xce\x36\xfb\xb8\x49\xf6\x63\x20\xdb\x05\xb2\x0f\x0c\x40\x9d\x6b\x04\x5b\xd4\x46\xaf\x53\xb8\xe1\x50\x38\xcd\xe1\x81\x1c\x91\x07\x5d\x50\xd6\x92\xf5\xac\xeb\x40\xbc\x36\x5e\xf5\x0e\xbf\x4f\xbf\x5e\x43\xc4\x1a\x53\xec\x0b\x88\xda\x6f\x33\xad\x98\x67\x7d\xdc\x84\xa7\x0d\xd4\x15\x80\x46\xc3\x69\x13\x8b\x8d\x3d\xfa\xc0\x43\xc6\xaa\x58\x03\xfb\x26\xf0\x83\x0a\x91\x88\x52\x0c\xf0\xa5\x6e\x08\xc2\xfe\xcf\xd9\x29\x7b\xc1\x5e\xb2\x57\xdc\x98\xe4\x94\x47\x18\xc8\x74\xc2\xd4\x60\xaf\xdb\x32\xba\x85\x0a\x45\xbf\xb4\x45\x52\x89\xa0\xec\x57\xde\x02\x0c\xf6\x06\xdc\x73\xa3\x61\xec\x8c\x1f\x99\xae\x63\xfe\x59\xfd\x04\x51\xb3\x05\x21\xfe\x4f\x5f\xed\xaf\x93\xaf\x53\x08\xf3\xad\xca\xfc\x3a\xb1\x87\xee\xd7\xa9\x05\xe1\xf4\x5b\x7e\xf4\x75\x62\xc2\xab\x05\xed\xb9\x69\x54\xff\xaf\xb2\x28\x5b\xf0\xf5\xa1\x05\x4d\x8e\xd8\x3b\x7e\xf4\xa7\x79\x72\x7e\x7a\x52\x3d\x3d\xf9\x78\x5a\x3d\x3d\xaf\x9e\xbd\x7b\x03\xff\x9f\x9d\x9d\xbc\x7d\x5e\x9d\x9e\x3d\x3d\x7d\x5e\xbd\x3a\xaf\x5e\x9f\xbd\xac\x5e\xbf\x7d\xff\xe9\xa2\xfa\xf5\xf4\xf3\xcb\xd3\xb7\xd5\x9b\xd7\x6f\x7f\xad\xce\x4e\x2f\x4e\xaa\xf7\x27\xe7\x27\x67\xd5\xc7\x77\x9f\xce\x9f\x9d\x56\x17\xe7\x27\xcf\x7e\xad\x7e\x7f\x7a\x6e\xed\x1f\xb1\xf7\x5d\x41\xae\xc7\x21\xee\x1a\xdd\xc0\x66\xe7\xfc\xae\x23\x5b\x4e\x17\x39\x7c\xe0\xf2\x1e\xe5\x87\x6d\x03\x12\x95\x69\x82\x9f\x1d\x3c\x6f\xbe\xd6\x39\xd5\x37\x47\xb7\x8a\xd0\x4e\xbb\xcf\xf5\x96\xa9\x73\x8b\xed\x9e\x78\x07\xa5\x2b\xe5\x9e\x84\x28\x9d\x48\x01\xc9\x68\x5e\x6a\xd6\x4d\x7b\xf7\xe8\xa6\x6e\xfd\xa1\x6a\xd6\xf6\x74\x26\xd3\x9a\x7d\xc4\xcb\x8a\x17\x98\xac\xd2\x19\xb6\x1e\xf6\x61\x4d\x26\x5e\x7e\x60\xb3\xe7\x6d\xdf\x8c\x3b\xcd\x8a\xf5\x4a\x90\xdd\x7f\xfe\xee\x4c\xdf\x7f\x03\x37\x81\xf6\x05\xf1\x84\x08\x07\x65\x3e\x48\x65\xd4\x7e\x94\xca\x84\xc9\x51\xaa\xe6\x1b\xc4\x05\x5d\x95\x03\x1b\x2e\x66\x71\x06\x30\xd4\x90\x7b\x32\xa7\x28\x09\xc3\x6e\x3c\x6c\x06\xb4\x18\x41\xa4\x41\xe7\xce\x1b\x1c\x73\xcf\x1d\x6f\x8c\xe0\x97\x76\x03\xfd\x99\xbc\x73\xe4\xab\x8f\x85\xa8\xb8\xf9\x5a\xa8\xbd\x90\xe3\xd7\x18\x6e\x81\xad\xa3\xed\x8d\xcd\x45\x87\xad\xf8\x61\x92\xbc\xe9\x80\x51\x9b\x6c\x36\x03\xc4\x4b\xa9\x44\xbc\x80\xe1\x53\x99\xbc\x71\xa1\x0a\x45\x1b\xc6\x5e\x02\x96\x4d\x20\x5c\x53\x3a\x9c\x3c\xb9\x1c\x5f\x82\x1e\x8b\xc9\xe5\x14\x71\x3d\xc0\x36\x3c\x27\xdf\x85\x4f\x3d\x02\x6f\xca\x6d\x79\x68\xfc\xf5\x99\x3a\x05\xfe\xd8\x17\x63\xc0\x1d\x5d\x55\x80\xe5\x35\xde\xde\xeb\x07\x58\xde\x46\x80\x25\x91\x2e\xc6\x10\x10\x1f\x02\x4e\x45\xf1\x20\xc6\x7f\x62\x78\x81\x9d\xfd\x8e\x7f\xfe\xc0\x3f\x4d\x06\x75\xa4\x92\xc1\x2a\xb7\xca\x3c\xba\xeb\xea\xfb\xfc\xf8\x5f\x20\x3f\x81\x8e\xa3\x77\xad\x0b\xb3\xef\x3f\xc8\x83\xe3\xba\x48\x2e\x38\xe5\x75\xd6\x89\xd8\xc0\xe0\xf7\x08\xdf\xfb\x44\x00\xf2\x1d\x88\xdd\x32\x28\x6e\xe2\xa2\x2c\x06\xf2\x1c\x66\x20\xe5\x0d\xa5\xd2\x6b\x2f\x71\xc6\x19\xc8\x66\x5c\x6a\xa1\x0b\xf8\x6f\xdd\x83\x8c\xd1\x13\x54\x7c\x2c\xdc\xfc\x4a\x25\x64\x33\xfc\xee\x64\xce\x37\x0f\xd7\xba\xa9\x4a\xdc\xb2\x7d\x2e\x99\x55\x83\xbf\x94\x27\x68\x98\x28\x1c\x47\x20\x0e\xf8\xe5\x14\xdd\x54\x95\x0c\x09\x3b\xf9\x6f\x36\x47\x04\xde\xc9\x87\xf7\xce\x09\x09\xd5\x75\x8e\xe6\xb6\x07\xde\xd5\xb3\x99\x4e\x9d\xd6\xf9\x4a\xa9\xff\xa0\xd3\x51\x25\x16\xf8\xb2\x71\x92\xd8\x2b\xc2\x40\x79\x6f\x86\x21\xf4\x56\x0e\x1d\x6f\x7b\xee\x3e\x57\x62\xbf\xc1\x10\x10\x74\x6d\x1d\x94\x3c\x24\x35\x2d\xd6\x7e\xd0\x66\xa9\xee\x15\x93\x87\x96\xca\x83\xc7\xfc\x13\xf7\xf1\x34\xbb\x7b\xfa\xd1\x35\xec\x35\x58\x0b\xbf\x7f\x9e\x03\x91\x26\x8a\xcd\x42\x3b\x69\x4c\xc6\xe1\xa5\x63\x5c\x1c\xbf\x64\xbf\xe3\x8f\x8f\x97\x84\x81\x5a\x2c\xab\x6b\x75\x5f\x12\x13\xab\x7a\xb1\x3d\xc1\x0e\x80\x00\xbc\xa8\x08\x7b\xfc\x19\x80\xf7\x9e\xbc\x26\xf3\x02\x6f\x58\xdc\xf7\xe1\xa5\x86\xb1\x87\x5f\x9e\xf8\x3e\x26\xc2\x3e\xe3\xc7\x6c\x2f\xcd\xcf\x78\x4a\xf1\xc2\x5c\x82\x2a\x41\x64\x6d\x2e\x4d\xf9\xde\x59\x92\x54\xc1\x9a\x1a\x30\x22\x8a\x54\x66\x63\x0f\x74\x82\x48\xb2\x29\xc4\x73\x9a\xed\xed\xe8\xba\xc0\xd0\x1f\x0e\x71\x1c\x74\x11\xf7\xb5\xe0\x04\xaa\x53\xef\xc6\x0c\xfd\x43\x30\x77\x16\xc3\x2b\x1e\x78\x81\x4f\xcf\x6f\x2a\xc3\x21\x7a\x87\x79\x46\x06\x1b\xba\xfb\xc2\xae\x8b\x43\x1d\xde\x7f\x0e\x63\x39\x9b\x24\xe1\x14\xc2\xbe\x86\xd0\x00\x2f\x2a\xfc\xc3\xfd\xaf\xde\x11\x68\x73\x0a\xb3\x91\x11\x47\xef\x38\xf6\x4d\x8f\xae\xcc\xb8\xe1\xc4\x9b\x3a\x21\x46\x17\xed\x45\x08\x0f\x6f\x82\xc9\x83\x17\x9f\xcd\x7d\xbc\xa4\x7f\xa7\xf3\xe6\x00\x00\x19\x65\x9a\x8d\x9f\x0c\x26\xb3\xe4\x08\x74\x6b\xbc\x8a\xff\x9e\x2d\x48\x6a\x9a\x04\x0b\x39\xbe\x2e\x6b\x40\xe9\x90\x87\x9b\xea\xa0\x4f\x3e\xe6\x3e\xaa\xe5\xa3\x1d\x2d\x5a\xdb\xde\x9c\x86\x1e\xd3\x77\x76\xbf\xa8\x6f\x77\x7b\xc7\xa4\x2c\xe0\xdd\x76\xe0\xd2\xda\xd7\x87\x53\xba\xd1\xa9\x69\xf2\x75\x3a\x75\xee\xf3\xbf\x11\x15\xa1\xbd\xc5\xe3\x2c\xb0\x73\x96\xbc\x05\xe2\xff\xd0\xf5\x87\xd2\xfc\x0d\x68\xad\x03\x02\xba\xa2\x18\x80\x04\x0c\xc0\xa8\x60\x03\xaa\x28\x06\xca\xc9\xd3\x07\xb8\x92\x31\x60\x79\x17\xa4\x45\xfa\x9c\x00\x42\x0f\x10\x32\xe2\xa1\xe6\x3f\x97\xb9\xff\x8d\xc3\x0a\xd7\xc8\x33\x2c\x97\xc9\x09\x80\xec\x00\xf2\xf3\x25\xe5\x2b\x0c\x08\xe9\x66\xd3\x2e\xcf\x25\x7b\x4e\xfb\x87\x0d\xe3\x1f\x1c\x84\x98\xde\x90\x9f\xaa\x13\x10\x0b\xf6\x7f\x8f\xe3\xa1\x20\x5e\x5b\x25\x20\xb5\xcf\x4b\x3c\x55\x9b\xea\x84\x21\x1e\xf2\x74\x78\x6f\x7b\x61\x78\x8a\xf2\xf7\x06\x5c\x90\xc8\xd0\x06\xf5\xab\xcb\xd2\x0b\x22\x6a\xa1\x0f\x1c\x7a\x5b\x17\xf1\xde\x1e\xb3\xee\xce\x75\x5e\xf0\xb3\xdf\xb9\x8d\xb7\x8f\x00\x4a\x37\x6b\xd9\xdb\xe0\xd3\xa9\xdd\x91\x5b\x6b\xb8\x79\xe4\x32\x8c\xd4\x3d\x49\x1c\x87\xcd\xb7\x48\xc7\xef\x75\x65\x4c\xda\x2b\xc6\xcb\x4c\x31\x04\x6d\x0c\xd0\xd2\x76\xa7\x4e\x2d\x98\xb4\xb9\x1d\x8a\x66\xc1\x78\x2b\xac\xd7\xb5\xdc\x5d\xd5\x72\x76\x4b\xea\x47\x5d\xa9\x8f\x41\x6a\xc7\x20\xb8\xdd\x6a\xf9\xd5\x44\x4f\xfe\xe9\xf2\xe8\x25\xb4\xed\x85\x7b\x80\xd3\x2e\xf1\x92\xe4\x95\x39\xd7\x1f\x46\x5f\x0e\xd5\x51\x97\xf6\xb0\x29\x8a\xeb\xc2\x4a\x26\xe9\x94\x2f\xe0\x0f\x0d\x9e\x41\x70\x98\x58\x2c\x97\xdd\x9b\xce\x23\x76\x69\x39\x40\x4f\x06\x12\x04\x34\xe5\x43\xf3\x10\x6f\x33\xe6\xbd\x49\x75\x84\x69\x0d\x33\x69\xab\x97\x7c\xa7\xbe\xbb\xdd\x6d\x77\x36\x95\x7e\x6f\x54\x55\x71\xb7\x17\xae\xdb\xb7\xc1\xb0\x95\xf9\xea\x96\xf2\x8e\x94\x9a\x73\x4d\x14\xd6\x6f\x5d\x6d\x68\x5a\x4d\x96\xae\xa1\x42\x12\x6a\x0b\x64\x35\xfd\x8c\x29\x61\x4a\x88\x51\xca\xb8\x4c\x04\xdb\x92\x9b\x39\x9e\x25\x80\x3e\xec\xaa\x80\x4d\xdf\x50\x36\xe0\xfc\xbd\x8d\xeb\x5a\xab\x3f\x26\x42\xbc\xb4\xe7\x69\xd1\x16\xcd\x76\x98\x9f\xcf\xf9\x5a\x7e\x84\x83\xc2\xa1\xcd\x89\xd9\x7c\x80\xa3\x4c\xd2\x39\x96\x32\x65\x7f\x2c\x0d\x06\xb1\x0b\x42\xc1\xb4\x3b\xab\x69\x19\x4d\x14\x3f\xf3\xc1\x25\xb4\x54\x21\xa9\xdc\x90\xd6\xc0\x68\x4a\xfd\x35\x04\x0c\x1f\xd6\x62\x75\x2b\x11\x3b\x5f\x77\x97\x51\x88\x6e\xd5\x15\x6b\x53\xed\xdb\x86\x89\xb2\xcb\xed\xb1\x8e\xce\x80\xe3\xd1\x8d\x7a\xb6\x24\xfa\xdf\xcc\xd6\x6f\x72\xaa\x89\xda\x89\x49\x53\xb4\x6b\x4d\x3c\x40\x07\xce\x9d\xdc\x5f\xe7\xa3\x77\x9d\x9b\x90\xdd\x8e\x2c\xc5\x6d\x9a\xb2\xb8\xcd\x82\xde\x34\x4d\x7e\xc3\xdf\xed\x80\x45\x53\x34\x07\x26\x72\xc1\x08\x2a\x71\x43\x66\xc5\x0d\x89\x20\x0e\x0f\x67\x94\x33\x56\xcb\x43\x60\x19\x02\xf0\x82\x5f\xbc\x8a\x52\x4b\x34\x6e\xa8\xdc\xba\x01\xce\xab\x5d\xbb\x89\x87\xf8\xfa\xe2\x1e\x60\xf0\xf6\xeb\xd9\x99\xba\xd9\xa6\xbf\xa7\x68\x40\x32\x42\xe4\xe8\xb1\xae\x20\x94\xec\x01\x5c\x96\xe7\x62\x20\x94\xe4\x73\xe8\x17\x8f\x23\xe5\x11\x50\x93\xd8\x9f\xb4\xff\x0a\x41\x43\xaf\x84\x5f\x04\xf3\x7a\xbc\xf1\x6c\xcc\x64\xcd\x29\x29\xb9\x27\x43\xc8\x9d\x57\xad\xe4\x41\x20\x6d\x3b\xfa\xe9\x26\x31\xd5\x64\xab\xf8\xfd\x79\x7e\xf4\xe4\x9d\x4c\x78\xe0\x7e\x77\x3a\xef\x55\xd5\xcf\xfc\x11\xaf\xba\xa9\x6b\xd9\xbe\x53\xa2\x7a\x90\xc8\xe2\xd5\x08\x77\x57\x60\x6a\x77\x93\x8b\x35\x0c\x00\x3f\x2b\xfa\x9e\x74\x47\x6b\x82\x37\xbd\x1e\x0d\x82\x99\xf5\x52\xe7\x2e\x5a\x18\x67\x63\xf0\x56\x0f\x64\x06\x8f\x37\x47\x16\x55\x45\xd9\x3d\xab\x7f\xe5\x40\x1e\x64\xf0\x67\x32\x09\xc9\x24\xdb\xa0\x94\x63\x5a\x50\xbe\xe1\xc9\xa7\x4e\xdc\x72\x6f\x5b\x79\x02\x79\xc4\xb6\x85\x1b\x4d\x99\xde\xc5\x1c\x81\x8d\x21\x92\x0b\x53\x64\xd7\x2b\x6f\xf9\x71\x1d\x04\xa2\x28\x1c\xfd\x4e\x7a\x63\x55\xd5\x77\xbc\x8f\x6d\xce\xcc\xb9\x09\x1d\x08\x6b\x32\xcf\xa2\xf3\x59\x7a\x21\xf9\xdc\x18\xb3\x73\xfd\x32\x52\xff\x68\x82\x27\x2b\x9a\x6b\xcc\xf8\x01\xce\xe3\xa8\xf9\x58\x0b\xa4\x17\x6f\x40\x93\xf8\xc8\xa6\x66\x44\xf7\x9e\x55\x4e\xb2\x24\x41\x32\xa3\x5e\x03\x0b\xf3\xdc\x9b\xcb\x69\x14\xcc\xd1\xda\x39\xc5\xc4\xaa\x3c\x25\x0c\x76\x1e\x95\x06\xa0\x28\xfa\x80\x2b\xb0\xea\x9d\x02\xbf\x85\xde\x19\x1e\x69\x41\xbf\xd6\xb0\x35\xcf\x74\x4d\x3f\x2e\x41\x14\xe9\x26\x4b\xa7\x95\xb4\x77\xcb\x62\x57\x42\x21\x84\xc0\xd1\xab\x2a\xbc\xdd\xab\x9b\xd9\x33\x0f\xad\xda\x2d\x44\x9a\xa2\x36\x8d\x26\xa3\x04\x78\x48\x45\xb7\xd7\xe0\x84\xf3\x6b\x57\xfe\x38\xf8\x71\xe5\xae\x56\x32\x01\xd1\x7c\x0e\xae\x5f\xe5\x2f\x88\xfd\x32\x5f\x95\x85\xdb\x7f\xe5\xa9\xb3\xe3\xf0\x55\x0e\x7d\x70\x20\x7f\x6d\x2f\x0d\xf5\xb3\xb9\x7d\x06\x90\x02\x39\x0f\x8e\x8e\x7e\x1a\x14\xf9\x7a\x15\x88\x33\x6f\xb9\x04\x05\xfe\x74\xfe\x86\xeb\x7f\x5b\x28\x8d\x33\x7b\x51\xe0\xa1\xfc\x83\xff\x0b\x00\x00\xff\xff\x5e\x87\x38\xfe\x9a\x48\x00\x00") func uiJsLibsMithriljs020MithrilMinJsBytes() ([]byte, error) { return bindataRead( _uiJsLibsMithriljs020MithrilMinJs, "ui/js/libs/mithriljs/0.2.0/mithril.min.js", ) } func uiJsLibsMithriljs020MithrilMinJs() (*asset, error) { bytes, err := uiJsLibsMithriljs020MithrilMinJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/js/libs/mithriljs/0.2.0/mithril.min.js", size: 18586, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiJsLibsMithriljs020MithrilMinJsMap = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xac\xbc\x5b\x53\xea\x4e\xdb\x27\xfc\x5d\x56\xdd\x67\x5a\x8f\xa2\xe2\xe6\x7e\x8f\x92\x4e\x08\x31\x46\x84\x88\xc8\x7a\x6b\x6a\x0a\x21\x42\xd8\x04\x0c\x01\xd1\xa9\xf9\xee\xd3\xd7\xef\xd7\x21\x41\x5d\xff\x7b\x3d\x53\xb3\x0e\x96\x49\x77\xa7\x37\xd7\x7e\xd7\xfc\xaf\x5f\xdb\x38\x5b\x27\xcb\xf4\xd7\xbf\xcf\x8f\x7f\xbd\x26\xf3\xf8\xd7\xbf\x7f\x2d\x92\x7c\x92\x25\xf3\xff\x5a\x24\xe9\x7f\x4d\xd7\xbf\x8e\x7f\xad\x97\x9b\x6c\x18\xaf\x7f\xfd\xfb\xff\xdf\xf7\xe9\xf6\xff\x71\xfc\x2b\x1d\x2c\x4c\xb3\x1e\x35\x58\xad\xf4\xff\xef\x49\x3a\x5a\xbe\xeb\x87\x4d\x3a\x8a\x5f\x93\x34\x1e\xe9\xe7\x24\x4d\xf2\x64\x30\x4f\x3e\x63\xfd\xf2\xaf\xd1\x72\xb8\x59\xc4\x69\xae\x9f\x2b\x8f\xff\x9a\x2f\x87\x83\x5c\xb6\x72\xfc\xab\xf2\xf8\xaf\xe1\x20\x1d\xc6\x73\x2b\x4d\x16\x68\x6a\x64\x7a\x4d\xdd\xfe\xa7\xe6\x79\x3c\xc8\x1e\x93\x45\xbc\xdc\x60\xd2\x2c\x7e\xdb\xc4\xeb\xfc\xdb\xb8\x3f\xb5\xaf\xe3\xbc\xfc\x5a\x77\x0d\x27\x72\xb2\x6c\x0c\x30\xcc\x93\x21\x97\x9e\xcf\xd9\x8a\xbd\x4b\xd7\x64\xb0\xb6\xf2\x3c\x93\xc7\xfc\x63\x25\x83\x5a\xf6\xad\xab\x1e\x65\x98\x69\x1f\xce\x07\x6b\x0c\xba\x37\x3b\x8d\x31\x4b\x3e\x18\x17\x9d\xb1\x0c\x8b\x1e\x3b\xfe\xbd\xa7\x1f\xdc\x2c\x5b\x66\xfa\xef\x6a\x90\xad\x63\x79\x88\x77\xf1\x50\x60\x29\x00\x5d\x6d\xd6\x13\xf4\x25\x99\x59\xe2\xa1\x18\x36\x9c\x24\xf3\x51\x16\x03\x8c\x71\x3a\xce\x65\x9c\xd5\xe9\x58\x7d\x33\xd0\x2c\xaf\x77\xdc\x7a\x4f\x1f\xb2\xe5\x2a\xce\xf2\x0f\xdd\x30\x5d\x26\xf2\xcd\xcb\x46\x7f\xce\x65\xf5\xd9\xdc\x79\x6c\xd0\xc3\xf7\x47\xec\x96\xcf\x6a\x30\x9c\xc4\xfb\x37\x5f\xa3\x7b\x27\x18\x1d\xe4\x03\xc0\x48\x77\xca\x3c\xeb\xc9\x72\x33\x1f\x75\x62\xbd\xf4\x00\xc0\x4c\xcc\xc0\x78\x94\xe4\x83\x97\xb9\xcc\x00\x32\x5a\x0d\x08\xdc\x65\xfa\x9a\x00\xdc\xf9\x32\xca\xb3\x24\x95\x05\x81\x99\xcd\x4b\x9e\xc5\xf1\x7e\xee\x47\xc2\x59\xd6\x33\x8f\xe9\x72\x04\x10\x2e\x5f\x5f\x35\x1a\xe5\xb3\x74\x54\x90\x04\x67\x5e\xe7\xd9\x66\x98\x03\xac\x09\xe1\xc3\x76\x4d\x6d\x24\xe0\xf9\x07\x76\xa8\xb7\x9a\x73\x49\x2b\xcb\x06\x1f\x6a\xb9\x01\x0c\x1c\xf7\xce\x7d\xf4\x5b\xf7\xfa\xd1\xbf\x8f\xdc\x8e\x79\x0e\x5b\x4f\x2e\xf0\x93\xac\x73\xee\x97\x87\x0e\x07\x32\x53\x92\xfa\x23\x0d\x1f\xcd\x00\xd8\xdc\x2c\x96\x25\xf4\xfc\x24\xef\xf1\x06\xf8\x9c\xb2\x67\xed\x24\xaf\xaf\xc4\x22\xce\xa8\x48\x23\x72\x46\xf3\xf8\x9a\x2d\x85\xd7\xe2\x3d\x5e\x86\x99\x06\x6d\x5c\xe2\x89\x33\xcb\x4a\x2b\x8d\x5b\xd0\xc3\x20\x1d\xc7\x64\xe3\x2c\x37\x7f\xd4\xbe\x31\x8d\xdf\x55\x81\x2b\x1c\x76\xff\x89\x0c\x5d\x19\x92\x1f\x6d\x16\x0b\x82\x46\x13\x59\x6e\xc7\xaf\xcb\x2c\x2e\x68\xed\xde\x80\x1d\x5b\x2e\x40\x95\xe4\xb1\xec\xf3\x5f\x1a\xe0\xeb\x1c\x93\x0b\x76\xf6\xd4\x72\xcf\x17\xd0\x42\xeb\x55\x3f\x6d\x93\xf8\x7d\x4d\x64\xe4\xd9\x72\x3e\x8f\xc1\x33\xd2\x2a\xb3\x2c\xb3\x64\x9c\xa4\x83\xf9\xc1\x80\x82\xe2\xb2\x78\x94\x0d\x64\x98\xc6\xae\x06\xc5\xf8\xe3\x60\x14\x56\x06\x20\x56\x9a\x1c\x34\x7a\x3a\xe4\x7c\x10\x4a\xba\x49\xe7\xcb\xc1\x08\xd2\x4a\x1e\xb8\xaa\x3e\xfd\x88\x5f\x0a\xe0\x85\x65\x03\x8d\x1a\xe1\xe9\x97\x69\x0c\xc2\x98\xf1\x5d\xf3\x90\xe9\x21\xd5\x2a\xbd\x6a\xbc\xcb\xb1\x27\x41\xbc\x7e\x68\x74\xef\x95\x21\x93\x55\x16\x6f\xf5\xd1\x9d\xf8\x75\xb0\x99\x03\x46\xeb\x7b\x1c\x6f\xb7\x98\x03\x61\xc9\xfa\x2b\x3e\xef\x23\x8a\x24\xd9\x43\xf2\xb2\xc9\xe3\x02\x44\xba\xaf\xc2\x3f\xff\x5a\x82\x65\xb7\x83\xf9\x26\x2e\x06\x60\x1b\x22\xa9\x5e\x06\xc3\x19\x40\x2d\x7b\x6f\x3e\x86\x77\xfb\x45\x1e\xf5\x20\x83\x08\x41\x8e\x11\x0c\xdb\x65\x32\x32\xcb\xaf\x8b\x49\x81\x22\xa1\xac\x6d\x85\xd2\x92\x34\x8d\x33\x33\xa1\x7c\x5f\xe1\xc2\x27\xb3\x13\x91\x04\x2f\x15\x38\xee\xc9\x64\x54\xbc\x15\x3d\x07\x1d\xf2\xe5\x46\xb3\x69\x81\xd8\x6c\x83\x63\xae\xf3\x8f\x79\xfc\x05\x20\xdf\x20\xa4\x5f\xb5\x30\x59\x0f\xc6\x94\xf2\x8b\xe5\x36\x56\x13\x8a\xb4\x3d\xb2\x87\xa6\x21\xd5\x00\x88\x92\x97\x39\x99\x36\x59\x57\xa4\xdd\x5c\x4b\xa3\x89\x06\x2b\xc8\x80\x54\x6f\x8d\xa6\xba\x31\x2d\x60\xb8\x2c\x88\x01\x58\xc5\xf6\x06\x9a\xb1\x96\x8b\xd5\x26\x2f\x94\x97\xa6\xb8\x46\x92\xad\xbf\xb4\x8e\xe3\x5c\xb8\x19\x6c\x17\x40\x1c\x08\xcc\x0a\x71\xaa\x7b\x73\x4d\x87\xf8\x1f\xb3\x92\xd5\xf2\xe5\x6d\x44\x32\x1a\x88\xaa\xd2\x9d\xd4\xa6\x43\x3d\xf5\x32\xe5\x0e\xf2\x09\x49\x28\xcf\x84\x53\xb4\x0e\x5b\x41\x8d\x0d\xb1\x7a\xfc\x90\xc5\x1d\x40\xb4\xb9\x5c\x0a\x45\x64\xcb\x65\x6e\xfe\xac\xab\x13\xc9\xcb\xbf\xfe\x65\x74\x9e\x66\x56\xc2\xa0\x98\x64\xb9\xce\x0f\x66\xd1\x8a\xcb\x34\xf8\xa3\x83\x57\xa5\x69\x4f\x54\xa9\xc8\xcd\x41\x4e\xca\xc8\x16\x30\x02\x3a\x4b\x22\x2a\x33\x7f\x17\x46\x82\x2c\x48\x8c\x68\xb6\x3f\x0a\x22\xc2\x2b\x35\x21\x94\x19\xde\x1f\x04\x0a\xf2\x8d\x66\xe6\xec\x23\x12\xd0\xff\x32\xba\xb2\xcd\x16\xa3\x3a\xb4\x0c\x5f\x83\xa2\x16\x46\x32\x41\xa9\x63\xbe\x4e\x3c\x76\x77\x2b\x1c\x12\xf8\x16\x08\x6a\xc9\x50\x10\x3d\xc8\x33\x1e\xea\x3d\x75\x3b\xbe\xaa\x80\x19\x1b\xe8\xa6\xcb\x17\x11\x6e\x9a\x25\x0c\xc8\x89\x4a\x8d\x9a\x01\x9f\xde\x27\x09\x14\x9e\x96\x05\x9b\x2c\x2d\x4e\x33\xdc\x64\x54\xa4\xd9\x18\x3a\x6a\x9d\x0d\x4b\xb2\x5b\x6b\x4d\x85\x6f\xf2\x65\x77\xa5\x15\xb3\x1a\xac\x0d\xc1\x47\x43\x11\x67\x94\x39\x32\x60\x8d\xf7\xc7\xe5\x2f\xa3\xb1\x0f\x0f\xad\x45\xcd\x6b\x02\x6d\xbc\x11\x09\x3e\xa0\xe0\x20\x1c\x70\x36\xc3\xab\x71\xfa\xd3\xf1\xe2\xd1\x66\x48\x3e\x5a\x2c\xc1\x2d\x83\xcc\xca\xf7\xa0\x34\x2b\x68\xcb\x03\x73\xea\xf9\xf3\x82\x2a\x49\x30\xd4\xbd\xc3\x92\xba\x87\x05\xb1\xff\xa2\x52\x4a\x5e\x3f\xf8\xb4\x48\xd6\xd4\x02\xb0\x0e\x0b\x08\xe5\x13\xa8\x65\x3d\xd1\x72\xbe\x25\x17\x1b\x4e\xd3\xa2\x33\xd6\xd0\x83\x59\xb1\x19\x6a\x8b\x74\xad\x4a\x01\xf7\x3a\x48\xe6\x9b\x2c\xae\xb6\xe8\x89\x09\xac\x9c\x04\xd8\x71\xc5\x26\x73\x1d\xc3\xfa\x20\x86\x15\xb0\xbc\x9f\xb7\xe3\x46\xad\xbb\x27\x0c\x31\x1b\xac\x6e\x2b\x2d\x0c\x96\x65\xfe\x58\xbc\x56\x16\x1c\x1a\x12\xd3\x90\x34\xc6\xdb\x6b\x92\x95\x0b\xd3\xae\xe3\x0a\x7c\x5e\xc7\x73\x91\xac\x82\x8d\xc2\xdc\x4b\x68\x2c\xc0\x48\x98\x0e\x04\x87\xcb\x55\xa1\xd1\xf3\xe5\xdd\xf2\x7d\x4f\x15\xbb\x89\x8c\x7f\x0e\xef\x9a\x79\xbe\x32\x5a\x0d\xc3\x01\x3e\x4d\x87\x93\x25\xa4\x1e\x84\xc1\x66\x6d\x58\x68\xbd\x7e\x5f\x66\x23\x6c\x52\x2b\x81\xd1\x07\x60\xb3\x57\xf8\x68\x8a\x0c\xb8\xa4\x6b\x43\x3d\x69\x04\x67\xbe\xa7\x5a\x2d\x7e\x0a\x7b\xde\xc8\x25\x92\x06\x71\xab\x49\xc0\x6c\xa8\x19\x0f\x28\x3f\x34\x87\x57\xbe\x01\xa3\xfe\x2a\xf4\x26\x10\xf1\xf1\x12\x3f\xe3\x44\x0d\x2d\x26\x1c\x5a\x91\x6b\x63\xc1\x19\x10\x93\x9c\xc6\x34\xd1\xf5\x53\xb8\x17\x08\x18\x96\x69\xbd\x0d\xeb\x48\x33\x47\xb2\x22\x29\xaf\x57\xe6\x8f\x86\x20\x14\x9e\x50\xbd\x01\xb5\x66\x3d\x61\x9f\xe5\x08\xc0\x5e\x89\x7d\x50\xa8\x8a\x17\x6d\x99\x98\x3d\x68\x30\xb7\xf6\x18\x80\xb4\xa9\x30\x41\x29\x8a\xbb\x00\x73\xbe\x9c\xc5\x18\x38\xc9\x17\xb0\xdc\x8c\x7f\x63\xd4\x6c\xf1\x5a\x72\xbc\x11\x3d\xc5\xba\xda\xae\x1a\x6a\x29\x0d\xfd\x4c\x65\x91\xac\x1d\xf3\x51\x87\xf2\x1a\x16\x95\xfe\xbb\x67\xf6\x7c\xb9\xaa\xb2\x6f\xa3\x63\x85\xee\xff\xb4\xbb\x8e\xe7\x3e\x52\xa6\x52\x7b\x16\x16\x0e\xe6\x7c\xa0\x2d\x62\x58\xe9\xa5\xaa\x44\x8c\x80\xfa\x22\x11\xb4\x40\xe7\x6a\xd8\x21\x44\xc7\xe8\x50\xab\x2d\x40\xac\xef\xda\x3f\x34\x2a\xbc\x78\xac\x30\xc8\xf8\x50\x51\x9b\xa5\x0a\x75\x20\xf2\x3d\x2d\xdc\xb3\x91\xe6\x9c\x21\xad\x24\x63\x31\x15\xc3\x46\x87\xaf\x74\x4e\xf5\xc3\x5c\x9b\xdf\x71\x8a\x03\x0e\x46\x23\x57\xce\x77\x57\x69\x82\xff\xe1\x1a\x5d\xbd\x25\xa1\x4c\xb4\x9c\xfc\x55\x98\x09\x5f\xbf\x18\xc5\xd5\x2f\xb4\x2d\x50\xac\x08\x22\x28\xac\x4f\x73\x86\x07\x92\x62\xe1\xed\x00\xa9\xcd\x44\x94\xf7\x87\xab\x4d\x51\xa1\xb0\x09\x5f\x7f\xd1\x7b\x2b\x98\x4c\xf3\xfa\x3c\x2e\x68\x49\x66\xf8\x48\x87\xe6\xcf\x24\x5b\xa6\x9a\xb2\xc0\xb7\xcb\x75\x29\x12\x47\x7c\xd4\x30\x00\x73\x6e\x72\xcd\xa8\x30\x6d\x7f\xed\xfd\x5a\x21\x61\x0d\xf2\x71\xc1\x1a\xc9\x5a\xb8\xf4\x41\xf0\xb6\xd3\x56\x32\x00\x3b\x5d\x2f\xd3\x15\x08\xe3\x3d\x1b\x94\x0f\x11\x25\xeb\xfe\xbd\x10\x4c\x05\x13\x01\x32\x2b\xaa\x6b\x23\x78\x87\xe6\x5c\xf1\x6e\xa5\x7d\x0b\xea\x4d\x71\xfd\x05\xec\x8b\x91\x04\x0a\xb4\x9c\x5d\xe9\x0d\xae\x7f\xfd\xfb\xd7\xff\x87\x7f\x96\xfe\x77\xec\x59\x96\xcf\xff\x8f\xdb\x96\xd5\x55\x78\x54\xc7\xae\x65\xb5\xe5\xb9\x77\x65\x4b\x7b\x84\xf6\x5e\x43\xff\xaf\x52\xdb\x93\xee\x7e\x53\xfe\x6f\xf9\xc7\x91\x34\xe1\x8b\xfe\x1d\x9a\xc2\x4a\xd3\xbb\xfd\x80\xb6\xf6\xf1\xda\x96\xb7\x0e\xde\xa2\xe3\x81\xa5\x6e\x1c\x8c\xf8\xb0\x9f\xd0\xd6\x3b\xde\xd8\xf2\xf6\x8c\xb7\xfe\x71\xcf\x5a\xd8\x53\x17\x8b\x8f\x8e\x03\x4b\x75\xf4\xda\x81\x1f\xeb\xff\xef\x2c\xa5\x1b\x64\xaf\xa1\x65\x85\x78\x0e\x94\x1e\xaf\x32\xbd\xa6\x6f\x59\x6b\x5b\x3a\x9e\x6f\x65\xa2\x40\x1a\x86\x01\x1e\x9b\x18\xd9\x60\xb3\x1e\xd1\x0e\xe5\x50\xfd\xe3\x96\x5e\xe2\x5e\x1e\x31\x38\x04\x1c\xac\xfd\x7b\xa4\x67\xb6\x06\xfb\x77\x75\xd2\x6c\x01\x3a\x38\x7e\xef\xb6\x98\x4d\xed\xec\xb6\x3c\x8f\x6d\x7d\x7a\xab\xe7\xc8\xf8\x36\xa6\x3a\xee\x5b\xea\x4a\xb9\x68\xc0\xfe\xb0\x78\xab\x79\xdc\xb5\xd4\x8b\x2f\x53\x3e\x4b\xab\x7f\xff\x7d\x93\x01\x20\x21\xab\xc9\x63\x88\x61\x4a\xf6\x1b\x1e\x5f\x3b\x96\x9a\x3b\x98\x69\x84\x11\x31\xe0\x46\x68\xbc\x16\x9f\xab\x13\x5b\xd6\x4d\x6c\x69\x7e\x71\xa4\x19\xb3\xe8\xf3\xe0\x51\x90\xdd\xc5\x60\xec\x2c\x7c\x66\x73\x4b\x76\x2c\x0d\x09\x40\xf9\x52\x8e\xee\x73\x74\x03\xa0\x8f\x00\x94\xa9\xbd\xff\xa8\xfe\x87\x8f\x78\x86\x10\x7b\x9b\x9b\xe1\x6d\x4b\x7d\x62\xf8\x12\xc3\x27\x76\x39\xde\x23\x5e\x94\xde\x05\xb6\xef\x2f\xf0\xa7\xa5\x0c\xc8\x65\x9a\x89\x5d\x0c\x57\x53\xd5\xc5\x46\xb8\xa9\xde\x1e\xed\xa1\x55\x42\xd1\x3c\x16\x48\xf5\xf5\x93\x3f\x07\x92\x7c\x60\x66\x6d\xaf\x6c\x03\x07\x6c\x06\x24\xbe\xb6\x0d\x46\x5d\xcb\x5d\x39\xfc\xba\xa7\xd1\xeb\xcc\x6c\x99\x64\xc5\x2d\x6b\xde\x68\xcb\x28\xee\xc8\x20\x70\x86\x97\x08\x64\xe6\xea\x47\xb5\x55\x0d\xb6\x78\x96\xf7\x68\xe9\xb3\x79\x53\x20\x05\xb3\xfa\x9e\x3c\xf6\x27\x72\x4c\x55\x40\x42\x83\x31\xb6\xac\xd8\x11\x34\xca\x52\x82\xb6\x57\x19\xbd\xc4\x1e\x53\x9b\xe8\x1c\x63\x2f\x1f\x40\xfc\xca\x6c\x82\x8d\x6a\xee\xfe\xae\x00\xfe\xa9\xd2\x93\xda\xa3\x0a\x1e\xc7\x36\x01\xee\x5b\xee\x8f\x1d\xe5\xa4\x9a\x05\x57\x42\x80\x0d\xff\x37\xe8\xb9\x0b\xe6\x91\x0d\x78\xbf\x2b\xdf\x29\x12\x1d\x80\xd8\x1e\xf2\x98\xa1\xe5\xd6\x1c\xcc\xe4\x76\xc0\xd5\x09\x26\x0f\x81\xd4\x98\xa8\xc5\xff\x83\xca\xff\x61\x21\x89\x80\x07\x65\x48\xdc\x05\xf3\xf3\x03\xcf\x3a\xb3\xeb\x80\x39\xc9\xae\x03\x4e\x5e\x18\x10\x11\xed\xad\xe3\xa1\x90\x19\x25\x51\xc9\x81\x6d\x80\x9e\x12\x09\x80\x17\xf1\x66\xbd\xd9\xc2\xf0\x53\xf3\x69\x24\x5b\xa5\x40\x69\xc9\x48\x95\x83\x66\x7d\x90\xfe\x60\xa5\x2a\x28\xbf\xc6\x79\x22\x30\x48\x2f\xab\xf6\x5c\xca\xa9\xd5\xa7\x03\x59\x24\x53\x3d\x01\x40\x33\x1b\x90\xe3\xd9\xbb\x42\xee\x37\x68\xe7\x10\x41\x97\x6a\x62\x8b\xf8\x3f\xc6\x86\xfa\xe8\x6c\xc9\xe0\xac\x90\xd5\xb2\x2a\x90\xdb\x16\x69\xa4\xa6\x36\x44\x41\x08\xea\xee\x36\x40\x37\x24\xee\x76\x54\x02\x50\xcb\x5b\x8d\xba\x56\x2e\x47\xd3\xa2\xf8\x83\xc8\x20\x2f\x73\x91\xb0\x46\x01\x7b\x56\x6a\x03\x2b\x24\x29\xf4\xeb\xf6\x61\x57\xdb\x72\x6f\x9c\x17\x30\x29\xe7\x05\xea\xc3\x91\x59\x49\xb6\x2c\xa2\xc5\xad\x2b\x08\x52\x40\xcf\xc7\x06\x03\x4d\x55\x5a\x40\x8e\x20\xb2\xb8\x1d\x2b\x00\xc0\x0b\x46\x68\x09\xcb\x79\x1d\xf3\x49\x79\x1a\x01\x82\xbb\xb5\x89\x4f\xe9\x3c\xa5\xb0\x90\x3e\x8f\xd4\x43\x59\xa3\x29\x5f\x6f\xa9\x7f\x81\x97\x5b\x70\x4d\x24\xec\xa4\x79\xf2\xfc\x1b\x9a\xac\x80\x74\xd4\xae\x81\x51\x6a\x36\x61\x46\x6a\xd0\x72\xa8\x05\x00\x6a\x11\xdf\x5d\x81\x5b\xaf\xec\x04\x03\xad\x6f\x2b\x0e\x5e\x0a\xfe\x7e\x74\x48\x41\x7d\xcc\x15\x99\xed\x3f\x43\x51\x74\xcb\x1d\xb6\xc7\x6a\x2f\x6f\x5a\x2b\x97\x14\x5e\x9e\x06\x42\x94\xaa\x59\x34\x90\xc6\x3f\x78\x3e\x06\x62\xce\x6c\x36\x81\x0e\x08\x02\x6c\xd9\x9f\x14\x8b\xc9\x02\x67\xd8\xea\x8d\x91\x12\x2d\x8a\x8e\xb0\x7c\x13\xd9\xfb\x09\x05\x33\x06\xee\xb7\xf6\xc7\xd7\x3e\x41\xfb\x52\xf4\x8e\x4a\x1d\xa7\x5c\xf9\x9c\xd2\x28\xfa\xfc\xe3\x78\x21\x13\xd9\x03\xd4\x9c\x00\x4f\x88\x62\x28\x12\xa5\xee\x14\x80\x72\x9c\x01\x68\x48\x66\x6c\xbc\x94\x47\xf9\x2b\x6c\x9e\x93\x1f\xa6\x7b\x2c\xfa\x7b\x82\x0e\x92\xea\xd9\xae\xb1\x76\x66\xbf\x7f\xed\x33\x7b\x15\x12\x13\x06\xab\x39\x25\x6d\x79\x25\x69\xbd\xfc\x71\x33\x83\x2a\x69\x9d\x70\xc0\x11\xf7\x51\xbe\xc9\x5a\x5b\xe7\x87\x7d\x94\x7d\x25\xcc\x06\xf5\x3f\xf4\xc1\x50\x19\x0a\xb1\xb8\x22\xb6\x27\x9e\x9e\xd0\x6f\x18\x69\xa1\xbf\xd0\xbc\x50\xaa\xcf\x60\x7f\xa4\x29\x76\xe3\x4f\x94\xd9\xbc\xd8\x27\xbd\x0a\x81\x9c\x02\x86\x03\x41\x6f\x4d\xed\xd5\x13\xc4\xac\xd5\xc7\x47\xa9\x4d\x90\x02\x16\x1f\x36\x88\xd5\x1a\x70\x42\x83\x76\x3f\x41\x63\x6f\xae\x2a\xf0\xf5\x01\x96\x9c\x5b\xe4\x57\xbd\x4f\x80\x21\x3a\x25\x12\x6b\x7c\xfb\x70\x8a\x3e\x73\xd4\x00\x26\xa5\x19\x51\x1e\x3f\x80\x0c\x6c\xf8\xdc\xb0\x7e\x7e\x29\x41\x40\x51\x29\x8d\xaf\x25\x0a\x5f\xff\x9b\xd2\xe1\x6f\xe9\x49\x79\x7f\x47\x4e\x37\x76\x69\x6c\x87\xf5\x3f\x0c\xf6\x44\x05\xe3\x10\x91\xd8\x25\xce\x23\xad\x06\x20\xf9\x85\x0c\x04\x21\xdf\xc9\x0b\x06\xd2\x2f\x0f\x33\x98\x12\xe1\xa3\x19\x2b\x62\xf5\x13\x22\x74\x65\x27\xb0\x4e\xa2\x54\x95\xa2\x38\x1c\x1e\x8e\x13\x22\xb8\xa2\x12\x3a\x72\x85\xa8\x86\x5a\x32\xdd\xcd\xb5\xc5\x2d\xcb\xdd\x51\x9f\x95\xfc\xda\x9d\xe3\x4b\xff\x4d\x16\x55\xb7\xa5\x11\x03\x82\x69\x43\x0b\x74\x69\xf1\xad\xc8\xd9\xef\x98\x3c\x1a\xc0\x58\x73\x8c\x15\x4b\xe5\x24\xa3\x3c\x63\xc1\xeb\xde\xad\x71\x24\xcc\x7c\x62\xe9\x52\x44\x83\x3e\xb5\xa5\xf7\x46\xad\x76\x42\x19\xfd\x5c\x39\x54\x4d\x86\xbb\x27\xa5\x51\xd5\x3b\xc3\x3e\x1f\xea\x25\xbd\xf6\x88\xe5\x08\x67\x6a\x6f\x4b\xc2\x04\x35\x05\x53\x99\xfc\xd6\xe7\xa0\xd6\x84\x96\xfc\xbd\xd0\x42\x46\xc7\xc5\x28\xb4\x0b\x6e\x09\x2b\x8a\x33\x53\xa8\xb7\x6a\x8f\x36\x6f\x27\x0e\x0f\xde\xf5\x30\xce\x29\xba\x42\x5a\x21\x6e\xdd\x3e\x55\xd5\x95\x08\x69\x21\x95\x09\x49\x6f\x83\x0d\xb6\x3f\x1b\x07\xb8\x11\xb4\xd2\xe2\x0d\x53\x12\xa5\x21\xa6\xcb\x83\x6d\x9d\xdb\x25\x01\x6a\xc5\x40\x0e\x1d\xea\xd7\x81\xa6\x47\xee\x25\xc5\x9f\xa1\x86\x69\xaf\x70\x65\xb8\x75\x6d\x8d\xe8\x55\xea\xee\x3f\xec\x5f\xf6\x77\x0e\x75\xd8\x36\xfc\xf8\x1f\x76\x11\x50\xd3\xc8\x07\x0b\xa1\x14\xb5\x6d\x60\x45\x83\xcb\x30\xa9\x7e\x17\x01\x90\xde\x95\xdd\xa8\x02\xe8\x56\x8e\x32\xb5\xaf\xec\x1f\xb7\x2d\x23\x0c\x40\x1f\xe5\xe5\x1a\x8b\xa5\x46\x81\x4b\x93\xda\xba\xbb\x03\x30\x34\x4d\x97\x70\x88\xe9\xf9\x03\x30\xdc\xbc\x61\x80\xe1\x56\xb7\xd9\xa8\x62\xfd\x09\x6e\xa0\x6a\xff\xf9\x54\x95\xed\x69\x9e\x27\x4f\x46\x90\xb9\xc1\x73\x29\xa8\x6a\x15\x3b\x86\xdf\x43\xb1\x78\x93\xbf\x11\x5b\xa0\x64\x77\x42\x16\x9d\xc1\x58\x6d\xed\xe8\x29\x54\x2d\x6d\xcc\xde\xe6\x59\x9a\x55\x31\x6d\x8c\x81\x04\x7c\x36\x98\xe0\x4b\x63\x79\xb7\x17\xc6\x99\x84\x78\x8d\xb9\x8f\x6e\x69\xb9\xab\x89\x20\x5f\x9f\x3a\x3a\x11\xab\x53\x75\x8e\x20\xc8\x82\xad\x32\xde\xa2\x46\x4a\x7b\x6f\xff\x05\x13\x25\x07\xbf\xf5\x2e\x31\xab\xe6\xff\xae\xf6\x45\x69\x13\xa6\x74\x23\x4c\x44\x00\x02\x63\x2d\xd8\x74\x35\x1d\x57\xbd\xac\x31\xc6\x75\xeb\xd8\x65\xfb\x82\x1f\x5f\x51\x8f\x60\x43\x6e\xaf\x38\x4d\xc0\x63\x68\xb6\xdb\xd1\x64\xbc\xa1\x49\xac\xa1\xa5\x7d\x99\x3d\xec\x6f\xff\x9b\x4a\xa2\x46\x5f\xf7\xc0\xa0\x62\x18\x24\xac\x51\x14\xcd\x78\xfa\x8e\x91\x62\xa5\x9a\xf4\xee\x74\x87\x5f\x73\x4a\x81\xf5\x01\x74\x3d\xd0\xab\xc0\x26\xa2\x25\x24\x41\x6b\xe5\x54\x24\x5d\x50\xd1\xa7\x36\xfd\x1c\x0e\xd3\x30\xec\x8b\xb7\x52\xe3\xd6\xcf\x40\xbd\x6d\x78\x00\xf0\x75\xbc\x9c\xb3\xad\x29\xa9\xcd\xa4\xd8\xb4\x7b\xee\x4e\x89\x07\x9c\x34\x2a\x8c\x02\x41\x59\xc5\x40\x88\xba\x7b\xc3\x41\xe5\x4e\xaf\xdc\x94\xc6\x6b\x4b\x7c\x40\x39\x3e\xdc\x30\xf8\x87\x63\xbb\x47\x83\x5d\x15\xb0\x76\x11\x57\x70\x18\x71\x4a\x1a\x80\xaa\x00\x48\x3d\x7e\x62\x37\xc1\x29\x75\xbc\x31\x56\xf6\xf2\xb9\x55\xdb\x77\x17\xe1\x1e\x6b\x70\x5e\x69\xd3\xdc\x04\x9a\xff\xc0\xa1\xb7\xf6\x39\x3c\x10\xf7\xc2\x33\x16\x7b\x5f\xa2\x4f\x57\x3c\xf1\x86\xf6\xe8\xb6\xfa\xa6\xdd\xa5\x36\x74\x91\x01\x96\x3a\x69\x00\xce\x83\x26\x5d\x35\xc0\x86\x0b\xb6\xde\x1d\x99\xae\x8f\xb1\x0b\x52\x13\x49\x30\x38\x42\xcf\x10\xba\x6c\xee\xf1\xd8\x22\x9e\x3d\x40\x48\x46\xec\x20\x95\x22\x63\x2c\xec\xec\x8a\xe2\x3f\x27\x68\x28\x47\xe9\xcc\xa4\x76\xe2\xc2\xbd\xb7\xc9\xd1\x5d\xab\xd8\x80\x16\x5f\xf1\xee\x60\x3b\x0d\x1c\xa0\x4d\x27\x53\xb4\xc3\xc9\x01\xc8\x10\x07\x89\x57\x0d\xd2\x7a\xac\x25\x55\x93\x8e\xee\x1b\xb7\xf2\xcd\xd3\x9d\xab\x33\x68\x78\xb7\xbe\xdf\x6b\x5b\x56\xdb\xbf\x75\x85\xfe\xbe\x1d\x84\x81\x17\x7d\x9c\xd1\x82\x41\x43\x4f\x0f\x34\x81\xc5\xee\x94\x8c\x7d\xe9\xca\xd2\x7d\x50\x41\x3f\x80\xf8\xbd\x33\x63\x25\x8c\xd7\x78\xc2\xfe\x73\x97\xd6\x83\x8b\x18\x19\x98\xbb\xbf\x65\xdb\x25\x0c\xa2\x39\x61\x6f\xce\x99\x81\xdf\x5a\xd7\x00\x54\x3f\x75\xa1\x6a\xca\xb8\x59\x87\x71\xb3\x23\x11\x0b\x8e\xc1\xe7\x4f\x47\x9a\x16\x3e\x0f\x2d\xa3\x56\xf9\x16\x59\x6e\x8d\xc2\xe8\xb2\x61\x1c\xf7\xd6\x3e\xe4\xb6\x75\x4b\xf4\x6a\x65\x3b\x86\xc3\xd0\x05\xf1\x0c\x4e\x5c\xaa\x11\x32\x90\xb7\x07\x57\xbb\xe0\x73\xf7\x04\x38\xf2\xcd\x46\xcc\x49\x18\x7e\x12\x9f\x58\xde\x4e\x21\x4c\xc5\x21\x90\x45\x4f\xa8\x99\x2e\xdc\xca\x16\x72\xb7\xd8\xa9\xb4\x25\x6e\x75\x60\x58\xc5\x12\xc2\x0e\xe1\x78\x7f\xb0\xb2\x2d\xfe\x82\xcc\x80\x2a\xbc\x32\x8e\x8d\x47\x58\x43\x73\x99\x7b\xc8\x65\x43\x21\x55\xc3\x65\x1a\x6f\xb1\x68\x8b\x9d\x5b\xbc\x0e\xc1\x1a\x5d\x31\x72\xf4\x62\x33\xc3\xa9\x9f\xcd\x3f\x73\xea\x3f\xce\xa1\x69\xf3\xbc\xf7\xe9\x56\x24\x63\x0e\x94\xb5\x89\xb2\x7d\xf4\xa1\x25\xb4\xfc\x5c\x4c\xf0\x86\x38\xf4\x0e\x54\x52\x4c\xf8\x00\x71\x82\xa8\x44\xb7\x76\xb0\x94\xf4\xa8\x89\x37\x75\x4b\xbe\xd3\x3e\x76\xa1\x2e\x7a\x20\xad\x87\x9b\x52\x60\xc7\xd7\xf4\xa0\x6e\x0e\x58\x73\xa7\x8c\x24\xd3\xf4\xb5\x72\xae\x21\xe6\x41\xeb\xc5\xa2\xbf\x2b\x9c\xd2\x95\x23\x8f\x6d\x69\xf2\x33\x10\x9a\x5f\x6b\x54\x94\xde\xe5\x9e\x48\x8a\xe0\xa2\x26\x24\x6d\xa1\xa4\x8c\x4c\x81\x5d\xac\xf0\x1d\x14\x3e\x46\xdb\xce\xae\x7f\x81\x52\xa8\xb9\x46\x48\xf9\xd6\x44\x7f\x0d\xc6\xd7\x70\x65\x5a\x84\x29\xd5\xd8\x41\x97\xb6\xcf\x05\xc0\x2f\x37\x6e\xb1\x05\x61\x83\x53\xc6\x84\x8e\x2f\x6d\x09\x2c\x8a\xca\x78\xb9\xab\x6c\x71\x6c\x17\x03\xd6\x5a\xfe\xe7\xea\x9d\xa0\xd7\x12\xbe\x2f\x7c\xfe\xbc\xb0\x77\xd8\xeb\x6b\xe6\x54\x17\xdc\x80\x83\x7a\x35\x1c\x67\x38\x45\x5f\x1f\xeb\x16\x96\xb0\x89\xb1\x71\x17\xc1\x9b\xfd\xe5\x6b\x81\x02\x69\xab\x7b\xda\x3c\x1e\xdb\xb2\x13\xd2\x6b\xef\xee\x3f\x7c\xa8\xb2\xdb\xbf\x5a\x57\xd8\x23\xb3\xff\x79\x09\x89\xde\x36\xd7\x88\x15\x89\xba\xae\xac\x88\xf5\xdd\xa7\x26\x60\x6e\x04\x06\x8c\xd5\x21\x35\x46\x98\x39\x3f\xef\x53\x2c\x5d\x5a\x4d\x83\x0a\x8e\xd4\xb4\x31\x90\xae\x33\x1c\x64\x6a\x33\x10\xfe\x2c\x34\xb5\xdc\xbf\x44\x88\x57\x17\xf6\xd1\xa7\x83\xcc\x48\x78\xea\xfc\xb0\xde\x96\x4e\x3a\x34\x4e\x8f\x26\x2e\x27\xa0\x73\xd7\xfa\x0d\x6a\xc5\xf7\xb0\x97\x7a\x55\x30\x9e\x7a\x00\xc7\xcc\x66\x08\xa2\x45\x38\x56\xa2\xb6\xea\xc6\x24\x3c\x64\x4a\x75\xbf\xa1\x67\x80\x30\xb6\x7b\xe7\x1f\x88\x70\x25\x74\xd7\xab\x6a\x6e\x51\x1c\xea\x75\x5b\xe5\xb1\xa1\xec\x53\x65\x15\xf7\xef\x8f\xbc\x89\x08\x71\xc9\x93\x62\x12\xca\xf9\x1d\xff\xba\xa2\xb0\xfa\x4d\xf3\x1c\x31\x54\x2d\xca\x03\x11\x3f\xd3\xd6\xfb\xd2\xaf\xe1\x7f\xde\xa0\x42\x5a\xd0\x81\x67\x1f\xe2\xba\xe7\xe5\x5a\xe5\x87\x6d\xb1\x1e\x9b\x46\x14\x44\xc8\xae\x49\x7c\xd9\x76\x0e\x27\x16\x1a\x43\xd8\x26\xa8\xd9\x46\x0c\xfd\x86\xe4\x28\xb0\x20\xe3\x36\xd4\x55\xcf\x87\x4d\x5d\xcb\xbd\x81\xa5\xf4\xf2\xbb\x42\xb1\x4b\x12\xd0\xdb\x5e\x05\x8a\xd8\xfd\xf0\x7e\x26\x3c\x51\x9f\x1f\x94\x0a\xab\x46\x15\xc1\x17\x84\xd2\x89\x0b\xa7\xbe\x89\xd0\x43\xe1\x56\x01\xfe\xe1\xe7\x81\x77\x79\x03\x49\xd4\xd5\x1f\x79\x2b\x77\x06\x33\xe1\xd0\xaa\x3d\x46\xea\xe3\x02\x3d\xd1\x5f\xb1\x41\x78\xa0\x9d\xe5\x0d\x4c\xa1\x32\xf7\xb6\x84\x43\x2f\xfc\x7f\x41\xe1\xad\xff\x1b\x0a\x9f\x06\x77\x95\xf3\xc1\xbe\x02\xd7\xcd\x8d\xb9\x2e\x04\xae\x69\xff\xf5\x2f\x48\x1b\xc6\xce\x16\xaa\x97\x4e\xd8\x98\xc9\x8e\x05\x73\x0a\x06\xd4\x7f\x01\xfe\xc0\xf2\xe6\x4d\xa8\xcf\x66\xc5\x10\x91\x80\x8f\x15\x2e\x40\x03\x20\xd8\x2b\x12\x6c\x17\x1f\x11\xf1\x46\x23\x8e\x2b\xba\x78\x66\x5b\xde\x4e\x21\x64\xdb\x03\xcd\xe5\x18\x19\x9e\x98\xc8\x38\x23\x05\x7d\xcd\xde\x78\x3a\xb2\x0f\x96\x6c\x89\xd2\xa7\x73\xc4\x88\x78\x08\x95\xe4\xd5\xd4\x1b\x56\x6f\xaf\xc8\xcc\x4b\x48\xc6\x88\xa1\xc3\xd6\x1b\x49\x87\xea\x8d\x29\x9c\x48\x6f\x50\x93\x95\x46\x40\x17\x99\x57\xb1\xe0\xcf\xdc\xe2\x2c\xee\x94\x67\x81\x95\xa8\xde\x31\xe7\xce\x7e\xfe\x6a\x35\xa8\xdf\xd4\x84\x1a\x86\x1a\x27\x1d\x46\x03\xcc\x34\xbd\x73\x9c\x2b\x06\x15\xb4\x84\x65\xb5\xf7\xde\xe7\xae\x88\xf5\x99\x8f\x5c\xdd\x0e\x7e\xef\x95\x0d\xfa\x1b\x6a\x2b\x51\x80\xf2\xd9\x24\xbd\x80\xd5\xe3\x9b\x46\x15\x55\xc6\x43\xa8\x78\xde\x5f\x11\xa6\x9d\xde\x5a\xd3\xa4\x0e\xdf\x61\xba\xac\x1d\xc1\x43\xbc\x75\xf6\x7e\x5d\xe1\x10\xca\x23\xd2\x29\x26\x95\x48\x9f\x43\xd5\x1a\x95\xe0\x1f\x08\xcc\x7d\xe0\xf9\xb5\x4d\x29\xf4\xc5\xe3\x05\x67\x0d\xc8\x95\xcf\xc6\x9e\xcc\xd4\xdc\x05\x54\x2a\x81\x36\xf5\x84\x4c\x4c\x9f\xf9\x48\x4a\xd7\xee\xda\x17\x5e\xd0\x2e\x58\xbd\x51\x00\x51\x5b\x3a\x1d\x2a\xca\x90\x51\x96\x67\x99\xef\xa5\xf7\x8f\x60\x15\x8e\xd4\x60\x19\x99\x10\x36\x29\xf8\x1d\x3e\x43\x1b\x54\xa8\x25\x29\x44\x39\xfd\xa0\xe8\xa3\x01\x21\x74\xd5\x40\x78\x54\x76\x94\xdb\xfd\x3d\x44\xbd\x19\xba\x67\xf6\x9c\x64\x99\xd3\xf5\x12\x8d\x7c\xa5\xbe\xd8\x88\x61\xb1\xc3\x95\xd6\x34\x3f\x22\x36\x10\x0b\xeb\xf6\xbf\x87\x3c\x89\x07\xb9\x51\xb9\xa1\x05\xf7\x8b\xf0\x88\xbf\x63\x54\xe5\x5b\x2e\xac\xc8\x03\xdf\xd8\xdf\xd0\xf6\xfc\xfc\x93\x40\xf1\x98\x8d\x6b\x41\x3d\x99\xe4\xea\x07\x25\xcc\x1a\xa7\xf0\xc8\x01\x18\x84\x85\x5c\xaa\xd6\x68\x49\xf3\x7d\x45\xff\x64\xc1\xb7\x2b\xc2\xfb\x1a\x40\x73\x6f\xe4\x4d\xe5\x2c\xc4\xa0\x6f\x35\xa4\x43\x18\xd2\x52\x0e\x36\x4d\x23\xf2\x5c\x21\x08\x94\x88\x7c\x56\x32\x27\xc8\x82\xf5\x4f\x69\xcd\x89\x6c\x61\x49\x02\xd3\xee\x3d\x86\x36\x6b\x1e\xe4\xb6\x7d\x09\x09\x34\x40\x63\x1f\x1e\xbc\x48\x11\x7a\x94\x12\x59\x38\x83\x55\x97\x20\xe7\x21\x99\x71\xd7\xda\xa8\xba\xe8\x39\xeb\xa5\xee\x19\x7b\x57\xbf\x74\x10\x83\x5e\xd8\xa7\xdc\x20\x9d\x95\x88\x99\xef\xa9\x7b\xa2\x8a\x56\x39\xe6\x58\x3a\x77\xea\x48\xc9\xd6\xea\x8e\x53\x2c\x2d\xd0\xd3\x3a\x4e\x49\x61\x87\xe0\xde\xa4\xb4\xa1\x4d\xb9\xd6\x1b\xec\xa8\xdf\xa0\xc4\x85\x88\x10\x71\xe0\x45\x02\x5d\x20\xa0\x3d\xf8\xc4\x39\x37\x20\x85\x73\x3b\x25\x0f\x1f\x31\xcc\x20\x30\xfd\x74\xc8\x2c\x57\xf4\x6c\xaf\x71\x76\x03\x90\x13\x99\xdb\x9b\x17\xe5\x14\x72\x40\x0e\x63\xee\xff\xf7\x05\x76\xb0\xb4\x6f\x18\xbb\xa3\x63\x90\xf8\xf2\x67\x78\x85\x36\x98\x4d\x85\xb7\x2f\xf0\x1e\xa3\xb7\x2d\x6c\xa6\x5c\x99\x64\x84\x23\xad\x19\xcd\xeb\xc1\xaf\xee\xe2\xd3\x88\xfa\x7e\x4e\x5d\xb9\x28\xc2\x23\x5e\x51\xf4\x12\xc9\xe2\x6e\xbd\x51\x46\xfe\x2d\x4c\x0d\xd4\x3f\x01\x37\x6d\xec\xa8\x67\x40\x7d\x30\x85\x3e\xbf\x4f\xa3\xe3\x65\x0e\x0c\x23\x2e\xf8\x82\xac\xda\x9b\x7d\xe9\x14\x02\x44\xd8\xee\xf8\xc8\x06\x4e\x99\x87\x90\xa0\x0c\x64\x9f\x20\x00\x02\xc2\x8c\x7e\x23\x3f\x82\x44\xef\x49\x7f\x66\x65\xd3\x33\xa7\x1b\x00\xa8\x05\x9f\x76\x1d\x64\xd4\xbf\x04\x95\x6e\xe8\xb1\xec\xc1\xdb\x45\xe9\x0a\xf1\x1b\x15\xcf\xcb\xc3\xe7\xea\x98\x9e\x79\x76\xb7\xfe\x0f\xb4\x77\x05\x9d\x3d\x24\x49\x74\xcd\xae\x0c\xc6\xb1\x1d\x77\x4f\x90\x3f\xec\xd5\x9d\x33\xda\x5e\x17\xd0\xba\xf7\x06\xd6\xc2\x96\x0b\x0f\x74\xb4\x32\xe4\xb4\xb4\x8b\x6a\x15\x2c\x14\x9e\x88\x1d\xdd\xde\xb1\x3e\xe8\xac\x51\xca\x85\x15\xb4\x68\x55\x24\x67\x95\x0c\xba\xc9\xdf\xdd\x1d\x88\x4b\x99\xf4\xcc\xe4\x50\xca\xc0\xa3\xaa\x8c\x64\xb5\x4d\xf1\x2c\x82\x8e\x70\x41\x06\x6e\xc5\x9a\x27\x13\x93\xac\x76\xf7\xd6\xf4\x8e\x27\xde\x7e\x16\xb1\x94\x43\x44\xc8\xf5\xf3\xc3\x03\x44\xc7\x8c\x16\xea\x1c\x42\xf1\x95\x01\x30\x06\x5a\xfd\x0b\x5a\x26\x24\x07\x36\x7a\x72\x28\x6b\x62\xef\xcf\xa0\xf1\x36\x20\x68\xf6\x27\x12\x64\x31\x2d\xb6\x81\x15\xd4\x02\x43\x07\x92\x20\xbc\xf5\xad\xc2\xba\xf9\xa7\x40\x81\xde\xdd\xca\xfd\x21\x52\x90\x15\x26\xfa\xbe\x51\x4c\x50\xf1\xce\xaf\xec\x32\x86\xd0\xff\x12\x43\xf0\xbe\xfb\x29\xee\x7f\x8e\x21\x78\xdf\x62\x08\xee\x4f\x31\x04\x8f\x42\x80\xf6\x0f\x8d\x62\x85\xf8\x9a\xff\x5a\x91\x1d\xd7\xb6\xe9\x15\x7b\x00\x05\x4b\x73\x55\x6e\x91\x60\x7a\xb8\x6a\xec\xf7\xd8\xbd\x64\xee\xee\xca\xdb\xcf\x6a\x45\x17\xd5\x84\x9a\xc1\x0d\xb2\x72\x5b\xe7\x0a\x02\xcb\x8c\x7b\x62\x60\xdc\xaf\x22\x4f\x6c\x6d\xef\x86\x58\x99\x51\x59\x7c\x31\x0f\x3c\x14\x8c\xc9\x02\x47\xe8\x1f\xa6\xcd\x2f\x3a\x17\xf6\x01\x09\x83\x8a\x04\xb9\x34\x6e\x4a\x19\xd6\xf5\xc4\xfa\xa3\x94\x9f\x0a\x71\x68\xf1\xbe\xa0\xee\x3e\x67\x3a\xaa\x48\xb3\xb5\x84\xc8\xcf\x10\x7b\x6c\xae\x9a\x55\xbd\x9f\xb8\x46\x4b\x79\x22\xa2\x24\x2a\xe2\x30\x60\xa2\x8e\x17\x36\x74\x81\xd8\x67\x73\xec\xf8\xc6\x98\x0c\xe3\x26\x90\x28\x34\xee\xe6\xcc\x6a\xf5\xbd\x2f\xc3\x25\x7d\xa9\x90\x80\x18\xae\x9b\x45\x5f\xbf\x10\x09\x6e\x2a\xa2\xc4\x44\xce\x25\xc6\xae\xbc\x6f\x46\x47\x40\xed\xe3\x49\xf6\x3e\x25\x57\x99\x2c\x44\xf7\x9b\x79\xa2\x19\x13\x62\xcb\x31\x49\xcc\xbd\x88\x60\xa0\xb1\xc7\xc9\xbb\x97\x07\xb6\xbc\xa6\xad\x08\xca\xd1\x30\xa2\x31\x3a\x2f\x10\x1c\x7a\x4c\x11\x4d\x28\x23\x79\x82\x6b\x31\xad\xe7\x36\xc9\xc4\x5d\x06\xe2\x33\xa8\x46\x51\x11\x66\xb5\x68\x0c\x44\xa9\xc9\xe7\x00\x58\x6d\xae\x30\x47\x12\x55\x5d\xcb\x6c\x89\x6a\x96\x65\xa8\x63\x51\xa6\x1e\x14\xb3\xc0\x82\xf6\x7d\xfb\x8d\x72\x93\x25\xa3\xed\x14\x55\x29\x37\x60\x78\xa9\x19\xb5\x3a\x53\x66\x96\xcd\xb0\xdc\x27\x0d\xd2\xd9\xc6\x51\x30\x20\x9a\x43\xa2\x46\x6b\x46\x6e\x95\x91\x90\xb2\x4e\x4a\x07\x44\x43\xd0\x95\x4c\x9f\xe3\xa7\x88\x62\x77\x67\x90\x31\xed\x25\x53\x6a\xf9\x2d\x9d\x46\x31\x35\xd4\x5a\xce\xd3\x92\xc8\xf3\xad\xc5\xcf\x83\x65\x83\x32\xa8\x27\x05\x0b\x34\xc8\xb4\xd0\x72\x60\x1e\x0c\x89\x80\xb7\x86\x59\x5b\xf8\xb9\x2e\x04\x51\x24\x84\xaf\xd9\x83\x98\x24\x03\x26\xd7\x34\x53\x6f\xca\xbc\x83\x15\xd6\x55\xe1\xa0\x8a\x2a\xb8\xba\x85\x47\x7d\x79\x2b\x52\x68\xe7\xac\x28\x85\x80\x9b\x37\x91\x6d\x6e\x6a\xe3\x34\x9a\xfc\xcd\x69\xf6\x25\x7d\x0c\x6d\x99\xda\xa7\x19\xdc\xab\xee\x94\xba\xbc\xa8\xba\x2d\x02\xb1\x27\xce\x07\xd9\x27\x65\x80\x3e\xe7\x1e\x18\x56\xe0\x21\xf4\x66\x6f\xb9\x3f\xd2\xc7\x9c\xae\xfe\xf5\x2d\x78\xc2\xcd\x58\x8f\x80\x29\xfb\x33\xb7\x98\x4c\x74\x82\xc9\x00\xc2\xb2\x10\x04\x33\x77\xe0\x22\x44\x19\x58\xac\xf3\x74\xeb\x22\x69\x1c\xff\x93\x60\x96\xa1\x6f\x20\xda\xd7\xb2\xf4\xd3\x3b\x63\x51\xcd\x92\x22\x67\x77\x4b\x23\x98\xc6\xaa\x49\x26\x95\xe3\x54\xcd\xc1\xc0\x85\xe1\x0b\x9c\x4c\xdd\x2e\x29\x12\xa0\x05\x2d\xcc\xbd\x81\x81\xb8\xb3\xbf\xd4\xcb\x3c\x4c\x9b\x7b\x71\x19\x25\x4d\x23\x0d\x85\x27\xe7\xcd\x6f\x8a\x94\xc9\xe5\x42\xc8\x8b\xdc\x4a\x4d\x3e\x16\x14\xda\x5a\x80\xb5\x7a\x29\xbe\xf4\xae\x11\x25\x1f\xbe\xb9\x5f\x1a\xa1\x54\x69\xcc\x33\xe2\x2b\x13\xfa\x30\xb6\x91\x12\x68\xfe\x3c\x5e\x74\x54\x39\x5e\x22\x17\xb7\x4c\x37\xb9\x6f\x77\xf8\x10\xa8\x0d\x0f\x56\x63\xc1\x69\xeb\xf4\x87\xc6\xc0\xa9\x9e\x65\x62\xcc\x3e\xed\xf1\x5c\xb9\xeb\xe0\x2b\xf0\xde\x05\x49\xee\x27\x7d\x9d\x58\x20\xfc\xaa\x68\x0a\x1a\xb1\x2d\x96\xb2\xfd\x79\xf7\xa3\x64\x59\x7b\x29\xcb\xd3\x2f\xb1\xdd\xd8\xd4\x90\x80\xaf\x58\x67\x53\x83\x98\x09\xcf\x18\x13\xa9\x73\x9a\xb3\x3b\x34\xc2\x0a\x0e\x35\x15\x68\xd3\x7d\x47\xcd\xf3\x01\x0a\x1d\xb0\xc4\x0b\x65\x32\xa8\x7b\xd4\x9e\x2d\x02\x93\xd0\x6c\x54\x25\x74\x52\x82\x1a\xb3\x6e\xc8\x50\x81\xda\x2e\x10\x02\x68\xe2\xd0\x50\xa4\xda\x7e\xa7\x91\xee\x63\xef\x0d\x2a\x26\x31\xaa\x38\x83\xe6\xbb\x48\x32\xd5\x67\xb7\x15\x66\xe3\x58\x33\xca\x83\x5f\x2c\x2b\xd7\x69\x8c\x38\x95\xa4\xcf\x07\x02\x70\xa9\x7d\x45\xf1\x43\x8f\x4e\xaa\xa3\x65\x5b\xa7\xf0\x99\x3f\xf1\xf1\x40\x86\x3f\xdd\x20\xdd\x24\x3e\x9d\x63\xb1\xfe\xd9\x7d\x0b\xab\x31\x18\x1c\xda\x64\x00\xc2\x95\xcb\x22\x22\x29\x57\xee\x94\xe6\xfe\x07\x84\x67\xe4\x13\xb1\x0a\x2b\x78\x48\x9e\x0b\x83\x0a\xa5\xba\x2f\x58\x61\x12\xfe\x71\x05\xa9\x1b\x52\x23\x4e\x2c\x47\x83\xd7\xdd\x35\x38\x97\x58\x26\x6c\x4a\xd8\x34\xe1\x80\x30\x4e\x10\x6e\x03\xee\x2d\xb6\xc0\xc6\x1c\x50\x0b\xbb\xe7\xb0\xea\xfd\x6a\x4d\xd1\xa3\x9e\x4f\x8a\x47\x42\xeb\x9e\x57\x1d\x82\xb6\x49\x89\xbb\x94\xc1\x5e\x69\xfd\x36\x9c\x89\x89\x30\xf1\xec\x75\x52\x0e\x03\x1b\xf6\x19\x24\x4d\xff\xf3\xee\xbb\xf4\x83\xd1\xed\x8b\x8c\xbe\x2c\x6d\x38\x53\x3d\xf0\x46\xa1\x32\x6d\xfc\xa9\x58\x23\x61\xa8\x9b\x49\x83\x20\x07\x46\xbc\x77\x9f\xc7\x6b\x33\x5a\x21\xd5\xb4\xb4\x06\x4c\x09\x8e\x0f\x32\x6f\x16\x3c\xfa\x23\x74\xb5\x31\x21\xf6\xac\xff\x54\xa9\xb5\x4e\xec\x4c\xe8\xdb\x05\xba\x1c\xeb\x8b\x06\xd7\x06\xcf\x1d\x8d\x31\x77\x0d\x25\xd6\xcb\x41\x92\xee\x46\x28\x54\xa4\x9c\xde\xf0\xef\x2d\xdb\xde\x45\x9d\x58\x13\x78\xcd\xfe\x8e\x6d\x4b\x97\x56\x27\x55\x8c\xbc\x26\x80\x9d\x79\xd7\xbc\x35\x10\xc3\x4a\x01\xea\x81\xd5\xb0\x4a\xc3\x6c\x6c\xd7\x38\xc7\xe9\x2d\x13\x7e\xe6\xf5\xec\x16\x56\xb5\x9a\x87\x46\x56\x0c\x24\xb3\x41\xd3\xe4\x80\x8d\x37\xf6\x92\xc6\x10\x03\x1b\x1c\x91\xd8\xc3\xb2\xad\x35\x27\x9c\x60\xd8\x79\x63\x50\xe6\x07\xbc\xb3\x9d\x02\x24\x86\x9f\x2e\xad\x58\x1c\x63\x4d\xae\x1d\xd3\x3d\x1e\xd6\xc5\xae\xd6\x36\x55\x06\xd3\xb3\x58\x9a\x7e\xc5\x70\x7a\xff\x5d\xac\xd4\xff\x4e\xf0\x58\x11\xb3\x40\x3b\x06\x58\xde\xa4\x54\x5f\xf5\xe5\x79\x62\x67\xdf\xa7\x9d\xd9\xf9\x1d\xad\xd4\x90\x7e\x5e\x58\x79\x6b\x55\xdf\xb4\x7f\xb2\xc2\xf7\xad\xb7\x7b\x8a\x4b\x97\x17\x2b\xdc\xcf\xca\x8d\x9e\xc4\x66\x9c\xab\xbd\x71\x20\xf7\x55\x29\x74\x2d\x18\x89\x95\xf2\xbe\x8c\x01\x84\x0b\x77\xcf\xf6\xc6\x00\xdb\xd2\xa7\xbc\xf6\x0d\x5d\xbb\xc6\x7e\x08\x53\x5a\xf8\x26\x80\x03\xeb\x9c\x2c\xd2\x3e\xa2\x65\x01\x79\xa6\x5e\xd7\x18\xd7\xdf\x32\x49\x6d\x82\x19\x30\x9f\x73\x7b\x0a\x8a\xa4\x55\xf2\x94\x98\x17\x2d\xd7\xc8\x10\x73\x5a\x47\x4e\x02\xd1\x33\xcc\x59\x27\x3a\x0b\x89\xfd\x8c\x2e\x08\xb2\x3b\xea\x44\x15\x83\x58\xfd\x47\x07\x26\x3c\x6b\x50\xd4\x32\x31\x26\x2d\x57\xb2\xb2\x0b\x3b\xc7\x09\xde\x99\xad\x39\xc1\xd9\xc3\x23\x56\x11\x9e\xf8\xb8\xec\x62\x97\xaf\xc2\x42\xa8\xd6\xf3\x47\x97\xf2\x45\xf3\xfe\xee\x4b\x97\xcf\x74\xbf\x9a\xda\x97\x54\x07\x57\xb0\x3e\x5a\x9a\xc2\x2b\x47\x31\xc0\x9a\x15\x8d\xe7\x4d\x44\xb6\xdd\x4f\x53\x25\xa4\xf1\xfa\x7b\x79\xf7\x4f\x5f\x20\x55\xac\x21\x82\x90\x4c\x77\x82\xf5\x7b\xef\xa0\x04\xbf\x76\xb7\xaf\xb4\x94\x6c\x31\xf2\x27\xa8\xbb\xf0\xe7\x77\xc5\xfc\x52\x06\x04\x2f\xe0\x96\xf4\x81\x40\xbb\x42\x08\x7b\x4e\x5e\xf0\x03\x42\x2c\xd8\x57\x3a\xb1\x39\xa4\xe1\xab\x3d\xce\x13\x55\x16\x74\xd3\x38\xc7\xd5\x0b\xbf\x4d\x06\x0c\x8c\x04\x15\xd1\x10\x7c\x95\x98\x09\x33\x92\x57\x77\xff\x50\xde\xa6\xa6\xbc\xb9\xc3\x8a\xda\xd6\x98\x29\x9e\x39\x6d\xb7\x45\x50\xac\xa2\xa9\x87\x92\x29\x1c\xfb\x06\x3a\x9f\xbc\x09\x76\x8c\x2a\x78\x52\x13\x8b\x2c\x5f\x49\x67\x01\x0c\x8c\xa1\x36\x53\xbe\x8e\x47\x15\x89\x62\x1d\xdf\x2b\x09\xac\xf5\x89\x82\xc4\x7b\xb2\x50\x71\xf1\xe7\xbe\xe8\x92\xca\xb4\x8c\x05\x78\xd7\x77\xe5\x78\xab\x4d\x4b\x59\xde\x02\x09\x39\x96\xaf\x1e\xe3\x24\x98\xc6\x43\x48\x9b\x5b\x34\x7d\x12\x09\x90\x9b\x48\xb4\x6f\x12\xc4\x2c\x3a\x25\x2f\x87\x2b\xd0\xf9\x08\xa0\x61\x9d\x6c\x6f\xe2\x52\x88\x89\x96\x52\x27\x36\xcd\xb4\x70\xd1\x2c\xb4\x92\x28\xd0\x0d\x1d\x7a\x87\x2e\x8b\x32\x2f\xa2\x95\x52\xb1\x40\xda\xcc\xf9\x47\x6f\xa8\xf9\xe4\x55\x1c\x2c\x58\x68\xfd\x15\x37\xc7\xdc\x8f\xbb\xa6\x73\xb7\x94\x43\xc9\x5d\x2f\x71\x7d\x68\x01\xd2\x31\x80\x06\x52\xbc\x1c\x16\xbc\x41\xbc\x54\x98\x8f\x13\x1b\x6f\xf3\xae\x5c\xd0\x7c\x5c\x8e\xb1\xa2\x26\xc4\xa6\x5a\xc9\x42\x21\xc1\xf0\x8e\x9d\x70\xa6\xc4\x96\x61\xef\xf4\x22\xcd\x37\xad\x3a\xa2\x83\xaf\x97\xc0\x51\xfb\xea\x9e\x5e\xc9\x3d\x38\x86\x16\x28\xef\xc1\xf9\x66\x47\x22\x12\xed\xc2\xaa\x11\x88\x90\x10\xa1\x53\xdb\x7d\x06\x67\x69\x4b\x3c\x82\x27\xc4\x15\xf2\x6b\x6e\xb9\x62\x17\xf9\x85\xd0\x2f\x76\x84\x3f\xc2\x23\xe6\x72\xc1\xda\xdc\x7d\x83\x04\x7d\xb7\x01\xf0\x82\x92\xd6\x60\xb1\x99\x3d\x07\x7c\x66\xf6\x0c\xef\x89\xc4\x7c\x91\xd2\x4f\x30\x2c\x82\x97\xa1\x3e\x01\x0e\x8a\xef\xa4\x34\xcc\x7e\x33\xfa\x11\x7c\xde\x17\x53\xba\x26\xdb\x17\x65\x10\xb0\x75\xfb\x5d\x78\x5b\xdd\x82\x24\xe2\x0c\x93\xbd\xd2\x9f\x87\x3a\xec\x22\x36\xa6\x3a\x3f\x0d\xbb\x14\x6e\xf1\x1a\xac\x19\x41\x7c\xf6\x9e\x89\x4b\x77\x8d\xc0\x57\x84\xbb\x94\xed\x2c\xa4\x89\x9a\x80\x6b\xe2\x69\x88\x8f\xb5\xe4\x69\x6b\xc7\x57\x52\x92\x3e\x8c\xe8\x48\x6c\x36\x97\xf7\x7c\x50\x75\x09\xe5\xa3\xa8\x9c\x5b\x03\x9a\x09\x78\xc1\xcd\x1a\x37\xa3\x04\x5b\xc9\xc2\xbe\x64\x18\x9b\xd6\x96\x16\xed\x5f\xac\x7e\x46\x25\x20\xc9\x22\xe5\x08\x2a\xdc\x0e\xfd\x57\x22\x4c\xac\x8e\x57\xde\xf3\x14\x5b\x5d\x75\x1a\xa8\x84\x93\xe6\xc6\x73\xf9\x65\xc7\x29\x9b\x85\x7d\x58\xc5\xdb\x45\x19\xc6\x52\xcc\x14\xa4\xdb\x09\xad\xcc\xb9\x26\xf0\x1e\xc9\x92\x0c\x43\xda\xf7\xf8\x02\xc9\x44\xed\x03\xce\x6c\xb9\xc4\x87\xfb\xae\x39\x0b\x89\xe3\x0e\x87\xb3\x26\xd1\xbe\x37\x7b\xd2\x52\xf6\x09\xc7\xdf\xc9\xf1\x3c\x39\x7e\xe3\xef\x8f\xdf\x39\xbd\x93\xa8\xc3\x6d\x8b\x24\x8c\xb9\x57\x2c\x71\x8f\x23\x09\x4f\xbe\x62\xef\x1e\x2b\xd4\xaa\x30\xa1\xe0\x83\x2c\xbc\xe3\x5e\xa4\xf9\x89\x38\x52\xe6\xf4\xe2\x1e\x49\xd0\x63\xda\x9c\x93\x22\x91\xa5\x44\x62\xce\xa3\x6f\x88\x47\x28\x05\xda\xcf\xb7\xc5\xa3\xda\x3a\x70\x8e\x5a\x29\xe4\x48\xf8\x66\xea\x9b\x64\x10\x4f\x60\xc6\xfb\x52\xdb\x00\xb0\x0d\x25\x22\x33\xa2\x99\x26\x47\x26\xf3\x42\x8b\xb7\x50\x9e\x7b\x1f\x1c\x79\x70\xdd\xc3\x2a\xf1\x1e\x79\x7b\xf4\xba\x40\xaf\x1b\x4e\x84\x94\xbd\xce\xc2\xf8\x68\xad\xc3\xb9\x3e\xff\xe3\x5c\x7d\xcc\xe5\x7c\x9f\x2b\xa0\x0c\xc5\x4d\x48\xdf\x20\x67\x2f\xa3\x14\x3d\x64\x1f\x16\x29\xdc\x20\xbf\x73\x28\xc7\x5c\xdc\xcf\x68\x59\x8f\x3e\xb3\x34\xa2\x94\xd4\xcb\xa1\x2c\xd2\xc4\xf4\x48\x5a\x42\x1c\x74\xce\xcb\x97\x7b\xb9\xa4\x69\x64\xc2\xb4\x74\x90\x52\x16\xbc\x89\xf4\x73\x6f\x69\xae\xbd\xe8\x4d\x25\xcd\x39\x25\x3d\xef\x02\x46\x27\x4d\x8a\x91\xc2\x99\x96\x44\xba\x74\x8f\x69\xd3\x60\xeb\xc8\xb9\x32\x64\xde\xae\xc1\x00\x38\x82\x57\x94\xaa\xd3\xb0\x68\x94\xe3\x9e\xc9\x65\xa5\x0f\xc9\x05\x28\x8b\x21\x4e\xda\xfd\x4c\x9e\xae\xda\x74\xbc\xda\x7a\xd0\x10\xf6\xf0\x8b\x85\xd3\xf1\xbc\x01\xa3\x82\x41\x79\x1d\xc5\xdc\x68\x05\x59\x92\x0a\x21\x1b\x43\x50\x54\xbb\x2d\xa6\xfa\xdc\xa5\xcd\xd3\x82\x26\xc7\xa5\x4e\x05\x91\x9b\xda\x85\x31\x32\xd0\x76\x0d\x68\xde\x8f\x58\x9f\x19\x20\xf3\xc0\x86\x22\x08\x16\x14\xec\x2e\x60\x3e\x7f\x60\x3d\xa9\x6c\xe4\xe2\x01\x7f\x84\xe3\x55\xdd\xa5\xd7\xd9\xc1\x61\xb7\xdc\x0c\x80\xb5\x1f\xa5\x89\xe1\x9c\x57\x80\xdb\x43\x13\xab\x2b\x0b\x99\xe9\xae\xb4\x33\xd4\x49\x9c\x01\x0b\xa9\xfd\x76\x6f\x8e\xdd\xd6\xfc\xeb\x32\x96\x14\xc3\x09\xe6\xcd\xe0\xb1\x7d\xbc\x50\x92\x22\xe2\x9d\xa4\xf6\xcc\x66\x7d\x06\xb5\x87\xcf\x3a\x54\x73\x59\x6b\xff\x1d\x2a\x92\x66\xfa\xb3\xcc\x66\x79\x75\xdb\x94\x03\xdd\x50\xfc\xa1\xd8\xca\x44\xd9\x81\xa7\x1e\x83\x80\x32\xcc\x64\x61\x84\x86\x60\x64\xa6\x68\xfa\xfd\x06\xe3\x76\x66\xa7\x74\x40\x51\x38\xe0\x99\x9b\x67\x35\x18\x0d\xa7\xdf\x4f\xa4\x31\x72\x57\x9c\x59\x0c\x49\xd3\xc5\xb7\x17\x0a\x02\x43\x5b\x42\x8b\xb5\x6a\xd5\xff\x25\x16\x8c\x18\x20\xeb\x32\x7a\x2f\xa9\x73\x09\x04\x14\x75\xa3\x82\x09\xed\x02\x11\x11\x4b\x4f\x84\x4d\x4b\xbb\xbc\xac\xe0\xe2\xd5\x25\x2b\xa8\xe3\xda\x6f\x63\x23\x6b\x4f\xdd\x07\x74\xa1\x52\x4f\x73\xea\x1b\x33\x6a\x08\xfc\x32\xea\xb4\x64\xc5\x13\x0c\xba\x02\x79\x21\x06\x05\xa2\xc2\x69\xa1\xbb\xac\x38\xa8\xd1\xa6\x41\x35\x88\x77\x06\x45\x12\xd5\x41\x6b\x95\x2b\x56\x5a\x83\xcd\x19\x72\x38\x05\xc3\xc7\x46\x32\x20\xf7\xcf\x73\x68\xbf\xb1\x92\x28\x5b\xfb\xec\xe3\x05\x18\xd0\xa4\x7a\x28\x69\x52\xdd\x6b\x6a\x93\x90\xf9\x0c\xb0\x18\xca\x8e\x34\xd7\x4f\x78\x01\xc6\xac\xf1\x29\x7f\xbc\xad\x7d\xcd\x0b\x09\x99\xb9\xe1\xd2\x43\xd5\x41\x68\x3d\x5b\x6f\xc6\x54\xfa\xbe\xb2\xbb\x5f\x19\xd0\x7d\x28\xe9\x7c\xbf\x72\x83\x15\x7b\x72\xf9\x63\xc9\x4d\x50\x09\x92\xce\x7b\x63\x93\x46\xd0\x04\xe8\x6d\xd5\xfc\xfb\xc6\x10\xb3\xf0\x3a\x66\x73\x53\x7b\x1f\x2b\x7f\xa5\xcf\x21\x9d\xbc\x5d\xd8\xf2\x61\x94\x33\xaa\x0f\x79\xa0\x69\xfd\xde\xbc\x08\xe1\xac\x02\x06\x51\x02\x13\x48\xe3\x78\x31\x62\x32\x75\x4d\x89\xf2\x8e\xf4\xca\x70\x67\x57\xdf\xf8\x73\x0d\xa5\xcf\x0a\xa1\x1a\xae\x4c\x28\x8f\x55\x62\x42\xa7\x22\x63\x14\xb3\x9a\xdd\x24\x32\x87\x14\x58\x89\x5c\xbd\xb6\xcd\xef\x66\xb4\x4a\x49\xde\xaf\x3d\x90\x41\x40\x75\xa9\x2a\x39\x23\xb7\x37\xac\x44\x9b\x00\x1b\x67\x88\x6f\x6e\x6d\x5e\x07\xee\x9d\x80\x96\xde\x70\xa1\xd3\x5c\xbd\x23\x6b\x46\xe3\x06\x07\xd8\xff\x74\x60\xb1\xea\x9d\x25\xa4\xf1\x90\x85\x30\x09\xdd\x1a\xbd\x85\xd3\x07\x7a\xb7\xac\xb1\xa0\x53\xde\xe3\x15\xba\x16\x57\x1f\x4e\x69\xdf\x26\x8d\x42\xbf\xba\x2b\x97\xbe\x45\x0d\x84\xd7\x5a\x60\xb1\x2e\x4c\x57\x09\x20\x08\x9e\x30\xaf\x09\x9b\xbb\x34\xdc\x88\xa8\xe0\xfc\xde\x18\xf8\x72\x8c\x4b\x2c\x1f\xf1\x9e\xa8\xaf\x09\x19\x8e\xdb\x10\x21\x5c\x94\xd9\x83\x32\xba\x57\x0f\xd0\x77\x65\x9a\x3a\xa9\x5c\x90\xa2\xef\x79\xc1\x24\xe1\xb6\x5d\x5e\x73\xa6\xa7\x68\x64\x19\xd4\x6a\x98\x70\x14\xd8\x1e\x5e\x6a\xc8\xda\x55\x55\xb3\x3f\xb0\x15\xe3\xc9\xce\x99\x43\x32\x69\x02\x0e\x2f\xee\x81\x5e\xe0\x92\xc0\xb9\xcd\xda\xc4\x00\x29\x4f\x6f\xc4\xfa\x36\xb1\x44\xe7\x73\xfc\x52\x49\xcb\xcf\xa0\xd4\x7a\x8c\x8f\x43\x55\xbd\x23\xa4\xf4\x70\xa3\x78\x4f\x18\xc6\xde\xc2\xdc\xa0\x2d\xa2\x9b\x4f\xd5\x2e\x96\xe0\xf4\x84\xfe\xaf\x1a\x19\x4b\x08\x12\x85\x04\x2e\x69\x36\x3a\xde\x28\xb1\x1b\x03\x1a\x2c\x47\xb6\x5c\xe5\x5f\x7b\xb4\x93\x4e\x1b\x9a\x6d\x6a\xe6\xaa\x7c\xdf\x1a\x3c\xb3\xaa\x05\x15\x26\xeb\x11\x7f\x73\xe4\x4c\xac\x50\x09\xf5\x88\x8f\xff\x80\x64\x23\x84\x50\xca\x1f\xd6\xb0\x3f\xc0\x4b\x51\x0d\xaa\xb0\x77\x4a\x86\xdd\x45\x5f\x04\x99\x4a\x9d\x13\x26\x6c\xf4\x88\x84\x61\x88\xa8\x78\x97\xa3\x2c\xed\x73\xc0\xf9\xc6\x39\x61\x7d\xcb\x59\x84\x4c\x6a\x9d\x9e\xbb\x69\xe4\xc7\x6e\xaa\xcc\xc7\xb3\x08\xfc\xc4\xbd\x9c\xdb\x1f\x34\x06\xae\x5c\xde\xfd\x31\x13\x49\x05\x9b\x7b\x65\x3b\x8c\x2d\xca\xde\x85\x46\xb4\xeb\x6f\x86\x9f\x36\x8b\x49\x50\x43\x29\xe1\x45\xd7\xdb\xa0\x6f\x6c\x8f\x91\xcb\x59\xd9\x5b\xa0\xd8\x64\x3b\x50\x8f\x12\x31\x70\x60\xe2\x07\xef\x1d\x5a\xdf\x20\x84\xfa\xc3\xf1\xfe\xde\xeb\x05\xd4\x32\x43\x1a\x64\xc2\x5b\x5e\x33\x59\x36\xf6\x79\x2b\x40\x3d\x60\x8c\x6b\x8c\xea\x32\x95\xd9\x89\x71\x09\xa7\xe0\xd2\xa8\x1e\x90\x0c\x8f\x18\xb1\xba\x86\x5d\x34\x3b\xe8\x05\x7c\x58\x71\x0a\xdd\x10\x6b\xab\x54\x2a\x35\xdd\x04\x83\xae\x21\x49\x7e\x7f\x42\x72\x52\x33\xc5\x8e\x71\xa0\xc1\x0c\x2d\x54\xe5\x88\xaa\x07\x8a\xbb\x30\x5c\x26\x8d\x6b\xc6\x0c\xb7\x38\x43\x9b\x8c\xd9\x3b\xe3\x85\xc1\x35\x79\xf6\x56\x44\xe2\x4e\x25\xf7\x74\x67\xc0\x28\x75\x93\x20\x40\xc8\x61\xa5\x58\x67\x26\xb3\x48\x27\x8b\xc2\x4f\x9d\x12\x36\x8c\xae\x98\x4a\x5b\x53\x8d\x51\xae\xec\x1b\x5b\x8e\x09\x0f\x66\x2d\x29\x8b\x66\x28\xda\xdc\x79\x65\x14\xb2\x57\xb2\x3e\x03\x46\xfc\x89\x13\xa6\x43\x7f\x8a\x17\xd1\x7e\x93\x1a\x8c\xd6\x95\xc3\x78\x88\xbb\x78\x44\xed\x17\x10\x3d\x11\xae\xf5\xe6\x36\x3c\x28\x8b\x26\x2f\x84\xcc\x1d\xd2\x10\xd3\x3b\xfa\x4f\xfc\x4d\x96\xc9\x3e\xe6\xaf\x9e\xc6\xc2\x35\x63\xbb\xc3\x28\xa7\x09\x7c\x40\x56\x77\x17\xa8\xb8\x99\x9b\xec\xb3\x5e\xea\x11\x13\x27\xf6\xea\xb6\x62\xc7\x6c\x40\x43\xbd\xf4\x96\xfe\xfd\xe2\xb6\xa8\x11\x82\x7b\x7f\x44\x03\x79\xc6\x80\x36\xbd\xfc\xd4\x63\x95\x58\xfb\x44\xe0\xee\x3d\xe2\x9c\x48\x52\x9b\x44\xc6\x75\x70\x01\xeb\xbc\x16\xa4\x88\x58\xf6\x15\x63\x06\xe7\x2e\x63\x09\x47\x2e\x65\x03\x43\x70\x2e\xd4\x8a\x80\x12\x54\xb3\x61\xb9\x77\x11\x6a\x0f\xa4\x78\x8d\x19\xa0\xdd\xdd\x32\xa4\x85\xe2\x5a\xc3\xd4\xce\x1f\xc1\x2e\x17\x01\x0d\x22\x26\x64\xbc\xe2\x36\x22\x4b\x0c\x07\x58\x59\x8a\x2a\x7e\x48\x17\xbb\x9f\x0e\xad\x45\x93\xbc\x10\x2f\x55\xde\x36\x8f\x25\x03\xe6\x00\x6b\x78\x67\x94\xa5\xa0\x32\xf8\x03\xb3\x5d\xb8\x7b\x66\x63\xda\xb0\x3d\xe6\xc7\x75\x0a\x72\x94\x9b\x32\x30\xd6\x39\x61\xc5\x3d\x5d\x16\x33\xec\x4a\x8c\xe5\xd6\x55\x25\x81\xbb\x10\x86\xbf\xfb\x6d\x7e\x8e\x45\x3e\xce\xa9\x72\x77\xca\x98\xde\x3d\x89\x9d\x5c\xdf\x95\x03\x3e\x7d\xc2\xb0\x00\x9f\x94\xbd\xa8\xbc\x4c\x01\x0f\xde\xe9\xef\xe6\x80\x64\xd7\xfc\xf8\x10\x32\xa1\x73\x87\x7d\x51\x46\x9f\x7d\x4a\x7a\x5f\xf3\xe7\x42\x6a\x21\xc2\x74\x88\xe8\xa9\x73\xf5\x76\x5b\x69\x35\x37\x07\x44\xb6\x4d\xcc\xf5\x1f\x08\xda\x66\x59\xbb\x83\x75\x1e\x76\x0f\x7f\xb1\x11\x2b\x30\xfb\x38\x98\x7c\x13\x16\x7b\xeb\x4b\xd5\x9f\xc4\xc5\x43\x09\x1f\xdc\xfa\x50\x56\xfd\x1c\x85\x01\x89\xd4\x25\x7b\x7c\x15\xfb\xf1\xc8\xd9\x97\x26\xa9\x89\x4b\xb7\xa1\xd2\x27\x18\xc6\x2d\x00\x6f\x67\xa3\x4a\xa2\xf8\x7d\x8a\x4f\x38\x60\x5f\x32\xbd\xad\xc3\x1a\x92\x85\xd4\x90\x0c\xc9\x90\x20\xf7\xe8\x08\xec\xf1\x7c\xc3\xe2\x8b\x6a\x0d\x03\xa3\x9b\xfd\x6b\x1f\x0a\xe7\xc6\xff\x23\x55\xca\x8f\x76\xb0\x52\xea\x1d\xf5\x54\x0b\x5a\x93\x31\xf1\xca\x7a\xe7\xe1\x8d\xc3\x9c\xe3\x50\x0a\x7b\x59\xb7\x37\x64\xd1\x6a\x59\x82\x81\x1f\x09\x22\x67\x02\xb2\x18\xd6\xce\x64\x4f\x77\xfe\x05\x8c\xa6\x37\x84\x7d\xd4\xce\xbe\x0a\x2b\x70\x89\x2e\x20\xed\x32\xdb\xe4\xf5\xa7\x3c\xdb\x29\xf2\x11\x99\x0d\xb5\xd3\xa2\x83\x23\x5f\xf8\x05\xd3\xfb\xa7\x30\xfa\xfa\xac\x76\xaa\x1b\xe6\xf4\x4a\x56\x4a\x18\xf6\x44\xb0\xea\x96\x95\xb4\x7a\x12\xaf\x93\xf9\xb4\xcd\xd6\x80\x0a\x42\xf7\x9f\xf6\x54\x6a\xef\xb4\x13\x7a\xf8\xab\x6c\x38\xc9\x45\x60\xf8\x1b\x82\xe3\x1a\x11\xc1\x5a\xe3\x84\x61\x2d\xd8\x54\x37\x60\xd1\xb5\x7d\x0d\x25\x5c\x67\xec\x2e\x3e\x0f\xc8\x1a\x63\x0a\xaf\x53\xe1\x79\x0d\x96\x1a\x8c\x53\x8b\xc5\xe0\xfb\x41\x00\xf0\x59\xc0\x39\x61\x56\x35\x21\x31\xdc\x90\x1b\x97\xb0\x78\xfd\x3b\x91\xf4\x0c\x79\xac\x25\xee\xb2\xb6\x73\x03\x19\xe3\x9b\x0a\x68\x72\x7b\x82\x88\x86\x50\x10\x8d\x14\x2c\xb5\x42\xad\xc7\x54\x4d\x78\x0d\xf1\xfa\x91\x09\x48\x61\xf0\xb9\x7d\x63\x14\xf1\x75\xc0\xa4\x14\x79\xec\xc4\xb4\x52\x5d\xb1\x12\xc9\xe7\xef\x81\xa1\xa0\x74\xb2\xbf\xd1\x18\x89\xd3\x84\x6f\x3e\x8a\x78\x6f\x4f\x02\x86\xb8\xf8\x98\x7d\x29\x97\xd2\x5a\xf6\x37\x82\x4b\xd6\xa4\xf9\x03\x13\xe8\xb9\x46\xe6\x90\x7a\x93\xfa\x04\x5e\xe7\x86\xb8\x1e\x77\x29\x05\x64\x58\x0d\x4a\x34\x3c\x6b\xd1\x68\x2a\xcb\xb6\x6a\x88\xf2\x7d\x2d\xdb\xd2\xab\x01\xdf\xe6\xee\xd3\xb7\x3c\x2c\xaa\x37\xb5\x15\xbd\x34\xe9\xa0\x73\x84\x0c\xdb\x67\xcd\xe3\x32\x1c\x3b\x3c\x67\xa4\xe8\x8c\x55\x72\x49\x93\xb6\x9d\x78\x87\x41\x1d\x71\xd1\x37\x9b\x95\xdb\x83\x99\x50\x9c\x73\x63\x6f\x69\xd8\xbc\xfb\x0c\x48\x08\x71\xdd\x78\x7b\xc1\x1e\x34\x8b\xbb\xbb\xda\xc1\x9a\x31\x03\x97\x83\x1b\x13\xb5\xb9\x67\xcc\x52\x63\x74\x1c\x4f\x45\x39\x9e\x8c\xac\x1c\x53\x98\x4c\xa9\x44\x24\x5d\x00\x86\x3f\x1d\x90\xd9\xbb\xa0\x22\x16\xf8\x03\x5a\xd7\x1d\x3a\xb4\x32\xa0\x18\x36\x79\x2c\x86\x7d\xff\x3d\x37\xc5\xe4\x96\x4c\x0f\xa9\x8c\xe8\x7a\x6e\x7e\x08\x85\x09\x10\x23\x7c\xd0\xb4\x04\x81\xc6\xab\xc7\xb2\xe9\x02\xd8\x16\x5b\xce\x5c\x2a\x52\x9f\xee\x0c\xb0\x27\xe2\x3c\xda\x19\x18\xbb\x03\x63\xb6\x16\x3e\x3d\x63\x53\x15\xea\xe3\x23\x0a\xad\x1a\x45\xf9\xd7\x42\x15\xfe\x32\x98\xa9\x29\x5a\x1b\xf6\x2e\x15\xe6\x67\x44\x85\xf9\xee\x8a\xd1\xf6\x11\xd1\x38\x38\x46\x5a\x32\x87\xd5\x56\x64\x9b\x69\x46\x0c\xa9\xd5\x1d\x03\x72\x2d\x1f\xd2\x8a\x4d\x7b\x81\xc8\x91\x16\xd9\x07\x5f\x1a\x4b\xc3\x70\x51\x5f\x32\x1d\xe7\x50\x93\xad\x0d\x00\xd1\x27\x67\x61\x87\x9f\x3c\x27\xab\x7b\xba\x0f\x5f\xa7\xd1\x9e\xd4\x50\x16\xb8\xfa\x92\x3d\x6f\x89\xf8\xc1\x16\xda\xe6\xd3\x0b\x44\x21\x4e\xd4\x18\x8a\x6f\x6c\x1b\x90\x41\xc0\xcc\xd5\x1b\x05\x69\x26\x44\xe7\x3d\x13\xaf\x1b\xfb\x0d\xa2\x7a\x6b\xa7\xcc\xd8\x6d\x84\x89\x3c\x7c\xef\xe7\x25\xde\x3c\x6d\x93\xd0\x85\xd9\x56\x1a\xdf\x1f\xe9\x2b\x49\x9d\x16\x89\x60\x07\x07\xb2\x3b\x71\xf7\x59\xd0\x95\xfd\x21\x54\xd8\x18\x8b\x4e\x33\x8d\xf8\x4d\xb3\xe2\xf9\xa5\x7c\xcc\xc4\x15\x91\xf3\x9c\xc2\x09\xfe\x30\x85\x0e\x57\xdf\x21\xbb\x2e\x2a\x00\x2e\x1f\x0b\xd5\xaf\xdd\x14\x9f\x46\xf9\xf7\x2a\x83\x36\x73\xd4\x41\xf6\xc8\x82\x85\x47\xa4\x16\x3c\x86\x22\xda\x9b\x07\xd4\x63\x3e\x6f\xf9\x7a\xf6\x80\x42\xf2\x25\x43\x17\x73\x44\x9b\x32\xc5\x3b\xb4\x32\xd6\xc4\x10\xa5\xf3\x46\xd8\xc2\x9b\x17\x9d\x17\xf0\x1d\xfb\xd0\xa4\xa9\x4f\x67\xc9\x74\xbd\x57\xba\x4e\xa4\x8a\xd3\xaf\x93\x86\xb6\x77\xff\x89\xbf\xea\xaa\x60\x26\x91\x00\x88\x0a\xbe\x42\xc4\xc6\x86\x55\x8f\xf7\xd5\x4d\xfc\x8d\xbc\x16\xab\x9f\xc5\x5e\x98\xda\xd7\xe0\xc1\x01\xcc\xbe\xc1\xd5\x7d\x11\x1c\xd1\xf4\xc0\x44\x4c\x64\x6e\x9b\x40\x14\xde\x18\x7f\x8c\xc1\xed\xc1\x9c\xe0\x1a\x77\x39\x22\xc4\x8f\x03\xee\x7d\x90\x29\x6b\xa1\x18\xb7\x0f\x97\xa4\x9f\x15\x7f\x1f\x92\xbf\x98\x12\x8c\xa9\xca\xa9\x2f\x4e\xe1\x5e\xee\xa3\x2f\x7d\xc2\x87\xa6\xfc\xb0\xb4\x14\x82\x51\x75\x6d\x28\x97\x31\xc8\x6d\x28\x09\x18\x6d\x8a\x7f\x82\x95\x07\xd4\xc6\x31\x34\xee\x05\xc4\xc1\x15\x05\x71\x5f\xcb\xdc\x22\x04\x34\x64\xf4\x47\x5c\x12\x04\x7f\xe4\x22\x0f\xf4\x10\xb6\xc4\x0b\x98\x5a\xe4\x75\x2b\x92\x51\x7e\xd1\xa5\xa0\xf0\xc0\x2a\x20\x49\x77\xa8\x7d\x09\x51\x35\xb8\xda\x03\xde\xcd\x9b\x8c\x20\xb7\x66\xcc\x41\x28\x32\x76\x16\x1c\xb2\x17\x7f\xf9\xec\x1d\x8a\x6f\x6b\xaf\x98\x09\x37\x9f\xe0\xec\x17\x85\xac\x18\x98\x22\xb5\xf0\x06\x60\xef\x26\xcc\x70\xd5\x6e\xff\x48\xdc\x30\x5c\xdc\x6d\x13\xbc\x13\x7d\xfe\x99\x0b\xd6\x72\xf9\xc9\x3b\xb1\x69\x38\x7c\x95\x34\x66\x84\x64\x65\xed\xbf\x99\xaa\x65\xf9\x73\x95\x1e\xca\xcb\xdb\xd2\xa3\xac\xb7\x4b\x9b\x20\x30\x85\xc4\x15\xa7\x25\xa0\x0c\x5e\x37\x50\xe2\x8c\xc8\x32\x0a\x0c\xfa\x39\x72\xb8\xab\xe2\x47\x15\xaa\x5c\x2f\x6e\xe5\x65\xe3\xf5\x50\x10\x5e\xda\xc6\x8e\x61\x6d\x8d\xbd\x3b\xa8\x17\x6a\x57\x3a\xdb\xe7\x76\x4a\x0f\x6b\x6d\x6e\x24\x68\x64\xfc\x36\x76\xbf\x57\x66\x9d\x5c\x54\x03\x4b\xa0\x9c\x17\x2b\x5f\x10\x1c\x66\x85\x10\x7f\x34\x4c\x12\x45\xea\xca\x16\x7a\x5d\xfb\x9d\xfc\xa1\x32\x29\x13\x8e\x5d\x26\x97\x11\xb3\x61\x34\x41\xbb\x64\x92\x82\x99\xda\xf3\xea\x8f\x2d\xbe\x81\x70\x2f\x48\xb8\x6e\x1b\x32\xe2\x11\x5e\x87\xf9\xb9\xa0\xc2\x57\xb4\xc2\x77\x21\x59\xef\xbc\x61\x72\xcb\xef\x4f\x65\xd1\xc0\x4e\x88\xb5\x28\x59\xf9\xe8\x1a\xc7\xd3\x2d\xd2\x53\xb5\x8a\xfd\xb3\x13\x23\xb8\xf5\x8a\x5a\xc0\x0f\x66\xfe\x19\x7c\xdf\x22\xff\xff\xf4\xce\xec\xd9\xdc\xd4\x06\x76\x25\xa5\x8b\xdc\xfc\x12\x26\xcc\xdd\xd6\x33\x00\x10\xc2\x5d\x20\x79\xae\x95\x26\x1b\x79\x27\xb7\xbd\xc0\x3d\xc4\xe7\x4f\x99\xfd\xf1\xb1\xa2\x83\x65\xba\xc1\x23\x5d\xde\x5e\x09\x34\xa9\x01\xdf\x50\x0a\x50\xd2\xcb\xe5\xe6\x96\x58\x01\x1b\xd2\x29\xa5\x0d\x82\x9a\xe1\x0c\xe5\x43\xa4\x2a\xbf\x3a\x9c\x97\x8a\xa7\x95\x6b\x3c\x67\xdf\xe2\xa3\x46\x2a\x71\xbc\xf9\x19\xc8\x89\x2a\x65\x95\xe8\xb4\x33\xda\xb8\x14\x4b\x03\x84\xe3\xf9\x4b\xbc\xad\x8f\xce\x41\x53\x5b\xee\xda\xae\xa1\xd3\xa3\x27\x24\x5f\x41\xc5\x5d\x43\x32\x91\x75\xd4\xd0\x46\x41\x8b\x96\xea\x53\x85\x28\x9c\xe3\xf2\xe7\x6d\x7b\xe6\x1a\x2b\xf8\xec\x04\xce\x46\x71\x3d\xc0\xfc\xc4\xea\xac\x51\x25\x4d\xb1\x5d\x67\xac\xdd\x27\x1d\x48\x5c\xbc\x0b\x49\xa6\xff\xcf\xd5\x51\xab\x68\xdc\xe7\x1b\x55\xc6\x5c\x72\xdf\x44\xd7\xb7\x10\x6f\xfd\x6b\x86\x2a\x79\x11\xb7\xb7\x51\x45\x5f\xaf\x08\x5a\x40\x19\xa9\xac\x81\x71\x43\xe6\x97\x7a\x29\xb3\x03\xa7\x3f\x7d\x9c\x32\xf7\x54\x24\xde\xf0\x53\x00\x66\x20\xe3\x62\xd8\x93\xa9\x9b\x2b\x6b\x93\x79\x99\x6d\xcc\x88\x41\xef\xdd\x29\x8d\xf8\x73\xdc\x6f\x58\xe1\x1e\x1e\x7e\x2c\xcd\xaa\x9b\xda\xab\x4b\x8a\xc9\x9b\x07\xda\xa8\xc9\x03\xed\x9d\x72\x69\x93\x00\x30\x79\x3f\x0c\x3f\xb5\x51\x7f\xba\xb3\x99\x6e\x35\x59\x86\xae\x49\x2f\x98\x37\xa0\x30\x93\x1d\xa9\xa9\xf3\x56\x4d\x2c\x98\xdf\x30\x1b\xdb\xd5\xc6\xc0\x24\x0b\x6a\x62\xaf\xa8\xba\x73\x0a\xa2\xe6\xef\xca\x99\x74\x87\x55\x0c\x08\xca\xa4\x87\x63\x50\xc1\xdf\xa8\x89\x78\x09\xb7\x77\xa5\xbe\x4a\x0e\xfc\x4a\xa0\x29\xfd\xf8\xc1\x59\x19\x43\x94\xbe\xc1\xfe\x7c\xae\xc3\x60\x90\xab\x72\x30\x3c\x97\x20\x56\x09\x61\x02\xb8\x2c\xeb\xef\x5d\x98\x57\xdc\x8a\x51\xab\x06\x63\xfb\x3d\x56\xe5\x5f\xb1\xf6\x9d\x8e\x68\x9b\xd1\x67\xf7\xf4\x1e\xbc\xf2\x8e\xe3\x0e\xe7\x0f\x65\xa3\x04\xc5\x7c\x93\xae\x7b\xae\xdd\x97\xab\xab\x3b\x23\x52\x4b\x31\xb7\x84\xb0\x1a\x4e\xc8\x1c\x0b\x14\x32\xf4\x56\x62\x3f\x68\x6b\xb5\xc2\xb1\xea\x2b\xc7\x9a\xe0\xcf\xb4\x5b\xcd\x68\x98\xc6\x9c\x3f\xbc\x8d\x4f\x3e\x60\x5b\x70\x4a\xed\xa0\x3e\x15\x03\xda\x96\x7b\xe5\x96\x9d\x22\x41\xd8\x49\x86\xe2\x15\xc4\xca\x67\x1e\x7e\x9e\x19\xca\x8a\x19\xe1\xe7\x93\xbb\x03\xb8\x32\xd6\xd7\xa5\x5e\xf6\xe4\x07\xb1\x41\xca\x27\x88\xf0\xfc\x63\xdd\xcf\x11\x26\x32\xa5\x08\xb9\xc0\xc8\x7d\x99\x3d\xfc\x49\x08\x5c\xc3\xde\x76\xb7\xca\x5c\xc8\x58\x43\x92\xdf\xf1\xb7\x0a\x7f\xd4\x48\x28\x4a\x60\xc8\xe4\xc4\x10\x70\x7f\xaf\xac\xfc\xbd\x28\xda\xf4\x8e\x2b\xc5\x66\x54\x1b\x52\xa4\xbe\x02\x44\x78\xf1\x36\x5a\xe3\xa5\x9d\x9b\x30\xbd\x90\x9e\xd7\x69\x54\xbe\x0f\x78\xbd\x62\x27\x31\x60\xf7\x09\x12\xad\x0f\xfd\xf6\x84\x8e\x77\xd8\xf7\xee\x0b\x0c\xe9\xa7\x37\xd8\xe8\x4b\x68\xf9\x67\xd4\xac\x8b\x3e\x16\x30\x2c\x78\xcd\x28\x75\x2a\x6f\xdd\x1a\x02\xcb\x1a\x35\xe2\x70\x3c\x9f\x41\x16\x7c\x98\x0f\x8a\x9b\x15\x48\x83\xf6\xcc\xaf\xac\xb5\xce\x7b\xbf\xfe\xf7\xff\x09\x00\x00\xff\xff\x2a\x55\x00\x86\x40\x70\x00\x00") func uiJsLibsMithriljs020MithrilMinJsMapBytes() ([]byte, error) { return bindataRead( _uiJsLibsMithriljs020MithrilMinJsMap, "ui/js/libs/mithriljs/0.2.0/mithril.min.js.map", ) } func uiJsLibsMithriljs020MithrilMinJsMap() (*asset, error) { bytes, err := uiJsLibsMithriljs020MithrilMinJsMapBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/js/libs/mithriljs/0.2.0/mithril.min.js.map", size: 28736, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiJsLibsNvd3171NvD3MinJs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\xbd\xf7\x76\xe3\x48\x92\x2f\xfc\xff\x3e\x85\xc4\x99\xd5\x02\xc5\x24\x8b\x54\x55\xf5\xcc\x90\x0d\xf1\xc8\x95\x77\xd3\xd5\x76\x74\x74\xfa\x02\x20\xe8\x49\x50\xf4\x54\x89\x0f\xf5\xbd\xc2\xf7\x64\x37\x22\x0d\x90\x09\x64\x02\xa0\x4a\xea\xde\xdd\x3b\xa7\x4f\x97\x88\x44\x7a\xa4\x09\xf3\x8b\x88\xa7\x4f\x0e\x26\xab\xf6\xb3\x83\x55\x30\x9b\xf7\xc3\xc9\x41\xbd\xfa\xf7\x6a\xfd\xc0\xea\x2d\x16\xd3\x79\xe3\xe9\xd3\x6e\x7f\xd1\x5b\x7a\x55\x3f\x1c\x3f\x9d\x84\xab\xe5\xfc\x29\x66\xb6\x0f\x8e\x6b\xf5\x17\x95\xda\xb3\xca\xf1\xb3\x83\x27\x4f\xff\xe3\xb0\xb3\x9c\xf8\x0b\x28\x6d\xd9\x5f\x57\xee\xec\xc0\x75\xbe\xee\x9a\x6e\xb5\x1d\xac\x9c\xc3\x3a\x71\xab\x8b\x30\x1c\x2d\xfa\x53\x27\xfa\x75\x77\xf7\x75\x07\xe9\xcb\x45\x7f\x34\x77\xf8\x5f\x9e\x36\x0e\xdb\x01\x4d\x64\x3f\x78\xaa\xdf\x73\x67\x8b\xb9\x43\x7f\x77\x67\xee\xb4\x37\x77\xae\xae\xe1\xf7\x28\xec\xf2\xd4\x76\x38\xe6\x3f\xfa\xf3\xa9\xbb\xf0\x7b\x4e\xfb\x59\xf4\xdb\x2a\xcd\x82\x49\x3b\x98\xfd\x3e\x5f\x40\x3d\x25\x22\x1e\xe1\xdf\x92\x4d\x5e\xf2\xde\x57\xa7\xb3\x70\x11\x2e\xb6\xd3\xa0\xea\xf5\x27\xed\xbb\x3b\xcb\xf0\xc6\x89\xc6\xeb\xda\x5f\xfb\x1d\xab\x24\x9e\x4b\x87\x0e\x66\x0a\x3b\x07\x8b\x5e\x7f\x6e\x2f\x7a\xb3\x70\x7d\x30\x09\xd6\x07\x3f\x42\xea\xe5\x6c\x16\xce\xac\x92\xa1\xce\x83\xca\xc1\xba\xe7\x2e\x0e\xfa\xf3\x83\xc5\x6c\xdb\x9f\x74\x0f\x16\xe1\x81\x17\x1c\x78\xe1\x12\x5e\x42\xea\x24\x5c\x1c\xf8\xee\x68\xe4\x7a\xa3\xa0\x64\x37\x71\x9e\x3d\xe7\x74\x36\x73\xb7\x52\x4d\xf3\x51\xdf\x0f\xaa\x98\xcd\x72\x67\xdd\xe5\x38\x98\x2c\xe6\xa4\x6e\x13\xdf\xc1\x0e\x11\xa9\xe7\x36\x4c\x56\x20\x3f\xce\x82\xc5\x72\x36\x39\xf0\xab\xee\x74\x3a\xda\x5a\x98\xff\xa0\x3f\x81\x09\x9b\xf8\x38\xa0\xf6\xd1\x91\xdb\xc2\xc4\x86\x4b\x70\x3d\x4c\x7c\x77\x61\x15\x69\xde\xb6\xed\x5d\x93\x57\xde\x8e\xf3\xd2\x0e\xc5\x8f\x24\x90\x5e\xe1\x8c\xb5\x49\xb0\xb3\x09\x5d\x44\x47\x47\x56\xfc\x59\xab\xd0\xd9\xc4\xd7\x94\x06\xc1\x56\x44\x95\xbe\xf8\xb1\x3f\x0e\x9c\x32\xd6\x75\xe1\x2e\x78\x65\x9a\x4a\x70\x0d\x68\xaa\x80\x64\xb5\x02\xbe\xda\x60\x09\x2f\xdc\x11\x7d\xa5\xe6\xac\x24\xdb\x66\x05\xac\x12\x2d\x50\x4a\x15\xb7\x77\xb6\xcd\x12\xe5\xaf\x00\xab\x89\x8f\x79\x0d\x8b\x22\x5c\xe3\x4c\xcf\xc3\x51\x70\x74\xc4\x7f\x60\x01\xe5\x81\x7d\x2f\x3b\x95\x62\xf1\x14\x12\x7f\x89\x26\x6c\xa8\xe0\xc0\xdc\x44\xbc\x8e\x1d\xb1\x8e\x95\x56\x0d\x4b\x97\x6d\x7a\xcf\x31\xbc\x66\xeb\x41\xaa\x88\xf0\xdf\x76\xd3\x33\x76\x75\xc7\x57\x4c\x94\x72\x15\xfd\xaa\x8e\x82\x49\x77\xd1\xab\xd4\xaf\xe9\x76\x0f\xa6\xb3\x00\xd6\x62\x20\xef\x4a\xe2\xd9\x5f\x53\x13\xb7\x76\x67\x13\xf5\xc9\x2a\xd1\xa3\x0f\x7f\xc2\x86\x6b\x1c\xfc\x9f\x52\xd9\x2d\x97\xfe\xcf\x41\xcf\x9d\xc3\xd6\x0b\x60\xbd\x46\x95\x57\x0f\x4a\xc4\xbb\xbb\x2b\x95\x6c\x6c\x94\x2d\x9d\xb8\x41\x68\xce\x73\xe0\x75\x3d\x7a\x57\x75\xe1\xcd\x2a\x70\x0e\x6b\xf2\xb2\x93\xd7\xad\xc5\xf6\xb0\x2f\x7f\xfd\x0e\x1c\x10\x98\x08\x8b\x9f\x74\x9c\x5a\xd3\x3b\xe9\xc0\xe2\xc7\x95\xc6\x6b\xbd\x59\x06\xcb\xe0\xaa\x73\x6d\x37\x3b\xe5\xb2\xdd\x76\x82\x6a\x37\x98\x04\x33\xe8\xa1\x65\x13\xfe\xc9\xd8\x06\xf4\x5c\x7f\x18\x7d\x45\xf1\x65\x8e\x8e\xe2\x97\x56\xdb\x8e\x0e\xd3\xea\x74\x39\xef\x41\x42\x53\x6d\xa8\x3a\x9f\xe2\x86\xb6\x6a\xa4\x63\x93\xc4\x2b\xf6\x11\x5a\xf3\x80\xae\xf5\x70\xb9\xb0\x7c\xbb\x61\xa5\xc7\x0a\xff\x5a\x76\x7a\x5a\xea\x70\x28\x28\x65\x77\x9a\x3c\x89\x36\xd9\x91\xef\xb6\xdb\xaf\xb0\xd3\xca\xec\xf3\x71\xc6\xab\xa5\x76\xad\x19\xbc\xe5\x39\x5f\xc5\x7c\x35\xe4\xbc\x44\x4c\x8a\x94\x0a\xcb\x2b\x35\x68\x3a\x4d\x5e\x6a\x38\x77\x77\x22\xc1\x82\x71\x94\xe0\xc0\x0e\x3a\xfd\x49\xd0\x8e\xaf\x03\xb8\xcc\x96\x74\x87\x69\xde\x05\x9b\x69\x08\x97\x1b\x74\x8f\xe5\xaa\xf2\x04\xc7\xb5\xb5\x75\xb1\x5d\x0b\xd9\xf9\xf6\x9d\xac\x30\x27\xbd\x01\xab\xeb\x59\x7f\x11\x28\xd7\x13\xdf\x47\xab\xb0\xdf\x3e\xa8\x1d\x3a\x0e\x2f\xd4\x71\xe7\x0b\x28\xd0\xe2\x7f\x59\x41\xc8\xdf\x70\x2d\x9b\x5f\xa7\x30\x24\xb7\x7d\x9f\xba\xb0\x9c\x54\x55\x7f\xb2\x80\x19\xa7\x13\xf5\x6a\xd9\x87\x4b\x1d\x86\x23\x2f\xfa\xd2\x12\x0e\xa5\xf9\x62\xd6\xf7\x17\xa5\xa6\x48\x3f\xf0\xac\x91\xfd\x75\x54\x0d\x5c\xb8\xbd\xa3\xcc\x90\x14\x65\x18\x47\xc4\x06\x5c\xf4\xe3\x10\x2a\xa1\x77\x96\x0d\x97\x9c\x8b\x9f\x14\x76\x0d\x7c\x43\xd2\xc7\x2d\x38\x80\xc5\xd4\x84\x73\x6f\x08\xb3\xd6\xc6\xfc\xc1\x0a\xbe\x71\x35\xec\x74\x60\x0d\xfe\x0a\x59\x13\x49\xbf\x91\xd2\x7c\xd5\x85\x29\x8f\x5f\xc0\x96\xed\x06\xf8\xa7\xfb\xd1\x1d\xc3\x97\xb4\xfa\xb8\x88\x49\xf2\xbd\x3f\x72\xe7\x73\xcc\x51\xf5\xdc\x79\xf0\xb3\x3b\xaa\x8e\x19\x01\x32\x59\x55\x46\x41\x97\x12\x1c\x50\x18\x3a\x54\x83\xe3\xbf\x8f\xfd\xa9\x38\x1d\xd8\x4d\x9d\x05\x09\xf0\xd7\x22\x9c\xda\xa4\x76\x02\xd4\x47\xed\x04\x16\x56\xfb\x24\xbc\xbb\x0b\x4e\x80\x62\x8a\x5a\x9a\x05\x23\x3c\x91\x7e\xa4\x0d\x1e\x1d\xb1\xaf\xe1\x48\x5d\x55\x32\x54\xc3\x35\x2c\xf8\x2f\x3f\xbf\xba\x1c\x05\xb8\xb0\xef\xee\x06\xf4\x96\x81\xa9\x78\xa0\x1a\x61\x0c\x79\x25\xa2\x59\x31\x0d\x43\x9a\x37\x36\x5f\x3e\x2c\xeb\xcf\x21\x5d\x3a\x97\x98\x7d\x7e\x8e\x19\x80\x96\x60\x6b\x50\x10\x14\xbd\x6a\xc0\x3a\xf1\x01\x17\x00\x9e\x24\x5f\xe9\x52\xf8\xb5\xd1\x26\xf4\xc7\x6f\x0d\xbc\xf9\x3d\xbe\x3d\xe9\xfa\x7b\x0f\xeb\xcf\x9a\x2c\x47\x23\x9b\xd0\x7e\xfb\xd5\x5e\xbf\xdd\x0e\x26\x16\x7c\x92\x5d\xfc\x50\x67\xe7\xf3\xc8\xe9\xc2\x0a\x06\xea\x78\x81\xe7\xa3\xda\xde\x38\x5c\x05\x9a\x06\xc9\x14\x3b\xfe\x2b\x7c\xfc\x65\xd0\x18\x41\xf3\xa5\xb6\x37\xf2\xe1\x24\x1d\x96\xe4\x29\xc2\xed\x7c\x74\x14\xd5\x78\xc1\xf3\x14\xaa\x30\xb7\xb6\xf3\x82\x55\xed\x70\x8c\x13\xac\x66\x0e\x25\xfd\x05\xdf\x43\xa1\x03\x0b\xf0\x1f\xdf\xd5\xc8\xd4\x81\x6f\xf6\xbc\x56\x23\x37\xce\x84\x67\x39\x85\xdb\xbc\xd4\x85\xef\x53\x59\xc3\x39\x8c\x7f\xa5\x1d\x8e\x93\xfb\xde\xdd\x06\xb3\x92\x5d\x6d\xbb\x0b\xd7\xba\x1a\x5d\xdb\x64\xe6\xdc\x00\x99\xb4\xc0\xf3\x11\x6f\x7c\xbc\x13\x4a\x5d\xc8\xe1\x2e\x16\x40\x11\xd3\x6f\x0f\x44\xf9\x01\xaf\xf2\xc0\x58\x65\x73\x96\x51\x5c\x2d\x15\x7d\x6a\x20\xf0\x07\xb8\xe3\x28\xcd\xb7\x08\x97\x7e\x0f\x3f\x5b\x89\x8c\x6d\x9a\x32\x16\x1f\x12\x52\x08\xac\x80\x38\x11\x56\x93\x9c\x16\x7d\x43\x51\x32\x7a\x82\xe5\xd5\x15\xad\x39\xb8\xb0\xd2\xeb\x2d\x3e\xef\x7c\xd8\x7d\x78\x13\xc5\x45\x8e\x8e\xa4\x07\x3e\xa6\x4d\xbd\x64\xc3\xd7\xf5\xf1\x66\x89\x8f\xe7\x04\x9b\xe5\xc1\xac\xf2\xaf\x56\xaa\x1a\x47\x2f\x7f\xb5\x11\x4b\xa1\x1f\x06\x3b\x7a\xe8\xf8\xad\x2b\xce\x7f\x55\x3f\xba\x1f\x17\xe1\xbf\x82\x59\x08\x7d\xbc\x6e\xc0\x5d\xfb\x05\xce\xe4\x49\x17\xa9\xb4\xe4\xb7\xe3\xf5\xa4\xe6\xbf\x2b\xce\xf7\xe8\x25\x0c\x84\x68\xae\x10\x77\x17\x65\x38\xce\xc9\xb0\x85\x1a\xa6\xd1\x03\xe4\xae\xe1\x84\x07\x9b\x3e\x50\x50\x30\xcd\x74\x0f\x22\x2d\xbd\xb3\xf9\x6a\xf6\x23\xe6\x51\xb0\x9b\x40\x6a\xf9\xd5\xf6\x12\xae\x7d\x6c\x04\xbe\x27\xec\xf1\xe0\x02\xce\x9f\x2d\x3e\xfc\xde\x9f\xbf\x91\x56\x1b\xae\x34\x3c\x0a\x92\x07\x41\x9b\x7d\x5a\xfe\x85\x3b\xce\x57\x3c\xb3\x1b\x35\x02\x07\x76\xa3\xb6\x23\x5d\xba\x87\x80\x8e\x00\xd2\x08\x26\xc0\x85\xe9\x22\x09\x1e\x34\x79\x74\xc0\x9c\x25\x4e\xaf\x38\xe5\x9c\x2d\xae\x52\xe2\x70\x80\xc5\xcc\x2f\x34\xda\x8b\xa1\x53\x3a\xa5\xbd\xfe\xf5\x93\x37\x80\x8f\x5c\xea\x4f\x38\x79\x20\x0e\x48\x2f\xe6\x87\x7b\x30\x6d\x82\x13\xf7\xe1\xf7\x18\x4e\xde\xfe\x44\x77\xc1\x27\x49\xed\x96\x45\xef\x25\x47\x47\x8d\x20\x4f\x3f\x6d\xd1\x7f\x1b\x34\x17\x61\xb7\x99\x21\x33\xbe\x6a\xb1\x3f\x0d\x7e\xed\x79\x76\xa3\xb3\x83\xfe\xac\xfb\xed\x45\xaf\x58\x77\xe0\x8a\xc7\x62\x6d\x2c\xd6\x0b\xfa\xdd\xde\xa2\x58\xb9\x80\x95\x0b\xb0\xdc\xe6\x0b\x7e\xac\x62\xe5\xba\xac\x5c\x17\xcb\xcd\x7b\xe1\x5a\xb3\xaf\xb3\x8a\xf7\x59\xf1\x3e\x2d\xbe\xea\x9e\x87\x93\x85\x0b\x85\x67\xc5\x4a\x0f\x58\xe9\x01\x94\x4e\x90\x53\x67\xfd\x39\x7c\x74\x85\xef\x21\x7e\x82\xa0\x82\xab\xfe\xd0\x72\x65\x4e\x9e\x32\xed\xe2\x22\x3d\xc0\x75\xc4\xd6\x77\xb3\xed\x68\x04\x19\x7e\x4b\xd7\xc9\xea\x66\xd7\xf0\x69\xb1\x20\xc1\x76\x09\x4e\x1f\x72\x57\xa0\xbf\x1d\xdc\x02\x1e\xed\x27\xf0\x36\x81\xcd\x3e\x39\xdd\x2c\x63\x77\x63\x5d\x01\x6b\x41\xcb\x01\x37\x47\xf7\x8b\xe5\x5e\x75\x81\xbb\x41\xa1\x4a\xbc\x7e\x22\x52\xbe\x07\x27\x67\xcf\xe9\x62\x4e\xc7\xf1\xc4\x10\xba\xb4\x23\x7d\x5a\x67\x7f\x62\x5d\x75\xcb\xc8\x39\x44\x5c\x22\x9c\xff\xb4\xde\x3e\xd4\xcb\x4a\xe8\xaa\xa6\x77\x84\xd3\xb7\xc9\x07\x77\xd1\xab\xba\xde\xdc\x1a\x54\x3c\xfb\xc4\x89\x1e\x7b\xf0\xd8\xea\xe2\x47\x74\xab\xb8\xbf\x83\xf9\x82\xde\xa2\x6f\xa0\xae\x4d\xf6\x37\x60\xc7\x47\xfd\x69\x8d\x9f\x1e\xcd\x68\x1a\x81\xe1\xbb\x54\x28\x5c\x17\x58\x2d\x7a\xb8\x77\xe3\x96\xbd\x8a\x6b\x37\xdb\x27\x0e\xf2\xfd\x27\x5d\x4a\xc2\x76\x51\x76\x03\x07\x1e\x81\xa5\x6c\x22\xa5\x93\xa7\xa0\xc2\x68\xc6\x64\x36\xa3\x06\x25\x5a\x9a\x5f\x29\x43\xbb\x29\x88\x60\x18\x30\xd4\x04\xc7\x6d\x4c\xfd\xba\x90\x28\xee\x1e\xcc\x65\x0b\x89\x94\xc8\x0b\x9b\x9c\x1d\xd9\xab\x7e\xb0\x3e\x0b\x37\x25\xbb\x41\x87\x0e\x8d\x31\x6e\x99\x32\x97\x50\xfa\xa0\x24\x18\xe1\xa9\x3b\x9b\xc3\x74\x2e\x80\x8b\x9c\x2f\xb6\xa3\xc0\x2a\xd1\x23\x01\xce\xbc\x7a\xcd\x7e\xea\x5d\x1d\x5f\x37\xa7\xec\x6c\x61\x7f\x9e\xf8\x64\x4a\xcf\x25\xfa\xef\x13\x7f\xb7\xdb\x45\xe3\xf2\xd9\xb8\x0e\x27\x7c\x60\x4d\xd7\x19\xb6\x86\x8d\x76\xe8\xd3\xdd\x55\xf5\xc2\xf6\x96\xc8\x74\x8f\x1b\xdf\x6e\xed\xfe\x4a\x73\xb9\xf1\x59\x3c\x28\x95\xad\x41\x6b\xd0\x28\x6d\xb6\x15\x9e\x04\x83\xe7\xb9\xfb\xed\x12\x59\xd9\x64\x22\xfa\x0f\xdd\xc2\xfb\x4a\x3c\x62\xa7\xe9\xfd\x15\x65\x08\xa7\xae\xdf\x5f\x6c\x45\x62\x7c\x53\x43\x1f\xc8\xc1\x02\x65\x7d\xf0\xa7\x0d\xff\x23\x41\x45\x3b\x13\xb4\xad\x35\x12\x25\x90\x5f\x7d\x0e\x81\x42\x63\x73\x2f\xcd\x43\x9b\xcd\xc3\xec\xe8\xe8\x0c\x76\x1f\x4c\x3c\x17\x3b\x74\xf8\x1c\xc2\x56\x64\x84\x80\xd3\x6f\xf5\x1b\x74\x22\xe3\xd5\xa9\xa5\x3c\x7c\x2b\x12\x3e\x5a\x28\xc2\x81\xc5\x10\xc2\xa1\x04\xc7\xd9\xeb\x1f\x3f\xbc\x87\x5d\x49\x80\xb5\x58\xb6\x62\x16\x32\x49\xb6\xc0\x97\xa8\x02\xc9\xcf\xb9\x87\xf9\xd9\xf6\x47\xb6\xaa\xf8\x42\x42\xde\xcd\x4b\xdc\xae\xb8\x6a\x5c\x56\x1a\x6f\x77\x28\x7d\x86\x62\x51\xa0\x4e\xe0\x9e\x84\x4a\x7e\xc0\x2f\x88\x9c\xdf\xd0\xf8\x2e\x70\x7c\x3a\x38\xa8\x09\x18\x2b\x56\x57\xdf\x9c\xbf\x19\xc4\xfb\x2f\xb0\x4f\xfa\xfc\x9a\x69\xd5\xe0\xf2\xf0\xe8\xa2\x8b\x5f\x57\xda\x8c\x6b\xf3\xd8\xe2\x8c\x5e\xf8\xf4\x19\xde\xe2\x1f\x7b\xd7\x29\x43\x73\x8c\xbf\x7c\x0f\x09\x65\x96\xbd\x72\xfc\x64\x08\x74\xc3\x2c\x1c\x8d\xde\xd3\xef\x11\xe7\xfa\x31\x9c\x96\x69\x5b\x52\x1e\x48\x23\x70\x0a\xf6\x4e\x6a\x30\xef\xfc\x8c\xe8\x8c\x42\x38\x5b\xbb\x4f\x7b\xf6\x93\x9e\x4d\xce\xad\xab\x0e\x81\x33\x74\x67\x37\xe2\x9f\xa4\xbd\xdb\xb1\xd3\x9a\x53\x2f\xa5\x75\x09\x3e\xfd\xf1\x0b\x38\x49\x6b\x40\x52\xd0\xd4\x88\xa8\xa0\x7f\x46\x48\x67\x8c\x1d\xa4\xfd\x27\x2c\x25\x64\x7f\xa6\xfc\xe3\xd0\x07\xfc\x3e\xf8\x63\x07\x0c\x42\x82\x22\x9a\x61\x05\x73\xa7\x0e\x15\x2c\xf0\xe7\x12\x25\x3a\x2b\x27\xde\x4a\x95\x52\x59\xea\x7f\x3d\x78\xf1\x84\x3e\xce\x5c\x20\x60\x80\xbb\xb7\xc9\x1a\x33\x57\xa6\x8c\x0d\xac\x50\x3e\x67\x5e\x99\x84\x40\x5e\x92\x8d\xf6\xee\xdc\x91\xad\x21\xfd\xd6\x90\x7e\x9a\x94\xe5\xe3\x60\xe0\x72\x71\xf9\xe5\x52\x2a\xf1\xc5\x1e\x9f\x14\xd1\x19\xe2\xc3\xea\x5e\x04\x7c\x1d\xc3\x66\x67\x92\x79\x7a\x79\x2d\xc4\x62\xf5\xe4\x4d\xbd\xe8\xc1\x76\x88\x18\x23\xf7\xda\x4e\x11\xd6\x3c\x47\xd3\x8f\x53\x70\xe3\x47\x0f\xed\xf8\x60\x0a\x47\x40\xd7\x4d\x4a\xe4\x59\xfc\x1a\x4e\xfe\x70\xd2\x95\x0e\x8a\xd2\xa6\xb2\xc2\x3b\xaa\x44\xb9\x98\xde\x62\x3c\xb2\xb6\x70\xba\xd2\x34\x9b\x51\xcb\xed\x44\x17\xf1\x60\xcc\xee\x22\xcb\x81\x42\x13\xa5\x60\xc4\xf1\x69\xe9\x85\x79\x30\xeb\x07\xf3\x9d\xa6\x3a\xf9\x60\x2b\xf5\x60\x93\x8d\x70\xa3\xe9\x99\x82\x6a\xf4\x7e\x07\x3b\x54\x9d\x96\xa8\x0e\x26\x66\xa9\xc0\x04\x85\x33\xc6\x91\xb0\xe1\xab\xc7\x3b\x3f\x80\x51\xe8\xd7\x9d\xe1\x01\xc0\x0a\x18\xda\xa5\xef\xf0\xba\x35\xb4\x39\x0c\xb6\xd2\x1c\x6b\x29\xa2\x5b\x98\x78\xc8\x06\x29\x19\xf5\x24\xbf\x96\xb6\xa6\x8d\xf8\x84\xa2\x2e\xf9\x33\x60\x75\xaa\xd0\xcc\xe5\x5a\x85\x68\xee\x04\xf7\x98\x62\x58\xf0\xc8\x76\x91\x82\xaa\x11\x20\x9b\x70\x23\x76\x03\xeb\xaa\xf4\x97\x4e\xa7\x83\xfa\x0b\x3a\x09\xd7\xa8\x4c\xaa\x7e\xd7\x4c\x48\x0c\xa2\xf9\x0c\x67\xc0\xf7\x56\xbc\x70\xb1\x08\xc7\x62\x4a\x3d\xe0\x28\x93\x39\xf0\x58\x93\x5f\xef\x76\xe2\x62\xf2\x04\xb5\x01\x0c\x11\xbb\x54\x9a\x49\xc1\x23\x12\x4e\x21\xbc\x84\x33\x10\x4e\xd5\xd2\xf7\xf0\x49\x0f\xe8\x1c\x3a\xff\xc5\x5e\xfc\xd7\x49\xa9\x2c\x32\x95\x4b\xdf\x3f\x85\x0c\x27\xb0\x66\x81\xcf\x38\x4b\x6e\x78\xf7\xe8\x48\x2c\x4f\x3e\x51\xec\x21\x4d\x32\xb3\x5e\x1c\x1e\x8a\x1c\x9c\xc4\x6c\x1a\x0a\x31\x96\xcc\x4e\x6c\x01\xe7\x4a\xfc\xba\x86\xcf\xcc\xd5\x1c\x87\xf5\x1d\x39\x57\x04\xda\x21\xf6\xca\x74\x83\xfa\xa4\x0d\xdb\x2f\x22\x97\x42\x7e\x5f\xbc\xa6\x57\x14\x12\x4b\x70\xaa\xa7\xde\xfe\x82\xb4\x14\x7d\xd9\x17\x2a\xd7\x2a\xe3\x15\xbf\xf4\x6f\x71\xba\x29\xb1\x05\x97\x80\xf6\x25\xbb\xfe\xe0\x6e\xe0\x32\xdf\xa9\xdb\x0d\x7e\xfb\x44\x2b\x86\x0b\x41\x4a\xfc\x95\x25\x36\x07\x22\x91\x92\x06\xb4\xf1\x13\x47\x21\xbf\xf8\x8d\x46\x5f\x01\x41\x35\xa8\xd4\xbf\x83\xae\xc9\xa5\xd8\x80\xf4\xc5\xd8\x3b\xa0\x59\xfa\x50\x8e\xae\x9c\x19\x59\xc0\x1d\x23\x7f\x5d\xbe\xcc\x9b\xed\xf0\xa0\x3f\xff\xe8\x7e\x84\xcf\x14\xdd\xac\xf6\xdd\x9d\xe5\x95\x1d\x39\x85\xb8\xd1\xe3\x67\xa0\xef\x27\x8b\xe6\xba\xd7\x1f\xa1\x54\x3c\xe2\xa6\x77\x70\x81\xa5\x5b\xf0\xd3\x2d\xe0\x5d\x9e\x68\x82\x26\x15\x69\xa3\x39\x5f\xf7\x51\x60\x00\x9c\x80\xef\xce\x83\x52\x50\x6a\xc0\x45\x02\x74\x51\xa5\x57\xe9\x02\x91\xe3\x5d\xd5\xaf\x2b\xc1\xd3\x63\xb8\x61\x57\x56\x68\xc3\xed\xba\xc4\x3f\xd3\x13\xdc\x0f\x2c\x67\xb9\x7b\x32\x6d\xb1\x1f\x8d\x69\x65\x56\xf6\x81\x2a\x3b\x59\x50\xd6\x61\x58\x59\x94\xdb\x50\xa8\x1c\x9c\x0c\xcb\x03\x96\x54\x1e\x60\x62\x05\xc9\x39\x58\x6f\xc3\x26\x6d\x76\x2d\x9a\x2d\x67\x34\x3a\x2b\xf7\x4e\xfa\x51\xb3\xd8\x41\xa9\xa5\xf2\x8b\x22\xed\x4c\xe2\xe1\x3d\x3d\xae\xbc\xe0\x6d\x41\xa3\xfa\xe1\x4d\xb1\xd6\xb8\x59\x1f\x4b\x15\x6b\x68\x2e\x37\x14\x0d\xa9\xb2\x6f\x43\xd1\xf0\xd4\x51\x20\x59\xc2\xeb\x17\x75\x27\x6a\xde\xf9\x15\xe7\x86\x51\xdd\x6d\xfc\x85\xe4\x28\x2e\xa0\xb5\x13\x1a\xc9\x56\xdd\x86\xbb\xbb\x8b\x36\x84\xf8\xc1\x89\x10\x89\x48\xd4\x6d\xca\xdc\x82\x94\x02\xdd\x38\x70\x29\xbb\x93\x39\x8a\xe7\x2d\xe0\x76\xd6\xb4\xcb\xe5\xa9\x5d\x2e\x4d\x37\xe4\x80\xa6\x40\xd7\xcb\x43\x9a\x60\x97\x80\xe6\x52\x0a\xf8\x22\x5f\x9b\xbf\xbf\xc5\x9b\x86\xd2\x70\xd3\x10\xf3\x30\xb9\xa2\xb5\x21\x5b\x1b\xe8\xaf\x14\x2f\x64\x7f\x5f\xad\x37\x47\xad\x49\x95\x56\xda\x67\xe7\x5e\xb5\x4d\xc5\x75\x63\x5b\x91\xe3\xa5\xb9\xa8\xc6\x84\xb5\x34\x5b\x4e\x51\x3e\xa8\x56\x21\x4a\x9e\x02\x19\x2f\xae\xac\x1f\xd7\x41\x80\x82\x61\xcc\x08\xdc\xf8\x58\xc1\x02\x88\xab\x7b\x47\x4a\xfd\x31\x2a\xe5\xdc\xc9\x22\xa6\x1d\x2a\xeb\xc0\x1b\xf6\x17\x15\xa9\xec\x36\xdd\xa7\x3a\xca\x25\x63\x00\x84\x4e\xad\xe1\xac\x49\xbb\x1a\x4e\xb1\xd1\x08\x0e\x23\x9e\x51\x7b\x49\xd5\xe8\xa8\xaf\x6d\x57\x7f\x17\xd9\xd8\xed\xc2\x69\x50\xeb\xeb\x8e\x7c\x15\xc3\x6b\x7c\x85\xc5\xd4\x48\x8f\x62\xbe\x23\x73\xf9\x05\x1c\x5f\xd0\xda\x6e\x47\xba\x33\x77\x05\x5d\x35\x95\xeb\xa4\xcb\x75\x68\xb9\x76\x9f\xdd\x75\xa6\x82\xdd\x74\xc1\x2e\x2d\x38\x9f\xb8\xd3\x8b\x9c\xc2\xbd\x74\xe1\x1e\x2d\xcc\x68\xa5\xb9\xa9\xdc\x20\x5d\x6e\xc0\xca\x21\x84\x28\x12\xbd\x99\x8a\x0f\xd3\xc5\x87\xb4\x78\xa7\xbf\x09\xda\xb0\xb1\x4c\x05\xfb\xe9\x82\x7d\x5a\x30\x98\x20\x5f\xd0\x36\x95\x9b\xa5\xcb\xcd\x68\xb9\x48\x46\x6d\x2a\x39\x4e\x97\x1c\xb3\x91\xc2\x20\x61\x6d\xbd\x62\x9a\xee\xd0\x38\xd6\xd3\x74\x05\xa7\xb4\x02\x4a\x5c\xbe\x84\x05\x0d\xac\x86\x79\xaa\x36\xe9\xe2\x1b\xd6\x73\x20\x59\x82\x59\x6e\xf9\x6d\xba\xfc\x96\x96\x07\x2a\x39\xb7\xf0\x6d\xba\xf0\xad\xd4\xf8\x65\xf6\xa4\x2f\xd2\xa5\x17\xb4\xb4\x46\x17\x60\xaa\x63\x99\xae\x03\x38\xdc\x43\xac\x65\x1a\xb2\x33\xc7\x54\x74\x9a\x2e\xca\x05\x5b\x12\x85\x2b\x4b\xca\xb9\xac\x86\x49\xbb\xa4\x3c\xb1\xe8\x9d\xbe\x82\xa6\x19\x69\x61\x6a\xf8\x26\xdd\xf0\x4d\x66\xc3\xfc\xba\xba\x31\x37\x7c\xc3\x1b\x66\xda\x12\x53\xc3\xa3\x74\xc3\xa3\x43\x07\x48\x6f\x6b\x84\x73\x46\xda\x16\x72\x00\x04\xf9\x47\x53\x15\x41\xba\x0a\xb7\x4a\x65\x03\x14\x1f\x46\xd7\xac\xc3\x53\xaa\x1b\x12\xd1\xdb\xe2\x07\x47\x12\x72\xd2\x5d\xcd\xbe\x8d\x5f\x50\x9e\x24\x7a\x41\x9f\x50\x09\x27\xbf\x45\xde\x17\x3f\x33\x17\x63\xe0\x15\x6a\xea\x74\x98\xe8\xb4\xfd\x15\xca\xf5\x8d\xeb\x72\xa5\xc9\x4e\x51\x28\xec\x4a\xe8\x4f\xfa\x8b\x4f\xec\xfc\xa7\xb7\xc1\x6e\x67\xc5\x2f\x63\x72\xdd\x49\xc3\x31\x29\x6d\xdf\xf8\xee\x79\x8d\x30\x42\xbe\xf1\xfc\xef\xb5\xe8\x52\x4a\x11\xea\x11\x32\x4c\xa2\xc2\x5b\x30\xc7\x4c\x43\x93\xca\x0e\x5d\xe0\x4a\x98\x74\x31\xe2\xda\x8d\xd2\xf9\x97\x2f\xf5\xf3\x70\x3c\x75\x17\x25\x27\x26\xe6\x7d\x9a\xf2\x01\x78\xbd\xa3\x23\x13\x5d\x62\x7e\x23\x73\x35\x71\xdf\x8a\xe4\x8e\xbb\x9b\x93\x3b\x1e\x81\xc2\x80\x48\x7d\xa2\xfc\x48\x76\x47\x92\x59\x34\xad\x4b\x59\xe2\x26\xdd\x5d\xe2\xcb\xfe\x10\xcc\x95\x6f\x1b\xcb\x03\xf8\xac\xbb\xed\x36\xa5\x29\xde\xc3\xcd\x8a\x47\x7f\xcb\x90\x8e\xc8\x47\xac\xaa\x84\x5a\x25\x8e\x51\xbc\xfc\xe1\x87\x4f\x3f\x34\x0e\x5e\xba\xc0\x8b\xb4\x29\xf2\x14\x21\xa9\xf0\x97\xd7\xc1\x4a\xc0\x13\xac\x22\x44\xc2\xd9\xe4\x6b\x04\x99\xf2\xe0\x4a\x0e\xdc\x99\xbc\x6a\xa3\x52\xa8\xe6\x34\x36\x0e\x6b\x3b\x1a\x23\xec\x87\x73\xba\xf3\xe4\xf1\x01\x63\x1d\x21\x4b\xbc\x98\x91\x66\x25\xda\x41\xc7\x5d\x8e\x58\x29\x8b\x0a\xdd\x18\x1a\xb5\x3f\xa7\x7f\xa1\xbc\x90\xc1\x45\x72\x8e\x70\x06\xf4\xb5\x3b\xb2\x84\x68\xc3\x8b\x98\x2e\x55\xce\xc2\xe4\x62\x71\xd3\x2d\xb7\xe1\x35\x55\x59\xd0\xdd\x9d\x0f\x5b\x70\xb7\x8b\x19\x43\x5d\xbf\x34\xf8\xda\xe4\x80\xad\xa8\x77\x88\x33\xec\x86\xb3\xed\x71\x2d\xea\xa0\x6d\xc7\xf5\xfa\xcb\xf9\x22\x1c\xff\xd8\x83\x15\x9a\xd2\x36\x51\xf0\xa1\x56\x70\x05\x77\x29\x10\x04\x08\x24\xc8\x6c\x87\xab\xa8\x7c\x21\xd2\x48\x4e\x0b\x17\x98\x77\x1c\x0f\x65\xfe\x5c\x34\x9a\x46\x8b\xba\x57\x9d\xeb\x16\xfe\x63\xd9\x8d\xf8\xb6\x10\x89\x0d\x0b\x31\xd5\x71\x2b\x36\xb2\x41\x75\xe2\x5f\xb5\xaf\x6d\x69\x29\x4c\x07\xae\x24\xdd\xa5\xe3\x63\xbd\x8b\xd2\xda\xf6\x57\x18\x0d\x15\x90\xb5\x89\x9c\xca\x44\xdc\xb1\x68\xca\xb7\xb9\x2c\xa9\x19\x00\x1f\x84\xec\xf6\x47\x78\x84\x75\x39\x1d\xb9\x7e\x70\x0e\x9c\x77\xdb\x92\x04\xbb\x76\xaa\x1c\x09\x6c\xa5\x5f\xb4\x3b\x48\xcf\x47\xa5\x50\xea\xe6\x29\x80\x10\xe9\x9b\xf7\x60\xd5\xc3\x4c\x53\xdc\xe0\x97\x05\x12\xea\x14\xf5\xdc\x9b\x05\x1d\x42\x7f\x2d\x82\x0d\xa5\x49\xa1\x67\x24\x7a\x05\xf3\x62\xc9\x0f\x02\xe2\x33\x9d\xd1\xbf\x17\x6c\x81\x59\x54\xac\x1f\x75\x9e\x6d\x39\xd6\x91\x69\x38\x9d\x63\x6b\x4a\x5f\xa2\x6a\xe8\x2b\x38\xc4\x2c\x35\x05\x87\x15\x2f\x36\x77\xe4\x9f\x4e\xa7\xb3\x70\xf3\x23\xf4\xf0\x97\x94\x66\x5e\x01\xbd\xc7\x9f\x9f\x31\x3f\x5a\x20\xb1\x4b\xc7\x2a\x24\x26\x69\x55\x5f\x07\x66\xa1\x42\x4f\x06\x5b\x7c\x1f\x18\xc8\xa6\x44\x4a\x4c\xff\x47\x50\xf1\x83\x55\x58\x76\x62\x91\xfa\x4f\xbc\x27\xd5\x17\x62\x27\xd6\xe2\x41\x44\x80\x16\x8d\xec\xbf\x34\x59\x8e\xbd\x60\x26\x41\x13\xee\xee\xb8\x04\xc7\xbe\xbb\x13\x4a\x80\xbb\xbb\xfa\xd3\x1a\xfb\xe1\xc2\x9f\x0a\x3c\x01\xeb\x08\x47\x73\x34\xef\x2a\xdc\x79\x8d\x40\x8b\x1f\x23\x9e\x53\x23\x2a\xba\xc2\x0f\x7b\x2d\xf0\xf3\x57\xd7\x26\xc4\xbe\x1d\x9f\x37\x31\x0f\xcb\xd1\xd2\x78\x46\xc5\xa3\x64\x48\xa3\x5f\x28\xc4\x43\xdd\x35\x54\xf5\x9f\xc4\xf1\x6b\x8a\xc5\x58\x80\x60\xad\x7b\x4f\x6b\x6b\xca\x87\x22\xec\x6a\xbf\xe5\x37\x8e\x5f\xa0\x46\xfb\xea\x9a\x74\x28\x9a\xbf\x49\x17\x2d\x37\xe0\xd0\x9d\x46\x8e\x69\xbc\x35\xdc\x65\x69\x5d\x38\x52\x78\xbf\xff\xce\x7a\x12\xb4\x51\x7d\xa4\xbe\xd3\xc0\xf9\x2f\x53\x68\x7e\xb9\x82\x1a\xe9\x54\xa3\x7c\x08\xf3\x82\xae\x96\x70\xe1\x43\x7d\x24\x00\xba\xa5\x1d\x6c\x3e\xa1\xaa\xf1\xfb\x1a\x42\xa5\x29\xdc\xd7\xc5\x7d\x86\x23\xdb\xb1\x1d\x0a\xf7\x57\xa0\xc2\x4d\xe2\x93\x8e\xca\x85\xb0\x2a\x18\x29\xcf\xbe\xd0\xad\x06\x22\xbe\x8f\xe7\x24\xf1\x1e\x27\xf5\x96\x79\x55\x20\x2a\x0b\x75\x4a\x51\x56\x0f\xe8\xd4\xa9\x7c\xd8\xb6\x5b\x6d\xfa\x59\x92\x13\x67\x1c\x1c\xc1\xf5\xed\xc7\x97\xab\x3a\x5d\x2e\x93\xbb\x68\xee\x31\x36\x23\x6e\x24\x54\x31\x67\x69\x2a\x95\xd2\xed\x24\xb0\x2d\x87\xb0\x99\xf0\x0c\x9a\x6d\x35\x5a\xa3\x43\x91\x6d\x67\x63\xc6\xc3\x7a\x93\xe1\x22\x6a\xba\xad\x21\x8b\x77\xfc\xa4\x06\xc4\xfe\x5a\x2e\x77\x77\x3c\xb5\x94\x34\xf8\xc0\x1e\x55\x2a\x5d\xca\x45\x18\x17\x8b\x64\x15\x03\xbb\x8f\x9e\x95\x7c\x35\xf0\x0c\xf2\xf8\x03\xe3\x98\x94\x09\xde\x21\x12\x38\x28\xb2\xee\x25\x08\x6b\xa2\x2f\x92\x99\xcd\x4e\xa6\x41\x82\xe9\xe5\x06\x6e\x95\xb6\x42\x4f\x71\xfd\xf9\x9e\x2b\xae\xe9\xa7\xbb\xe8\x4b\xb6\x0a\x70\xba\x1c\xf8\xe2\xee\xf5\xe0\x32\x4f\x2a\x4e\x50\xdd\x1c\x32\x7c\x5a\x74\x1d\x60\x3e\xd2\x4d\xa7\x23\x31\xd0\xec\x1c\x1d\x1d\xc2\x2d\xd2\x6d\xa5\xc7\x63\xd1\x82\x94\x64\x68\xe0\x4f\x07\x7f\xee\xe4\xab\x8b\x5e\x66\x09\x93\x1a\xf3\x31\xc8\xae\x3e\xdd\x01\x48\xdf\x70\xe5\xef\x57\xa4\xa1\x64\xae\x4c\xb5\xa4\x62\xa5\x91\xb5\x8b\xf4\xeb\x14\xeb\x42\x57\x88\xde\x1e\xcd\xef\x21\xe1\x05\xb7\x1b\x1c\x26\x25\x76\xbe\xa8\xc7\x19\xa6\x2b\xc7\x9d\x0f\xc7\x06\x22\x94\x79\x66\xa0\x1f\x17\x7a\x04\x19\x82\xe3\xa4\xf3\x6a\x9e\xcc\x28\x69\x12\x3d\xd4\x50\x28\x03\xb3\xe5\x81\xfa\x04\x68\x2a\x17\x3e\x36\x69\x1f\x1d\x79\x16\x5f\xf3\xbc\x5e\x64\x46\x95\xd5\x15\x20\x54\xf8\xab\x6e\x11\x5a\x54\x53\xc9\xb7\x6f\x8a\x39\x6d\x33\xea\xfd\xed\x97\x4f\x1f\xab\x73\x2a\x1a\xee\x77\xe0\x92\x43\xfc\x6b\x22\xcd\x13\x1f\x0a\xce\x02\xb1\xfc\x7c\x5c\x7e\xae\x1d\x13\xeb\x57\xfe\x35\xe2\x6b\xe1\x8f\x83\xc3\xa1\x3f\x5c\xf8\x07\x3e\xca\xa1\x38\x3a\x0e\x81\xf9\xa5\x83\x58\x4e\xdb\x89\xd5\x82\xe0\x26\x1f\x3a\x8c\xe0\x7e\xf6\x35\x6d\xd2\x65\xfb\x82\x2a\x3a\x8f\x8e\xd4\x6f\xc5\x3e\xa4\xe5\xc9\xdb\x4f\x12\xdd\x6a\xef\x41\x0a\xbd\x1f\xbb\x53\x04\x1d\x69\x10\x60\x30\x97\x1a\x02\x0a\x9b\xbd\x72\xaf\x59\xfb\xf0\x03\x9b\x64\x82\x61\xda\x2f\x71\x47\xc9\x14\xdc\x8f\x40\x8f\xce\x7f\xd5\xd2\xd2\x70\x23\xc0\x41\x8a\x93\x18\x34\x83\xef\x23\xba\x3f\x28\x3b\x75\x41\xea\xfb\x57\x01\xb4\x86\xff\x32\x69\xc9\xbc\x25\xfd\xe6\x05\x1a\xb5\x26\xec\x84\x93\x76\xab\xd3\x68\x47\x26\x5b\x8c\xa5\xfc\x21\xb8\x81\x7c\x0b\x60\x27\x19\xa9\x75\x80\x63\xc0\x0e\x71\x06\x92\x67\x3b\x87\x7e\x2e\xa9\x25\xc0\xc1\xd8\xdd\x1c\xb0\xda\x99\xed\x23\x66\x6c\xc3\x17\x74\x3c\x68\xc0\x73\xda\x95\x3a\xf0\x9a\x9e\x53\x3f\xf1\x5a\xec\x97\x84\x1e\x49\x57\x48\x4d\x28\xa1\xbd\x03\x3f\x5c\x4e\x16\x07\xae\x68\xd7\xd3\xcc\xd1\x6f\x89\x39\x4a\xf0\x6a\xf1\x5c\x32\xfa\x5f\x23\x90\x49\xec\x2f\xf7\xca\x83\x55\x57\xfd\x1d\xd7\xcd\x1c\x55\xb9\xec\x17\xa4\xb6\xa4\xdf\x0d\xf9\x3c\x35\xe2\x3f\xdd\x48\xe8\x8f\x95\xfa\x54\x38\x20\x27\xed\x74\xfd\x99\x6b\x0e\x7e\xae\x32\x80\x93\xe3\xd3\x7a\xf2\x79\x16\x4e\x83\xd9\x62\x8b\xc8\xab\xb9\xe5\x45\x15\xe2\x16\x46\x24\x55\x76\x66\x3a\x02\x9a\xb5\x09\xcc\xa5\x20\x67\xdb\x76\xb4\x2d\x03\x76\x2b\xa4\x3b\x86\x33\x08\xcb\x48\x99\xc4\x5e\x30\x8b\xfa\x7d\xf1\x2c\x45\x27\xc1\x68\xdb\xcf\x84\xde\x23\x6a\x4c\x4e\xbd\xbb\xbb\x42\x5c\x42\x75\x39\x99\xf7\xfa\x9d\x05\xae\x86\xf8\xc1\xa5\x6c\xd2\x2c\xa0\xb6\x88\xd2\xd5\x29\x7f\x48\x17\xef\xa9\x9f\x26\x7d\x58\xb2\xda\x1d\x5b\x9d\x87\x68\xb1\x57\xed\xf4\x47\x08\x5f\xd1\xad\x96\x43\xe0\xb1\xbd\x43\x3c\x6a\xd0\x32\x51\xbe\x90\xb6\x63\x2f\x1c\x7d\x70\xa7\x0e\xdf\xf5\x76\xe2\x95\x01\x98\xe9\x91\x88\xeb\xf6\xe3\x03\x88\x60\x32\x02\x68\x13\x49\xfc\x64\xab\xd4\x99\xd1\xd2\x7c\xd5\xe5\xb5\xa3\xe9\xf1\x3c\xa2\xfe\x3a\x76\x4b\x79\x8b\x3a\x32\xc8\x00\xe9\x55\x64\xbe\xac\xae\x6d\xe1\xf2\x4a\xf4\x1c\x97\x01\x64\x81\xb7\x3b\x8e\x3f\x70\xbe\x7b\x1e\x43\xcc\xa9\xd1\xae\x6e\xda\x52\x6b\x99\x0a\x63\x68\x4e\x58\x27\xf0\x61\x3c\xbb\xe1\x53\x54\xb4\x22\xda\xca\x86\x7e\xa7\x6a\x68\xef\xe4\x4d\xad\x2e\x27\xed\xe1\x97\xb1\xb6\xfd\xc4\x46\x08\x72\x32\xc7\x1b\x81\xe0\x67\xfa\x9d\xb7\x1e\xb4\x71\x49\xc2\x67\xf2\x13\xab\x14\x31\xce\x62\x05\x07\xb6\xf8\xd5\x89\x7e\x75\xd1\xc6\x48\xac\x5c\xb8\x78\x7b\xf2\x9a\xd6\x2e\xe3\x1e\xd2\x86\x71\xbb\x8e\x66\x49\x5b\x99\x4d\xb6\xa3\x5f\x5e\xa2\xff\x36\xad\x3a\xde\x7b\xba\xaa\xbb\x52\x61\x75\x3f\x26\xce\xc9\x2f\x3f\xbf\x72\x54\x12\x57\xa0\x9e\xbe\x52\x33\xdc\x0a\xa2\x3f\x1b\x70\x33\xcb\x5b\xc7\x85\x82\xb0\x34\x5e\x27\x31\xfe\x12\x0d\x03\xbc\x79\x24\x4d\xf0\x84\x34\x81\x89\x58\x4b\xb6\x4d\x8d\x97\xd2\x15\x26\x25\x1a\x79\xf5\x71\x20\xb2\x4d\x8d\xa2\xa4\x63\x63\xe5\xf6\xa9\x41\x7e\xb2\x83\xb0\xd8\x90\x76\x4a\xdc\x23\xea\x70\xe8\x8a\x64\xd8\x51\xf8\x97\x21\xa6\x34\x55\x27\xba\x9a\x5d\x33\xcd\x2c\x2a\xe6\xe8\xd3\x19\xc5\xcb\x45\x15\x4f\xc2\x0b\x77\xe1\x6a\xf7\x85\x27\x28\x17\x8b\xc1\xfb\x98\x85\x88\x85\x4b\xbb\xcd\xcb\x59\x36\x47\x0c\x3b\x4e\xa7\x75\x55\xfa\x18\xa2\x6d\xbc\x7b\x70\x2a\x7a\x5b\x2d\x5d\x37\xae\x3a\xb8\xcc\x0d\x73\x04\x6b\x91\x7d\x1c\xa8\xc9\xc7\xa3\xac\x9f\xce\xc9\x46\xd1\x66\xa2\x74\x91\x6f\xe0\x04\x0c\x88\xd0\x7f\x7a\x4c\x86\xf0\x80\x18\x84\xde\xd3\x63\x60\x4f\x64\xbb\xb4\x52\x6c\x14\xc4\xed\xf7\x94\xf7\x68\x27\xc5\x46\x22\xe0\x8a\xb0\xe3\x46\x69\x54\x62\xb0\x59\x68\x30\xe0\xed\x67\x07\x72\x79\xf6\xba\xbd\x85\x77\x95\xea\xdf\x82\x71\x0c\x0d\xc0\xf2\x15\x60\x35\x7a\x88\x6f\x2b\x8d\xfb\xed\x36\x42\x43\xc9\x48\x18\x3d\x95\xc8\x20\x32\x69\x2a\x91\xa1\xcd\x24\x5b\xba\x03\x90\x6d\x07\x8e\xe4\x77\x37\xfd\x79\x11\xd3\xd9\x6e\xac\xf4\x67\xf2\x0a\xfc\x6c\x09\xa6\xd8\x13\x76\x06\x09\x24\x5f\x33\xb1\x69\x71\x82\x30\xe3\xd4\xe9\x1a\x0d\x00\xb1\x5f\x11\x68\xd4\x83\xab\xf8\xc6\x99\x16\x30\xf8\x13\x13\x2a\x8c\xfe\x58\x35\x64\xe1\x58\x37\x72\x29\x32\x8d\x4c\x0d\xa8\xa1\x01\x07\xac\x4f\x5a\x7e\x95\x12\x94\xd6\xc4\x6e\x30\xac\xbd\x03\x1f\x3b\x9c\x21\x7c\xc6\x82\xad\x5a\x62\x7b\x4a\x49\x05\xfa\x5d\x94\x8a\x70\xda\x6d\x21\x05\x47\xcc\x4e\xfc\x50\xbb\xb6\x9f\xd6\x6b\x35\xe8\x4f\x52\xae\x67\xcd\x49\x89\x0f\x99\xf9\x36\x40\x0b\x47\x54\x09\x30\x09\x3b\x5f\x79\x4b\x87\xb5\xc4\x74\xd9\x16\xeb\xb7\xe3\x2c\x81\xc1\x58\x3a\x33\xe5\x15\x2b\xb0\x72\x16\x0a\x94\x13\x96\x84\x98\x5c\xd8\x16\x28\xa9\xe2\x33\xdc\x63\x12\xca\x6b\x28\x96\x34\x84\x63\x80\x22\xb2\x21\x5b\x81\x22\x93\xc6\xce\xe0\x64\x38\x51\x8d\x55\xd1\x25\x2f\x37\x4f\xb6\x4e\x34\x3d\xfc\x42\xfe\xfe\xb8\x55\x6b\x1c\xa3\x21\x6a\xe2\x45\x4b\x9e\xd5\x46\xfc\x90\xcc\x07\xc4\x52\x39\xe3\x0b\x90\x15\xef\x91\x7e\x47\xc5\x7b\xa8\x66\xc7\x7b\x6b\xfb\xf4\x98\xd9\x56\x6f\x9c\x69\x6a\xcd\xe2\x78\x3e\xb8\x9b\x0f\xfd\x89\x98\xcf\xb6\xc0\xbd\xc2\x7d\xb7\x29\xb4\x6c\xd5\x4a\xd4\x19\xc4\x2a\xd4\x6f\x02\x29\x7c\x0c\x1a\x90\x51\x74\xf1\x28\x18\xaa\xb4\x4d\x66\x1b\xb9\xdf\x32\x8e\xb3\xb4\x8b\xf4\x14\xea\x47\x63\x07\x51\xad\xfa\x82\x9e\x44\xd1\xcc\x54\xd8\x32\xfc\xec\xb6\x11\x5d\x66\x45\xc6\x2a\x86\x19\x4d\x9d\x44\x4c\x04\xb2\x8c\x21\x8a\x56\xa9\x54\xf6\x6c\x61\xd8\x0e\x5d\x2c\xd9\xad\x52\xa9\xe1\xed\x70\xa4\x9a\xad\x32\xee\x4f\x2a\xc8\xdb\xe1\xc2\xb3\xb3\xa6\x22\x26\xa6\xf3\x26\x23\x5a\x22\xfe\x75\x34\x29\x0a\x1c\x8f\x6f\xfd\xc6\xda\x09\xcb\xcf\x18\x3e\xf4\xd6\x79\x56\x23\xa7\x4e\x8d\x9c\xa9\xfb\xac\x5b\x4a\xce\x27\x39\x77\x4a\xd4\x72\x6e\xf0\x9f\xcf\xbe\xab\xd9\x5f\xcf\x52\xf2\x44\x26\xb9\x10\x82\x18\x2d\x72\x0f\x4d\xa1\xe8\x05\xd6\x3c\x75\x84\xce\x97\x78\x27\xb7\xb0\x2c\x6f\x1d\x0a\xdc\x86\x56\x66\xe1\x82\x8d\x71\x50\x2e\x1d\xd4\x48\xa9\x6c\x9d\x3e\x3d\x2e\x27\x3f\x58\xb9\x64\x33\x33\x84\x8b\xd8\xb8\x84\xfe\x98\xc3\xa2\x1d\x30\xab\x89\xcf\x6f\x9e\xd6\xff\x5e\x83\x49\x58\x3b\xd6\x45\xeb\xe2\xc9\x6d\xe3\xd6\x2e\xc3\x80\xcf\xd2\x13\x7e\xae\xbf\xa6\xe8\x60\x4f\x6a\xad\x12\x73\xab\xd3\xa0\x82\x52\x20\xf8\xff\xb7\x9d\x14\xeb\xfb\x9f\x14\x57\xf1\x51\x41\x61\x9e\xf1\x53\xfc\x33\xee\xed\xf5\x7f\xf3\xe3\xa4\x6c\x8d\xc5\xdc\x9f\xb9\xe8\xa6\xe5\xe9\x71\xa3\x56\xe8\x90\xa9\xfe\xad\xae\x9e\x31\xa6\x23\x26\x7f\xd1\xb5\xb4\xcb\xae\xf1\x47\x9c\x47\xfc\x8c\xc8\x3c\x92\x1e\x6e\x3a\x81\xfa\x3b\x3a\xd2\xec\x46\x1d\x13\x22\xb5\x46\x0f\x05\xef\x3f\x61\xe3\xc0\x14\xd5\x60\x62\xea\xc7\x25\x7a\x20\xec\x94\xf3\x8e\x12\xf9\xf7\xbd\xd6\x57\xda\x4f\x33\x6c\x89\x8f\xd0\x28\x79\x41\x97\xad\xcd\x64\xef\x21\x13\x3f\xc3\xfe\x01\xa3\x6c\x94\xe4\x45\x31\x6c\x55\xe8\xd1\x84\x86\xbe\x01\x63\x43\x48\xc7\x2e\xd7\x8f\x1b\x95\xba\x7c\x5d\x0f\x5b\xdc\x1a\x38\xda\xcf\x38\x75\xc9\x25\xf5\xa7\x5d\xe8\x3a\x5b\xcd\x6f\xdf\x94\xf8\x5d\x8d\xb7\x7c\xde\xf6\x7b\x76\xac\x6e\x3f\x79\x36\x53\x5b\x51\xcb\x92\xb0\xcd\xf6\x98\xbb\x8b\xad\xc8\xfd\xef\x7b\xc3\xc4\xa8\x37\xbe\x6e\x82\xd2\xc0\x6b\x65\x87\x50\xe3\xdb\x47\xdb\x20\xf4\xae\xcc\xda\x1e\x95\xbc\xfd\x41\x81\x96\xb0\x3d\x8e\x5f\x54\xac\xf0\xee\xae\x66\xa7\x76\x49\x45\xb7\x4d\x52\xd4\xdd\xff\x13\xfb\x64\xf6\xed\xfb\xa4\x18\x59\xcc\xbe\xeb\xff\xee\x5d\xb2\x43\x9c\x5d\x96\x04\x82\x1c\xf6\x81\x9b\xa6\x1b\xe8\x50\x66\xa6\x8f\x8e\xf8\xbd\x73\xa8\x32\xde\x56\x8a\xbe\x4e\x59\x24\xa6\xcc\x07\x75\x1f\x51\xea\x24\xb1\xd0\xa3\xc4\xf7\x32\xf9\x57\xae\xd7\xee\xee\x30\xf5\x44\xa6\x03\x71\xd3\xc0\x06\xb0\xdc\x93\x7a\x50\xc1\x1c\x15\xfa\xf7\xc4\xb5\xa9\xd6\x4d\x69\x34\xd1\x4a\x4d\xc6\x53\x15\xe9\x56\xcd\xa6\x18\x2c\x99\x26\x44\xf2\x36\x7a\xac\x5f\x1f\x1d\xd5\x94\x94\x1a\xa4\xe4\xec\xcc\xe4\x07\xd2\x2b\x6e\x81\x96\xae\xef\xf8\x66\xe7\xa2\x0f\x83\xec\x43\x16\x7e\xb0\x85\x7b\xe9\x5c\xa1\x27\x85\xcc\x5e\x04\x69\x9d\xe4\x62\xb6\xfd\x7a\xc9\x5d\xe0\xb5\xa8\x7f\x8f\x2c\xfe\x87\xf1\x3e\x95\xe7\x0d\xcc\x59\xce\xcf\x59\x7e\x6e\xef\x7c\xe6\xfa\xcb\x4e\x34\xc3\xeb\x78\x8e\x36\xa2\x24\x7f\x69\xb1\x95\x72\x09\x73\xcd\x97\xc7\x25\x7c\x08\x5c\x13\xa9\x25\xd1\x4a\x7e\x6e\x71\x4a\x35\x72\xd6\x81\xc8\x87\x38\x10\xa5\x43\xf4\x48\x29\xa5\xf5\x44\x31\xa8\x85\xca\x96\x5f\x8e\x42\x77\xc1\x58\x38\x6a\x7b\x4c\x8d\xdf\x5d\xfb\x69\x3d\xf8\xce\x16\xfe\xd7\x10\x4f\xb4\x93\x4c\x83\x6f\x61\x83\x53\xcb\x60\x32\xa3\x2a\x84\xe9\x96\x22\x00\xe7\x32\xa0\x09\x3f\xe1\x41\x7f\x3c\x0e\xda\x7d\x84\xff\xa1\xb2\x33\x86\xc0\xae\xba\x54\x7e\x48\xfd\x24\xa4\x7d\x15\x05\xce\x57\x6a\xb7\x4f\xe8\x8e\x86\xbf\x6c\x01\xc1\x0f\x66\xd5\x8f\xae\x5c\xfe\xf6\x82\x74\x9d\xef\x6a\xa4\xc7\x50\x0e\xdc\x13\x51\x8d\x0c\xf1\xc7\x08\x61\x46\x63\xfc\x27\x72\x17\x80\xee\xc3\x10\x8c\x74\xa3\xf3\xc5\x8b\x48\x2d\x34\x74\x67\x22\xb3\xb6\x2d\x56\x69\x29\x22\xcb\x25\x09\x99\xfe\x5c\xe2\x66\x9f\xb1\x62\x42\x06\xad\xdd\x90\x69\x6c\x53\xc9\x24\xa7\xe8\xf5\x28\x82\x63\xdc\x10\x2f\xdf\xe6\xca\xa3\x1a\x10\xb3\xcd\x15\x56\xfb\x1e\x89\x84\x3c\x73\xa6\xa4\x21\x00\x8c\x23\x64\xb6\x50\x0b\xb7\xdb\x0d\x66\xb4\x12\xa3\x51\x93\xce\x7c\x82\x96\x66\xc4\x45\x76\x61\xa3\x45\x14\x2b\xfc\x1b\x2d\xbd\xb7\x3d\x14\xba\x41\x62\xa7\xc5\xde\x16\x51\xd1\xa4\xed\x6d\xfb\xc5\x8d\x17\xf6\xb5\x37\x63\xb0\x03\x43\xa9\x49\xba\xd4\x84\x96\x62\x36\x13\xfb\x1a\xc5\x31\x9d\xc9\x1e\x46\x2c\x81\xd9\xb6\x86\xbe\x22\x9c\x75\x92\xb3\xd0\x84\x16\xff\xdb\x10\xbc\x55\xc0\x95\x48\x72\x4e\x96\xd2\x12\x3f\x1a\x22\x0f\x09\x32\xed\x7e\xd8\x5b\xb4\xc8\xc9\x31\x2a\xd4\x99\x32\x39\x2e\x11\x6a\x87\x29\xc2\x62\xe8\x0e\x37\x55\xd0\x4e\x54\x10\x00\x6d\xe0\x04\x24\x3e\x17\xe0\x4c\xd1\xa0\x61\x24\x46\x7b\x6e\x44\x12\x00\xed\xd4\x26\x57\x25\x76\xfb\xa2\xd7\x6f\x8e\xb9\x8a\x8a\xca\xbf\xe7\x25\x44\xa1\x1b\xac\x6d\x3c\x3b\xab\x11\x1f\x1a\x61\xa7\x17\x54\x88\x8b\x8d\x3a\x86\x9a\xf3\x87\x2f\x4b\xaf\xdd\x5f\x51\x37\x14\xec\x99\x9a\x3f\x94\x24\xe2\x93\x3f\xb1\xb3\x0e\xba\xf1\x70\x03\x62\x8a\x71\xae\x3d\xf2\xe0\x54\x96\xa1\xab\x66\xfd\x51\xac\x60\x6c\x27\xb5\x46\x84\xc3\xec\x43\x67\x5c\xe1\x0e\x6e\x7c\xbe\xfe\x66\xce\xa4\x42\x9d\xec\xc0\xbf\x7c\x95\xcd\x73\xb5\x4b\x90\x44\xeb\x83\x7e\x29\x88\x06\x04\xe3\x53\xe7\xc3\x36\xc3\x5e\xe0\x0d\x12\xcc\xfd\x80\x92\x0f\x36\x59\x3a\xdd\x7d\xb2\xaf\x9c\xde\x3e\xd9\xd7\x4e\xdf\x90\x9d\x6c\x9c\x81\xe9\xd5\xd6\x19\x9a\x5e\xdd\x9a\x9d\x6d\x20\x0a\x1f\x51\x72\xb4\x13\xe3\x60\x86\x2e\x37\x46\x64\x71\x0d\xd4\x1a\x27\x6b\x83\xd6\x55\x48\x6a\xd7\x8d\xab\x1a\x09\xaf\x6d\x06\x5c\xfb\xfd\x77\x6a\xcf\xfa\xfb\xef\x92\x61\x87\xce\x8d\xc7\xd3\x5a\xe4\xc8\xe3\x36\x36\x2a\x51\xab\x70\x6e\xe9\x45\x7a\x2a\x1c\xa8\x2d\x6c\x72\x26\x1c\xb4\x2d\x50\x4c\xbd\x40\x47\xba\x17\xce\xdc\xa8\xff\x63\x2b\x4b\xd1\x00\x5e\x3a\x17\xf7\xd0\x00\x8a\x8a\xc8\x4b\xe7\x52\x51\x01\xbe\x82\xea\x24\x25\x60\xf3\x65\xf4\x76\x86\xf8\x51\x0d\xa7\x4a\x07\x7b\x20\x7e\xc0\x55\x85\xb5\xee\x59\xea\x14\x1d\x52\xed\x5d\x8a\x52\xd0\x05\x4a\x8d\x03\x77\xbe\x9c\x05\x4a\x5e\xa0\x4d\x7a\xda\xbc\xee\x6c\x18\xcc\x7e\x9c\xf5\xa1\x01\xaa\x4a\xbe\x48\xb3\x8c\xaa\x15\x3e\x53\x96\x43\x6a\x99\xee\x49\xe4\x06\x19\xc1\xf4\x5a\x07\xb4\x89\xf4\x0a\xb7\x48\x71\xdf\x5a\xc8\xda\x90\x37\xba\x9c\xf0\x0e\x28\x67\xb7\x51\xb3\x77\xcd\x57\xd1\x37\xc1\x31\x56\x95\xc9\xe6\xfd\xe3\x48\x0c\x32\x13\x09\x0c\x4a\x41\x5e\x5b\x67\x27\xb5\xd6\x59\xe3\xd4\x96\x78\xf2\x37\x52\x22\x2c\xa5\xe5\x38\x7a\x26\x86\xa6\xe8\x17\xca\x6d\xea\x5c\x6d\xe4\x3c\xaa\xfe\xdc\x58\xf1\x07\x49\xde\x99\x31\x86\x44\xef\x6d\xed\x28\x4f\x1b\xc9\x7c\x51\x62\x3c\x4a\x7c\xd6\x74\x26\x5a\x24\x91\xa1\x4c\x7f\x34\x92\x3c\xa2\x46\x7d\x7b\xfa\x4c\x12\x74\x48\x4f\xbc\x27\xb5\x93\x55\x0b\x3f\x2b\x7c\xdb\x15\xaa\x4b\x1a\xfc\x2f\xfb\xd6\x72\xe7\x56\xb6\xec\x04\x77\x15\xcc\x14\xb4\xfc\x8d\xea\x71\x19\x5e\x5b\x5f\x29\x68\xb3\x81\xd5\x11\x2a\x31\x6b\x6c\x29\xf3\x55\x3a\x5f\xce\x66\xf4\x52\xa4\x26\x73\x69\xa6\x4a\x1a\x10\x75\xdf\x9a\x74\xc8\x6b\x6c\x96\x39\x5e\x7e\xf8\x66\xa9\x0b\x56\xf3\x60\xd1\xbd\xf4\x43\x35\x4a\xb7\xe2\x5b\x67\xf6\xf4\xbb\xe6\x12\x6a\x68\xbd\x92\x0f\x57\x3c\x05\xaa\x9a\x5d\x9f\x21\x26\xd2\x2a\x2a\x6e\x2d\xac\xdb\xa6\xa7\xc0\xec\xe9\x31\x97\x08\x71\x09\x19\x24\x7e\x40\x31\xd2\xdb\x72\xe9\x3d\xfd\x17\x7e\x57\xe0\xcf\x01\xfb\xc3\x9f\xfe\x55\xba\xdf\x6a\x58\xc6\x33\xb4\x61\x33\xf4\x79\x16\xac\xfa\x90\xed\x8f\x5e\x0e\xdf\xd0\x6e\xe1\xf5\xf0\x00\xa3\x6d\x14\x5b\x01\x91\x20\xf5\x22\x09\x6b\x62\xc4\xa0\xf9\x6b\x45\xa6\xad\xbe\xb3\x86\x2b\x1a\xa1\xff\xad\x3a\x5a\xb7\x96\x3e\x04\xee\xa4\xd4\x28\xc1\x91\xd7\x1f\x2f\xc7\xf8\x0b\x58\x34\xfc\x65\x37\xcd\x1f\xd8\xe5\xe3\xf5\xff\xa7\x7e\xce\x87\x98\x8f\x78\x05\xec\x3d\x1d\xbb\x58\x3a\x93\x27\x79\x69\x3b\xdc\x75\x28\x0d\x8a\xd1\xd1\x23\x94\xe9\xe7\x9f\xa3\x23\x6a\xed\x6b\xb6\x90\xe6\xad\xe8\x17\x90\x93\xd7\xc0\x51\x1b\x72\xb3\x5b\x07\xaa\xeb\x67\xb4\xc6\xe4\x0e\x2d\xe5\xa9\x81\x96\x6f\x83\xac\x3e\x44\xa5\xe4\x47\x5a\x6c\x98\xd9\x99\xb8\x9c\xfc\x4c\x0b\x8e\x1c\x5c\x26\x63\xe7\xd9\xdf\xd1\x59\xe5\xb3\x5a\xec\xaa\x32\x65\x6e\x7d\x55\xfa\x4b\xbd\xf3\xb7\xbf\x79\xcf\x4b\x14\xa6\x66\x74\xd0\xcd\x36\x8f\xd9\x41\x77\xec\xc5\xdb\xd6\xf8\xda\x7e\x10\xe1\x12\xfb\xa2\xf7\x91\x40\xd0\xef\xbb\xaf\x94\x44\x7c\xf3\xbd\xa5\x32\x70\x13\xf9\xc1\xaf\x7b\xcb\xae\x32\xe5\x2b\x46\xe7\x36\xd9\x22\x20\xa3\x30\x27\xe6\xaf\xf7\x96\xd0\x65\x4b\x74\xfc\x74\x31\xdf\x2c\xd1\xa1\xaf\x88\x9f\x27\xd1\x11\x1c\xb5\x5f\x40\xa2\x13\xf1\xda\x7e\xa6\x44\xc7\x17\x12\x1d\x26\xa8\x28\x2a\x8e\x41\x55\x8d\xe3\xc2\xc1\xc3\x35\x3d\x0e\x06\x86\x88\x95\x0b\x6d\xea\x6e\x68\x64\xf6\x31\x94\x94\x0f\x79\x54\x3e\x94\xdc\x94\x5e\xa6\xe4\x25\x2d\xc3\x38\x47\xc6\xf5\xdb\x04\x19\x01\x99\x08\x41\x46\x9e\x88\x22\x14\x00\x58\x03\x50\x79\x48\x42\xd2\xc5\xc3\x64\x54\xe9\x52\xf1\x47\x97\x7f\x12\xea\xec\x5a\x63\x63\x86\xfd\xda\xb1\x28\x6a\xdc\x11\x3c\x95\x18\x1c\x06\x77\x77\x87\xb2\x9c\x02\xfb\x98\x74\x7b\xc1\x61\xd8\x1e\x09\x61\x62\x9a\xa1\x11\xdb\xac\x00\x42\x67\x4e\xb2\xda\x4c\xf1\xc7\x5c\x11\x7f\xe4\x66\x5f\x28\x22\x91\xdc\xec\x4b\x27\xcc\x11\x24\xd0\xcf\x1b\x49\x13\x02\xc4\x76\x39\xcb\x7b\x4b\x13\x78\x6d\x64\xed\xac\x14\x91\xc2\x06\xea\x94\x45\x0a\xeb\x6c\xcd\x37\xab\xec\x17\xa8\x1a\xeb\xca\xce\xbb\xe8\x2f\x46\x01\x42\x99\x97\x39\x5c\x7a\x37\xe6\xd2\xbb\x2a\x97\xbe\xcd\x74\xcf\x1a\xe1\x06\x66\x78\xf1\xd1\x10\x56\x0b\xa4\xf4\x23\x61\x4f\xa7\x75\x35\xe5\x32\xa3\xe9\x35\xca\x9f\xee\x2b\x35\xda\x46\x52\xa3\x84\xe0\xc9\xd9\x72\xa9\xd1\x5a\x09\x42\x22\x86\xae\x99\x20\x9d\x66\x3d\x6b\x7a\x2a\xdf\x21\xf6\x29\xb9\xa9\x6c\xc6\xc7\xd8\xcd\xd3\x5c\x08\x07\xed\x8b\x4e\x7d\x1f\x1b\x90\x63\x0e\x38\x79\xf2\xeb\x9a\x2f\x3d\x51\x9d\x84\x30\x60\x30\x38\x73\xfd\xa2\x14\xda\xd5\x72\x73\x86\xa9\x70\xa6\x6a\xdd\xb0\x2f\x7d\xe6\x6c\x94\x19\x94\x17\x1a\xfa\x19\x91\x8c\xdc\xcf\x22\xc0\x39\x2d\x79\xee\x8c\xef\xee\xb6\xb2\x9e\x6c\xca\x10\xeb\x17\x51\x95\xf1\x16\xe3\x9a\x49\xba\xa7\xb6\x1c\x02\x3f\x7d\xfa\x02\x72\x6b\x7a\x9e\x74\x4e\x72\x77\x77\xce\x1c\x21\x14\x15\xeb\x89\xe6\x32\xe0\x6e\x06\x8e\xd5\x95\x00\x88\x49\xac\x42\x50\xf9\xce\x6e\x5e\xea\xc3\xd0\x60\x9c\x98\x1b\x39\x4e\xcc\xdf\x9e\xdc\x3c\xfd\x0e\x7a\xac\xff\xb4\x99\x28\x51\xe9\xdb\x46\x22\x15\x56\x1d\xfb\xd6\xe7\x6c\xfe\x5f\x3a\xea\xe7\xb9\xd8\x7f\xbc\xdb\xcc\xf1\xa2\x9c\x53\x2c\x8d\x42\x83\x7d\xa9\x47\x2c\x44\xdd\x27\x89\x0e\x73\x78\xce\x43\xf7\x1b\xbf\x93\x14\x9b\x87\xb6\xda\x1f\x07\xb3\x6a\x67\x84\x7a\xfd\x98\xf3\x49\xdc\xeb\x54\x37\x9d\x8e\xde\x83\xe4\x07\x63\x80\x3a\xc8\x00\x75\x19\xc3\xf4\x82\x33\x4c\xcf\x23\x8e\xe9\x98\xb3\x4c\xf5\xe3\x9a\x91\xb3\x11\x6c\x92\x81\xaf\x31\xb0\x49\x26\x86\x26\x62\x93\x22\xa7\xf9\x2f\x5e\x00\x1f\x42\x7f\x47\x6a\x70\x85\xc7\xe0\x83\xfa\xd2\x0b\xd7\x78\xd8\xb1\xa7\xd7\xa8\x1d\xb2\x63\x27\xa1\x4a\xac\x22\xd9\xa1\x21\x46\x23\x82\x93\x44\xf1\x14\x90\xe4\x5a\xc4\xbc\x95\x12\xde\x52\xb8\x3f\xbc\xaf\xc3\x60\x8b\x6e\xbf\x90\x7b\x22\x9c\x77\xe5\xee\xc4\x19\x25\x27\xbc\x9d\x23\xb0\x05\x0f\x0b\x57\x0e\x85\xb4\xcb\x6e\x7e\xb9\xd0\xb4\x0e\x24\xa4\x1c\x62\x2d\xb3\x06\x5c\x32\x86\x2a\x84\x57\x45\x8b\x7e\xfd\xd8\x2b\x12\x3a\xc6\x65\xdf\x5d\x49\xfb\x75\x67\xd3\xb5\xe7\x09\xbd\x97\xa2\xfd\x0f\xa5\x60\x48\xed\xc7\x67\xd6\x8c\xbc\x53\x0e\xb3\x66\xd4\xa1\xe7\x31\x6b\x46\xa5\x7f\x26\xd7\x65\xd4\xf6\x67\x73\x5d\x46\x16\x2f\x9f\xeb\x32\xf2\x79\x8c\x90\xdd\x9f\xcf\x63\xdf\xd4\x38\x2f\xc0\x06\xf0\x9d\x64\xa7\x39\x13\x39\x9a\x6c\xb4\x53\xf1\x3e\x43\xee\x82\x92\x3d\x62\xcd\xc4\xb5\x50\xa7\x22\x34\x68\x03\x89\xeb\x3e\x3c\xa4\xfe\x20\x78\x66\x7e\x87\x9a\xbb\x94\x74\xd8\x5a\xb8\x6f\xbc\x66\x6d\x0f\xd3\x95\x2a\x5d\x4d\xbd\xa6\x3d\xce\xe6\x75\x75\xa2\x03\x33\xaf\x4b\x5f\x91\x6e\x1e\xaf\xcb\x33\x90\x6e\x01\x5e\x57\xe4\x21\xdd\x4c\x5e\xb7\x5b\x8c\xd7\xd5\x81\x31\x80\xd7\xed\xc4\xbc\x6e\x20\xf3\xba\x41\x82\x47\x95\x55\xf3\x14\xa5\x69\xe4\x5f\xff\x43\x62\x60\xfd\xe5\x98\x7a\xa7\x60\x71\x0d\x0b\x33\xb2\xa3\xa8\xd7\xaf\x23\x8b\xce\xd7\xbc\x4e\xab\x63\x93\xd9\xd1\x51\xf4\x88\x1c\x9c\xf4\xd8\x43\xbb\x53\x73\x1c\xd5\x53\x4b\x46\x63\x4a\x4c\x69\x74\xaf\xfb\xcb\xd9\x9c\x91\xec\xeb\x0a\xf7\xde\x68\xc7\x11\x86\x2e\xa1\xfc\xab\xea\x26\x8e\x44\xb9\x21\xaf\xaa\x7d\x47\x02\xb7\xbd\x14\x01\x34\x21\x9b\x6d\x93\x77\x96\x54\xfa\x75\xf1\xd6\xdd\xe5\x22\x44\xcb\x22\xe6\xcb\xc0\x81\x46\xc8\x39\xf3\xd2\x73\xce\x7c\xb0\x6c\xa5\x7a\xdf\x21\x9b\xed\x71\x0e\xf2\xd5\x35\xa3\xd7\x5c\xc7\x8b\xaf\x56\x8c\x6b\x28\xdd\xb3\x44\x30\xea\x48\x9d\xc4\x2f\x5c\xe6\xf1\xe0\x7d\xae\x90\xe0\xbd\x4d\xde\xc7\x60\x3d\x20\x80\xe9\x6e\xac\x94\xca\x1b\xc4\xec\xd1\xe6\x3f\x30\x36\xff\xa3\x49\x8e\x10\x92\xf7\x18\x4d\xf2\x93\xd1\x74\x7a\x4a\x33\x98\xa4\x0a\xe8\xfd\xe6\xa2\xf5\x9e\x71\x08\x9e\xdd\x78\x6f\x70\x8f\x75\x61\x8b\x2c\x1a\x19\xc4\x96\xfb\x0b\xb2\xde\xc2\x22\x89\xe6\xc4\xe6\xee\x86\xac\x37\x90\x6a\xc7\x13\xb5\xc5\x0b\x95\x1e\x79\xce\x88\xba\xb6\xd0\x00\x1e\x0f\xdd\x28\x13\x22\x89\x6f\x99\xd4\xe5\x73\xf3\xd6\xf9\xba\xa3\xee\x42\x3e\xa3\xab\x90\xad\x7d\x7b\xf5\xf9\xda\xd9\xc2\x3f\x49\xf7\x51\x2d\x4c\xe4\x12\x85\x9a\xdd\xc0\x27\xfa\x4d\xfe\x49\x43\xcb\x05\x3d\x77\xd5\x0f\x67\xd5\xf6\xcc\xed\x5a\x3c\x52\x27\xfc\xe4\xa1\xe1\x4f\xe3\x94\x12\xb9\x8c\x1f\xa8\x0f\xb0\xd7\x36\x8b\x8e\x37\x3a\x3a\x1a\x71\xab\x2d\xfc\x65\xc4\x6e\x1e\xb8\xaa\xf3\x9b\x9d\xb0\xf5\x32\x0b\x69\xde\xa3\x90\x06\x1a\x79\x9f\x2b\xa7\x41\x8f\x52\x3c\x26\x21\x25\x78\x3b\xd5\xad\x78\x58\xdb\xf0\x70\xc1\xb8\x73\xea\x90\x88\xc6\x71\xa7\xd3\xf8\x83\x93\xd1\x5f\x65\xe6\x53\x9f\x27\x8a\x01\xc3\xd1\x27\x62\x70\x04\x1a\xb3\x62\xff\x83\x18\xcf\xe0\xfb\x4a\xf5\x1f\x2f\xa8\x53\xa5\xda\xb5\x83\xbf\x6d\x72\x45\x1f\x2a\x18\xe6\xc0\x7e\x6a\xd5\xcb\xf4\x07\xb1\x68\xd8\x03\x8f\x9a\x4e\xd3\x44\x14\x49\xc0\x57\xff\xe2\x5c\x71\x6c\xc9\x0f\xda\xf8\x3a\x48\x63\x53\x2e\x01\x45\x1a\x86\x2c\xe8\x54\xe5\xba\x19\xcf\xc4\x17\x7b\xf7\x52\x92\x59\x8c\xa0\x0e\xf5\xf3\x54\xa4\x18\x36\x35\xf2\xf1\x9a\x62\x69\xc7\x53\x4b\x6c\xc7\x91\xe3\x5b\x78\x88\xc0\x3a\xff\xd1\x59\xb5\x78\x04\x87\x92\x8b\xea\xf5\x9f\x9c\xf7\x46\x19\x95\x7a\x82\x2b\x71\x6e\x7f\x76\x7e\xba\x87\x98\x2a\x55\xa1\x2c\xa5\xfa\x05\xaa\x94\xa5\x54\xb0\x98\x7e\x2e\x1c\x04\x17\xca\xe7\x64\xde\xc4\x76\xf7\xe2\xc0\x55\xe3\x6d\x61\xb6\x70\x52\xa0\xa6\xad\x64\xc1\x9f\x93\x35\x0e\xba\x94\x9f\x17\xd9\xde\x39\x13\x86\x98\x3a\xf8\x63\x6e\x25\xee\xaa\xfb\x3e\xbf\x9e\x82\x03\x65\xf1\xa5\xb8\x20\x30\x27\x2f\x9e\xae\xb3\x70\xc4\x1b\x26\x37\x18\x37\x9c\xcb\x81\x3e\xc2\xb7\x55\xe4\x3e\x72\xbd\x1c\x17\x32\xe2\x47\x75\xdf\x26\x63\xa4\xa6\x0e\x9d\x7e\xe4\x3d\x03\xe3\xc5\x53\xe2\x2b\x4e\xca\xbd\x3a\x32\x9b\xcc\x12\xc5\x21\x4e\xa0\x32\x8e\x24\x94\x36\x59\xb2\x03\xe4\x57\xe7\x8a\xf2\x93\xa5\x1f\x82\x0a\x15\x27\x1e\x6c\xd9\x1a\x20\xe2\xe4\x69\x1c\xae\x77\xd7\xcd\x01\x1f\x74\xfd\x79\xcd\x66\xec\x25\x2a\xe2\x9e\x3f\x7f\x0e\xad\xc8\x7f\x70\xc7\x62\x7f\x4f\x47\xfd\x2e\xe5\x37\x85\x0f\x12\x85\xe3\x8f\x18\xfe\x17\x8c\xef\x03\x76\x3f\x39\x32\x75\xe2\xf9\x74\xfe\xba\xd7\x20\xd9\xd4\x0f\xec\xdd\x4f\x39\x42\xdc\x71\x2c\xc4\x8d\x4b\x93\xc5\xd1\x91\xda\xa5\xad\xe4\x29\x23\xbb\xc2\x8f\x4c\xb2\xc2\x8e\xa9\xdf\xb2\x8e\x78\xea\x56\x77\x8c\xc1\x34\xf8\x31\xdf\x8c\x4f\x0b\xe5\x8d\x7c\xd3\xfc\x16\x5d\x76\x3f\x65\x8b\x3d\x13\x15\x44\x18\xa1\x8f\x4f\x8f\x25\xc9\x12\xfa\x3e\xa9\x9b\x9d\x9f\x48\x16\x54\xbf\x19\x68\x04\xee\xa7\xda\xae\x0e\x60\x47\x5a\x25\x72\x80\x16\xae\xc2\x15\x9c\xef\x4e\x26\xe1\xe2\xc0\x03\xfe\x26\x76\x15\x07\x93\x46\x65\x94\x07\x28\x56\x3a\x98\x02\x25\x1e\xb6\xab\x68\xa8\x07\xbb\x62\x18\x6d\x30\xb1\x31\x3e\xc5\xcb\x88\xae\x17\xf6\xc1\x68\x9c\x42\xfa\xc1\x50\x84\x25\x85\xe5\x05\x5a\x4e\xdc\xc4\x6d\x9b\xfc\x64\x8a\xb1\x2d\x56\xc8\xd0\xc6\x63\x40\x91\xe0\x4a\xe7\x5b\x02\x05\x98\x58\xa6\x71\xce\x03\x05\x25\xc8\x41\x5b\x1f\x93\x28\xaf\x4f\x36\xbd\x9e\xb5\x53\x88\xb2\x8d\x91\xbb\xad\xe2\x44\x6a\x66\x80\xed\xba\x24\x99\x26\x3b\x3e\x12\x9e\xcd\x59\xf2\x4e\x63\xc5\x12\xe7\x3e\x1c\x5d\x79\xd7\x11\x79\x71\x74\xc4\x9e\xd5\xb5\xc8\xd6\xef\xbf\x9c\xc4\x99\x23\x1d\xc4\xfc\x94\x2b\x44\xc2\x40\x1b\xc9\xc5\x6e\x37\xff\xc5\x3e\x41\x07\x59\x1c\xbd\x27\x45\x21\xf7\x62\x61\x7a\x3d\x0e\xbc\xfa\x6b\x41\xba\x09\x1a\x3d\x3c\x63\x92\xef\xdf\x13\xe3\x48\xde\x29\xfa\x28\xeb\x7f\xd5\xc7\x13\xa4\xcb\x9d\xb8\x9e\xc6\x43\x74\x60\x61\x83\x11\xfd\x55\x3b\x41\x5b\x2f\xef\xe4\x53\xeb\x53\xc3\xdb\x35\x7f\x37\xc5\x62\xe7\x7b\x0f\x43\x40\x0e\x83\x0a\x5f\x3f\xc7\xc9\xf4\xb6\x3b\xef\x51\xef\x5d\x28\xdf\xae\x91\x7a\x2d\x59\x52\x1b\xff\xb0\xc3\x17\x8f\x0d\x53\xaa\xcc\xa7\x1d\x87\x71\xaf\xcb\xd6\x95\xc7\xd2\xd2\x45\x51\xb5\xeb\xc9\xb2\x6a\x78\x22\xbf\x27\x3a\xa6\x31\x77\x33\x4f\xc8\xdd\x1d\xce\x07\xb5\x80\xbb\x77\xf3\x3a\xbf\x39\x9e\xe7\xfc\x2b\x49\xa8\x53\x66\x53\x21\xf4\x90\x9b\xf4\xd2\x31\xf1\x4d\x28\x5f\xb9\x02\x65\x73\x3f\x93\x8d\x51\xa3\x03\x95\xc1\x3b\xa1\xb6\xf8\xc4\xc5\xa4\x78\x82\xaa\x2f\xcc\x04\x0c\xd2\xae\xfc\x54\xfa\x27\x70\x1e\xde\xde\x62\xfd\x97\xc0\x06\xf4\x63\xc1\x7e\xea\xf0\xc1\xc8\x68\xdd\xd8\x64\x8b\x69\x91\xba\xfc\xaf\xdd\x8a\x7e\x35\x34\xae\x33\x3f\x3e\xfd\x1b\x90\xe9\x36\x2b\x45\xc3\x0a\x56\x3e\xa1\xcd\xa5\xba\xad\x36\x05\x6f\x49\xbc\xac\x03\xc9\xee\x93\x5d\xba\xe6\xba\xe8\xa4\x74\x6d\x2a\x1a\xb1\x7a\x7c\x08\x81\x18\x42\x2f\x1a\x42\xcf\x3c\x84\xdf\xac\x4f\x4f\x9f\x7d\x97\x18\xc2\xc7\xf4\x10\xb6\xc9\x66\x7b\x29\xc2\x2b\x7d\xee\x87\xda\x00\x02\x5c\xb0\x42\xd1\x6b\x4c\xf0\x80\xaa\xde\x6c\xf9\x4a\x96\x80\x84\x0a\x5f\xf0\x0e\xd1\x09\xe0\xcf\x13\xcd\xbb\xd8\x7e\x5f\xc4\xc2\xa1\x1b\x9e\x60\x87\x5e\x22\xdb\x54\xa8\x9d\x81\xda\x0e\x23\x37\x35\xcd\xc4\x07\xae\x23\x1d\xbe\x64\xad\x3c\x6d\x51\xf0\x85\x9f\xed\x37\x67\x9d\x6e\x30\x16\xdf\x40\xbb\xfd\x84\x2f\xe5\x38\xab\xda\x6e\xc2\x89\xf0\x56\xf8\x0a\x6e\x66\x57\x3f\xcc\xd6\x5f\x48\x6d\xa0\x9f\xec\x2a\x0d\x8f\xf2\x5a\x44\x5f\x9d\x8b\x68\x1b\x24\x20\x7d\x32\x40\x5b\x5c\xe0\xe9\x34\xd7\x91\x72\x35\x2b\x97\x18\x51\x39\xfb\xd4\xc5\xd7\x25\x3d\x2a\xca\xac\x4a\xd4\xca\x19\x8d\xc1\x0f\x7b\x95\x73\xf9\x3e\xfb\xaa\xbf\xfe\xcc\x02\xc9\x56\x37\xe8\x04\xa0\x13\x07\x89\xa5\x51\xea\xac\x1e\x74\x52\xf0\xcb\x43\x47\x14\xbe\x0a\xae\x9b\x52\x0c\xfd\x28\x86\xc2\x10\x8d\x91\x35\xb1\xf5\xdb\x3c\x5e\x22\xd1\xbd\x44\x0b\xe6\xbe\xe3\x45\xb2\x0f\x8b\xf6\xc5\x1a\x92\xc0\xb6\x71\x05\x51\x4b\x60\xca\x64\x74\x69\xfc\x5c\xa6\xb2\xf2\x50\x48\x41\x33\x71\xad\x15\x8e\xba\x9b\xb8\x9b\xd8\x12\xe4\x5e\xce\x8f\x05\xdc\xc7\x8b\x24\x2b\x62\xdf\xf8\x6c\x83\xfd\x66\x13\x29\xac\xb7\x94\x4d\x32\xdf\xae\xe8\x92\xeb\x14\x4a\x58\xad\x3d\x7b\x32\x25\x18\x3b\x0a\x01\x15\xc1\x7c\x41\xa7\x96\xf6\xc5\x1a\x98\x29\x5f\x3a\x1e\xe8\x68\x48\x6e\x22\xd7\x76\x78\xcc\x0e\xae\x66\xd7\xf1\xe7\x70\x50\x73\x86\xfd\x9f\x3b\x5d\xc5\x75\x1c\x9f\xae\x36\xce\x44\x60\x37\x87\x91\xfc\x3f\x56\x97\x51\x9a\xb7\x5f\x96\xa8\x5e\x31\xe0\xb2\x20\x7f\xd5\xe0\x78\xd6\x07\x29\x5a\x8a\x5d\x55\xc3\xc1\xe9\x46\xd1\x53\xbb\x84\xf4\x12\xbb\x2c\x39\x38\x76\x4e\xd8\x87\x69\x0c\x50\x29\x07\xfb\x87\x19\xea\xbe\xc2\xe0\xcc\x78\x35\x02\x83\x9b\xbd\xad\x92\x40\x6c\xcd\xa6\x42\x87\x5a\xec\x14\xa5\x9b\xf6\x4b\x22\x00\x8a\x8b\xb2\xf5\xf4\x92\x95\x49\x3d\x4b\x43\x43\xb2\xf0\x3a\xf1\xf1\x14\xe7\x87\x63\x62\xa7\x48\x40\xe3\x57\xca\x42\x97\x9a\xa2\xe7\x25\xb4\xc3\x4e\xd5\xbe\xe9\x40\x15\xaf\x64\xf9\xb5\xa9\x4a\x71\x24\x42\xad\x6b\x27\x7e\x54\x0f\xac\x1d\xea\x0a\x24\x33\x71\x8d\x0e\x22\x61\x35\x1e\xc9\xd1\x7d\xe5\x1c\x7a\x77\x77\x67\xbd\x73\x98\x80\x10\x5a\x50\xd6\x34\x8b\xd7\x74\xe8\xf1\x33\x42\x88\x44\xbd\xa6\x08\x84\xce\xcf\x0e\x97\x9e\x77\xcc\x17\xa2\xaf\xe6\x6a\x3b\xef\x2c\xf4\x6f\x2d\x7c\x19\x57\xff\xf1\xe2\x04\x49\xf0\xcb\x16\xac\x72\x99\xf4\x47\x7b\x73\xcf\x6e\xa4\x52\xeb\x44\x34\x13\xb5\x97\xc5\xef\x70\x8e\xc9\xf9\xba\x6d\x58\xef\xe8\xbb\x4a\x9b\x0a\x2e\x11\x9e\x87\x7e\x2f\x90\x0b\xda\x89\xc3\xba\x13\x23\x13\x90\xe6\xa6\x9e\x50\x15\xcf\x9c\x96\x4d\xdd\x9e\xaa\x29\x7d\xa9\x14\xbd\xfe\x2c\x9b\xc6\x58\x4e\xa6\x0d\xd5\xe3\x9a\x6e\x0d\xde\xcc\x48\x07\x89\x18\x33\x10\xc4\x33\x01\x1b\x7f\x16\x0b\x45\x38\x0a\x02\x1d\xd5\x4e\x1c\x7d\xb8\xac\x18\x20\x4d\xff\xdc\xe0\x84\xf2\x78\xfd\x87\x34\x5c\x7f\x1d\xc3\xf5\xd7\xc8\x0a\x7f\xad\xf1\xd7\x06\x3e\x7b\xbf\x4d\xad\x1c\x95\x08\x09\xd4\xb8\x91\x56\x72\xca\xfe\x9c\xe9\xa1\x12\x2e\x9c\xb4\x6e\x37\xc0\x38\xd7\x0a\x1e\x42\xb9\x9b\xd5\xbd\x2b\x3b\x0a\x20\x17\xd4\x93\xc0\x25\xf4\xa7\x29\xf6\x49\x4d\x25\x09\xba\x7a\x0f\x02\xc2\xc1\xcb\xdf\xd0\x99\x32\xcf\xb1\x68\x09\x87\x59\x0c\x57\x82\xec\xa3\xf1\x94\x93\x96\x4c\xf2\x9c\x63\x6c\x72\x22\xde\xa5\xbe\x68\x57\x57\x14\x6e\x27\xb6\x4b\x59\x70\xa8\xc3\xba\x84\x2b\x4a\xf8\x67\x78\xe5\x7c\xed\x37\xe0\x33\xa0\x3d\xc0\x6b\xad\xc3\x83\x73\x72\x61\xeb\x4d\xf6\x52\xaa\xcf\xaf\x6c\x91\x35\x5c\x93\xd2\x46\xd1\xd9\xd0\xd9\x6e\x20\x99\x27\x66\xbb\xb1\xc6\xd8\x6d\x6f\x33\xdb\xf2\xa4\xc0\x38\x9e\x72\xf4\xf1\x27\x9b\x48\xef\x95\x73\xcc\x93\xce\x31\x29\x0f\xeb\x34\x7a\xd3\xd7\xb0\xfa\xbe\x4a\x45\x8a\xdc\xf4\x94\xde\xed\x9a\x7a\x8a\x37\x07\x33\xc3\xad\x33\x36\x0d\x76\xc7\x72\x42\x18\xb6\x00\x27\x3f\xa2\x04\x01\x9c\x91\x82\x46\xee\x9a\xfc\xd1\xf1\x61\x71\x09\x20\x4d\x74\x29\xe3\xcb\x79\x02\x58\x93\xd5\x47\x03\xb0\x66\xa4\x00\x6b\xe8\xe2\x79\xc7\x62\x8f\xa4\x6d\x12\xce\xe1\x70\xa4\xc2\x17\xa7\x83\xbf\xe8\xc1\xe3\xf4\xb9\x0a\x10\x65\xa5\xce\x00\xe9\xc0\x53\xf4\x94\xd1\x85\x5f\x5b\xfa\xab\x47\x3c\xf9\x5c\xa2\x21\x51\x9d\x21\xba\x6c\xa7\x71\x56\xb6\x12\x8e\x66\xf4\x10\x38\x9a\x4c\x7c\x8a\x11\xa3\x9f\x8d\x4f\xd1\x3b\x29\x40\x0f\x18\x62\x3d\x1b\x0a\xae\xd3\x05\xd7\x91\xf7\x8b\x73\x3e\x6d\x7b\x05\x88\x15\x85\xdf\xd3\xe9\xdf\x27\x4e\x2b\x73\x9d\xc1\x4e\x51\x53\xb9\xb3\x74\xb9\x33\x16\xaa\x99\x9d\xfe\xf4\x98\xd9\x3b\xa4\x6e\x36\x14\xc7\x18\x45\x18\x87\xf9\x2b\xae\xa1\xbd\x43\x1f\x63\xc9\xdf\xb2\x4a\x1a\x43\x59\x4f\xc2\xcb\xd9\x2c\x9c\x9d\xf7\x02\x7f\x68\x2a\x7c\x99\x2e\x7c\x59\x08\x3b\x34\x7a\x44\xec\xd0\xe8\x7e\xd8\xa1\xd1\x9f\x80\x1d\xd2\xb4\x59\x00\x3b\xa4\x03\x7a\x99\xb1\x43\xf4\x15\x19\xe7\x61\x87\x78\x06\xc8\x98\x8f\x1d\x12\x79\xc8\x38\x13\x3b\x34\x16\xd8\xa1\x4c\xb3\x96\x24\xfe\xcc\xa3\xf8\xb3\xb4\x59\x0b\xe9\x73\xd1\xe9\x04\x67\x68\x49\xa3\x0a\xa4\x48\xbc\xa2\xd1\x80\xf1\x46\x72\x5c\x82\x91\x08\x0f\x6b\xa8\x8e\x97\x0f\x66\x8a\x0c\x05\xa2\x7f\x1e\xfc\x1c\xce\xc2\x49\xd8\xc7\x04\x6c\x34\xd6\xa7\x65\x6e\x29\x7d\x48\xec\x98\x64\x72\x93\x24\x53\x01\xe7\x30\x17\xe9\x3a\x2f\x10\x60\x25\x63\x51\x80\x6c\x93\x9f\x7a\xca\x93\xc0\x3a\x5d\x24\xed\x83\x12\xd8\xab\x4e\x21\xdb\x21\xb8\x09\xe1\xa2\x59\x04\x67\xee\x6c\x3f\xc8\xd5\x26\x82\x5c\x25\x81\x54\xdc\x82\x74\xe4\x0c\x2a\x7d\xe6\x0c\xa5\xcf\x97\xe4\xda\x19\xc2\x6f\x34\x5c\xe8\x8b\x85\xb7\xcd\x05\x11\x51\x41\x93\x49\x8f\xc1\xf9\x19\x7d\xb8\x38\x0e\xee\xf5\x22\xd3\xf2\x5b\xc7\x3f\x3a\x6a\xb7\xae\xae\x1b\x5e\x8e\xec\xc1\xcc\x22\x01\xe5\x13\xd2\x67\xa0\x78\xa6\xfc\x07\x46\xec\xdb\xd6\x76\xb4\x9d\xb1\x10\x81\xb0\xf0\xb2\xcc\x79\xc9\x6d\x1a\x6a\x12\xb5\xb7\xd9\x09\xa7\x26\xd4\x41\x8d\x15\xdc\xdd\x21\x74\xe3\x9a\x54\x61\xf1\x4e\x22\x8f\x28\xb4\xb6\xa4\x53\x94\xac\x7a\x51\xe5\xc5\xc3\x90\xdc\xa0\xd4\x68\xc2\x05\xc3\xf3\x56\x07\x5a\x58\x57\xac\x89\x2c\xc3\xf9\xbe\xd6\xaa\xa3\x6b\x5e\x32\x91\x45\x38\x27\x2c\xf5\xba\x41\x8b\x10\xf4\x28\xdd\x75\xba\x77\x77\x63\x60\xea\xd0\xe1\x3e\x77\xb9\x26\x10\x25\x14\x33\x86\xff\x5c\x73\x07\x36\xa7\xce\xd6\x08\x19\x11\x2b\xcf\x73\x67\x8a\x93\x94\x33\xe7\xf4\x1e\x78\x11\xa5\x36\xe0\xa7\xce\xe4\xb2\xcd\x53\x19\x2e\xb2\x3b\xcf\xc6\x27\xa0\x0c\x7a\x8a\x88\x8d\xd3\x1c\x95\x74\x3f\xd6\x71\xf7\x55\x43\xa5\x0b\xe7\x54\x11\x6d\x8b\x2a\x93\x8a\x14\x9a\x2e\x46\xaf\xfb\x8a\xbb\x0c\x55\x59\x53\x6f\x75\x62\xd0\x21\x31\xfb\x03\xc9\xe2\x3a\xf1\x8a\x08\xbb\x87\x94\x67\xce\x0d\x29\x49\xa7\x44\xe3\x00\xb3\x1d\xc4\x23\xba\x5f\x73\xb2\xcd\xbe\xf2\x05\x74\x7b\x2e\xfa\x2a\xf8\xa5\xd9\xae\xae\x94\xca\x9e\xec\x09\xb0\x97\x34\xec\x97\x66\x8b\xbe\xdb\x61\x4b\x79\x43\xcb\x1d\x95\x61\x48\xd5\xbf\xbd\x60\x1f\xfe\xd2\xb9\x48\x2d\x78\x69\x81\x67\x1c\x38\x3b\x34\xe2\xd1\x29\xe0\xd0\xeb\x8f\x79\x3f\x14\x77\x9a\x5d\x2a\x5b\x63\x8b\x1d\x5d\x76\xb9\x5a\x7b\xf1\x64\x2c\xfb\xe5\x46\xfd\xd6\x41\xa9\x8c\x9b\x97\x7b\xc4\x08\xb3\x5c\x26\x24\x2d\xf9\x93\xdf\x01\x5d\x32\x2e\x35\x6e\x12\x70\x16\x1a\x2e\xe7\x9e\xbd\x07\xf1\x56\x90\xdb\x95\x7a\xaa\x2b\xe8\xa1\xe0\x5b\x7b\x92\x50\x6a\xd0\xae\x2c\x35\x2e\x1b\xbe\xa1\x9d\xa4\xea\x4b\x6d\x83\xaa\x8c\xee\x57\x3f\x91\xa2\x5c\x87\x53\x8c\xdf\xe5\x76\x39\x00\x98\x37\xdd\xf6\x46\xd9\xad\x5f\x78\xa3\xc7\xea\x80\xc9\x8f\x95\x50\xb9\xd6\x12\x3a\xe3\xea\x3f\xd4\xa5\xfc\xd4\x8b\x62\xa9\xcf\x5b\xd6\xcb\x7d\x4c\xdd\xc8\x65\xd2\x56\x2c\x61\xc6\x28\x09\xaf\x16\x16\xbb\xfe\x71\xca\xf2\xce\x15\x38\x02\xe6\x07\x4a\xfb\x1b\x4d\xbf\x65\x00\x91\xb6\x49\xd6\x20\x5c\xd5\x13\xd1\x76\x85\x6e\x58\xf4\x1e\xff\x1c\xc8\x88\xc6\x65\x32\x56\x8e\x0c\x71\xba\xcc\x3f\x68\xe3\x16\x18\x24\x71\x76\x30\x09\xba\x54\x28\x0e\x24\x2e\x4f\x61\xe2\x1a\x48\xd9\x25\xdc\x2f\x65\x03\x68\x66\x42\x32\x68\x84\x56\x64\x97\x92\x5c\x40\x25\x2f\xed\x55\xc1\x0f\xa0\x43\x13\x65\x2c\x9e\xcb\x42\xb5\xe6\x9f\xc4\x4c\x62\x96\x71\xf6\x92\xb6\x23\x7d\xd9\x9a\xdd\xc0\x7f\x2a\xd1\x37\xfe\xbe\x4e\x53\x2b\xf5\x46\x94\xd4\xd4\x9c\xee\x3e\x3b\xc1\xdb\x09\x17\xd7\xda\x2d\xa4\x9d\xf4\xc8\x7e\x3a\x52\xf7\xc9\xcb\xac\x0d\x94\x33\x75\x36\x53\xc3\x88\x6f\x54\x36\xd7\x75\xc6\x9c\x00\x44\xef\xb7\xb1\xfb\xdd\x8d\xac\x57\x91\x26\x4c\xe7\x85\x97\x50\x2d\x02\xe9\x92\x1e\xe9\xe7\xfa\x7c\x19\x38\xff\xf8\x0e\x3d\xeb\xbe\xa8\xa1\x6b\x5d\x29\xd2\x69\x3d\x78\xce\x22\xbe\xc0\x7c\x00\xf9\x8a\x9a\x98\x71\x2c\x2f\x0e\x67\xed\xfe\xc4\x1d\x41\x37\x27\x1a\x21\xb2\x2e\x12\x3e\x25\xcb\xc9\x54\xff\x66\xbb\x23\x37\xd4\xb7\xca\xcc\xa4\x48\x98\xa3\x86\x60\x41\x83\x32\x32\xd9\x36\xac\xb3\xe3\x0e\x9a\xbe\xa7\x02\x1e\xcf\x04\xc2\x20\x01\x38\x28\x25\xce\xd9\xa4\xdb\x95\xc2\x9e\x58\x54\x8d\xc1\xca\x91\x3f\x48\x09\x38\x32\xd4\x20\x6c\xb4\xb2\xf3\x25\x59\xeb\xdc\xb8\x2c\x1f\x5d\xa2\x69\xb4\xd3\xcb\x96\x68\x1a\x0d\xf5\xa8\x2f\x16\xa3\x3c\xd3\x28\x57\x44\x89\x1b\x73\x5a\xba\xb7\xc8\x6d\xb3\xb7\xb0\x76\xbb\xb7\x9c\x96\x61\x03\xf6\xb6\x21\xdc\x66\x16\x33\xda\x10\x6e\x98\x85\xc1\x3e\x1e\x5f\x58\x73\xd9\xe5\xf4\xae\x55\xb0\xbd\x1f\xf0\x7c\xdc\xcf\x4a\x0d\x9b\xcb\x2c\x66\x74\x0f\x24\xe9\xb9\xf6\x93\x05\x41\xd9\xbe\x51\x62\x6d\xf6\x50\x0d\xbb\xe1\x1c\xef\xae\xfd\xa4\x5c\xb9\xf2\x44\x9d\x65\xac\x59\x9e\x48\x5f\x91\x7e\x9e\x3c\x51\x08\x6f\xfa\x05\xe4\x89\x91\x58\xa7\x9f\x29\x4f\xec\x17\x92\x27\x26\x45\xe1\x1e\x15\x85\xeb\xdc\xe4\xe4\x0a\xdd\xf4\x3a\x0b\x22\x64\x58\xeb\xc2\xae\x76\xa4\xc3\xb3\xb0\x99\x62\x2f\x5e\x43\x91\xcc\x6c\x21\x0c\x11\x03\xb8\xa9\x8e\x8e\x16\x92\xd5\xe2\x44\x7a\xec\xa2\xf0\x4f\x95\xae\xf5\x84\x74\x2d\x4f\x6e\x36\x62\xec\xe3\x8d\xc9\xb2\x6e\x40\x46\xa4\x8f\x8e\x6a\x4c\xe6\x11\x43\x9a\xc1\x64\x59\x37\xab\x7a\x01\x1c\xac\xc1\x4f\xc2\xee\x6d\x64\x30\xad\x9b\x67\x99\xd6\x1d\x5a\xbd\xa3\xa3\x5e\x84\xbd\xef\x3d\xa8\xa1\x19\x1a\xeb\x35\x47\xf9\x56\x66\xbe\x13\xc4\x56\x66\x6d\x78\x88\xd0\x4c\xaa\x71\xd4\xd2\x19\xe5\x4a\xb3\x60\x61\xfc\xd2\x5f\xf4\x4e\x37\x41\x1c\xfc\xb3\x77\x6f\x67\x3d\xfa\x5a\x65\x53\x28\xd9\x81\x0f\x50\x21\x73\x8d\x0f\x9f\x55\x61\x6b\x27\x92\x93\x55\x32\x67\xca\xce\x88\x71\x19\x12\x76\x5b\x0c\x92\x9d\xd7\x02\x52\xd4\xdc\x2e\x48\x13\x14\x27\x5f\xfa\x46\xc2\xa3\xa3\xcd\x3d\x2d\x4c\x6e\xb8\x85\x09\x09\xb8\xa9\xc0\x4d\x64\x2a\xb0\x10\xfe\x87\x12\x5e\x69\xa2\xde\x72\xd4\x7e\xc6\xfa\x55\xe0\x03\x74\x57\x6d\xd5\x0d\x43\x37\x49\x20\xbb\x51\x02\x0e\x7c\xfa\x59\xf6\x7d\xdc\x6f\xf3\x4f\x56\xa1\x9e\x2a\x2a\x98\xa1\x82\x90\x5f\x04\xa1\xa4\xac\x2a\xe2\xbe\xfe\xc5\x54\xa6\x5c\xd2\x32\x45\xbe\xcc\x9d\x3c\xb1\xa6\xad\xe3\x46\xdd\x4e\xf2\x10\xf5\xef\xd4\xc0\x41\x32\x13\x05\x45\xea\x8d\x63\xa4\xc2\x11\x96\xc6\x70\xc5\xbe\xc0\x15\x77\x22\x5c\x71\x27\x0b\x1a\x7d\x83\x6e\x7b\x48\x4f\x01\x16\x2f\x58\xfc\xa4\xfb\x62\xa3\x2d\x39\x28\x4e\xd9\x0a\xaa\x31\x89\x87\xb6\x63\xed\xa4\x40\xfc\x3b\x16\xab\xce\x2e\x65\x35\xca\x8d\x2d\xb8\x82\xc1\x9c\x4f\x0d\xd1\xd2\x9c\x1e\x1d\xdd\x6a\xb8\xf5\x4c\x5e\xd2\x18\xf5\xc8\xf2\x79\x30\xbc\x17\x18\x0c\xef\x6f\x22\x18\xde\x6e\x72\x6f\x68\xfa\x6f\xd6\x02\x71\xdd\xea\xf4\xdf\xa4\xa7\x3f\x85\xeb\xee\xda\xc9\x2c\xe2\x30\x38\x50\xbc\xf5\xa4\xac\x13\x6e\x64\xeb\x84\xb6\xe4\x80\x19\xed\x13\xe8\x33\x8d\x74\x63\x60\x2d\x7d\x0d\x60\x2f\x62\x30\x1d\xdd\xfd\x4d\x43\x78\x27\x91\x69\x99\xe8\xb5\x18\x68\xc6\x59\xd5\xba\x30\xbe\xab\x6b\x81\x66\x03\x06\xfe\x8a\xdc\xe0\xa4\x68\x17\xe4\x52\x0f\xd1\x3b\xe7\x21\x7a\xe7\x04\x9e\x71\x8a\xff\xdc\xb0\xfc\x33\x95\x57\x94\x6f\xdb\x04\x53\x37\x47\x26\xae\xd9\x49\x43\xbd\xe2\x78\x24\xd4\x6c\x30\x37\x76\x4c\x0c\x17\x0b\x93\x9a\x4d\xb9\xb0\xc2\xd7\xd6\x3b\x68\xfa\xd8\xcb\x76\xcf\x53\x08\x48\xa6\x45\x83\xa1\xaa\x23\xa7\x5c\x47\x57\xae\xc9\xe2\x27\xe8\xf8\xda\x19\x99\x47\x7c\x6d\xf0\xed\x6e\x83\x04\x0e\x0a\xef\x7a\x5b\x41\x62\x8b\xb4\x84\x0b\xa1\x9e\xde\x85\x50\x56\x57\x0c\x48\xa7\x9e\xea\x42\x28\xa3\x06\xa3\x0b\xa1\xde\xfd\x5d\x08\x45\x12\x81\x19\x7b\x10\xfa\x37\x27\x88\x20\x53\x9d\x08\x32\xd5\x95\x30\x51\xbd\xff\x71\x12\x84\x42\x01\x89\x8c\x9c\x7a\x2e\xe8\xc7\xc8\xac\xe7\x82\x7e\x8c\xfc\x7a\x36\x3e\xc9\x28\xf3\xc8\x83\xfb\xf4\x1e\x11\xee\xd3\xbb\x1f\xdc\xa7\xf7\x27\xc0\x7d\x34\x6d\x16\x80\xfb\xfc\x8f\x63\xcf\xf3\xd8\x6a\xbd\xfc\x8b\x08\x36\x77\x4e\x8f\xa4\x98\x0f\x94\x41\x2e\x73\x05\xe4\x32\xb7\xf3\x84\x01\x49\x59\x8a\x47\x65\x29\x1a\x70\x51\x20\x8c\x7a\xf7\xc0\xf9\xe8\xa5\x72\xf1\x6d\xa8\xc1\xf9\x64\x21\x6f\x82\xa2\xa2\x84\xc5\xac\xef\x2d\xf1\x65\x11\x31\xc2\x30\x3e\x2e\x22\x31\xc2\x50\x0f\xbd\x19\x3a\x56\x50\x41\xba\xdc\x71\x9c\x6e\xab\xcd\x18\xa5\x36\x5f\x30\x6d\xca\x2c\xb5\x85\xe7\x50\x42\xb3\x75\x5b\xa5\x2d\x8c\x0e\xe3\xc1\x14\x91\x2c\x00\xcb\xec\xdf\xdd\x0d\xe8\x25\x3b\xd1\x70\xc5\xf2\xd8\x14\x70\x47\xe8\x4c\xf6\x60\x83\xd5\x6a\x80\x3a\xb2\x42\x85\xf9\x9d\xc8\x7c\xae\xdd\x9c\xe4\x30\x78\xed\x98\x63\x6c\xab\x78\x8d\x1b\x4d\x68\x58\x6c\xfc\xde\xd0\x8c\x1b\xdd\x28\xc9\x4d\x31\xa8\x03\xb6\x9c\x42\x3a\x14\x51\x9b\xf5\x65\xe2\x67\xe6\xdc\x24\x0d\xb0\xa3\x61\x95\xbb\x85\x00\x09\x33\x93\x61\x35\x1d\x46\xb7\x5c\xaa\x1b\x3a\xe2\x5b\xbd\x48\x37\x2a\xf2\x1e\xe7\xe7\x45\x87\x1e\x31\x4b\x7c\x23\xe0\x10\x19\xa3\xa0\x0a\xb9\x05\x85\xa4\x14\xe8\xd6\x60\x8f\x6e\xc9\x79\x0d\x68\x90\x9a\x24\x43\x9a\x15\xff\xb4\xd0\x6f\xe0\xbb\xe5\x07\xfe\x89\x69\x0d\x43\xda\xfd\x5a\xfc\x84\x1d\x4c\xcc\xcc\x8c\x0d\xfb\xf1\x46\x0c\xfb\x7b\x10\xeb\xf3\xc6\x09\xa6\x2b\xda\x93\x7a\x7e\x2b\x57\x8d\x17\x38\xcf\x81\xb3\xef\x38\x7f\x07\x76\x0b\x85\x07\x7a\xaf\xa4\x57\xdd\xeb\x1d\xb5\x14\xd2\xaa\xd8\x06\x1a\x4d\xde\x90\x2a\xb3\x46\xc6\xc0\x9a\xc0\x6d\xe9\xf8\x01\xe0\xd0\x24\x3d\x57\x31\xc2\x34\xa2\x7d\x47\xd4\xe4\x0b\x6f\x7d\xed\x20\x66\xdd\x25\xd2\xe0\x42\x68\xd9\xb2\xe8\xc1\xe3\xe8\xed\xd6\xe2\xbb\x9f\xe6\x22\xfc\xc4\x36\xe4\x56\xc9\x00\x9e\x97\x88\x73\xdd\x50\x28\x49\x11\x88\xec\x84\x9d\x8d\x86\x52\x32\x71\xc0\x32\xa2\xa5\x59\x1b\xe5\xb9\x94\x0c\x2f\x36\x74\xf4\x23\x08\xc5\x02\x2c\x46\x43\x8f\x16\x2a\xd5\x65\xa5\xba\x58\x0a\xdd\xec\x15\x2b\xd5\x61\xa5\x3a\x58\x0a\xee\x7c\xa4\x85\x8b\x15\xec\x51\xad\x2d\xe6\x84\x65\xe6\xa2\xb5\x5b\xa3\x47\x9b\xc6\xa5\x56\xac\x8a\x01\x6b\x7b\xc0\xc4\xdd\xb0\x5c\xe3\x62\x7e\x46\xb1\x7e\x9a\x9c\xf1\x69\xfb\xfd\x9d\xe4\x7c\xaf\x58\x17\x80\x6b\x21\x82\x4a\x18\xd2\x4a\x80\xb5\x91\x89\x0f\xb8\xd7\x61\x80\x7d\x18\x54\x41\xe0\xef\x3a\xd6\xa5\x68\x68\x0e\x41\x90\xd0\x8b\x67\x9d\x24\x20\x24\xfd\x72\x42\x07\xd1\x23\x6b\x8c\x12\xb0\x35\xea\x20\xfa\x34\x43\x8a\x02\x59\x53\xc3\x58\x19\x67\xcb\x91\xb1\x9e\xe4\xf1\x0c\x91\xb1\xe3\x08\x03\x1b\x22\x06\x76\xc8\xe5\x7f\x37\x2d\x44\xd9\x56\x5f\x3c\xd9\x3c\xf5\x52\x3e\xd2\xc8\xe6\x89\x95\x4e\xad\x54\x5f\xd8\x9a\xcc\xd7\x0d\x86\xd7\xdd\x5c\xa3\x06\x44\x07\xd6\x4d\x76\x69\x12\x75\x69\x1a\x87\x33\x44\x7c\xed\x96\xe2\x6b\x87\x6a\xe4\x6c\x67\xa8\x86\xce\x8e\x1e\x95\x7c\xad\x2b\xe5\xb1\x52\xad\xd5\x9f\x28\x29\x44\xa9\xa6\x9c\x78\x5f\xbf\xbe\x6e\x5c\x55\xea\xa4\x2e\x0f\x82\xb7\x3f\x52\xdb\x8f\x1e\x47\x6a\xfb\xca\x23\xad\x5f\x49\x21\x4a\x35\x95\xc4\x7b\xa9\x7d\x2e\x46\x5d\x1b\x15\x2d\xca\xca\x85\x8b\x73\x10\x91\x97\xf1\x3c\xc3\x30\x4e\x9d\xdb\x7b\xe8\x5b\xd2\x95\x53\x38\x72\x42\xc1\x72\x2e\x25\x75\xa9\x19\xe6\xad\xa2\x70\xc9\xc1\x17\x33\xd4\x10\xb9\xbd\x4f\x18\x04\xb2\x36\x23\x03\x17\xd5\x18\x4f\x92\x82\xe5\x4d\xc3\x79\x24\xc7\x41\x95\xf5\x80\x5a\x40\x9f\xe5\xeb\x1a\x98\xcb\x4e\xaa\x35\xc0\xf8\x5b\x6c\xc6\x13\x9a\x86\x5b\x45\xd3\xa0\x29\x61\xd0\x33\x6c\x92\x3a\x85\xad\x0c\x07\xe6\xe5\x4b\x64\xd6\x2a\x2d\x67\x23\xcb\x58\xb7\x0d\x9c\x4b\x49\xe0\x6f\x6f\x53\x1a\x9a\x34\xec\x3a\x07\x91\xbb\xd3\xd3\x47\x63\x41\x5d\xa7\x70\xba\x24\x8d\xd0\x55\x86\xbb\x91\x44\xdd\x32\xb6\x4f\x12\xe8\x47\xda\xcb\x8f\xee\xc7\x45\xf8\xaf\x60\x16\x5a\x23\x2b\x42\x64\xd5\x08\xcb\x6c\xc7\x84\x5c\x1a\xcb\x95\x5d\x5b\x04\xea\x1a\x59\xbc\xae\xca\x08\x85\xea\x71\x85\x7a\xa5\x83\x4e\xe5\x50\x2a\x5b\x43\x6b\x4c\x5f\xda\x15\xdd\x11\xfa\xa4\xfa\xfc\x45\xec\x31\x27\xcc\x42\x12\x2f\xd1\x0f\x46\x01\x34\xf1\xe2\x81\xd0\xc4\x79\x70\xe2\x42\xfd\xa9\xa7\xfa\x73\x5f\x48\x71\x3e\xa6\x18\xe1\x00\x7f\x00\xac\x18\x86\xbd\x78\x5c\x68\x71\x2e\xb6\x58\xee\xc2\xa3\xe1\x8b\x69\xc0\x0e\xc5\xaf\x94\x76\xb3\xcf\x85\xfe\xc1\xc8\xd6\xc5\x3b\xc3\x9a\xec\x81\x9a\xb5\x19\xef\xe7\xd1\xfb\xc5\x8f\x78\xbf\x24\xd4\x74\x45\x4a\x05\xd0\xa5\x0f\xb0\x39\xd5\x03\x59\x9b\xfd\x1f\x3a\x2c\x6c\xb2\x83\xa9\x73\x8d\x39\xaf\x60\x0f\x30\x35\x78\xd8\x34\xf0\x9f\x4a\x74\x00\x7d\x5f\xa7\xa9\x95\x7a\x23\x4a\x6a\x1a\xcf\xaf\xf6\xb7\x9d\x7c\x0a\xae\x35\x71\x04\x12\x34\x0a\xc4\x75\xb1\x92\x19\x5d\x85\x16\xc8\x82\xae\xe6\xf2\xbb\x3d\xa6\xd0\xeb\xb3\x3f\x83\x1c\xe0\xea\x50\xc3\xd9\x8e\x34\x69\x63\x23\x6e\x55\xcf\x24\x20\x6e\x35\x74\xae\xae\xc9\x94\x82\x57\x6f\x50\xd5\xc8\xdd\x5b\x18\x78\xec\xc5\x9f\x8d\x56\xe5\xee\x36\x74\x4c\x3b\x22\x01\x62\xa6\x5d\xf5\xd0\xe4\xa8\x3b\x3a\x3e\x2b\x4a\x06\x02\x32\x49\x31\x1c\xf0\x1f\x95\x1a\xbc\x77\xd3\xe7\x3f\x87\x32\xa9\xde\x76\x64\x2e\xea\xfe\x4d\x32\x63\xa5\x92\xf6\xce\xd9\xc9\x82\x87\xc5\xa3\x2b\xd1\x8c\xf1\x39\xb2\x95\x68\xc6\xf0\x1c\xd9\x21\x11\x8d\xc8\xd8\x6c\xf4\xae\x51\xe9\x36\x75\xdb\xf7\xd2\x80\x19\xa1\xbb\x66\x44\xed\xfe\x60\xda\x4c\x0c\xae\x51\x0b\x99\x0d\xdd\x35\xa2\x4d\xff\x77\x43\x77\x91\x17\xb8\x6c\x9b\x0b\x1a\x1d\x2a\x98\x71\xbb\x46\xed\xb1\x64\x5a\xbe\xb7\x83\x8b\xff\x65\x51\x44\x32\x95\x75\x49\xbd\xa0\x47\xf5\x82\xf7\x0f\x70\xa9\x9c\x9f\x09\xdc\xad\x67\x92\x59\xf9\x56\x4c\xcd\x79\x09\x99\xd5\xd0\xfe\x7a\x1b\x29\xd1\x6e\x25\xf0\xed\x0d\xa2\xb2\x62\xf0\xed\x4c\x7a\xec\x99\xa4\x5b\xa7\x14\xca\xaa\x91\x51\xf1\x48\x76\x06\xd9\xd7\x84\xac\x11\xa1\x7a\x6e\x94\x7d\x85\x34\x03\x22\x05\x7d\x0d\xfe\x76\x6d\x80\xdb\x6e\xa3\x70\x78\xf0\x91\x92\x70\xdb\x65\xec\x0d\x68\x58\x30\x36\xc5\x8a\x51\x72\x17\xcd\x95\x88\x4d\x71\x81\x8e\x21\x97\xf6\xea\xea\xe2\xda\x59\xc2\x3f\xa9\xd8\x14\x98\x18\xc7\xa6\xc0\xa7\x1d\x8d\x29\x31\x44\xf1\x95\x80\xfa\x0e\x1f\x10\xea\xeb\x93\xb5\x4d\xfc\xe6\xfa\x1b\x02\x4a\x70\xe9\x41\x41\xb9\x93\x1a\x8c\x73\x78\x6d\x93\x6c\x2b\xdd\x42\xf2\x26\x51\xa9\x2c\x5a\x7a\xe5\x5c\x2a\xa2\xa5\x97\xc5\xb1\xbc\x39\x59\xb7\xc5\xb3\x4a\xa0\xdc\x9c\x9c\x4a\x18\x80\x9c\xbc\x6a\x48\x86\xa9\x14\x05\xe0\x0c\xc6\x9d\x17\x05\x60\x18\x47\x01\x18\x69\xa2\x00\x8c\x92\x51\x00\xf2\xb6\x99\x6c\xfa\xb9\x7f\x14\x80\x91\x14\x05\xe0\x32\x47\xae\x37\x8a\xe5\x7a\x71\x31\xf4\xc0\xfb\xea\x9e\xb8\xe5\x33\x81\x5b\x5e\xa0\x87\xcc\x68\x0e\xc5\xd8\xcf\x13\x8e\xde\x47\xb1\xcb\xcb\x91\xce\xd1\xfb\x5a\x76\xf4\x7e\x99\xe7\xe8\x7d\x40\x3d\xa4\x6a\xda\x64\x28\x8c\xe4\x29\xa3\xb3\xf1\x1c\x17\x71\xad\x3e\x94\x5d\xab\x0b\x37\xea\xaf\x9d\x57\xd9\x78\xec\x8c\x43\x26\x81\xc7\x7e\xad\x01\x63\xb3\xfb\xe0\xde\xbe\x9d\xcf\x28\x80\x79\xa8\x20\x68\xcf\x11\x41\xfb\xea\x01\x9d\x3b\x9b\xeb\x4a\x8f\x07\xa1\xb9\xb3\x6f\xf0\xf4\x7c\x8e\x88\x60\x75\x3c\x67\xe9\xf1\x6c\x33\xfb\xd0\xb3\x53\x1e\x90\x33\x5c\x05\x7b\x79\xae\x82\x27\xe8\x2a\x58\xf3\x95\xbf\xc1\x4f\x70\xae\x97\x60\x4f\xf1\x12\xec\x1b\xbc\x04\xc7\x3e\x82\x7b\x8a\x8f\xe0\x88\xb0\x82\x3b\xd0\x62\x0f\x8e\xe3\x30\x6f\xc0\x3d\xe1\xda\x0f\x52\x98\x0b\x60\x3f\x76\x01\x4c\x1b\x42\xe7\xc3\xcc\x99\x8b\xde\x05\xb0\x4f\x81\xa7\xbd\xd8\x05\xf0\x38\xe5\x02\x98\x50\x81\x9a\xd4\x25\x2a\x84\x6c\x32\x3f\xc0\x09\x0c\xae\x1f\xf9\xd1\xb5\x9b\x03\xb3\x17\x5d\xe9\x48\xf1\x84\x17\xdd\x91\xde\x8b\xee\xe9\x03\x7b\xd1\x0d\x85\x17\xdd\x09\xf5\xa2\x3b\xd0\x7b\xd1\xcd\x58\x71\x49\x2f\xba\x9b\xaa\x14\x7f\x14\x31\xe2\x5a\xaf\xba\xfd\x6f\x73\xe2\x5d\xf4\x5c\xe2\x74\xcf\xdd\x9d\x89\x5a\x3b\x90\x1b\xa8\x93\xcb\x24\x05\xc4\x26\x47\x16\x27\x88\xec\x4c\x8a\x8d\xa0\xef\xfd\x89\xc2\x8d\xe2\x09\x7c\x89\x42\x86\xf4\x4e\xf7\x8d\xf3\x74\xa1\x11\x00\x03\x8f\x6b\xf0\xe2\x14\x8f\xaf\x46\xb9\x05\x79\xbc\x0f\xd0\x75\x5f\x76\x62\xbe\xf9\x46\x67\xc9\x9a\x31\xe4\x39\x4b\x5e\xea\x9d\x25\xfb\xaa\xab\xe2\x5b\xa3\x64\x32\xed\xa9\xd8\x97\xbc\xf3\x7a\x77\x77\x7a\x2e\xea\x1b\x3d\xf5\x1a\xbc\xf2\x0e\x75\xc6\x12\xa3\x84\x57\xde\x7f\xa4\x8c\x25\xfe\x51\xdb\x49\xd8\x9c\x84\x14\x32\x0a\x19\xcc\x9d\xf3\x52\x0b\x09\xc9\x35\x6f\x5d\xb8\xe6\xfd\xba\x23\x2b\x96\x69\xcd\xfe\x6c\xee\xe7\x55\x77\x4b\xcd\x29\xf6\xf0\x9c\x3b\x4f\x79\xce\x1d\x3e\x80\x39\xc4\x43\xfb\xd5\xe5\x9a\x75\x9d\x30\x75\x23\x09\x53\xef\xe5\x14\x56\xb5\x88\xf0\x35\x16\x11\x7e\x96\x45\xc4\x50\x6f\x11\x71\x0f\xdf\xaf\x43\xd5\x22\x22\xa3\x06\xa3\x45\xc4\xf0\xbe\x16\x11\x71\x04\x67\x67\x03\x0f\x48\x8c\x3a\x1d\xf8\x11\x79\x95\xf5\x23\x47\xb2\x7e\xe4\x48\xd6\x4f\x3b\x92\x1d\x40\xa2\x30\x95\x18\xc2\xef\x5c\x29\xaf\x8f\x6d\xdf\x57\xca\x6b\x14\x52\x66\x4b\x79\x8d\xe2\xda\x7c\x47\xae\xf7\xb7\x93\xc8\x74\xd5\x90\x89\xf0\x36\x4a\x01\x8b\x38\x81\x35\x5a\xe3\x67\x1b\x59\x18\x1d\xe5\xe6\x19\x59\x0c\x1f\xd1\xc8\x62\x78\x3f\x23\x8b\xe1\x9f\x60\x64\xa1\x69\xb3\x80\x91\x85\x4e\x0c\x6e\x96\xa4\xd2\x57\x64\x94\x27\x49\xe5\x19\x20\x63\xbe\x24\x55\xe4\x21\xa3\x4c\x49\xea\xa8\x90\x24\x35\xa9\x74\xf0\xa8\xd2\x21\xc3\xa7\xea\x98\x52\xac\xfc\x67\x01\x13\x8e\x6d\x7a\xba\xb6\x8e\x4b\x84\x74\x74\xab\x98\xf6\x6d\x15\xa3\x8d\xed\x1e\x16\x16\x06\x4b\x91\x4c\x4f\xaa\x7b\x7a\x86\x35\x38\x6b\x15\x9e\x61\xfd\xa4\x63\xd8\x2c\x1b\x0e\xdf\xe4\x3d\x15\x8f\x5a\x49\x30\x1d\xf6\x46\xbe\xce\x15\x04\x0b\xd2\x95\x21\xbf\xb6\x92\x55\xc8\xd1\x65\xab\x86\x91\xe3\xa5\xa6\xf1\x3c\x6e\xde\x4d\xca\x89\x45\xbd\x50\x89\x8b\x1a\xb5\xfc\x78\xe7\x92\xb6\x83\x17\x4c\x30\xf9\xde\x07\x16\x21\x9c\x07\xad\xd2\xb1\xef\xd6\x8e\x7d\xf8\x10\xed\xef\x8e\xff\x76\xfc\xf7\x12\xef\xd6\x7f\x7d\xdf\x7b\x76\x40\x61\x16\x4e\x89\x2d\xd9\x83\xbf\xfc\x57\xb9\x5d\xfe\xaf\xd2\xc9\x7f\x95\xb9\xc0\xb6\x5c\xfa\xfe\x69\xef\xd9\xc9\xf7\x0b\x3c\x61\xe0\xcf\x0c\xfe\x6f\x9f\x60\xf5\x8d\xef\x9f\xc2\x2f\x7c\x2a\x95\xb9\x49\x60\x92\xd3\xc4\x6c\x36\xd6\x80\x19\x9f\xd2\xb2\xac\x3c\xed\x57\x81\x0a\x68\x3e\x6d\x0d\xc8\x9a\xe7\x97\xc7\x5c\xda\xe2\xa3\x70\x5d\xa0\x79\xc8\xa5\x96\x7e\xca\xa6\xa1\xb4\x53\x95\x19\x9c\x1c\x30\x61\x6e\xff\x43\x02\xdd\x4e\xe2\x5b\x5a\x6f\xe8\x33\x71\xda\x15\x9f\xf9\xd8\xf5\xf9\x11\x15\xe6\x9a\xef\x84\x8c\x14\x9c\x3a\x61\x4a\xd8\xcd\xfa\xa6\x58\xec\xdc\x38\xd6\x74\x0f\xc9\x76\x54\x83\x2c\xc5\x9e\xaa\x76\x3a\xd3\x1c\x81\xa6\x1f\x4b\x48\x7d\xd5\x4e\x27\x61\xd3\xa2\x70\xb8\x66\x38\x1f\x5a\x48\xa7\x4d\x59\xb4\x42\x69\x51\x1b\x6a\x5d\xe6\x31\x38\xb2\x3f\xf3\x47\x59\x01\x05\x0d\x82\xf0\xca\x7c\x3b\xf6\xc2\x51\xd4\xd0\xac\x44\x5e\x40\x67\x8a\x78\x24\x64\xb1\xba\xcd\x35\x2b\x45\xdb\x18\xba\xb0\xfa\xec\x98\x06\x1c\xe5\x49\x1b\x48\xfa\x7b\x09\x0d\x53\xc2\x2c\xf8\xdd\x98\xaf\xc7\x18\x55\xc7\x19\x8d\x30\x03\x23\xa7\x16\x5a\x2e\xe4\x32\x5a\x68\x97\x28\xc0\x20\x5d\x98\xc4\x23\xe0\xcc\xd8\x67\xb3\x9b\x18\x26\x6b\xd4\x82\x6d\xb4\xb7\x10\xc0\x6e\x58\x06\x29\x8b\x8f\x44\xfa\xcc\x1c\x19\x94\xcb\x04\xf0\x6e\xc8\x6b\xb5\xbe\x43\x67\x16\x8a\xec\xe0\x6b\x14\xcd\xd7\x2f\x24\x7a\xd8\xe5\x02\xe0\x60\xcd\x89\x89\x12\x22\x12\xe6\x60\x7a\x28\x8e\xef\x68\xba\xee\x31\x4f\xdf\xdc\x7d\xbc\x2f\x67\xb1\x20\x89\x19\x30\x71\x59\x52\xce\x14\x43\xb9\x24\x64\x76\x16\x9d\x09\xc9\xdd\x55\xc4\x9b\x64\xf7\x5e\xde\x24\x45\x29\xa9\x71\xc5\xcd\xa7\x4d\xb8\x77\xa5\x05\x8a\x95\x67\x89\x33\x97\x5f\xeb\xc4\x4f\x9e\xb0\x89\xca\x9a\x8b\xd9\x16\xbf\xa5\x07\x57\xeb\x24\x44\x21\x22\xa3\xd4\xc6\xd3\x25\xd0\xc5\x3f\x42\x9e\xf7\x54\xaa\x07\x93\x50\x3b\x71\x3c\x7b\xd1\x9b\x85\xeb\x03\x1a\xa3\x01\x88\x6a\x9f\x72\xe4\x6d\xfb\xab\xe7\xc8\x22\xf8\xd3\xe9\x74\x16\x6e\xb0\x30\xd3\x1e\xfb\xf6\x6e\xc1\x64\xc0\x5e\x19\x45\x9c\x4d\x11\xb6\x6f\xe9\x20\x64\xaa\x46\xd6\x38\x84\xc9\xc9\xea\xe8\x68\xf9\xfd\x82\xcb\x11\x9b\xf6\xfa\x6a\x79\xed\x2c\xe0\x1f\xb2\x2a\xe3\xdf\x72\xf9\x9a\x96\x44\x89\x33\xe2\x2f\x97\x0e\x86\xdb\x39\x99\x40\xa9\x93\x7a\x13\x19\x96\xab\x6b\xb2\xac\x54\xa2\xea\x37\x4e\xad\xb9\x89\x2b\xdc\x94\xcb\xf6\xe2\x6a\x73\x7d\x62\xad\xaf\x36\xff\xb9\xa4\xee\x21\x31\x5c\x0d\x7d\x70\xf0\x0d\x54\xe7\xac\xe1\xb3\xb7\x97\x7e\x60\x10\xd0\x23\x00\x72\x27\x1a\xd8\x62\x8b\xb7\x30\x80\x53\x68\x69\x79\x72\xdb\xbc\x85\x26\xb6\x57\xb7\xd7\xce\x29\x39\x2d\x3b\x6b\xf8\xd5\x9c\xdd\xc3\xf9\xf1\xf6\xca\x83\x2e\xd1\x4b\xc5\x7a\x51\x3e\xae\x3d\x91\x50\x78\xde\xd3\xa5\xcd\x5d\xa6\x90\x41\xeb\x26\xe7\x7a\xb2\xda\xe2\xb2\xad\xac\xec\xc4\x2d\xd5\xc8\x2e\x5c\x53\x32\x93\xc0\x61\x0f\x3e\x67\x19\xa2\x6e\xf9\x41\x7f\x64\x89\x49\x86\xce\xed\x80\x70\x08\xe8\xf2\x3b\x23\xe7\xce\x0b\x72\x01\xff\x5f\xc2\xfc\x64\x4d\x04\x5b\xae\x6e\xce\x62\xcd\x59\xa1\xe5\xbe\xa0\x4a\xcf\x9c\x0b\xd2\xfe\x9e\x5f\xcd\x7c\xfc\xe5\xb3\xb2\x0b\x5f\xfb\xc2\x39\x83\xfe\x9c\x97\x9d\x63\xa0\x4f\x2f\xca\x40\x74\x5f\x9c\x5c\x42\xfa\xa5\x73\x61\xa7\x55\x95\xa5\xf2\x39\x9f\xea\x3d\x26\xfa\x32\x39\xd1\xe9\xb9\x3b\x2f\xd7\x5f\xec\x76\x11\x3a\xd3\xc9\x8c\x8e\x5e\x03\xce\x88\x5a\x21\x06\xd0\x69\xd2\xd1\x03\x26\xd1\x94\x97\x4a\x49\xb5\x72\xc9\x1e\xca\x1f\xfb\xce\xf1\xdf\xc9\x00\x7f\x0d\xf1\x9f\x11\x3d\x67\x55\xb1\xa3\xa2\x1b\x48\x49\xc0\x4b\x89\xeb\x37\x91\x42\x51\x92\xb2\xe0\x52\xe7\x91\x73\xfc\xe8\x50\x40\x23\xd6\x2b\x5b\x48\x64\xc4\x7a\xa1\x94\x70\x5f\xa0\x97\x8b\x4c\xe6\xde\x58\xc5\x98\x3f\xdd\x1b\xed\x35\x65\xa2\xde\xbd\x71\x8e\x52\xf4\xb2\xbd\x21\x7e\x33\xb7\xdd\x0f\xcf\x96\xb0\x54\x27\x1f\x60\x63\xee\x8d\xf5\xcb\x96\x8d\xe8\xa0\x7e\x66\xd9\x08\x7d\x45\xfc\x3c\xd9\x88\x60\x3c\xfc\x02\xb2\x11\x91\x87\xf8\x99\xb2\x11\xbf\x90\x6c\x24\x89\x99\x83\x73\xbf\xfb\x2d\x28\x33\x64\xb1\x8b\x98\x42\xde\xc4\x60\xbf\x08\x43\xb6\x94\xfc\x39\xde\xe8\x79\xb5\x1b\xa7\x5b\xe9\x30\x5e\xad\xc3\xa7\x6c\xe6\xf4\xe0\x37\xc6\x43\xe9\x88\x89\x59\xe5\xb2\x6f\xab\x0c\x87\x85\xc0\xe8\xcc\xef\xee\x7c\xb2\x70\x16\x77\x77\x6d\x8e\x57\x5b\x19\x31\x4d\x72\x50\x76\xca\xec\x6d\xe0\xaa\xde\x1f\xc5\xc4\x5d\xfb\xa1\x77\xbc\x84\xa5\xdc\xad\x94\x84\x8c\xe0\x69\x04\xb0\x62\x70\xa6\xdb\x82\x91\x38\x72\xf2\xcd\x7d\xaa\x0c\xe1\xb8\xa3\x75\xce\xb5\xd2\x89\xd9\xcb\x8e\x74\x9f\xa4\x9c\xfe\xcd\x04\x80\x6f\xad\xe0\x1b\x94\xc6\x9a\x67\x91\xdf\xbe\x6d\xbe\x2d\x5d\xd0\xee\x06\x39\x4e\xfb\xd6\x8a\x29\x5d\xba\x80\xc1\x92\xee\x26\x69\x1b\x31\x3b\xa9\xb5\x66\x18\xcf\xe5\x34\x6d\x4f\x17\xc6\xf6\x74\xba\x06\x98\x39\x1d\xda\x06\xde\xab\x20\x9d\xb4\xf3\xc4\xa4\x3d\x4e\x00\x94\xf3\x7b\x07\x40\x51\x39\x78\x6d\x13\x2c\x0b\xa5\xb6\xef\xee\xfa\xbb\xcc\xd8\x29\xe7\x29\xf6\xe6\x3c\xdf\x1f\x04\xb0\xad\x9c\x99\xba\xbb\x2b\x09\xbb\xa0\x6f\x0f\x73\x52\x80\x8d\x1a\xec\xc3\x3d\x89\xcc\x30\xa4\xa4\x0d\xd0\x92\x50\x87\x1c\xf7\x8f\x9b\xa2\x1d\x07\x66\xf9\xc4\x72\xdc\xdd\x55\x5f\xec\x44\x48\x9d\x73\x79\xf1\xe0\x82\xa4\x40\x23\xa0\x60\x32\xd6\x0f\xfe\x6e\x5d\xb9\xd7\x8d\xab\x6b\x6d\xc0\x9c\xa9\xbc\x4d\xa5\x13\x85\x57\xcb\x65\x29\x2a\x22\x49\xd0\x44\xcf\x10\x37\x57\xc5\x9c\x34\x6a\x36\x54\x3c\x0d\xe9\x11\x33\xb5\xab\x1c\x26\x80\xf6\xe7\x9b\x04\x16\xc0\x68\xa7\x34\xb7\x86\xdc\xc8\x13\xbe\xcc\xb6\x56\xb4\xd8\xc2\x1a\x49\xc5\xea\x96\x46\x32\x6e\xa9\x9e\x2d\x9d\x5a\xab\xad\x44\x79\x82\x84\x5a\x43\x49\x6a\x28\x25\xa8\xe9\xd5\x74\x3a\xda\xd2\x2b\x89\x5c\x79\x91\x9d\xf5\x4e\x5a\xfb\xe6\xaf\x23\xc5\xfa\x31\x2e\x21\xcc\x8a\x87\xe6\xfc\x31\xa6\xbd\x9d\x31\x7f\x3e\x9d\xf6\xf6\xbe\xd3\xde\xce\x9d\xf6\xf6\x63\x4e\x3b\xc7\x2b\x6b\xf7\x84\x7c\xad\xa7\xf7\xc4\x95\x40\x57\x5f\x33\x53\xe6\x82\x3b\x42\x71\xde\x09\x9f\x86\x7f\x07\x06\xfc\x78\xf8\xe5\x7f\x9f\xd5\xaf\x33\x53\x8c\xd6\x17\xfe\x9b\x5a\x5f\xf7\x1a\x44\xf1\xc5\x74\x9f\xb5\x84\x34\x9c\x2f\xc2\x6a\x2c\x9c\x76\xec\x86\x67\x29\x63\x80\xb0\xcb\xf9\xee\x4e\x39\xad\x42\x5d\x9d\xe6\x59\x29\x76\x69\x70\x8d\x1e\x0d\xae\xd1\x77\xea\xd5\x17\x14\xe8\xa3\x65\x7d\x87\x46\xd3\xc3\x91\xd1\xf4\x70\xec\x68\x71\xbd\xfd\x39\x4c\x03\x0c\x9f\x3a\x1e\x3a\x3a\xe2\xb1\xfe\xd9\xb3\xd1\x92\x11\x37\xff\x4e\x78\x4c\x2d\x31\x8b\x48\xa0\x81\xa8\xfb\x9f\x84\xdb\x54\xbd\x9d\x62\xb6\x55\xa2\x04\x06\x6a\x06\x0c\xec\x49\xd1\xae\xe8\xf1\x98\x3e\x31\xc3\x28\xeb\xaa\xfe\x1d\x39\x7e\xf1\x1d\x77\x5a\x31\x27\x0b\xb2\x34\x38\x1c\xbd\xd1\xb1\xed\x33\xe6\x56\x06\x3f\x90\x13\x18\x9c\x77\x26\x21\x85\x30\x09\x8a\x91\xb6\x7c\x3e\x44\x6e\x60\xf2\xbc\x89\xaa\x24\x84\x54\x65\x8c\xf2\xb9\x4f\xb5\x09\x20\xe5\x2c\x69\x20\x6f\xac\xf4\xb1\xa5\x17\x3a\xe3\xaa\x02\xd2\x0b\xa3\x4c\x81\x1f\x0c\x7b\x1b\x0a\x4a\xe7\xcb\xde\xd8\x98\x3c\x33\x37\x23\x1e\x27\x5b\x22\xa0\x93\xb6\x98\x25\x02\xf4\x15\xe9\xe4\x49\x04\x04\x7b\xdb\x29\x20\x11\x88\x18\xdf\x4e\xa6\x44\xa0\x53\xd4\x25\xa5\x1e\x22\x44\x04\xa7\x7e\xa3\xb8\xa4\xbc\x41\x98\x41\x7f\x7e\x0a\xeb\x68\x2f\x78\x94\xe2\x22\x2a\xcb\x66\x54\x2f\xe7\x81\x2e\x6c\x58\x41\xa3\x14\x4c\x2f\xe0\x81\x82\x5b\x56\x30\x53\x30\x92\x94\x68\x79\x54\xa2\x95\xe1\x2b\x73\xf0\x20\x0e\x2d\xf1\x1c\x2e\x1c\x14\x63\x10\x23\x50\x22\x21\xca\x56\x12\xa2\x4c\x8f\x8e\xb6\xaa\x5d\xde\x56\xb2\xcb\x1b\x24\x44\x2c\x03\x26\x62\x49\x09\x4f\xc8\x56\x6f\x9b\xb7\xca\xb1\xcd\x1b\x93\x15\x19\x66\x19\x0d\x4d\x68\x06\x53\x6c\x0c\xd4\xa6\x6c\x5a\x2b\x11\xf7\xa2\xb1\x32\xd8\xea\x6d\xb2\x42\x63\x2c\x60\x24\xf4\xf2\x3e\x85\xe1\x11\xd1\x0c\x95\xd4\x63\xea\x2d\x9a\xde\x44\x20\x61\xc8\x1d\xa9\xfa\x06\x05\x2d\xfb\x96\xc2\xb2\x6f\xa9\x58\xf6\x2d\x6c\xb4\xd8\x73\x16\x3a\xcb\xbe\x85\x62\xd9\xb7\x88\x2c\xfb\x06\x47\x47\x83\xc8\xb2\x6f\xf0\xa0\x41\x3c\x56\x18\xc4\x63\xf5\x0d\x41\x3c\x38\xa5\x9c\x2d\x05\x53\x0d\xfa\x06\xf7\x36\xe8\x93\xeb\x2a\x66\xc7\xc7\xa5\x39\x9c\x3d\x96\x7c\x4b\xe6\xd9\xcf\x3d\x8e\xad\x1f\x0e\xe0\xd1\x8d\xfd\x5e\xe9\xa3\xd3\x71\x69\xcc\x59\x52\x96\x75\x7e\x52\x6b\x9d\xa3\x2c\x2b\xa4\xc6\x4b\xc5\x8d\x04\x07\x91\xd1\x11\x19\x32\x23\xc1\x9e\x6c\x24\x48\xd3\xa4\xa4\xdc\xfd\xfe\x6d\x46\x82\xc3\x3d\x8c\x04\x87\xb1\x8c\x32\x2e\x86\xc6\x5b\xdf\x6c\x24\x38\x57\x0c\x2d\x4d\x46\x82\xc3\xd8\xa2\x67\xa8\x33\x12\x5c\x45\x46\x82\x7e\x01\x23\xc1\xbe\x1d\xcb\x57\x35\x46\x82\xc9\x03\x4b\xa7\xba\x1f\x15\x31\x12\x1c\x14\x31\x12\x94\x56\xb8\x58\x26\x7b\x58\x09\x0a\x69\x2f\xda\xab\xde\x37\xb2\x09\x33\x0c\x1c\x3c\xa4\x61\x60\x7b\x0f\xc3\x40\x6e\xdb\xf8\x2d\xc6\x8d\xdc\x16\x70\xb0\x8f\x2d\x60\x64\x82\xd8\x53\x79\x08\xc5\x2c\x43\x21\x44\x39\x22\xc0\xc7\x5b\xc9\xb5\x17\x57\xfe\xb5\xe3\xc2\x3f\x68\xe7\x2d\x01\x59\x16\xf1\xe5\xa8\x33\xcd\xca\xb0\x2e\x04\x96\x3c\x30\x5a\x17\xf6\xc8\x98\x59\x17\xc2\x05\xa7\x59\x20\xf7\x37\x30\xec\x90\x2e\x65\x24\x34\x26\x86\x1d\x61\x62\xe8\x2b\x26\x86\x1e\x33\x31\x0c\x92\x26\x86\x18\x34\x53\x18\x19\xf6\x1d\x51\xf8\xaa\x27\x19\x19\xf6\xd3\x46\x86\x7d\xc9\xc8\x70\x0c\x29\x63\xc7\x8b\x8d\x0c\x59\x30\x8b\x3e\xc6\x7d\x51\x8d\x0c\x3b\x92\x91\x21\x8b\x6e\x81\x99\x38\x1d\x0a\xcb\x09\xe8\x77\xd9\xc8\x90\x82\x9d\xa0\x02\x76\xbb\x9f\x1c\x33\x52\x23\x84\xa6\xa2\xd8\x5a\xfd\x09\x30\x9a\x0b\xcb\xe7\x06\x83\xe8\xde\x3b\x72\xd0\x24\x65\x93\xdd\x5a\xea\x92\xeb\x14\xa3\x58\xad\x3d\x7b\x32\xa5\x01\x39\x51\x16\x10\xcc\x17\x74\xe6\x68\x5f\xac\x49\x4e\xac\x7f\xe8\x68\x88\x1c\x3a\x97\x3d\xa0\x85\xec\xe4\x6a\x76\x1d\xcf\xb6\x83\xc6\x24\x94\xc5\x77\x12\xb1\x46\x3c\x6e\x1f\xd9\xc3\x88\x4e\x26\xfb\x48\x3e\xc2\x5f\xcb\xd2\xa1\x2a\x46\x5d\x1e\xea\xcd\x24\xb7\x7b\x9a\x49\x26\x2d\x7e\x92\x66\x92\x73\xd5\x4c\xb2\x9f\x32\x93\x1c\x9b\xb7\x4e\x52\x06\x21\x7c\x7b\x91\x0e\x6e\x8f\x07\xdd\x1b\x01\xab\xba\xab\xdd\x1d\x41\xe6\xee\xe8\x39\xe2\xfd\x55\x97\x6e\x5a\x9d\xb1\x5e\x4f\xb1\xe1\x73\x44\x32\xdb\x18\xa9\x6d\xd0\x83\x9d\x6a\x8b\xed\x15\xaf\x3d\xcb\xe3\x46\xb6\xf0\xb6\xd9\xe1\x7b\x84\xf6\xa8\xd1\x23\xf4\x2f\x1d\x6d\xa3\x4b\x9d\x6e\x5e\xb5\x49\xff\x9a\x48\xb3\xd0\x08\xe4\x39\x11\xdf\x25\x60\xf8\x3a\x49\xbe\xa2\xf8\xe2\xeb\xe4\x9c\x6c\x49\xe1\x8b\xe6\x5c\xdb\x45\xce\x43\xef\x6b\xde\x28\x48\x7c\xc7\x91\x4c\x15\x23\xb2\x1f\x4f\xc9\x7d\x8d\x1f\x17\x7a\xe3\x47\x4f\x35\x7e\xdc\x26\x05\x9f\x69\x9b\x47\xad\xf4\x93\x1b\x25\xee\x19\xe5\x29\xb2\x73\xec\x9b\xed\x1c\x07\x3a\x3b\xc7\x61\xc2\xce\xf1\x58\x1b\x14\x6a\x64\x12\xaa\x8e\x99\xd1\x62\x64\xee\x78\x58\x43\x63\xc7\x5a\x64\xec\x58\x17\xc6\x8e\xa2\x3c\xbd\x04\x11\x7b\xc0\x4a\x44\xb6\x8f\x8a\xfc\x93\x77\xef\x4b\x2f\x5c\x23\xd1\x10\x9b\x36\x27\x70\x45\x59\x06\x91\x1b\x53\x7c\xa9\x84\x41\x64\x64\x32\x39\x4b\x19\x44\x0e\xbe\x21\x02\x54\x21\x93\x47\x73\x10\xa8\xad\x56\x26\xbb\x26\x1b\x84\x27\x68\x8e\xd2\x94\x3c\xe5\x2b\xf7\xf8\xe4\x9a\xf8\x6a\x05\x26\xbb\xdb\x91\xd3\xcc\x6a\x11\x0e\x22\xae\x67\xaf\xca\xea\x3e\x3a\x72\x35\x80\x5e\xdc\x3c\x32\x84\x57\xe4\xa6\x7b\x67\xb7\x13\x22\xe5\x7b\xc5\xb0\x1a\x44\x26\x97\xd1\x6d\xe5\xe2\xcf\x6f\x0f\x4a\x35\x50\x4d\x30\x25\x81\xf7\x1a\x1e\x28\xf5\x4d\x23\x44\x71\x3b\x88\x9e\x21\x58\x54\xca\x2c\xb2\x2f\x45\x90\x1a\x24\xab\x7d\x5c\x01\xb2\x51\xa2\x9b\x2d\x40\x36\x9a\x56\xe6\xdb\x48\x66\x9a\x57\x66\xda\x48\x66\x5a\x57\x66\xda\x68\x19\xad\x2b\x8b\xd8\x48\x1a\xfd\x9e\x65\xdb\x48\x1a\x4d\x2b\xf3\x6c\x24\x07\x8f\x68\x23\x39\xb8\x9f\x8d\xe4\xe0\x4f\xb0\x91\xd4\xb4\x59\xc0\x46\x52\x27\x96\x36\x4b\xfd\xe9\x2b\x74\x9d\x9f\x2d\xf5\xe7\x19\x20\x63\xbe\xd4\x5f\xe4\x21\xc3\x4c\xa9\xff\xb0\xa8\xd4\x7f\x93\x1e\xd0\xc6\x71\x89\x10\x2d\x6f\x14\xa9\xff\x46\x09\x44\xb5\x51\x6c\x1a\x37\x0f\x17\x88\xaa\x17\x05\xa2\xba\x57\x4c\x2a\xbd\xc5\x72\xc6\x1d\xbb\xbf\xc5\xa4\xc1\x28\x13\x25\x44\x41\xd2\x5a\x12\xc6\x00\xb5\xff\x1c\xce\xc2\x49\xd8\xc7\x84\x07\x53\x19\x7c\x1e\x2d\xe7\xfb\x84\xd3\x5e\xc5\x87\x47\x42\x0b\x00\x6f\xa2\x7c\x6f\x85\xcd\xa3\xe7\x94\xe1\xde\x02\x5a\x1f\xdd\x0e\x38\x5e\xab\xde\xa8\xd4\x49\xdb\xf9\xf5\xe9\x33\x7e\x7f\x96\x3e\x94\xca\xd5\x17\x4f\x7c\x16\x17\xaa\x5c\x3a\xfd\x8e\x7c\x77\x50\x83\xff\x4a\x65\xaf\x5c\x82\x7f\xbf\x8b\xde\x5a\xed\xf2\x77\x76\xb9\xf4\x33\xfc\x3a\x7e\xd2\xae\xe0\xef\x54\xee\x28\x33\xe4\x28\x97\xfe\x05\x95\x1f\xcb\xe5\xff\x2e\x95\xc7\xdf\xf0\xfe\xb9\xf9\xfd\x2e\x1a\xcf\x17\x98\x91\x65\x35\x18\x4f\x17\xc0\x7b\xdc\xdd\x2d\x45\x74\x89\x37\x40\x77\x7a\x5c\x6c\x1d\xbd\x6f\x05\x11\x7f\xdc\x78\x73\x6d\x27\xa6\x29\x9a\x98\xc0\x72\x11\x65\x52\x91\xbd\x4a\x51\x39\xba\x78\xac\x5f\x57\x30\x0f\x86\x65\x30\x59\x11\x54\x79\x78\x50\x45\x82\x5b\x3b\xf1\x5a\xb5\x86\x47\xdd\x70\xeb\x4b\xb1\xa5\x2b\xf9\xc7\xe7\xed\xa4\x2a\xf2\xa1\x22\xf4\x24\x13\xcf\xc4\x8f\x30\x13\x6f\x9c\x78\xac\x48\xf5\x36\xa2\xf9\xc0\x8f\xac\x9d\x07\x29\xc7\xbb\xaa\x37\xa3\x4c\x1b\x4b\x69\xf8\x84\x3e\x37\x96\xb0\xa0\xbf\xd0\x48\xe6\x4c\x54\xf9\x73\x24\xaa\xfc\x45\x88\x2a\x57\x05\x44\x95\xe7\x45\x44\x95\x2b\x59\x54\x79\x74\x44\x1f\x3d\x77\xb6\xa3\xee\xb1\xfe\xf0\xe6\x0f\xa5\xf6\x9b\x6c\x71\xb4\x3d\x45\x92\xd7\x09\xfd\x65\xe4\xa4\x58\x15\x9f\xfe\x4b\x84\x9d\xf9\x97\x81\x40\xa6\x02\x24\x37\x16\x20\xcd\x1b\x91\x1a\x28\x4b\x76\x30\x62\x6e\x44\x20\xe5\xc4\xf1\x61\x69\x62\xf0\x11\x91\xf2\x3d\xa4\xd4\x29\x15\x6c\x37\xae\xbe\xf2\x5a\xaf\xae\x77\xd7\xc8\xca\x19\xbb\x9e\x16\xfd\xfe\x95\x1a\x42\xf3\x79\x68\x29\x35\x35\xfe\x6a\x1a\x0e\xc2\x4f\x1a\x0c\x85\x42\x24\xb0\x62\x43\x81\x2e\x92\xfb\x0d\x7a\x90\x1a\xf4\x40\x37\x68\xd8\x90\x4e\x34\xef\xa3\x48\x70\xd1\x18\xc4\x3a\xb0\x49\x52\xb2\x3b\x89\x24\xbb\x93\x2c\xe9\xf4\xcf\x54\x3a\xbd\x52\x44\xbb\xbf\xa0\x68\x77\x22\x36\xd3\x55\x6c\xa3\x84\x5d\xb4\x89\x64\x4a\x85\x3d\xb4\x21\x29\xf1\x0d\x8c\x8e\xe9\xa2\x9b\xf7\x3d\x97\x10\x4f\x52\xde\xa4\x52\x59\x46\x78\xb9\x66\x67\x19\xa4\x7a\x10\xaf\x82\x7d\xe4\xea\x9d\x94\x5c\x7d\xca\xa7\xb5\x23\xa6\x75\x1a\x4d\xeb\x34\x4b\x60\xfe\x0b\x0a\xcc\xd5\x59\xfd\x19\x67\xf5\x86\xd7\xd7\x15\xf5\xdd\x44\xf5\xdd\xec\x57\x5f\xb4\x1e\x6a\x0d\x56\xb5\x71\x06\xb6\x75\x39\x2e\x79\x42\xf3\x18\x55\x53\x6f\x64\xd6\x71\x9c\x51\xc7\x5f\x23\xa9\xd0\xa1\xba\xc3\xb0\xce\xdc\x28\x8d\xf1\xf5\x23\x94\x56\xc5\x46\x92\xbd\x24\xa6\x45\x07\x93\x5d\xcd\x0d\x13\x05\xff\x94\x6b\xa7\xf1\x13\x3b\x49\x7f\x36\x61\x0c\xb6\xe4\x27\x74\x5b\xfb\x8b\x51\xe7\x78\x4b\x33\x54\xac\xcb\xd6\x6b\xfc\x12\xbf\x3a\xaf\x2b\x1b\x6a\x2c\xb2\xe1\xd4\xb3\x09\x7e\xf0\x53\xce\x10\xb4\x70\x83\x0f\x02\x6e\xf0\x03\x5a\x98\xa4\xe0\x06\xff\xb4\x56\x32\xdc\xe0\x43\x2c\x96\x48\xde\x49\x26\xb8\xc1\x47\x46\x76\xfc\xd6\xfc\x28\xe0\x06\xbf\xa1\x62\xe7\x83\xfd\xf1\xea\xb7\x6b\xe7\x03\xfc\x93\x82\x1b\x60\x62\x0c\x37\xc0\x27\x06\x37\x58\xc1\x85\x19\xad\xb0\xd5\x83\xc2\x0d\x7e\x42\xb8\xc1\x4f\xb9\x70\x03\xfa\x69\xff\xe5\x64\xb4\x7d\x28\x4b\x4e\x5d\x76\xb7\x92\xbf\xe6\x94\xa0\xb9\xe0\x68\x1f\xc9\x4e\x8a\x43\x7e\x42\xa0\x24\x73\x14\x9b\xfa\x74\x9d\x41\xfc\xd0\x73\xc6\xf1\x43\xdf\x19\xaa\xe8\x87\xdf\xf7\xed\x68\x8e\xc6\x64\x6e\x24\x43\xbe\x6e\x1a\xa7\xcc\x66\x7d\xdb\x38\x63\x84\x08\x15\xe1\xba\x5e\xe1\x2e\x1c\x3e\x52\x1f\x9a\xe2\x60\xb9\xaa\x91\x9f\xaf\x29\x47\xc8\xa3\xb5\x45\xa1\xda\xe0\xd7\x38\x98\x41\x96\xdf\x45\x88\x36\xd7\x43\xdf\x9e\x7a\xb0\x6b\x14\xbc\x8d\x55\xc8\xe8\x26\xcf\xf9\x29\x13\x68\xc2\xb9\x9d\x08\x6a\xb2\x82\x9e\xf8\x9e\xe3\x79\xf7\x04\x9b\xc4\xf5\xc9\x70\x93\x36\xad\x51\x06\x9c\xf8\x5e\x71\x30\x07\x1d\x49\xe0\x39\x79\x65\xe8\xf9\x89\x18\xd9\x9c\x7c\x32\x52\x25\x2f\xef\xb6\xbe\x4f\xe6\xe3\x3d\x32\x4b\x5e\xac\xf3\xb2\x4a\x74\x22\x9d\x8b\x4e\xfe\x5c\x50\x31\x0c\xb5\xfe\x87\x13\xaa\xb3\xc7\x84\xe4\xe5\x55\x26\x24\x37\xf3\xf1\x1e\x99\xa5\x09\xc9\xcb\x2a\xa3\x82\x72\xab\x45\x5e\xea\xcc\xf5\x87\x68\x14\x44\xf5\x07\x85\xa6\x83\x16\xc3\x60\x7a\x5c\x05\xe8\x39\x8b\x2a\x35\xf9\x05\x42\xe8\xe7\xa7\xc7\x8d\x9f\x49\x4f\x4e\xea\x7a\x8d\x5a\x73\xc1\x39\xa5\xae\x97\xba\xdb\x35\x68\x20\xd3\x45\x05\x9b\x39\x04\x7e\xb4\x3f\x71\x47\xef\x82\xad\x13\x29\xc7\x95\xe4\x16\x25\xe5\x1b\x4a\x1a\xa1\x69\x6a\xbe\xb2\x45\x8f\xaf\xd6\xa7\xc6\x67\xea\x5d\x95\x5f\xb9\x0b\x54\xbe\x51\x04\xd2\x42\x46\x20\xd1\x34\x29\x29\x9f\x1a\x78\x9d\x3d\xd2\x6c\xd2\xaa\xe7\x51\x31\x43\x65\x1d\x41\x8a\x76\x70\x4c\x64\x97\x59\xc7\x48\xa4\xb8\x58\xb2\x0f\xd1\xea\x17\x94\x20\x0a\xe7\x47\x2e\x50\x82\x97\xad\x12\x12\x44\x7d\x77\x84\xb1\xb0\x42\x6a\x28\x3a\x4e\x31\xb8\xbf\xfe\x91\xfc\xf5\xf0\x8f\x6f\x3e\xc5\x5f\xf7\x53\x0c\x36\x9f\xc2\x3c\x16\x3b\xc9\xed\x0e\x32\x2b\xda\x93\xe1\x85\x3b\xd2\xf4\x5d\xf3\x18\x25\xeb\x17\x58\x1e\xdc\x13\x03\xa5\x52\x6d\xb6\x50\xfa\x3a\xd7\xc0\x63\xec\xb7\x26\x7d\x68\x93\x57\xb0\x2b\x42\xce\xf7\x84\x11\x27\x14\xee\xcb\xb0\xfe\xaa\xe1\x7f\xe4\x89\xd9\x87\x07\xec\xa5\x78\xc0\x82\x15\xa7\x07\x18\xc2\xf2\x7b\x09\x23\x9c\x71\x92\xae\x27\x98\xbe\x59\x34\xd4\xe8\x57\xe3\x57\xe0\xf0\x52\xec\xe2\x9c\x97\xec\x8b\x92\xf3\xa8\xe4\xdc\x54\x32\x8f\x31\x94\xfb\xbf\x7d\x56\x94\x35\xbc\x87\xb3\xfa\xac\x76\x8b\xb0\x93\x45\xd8\xc7\x20\x9f\x7d\x54\xda\x35\x32\x90\xf4\x83\xcd\x8a\x77\x3a\x5d\x78\x6e\xa3\xd1\xd6\x06\xfd\xec\xa3\xf2\x94\xdd\x70\xe4\x47\x9b\xbc\x39\x3a\x92\x04\xb8\xf4\x40\x18\xa6\xf6\x71\xea\x1e\x55\xe8\xca\x88\x80\x7c\x23\x09\x83\x51\xf0\x32\xf2\x9c\xa1\x96\x98\x6c\x8e\x3c\x7d\x74\x52\x71\x13\x2b\x92\xdc\x44\xc8\xd2\x5a\x12\x93\xfb\x2b\xb6\x94\x5d\x5f\x4a\xc6\x9b\x53\x21\x9d\x87\x71\x6a\x1e\x36\xd5\x98\x3a\x60\xf3\xba\xb4\x9b\x63\x4f\x9e\x0d\xa5\x79\xa9\x87\x6a\x2e\x54\x06\xc1\x76\x28\x19\x6c\x1d\xdb\x25\xf2\x96\x23\x52\xf6\x07\x27\x7e\x88\xc0\x89\xef\x14\x70\xe2\x87\x04\x38\xf1\xdd\x37\x3a\x18\x5f\xed\x8f\xb1\xf9\x90\x8f\xb1\x21\x3f\xd2\x7f\x13\x71\x0d\x49\x8f\xf4\x65\xa4\x4b\xda\xc7\x37\x4f\x19\x19\x3c\x5d\x5a\x2c\xe2\xbe\xe1\xd5\x24\x05\xc2\x09\x53\x29\xd3\x54\xca\x4d\x2a\x65\x96\x4a\x99\xa7\x52\x16\x1a\x78\xcf\xd2\xe1\xd6\x9f\x4c\x19\x60\xd3\x40\x83\x29\x50\xcf\x3a\x01\xea\x79\x16\x81\x7a\x9e\x49\xa0\x9e\x8d\x6a\x5d\x19\x67\x3a\x96\x32\x6d\x19\x40\xe7\x96\xfd\xd1\x82\x44\xa8\x0d\xe5\x99\xd1\x86\xf2\xdc\x84\x1d\xba\x40\x8c\xd0\x25\xfe\xf3\x12\x31\x42\xaf\xf0\xd7\x6b\xe7\x45\x8d\xbc\x61\x8d\xbd\x65\x7f\xde\xa9\xd8\x20\x7e\x20\x65\xe0\x80\x6c\xf2\xde\xa9\x91\x0f\x29\xc8\xd1\x47\x56\xdf\x27\xa7\x74\x60\xe1\xf8\x0e\x70\x9e\xed\x12\xf9\x8c\x09\x74\x0e\x78\x4a\x73\x50\x15\x96\x6b\xd4\x7b\xe9\x30\xa5\x57\x9c\x64\xc3\x8a\x5e\xa0\xc4\x55\xe4\xe0\x60\xa2\x9b\x28\x81\x1f\x31\x24\xcc\xad\x64\x96\xac\x64\x9e\xaa\x64\x95\x74\xd4\x5e\x2b\x88\x3d\x9a\x18\xb1\x47\xff\x7c\x1c\x80\xd1\x0f\x7f\x2c\xc0\x28\x2b\x7a\x86\x11\x60\xb4\x8a\xe5\x8e\x40\x9e\x15\x73\x79\x7f\xa3\xc5\x7f\x15\x02\x2a\x65\x47\xf8\xd0\x02\x95\x56\x2a\x50\x69\x74\x3f\xc7\xf7\x74\x5c\x8e\xa7\xb8\xbc\x8f\xdd\xe1\xcb\x80\x69\x83\xf3\xfb\x95\x12\x2b\xa0\xc8\x34\x4d\x33\xa7\x49\x99\x96\xac\x41\x7d\xf3\xb4\x18\x5d\xe8\xaf\xee\xeb\x42\x5f\x42\x75\xbd\x8b\x21\x62\x8b\x08\x37\x36\x10\xbf\x8e\x9d\x21\xfc\xa4\x2e\xf6\x47\xfc\xc7\x31\xf5\x83\xc6\xa0\x64\x13\xfc\x75\x4c\x7f\x86\x88\x2a\xab\xd3\x9f\x53\xfc\xc9\x52\x6f\xf0\xe7\x33\xfa\x13\xcd\xb0\xb7\xcf\xe9\xcf\xb9\x04\x31\x5b\x3d\x3a\xaa\x4c\xef\x7a\x3b\x17\x55\x76\x9b\x2e\x76\x5b\x10\x55\x76\x91\x2e\x7a\x41\x8b\xd2\x9b\xe0\x72\x93\x85\x6e\x7a\x93\x2e\xfb\xa6\x00\xc0\xeb\x6d\xba\xd8\x5b\x1e\xd6\xd5\x5f\xce\xd9\x51\x6b\x2a\x7b\x99\x2e\x7b\x19\x97\x7d\x9d\x39\x4b\xaf\xd3\x65\x5f\xc7\x65\x11\x0e\x8b\x5f\xdc\x18\x8d\xf6\x55\xba\xf8\xab\x74\x71\x63\x54\xda\x97\xe9\xe2\x2f\x69\x71\xb6\xa2\xdf\xc3\x06\xc0\xf2\xaf\xfb\xe6\xf9\xfe\x94\xae\xe2\x93\x54\xc5\x0f\x14\x45\x94\x53\xc7\xe7\x74\x1d\x9f\x0b\xa1\xeb\x56\x8f\x88\xae\x5b\xdd\x0f\x5d\xb7\xfa\x13\xd0\x75\x9a\x36\x0b\xa0\xeb\x74\x71\x1f\xcc\xe8\x3a\xfa\x8a\xac\xf3\xd0\x75\x3c\x03\x59\x17\x40\xd7\x89\x3c\x64\x9d\x89\xae\x5b\x17\x45\xd7\xbd\x4f\x0f\xe8\x3d\x73\x4a\x90\x05\x94\x3b\x4f\x7f\x9d\x73\x2d\x50\x6e\xc1\x85\x6f\xe7\x99\xa6\xf4\xa7\xe9\x4e\x9c\x3a\x2e\x19\x50\x53\x7a\xa0\x2b\xe9\x9f\x11\xfb\x33\xce\xb5\xaf\x3f\x4b\xd7\x76\x46\x6b\xdb\xb2\xda\xb6\xac\xb6\x2d\xab\x8d\x19\xdd\x67\xc1\xdd\x06\x85\xe1\x6e\xbf\xf4\x17\xbd\x97\x78\x88\x14\x06\xbc\x85\x31\x2a\x38\x81\xe4\x0a\x25\xc0\xdb\x26\x07\xf0\xf6\xf6\x7f\x18\xe0\xed\x12\x66\x64\x12\x03\xde\x26\x42\xc6\xb1\xb6\xc9\x0f\x5c\xf4\x31\xd1\xe1\xbc\xd6\xf9\x78\x37\x5f\xc6\xbb\xb5\x9d\xd7\x7f\x3a\xc8\xad\x8d\x7e\xa0\x14\x90\xdb\x4b\x8c\xf0\xeb\x4c\x54\x90\x5b\x34\x07\x8c\xb9\x70\x1d\xed\x04\x48\xb9\xa8\xb2\x3c\x32\xaa\xc3\xc1\x57\x68\x07\xbe\x77\xea\x36\x10\x1b\x09\x18\x9c\xcb\x61\x70\x13\x58\xe8\x97\x96\xc0\x81\x7d\x2c\x8c\xa5\x0a\x8b\x06\xb5\x53\xb8\x1c\x4f\x41\x89\x79\x14\x30\x45\x01\x56\x1e\x03\x58\x71\x01\xb5\x67\x02\x4f\xc9\x9e\x95\xba\x94\x0a\xc7\x94\x13\xc7\xa5\xe0\xa9\x38\xe5\x7b\xc7\x8d\xc1\x53\x26\x84\xd1\x6d\x64\xa6\x4a\x4c\xe3\xce\x47\x32\xdd\xc6\xa1\x69\x4d\x95\x18\x63\x64\xa6\x2a\x41\xd7\x1c\xf8\x21\x5e\xe5\xe2\x4d\x5e\x09\x73\x67\x03\xde\x64\x4e\x5e\x91\xa9\x4d\xde\x18\x35\x4c\x0b\x9a\xa1\xb2\x24\x6f\x9d\x65\xe5\x86\x22\x4d\x6e\x72\x90\x26\xaf\x72\x7a\xaf\x45\x9a\x9c\x0a\xa4\xc9\x05\x1c\x60\x69\xa4\xc9\x39\x4a\xc9\x63\xa4\xc9\x69\xcc\x9f\x86\x05\x91\x26\x67\x6c\xc3\xbf\x6b\x9e\x09\xa4\xc9\x3b\x94\xd2\x9d\xda\x67\x57\xef\xae\x9d\x53\xf8\x27\x85\x34\xc1\xc4\x18\x69\x82\x4f\x0c\x69\x12\x1e\x1d\x85\x11\xd2\x24\x63\x81\xdf\x03\x69\xf2\x0a\x91\x26\xaf\x8a\x38\xb6\xe8\xca\x8e\x2d\xba\x31\xce\x23\x70\x7a\xf1\x9b\x0e\x3c\x28\xa0\x8f\xf7\xce\xab\x4c\x24\x82\x7a\x11\x45\xf2\xe4\x10\xf1\x7c\xce\xfb\x7b\xc2\x11\x52\x95\xca\xa8\x84\x8f\x50\xad\x8c\x49\xf8\xb0\x27\x24\xe1\x93\x93\x53\x42\x00\x12\x3e\x15\x57\xbf\xe7\x64\xdd\x16\xcf\x9a\x04\x0d\x7c\xce\xeb\x6d\x0c\x19\xf8\x5c\xbc\xbf\x39\x59\xb7\xc5\xb3\xca\x3a\xfd\x9c\xac\x69\x95\x7e\x91\x1e\x0b\x8d\xfe\x0a\x8d\xcc\xb9\xce\xf5\x75\xf2\x4c\xd4\xe8\xe9\xc3\x58\x4b\x38\x65\x3a\xf3\xb1\xac\x33\xa7\x69\x52\x52\x81\x13\x2d\xb3\xd1\x5c\xbf\x1d\x53\xc9\x6f\xc7\xfb\x1c\xed\xd3\x34\xd6\x96\xc7\xc5\x48\x37\x1a\xbd\xe8\xf5\x1b\xa1\x71\x4e\x9e\x69\x3a\x8d\xf3\xac\x88\xc6\x39\x4c\xf8\xbe\x40\x37\x0b\xdc\x81\x61\x37\xfa\x05\x07\x6b\xb2\x27\x6f\x1f\xbf\x27\x1f\xef\xab\x53\x7e\x03\x93\xc8\x75\xca\x37\xb1\x4e\x99\x4b\x56\xb5\xb5\x7e\x23\x69\x42\x49\x40\xe9\x4a\xfb\x67\xec\x40\xa6\x9f\x74\xf6\xd1\x8f\x14\xaf\xfd\x2c\xed\xf4\x6b\xaa\x9d\x0e\x15\xed\xf4\x1b\x54\xc2\x0e\x92\xf8\xec\x41\x54\xe1\x20\x0b\xf8\xfb\x06\x81\xbf\x6a\x7d\xaf\xb1\xbe\x22\x04\x4b\xde\x8c\xbf\x61\xeb\x75\x92\x52\x5a\x4a\x77\xfe\x4b\x66\x4a\x7e\x74\x24\x91\xe4\xf4\x93\xfc\x90\xf8\x24\x05\x15\x98\x6b\x89\xb8\x47\x05\xe6\x17\xe7\x07\xad\xfa\xf2\xcb\x03\x6a\x2f\xdf\x42\x33\x0f\xa9\xbc\x7c\xcb\x66\xe0\xc7\xc4\x0c\xa4\x55\x97\x13\xbb\xf9\x63\xae\xe6\x12\x7a\xf7\xe3\x7e\x8a\xcb\x8d\x4d\x5e\xa2\x6a\x2e\x19\xd8\x7d\x18\x2d\xa9\xe1\xbe\x6b\xf4\x6d\x7a\x4d\xdd\x17\x40\x91\x06\xd1\xab\xbb\xac\x50\x2b\x31\x44\x64\x94\x44\xe0\x8f\xa2\x51\x8e\xb2\x36\xce\x5b\xc3\xc6\x29\xda\x99\x6d\xaa\x33\xa3\xc7\x9b\xa1\xf1\xfd\xf4\xd0\xa7\x91\x1e\x7a\xab\xe8\xa1\x4f\x13\x0a\xdf\xed\xb7\xe9\xa1\xc3\xfd\xd5\xd0\x09\x9f\x0e\x09\x5d\x73\x4a\xa7\xdc\x4b\xa5\xf4\x53\x5a\xdd\x41\x2a\x65\x98\x4a\x19\xa5\x52\xc6\x1a\x5d\xf0\x24\xa9\x0b\x0e\x75\xba\xe0\x69\x21\x5d\xf0\x4d\x11\x5d\xf0\xcc\xa4\xc9\x9d\x33\xcd\xea\x82\xfd\x59\xa2\x0e\x77\x85\xda\xdc\x28\xa4\x35\xfd\xb3\xdd\x5f\x91\x7b\x4b\xbd\xe3\x9e\xa6\x54\xb9\x67\xb4\xc6\x66\x57\xd1\xd3\xca\x2a\x29\x20\x24\x92\x3a\xdb\x7e\xae\xba\x75\x90\x54\xb7\x0e\x73\x8b\x8c\x92\x45\xc2\x42\xca\xb0\xc1\xfd\x7d\x46\xf4\x8d\x7a\xdb\xf3\xc7\xd1\xdb\x5e\xfc\xb1\x7a\xdb\xee\x7d\x34\x9a\x61\x31\x7d\x6b\x56\xdd\x06\xc5\x62\x68\x74\x0c\xb1\x8d\x75\x7d\xe3\x48\xd7\xd7\x8d\x75\x7d\xb1\x8f\x88\x7e\xe4\x23\x62\x10\xab\xf8\x86\xb1\x5e\x6f\x24\x69\xf0\xc2\x47\xd7\xe0\xe9\x0d\xa8\x73\x35\x78\xfa\x48\xb5\xc5\xf4\x5a\x46\x3f\x0b\xf9\xda\x3f\xa3\xaf\x85\x02\xda\x3f\x63\x2c\xeb\x22\xbe\x21\xf4\xc2\xf6\x5c\xd5\xa1\xde\xa8\xbf\x80\xf6\x2a\x7c\x44\xed\x55\x78\x3f\xed\x55\xf8\x27\x68\xaf\x34\x6d\x16\xd0\x5e\xe9\xfc\x87\x98\xb5\x57\xf4\x15\xb0\xe9\x39\xda\x2b\x9e\x81\x4c\x0b\x68\xaf\x44\x1e\x32\xcd\xd4\x5e\x4d\x0b\xc5\x88\x4a\x7a\x51\xf0\xa8\x17\x05\x8d\x12\x6a\xcc\xb9\xe0\x99\x5d\xcc\x51\x77\x57\x89\x16\x90\xfc\x96\xe8\x61\x5c\xc9\xe0\x46\xd7\x68\x94\x80\xca\xae\x1f\xa3\xfb\xc7\x18\x65\xac\x2a\x65\xd2\xb5\xa3\x66\x60\xaa\x30\x25\x01\xd5\x60\xf9\xed\x0c\xaa\xdb\xec\x76\xd4\x0c\x4c\x3b\x96\x6c\x27\x4f\x91\xa8\x87\x2e\x20\x76\x27\x16\x1c\xa3\x97\xb3\xf8\x29\x4b\x23\x48\x65\xfb\xba\x89\xdf\xb0\xe9\xce\xd3\x01\x76\x11\x95\xa3\x2b\xbf\x65\xe5\xf3\xb5\x7e\xdd\x42\x5a\xbf\x31\x9c\x8f\xfd\x33\x77\x56\x44\xd7\x77\x11\x1f\x9a\x91\x5b\xec\x0b\x7d\x3c\xb1\x0b\x67\x58\x19\xb0\x78\x62\x03\xbe\xbd\x2e\x9d\x11\xfc\x46\xc1\xfd\x40\x6c\xa2\x97\xb9\x7a\x83\x97\x76\x13\x98\x79\x2f\xf6\xe3\xb6\x76\x22\xb3\x00\x0f\xad\x05\xb4\xe6\x76\x92\xb1\x9d\x5b\xdd\xc0\x24\xd7\x84\x27\x3b\x01\x7e\x22\xc8\xb3\x36\xaa\xb5\x3a\x5a\xdf\x01\x5f\xbf\x80\xaa\x3d\xec\xcd\xc8\xdd\x22\x89\x00\x04\xa8\x3f\x04\x1e\x3f\xec\x74\x70\x9c\x4b\x8e\x7d\x9a\x67\x49\xd7\x69\x50\x8d\x1b\xdb\x3a\x8c\xbb\xbb\x6e\xad\x1b\x68\xa4\xe7\xe9\xe8\x24\x2f\x42\x68\xcd\xd3\xaf\x7d\x8c\x7e\xc7\x81\x5a\xc0\xbd\x70\x5b\x1e\x1a\x59\x6a\x47\xbb\x6b\x1e\x3d\x11\x3e\x10\x1d\x8c\x20\x59\x6b\x7a\xa9\xd9\x11\x11\xe0\xb9\x4b\x42\x60\xc8\xbc\x2a\x4e\x88\xe2\xe3\x12\x7b\xbd\xfd\xbe\xd6\xc2\xdf\x75\x8c\x01\x51\x71\x58\x2e\xbb\xc1\x92\xd8\x53\xb9\x4d\xda\x65\xf1\x66\x27\x68\xd4\x57\xe8\xcf\x33\x68\x5d\x5d\x37\xd2\xad\xef\x61\x2a\x39\x15\xa6\x92\x37\xfc\x47\x0d\xbe\xe0\xb6\x46\xb6\x75\xfc\x5b\x67\xa6\x93\xe3\xc8\x56\xf2\xee\x2e\x32\x92\x7c\x95\x61\xa2\x19\x5b\x47\x9e\xb9\x93\x36\x7c\xd3\xbb\xbb\xab\x1a\xb9\xb8\x26\xb7\x92\x1f\x81\x80\x56\x96\xb4\xbd\x34\x57\x8b\x67\xff\xf6\xa4\x86\xff\xb2\xce\x95\xe1\x1f\xfc\xf1\x1f\xe8\x40\x93\x19\x6c\xce\xec\xc8\x2c\xb3\x0b\x6d\x5e\x12\xf4\x4f\x30\x96\xbd\x88\xa2\xdb\x53\xd9\x7d\xe8\xd1\x51\xf4\xa8\xe4\x6b\x5d\x29\x8f\x15\x58\xc9\x4f\x94\x14\xa2\x54\x53\x4e\xbc\xaf\x5f\x5f\x37\xae\x2a\x75\x82\xfe\x49\x27\x89\xf6\x27\x6a\xfb\xd1\xe3\x44\x6d\x5f\x79\xa4\xf5\x2b\x29\x44\xa9\xa6\x92\x78\x2f\xb7\xdf\x73\x7a\x77\x77\x63\xe0\xa0\xfb\x77\x77\x13\xae\x25\x7c\x69\x54\x0e\xd1\xf3\xca\x93\x6c\x54\x31\x32\xe0\x1b\xe7\xf5\x3d\x54\x42\x71\x55\xe4\xad\xf3\x26\x19\x1d\xf0\x9d\x94\xd4\xa5\x58\xe3\xd7\x8a\x7e\xe8\x5d\xc1\xe8\x80\xaf\x73\x84\xf2\x83\x58\x28\x3f\x88\x85\xf2\x6f\xf7\x8b\xd7\x17\xa6\x42\xf5\xbd\x36\x86\xea\x0b\x0d\x51\xfa\x2e\x92\x92\xbe\xcb\x58\xa3\x20\x85\xd9\x9b\xeb\xc3\xec\x85\x4a\x84\xbd\x0f\xd2\x64\x3d\x58\x84\x3d\x89\x39\xf6\x76\xa8\xa0\xbb\x6f\x7c\x3d\x4d\x90\x3c\xda\xeb\x8f\xce\x99\x2c\x6c\xfb\xa0\x89\x1d\x86\x13\xc7\x8d\xe0\x60\x92\x4b\x62\x09\x5d\x42\xc6\x12\xf3\x34\x32\xee\x53\x4c\x31\xd9\xda\x92\x4c\x56\x33\xb4\xbe\x45\x4f\x8c\x5a\xa3\x66\xdf\xdd\xd5\x76\xc9\xc9\xaf\x49\xe6\xfc\x1f\x81\xf2\x86\x7b\xe9\xe8\x88\xff\x48\x9c\x96\x2c\xa2\xb0\xf7\xc4\xda\x3e\xb5\xce\xcb\x75\xdb\xae\x78\x82\xc9\xf6\xa9\x89\x45\x6e\xb0\xbf\x68\xc1\x3e\x76\x6c\xbf\xd5\x3e\xb1\xfd\x44\x66\xf4\xfe\xb0\x5f\xe4\xbe\xea\xdf\x5e\xc4\x4a\x59\xd3\xd7\x33\x2e\x3a\x20\x38\xa2\x2b\xbc\xb5\xae\x26\x1c\xe4\xec\x50\x83\x9b\x08\xa8\x88\x29\x89\xb5\xa8\x93\xdb\x6b\x47\xc9\x6e\x36\xb8\x67\xb9\xd5\xf3\xc1\x24\xe8\xba\xd4\x3f\x7d\x43\xa4\x30\x59\x07\xa4\xec\x24\x91\xbf\x7c\xdf\x4b\x51\xbf\x16\x88\xd6\x81\xa3\x3e\xba\xde\x2c\xfb\xa9\x17\xeb\xfd\xbf\x6d\x45\x2a\xe7\x85\xda\x06\x94\xad\x37\xbc\x08\x57\x70\x8f\x18\xe8\x63\x8b\xdd\xf6\x36\x33\x8c\xa3\xf3\x6c\x5c\x51\x12\xae\x66\x45\x67\x20\x6f\x55\xe9\x0b\xa0\x74\x68\xac\x09\x3b\x45\xfb\x98\x84\x4e\x25\xf7\xc2\x21\x0d\x60\x9a\x14\x5c\x59\x5f\x71\x5d\x35\x5c\xe0\xd3\xd0\x9f\xb2\xc7\x59\xc0\x14\x0e\x4b\x1a\x19\x25\x9b\xa4\xbe\x28\xee\x92\x8b\x75\xa5\x9e\xea\xca\x72\xf1\xed\x3d\x49\xb8\xa4\xa7\x5d\x51\x9b\xa1\xeb\xff\x5b\xda\xf1\x13\xfe\xbb\xd5\x36\x98\x7f\xe9\x7b\xd5\x4f\x22\x0c\xff\x1c\x6e\xd5\xcf\x33\x38\x1c\xba\x8c\x71\x13\x4d\xb7\xa3\x38\xe7\x86\xd6\x2f\xbc\xd1\x63\x75\x00\xf1\x1a\x8f\x73\x34\x7c\xd3\x96\x23\x1b\xe0\x83\xfc\xbb\x3b\x0b\xee\x13\x95\xd0\x8d\xc4\xc6\x35\x54\x9a\x67\xed\xcc\xf8\x2c\x82\x09\x98\x75\x3d\x6b\xc3\xda\x80\xf3\x76\x36\x84\xfd\xe1\x9b\x55\xf9\x5e\x8e\xf2\xde\x07\x6a\x6f\x67\x5f\xb5\xaf\x6d\xa0\x94\xbe\x00\x83\x3a\xe9\x5a\x79\xfb\xfe\x8f\xef\x8e\x40\xd8\x7c\x4a\xc5\x7b\x3c\x8b\x29\x06\x89\x5a\x40\xd5\x07\x52\x0b\xa9\xbb\x3d\x3e\xb2\xfc\x27\xdb\xa7\x32\xc3\x27\xce\xf3\xe6\xa2\xf5\x39\xf3\x4c\x47\xf9\xf8\xb6\x6e\xa7\x0e\x73\x4d\x56\xd6\x1f\x77\x13\x63\x32\x69\x61\x64\x63\x6a\x76\x85\xfe\xae\xc1\xa7\x97\x2a\xdb\xa8\x21\xf5\x58\x35\xf1\xc5\xa1\xbb\x27\xec\xc6\x67\xdd\x15\x26\x11\x13\x8c\xfc\xc8\xbb\xc1\xb4\x77\x50\x74\xfd\xe8\xa6\x44\xb7\xaf\x50\x83\xd4\xc0\x7f\x60\x78\x2c\xd1\xfe\xbe\x4e\x53\x2b\xf5\x46\x94\xa4\xbb\x0c\xb5\xf5\xea\x66\x90\xd7\x51\xc1\x4a\x71\xf2\x68\x65\xd4\x23\x12\x8f\xa2\xd9\x07\x86\x8b\xff\xf4\x28\x2a\x54\xfa\xce\xb0\x19\xcf\x9d\xf4\x77\xc7\xf3\xe3\x4c\x76\x3b\x2f\x16\x95\xc9\xeb\xbc\x64\x30\x9b\x17\x68\x73\x48\x03\x6d\x8e\x68\xa0\xcd\x31\x15\xcf\xa0\x3a\xbb\x1a\xce\xda\xe8\x43\x24\xd2\x46\xd2\x44\x16\xdb\x92\x2a\x24\x25\x27\x7b\xf5\xe0\xf9\x13\xfa\x08\x9f\x06\x18\x3e\x0c\x7f\x30\x35\x9a\x93\xde\x18\xcd\x49\x67\x0e\x72\x91\x73\x54\x2f\x2e\xd0\x6c\x74\xe9\x94\x6e\x83\x59\x58\xa2\x96\xb0\x5a\xed\xe4\x1a\xb3\x45\x3a\x48\x1c\xc0\xad\x53\xad\x93\x53\x55\x1d\xc9\x62\x59\xa8\x11\x37\x13\x8f\xe2\xdc\x2f\x1a\x92\x33\x1d\xc5\x45\xf1\x50\x7f\xa6\xf5\xf1\x7e\x0a\x7b\x9e\x9c\x3b\x35\x41\xaa\x4b\x1a\xa7\xd3\x47\xd7\x0d\xe9\x43\xff\xe5\xea\x86\xf4\x81\xff\xb2\xc4\xa0\x46\x87\xdf\x46\xc1\xa7\xd1\xd1\x37\x03\x93\xee\xed\x05\x7d\x9b\x59\xcc\xe8\x05\x7d\xc3\xc2\xa8\x9a\xca\xb5\xd3\xe5\xda\xac\xb9\xec\x72\x41\xba\x5c\xc0\xda\xfb\x01\x0f\xb2\x7d\x22\x61\xb2\xe6\x32\x8b\x19\x63\x8b\x02\x7d\xe0\x07\x46\x03\x31\xbd\x77\x67\x54\xe3\xa1\x54\xd4\x1c\x5b\xd4\xa8\x3a\xa4\xe5\x3e\x51\x51\xea\xde\xaa\xc3\xbc\xd8\xa2\x46\x35\xa7\xd0\x40\x9b\x0a\xfa\xe9\x82\x3e\x8b\x84\xba\xbf\xe3\xfb\x5e\xbf\x1d\x64\x19\x0b\x1a\x35\x94\x94\xeb\xfe\x82\x7c\xeb\xa4\xbb\xb7\x4d\x65\xb6\xae\x2c\x19\x68\x93\xaa\x49\x8c\xba\x32\xfa\x8a\x0c\xf2\x74\x65\x42\x98\x3f\x28\xa0\x2b\x8b\xc4\xfc\x83\x4c\x5d\xd9\xa0\xa8\xa5\x97\xde\x24\x95\x08\x5d\xc4\x36\xd7\x3b\x7a\x52\xc7\xec\x51\x1d\x73\x5a\xdf\x86\x5a\x67\x77\x76\x9e\x55\x55\x52\xfd\xeb\xa1\xfa\xd7\x6b\x69\x2a\x6b\xe0\x7d\x94\xd0\xd4\xe4\x6a\x63\xee\x11\xa9\xf4\x42\x52\xc9\xc4\x91\x4a\x67\x47\x47\x17\x52\xa4\xd2\xb9\xf4\x68\x8e\x54\x7a\x9b\xab\x96\xb9\x65\x34\xee\x85\xc9\x9c\x63\x44\x6e\x31\x44\xa9\xc6\xdc\x83\x83\x9f\xc7\x34\x43\x56\x88\xd2\xf3\xd6\x6d\x14\xa2\xf4\xd6\x60\xc9\x71\x9e\x65\xc9\xb1\x11\x96\x1c\xaf\xb4\x21\x4a\x5f\xaa\x21\x4a\x37\xfb\x87\x28\xdd\xb2\xd9\x7a\xd3\xdc\x0a\x4b\x8e\x37\x88\x73\xdb\xd8\xdb\xab\x37\xd7\xce\x06\xfe\x49\x59\x72\x60\x62\x6c\xc9\x81\x4f\x8f\x1e\xa2\xf4\x16\x2d\x39\x6e\xbf\x35\x44\xe9\x5b\xe7\x36\x5b\x24\x0f\x8b\x16\xcd\x2b\x18\xc8\x43\x89\x55\xfa\xce\x79\x7b\x5f\xe1\x7c\xb2\x52\x55\x1e\xff\x56\x91\xc7\xc3\x3c\xe6\x88\xe4\x65\x4b\x85\x9c\xac\xdb\xe2\x59\x25\x47\x85\x39\x39\x95\x90\xa4\x39\x79\x71\x2d\xcf\xc2\x91\xa8\xf9\x46\x8a\x2d\x7a\x51\x39\xb3\x28\xd8\xff\x81\xe3\x8b\xe6\x6d\xd6\xcc\x26\x73\xe2\x7b\x5a\x36\xf3\xed\x27\x47\x19\x0d\xd9\xf6\xf9\xe0\x5c\x51\xe3\xba\x69\x95\xde\x85\x41\xfb\xee\xae\xf4\x8a\xfd\x2a\xc5\x77\x78\x50\xe5\xb4\x07\x2a\xc5\x79\x7e\x9e\x02\xf9\xbf\xb0\x5f\x52\xfe\x43\xb9\xc0\x75\x33\x8a\x29\x8a\x46\x06\x0c\x4b\x71\x55\xfa\xcb\xf3\xe7\xcf\xa1\x57\xf2\x9f\xeb\xe4\x20\xd5\xef\xc0\x67\xf6\xc3\x5e\xf1\x54\x85\xbd\xdd\xee\xed\xbd\xc2\xaa\x2e\x8e\x8e\xde\xdf\x33\xac\xea\x85\x70\x31\x16\x44\xe7\x56\x2a\x9c\xa9\x74\xb2\x48\x96\x06\x62\xa9\x45\x86\x18\xaf\xf7\x09\x87\x3a\xb9\x77\x38\x54\xd9\x08\x4b\xeb\x6b\xb0\x78\x34\x54\x38\x0f\x3e\x46\x01\x51\x67\x18\x39\xfe\x7e\xf1\x50\x2f\x34\xf1\x50\x29\x32\xfb\xfd\x03\xc6\x43\x35\xd7\xc5\xe3\xa1\x72\x6d\x86\x21\xdf\xc1\xc9\x41\x37\x65\xc1\x80\x33\xf0\x49\x4e\x43\x76\x9d\x1c\xa8\xae\x30\x25\x55\x0a\x59\xb1\x0d\xf9\xd9\xc9\x95\x1b\xba\x74\x91\x7a\xd8\xf7\x1d\xf9\xa7\xf3\x82\xfc\xe0\xd4\xff\xd6\x54\x1a\x33\x59\xd1\x18\x64\xf2\x9f\x61\x62\xfc\xff\x3c\x76\x9c\x5a\xeb\x9f\x8d\x1f\x04\x8a\xe0\x4b\x4c\x88\x44\x37\x57\x3c\x68\x71\x07\x1d\x74\xe1\x3f\xd6\x1e\x8a\x4a\xd8\x85\xd8\x7c\x9f\x5d\x10\x7f\x7c\x70\x37\x1f\x30\xa6\x78\x81\xae\x2a\x1d\x45\xf2\xc4\xbb\xbb\xfb\xf2\x9f\xc7\x87\xd8\xe1\x1f\x1a\xff\x44\x79\xf6\xf2\xe8\xe8\x53\x66\xf4\x04\xef\x3f\xe3\xd0\x04\x83\x94\x50\xe7\x29\x5b\x69\xb6\x8d\x75\xee\xec\xe4\x5c\x92\x03\xfc\x7c\x9a\x0f\x57\xa3\xe6\x2e\xca\xdc\xd3\x95\x6a\x1c\x56\x69\x16\x2e\xb8\xf7\xd4\x72\xe9\xa0\x46\x4f\x08\x51\x2b\x96\xa9\x00\xc5\xd2\x0b\x67\x25\xb2\x3e\xa9\xb5\x10\xb5\x3d\xc3\x30\x3e\xf4\x02\xce\x58\xa7\x49\xe2\x20\x3d\xbf\xe9\x15\xb7\x9b\x7f\x43\x8c\xdf\xd7\xe9\x18\xbf\x17\xe9\x6d\xf9\x90\x31\x7e\x37\x91\xf9\xc2\xa9\x62\xbe\xb0\xc9\x8e\xf1\xcb\xee\xc9\x64\x9c\x52\x04\xc7\x75\x2c\xc9\xe7\xdd\xd7\xf9\xba\x8f\x72\xa1\x0f\xce\x87\xfc\x23\x1a\xa5\x62\x2e\x65\x29\xe2\x94\x3a\xf3\xf8\x0b\x5c\xac\x3b\x0f\xa2\x2b\xb4\x81\x4f\x07\xd1\xe5\x2a\x5d\xa4\x87\x75\xbb\xe9\xcd\x02\x77\xd8\xa4\x05\xc4\x1d\x2a\x0a\x08\x5e\x5f\x2a\x50\xb3\x77\x1b\xf1\xe4\x48\x17\x2c\xc9\x9a\x8f\x1d\xbe\x0e\xbf\xc9\xaf\xe0\x3d\x62\x77\x6e\xf4\x7e\x05\xf5\x4d\xf1\x81\xd0\xc8\x52\x62\x50\x51\x2a\xd6\x25\xc6\x1c\x25\x92\x4b\x47\xca\x90\xb0\x1e\xb9\xd0\x89\x66\xfd\x62\x51\x41\x05\xd9\xfb\x8d\x91\x41\x93\x69\xdf\x14\x12\x94\x0a\x54\xa3\x00\xa0\x06\xe1\x2b\x0f\x09\xfa\x75\x17\x85\x04\xad\x29\xc2\xdb\x43\x6a\x2a\x52\x27\x6b\xa7\x46\x36\x29\x3b\x8f\xa4\xf7\x41\x45\x62\x5b\x34\x12\xe8\x99\xa3\x91\xd8\xb4\xea\x7f\xaf\xa1\x5c\xfb\x9c\x86\x09\x8d\x3f\x25\x74\x45\xd9\x0a\x24\x37\x82\x68\x15\x41\xec\xec\x48\xc3\x02\xb2\x79\x86\x16\xb9\x22\x85\x1c\x5d\x24\xc3\xa1\xc9\x85\x61\xac\x1d\xf6\xab\x44\xaa\xf5\x4e\x89\x06\x59\xda\xd7\xeb\xda\x43\x07\x27\x85\x43\x8c\xad\x69\x3a\xd1\xf4\xac\x50\x19\x7e\x45\x94\x6d\xa3\x7b\xc7\x3a\x79\xf9\xf0\x86\x29\x91\xc8\xf1\x12\x4d\x54\x5e\xed\x61\xa2\x12\x6f\xea\xcb\xf8\x49\x44\x17\xff\x53\xa3\x9b\xe6\xb9\xe5\x63\xae\xdc\x31\x35\x15\xd6\xdc\xe0\xa5\x6f\xa0\xf7\xaf\xf7\xed\xf1\x51\x33\x6a\x30\xfa\xd7\x1b\x3c\x80\x7f\x3d\xd4\x80\x88\x93\x33\x19\x8f\x55\xb0\x64\xd4\xdc\x46\x17\x9c\x95\x9e\x17\xce\x26\x11\x91\xf5\x71\x15\x2a\x46\xcd\x48\xb6\x42\xc5\xa8\xb5\xc8\x37\x98\x31\xea\x49\xb0\xe8\x39\x9f\xa3\xbd\x05\xd9\x7c\x72\xdf\xbb\x5e\x60\x2e\x9d\x19\xc5\x35\x33\xfe\xab\x59\xb3\x90\x17\xff\xd5\x2c\xe6\x2f\x60\xe3\x63\x74\x66\x98\x6d\xe3\x63\x14\xbc\xcf\x82\xf6\xd2\x0f\x7e\xa5\x94\xe8\xde\x0a\x0d\x46\x7e\x67\xcf\xb0\x51\x5f\x00\x6b\xbb\xdb\x0d\x66\xd9\xa5\xff\x1d\xb7\xf6\xdf\x71\x6b\x1f\x20\x6e\x6d\xd2\x47\x9e\x4b\x7d\xe4\xc9\xc1\x6a\xcf\x95\x60\xb5\xe7\x4a\xb0\xda\x73\x46\x08\xa3\x4a\xe2\x3c\x57\x33\x93\x54\xc3\x7a\x54\x0d\x9b\x11\xb7\x76\xb2\x47\xb0\x5a\xbd\x5a\x32\x83\x3a\x2b\xa0\xff\x09\xaa\x22\x87\x46\xa1\x1b\xbd\x63\xa6\x3a\xac\xc7\x5a\xda\x8b\x43\x92\x4a\x7f\xf1\x7d\xbf\x14\x41\x92\xea\xd5\x17\x4f\x3c\x15\x53\xf4\x10\xf1\x6c\x05\x6f\xf1\x1a\xc6\x7d\x8b\xba\x92\x51\x11\x0d\xd3\x58\xa3\x61\x1a\xeb\x8d\x7e\xc6\x69\xa3\x9f\xb3\xb4\xd1\xcf\x65\xae\x76\xe9\x92\xb9\xe5\xc9\xb0\xc7\x61\x50\x90\x7d\x8c\x72\x1e\xc3\x0a\x67\xf5\xc7\x5b\xe1\x54\x58\x96\xb4\x31\x8e\xd6\x0a\xe7\xe5\x1f\x68\x85\x33\xd1\x59\xe1\xbc\xdc\xdb\x0a\xe7\x8c\x5a\xe1\x84\xd9\x56\x38\xe6\x6a\x57\x92\x15\x8e\x30\xc0\xa1\xbd\x8c\x8d\x70\xe6\x36\x2a\x1f\xb8\x08\x16\xb1\xde\xab\x16\x1a\xe3\x84\xb2\xf5\x0a\x4c\x38\x1a\x8d\x8d\x2b\x56\x28\x1b\xad\x9c\xd0\x64\xfb\xba\xd1\xa5\x7d\x1d\x0b\xeb\x95\x09\xb3\x5e\x49\x01\xa3\x44\xd9\xb8\x92\x28\x2a\x5b\x88\xce\x0b\xf0\x9f\x6b\xbb\xf9\x55\xeb\x43\x2f\xd7\x04\x26\xde\xc7\x8a\x31\xcc\x6b\xe7\xd5\x37\x18\xc3\xc8\x95\x92\x37\x8e\xf5\x3a\x69\x17\xf3\x5a\xae\xd4\x8e\x7c\xc4\xd1\xc7\xdd\x9b\x82\x46\x31\xaf\xee\x63\x14\xc3\x15\x91\xaf\x1e\xdd\xb2\x44\xaf\xaf\xbc\xa7\x65\x09\x79\x2b\xac\x05\x92\x68\xd0\x8b\x18\x0d\xda\x8b\x66\xbd\x71\x80\xb9\x0f\xe2\x61\xdd\xaf\xd5\x58\xaf\xfb\xf6\xbf\x91\xf9\xc7\x62\x1f\xf3\x0f\x91\x19\x46\x50\x70\xe6\x72\x27\x2d\xcf\x5c\xe4\x5d\xa4\x53\x8e\x77\x5d\xb6\xad\x88\x64\x15\xf2\x2e\x65\x15\xc2\x1c\x1d\xbe\xcb\xd8\x8d\x7a\x6d\x83\x64\xcf\xa1\xec\x8a\xbe\xb5\x12\x06\x1a\xcc\x41\xed\x8a\x1a\x7b\x4c\xb4\x20\xd8\xf2\x84\x82\xbb\x7d\xdb\xa6\x8e\xc9\xa0\x83\xef\xf5\xc6\x29\xc2\xd1\x6b\x12\xe2\xaa\x56\x0b\x6d\xc9\xf6\x1d\x3c\x56\xcc\x37\xd9\x4e\x9c\xff\xf7\xb1\x9d\x38\x7f\x78\xdb\x09\x4d\x4f\x1e\xa1\x15\x9d\x85\xc6\xf9\x1f\x60\xa1\x71\xfe\xa7\x5a\x68\x9c\xff\x11\x16\x1a\xc0\x6f\x20\x02\xb9\x86\x60\x89\x78\xeb\x4c\xc3\xd1\x96\x69\xe2\x60\x0b\x88\x8b\x28\x4e\xe4\x7b\x88\x9d\x81\x3c\xa4\x20\x4f\x9b\x86\xfd\xc9\x42\x3d\x81\x23\x12\x71\x46\x1f\x80\x4e\xac\xfe\x3d\xb1\x9d\xad\xe3\x27\x89\xad\xd7\x6c\x3b\x6d\x61\x9d\xd6\x6e\x5c\x55\x22\x6a\xb1\xcd\x63\x9d\xb3\xdf\xe8\x3c\xba\x6d\x22\x93\x42\xf8\x5d\x41\xea\x83\x13\x8a\x1d\xe7\xea\xaa\x8d\xa3\xad\x04\xd7\x84\xfd\x8a\x7e\xd4\xe8\x8f\xba\xf4\x83\x67\xaa\x63\xa6\xeb\x66\x24\x46\x36\x52\x7a\x03\x18\xb9\x05\xd3\x81\x9f\x95\xfd\x3e\x28\xd9\x39\x06\x2b\xd1\xd4\xe4\x4e\x87\xe6\xa0\xa4\xa8\x7b\x1f\x11\xfe\xb5\x46\xc8\x1f\xd8\x78\xf1\xe0\x3c\xa0\x8e\xc5\xf1\x48\xa4\x06\xae\xfc\xc3\x32\x2d\x25\x61\x04\xa1\x15\x7f\x5b\x55\x8d\x2a\xeb\x47\xb5\xb7\x56\x6c\xb3\x83\x1a\xd3\x06\xd7\x9f\xca\x96\x77\xa9\x01\xa5\xac\xe6\xda\x90\xab\x54\x7d\x76\x1c\x50\x25\x04\x34\xa9\x35\xf8\x3c\x15\xb6\x05\x84\xad\x1f\x4f\x4c\xc5\x41\x14\x24\xb4\xdd\xf2\x1b\xd1\x5a\xf1\xcb\x25\xf8\xef\x34\x36\x4e\x68\x53\x77\xdf\xe5\x52\x25\x91\x5a\x83\xd4\x06\xe4\xfe\xff\xff\x3f\xf5\x85\xcd\x62\x84\x15\xbc\x8c\x11\xba\x51\xb2\xf5\xd3\xb8\xc9\x9b\xbc\xca\x73\xfe\xdd\x3c\xfe\xdd\xca\xcf\xe1\x6b\x35\xde\x69\x10\x06\x74\x7e\x4a\x25\x6a\xba\x84\x5f\x2e\xf9\x45\xe3\xf3\x9e\x5d\xe6\x95\x11\xca\xce\xd8\x0d\xa4\x7e\xe5\xaa\x92\xe1\x3e\x9f\x5c\x56\x96\x3f\xec\x27\x17\x92\x57\x41\x13\x7d\xcb\x67\xd0\x8f\x33\xf7\x9b\xe0\x67\xa8\x44\x5f\xa5\xfc\xbc\x51\xd1\x7f\x93\x64\xf5\xd1\x07\x7a\xf7\xe0\x26\x6f\x64\x59\xcc\x5c\xed\xdd\x3e\xe6\x6a\xcb\xff\x5e\xe6\x6a\x8f\xde\x1d\x9b\xac\x5a\xfb\x2e\xa7\xfd\x4d\x0d\x43\x66\x88\x46\xe9\xd6\x49\x6c\x76\x88\xa7\x70\xb4\x38\x75\x64\xa9\x76\xa4\xd1\x99\x24\x96\x23\x37\x52\x0b\xb9\x91\x5a\xca\x5c\x6b\xa2\xda\xa0\x3d\xe4\x70\x7d\xc3\x70\xa3\x2b\x88\xfd\x88\x68\xf6\xc8\xc2\xad\x20\xd9\xae\x9f\x1d\x3d\x91\x9e\x34\x80\xcb\x9d\x43\xc5\x58\x4d\x3d\x71\x99\xa5\x1f\xe9\xc5\xe6\x69\x7d\x27\xe4\x3f\x4d\x20\x87\x58\x78\xf0\xe0\x96\x68\xd9\x06\x66\x13\x9d\xa5\x5a\xa8\xb1\x54\xbb\x9f\x25\x9a\xfe\xcd\xe5\x0c\x85\xbf\xd4\x4c\x6d\x61\x82\x45\x2c\x19\xa2\x81\x43\x1f\xa8\x7d\x1a\xfc\xb3\x75\xbe\x93\x8d\xd3\x62\xf5\xff\x71\x87\xe2\x18\xd0\x22\xf4\xfc\xcf\x36\x5b\xd3\xeb\xfa\xcf\xc9\x99\xad\x31\x59\x3b\xff\xb7\xc9\x9a\x46\x15\x8b\x4b\x64\x6f\x55\x68\xb6\x9d\x9b\xd1\x60\x2d\xdb\xce\xcd\xa8\xf0\xfd\x7f\xd9\xce\xcd\xa8\x53\xce\xb1\x73\x33\xea\x57\x51\x8b\xfd\x33\x73\x17\xb2\xb7\xab\xca\x87\xb7\x56\x33\x82\x0b\x24\x40\xd1\x7e\x01\xad\x44\x59\x0e\x8a\xda\x5b\xdd\xfe\x6f\x6b\xb7\xe2\xd6\x6e\x86\x20\x60\x42\x09\x77\x96\xab\x53\x4d\xaa\x3d\x3d\xaa\xf6\xbc\x97\xb5\x5b\x12\xcb\xe0\x21\x96\xe1\xe1\xac\xdd\x62\xb2\xe1\x1e\x76\x6f\xe7\x91\x56\xf2\x5c\xb5\x7b\x3b\x57\xed\xde\xce\xf3\xed\xde\xd6\xb9\x9a\xc9\xb5\xf0\xc0\x6c\xb4\x7b\x5b\xa3\xdd\x9b\xc6\x2e\x2e\x32\xa5\x59\x67\xd8\xbd\xad\xef\x13\xb1\x68\xa1\x40\x71\x97\xc2\xea\xed\x4c\x6b\xf5\x76\xaa\x5a\xbd\x2d\xf7\xb7\x7a\xe3\x56\x02\x97\xcd\x95\xb0\x7a\xbb\x44\x78\xf4\xd2\x5e\x5d\x5d\x5e\x3b\x4b\xf8\x27\x65\xf5\x86\x89\xb1\xd5\x1b\x3e\x3d\xba\xd5\xdb\x1a\xad\xde\xd6\xdf\x6a\xf5\xf6\xd2\x59\xe7\x5a\xbd\x25\x16\xaf\x62\xfa\xf6\xca\x79\xf9\x0d\xa6\x6f\xe9\x9a\x65\xfb\xb7\xd8\x49\x5e\x64\xed\xf1\xaa\xb8\xfd\x5b\x4e\x56\xc9\xfe\x2d\x3b\x23\xea\xe1\xdf\x73\xc9\x27\xcf\xc7\xa5\xa3\x39\x2d\x48\x66\x73\x39\x39\x15\xb3\xb9\x9c\xbc\x19\x66\x73\xe7\x95\x2d\x72\x0a\xaf\x1f\xda\x6c\x2e\x6f\xaf\x67\x36\x99\xad\x05\xdd\x66\x98\xcd\xbd\xf9\x23\xcd\xe6\xb6\xf9\x66\x73\xaf\xf3\xcd\xe6\xde\xdc\xcf\x6c\xee\xe5\xbd\xcc\xe6\xee\x6b\xf2\x76\x1e\x99\xbc\x5d\xfc\x31\x26\x6f\x6f\x13\xae\x12\xbf\xcd\xe4\xed\xad\x7a\x83\x7c\xb3\xfd\xdb\x6f\xd6\xc5\xd3\xe3\xe7\x09\x3b\x9b\x73\xb4\xb3\x79\x5d\xc8\x64\xed\x9d\x63\xce\x97\x30\x57\x7b\x67\xb2\x55\xfb\x06\x33\xa1\x5f\xad\x73\x8d\xf9\xde\x45\xba\xff\x45\x8d\x2a\x71\x91\x5e\xb0\x15\x66\xae\x20\x32\x34\x52\xb3\x88\xb3\xf2\x40\x51\x15\x6d\xea\xb0\xff\x50\xde\x22\x9e\x8f\xd5\xe7\x6d\x5d\x0e\xef\x03\x2f\x2b\x17\xf7\xb6\x60\x5a\x46\x16\x4c\x1b\xc5\x62\x67\xf9\xa0\x16\x4c\x6f\x9c\x37\x0f\x6a\xc1\x94\x6f\xb2\xa4\xda\x28\x2d\xb5\x36\x4a\xa9\x11\xab\x74\x93\x6a\xb1\xb4\xf9\xe3\x2d\x96\x96\x0f\x68\xb1\xb4\xd4\x58\x2c\x2d\x32\x2c\x96\xce\xb5\xce\xa4\x62\x41\xe8\xc1\x9e\xd6\x4b\x31\xe5\x72\x7f\x3b\x26\x71\x0c\x3f\xab\x69\x4d\x9a\xe4\xd7\x7f\xbe\x75\x53\xd2\x9e\x69\xc5\xea\x8b\xe2\xe2\xdc\xcb\x9e\x69\x9b\x65\xcf\x44\x23\xe6\x34\x97\x7a\x7b\xa6\x85\x6c\xce\x24\x59\x1c\xc5\x01\x6d\xbe\xc1\x98\x49\xb5\x8f\xfa\x1f\x68\xc4\x74\xfa\x88\x66\x4a\x0b\x34\x53\x3a\xbb\x97\x99\xd2\xe2\xe1\xcd\x94\xc8\xb9\x56\x86\xbb\x21\xb7\xf6\xbf\x2d\x98\x1e\xd7\x82\x69\xf3\xed\x16\x4c\xcb\x7f\x5b\x30\xfd\xdb\x82\x29\x4f\xe4\x9c\x6d\xc1\x64\x14\x37\xff\xdb\x12\xe8\xdf\x96\x40\xc5\x2d\x81\x0c\xa1\x71\x84\xe8\xf5\xd6\x96\x8d\x82\x6e\x15\xa3\xa0\x5b\xc5\x28\xe8\xf6\x91\x2c\x81\xfe\xd7\x9a\xeb\xdc\x43\x20\xae\x11\x6e\x47\xf9\x86\xb1\xdd\xc9\xb1\xe3\x38\x83\x2b\x71\x67\xbf\x41\xdc\xe4\x35\xbb\x82\x5a\xb7\x8d\x6d\x53\x5c\xf1\x18\x5e\xaf\x0f\xd7\xdc\x46\xba\xde\xd9\x7d\x2e\xde\x6c\xa3\xbb\x9c\x3d\xf3\x1b\xfd\x2c\xfe\xea\xe8\xd6\x24\x83\x00\x8c\xbd\xc0\x78\x49\x2a\xce\x47\x02\xb0\x40\xc8\xbf\x68\x80\xa3\x3d\x06\xc8\x07\xe6\xac\x38\x15\x43\x9f\xf1\xd3\xf0\x71\xc1\x8b\xad\xfc\xe2\xcf\x19\xd1\x24\x3d\x22\x4a\x58\xb1\x61\xe9\x3e\xd9\xc2\x40\x95\xb1\xcf\xb6\xc8\x22\xc3\xce\x0a\xd2\xec\x45\x07\x28\x0d\x88\xe9\x4d\xf2\x14\x2c\xe7\x31\x6f\x2a\xaf\xfa\x73\x8d\x58\x4b\xa7\x0c\xc9\xf6\x4a\xd8\x25\xe7\xb8\xf7\x2e\x8d\x12\xdb\x1e\xcb\xf0\xd2\xc9\x90\xb9\x31\xf9\x36\x3d\xc2\x81\x1b\x3f\x3a\xaa\xe3\x4f\xfa\x11\x76\x28\xf0\xdf\xa3\xe4\xb1\x5c\xf2\x75\x66\x49\x34\x42\x30\x34\xf9\x66\x8f\x82\x4a\x8b\x6f\x33\x0b\xba\x40\x36\x9a\x9a\x7c\xb7\x4f\x49\xb9\xcd\xe6\x63\xab\x7d\x70\xf9\x34\xcf\x73\xd5\x3e\xdc\x32\xa3\x98\x64\x55\x1d\xfc\x9e\x76\x74\x92\x15\x1d\x8b\x44\x86\x88\x22\x2a\x73\xf9\x50\xb8\xf9\xe3\x47\x68\xbe\x19\x99\xa4\x69\xcc\xeb\xde\x0b\x53\xb9\x0f\xc0\xc6\x6b\x1b\x8b\x6d\xf7\x2c\x1a\x39\x4b\x78\x6f\x3b\x57\xd5\x65\x54\x57\x16\xdf\x63\x8a\x6e\xec\x93\xf3\xb1\x80\x6e\x8c\xeb\xc4\xda\xcf\x0e\x94\x6a\xe4\xd0\xeb\x9f\x8a\x6b\xbd\x72\xb2\x6e\xeb\x7b\xe4\x3d\x2e\x98\x97\x46\x89\xad\x73\x85\x54\x6e\xc6\xe3\x02\x19\x51\x43\x50\xa4\x42\xcc\x57\xa4\x3e\x2a\x74\x28\x52\x21\xcd\x58\xa4\x46\x59\xc7\xc5\x83\x21\x7c\x94\x95\x95\xe4\x9f\x29\x75\xb3\x1c\x34\x19\xd5\x24\x5c\xaf\xd2\xe1\xa2\x1c\x3c\x39\xfa\xec\x1e\xfc\xc1\x39\xad\xba\x68\xf4\x6d\xd9\xad\x8b\xa7\xc7\x8d\x0b\xf2\x45\x4a\xf9\xa1\x51\x6b\x9e\x72\x5d\xce\x0f\xe8\x7a\x8a\x91\x73\xff\xb4\xc9\xe7\x58\x18\xaf\x53\xfb\x99\x77\x56\x08\x84\x37\x42\x0a\xdf\x05\x5b\x27\x82\xd6\x2b\xc9\x2d\x2a\xe7\x68\x28\x69\x4c\x96\xad\xe6\x2b\x5b\xf1\x51\xd2\x2a\x95\x1a\xa5\x03\x8b\x12\xf5\x07\xb8\x8e\x50\xa7\xe0\xee\x44\xf4\xf6\x53\xa4\xa9\xa9\xfa\xf1\x54\x56\x3f\xd2\x34\x29\x29\xf7\x32\x33\x8f\x3b\x5b\xab\xf6\x85\x69\x1e\x83\x48\xa3\xb6\x9b\xa5\x9c\x42\x5e\xda\x4a\xd4\xd0\xb1\x50\x98\xfd\xb3\xb8\x16\x8c\x1e\xae\x34\x85\x4e\xca\xd1\x91\xb8\x24\x69\x1a\xde\x20\x08\x50\x9e\x3f\x4e\xd3\xc7\x05\x9a\x5e\xe8\x9a\x7e\x80\x61\xb2\x8b\x59\x69\x6a\xf9\x40\x4d\x25\x87\xa5\x69\x6a\xf5\x48\xa3\xe2\x77\xbf\xd2\xd6\xfa\x91\x86\xa5\x6b\xeb\x73\xce\xaa\x0e\x62\x5d\x71\xa0\xda\x15\xff\xe8\xc8\xfb\x44\x3a\xb3\xf9\xf9\xf0\xb2\xa8\x16\x96\xfc\x24\xd7\x24\x9d\xd5\xbc\xa2\xd7\x85\x2b\xfa\x59\xae\x48\x3e\xa4\x79\x4d\x6f\x0b\xd7\xf4\x4b\x6a\x70\xc7\x4a\x4d\xaf\x0a\xd7\xf4\x6b\x72\x70\x6a\x45\x6f\x0a\x57\xf4\x5b\x6a\x70\x6a\x4d\xef\x0a\xd7\xf4\x2f\xe7\xad\x30\x71\x7a\x9b\x47\x1e\xed\x90\x06\x44\xdf\x3d\x26\x75\x7e\xda\x87\x43\x9a\x80\x2a\x7b\x57\xfe\x35\xa7\xa3\x04\xa5\x74\x05\x19\x6a\x18\x68\x76\x77\x6d\x37\xae\xae\xc9\x5f\x9d\x77\xa2\x53\xef\xfe\xbb\x74\xaa\x39\x15\x34\x9f\xaf\xf5\xaa\xf0\x3e\x2a\xf8\x2f\x03\xd9\xb7\x55\xc8\xbe\x4b\xa0\xe2\x6e\x54\xaf\x0f\xc9\x2a\x3f\x44\x55\xfe\xb5\x70\x95\xb3\x2a\xc7\x16\x5b\xd3\xd8\x6d\x02\x9c\xc3\xba\xd4\x95\x36\x75\x1e\xa5\xde\x48\xa9\x4b\x6d\xea\x5a\x9b\xfa\x36\xe2\x4f\x60\x28\x12\xeb\xf9\x33\xbf\x9d\x57\x68\x53\xa4\xcf\xf2\x1b\xcf\xb2\x46\xf5\xbf\x3e\xcb\x4f\x3c\xcb\x02\xb8\x37\x43\x96\x5f\x79\x96\x25\x70\xa3\x86\x2c\x3f\xf2\x2c\x33\x44\x45\xe9\xb3\xfc\xc2\xb3\xcc\x51\xa3\xcd\x40\x12\x05\x3d\x1c\x5f\x22\x44\xe2\xf3\xbd\x3d\x1c\x5f\x32\x88\x84\xda\x1b\x63\x75\xbc\x97\x1b\x9b\x6c\x4d\xbd\xfc\xcd\xba\x34\xf8\x7b\xcd\x6a\x63\x5b\x4f\x35\xb2\xb5\xc9\xed\x03\x37\x72\x9c\x6a\xe4\x36\x39\x77\x72\x47\x14\x83\x44\x71\x90\x95\xc8\x7b\x71\x5e\x1c\xd6\x1b\x87\xb5\x3c\xf2\x2c\x54\x5c\x48\x33\x2f\xdf\xe6\x6e\x19\x9a\xfc\x70\xcf\x26\xeb\x51\x93\xa7\x45\x70\x28\x08\x7b\x90\xc0\x25\xb3\xa2\x1a\xc7\x21\xee\xe4\xe2\x79\xb3\xea\x35\xe8\x0a\xcf\x54\x5d\x61\x56\x6b\xc5\x6a\x58\x15\xed\xef\x08\x4f\x9e\xe2\x79\xb3\xea\x2d\xd6\xb3\xac\xd6\x8a\xd5\xb0\x28\xda\xdf\x09\x07\xb3\x14\xcc\x9b\x55\x6f\xb1\x9e\x65\xb5\xf6\xcd\x63\x33\x6a\x89\xcf\xee\xab\x25\xce\xe8\xee\x83\x37\xb6\x53\x91\x3a\x45\x20\x31\x1d\x13\x08\xa6\xcb\xd0\x2c\x3d\xf6\xa7\x8f\xf0\x97\x01\xfb\x3d\x34\x5a\xd5\x8d\x0c\xb6\x73\xff\xb1\x23\x63\xa7\x34\x0e\x27\xe1\x02\x7d\x24\x90\x09\xd6\xa6\x37\xd8\x4b\xa7\xdd\x68\xd2\x66\x12\x44\x08\xd2\x2c\x5b\x20\xb9\xa7\xb0\xaf\x4d\xef\x6e\x6c\x0a\x8b\x4a\xf9\x5e\x96\x01\x67\x52\x3d\xcb\xa2\x79\x6f\x6c\x1a\xa5\x8e\xe7\xe5\x19\x4e\x81\x5f\x51\xba\xb5\xce\xc9\x02\xb5\x6c\x92\x48\x29\x8e\x82\x0c\xed\x6c\x6f\xc5\x2f\x10\x3d\xa4\x2f\x3a\xb5\x13\xc8\x20\x72\x6b\xc8\x79\x13\xe7\x64\xfe\xf1\xe0\xbc\xcf\x06\x62\x9d\xe9\x80\x58\xaa\x21\xa3\xc9\x78\x90\xb1\x5c\xce\x4c\xfc\x3c\x76\xe6\xf0\x93\xb2\x4f\xce\x82\xff\x3a\xa6\x90\x08\xc6\x09\x39\x2b\xf1\xf3\xd8\x59\x47\x30\x8a\x8d\x80\x51\xd4\x9d\xad\xf8\x79\xec\xdc\x4a\x40\x8a\xb3\x47\x07\x52\x18\x8d\xd1\xb2\x81\x14\xbd\x74\xb1\x5e\x41\x20\x45\x3f\x5d\xb4\x2f\x1b\xe9\xd5\xf7\x36\x2a\xe3\x05\x8f\xf7\x36\x0b\xcc\x86\x23\xe8\x8c\xb4\x98\x11\x5b\x2c\xcb\xd9\x1b\x68\x92\x07\x65\x38\x7b\x44\x28\xc3\xd9\xfd\xa0\x0c\x67\x7f\x02\x94\x41\xd3\x66\x01\x28\x83\xce\x8e\xd3\x0c\x65\xa0\xaf\x48\x90\x07\x65\xe0\x19\x20\x63\x3e\x94\x41\xe4\x21\x41\x26\x94\x21\x10\x50\x86\x4c\x70\x41\xd2\xbc\xd4\xa3\xe6\xa5\x5a\x93\x38\xa3\x79\xb0\xde\x0e\x19\xa8\xcf\x0d\xc2\x07\xe6\xec\xcf\x82\xfd\x59\xb2\x3f\x2b\xf6\x67\x4d\xff\x64\x19\x12\xeb\x31\x58\xc8\x11\xb3\xba\xb7\xac\xb6\x2d\xab\x6d\xcb\x5a\xda\xb2\x96\xb6\xac\x6e\x58\x15\x3f\x87\x33\xb8\x57\xfb\xfb\x59\x10\x43\x23\x71\x51\xd6\x9a\xfa\xbc\x4a\x3c\xaf\xd5\xe7\xa2\x36\x7f\x61\x6f\xe4\xc3\xbd\x59\x04\xd2\xb0\x89\xba\xbc\xd1\xfb\x1b\xdd\x24\xd5\xc9\xf4\x2a\xd3\xaa\x7e\x7b\x64\x43\xba\xec\xfe\xd2\x4b\xcb\xfb\x34\x43\x4a\x1f\xbd\x41\x2b\x20\x9d\xd4\x24\xe9\xf8\x73\xac\xfa\x97\x1c\x72\x66\x69\xd9\x0a\xee\xee\xae\xaa\x2f\x9e\xdc\x6a\xe2\x37\x93\xdb\x27\x56\x3a\xb5\x52\x7d\x61\x6b\x32\x5f\x37\x02\xea\x74\xf2\xf6\xda\x26\x23\x49\xea\x72\x85\xc2\x16\xf8\x99\xec\xd0\x2c\xea\xd0\xc2\xa6\x0c\x2c\xfa\x7a\x48\x66\xba\x91\x33\x5d\x0b\x41\x0c\x7a\xe2\x3c\x25\xb5\x6b\x69\xec\xc8\x67\x3a\x8e\x33\x94\xbd\x61\x1e\x1d\x45\x8f\x4a\xbe\xd6\x95\xf2\x58\xa9\xd6\xea\x4f\x94\x14\xa2\x54\x53\x4e\xbc\xaf\x5f\x5f\x37\xae\x2a\x75\x52\x97\x07\xca\xdb\x1f\xa9\xed\x47\x8f\x23\xb5\x7d\xe5\x91\xd6\xaf\xa4\x10\xa5\x9a\x4a\xe2\xbd\xd4\x3e\x95\x0c\x9f\x15\x76\xcc\xc9\xd7\x76\xec\x8d\x33\x9e\xed\x6b\xa4\x83\xce\xee\x61\x0c\x18\xd5\x49\x2e\x9c\xf3\xa4\x2f\xce\x4b\x29\x09\xd5\x6a\x2f\xa1\x09\xd9\x26\xf0\x32\x5b\x87\x49\xc5\x20\xf4\x6a\xc8\xe6\xfc\xbb\xb1\xd4\xbc\x1b\x5b\x58\x6d\xcc\xde\xe1\xb6\xd5\xd8\x5d\x45\xca\x35\x1b\x30\x32\x11\xab\x82\xd6\xeb\x03\x1e\x34\x45\x74\x15\x03\xbe\x7e\x76\x17\xbd\xa8\xc7\xfd\x36\x37\xee\xc3\x3a\x2b\xf8\xba\x02\x74\x63\xaf\x52\x2a\x0f\xec\x84\x4b\x43\x12\x8f\xff\x2f\xfa\x12\xe5\xd2\x81\xce\xcd\xcc\x6d\xd2\xb1\xca\x29\x0a\xde\xc4\x8c\xf1\xf2\x25\xb2\x6a\x95\x96\xb3\x91\x65\xac\xfb\xff\x92\xf7\xa5\xdd\x6d\xdb\x5a\xbb\xdf\xef\xaf\xb0\x75\xfa\x7a\x91\x31\xe4\x48\x6e\xd3\xd3\x4a\x65\xbc\x1c\xcf\x89\x9d\xa4\x49\xda\x93\xd4\x4b\x2b\x4b\x03\x25\x51\xa2\x06\x6b\xb0\x25\xc7\xfa\xef\x17\x7b\x63\x20\x40\x02\x24\x25\x3b\xed\x7d\xcf\xfd\x60\x4b\x22\x01\x10\x04\x41\x60\x8f\xcf\xe3\x16\x2a\x05\xee\x50\x38\x53\x9e\xc5\x5e\x34\xd8\xf1\xd8\x04\x38\x9c\x0a\x53\x0a\x10\xab\x31\x60\x49\x92\x04\x78\x1d\xab\x03\x66\x00\x58\x8a\x8c\xc6\xce\x08\x9f\xd1\x4b\x06\xc1\x73\x20\xe6\x41\x0c\x68\x09\x0f\x49\xa4\x25\x97\x8e\x1a\x3f\x48\xef\xb3\x89\x90\x61\x0d\x09\xb2\xd3\x32\x03\xb7\x99\x56\xbc\x67\x7b\xbf\x72\xf9\xbf\x30\x28\x91\x52\x08\xb6\x42\x27\xc4\x2e\x01\x42\x5b\x28\xb0\xda\xe8\x05\xc3\xc2\x6e\xb1\xf5\x7c\x1f\x2c\x4d\xf4\xab\xf8\xc6\x2b\x4c\x64\x85\x51\x54\x81\x9f\x1b\xcb\x73\x13\xb5\xb1\xa8\x2d\xd1\xec\x7d\x21\x03\x83\xce\x8c\x64\xd4\x77\x06\x02\xbd\x88\x5e\x30\x94\x80\x58\x0c\xad\x47\xc5\xff\x33\xc4\xe3\xd2\x11\x91\x85\x12\xf8\x4f\xe6\x62\x0b\x35\xff\xcb\x02\xe6\x13\x3a\x12\xce\xa7\x44\xd8\x29\x03\x0a\x92\xb1\xaa\x84\xff\x09\x1d\x5e\x91\x8e\x1c\x62\x28\x49\x94\xde\xbf\x6b\x3e\xc5\xcc\xac\x67\xdf\xeb\xe9\xfc\x6f\x9e\xb0\xab\x04\x9c\x52\x26\x90\x92\x34\xd8\xe0\x47\x2f\x03\x4a\xa9\x6f\x30\xae\x84\x86\x63\x03\xab\xcd\x67\x68\x45\x52\x1a\x99\xcf\x8c\xe8\x1a\xb6\xb2\x41\x33\x35\xc3\xd1\xd4\xb7\xc2\x33\x75\xe9\x4d\x5b\x11\x9a\xc2\xd1\x1d\x02\x34\x01\x3e\x13\xfd\x37\x87\x24\xa9\x5b\x30\x34\xdd\xd9\x4c\x5c\x1c\x9d\x49\x4b\xd7\xe2\xda\xd5\x47\xaa\x86\xc3\xbe\xc8\x7e\x9d\x07\x2d\x9f\x45\xc4\xe4\x48\xe5\x22\x7f\x0b\x7a\x93\x62\x59\x81\x51\x09\x61\x3a\xbc\x87\xc8\x55\x4f\x9f\xec\x0d\x3a\xa4\xf4\x11\x9e\x8b\x32\x90\x7f\x17\x49\x38\x05\x45\x90\xd9\x12\x1b\x54\xb1\x44\x5f\xd0\x7a\x12\x3a\xb7\xc9\x42\x30\xf5\xe6\x54\xd1\x3e\xa3\x5d\x06\x1d\x5d\x30\x62\xf2\xae\xd4\x6c\x9a\xe5\x77\xb7\xda\x58\xcd\x2f\xe9\x56\x1b\xab\xe9\x25\x1d\xc5\xc9\x0a\x66\x95\x8e\xe2\x64\x07\xb3\x4a\x47\x63\xca\xb2\xf3\xac\x6d\xe6\x49\x47\x71\xb2\x82\x3f\xa5\xa3\x38\x59\xc1\x9f\x10\xc5\xe9\xf3\xda\x79\x35\xe9\xe0\x4f\x66\x56\x10\x5a\x6d\x5c\x6f\xa5\xd9\xb0\xac\xbc\x3e\x20\x0a\x9e\xb4\xec\xb7\x67\x4d\xe1\xb1\x23\x38\xa5\xdb\xcb\x78\x82\x62\x4e\x86\xfa\x3a\x30\xd4\xa7\x02\x9f\x59\x2d\x6c\x56\x7b\x85\x15\x8c\x0c\x56\x74\x6b\xe6\x56\xc2\xd6\x15\xe5\x6e\xc1\x5a\x6f\xcd\xd9\x32\xd5\x63\x59\x5b\xb0\xde\xad\x9d\x65\x46\x77\x87\xb5\x93\xbc\xd2\x8d\x65\x26\xcb\xaf\x66\x2c\x53\x6d\x65\x78\x86\x74\x62\xb6\xb2\xb8\xa9\x8c\x9f\xa7\xe5\x62\xa6\xb2\xa4\xa5\x4c\x14\x21\x1d\xdd\x52\xa6\x1b\xca\x3a\xb9\x0c\x65\xf1\xbc\xb1\x06\xe6\x8d\x99\x0c\x65\xf9\xac\x3e\xe3\xfa\xa4\x1e\x86\x7e\x78\x34\x62\xf0\x8c\x33\x7f\x9a\xc7\x02\x34\x8e\x1e\x7e\xd2\x02\x24\xcb\x8d\x95\x4d\xff\xd4\xe9\xea\xe1\x32\x0d\x44\x29\x08\xa6\x6f\xeb\x6f\x9d\x3a\xf0\x63\x3c\x3c\xb0\x1f\xb4\x4b\x53\xff\x34\x1c\xd5\x67\xec\xb8\x2b\x70\x95\x3b\x18\x76\xc6\xad\x01\xa4\xc5\x7e\x73\xd7\x37\xf1\xbd\x26\x98\x34\x9c\x26\x18\x0e\xe0\xab\xfb\xfc\x57\x86\xbb\x81\xea\xed\xbb\xb6\x03\xe8\xb5\xac\xa9\x6e\x52\x6a\x12\xed\x5e\xfb\x04\x5a\x90\x16\x97\xeb\x45\xb1\xbc\x4f\x5a\x78\xa8\x8a\x17\x6c\x4c\xe6\xd3\xee\xde\x12\x60\x68\x5e\xef\x8d\xe9\x77\x18\x6d\x76\x93\xd7\x70\x11\x02\xa5\x1c\xdf\xad\xf1\x83\x5b\x22\x64\xe5\x65\xe9\xc0\x39\x16\x10\xb3\xb0\x81\x86\x75\xc0\x16\x0e\x86\x1c\x97\xe7\xc4\x7e\xce\xad\x98\x6a\x32\x10\x73\x53\x3d\x76\xc6\x25\x4a\x87\x70\x28\xa9\xee\xa2\x24\xb0\xdc\x38\x6c\x38\xea\x5e\x37\x25\xa6\xab\x73\x5d\x17\x37\xed\x0f\xc6\x33\x06\x32\x0a\xec\x38\x96\xe0\x29\xb5\x3c\xb3\xc8\x41\x94\x70\x1f\xe4\x3c\x5b\xa2\x74\x1f\xd0\x2f\xbe\xb5\x02\x2a\x36\x4d\xe9\xc1\x4a\x9d\xb0\x9a\x15\x08\x9d\x82\x89\x1c\x42\xed\xab\xc4\x7d\xca\x56\xa4\xa6\x50\x07\xeb\xc5\x64\xa9\xb6\x1f\xe1\xf6\xb2\xe9\xd5\xa4\xfd\x73\x81\x1f\xa8\x55\x43\xd3\x95\xd2\xdf\x65\x34\x0f\xd0\x5c\xb5\x5d\xaa\xf0\x62\xbf\x79\x50\x6d\x67\x07\xfe\xff\xe6\xe1\xc1\x32\x1d\x4c\x21\xd8\xb5\xc0\xe2\x85\x73\xa1\x49\x27\xe6\x01\x88\xf3\x15\xf6\x10\x56\xc0\x68\x83\xad\x3b\xdf\xd8\x18\x4f\x2b\x7d\xc2\x37\x88\x70\xa5\x3c\x8d\x09\x2e\xeb\xb4\x7d\xcc\x97\x81\x17\x93\x8e\xc0\x5b\xfa\x96\xee\x7d\xfd\xca\x22\x95\xbf\x7e\xf5\xda\x60\xe0\xbd\xe4\xda\xd2\x6d\x30\x0d\x1a\x41\x88\x4c\x19\x05\xe6\x35\x2f\x28\x0d\x4e\x65\x83\x4c\x05\xa5\x77\x75\x47\x14\x6d\xd4\x7e\x99\x5d\x4f\x7a\xac\x17\x74\x16\x5d\x45\xda\xd9\x18\xf2\xf0\xa6\xa3\x89\x05\x05\x7b\x4e\x2f\x59\x9c\x3b\x98\xe2\xdf\x16\x43\x49\x5f\x94\xb7\x69\xfa\xa2\x51\x5b\x84\x96\x98\x6a\x18\xdd\xd0\x0c\xc5\x1c\x2a\xb5\xce\xfc\x2d\x7b\xe7\x09\x2f\x01\x77\x4e\x74\x03\xa1\x52\x21\x2b\xa6\xa6\xcd\xaf\x1f\xbf\xfb\x4b\xf5\x97\xe1\x39\xc0\xa3\x57\xba\x3c\x8f\x72\xc4\xa0\x3f\x62\xbe\x40\x29\xcf\x6b\x1c\xc0\x55\x2a\x4c\x6b\xbc\x4d\x98\xcc\xef\x6c\x26\xf3\x16\xb9\x05\x4e\x82\x85\xd5\x64\xee\x63\x81\x84\xc9\xfc\x16\x5e\xa4\x06\x7d\x30\xb8\xb4\xa1\x06\x32\x85\xd8\xbe\xbb\x1a\x10\xb0\xc8\xa7\x85\x46\xb2\x25\x60\xc8\x75\x0d\xef\xab\x58\x8c\x15\x83\x3b\x51\xd7\x74\x76\x87\xbb\x0d\x7a\xb7\xd1\xfb\xb1\x84\x59\x08\x3a\x9e\x08\xd2\x87\x05\x7a\x67\xc7\x61\xc7\x4b\x04\x7e\x7a\x25\x5c\x79\xbd\x92\xcb\x7e\x42\x21\x30\x25\x3b\xf8\x0b\x17\xf7\x32\x2b\x01\xff\x76\xcb\xb0\xae\xd1\xda\xd6\x95\xbc\x29\x97\xf0\xbd\x5f\x9f\x39\xb0\x8c\xbb\x68\x39\x8f\xde\x77\xac\x7b\xdb\xe1\xaf\x27\xd0\x91\xc1\x39\x46\x70\x81\xc7\x0a\xe4\xc6\xa5\x8b\x69\x7d\xe0\x17\xe8\x6e\xcd\x19\x19\xee\xbd\x5b\xab\x9d\xd9\xb0\x9b\x6a\x0c\x50\x87\xde\xfd\x06\x96\x66\x63\xab\xe4\x15\xe4\x56\x28\x26\xe6\x23\xda\xb6\x6a\x62\x7e\x95\x6e\x62\x36\x34\xba\xd5\xa8\x37\xfb\x00\x5a\xc6\x48\x9b\xd7\xaf\x4f\x67\x8b\xff\x98\xfa\x83\x60\x3a\x0d\x86\x1d\x06\xd4\xca\x77\xc5\xfb\x8c\x17\xb5\x19\x99\xc0\x9b\x7a\xe0\xf8\x31\x39\x21\xa7\xe2\x19\xf3\xf0\x12\x35\x35\xa1\xd0\xac\x33\x44\x6a\x84\xc2\xc7\x9d\xc7\x19\x42\xa6\x20\xaf\xc2\x43\x2e\x62\x31\x19\xe7\x70\xba\xe1\x77\xeb\xb7\xc1\x68\xb2\xd7\x9a\xd4\x3b\x0e\xa7\x44\xa1\x5f\x19\xcd\x00\x99\x44\x47\x0a\x64\x1a\xfd\x00\xf6\x01\x02\xb1\xa5\x5e\x5b\x09\xd9\x2b\xb6\x95\x90\x41\xf2\x1a\xb6\xba\x37\xde\x75\x69\xf7\xe2\xf9\x3e\x41\xe9\xe3\xae\x28\xbe\xd6\xaa\xc7\xca\x53\xde\x33\x8c\x57\x1c\xaa\x4b\x4e\xbf\x37\x35\x30\xe5\xc7\x27\x1f\x1f\xe4\xe3\x84\x21\xfb\x58\x01\xc1\x32\x99\x70\x54\x3b\xe8\xd2\x56\xa6\xac\xd8\x4a\xf7\x2d\x65\xf6\x95\x76\x6c\x65\x7e\x04\x18\xa6\x93\x35\xee\x9c\x13\x4c\xb0\x3b\x8f\x80\x9a\xb6\x98\x05\x11\x50\xf1\x4e\xe2\x64\x14\xa9\x65\xe3\xc3\xc6\x29\x49\x4e\x12\xc3\x76\x12\x99\x83\x17\x8a\x99\xf8\xae\xf8\xeb\x3e\x3c\xc4\x04\x83\x84\xe6\x4e\x60\xb9\x8f\xf7\x6a\x18\x7f\xf4\x3e\xaa\xb7\xc7\x7d\x0a\xd8\xe5\x06\xd0\x47\x99\x9d\x0e\x74\xb3\x8a\xf7\x4f\xdb\xbe\xf0\x82\x57\xea\x05\xd5\x17\x38\xe5\x82\x57\xb6\x0b\x5e\x25\x2e\x78\x65\xd8\x2f\x85\x79\xbd\x07\xa7\x47\x8f\x25\xab\x1a\x19\xc8\xaa\x90\xe1\xa2\x52\xdf\x83\xa5\x9b\x30\x2f\x17\x76\x5e\x73\x75\xa1\x7f\x16\xea\x24\x64\x03\x78\x0f\xed\x27\xa9\x2a\xc0\xf2\x44\x1f\x4d\x6e\x35\x4a\xd2\x4e\x65\xf5\x5c\x32\x48\xc6\x52\x3a\xf7\xa4\xf4\x2c\x9e\x53\x37\x6f\x26\xa7\x65\x31\x56\x1a\xcc\xca\xe4\x34\x55\xcf\x9d\xaf\x69\xa8\x5c\x64\xbb\xaf\x5a\x55\x63\xa9\xc9\xbe\x34\xa7\x38\xd9\x40\xf0\x64\x82\x1f\x04\x51\xaf\xa0\x7a\x7c\x3e\xbf\xd5\x21\x43\x39\x93\x0a\x57\x4c\x9a\xf3\xc9\x14\xc8\x68\x0a\xcc\xec\xab\x32\xc8\x14\xcb\x48\x20\x63\x60\xae\x29\x0c\xa8\xe4\x1e\xfa\x82\x8f\x85\x41\x55\xb8\xf6\xf7\xc2\xfd\x66\x9a\xf1\xf4\x69\x51\xb5\x29\x75\x5a\xe7\x9d\xe1\xa6\xc9\x6e\x9d\xea\x89\xde\x20\x77\x1a\x74\x86\xe5\xbb\x40\xd0\xfd\x79\x7c\xd8\x78\xec\xbb\x9f\x24\x7c\x4d\xbc\x35\x50\xff\x8c\x87\x3d\x32\xe9\xcc\x88\x6d\x16\x30\x43\xc1\x2a\x7e\xa5\x94\xc9\x15\xbf\xbc\xe5\xe2\x91\xb8\xe8\xae\xb4\x35\x51\x73\x56\xd3\x35\xbe\xf8\x4b\xcc\x73\x5d\xfe\x59\xf1\x09\xc5\x02\x7c\xa5\x33\xa8\x1c\x79\x83\x5a\xcc\x0d\xe4\xb3\x8f\xb6\x89\x38\xa3\x03\x40\x77\x5d\x90\x10\x02\xf8\xd7\xb3\x79\x4b\x50\xdb\x46\xa5\x79\x00\xff\x86\x5e\x99\x85\xf0\x46\xbe\x13\x2e\xdf\xe6\xf1\x68\x98\x02\x43\x47\xdf\xdd\xec\x6f\xb5\x70\xa7\x9b\xfd\xad\x16\x6e\xb9\x9c\xbd\xa5\x2b\xab\x35\x24\xd1\xea\x6c\x90\xd5\xd9\xd4\xb3\x36\x60\x75\x3b\x80\x90\xf2\x89\xdb\x37\xd6\x35\xda\xca\x8b\xe7\xee\x77\x22\x48\x31\x6a\x82\x07\x28\xea\xe3\xa1\x84\x23\x76\xbd\x46\xa6\x3d\xd5\xe4\xb6\xb0\x07\x1f\xe2\x29\xd2\xcc\x0a\x3e\xe4\x05\x68\xc1\xec\xe0\x43\x51\x86\x34\x53\x83\x0f\x9b\xb9\x6c\xaa\x71\x63\x7e\x03\x8d\xf9\x8f\xb0\xa9\x06\x7e\x1e\x1b\xea\xb1\xec\x40\x84\x94\x7f\x9c\x62\x4d\x3d\x16\x9c\xd8\x74\x43\x3c\x1c\x76\x42\xdf\xe3\xc6\x53\x79\xc0\x3d\x00\xfe\x67\xf1\x8b\x20\xac\xe8\x64\xa6\x97\x8d\x0e\xb1\xd2\xd1\x6f\x32\x7a\x78\xa0\x05\x82\xe1\xd0\x9f\x7c\xa8\xb7\x82\xf9\x94\xea\xe2\x55\xa9\xed\xab\xaa\x13\xee\x18\x5f\xe9\x76\x07\x1b\x05\xa9\xcb\x15\x42\x3b\xee\x35\x81\x49\xd9\x20\xeb\x1e\x82\x3d\xb2\x49\x0f\xd0\x11\x45\xc4\x7a\xaf\x55\x64\x4f\xaa\x28\xe6\xc0\xa9\xe7\x17\x71\xda\x14\xe5\x93\x3e\x8b\xcc\x58\x54\xaf\x73\xa9\x46\x74\x0e\x6b\xdb\x05\xfc\x7b\x9d\x80\xaf\x09\xda\x0e\xd8\x19\x96\x02\x98\x44\xe0\xed\xbe\xf1\xce\x8a\x67\xcf\x5f\x90\x4b\x6f\xf1\xec\x8c\x5c\x79\xa5\xea\xd5\x6f\x18\x5c\xc0\xca\x55\xaf\x76\x77\xdd\x73\x66\xca\x7b\x03\x49\x80\xf8\xed\xd2\xad\xd2\xe7\xea\x6f\x9d\xd3\xf6\xcc\x56\x4f\x3a\x6e\x74\xa9\xf4\x27\x45\xfe\xf9\xfc\x85\xfb\xec\x0c\x31\x60\x52\x6a\xe0\x48\x17\xf9\xa7\xa8\x81\xa1\x93\x70\x93\xb6\x8a\x5b\x89\x8a\x80\x30\x1d\xb7\xf5\xbc\x16\x52\xe2\xeb\x78\x5c\x93\xb4\x55\x04\x7e\x24\xd2\xe7\x16\x15\x63\x96\x89\xc0\xdf\x92\x11\x57\x85\x5d\x2a\x72\xbe\xf7\x34\x71\x8f\xfc\x1e\xc3\x97\xf8\xe0\xbd\xcf\x10\x07\xa1\x5b\xd5\xec\x42\x0c\x46\xd0\x2c\xe2\x65\x1b\x08\xc8\xef\xba\x98\x10\xf8\x99\xb8\x0b\x27\x18\xea\x51\xd8\x3d\x85\x4f\x63\x13\xa2\x4b\xeb\x36\xf4\xda\x1e\xaf\x77\xbf\x4e\xbc\x5e\x17\xd5\x92\x43\x78\x21\x5e\xd1\x7f\x55\x31\xe7\xcd\xb3\x1c\xed\x78\x1f\xa5\xb1\x63\xd2\x04\x3b\x06\xcc\x5d\xf6\xee\x3b\xe7\xd7\x57\x54\xf7\xfd\x94\x5e\x60\xf7\x85\x5b\x9d\xd1\x65\x77\xbb\xbc\xb3\xe3\x7c\x54\x16\x13\x48\xa1\xfd\xa4\xff\x76\xc9\x6d\x54\x52\x2c\x52\x60\x94\xfc\xa4\xfe\xa2\x5a\x11\x16\x50\x96\x21\xe7\x82\x75\x25\x79\xcc\x25\x1f\xf7\x9a\xa3\x89\x3c\xba\xb3\x73\x87\x95\xd5\x63\x90\xef\xfb\x29\x7e\x04\x12\x24\xf1\xd5\xfe\x08\x86\x2a\xfc\xf6\x89\x21\x61\xfd\x01\x37\x1c\xd6\x97\x90\x9f\x46\x9f\x29\xe4\xdc\x80\xb9\x1b\xed\xba\x2c\x02\x29\x1d\x3e\x9b\x2e\xaa\x1d\x88\xba\x76\xab\x7f\x50\x41\x9a\xdd\xd6\xce\xce\x7c\x67\x27\xfa\x09\xb9\xc3\xf4\x26\xc7\xb4\xab\x1f\xb2\x15\x9c\xc0\x2f\xce\x82\x19\x28\x08\x71\xd9\x36\x3a\x23\x14\x90\x34\xc5\xc2\xe0\xb7\x55\xa8\xc1\x47\xc3\x59\x71\x1a\xdc\x53\xad\x5c\x5b\x65\x9f\x2d\x9e\xed\x3f\x77\xc6\x82\x02\x6f\x9f\xaa\x46\xe3\x85\xae\xd9\x94\xf6\x7e\x7c\xa1\xea\x36\x06\x4d\xcb\xa0\x68\x95\x80\xec\x75\xc2\xc9\x5e\x71\xa9\xfa\xd3\x4b\xdc\x5e\x32\x28\x13\xb9\x4a\xc4\xb2\xf5\x07\xe0\x27\x24\x2a\xc9\xb7\x30\x56\x55\xe8\x6a\xbc\x6a\xf5\xcf\x84\x6e\xf7\x1f\x23\x4f\xf8\x67\xef\x4f\xd3\xca\x58\xfd\x9c\x7c\x56\xbc\x77\xe4\xf3\xe3\xad\x1a\x37\x98\x31\x6e\x08\x6e\x96\xc6\x18\x33\x21\xcd\xbf\x4b\x4a\x2c\xdd\x2b\x34\x3a\xdf\x5b\xd9\xbc\x75\x9b\x48\x4e\xea\x69\xed\xee\x36\xb3\x7b\x6c\x7a\x73\x2f\xd4\x9b\x3b\x34\xdd\x5c\xc4\xdc\x9d\xb0\x9a\xa8\xfd\x36\x91\x73\xdf\x5b\xc9\xb9\x6d\x4d\x59\x56\x6c\xdf\xc0\xbf\xfd\x98\x91\xb6\x71\x6d\xdf\xdb\xb8\xb6\x37\xbb\xd8\x9f\xe6\x08\x59\xd5\xbd\x17\x70\x74\x42\x86\xe1\xfd\xa7\x2d\x5a\xd6\x5a\x05\xde\x19\x3d\x2c\x3a\xa1\x83\xeb\x12\x64\x9d\xe1\x4b\xfd\x99\x3a\x3d\x4c\xa1\xa3\x0d\x5d\xd8\xac\x8b\x90\xdb\x4f\x77\xbe\x3f\xc4\xc2\xc7\x54\x4b\x8e\x68\x18\xbe\xa0\x83\xd9\xb8\x4f\x7e\x61\xdb\x83\xb6\x0d\xaa\x1b\x11\x10\x72\x86\x74\x29\x1f\x1d\x38\x5f\xe8\x9e\x64\xdf\x2f\x0f\xe9\x59\xed\x00\x80\x67\xf0\x1d\x11\x6a\xc6\x76\xcf\x5b\xf5\x94\xba\x41\x56\xf0\x32\xd0\x9a\x5b\xfd\x8f\x51\x68\x53\x41\x05\x22\x52\xe5\xe4\x60\x33\xc7\x64\x5c\x74\x6e\x64\x05\xf7\xd2\x27\x32\x05\x3d\x44\xb9\x17\xef\x9c\x0e\xf3\x6e\xb9\x44\x74\xfd\x81\x1d\x7d\xc1\x95\x08\x4d\xfb\xd8\x55\xd4\x96\xe7\xfb\xcf\x9c\xf2\x2f\xa5\xe7\xb8\xf5\xbc\xbf\x10\xea\x44\x4a\xf9\xdf\x78\xd1\x83\x66\xd1\xfb\xb5\x54\x69\xee\xd2\xff\xba\x94\xf5\x05\xb1\xca\x7c\x80\x9c\x0e\x5a\xcc\x99\xbb\x35\x19\xcd\xb8\x4c\x88\x1b\x4f\x14\xe6\xaa\xdc\xc8\x59\xf2\x2e\xe8\xa1\x17\x99\x8d\x17\x10\x65\x5c\x4f\x7a\x88\xf3\x09\x17\xfe\xd5\x6e\xb7\x0b\xfa\xcb\x27\x0f\xb2\x41\x9f\x2c\x0a\xe4\x47\xf9\x63\x09\x3f\x94\x66\xb9\x90\x60\xda\xed\xa7\x07\x79\x86\x4b\x23\xc2\xae\x44\x12\x42\xac\x47\xa5\x52\xa9\x20\x0c\xcd\x7f\x81\xcd\xe9\x07\xaf\xfc\x13\xf9\x4a\xff\xd1\xb1\x69\x98\x62\x7a\x95\xd0\x65\xf0\x0d\x3d\xff\xea\x3e\xfb\x8a\x52\xae\x76\xa2\x5c\x7b\xfe\x83\xfb\xec\x87\x15\x9d\xb7\x71\x9e\xdf\x23\x52\x00\x6d\x22\xb4\xca\xd0\xff\x9d\x73\x30\xd7\xe4\xab\xb2\xe0\x96\x78\x73\x55\x64\x79\x41\x99\x94\xbd\xcb\xbe\x57\x6f\x38\x2d\xb7\xfa\xd7\xb5\x0f\x8e\x73\x88\x5a\x2a\x7a\x3f\xb8\xe4\xaf\x6b\x3c\x0e\xae\xf6\x95\xc1\xe4\xcd\x39\xf7\xa9\xfc\x93\xb0\x6d\x6f\xa5\xcc\x38\xc3\x2c\x78\xcc\x24\x5c\x19\x9c\x63\x6c\x81\x52\x2c\x1c\x45\xcd\x80\x01\x84\xed\xe2\x79\x91\xa6\x57\x28\x20\x8c\x29\x1f\x92\x87\x87\xe1\xcb\x06\xc7\x23\xa5\x67\x38\x05\xce\x80\x73\xd8\xf4\xfd\x65\xa1\xd2\xf4\xda\x02\x6f\x57\x65\xaf\xc1\xea\x70\xb6\xe7\x74\xc4\x79\xad\xc0\xd8\x9f\xc0\x63\x60\x45\x64\xf4\xd7\x56\x73\x85\x14\x35\x1a\x67\x0b\xcc\x69\x03\x3b\x4b\x66\x6a\x40\x0b\xd9\x95\x7d\xfc\xdf\xb6\x06\xf4\x77\xac\x01\xfd\xdd\x8c\x64\x82\xc0\x66\x3a\xee\x19\x78\x8f\xfb\x10\xa3\x11\x42\x00\xc7\xc0\xc3\x91\x23\x43\x6f\xaf\xb4\x0f\xe4\x2b\x65\x32\x86\x7f\x9c\x7c\x05\xb9\x57\xca\x82\x7b\x85\x05\xf5\x03\xbd\x72\x89\x2c\xbc\xbd\x17\x64\x09\xbb\xec\xfd\x3f\x4d\x9f\x2c\x15\x64\x0b\x09\xc7\xbd\xc9\xe0\x7d\xff\x14\x06\x6f\x2a\x13\x4c\xd9\x6b\xbd\x36\x41\xeb\xdf\x6a\x2b\x47\x60\x83\x54\x9a\x06\x6b\x98\x3c\x2a\xa4\x6b\x93\x3b\x60\xad\x77\xed\x36\x9c\x5d\x37\xf2\x17\xd7\xa9\x4f\xdd\x89\x4f\x7b\x1d\x5a\x03\xb6\xad\xb6\xf5\x1c\x94\xbb\xd6\x60\x6f\x6b\xc0\xb6\x35\x60\xde\x1e\x51\x6e\xf5\x3c\x88\xa5\x6f\x7d\xce\x63\xb9\x50\x6e\x12\x69\x9f\x5a\xd1\x1e\x6a\xaf\x98\x59\xd6\x67\x5a\x1e\x0d\xe7\xb3\x0f\xa0\xea\xad\x1d\x3a\xcf\xc4\x86\x77\xf3\xd9\x34\x68\xad\x9f\xa4\x81\xb5\x3f\xce\x87\x0d\xbf\x3e\xb8\x44\xd3\xcf\xfa\x54\x21\xd0\xf7\xb5\x29\x51\x3a\x93\xd1\xdd\xbb\xe1\x39\xac\x64\x6b\x47\xc9\x4b\x53\xc7\x9a\x77\xdd\x80\xbb\x6e\x10\xdd\x3d\x14\x6f\x8c\x3b\x89\xb4\x61\x8d\x7c\x44\xe2\x7e\x9f\xee\xfa\xc9\xe6\x32\x7b\x80\x67\xd6\x7b\x71\xd1\xb1\x13\xbf\xb4\xd2\x0e\xbf\xa6\xb2\x24\x68\x57\xdc\xd0\x27\x66\x26\x8a\xb3\xb9\xc7\xcc\xa5\x33\x3c\x65\xe6\x4a\x59\x4e\x33\x73\x2d\xa3\xff\xcc\x9a\x68\x62\xc4\xd4\x01\x09\x02\x0e\x20\x71\x47\x96\xf7\x2d\xee\x31\x6d\xa0\xc7\xd4\x08\xfd\xc1\x96\x7a\xda\xd1\xf5\x12\x65\x1e\x1e\x50\x68\x59\xc3\x7d\x97\x9b\xdc\xc3\x8f\xde\x53\xe9\xc3\xbb\x11\x7c\xd6\x4d\x40\x8a\xd6\x95\x6e\x2e\xa8\xf7\x33\xe9\x16\xfa\x4c\xf9\x1a\xda\x19\x13\xfa\xa4\x0d\xf4\x77\x76\x90\x69\x28\x60\xe3\xb3\xee\xe7\xa4\x6d\x20\xa1\x60\xad\x46\xf2\xee\x04\x6b\xf5\x84\x1e\x55\x58\xab\xc3\x88\xf1\xcc\xcf\xc9\x5a\x3d\x60\x23\x72\x53\x1d\x08\xd6\xea\x1b\xa0\xc4\x0c\xdd\xc1\xf5\x4d\xcd\x0b\xe9\xbf\x04\x6b\x35\x1c\x8c\x58\xab\xe1\x17\xb2\x56\x53\x89\x7f\xdb\x17\xfe\x3e\x29\x0b\xc7\x78\x08\xfa\xc0\x43\xd0\xcf\xc7\x43\x30\xf3\xfa\xf6\x48\x5f\x3e\x49\x64\xe4\xa0\x5f\x03\x18\xb2\xd9\x66\x4e\x34\x13\x8d\xf4\x2d\x6d\x4c\x8d\xe7\x9d\x67\xba\xc4\x38\xfe\x7b\x46\x41\x8d\xb5\x39\xa0\x6a\x62\x81\x2e\x3f\x05\x20\x30\x39\x70\x5a\x1c\x11\x7a\xe8\x02\x44\xba\xd3\x04\xbe\x12\x40\xb2\xc9\x60\x66\xf6\xf9\x0c\x6a\x41\xd4\x3f\x42\xa3\xb7\x54\x68\x74\x3c\xa6\x1c\xca\x9c\xb5\xa9\x97\xcc\x64\x2a\x6e\x47\x9c\xcc\x15\x8e\x8f\x06\x77\x07\x0a\xb1\xe8\xc2\x48\xbb\xbf\x36\x5b\x4e\xa1\xd7\xec\xf6\x5d\x2c\xcb\xbf\xbf\x1c\x3e\xdf\x57\x7e\xd3\x5f\x2e\x19\x16\xa3\xb2\xb2\xbe\x7a\x68\x8d\x21\xcb\xf0\x16\x0e\x39\xa2\x27\x36\x9a\x91\xb3\x10\x79\x3a\xa3\x31\xa0\x8b\xbd\x7c\xa6\xf2\xee\xab\x8c\x54\xff\x36\xee\x3b\xd1\xba\x08\x53\xba\xaa\x27\xfe\xdf\xf1\x5e\x43\x96\xcb\x66\x44\xb7\xa1\x24\xba\x1d\x6b\xb4\xaf\x61\x8c\xe8\x76\xfc\x48\x9e\x57\x7f\x7d\x9e\xd7\xd0\xcc\xf3\x1a\x63\x64\xbd\x89\x69\xf7\x47\x36\x02\x56\x4f\xdd\x50\x30\x5f\x2d\x81\xd0\xa7\x32\xb4\x46\xb0\x7c\x6d\x2b\x18\xe4\x3e\xb7\x0f\xec\x97\x56\x66\xcc\x47\x7c\x95\xa9\xba\x6e\xd1\xed\xc3\x04\x1d\xaa\xa4\x57\xc5\x8f\x11\x50\x97\x32\x60\xc7\xa7\xcc\xb2\x77\xab\x3e\xe7\x0a\x3d\x11\x98\x6c\x65\x77\x6d\x0e\xd2\xa6\x5a\x4a\x32\x89\xe2\x4c\xbe\x31\xea\xf1\x63\xd7\x0c\x3f\x90\x10\x1b\xd6\x22\x14\x05\x1a\xd1\xe9\x1a\x34\xa2\x8f\x20\x09\xad\xca\x3b\xdf\x88\x09\x54\xe5\xfc\xd4\xf9\x40\x73\xd0\x7e\xfa\x66\xda\xcf\xb4\xae\x58\x00\x5d\x7d\x1d\xd0\x35\xa5\x05\x2b\xc6\xaa\xbf\x39\xed\x27\x27\xf7\x6c\xa9\x98\x05\x63\xfa\x03\x62\xb4\x9a\x0a\xfa\xa4\xff\x14\xf6\x9d\x74\x8c\x45\xab\x09\xe2\x11\x38\x92\xec\xf6\xde\xf3\xd1\x59\xdb\x80\x91\x87\xe0\x72\x63\x78\x47\xff\x3b\xc2\x3b\xfa\x9b\xc1\x3b\xfa\xff\x00\xbc\xa3\xe1\x9a\x8d\x4c\xa5\xc8\x82\x65\xd8\xe2\xf4\x1c\x7d\x78\x8f\xc4\xd7\x1c\x34\x91\x66\x03\x04\x11\x3a\xcb\x28\x5b\xbb\x35\x59\xb4\xec\x11\x9f\x78\x4a\xca\x45\xd6\x88\x4f\x5e\x80\x16\xcc\x8e\xf8\x14\x65\x48\x3b\x35\xe2\xb3\xcd\x35\xd6\x34\x96\xc7\x66\x2e\x35\x70\xda\xc4\xcd\x28\x8f\x16\x78\x25\x87\xe9\x9d\xd4\x02\xaf\x52\x22\x39\xaf\x1c\x74\x60\xbd\x05\xe3\xf8\xf6\x2d\xd7\x55\xb6\xcb\x55\x96\x8c\x2d\x39\x1a\x1a\x76\x26\x26\x0b\xab\x58\x04\x99\xc4\xc0\x8c\xa8\x80\xc1\x30\x8c\xf8\x56\x72\x0d\x02\xe7\x6e\xd9\x2f\xc6\xfc\x01\x04\x04\x52\xd3\x71\x3a\x58\x04\x12\x39\xd3\xe8\x60\xb6\xee\x9c\xfa\xf5\x4f\x35\xdc\x8e\x21\x98\x87\xde\xd9\x25\x15\xb8\xe9\x72\xff\x8d\x45\x61\xd6\x75\xa5\x8c\xde\xa8\x38\xf2\xdb\x8f\x54\x54\xab\x33\x07\xfb\x75\xa8\xa4\xc1\x15\xa9\xa8\x33\x88\xfd\x66\x92\x0a\xfd\x57\x43\x2a\xc8\x58\x9d\x72\x6d\x57\xab\xc3\x7e\xa7\xd7\x49\x5e\x27\xbb\x4e\xf2\x3a\xb1\xbe\x29\x21\xb3\x1d\x7f\x34\xa0\x5b\x57\xb8\xec\xd0\x11\xbb\xbe\x2e\x96\x4b\x84\xfe\xd5\x08\x7e\x0b\x76\xf1\x6b\x77\x37\xf6\x1d\x4a\xd4\x40\x5c\x14\x0d\xdc\x4a\x28\xcf\x18\x80\x42\x94\xda\xce\x02\x3f\xe8\x92\x10\x52\x09\x92\xce\x63\xb6\xf5\x57\xea\x90\xa7\xbe\x5f\x23\x48\x93\xc9\x7e\xfd\x08\xf9\xf4\xd5\x3f\x74\xc1\x1f\x4e\x23\x56\xde\xd4\x98\xf6\xa5\x29\xc5\xbe\xb7\x5e\x65\x14\x23\x40\x31\xf4\xfc\x84\x6e\x3c\xbd\xed\x54\x34\x7c\xbc\x96\x39\x01\x10\xa4\x27\x68\x67\x67\x87\xbd\xf0\x48\xb3\xc9\x19\x12\x0a\x57\x85\x5d\x7e\xa4\x47\xbb\xe2\xd0\x05\xda\xdd\x2d\xfc\x55\xa8\x14\xae\xb6\x4a\x5b\xa5\x08\x5b\x2c\xb0\x44\x88\xb0\x2c\x22\xc4\x09\x8c\x90\xf3\x14\x64\x41\x63\x1d\x89\x35\x08\xe5\x68\x45\xe6\x41\x85\xa9\xff\x6a\x67\xa7\xad\xbb\xd3\x39\x37\xed\x3e\x15\xe8\xf9\x9f\xab\x39\xdc\x8b\xa3\x71\xbd\x89\xc9\xe3\x7b\x3f\xc5\x42\x06\xa2\x53\xe5\x44\x30\x81\x68\xb6\x44\x9b\x64\x7f\x10\xd5\xe8\x7e\xfb\x43\x03\x5a\x64\x8f\x07\xba\x39\x8d\x3f\xc9\x3e\x7d\x92\xea\x93\xe8\x24\x70\x1d\xb5\xca\xba\xd5\x44\xc1\x82\x14\x82\xa2\xe9\xe9\x1a\x21\x23\x6d\x4f\x41\x0c\xe6\x2a\xd6\x46\x30\x69\x86\x51\x7c\x6e\x73\x91\x9d\x91\xda\x5c\x66\x67\xa4\x4e\x0a\xe4\x88\x85\x7c\x0e\x63\x38\x5c\xb0\x34\x0b\x03\x52\x89\xfb\xde\x1b\x92\xaf\xb6\x06\x4f\x59\xee\x3e\x2d\xe1\x79\x6f\xf1\x15\xf9\x9a\xb3\xd2\xd6\xaa\x3e\xdb\xa1\xbd\x9e\xd3\x92\x5c\xaf\x20\x0e\x2c\xe8\xe2\xec\xc3\x97\x25\x5d\x9c\x7d\xf6\x2c\xda\xde\xef\x7b\x43\xba\xef\x38\x68\x59\x7b\x05\x19\x98\xc1\xb0\x73\x14\x42\xea\xf1\x07\x78\x98\x90\x97\x71\x47\x65\xd0\xd1\x1d\x13\x7a\x99\xb3\xec\xe1\xa1\x35\x6a\xce\x41\x80\xde\x13\x5f\x4e\x98\x40\x4d\xb7\xaf\xc9\x28\x0c\x3f\xd1\x6d\x38\x50\x2b\x7e\xce\x59\xf1\x92\xee\xa2\x54\x91\xfc\x86\x9b\x2a\x60\xe3\xf9\x82\x7e\xd7\x75\x85\xa1\x21\x10\xf8\xa3\x74\xd5\x82\x5d\x7f\xe0\x8c\x63\xc5\xc0\x08\xd1\xe5\xd0\xa4\xe5\xd2\xaa\xda\x74\xbe\xb1\xb5\xc8\x17\x4b\x54\x0b\xa3\x98\xfb\x44\xe1\x02\xae\x88\xc1\x62\xeb\x96\x38\x86\x3f\x50\x2d\xf2\xcd\xd1\x77\x54\x9c\xa6\xcf\xef\x8d\x16\x7f\x27\x52\xd7\x4c\x31\x74\xb1\xf2\xc2\xcb\xac\x67\xbb\x25\x92\xef\xb4\x3a\x52\x07\x4b\x4f\x91\x33\xd4\x99\xcf\x60\xb7\xc4\xac\x02\x7d\x3d\x85\xf4\xdb\xb1\x21\x7c\x15\x8f\x27\x0f\xe3\xa8\x14\x5c\x4b\x3c\x22\x9f\xcc\x0f\x0f\xdb\xca\xfc\x4d\x99\xda\x44\x99\xc7\xcd\x5a\xf5\x4d\x2c\x96\xd1\xf8\xec\xae\xd9\xec\x68\xd2\x07\xce\xa6\x03\x61\xf3\x80\x1d\xa0\x4f\xbe\x96\xf9\x70\x9b\xab\xb4\xe7\xf4\x64\x77\x11\xc5\x49\x7e\xff\x1b\x31\x07\xff\x3e\xd5\x9d\x28\x91\xbc\xdf\xed\x56\xb8\x82\xd2\xe3\xcc\xd1\x29\x13\xfc\x89\x6f\x0b\x62\x78\x13\x77\xb5\x7e\x77\x71\x69\xff\x3d\x81\xaa\xf2\xc1\x0e\x44\xfe\x3b\x00\x91\x7f\x4c\x01\x22\xff\xdd\x04\x44\xfe\x3b\x18\x05\x0c\xb6\x1d\x54\x24\xb9\x94\x6e\x82\x51\x91\x06\x9a\x28\xa7\xfb\x93\x77\xbc\xb3\x73\xb2\xb3\x73\x7e\x70\x5d\xab\x58\xd5\x80\x4c\x25\x40\x6e\xaa\xdf\x16\x15\x86\x01\x4b\x96\x15\x86\x02\x4b\x20\xc6\xbf\xc2\xa0\x57\x57\x4c\x5c\x97\x00\xdb\xc7\x2a\x8a\xfa\x27\xfb\x45\x17\x2b\x1d\x51\x5d\xc8\xc6\x0b\x00\x55\x2a\xd5\x0e\x4e\x1f\x1e\xae\x9d\x0f\xcf\x96\xbb\x1f\x30\x40\x2b\x09\xdd\x4a\x1f\x42\xf1\xc3\x33\xa7\xbc\xbb\xb4\x15\xa8\x55\x4e\x11\x52\xfd\x03\x15\x84\x07\xa2\x7f\x27\x39\xfb\xb7\x5c\xa9\xd8\xe9\x02\x05\xe6\x8c\x36\xf8\x11\x01\x60\x86\xa2\xc1\xf3\x9c\x0d\xc2\x98\x45\x6d\xce\xa3\x36\x2f\x1e\x1e\xde\x03\x5d\x77\x2a\x18\xfa\xc3\xc3\x20\x76\x7a\xa0\x9e\x7e\x12\x24\xf5\x38\x52\x7a\x1c\x49\x3d\x8e\xb4\xae\x22\xb9\xa7\xf6\x6e\x67\x47\xfe\x1c\xe8\xd7\x1f\x24\xae\xaf\x1d\x21\x83\xc4\xf5\x07\xe6\xeb\xb3\xc4\x44\xad\xf3\xae\x72\xdb\x7a\xb1\x41\xac\xd8\x20\x5e\xac\xe9\x35\x1f\x1e\x42\xd0\x9e\xe8\xb8\xd3\x75\x06\xc2\x00\xab\x2c\xaf\xe7\x77\xab\x33\x8f\xab\xfa\x1a\x54\xcf\x9f\x54\x3a\x5e\xdf\x97\xc7\x5b\x52\x93\xe2\xfa\x90\xa5\xf2\x67\x1c\x20\xfe\xb3\x72\x08\xbc\x7d\x5f\x14\xb5\x0a\xbc\x7d\x7f\x68\x41\xdc\x80\x75\x12\xfa\x7c\xb3\x27\xaf\x21\x33\x20\xd5\xc7\x27\x84\x88\xac\x72\x9a\xf2\x46\xfe\xd8\x08\x6d\xfe\x3f\xd9\xf8\xf0\x7e\xab\xe3\x0b\xe9\xbe\x9f\x40\x86\xd7\x15\x16\xad\xac\x05\x13\xfe\x43\x1c\x3f\xfb\xe3\xcb\xd2\xc1\xc7\x4a\x89\x0e\x63\x52\x7f\xbb\x8f\x90\xe1\x63\x6d\x33\x4c\x78\xf2\xd6\xdb\x2e\xf1\x48\xe7\xf5\x44\x31\x3b\x34\xbc\x99\x51\xb3\xef\xd3\xa5\xa9\xfa\x97\x71\x5a\xd9\xd4\x3e\xbf\xf8\xb3\x45\x59\xc4\x53\xe4\xaf\x44\x16\xd3\x5f\x76\x6c\x70\x55\xd9\xc2\x9b\xc0\x29\x8b\xbb\x10\xd7\xbb\xe2\xd9\x3a\xc6\xfb\xc0\x73\x2b\xb8\x52\x3c\x88\xfb\x1d\x29\xf0\x37\xa0\xb2\x15\x8d\x9e\xaa\x0c\x1b\x0d\x48\x3d\xee\xcc\x89\xab\xb8\x6b\x14\x36\x69\xca\x31\xe5\xfa\x05\xdb\x64\x7f\xf0\xfe\x8a\x9b\x29\x54\x41\xda\xfa\x50\xb3\x36\xdb\x6b\xfa\x3d\x8f\xa5\xac\x24\x2c\x65\xd5\x1f\x6c\x64\x01\x96\x11\x53\xfa\xc2\xbc\x34\x29\x03\x66\x28\xbb\x2e\x12\x4a\x13\x10\xd1\xa1\xbb\xa0\x36\x73\xd8\xf6\x16\x60\xa2\xab\xc7\x74\xf0\x76\xe9\x5e\x5c\x0e\x1a\xa3\x90\xde\x18\xb8\x66\x4d\xa3\xc9\xb2\x04\xf0\x29\x02\x97\xa7\xa1\xc4\x10\x00\xdc\xa3\x2b\x01\x9f\xf0\x0f\x86\xb9\xce\x8f\xa4\x3c\x50\xfb\x1c\xdd\x82\xca\xe9\xa9\x06\xc6\x81\x09\x0d\x03\x33\x30\x0e\x8c\xec\xe8\x0f\x39\xd0\x46\x94\xf5\x9e\x2f\xf4\x90\xb4\x93\x38\x0c\x80\xdf\x20\x37\xc4\x4f\x0e\x47\x43\x05\x7c\xb8\x00\x86\x65\x23\x7a\x37\x74\x26\x65\x4c\xf0\x1a\x19\x09\x18\x8f\x1c\x95\xbf\x69\xba\x20\xfa\xf9\xa7\x60\x80\x1a\x45\x1b\x2c\x90\x53\x7f\x26\x7e\x5f\x91\x1f\x4b\x80\x34\x48\xc5\xad\xe6\x68\xbc\x44\xff\xfc\x40\x7c\xf5\xbd\x21\xff\xba\x02\x0c\x22\xc5\xe1\x2f\x46\xc9\xe0\xef\xdf\x18\xf5\xdf\x8a\xe1\xa2\x45\xf0\xbf\x88\x47\xf0\x9b\xa1\xff\x93\xc7\x86\x86\x63\x16\xb8\xff\x85\x15\xeb\x7f\x69\xc5\xf9\x87\x07\xf2\xf0\x50\xb6\x42\xfd\x4f\xbb\xf5\x31\x2d\x50\xe0\x56\x3c\x1d\xf6\x9f\xfe\xe3\xb0\xff\x46\xaf\xfb\x70\x34\x3b\xc4\xd9\xbc\x12\xf8\xff\x7b\x65\x72\x0f\xdf\x0e\xa1\xd6\x2b\xf8\x76\xe4\x25\x9d\x55\xfb\x2f\x56\xe4\x98\x0d\xef\x09\xfb\x38\x65\x1f\x67\xec\xe3\x9c\x7d\x5c\xb0\x8f\xd7\xd0\xcc\x1b\x3d\xe8\xe1\x69\x12\x11\xd4\xac\x83\x4b\xe8\xf1\x15\x06\x58\xa0\xdf\xe7\x9d\x31\x66\xe1\x0d\xb9\x02\x0c\x85\xeb\xf2\xcf\x64\xff\xc5\xcf\x35\x43\x22\xc2\x9b\xfc\x8e\x6a\x08\xd5\x99\x7a\x43\xff\x4e\x0d\x79\xc0\x04\xcb\x14\x62\x80\x28\xa1\x7d\x34\xd8\xbb\x9b\x04\x33\x5f\xcd\x1c\x97\x8b\x96\x14\x86\xa4\x98\x4b\x65\x35\xb9\xec\xa6\xd2\x07\xb8\xe8\x28\x59\x31\xfc\x59\x1b\x21\x02\x38\x9e\x5a\xe8\x8a\x35\x75\x83\x3b\xca\x84\x09\xf3\x66\xee\x4f\x96\x1f\xb1\x5f\xf4\x5d\x31\x76\x2b\x92\x72\xd4\x7e\x02\xc7\x09\xc6\x38\xf1\x95\xd8\xc0\xa4\xd0\x82\xbd\x7a\x45\xde\x98\x43\x2f\xf8\x42\xad\xce\xde\x5b\xaa\x06\xf3\xb1\x8f\xdd\x9d\x23\x54\x7e\x34\x59\x08\x43\x29\xfb\xc1\x82\x23\x0c\x57\x01\x18\x82\x27\xbb\x48\x99\x05\x45\xfc\xef\xa0\x62\xb0\x86\xeb\xa7\x53\x31\x58\xe3\x15\x70\x20\x52\xab\x5a\x23\x34\x32\x58\x1c\x8e\x93\xf5\x8e\xf3\xb0\x38\x9c\x24\xeb\x9d\x44\x5d\x4d\xaf\x7b\x9e\xac\x7b\x9e\x83\x01\xe2\x34\x59\xed\x34\x07\x03\xc4\x59\xb2\xda\x59\xd4\xd3\xd4\xaa\x17\xc9\xaa\x17\xff\x00\x79\x04\x56\xc3\x37\x64\xed\xa4\x96\x1c\x9c\x0e\xd6\x24\x1c\x1c\x9f\xc3\xd4\xba\xd6\x7c\x18\xce\x77\xf1\x0e\x12\x44\xd7\x4e\x18\xcb\x20\xcb\xb0\x66\xd2\x64\x91\x65\xdc\x27\x2b\xde\xcb\x8a\x19\x04\x97\x87\xc9\xba\x87\xb2\x6e\x7a\xd2\xd0\x51\xb2\xea\x91\x0c\x9e\xca\xb8\xec\xab\x64\xdd\x57\x19\xd9\x58\xd6\xfc\x36\x6b\xca\x97\x31\xc4\x26\x9e\x08\x61\x4d\xa3\x30\x66\xc6\xc5\x6b\xb3\x05\x0c\x0c\xb8\xeb\xe4\x0a\x99\x5b\x01\xa9\x6c\xad\x54\xbb\x78\x33\x8f\x24\xdc\xc8\xc1\xb8\x91\x9f\x72\x63\x0d\xce\x0d\x1b\xe9\x46\x56\x04\xd5\xd5\xff\x49\xde\xd1\x95\x57\x27\x22\xe0\xe7\x2a\x33\xa4\x2b\x3f\xca\x5c\x0e\xaa\xd8\xcb\x64\x6f\x2e\x69\x6f\x30\xee\x06\x00\x96\xa8\x7c\x5c\xce\x8d\x57\xc7\x95\x9a\xdc\x49\x2f\xcb\xe8\xad\x94\xe1\x4e\x47\x4a\xd2\xcb\x74\x67\x47\xfe\x6c\xb9\x64\xa6\xfc\xf4\x5d\x32\x56\x7e\x76\x10\x0b\x46\xfe\xec\xba\x64\x19\x53\x94\x97\x4c\xd8\x3b\xcd\x4c\x98\x39\x15\xe4\x8e\x16\xf7\x4e\x9f\x9c\x02\xe0\xf0\xb9\xd5\xbd\x13\x62\x01\x5b\xc2\x0c\x80\xc9\xdd\x1f\x9c\x8a\x4c\x99\xca\xa9\x05\xa2\xe6\x3e\x2d\x99\xe6\x56\x24\xd3\x9c\xd0\xfb\x4a\x26\xd3\x1c\xd3\xa3\x4a\x32\xcd\x6d\x14\x19\x6c\xc3\x82\x8b\x27\xd3\xdc\xb1\xd1\xba\xa8\xde\x89\x64\x9a\x0b\x08\xbb\xbf\x75\xef\xae\x2f\x6a\xde\x2d\xfd\x97\x48\xa6\x81\x83\x51\x32\x0d\xfc\xc2\x64\x1a\x67\xb9\xb3\x23\xc0\xf3\xe0\x9b\x95\x1f\x24\x32\x8c\xb1\xc2\x54\x47\xe7\x4e\x1c\x6b\x0e\xce\x69\x2c\x47\xde\xa8\x54\x57\x4f\x33\x93\x74\xa8\x6a\xdb\xdc\x63\x32\x24\xea\xb4\x4d\xc1\xcf\xcf\xa6\xc2\x6b\xef\x34\xcb\xe2\xaf\xa7\xf0\x2c\x6b\x54\x02\xf7\x5e\x6f\x6e\xf6\x67\xb9\x00\x8a\xf6\xd1\xdc\x0b\x5a\xa0\xab\x5f\x7a\x6f\x34\x6b\xff\x95\x84\xe5\x63\xd6\x7e\x08\x99\x8b\x63\x87\x98\xaf\xa8\x43\x82\x33\xeb\x1f\xae\xe8\xfe\xa4\x88\xf1\xcf\xd3\x88\x18\xe6\x32\xdd\xf8\xbf\x50\x30\x9a\x33\x8a\x2e\xf3\x17\xe5\x43\xc1\xf3\x8b\x32\x0a\x03\xda\xb8\x3f\x05\x14\xd2\x4b\xfa\x96\x4c\xf3\x55\xa2\x13\x7e\x96\xaf\xa4\x96\xea\x34\xdf\xd9\xb9\xd2\xcc\xfb\x4b\x05\x8a\x38\xdd\xf1\x71\xc6\x73\x70\xc8\x84\xbd\x5f\x6f\xbd\xb3\x6a\x9b\xa7\xd5\xbc\x05\xfc\xbe\x8c\x64\x9f\x25\x5f\x14\xda\x2e\xe9\xb1\xfc\xa8\xb6\x9a\x1f\x85\xc7\x94\x43\x99\x8b\x54\xea\x25\x33\xf3\xa3\x7a\xd2\x77\xb3\x7a\x9d\x71\xe3\xbd\xc8\xe3\xd3\x4b\x66\x14\x9d\xc9\x8c\xa2\x73\x97\x47\x23\xc7\x17\x2a\x2d\x64\x15\x8b\x3c\x3c\x0c\x84\x01\x3f\xc5\x52\xbe\xbd\x44\xae\x27\xb9\xb4\xc5\xef\x58\x9b\x65\x62\x94\x53\x48\x8c\xd4\x65\x32\xca\x61\xd2\xdb\x34\x4e\xc6\xa4\x3f\xc9\xe8\x4d\x62\x2f\x7a\xc4\x3d\xf1\xce\xcb\xd3\x76\x6c\x81\xa3\x85\xf0\x6c\x06\xeb\xf0\xbb\x7c\x98\xee\x51\x6b\xd8\x23\x00\xe6\x34\x5f\xcf\x7e\x39\xc6\xe1\xf2\xde\xc2\x1a\x61\xbd\xa4\xdd\x9d\x55\x72\xc9\xfb\xd4\xad\x04\x17\xb2\xa6\x3f\x9e\x41\xc8\xe7\x34\x1c\x8d\xc1\xf1\x6e\x80\x0a\xe2\xcf\xff\x7d\x38\x9f\xc2\x15\x71\xe1\xad\x6c\xd1\xeb\x6b\x5d\x03\xf2\x8a\xa1\x12\xdd\xab\x92\x51\x0c\x95\x08\xde\x0c\x22\x8b\x91\x33\x54\xdd\xce\xcf\x78\xcf\x76\x95\xee\xba\x59\x24\x16\x5a\x1b\x65\x6b\x1b\x29\x0e\xb0\x88\xd8\x77\x6b\xc0\x83\x5c\x6c\xc3\x6c\x1c\x5a\xf1\x02\x3c\x3c\x28\xc9\x73\x5e\x94\x3c\x87\xfd\xb1\x9d\x94\x9d\x3c\x28\x55\xca\x2b\x14\xf1\x9c\x16\x87\x65\x1f\x32\x4c\x76\x2a\xeb\xf1\x4f\xf7\x40\x7e\xab\x88\x85\x8c\x96\x6c\x7e\x82\x63\x9f\x9d\xb3\xe7\xe5\x52\x89\x80\xa8\x03\x85\x40\x9f\x71\x8a\xe7\x30\x35\xf4\xe5\x79\x91\x73\x79\x86\x35\x6d\xa4\x86\x70\xc3\x4b\x28\x92\x2b\x51\xfa\x74\x7c\xde\xd3\x91\xe8\xa9\x2f\x7b\xea\xdb\x7b\xfa\xc5\x39\x7f\xfe\xe3\xcf\xb1\x8e\x9e\x25\x3b\xaa\xee\x23\x78\x59\xdf\x45\x29\xd7\xe9\x80\x60\x87\x32\x0f\x4b\x34\x8d\xc6\x4b\xae\x9f\xdf\x7b\xd5\xbc\xd4\x7a\x1a\xed\x9c\xd9\x3b\xec\x24\x68\xcc\xa1\xfd\xcf\x85\xf8\xfd\xc6\xce\x6e\xf0\x70\x36\x5a\xaf\x3b\x2e\x2a\x0b\x4e\x57\x19\xd5\x65\x34\xaa\x23\x31\xaa\x7f\xc3\x5e\xf4\xf8\x51\xfd\x92\x3a\xaa\x5f\x32\x25\x12\x67\x7e\x70\x56\x29\x76\x99\x3b\xcc\xe5\x84\x15\x1b\x0e\x6c\x17\x53\x98\x37\xca\xe6\xbd\x95\xd9\xbc\x0b\x2d\x9b\xf7\x36\x96\xcd\xbb\x78\x64\x36\xef\x72\xfd\x6c\xde\xdb\xec\x6c\xde\xf5\xb3\x19\xc1\x72\xad\xa4\x33\xc6\xd9\x99\x75\xb1\x3f\xee\x79\xd0\x0c\xf3\xfc\x24\x3c\xf5\x05\x9e\x8b\xcc\xf4\xea\x6e\xf4\x54\xd7\x58\x5a\xae\x01\x3b\xa1\x9c\x45\x19\x23\x62\x4d\x35\xfd\xee\xa3\x00\xc7\xa7\x88\x06\x7f\xce\xa4\xd7\xbf\x61\x54\xd8\x35\x51\xfc\xed\xf0\x01\x2a\x32\x71\xd8\x25\x41\x94\x8f\x8a\xc5\x5c\x73\xb2\xec\xa1\x74\x23\x93\x57\xde\x28\xf2\x28\x1b\x95\xdf\xbb\x60\xd6\xdd\x02\xe9\x25\x3d\x97\x9c\x17\xd7\xf3\xc9\x19\x53\x99\x9a\x4d\xce\x8f\xb4\x0d\x39\xe7\x9d\xe8\x98\xba\xe6\x60\x86\x81\xed\x4c\x60\xca\x53\xef\x59\xf3\xd4\x5f\x70\x67\xf7\xbf\x5f\xac\x48\x9f\x39\x59\x43\xf6\x31\xb0\x79\xbb\xad\xaa\xbc\xc4\x97\x2b\x93\x09\xb8\x50\xa7\xf0\x6f\x06\xff\x38\xc0\x5c\x3c\xa5\xfd\x8e\x5d\x69\xa1\x3b\x74\x73\x66\xaa\x93\x25\xab\x7d\x0f\x8e\xda\xaa\xec\x12\xdd\xb2\x79\x7f\x46\x80\x7c\x20\x28\xe1\xd8\xed\x16\x98\x7c\xf0\xbe\xde\x82\x9c\x0d\xa7\x5c\x82\xdc\x0e\x5e\x64\x7e\xc0\x11\x28\x2a\x9c\x3f\x2e\x51\x94\xf3\xcc\x15\x16\x40\xbd\xc1\xbf\x2f\x01\x99\x83\xa7\xcc\x67\x64\xc5\xb7\x54\x3e\x1c\x91\x14\x9f\x2b\x9f\xde\x37\xd5\x44\x55\xe1\x90\xbc\xb2\x40\xe3\x2d\xc8\xbd\x4b\x8e\xbf\x4f\x52\xfd\xc9\xdf\x9b\x54\xaf\xb8\xd4\x17\x74\x57\x10\xd9\x9e\xcd\x28\x67\xbc\x4d\xbf\x2e\x0e\xe9\x03\xc1\xec\xf1\x25\x7e\xf3\x59\x1e\xf9\xec\xb3\xd7\xe1\xdf\xbe\x78\x5d\x25\x8d\x3c\xf8\xee\xbc\x38\x56\xcf\x44\xba\x0f\xd6\xea\x4c\x05\xff\xc9\x31\xdc\xd1\xda\xa0\x7d\xa2\xa6\xd5\x17\x67\x85\x2e\xcb\x4e\x78\xb7\xa2\xfd\x41\xd5\xcf\xf0\x28\xd6\xf6\x1b\x42\xcd\x2f\x69\x35\xad\xae\xc3\x3c\x59\xf2\x56\x27\x5e\x3a\x26\x80\xd5\x7d\x97\xe5\x8f\xb0\xba\xe1\xb2\xb2\xf2\x83\xef\x98\x95\x1f\x6c\x96\x95\x1f\xfc\x03\x59\xf9\x86\x6b\xaa\x3d\xfe\xfc\xf8\x2e\x67\xf6\xf8\x53\x37\x98\x6e\xb1\x55\x60\x8b\x7e\x63\x56\xed\x16\xd9\x1a\xcf\x67\x9c\x7c\x92\xf6\x77\x36\xda\x02\xa3\xc1\x96\xb8\xa9\x82\xd2\xc9\x2f\xff\x4f\x77\x32\xdd\x41\x68\x82\xa4\xb0\x3b\x08\xf1\x14\xe9\x65\x39\x08\x79\x01\x5a\x30\xdb\x41\x28\xca\x90\x5e\xaa\x83\xb0\x27\x1c\x84\xd8\xf2\x61\x18\x74\x86\xa9\x8b\x88\x39\x88\x20\x12\x08\xea\x71\x81\x20\xcb\x6d\x18\x0f\x67\x69\x60\x38\x4b\xd2\x6d\x48\x55\x38\xa6\xf6\x0e\x40\xa6\x90\x5f\xbb\xf2\xeb\x93\x60\x22\x8c\xeb\x93\x3e\x08\xa9\x79\xdc\x84\xbd\xe8\x61\x27\xb1\x10\x40\xce\xe8\x79\xdd\x22\x73\xc0\x16\x85\x6b\x97\xee\xa0\x45\xf4\x06\x17\xa5\x03\xf7\x26\xd3\xf5\x77\xe3\x92\xbe\x64\x7d\x56\x73\x7a\x1a\x64\x20\x73\x75\x7c\x4c\x28\xea\xd5\xdc\x28\x33\xa6\xa5\x97\x1d\xca\xb2\x6d\x5a\x76\x0c\xb9\x42\x55\xec\xe7\xc4\xbb\xb1\x3b\x92\xc4\x88\x68\xc9\x23\x53\x6f\xb2\x89\x17\x29\x6a\xab\x3a\xd5\xfc\x45\x13\xd5\x5b\xb4\x9a\x6c\x92\xa7\xc1\x11\xed\x26\xb6\x14\x7d\x9b\xf5\x37\x89\x68\xc7\xb9\x5e\x67\x89\x68\xec\x59\xae\xf8\x7d\x69\x7b\x19\x09\x69\x55\xc6\x03\xeb\x5c\xcd\x0b\xb3\xdc\xda\x77\x98\xd1\x06\x6a\x2e\xcd\x45\x42\x67\x28\x8a\xb0\xfb\x9e\xeb\xf7\xcd\x62\x51\x53\xa3\xfe\x95\x79\xcc\xd0\xe6\x8b\xe5\x6d\xaf\x21\xc8\xcf\xeb\xf4\x29\x0b\x41\xb2\xa9\x28\x90\x1e\x7d\x91\x04\x1a\x38\x06\x39\x4a\xed\xcd\x66\x89\x1a\xf2\x41\xa0\xea\x5c\xc3\x69\xee\xd1\x99\xc1\x5a\x7a\xd7\x76\xb4\x7c\x2d\x17\xd4\x3b\x28\x11\x24\xcf\x96\xe0\x6c\x9b\xd5\x47\xd7\x6b\xb1\x2c\x01\x3f\x7c\xd2\x22\xed\x5a\x8a\xcd\x1d\xba\x89\xe4\xe6\x2b\x80\x18\x8c\x3f\x6b\x91\x7b\x4f\xe6\x89\xa7\x3d\x4f\xcf\xc7\x67\x8f\x49\xd3\xae\xdd\xac\xfc\x7c\xf6\xdc\x2c\x75\x26\x05\xb2\xef\xda\x72\x5b\x34\xd3\xb8\xd6\x80\xe7\xf5\xd5\x71\x3c\x90\x71\xf4\xe8\xa7\x65\x3c\x23\x7f\x32\xc0\xf7\xc4\xc5\x3d\x3d\xb3\x4f\xaf\x3b\x08\x86\xbc\x9e\x7e\xb8\xbe\x60\x87\x57\x0a\xfb\xa7\x1e\x1b\xbe\x1f\x8f\x0d\xdf\x57\x62\xc3\x7f\x2a\x95\xa8\xba\xfd\xe3\x3e\x55\xaf\xa9\x8e\xdb\x37\x04\x6f\x9b\x03\xbf\x8d\x36\xff\x05\x95\x3f\xad\x01\xdd\xa3\xe4\x36\x72\xcd\xa8\x1f\x6a\x0a\x02\xfa\xf7\xd5\x66\x9e\x3c\xa2\x34\x3d\x68\xd2\x84\xd1\x9b\x27\x50\xd3\x0a\xb0\x9e\x1e\x6c\x69\x05\x58\x4f\x0f\xb6\xb4\xa2\x87\xa7\xc7\xcb\x5a\x35\xc3\xf4\x78\x59\xab\x66\x58\x1f\x06\x83\x14\x8d\x67\x7d\x54\x74\x63\x64\x6e\xee\x10\x39\x63\x70\xee\x7f\x79\x54\x5a\xaa\x64\x18\x8f\x38\x6c\x20\xa8\xd7\xe6\xb4\xa5\x52\xfc\x00\xaf\x6a\x1e\x01\x6f\x1c\xd9\x08\x62\x02\xde\x8d\xb2\x81\x4e\x18\xd8\xd5\x76\x4f\x84\xed\x1f\xc6\xfd\xd0\x18\x69\xcf\x16\x4d\xbe\x13\x07\xb4\x67\x5e\x3d\x9f\x9f\x5b\xab\x6d\xf5\x3b\x9b\x73\x02\x4b\x20\x4c\xf2\x8d\xcd\x1c\xcf\xb5\xff\xa2\xb4\x41\xab\xd1\x2e\x59\xdf\x20\xed\xce\x47\xb0\xc6\x1b\x2a\x7f\x91\xba\x2b\xc9\xc8\x37\xe8\xa0\x2d\x15\xb2\x0c\xfa\xaf\x88\xed\x72\x1a\x66\xbf\xfe\x02\xdd\x0f\x8a\x15\x9e\x01\xeb\xaa\x36\xf2\x92\xea\xf4\xbe\x35\x10\x15\x25\x63\x8e\xc4\x83\x8a\x68\xb3\x7f\x96\x8d\xc4\x2f\xa1\xb3\x19\xfa\x18\xf2\xa4\x10\x0f\xee\xfd\x0a\xb4\x83\xe4\x50\x73\x04\x44\xb3\x01\xad\xfc\xf2\x7a\x48\x2d\xd3\x97\x43\x1b\xd0\xed\xbc\x46\x02\x14\x9d\xf2\xf4\x7b\x99\xe8\x77\xde\x6e\x33\xae\x9b\xb5\x3b\xbe\xd4\x3a\x1e\xd2\x8e\x2f\x93\x1d\xa7\xaf\xb6\x7c\xcd\xa6\x8e\xf2\xce\xd5\x99\x8c\x29\xbd\x75\x2c\x95\xac\xde\x98\xf2\x01\xc0\x4c\xb9\x92\x5b\x6c\x80\xdc\x09\x04\x33\xa5\x6a\xfb\x37\x01\xa9\x55\x6d\xef\xee\xba\x89\x0a\xed\x1a\x69\x43\x85\xdf\x9a\x74\xca\x18\x1a\x14\xe7\x69\x83\x6d\x29\x3e\xb4\x56\xca\x9b\x8f\x4c\x63\x11\xe3\x3c\xe2\x06\x30\x24\xa1\x6a\xe0\x5d\xd7\x9d\x1b\x46\x3d\x89\xc1\x6d\x28\xe8\xd2\x01\xa1\x7a\x19\xbd\xcd\x1a\x01\xcb\xc5\x8a\x69\x30\x59\xda\xe0\x4c\x88\xfc\x56\xe4\xf4\x19\x20\xa7\xdf\xa6\x60\x50\xcf\x52\x90\xd3\x61\xd9\x33\x84\x76\x6e\xdf\x3c\x3c\x6c\xdf\x64\xa1\x8f\xcf\x20\xb0\x71\x96\x0f\x7d\xfc\xce\x13\xcf\xfc\x46\x8a\xf5\x35\x72\xa3\x88\xf8\x4d\x5a\x42\xfa\x4c\x00\x71\x5d\x0b\x7f\x5c\x78\xb3\x6c\xad\x75\x4c\x97\x7a\xa9\xb9\xde\xd4\xc0\xff\xb1\x78\x8c\xe6\xca\xda\x23\xf7\xde\x52\xd3\x5f\x0f\x69\xab\x6a\xbc\xe3\x7d\x46\x0c\xa1\x68\x8e\x87\xee\x65\x14\x47\x3b\x54\xbe\xa2\xf8\x96\x1d\x52\xe1\xb4\x00\x4e\xe9\x0d\xe0\xb4\x71\x68\x5f\x79\xfa\xbb\x1b\xeb\x2f\x4c\x1d\x9f\x47\x23\xcc\x65\x8c\xdc\x2d\x30\xcd\xf2\xf8\x10\xc2\x51\xef\x8f\x62\x0d\xa9\x77\x72\xec\x1d\x25\x72\xed\x54\x75\x45\x3c\xb5\x3b\x2a\xad\x1f\x27\x9e\x99\x6d\x21\x8b\x35\xc1\x57\x25\xba\x9e\x8d\x0e\x8a\xbf\x54\x7e\x31\xac\x53\x46\xee\xaf\xd1\x01\x27\xef\xe2\xcb\x1b\x39\x8e\x56\xc6\xf9\xae\x33\x3a\xe0\xd0\x9e\x15\xc0\xba\x93\xeb\xe4\xf0\xc0\xa0\x8b\x00\x93\xd9\xaa\x52\x8a\x65\xbd\x73\xf0\xb4\xb4\xf9\x2f\xd7\xc6\x3b\xba\x10\xde\x27\x17\x53\xf6\x98\xe3\x61\xb5\x23\x9d\x03\x74\x6a\x86\xce\x02\x59\x76\xbb\x67\xc7\x3c\x02\x7d\xe3\x9a\x2d\x4b\xc6\x85\x1c\xae\xad\x43\x57\xe4\xe4\xc5\x45\xfc\x7a\x39\xef\x22\x2c\xfb\x55\x0c\x02\x63\x2e\xa6\x27\x1f\xe8\x38\x22\xc6\x2d\x9b\xb3\x31\x1d\xd4\x4b\x0a\x7b\x11\xe0\x78\xf9\x05\xd7\x4b\x21\x3c\x8b\x0b\xac\x65\xee\xc9\x7d\x61\x40\x1c\xa7\xf7\xdf\x03\x17\x6c\x5f\x63\x0c\x9b\x14\xb8\x86\x1a\xe3\x10\x1b\x80\x3a\x3b\x84\x7f\x9c\x35\x0c\x5a\x89\xd4\xcc\xc8\xb2\xf8\x24\x48\xcc\xa9\x4a\xa7\x91\xb3\x24\x5b\xe9\xb4\xea\xaa\x8b\x4f\xd2\x91\xba\xbe\x6e\x96\x5d\x37\xd5\x75\x77\x59\x9f\xb2\x97\x79\xed\x74\xc8\x3a\xd8\xb2\x53\xab\x5a\xd3\x21\x23\x5b\x78\x6a\x7d\x2b\xed\x51\xba\x4f\xcc\xea\x70\xfc\xff\x07\xa1\xd8\xcf\xa7\xb0\xcd\xea\xcd\xbe\xdf\x82\xb5\x26\x8f\xba\x16\x46\x9e\x4e\x99\xb6\x33\x13\xa9\x37\x37\x60\x17\xd7\x95\xb8\xd0\xe5\xd6\xef\x76\xd1\x67\x56\x7a\x9f\x8f\xc6\xdc\xeb\x14\x7d\xb4\xd2\xfb\xe2\x9e\x6f\x33\xe5\xb2\x5b\x40\x5b\xb8\x51\x05\x96\x1b\x5d\x60\xb9\xf3\xc2\x6a\x68\x45\x52\x53\x22\x78\x90\xc2\x89\x39\x9f\xbc\x14\x20\x64\x25\xa8\x18\x2a\x35\x49\xa2\x11\x09\xbc\xb6\xf0\xc2\x9c\x31\x73\xd5\x50\xe1\x87\xc7\x07\x00\x2c\xbf\x93\x16\xad\x39\xa4\x5f\x10\x5c\xd3\x19\xf0\x08\x8c\x69\x5a\xbe\xcc\x0a\x2c\xdc\x3d\xb0\x61\xf7\x91\x27\x58\xbb\xe3\x08\xc8\x19\x12\x8f\xfa\xb4\xfa\x41\xa9\xd2\xac\x62\x4f\xc6\xf4\xea\xde\xb7\x65\xa5\x45\x96\xa5\x4a\x83\xce\x23\x67\xc1\xee\x62\x29\x09\x3d\x0c\x12\x1f\x9b\x2b\x75\xb6\x27\x32\xc9\x01\x00\x8e\x41\x52\xdb\x40\xde\x53\x5b\xa3\xd2\xdd\x7d\x1c\xde\xea\x95\xa7\x09\x62\xe4\x88\x5e\x46\x15\x00\x5f\xa5\x8b\x69\xd0\x30\x17\x83\x32\x4a\xea\xe9\x26\xcb\x0c\x91\xce\x8f\xb6\x56\x3f\xca\x67\xb8\xe1\xb2\xda\x44\xca\x6a\x73\xf9\x6c\x8c\x0f\x90\x3f\x84\xbd\xe5\xae\xf2\xbd\x04\x51\xa4\x98\x9b\xec\x60\xa8\x39\x93\x5f\x42\x3b\xac\x1c\x77\x83\x74\xd1\xea\xac\xcc\x4c\xe9\xb5\x88\x24\x40\x7b\xd2\x43\x08\xc2\x1f\x4a\x95\x37\x20\x88\xac\x05\xc5\x15\x24\xa0\xb8\x96\x56\x28\xae\xc0\x02\xc5\x35\x89\x0b\x1e\x73\x88\x6f\x4b\x24\x4d\x8c\xcd\x20\x5c\x81\x00\xe1\xc2\xfb\x3d\x89\xb8\xb3\xfd\xba\xdd\x01\xd4\x74\x7a\x91\x03\xa8\x64\x1a\xdb\x96\xa3\x3e\x17\x2c\x57\xce\x2c\xb7\x1b\xaf\x83\x31\xef\xe3\x11\x4e\x9d\x91\x4b\x4e\xff\xd1\xde\x21\x3c\xc4\x59\x6c\x42\x44\xaf\x89\x09\x00\x49\x7d\xd7\x4d\x13\x90\x2e\x66\x67\x36\x04\xaa\x5c\x10\x62\x70\x81\x2d\xfe\xa9\xa1\x67\x9b\x61\xbc\x4f\x05\x59\xf1\x34\x31\xdf\xd3\x00\x77\xad\x38\x49\x02\x52\xa4\xe4\x92\x29\x3e\x94\x04\x2a\x6a\x5d\x02\xa1\x03\xf6\x1a\x43\x46\xd5\x79\x42\x88\x4e\x25\x62\x86\x45\xc5\x5f\xa9\x08\xa8\x39\x7a\x59\xd6\x7b\x19\x81\x9c\x7e\x97\x4e\x1a\xc0\x8e\xf3\xf7\x50\x03\xc9\x7d\xea\xee\x91\xb3\x84\x27\xf1\x2c\x2f\xe0\x99\x79\xb1\xcc\x0f\x82\x66\xae\x4f\xaf\x1f\xcf\x30\x9a\xa1\xdd\x4e\x08\x57\x5b\x76\x8c\x7a\xe5\xc5\x3f\x89\xa6\x77\x83\x11\x45\xa5\x87\x52\xe3\xeb\xa9\x75\xf6\xc8\x18\xd2\x1c\xf0\x80\x65\xfe\x96\xe9\xbd\x37\xbd\x0d\x19\xd7\xa6\x72\xcb\x77\xba\x34\x47\x97\x69\xfd\xf8\x95\x0f\x1e\xc3\x1a\x67\xbf\xde\x33\xce\x6c\xcd\x1b\x89\x56\x41\x22\x34\x53\xa6\xd8\x43\xcc\x32\x00\xc2\xf2\x5f\x1d\xaf\xfc\xdc\xa7\x3a\xe7\x75\x0d\xd3\x99\x9b\x60\xa9\x7c\xd9\xac\xee\xee\x36\x99\x79\xb3\xe1\x95\xc0\x84\x59\x6d\xfc\x76\x27\xcc\x97\x8d\xdd\x5d\xb7\xb5\x4b\x85\xa6\x3b\xc8\xdb\x90\x30\xc3\x68\x96\x69\xb9\xbc\x52\xd5\x7f\xd9\xc0\x92\xe0\xca\xa7\x67\x81\x9a\xde\x6b\x55\x11\x90\xdb\x5e\xc4\xeb\xac\xe2\xbd\xe8\x42\x0a\x44\xa9\x2a\x75\xc4\x15\x08\xd5\x6a\x7c\xb7\x32\x8f\x2c\xa8\x61\x99\x88\x61\x6d\xef\xd7\x9f\x4b\x74\x28\x80\x0c\xbc\x6b\x8b\xa0\x0e\x32\xf0\xc2\x7a\x56\x17\x71\xdf\xea\x22\x0e\x3d\xd6\xff\x02\x10\x7f\xdf\xfb\x93\x11\x30\x7f\x17\xf8\x85\x0b\x54\x93\x2f\x30\x0f\x74\x41\x44\x69\x1b\xe2\xd4\x27\x88\x79\x35\xd5\xc3\xb1\xe5\x32\x43\xa5\x12\x6d\xe9\xd6\x7e\xc7\x40\xb4\x6c\xfc\xe0\x69\x20\x5c\x6e\xf5\x66\x4f\xe2\x66\x38\xfb\x7b\xfb\xee\x9e\x02\xae\xe3\x5c\xd3\x23\x84\xfe\xd5\x44\x7c\x8c\x29\xea\x79\x4a\xa5\x1c\x43\xd8\xf0\x54\x09\x1b\xbe\xb1\xbc\x72\x47\x09\xbb\xd2\x54\xc3\x54\x87\x7d\x37\x5c\xe2\x8a\x4c\xa8\x76\x8b\x70\x56\xd3\x1c\xab\x87\xb9\x49\x65\x71\xd9\xa0\xd9\x98\x81\x6b\x1a\x47\xe5\xb6\x36\xda\x50\x45\x25\xe3\x5c\x12\xa5\x05\x69\x87\x03\xec\x43\x0d\xb7\x32\x02\x4b\xba\x70\x65\xe5\xab\x39\xa1\x35\x85\xfe\x3a\xc1\x1b\x12\x9e\x30\xfa\x8b\x36\x39\x59\x11\xeb\x33\xfa\xde\x86\x25\xab\xe3\x3e\xdd\xb0\x64\xb5\x47\x65\x61\xf1\x58\x2d\x25\xa3\x54\x2a\x75\xab\x49\x08\xf5\xd8\xb5\xad\x41\xca\xc3\x5f\xdb\x12\x64\x8d\x15\x30\x46\x17\xe4\x8e\x15\x30\x9a\xdb\xd6\x8b\x15\x30\xc5\x6e\xd8\xcd\x49\x78\x8a\xf8\x59\xe6\x24\x61\x40\xf1\x73\x98\x93\xa4\x69\xc5\x4f\x35\x27\xf9\xb9\x62\x05\xe2\xb6\xcb\x06\xda\x2e\x8d\xe0\x33\x28\x4d\xad\x61\x8b\x9c\xde\x05\xb0\x48\x86\x1e\x04\xd3\xd4\xa7\x3e\xdf\x31\x2a\x0d\x61\x0d\x61\x1b\x07\xbc\x57\xcc\x4e\x22\xf7\x0f\xb7\xda\xa0\x2f\x56\xbf\xca\x6b\xd1\xef\x03\xb5\xda\x5d\xd0\xe9\x60\xec\x99\xac\x18\x0c\x81\x05\xbc\xc8\xd6\xf5\x44\xdd\x62\x13\x95\x19\xb5\x89\x69\x10\x76\x47\x73\x40\x57\xc9\xd3\x8c\xbf\x18\xd7\xc1\xa9\x11\xd5\xe7\x47\xb2\xfb\x4e\xef\xf8\xeb\x98\x49\x38\x4a\xfd\x0c\x59\xc8\xd4\xec\x2a\x47\xec\xbf\x39\x39\xc2\xba\x2a\xa6\x9b\x1a\x6f\xd6\x35\x35\xe6\x86\x09\xea\x47\xa2\xb1\xb4\x37\x9e\x28\x40\x40\x93\x9d\x1d\xf9\xb3\x8d\x29\xe5\x27\x0a\x2e\x50\x3f\x66\x8d\xec\x33\x71\x71\x91\x20\x74\x38\x41\x07\x6c\xc2\xdc\xc8\x6d\x62\x17\x36\x37\xf0\x80\x2c\x48\x08\xe0\xfd\x36\x37\xf0\x10\x0b\xd8\xdc\xc0\x0b\x4b\x38\xc6\x51\x2e\xfc\x9f\x73\x60\xf0\x4b\xe0\xff\x00\xeb\xb7\x19\xff\xa7\xbf\x1e\xfe\xcf\x9b\x08\xff\xe7\x8d\xc0\xff\x79\x03\xf8\x3f\x6f\x4c\xf8\x3f\x6f\x34\xfc\x9f\x37\x1c\xff\xa7\xbf\xb3\xd3\x97\x31\x22\xfd\x27\xc5\xff\x59\x80\x17\x7c\x91\x0d\xef\x93\xee\xdf\xbe\xf4\x16\x59\xd6\x4e\x39\x5d\xa5\xc9\xb3\x5f\x03\xf0\x9d\xcb\xcd\x4d\x9e\x6a\x93\xaa\x81\xf3\xad\x77\x19\x47\xf4\xb9\x8a\xbb\x1e\xb9\x9e\xaa\xa2\x61\x5c\xe5\x87\xe8\xc9\x28\xba\xcc\x5f\x94\xdf\x0a\xb7\x99\x66\x14\xd6\x30\x74\x32\xca\xc2\x74\x9f\x8c\xc2\x69\xbe\xd2\x2a\x5a\x35\x1d\x40\x39\x7c\x26\x33\xe3\x45\xdc\xcc\xf8\x9a\x2e\x72\x6c\xb2\xbf\xf3\xc6\x07\x17\xc5\xfb\xca\x45\xb5\xcb\xed\xb8\xef\xd4\xd6\x2c\x90\x3c\x7d\x99\xfc\x4e\x42\x06\xc9\xd3\x55\x21\x79\xf0\x98\x72\x28\x73\x9d\x48\xbd\x64\x46\x2e\xff\x45\xf1\x1d\x83\xcb\x2e\x86\x11\x34\x0f\x9d\x40\x63\x76\x83\xef\xbd\x6b\xe4\xf0\x7d\x25\x56\xe1\x87\x87\xc2\x47\xf6\x8d\xea\x65\xfe\xac\xfe\x86\x9e\x8c\x8e\x88\xf5\xa0\xc2\x37\xe2\x6d\xfa\xe2\xb0\x99\xe7\xf2\xbd\x9d\x9f\xa0\xd2\xac\x68\x16\xb6\x4f\x6c\x15\xf7\x60\xb5\x51\x76\x40\x6d\x13\x8f\x18\x1b\xc5\x33\xb2\x55\xb6\x77\x62\x6f\x4f\xf8\x57\xa5\xe5\xe8\x50\xd4\x36\xdf\x6d\x0d\x6d\xf3\x33\x4a\x8f\x95\x0d\x57\x0c\xc7\xd6\xff\xc4\x87\xe3\x2b\xdf\x68\x13\x83\x22\xf7\x6a\xdb\xe0\xc8\x02\xab\x5a\xf5\xde\x3b\xe4\x4b\xda\xf3\x1f\x9f\xed\x53\x45\xfc\xbd\x97\x02\x62\x03\x79\x02\xb4\x82\x08\xd3\xa7\x3b\x28\xeb\x12\x28\x4a\x01\x9f\xa0\xf7\xc2\x3b\x70\x5d\xf8\xd7\x4f\x3f\xfd\x44\x1f\xbd\xfa\x51\x8b\xcf\x25\xfd\xb5\xe2\x13\xf8\x3d\x9f\xc0\x81\x9c\xc0\xa8\xef\x0f\xea\x0b\x27\x88\xa6\x6d\x34\x83\xa3\x59\x9d\x51\x6e\xed\xa9\x1e\xeb\x5e\x26\xfe\x94\x32\xc9\x2f\x33\x5e\x8d\x30\xf2\xd7\x44\xb5\x00\xd2\xe5\xed\x86\x48\x5e\x17\x02\xc9\x6b\x8e\xb8\x5b\xec\x71\x5c\x48\xbf\xcf\x6b\xa0\xd8\x04\xad\xc0\xe1\xc4\x77\x8c\x3c\x0b\x24\x7c\xbc\x3e\x18\x1b\x6f\x3b\x47\x62\x57\xa7\x42\x86\xd8\xa0\x9a\x71\x54\x10\x6d\x75\x63\x8f\x0a\x80\xbb\x7c\xc3\x35\xab\x8c\xa9\x4a\xbf\x27\x6d\x91\x96\x8b\x16\xec\x2b\xbf\xeb\xa2\x87\x08\x29\xa2\xe2\x94\xd3\xe6\x60\x28\x4d\x01\x74\xd3\x96\x40\x37\xed\x34\x48\x9e\x0b\x84\xe4\xe9\x6b\x48\x37\xaf\x61\x7f\x7a\xbb\x31\x24\xcf\x6b\xf6\xac\xec\x0d\x98\xe5\xa7\x92\x84\x4a\xa3\x2f\x24\x5b\xff\x3e\x54\x3f\x78\x42\x19\xf0\x3c\xfa\xc2\x72\xe9\x1a\x5c\xa2\x1d\x79\x7f\x9d\x34\x20\x9f\xd7\x00\xe4\xd3\x87\xc4\x38\x36\x3e\x2d\x31\x3e\x1f\xd4\x3b\xbe\x80\x3b\x16\x6b\x0d\x5e\x89\x2f\x0d\x74\x85\xd1\x57\x05\xf5\xe4\x81\x73\xec\x75\xb4\x5c\x7a\xa2\xfd\x54\x42\x61\xfe\xa7\xe0\xba\x6e\xe5\x78\x67\x47\x2b\x70\x1c\x1f\xa5\x65\xee\x51\xea\xb8\x2b\x5f\xb7\xe8\x48\xc3\x1a\x9d\xae\x38\x62\x9a\x99\xb7\x2f\xdd\xeb\x65\x70\x2b\xe7\xf4\x79\x0b\xdb\x8b\x5a\x4c\xcd\xb0\x2f\xaf\x14\xc5\x32\x06\xcb\xd2\xdc\xf6\x62\x2e\x80\x0d\xe4\xda\x65\x2a\xb8\x4c\xf7\xb1\xd8\x35\xe9\xcd\x07\x7a\xf3\x6c\x63\x8f\xdb\xf5\xb4\x11\xa1\x2f\x22\x6c\x11\x56\xc7\x6f\x34\x72\x25\x88\x41\x20\xda\x58\x12\x31\xb1\xea\xec\x13\xc6\x0b\xbf\x28\x3b\x55\x4a\x87\xa1\xc7\xbd\x74\x8a\x7d\xa5\xdb\x4d\x30\x6a\xc4\xc8\x00\xb8\x78\xdd\x22\x5d\x12\x90\x01\x18\xde\xe9\x9a\x63\x98\x2a\x5a\x4a\x9f\x1e\x58\xa1\xcf\x9e\x44\x44\x47\x9b\x74\x98\xf9\x41\x59\x23\x5f\x05\x53\x98\xff\x6d\xe1\x42\xe1\x59\x75\x9f\x31\xc0\x08\x80\x18\x1c\x5c\x3c\x63\x58\xf7\x1d\xda\xc9\xed\x12\xeb\x70\xcf\x13\x95\xaf\xbb\xd8\x67\x13\xaa\x50\x4f\x03\x1b\x92\x00\x67\xf0\xc8\x5a\x5e\x8f\xbe\xfd\x86\x93\x01\x3d\x19\x78\x0d\xa9\x8a\x38\xd8\x1b\xa7\x47\xa8\x8a\x23\x98\x74\xa3\x55\x23\x5a\x17\x7a\x91\xf7\xb6\xd2\xc0\x50\x5e\xa8\x52\x1d\x30\x4a\x69\x94\x64\xda\xe8\x53\xc3\x5e\x57\xfa\xdc\x82\x33\xa2\xe3\xd3\xd6\x3c\x2d\x84\xef\x05\x2c\xd8\x4a\x36\x0b\x68\x16\x40\xdf\x36\xf1\x6f\xfd\xc9\x14\xe6\xc5\x80\xbf\xa9\x2f\xf7\xd9\xca\x39\xa4\xbd\x16\x3a\x93\x88\xa7\x6e\xb2\x10\xec\x2f\xae\x08\xc1\x1b\x58\x42\x6e\x86\x51\x8c\xf7\x50\x70\x5a\xcb\x23\xf5\x3d\xb5\x4f\xe0\x9e\xa6\x0a\x9a\xf5\xac\xb4\x9e\x0f\x5f\x7a\xcd\x9d\x9d\xd6\x6e\xf3\xa5\x37\x3c\x00\x83\x96\x33\xf6\x1a\x54\xeb\x44\xd3\x16\x27\x86\xd8\xf6\x00\x3b\x6d\x70\x3d\xae\x45\x4f\x1b\xc8\xc4\xd1\x5f\x72\xe3\xb5\x75\xd8\x12\xf6\x2c\x5a\xf0\x2c\xc8\xc4\xf8\x18\x4c\x9e\xf5\x68\x49\xde\x2b\xd3\x45\x19\x23\x50\x0d\xe5\x3a\x31\x88\x14\x77\x55\xed\x49\x78\x01\x09\x01\xc4\x44\x85\x60\x57\x11\x16\xc4\x20\xef\x0a\xa9\x01\x3d\x6a\x91\xdc\x70\xb2\x37\xae\x43\x18\xee\xdb\x51\xcb\x4f\xa0\xb5\x4c\xb8\xb2\xfa\x8d\xcd\x8b\x1b\xe1\x80\x1d\xac\x5c\x40\xdd\xe1\xae\x89\xb3\x79\xd0\xf2\x01\xfb\x90\x4a\x80\xe9\xef\x7c\xdc\xb0\x6f\x78\xe3\x71\x8d\x1d\x3d\x06\xa2\x4b\xd8\x0a\x3c\x4f\x81\xdb\x8a\x72\x4c\xfa\x4f\x06\xe0\x65\xee\x08\x3e\x6c\x86\xf4\xa7\x2f\x9e\xa7\x9e\xfc\xaa\xae\xea\x2b\x30\x45\x25\xbd\x74\x5b\xe8\xa6\xc3\x87\x65\x75\xd6\x99\x6c\x62\x3a\xd4\x12\x07\x5f\xea\x24\x8e\x74\x0d\x70\x4c\x81\xe1\x58\x4f\x5f\x1b\xf1\x51\xf3\x58\xdd\xbe\x09\x89\x29\x8c\x23\x31\xbd\x88\x23\x31\xfd\x5c\x5a\xd1\xb5\x9c\xb1\xd4\xb3\x8f\x91\xcd\x8f\x38\x86\x6d\xe9\x06\xfe\x69\x78\x4b\xe5\x4c\xbc\x25\xfc\x58\x6e\x06\xbb\x84\x78\x4b\xe4\xd0\xbb\x8e\xf4\x58\xa9\x7c\x46\xba\x62\x8d\xbc\xf2\xbe\xad\xc8\x11\x82\x33\x25\xb7\xc5\x76\x3a\x30\xd3\xbf\x41\x30\xe3\x25\x66\x71\x18\x06\xd2\xcf\x87\xb7\xd4\xde\x18\x6f\x29\xbe\x98\x44\x78\x4b\x8c\xaa\xa8\x1a\xf0\xf9\x89\xe3\x03\x10\x62\x3c\x28\xca\xe4\x92\x5c\xc2\xcc\x8e\xee\xfc\xec\xe9\x21\x99\xb8\x3a\x2c\xaf\x01\x86\xe9\xf3\x35\x20\x9a\xc4\x1b\x79\x2a\xbe\xd3\x37\xfa\x49\x01\x9c\xfc\x4d\xa0\xea\x78\x7a\xf7\xde\xc2\xe3\x79\x4b\x9c\xac\x5c\xe4\x7d\xef\x2d\x79\xd6\x8d\x3c\xd1\x97\xd8\x6e\x71\xcc\x37\x0d\xeb\x2d\xad\x37\x46\x28\x41\x10\xc6\x23\x24\x41\x16\x38\x21\xbc\x96\x4b\xf0\x5a\xb2\xf7\x00\xc3\xe1\x39\x20\x55\x97\x5b\x94\x41\xd9\x46\xa4\x29\x86\x4e\xd5\x96\xe8\x54\x1d\xe1\x8a\x65\x03\x76\x59\x5f\xfa\x13\xaf\xa7\xc0\x53\xf5\xe3\x57\xf9\xbe\xfe\x50\xab\xa3\x31\xdd\x1f\x6a\xf5\x34\x66\xe3\x46\xa5\x42\x4e\xa5\xe2\x46\xa5\x22\x4e\xa5\x42\xbe\x58\x11\xa7\xbe\x23\x6e\x94\x95\xbe\x05\x7a\x7b\xc4\xe7\xc8\xda\x6e\x63\x3e\xb9\x2e\xeb\x0d\xdf\x5e\xdb\xca\xa6\x92\x85\x3c\xd5\xff\x8e\xc8\x53\xfd\xcd\x90\xa7\xfa\xff\x00\xf2\x94\xe1\x9a\x8d\x6c\x77\xb4\x29\x09\xc4\xee\x8e\xc6\x53\x40\xcc\x9d\xee\x8e\xe6\x05\x68\xc1\x6c\x77\xb4\x28\x43\xc2\x54\x77\x74\x98\x97\x50\xc5\x4c\xe8\x43\x84\xab\xf0\x08\x97\xd4\xc8\xab\x06\x08\xb5\xca\xaf\x8e\xfa\xeb\xa9\x12\xe5\x25\x58\xd2\xc8\x95\xf9\x67\x23\x37\x3f\xf6\x93\x19\x40\x2e\x45\xe8\x60\x54\x2f\x17\x06\x49\x6f\x2d\x78\xa9\xed\xed\xba\xbe\xf0\x3b\xdb\x75\x14\x77\x25\x8d\x0c\x1e\xf0\x45\x24\x4c\xbc\xe8\x93\xe4\xa2\xcc\x87\x8d\xf9\x64\x9a\xcb\x31\x1c\xe1\x06\x8c\xa4\x63\x38\x8e\x20\xd0\x50\xb2\x99\x47\x6c\xe7\x5e\x94\xe8\x43\x03\x46\xbb\x16\x7e\x6b\x2d\xa2\xe4\xe7\xb1\x8c\x26\x04\xf1\x53\x0d\xdc\x8e\xc0\x5f\xc8\x35\xab\xbd\x80\x40\xef\x05\x52\x85\xc7\xca\x86\x5a\xd9\x25\xf2\x89\xb7\x92\x85\x38\x9a\x35\x96\x39\xd8\x2f\x55\x4a\x64\x1e\x01\xa6\x28\x62\x8c\x1f\xc5\x92\x1c\x18\x36\x39\x5d\xe9\xf4\x95\x35\x89\xf7\xa2\x81\x40\xe2\xb2\x53\x4d\xf8\xc9\x2f\xde\xc2\x53\xd8\x04\x4b\x8b\xbe\x21\x93\x84\x63\x7c\x6a\x73\x7d\xfb\x64\x42\x80\x97\xc7\x6a\xe7\x6f\xb3\x02\x73\xee\x2a\xa0\x17\x9f\x92\x99\xfb\x7c\x3f\xe1\x64\x9f\x30\x19\xf5\x56\x87\x57\xd2\x3c\xb1\x7c\x5e\x08\x0f\x6c\x03\x14\x86\xdb\x4d\xfc\xaf\xbc\x21\x95\x5e\xa5\xe3\x52\xb5\xe3\x4e\xbd\xb4\x76\x45\xaa\x22\xa4\x7b\x03\xa6\xcf\xf7\xd1\xb7\x30\x83\x4f\xe4\xf7\x30\x07\x4f\x83\x14\xdf\xe3\x3a\x3c\x8b\x8d\x86\x7b\xa9\xd4\x09\x7a\x79\x2a\x0d\x8c\x8a\x16\x51\xd0\xc0\x2a\xd6\x41\x0d\x53\x4c\x95\x6b\x9c\x21\x8c\x9a\xbe\x41\x55\xab\x05\x1b\x8a\xc1\xde\x90\xbe\x3b\x54\x90\x4c\x8d\xc1\xa7\x9a\xd0\x30\x9b\x11\xba\xeb\x50\xa9\xb4\xd9\x0d\xc2\x16\xd5\x12\x0e\x68\xd7\xb8\x81\xc1\xdd\x1b\xd6\x07\xbe\x21\x48\xba\xf0\xaf\xd3\xd3\xd3\x82\x35\x58\xbc\x49\xd7\xad\x1b\x8b\xf1\x39\x60\x5d\xfb\x74\xe7\x53\xd9\x15\xfa\x07\x6f\x1f\x5c\x02\xdf\xe0\xd1\x63\x83\xf9\x13\x6e\xf2\xbd\x5f\xc0\xbc\x11\x97\xef\xe5\x33\x60\x4b\x7f\xbc\x61\x75\xc0\xdc\xc7\xc7\xee\x27\x3a\x55\x4e\xf4\x09\x22\xfa\x59\x97\xf4\xcb\xc5\x4c\xae\x08\x74\x18\x37\xc9\xaa\x35\xe9\xc4\x19\x69\xa6\x09\x31\xf1\x8d\x06\x89\xcc\xd8\x61\x9f\xe9\xe5\x6d\xf6\xd1\xd1\x83\x84\x7f\x8a\x07\x09\xa7\x44\x17\x43\xf0\x71\x4f\xd7\xee\xa3\x37\xc2\x1a\x9b\x6b\xa1\xcc\x65\x83\xb2\x3e\x8b\xae\x01\x0f\x2b\x7a\xc9\xf6\xd9\xdd\xbc\xbf\xa8\x69\x20\x59\xd3\x9b\xc9\x4c\x70\x23\xf3\xc4\x3d\xfa\x72\xcc\xc4\xbc\x9e\x8e\xe8\x69\x18\x1c\xae\xc6\x3b\xc9\xb5\x1a\x18\x2f\x86\x51\xfa\x4f\x13\x6a\x41\xde\xfb\xe1\xb0\x13\x1a\xd9\xa8\xa5\x8b\xb5\x44\xe4\x12\x2a\x7b\x47\xfa\xf4\x5d\x5d\xb8\xec\x95\x19\xb6\x1e\xd3\x08\x6e\x65\xac\xa5\x60\x48\xa5\x49\xc6\xa1\x98\xd1\x58\x48\x6b\x2e\xb1\xce\x08\x98\x25\xf3\xd7\x81\xab\x61\x45\xc5\x78\xa4\x1a\x25\x7a\xa6\x28\xe9\xde\x77\xd7\x32\xad\x28\x5b\xe9\x5a\xa6\x35\x58\xd7\xce\x0a\x69\x0d\xd4\xcd\x12\x76\xad\x78\x65\xe9\x42\xbf\x09\x76\x4c\x13\xfa\x55\x99\x1f\xcf\x90\x56\x4c\xe6\x8f\x8b\xfc\xfc\x3c\x2d\x17\x13\xf9\x93\x12\xbf\x28\x42\x5a\xba\xc4\xaf\x0b\xfc\xad\x27\x8e\x3f\xcd\x89\x55\xc5\x17\xc5\xdc\xc1\x88\xad\xc8\x28\x21\x65\xce\x81\xc2\x59\xd8\x8a\xc9\x9f\x2d\x26\x4f\x76\x33\xd3\x9a\xbb\x4c\x04\x0a\x6c\xc2\x56\x9b\x74\x41\x84\xee\x59\x85\xad\x0e\x16\x48\xe3\x1d\xec\x1f\x74\x25\xef\x60\xd7\xb2\x29\xf7\xd3\xe2\x0e\xb7\x5b\x0f\x0f\xdb\xad\x2c\x70\x9a\x2e\x84\xe5\x75\xf3\x81\xd3\x84\x5e\xd7\x1e\x7c\xa7\x3e\x1b\x21\xf7\xb5\x60\x01\x0e\x1f\x21\xf7\x99\x82\xee\x86\xb4\x45\x35\xe8\x6e\x90\x11\xf7\xc6\x9b\xe2\xe1\x69\xe1\x46\xc9\xc2\x82\xfc\x2c\x90\x01\x1c\x3d\x36\x24\x23\x6f\xa8\x07\x70\x68\x57\xe3\x11\x1c\x2d\x64\x1b\x57\x1e\xe1\x48\xb2\x91\x71\x5f\x5e\x62\xdf\x3f\xb2\x79\x23\xbc\xc4\xdb\xa0\xb3\x42\x44\xfe\x01\xdf\xca\xd4\xb0\xcf\x05\x85\x7d\xcc\x32\xe2\x22\x02\x87\xf9\xb0\x4a\x02\x8e\x82\xd3\x64\x48\x34\xc2\xbd\x94\x4e\x78\x6c\xa6\x8f\x86\xfd\x50\x97\x1b\x78\xcf\x3e\x76\x47\x77\x30\xe6\xec\xd7\x39\x55\x7d\x19\x5e\x56\x2e\x8f\xc1\xc0\xb8\x05\x85\x11\xf4\x14\xb7\xe7\x9f\x08\xbb\x50\x59\x8f\x9f\xb0\x9a\xec\xd5\x04\xd9\xcd\xf8\x50\x84\x3b\xdc\x43\x1f\x6f\x1d\x5f\x00\x94\xc3\xb9\xa7\x97\x1f\x01\x52\x11\xbe\x6a\xf2\xfc\x44\xba\x91\x98\x99\x44\xd6\x26\xaa\x81\x8d\x42\xb3\x2e\xa7\xb4\x00\xaf\xb5\xa5\x89\xc8\xc7\x89\x3b\x8c\x96\xe7\xc9\x26\x8e\x9e\x0a\x0a\x1e\x4a\xdd\x94\x1d\x82\x29\x5b\xd8\x06\x9a\x4f\x21\x0b\xa4\x1b\x46\xad\xa8\x94\x79\x8c\xb1\xd6\x6d\x7a\xad\xbd\x8d\xe1\xc2\xd0\x11\x67\x16\xa4\xae\x9b\x43\x40\x30\xe3\xc3\x10\xb1\x57\xf5\xff\xfb\xf2\x55\x1e\x01\x46\x0e\xe1\x0e\xf4\x80\x57\x28\xef\xfd\xb2\x57\x2e\xac\xe8\x9e\xf4\x7f\x03\x00\x00\xff\xff\xdc\x02\x04\xb3\x7b\xeb\x02\x00") func uiJsLibsNvd3171NvD3MinJsBytes() ([]byte, error) { return bindataRead( _uiJsLibsNvd3171NvD3MinJs, "ui/js/libs/nvd3/1.7.1/nv.d3.min.js", ) } func uiJsLibsNvd3171NvD3MinJs() (*asset, error) { bytes, err := uiJsLibsNvd3171NvD3MinJsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/js/libs/nvd3/1.7.1/nv.d3.min.js", size: 191355, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsAppTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x94\x92\xcf\x6e\xe2\x30\x10\xc6\xef\x79\x8a\x91\x4f\x41\x62\xe3\x7b\x58\x56\x0b\x12\x42\x7b\xd8\xaa\x6a\xa5\x5e\x91\x89\xa7\x89\x2b\x6c\x47\x63\xa7\x14\x55\x7d\xf7\x1a\x43\xda\xa4\x29\x28\xcd\xc1\xff\xf2\xfb\x3c\x9e\x6f\x86\x73\x70\xb6\xa1\x02\x73\x10\x75\x9d\x79\x97\xf0\x70\xf4\x9b\xf0\x11\x09\x4d\x81\x50\x0b\x5f\xcd\x99\x3f\xd4\xca\x94\x8e\x6b\xe5\x2b\x52\xbb\xa7\x8f\x55\x26\x83\x86\x01\xff\x93\x7c\x2f\xac\x45\x89\x8e\x97\x24\xea\xaa\x05\xaf\x70\xda\x1a\xe5\x2d\x8d\x20\x8d\x95\xe8\x46\x70\x84\xce\x6f\xf0\xa5\xde\x59\xc2\x31\xf7\xba\x10\xfe\xf3\xe2\x40\xc2\xa2\xf1\x95\xa5\x1c\x16\x46\x12\xee\x61\x69\xcd\x33\x1a\x4f\x08\xa9\x30\xf2\xb0\xb5\xc6\xfd\x2d\xb5\x08\x4e\x14\x56\x4f\xba\x82\x25\x09\x0d\x6b\x6a\x0c\x2a\x82\x74\x1b\x76\xe5\x69\xd3\xe5\x13\x9d\x91\x6d\x3c\x66\x3a\x24\x04\x73\x60\x95\x70\x15\x9b\xb5\xc7\xa9\xb4\x45\xa3\x43\xbc\xac\x44\xbf\xda\xe1\x71\xb9\x3c\xfc\x93\x29\x23\x6b\x3d\x9b\x4c\x81\xc5\x14\x7f\xb5\x29\xb2\x29\xbc\x26\x10\x3e\x76\x32\x9d\x85\x87\x4b\xad\xcc\x83\xc2\xbd\xcb\xd6\xb1\x0e\xb7\x21\xd3\xe9\x19\x3a\x3b\xde\xc7\xfe\x9f\xcb\xd0\x05\x8f\x86\xf7\xa9\x9b\x58\x82\x38\x7e\x05\xdd\x68\x92\xe7\xc7\x71\xa3\xe4\x25\xc5\xe0\xea\x1f\x29\xfa\xde\xf4\x04\x77\xe1\xd7\xaa\x6d\x8c\xae\x26\xb6\x40\x9f\xbd\x3f\x75\x45\x9c\x06\xa8\xbb\xcc\xba\x01\xcc\xf3\x38\x0d\x9e\x7f\x3d\xc2\x58\x55\xf2\x36\x99\x25\xef\x01\x00\x00\xff\xff\x27\x3f\x35\x45\xd3\x03\x00\x00") func uiTsAppTsBytes() ([]byte, error) { return bindataRead( _uiTsAppTs, "ui/ts/app.ts", ) } func uiTsAppTs() (*asset, error) { bytes, err := uiTsAppTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/app.ts", size: 979, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsComponentsMetricsTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xa4\x58\x6b\x8f\xdb\xb8\x15\xfd\xee\x5f\xc1\x1a\x08\x56\x0e\x66\xe9\x09\x06\xed\x07\xa5\x93\xb6\x48\xb6\x8b\x00\x3b\xbb\x68\x53\xa4\x2d\x8a\xa2\xa0\x25\xda\x66\x86\x12\x55\x92\xf2\xa3\x03\xff\xf7\x9e\x4b\x4a\xf2\x43\xb2\x3c\x45\x89\x20\x63\x49\x97\xe7\x92\xf7\x79\xc8\xf9\x9c\x39\x53\xdb\x4c\xa6\x2c\x33\x45\x65\x4a\x59\x7a\x37\x2f\xa4\xb7\x2a\x73\xdc\xbb\xc9\x1c\x12\xbf\xb5\x72\x29\xad\x2c\x33\xc9\x2a\xe1\xd7\x8f\x53\xce\xe7\x7e\x5f\xa9\x72\x05\x51\xe5\xd7\x56\xe9\x6f\xdd\x2f\x9e\x63\xda\x94\xcd\x3f\xdc\x9c\x9a\x3f\xe0\xdf\x6d\xf1\xc2\xe4\x52\xbb\xb9\x57\x85\x74\xd2\x2a\xe9\xda\x09\x93\xc9\xfc\xed\x5b\x36\x61\x6f\xd9\xc7\x6e\xe9\x2c\x97\x4b\x55\x4a\xc7\xac\xac\x9d\x58\x68\x79\xb2\x2d\xb6\x5d\xab\x6c\xcd\x0a\xb1\x67\x0b\xc9\x6a\x27\x73\x66\x4a\x56\xd4\xda\xab\x4a\x93\xc2\x95\x74\x77\x04\x67\xec\xf1\x6d\x50\x4b\x72\x7e\x2d\x99\x13\x45\x94\xe3\x10\x9b\x4f\xb0\xb2\x1a\x22\x27\xda\x5f\x26\x0c\x03\xcb\x0a\x7f\x01\x55\x6e\x58\xb6\x16\x16\x9f\x1a\xe1\xdc\x00\xae\x34\x9e\x65\xb5\xc5\x46\xbd\xde\xb3\xb5\xd8\x48\x26\x18\xcc\x22\x5d\x66\x55\xe5\xe3\x26\x94\x57\xa6\xe4\x0d\xd0\x3c\xfc\xcd\x65\xa6\x85\x95\x6c\x23\x2c\x90\x53\x51\xee\xdf\x4f\x2e\x35\x3e\x45\xdf\x61\xdf\xa5\x17\xaa\x74\xa7\x06\x08\x7b\xf6\x86\xe5\xca\x55\x1a\x66\x68\xfc\xcc\x72\xe1\xc5\xb9\x26\xb9\xab\x8c\xf5\xed\xa2\x5b\xcc\xb8\xbd\x33\x85\x51\xe9\x4f\xb0\xf9\x8f\x56\x54\xeb\x16\xda\x61\x43\x1a\x2f\xd9\x2a\xbc\x35\xcb\x60\x3f\xd2\x03\xcf\xf8\xda\x96\x58\xc8\xd2\x9a\x82\xf6\x0d\x0b\x9f\x62\x45\x27\xb3\x7f\xd7\xd2\xee\xf9\xc9\x87\x79\xf7\xfb\x7c\x71\x47\xdd\xc7\xe5\xf5\x96\x18\xa1\xbf\x2a\xb9\x7d\xa2\x70\x62\xca\x85\x05\x85\xd8\x62\x4b\x38\x5c\x30\x57\xc9\x4c\x2d\x55\x76\x02\xf8\x3d\x53\x25\x13\x79\x1e\x5c\x01\xc3\x5d\xe2\x11\xc4\x42\x64\xcf\x08\x67\xf6\x27\x5a\x2f\x33\x8b\x6f\x32\xf3\x77\x4c\x79\x26\xb4\x33\x08\x36\xd5\xb8\xc1\x40\xd8\xb2\x4a\xda\xef\x3b\x87\x5c\xc2\xb5\x6e\x31\x15\xe9\x73\xfc\xe2\xfb\xfc\xec\x19\xb8\xd2\x2e\x05\x32\xe5\xb8\xab\x73\x03\xd0\x08\x56\x4c\xc3\x57\xc7\x1b\x37\xf2\xb0\xd4\x27\x51\x22\x90\xed\xfb\xde\x14\x2d\x9c\xff\xa1\x32\xd9\x3a\x2d\xeb\x62\x31\x24\xf1\x2c\xf7\xbf\x1b\xfc\x78\x98\xdc\xf2\xc0\x47\x44\xa5\x35\x5a\xc3\x14\x5d\x80\x06\x2b\xd6\xfa\x99\xa2\x64\x59\x97\x19\x6d\x5e\x68\xe5\xf7\xac\x94\x32\x8f\x11\x8b\x54\xc9\x31\x47\x5c\xe2\x75\xbe\x1a\x37\x16\xd2\xc6\xb9\x53\xe5\x7d\x4b\xa1\xfa\x94\x9b\xfc\x21\xa6\x2b\xef\x7d\x0e\xaf\xd9\x23\x64\x78\x2c\x48\x9c\xc2\xfb\x23\xbd\x4d\x66\x3d\x69\x1a\x7c\x97\x24\xf9\x8c\x3d\x7e\xc0\x36\xb6\xec\x93\xf0\x32\x41\xad\xa3\x72\xe2\x45\x51\xfd\xab\x14\xa5\x71\xf3\x77\xfc\x5e\xfe\x66\x76\x05\x60\xdf\x02\xe4\x7c\x23\x74\x2d\x87\xc5\xe6\x73\x1e\x62\x41\xc0\x70\x1b\x99\x78\x7b\x4d\x90\x23\xfd\x3f\x1f\x25\x7f\xac\x15\xf6\x81\x4d\xc4\x29\x6c\x78\x8e\x5b\x9b\xed\x4f\x72\x05\xf3\x8f\x21\x93\xd4\xdf\xff\xb0\x53\xee\x96\xd0\xdf\x6e\x09\xed\xbe\x64\x42\xc3\x52\x0f\xc1\x54\xdc\x85\xa7\xd9\xec\xfd\xa4\x27\x0e\x33\x7a\x64\x6b\x66\xb4\xb1\x0e\x9e\xc1\x94\x20\xcd\x33\x98\x7a\x65\xec\xfe\xdd\x7d\x32\x34\x0f\x71\xe7\xb0\x80\xcc\x1b\x9b\x54\xf5\x42\x03\x63\x53\xa4\x5d\x12\xcd\x06\x62\x83\x06\xe2\xe3\x8b\xf4\x6c\x47\x1b\x40\xcd\xca\x9e\x1d\xc5\x65\x65\x0d\x52\x1a\x45\x1c\x35\xa4\x10\x03\x71\x43\xc3\xaf\x95\xe3\x31\xae\xc2\xf4\x41\xa1\xb0\x7b\xc2\xfd\x63\x40\xea\x2c\x10\x81\x93\xef\xde\x7c\x4e\xdf\x3c\xa5\x6f\xbe\x7c\x77\x25\x5a\x3a\x13\x3f\x89\xdd\x93\x2a\x93\x25\xea\x8f\x9c\xf5\x93\xf7\xd0\xb7\x48\x2f\x4f\x69\xa0\x10\xaf\x4d\xad\xf3\x3f\x87\xcc\xfb\x74\xac\xdc\xd8\x37\xdc\xc7\x54\x28\xe9\x68\x46\x30\x07\x05\x78\xa8\xed\x5d\xa6\x0e\x18\xe2\x22\x25\x69\x5c\x6a\x48\x66\xe9\xc2\x18\x2d\x45\x79\xc5\x09\xd4\xf8\x24\xd5\x26\xf8\x3b\x58\x75\x53\xf0\xd8\x28\xc2\xdb\x2b\x99\x88\xa5\x26\x71\xd6\x87\x6e\x56\x57\xe5\xae\xf9\x9b\x46\x4f\x18\x6a\x03\xd0\xd5\x19\xd1\x44\xc1\x42\x7d\xd3\xd3\x38\x0c\xbe\x6d\xa6\x05\x9f\xbd\xd6\x65\x03\x09\xfb\x16\x5c\xc2\x0d\xba\x2a\xb6\xe1\xe0\x23\xf8\x4b\x6c\x84\xd2\x81\x1d\xfd\x8f\x0e\x6b\xe0\x6f\xfa\xa9\x35\xc3\x90\x8b\xe0\x84\xfb\xff\x67\x8b\xb9\x15\xdb\xd8\x9e\x57\x92\x08\x9f\xb2\xe8\xb8\x4c\x64\x99\x74\x21\x25\x03\x51\xdb\xac\x98\xd4\xb2\x40\x93\x6d\xb9\x47\xb0\xc0\x10\x9e\x58\xa2\x24\x52\xc3\x26\xc3\xe4\x4d\xbf\xf9\xf4\xcb\x13\x67\x7f\x0d\x2c\x91\xfd\xfc\xf5\xd3\x43\x60\x4d\x50\x7c\xa4\x31\xc4\x5e\x86\xe0\x48\xe0\x92\xbb\x8c\x58\xf4\xb8\x9b\x47\x04\x69\x5c\x72\xfa\x43\xfc\x0b\x1a\xe1\x3e\x13\x0f\x44\x37\xfc\x8f\xcc\x5b\x9b\xdf\x85\xd6\x29\x77\x9e\x08\x60\xe8\x0f\xc3\x4e\xa0\xb0\xff\xd5\x19\xc2\x58\xac\xa3\xb1\x61\xf7\x61\x29\xc9\xb1\x60\x0d\x14\x10\x1a\x07\xd6\xf7\x57\xab\x32\x4c\xee\x67\xf6\x98\x6e\x4a\xeb\x58\xe7\xbc\xcc\x43\xfc\x3e\xb2\x7f\xfc\xf3\xaa\x38\x4a\xf1\x5f\x60\x65\x2b\x1d\x58\x3a\x02\x2a\x16\x61\xf0\x85\xad\xd2\x9a\xb8\xbd\x2c\x2a\x3c\x61\x31\x08\x50\x69\xad\xb1\x63\x50\x26\x03\x15\x97\x39\x67\x28\xbc\x60\xe6\xdb\x3b\xb6\x95\x11\xe9\x5b\xed\x7c\x47\xca\xc8\xaf\xd3\x9f\x0d\x35\x72\x31\x1d\xc3\x43\x83\x77\x60\x56\xac\x2e\xbd\xd2\x84\x05\xd6\xae\xf2\x78\xd8\x20\x90\xb8\x5a\xb6\x25\xcc\x8e\x8a\x8f\x01\x86\x1d\xb4\xb0\x97\xac\xf0\x64\x74\xc6\xef\x32\xae\xb5\xd0\x98\xed\x69\x5c\xda\x7e\x18\xa5\xf9\xe1\x78\x21\xaa\x96\x99\x8c\xe3\xd2\x68\x4a\xc1\x6d\x41\x1a\x81\xe6\xb8\x14\x84\x87\x72\xac\x32\x20\x36\x74\x24\x7b\xc5\x00\x27\xa5\x69\x25\x4e\x68\xaf\x9b\x10\x78\x43\x7a\xc2\x09\x79\x64\x12\x49\x04\x99\xbd\x0e\x05\xa7\x31\x91\x52\x91\x7d\x9d\xf8\x12\x61\xf5\x4b\x25\x32\x90\xdb\x94\xbf\xbb\x3d\xe7\x30\x9c\x7e\xdd\xe7\x2b\xe9\x19\xbe\x5d\xfd\x42\x44\x09\x95\x26\xf3\x6d\xbd\xb9\x4e\x28\x68\x90\x2b\xea\x22\x39\x8b\x91\x11\x0a\xe2\xad\x28\x5d\x38\x30\x21\x62\xf2\xda\x8a\xf0\xf3\xd7\xf7\xf7\x37\xb4\x80\xba\xe9\x57\x14\x9e\x81\xce\x71\xfe\x74\xf6\xd8\x9c\x14\xdb\x53\x45\x28\x9c\xd1\xdb\x49\x60\xf1\xe3\xb4\xaf\x09\x5d\x62\x37\x1f\x2f\x26\xce\x46\x0f\x3e\x97\x6a\x37\xd0\x92\x64\xde\xea\xf4\x88\x33\xa4\x90\x32\x98\xc4\x78\xd7\x67\xaf\x65\x6e\xb3\xb4\x22\x99\x86\x73\x48\x68\x6e\xd3\xbb\x61\x0e\xdf\x8e\x17\xe7\xf7\x5a\xa6\xd3\xad\xca\xfd\x3a\x85\x47\xaa\xdd\xfb\xb5\x54\xab\xb5\x4f\x1f\xc2\xc3\xf4\x30\x1e\x91\xd0\x86\xc6\xca\x5b\x65\x2f\xb0\xe6\x52\xad\x52\x16\x96\xdc\x35\xb2\xc3\xb8\xa3\x87\x28\x29\x7a\x35\xfa\xec\xad\x9d\x42\xe5\x54\x1b\x91\xe3\xb4\xcd\x39\x9f\x0e\x72\xdb\xf3\xa7\x5b\xa7\xd1\x0c\xd9\xeb\xc1\x8f\x70\x20\x10\xa8\xd6\xf8\x4d\xf7\x16\x0e\x0a\x74\xfb\x16\xe7\xeb\x86\x40\x1c\xaf\x05\xae\x1e\xe0\xe3\x05\x53\x77\x05\xd2\xf1\x84\xc8\x49\xea\xaa\xd2\x0a\x7d\xe0\xec\x18\xde\xdc\x18\x5c\x1e\x5f\x2f\x91\x7f\x5f\x09\x2b\x0a\xaa\x72\xa1\xf5\xd1\xdf\xf8\x46\x35\xb7\x3a\x8b\x3d\x6b\x2e\xe0\x02\x07\xc2\x19\xef\xb9\x81\x76\x74\x89\xa1\x95\xeb\x2e\xc0\x32\x74\xc5\x05\xb5\x4f\x61\x91\xab\x2b\xb4\xbe\xd1\xb3\x73\x2f\x87\x82\xd1\x92\x9b\x37\x0b\x77\xa7\xf7\x04\xb3\xbe\x73\xa9\xe9\x9f\x1e\xbc\xd0\x77\x5e\x8e\x77\x0f\xf7\x77\xcd\xdd\x45\xf8\xbf\x9f\xf6\x94\x2a\xc0\xbf\x96\x1f\x68\x5e\x64\xa3\x47\x5a\xc3\xad\x38\xa1\xd1\x46\x19\xef\x7c\x9b\x74\xfe\xbe\x03\xda\x6c\x32\x3c\x3f\xfe\x3a\x4c\x0e\x93\xff\x06\x00\x00\xff\xff\x8c\xe7\x71\x33\x4a\x15\x00\x00") func uiTsComponentsMetricsTsBytes() ([]byte, error) { return bindataRead( _uiTsComponentsMetricsTs, "ui/ts/components/metrics.ts", ) } func uiTsComponentsMetricsTs() (*asset, error) { bytes, err := uiTsComponentsMetricsTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/components/metrics.ts", size: 5450, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsHeaderTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x6c\x53\x41\x6f\x9b\x4c\x10\x3d\xc7\xbf\x62\x3e\x5f\xe2\x48\xfe\x20\x8d\xd4\x4b\xa2\x4a\x21\xb1\x9b\xa2\xa6\x58\x32\xa4\x51\x8e\xcb\x32\x86\x6d\x61\x97\xce\x2e\x21\xfc\xfb\xce\x02\x4e\x13\xb5\x3e\x79\x66\xdf\xbc\x79\x6f\x66\x08\x43\xb8\x43\x8d\x24\x1c\x16\x90\x0f\xe0\xac\x0c\x16\x9c\xb4\xa6\x23\x89\x97\x20\x8d\xfc\x49\x46\xc8\x2a\x24\x9c\x72\x61\x67\x43\x67\xc3\x20\x18\x71\x9b\x1d\x24\xbb\x0c\xb6\x9b\x38\xfb\x8f\x63\x9f\xba\x35\xed\x40\xaa\xac\x1c\x5c\x9c\x7f\xf8\x08\x59\x85\x9c\x9a\x59\x20\xea\x5c\x65\xc8\x06\x33\xf6\x5e\x49\xd4\x96\x5b\x77\xba\x40\x02\xc7\xd8\xa8\x65\x1c\x1e\x5f\xd6\xf0\x1d\xc9\x2a\xa3\xe1\x22\x38\x87\x95\x07\x2c\xe7\xa7\xe5\xd9\x95\xa7\x18\x4c\x07\x8d\x18\x40\x1b\x07\x9d\x45\xe6\x50\x16\x0e\xaa\x46\xc0\x17\x89\xad\x03\xa5\xd9\x45\xd3\xd6\x4a\x68\x89\xd0\x2b\x57\x8d\x7d\x66\x96\xd1\xc5\xd3\xcc\x61\x72\x27\x18\x2e\xb8\xa0\xe5\xe8\xf0\x16\x08\xc2\xcd\xa2\xfd\xaf\x72\xae\xbd\x0c\xc3\xbe\xef\x03\x31\x0a\x0e\x0c\x95\x61\x3d\x41\x6d\x78\x1f\xdf\x6e\x93\x74\xfb\x3f\x8b\x9e\x8b\x1e\x74\x8d\xd6\x02\xe1\xaf\x4e\xd1\x34\x6b\xd1\xb2\x28\x29\x72\x96\x5a\x8b\x1e\x0c\x81\x28\x09\xf9\xcd\x19\x2f\xba\x27\xe5\x94\x2e\xd7\xbc\x8b\x83\xeb\x05\xa1\xa7\x29\x94\x75\xa4\xf2\xce\xbd\x9b\xd9\x51\x22\x3b\x7f\x0b\xe0\xa9\x09\x0d\xcb\x28\x85\x38\x5d\xc2\x4d\x94\xc6\xe9\xda\x93\x3c\xc6\xd9\x97\xdd\x43\x06\x8f\xd1\x7e\x1f\x25\x59\xbc\x4d\x61\xb7\x87\xdb\x5d\xc2\x5b\x8c\x77\x09\x47\x9f\x21\x4a\x9e\xe0\x6b\x9c\x6c\xd6\x80\x3c\x31\xee\x83\x2f\x2d\x79\x07\x86\x3c\x85\xf2\x03\xc5\x22\x80\x14\xf1\x9d\x84\x83\x99\x24\xd9\x16\xa5\x3a\x28\xc9\xd6\x74\xd9\x89\x12\xa1\x34\xcf\x48\x9a\x1d\xf9\xfa\x16\xa9\x51\xd6\x2f\xd6\xb2\xc6\x02\x6a\xd5\x28\x27\xdc\x18\xff\xe5\xeb\x4f\x97\xe8\x81\x95\xef\xd3\x71\xbf\x9e\xc6\x77\xd3\xa2\x41\xeb\x97\x25\x8d\x9e\xac\xbf\x39\xb0\xf9\xde\x2e\xe1\x86\x44\x03\x77\xd4\x69\x54\x04\xab\x9c\xa3\xa0\x9c\xa2\xeb\xb2\x11\xaa\x0e\xf8\x46\xce\xb8\xe2\xe4\xc4\xaf\x37\xd2\x05\x61\x0f\x37\x46\x3f\x23\x93\x22\xac\x58\xe4\x90\xb3\xba\x7f\xa1\xbf\x09\xe7\x20\x23\x21\x07\x58\x35\xfc\xff\xfa\xf5\xab\xa9\x45\x6e\x8f\xd8\xc5\xe2\x59\x10\x54\x28\xd8\xdd\x06\xad\x24\xd5\x7a\xbf\xf0\x09\x4e\xb3\xd7\x9b\xf5\x1b\x44\xab\x4a\x3d\x9d\x81\x28\x8a\xd1\xf7\x54\xe5\x33\x3e\x72\xa6\x3d\x1e\x27\x73\xe7\xca\x83\x7f\x4c\x04\xc1\xe9\xd5\xe2\x77\x00\x00\x00\xff\xff\x05\xd5\x4c\x27\xd4\x03\x00\x00") func uiTsHeaderTsBytes() ([]byte, error) { return bindataRead( _uiTsHeaderTs, "ui/ts/header.ts", ) } func uiTsHeaderTs() (*asset, error) { bytes, err := uiTsHeaderTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/header.ts", size: 980, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsModelsNode_statusTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xdc\x19\xe9\x6e\xdb\x36\xf8\x7f\x9e\x82\x10\x60\x40\xca\x12\x39\xd9\x80\x01\x53\x8e\xad\x6b\xd2\x0b\x39\xba\xb8\x2b\x3a\x18\x46\xc0\x58\x74\xcc\x4d\xa2\x34\x92\x72\xeb\xa5\x7e\xf7\x7d\xa4\x28\x4b\x96\x68\xc9\x0a\x36\x60\x18\x7f\xd4\x0a\xf9\xdd\x37\xd9\xe1\x10\x89\x24\xe3\x53\x12\xa0\x38\x09\x49\x24\x86\x0c\x7e\xee\x85\xc4\x32\x13\xbe\x14\x7b\x43\x80\x38\xe5\x64\x46\x38\x61\x53\x82\x52\x2c\xe7\x67\x8e\xef\x0f\xe5\x32\xa5\xec\x51\x0c\x63\x2a\xe7\x9c\x46\xbf\xaf\xbf\xfc\x10\xd0\x1c\x34\x3c\xb7\xa3\x2a\xca\xa2\x84\x40\x2f\x32\x39\x4f\x78\x80\x7e\xe6\x38\x46\xaf\x79\xc6\x08\xe5\xc8\x7d\x80\xbf\xfc\xc7\xfc\xaf\x9f\x1e\x63\x0c\x64\xa7\x49\xec\xed\xed\x81\x90\x59\x44\xd0\xb5\x96\x15\x3d\xed\x21\x58\xe4\x4b\x9a\x70\x89\xcc\xd1\x0d\x1c\x8d\xb4\xf8\xe6\x58\x2d\x1a\x6b\x90\x94\x27\x31\x15\x04\x9d\xa1\xfb\x42\xda\xeb\xfc\xf7\x7d\x7e\x72\xb2\xb7\x46\x31\x54\x29\x93\x84\xcf\x30\xc8\xff\x22\x0c\x39\x11\x55\xaa\x6a\x31\x22\x3f\x27\xfc\x8f\x00\x09\xc9\xc1\x20\x27\x1b\x87\x38\x47\x69\x1e\xae\x5a\xf8\x28\x05\x2e\x88\x98\x72\x9a\x4a\x9a\xb0\x3a\x3f\xe5\x1e\x1a\x06\x88\x65\xf1\x03\xe1\x5b\xf8\x19\x59\x6b\xa7\x52\x72\x38\xc3\x6c\xb9\xbb\x20\x0d\x4b\xaa\x15\x82\x74\x41\x5d\xce\x4d\x5e\x42\x26\x5c\xc9\x29\x0a\x41\xc7\x93\x4d\x00\x8e\xd9\x23\xb9\x9f\x26\x19\x93\x76\x5d\x20\x50\xb8\x24\xe1\x3d\xde\x72\x9e\xa5\x21\x6e\x3b\xd7\x81\x16\x98\x48\xf1\x47\x3a\xec\xae\x3f\xbe\x7c\xa9\xbf\x36\x41\x23\x82\x43\xc2\xef\x3b\x45\xe2\x24\x8d\xe8\x54\x73\xed\x84\xc5\x0b\x08\x5a\xfc\x10\x91\x76\xd0\xdd\xec\x7f\x47\x44\x9a\x30\x41\x46\x44\xd6\x5d\x11\x54\xc0\xc6\x93\x9e\x74\xaf\xa8\x90\xd7\x38\xad\xd1\x1c\xab\x18\x7b\xbb\x0e\xb1\xc9\x33\x59\x54\x62\x63\x57\x1e\x15\x94\x9e\x9a\xf4\xd3\xa2\x85\xf8\x34\xc2\x90\xe3\x0a\xb4\x1e\xf5\x29\xa7\x0b\xf0\xbd\x0e\x2c\x3a\x45\xf7\x10\x7e\xf8\x8a\x42\x1d\x81\x72\x72\x7c\xa4\xd6\x49\x27\xfc\x7b\x55\xd2\xc2\x11\xfd\x4b\xd5\xa0\x1f\xb6\xe3\x68\xe0\xc0\x56\xa5\x52\xc2\xe5\xf2\xb4\xe1\xc2\x73\xa0\x17\xfb\x50\xdf\x52\xd7\x76\xf8\xb4\xf2\x2a\xa5\x4d\x73\xca\x1e\x20\x96\x4d\x2a\xb7\xf2\xd9\xf4\x63\x9d\x51\xfd\x54\x73\xb2\x30\xca\x3b\x0a\x11\x3b\x29\xb5\x55\xa1\x2d\xca\xfc\x92\x11\xbe\x74\x3d\x2b\x6d\x55\xd6\x4f\xad\xa9\x74\x5e\x73\xb0\x5a\x0b\xcc\x51\xc6\x23\x60\xee\x0c\x4d\x17\xd4\x1d\x51\x0c\x9d\x93\x06\x30\x27\x32\xe3\x0c\xc4\xe4\xe4\xcf\x8c\x08\xe9\x3e\x29\xdc\x40\xfd\x73\x80\x62\x02\x8d\x0d\xc2\xcf\x79\x7d\xf9\xc1\x39\x80\xf0\x92\x1c\x4f\x55\x05\x48\xd8\x3b\x91\xb0\x4b\xce\x13\x2e\xd0\xca\x6b\x50\x55\xcb\x97\x73\xc2\x5c\x17\x6a\x78\x16\xa9\x2a\x66\x95\xdf\x43\x67\x36\x15\x4a\xe9\x34\x32\xf4\xe3\x59\xc2\x2f\xf1\x74\xee\xba\xb9\x42\x1d\x78\x85\x19\xf2\xfc\x01\x4b\x98\x61\x40\x85\x8a\x6f\xda\x4f\xd3\x16\xd5\x45\x67\xc8\x95\x73\x2a\x7c\x1d\xc6\xae\x67\x52\x71\x82\xce\xce\x20\x1b\xa3\xc8\xeb\xe0\xae\x96\x1d\x1f\xd5\xdb\x48\x7d\xad\x3a\xd5\x12\xeb\xcc\x00\x72\x36\x2e\xdd\xba\xb9\x25\x0d\x3f\x22\xec\x51\xce\x95\x66\x47\x1e\xfa\xfa\xb5\x53\xaf\x0a\xee\xb8\x49\xe6\x10\x1d\x4f\xfc\xb2\xb3\xa1\xd3\xc2\xf8\xe5\x9e\xf7\x5c\xeb\xf9\x69\x26\xe6\x45\x08\xb4\x2b\xb9\x26\x51\x64\xed\x86\x0f\xf2\xcd\xe7\xfa\xa1\x5e\x1f\x9a\x62\xa7\xaa\x48\xde\x46\xe1\x25\x83\xa9\x49\xf1\xee\x42\xc8\x8d\x53\xa9\x44\xad\x38\x26\x6b\x4d\x7a\xd8\xe1\xea\x42\xae\xf6\xec\x65\xda\xc6\x39\x40\x8b\x84\x86\x16\x27\x69\x61\x55\x16\xed\x58\x39\xd5\x2a\x13\xd1\x3e\x61\xaa\x05\xe9\x8d\x5c\x93\xad\x94\x6d\xf8\x7e\x5b\xac\x94\xa2\x54\x1d\x6b\x8b\x9a\xb1\x35\x94\xaa\xe1\xaa\xc8\x34\x85\x5a\xed\x64\xbf\x86\xab\xb7\x1a\xef\x5f\x32\x44\x59\x11\x7a\x55\x03\x55\x05\x4c\x66\x1a\x53\x9c\xe7\x33\x83\x5f\x8e\x05\x6d\x79\xba\x66\x69\x88\x88\x29\xf4\x48\x52\x23\x79\x58\x25\x59\x4e\x0e\x07\x75\xa8\x63\x7b\x0f\x69\xa6\x60\xab\x4f\xe0\x2e\xf6\xe1\xf6\xe2\xd6\x55\x17\x31\x4f\xcd\xcd\x0b\x82\x64\x82\x32\x49\x23\x2a\x97\xf9\x5c\xe4\xdb\xbd\x68\x66\x5d\x0d\xe8\x6e\x3a\xc9\x2b\x3e\x5a\x5c\x5a\x58\xbe\x59\x6c\x9a\xc6\x57\x86\x57\x87\x7e\x73\x66\x37\x35\xd8\x6e\x74\x93\xf4\x0e\x0c\x6a\x03\x4b\x27\x6f\xda\xca\x20\xe4\xcc\xac\xc3\x3c\x1a\xa2\x6d\x92\xec\xab\x81\xd0\xf3\x65\x32\xd2\xba\xbb\x1e\xfa\x06\x39\x75\xbe\xff\x9c\xfd\xcb\x7b\xc9\xff\xd2\xfa\xf6\x6b\xd7\x7f\xc6\xfc\x95\xf9\x9e\x48\x1a\x93\x57\x09\x8f\xe1\x93\x83\x61\xc3\xef\x7c\xb5\xa3\x06\x30\xd8\x72\x9d\xc1\x6f\x87\x83\xf8\x70\x10\xa2\xc1\x9b\x60\x70\x1d\x0c\x46\x8e\xd7\x4a\x32\xc7\xbb\x80\x2d\x97\x61\x96\xac\x2f\xd3\x5d\x7e\x2d\x44\x01\x11\x18\xf9\x8c\x4a\x02\x60\xb4\x63\xff\x88\x7c\x6f\xe9\x34\xc6\xe4\x65\xc9\xd9\x50\xc6\x2d\x36\x3a\x1a\x63\x3e\xec\x5f\x10\x09\x09\x23\x9a\xd1\x58\x9f\xcf\x3f\x52\x2e\x33\x1c\x5d\x46\x24\x26\xac\x7e\xb7\x2d\xb4\x79\x6e\x94\x76\x8d\x9b\xc5\xf8\xee\x3a\x21\x5d\xc0\x88\xee\xdc\x24\xca\x72\x18\xdc\x40\x84\x12\x67\x49\xa4\xef\x34\x8b\x6b\x4d\x67\x1b\xa9\xb1\x95\x21\x1c\x4b\x55\x45\xb6\x02\x14\x40\x5c\x41\xa8\x8f\x50\x89\x35\x52\x6f\x29\x02\xb9\x0e\x84\xb1\x0e\xf9\xf5\xe3\x4a\xd1\x03\x20\xbc\xbd\xc0\xf1\x0e\x5a\x47\xb2\x82\xde\xb8\x46\x23\xc6\xa9\x3b\xcb\xd8\x54\x0d\x22\xae\xde\x7e\x1b\xee\x32\x63\xee\xa6\xb3\x45\x0a\x3c\x9e\x73\x32\x3b\x1b\x6a\x5e\x70\xb1\x02\xf1\x0d\x5b\xa5\xc8\x04\x48\x3d\xa1\x69\xc2\x66\xf4\x31\x50\x77\xab\x24\x83\x8c\x58\x1d\x14\x30\x1d\x5a\x16\xcb\x01\x4a\x1d\x53\xee\xca\x9b\xd8\x3b\xa7\x5a\x93\x16\x3e\x4d\x17\xdd\x98\x57\x40\xf0\xc1\xda\xce\xda\xcc\xfa\xd2\x64\x9e\xe5\x7c\xf3\x56\xe8\xf5\xa3\x6d\xde\xf2\x3a\x68\x9b\xdf\x9e\xb4\x47\xf9\x23\x1b\xc2\x72\x83\xbc\x29\x02\xd5\xf2\x93\xc7\x4c\xf1\x24\xe7\xf5\xe4\xf3\x6b\x7e\x7d\xd9\x91\x4f\xf5\xb2\xd3\x8f\xcf\x9d\xea\x02\x16\x53\x55\xba\x43\x4f\x8a\x57\xba\xbd\xa0\x6d\x84\x9b\xdd\xa7\xaf\x77\x8b\xd1\x62\x2b\x0b\xeb\xf0\xf1\x4c\x2e\xba\x99\x6d\xb0\xc8\x67\x5e\xcb\x04\xd7\xdb\xc5\x0c\x0c\x71\x78\xb7\xee\xd5\x3d\x4c\x06\x33\x6c\x4b\xa3\xef\x29\xc7\x2b\xa8\xf8\x4b\x54\xca\x61\xd1\xb6\x31\x2f\x79\xdb\x2a\x81\x65\xbb\x5e\x55\x56\xb6\xc7\xc4\xe1\xfe\x7e\x09\xb4\x5f\x7b\xf3\x21\x4c\x64\xaa\xa0\xcb\x39\xdc\xf0\x89\xda\x43\x31\xa4\x2e\x06\x6b\x99\xa2\x0a\xd6\x9b\xf1\x24\x06\x08\x98\x05\x08\x5f\x10\x5e\xa5\x86\xb9\xfa\xcf\x14\x2e\x88\x0e\x1b\x2c\xd0\xbb\xd1\xed\x8d\xe9\xb1\xd5\x19\x65\x7f\xb8\xfe\x2e\xea\xfb\xa6\x24\xee\x97\x39\x0f\xd0\xa7\xeb\xab\x37\x52\xa6\x77\xf9\x1b\xd6\x01\x4a\x52\x69\x79\xa5\xfb\xf4\xe6\xee\x36\xbf\xe1\x6e\x1b\x3e\x4c\x3f\x00\x9a\xa6\x4b\xc3\x9d\xe8\xdb\xa3\x23\xf4\xa3\x96\xcf\xcf\x71\xe8\x6c\xa9\xb8\x82\xab\xf3\x67\xac\x0f\xe4\x0b\x5c\x94\x02\x54\xdf\xab\xbe\x90\xe7\xff\xae\xf6\xfe\x0e\x00\x00\xff\xff\x68\xfa\x72\xbe\xac\x1a\x00\x00") func uiTsModelsNode_statusTsBytes() ([]byte, error) { return bindataRead( _uiTsModelsNode_statusTs, "ui/ts/models/node_status.ts", ) } func uiTsModelsNode_statusTs() (*asset, error) { bytes, err := uiTsModelsNode_statusTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/models/node_status.ts", size: 6828, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsModelsStatsTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x84\x92\x3f\x4f\xc3\x30\x10\xc5\x77\x7f\x8a\x53\x27\xe8\x10\xef\xe5\x8f\x80\x0e\x4c\x9d\x90\x58\xab\xab\x73\x4d\x42\xfd\x27\x3a\x9f\x2b\x22\xd4\xef\x8e\xd3\x06\x04\xa8\x35\x37\x58\x3e\xfd\xde\xf3\xbb\x93\xac\x35\xc4\x90\xd8\xd0\x02\x5c\xa8\xc9\x46\x1d\x05\x25\x56\x12\x95\xce\xec\x96\x69\x4b\x4c\xde\x10\xf4\x28\xed\xdd\xac\xaa\xb4\x0c\x7d\xe7\x9b\xa8\x5d\x27\x2d\x77\xf6\xed\xfb\x56\xd5\xd9\x36\x03\x7d\x9f\xad\xf0\x98\xa4\x0d\xbc\x80\x27\x46\x07\xcf\x9c\x3c\x75\x0c\x57\x9b\xdc\x55\xcd\xa9\x7b\x68\x1c\x66\x93\x09\xee\x5a\x29\x3d\x9f\x2b\x98\xc3\xea\x38\x03\x98\xe0\x05\x3b\x1f\xa1\x46\xc1\x69\x30\xe8\x93\xb5\x54\xc3\x96\x83\xcb\x02\xb3\xe3\x80\xa6\xad\xb2\x4b\xab\xac\x48\x96\xbe\xdc\x1f\x0a\x72\xd1\x7b\x1f\x58\x60\x42\x2f\xe3\x56\x13\xf9\x41\x3b\x2f\xc4\x5b\xcc\xeb\xad\x5e\x97\xcb\xbf\xa2\xb1\x6c\xb7\xa7\xf5\x66\x10\x8a\x0b\xf0\xc9\x6d\x88\x6f\x7e\xf1\x1d\x0d\x25\xbc\x47\x5b\xc2\x63\xbe\x97\x92\xe2\x98\x6f\x42\xf2\x72\x39\xbf\x80\xc7\xfc\x02\x9e\xf2\xff\x57\x60\x43\xe7\x79\x63\x4e\xd3\x5f\x56\xc4\x21\x96\x16\x1c\x71\x21\xdf\x62\x94\x75\xea\xf3\x47\xa0\xb5\x47\x1f\xce\xbc\x72\x50\xa7\xf3\xa0\x3e\x03\x00\x00\xff\xff\xf7\xb6\xa5\x6d\xce\x02\x00\x00") func uiTsModelsStatsTsBytes() ([]byte, error) { return bindataRead( _uiTsModelsStatsTs, "ui/ts/models/stats.ts", ) } func uiTsModelsStatsTs() (*asset, error) { bytes, err := uiTsModelsStatsTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/models/stats.ts", size: 718, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsModelsStore_statusTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xdc\x19\x69\x6f\xdb\x36\xfb\xbb\x7f\x05\x21\xc0\x80\x94\xd7\x91\x93\xb7\xc0\x80\x29\xc7\xd6\x25\x69\xbb\x22\x47\x17\x77\x45\x07\xc3\x08\x18\x89\xb6\xb5\xe9\x1a\x49\xb9\xf1\x52\xff\xf7\x3d\x3c\x64\x5d\x94\x8f\x6c\x03\x86\x09\x85\xa5\x92\xcf\x7d\x93\x19\x0e\x11\x4b\x73\xea\x13\x0f\xc5\x69\x40\x22\x36\x64\x3c\xa5\xe4\x81\x71\xcc\x73\xe6\x72\xd6\x1b\x02\xc8\x29\x25\x53\x42\x49\xe2\x13\x94\x61\x3e\x3f\xb3\x5c\x77\xc8\x97\x59\x98\xcc\xd8\x30\x0e\xf9\x9c\x86\xd1\xaf\xeb\x2f\x37\x00\x34\x0b\x0d\xcf\xb7\xa2\x06\xaf\xe0\xdf\x16\xf0\x04\xa4\x2a\xa5\xe9\x86\x13\x20\x15\x08\xf4\x3a\xe7\xf3\x94\x7a\xe8\x07\x8a\x63\xf4\x96\xe6\x09\x09\x29\xb2\x1f\xe1\x7f\xee\x4c\xfd\xef\xfb\x59\x8c\x41\x5a\x3f\x8d\x9d\x5e\x0f\x94\xcf\x23\x82\x6e\xa4\x0d\xd0\x73\x0f\xc1\x43\x9e\xb2\x94\x72\xa4\xb7\x46\xc2\x2e\x23\x29\x88\xde\x17\x4f\x18\x4b\x98\x8c\xa6\x71\xc8\x08\x3a\x43\x0f\x85\x15\x6e\xd4\xfb\x83\xda\x39\xe9\xad\x51\x34\xd9\x30\xe1\x84\x4e\xb1\xaf\x29\x5f\x12\xe6\xd3\x30\xe3\x61\x9a\x54\xc8\x8b\x47\x39\x24\x0c\x3c\x94\xe4\xf1\x23\xa1\x27\xb5\x5d\x61\x1f\x4f\xcb\xed\xde\xc2\x4b\x89\x28\x3f\x2b\x34\xeb\x48\x98\x73\xca\x3c\x84\x93\x65\xb9\xbe\xda\x20\xe1\x05\xce\xb0\x1f\xf2\x65\x43\xb2\x62\xd9\x2c\xd9\xeb\x05\x98\x17\x3f\x46\xc4\xbc\x7d\x8f\x93\x19\xb9\x48\xf3\x84\xb7\xf7\x37\xc9\x62\xf6\x83\x78\x02\x50\xd7\x6b\x59\xb3\xce\x95\x0a\xae\x0f\xbe\x99\xad\xb2\x36\xa6\x9c\x04\x0f\xb8\x63\x3f\xcf\x02\xbc\x69\x5f\xc6\xe1\xda\x21\x23\x19\x95\x37\x9f\x2e\x2e\xe4\x57\x1d\x34\x22\x38\x20\xf4\x61\xab\x48\x94\x64\x51\xe8\x4b\xae\x5b\x61\x71\x61\xf4\xcd\xa0\x3b\x1a\xf8\x9e\xb0\x2c\x4d\x18\x19\x11\xde\xb4\xb5\x57\x85\x1b\x4f\xf6\xa5\x7c\x1d\x32\x7e\x83\xb3\x06\xd5\xb1\x8c\xf5\x1f\xd7\xa1\x3e\x79\x31\x97\x4a\x00\xec\xce\xa6\x82\xb4\xaf\x3e\xfb\xea\xb2\x81\xbe\x1f\x61\xc6\x14\x6c\x33\xc2\x33\x1a\x2e\x20\x0e\x64\x90\x85\x3e\x7a\x80\x50\xc4\xd7\x21\x54\x1c\x28\x3c\xc7\x47\xe2\x39\xd9\x0a\xff\x41\x54\xbf\x60\x14\xfe\x21\xaa\xd5\xb7\xdd\x38\x12\xd8\x33\xd5\xb3\x8c\x50\xbe\x3c\x6d\x3b\xf3\x1c\x08\xc6\x2e\x94\xc2\xcc\x36\xee\x3e\xaf\x9c\x4a\x19\x94\xbc\xf2\x47\x88\x6c\x9d\xb8\x9b\x39\xd5\x1d\xda\x62\xd5\xdc\x96\xbc\x0c\xac\x54\x27\x21\x6c\x37\xc5\xba\x95\xea\x50\xe8\xa7\x9c\xd0\xa5\xed\x18\xa9\x8b\x36\x70\x6a\x4e\xae\xf3\x86\x9f\xc5\xb3\xc0\x14\xe5\x34\x02\xf6\xd6\x50\x37\x40\xd5\x9b\xd9\xd0\x3a\x69\x41\x53\xc2\x73\x9a\x80\xa4\x94\xfc\x9e\x13\xc6\xed\x67\x81\xec\x89\x9f\x01\x8a\x09\xf4\x42\x08\x44\xeb\xed\xd5\x47\x6b\x00\x71\xc6\x29\xf6\x45\x55\x48\x93\xf7\x2c\x4d\xae\x28\x4d\x29\x43\x2b\xa7\x45\x55\x3c\x2e\x9f\x93\xc4\xb6\x81\x6f\x1e\x89\xca\x66\xd6\xc0\x41\x67\x26\x25\x4a\xf1\x24\x36\xf4\xfa\x69\x4a\xaf\xb0\x3f\xb7\x6d\xa5\xd2\x16\xbc\xc2\x10\x3a\x97\xc0\x18\x7a\x14\x10\x21\xe3\x16\x9d\xb1\x6d\x8e\xea\x13\x4e\x91\xcd\xe7\x21\x73\x65\x44\xdb\x4e\x91\x98\x13\x74\x76\x06\xb9\x19\x45\xce\x16\x01\xc4\xd3\x41\x00\x8d\x27\x9b\x99\xaf\x76\x50\xad\x48\x12\x20\x67\x64\xb3\x5d\x3d\xbb\x24\xe2\x46\x24\x99\xf1\xb9\xd0\xed\xc8\x41\x5f\xbf\x6e\xd5\xac\x82\x3b\x6e\x93\x39\x44\xc7\x13\xb7\xec\x79\xe8\xb4\x70\x40\xb9\xe6\xbc\xd8\x7e\x6e\x96\xb3\x79\x11\x08\x9b\xb5\x5c\xd3\x28\x12\xb8\xee\x06\xb5\xfa\x52\x57\x34\x6b\x45\x5b\xf0\x4c\x14\xcd\xbb\x28\xb8\x4a\x38\x0d\x05\xf3\x6d\x08\xca\x3c\x95\xaa\xb4\x11\x47\x67\xaf\xce\x12\x33\x5c\x53\xc8\x55\xcf\x5c\xb6\x4d\x9c\x3d\xb4\x48\xc3\xc0\xe0\x26\x29\xac\xc8\xa5\x5d\xcb\xa8\x78\x44\xd4\x8a\xb1\x53\xf4\x36\x06\xf6\x48\x66\x6d\x18\x48\x73\x64\x2b\x20\x68\x98\x35\xf7\x77\x85\x4b\x29\x8b\x33\x56\x98\x93\x66\x46\xe8\xe5\xb1\x69\xb1\x16\xb1\x82\x4c\x5b\xa8\xd5\x4e\x06\x6c\xf9\xba\xd3\x7a\xff\x90\x21\xca\xaa\xd0\xa1\xbf\x39\x40\x44\x21\xd0\xc9\xa9\x4d\x71\xae\xa7\x08\xb7\x1c\x14\x36\xe5\xea\x9a\xa7\xa6\xc2\x7c\xe8\x98\xa4\x41\xf3\xb0\x46\xb3\x1c\x26\x06\xa8\x09\x77\x6c\xee\x27\xed\x34\xdc\xe8\x16\x38\xca\x7d\xbc\xbb\xbc\xb3\xc5\x39\xce\x11\x73\xf5\x82\x20\x9e\xa2\x9c\x87\x91\x38\x90\xc8\x61\xc9\x35\x3b\x52\xcf\xc2\x12\xd0\x2e\xa6\x31\xe5\x27\x47\xbf\x3b\x9c\x2a\x81\x0b\xe3\x1b\x2a\x4e\xdb\x01\xca\xf8\xb0\xeb\xb6\xa7\x7a\x5d\x8b\xcd\x86\xd7\xa9\x6f\xc1\xf8\xd6\x37\xf4\xf5\xb6\xb5\x34\x82\xe6\x66\x9c\xf7\xd1\x10\x75\xca\x72\x20\x06\x45\xc7\xe5\xe9\x48\x1a\xc0\x76\xd0\xff\x90\xd5\xe4\xfc\xf7\xf9\xa0\x3c\xbb\xac\x3d\x80\x0a\x17\xa0\xff\x88\x0f\xcc\xe7\xb3\x7f\x8f\x13\x2a\xd3\x3f\xe1\x61\x4c\xde\xa4\x34\x86\x4f\x0a\xc6\x0d\x5e\xb9\x62\x45\x4c\x65\xb0\x64\x5b\xfd\x5f\x0e\xfb\xf1\x61\x3f\x40\xfd\x77\x5e\xff\xc6\xeb\x8f\x2c\x67\x23\x49\x85\x77\x09\x4b\x76\x82\x93\x94\x15\x87\x9d\x6d\xce\x2d\x44\x01\x11\x12\xf2\x05\x95\x04\xc0\x6a\xc7\xee\x11\xf9\xc6\xd0\x76\xb4\xd1\x2b\xe5\xa7\xa6\x8d\x5d\x2c\x6c\xe9\x93\xea\x1c\x70\x49\x38\x24\x0e\x6b\x95\x85\xe6\xdc\xfe\x29\xa4\x3c\xc7\xd1\x55\x44\x62\x92\x34\x0f\xc1\x85\x36\x7f\x21\x54\xb7\xcd\xa0\xc5\x5c\x6f\x5b\x41\xb8\x80\xd9\xdd\xba\x4d\x85\xf1\x30\x78\x82\x30\x21\xd1\x92\x70\xd7\x6a\x57\xda\xce\x98\x2d\x28\x8d\x8d\xec\x60\x97\x8b\x6a\x02\x9c\xcc\x00\x0a\x84\x8a\x7d\xf1\x11\x28\x91\x02\x82\xc0\x86\x96\x33\x40\xc5\x22\xbc\xf1\x78\x4e\xc9\xf4\x6c\x28\x9a\x16\x9c\x59\x20\xc4\x55\x3e\xc8\xd1\x5d\x2c\xca\x1f\x18\xdf\x45\xf0\x4f\x00\xe7\x19\xf9\x69\x32\x0d\x67\x9e\x38\xc6\xa4\x39\x84\xd9\x6a\xd0\x85\xe3\x38\x13\x67\xb0\x9f\x84\xb7\x84\x7f\x49\xe9\x6f\x35\x31\x9b\xd4\x71\x10\x80\x5d\x99\x9b\x28\xd8\xfd\x99\xbc\x56\x04\x76\x62\xa2\xdf\x7b\x31\x19\xa9\xeb\x29\x84\x79\x8d\x45\x91\x14\x95\x7c\x54\x5c\xcb\xeb\xac\xfd\x2c\xf6\xb3\x1a\xef\x77\xe6\x53\x3d\x0e\xec\xc3\x47\xde\x02\x9a\xcc\x55\x29\x97\x7b\x11\xbc\x96\xd5\x16\x75\xd2\x6d\x57\xe3\xbd\xc8\xaf\x2f\x35\xbb\x39\x18\x5b\xf2\x8b\x98\xc8\xca\x5e\xe3\xa0\xa6\x41\xd3\x60\xb3\xa7\x7b\x13\x30\xc2\xe1\xfd\xba\x71\xed\x63\x2f\x18\xed\x36\xf5\xbd\xbd\xe4\x78\x03\xa5\x6f\x89\x4a\x39\x0c\xca\xb6\x27\x08\xa1\xaa\x91\x83\x61\x79\xd2\xea\x06\xe5\xd7\xfa\x73\x78\x70\x50\x02\x1d\x34\xae\x45\x48\xc2\x72\x71\x13\xc7\xe7\x70\xfc\x25\x62\x0d\xc5\x90\xb5\x18\xcc\xa5\x6b\x2a\x98\x6f\x4a\xd3\x18\x20\xa0\x31\x12\xba\x20\xb4\x4a\x0d\x53\xf1\x27\x0a\xca\x88\x8c\x1a\xcc\xd0\xfb\xd1\xdd\xad\xee\x8e\xd5\x86\x7d\x30\x5c\x7f\x4f\xf3\xc4\x97\x7f\x08\xa8\x49\x62\x3f\xcd\xa9\x87\x3e\xdf\x5c\xbf\xe3\x3c\xbb\x57\xd7\x3c\x03\x94\x66\xdc\x70\x99\xf5\xf9\xdd\xfd\x9d\x3a\xfc\x75\x75\x62\xdd\x0e\x80\xa6\xee\x58\x70\x5a\xf8\xff\xd1\x11\xfa\x4e\xca\xe7\x2a\x9c\x70\xba\x14\x5c\xc1\xd3\xea\xa2\xe7\x23\x79\x82\x13\x84\x87\x9a\x6b\xd5\x8b\x65\xf5\xbb\xea\xfd\x19\x00\x00\xff\xff\xdb\xd1\xe8\xc5\x5a\x1a\x00\x00") func uiTsModelsStore_statusTsBytes() ([]byte, error) { return bindataRead( _uiTsModelsStore_statusTs, "ui/ts/models/store_status.ts", ) } func uiTsModelsStore_statusTs() (*asset, error) { bytes, err := uiTsModelsStore_statusTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/models/store_status.ts", size: 6746, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsModelsTimeseriesTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x59\xdf\x6f\xdc\xb8\x11\x7e\xf7\x5f\xc1\xf3\x93\x94\xdb\x68\x93\x7b\xe8\x83\x1c\xa7\x0d\xee\x82\x1e\x0e\x75\x93\x3a\x46\x7b\x40\x10\x18\x5c\x89\xbb\xab\x46\xa2\x14\x92\xb2\xb3\xbd\xdb\xff\xbd\xdf\x90\xd4\x6f\x69\xb3\x06\x0e\x38\x01\x71\x64\x89\x1c\xce\x7c\xf3\xf1\x9b\xa1\xbc\x5e\x33\x5d\xd6\x2a\x11\x31\x2b\xca\x54\xe4\x7a\x6d\xb2\x42\x68\xa1\x32\xa1\x23\xa3\x2f\xd6\x18\xf0\x4a\x89\xad\x50\x42\x26\x82\x55\xdc\xec\xaf\x2f\xa3\x68\x6d\x0e\x55\x26\x77\x7a\x5d\x64\x66\xaf\xb2\xfc\xbf\xed\x5d\x94\x62\xda\x25\x5b\xbf\xc6\x54\xf6\xa6\x36\xfb\x52\xc5\xec\x86\x1b\xc3\xee\x14\x4f\x0e\x2c\x28\x70\xff\xb7\xa4\x4c\x3e\xab\x92\x27\xfb\x9c\x6f\x74\x94\x94\x45\x78\x71\xb1\x7e\xf6\xec\x82\x3d\x63\x37\xd6\x0d\x96\x94\xd2\xf0\x4c\x6a\x96\x72\xc3\xbd\x6f\xac\xaa\xf3\x5c\xa4\x6c\xab\xca\x82\xb5\x26\x22\xcc\x5a\x5f\x60\x44\x9d\x8b\x66\xf6\x6f\x17\x0c\x97\xf8\x5a\x95\xca\xb0\xe6\x95\x30\x2a\x4b\x9a\x77\x74\x65\x85\x7d\x5f\xc1\x5c\xa6\x05\xbb\x66\xf7\x4d\x10\x37\xee\xff\xf7\xee\xcd\xd5\x45\x3b\x05\x4e\xb2\xf6\x17\x78\xfb\xaf\x5a\xa8\xc3\x9b\xdd\x4e\x89\x1d\x37\xa5\x62\x99\x66\x5c\x32\x21\xeb\x42\x28\x6e\xb2\x52\xb2\x72\xcb\xcc\x5e\x30\xfe\xc0\x33\x04\x0b\x3f\x78\x3b\xba\x6f\x68\x5b\xcb\x84\xc6\x6b\xb6\x85\x19\x4a\x02\x73\x59\x60\x5f\x6a\x97\x0d\x76\xb7\x87\x75\x29\x44\xaa\x99\x29\xd9\x46\xb0\xcf\xa2\x32\x2c\x93\x4c\x1f\x64\xc2\x1e\xe1\x72\xdf\x20\x2d\x7a\x07\x33\x1f\xec\xec\xb1\x9f\x03\x0f\xa5\x1d\x8c\xe5\x1e\x84\x8a\xfa\x36\x82\x35\xb0\x31\xe5\x80\x14\xf6\x49\xd8\x1b\xb5\x6e\xef\x3d\xde\x64\x7b\x02\x4c\x87\x3a\x5d\x6f\xfe\xfd\x77\xc0\xfd\x72\x35\x7e\x78\x7f\xfb\xe6\xee\x2d\xde\xfc\xd0\xbd\x39\x0e\xc0\xef\x7b\xf7\x13\x98\x51\x95\x99\x34\x16\x75\xa6\x41\x48\xc0\x9b\x76\x4f\x25\x9e\x12\x7a\x07\xa6\x84\xae\x80\xad\x98\x82\xd8\x37\x38\xc1\x73\x04\x62\xb7\xa0\x05\x61\x53\x6f\xb1\x2f\x18\x90\xd1\x7c\x27\x3c\x8c\x7d\x7b\x1e\xd1\x13\x30\x46\xa7\x70\xc4\x42\x42\x6d\x39\xb6\x5d\xb7\xf0\x10\x46\x6b\xcf\xf0\xa2\xba\x97\x5c\x96\x3a\x66\x40\x7e\x23\xd4\xd5\x60\xd0\x03\xcf\x6b\x31\x7d\xb5\x8c\xab\x4d\xdd\xad\xd0\x75\x3e\x44\xb6\x85\x12\x2f\xbe\xc1\xc6\xbe\xb9\x19\x20\x7b\x2b\x44\xf6\xfe\x04\xa0\x4f\xe3\xe5\x99\x80\xf6\x43\x1c\x42\x2a\x79\x21\x62\x0d\xa5\x90\xbb\x21\x8c\x2d\xaf\x00\x73\x9b\x8f\x8f\x9f\x9e\x86\xe7\x07\x01\x39\xe2\x26\xd9\x63\x5f\xdb\xd8\xea\x24\x41\xb4\xdb\x3a\x67\x65\x6d\xaa\xda\x34\x72\xb1\x36\x7a\x6d\xf1\xee\x1b\x12\x32\xb5\xab\x9e\x23\x05\x63\x2e\xce\x82\xff\x27\xc2\x4e\x48\x0c\x91\x77\xc4\x02\xba\xbd\x51\x1f\x3f\x9d\x4d\x58\x47\x55\x94\x92\x02\x01\x74\x4b\x42\xe3\x73\x51\x08\xfc\x9e\xb2\xcd\xc1\x46\xe6\x78\x8c\x0a\x86\x24\x00\x32\x92\x4a\xcc\x75\x55\xe2\x29\x81\x8c\xfc\xb7\x66\xe3\x20\xbc\x7e\xed\x0b\xca\xab\x61\xb8\xaf\xcf\x0f\x25\xcd\x74\xe5\x59\xd2\xee\xbe\x71\x49\x38\x50\xe6\xe7\x13\xd5\x39\xde\x54\x15\x37\x23\x80\x56\x28\x13\x83\xbd\x62\x45\x64\xf2\x77\x28\x48\xf1\x48\xae\x57\x7e\x25\xbf\x13\x3e\x7e\x0a\xe3\x85\xa0\x46\x20\x3c\x70\xc5\x6a\x95\x43\xc2\x2f\x5b\x0a\x5f\x8e\xf5\x48\xb9\xa2\x7e\x3d\x9a\x4b\x97\xf5\xb0\x51\x33\xfb\x4b\xb4\x13\x86\xc8\x1b\x84\x80\xe7\x65\xf4\x42\xfc\x65\x35\x99\x85\x58\x9a\x39\xb8\x3d\x67\x86\x2f\xaa\xb1\x8f\x33\x2a\x78\x15\x04\x2a\x64\xd7\x08\x48\x09\x53\x2b\x39\xe3\x1c\x5d\x56\x1f\x98\x9a\x5a\xa4\xab\x2b\xed\x31\xdd\x4f\x07\x1d\xaf\x8e\xe1\xf0\xe9\xb1\xfd\x6d\xb4\x19\xac\x0f\x45\xa4\x04\x5c\xd5\x26\xf8\x0d\xa8\xc6\xf8\xb7\xc2\x3e\x45\x53\x95\xc6\x97\xef\xdf\x7d\xb8\xbb\x44\x1e\xbf\x1a\x34\x56\x26\x96\xa5\xfc\x45\x97\xf2\xad\x52\xa5\xd2\x2b\x8b\x70\x4c\x3f\x8e\xe1\xc4\x8b\x08\xb4\x91\x41\x90\xc6\xc3\x5c\xba\xe8\x67\x03\x43\x2f\xf7\xbe\x44\xf7\x05\xbe\x30\xb0\x80\x28\x89\xad\x86\x66\xcc\xb1\x6b\x9b\x89\x1c\x52\x64\x75\x47\x14\x95\x39\x30\xae\x14\x3f\xe8\x68\xd6\x58\xb6\x65\xc1\x77\x69\xe4\xf7\x7b\xb8\xb0\x24\x5d\xed\x20\x70\xa5\x2f\x05\xf3\x00\xce\xce\x8c\xd0\x4e\xbd\x45\x97\xd8\x66\x77\x71\x31\xeb\x96\x8a\x3a\x9d\x3f\xe5\x19\x5d\xfd\xb1\xd6\xc1\xc5\xd1\xf3\x3e\x1e\xc3\xf9\x88\x7c\xee\xd3\xe9\xdb\xfe\x8c\xe3\x72\x53\x7a\x2b\x12\x08\x5e\x4f\x15\x9d\x5e\x3c\xee\xb3\x64\x0f\x9d\x93\x19\x08\x4a\x8f\xd3\xba\xeb\x51\xd1\x6f\x63\xbb\xa1\xc3\xd0\xd9\xff\x06\x85\x03\xfc\xc2\x9e\xa2\x84\x6f\x78\xf2\xf9\x91\x2b\x24\xda\x36\xe0\xa4\x3d\x49\xad\x70\x30\x30\x56\x9c\x22\xf6\x1f\xd0\x0a\xde\x6f\x01\xfd\x5e\xa4\xab\x4e\x6c\x87\xed\x40\x9e\x53\xc5\x52\xe2\x39\x88\x54\x43\x96\xa1\x63\x6e\x91\x46\xd1\x06\x56\x4f\x09\x72\x92\x73\xad\x07\xe1\x0e\x33\x56\xa9\xec\x81\x28\x7b\x3f\x52\xb3\x21\xb2\x36\x74\x55\x27\x40\x25\xa8\xea\x4d\x9e\x51\x05\x95\x69\xf9\xf8\x93\xc7\x27\x76\xbd\xd3\xaa\xb3\x37\x2b\x99\x51\x14\x8d\x55\x73\x86\x41\x54\x6c\x22\xef\x10\x58\xe3\x6e\xae\x46\x9a\x30\x2d\x2c\xc1\xb9\x0a\x4c\x17\x49\x2c\xf0\x24\x11\xc4\x12\x52\x3c\x52\xc7\x02\x3d\x9c\x32\x8a\x46\x5a\x99\x1d\x8f\xf5\xd3\x7b\x5a\xfa\xdc\xb9\x3e\x84\x66\xc6\xa4\xa7\x6f\xaf\xe2\x90\x81\x55\xe3\xd0\xca\x23\x40\xfa\x38\x00\x23\x1c\x83\x30\x03\xc7\x5c\xb5\xbc\xe1\x12\x6d\x0b\xc2\xa8\x2b\x22\x85\x6f\xac\xf6\x9c\x52\x40\xcc\xee\xb7\xad\xae\xf0\x6c\x84\x79\x14\x42\xf6\x2d\x15\x78\x99\xa1\x53\xa0\x06\x02\x27\x05\xf0\x49\x9f\xc1\xbc\xc1\xfa\x0b\xd4\x73\x0b\x8f\xa4\x96\x90\xc6\x59\xf6\x6a\x7e\x8a\x20\x0d\x8f\xad\x92\x9f\x1e\xe8\x6c\xbf\xad\xca\x64\xef\x39\x8a\xf1\x2f\xae\x86\xf4\x81\x76\xdb\x76\xd1\x71\xbc\x56\xa2\xdd\x82\x28\x19\xcf\xc9\x3a\x94\x41\x74\x67\xa5\x8c\xba\xa2\xe7\xdb\x3c\xdb\xed\xcd\x8a\xc1\x85\x3d\xd7\x63\x83\x84\x52\x2e\x6c\x4f\x85\x9e\x55\x96\x06\xe6\x60\x02\x0c\xa5\x76\x56\xa4\x5e\x0b\xb8\xec\x4c\x8d\x95\x60\x68\x08\x15\xab\x94\xf9\x01\x3f\x84\x6f\x81\x71\x20\x6f\xcb\x0a\x5c\xf4\xdf\x03\xe0\xa5\x3d\xcf\x44\xf3\x80\xa0\x89\x26\x15\x23\xb9\x8a\xa7\xdb\xc2\xa7\xe2\x9b\xed\x59\x9b\x6b\x9b\x87\x99\x8f\x02\x95\x50\xe6\xf0\xca\x26\x68\x34\xed\xe8\x13\x36\x4a\x41\x9f\xb6\x74\x3d\x63\x3f\x36\xa2\x83\x88\x68\xd3\x0d\xa8\xe4\x94\xba\xdc\xb8\x2f\x20\x4d\x0d\x6c\x54\x77\x6c\x8a\x88\x9f\x67\xc8\x85\x45\x78\x54\x73\x7b\xd4\xa5\x6b\xa0\x75\x0d\x6a\xae\x73\xb5\x1e\x40\xb1\x46\xea\xd3\x8c\xf2\xb9\x7d\xd7\x21\x1c\x84\x53\x88\xa9\x88\xba\x4d\xdd\x4b\xc5\x52\x21\x25\xf1\xe9\x98\x74\xcd\x16\xeb\xe7\xd4\x64\x64\x73\x03\x55\xfa\xce\xe1\xcd\x7e\xff\x9d\x4d\x07\x39\xe4\xba\x51\xe1\x68\x6b\xf4\xbd\x6e\x1d\x39\x55\xf6\xdd\x12\x5e\x4b\xae\x4f\xac\x38\x5f\xd9\x3b\x13\xc2\x6f\xee\xc5\xc0\xbe\x65\xa0\x37\xa5\xa1\xdc\x39\x4e\x5b\xad\xf8\xfe\xfb\x73\x5b\xa9\xe3\xa9\xba\x34\xc3\x6a\x2d\x7c\x1d\x4e\xf6\x5c\xee\xfc\x21\xd7\xc9\x4a\x2d\x53\xa1\xf2\x03\xf9\xeb\xce\x5b\x8e\xeb\xa7\xe9\xda\xd8\x0b\xbe\x78\x7a\x2e\xd5\x53\xb7\xc6\x35\xfb\x72\xb2\x92\xce\x78\xec\x73\xe9\x8a\x96\xf3\xb7\x28\x35\x3d\xa0\xa6\xa2\x79\xed\x4f\xe5\x76\x95\x15\xd1\x85\x4b\x12\xca\xb1\xb1\x0a\xc3\x31\xeb\x74\x4c\x0d\x45\xc6\x25\x61\x21\xb4\xb9\x7d\xb7\x58\x74\xfb\xa9\x7e\x2a\x12\x82\xa8\x31\x00\xc2\x3d\xf1\xb1\x37\x4d\x59\xbf\x9c\x5e\xb9\x54\x52\x8f\x39\xb6\x86\x36\xb3\x34\x68\x35\x13\x9e\x43\xd6\x33\x99\x28\xc1\xfd\xb1\xa1\xa6\x63\xb4\xd7\x38\x5b\x6c\xf0\xce\x9f\xd0\xdd\x09\x02\xed\xfa\xd8\x9c\x5b\x35\x40\xa1\x82\x2f\x6a\xf0\xdd\x44\x51\xfd\x09\xe9\x9b\x08\x55\x0c\xa5\x87\x2e\x52\xf5\x42\xb6\xe6\x83\x45\x68\x2f\x4f\x27\xcb\x8e\x43\xae\x7c\x75\xfd\xa3\x73\x64\xb7\xe3\x93\x13\x65\xb5\x63\x90\x28\xff\x84\x4c\x12\xc6\x6d\x7f\xde\xa7\x32\x65\x02\x1d\xf6\x74\x03\xd8\x7e\x3d\x08\x5b\x5e\x97\x09\x72\x8d\x1a\x7e\x1a\x18\x27\x53\xbe\x4b\xf9\xe3\x70\xb1\x76\x4f\x22\xd2\x3a\xfc\x84\x86\x18\x9d\xc6\x8f\xb9\x40\xb9\xe9\xcb\xa6\x3f\x5a\x53\xd8\x99\xe7\x49\x0e\x96\xa6\x07\xef\xd1\x04\x82\x26\xac\x65\x91\xb7\x67\xc8\xb3\xeb\xdf\x9c\x92\x2f\xd7\x1e\xdf\xbd\xf4\xf4\x2e\xf2\x27\x83\xf9\x8f\x11\x74\xb9\x0e\xa6\xa0\x44\x54\x81\x6f\x58\x5c\x25\x5c\xcd\x57\xdb\xf9\x93\xea\x52\x9d\x73\x1f\x12\xc8\xde\x6a\xa9\x92\xcd\x80\x34\x5d\x63\xc0\x80\xe9\x32\x4f\x3f\x18\x0c\x3e\x86\xe0\xe4\xa1\x41\x68\xda\x2a\xdc\xf8\xbd\xe2\x3f\x76\xea\x36\xd5\xdd\x9e\x71\xdf\xd3\xfa\xd6\xb8\xa2\xbf\x7c\x29\x2d\xdc\xdf\x6f\x34\xfb\xe5\xc3\xbb\x7f\x32\x77\xc8\x5b\x38\x26\xb4\x1f\xde\x06\x9e\x04\x5f\xf7\x2a\x66\xbf\xde\xfc\xe3\x67\x63\xaa\x5b\x47\x3f\x34\xbe\x15\x7d\xf5\x1c\xb7\x99\xbf\xfe\x7c\xfb\xae\xb2\x7f\x11\x0a\xfd\x79\x72\xf2\xbd\xd4\x82\x06\x93\x11\xf0\x32\xb5\x66\xaf\xd9\x0f\x2f\x5e\xb0\xbf\x5a\xf7\x22\x37\x27\xdb\x1e\x68\xd1\xa8\xf9\x03\xc8\x1d\x4e\xda\x21\x8b\xd9\xf8\x59\xff\xbb\x82\xfb\x79\xbc\xf8\x7f\x00\x00\x00\xff\xff\x24\x88\x6a\xd1\x1c\x1c\x00\x00") func uiTsModelsTimeseriesTsBytes() ([]byte, error) { return bindataRead( _uiTsModelsTimeseriesTs, "ui/ts/models/timeseries.ts", ) } func uiTsModelsTimeseriesTs() (*asset, error) { bytes, err := uiTsModelsTimeseriesTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/models/timeseries.ts", size: 7196, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsPagesGraphTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x56\x51\x8f\xe2\x36\x10\x7e\xe7\x57\x4c\xf3\x14\x4e\xc8\x61\x75\x52\x1f\xb8\x72\x3a\xba\xad\xb6\x95\x8a\xd4\x6e\x57\xf7\x72\x3a\x9d\x8c\x19\x12\xf7\x1c\x9b\xda\x0e\x1c\xaa\xf8\xef\x1d\x3b\x21\x1b\x42\x58\xaa\x95\x6a\x21\x48\xf0\xcc\x37\x9f\xe7\x1b\x8f\x9d\x65\xe0\x4c\x65\x05\xce\x60\xcb\x73\x74\x59\x6e\xf9\xb6\x60\xde\x8d\x32\x9a\xfa\xc1\xe2\x06\x2d\x6a\x81\x34\xeb\x8b\x79\xc2\x58\xe6\x0f\x5b\xa9\x73\x97\x95\xd2\x17\x56\xaa\xbf\xda\x27\xb6\x26\xb7\x04\xb2\xf7\x37\x5d\xd7\x6f\xe9\x73\xdb\xbc\x34\x6b\x54\x2e\xf3\xb2\x44\x87\x56\xa2\xbb\xe5\x20\x4c\xb9\x35\x1a\xb5\x27\x4e\xe8\xad\x14\xad\x07\xb9\xc0\xa2\xf2\x85\xb1\x33\xf8\xd1\xf2\x12\x1e\x6c\xa5\x51\x5a\x48\x57\xf4\xc6\xf2\xfa\xed\x43\x5e\x72\x5a\x07\xc1\x8c\xbb\x0e\x4b\xee\x3d\x3c\x59\x2e\x0e\x90\x96\xf4\xfc\x41\x18\xf1\xd5\x1a\x2e\x0a\xc5\x57\xae\x36\x1f\x65\x6f\xde\x8c\xe0\x0d\x2c\xd6\xa5\xd4\x1f\x25\xee\x1d\x48\x07\xbe\x20\x76\x56\x96\xdc\x1e\x80\x56\x53\x29\x84\x8d\xb1\x70\x7f\xf2\x47\x07\x3c\x38\x48\xe7\x2d\xf7\x72\x87\xb0\xc7\x55\x80\x91\xda\xa3\xdd\x70\x81\x8c\xde\xb2\x51\xe3\xdb\x01\xff\x67\x04\x10\x43\x02\x59\x3f\x04\xcd\x42\x3c\x4e\xd1\x8c\xd9\x00\x7d\x84\xa1\xd4\x6c\x7d\x8c\x17\x32\x08\x75\x0a\x21\xea\xeb\x58\x74\xcc\xe8\x1b\xbf\x6d\x8d\xf5\x27\x76\x35\x52\x00\x0f\xa3\x09\x00\x31\xc8\x02\x5c\xc9\x95\x82\x35\x96\x46\xd7\x7c\x8d\x0e\x91\x38\x88\x82\x5b\x3f\x81\x7d\x21\x45\x01\x6b\xe9\xb6\x8a\x1f\x02\x19\xbf\x37\xf5\x9c\x7b\x86\x69\xa6\xa9\x0e\x62\x76\x1c\x27\x6a\x6b\xee\x39\xf1\xf3\xc0\x1d\xd8\x20\x1c\xee\x70\x0d\xab\x03\x41\xfc\x51\xa1\x3d\x2c\xb9\xa6\xda\xb4\xac\x45\xc9\x9a\xa7\x73\xf2\xbf\x93\x51\xcb\x3d\x0c\xa1\xb8\x73\x94\x6d\xed\xad\x51\x0a\x2d\xc8\x72\xab\xb0\x0c\x05\x02\x5f\x4e\x55\xbb\xac\x7f\x3b\x56\x5d\x88\x30\xca\x3a\xfc\x6c\x19\xeb\x91\x2d\x9b\xd2\xea\x52\x7b\xd7\x73\x71\x85\xd9\x3f\x72\x8f\x6e\xb6\x32\x46\x21\xd7\x7d\x83\x28\xf0\x8e\xab\x99\xae\xca\x55\xf0\xef\x03\x54\xe5\xdf\x01\x1f\xe6\xa0\x71\x0f\xbd\xd0\x8f\x28\x68\x11\x91\x40\x7a\x37\xa5\xac\x7e\x1f\xbe\xee\xa6\xd3\xe9\x04\x7a\x40\xf5\x18\xa2\xbe\xc8\x73\x8b\x39\xf7\xc6\xb2\xc5\xc7\x87\x09\x24\xc2\x32\x4d\x76\x4c\x90\xcc\x8e\xb9\x4a\x08\x74\x8e\xdd\x25\xe3\x3e\x79\xd2\x1e\x5f\xc7\x6e\x80\xdc\x6d\x6a\x5f\x1e\x17\x4f\x3f\xbf\xcc\xaf\x87\x2b\x62\x85\x56\x82\x00\xd2\x71\x5f\xce\x30\x7c\x21\x1d\x6b\x74\x1d\x5e\x44\x57\xdd\x34\x9a\x9f\x24\xb9\x48\x47\x1f\x90\x51\x6b\xb2\xe8\x8a\xf4\xba\xe5\x49\x7e\x8a\x4d\x75\xff\x6b\xf3\x96\xa6\x63\x98\xbf\xbf\x82\x35\x89\x19\x9c\x5e\x60\x1e\xfb\x8b\x37\xba\xd2\xca\xf0\x35\x81\x0d\x2d\x5d\x50\x39\xda\x36\xe2\x19\x9b\xdb\xd8\xde\xe4\xb9\xc2\xba\x4b\xcc\xa1\xa6\x7b\x35\xbf\xed\x26\x20\xd3\xef\xce\xff\x19\x4a\x8c\xdc\x40\x7a\x6e\x35\xbc\x80\x16\xff\x94\x22\xca\x60\x5d\x6c\xf1\xdf\xb6\x38\x07\xb3\x7f\x04\x12\x19\x5f\x83\xfb\xa2\xfc\xc7\x57\x97\x44\xd7\xf3\x2c\xdd\x4d\x6f\xdb\x54\x5a\xc4\x4e\x2b\xda\x06\x95\x8e\x67\x2f\x74\x2b\x6a\xa0\x95\xd5\xb1\xa4\xef\x3b\x2e\xef\xfe\x6b\x9c\x1d\x9d\x2f\xa9\xf0\x56\x75\x82\x5c\x0a\xb1\xe3\x16\x56\x95\xf7\x46\x3f\xe1\x37\x3f\xa3\xdd\x46\x1d\xfd\xa2\xc9\x91\xa2\x01\xe9\x96\xa2\xcf\x40\x54\x29\xc9\x9f\x64\x0c\x4f\xc6\x73\xe5\x92\x8b\x6c\x5d\x97\x6f\x00\x24\x86\xbc\xc4\x18\x4e\x58\x99\x26\x2c\x1e\x8e\xe1\x18\x49\x26\xf0\xe9\x4a\x89\x90\xdd\x2f\x6f\x69\x3e\xa9\x77\xc1\x4f\x74\x1c\x26\xe3\xa1\xc6\x16\xc6\x7d\x7b\x23\x69\x1b\xcb\x6f\x52\xd7\x1b\x88\x09\x8b\x44\xb0\xce\x50\x53\x27\xff\x3f\x10\xd1\x4f\xae\x1c\x12\xad\x81\xd4\xdb\xca\x7f\xa2\xdb\x1a\xce\xeb\xac\x7e\x26\x97\x6b\x5b\xe6\x34\xa8\x7f\x54\x74\x8b\x7c\x96\xe1\x1a\x83\xd3\xa0\x0b\x8a\x92\xe2\xeb\x0c\x22\xef\x4e\x67\x79\xc9\xf1\x38\xbe\x58\xd9\xe7\x5e\x6d\x3f\xff\x1e\x47\xc7\xd1\xbf\x01\x00\x00\xff\xff\x47\xd6\x5d\x9c\xe1\x0a\x00\x00") func uiTsPagesGraphTsBytes() ([]byte, error) { return bindataRead( _uiTsPagesGraphTs, "ui/ts/pages/graph.ts", ) } func uiTsPagesGraphTs() (*asset, error) { bytes, err := uiTsPagesGraphTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/pages/graph.ts", size: 2785, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsPagesMonitorTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x7c\x91\xbb\xce\xdb\x30\x0c\x85\x77\x3d\x05\xe1\xc9\x09\x0a\x6b\xe8\x96\x5e\x90\xb4\x43\xa7\x00\x19\x8a\xee\x8a\x4c\xdb\x6a\x75\x09\x28\x2a\x69\x10\xe4\xdd\x4b\x25\x75\xe0\x7f\xf9\x35\xd8\x22\xce\xf9\x0e\x09\x4a\x6b\xc8\xa9\x90\xc5\x0d\x9c\xcc\x88\x59\x87\x14\x1d\x27\xea\x38\x2b\x2d\xe2\x67\xc2\x01\x09\xa3\x45\xd1\x79\xfa\xd2\x74\x9d\xe6\xeb\xc9\xc5\x51\xac\x8e\x27\x72\xfe\xf7\xeb\xd6\xf5\x82\x35\xa0\xbf\x2a\x61\x61\x57\x78\x4a\xb4\x81\x6f\x64\x02\xfc\xa0\x12\xd1\x11\xb4\x47\xa9\xba\xf1\x59\x6d\xc7\x60\x84\xb2\x29\xac\x96\xc0\xde\x30\xc3\x4f\x32\xf6\x0a\x6d\x90\xfb\xd6\x26\xfb\x87\x92\xb1\x93\x37\xc7\xfc\xb4\x2b\xbd\x5e\x2b\x58\xc3\xae\x0f\x2e\xfe\x72\x78\xc9\xe0\x32\xf0\x24\x63\x92\x0b\x86\xae\x10\x52\x5f\x3c\xc2\x90\x08\xbe\xcf\x3c\x66\x30\x15\x70\x99\xc9\xb0\x3b\x23\x5c\xf0\x58\x63\x5c\x64\xa4\xc1\x58\xec\xa4\xd2\xea\x3f\xbb\x08\xbf\x29\x80\x47\x4b\x10\xf7\xfe\xb9\xa3\xb9\xe3\x59\x1c\x8f\x3e\xf8\xf7\xe4\x13\xc9\x6e\xc0\xfa\x92\x25\x11\x32\x1b\x2e\xb9\x7b\x60\x5a\xbe\xe2\x48\xc4\xf3\x6c\x73\x4e\x0d\xaf\xe7\xad\x7a\x90\xf7\x78\x49\x0b\x79\x28\xd1\xb2\x4b\x11\x6c\x8a\x4c\xc9\x7b\xa4\x76\x05\xb7\xfb\x3b\xce\x3a\x61\xf5\x2c\x2c\xf5\x10\x72\xa1\x08\xa1\x6d\xa6\x8f\xcd\x07\x68\xe6\x79\x0e\x5e\x36\x31\x25\xdf\x23\x35\xab\x4f\x0b\x68\xee\x51\xff\x77\x75\x57\xff\x02\x00\x00\xff\xff\xd6\xb1\x96\xcc\x3e\x02\x00\x00") func uiTsPagesMonitorTsBytes() ([]byte, error) { return bindataRead( _uiTsPagesMonitorTs, "ui/ts/pages/monitor.ts", ) } func uiTsPagesMonitorTs() (*asset, error) { bytes, err := uiTsPagesMonitorTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/pages/monitor.ts", size: 574, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsPagesNodesTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x55\x5d\x6f\xa3\x38\x14\x7d\xcf\xaf\xb8\xe2\xa1\x82\x36\x6b\xf6\xe3\x8d\x6c\xaa\xed\x76\x57\xab\x4a\xdb\xce\x8c\x2a\xcd\x4b\x15\x45\x06\x9c\xe0\xd6\xd8\x19\xdb\x90\x89\xaa\xfc\xf7\xb9\xc6\x40\x20\x49\x67\xfa\x36\x48\x0d\xd8\xd7\xe7\xdc\xaf\x73\xdd\x38\x06\xa3\x2a\x9d\xb1\x04\x36\x74\xcd\x4c\x2c\x55\xce\x0c\xb1\x66\x12\xa3\xe9\x4f\xcd\x56\x4c\x33\x99\x31\xb4\xda\x62\x1e\x10\x12\xdb\xdd\x86\xcb\xb5\x89\x4b\x6e\x0b\xcd\xc5\x73\xff\x45\x72\x84\x05\x10\x5f\xbf\x09\x2d\x91\x5b\x78\x17\x4b\x63\xa9\xad\x4c\x87\x40\x08\xdc\x54\xb6\x50\x3a\x81\xbf\x35\x2d\xe1\x3f\x5d\x49\xc6\x35\x84\x29\xae\xc8\xda\xaf\xfe\x5a\x97\x14\xfd\x64\xaa\x8c\x10\x71\x79\x39\x81\x4b\xb8\xc9\x4b\x2e\x3f\x73\xb6\x35\xc0\x0d\xd8\x02\xdd\x69\x5e\x52\xbd\x03\xf4\x56\x09\x06\x2b\xa5\xe1\x56\x65\x2f\x5a\xd1\xac\x60\x06\xa8\x03\x70\x63\x35\xb5\xbc\x66\xb0\x65\xa9\xa3\xe1\xd2\x32\xbd\xa2\x19\x23\xb8\x8a\x27\x2d\x76\x40\xfe\x3a\x01\x68\x5c\x02\x9e\x7e\x70\x45\xea\xfc\xd5\x68\x6f\xbc\xb0\xaf\x1b\xa1\x34\x16\xa7\xd9\xf6\x09\x82\x5a\x01\x15\x02\x7c\x59\x1b\x74\x8c\xbf\x78\x54\x69\xdb\x85\xe8\xe9\x9c\x87\xde\x52\x53\xdd\x60\x1e\x1b\x16\x66\x12\xb8\x6f\x8a\x47\x1e\xfa\x4d\xe2\x61\x73\x90\xe8\xff\x0d\x6b\x18\xcd\x86\xac\x99\xa0\xc6\x60\x35\xa4\xd5\x4a\x08\xa6\x81\x97\x1b\xc1\x4a\x26\xad\x81\x65\xd7\xc6\x7b\xff\x1e\x9c\xf2\x91\x81\xab\x6c\x4d\xad\x4f\x8d\x67\xb0\xfc\x52\x31\xbd\xfb\xb7\xc6\x9f\xfb\x47\x8c\xe3\xb7\x5f\xf1\x99\x1d\x9d\x5d\x36\x95\xad\xa9\x48\x40\x56\x65\xca\xf4\x6c\xd2\x9d\xa8\x52\x81\x2c\x99\x92\xd8\x8c\x2a\xb3\x4a\x87\x51\xef\x0a\x46\xd9\x93\x4f\xce\x53\x97\x8c\x7b\x6c\xc1\x0d\xe9\xb9\xd1\xb9\x61\xf6\xae\x5d\x85\xc8\x33\xbf\x3e\x4b\x30\x1d\x24\x4f\x46\xf1\xf7\xdc\xfb\xa3\xf8\x94\xac\xa4\x50\x34\x1f\x05\x97\x09\x46\x75\xef\x6f\x1c\xcc\x80\x69\xc0\xd7\x6a\xa7\x57\xcf\x47\x9c\x36\x30\x85\xda\x02\x05\x81\x72\xec\x84\xe2\xa4\x43\x6b\x94\x39\x4d\x51\x19\x07\xd9\xb4\xc2\x39\x2b\x9d\x86\xab\x0b\xae\xb5\xaf\x2a\x99\x59\xae\xa4\xab\x6f\x9b\xf0\x28\x03\xcd\x6c\xa5\x65\xa3\x9d\xdb\xc1\x89\x71\xec\xa7\x6c\x4e\xec\xe7\x78\xca\x30\xc8\x79\x1d\x4c\xe1\xa9\xb7\x80\xdb\x2c\x7e\xc7\xbd\xc0\x2b\xf5\x7f\x4c\x33\x88\xa6\xe3\x03\x95\x38\x02\x01\x7c\x48\x9f\x59\x66\xc9\x0b\xdb\x99\x70\xd4\x44\x24\xc9\xc2\x28\x22\x06\x43\x0a\x23\x52\xd2\x4d\xd8\x05\xd6\x1c\xbc\xcb\x87\x91\xf9\xc7\x0d\x92\xc3\xb9\x39\x39\xe5\x7a\xf2\xb0\xc5\xec\x08\x75\xc8\x4a\x70\x8c\xef\x15\x30\x98\xa4\xe1\x21\xcd\xed\xc5\x73\xd8\x4f\x8f\x30\x70\xbe\x08\xbd\x91\xa0\xca\x8d\x0d\x83\x0b\x99\x9a\xcd\xec\x22\xad\x84\x98\xf9\xef\x71\x51\x06\x6c\xf4\xa9\xc0\x6b\x74\xee\x2f\xe5\x38\x80\xab\x71\x08\x57\x10\x2c\x9a\xe8\xb0\xc7\x2b\xbe\x4e\xd0\x87\x56\x15\x0e\xdd\xbe\xad\x79\x72\x0c\x39\xeb\x28\x80\x2d\x8e\x3c\x5e\x76\xb9\x66\xc6\x1c\x30\xd4\x6f\x10\xc9\xec\x56\xe9\x17\xe7\xee\x97\x13\x63\xfb\x3e\xa1\x5d\x44\xd1\xb8\xa8\xfb\x91\xef\xc5\x60\xb5\x78\xd7\xc4\x1c\x06\xc6\x8d\x48\xce\x2c\xce\x88\xbf\x5e\xc1\xe0\x9d\xdb\x0e\xcb\x8f\x66\xe5\x67\x8e\x4a\x77\xa7\xdf\xe5\x28\xc6\xb6\x55\x64\x43\xf1\x1f\x5c\x18\xb4\xfd\x09\x06\x45\x7b\xf7\x64\x81\x17\xf5\xc9\x68\x9d\xd3\xa2\x03\xfe\xd1\x01\x13\x70\xed\x6c\x27\x67\xac\x8c\xd1\xac\xfc\xe3\x8b\xdd\xcd\xd8\xa8\x8d\xdf\xe9\xa2\xfb\xdb\x4f\xbe\x05\x00\x00\xff\xff\xec\xae\xf6\xff\x62\x08\x00\x00") func uiTsPagesNodesTsBytes() ([]byte, error) { return bindataRead( _uiTsPagesNodesTs, "ui/ts/pages/nodes.ts", ) } func uiTsPagesNodesTs() (*asset, error) { bytes, err := uiTsPagesNodesTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/pages/nodes.ts", size: 2146, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsPagesRest_explorerTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\x5a\x5f\x6f\xdb\x38\x12\x7f\xcf\xa7\x98\xd5\xc3\x46\xea\x26\xf2\x02\xf7\x72\x70\xea\xec\xf5\xd2\x74\x7b\xb7\xed\x35\x48\xbd\xc5\x02\x41\xb0\xa0\x25\xda\x52\x23\x8b\x3a\x92\xb2\xeb\x2b\xf2\xdd\x6f\x86\xa4\x24\x4a\x76\xfe\x15\x49\x6f\xb1\xd7\x87\x36\x92\x38\xff\x38\xfc\xcd\x6f\x48\x26\xa3\x11\x28\x51\xcb\x84\x8f\xa1\x62\x0b\xae\x46\x92\x2b\xfd\x3b\xff\x54\x15\x42\x72\x19\x6b\xb5\x37\x42\x91\xe7\x92\xcf\xb9\xe4\x65\xc2\x51\x4a\x67\x93\x20\x8e\x47\x7a\x53\xe5\xe5\x42\x8d\x96\xb9\xce\x64\x5e\x7c\x6c\x9f\xe2\x14\xd5\x02\x18\x1d\xef\xa1\x2e\xbc\xa8\x75\x26\xe4\x18\xde\x32\xad\x61\x2a\x59\xb2\x81\x70\x89\xcf\x7f\x4b\x44\x72\x25\x05\x4b\xb2\x82\xcd\x54\x9c\x88\x65\x84\xf2\xcf\x9e\xed\xc1\x33\x78\x91\x2e\xf3\xf2\x43\xce\xd7\x0a\x72\x05\x3a\x43\xaf\x32\x5f\x32\xb9\x81\xa5\x48\xeb\x82\xc3\x5c\x48\x38\x69\xf4\xb9\x02\x46\x0a\xb9\xd2\x92\xe9\x7c\xc5\x61\xcd\x67\x64\x26\x2f\x35\x97\x73\x96\xf0\x18\xdf\x46\x7b\x4e\xd7\x33\xfe\x79\x0f\xc0\xb8\x04\x94\x3e\xc7\x89\x9f\xba\x79\x93\x5b\x06\x2b\x8e\x1e\x55\xbe\xac\x50\xab\xb5\x65\x7c\xdb\xfc\xe0\xf4\x81\xd2\x05\x2b\x56\xd4\x5c\xc5\x30\xcd\x72\x8a\xd8\xda\x63\xa8\x5a\x2e\x0a\xae\x45\x09\x67\xac\xe4\x45\x6c\xbe\x8f\xf0\x7f\x54\x17\x52\x37\x93\xe9\x39\xa6\x90\xda\xa0\xc8\xcc\x5b\x91\xf2\x02\x12\x51\x6a\x96\x97\x36\x19\x4a\xe3\x34\x13\x52\xc7\x11\x0a\x87\x3e\xf6\xac\x54\xad\x3f\xe7\x11\x1a\x67\xd6\x9c\xf5\xe2\xf9\x21\x4f\x67\x52\x54\x5c\xea\x1c\xf3\xd9\x18\x35\x2e\xe2\x56\x64\xe4\x9e\x5c\xfc\x2b\x26\xdd\x1c\x7f\xe1\x1b\x98\xc0\x32\xae\xd0\x44\x18\x04\xd1\xd1\x4d\x82\x1f\x28\x53\xf7\x13\x3d\x11\x35\xe5\xbc\x13\xfe\x71\x97\xac\x64\xe5\x82\xbf\xd7\x0c\x5f\xef\xb0\x6a\x24\x4f\xcb\xf4\x4e\x39\xae\x2a\x51\x2a\xfe\x46\x2c\x3a\xd1\x8b\x4b\x14\xdd\x95\xb4\x42\x2c\xce\x9d\x82\x05\x0d\x86\x8c\x8f\xf3\xba\x4c\x74\x8e\x2b\xbf\xce\xf2\x24\x83\x94\x27\x98\x49\xbb\x7a\x8d\x7d\xd0\x02\x58\xd9\x59\xfa\xed\xed\x9b\xd7\x5a\x57\xe7\xfc\xdf\x35\x61\x8a\x61\xa4\x0b\x5e\x72\x84\x34\x01\x9c\x1c\xc1\x92\x2b\x85\x45\x9a\x6e\xaf\x48\xeb\xcf\x8b\x27\xfc\x94\x61\xdd\xf5\xcd\x1e\x80\xa8\xb4\x1a\xc3\xef\x4d\xad\xbe\xb5\x3f\x7f\x7b\x7d\xfe\xae\x22\x03\x2a\x1a\x63\x19\x11\xb2\x1b\x8c\x80\xc9\x4a\xca\x34\x73\x23\x47\xed\x40\x3e\x07\x72\x12\x37\x53\x9a\x6e\x2a\x5c\xdc\xc9\x04\x82\x8f\x4a\x94\x41\xe4\xd9\x00\x63\x01\x13\xfa\xcf\xf7\xef\xfe\x15\x5b\x43\xf9\x7c\xd3\x53\x8f\x3a\xcb\xd7\xc0\x0b\x4c\xd1\x0e\xfd\x9e\x3f\xfe\x49\x7b\x3a\x7b\x03\x51\xfa\x11\x17\xbc\x5c\xe8\x0c\x8e\xe1\x47\xf8\xc9\x0e\x8c\x21\x08\x4b\xd1\xad\xc3\x4c\xa4\x9b\x28\x38\x1a\x6a\x5f\xec\x5f\xec\xdb\x74\xc5\x4b\x8e\x1c\x96\x1e\xc0\xfe\x25\xe0\x27\x8a\x80\x4a\xb0\x56\xf8\x05\x1a\x99\x5a\x16\xf8\x3a\xa6\x77\x32\x70\x19\x7f\x14\x79\x19\xee\xef\x7b\x93\xf2\x90\x15\x46\x71\x55\xab\x2c\x24\xd1\xc8\x13\xd0\xb5\x2c\x87\x29\xf2\x65\xae\x77\x82\x50\x25\xac\x84\x34\x57\xc8\xcd\x96\x0e\xed\x17\xe9\xa0\x84\x40\x33\xb4\xc1\x25\x32\x1a\xcc\x98\xe2\x29\x20\x54\xe8\x5b\x52\x4b\xa4\x75\xdd\x99\xb2\x54\x06\x62\xee\x57\x16\x61\xb1\x29\x1f\x62\x39\xde\x9a\x5e\xe7\x45\x01\x35\x81\x99\x1c\xd4\x55\x55\xe4\x3c\xed\xac\x65\x88\x3c\xb0\xd9\x6b\xf4\x5c\xd2\x8d\xe2\x8c\x13\x5e\x11\xd0\x4d\x88\xed\x30\x7e\xbe\x91\x76\x5a\xac\xd3\x24\x43\x6b\x7d\x0c\x36\x5f\xd1\x78\x88\x6c\x64\xb5\x65\xae\xf8\x73\x56\x6e\x8e\x07\x98\xe6\x65\x5a\xe1\x22\x11\x73\x04\xa3\xab\x95\x69\x7d\x23\x33\xcf\x9f\x14\xcd\x7b\x12\xc0\x0f\x28\x44\xa5\xfb\xeb\xf9\x3f\x4e\xc4\x12\x63\xc3\x64\x85\x5d\x66\xc2\x28\xea\x57\xc3\x77\xdf\x35\x79\xc2\xa1\x1e\x7c\x5b\x67\x3f\x4c\x60\xff\x7b\x7c\x9b\xec\xdf\x62\xdd\x1a\xd8\x85\x6d\x87\x91\x65\xec\x96\x20\xf4\x9d\x34\xc9\x70\x80\xf5\x46\x10\x9e\xe3\x36\x06\x7f\x00\x4b\x08\x9b\xb2\x1e\xfb\xcc\xd1\x8d\x5f\xb7\x31\xec\x46\x1e\x06\x8c\x3d\xb2\x07\xbd\x16\x75\x4c\x2e\xb8\x26\x26\x69\x3a\xa1\x93\xee\xc1\xf1\xc0\xe2\xb1\xb3\xd8\x07\xa6\x87\xc7\xae\xd3\x10\x1c\xbd\x76\xb2\x8d\xc8\xce\xda\x10\x9a\x0f\x45\x64\x67\xe9\x61\xd0\x34\x33\x7d\x74\x6c\x1a\xab\x23\x42\x65\x9b\x8c\xd0\x03\x89\xed\x5e\x26\x0d\x5b\xae\x3a\x82\x47\x8b\x4f\x0a\x19\xa0\x95\xcd\x59\x91\xff\x07\xf7\x94\x4d\x42\x2c\x89\xc1\xe7\x06\xbe\x86\x63\xaf\x3d\x9c\xf5\xcb\xc8\x06\x63\x5b\xc9\xd9\xbb\xf7\xd3\x41\x2b\x71\x93\xc4\x4d\x63\x39\xcf\xa9\x4b\xb7\x6e\x90\x9b\x2d\x1f\xf7\x15\xc0\x92\x36\xd7\xae\x0d\xbe\xe6\x2c\xe5\x32\x0c\x4e\x70\x5b\x85\x49\x3d\xa4\xc6\x15\x1c\x40\xa0\x71\x6a\xa3\xaa\xc0\x9d\xd6\x11\x24\x19\xc3\x4e\xae\x27\xbf\x4e\x5f\x1d\xfe\x15\x03\x38\xea\xd9\x73\xf3\x40\xb3\xfe\xf7\xeb\x1d\x41\xba\x76\xe2\x01\x36\xec\x15\xf6\xcd\x95\xed\x7e\xde\x51\x82\x89\xdb\x27\xfd\xcf\x8a\xd0\x6d\xd4\xfe\x88\x65\xe8\x72\xf3\xe8\x85\xe8\xec\x7e\x2b\xc5\xa7\x2b\x45\x46\x48\x49\x18\x99\x1a\x7d\x3a\x5c\xaf\xd7\x87\x78\x28\x59\x1e\x62\x26\x6c\xcf\x4c\x9f\xa8\x42\x1d\x9a\x1f\xb9\x46\x0b\xce\x24\x1d\x28\xcc\x83\xfa\x82\xbd\x4e\x63\x21\xf4\xb3\xe9\x6f\x28\xcd\x09\xa5\x5d\xc1\x3d\x2f\x16\xef\x30\x39\xab\x35\x1d\x47\xcd\x41\x25\xe3\x05\x1e\xf7\x3a\x0f\x3a\x63\xba\x77\xe2\x48\x30\xff\x57\x6c\x86\x94\xe1\xd4\xdc\xa9\xb0\x31\x36\x38\x71\x2e\x78\xff\xc0\xd9\x1a\xb6\xda\x21\x71\xab\x3b\x41\x20\x2e\x4a\x63\x7d\x1c\x46\x93\x63\x2c\xba\x03\x62\x2f\x72\x95\x9a\x2f\x33\x21\x70\xba\x65\x37\xd5\x26\xed\x61\x90\x97\x55\xad\x2f\x34\x82\x64\x62\xed\x5e\x22\x58\xfc\x8a\x45\xa6\x1a\x03\xf9\xea\x10\xdd\xda\x6e\x9f\xc2\xa8\x1b\x6d\x42\x69\x1e\x9a\x91\x66\xeb\xb3\x9d\x45\x3b\x89\x57\x39\x2f\xd2\xfb\xa5\x12\x33\x4e\x61\xc3\xdc\xa8\x7c\x61\x1a\x8d\xf2\xf3\xe9\x71\x3f\x91\x76\xc2\x94\xb4\xe9\x17\x25\x91\x8c\xf5\x53\x88\xed\x2f\xe1\x99\x28\xb0\x2a\x1f\x96\x48\x97\xfb\x95\x6d\x71\xbd\x04\x67\xb4\xa7\x45\x62\x8b\xd7\x48\x81\x2f\xb4\xc6\x7a\x37\x62\x81\x9b\x40\x74\x43\xd2\xdd\xa5\xc5\x29\xb5\xac\x76\x87\xdc\xc6\x9a\x14\x4c\x29\x20\xe2\x90\xa2\x28\xda\xcb\x13\xb3\x5a\x23\xef\x3a\x23\xde\x2a\x98\x33\xe4\x52\x6a\x8a\xed\xf9\x7e\xce\x8a\xde\xf9\xf3\xca\x5c\x68\x98\xcb\x92\xb8\x25\x78\x9f\xde\x8b\xc1\xb0\x69\xec\x47\x7b\x7e\x00\xaf\xdc\xca\xf5\xfc\x5b\xd6\x70\x4c\xef\xda\x51\x8f\x1f\x75\x96\xab\x78\x10\x67\xa8\x65\xed\x47\x07\xce\xb5\xbf\xcb\x8c\x62\xc4\x14\x56\x19\xa9\x27\x82\xee\xac\x34\x3f\x80\xde\xeb\x6e\x4a\xc3\x48\xff\x8e\x9c\x97\xb6\x48\x53\xee\xd2\x82\x49\x4e\x8d\x1b\x31\x8e\xf4\xc3\x8a\x62\xc6\x92\x2b\x6f\x2e\x95\xcc\x57\x08\x6f\x68\xac\x63\x42\x90\x9c\x26\xc7\xbb\x67\x30\x4c\x30\xee\x4a\x86\x0a\x36\x35\xc1\xcf\xa7\xd3\xc0\x13\xac\x84\xba\x49\xd2\xb6\xa3\x4e\x34\xc3\x56\x72\x83\xe8\xeb\xd3\x17\x2f\x7d\x51\xcc\xde\x8e\x90\x9d\xf0\xcb\xd3\x37\xa7\xd3\xd3\x60\x9b\xd3\xb7\xb7\x17\x0d\xf4\xc2\x68\xbc\x13\x87\xae\xe6\x4a\xbe\xf6\x70\x1a\xde\x6d\x79\x95\xf3\x75\x98\x68\x6c\xfb\x9d\x5a\xb4\x6d\x17\x6b\x59\x71\xa3\x41\x09\x6f\x69\xc4\xe9\xa8\x43\x17\x20\x96\xd9\x45\xaf\x37\xa2\x5e\xf6\x17\xea\xb2\xbf\x8c\x3e\xc0\x19\xcb\x65\x10\x1d\x0c\x05\xa8\xdd\x6e\x29\x82\xa5\xa1\x30\xc0\x72\xc0\x41\x8a\x30\xc6\x5a\x71\x4f\x83\x45\x1f\xd8\x44\xab\x31\x02\x99\x32\xfc\xbd\x64\x52\x1e\x0d\x9d\xb6\xc6\x3f\x38\x6e\x30\x46\xb1\xd6\xee\x69\xde\x35\x9a\xe0\x67\xae\x1b\x65\x84\xd9\x03\x95\x69\x3f\xd2\x68\x13\xa0\x1e\xa8\x7e\x56\xb7\xbe\x09\xb9\x0f\xd4\x7e\x69\x60\xd9\x18\xb0\x20\xbd\x97\x89\xcb\xee\x12\xc9\xdb\x07\xec\xa0\xd2\x73\x62\xe2\xaf\x4a\xa5\xbd\x1b\x5a\xcb\x5b\xdd\xa7\x81\x98\xbd\x9e\xf5\x84\xf0\xc3\xd7\x26\x55\xef\x56\xe9\xcf\xca\xa9\xdf\xd8\xcf\xb2\x9f\x29\x86\x07\x53\x9f\x01\x6e\x53\xa3\x1d\x94\x1f\x99\x03\x11\xf9\x3d\x1f\xf8\xfe\x35\x69\xf0\xe9\x99\xc8\x1d\xb4\xfe\xd8\xdb\x3a\x17\xe4\x9d\x1c\xd4\x14\xee\x23\x73\x51\xff\xfe\xe2\xcf\x4a\x47\xdf\xb6\x78\x4f\x49\x72\x0e\xc2\xdf\x76\x78\xff\x27\x3b\xbc\x37\x62\xb1\xcd\xa9\xdd\x9f\x2f\xec\xc4\x70\x21\x16\xdb\xbf\x13\x76\x4c\xbb\x79\x6e\x59\xec\xe2\xf2\xb8\x2b\x2e\x73\x1d\x35\x06\xba\x67\x58\x89\x3c\x7d\xbc\x32\xf2\x99\xd2\x44\xe5\x36\x83\xdd\x4d\x97\x9f\x16\x17\x86\x23\x4b\x77\x45\xe6\x5d\x65\x3e\x5e\x0d\xf6\x8a\x0f\x9d\xdc\x56\x6f\xa5\x12\xc5\xd6\xb6\xa2\x01\xc0\x09\x45\xd9\xac\xbf\x09\xf9\xc0\x31\x94\xe5\xcf\xbe\x96\x91\x2a\xcc\xef\x8b\x97\x0c\xfb\x59\x13\x78\x88\x6b\x32\xbc\x57\xf5\xc3\x45\x07\x24\xd1\x1b\xbf\xf6\x11\xb4\x0b\x40\xfd\x3f\x4b\x39\x63\x8b\xee\x17\xf0\xb7\xad\x27\x7c\xbe\xbe\x2d\xbd\xf7\xc8\xe7\xae\x64\xee\x64\xbb\x1d\x6c\xd5\xbf\x1b\x1a\x96\x5d\xff\xb8\x33\x1c\x1d\x6e\x41\x86\x15\xd7\x7f\xf7\x0b\xeb\xe0\x96\x62\xa4\x7f\xd7\x7b\xff\x0d\x00\x00\xff\xff\x29\xf7\x5b\xb6\x59\x25\x00\x00") func uiTsPagesRest_explorerTsBytes() ([]byte, error) { return bindataRead( _uiTsPagesRest_explorerTs, "ui/ts/pages/rest_explorer.ts", ) } func uiTsPagesRest_explorerTs() (*asset, error) { bytes, err := uiTsPagesRest_explorerTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/pages/rest_explorer.ts", size: 9561, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsPagesStoresTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xc4\x55\x4b\x6f\xdb\x38\x10\xbe\xfb\x57\x0c\x74\x08\xa4\xac\x97\xda\xc7\x4d\x5e\x07\x9b\xa6\x45\x11\xa0\xe9\x03\x06\x7a\x09\x0c\x83\x96\x68\x8b\x09\x45\xba\x24\x65\xd7\x08\xfc\xdf\x3b\xa4\x1e\x96\x1c\x39\xc9\xad\x02\x2c\x8b\xe4\x7c\xdf\x7c\x33\x9c\x21\xe3\x18\x8c\x2a\x75\xca\x12\xd8\xd0\x35\x33\xb1\xb1\x4a\x33\x43\xac\x19\xc5\xb8\xf6\x9f\x66\x2b\xa6\x99\x4c\x19\x2e\xdb\x7c\x1a\x10\x12\xdb\xfd\x86\xcb\xb5\x89\x0b\x6e\x73\xcd\xc5\x43\xfb\x45\x32\x84\x05\x10\x5f\x9d\x85\x16\x2a\x63\xa2\xf6\xb1\x30\x96\xda\xd2\x34\x10\xc4\xc0\x75\x69\x73\xa5\x13\x78\xa7\x69\x01\x1f\x75\x29\x19\xd7\x10\x2e\x71\x44\xd6\xd5\xe8\xff\x75\x41\xd1\x51\xaa\x8a\x08\x11\x97\x97\x23\xb8\x84\xeb\xac\xe0\xf2\x3b\x67\x3b\x03\xdc\x80\xcd\xd1\x9f\xe6\x05\xd5\x7b\x40\x77\xa5\x60\xb0\x52\x1a\x6e\x54\xfa\xa8\x15\x4d\x73\x66\x80\x3a\x00\x37\x56\x53\xcb\xb7\x0c\x76\x6c\xe9\x68\xb8\xb4\x4c\xaf\x68\xca\x08\x8e\xe2\x51\x8d\xed\x90\x3f\x8d\x00\xbc\x4b\x40\xeb\x99\x4f\x53\xe3\x70\x8b\x06\xde\x0d\xfb\xb9\x11\x4a\x63\x7a\xfc\x74\x15\x21\xa8\x15\x50\x21\x6a\x08\xf1\xf8\x18\xdf\x68\xab\xb4\x6d\x44\xd6\x84\xce\x49\xbb\xb4\xa5\x1a\x7c\xae\x66\x9e\x88\x99\x04\xee\x7c\x06\xc9\xec\x38\x4b\x6a\xe4\x14\x24\x8a\x38\xbb\x1e\x46\x93\x2e\x75\x2a\xa8\x31\x98\x15\x69\xb5\x12\x82\x69\xe0\xc5\x46\xb0\x82\x49\x6b\x60\xd1\xec\xe7\x5d\xf5\xdf\xb1\xaa\xe4\x81\xcb\xf0\x96\xda\x2a\x42\x9e\xc2\xe2\x47\xc9\xf4\xfe\xc3\x16\x5f\x77\x33\x54\xf2\xf7\x5f\xf8\x4c\x4e\x6c\x17\x3e\xc3\x5b\x2a\x12\x90\x65\xb1\x64\x7a\x32\x6a\x2c\xca\xa5\x40\x96\x54\x49\xdc\x94\x32\x45\xbd\x61\xd4\xba\x82\x7e\x0a\xc8\x37\xe7\xaa\x89\xc6\x3d\x36\xe7\x86\xb4\xe4\xe8\xdd\x30\x7b\x5b\x8f\x42\x24\x9a\x5e\x0d\x33\x8c\x3b\xe1\x93\x5e\x04\x2d\xf9\xe1\x44\xa1\x92\xa5\x14\x8a\x66\x3d\x79\xa9\x60\x54\xb7\x0e\xfb\x6a\x3a\x4c\x1d\xbe\xba\x8a\x8e\x75\xf4\x15\x5b\x0f\x4c\xae\x76\x40\x41\x60\x65\x36\x25\x43\x53\x5f\xa1\xe6\x58\x39\x75\xed\x0c\x57\x8f\xa7\x69\x84\xd5\x06\xab\x52\x22\x89\x92\x2e\xbb\x75\xb0\x3d\xf5\x9a\xd9\x52\x4b\x5f\x3b\x37\x1d\x8b\xbe\xee\xe7\x6c\xae\xe2\x87\x78\x8a\x30\xc8\xf8\x36\x18\xc3\x7d\xbb\x02\x6e\x32\xff\x07\xe7\x82\xba\x54\x3f\x61\x88\x41\x34\xee\x5b\x94\xe2\x04\x05\xf0\x65\xf9\xc0\x52\x4b\x1e\xd9\xde\x84\xfd\x2d\xcc\x98\x49\xc3\x28\x22\x06\x45\x85\x11\x29\xe8\x26\x6c\xa4\x55\x96\xb7\x59\x57\x5c\xf5\xb8\x76\x72\x40\x57\x22\x03\x6c\xf7\x35\x70\x3e\x39\xc1\x1d\x43\x13\x1c\x35\x3e\x01\x0a\x4a\x3c\x13\xa9\x4e\x32\x9e\xc1\x61\x7c\x02\x82\xe1\x54\xb4\x8b\x04\x2b\xdd\xd8\x30\xb8\x90\x4b\xb3\x99\x5c\x2c\x4b\x21\x26\xd5\x77\x3f\x33\x1d\x36\x7a\x9f\xe3\x99\x3a\xad\x8f\xe8\x38\x80\x3f\xa0\x96\x8c\x5f\xc1\xdc\x4b\xc3\x5d\x5e\xf1\x75\x82\xfc\x5a\x95\xd8\x74\x87\x26\xeb\x49\xc7\x7c\xd0\x41\x80\xd5\x0d\xc1\x2b\xae\x25\x1e\x2f\x95\x67\x1f\xbe\x1b\xfa\x97\x4b\xc1\x0b\x1a\x82\xcf\x68\x93\x0c\xc2\xce\x68\xd9\xe1\xd1\x83\x87\x6f\x86\x81\x9a\x13\x20\xad\x66\x89\x64\x76\xa7\xf4\xa3\xf3\xfb\xe7\xb0\x45\xfd\xff\xcc\xc1\x3c\x8a\xfa\x7b\x7c\xe8\xa9\x98\x77\x46\xf3\xb7\x75\xf0\xb1\x81\xdd\xb9\x9f\x31\x8b\xb7\x54\x75\xf0\x83\xc1\xdb\x00\x3b\xd4\x0b\x7b\xad\x83\x7f\x67\x03\xb7\x97\x0d\x96\xd3\xb4\xd9\x3b\xb2\xa1\x78\xfb\x86\x41\x53\xe7\x41\x27\x71\x6f\xef\x78\xa8\x3a\xed\x59\xcb\x0f\xb5\x87\x43\xfe\xdb\x22\x13\x38\x5f\xb6\xfd\x1e\x7e\x5f\xe5\xbc\xed\xfe\xde\x7e\xbe\xb0\x9d\xee\x77\x18\xfd\x0a\x00\x00\xff\xff\x2a\xcc\x4b\x96\x07\x09\x00\x00") func uiTsPagesStoresTsBytes() ([]byte, error) { return bindataRead( _uiTsPagesStoresTs, "ui/ts/pages/stores.ts", ) } func uiTsPagesStoresTs() (*asset, error) { bytes, err := uiTsPagesStoresTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/pages/stores.ts", size: 2311, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsTsconfigJson = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\x84\x92\x41\x4b\x3b\x31\x10\xc5\xef\xfd\x14\x65\xcf\x7f\x12\x0a\x7f\x2f\xde\x44\x7a\x10\x94\x7e\x00\x91\x12\xb7\xd3\x36\x25\xc9\x84\x99\x49\x51\xa4\xdf\xdd\x49\x5a\xb1\x75\xbb\xba\x97\x85\xfc\xde\x7b\x93\x79\xbb\x1f\x93\xa9\x3e\xdd\x1e\x88\x3d\xa6\xee\x76\xda\xcd\xcc\x7f\x33\xeb\xfe\x1d\xcf\x7b\x8c\xd9\x07\xa0\x45\x16\xc5\xac\xfc\x68\x68\x50\x1c\x6d\x40\xaa\x07\xf8\xe6\xe4\x68\x20\xe2\xaa\x04\xa8\x40\xfd\x11\xd3\x8e\xcf\xe9\x0a\xfa\xe0\xc8\xc9\x71\xde\xda\x05\x86\x33\x9a\xf0\x21\xe6\xe0\x7b\x2f\x77\xe9\xfd\x2a\x9f\x47\x2f\x8b\x34\x27\x42\x52\x2e\x54\xce\x31\x41\xc4\x3d\xdc\xeb\x58\x48\xc2\x43\x9e\xf0\xd1\xbf\x5e\x89\xc5\xd2\x16\x31\xb6\x78\xbb\x63\xeb\x72\x36\x97\xb7\x66\x2c\xd4\xc3\x93\xcb\x5f\xe6\x86\x0e\xa7\x9e\xd6\x5a\x52\x9d\xf6\xfc\x6d\x30\x76\x0b\x6e\x05\x64\xe4\x22\xc7\xb4\xec\x9f\x67\xda\x18\x04\xb6\x49\x5f\x4b\x16\x27\x85\xc7\x24\x95\xfe\x02\x91\xfe\x0a\x10\x1f\x81\x81\x3c\x0c\x15\xf5\x6b\x63\xaa\xc5\xd9\x08\x42\xbe\x1f\x4a\xb2\xdb\x00\xdb\x0d\xb9\xbc\x1d\x61\x75\x87\x31\x5f\xbb\xdf\x18\xd4\x1f\xc5\x2b\x1f\xa1\xea\x93\x25\xbc\xe5\xa0\x09\x4d\xd3\x24\x2f\x93\xc3\xe4\x33\x00\x00\xff\xff\x2f\x17\x33\x4e\xc3\x02\x00\x00") func uiTsTsconfigJsonBytes() ([]byte, error) { return bindataRead( _uiTsTsconfigJson, "ui/ts/tsconfig.json", ) } func uiTsTsconfigJson() (*asset, error) { bytes, err := uiTsTsconfigJsonBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/tsconfig.json", size: 707, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsTypingsD3D3DTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\xbd\xeb\x72\xdc\xb6\xb2\x28\xfc\x3f\x4f\xc1\x4a\x55\x6a\x8d\x52\xb2\x9c\x4b\x7d\x5f\x9d\x92\xb3\xa3\xe3\xf8\x96\xec\x6d\x27\xde\x1e\x39\x95\xac\xd4\xaa\x55\x18\x12\x33\xc3\x98\x43\x4e\x40\x52\xd2\x24\xdb\x0f\x74\x9e\xe3\xbc\xd8\x41\x37\x00\x12\x04\x01\x10\xe4\x8c\x2c\x59\x91\xaa\x6c\xcd\x08\x40\xdf\x70\xeb\x6e\x34\x1a\x0f\x1f\x46\xe7\xbb\x2d\x8d\x12\xba\x4c\xf3\xb4\x4a\x8b\xbc\x8c\x96\x05\x8b\x92\xaf\xff\x73\xfe\x09\x2f\x7c\xcd\x8a\xdf\x69\x5c\x9d\x46\xeb\xaa\xda\x9e\x3e\x7c\x98\x7c\xfd\x7b\x79\x52\xb0\xd5\x43\x28\x7c\xaa\x35\x5a\xec\x4e\xa3\xef\x0a\x96\x96\xd1\xaf\x24\x7f\x57\x5c\x44\xdf\x40\x8b\x92\x37\x59\xa5\xd5\xba\x5e\x9c\xc4\xc5\xe6\xe1\x02\x2a\xec\xb0\xfc\x5b\x03\x80\xc0\xe0\xae\xff\x50\xd6\xa5\xd9\x0e\x08\x4e\x3e\xf9\x24\xa1\x71\x46\x18\x8d\x36\x45\x52\x67\x34\x7a\xfa\x75\xf4\xd7\x27\x11\xff\xa1\x57\xdb\x82\x55\x51\x9a\x57\x94\x2d\x49\x4c\xa3\x39\xcd\x38\x0b\x05\x2b\x65\x05\xf8\x79\xf8\xf9\xe7\xcd\xe7\xcf\x65\x8d\x88\xe4\x11\xff\xb0\xa1\x79\x15\x2d\x59\xb1\x89\xaa\x35\x8d\xe2\x9a\x31\xf8\x43\x52\xc4\x35\x94\xb4\xad\x1e\x36\x1f\x4b\x6c\x7e\xaa\x81\x37\x51\x08\x34\x6f\x68\x55\x33\x2e\x2b\x80\x4b\x37\xdb\x6a\x27\x5b\x72\xfe\xbb\x35\x1f\x76\xbe\xce\x8e\x4e\xa3\x7f\xcf\x55\xcd\x6f\x48\xbe\xfb\xf6\xd1\x00\x26\x51\x5b\x60\x5a\xa6\xac\xac\x1a\xc6\xaa\x35\xa9\xa2\x0d\xa9\xe2\x35\x15\xc5\xe5\x96\xc6\xe9\x32\xa5\x89\x24\x86\x77\x7e\x59\xb1\x34\x5f\x75\x41\x1a\x08\xfe\xf7\x96\x30\xb2\x69\x9b\x34\xe4\x45\x73\x6c\x1c\x55\x85\xc0\xe2\x65\x4c\x35\x3f\x95\x28\xf7\x63\xb4\xe5\x24\x2f\x12\x1a\x42\xbe\x12\xca\x8f\xbc\x7e\x2b\xa1\x42\xb2\xe5\x25\x5d\xd6\x3e\x8d\x9e\x5d\xf0\x5f\xe7\x84\xad\x68\xe5\x23\xff\xfd\xa3\x4f\xfc\x83\x6f\x53\x67\x55\xba\xcd\x1a\x3a\xca\x29\x63\xf0\x71\x96\x0d\x0f\x43\x25\x33\x92\x65\x2d\xb2\x76\x5c\x38\x46\xc5\x47\x3c\x1c\x08\x63\x64\x17\x15\xcb\x86\xdb\x11\x63\xa3\x8c\x1e\xab\xd6\xb9\x36\x4a\xca\x71\xc3\xa4\xec\x8c\x93\xdf\xfe\x35\x30\x52\xf0\xd7\x27\xf6\xd5\xec\xe9\xd7\x08\x89\x17\x54\x34\x4f\x4a\x01\x57\xeb\xf3\xe4\xea\x34\xca\xeb\xcd\x82\xb2\x16\x64\xb2\xeb\xff\x2d\xce\x52\xde\xf0\x17\x57\xc1\xaf\xfd\x82\x8a\x91\xbc\xcc\x48\x45\x55\xd1\x6f\xff\x6a\x0b\xcb\x98\x64\xb4\xdf\xa6\x2c\x6a\x16\x53\xa4\xf1\x54\x91\xde\x96\x5a\x48\xb5\x50\xfa\x8e\xee\x9e\x70\xd1\xf7\x0b\x48\x56\xfd\x17\xdd\x9d\x9d\x46\x8b\xa2\xc8\x28\xc9\x35\x1e\x2a\x96\x39\x8a\x36\xb4\x22\x8e\xa2\x72\x9d\x2e\x5d\x10\x2b\xbe\xe9\xa8\x71\xe9\xef\xa0\xef\x48\x49\x9b\xde\x19\xde\x7b\x9e\x30\xca\x45\x1a\x91\x68\x41\xd7\xe4\x22\xd5\x26\x9a\x36\x96\x54\x19\xdf\x63\xe5\xa7\x13\xf5\xe1\x91\x03\xee\xe3\x38\xa6\x65\xd9\x59\x3f\xea\x92\xb2\x88\xe2\x78\x81\x3d\x1e\x49\x26\xdd\xed\x47\xc3\x49\x8d\x4e\x73\xd1\x5f\x6c\xb6\xb0\x0d\x57\x97\x45\x74\x41\xb2\x9a\x0a\x05\xa2\xe4\x42\xe1\xa2\x3a\xd1\x6a\xaa\xed\xef\xc1\x97\x51\xba\xe4\x0c\x73\x5d\x21\x13\x24\xf2\x8d\x77\x71\x1c\xf1\x56\x6d\xc9\x0a\xc5\xc2\xf4\xc2\x2f\x5a\x58\x1a\x54\x39\x5d\x49\xf4\x1c\xf7\x39\x24\xa1\x5f\xbc\xe0\x3d\x11\x17\x79\x62\x96\xb7\xec\x92\x32\xe6\x3d\xc6\x49\xfe\xe6\xfc\xdb\x19\x39\x8d\xce\x8f\xa3\x05\xff\xff\xa8\x3f\xec\x0e\xc8\xbf\x85\x4b\xb7\x70\xae\x97\xff\x84\x4e\x14\xc0\xf3\x94\x83\x85\x61\xb6\xe1\xfa\xd9\xa6\xde\x08\x14\x7c\x74\x81\x3e\x85\x4b\xaf\x97\x6e\xc6\xe4\x0a\x8b\x0b\x2a\x61\xda\x1e\xd1\x54\xda\x90\x2d\x8c\xe7\x92\x0b\x84\xcb\x61\x59\xe7\xce\x41\xcb\x69\xf8\x86\x13\xfe\x96\x73\xc0\xf8\x6c\x39\xff\xed\x5f\xc7\xd0\xfa\x34\x9a\x5d\x9c\x21\x4b\xe9\x99\xe2\xe7\x28\xfa\x8f\x6f\xa3\xb7\x9c\xbd\xb7\x37\xc0\x99\x41\x71\x4b\x2e\xa7\xe7\x7c\x98\x1e\x72\x75\xf3\x92\x26\x57\xd7\x21\xe9\x83\x73\x66\x50\x3c\x56\xd2\xb2\xe7\x09\xff\x7e\x1b\xa4\x8e\xfb\x4a\xe5\x12\x3c\x4c\xd7\x46\xd6\xfa\xee\x7c\x23\xdc\xf5\xa9\xee\x0a\xdf\x4d\x20\xac\xa9\x35\xdf\x14\x51\x8d\xe3\x34\x71\xe5\x4b\x51\x83\x8a\x18\x8e\xaa\xf2\x03\x8a\x9d\x13\xa1\x53\xdf\x13\xb8\x1c\xe7\x21\x7b\xc5\x35\xf2\xd5\xa1\x57\x10\xab\x14\xb5\x51\xa4\x11\xc6\x4d\x70\xae\x27\xa5\x31\xd7\x96\x38\x81\x37\x2e\x7e\xa0\xe2\xd0\xf2\xbf\x66\x26\xbb\xc4\xef\xd1\x19\x1b\x9a\xa4\x4e\xf2\xa2\x19\x54\xf9\xe2\xe4\xff\x7b\xf0\x47\x4d\xf2\x2a\xcd\xe8\xd1\xc9\x07\xed\x17\xa0\xed\xd0\x3d\xf3\xe1\x38\x36\x39\x99\xd8\x4d\x24\x52\xb4\xa0\xea\x47\x50\xf9\xd3\xed\x4e\x49\xfb\xfe\x5d\xb3\x8d\xce\x39\xf7\x0d\x36\x5e\x93\xa1\x52\x69\x63\x49\xd5\xe2\xbd\xd1\x61\xeb\x38\xda\x76\x36\x66\x3f\x8f\x2f\x8b\x98\xc8\x7e\x49\x73\x6e\x3f\xa0\x51\xbf\x2d\x52\x69\x43\x5c\xe1\x4e\xa1\xc8\xde\x10\xfe\x77\xfe\x4f\x09\xa0\x60\x09\x65\x7b\x33\x7d\x15\xfd\x8c\x7b\x52\x53\x45\x5a\x2f\x1d\x6a\xfa\xcd\xb2\xe2\x32\x7a\xd5\x51\xdc\x60\x44\x21\xb2\xb2\x5e\x94\xd4\xd2\x64\x9d\xae\x57\xd1\xab\xce\x46\xe8\x6c\xa3\x19\x67\x69\xc9\x6d\xbc\xee\x2c\xb8\x42\x15\x88\x93\xd0\x28\x41\xc7\x1c\xfa\x6a\xdd\xea\x44\x43\x83\xeb\xb6\x09\xfe\x7a\xe5\xbe\x5a\x4f\x95\xfb\x4b\xba\xbc\x97\xfd\x0d\xc9\xfe\x0d\x6f\x7b\x70\xe1\x7f\x87\xa0\xa3\xba\x04\xbf\x21\xec\x00\xe8\xc8\x28\x98\x7f\xf5\x94\x95\xa4\xdb\x63\x60\xdf\x12\xd4\x17\x6c\xa6\x9a\xf1\x35\x32\x21\x15\x37\x7a\x49\xbe\xe3\x96\x4b\x9e\xd0\xab\xce\x1a\xc9\xff\x7c\x84\x85\x2e\xa2\xdf\x70\x15\xba\xd8\xa4\x7f\x8a\x41\x83\x43\x40\xdf\xc0\xc2\x57\x7e\xa6\x00\x59\xd5\xba\x75\xbd\x5c\x66\x34\x5c\x91\x7e\x43\x05\x29\xfa\x46\xda\x78\x30\x39\xf3\xbc\x54\x7a\x67\xf5\x1a\xc8\x3f\x0d\xd7\x7d\x18\x35\xc6\xbc\xaa\x25\x01\xc9\x9a\x71\x81\xf3\x04\x11\x36\x42\xc2\xb3\x10\x45\x51\xb9\x2e\xea\x2c\x89\x16\x54\x6e\x6b\x7c\x36\xa5\xd6\x0e\xdc\x52\xb6\xe1\x3b\xaf\x90\x02\xef\x16\x18\x79\x12\x99\xfc\x7e\x24\x7f\xbb\x24\x73\x0e\xce\xcc\x6d\x51\xc2\xee\x7d\xc1\x75\x41\xb2\xe0\xfb\xa9\xe8\xf1\x66\xfc\x0f\x6e\xd8\x92\x33\x74\x06\x57\x0a\xa0\x8d\xde\x3f\xd3\xed\xec\xe4\xe4\x04\x9a\x04\xd2\xf7\x9a\xb0\x52\x0c\xa6\x55\x7a\x41\xf3\xe8\xab\xa7\x11\x59\x2e\xd3\x9c\x0a\x44\x7c\x35\xd8\x48\x6f\xe4\x71\x44\x4a\x71\x7e\xc7\xc5\xb5\xd8\x45\xf3\x9f\x5f\xfc\xa3\xd4\x6a\x91\x8a\x57\x5b\x70\x69\x79\xb9\x69\x0f\x00\x3d\xa8\x6c\xac\x35\x75\x66\x2d\x08\xcd\x81\xef\x99\x33\x5a\x17\x68\x83\x2f\x40\xf2\x1b\xc2\xa1\x5f\x45\xe7\x97\x45\x94\xa4\x7c\xe4\x94\x1c\x25\xc9\xda\x15\xd9\xdb\x15\x4d\xe1\x4c\x80\x09\xec\x0f\xe1\xa6\x2d\x5b\x52\xf5\xd1\x5c\x6f\x33\x5e\x04\xc4\x27\xbf\x93\x18\xfc\xab\x5b\x92\x06\x18\x0f\x16\x58\xbc\x31\x4b\x29\x8e\x28\x80\xa1\x37\x64\xd2\x7f\x88\x74\xfe\xf6\xaf\xb6\x39\x47\xfc\xd5\x83\xe6\xf8\x4a\x10\x03\xdb\x05\x25\x7c\xdf\xe8\x42\xd1\xa6\x10\x50\xa8\x4d\x20\x25\x00\xb7\x08\x5e\xa6\x65\x85\x23\xf2\x1d\xdd\x95\x6a\x75\xe3\xab\x67\x9c\x92\x8a\x8f\xd1\x80\x95\x0e\x2d\x0b\x45\x72\xb1\xf8\x5d\x9c\xd5\x14\xd1\x8a\x36\x80\x1b\x1f\x2a\x2b\x36\x36\xb2\x01\xf7\x0c\x6d\x0c\xb1\x26\x8b\x81\x16\x40\xb4\x84\x7b\x1d\x64\x0f\x90\x2c\x8a\x75\xa2\xbd\x23\x4d\x17\xf3\x03\xb1\x21\xab\x41\x71\x4d\x32\x97\x58\x70\x44\x38\xb9\x90\x34\x04\xb3\xb1\xa1\x6c\x45\xdb\x53\x4d\x31\xad\xe1\xcc\xa1\x88\x8a\x9c\x0e\xbb\x96\x1a\xba\x91\x5a\x84\x66\x37\xdc\x78\x01\xac\xad\x8a\xae\xe1\xa9\xfc\x82\xe6\x94\x89\x33\x17\xbe\x16\xac\xa8\xb4\xd0\x28\x4b\x63\xd9\x57\x27\x36\x4c\x58\x77\xf8\x74\x75\x18\xba\x38\xd8\xfd\xe2\xa4\xdb\xd0\x00\xa3\x4e\x54\xab\x62\xdb\x6a\x82\x2b\x05\x1b\x3a\x4e\x40\xaf\x0a\x57\x43\xba\x8d\xe6\xf0\xdf\x82\x56\x97\x94\xef\x20\xb8\x1a\x74\xdd\xff\x06\x87\xf0\x33\x03\x8c\xad\xea\x06\x60\xfa\xaa\x9b\x2e\xdb\xa9\x52\x08\x64\x9f\xb0\x4a\xd3\x84\xe1\xeb\xed\x11\x14\x27\x46\x97\x54\xb1\x3d\x1b\x23\xb8\xf7\xfe\xad\x26\xca\xe9\x25\xff\xc7\xd7\x82\x62\x0b\xbc\xd8\x0f\x06\xa1\x02\xc4\x87\xfc\xc8\x7f\xbb\x95\xc0\x3f\x6a\x80\xc3\xbb\x82\x8a\xf3\x58\xa9\x5c\xff\xf2\xea\xe5\xf7\x55\xb5\x95\xe5\xd6\x41\x7f\xb5\x66\xc3\x43\x5e\xdf\x1b\xcb\x5d\x1e\xaf\x59\x91\x17\x75\xc9\xd1\x09\xc4\x78\x1e\xd6\x9c\xc6\xd7\x2c\x0b\xe9\x7a\x5e\x2d\x7a\xcb\xff\xa1\x7e\x89\x70\xec\xf5\x62\x92\x65\x0b\x12\xbf\x8b\x9e\x4b\x85\x1f\x5a\xa4\xf9\x45\xf1\x8e\x46\x97\x6b\xde\x9d\x0d\xd3\x70\xa4\x56\x90\x04\x4d\x34\x31\x30\x14\x7d\x24\xcd\x4a\x6f\x5f\x73\x62\x4e\x1b\x75\x4b\x61\xe4\xdd\x3b\x43\xf9\x74\xe5\x88\x06\xc3\x45\x91\x26\xbc\x5b\x7e\x59\xb3\xa1\x99\x72\xa3\xc2\xdb\x70\xf5\x29\x7a\xf5\xc3\xab\x67\x78\xbe\x7d\x0b\x65\x0d\x04\xee\x2f\x79\xe7\x54\x6b\xa7\x46\x45\xaf\x38\x71\x69\x66\xd7\x19\x79\x61\x48\x78\x97\x1b\xd8\x01\xfa\xea\x66\x07\x3a\x07\xbe\x2d\xf2\xb2\xe9\x8c\x91\xa3\xfc\x9a\x65\xf3\x11\x8f\xe3\x60\xc1\x06\x0c\xe2\xff\x9c\xff\xf4\x63\xb4\xc8\x8a\x85\x4f\xb1\xf2\xc8\xf4\xfa\x04\xa4\x09\xe7\xf7\x12\x0c\x44\xf7\x48\xa3\x8c\x15\x4c\x7a\x62\x1a\xa7\x4c\x2b\x15\xf8\xd0\x91\x8b\x43\x18\x79\xf4\xfd\xf9\xab\x97\x4d\xcc\x1c\x57\xba\xc8\x0a\x3e\xd8\xb7\xb9\x4d\x40\xdc\xdc\x08\xd0\x5d\xd1\x87\x8a\xff\x7a\xbb\xc0\x60\x19\x7e\x42\xa6\xfb\x53\xc9\xe5\xd4\x09\xff\x41\x84\x75\x27\xe6\xff\xa0\xa4\x87\x57\x80\x1c\x76\x44\xef\x98\xbf\x7d\xeb\xc1\xba\x82\xc9\x37\x66\x28\x3e\x97\x6c\x8d\x5f\x14\xa2\xb8\xd8\x6c\xc8\x83\x92\x02\x5b\xe0\xac\x97\x16\xd9\xec\xc9\xfc\xe7\x23\xdc\x95\xac\xcb\x43\x5c\x5e\x70\xec\xe5\x85\x33\x08\x4e\xeb\x00\xc2\x16\x69\xc5\x08\xdb\x45\xf1\x9a\xb0\x3e\x2a\x40\xc2\x4d\x6d\x56\x82\x95\x90\xa5\x5c\x80\x25\xdd\xa4\x71\x91\x71\xa1\x72\x91\x5d\x42\x1c\x2e\xbd\xa0\x56\x6d\x3f\x09\xa6\x23\xaa\xc8\xc2\xc2\xe6\xb9\x62\xd3\xaa\xe5\x34\xd0\xed\xc0\xcf\x61\x92\xa9\x01\x60\xed\xca\x0a\x47\x39\xd4\x3b\x81\xff\x5c\x80\xe6\x10\x2b\x6a\x05\x20\xa3\x48\xb1\xc2\x09\xfe\x0f\xd1\x94\x3a\x1c\x0d\xcc\x0f\x10\xbf\xb8\x2d\x32\xb4\xf3\x9a\xe8\x3b\x1b\xd8\xb4\xad\x79\x2a\xdc\x8e\xe8\xa6\x3c\x01\xe0\x1a\x94\x40\x3c\xbd\xd0\x00\x2b\xa2\x1f\xb1\xd6\x01\xd0\x01\xcc\xd5\x30\xbe\x37\x45\x9d\x27\x07\x40\x27\xa6\xe0\x10\x36\x11\xd6\x7d\x00\x74\x6f\x5e\x7c\x17\xc1\xe0\x1f\xe6\x6f\xb5\x38\x00\xba\xef\xe7\x2f\xc3\xd0\x7d\x5f\x66\x87\x40\xf7\x24\x14\x5d\x7c\x08\x74\x2f\x3f\x27\x9f\x2f\x3e\x0f\xc3\xf8\x92\x1c\x42\x9e\xd2\xad\x57\x2c\xc3\x66\x1f\x3a\xf4\x0e\x82\x96\x2f\xb2\xb0\xc6\x4a\x87\xe6\x00\xda\x9f\x16\xe2\x12\xd3\xde\x78\xbf\x7a\xaa\x0e\x1f\x9a\x63\x8f\x21\xdc\xe7\xaa\xe2\x04\xf4\xe7\x6b\xda\xba\xf8\x17\x75\x9a\x55\x0f\xd2\x5c\x03\x0e\xc7\x9c\x04\x0e\x32\xd3\x21\xc9\x17\x70\xf0\xa4\xe1\xd7\x70\x3f\x47\x08\x3e\x87\x34\xd9\x15\xb5\x5d\xc6\x19\x16\x9d\xca\x2a\x27\xe2\x97\x73\xd9\xbf\x58\xfd\xc3\xbe\xea\x5f\xf0\x95\x84\x97\x9e\xf0\x7f\xfe\x03\x56\x75\x42\x27\xfd\x7b\x8e\x51\x2e\xce\x50\x4f\x65\x9b\x01\x37\x1b\x69\x4e\x8a\x41\xa7\x81\x8e\x22\xb0\x7f\x4a\x44\xa4\x84\x70\x1e\xe3\xf0\xab\xaf\x1f\x29\x07\x0d\xc3\x2e\x93\x40\xda\x3f\x72\xc0\xb5\xfd\x34\x4a\x54\x9d\x35\x55\xb5\x93\xb3\x19\xce\xa8\xce\x31\xb4\x7e\xfd\xc0\x22\x22\xed\x7a\xd9\xfc\x87\x68\xcb\xe8\x92\x0f\xd4\xa5\xd4\xc3\x5a\x1f\x92\xf0\xf6\x93\xca\xf8\x33\xaf\x1f\xa7\xa5\xe3\xc4\x5c\xd0\xf9\x1a\x41\x76\x09\x3b\x6e\x1b\xea\xfe\xce\x57\x94\xd3\x1a\x8b\x06\x4e\x85\x02\xce\x4e\xf8\xce\x06\xb2\xe7\x03\x1c\xc8\x49\xbe\xe6\x3a\xd1\x02\xd4\x27\x1b\x15\xb2\xf2\xe9\x08\x41\xb0\xa2\xa8\x2c\xd7\xec\x7a\x37\xa7\x78\xa1\xf7\x9e\x1d\xdc\x50\x1c\x32\x10\xcf\x31\x80\x79\x0b\xbc\x30\xba\x4a\x4b\x3e\xc5\xe0\x32\x1a\xd9\x70\x0d\x16\x6e\x86\x88\x1e\xa1\x5e\xb3\x41\xd4\x31\x71\x21\x9d\x30\x4b\x4c\xc6\xd5\xcf\x95\xd0\xa2\x9d\xc5\x59\x9a\xbf\xf3\x14\x7b\xdb\x6e\x32\x60\xde\x56\xfc\x7e\xc8\x0a\xfc\xef\x9a\x64\x30\xba\x7a\x17\xf4\xb8\x4c\x7c\x52\xf8\x03\xdb\xed\x66\x50\x4f\x9b\x12\x7f\x45\x28\xc8\x86\x18\x6e\x6a\x70\x1d\xb1\xfd\xfa\x3e\xc8\x56\x92\xa7\xa8\xed\x82\x4a\x09\xba\xc3\x9b\x75\x40\x8e\xc5\x96\x5c\x30\x2a\x6d\x43\x87\x37\x84\xf0\x3a\xfd\x6e\xd0\x71\x64\x9c\xf3\xc3\xbc\x7d\xfa\xf5\x89\xb6\xf6\xb6\x1f\xdd\x81\x85\x39\x87\x56\xe3\x25\x3d\x3c\x07\x68\xb4\x24\xfb\xc9\x14\xa8\x46\x83\x4e\x7a\x27\xcc\xe8\x32\xad\xcc\x5b\x7f\x7c\x5a\xaf\x30\x2c\x7c\x01\x66\x4c\x9e\xd3\xcc\xdc\xe0\x2d\xbd\x36\x63\xed\xa2\xb0\x6a\x3f\x2e\xb4\x65\x81\x4b\xe2\x09\xf2\xc1\xb1\xe3\x87\x41\xf7\xb8\x9b\xec\xc5\x0e\xed\x28\x15\x4f\xd2\x12\x2f\x8a\x6d\xb7\x58\x0d\x7a\xb1\xa2\x36\xbe\x3c\xd4\xb9\x4f\x6b\x4c\x02\x1b\x9d\xcf\xda\x57\xeb\x38\xc0\xd3\x14\x02\xd3\xc6\xcf\xba\x15\x7a\xdc\x7e\xcc\x34\xf9\x0b\xf6\x38\xb8\x69\xc2\x6f\xe8\xb8\x06\xe1\xbb\x48\x1b\x21\xf9\xb9\x57\xf2\xe5\x24\xc9\x2b\x98\xb6\x59\xb2\xe6\xfb\xe8\xfa\x38\x2a\x09\x5f\x52\x08\x2e\x1d\x25\x4e\x9a\x0c\xe2\xe2\x72\xb8\xbe\x95\x85\xf6\x57\xe9\xed\xaf\xf9\xd4\xfe\x9a\x5f\x7b\x7f\xf5\x48\x0b\xef\x2f\xff\xaa\x96\x91\x29\xab\xda\xcb\xc7\x3d\x98\x36\x66\xb2\x56\xdc\xc4\xbe\x52\x09\xf6\x38\xb8\x69\x92\x6f\xe8\xb8\x36\xc9\xf7\x49\xd3\x24\xbf\xa2\xc5\x69\xf4\x82\x16\x27\xfc\x5f\xe7\xaf\x1b\xfc\xf3\x06\xfe\xee\xd4\x8c\x57\x54\x5e\xa1\xde\x14\x5c\x6d\x8d\xb6\x85\xd8\xad\xb8\x52\x93\x89\xa8\x13\x88\x17\xec\x30\x82\xe1\x4b\xd4\xde\x8f\x08\x64\xd6\xd4\x51\xc1\x23\xfd\x03\x71\x07\x11\x55\x51\x43\x18\x93\x24\xa2\x9c\x48\x05\x42\xa1\xa5\x9b\x0e\xa0\xc4\x41\xca\x0f\xa6\x3e\x20\xef\x48\x95\x9a\xf1\x70\x1c\x31\x4d\xeb\x34\xaa\xea\xb7\x40\x7f\xe2\xe5\xec\x32\x2d\x69\xdb\x42\x37\x41\xc0\xfd\x17\x06\x49\x53\xce\xa1\x75\xc1\xbe\x79\x73\x1c\x9d\x7f\xab\xb4\xf3\xd9\x96\x1b\x40\xa8\x7d\xc0\x15\x4e\xed\xdb\xa3\x5e\xbb\xb6\x91\xaa\xaa\x4e\x5c\xce\x35\x99\x60\x80\x4d\x77\x3e\x82\xc6\xfc\x8a\x6c\x2d\x57\xf3\x01\x66\x21\xad\xee\xbf\xa2\xdf\xde\xd1\x9d\x1a\xbf\xff\x82\x6b\x77\xd1\x7b\xd9\xf2\xdc\xd2\x0e\x11\x89\x42\x4f\x2d\x22\x5d\x09\x18\xef\x33\x5c\xe9\x18\x02\x9d\x9e\xc3\xc1\x93\x22\xeb\x5c\x86\x8c\x9e\x59\x4c\x2c\x0b\x48\x6d\x72\x95\xb4\x77\x1a\x0c\x92\x98\xd3\xca\x21\x89\x0e\xad\x50\xcd\x01\x38\x49\xb9\x7e\x5b\xc5\x6b\x88\x67\x02\xa5\xb2\x6c\xe3\xdb\x40\x3b\x91\xa5\x6d\x7d\x46\x17\x9c\x85\x59\x85\x59\x05\xe4\x91\x99\xf0\xc3\xcb\x2f\x1c\x0e\x9a\x1f\x9d\xc8\x28\xbd\xfd\x1f\x75\x51\xd1\x19\x47\xa2\x2d\x2f\xa6\xa6\x0f\x5e\xdd\x5e\x14\xc8\x0c\x07\x0f\x17\x27\x4a\x4d\x5e\x97\x3f\x8e\x12\x3e\x39\x77\x5a\x18\xcc\x86\xb0\x77\xba\x59\x08\xde\xfa\xae\x7c\x96\x59\x5d\xae\x67\xbd\xa2\xf7\x2d\xfa\x46\x5d\x86\x5a\x0e\x3d\xba\x65\x09\xdc\xa0\xb3\xab\x96\x82\xdc\x11\x78\xee\xcc\xaf\x20\xa5\xac\xf1\xfb\x9b\xbc\x0a\xdf\x0c\xe0\x8e\x10\xc1\x1e\x35\x64\xa3\x1b\x04\xa6\xcc\x7b\x15\xe0\x14\x80\x9b\x8a\xda\x92\xd4\xa9\xff\xde\x4b\xad\x6e\x66\x3b\x53\x0c\xe0\x3a\x02\xce\x74\x6d\xb5\x02\xb7\x00\x5f\x0b\x2f\x28\x5e\x53\x6f\x6e\x57\x41\xf4\x2c\x38\x9d\xb6\x5b\x56\x6c\x59\x0a\x0e\x12\x69\xb5\x26\x02\x84\x75\x01\x92\x6e\xfb\x59\x32\xe2\x62\x11\xa0\x91\x2e\x8a\x72\xb7\x59\x14\x99\x15\x30\x96\x84\xe5\x5d\xf8\x65\xcd\x9c\x12\x78\x41\x2b\x38\x5c\xe1\x13\xb7\x39\x8f\x5a\x53\x92\xd8\x4f\x59\x44\x49\x48\xa4\x9f\x16\xfe\x09\x46\xa3\x66\x3e\xd9\x91\x60\x3b\x03\x8a\xf4\x20\xc1\x34\x8d\x7e\x84\xff\x38\x20\xd1\xac\x17\x62\x0a\x9d\xe6\x55\x14\x0c\x73\xd9\x66\xb2\xdb\x72\xa6\x5c\x3f\x1b\xa5\x9f\x0d\xd5\x5a\x14\x6b\x17\x5f\x44\xab\x06\x4e\x30\xf3\xc7\x91\xdc\xd0\x1a\x59\x84\x1d\xa4\x6a\xe3\x04\x4f\x93\xcf\x1d\x86\x3f\x1c\xe7\x9e\xe3\x1c\x0e\x1d\x24\x2a\x07\x47\x1f\xac\x8d\x97\xd1\x9d\xd7\x80\x6d\xfc\x7d\xd6\x03\x70\xbb\xd8\xf1\xcc\xfc\x7c\xad\x9f\xa0\x7b\xa1\x3c\xf4\xae\x76\x6e\x49\xf7\x05\xad\xc8\x6f\xf4\x1f\xae\x2a\x26\xe2\x52\xd5\x56\xe2\x17\x87\xbf\xcd\xc2\x24\x63\x9f\x79\x2d\x88\x0d\x71\xa7\xb3\x68\x4f\x8d\x43\x7a\xe8\x40\xf8\x6d\xd2\x39\xf2\xc4\xaa\xf5\x36\x06\x7b\x07\x1f\x92\x3a\xdf\xc4\x3b\x0f\xed\x09\x12\xca\xbc\xd2\x45\x3d\x02\x08\x9e\x9b\x3f\x94\x65\x4d\x3b\x21\x05\x75\x63\x54\xbd\x78\x76\x0e\x89\x7d\xd6\x45\xf2\x49\x9f\xd3\xa0\x28\x06\xfe\x25\x2e\x36\xdb\x8c\x2a\x0f\x60\x2f\x16\xe2\xa1\x66\x46\x55\xb3\xa9\xa1\x88\xe1\x3c\xbd\xfe\x69\xde\x67\x4a\xbb\xbf\x51\x94\x01\x31\x89\x63\x11\x78\xc6\xc8\x5e\xd2\xb3\x0d\x8e\xc3\xc6\xd1\x1e\x90\x53\x1c\xdc\x4f\xe1\x3f\xb8\x85\xc3\xe5\x1c\x21\xdf\x69\xee\x5e\x12\xaf\x4d\x48\xda\xb5\xc4\x83\x47\xbf\xa2\xc8\xc0\xcc\x4c\x4b\x8b\xd0\x5a\x35\xc0\x3d\x08\x4b\x0a\x31\x07\x41\x83\x70\x3c\x1e\x4f\x0f\x89\x9a\xa0\xfd\xc2\x2f\x71\xbc\x26\x16\xab\x77\xf4\x06\x3a\x49\x90\x73\x5d\x11\xe2\xb7\x4d\x7c\xb7\x69\x7a\x98\x92\xbf\xce\xe9\xf2\x78\xc1\x0d\x8e\x6e\x3f\x1c\x43\xb2\xae\xb4\x02\x57\x90\x54\xf0\xb2\x1d\xe7\xe7\xc1\x12\x3d\xc0\xb6\x19\x43\x00\xc8\xcc\xbf\x2b\xbc\x91\x87\x87\xe0\x19\x52\xb6\xa1\x08\xcf\x8b\x29\x38\xbe\xd0\x1c\xf5\xde\x2e\x44\x1d\xee\x59\x0e\x0a\x27\x6a\xe4\xb0\x67\x57\x15\x91\xc9\x1d\x35\x98\xfd\xa6\x4d\xa1\xde\x45\xaa\x71\x21\x70\xdb\x18\xc3\xa0\x5e\x97\x5d\xdb\xbb\x5d\x7d\xd6\xbb\x5e\xdd\x09\xe1\x73\x1a\xe7\xe5\x85\xd3\xc6\x6b\x63\xdf\x12\x9a\xa5\x9b\xd4\x88\xb9\xf3\x89\xeb\xa6\x43\x20\xc3\x82\xa1\x5b\x95\xb6\x3d\x59\x1c\x56\x31\x1e\x37\xf1\x88\x4f\xa5\x58\x58\x79\xaa\x95\xf7\x3c\xd7\x22\x36\xb1\xb1\x00\xc4\xf5\x63\x25\x52\x26\x72\x45\x41\x24\x20\xf4\xf5\x49\xf4\x1c\xee\x99\x5e\x11\x98\xb7\xc7\xe2\xd2\x2a\xdc\x5b\x96\x72\x6f\x03\x10\x17\xbb\xe8\xd3\xff\xf9\xf4\x58\x18\x81\xe0\x73\xe0\x4c\xf2\x65\x83\x61\x90\x24\x89\x2b\xf0\xd4\xf0\x45\x48\x27\xec\x82\x97\x26\xbc\xbf\xff\x23\x4a\xbe\x3e\xe1\x1f\x66\x08\xe0\x53\xb8\x3f\xf0\x70\x9b\x91\x34\xff\xf4\xe8\x91\xb5\x53\x75\xf7\x69\xcb\x90\xaf\xff\x25\x9d\x68\xf9\xc9\xcb\x56\x2d\x61\x96\xa1\x50\xe4\x90\xcf\xca\x65\x1c\xce\x1a\x70\x5a\x9f\xb6\x4d\xf4\x10\x8f\xfd\xfa\x7d\x20\xea\x55\x5c\x21\xd7\xa7\x83\xc0\x24\x2f\x61\xca\xab\xa0\xed\x4e\x22\xcd\x6c\x56\x5c\x7a\xe3\x85\x25\x90\x16\xaa\x88\x0d\xd1\xe0\xab\x61\xd0\x6f\xdb\xa4\x69\x80\xcd\xa6\x48\xd2\xe5\x2e\x02\x47\x13\x0c\x08\x71\xbd\x15\xef\xde\x71\x0a\xac\x1a\x2f\xc0\x9c\x95\x32\xf2\xb0\xb9\xfc\x2e\x41\x62\xa8\x70\x71\xe9\x5f\x64\x82\x2e\xdd\xbb\x24\x26\x6e\x56\x73\xd8\xab\xbc\x60\x1f\x40\x68\x06\xe7\x6f\x8a\xcb\xd2\xc9\xbd\xc6\x7c\x93\x0b\x61\x5c\x06\x8b\xe7\x32\xf2\x49\xbb\x54\x2e\xaf\x92\x23\xf3\x7d\xa1\x78\xf9\xe5\xc4\x94\x6d\x82\x08\xe9\x68\x8c\xac\x70\x6c\x0c\xcb\xb0\x28\x80\xd2\xba\xae\x43\x9c\x80\x5a\xfc\xce\xf9\xb7\xfd\x2c\xac\xc7\x82\x26\x74\xd3\x6b\x1b\x09\xa4\x48\xe8\x39\x71\x03\x9c\x69\x76\x9f\x93\x10\x75\x87\x92\xe1\x66\x6a\x57\x69\xf6\xca\x73\x77\x2f\xfa\x40\x03\x2b\xe8\x40\x7b\x05\xa7\x28\x22\xf0\xd1\xdd\x44\xcf\x4a\x1d\x67\xa4\xe4\x36\xff\x90\x1c\x7a\x99\x71\x6f\xa9\x20\x90\x9d\x69\x92\x28\xab\x5d\xd6\x73\x1c\xed\x35\x1e\x20\x48\x2e\xe5\x8b\x46\x05\x67\x23\xb6\xe4\xd6\x07\x95\xcc\x78\x6c\xc8\xf1\x34\x61\xc9\xf5\x7b\x37\x24\xaf\xfe\xc9\xcf\x2d\x1c\x34\x8a\x99\x69\xa2\xb0\x5d\x13\x75\xb9\x72\x67\xc1\xec\x1e\x8a\x41\x9d\x52\x11\x2d\xf8\x31\x50\x4a\xb6\x5b\x8b\x8f\xc1\x1c\x5c\x3e\xaa\x64\x62\x94\x43\xd0\xd5\x92\x25\x32\x71\x79\xc9\x3a\x8e\x16\x94\xef\x63\xa1\x64\x0a\x88\xcf\x46\x12\x3b\x12\x89\x8d\xbe\xb1\x28\xaf\x95\x8f\xc3\x11\xa3\x75\x16\xa3\x9b\xe2\x82\xaa\xb3\x6a\x47\x7d\x7c\x90\xc3\x38\xcf\xd6\xc6\xa1\x20\xa3\xdb\xdd\xdf\xbc\x95\x81\x13\x65\x8f\x4e\x23\xf7\xb1\x8c\x3f\x38\x6b\xea\xbd\xf5\xa8\xa8\xff\x7e\xbb\x4d\xe0\x8a\x4d\x43\xe6\x5b\x33\xa4\x40\xc3\x7b\x60\xd0\x33\x33\x9f\xd8\xfb\xae\x0c\xea\xcd\x90\xbb\x4f\x9c\x59\x94\x7a\x62\xaf\x7f\x94\x5c\xa0\x75\x2e\x0f\x25\xe4\x59\x85\xb0\xd2\xda\x53\xc7\xae\x2f\xab\x39\x86\xa0\x50\x01\x4c\x48\x13\x49\x93\xe0\x48\xc4\x6f\xf3\x36\x12\xdb\x89\x59\xf3\x6d\x8e\xd7\xec\x00\xc1\xd3\xaf\x4f\x1a\xde\x4f\x90\x1a\xe1\x40\x3a\x16\x5e\x1d\xe9\x17\x4b\x0a\xae\xf5\xe6\x45\x85\xfe\x28\x91\xe0\xf3\xf7\x22\xcd\xb9\x72\x85\x79\x93\xeb\xd2\xc4\xd0\x6b\x40\x73\x65\x2a\xd3\xab\x54\x8b\x3f\x2f\x8f\x7a\xd4\xe9\x27\x30\x65\xf7\x08\x86\x4b\x6a\x41\x5b\x09\xb8\x59\x86\xd9\x03\x36\xc4\x16\x35\x38\xe0\xd4\xc4\xb2\x65\xf4\x22\x85\xb4\x12\xd8\x87\x51\x12\x11\x99\x02\x5a\x9d\x4b\xe2\x90\x89\xd2\xe3\x36\xcc\x11\x25\x82\x76\xeb\x55\x05\xf7\x20\xf4\xda\x4f\x7f\x7a\x65\x62\x50\xd2\xef\xb2\x90\x62\xbb\xf6\x34\x09\x4e\x56\x91\x85\x76\x68\x40\x37\x9c\x44\x8f\xf9\x60\xcd\x64\x90\x31\xa7\x21\xcb\x7a\x32\xe6\x2d\x64\x42\x97\x76\x30\x01\x36\x8e\x42\x65\x48\x89\xd6\x04\xfa\x21\xa2\xcb\x25\xa4\x10\x2c\x72\x99\xc2\x91\xb3\x66\xca\xfd\xe1\xd0\x4c\x7e\xeb\x59\x71\x86\x66\xd1\xd4\x39\x61\x46\x98\x71\x06\xe0\x91\x16\xb3\xbb\xcb\x8f\x7e\x88\x97\xe0\x94\x54\x9c\x2f\x94\x93\x09\xcc\x43\xed\x4d\x9a\xf0\x2e\x7b\x3b\xb1\x53\xf4\x8b\x22\x4d\x6f\xf0\xe9\xa1\x7c\x5f\xe2\xe9\xa4\xbc\xc8\x1f\xe0\xe0\x54\x29\xd6\xa4\xa7\xbb\x61\xb9\xc7\x30\x0e\x4a\x78\xde\x01\xaf\x29\x65\xd9\x0e\xc6\xff\xb2\xce\x78\x87\x82\x7f\x78\x19\xed\x8a\x3a\x7a\x97\x17\x97\x5d\x38\x2a\x84\xb1\x04\x8f\x5a\x0c\xae\x64\xc8\x94\xe5\x58\xd6\xfa\xc7\xcc\xe7\xf6\x55\x7b\x99\x66\x95\x2d\x7e\x4b\xfe\xd9\xb7\xc1\x36\x61\x5d\x30\x74\x1e\xb3\xd5\xd9\xa9\x6b\x06\xf4\xd4\x00\x05\xbe\x55\x4b\x7c\x4d\x3a\x76\x28\x17\x58\x73\x36\x78\xaa\x5e\x05\x42\x65\xa0\xb3\x75\xcb\x9b\x16\xab\xd2\xf4\x8b\xf5\x0a\x9c\x3a\x02\xac\x44\x33\xf8\xef\x00\xfa\xc6\x70\x18\xd8\x60\x8a\xd1\xc0\x20\xb1\x41\x38\xe0\x4a\xdc\xf2\x91\x4d\xdb\x87\x6c\xc2\x94\x6d\xf7\x35\xaa\xaa\xa8\x48\xa6\xe5\xc7\x6c\x52\x76\xca\xb9\xa0\x36\x06\xcb\x9c\xd0\x8f\x0b\xd3\x3f\xe9\x4c\x8b\xc3\x73\x20\x9e\x43\x66\x2d\x70\x47\xb7\xa1\x7f\xcd\x94\xec\x23\xd2\x42\x02\x4b\xf1\x50\x0e\xa4\x9d\xe3\x5b\x8c\xbc\x5c\xaf\xd6\xa5\x63\x0d\x03\xbd\x8a\xe9\xb6\xcd\xac\x05\x51\xfb\xe9\x06\x82\xdd\xca\x4d\x51\x54\x6b\x98\x79\x17\x70\x3e\x02\x7e\x6e\x5e\x63\xad\x9e\x68\xe1\xd6\x48\xb6\x13\x0e\xc1\xb2\x22\x7c\xb2\xe6\x94\x6f\xaa\xd9\xce\x1e\x72\x3c\x2a\x70\xd1\x10\x81\x3c\x6a\xa2\xc3\x92\xee\xe6\x71\x35\x43\xcc\x37\xd2\x15\xad\xc1\x56\x9b\xb3\xd7\x81\xd7\xb6\x14\x59\x13\xf8\x97\xb4\x84\x7e\x68\x22\x08\x2f\xd7\x29\x17\x32\x6c\xd5\xb0\x82\x2b\xd5\x03\x72\x72\xc2\xba\xde\x66\x99\x15\xd7\x88\x34\x0c\xe8\x10\xc4\x47\x73\x8e\xb1\x4c\x66\x7d\x95\x0a\x21\x4d\x51\xdc\x70\x16\xb1\xc2\x38\xef\x63\x19\xfb\x0d\x9f\x38\x35\x7f\x52\x26\xaf\xfa\x8b\x03\x98\x24\x85\x5c\xcd\x3a\xf8\x35\x4d\x59\x1b\x25\x8e\x69\x66\xed\xa3\x11\x4e\xe2\x5a\x3e\x41\x83\xd6\x9e\xbd\xe9\x24\xaf\x37\xe6\x8e\x73\xc2\x3c\x10\xd6\x4f\xa9\xf7\x9a\xec\x94\x26\x29\x47\x59\xe3\x31\x9c\xbc\x7f\xd9\xfc\x59\xa4\xc3\xed\xbc\xcc\xd7\xbf\xb5\x28\xb9\x69\x36\x18\xfa\x47\x9d\x72\x59\xc8\x67\xeb\x60\xd1\x84\x61\x80\x8c\x1d\xc1\x3e\x83\x18\xa0\x3b\x20\x56\x3d\x63\x94\x24\x3b\x99\xa6\x9a\x73\x59\x57\x38\x4f\xf4\x91\x41\xe0\xd8\xd1\x2a\x2c\x44\xec\x30\xa1\x02\xd6\x0f\xff\x4e\x6a\x99\xd4\x2a\xe6\xbe\x19\xe5\xc0\x2d\x98\x68\xfa\x34\x56\x27\x3d\x00\xd3\x4a\x75\x8e\xef\x86\x7d\xf3\xac\x7d\x2d\x4d\x20\xfe\x56\xf0\xf1\xcc\xef\x4c\x6e\x5f\xb1\x53\xcd\x8d\xeb\xa1\xd1\x5f\x6e\x47\xf4\x33\xf8\xd8\xf1\x46\xff\x75\x87\x9c\x1a\xa1\x8e\xc5\xfd\xbc\x01\xd3\x9c\xa5\x56\x4f\xc2\xd9\xad\xf2\x6b\xec\x43\x8d\xd6\x61\xea\xe1\xd1\xfe\xcb\x89\xa3\x1d\x1d\xdd\x19\x23\xa7\x87\x20\xfa\x51\x47\x35\x3b\x8d\x5c\xca\x59\x6f\xc4\x77\x4f\x2a\xfb\xe5\x8f\x3a\x8a\x81\xc2\x1a\x12\xa4\xdf\x05\xd5\x4e\x4f\x03\xc5\xd0\x1c\xed\xab\xa4\xb6\x99\xde\x99\xba\x68\xf6\x34\xeb\xa0\x87\xa5\x1a\x61\x0f\x39\x9d\xb8\xe9\xe4\xa9\xe2\x22\xdc\xa0\xbb\x25\xda\x64\x68\x40\x00\x90\x35\xf4\xbf\xa8\xf0\x76\x6b\x3c\x6a\xb7\x75\x5a\x52\x95\xad\xd5\xe8\xa9\x3e\xa0\x5d\x60\x33\xb8\x7a\x63\xce\x18\x87\xfa\xda\xcc\xf7\x6e\x46\x53\xd8\xb4\xfe\x0b\x52\x3f\xb7\xfb\x35\x40\xfa\x52\xe5\x89\xfb\xaa\xbd\xb3\xd4\x6c\xda\x7d\x08\x3f\x8b\x4c\xcc\x93\x61\xb0\x22\xcb\xea\xed\x4c\xfc\x0a\xe5\x48\x4c\xe6\x2e\xa0\x0d\xd9\xce\x34\x81\xca\x77\x73\x20\x3a\xe0\xcc\x7a\x09\x44\x25\x5f\xee\xb4\x91\x50\x55\x07\x2a\xaf\x9d\xf3\xaa\x08\xd9\xaa\xaa\xdd\x21\xed\xee\xee\xc6\xa6\xf4\xc0\xec\xc2\x5a\x93\x72\xa6\xc1\xb3\x9d\x17\x42\xf4\x6c\xb7\x8a\x66\xb8\x96\xdd\xc2\xe6\x54\xe8\xbc\x5b\x4d\x78\x74\x87\x30\x61\xae\x70\x6b\x8e\x70\x99\x92\xdb\x74\x76\x2a\x31\x8b\xeb\x5f\x9a\xb4\xf4\x4a\x7c\x39\x7f\x06\x76\x23\x68\xc2\xbc\xef\xed\xd4\x6a\xb1\x39\xdd\x83\x2f\x5c\x7d\x67\x36\x6a\x4d\xe3\xc8\x27\x77\x71\x87\xcc\x90\xbb\x26\xaa\x1e\x70\x92\x24\x33\xaf\x28\x7d\x8d\x5b\x69\xf5\x25\x69\x48\xa3\x7b\xed\xe2\x9a\xa5\x20\x73\xc2\xb8\x03\xc2\x7a\xd7\x2b\xc1\x8a\x94\xb9\x63\x40\x51\x66\x7a\x52\x99\x52\xb8\x3e\xb9\xe1\x01\xc1\x07\x19\x5c\xc6\x13\x0f\x27\x74\x34\xf0\xbe\xa5\x84\xaf\x87\x81\x53\x8b\xd3\x27\xdc\x74\x1d\x9f\xb6\x4a\x45\x9d\x44\xdb\x92\xd6\x49\xd1\xc5\xd9\x07\x97\xd0\x8b\x54\xdc\x25\x3f\x6f\xa2\xaf\xc0\xd6\x4c\x08\x4b\xda\x42\xbb\xb2\x0b\x74\xcf\x80\x1e\xed\x06\x5e\xd3\x44\xbf\x86\xd7\xdf\x69\x0f\x27\xbe\xac\x58\x3d\xf8\x58\x45\xc8\x69\xff\xf1\x56\x48\x31\x8f\x7e\x60\x97\x69\xfe\xe0\x7b\x70\x88\x86\x8a\x31\x2e\x6a\x6e\x44\x01\xcf\xad\xa3\x06\xf6\x23\x30\x36\xc0\xbc\x52\xef\x9c\xd8\x73\x45\x01\xbe\xef\xd1\xf7\x06\x60\xbc\x6c\xca\x09\xf9\xf0\xa1\xee\x7b\xd1\xe7\xa8\x7c\x93\xbf\x2d\xd5\x35\x28\x73\x1a\x5b\x6b\xc1\x4f\x22\xb3\x2a\xd8\xb2\xe1\xcc\xda\xc2\x86\x50\x5b\x62\x15\x4b\xfd\x90\xed\xda\x05\xca\xc8\x78\x83\xd7\x5d\xed\xe4\x89\x92\x40\xda\x44\xe5\x03\x12\x66\x8b\x68\x42\x54\x01\x51\x2c\xbd\x7a\x46\x6c\x86\x97\x95\x90\xe0\x8c\x49\x0c\x22\xf4\x6e\x74\xd3\x28\x89\x58\x83\x7a\x0e\x22\x12\x7b\xb8\xcd\x35\x4a\x69\x1c\x42\x43\x0e\xa6\x7b\xbd\xf5\x52\xea\x20\xc6\x38\xd7\x5d\x88\x5d\xcf\xf3\xc3\xea\xa6\x1c\x40\xf8\x14\x86\xee\x02\x52\xfe\xb0\x6e\xcb\xee\x61\x87\x32\x7b\xfb\x7d\xd9\x3b\xe3\xd1\xd0\xea\x8e\xa8\xe6\xb1\x1c\x70\xc3\x75\x7c\x6e\x8d\xeb\x54\x99\xd4\xb6\x04\x1d\x08\xd6\x82\xa8\x09\x27\x96\x4d\x5b\x0b\x6d\xde\x04\x79\x22\xb6\x7e\xdb\x87\xfd\x41\xd2\x33\xea\xfd\x83\x6a\x98\x77\x2d\xff\x16\xb7\xf2\xc7\x70\xa4\xe4\xf5\x23\x6f\xd7\x0a\xaf\x90\x9c\x06\x71\x23\x5b\x9d\x46\xf8\x9c\xfc\x39\xa6\x2c\xf0\x8f\xda\xb0\xc1\xd4\xbc\x30\xd3\xb8\x5c\xf7\x18\x53\x8f\xb3\x5e\x58\x94\x0d\xb9\x4e\x40\xd9\x39\xb3\xd4\x46\x94\x63\x3c\xdd\xad\x81\xd4\x7b\x55\x6e\xc2\xa8\x2a\xdb\xf7\x89\x72\x6d\x7c\x95\xd3\x06\x58\xd9\x19\x61\xde\x05\xea\x7d\xe7\x1b\x9c\x03\x86\x76\x3e\xdc\xca\xda\xe0\x9b\xb1\x15\xc5\x1b\x3f\x70\x0d\xc4\x94\x4d\x47\xe1\xd3\x83\x1e\x0c\xb7\xb7\x0d\x7a\xa5\xad\xc4\x70\xb4\x22\xce\x9c\xba\xa3\x1a\x8f\xaa\xe1\x00\x05\x37\x09\x47\xe4\x86\x0d\xb8\x54\xab\xb5\x60\x8e\x36\x7a\x63\x9e\x6e\xd2\x8c\x60\x80\x7e\x27\x92\x00\xe8\x3f\xb1\x00\xb3\xc1\x57\xdd\xab\x1d\xac\xda\x02\x5b\x84\xd4\x12\x97\x78\x6c\x90\x15\xc9\x7b\x8b\xc7\x0a\x5c\xc6\xba\x78\xc4\x63\x69\x66\x1b\x89\xb6\x13\xe5\xc9\x4a\x8f\x63\xfc\x3d\x4e\x92\xce\xfd\x30\x3c\x20\x6d\x35\x69\x71\x47\xec\x38\x2a\xeb\x2d\xa8\xdb\x20\xa0\x4f\xf1\xc5\x22\xb8\x43\xc3\xed\x81\x4f\x41\x34\x36\xb8\x9f\xa2\x62\xce\xea\x6d\xf5\xa9\x04\x22\x42\x7a\x1a\x44\xea\xc4\xaf\xd7\x7d\x70\x16\x77\x91\x26\x35\xc9\x6c\x70\x8d\xb1\xdf\x92\x3a\x72\x54\x89\x64\x05\xf0\x1f\xf4\x93\xc1\x30\x1f\xbf\x82\xdf\xf6\xee\x17\x61\xd4\xe0\xdc\x06\x1c\xc6\x89\xc6\xb9\x8d\xa6\xde\x05\xb9\xf3\xee\x55\xba\x01\x99\x68\x02\xb0\x4e\xf8\x41\x99\x58\x06\xda\xe4\x08\x81\xe0\x45\x51\xd7\x0e\x85\x1d\xe8\x6a\x27\x73\x61\x76\x1c\x40\xd6\x64\x98\x2e\x00\xa0\xdb\x9f\xc3\x03\x5c\x86\x76\x8c\x8f\x72\x89\xe4\x32\x82\xa1\x4e\xea\x36\xe5\xb1\x35\x12\x2a\x7b\x18\x44\x43\xe0\x60\x88\xc6\xe9\xe2\xb6\x08\x71\xd1\x93\x58\x10\x66\x3c\x88\xba\x7d\x32\xbb\xfe\xf3\xc0\xfe\xb5\xc8\x41\xa4\x94\xe6\xf6\x68\x3f\x49\xb4\x07\xae\x3d\xcc\x08\x09\x1e\xa9\x7f\x68\xf5\xfd\x03\xb9\x8d\x6d\x09\xb4\x7d\xa4\xaf\xd3\xd1\x40\x3b\x58\xeb\xf9\x28\xfa\xa2\x30\x4f\x49\xc9\x99\xa4\x73\xd1\xb8\xf0\x9d\x49\xbe\x7d\x98\x8c\x46\x3d\x34\x3d\x2c\x46\xb6\xa8\x20\x1e\x7a\x91\x4a\xc3\xa9\xa7\x1e\x3e\x84\x27\x1d\x6c\x4e\x1e\x08\x92\xf1\xb9\x77\xba\xe5\xf0\x53\x52\xbe\xd7\x26\x72\x80\xf1\x15\xa3\xdb\x4b\x9b\x34\xaf\xe1\xe4\xcc\x5e\xba\x2e\x6a\xe6\x2a\x4b\xc8\xce\x55\xc4\xc7\xf9\x3b\x57\x59\x59\xe7\x9e\x96\x9b\xc2\x57\x5a\xf1\x3d\xc6\x8b\x36\xc9\xbd\x15\xaa\x75\xcd\x7c\xe5\x4b\x96\x7a\x4a\x31\xf3\xa8\x9f\xf6\x6a\xed\x2a\xdc\x51\xd2\x91\xa4\xa5\x8b\x4a\x4c\xa2\xbe\xa2\xb6\x0e\xb2\x97\x41\xf7\xd8\x4b\x38\x99\xf6\x02\xe8\x1a\x07\x22\x20\xdf\x5e\x04\xc4\xb7\x25\x96\xee\x74\x42\x74\x96\xc9\xae\x74\x11\x29\x3b\xd2\xd1\x56\x76\xa3\xbd\x54\x74\xa2\xbd\x4c\x75\xa1\xa3\x25\x5e\x84\x1c\x61\x96\xf4\xae\x73\x63\x8a\x6c\x11\xc9\xa6\xee\x9c\x32\xed\xd2\xaf\xf4\x8e\xab\xfc\xf3\x81\x8a\x87\x2d\x5f\x3d\xcc\x73\x71\x89\x34\x58\x87\x6d\x9d\xe3\x40\x29\x5a\xf2\x0f\xe0\x1a\x7d\x56\x0b\x33\xa1\x25\x5a\x45\x08\xdb\x8d\xcf\x2d\xa3\x22\x0c\x4c\xdd\xab\x35\x63\x87\x1d\x7c\x20\x46\xbe\xcb\xc8\x46\xcd\x0b\xc8\x42\x4f\xd1\xf8\xe9\xb5\xac\xab\xd8\xd6\x29\x4e\x5e\x05\xbf\x87\xef\x1c\x07\x63\xf0\x33\xba\x93\x06\x88\x1f\xe8\xac\xb7\xe7\x4f\x0e\xdc\x61\x1e\xde\x82\x3b\xce\x6c\x68\xba\x95\x9c\x3c\x7f\x2e\x2d\x56\x6e\xeb\xfc\x30\xff\x29\xfa\x5f\xff\xff\x17\x5f\x9a\x2c\x9e\x46\x9f\x7e\xf6\xeb\x83\xcf\x36\x0f\x3e\x4b\xce\x3f\xfb\xfe\xf4\xb3\x57\xa7\x9f\xcd\x4f\x3e\x7b\xf9\x4f\xab\xf5\xd0\xe7\x23\x2d\x0b\x77\x7f\x98\x74\xca\x0c\x8b\xa1\xae\xa9\xde\x40\x43\xb2\x45\x0e\xc8\xc6\x0e\x4e\xe8\x92\x70\x39\x46\x49\xb1\x21\xdc\x2a\x03\x13\x88\xf5\x57\x20\x01\x10\xcd\x93\x34\x7e\x27\xf2\x5b\xc3\xa7\xe6\xa9\x0c\x6e\x5f\xf1\xad\x62\x99\xae\x6a\x26\x2d\x9f\x76\x54\xf7\x25\x61\x5b\x4d\x8e\xd4\x8b\x4f\x20\x0d\xfc\x14\xea\x94\xba\x59\x3e\xd5\x78\x08\xe2\x92\xaf\x18\x83\x8c\xbe\x0f\x53\xe4\x70\x9f\x30\x55\x38\xf9\x1c\xf1\x53\xb4\x49\x30\xba\x50\x7c\x34\x1f\x22\x86\xbf\x76\x2e\x78\x0d\x69\x8c\x5c\x37\x30\x71\x89\xc8\xa6\xa7\xc2\xce\x7a\xda\x51\x6d\xe1\x67\x99\x15\x4a\x79\x57\xd5\xf0\x15\x84\x5e\x45\x26\xde\xac\x1a\xae\x18\xd3\x34\x0b\x02\x28\xde\xe8\xb6\x6c\xa4\xc5\x72\x89\x69\x7b\x35\x18\x42\x36\x1d\x8b\xa2\x0f\x91\x77\xdb\x99\x4d\x81\xf2\x89\xad\x9d\xd4\x5e\xc1\xd9\x0e\x9a\x30\xd3\x03\xc4\xd5\x75\xf2\x3c\x58\x68\x33\x74\x73\xf9\x02\x8f\x45\x3d\x17\x05\x3e\x05\xbd\x57\x03\x41\xba\x1f\x2a\xc6\x89\x36\xaf\x20\x17\x4e\xd6\x62\x6d\x2a\x1a\x7e\x75\xa8\x87\x03\x1f\x3e\x98\x0f\x04\x85\x60\xda\xa6\x34\x00\x0f\xaf\x05\x58\x5e\xa7\x74\x0a\x0e\x3e\x9b\xe3\x10\x2c\x58\x0f\xf0\x3c\x87\x0f\x53\x30\x55\x8c\x86\x20\x82\x6a\xc2\x4e\xa5\x56\x34\x0b\x3e\x71\x32\xac\xf1\x1d\x7e\xb2\xd5\x89\xd7\x05\x4b\xa0\xca\x13\xf8\x60\xad\x91\xd5\x10\xf0\x8d\x75\xc4\x47\x5b\xad\x35\x57\x21\x08\x8b\xd7\x18\xb0\xf3\xbd\xfa\x62\xaf\x59\x56\xc5\x8a\x91\x8d\xa8\x29\xbf\xd8\x6a\x6e\xe5\xa8\x78\xed\x18\x14\x7c\x1e\x54\xcd\xd5\x89\xd7\xea\x8b\xad\x26\x48\x0a\xc2\xe9\xa4\xb0\x5e\x91\xad\x59\xcb\x37\x55\xb5\x51\x69\x5e\xee\x3d\xff\x76\xc6\xfb\x89\xe2\xc3\x59\x4d\x4e\x15\x7d\x25\x3d\x37\x9f\xc1\x97\x71\x52\x7a\x46\x9a\xa4\x75\x1c\x09\x03\xdb\x39\x0d\xc4\x02\x35\x53\xeb\x54\xa3\xb1\x39\x1b\x5c\xcd\xb4\xe4\x2f\x76\x67\xd0\x00\xca\xdd\xde\x10\xf8\x1f\x66\x9c\x5c\x79\x91\x4c\x42\xd8\x7d\xd1\x3a\xce\x76\x1d\x68\x32\x16\xcc\x0a\xce\xbb\xa0\x36\xb3\x20\x24\x9b\x6b\x29\x53\xf8\xca\xf3\x18\x00\x25\x2e\x57\x40\x6e\xe3\x74\x81\x57\x24\xe0\xa0\xa9\x6c\x2e\x15\x89\xf9\x68\x4d\xaa\xa7\xdd\x83\x51\xc7\x17\xde\xe5\xae\xe8\x07\xd0\xdb\x08\xd5\x88\x35\x88\xd4\x5f\x21\xf2\x51\x1b\xaa\x59\xf9\x02\x5c\xc3\xcf\xfe\x3e\x8c\x30\x5d\x6c\x8c\x08\xd8\x75\x2d\x98\x83\x4f\x55\xf5\x07\x4e\x4b\xf6\x3a\xcd\x12\x46\xf3\x36\x7d\x55\xc8\x50\x50\xad\x26\x0c\x87\x40\x84\x2e\x71\x1d\xf5\x16\x9e\xf1\x1d\x3d\x96\x79\x17\x2d\xad\x14\xfa\x6b\xe1\xe4\xbe\x7a\x53\xab\x6b\x89\x61\xbb\x29\x0e\xd0\x19\x3c\x05\x77\x1a\xbd\x60\x64\xbb\x86\x38\x86\x23\xed\xb3\xb9\x92\x5b\x86\x87\xcf\x9c\x45\xf8\xc7\xe2\x66\x17\xde\x94\x2f\x4a\x95\xe0\x40\xe4\xbe\x93\x15\x9a\x07\x3f\xb4\x24\x5b\x2a\x0f\x1b\xa3\xdc\x28\x2e\x69\x5e\xa9\x69\x03\x4f\xb6\xc9\x60\x06\xb8\x2b\x27\xaf\x78\x81\x38\xdb\xe3\xa5\x5e\x1c\x87\xc1\x38\xc2\x98\x21\xf6\x0e\xb7\x8a\xf7\x97\xbc\x7c\x98\xf7\x1f\x96\x2a\x43\x9e\xbc\x88\xd5\x88\x00\x93\xf6\x39\xcf\xbd\xe5\x45\x3f\xb8\x2d\xae\xb5\x5f\x50\x3c\x74\xe0\xda\x50\xba\x5a\x2f\x44\x26\x35\xa4\xf0\xa4\x8f\x08\x2e\x9c\x6b\xc8\xf4\xcc\x7e\xed\x9d\xb1\xa6\x41\xd0\x02\xdd\x54\x9f\x32\x2f\x03\x71\x5a\xf0\xc2\x0f\x4e\x4c\xa2\x75\x04\x5e\x35\x6c\x07\xe4\x3e\x0b\xf3\xde\xd2\x0f\x62\x40\x97\x5e\x18\x27\x07\x5d\x92\xc9\x05\x49\x33\x88\x60\x55\x9b\x0c\x44\x8b\x7b\x7b\x1b\xef\x15\x8d\xee\xe7\x61\x3c\x2e\x01\x1d\xd9\x1e\x36\xf2\x63\x9d\xef\x8f\x55\xb0\xa9\x10\x5f\x93\xc8\x31\x36\x67\x48\xe0\x50\x69\xbe\xaf\xd0\xed\x98\x5c\xcc\x1f\x46\xe4\xe3\x70\x4e\x11\xb8\x4f\xc1\x6d\xcc\x56\xd3\x61\x60\x5c\x12\xea\xd9\x20\x8f\x59\xfc\x94\x96\x31\x4b\xb7\x5c\x39\xb2\xda\x23\xd6\x13\xd9\x23\x5d\xe1\xef\x9d\xab\xba\xd6\x20\xab\xb9\xe0\x68\xed\xb6\xc5\xcd\xb8\x5c\x87\xc6\x3c\x5e\x77\x1d\xa3\x26\x06\xd2\x06\x3e\xb5\xc7\xf9\xca\x11\x38\x6c\x5c\x53\xe9\x8a\x4a\xb4\x1a\x42\xa8\xd7\x9d\x05\x91\xd8\x69\x91\x84\xb3\x66\x69\x67\x1a\x7b\x23\xa5\x43\xf3\xe4\xa3\x95\xcd\x35\x8b\x66\x4b\xee\x45\x63\x11\x8d\x6f\x09\xec\xac\x64\x86\xd8\xda\x58\x7b\xf3\x48\x59\x46\x87\xb8\xa7\xad\x4d\xd2\xed\xc0\xb5\x95\x76\x56\xb4\x30\xda\x1b\xc5\xc7\xa0\x3b\x4d\xce\x3c\x38\x1c\x65\x10\x8c\x73\xe6\xf0\x0e\xbb\xda\x6c\x77\x8e\x02\xd8\xa8\x1c\x45\x97\xa0\x01\x56\x8e\x42\x17\x22\x27\x9e\x7a\xe1\xe3\xa9\xed\x11\x47\x05\xd5\x25\x8e\x62\x1c\x00\x8e\x32\x7c\x9c\xec\xcc\x91\x98\x56\x99\x9f\x67\x1e\x63\xef\xdf\x21\x95\x84\x09\xa6\xd7\x30\x86\x22\xdd\x56\x6b\x0b\x85\x83\xc3\x06\x4c\x30\x33\x3c\x46\x3e\xe1\xe7\x40\xa5\x9e\xfb\xb3\x14\x07\x0d\x52\xf4\x5d\x9b\x23\xd5\xd3\x79\x63\xc7\xc2\xf8\x51\xea\xed\x42\xe7\x38\x0d\x12\xad\x8d\xd9\x9e\x7c\xb1\xd2\x80\x90\x8d\x3a\x3e\xe4\xda\xe1\x80\x25\xc7\xaa\xf3\xe8\xc0\x65\xac\xf8\x35\xdc\xd9\x66\xd7\xd3\x46\x9d\x28\x8c\x6d\x0a\xdc\x03\x4f\x53\xb8\x1a\x19\x8f\xdf\xaa\x44\x81\xb6\x57\x39\xb1\x62\xf5\x71\xba\xe3\x18\x0e\xe6\x15\x9f\x9a\xab\x6a\x7d\xda\x29\xf9\x18\xb9\x59\xb2\x54\x04\x8d\x7f\xf4\x9c\x90\x6c\xbb\xee\xe5\x4b\xfd\x38\x48\x87\x87\x1f\x56\x1f\xe9\x74\xb0\xe4\x38\xfc\x61\x89\xf7\x87\x61\x8a\x1b\xae\xbb\xc6\xc6\xdf\x90\xab\x74\x03\x59\x41\x55\x3d\x4c\x7e\x86\xf9\xbd\x4c\x68\x42\x38\xe2\x1c\x54\xc4\xd6\x43\x4a\x34\x0e\xee\xc4\x44\x64\x77\xdd\x99\xf0\x74\xaf\x9a\x22\x43\xe2\x50\xc0\x54\xa6\x31\x19\xc6\x51\x8a\xb4\x5f\xcb\x34\x4f\xab\x5d\x2f\xf3\xe2\x1c\x31\x62\x8a\x36\x12\x61\x1d\x6a\xc2\x8b\xd2\xcd\x96\x71\x0e\x05\xef\x5b\xbe\x66\xc3\x51\x3d\xb2\xbd\xb4\x91\xa7\x9f\x0d\x63\x54\x08\x6f\x9d\xd4\xc8\x7e\xb4\x29\xb8\x04\x30\xdc\x85\x2f\xc1\x89\xac\xf4\xc8\x84\xa2\x30\x3f\x50\x0f\x1f\xf4\xa5\x48\x51\x54\x7a\xaa\x48\xf3\x9a\x00\xde\x4f\xf9\x5d\x39\xf7\x30\xb8\x25\xae\xcb\xaa\xd8\x44\x2b\x46\x2e\x2c\xb2\x30\x4f\x23\x00\xe5\xe4\xc5\x3e\x69\x1a\xde\xe8\xf8\xe6\xfd\xd1\x4f\xc3\x3c\x48\xfc\x8d\x4d\xcd\xce\x77\xd9\x4d\x1f\x29\xf5\x78\x92\xe0\xa2\xbd\xab\x6d\x59\xb5\x14\xc2\x5e\x0a\x08\x66\x5d\x93\x08\x5f\xf7\x8b\x83\x8c\x80\xcd\xb1\xab\xb5\x39\x08\xfa\xd1\x38\x16\x99\x40\x10\xda\x35\x5e\xa5\x8e\xd1\xb2\xde\xf8\x43\x46\xf8\x24\xde\x7a\x2b\x40\x18\x9a\xb7\x42\x91\xbb\xaf\x02\xe9\x07\xef\x4e\x00\x09\x23\x2b\x27\x06\xef\x6d\x05\x2d\xfa\xc4\xd4\x75\x33\xa3\xc3\xdb\x63\x27\x61\x60\x85\x46\xa1\x69\xe1\x2b\x06\x8a\x0d\xe1\xfc\x5e\x0d\xe9\xcc\x76\xad\x59\x36\x6d\x2b\xf9\x02\x65\xde\x1b\xb6\x60\x92\x60\x74\xd6\xc8\x99\xdc\xb4\x6b\xa6\x5f\x20\x42\xf0\x91\xbe\x60\x45\xbd\x75\xce\x40\x38\x8c\x51\x31\x17\x8b\x30\x67\x6e\xc7\x5b\x3a\xd0\x7c\x1c\xa9\xf3\x7a\xb1\xfa\x78\xa8\xc5\xaa\xb7\x9f\x54\x8c\xe6\x2a\x67\xbe\x93\x5b\x21\xf4\x99\xef\x58\xc0\x3b\xcf\xf4\x10\xb0\x9e\xc9\xec\xf1\xd2\x4f\x3c\xd2\xec\x09\x2a\xe8\x34\xd1\x13\xa8\x66\x0a\xcc\x1d\x7f\xd1\x3d\x00\xe9\xbe\x94\xe0\x74\x01\x09\x9a\xcd\x78\x06\x5f\xfb\x31\xe4\x8e\x8e\x51\x98\x72\xb6\xef\x3f\xfd\xde\xab\x33\x27\x1d\x0d\x07\x4b\x67\xa2\x6f\xa4\xe7\x19\x09\x46\xe8\x3f\x3b\x13\x59\x32\x03\x25\xa3\x1e\xc1\x76\x37\x0a\x25\xcc\x37\x7b\x8d\xc0\xcc\x5b\x3b\x7f\xbd\x01\xa4\xb7\x71\x06\x8f\x20\xf8\x83\xcc\xe1\x0f\x3d\x32\x47\xf0\xcf\xc4\x1b\x62\x16\x09\x38\x81\x78\x95\xcb\xb4\x4d\x6d\x6a\x7d\xb7\x0f\x7e\x2c\x47\x35\xf0\x93\x38\xfe\xbe\x1b\xe7\x47\x36\x82\x98\xc7\x1e\xcf\x73\x0e\xc6\x75\x9f\x96\x68\xcb\x19\xba\xa7\x9b\x78\xfd\xfa\xfd\xc8\x6b\x5f\x87\x89\xfb\x12\x83\xc4\xb8\x6d\x48\xeb\x14\x93\x60\x03\x01\x0c\xc5\x8a\xeb\x20\x43\xdb\x74\xd9\x5c\xa4\xb9\x5b\xc1\x93\x90\x89\xeb\xe5\x4c\x0f\x9f\x02\x6e\x30\x84\x20\x46\x05\x4c\x6d\xf6\x8d\x69\x30\x56\x30\x4b\x7c\x9a\x38\x8f\x9d\x5e\x09\xeb\x89\x0c\x16\x6a\x4d\xdb\x7b\xf8\x81\xa8\xbd\xa1\x30\xae\x80\xfc\xdb\xb3\x85\xb9\x2e\x2d\xdc\xc6\xdd\x2b\x8c\xd6\x3b\xb9\x71\x85\xb1\x7e\x28\xcd\x32\x0c\xdb\xe1\x5c\x07\xc3\xf8\xfc\xb3\xac\x73\xa5\xe6\x7e\xaa\xdd\x4f\xb5\xbb\x34\xd5\x86\x2e\x13\x35\xb7\xc4\x6e\xed\xc0\x77\xdc\x65\xeb\x0b\xf5\x76\x8c\xfd\x60\x72\xef\xe4\xf0\x0f\xe6\xfe\x50\x33\x20\x18\xe1\xe1\xf6\x9b\x60\x94\xf2\x52\xf7\x58\x7d\x52\x36\xd3\x73\x3a\x85\x0a\x15\xce\x47\x26\x68\xb0\xaa\xdd\x04\x94\x1b\x1c\x0d\x76\x84\xce\xfc\xc1\xa2\x91\x96\x02\x2b\x00\x99\x79\xcd\xfb\x49\x91\xc9\x14\xa2\xdd\x5b\xde\xf8\x77\xdf\x25\x6f\xb3\x02\xc2\xeb\x85\xff\xa7\x79\xcc\x20\x91\x1b\x9f\x75\xab\x75\x95\x73\x2b\x13\x6e\x2f\x95\xc5\x06\x53\xb3\x17\x39\x5c\x4f\x22\x99\xcc\x10\x16\xcd\x56\x64\xb3\x21\x47\x5d\x18\xdd\x63\xe7\x05\x03\x40\x94\xcd\xde\xe9\x66\x31\x12\xf3\x68\x80\x96\x84\x1e\x98\x96\x84\xb0\x77\x93\x28\x89\x8b\xfc\x82\x32\xf1\x5e\x57\x8c\x72\x84\x97\x2a\x65\x4f\x9e\xf8\x50\x56\x85\xc8\xd7\x6a\x1b\x17\xde\x0c\x0f\x2f\xbe\x13\x1d\xa6\xdc\x1f\x61\xdd\x27\xde\xd5\x4d\x24\x91\xf1\x9a\xe4\x39\xcd\xbc\x04\x32\xfb\x1a\x60\x07\xbd\x62\x70\x73\x28\x1c\xf8\x6a\x0c\xf0\x05\x24\xfc\x0f\x87\xbd\x08\x85\xad\x3a\x0f\x2f\xd2\x71\xb9\x42\xdf\x7d\x3f\x7f\xe9\x05\xbe\x2e\x33\xbc\xc1\x3e\x7f\x69\x8c\x0f\xaf\xab\x48\xd6\x1e\xd9\x67\xeb\xda\x7b\xa1\x66\x1d\xca\x27\xe6\x91\x22\x83\xd7\xdf\x42\xc1\x35\x93\xce\x07\x2d\x9b\xd4\x09\x5c\x50\xd0\x09\xbc\x2f\xfc\x43\x73\xb5\x80\x4e\x50\x53\x21\xac\x13\x5e\x3e\x9e\x34\x71\x0e\xcb\x2d\x79\x90\xa4\x1b\x9a\x97\x03\x7d\x41\x42\xe1\x2d\xc2\xe0\x4d\x9b\x12\x5c\x62\xd7\xd6\x1b\xdf\x3f\xb9\xd1\x29\x11\xaf\x39\x83\xc4\x07\x2a\x0e\x9e\x0e\xf5\x26\xcd\x21\x00\xea\x1a\xa6\xc3\x93\x7d\xa7\x83\xf8\x5f\xa9\x08\xf3\x9f\x5f\x58\x14\x84\xf9\xc5\xca\xa7\x1e\x74\x8b\xed\x54\x8b\x44\x26\x32\x8f\x49\xb9\xdb\x2c\x8a\x4c\xbd\x63\x62\xa4\x35\x37\x17\x1d\xac\x8b\x49\x60\xf0\xd3\x90\x78\x3a\x88\xc8\x55\xf3\x90\xf2\x00\x1a\xa8\x89\x87\xdf\xfc\xf7\x38\x14\x2c\x0e\xc4\xc0\x62\x79\xba\x3e\x0a\x3e\x37\x61\x68\x18\x02\xa8\xe9\xd2\x2b\xb9\xa1\x63\x49\x59\xc5\x48\xc2\xb5\x20\x55\xfe\x06\xbf\xf9\x34\xd7\x41\x51\x50\x12\x2a\x0b\xea\x8c\xc4\x7b\xcc\xcb\x7c\xa4\x42\xf9\xde\xa4\x2e\x58\x5d\xae\xc3\x68\xc5\xaa\x98\x2c\x07\x3e\x8c\xea\x3b\x0c\xbb\x08\xc3\xd2\xcd\xb7\x33\x0a\x0b\x17\xc5\xaa\xc8\x49\xe0\x7c\x52\xb5\x5d\xe2\x7f\x2a\xcb\x7d\x5d\x60\xaf\x33\xd4\x01\x90\x13\xaf\xc9\x5c\x50\x36\xa9\xb6\xe5\x62\x00\x31\x68\xa5\x77\x11\x13\x15\x21\x7b\x77\x69\x7b\x4c\xcc\x9b\xa9\x47\xe0\xe8\x72\x2c\xa2\xde\x66\x2d\x58\x05\x35\xfa\x9f\x68\x36\xc3\x14\xf0\x43\x2f\x0d\xe2\x67\xdb\xba\x24\xdf\xa4\xd4\x6d\xef\x00\xa8\xf2\xa3\x13\xaa\x68\x7e\xa6\xb7\xd7\xed\x91\x31\x46\x02\x0e\xe6\xc1\x55\xfb\x29\x23\x97\x78\xa5\x9b\x1b\x06\xf8\x11\x5f\x07\x10\x93\xa7\x79\x9c\xd8\x7c\xa6\x42\xe6\x9f\xb1\x3e\xea\x60\xbe\x3c\x6f\x7f\x9f\x1d\x4e\x6a\x8f\xcc\x67\xdf\xec\x14\xf6\xee\x9c\x5f\x3d\x10\x19\xfc\x48\x59\x16\x71\x8a\x59\x22\x9b\x64\x7e\x48\xb8\x8f\x1e\x6b\x38\xa0\xe7\xea\xf9\x04\x8c\x16\xac\x28\x09\x98\x56\x5f\x9f\x88\x0c\x7f\xa3\xd2\x18\xce\xa7\x71\x8e\x8d\x2d\xe0\x64\xa2\xfa\x26\x61\x0b\xbe\x08\x06\x39\xdb\x00\x76\x10\x27\x32\xdd\x64\x97\x1b\xfb\xfa\x39\x3e\xa5\xc0\x5e\xdd\x6b\xf5\xf3\xdc\x77\xef\x2d\xea\x5e\x75\x9d\x43\x2c\x31\xa8\xf9\x7b\x93\xf3\x88\x1a\x7b\x64\x63\x71\x22\x72\xb1\x7f\x24\xcf\xea\x47\xf7\xdf\x64\x8c\xe6\xbb\xad\x53\x04\xfd\x24\x83\x94\xd7\x48\x87\xc0\x0c\x6f\xc6\xbe\x53\xd9\x82\x74\x92\xc4\xf3\x9a\xde\x8d\x38\x06\x60\xc1\x1a\x51\xf3\x92\x3b\xab\x29\x3c\x2b\x0f\xb7\x60\x8a\x1c\x1e\xbe\x59\xf6\x91\xab\x87\xda\xbd\x7d\xee\x7c\xff\xd3\x4e\x40\x6f\x90\x75\x9f\x3d\xe9\xec\x60\xf8\x10\x08\x6a\x06\x3e\x0a\x26\xe5\xff\x19\x8f\xd5\x82\x19\x7e\x3a\xe1\xfa\x47\x01\x0f\x76\x8c\x1e\xaa\xd7\x43\xea\xa8\x47\x46\x8e\xa3\x98\x6c\xf9\xc0\xa1\x67\xba\x8f\xdd\x3f\xf4\xbd\x19\x02\xc0\x12\xfc\x6b\x2f\xe5\xc3\xf1\xda\xdd\x49\xfb\xb1\x69\xd6\xd5\x05\x5d\xe9\x97\xe5\x5a\x62\x3b\x5d\x10\x4d\x44\x44\x56\xdf\x24\x35\xef\xd7\x14\x2c\x75\xac\x82\xde\x33\x05\xd1\x4c\x86\xdd\x36\xc3\x69\x18\x1d\xe6\x38\xf6\x30\x64\x3d\x86\x12\x2f\xff\xd5\xf2\x95\x2d\xb5\x96\x85\x21\x7b\x7d\xb0\x83\xa8\x30\x7c\x3f\xcb\x15\x77\x1c\x87\xe6\x3a\x6d\xc5\x65\xa2\x9a\xd7\x0b\x7c\xe4\x87\xf6\x5e\x4e\xed\x37\xc7\xfa\x83\x87\x80\x16\xca\xd2\x3c\x6f\x2f\x81\x1d\x43\xe2\x4d\xca\xce\xfc\x52\xe9\x7c\xc3\xf6\xe7\x53\xb1\xcb\x53\xd0\x60\x6c\x48\xde\x07\xc3\x06\x42\x15\xf9\x96\x67\x4d\x16\x7d\x5b\xf4\xe1\x99\xcd\xfe\xb3\x81\xcf\xd3\x58\x76\xa6\x5b\xc4\x03\xb9\x4c\x06\xed\xb2\x37\x5a\x2e\xbb\x2d\xe1\x4a\x20\x2c\xa7\xb6\xc7\x26\xcd\x86\xea\x91\x63\xa8\xde\x3c\x9c\x87\xdf\xec\xe6\x9a\x6a\x80\x22\x88\x7e\xda\xc2\x5a\x41\x32\xf1\xd5\x6b\xd8\x99\xeb\xbb\xcf\x4e\x85\x1f\x1c\x62\xe0\xd6\xa9\xdd\xc1\x96\x6e\x98\xde\x53\x78\x26\xa1\xb6\x7d\x61\xba\xe0\x3a\xd5\x8c\x94\x38\x03\x95\x1b\x9a\xa6\xb5\xf2\xde\xaf\xec\x01\x31\xd6\x0f\x9c\x28\xf7\x32\x1b\x25\xb3\xe1\xac\x5c\x53\x45\x66\x66\x5f\xb2\xb3\x63\xcf\xbb\xe4\xaf\x3b\x4a\x5e\xbd\x46\x7b\x89\x6b\x28\x4d\xd7\xbd\xb0\xb4\x9f\x98\xaf\x9f\x8c\xeb\x7f\xde\xc5\xaf\x1f\xa9\xe3\x3d\x92\x04\xef\xff\x1d\xda\x0d\xac\x17\x1d\x6c\xfb\x81\xd5\x8c\x93\x56\x9c\x74\x87\xc4\x45\xc1\xb8\x7a\x87\x8e\x70\xe9\xce\xf0\x9a\xad\xe3\x9c\x7b\xa1\x48\x2c\x88\x90\xe5\xe9\x93\xc3\x69\x9c\x8d\x22\xc9\x02\xc2\xe5\xfb\x99\x96\x9c\x59\xcf\x15\x60\x9f\x73\xf6\x43\x27\x6b\x43\xef\xbc\xb3\xc3\xf1\x8b\xa9\x2b\x27\x0c\xb9\x89\xe1\xbd\x17\x62\x7b\x88\xd5\x23\xac\x98\xb7\x69\x04\xa5\x20\x88\x18\xc1\xb0\x71\x00\x00\x4e\x7d\xbc\x84\x38\xc9\xf4\x81\xbf\x1b\x3d\xf0\xc7\xb9\x3d\x43\x91\xb8\x18\xbe\xae\x81\x1f\x4a\xd2\xdf\x7d\xe0\xef\xee\xea\xc0\x4f\x9b\x27\x28\xe1\x84\x09\x02\x22\xbd\xa3\xbe\xad\x3e\x2e\xa1\xb0\x05\xd7\xe8\x09\xa0\x9d\x23\x6e\x8b\x14\x3d\x1e\x6a\xdf\x97\xef\x8c\x49\x03\x72\x6c\xef\x06\xd3\xe5\xee\x58\x4d\x2e\xd8\xbf\x7d\xb1\x06\x71\xd9\x11\x6f\x30\xbf\x07\x19\x08\x31\xc1\xe1\x9d\x45\xe5\x16\xa3\x23\x2a\x11\xde\xe4\x0f\xa6\x14\x75\xc6\x8f\x04\x13\xd9\xe8\xb1\x30\x6d\xb5\x1b\x81\xd6\xdd\xd5\x92\x69\xec\xe6\x27\x06\xc0\x6e\xb7\x57\x96\x08\x31\x17\x4f\x8d\x28\xf7\x99\xdb\x4f\x0a\xd0\x95\xb3\xe8\x72\x4d\x39\xbb\x4c\x3d\x5a\x80\xd9\xbf\x12\xba\x4c\xe1\xed\x03\x78\x38\x4d\x3e\x05\x88\xa3\xca\xdb\xc1\xb2\xd1\xf8\x0e\xee\x6d\x02\xfc\xaf\x1c\x73\x2c\x08\x2c\x81\x42\x46\x6d\xf4\x1d\x6a\x3b\x74\x06\x99\xfb\x47\x48\x38\xdd\x18\x97\xe3\xa5\xdb\x3d\x84\x54\x5f\xec\xb7\x65\x36\x9d\x13\x26\x8a\xa1\x21\x35\x64\x31\x89\xf0\xa0\x7b\xbb\x29\xba\xb7\x9b\x3e\x56\xbb\xc9\x16\xe1\xe6\x6c\x3e\xa8\x44\x2a\x68\x77\xc8\x88\xb2\x86\x00\xde\x9b\x52\x5e\x92\x3e\x52\x53\xea\x7a\xe6\xc2\x38\x91\xdd\x66\xb3\xea\x10\x53\xe1\xa3\x33\xae\xee\x94\xe5\x74\xc0\x8e\xbc\x37\x8e\x3a\x6d\x6e\x87\x71\x34\xa9\x63\xff\x9e\x26\xd2\x84\xa0\xa5\xbb\x60\x0e\x69\x19\x98\x02\x07\x0c\x1b\x38\xf8\xb5\xdf\xbc\x0f\x3f\xf1\xf5\xee\xbc\xed\xa9\xec\xd8\x3d\xdb\x68\xe9\x7c\x10\x26\xec\x46\x0a\xf1\x1f\x4e\x6a\x32\x18\x7c\x00\xca\x3c\x92\xf4\x6b\x1e\x9e\xc7\x70\x46\x34\x44\xee\x83\x01\x84\xa5\xa8\x80\xfb\x31\x01\x2f\xdd\xe2\x55\x11\xb8\x42\xb2\x4d\x69\x4c\x2f\xd3\x52\x4c\x5e\xc2\x70\x7e\x1c\xc3\x53\x94\xf8\xde\xbd\x98\x2e\x90\x01\xdc\xbf\xb8\xdc\xdb\xaa\x7f\x4b\x5b\xd5\x7e\x5b\x6b\xbc\x66\x6e\x87\xf3\x71\x9a\xa7\x7d\x5e\xc6\x2a\x71\x57\x5f\xe8\x9c\xcd\x16\xa4\xa4\x30\x39\x8f\x02\x27\xc1\x17\xe3\x67\xc1\x58\x94\x2e\x51\x5c\xd7\x94\x98\x44\xdf\xdf\x7e\x7e\xb8\x64\x76\xa7\xe6\xca\x97\x1d\x26\xab\x62\x3b\x66\xaa\x7c\x39\x65\xaa\x8c\xc2\xe8\x12\xc4\xf5\xcd\x94\xf1\xe4\xfd\xed\x27\x8a\x43\x64\x77\x69\x9e\xdc\x3b\x3b\xef\x95\xa9\x50\x31\x1d\x60\xdc\x77\xc7\xfc\x0d\x0d\xf9\xbd\xd4\xa8\xdd\x04\x35\x6a\x24\x46\x97\x24\xae\x6d\x2e\xdc\x2b\x51\x07\x13\xd9\x5d\x99\x23\xfb\xa8\x4f\xbb\x09\xea\xd3\x38\x84\x2e\x39\x5c\xdb\x0c\xb9\x57\x9e\xf6\x93\xd8\x9d\x9b\x20\x1f\xdd\xc9\xd8\x7d\xd8\xa1\x2d\xec\x70\xff\x81\x70\x7f\xb2\xd6\x69\xe3\xee\xea\x0f\x75\xb2\x36\xa1\x4b\x6d\x67\x6a\xc6\x79\xd0\xad\x3b\x53\x1b\x3e\xaf\x9a\xb4\x3f\xfe\xfd\xce\xd8\x5c\x62\x18\x1a\x4a\x43\xa7\x2d\x81\xe1\x86\xf7\x67\x2e\xf7\x67\x2e\x01\x0c\x86\x69\x7b\x87\x8b\x89\xf2\x41\xfb\x78\xcf\x5f\x0e\x11\x4a\x73\x7f\x0a\xa3\xe8\xbb\x0b\xa7\x30\xb7\x63\xc6\x7c\x71\xc7\xa7\xcc\xfd\x61\x4c\x74\x47\x0e\x63\x6e\xc7\x7c\xf9\xf2\x6e\xcf\x97\xfb\x43\x99\x7b\x6d\x6b\x8a\xc8\xee\xe0\x4c\xb8\x3f\xab\x11\xe4\xdd\x81\xb3\x9a\xdb\x30\x5d\x0c\xf9\xdd\xc1\x09\x73\x7f\x70\x73\x37\x0e\x6e\x6e\xc7\x6c\xb9\xe3\x8a\xd6\x47\x77\x8a\x73\xa7\x8e\x68\x0e\xd8\x91\xf7\xa7\x30\x9d\x36\xee\xde\xfc\x90\xa7\x30\x07\xbb\xdf\x74\xf7\xcf\x62\xfe\xa6\x67\x2f\xc6\x59\xcb\xde\xf7\x9b\xc2\xef\x31\x79\xb7\x58\x67\x02\xcb\x90\x36\x53\xf6\xf4\xd1\xe9\x2c\x83\x64\x15\x90\x3d\xf5\x5e\x60\xfa\xd7\x80\xd4\xa9\xf7\x02\xd3\xbf\x7a\x2f\xda\x05\xdf\xa9\xf3\xab\xbb\x8e\x6c\x9f\x01\x4d\x26\x69\xd7\x23\x73\x7f\x06\x89\x69\x38\xbd\xec\xbd\xac\xd4\xcf\x50\x6e\xd9\x7b\x49\xe1\x47\x4f\xf0\x01\xbe\x15\x66\xbe\x6a\xd0\x7b\x62\x6a\x28\x24\xe0\x50\x1b\xad\xe5\xe5\xb2\x4e\x45\xa3\x0b\x2c\xd5\xaf\x6f\x32\xb9\x68\xb3\x8f\x8e\x61\xd2\x0e\x36\x76\x0f\x4d\x58\x59\xd4\x2c\x1e\xf9\xda\x84\xc4\x25\xb4\xb3\x21\x82\x1c\xf7\xca\x9d\x8d\xcd\x37\x0f\x08\x5b\x51\xe7\x53\x15\x37\x4b\x9f\x6f\xaa\xa9\x27\xef\xf6\x9e\x6d\x5b\x56\xfc\xae\x5e\x1d\xb1\x0b\xc1\x07\xb3\x1d\x0d\xd6\x27\x28\x00\x78\x07\x40\xa7\xc1\x91\xef\x75\xbf\x7e\x5b\xf7\xca\xe5\x01\x35\x6a\x38\x0e\x71\xea\x78\x1c\x85\xc5\x7d\x1e\x45\xff\x7a\xd8\x33\x5b\x39\xde\x9d\x09\x00\xe2\xab\x35\x6a\xb4\x4f\x63\x5f\xc1\xd4\x73\x0f\x0c\x12\x6e\x34\x32\xb3\x2e\x04\xb7\x0f\xe4\xbd\xf7\xac\x2c\xbc\x67\x23\x92\xe2\x19\x2f\xcb\xe2\x93\x66\x7f\xb9\xe7\x1d\x56\xf8\x0e\x5e\x72\xff\x6b\xd8\x9d\xc0\xe7\x5b\x1d\x83\xc7\x40\x46\xd5\xfd\x51\x93\xbc\x4a\xe1\x85\x9b\x0b\x2a\x9e\xe1\xf1\xfa\x0f\x44\x2b\xf5\x1c\x2a\x61\x96\x77\xda\x1e\x7a\xb0\xe6\x51\xa1\xbc\x2c\x83\xa8\x64\x4d\xc0\xf5\x93\xf8\x68\x45\x36\x89\x47\xf1\x2c\x1c\x89\x92\xb4\x8c\x19\xad\x28\x18\x3b\xdb\xba\xe2\xfb\x7c\xbe\xf2\x53\x25\x60\xfd\x49\x81\xac\xff\x96\x9f\xf7\x13\x82\x7c\xa2\x0e\x5e\x7e\x27\x15\x5d\x15\x2c\xe5\x7f\x15\x2f\xb5\xfb\x1f\xfb\x94\xd5\x77\x5f\x7e\x31\x24\xa3\xb1\xb4\x5c\xd2\xbc\xda\x59\xc8\x09\xa1\xe6\xab\x5b\x46\xcd\xe2\x76\x91\x13\x4f\x27\x47\x0d\xe7\x34\xa1\x30\x9c\x77\x01\x73\x48\x55\x05\xa4\x3f\xc8\xcf\x63\xb1\x3a\x67\x4f\x1e\x65\xc5\x8a\x30\xfe\x79\x93\xc6\x11\xbe\xfc\x05\xcf\x03\xf9\xd7\x8f\x62\x85\x8b\x47\xb1\x3a\x20\x19\xb0\x22\xe6\xc0\x1c\xef\x8b\x30\x32\xb6\xc5\x25\x90\xf1\xba\xb8\x3c\x00\x19\x1b\xb2\xdd\xe2\x33\x81\x85\x2c\xcd\x06\x5e\xe9\x55\xb5\xda\x35\x24\x1b\xbb\x86\x78\xd6\xb4\x92\x17\x31\x1a\xb1\xa2\xa8\x02\xa5\x51\xfe\xc1\x2a\x7c\x3d\x9c\xff\x1e\x4b\x47\xb5\x66\xb4\x5c\x17\x59\xb2\xef\xc2\xda\x00\x02\x4a\xce\xd5\x17\x83\x1c\x9f\xfa\x89\xb1\xe3\x69\x8c\x2d\xbe\x99\x7f\x6b\x6a\xa1\xed\x6b\x55\x36\x25\x3a\x29\x36\x24\xb5\xab\x9b\xe6\x9b\x65\x73\xcb\xde\x7f\x64\x7d\xf2\xac\xe7\xad\xe5\x32\xb8\x5e\x14\x29\xbe\x7b\xff\x0c\x1f\x8a\x3c\x9b\xed\x34\x76\xcd\x86\x71\xb1\xc5\x55\x61\x1e\x26\x5c\xa1\x84\xe0\x0b\x94\x49\x69\x88\x1a\xfe\xe7\xe2\x0e\xe9\x9c\xff\xd6\x46\x6d\xd3\x51\x76\xa8\x66\x07\xda\x4f\xbd\xc0\x99\x8f\x72\x15\xe7\xa7\x9c\x2d\xc6\x47\x0e\x5f\x0e\x12\x39\x23\xd5\xd1\x88\xe8\x60\xdb\x29\xab\x09\x56\xba\xf9\x05\xbc\xa7\xa2\xd9\xcf\xbd\xbb\x75\xe6\x35\x03\xf3\x4d\x35\x9b\x75\xeb\x66\x41\xa7\xce\xcd\x83\xc6\xe8\x08\x16\xde\x60\xab\x41\x0e\xc4\xd0\x99\xc8\x87\x3a\x81\xc1\x35\xe0\x1f\x65\x67\xd6\x1f\x47\xf0\x9c\x29\xcd\xc9\x22\x83\x55\xa9\x46\xb6\x46\xd0\x0f\xe7\x2c\xc1\xab\x08\xd6\x78\x03\x48\x4e\xcd\x69\x85\x2f\x86\x0f\x31\xb2\xea\x9e\xa4\x1a\xfc\xb4\x67\x82\x03\xb1\x23\x03\x67\xe3\xf2\xa9\x63\xed\x81\xcc\x1f\xda\x06\x96\xb9\xcf\xa7\x10\xc7\xb8\xf3\x34\xea\x2f\x1a\x83\x67\x8b\xb2\x47\x38\xb7\x7c\xb1\xc6\x8f\x71\x46\x36\xb8\x93\x15\xe2\xd9\x59\x8f\xd4\xed\x1d\x86\x00\xa2\x67\x26\x60\xaf\x66\x04\x4d\x5c\x32\x72\xa6\x7d\x9f\xc9\x66\x6d\x32\x74\x93\xfb\x21\xe6\x71\xcd\x69\xfb\x58\xcd\x40\x3e\xdb\xe0\x71\x42\x31\x4e\xe5\xe0\x37\x37\x73\x07\xef\xf0\x9c\x61\x9b\xb8\x5c\x34\x45\x49\xc2\x53\xa0\x00\x98\x5e\xf1\x6e\xcc\x76\xd1\x32\xd5\x27\xbd\x4f\x38\xf6\x77\x12\x83\x06\x31\xa3\x5b\xbe\x88\x88\xb7\x4b\x2f\xe4\xa2\x51\x46\x4b\x56\x6c\x64\x28\x04\xf4\xac\xa0\x60\x04\x7b\x8f\xb7\xac\xb8\x4a\x37\x10\xfd\x60\x47\xc0\xd9\x64\x98\x32\xde\xbf\xd7\x83\x48\x7a\xaf\x79\x5a\x76\x29\x3b\x6f\x24\x6a\x9e\xa1\xc4\xe7\x77\xf9\x30\xdb\x66\x64\x87\xab\x25\x87\x2c\x69\xb9\x0e\xae\x86\x98\x92\xaf\x64\x76\x38\x3b\x96\xd4\x9e\xe9\xef\x11\xe7\x1d\xdf\x82\xe9\x04\xf3\xed\xa4\xbd\x2d\xd4\xdc\x3f\xfb\x7b\x6c\xef\x2f\x43\xbb\xb5\x66\xdb\x0f\x43\xd7\x2a\x0f\xc1\xed\x98\x20\xf6\x7d\xbf\x53\xe5\x5e\x07\xf8\x88\x74\x80\xfb\x55\xe7\x36\xad\x3a\xfb\x2d\x32\x8d\x25\x38\x3c\xfd\x9b\xaa\x43\x93\x5f\x19\xdb\xc3\x20\x55\xcd\xc1\x65\x4a\x7a\x11\x02\xd6\x28\x59\x73\x08\xa2\xee\x98\xb1\xaf\x4f\x7a\x0d\x73\x79\xc2\xb9\xf9\x1a\xb3\x2c\x88\x08\x3f\xde\x91\xcd\xd5\x63\xf9\xd0\xb6\xbe\x91\xbb\xdd\x40\x08\xe9\x3b\xae\x37\x07\x00\x92\x8f\x55\xbf\x1e\x0d\x1f\xd5\xe4\xeb\x46\x02\xf0\x5d\xa7\x7d\x58\x41\x18\xab\x16\xf3\x76\x78\x13\xfc\xd3\xbe\x01\xea\x9b\xde\x9f\x61\x1b\x5e\xd7\xdf\x60\x07\xd8\xad\x33\x04\xb1\xe3\xd7\xf1\x51\x98\x51\xeb\x58\x6a\x3c\x49\x23\x25\x73\x9e\x6e\x7c\x38\x9b\x62\x97\x7f\xe4\xa9\x30\x26\x6c\xdd\xe5\xd8\x1d\x9e\xf6\x6c\x96\x01\x23\xac\xa1\xc1\x04\xff\x81\x6d\xa6\xe7\xa2\x06\xb8\x9b\xec\x14\x99\x6f\xd7\x82\xcd\xd1\xb7\x3c\x1c\x8d\x71\xb7\xb1\x32\x12\xb0\x03\x61\x3d\xe9\x2f\x02\xfa\x39\x8a\x93\x37\xc2\x98\x0e\x68\x6d\x79\x43\x7f\xda\x16\x01\x3f\x76\x1b\xc4\xc2\xb4\x79\xa0\xf5\x1d\x5d\x93\x8b\xb4\xa8\x19\xfe\xa1\x7b\xa6\x25\xcb\x98\xef\x58\xcb\x52\x07\x21\xbb\x4f\x7c\x4a\xbe\x47\x43\x44\x66\xc2\xc8\x2a\x5a\x74\xd0\x37\xb5\x8d\x70\x58\x5e\x13\x07\x16\xff\x1d\x7c\xb0\xa4\xd0\xfc\x59\x70\xb5\x26\x08\x0d\xd4\x04\x34\xff\xe4\xbf\xc3\xa6\x31\xd4\x1c\x64\xfc\xf1\x76\x9b\xa5\x54\x3c\xce\xa5\x13\xc3\x40\x75\x40\xd3\x76\x4b\xe3\x74\x99\xd2\x24\x2a\x69\x26\x4e\xd4\x8f\x0d\x18\x8c\xae\xd2\x92\x63\x45\x35\x06\x23\x5a\x21\x9a\x95\xb0\x5d\x44\xb9\xba\x59\x45\x19\x94\xf2\x05\x04\xd5\x91\xb2\xde\x02\x9d\x06\x88\x2d\xc9\x73\x68\x0e\x6e\x1e\x20\xa3\xef\xde\x31\xf4\xe4\x86\x98\xd3\xe8\xdf\x73\xf5\xf9\x1b\x3e\x90\xbf\xe5\x32\xba\x28\xd2\xc4\x78\x85\xc9\xf6\x2c\x99\xa0\xba\xc4\x53\x11\x41\xa1\xd0\x97\x62\x0a\x1a\x14\xd2\x1e\xa4\x8b\x55\xbb\x2d\x8d\x9e\xc1\xe9\x41\x94\x93\x8d\xb8\xd6\x51\x55\x24\x5e\xcb\xb7\x1a\x1a\xd8\xf6\xe6\x4d\x85\xe7\x4d\xc8\x71\x0b\xa0\x10\x74\xf8\x64\x01\x32\x98\x01\x0d\xca\x38\x3c\x6e\x40\x06\xa5\x65\x81\xdf\x62\x54\x0d\x5b\x19\x65\xe7\x8e\x40\xcd\x0d\x0c\xce\x34\x8e\x1b\x74\x81\xf8\xc8\xc4\x0a\x13\xee\x06\x48\x24\x03\xc8\x2c\x08\xe1\x67\x8f\xcb\x01\x23\xf0\x5a\xc0\xc8\xbe\x2d\x58\xba\xe2\x06\xd9\x3f\xc7\x11\x2d\x45\xd5\xac\x94\xdd\x39\x0f\x3f\xef\xf7\xeb\x2c\x3c\xd3\x91\xd7\x12\x2e\x28\x6c\x61\x5e\xfb\x40\xd6\xde\xa3\xf7\x42\xb0\xba\xa4\x71\x74\xea\x89\xc5\x09\xeb\xc4\x60\xf4\xee\x9e\x6c\x84\x10\x81\x26\x30\x9e\x0b\x4d\x88\x5a\x74\xcf\x21\x7a\x96\x64\x59\x71\x49\xd5\xe1\x19\xee\xf8\x83\xf3\x50\x68\xcc\xd3\xfb\x53\xe1\x44\xc1\xf6\x51\xba\x84\xb0\x47\x57\x22\x46\x74\x0a\xfb\x70\xba\xfb\x0f\x55\x59\x6e\x31\x4f\x23\x9c\x4a\x79\x1d\xb8\xeb\x7e\x79\x20\xf4\x6c\xbc\x63\xc2\x0d\x83\x3a\x4b\xf8\x06\x1c\x91\xe4\xf7\x9a\x2f\xe0\x09\xdc\x36\xc9\xd5\x7e\xe8\xeb\xd3\x09\xb9\xa1\x24\xea\xd0\x6e\xe3\x1a\x24\xd6\x3f\xb1\xa8\xa9\x6e\x64\x73\x93\xcf\x42\x67\x6f\x4c\xf7\x5d\xe1\x19\xce\x2f\x51\x38\xd1\x57\x26\xd1\x4d\x9f\xed\xd9\x69\xbf\x1e\xa8\xd3\x26\xa4\x98\xf8\xf5\x43\x76\xda\xaf\x7b\x77\xda\x0e\x3b\xed\xd7\x11\x9d\xb6\x73\x76\x9a\x5e\x2d\x34\x98\x14\x74\xf8\x21\x05\xf8\xd9\x15\x8d\x6b\xbe\xaa\xa3\xc2\xbf\xa1\xd5\xba\x48\xbc\x8a\xa7\x3a\xf9\xbf\xd7\x2e\xc3\xb5\x4b\x61\x1a\x4d\x54\x58\xa4\x0a\xe5\xbf\x22\xd7\x8b\xfb\x83\x36\xd3\xb7\xb7\x20\x9c\x16\xbc\xf0\xe3\x0c\xb0\xf6\xcf\xb6\x70\x94\x83\xda\xe6\xe3\x49\x64\x8b\xc6\x67\x4d\xf0\x69\xcf\x9c\xf5\x04\x9e\xbe\xa0\xc5\x8a\x91\xed\x7a\x87\x7f\xe8\xda\xe9\xbc\xcc\x67\xa2\x77\x8b\x6d\x72\xfa\x3c\x8a\x19\x15\x09\x1d\xc1\x64\x5e\x49\x5c\x69\x2c\x5e\x93\x5e\x89\x7c\x8f\x7e\x15\x16\x6a\x62\xb4\x16\xff\x3d\x64\xa4\x37\xd8\xe2\x94\xc5\x9c\x81\x06\x81\x3f\x92\x12\x2b\x03\x8e\x27\xf8\x69\x10\x4b\xb1\xd9\xc2\xba\x23\x6c\xec\x35\x15\x61\x80\x78\xa9\xb4\x58\x36\x47\x35\x4b\x4e\x4a\xcd\xfc\xf1\x0a\xd0\x66\x26\x2b\xaa\xde\x0b\x3b\x6e\xd1\x69\x00\x8d\xb6\xaa\x13\xfa\x20\x2b\xf2\x15\x7e\x8a\x16\x32\xd0\x82\x7f\xb8\xc2\xe3\x8a\x31\x54\x61\xe3\xd2\x4e\x17\xe4\x0d\x9e\x26\x9f\x98\xc2\x3d\xdc\x34\x19\x2b\x23\xd5\xce\x45\xcf\x18\x6a\x56\x30\x3e\x1e\x10\x16\xc3\xf1\x4d\x45\x72\x3e\x88\x17\xb4\xba\xa4\x9c\x94\xea\xb2\x10\x17\xa8\xfd\xc1\x7b\xaa\xdd\x8c\xb4\x14\x1c\x47\x8b\x8e\x7a\x19\xd6\x83\x7a\x2e\x81\x3e\x11\x5c\x69\x2e\xc0\xa9\x22\x48\xe6\x03\x25\x0e\x8d\x38\xf1\x51\x36\xab\x02\xee\x49\x0c\x0c\x36\x9a\xaf\xf8\xd4\xc5\x4e\xc4\x9b\xf2\x32\xc5\x74\x21\xae\xa7\xc3\x5c\xaa\x37\x4b\xca\xd7\x62\x2e\x5c\xac\xc5\xc9\xda\xad\x06\xf2\x0f\x08\xa8\x13\xa7\x82\x9a\xf4\xd0\x33\x09\x61\x89\x76\x83\x44\x1c\x3e\x12\x6e\x2e\x5c\x6a\x7f\xf5\x07\x87\x36\xd5\x66\xbc\xd5\x69\xf4\x86\x5c\xbe\x6e\xfe\x04\xeb\x50\xf3\xe5\x10\x84\x6d\xea\x4a\x44\x46\x4d\x21\xf0\x15\x6f\xcc\x17\x37\xa0\xf3\xb9\xf2\x77\xbb\xc9\x95\xb5\x87\xa8\x86\x5e\x7c\x9c\x41\xe0\x4b\x44\xff\xa8\x49\xf6\x40\xa4\xda\x2d\x72\x58\xb5\xc3\x28\x24\xd8\x7c\x36\x4a\x58\x04\x47\x59\x51\xa6\x55\x83\x5e\x97\x96\x1c\x5e\x6f\xf3\x14\xf4\xf4\x39\xe7\x64\x20\xca\x56\xd0\xf0\xb6\x24\xe3\xc8\x40\x7b\xf5\xcf\x94\x77\xcb\x9a\xaf\x59\x9a\x00\x42\x59\x57\x6d\x9f\x41\x53\xb8\xbd\xe8\x3a\xcd\x70\xd1\x04\x3f\xfd\x81\x37\x2e\xbe\xa9\xc7\x45\x2a\xd6\xad\x6a\x0a\x1b\xaa\xed\x4d\x31\x22\x86\x1e\xff\x1f\x0f\xe0\xb3\x50\x16\xb0\xd9\x13\xd5\x6a\x22\xf1\x33\xae\xac\x7c\xd9\x9e\x82\xf2\x6f\x5f\x69\xce\xbd\x83\x30\x36\xa1\x77\xb0\xe1\xfe\x3d\xf3\x61\x98\x53\x13\x68\x46\x4e\xde\x9d\x90\x13\x39\xb9\x8f\xc6\xf2\xba\xd7\x64\xba\x56\x4e\xa1\x03\xb9\x6d\xc8\x3b\x62\x55\x67\x84\x45\xb3\x2d\xee\xe9\x31\xe1\x06\xc9\xff\xfd\x3f\xc1\x8c\x1a\x60\x6e\x6a\xb6\xad\xf2\x62\x33\x66\xad\x57\xf5\x6f\x8a\xde\x56\xc1\x7c\x45\x59\x0c\x1b\x5c\x28\xe5\x1b\x59\xff\xe6\x17\x68\x6e\x56\xad\x5b\xcb\x28\x8c\x7a\xbd\xcd\xcd\x73\x00\xfe\x12\x3a\x96\x85\x4e\xa3\x9b\xe2\x01\x9d\xfb\x17\x7c\x45\xa2\xa3\x07\x50\xdb\xf4\xd5\x0d\x0e\x25\xbe\x40\x42\x60\x06\x57\xa0\xb8\x3d\xfe\x9f\xf3\x9f\x7e\x8c\x8a\x05\x00\x92\x61\x83\xb4\xd8\xd0\x8a\xed\x40\x4d\xa7\x64\xe0\x22\x10\x56\x99\x89\xe6\xa7\x0a\x9c\xee\x34\x9a\x63\x8d\xe6\x98\xd6\x4b\x98\x77\xd1\xe0\x46\x79\x1a\xd7\xc2\xe8\x7e\xa1\xbe\xec\x05\x90\xab\xda\x8f\x59\x2c\xe0\x89\xcf\x7b\x80\x63\x45\x45\x84\x05\x20\x3f\x74\xac\xa8\x37\xf2\x8f\x61\xae\x4c\xf0\x5b\x0c\xba\x49\xde\x60\xa4\x9f\x38\xcb\x47\xd7\x08\x78\xe7\x94\x69\xa5\x94\xdf\x8e\xcd\xec\x23\xbf\x63\x47\xb5\xee\x3d\x61\x54\x85\xbd\x79\x61\xdc\x84\x58\x8d\x9e\xdc\xfe\x5b\xfc\x76\x87\xda\x2a\x1c\x9b\x05\x23\x72\x3e\x30\xd9\xec\x78\x47\x70\xe9\xc2\xab\xb3\xdb\xb5\xbf\x7a\x6e\xab\xa1\x09\x6d\x88\x9e\x5b\xd2\x09\x65\x98\xc6\x8c\x5e\xf9\xd3\xbb\xc9\x3a\xe1\x02\x17\x01\xa6\x70\x89\x72\xfe\xf3\x0b\x31\xf0\xe4\x98\x4b\xf3\x8b\xe2\x1d\xb7\xb4\x30\x8b\x1a\xf5\xb9\x6b\x5c\x12\x71\x0c\x35\x37\x31\x25\x78\x91\xfb\x1c\x63\x60\x09\x33\xe7\x87\xdd\x75\xe8\xa2\xa5\x11\xcc\x13\xf1\x61\x52\xbf\x3c\x11\x5e\x10\x49\x84\xe8\x63\x48\xc0\xc7\x97\x1b\xaf\x29\x65\xf1\xf1\xf5\x9c\xcc\xc1\xd8\x94\x37\xcc\x3b\x0c\x1c\x1e\xb3\xe9\x58\x75\x77\xa2\x0f\xb3\xdd\x73\x18\x80\xd7\x1c\xf3\x98\x10\x07\x76\x30\x19\x66\x2d\xbc\x62\x6a\x00\xfa\x2d\x7f\xac\xea\xce\x5c\xe6\x9b\x09\x65\xe7\x28\x41\x50\x11\x3a\xd8\xc7\xc5\xaa\xb4\x83\x5d\xb0\x5a\x97\x5c\xcc\x1a\xbf\x18\x47\x8c\x43\xff\x55\x9d\x55\xe9\xeb\x0e\xfb\xfd\x00\x2f\x81\x3c\x88\xd4\x5e\x56\xa2\xfe\x4c\xb8\xcd\x64\xdb\xf6\x36\x7b\xea\x28\xdf\x0c\xf7\xe6\x8c\x92\xeb\x4e\x77\xe8\x2c\xe8\x2a\xcd\x5f\xcb\xb3\x88\xde\x88\xde\x14\x17\xf4\xbc\x98\x5d\xb5\x36\xe6\xae\x1b\xa4\xd9\xad\x0e\x8e\xd3\x11\xd5\x09\x57\x6c\x6c\x75\x8f\xa3\x6e\x67\x1e\x77\x12\x42\xa9\xbf\xb5\x99\x98\xdc\x18\xe2\xac\x28\xa9\x95\x3b\xaf\xa4\xc4\x29\x8b\x11\x4a\x7c\x72\x72\x42\xd8\x4a\xbb\xcf\x2c\x15\xc9\x47\x86\xfd\xe2\x3a\xe7\xf3\x87\x9a\xcc\x54\x43\x4d\x21\xb3\x1d\xdb\x74\xea\x9a\x34\x19\x89\x7a\x6c\xed\xbb\xbb\xc1\x61\x92\xfb\x0d\xe3\xd9\x32\x3e\x35\x5c\x99\x78\xbd\xb8\xb4\x96\x81\xf8\xbc\x17\xb6\x95\x4e\x6e\x76\xae\xab\x3b\x61\x44\x97\x5a\xa9\xd9\x75\x45\x5d\x41\x15\x67\x7b\xea\x8c\x6a\x9a\x79\xce\x9e\xb0\xdc\x0c\xf0\x11\x63\xce\x6e\x54\x74\xa5\xbd\x49\xf3\x82\xb9\xe3\xa9\xae\x13\x33\xf9\xfd\x86\x30\x73\x53\xce\x79\xe1\xf6\x3a\xc5\x3c\xbf\x01\xbc\x20\xe4\x1b\xc0\x7b\xd8\x49\x3c\x88\xd2\x3f\x8f\x85\x2d\x1c\x3a\x8d\x9b\xe3\x4d\x07\x95\x53\x92\xe7\xa9\x36\x42\x19\xb4\x5b\xe7\x5d\x01\x4e\x49\x81\xd7\xcd\xbf\x15\x82\xe5\xd0\xdd\xe4\xc7\xe8\x4f\x8f\x21\x1c\x37\x7f\x19\xd6\x9c\x7a\x6d\xa0\x74\x0f\x55\x3d\xbc\x27\x6c\xd3\xee\xb8\x9a\xcc\x71\x91\x91\xcd\x22\x21\x1d\x4f\x79\xef\x26\xa8\x49\x82\xb8\x18\x74\xe6\xd2\x66\xfa\x8d\xbc\xde\x12\x27\x69\x56\x71\x0c\x12\x85\xc6\x40\x40\x7d\x74\xf4\x0c\xec\xf0\xf6\x6b\x3a\x36\x0f\x91\xd3\x97\xf7\xa8\x67\xa8\x51\xa7\xd3\xd0\x83\x34\x2b\xe2\xc9\x48\x21\xde\x28\xcb\x68\x36\x90\xcf\xf4\xe0\x78\xbd\xa1\xe8\x03\x78\xfb\xbd\x18\x88\xd4\x79\x73\xc1\x3b\xbf\xcd\x20\xfe\xd0\xee\xcc\xd2\xed\x61\x72\x9e\x8e\x40\x78\x68\x25\x22\x74\x14\x1d\x74\xf1\x0c\xed\x4d\xe1\xa0\x56\xfe\xe8\x33\xcd\x21\x2d\x3e\x84\xad\x31\xa2\xae\x41\x37\x0e\x31\x87\x95\xf5\xa7\x7e\xf7\xad\xef\xfa\x06\xc5\x76\x0e\x86\xd7\xcc\x59\xfc\x4c\x5c\x83\xed\x17\xca\xe0\x18\x4f\x73\x59\xc3\x09\x01\x0f\xc0\x68\xbf\xcc\xbb\x07\xc8\x45\xab\xb9\x25\xfa\x98\x31\xb2\xc3\x3b\x58\xbd\x1d\xc1\x36\xe5\xfb\x1e\x70\xf8\x91\x37\x44\x03\x5b\x84\xed\x02\x32\x68\x65\xdc\x3e\x65\x1b\x4e\x96\xb8\x47\x3c\x18\xf9\x44\x23\xa0\x0d\x7b\xdc\x0c\xc4\x3d\x9a\xa3\xe7\xa2\x60\x45\x5e\xa4\xdf\x9c\x7f\x0b\x1d\xf1\x73\xf3\x6d\xc8\xef\xa5\x47\x56\xc9\x56\x5c\x07\x23\x2b\x08\x09\x55\x6e\xff\xd6\x5d\x12\x10\x9f\x26\x09\x99\x41\x4f\xa4\x31\x6c\x95\x3f\x8b\x4f\x62\x72\x8b\xb1\x34\x2e\xe2\xeb\x29\xcd\x48\x9d\x93\x1d\x5f\xc1\x53\x71\x38\xdd\x09\xc9\x19\x45\x5e\x22\x61\x35\xf4\x9d\x4d\x26\x50\xbb\x8e\xf9\x47\x4d\x12\x3e\xa7\xa9\x88\x74\x84\xc7\xc1\xf9\x68\x86\xe0\xb3\x00\x8a\x54\x5b\x99\x8d\x0f\x3f\xcb\x60\xaa\x61\x67\xa9\x71\x25\xb4\x43\x47\x57\x36\x93\x48\x12\x75\x4f\x85\x57\x0d\xa2\xf9\xae\xb4\x20\x86\x9d\xf6\xf9\xea\x2b\xed\xef\x7a\x68\x83\xe2\xe8\xf6\xb1\x72\x99\x26\xd5\xba\xa5\x7a\x4d\xd3\xd5\xba\x9a\x40\xb9\x7e\x72\x26\x12\x8c\x34\xf4\xa9\x31\x26\xb3\x12\x26\x49\x2a\xb3\x33\x89\xbb\x02\xa5\x8c\xa5\xa7\x5e\x67\xba\x5c\x7e\xfd\x13\x6a\x70\xb4\x62\x24\xa0\x92\xed\xba\xce\xb2\x28\x23\xbb\x82\x13\x2b\x92\x8a\x42\xfe\x17\xba\x24\x75\x56\x81\x87\xb5\xe2\xba\xbc\x5f\xac\x00\x01\x06\xec\xf7\xfc\xb7\x11\x9d\x8f\x45\x76\x62\x9b\xcf\x61\x8b\xb0\xac\x6e\xec\x11\xa2\x83\x86\x53\xf3\xe8\xfd\x82\xea\x8d\x4a\x2b\x26\x69\xf3\xb1\x87\xf5\xcf\xfa\x3a\x84\x3f\xbf\x08\xf6\x84\x41\xad\xe4\x61\x1c\xb9\x65\xba\xca\xe5\xc1\x8e\x20\x3a\x2d\xd5\x30\xf0\x52\x0d\x07\x3d\xc1\x51\xab\x0a\x21\x81\xa0\xdf\x07\x34\xa3\x1b\xbc\x9c\x87\x63\xb7\x49\x08\xa3\xae\x65\xeb\xb1\xd3\x3a\x39\x61\x81\xd3\x23\x82\xa5\x9f\x70\x8d\x52\x0a\xa1\x16\x51\x04\x12\x53\x44\x56\x24\x85\x97\xeb\x42\xa5\x01\xba\xe9\x4c\x02\x69\xe6\x89\x6d\xc6\x0c\xa4\xd1\xd0\x17\xe4\xf1\xb9\x00\x0e\xb4\x8c\xcd\x6e\xc1\x52\x7a\x07\x76\x83\x7d\x76\x81\x0e\x20\xeb\xa5\x49\x91\x30\x7e\xe0\x09\x31\xf1\x64\xa4\x78\x31\xd2\xcc\x0e\xdf\xdb\xfe\xbb\xb6\x48\xe7\x9b\xf5\x06\xe0\x07\xa5\xa0\x94\x69\xc8\xed\x53\x1b\x4b\xe1\xbf\x8e\x16\xee\x55\x70\x68\x93\x8a\xc7\x65\x35\xca\x1a\xaa\x17\x3b\x76\xa3\x13\x74\xc8\xfc\x1e\xce\x75\x91\x24\x6a\x2c\x8a\x93\x60\x79\x94\xa8\x06\xa6\x3f\x98\x39\x49\x94\x07\x01\x07\x9e\xd5\x8c\xba\xe0\x36\x69\x35\xe3\x86\x7f\xb6\x20\xf1\x3b\xe5\x47\x0c\x37\xa9\xc4\x51\xe7\x5f\xe6\x30\xb5\x6d\x06\xbb\x71\x3b\x5b\x6b\x4d\x04\xac\x7f\x63\xcc\x09\x88\x31\xf2\xcf\x57\x71\x47\xf0\x7c\x9c\x6a\xfe\xa4\x73\xe1\x86\x6c\xd7\x60\x01\xbf\x2b\x1b\x02\x0e\x40\x18\x02\xec\x50\xf7\x12\xd5\xa9\x93\x17\x80\xef\x25\x2f\x1d\x47\xa6\xb0\x6c\x32\x7a\x50\x22\x1b\xa0\x1d\x42\x5d\x73\x6b\xc2\x3d\xf0\xab\x43\xbc\x5a\x7f\xee\x7d\x61\x38\x90\xa2\xf9\x48\x8a\x2c\x20\xae\xf9\x5d\xe1\x73\x6f\xa8\x80\x6e\xb0\xef\xc3\xf2\x1e\xaf\x02\xab\x87\x80\xf7\x7a\x19\x58\xb6\x39\xb5\x73\xa6\xd7\x0d\xd8\xcd\x06\xde\xba\xbe\x75\x83\x2f\x94\xa2\x3b\x34\xf8\x76\x77\x61\xf0\xf9\xbd\xd8\x03\xb7\xbe\x79\x5b\xa9\x96\x8c\x7c\x71\xd8\xee\x13\x1f\xc8\x49\xe3\xc5\xe6\x96\xaf\x4c\x60\xd2\x48\x77\x2c\xd1\x56\x47\x7d\x98\x70\x85\x0a\x38\x56\xac\xd0\x6a\xb4\x3c\xc7\x4a\x13\x90\x1c\xe3\xb5\x17\x3e\xca\x68\x2e\x03\xd6\x35\xe1\x88\x68\x26\x8c\x80\x86\xcb\x92\xb3\x2f\x8e\xbf\x38\x1a\x25\x77\xc0\xd0\x48\x3d\x9c\xa7\x9e\xda\x3c\x2c\x6a\x9f\xfe\x06\x4e\x9a\x5e\xba\xc5\x50\x07\x0d\xfc\x5c\x8f\xb5\xd3\x6b\xf0\x21\x0c\x1c\x0f\x52\xe5\xa0\xe7\xa2\x4c\x68\x9c\xc1\x23\x26\x17\x84\x45\xc9\xd7\x98\x57\x04\x1e\xb8\x7a\xd4\x96\x48\x4f\xfd\xa7\xc9\xd7\x9f\x4a\x32\xa5\xd8\xff\x83\x37\x78\xc4\x61\xfc\xbf\x00\x00\x00\xff\xff\x4e\xc4\xb8\x78\x7a\xc5\x01\x00") func uiTsTypingsD3D3DTsBytes() ([]byte, error) { return bindataRead( _uiTsTypingsD3D3DTs, "ui/ts/typings/d3/d3.d.ts", ) } func uiTsTypingsD3D3DTs() (*asset, error) { bytes, err := uiTsTypingsD3D3DTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/typings/d3/d3.d.ts", size: 116090, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsTypingsJqueryJqueryDTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xec\xbd\x6b\x73\xdc\xc6\xb1\x30\xfc\x5d\xbf\x02\xc5\x4a\x95\x96\x7e\x96\x54\x7c\xce\x79\xea\xe4\x50\x8e\xf5\xd0\x14\x6d\x33\x91\x44\x1d\x91\x8a\x9d\x72\xb9\xde\x02\x17\xb3\x24\x2c\x2c\xb0\x01\xb0\xa4\x18\xdb\xff\xfd\xed\xdb\xdc\x70\x5b\xec\x95\x5c\x59\xf9\x10\x53\x0b\x60\xa6\x6f\xd3\xd3\xdd\xd3\xd3\xfd\xec\x59\x70\x79\x3f\x55\x41\xa4\xc6\x71\x1a\x97\x71\x96\x16\xc1\x38\xcb\x83\x5f\xfe\x77\xa6\xf2\xfb\xe0\xcb\xc3\x2f\xff\x7c\xf8\x31\x78\x16\xfc\xc7\x21\xfc\xf7\x09\xbc\xfd\x36\xcf\x7e\x51\xa3\xf2\x28\xb8\x29\xcb\xe9\xd1\xb3\x67\xbf\xfc\x0b\x5f\x3c\x1c\x65\x93\x67\xf8\xf8\xa5\x33\xce\xd5\xfd\x51\xf0\x4d\x96\xc7\x45\xf0\xcf\x30\xfd\x90\xdd\x06\x5f\xe1\x37\x05\x7c\x74\x1d\x97\x37\xb3\x2b\xfa\xe8\x0a\x5f\xb8\xa7\xe7\xcf\xbe\x1e\x06\x27\x37\xf0\xcf\x32\x0e\xd3\xe0\xfb\x6c\x3c\x9e\x28\xf8\x87\xca\x1b\x3f\x1c\xdd\xd8\x17\xe0\xc3\x8b\x52\xdd\xaa\xe0\x5b\x95\x96\x59\xda\xf8\x3e\xbd\x70\xc0\x2f\xc0\xfb\x2f\xe3\x59\x92\xa8\x38\xf8\x2e\x9b\xa8\xa2\xf1\x03\x79\x03\xde\xbd\x0c\x8b\x22\x38\x4b\xe2\x6c\x9a\xcd\x92\xac\xf9\xed\x32\x2c\xb2\x38\xc1\xb7\xff\x06\x7f\xa5\xc1\xc5\x9d\x0a\xf3\x38\xbd\x56\xcd\xd0\xfc\x82\x2f\x15\x07\x69\x76\x1b\x26\x2a\x1c\x23\x02\x0a\x91\x8e\x93\xa4\xf1\xfd\x02\x9e\x16\x1f\x70\xf8\xef\x66\xb3\x02\xa0\xce\x8a\x42\xa5\xcd\xa0\xc0\x1b\xff\x86\x17\xff\xae\x92\xe4\x3e\xb8\x98\x4d\x26\x2a\x4f\xe2\x66\x30\x3e\x14\xfa\x31\x7c\xf0\x4d\x58\x84\x79\x58\x06\xc7\x49\x1c\x5c\xdc\xab\xa8\x99\x5f\xfc\x12\xbc\xfe\x26\x06\x16\x24\x61\x11\xfc\x90\x25\xb7\x2a\x2f\x5a\xe8\x9e\xde\xe9\xc7\x48\x75\x95\xab\x0f\xc1\x49\x3c\x52\x79\x96\xaa\xc6\xf7\x23\x7c\x65\x24\x6f\xc0\x27\xc7\x69\x94\xab\xbb\xe0\xbb\xb0\x98\x86\xcd\x92\xc0\x6f\xf0\x0b\x44\x7f\xe4\xe8\xf7\x61\x0e\x92\x04\x30\x7d\x1b\x17\x37\x2d\x22\xf4\x0b\xbe\x79\x33\xa6\x17\x88\x03\xf1\x07\xc0\x29\x0e\xfe\x9e\xa5\x51\xd6\xc2\x06\x7e\x05\xa9\xa5\x52\xf8\x1e\xe8\xfa\xb7\x70\xf4\x61\x12\x36\x23\x7f\x25\x2f\xfd\xc2\xef\xc0\x67\x6f\x41\x84\x82\x8b\x2c\x07\xe6\xb5\x88\x46\xf1\xe7\xff\xf9\xcf\xff\xf8\x9f\xff\x42\x4c\xb2\xe2\x06\x04\x3b\xcf\xae\x9a\x85\x02\x9f\xf3\x63\x7a\xf9\x26\x0d\xde\xa9\x18\x99\xde\x88\x2c\x3c\x4f\xef\x73\x7a\xe1\x19\x2d\x80\xd1\x87\xe0\x16\xe0\x8e\x00\x8e\x6f\x40\x54\x3f\xb4\xac\x82\xd1\x87\xdb\x88\x9e\x7f\x5d\x59\xe0\xac\x03\x3a\xd6\xb3\xbc\xab\x92\x7b\xd4\x31\xd1\x93\x27\xcf\xbe\x08\xbe\x58\xe7\xff\x9e\x9c\x64\xd3\xfb\x3c\xbe\xbe\x29\x83\xc1\x68\x3f\x78\x1d\x8f\xf2\xac\xc8\xc6\x65\x70\x92\xe5\xd3\x0c\xc4\x14\xc0\x3c\x04\x79\x4e\x02\x7a\xa9\x08\x72\x55\xa8\xfc\x56\x45\x87\x4f\x5e\x81\x84\x01\x0b\xa2\x60\x96\x82\xc4\x05\xe5\x8d\x0a\x8e\xa7\xe1\x08\xfe\x23\x4f\x86\xc1\x3f\x40\x6a\x61\x00\xd4\x7d\xc1\x00\x5f\xd8\x93\x47\x7b\xfb\xcf\x83\xfb\x6c\x16\x4c\xc2\xfb\x20\xcd\xca\x60\x56\xa8\x27\xe5\x0d\xe8\xb9\x71\x9c\xa8\x40\x7d\x1c\xa9\x69\x19\x80\x64\x00\x3d\xa6\x09\xe8\xb2\x91\x0a\xee\x80\x42\x34\x89\x0c\x71\x18\xfc\x53\x06\xc8\xae\xca\x10\xde\x0d\xe1\xed\x29\xfc\x6b\x8c\x6f\x69\xe8\x02\x58\x8d\xa2\x67\xef\xee\xee\x0e\x43\x02\xf0\x30\xcb\xaf\x9f\x25\xfc\x42\xf1\xec\xd5\xd9\xc9\xe9\x9b\x8b\xd3\x03\x00\xf2\xc9\x93\xcb\xef\xcf\x2e\x82\x93\xf3\x97\xa7\x01\xfc\xf7\xed\xbb\xf3\x7f\x9c\xbd\x3c\x7d\x19\x7c\x71\x7c\x01\xff\xfe\x22\xf8\xe6\xf8\xe2\xec\x62\x18\xfc\x70\x76\xf9\xfd\xf9\xfb\xcb\xe0\x87\xe3\x77\xef\x8e\xdf\x5c\x9e\x9d\x5e\x04\xe7\xef\xe0\xab\x37\x2f\xcf\x2e\xcf\xce\xdf\xc0\xbf\xbe\x0d\x8e\xdf\xfc\xf3\xc9\xdf\xcf\xde\xbc\x1c\x06\xa7\xf0\xf6\xe9\xbb\xe0\xf4\xc7\xb7\xef\x4e\x2f\xe8\xcd\xb3\xd7\x6f\x5f\x9d\x9d\xc2\xa3\xb3\x37\x27\xaf\xde\xbf\x3c\x7b\xf3\x9d\x19\xf2\xd5\xd9\xeb\xb3\xcb\x63\x1c\x05\x47\xd0\x6f\x3e\xe9\x9a\xe9\xf2\xec\xf2\xd5\xe9\x30\xf8\xf6\xec\xf2\x0d\x8e\xff\x2d\xbc\x70\x1c\xbc\x3d\x7e\x77\x79\x76\xf2\xfe\xd5\xf1\xbb\xe0\xed\xfb\x77\x6f\xcf\x2f\x4e\x87\x4f\x5e\x9f\xbe\x3b\xf9\x1e\x46\x39\xfe\xe6\xd5\xd9\xe5\x3f\x71\xa0\x37\xe7\x6f\x0e\xce\xde\x7c\xfb\x0e\x20\x38\x7d\x7d\xfa\xe6\xf2\xf0\xc9\x93\x0b\xa5\x5c\x56\xba\x1c\xd4\x24\xc5\xdd\xad\x98\xaa\x51\x3c\x8e\x47\x41\x12\xa6\xd7\xb3\xf0\x5a\x05\xd7\x19\xe8\xa8\x14\xf4\x75\x30\x55\xf9\x24\x2e\xf0\xb3\xe2\x49\x98\x46\x41\x12\x4f\xe2\x32\xe4\x1d\xcd\xca\x8a\x66\xe3\x93\xb5\xca\x73\xf0\xc5\xb3\x27\xb8\x4a\xbe\x78\x12\x7c\x11\x9c\xa5\xb0\xb3\x8d\xc3\x11\x83\x4c\x58\xfd\xed\xf8\xc7\xa0\x50\x65\x89\x70\x96\x37\x20\x1c\x77\xb8\x5f\x8c\xb2\x74\x1c\x5f\xcf\x72\x65\x5f\xca\x15\x6c\xcb\x45\xf9\x04\x07\x8c\xcd\x38\x7f\xa3\x4d\xfd\xf8\x97\xf0\xe3\x05\x0f\x52\x04\xbf\x3e\x09\xe0\x7f\x34\x23\xfe\xef\x8b\xe0\x12\x86\x80\x01\x4b\xd8\x27\x83\x12\x2d\x83\x02\xff\x02\x01\xc5\xb1\x65\xd8\xe0\x46\x85\x4c\x08\x00\x01\x96\x77\x52\xd0\x53\x5a\x5a\x79\x70\x87\xbf\x7e\x88\x81\x74\x20\xcc\xb0\xe0\xa6\x19\x92\x3d\x16\x60\xc3\x91\x5e\x1d\xb9\x2a\x67\x39\x2c\xcf\x33\x12\x79\x79\x50\x18\xfc\x52\xa5\xa2\x22\x98\x64\x11\x32\x8a\xe8\x3f\xc4\x41\x62\x5c\xc4\xb0\xb0\x26\x0a\x78\x11\x05\x65\x16\x80\xaa\x2e\xb2\x20\xc3\x55\x26\x60\xfe\xe9\x30\x64\x1c\x67\xd3\xc1\x7e\x30\x51\xe5\x4d\x06\x2b\x9e\x11\x7c\x46\xff\x95\xc9\x5e\x1c\x05\x61\x7a\xff\xbc\x4a\x83\x6f\xee\xd1\x1e\x0a\x67\x49\x39\x0c\x42\x54\x1e\x8c\x76\x11\x84\xb9\xd0\x23\x2c\xee\xd3\xd1\x0d\xec\x50\xd9\xac\x00\x7d\x3b\x88\x0f\x61\x45\x93\x0a\x88\x09\x03\x84\xab\xcc\x67\x0a\x6c\x20\x3d\xd4\x3e\x61\x8a\x6a\x03\x31\x0b\x9c\x01\xcc\xf8\x43\xfe\x14\x87\xc9\xa6\x88\x31\x0e\x33\x0e\x13\x54\x17\x27\xa0\xd9\x8a\x83\x28\x9b\x84\x44\x3a\x0d\x10\x50\x39\x0a\xcb\x10\xf5\xeb\x51\xb0\xf7\x0b\x6c\x78\xd3\x3d\xfb\x18\x48\x83\xfa\xa9\x98\x4d\x41\x1b\x96\xde\x9c\x19\xc8\xb9\xe8\xc7\x37\x59\xa9\x98\x97\x4d\x40\x91\x92\x2a\xd5\x04\xf5\x69\x1e\x03\xb2\x49\x06\x1b\x07\x92\xf9\x2a\xcf\xee\x80\xe7\xc3\x20\x8a\x8b\xf0\x2a\x41\xa6\x01\x35\x81\xb6\xbc\x58\xee\x6e\x50\x1b\xba\x62\x03\x78\xe1\xc3\x5b\x40\xe7\xb8\x40\xe9\x30\x56\xe6\x5f\x86\xf4\x22\x28\x52\xfc\x99\xa8\x7b\xc4\x98\xb3\xe6\xfc\xe5\x5f\x3f\x7e\xff\x2e\x18\xfc\xe9\x10\xb6\x14\x95\xe7\x2a\xda\xc7\xc1\x22\x35\x05\x59\x08\x4b\x15\x89\x3e\x9e\x15\xa4\x8c\x59\x1a\x67\xc0\xe3\xa2\x78\x06\xaf\x67\xf9\x33\x52\xc5\x0a\xf0\x1c\x01\x43\xaf\x60\x37\x16\x0a\x03\xc3\x52\xb0\x20\xc3\x48\x34\x2f\xc8\x7e\xce\x32\x1b\x21\x3e\x2c\x3b\x85\x7e\xc8\x60\x64\x57\x68\x01\xe3\x04\x37\x00\x2a\xff\x78\x18\x81\xb5\x02\xc2\x26\x2b\xd5\x42\x26\x8f\x05\x9a\xc1\x7e\x45\x0e\x11\x53\x90\xc2\xab\x2c\x03\x33\x30\xad\x49\xe2\x71\x00\xe3\x1c\x68\xfa\x19\xd8\xc7\xb3\x74\xc4\xf2\x81\x5c\x1b\xc1\x26\x7e\x45\xc4\xa3\xf5\x40\x4b\xe6\xde\x81\x77\x00\x12\x63\x28\xfd\x5f\x87\x1f\x87\xc1\x8f\xaf\x5f\x7d\x7f\x79\xf9\xf6\x1d\x8f\xbb\xaf\x31\xba\x52\xa0\x69\x94\xac\x32\x94\xf3\xc3\xe0\x3d\x51\x13\xfe\x09\x03\xa3\x70\x8e\x80\xc4\xd9\x44\x14\x00\x08\xac\x2a\x47\x87\xa4\x33\x78\x2a\x94\xc7\x42\xeb\x16\x1e\x95\x57\xcd\x14\x4c\x68\x00\x2f\xc4\x7f\x5d\xcf\x60\xf1\x96\x05\x7e\xc7\x0b\x06\xe0\x47\xa5\x14\x9c\xde\xd2\x9c\xef\x48\x31\x20\xf9\x59\x02\x64\x55\x33\x74\x17\xb0\xee\x2d\xfe\xac\xff\x70\x87\x4d\x5c\x49\xab\xc9\xd7\xff\x1d\x56\x87\x90\x05\x46\x03\x5c\xb1\x58\x00\x7c\xb9\xba\x0e\xf3\x28\x01\x4e\x69\x96\x93\x0e\x24\x45\xc6\x23\x7b\xec\xb3\xe3\xbd\x08\x06\x44\x81\x23\x51\xb2\xf0\xe7\xd0\x50\xe2\xa8\x41\xf3\xee\x37\xab\x1e\x50\x11\xa2\x3e\x08\xf7\xa1\xd1\x9b\x30\xd1\xc8\xe0\x07\x90\x4e\x61\xd7\x2a\x68\x75\xc3\xbb\x84\x00\x6c\x78\x11\xea\x1b\x67\x69\xf2\xda\x3e\x0a\x64\x52\x7e\xc9\x0c\xce\x03\x67\x29\xac\xe9\xbb\x2c\xff\xc0\xa2\x3f\x2a\xf1\x9f\xb8\xe6\xbe\x3f\x3d\x7e\x49\x0c\xfd\xee\xf4\xd2\x68\x03\x50\x62\x25\xbd\x8d\xee\x5d\x10\x4e\xa7\x8a\x17\xca\xde\xff\xf7\xd7\x5f\xcb\x18\xcc\xe9\x32\x9c\x4c\x7f\xdf\x23\xfd\x07\x53\xe1\xa7\x60\x95\x83\x9d\x0d\x7b\x50\xc1\x92\x62\xfe\x8d\xac\x47\x04\x50\x1f\x02\xe8\xb8\xcb\x65\x25\xda\xea\x48\xf3\xc2\x21\x3a\xca\x99\x31\xaa\xce\x4e\xff\x02\xaa\x45\xa1\xc5\x04\x86\xc1\x25\x0e\x32\x01\x61\xc4\x19\xc3\xe0\xfd\xbb\x57\xbc\x26\x6e\x50\xd2\x92\x1c\xc4\xf4\x1e\xa8\xa3\x52\x87\x72\x08\x37\x02\xe6\xb3\x92\x48\xd3\xb9\x12\xed\xa2\xcb\x1c\x89\x21\x50\x5c\x25\x87\x26\x2f\x38\x14\x45\x30\x08\xc7\x88\xa4\xac\x7c\xa2\x24\xe9\x22\xb3\x8c\x79\x65\xa8\x8f\x6a\x34\x03\xb8\xf6\x99\x3a\x66\x96\x6b\x05\x4b\x47\x96\x4d\x79\x97\xd9\x75\x73\xe4\xac\xb7\xde\x4b\x1b\x67\x0f\x83\xa2\xcc\x59\x0c\x4a\x75\x0d\x76\xfa\xbf\xd9\x8e\x00\x5d\x09\x06\xce\xcc\x88\xbc\xc6\x64\xb0\x27\xb0\xef\x0d\x83\x3d\x60\x14\xef\xc5\x2a\xc2\x7f\x12\x26\xf8\x07\x32\x3d\x9b\x95\xf8\x67\x08\xb6\x3f\xfe\x01\x28\xee\x01\x93\x41\xfe\xf8\xad\xfd\xb6\xe5\x68\x94\x72\x61\xe4\x33\xd5\x06\x02\xfe\x95\xe7\x21\x59\xc4\x9a\x26\x20\x40\xa7\xc0\xa6\xca\xf2\xb7\xbc\x40\x45\x41\x26\x45\xb3\x62\xf1\xf9\x2d\x73\x37\x2e\xdc\x52\x7d\x2c\x2f\x88\x26\x47\x42\xb3\x96\xe5\x7a\x9c\x6a\x02\x03\x98\xfc\xe6\x33\xd0\x21\xb3\x24\xcc\x0f\xd4\x47\xd0\xdd\x64\x48\x02\x1b\xe3\xbc\x60\xc1\x8c\x50\xf2\xc1\x23\x54\xc1\x4d\x76\xa7\x29\x42\x78\x10\xc9\x84\x01\x6c\x34\x0d\x83\x6b\xd8\x2c\x53\xd0\x01\x85\x67\x93\x1d\x06\x83\x5b\xb1\x6c\xc3\x08\x96\xce\x11\x92\x74\xbf\x82\x1e\xbd\x8e\x16\xce\xaf\xc1\x4f\x1f\xd4\xbd\x46\xe4\x67\x46\x24\xf8\x5d\x70\x79\x76\x3c\x82\x75\x4f\x6b\x18\xe4\x9a\xe1\x21\xf3\x09\x8c\xaa\x19\xaa\x9c\x51\x16\x01\x20\xf8\xcb\x53\x63\x96\xc0\x2e\x3e\x0b\xd1\xd1\x84\xff\x03\x45\xa3\x67\xa3\x48\x92\x6c\x14\xf0\x9f\x3d\xd2\x32\x7b\x32\xcf\x82\xce\xe2\x33\xb0\xc1\x41\x0a\x9f\xfd\xf7\x7f\xfd\x47\x95\xe8\x3f\xe0\x92\x2b\x44\xf1\xa0\xf5\xa3\xb5\x0d\x1b\xa0\x43\x31\x01\xe2\x2a\xd1\x5e\xb2\x21\x86\x82\xb1\x07\x9a\x2b\x11\xb3\xf2\xd9\xc7\x03\x70\xae\x0e\x40\xfd\x4c\x0e\x66\x79\xa2\x52\xc4\x18\x2c\x8a\xd1\x0d\x32\xa4\xfc\xeb\xfb\xcb\x6f\x0f\xfe\x02\x62\x0d\xf6\x0c\xc8\x1e\x79\x79\x29\xdb\xe4\x93\x8c\x36\x65\x70\xc3\x8c\x6d\x07\x4c\x87\x71\x63\x54\xa2\xb8\x76\x03\xf1\xec\x08\x8c\x83\x52\xe8\xc3\xf6\xe9\x60\x9f\x56\x41\x2a\xfb\x6d\x98\xdc\x85\xf7\xbc\xed\xfa\xf8\x04\x03\x45\x42\x30\x06\x65\xc9\xe8\xca\xee\x2c\x1a\xe3\x87\xff\x3c\xa1\x55\x0f\xe4\x95\x55\x6f\xfc\x1b\xc2\x0f\xcc\xb3\x11\xc8\xb2\x12\x01\xa4\x85\xc7\xa8\x39\xd3\x12\x92\xcf\xe5\xc3\x7b\x36\xe5\x58\x19\xeb\x77\x49\x46\x51\x5d\xf3\x4e\xe4\xec\x32\x08\x2e\xbc\x95\x5e\xf3\xaf\x44\x40\x18\xa1\xba\xde\x8c\x88\xb4\x58\xdd\xb4\x68\x65\x35\xe9\x85\xcd\x9a\x5d\xbb\x24\x1f\x69\x99\xa1\x45\x8e\xab\x1a\xcc\xa2\x84\x2c\x2c\xa3\x4f\x0f\x3d\xcb\xdd\xfd\x8c\x75\x81\x0c\x4e\x64\xc8\xd1\x42\x43\x2a\xb2\xef\xc2\x12\xaf\x2d\x17\x32\xa5\xc4\xec\xc0\xd1\xd1\xf2\x0c\x5d\xb7\x69\xa2\xf2\x6b\x54\xfe\xda\xab\x37\x5f\x6a\x85\xad\x99\xbc\xdf\x40\x85\x8f\x65\x0b\x05\xac\x36\xc1\xf7\xc0\xd0\xd7\x02\x8e\x54\x3b\x28\xb3\x03\xfd\x37\x3e\x07\xc9\xe0\x3d\x95\x54\xa2\xf9\x01\x16\xe9\x6d\x98\x80\xe7\x81\x28\x57\x0c\x45\xf6\xb8\x18\xe1\x32\x0f\xd3\x02\x65\x1e\xa0\xe5\x0f\x8c\xf6\x67\xe5\xd3\x4f\xc9\x08\x14\x73\xd5\x8c\x67\xe1\xe0\x42\xb9\x83\x4d\x92\x2c\x11\x92\x26\x58\x23\xe8\xdf\xbc\xf4\xdc\x9b\x60\xa0\x4d\xec\xbf\x5d\x9c\xbf\x79\x0b\x7b\x19\x73\xa4\x00\xf3\x21\x60\x4f\x48\x7b\x4c\xca\xe2\xe0\x0e\x24\x5e\x98\x6c\x08\xac\xac\x86\xb4\x74\xd5\xc7\x10\xf5\xff\x50\xd6\xd8\x41\x11\x47\x88\x7a\x14\xa3\x05\x24\x9b\xbc\x5e\x01\x3c\x55\x1f\x7a\xd8\xa9\x3b\x2c\x89\x97\xa2\xb1\xae\x54\xc3\x62\x27\xfb\x8a\x35\x17\x91\x36\x62\xbb\x86\x82\xec\x42\xda\x21\xab\x82\xd2\xd8\x37\x7a\x5f\xc7\x6f\x81\xfd\x6c\x94\xf1\x97\xe4\x54\xe5\x64\x3d\xa2\xc9\x73\x60\xcd\x38\x8c\x94\x4c\xf3\x0c\xb7\x77\x02\xc8\x3a\x9c\xb0\x2e\x6e\x09\x2e\xa2\xd9\x0c\xcc\x7d\x50\x23\x23\xfd\x32\xcd\x73\xce\x52\x4a\xfe\x16\xa0\xf1\x77\x75\xff\xec\x1f\x44\x7f\xda\xe8\x48\x19\x5a\x21\x84\x3d\x18\x37\xf2\xa1\xde\xec\x00\xd1\x38\x4c\xe2\x7f\x83\x42\x9a\xc0\x42\x8d\x81\x0d\xfc\x76\xc1\xeb\x89\xd8\x0b\xa2\x14\x5c\x85\xb8\x94\x84\xe9\x9e\x8c\x82\xf0\x46\x14\x83\x0c\x13\x63\x3b\x0c\x22\x55\x8c\xf2\xf8\x0a\x2d\x3c\x05\x8c\xae\xac\x3c\x5c\x3a\x6d\xcb\xae\x6a\xda\x69\x4f\x0a\x74\x5a\xa4\x5d\xd8\xf0\xce\xc6\x32\x48\x09\x03\x28\xbe\xd6\x3d\x34\x56\x07\x39\x6d\xe3\x38\x81\x95\x41\x5e\x8c\x33\x7a\x11\x62\xf0\xf4\xdf\xaa\xb2\xd4\x30\x18\x58\xdc\x64\xb3\x24\x92\x45\x2a\x82\xce\x2f\xb3\x8f\x5f\xb1\x0f\x75\xbc\xa4\xc1\x36\x44\x60\x09\x46\x1e\x0b\x6d\xeb\x1c\x9c\x36\x67\x4b\x41\x73\x10\xff\xf9\x54\x6b\x94\xa7\xd6\x2c\xaf\xd3\xed\x5b\x42\x05\x2c\x25\xfc\x07\xd1\x10\xb4\xeb\x3d\xfd\xd1\x62\x17\x5d\x3a\x9e\x13\xef\xd0\xa8\x7f\x60\xdd\x3f\x25\x8b\x77\x8a\x8b\x0c\x28\xc3\xce\xac\x0f\x1b\x49\x4f\x8a\xa7\x03\xb8\xcd\xf1\x46\xa6\xa2\xa1\x67\x2a\x95\xf0\x07\x10\x33\x4e\xc7\xe8\x45\x94\xbe\xa4\xbc\x3e\x7b\x7d\x6a\x26\x77\xc9\x0c\x16\x79\x8a\x3c\x73\xde\xa0\xd1\xee\x63\x05\x74\x87\x07\x43\xd4\xf9\x60\x47\x93\xbe\x71\x9f\x85\xc1\xdf\xc2\xdb\xf0\x02\xc4\x0b\x2c\x53\x56\xd1\xe6\xdd\x82\x7f\xa5\xb7\xc5\x96\x67\x6c\xe8\xf7\x21\x5b\xde\xe9\x3d\xac\x26\x40\x58\x19\xb7\xeb\x4a\x59\xee\xa0\xaf\xa2\xed\xcc\xc3\xa0\x46\x7e\xd9\x33\xf9\x85\xde\x8e\x49\xec\x1b\xf3\xe3\x30\x4e\x8a\x8a\x08\x81\xae\x53\x60\x60\xe2\x86\x90\x83\x3a\x58\xc0\xc3\xb0\x52\xbf\x6f\xe8\x61\xdc\x0b\x59\x88\xda\xb9\xd0\xac\x60\xe7\x87\x04\x21\x1b\x8d\x66\x18\xc5\x11\xe2\x88\xf2\x09\x13\x71\xf3\x10\x36\x43\xe5\x71\x80\xb2\xa0\xbf\x38\x0c\xde\x82\x8e\x8d\xaf\xac\xce\xd0\xc1\xd1\x42\x81\xce\x8c\x0c\x12\xc1\xe0\x4a\xa1\x52\x07\x17\x73\x96\x24\xfb\xe4\x6a\xb9\xce\x8a\x71\x60\xb4\xd7\x82\xa0\x78\x6e\xcb\x21\x1b\x9a\x78\x2a\x07\x0e\x95\x80\x4f\x70\xa0\x3f\x8a\xff\xba\xbc\x01\x03\xc8\x23\xa3\x22\xd7\x01\x6c\xe3\x00\x03\x6e\x84\x07\xb3\x81\x86\x60\x37\x6b\x68\x22\x47\x7b\xe0\x9d\x07\xdf\x66\xb3\x34\xda\x23\xa7\x89\x22\xbe\x48\x86\x0b\x5e\xa5\xa7\x38\xc9\xe1\x5e\x8b\xf7\xc4\x00\xad\xdb\x75\xe2\x80\x01\xa9\x32\x56\x7f\xc6\x4d\x97\x37\x91\xde\x23\x37\x18\x29\x0b\x00\xe9\xe7\xfd\x4e\x9b\xb6\x13\x38\xe8\xe1\x94\x11\x4a\x3d\x3d\x32\x8f\x07\x73\xdc\x34\x60\x24\x07\x16\xd0\x1e\x88\xaf\xaf\xe1\xcf\xeb\x24\xbb\x0a\xd9\x90\x0c\x78\xbf\x13\x74\xb5\x44\xc5\x85\x8d\x26\x5d\x52\x48\xcf\x78\x0f\x6c\x53\x5c\x38\x71\x1a\x7f\xdf\x54\x7a\x74\x33\x64\x12\x7f\x60\x1b\x13\x70\xc8\x4b\x64\x36\xff\x23\x9b\xb2\xfa\xbb\x52\xb4\x5a\x18\x36\x94\x72\x22\x56\x25\xb0\x87\x46\x61\x9e\x25\x20\xf8\x79\x8c\x11\x5a\x4b\xc5\xc2\x27\x23\xcf\xde\x15\xcc\x70\xdd\x56\xb0\x66\xf4\x5e\x2a\x71\x7d\xd8\x7c\x9f\xdd\xda\xfd\x9c\x5d\x3a\x5c\x5b\x49\x06\x50\xd2\x26\x6d\xa2\xc3\xb3\x42\xaf\xf3\x8a\x0f\x42\x06\x26\xae\x02\x26\x9f\x0c\xfd\xe3\xc1\x3b\x1d\x88\x39\xf8\x01\x06\x3a\xaa\x7e\x66\x5d\x12\xb2\xb2\x86\xc1\xd5\xac\x24\x07\x58\xd3\xbf\xf2\x3e\xc3\x29\x94\x62\x2f\x24\x82\xc9\x72\x60\xd0\x3f\x58\x41\x88\x1d\x2f\x21\x4b\x7f\xc1\x24\x05\xa9\x4c\x3c\xfc\xb9\xcb\xe3\x12\x3c\x14\xe6\x07\xe2\xd8\x1e\x76\xec\x61\x0a\xca\x6c\x0b\xd8\xc5\xc7\x68\x9d\x7a\x2a\x5b\x6c\x44\x8e\xc1\x8c\x67\x12\xaa\x8b\x2b\x9b\x1a\x46\xba\x34\xde\xc0\x0b\x71\xcd\x92\xb0\x28\x5d\xf9\xe5\xa5\x87\x41\x6a\x8c\x7f\x8d\x6e\xd4\xe8\x83\xe6\xdb\x2b\x78\xf5\xe0\xb5\xc4\x76\x04\x70\xeb\x2c\x1b\x3b\x4e\xc7\x23\xaf\xd3\x2c\xd7\x9f\xea\x97\xcf\xdc\x3d\x42\xe2\xc5\x6a\x74\x93\xc6\x30\x3f\x13\x99\x66\x64\x0d\xf9\x54\x95\xe1\xf5\x53\xbb\xb5\xeb\x98\xa5\x98\x26\x28\xe8\x61\x09\xaa\x6a\x96\xea\x80\x13\x9b\x3f\x1e\x7d\xe3\xb1\x86\xb8\x4b\xcc\x0d\x49\x69\xf3\x80\xb5\xa9\xd2\xdb\x38\xcf\xd2\x89\xd8\xdd\xb4\x09\x8f\xb2\xeb\x94\x8c\x2c\xd4\xc8\x49\x06\x6a\x6e\xb8\x07\x3e\xf7\xe1\xf5\x21\x7d\x8a\x67\xba\xc5\x3d\x08\xec\x04\xfc\x75\xed\x89\x0b\xb6\x51\x26\x31\x58\x33\x0a\x5a\x23\x30\x0e\x69\x78\x7b\xf6\x23\xfb\x6e\x86\xf0\xd0\x19\x63\x9e\x95\xd9\x28\x4b\x38\x02\x28\xc0\x01\x6f\x7d\x60\x08\x96\x23\x02\x60\x18\x7c\x71\x00\x1a\x50\xa5\x05\x9d\x83\xa1\xae\xbd\x8b\xa3\x6b\x55\x9a\xe3\xb3\xb8\x78\x85\xaf\x6f\xec\xf8\xac\x49\xe4\x0f\xbf\xf4\x85\x5e\x60\xe8\xe0\xc8\x39\x0c\x92\xc7\xda\xa7\xaf\x1d\x67\xa4\x68\xfa\x53\xc8\x84\x4e\xb2\x2a\x02\xcc\xa2\xa8\x37\x2e\xf1\xd1\xcd\xe1\xcd\x53\x3d\xdc\x53\x8d\x87\xf9\xe5\xaf\x2f\xc8\xbc\x2d\xf5\x66\xec\x7a\x53\xfa\x65\xf0\x92\x40\xa5\x67\xc1\xaf\x34\xf3\xd1\xd3\x2c\xa5\xfd\xeb\x55\x16\x46\x4f\x7f\x0f\xee\xc4\x34\x2f\x68\x07\x48\x03\xf7\x31\x8f\xae\xdd\x7e\xd7\x90\xad\xef\xdb\xf6\xf0\x56\x09\x8a\x95\x83\x3e\xbd\x8b\x14\xfa\x33\x52\x47\xa8\xa2\xe5\xab\xbd\x17\x1a\xab\x3d\x8d\x81\xcc\x8a\xb1\x6f\xdc\x58\x4a\x3c\xac\x2b\xe5\x01\x86\xc2\xf6\xfe\xfa\x62\x8f\x37\x35\xed\xf3\xcb\xc1\xdf\x59\x2a\x61\xb2\x10\x57\xf6\xbd\xf5\x41\x68\xc9\x3a\xa1\x2c\xed\x64\x13\xc8\x27\x9a\x6d\x82\xcc\x21\x98\x30\x8e\x43\xfd\x2b\xbf\x75\xa4\x15\x86\xf7\xcd\x51\xb0\xa7\xc1\x7f\x03\xbc\xde\x0b\x7e\xf7\x04\x88\xde\x6d\xf1\xd2\x2e\x38\x34\xd5\x25\x39\x88\x63\xe8\xdb\x1d\xbd\x44\x87\x1d\xbc\x14\xec\x16\x1e\xc7\x38\xbd\x14\xe3\xbc\x56\x29\x1e\x95\xb2\xa2\x92\x00\xa9\x78\xe9\xc0\x2c\xf0\x40\x42\xb4\x46\x81\xd6\x09\x50\x49\xb8\xa6\xbf\x01\x70\x66\xac\x05\x79\x60\xd0\xc2\xe5\x53\x00\x62\x12\x7e\x20\x55\xa1\xc2\x22\x66\x9d\x37\x09\xd3\xf0\xda\x3b\x2e\xe5\x23\x03\x50\x15\xb7\xb8\x60\x9c\x43\x03\x73\x90\x40\xe6\x05\x71\x40\x27\x93\xdc\x85\xac\xd8\x8a\x26\x62\xd1\x51\x05\xc5\x5e\xe4\x2d\x95\x12\xe8\x57\xc0\x47\x00\x42\x47\xf3\xf0\x24\x04\xa5\x07\x08\xe3\x9f\xfc\xd4\xc5\x19\x07\x33\xfb\x28\x8a\x9a\x13\x71\x32\x56\x94\x88\x09\x39\x4c\x1c\x43\x45\x79\xf3\x9d\x7a\x5f\xb0\x9c\x33\xf4\x1b\xed\x26\xb9\x01\x00\xf0\x20\xcc\x56\x5c\x97\x1f\x3d\x4c\xab\xb7\x3f\x01\x2f\x20\xd0\xb1\xd8\xcc\xd5\x48\xe8\xf0\x98\xa7\xbd\x54\x1e\xbe\x3d\xcf\x3f\x43\xe5\x70\x97\xe5\x91\x1b\x5d\x20\x23\xaa\x6a\xfa\xa4\x76\x57\xa7\xf0\x13\x7b\x0d\xa1\x9c\x1f\xcd\x30\x58\x5c\xea\xa0\x6e\xe3\x79\xa4\x9e\xa9\x1d\x1a\x37\x40\x4a\x8e\xb9\x68\x2e\x09\x96\xdd\xe8\xe0\x86\xc4\xf9\xdd\xb0\xe9\x80\xb7\x74\x5a\x14\x43\xeb\xd2\xca\x91\xdd\x0d\x8a\x81\xb6\xc2\xcd\x4a\x93\xa0\x91\x78\x7a\x6e\xcc\x31\x4e\x1b\x02\x5b\xe3\xb8\x2c\x1d\x8d\xa6\x4d\x3e\x2f\x7e\x3e\x3f\x74\xbf\x67\xa2\xf1\x66\x39\x90\xf5\x1a\xbc\x3c\x7f\xfd\x32\x1b\x91\x7b\x48\xa7\x54\x0c\x7a\x9a\xa5\x07\x16\x4e\x44\xbf\x23\x0f\xc3\x27\xb7\x8d\x9f\x75\xed\x79\x68\xb5\x11\xd0\x18\xe1\xd2\xc7\x85\x7b\xec\x36\xed\x59\x3b\x19\xc5\x9e\x64\x83\x6c\x8f\xa1\xef\x4c\x19\x9d\x40\x82\xa3\x13\x3d\xd0\x69\xd4\xe3\x98\xd8\x30\x39\xb2\xb0\x72\xf7\x48\x8a\xf7\xc9\x51\x29\xbc\xb0\x3f\x6c\x11\xe0\x9f\x63\xa0\x42\x47\x54\xd9\x85\x03\xbb\xcc\x0b\x7d\x1b\x1d\xfa\xbe\x70\x4f\x3a\x71\x98\x70\x44\x67\x9b\x30\x98\x0c\x41\xc6\x0a\x9d\x4a\x6b\x7f\xd1\x84\x6a\x43\x9e\x9d\xdc\x78\x3d\xf0\x04\x73\x4e\x78\x5a\x9f\xa6\xfc\xdb\x09\x43\xda\xb1\xaa\x5c\x0f\x26\x05\x96\xe6\xf1\x88\x97\x0b\x8a\x00\x2b\x49\xe3\xfb\xb6\x9e\xd8\x3a\x26\x74\x3d\xf7\x03\x07\x3a\x0c\xc6\xd5\x0c\x16\x6b\x8f\x0f\xdd\xb3\x53\x7c\xdb\x9d\x11\x15\xbc\xa1\x80\x3d\x02\xd7\xc4\xd0\xa7\xc2\x5a\x39\x3f\x47\xab\x32\x2e\xc5\xc4\xe0\x73\xa3\x54\xd4\xfc\x00\xac\xfa\x64\x46\x30\xfd\xe7\xc7\x8f\x26\x4a\xcd\xc7\x47\xf7\x73\xa7\xf2\x0f\x9d\x7b\xf8\x2e\x8c\xd1\x09\x20\xb4\x88\xfb\xd2\x2f\x0c\x45\x78\x83\x65\xda\x75\xd8\xdd\x14\x8c\xea\x0c\x67\x52\x48\x7f\x82\x86\x4f\x84\xda\xd2\x1e\x67\x6a\x7d\x46\xeb\xc2\x50\xe6\x79\x6b\xa8\x8a\x31\x7f\x6e\xc2\xa3\x8b\x85\xc0\xda\x8e\xb9\x35\xaf\x1f\xe0\x94\x5b\xa6\xae\x84\x6e\x1b\x62\x29\xd5\x88\x4b\x4b\x20\x05\x63\x1e\x61\x20\x61\x34\x22\xcc\x04\x80\x8b\x39\xf6\x56\xec\x9b\x60\x9c\x6f\x7d\x71\x9e\x89\xde\x68\x31\x47\x4c\xe2\x23\x7a\x20\x3e\x5f\x04\xc5\xe6\xb9\x1e\x2c\x23\xfa\x9d\x29\x2c\xf1\x2c\x42\x16\xe5\x68\x1a\xb1\x7e\x99\x66\xb1\x44\x5c\xf8\x4b\x3e\xad\x93\x94\x10\x5a\x53\x05\x98\xd3\x39\x4c\xc5\xba\xde\xcb\xe4\x03\xe8\x41\x83\x5f\xe7\x3a\x3b\xc3\x3d\xd2\x44\x95\x90\x52\xc8\x25\x55\xb2\xa4\xc3\xdb\x30\x4e\xd0\x60\xd2\x8e\xd4\x54\x47\x22\xd9\xee\x74\xdc\x76\x84\x39\x40\xa0\x6d\x46\x95\x44\x28\x38\xab\xea\xcc\x17\x28\x9a\x9d\x0e\x2d\x86\x4d\x91\x94\xca\x99\x28\xab\x86\x38\x05\x83\x28\x26\x7a\x80\x26\xad\xac\x32\xca\xc4\x41\x00\x9e\x8b\xf5\xa0\x73\xf3\x64\xa8\x89\x9a\x5c\xa1\x86\xa0\xd4\x3e\x0c\xa0\x91\xb2\xd1\xb1\x57\x82\xef\x5b\xd0\x31\xe3\xec\x63\xf0\x9f\x87\x7f\xfe\x3f\x14\x78\x18\xba\x81\x3e\x3f\xb6\x87\xc8\xa1\xc6\x27\x19\xc5\x5c\xac\x44\xa7\xd9\x08\xf3\x9e\xbb\xbb\x0c\xe1\x91\xcf\x52\xe3\x4c\xa3\xcb\x0c\xa2\x81\x11\x54\x4e\x99\x29\x6b\x6c\xf7\xa5\x5a\x9e\x81\x76\x02\xcd\x0f\x88\x34\x8a\xa9\xce\x5a\xa3\x34\xcc\xd8\x3f\x74\xd4\x39\x82\xde\x39\x52\x79\x9f\x90\x7d\x49\x7a\xc2\x9c\x52\x85\x75\x2b\xd3\xf9\xaa\x63\xdb\xbf\xac\x27\x8f\xb1\x9d\x0f\xda\x7a\xb0\x87\xa9\x4b\xbc\x7f\xe3\x4e\x0d\xaa\xdc\x09\x2f\xd2\x4f\x3a\x12\x7b\x4e\x72\x4b\x3b\x9b\x1e\x45\x92\x12\x6d\x1c\xf9\xed\xfb\x4b\xe2\xca\xcb\xd3\x57\xa7\x97\xa7\x43\x2f\xb4\x45\xfb\x39\xc6\xc3\x38\x92\x46\x3b\x06\x0a\xbf\x93\x17\x2a\xcc\x42\xe9\x62\xe9\xaf\x84\x13\xcb\x39\xf6\xad\xce\x2a\xb2\x67\xd6\xda\x1d\x05\x7c\xd9\xe2\xaf\xee\xa1\x35\x45\x05\xd6\x5b\xd7\x14\x80\x45\x4e\x1e\xd4\xc6\x4d\x68\x3d\x53\x3b\x34\xc6\x4d\xe1\x48\xb8\x0a\xcb\x96\x08\xa8\xde\x15\x24\x94\x56\xe8\x1d\xe9\x98\x72\x60\x7f\x94\x43\x54\xce\x65\xd3\xba\x25\x18\x9c\x9d\xee\x37\x6b\x01\x14\x04\x10\x60\xb0\x49\x6c\x14\x25\x33\xfe\x21\x88\x37\x18\xb4\x77\xb0\xa0\xd0\x0d\xc7\x9d\x33\x34\x6e\x58\x75\x24\xf0\xd6\xd3\x1b\x5c\xa8\x13\xce\x7f\x60\xb0\xc6\x60\xd3\x65\xe0\xdb\x7a\xe4\xf8\x78\x93\xcf\x4d\x56\xc0\xbd\x0b\x8f\xc9\xd0\xa3\x3f\xa0\xbf\xfe\x51\x0d\x1e\x1b\x33\x31\x0d\x11\xf7\xc0\xa6\xd1\x56\xa2\x07\xda\xa3\x9c\x71\xca\xb8\x7c\x8c\xac\x3e\x01\xbb\x07\x99\x17\x26\x76\x59\xd7\xce\x22\x8c\x46\xc2\x23\x72\x4a\x2b\xf4\x95\xad\xec\xc8\xd5\xf1\x80\x88\xa0\x67\x4a\xf4\x9f\xd9\x76\xc5\x1f\xc2\xeb\xb0\xb4\x31\x1d\x07\x70\xde\x2b\xc0\xe6\x3b\x39\x7f\x77\x61\xa7\xc4\x3f\x62\x0e\x29\x95\x12\x30\xa2\x60\xa9\xe4\x22\x8d\x93\x50\x42\x25\x72\xb6\x80\x37\xc0\x86\xc1\x9d\xb2\x01\x39\x09\xa6\x5b\x68\x0f\xbf\xfc\x3f\x3a\x24\x83\x84\xe1\x19\x58\x75\x49\xaa\x74\x5c\xf6\x72\x53\x81\x8d\xdf\x22\x63\x3a\x03\xd2\xbf\x77\x5c\x3d\x70\x33\x9f\x1b\x6f\x15\xe0\x63\x8a\x50\x46\x45\x45\xde\x86\xf2\xc6\x5b\x30\xda\x40\x7c\xbf\x82\xe9\xbe\x6e\xbe\x77\x70\xa8\x6d\x84\xd7\xe2\x55\x9b\xf0\x23\xed\x54\x36\x72\x53\x09\xcc\xc3\x6b\xb5\x88\x50\x25\xcd\xc3\xcf\x8b\x36\x3a\xc2\xf3\x2c\x75\x34\xbb\x6a\xc5\x1d\x7e\x39\xac\xd1\x40\xa2\xda\xac\xf2\xc4\xbf\x69\x05\x7e\x80\x02\x11\x3a\x16\x44\x50\xb3\x28\xe1\xe9\x1d\xec\x9b\xac\xa4\xf1\x5d\x37\xe3\x1e\xdd\xa5\x5b\x46\xdc\x42\x55\x3d\x29\xae\x4d\xaf\x43\x13\x73\xce\xc6\x4e\x1a\xb2\xa7\xe5\x99\x7e\xe5\xff\xc9\x96\x48\x36\xe3\x25\xe6\x53\x19\xa5\x6f\xf3\xba\xf5\xe1\x27\x5b\x96\x4e\x96\xaf\x16\x21\x3a\x7c\xb0\x6e\x88\x77\xc0\x40\x71\x41\x84\x03\xbc\x77\x0f\x2b\x3a\x9d\x1d\xd8\x99\x5f\x38\xd8\xdc\x66\x71\x54\x4f\x2f\x4a\x47\x72\xf7\x4b\x0e\x64\xb5\x40\xc0\x66\x5e\xea\xfb\x55\x81\x4e\xd7\xc7\xa5\x7c\x88\x47\xe3\x86\x59\xc5\x90\xf3\x84\x28\xa5\x24\xac\xdc\x52\xd8\xe7\xa5\x87\xb7\x80\x12\x4a\x92\x13\x99\x96\x6d\x69\x12\xa6\xf1\x74\x46\x49\x69\x98\xc5\x3e\xe6\xc8\x5e\x24\x57\x16\x0e\x71\xf3\x19\xb0\x8d\x5c\x51\xd2\x91\x2a\xe9\x78\xde\xdf\x76\xf1\x75\x84\xd3\x06\x4f\x17\xb6\xe2\x83\xbf\x7e\x4d\x64\x1a\xd2\xf9\xbf\x13\x19\x5b\xe6\x88\x15\xd3\x3d\xf4\x80\xfb\x47\x0d\xab\xba\xc6\x8c\xb7\x5a\xaf\x56\x6c\x03\x3a\x66\x8f\x9c\xcb\x41\x95\x33\xad\x13\x59\x96\xe4\xb7\x81\xb2\xc4\x70\x87\x47\x1b\xfd\x26\xda\xa1\x7a\x7f\xea\x52\x5f\x0c\xab\x91\xbe\x46\x0d\x66\xf6\xf5\x9a\x6e\x3a\x8e\x30\x7a\x64\x6f\x8e\xe4\x94\xd3\x09\x56\xee\x48\x1f\xf1\xdb\xe8\x2c\x45\xb5\xcc\xab\xe0\x1a\x19\xfb\x22\xa8\x2c\x27\xfb\xcd\xb1\xa3\xb5\x70\xf0\x9a\x47\x38\xe4\xa0\x27\xda\x6d\x2c\x69\xa4\xe9\xf5\xd6\xd4\x38\x9b\x2c\x9f\x28\x1a\x98\x79\x8e\x82\x6f\x65\x40\xc3\x3d\x8d\x73\x7d\x77\xff\xd4\x50\xfe\xe9\xe7\x06\xa4\x6b\xa9\x79\x74\x91\x49\x55\xd1\xe1\x78\x43\x94\x89\x17\xc5\x71\xcf\x09\x6c\x3e\x95\x54\x29\xfe\x7a\xd0\x67\x22\x93\x05\x2e\xa2\x6f\x29\x43\x13\xa2\xfb\x49\xd7\x16\x64\xcc\xa8\x71\xa6\x08\xa7\x32\xfe\x47\x75\x8e\x77\xb4\x6b\x90\x5d\x9f\x55\x27\xe1\x53\xa5\x06\xea\xe1\xd1\xd1\x7d\x1f\x0c\xf0\x49\xf3\xd8\x26\x29\x96\x93\xd7\x4d\x20\xa7\x45\x26\xcc\x73\x32\x01\x4c\xfa\x0e\x08\x05\x51\x02\x13\x14\xcc\x1b\x68\xef\x62\x56\x35\x71\x66\xbe\x28\x8c\xc1\x58\x1a\x1c\x1e\x1e\x3a\xb1\x24\x60\x5f\x3f\x49\x68\x67\xd0\x4d\x48\x54\x75\xee\x96\x48\x60\x06\xc4\x15\x38\x81\x30\xc3\x4e\x56\x87\xa4\x9b\x5b\x86\x9e\x76\x22\x3a\x08\x25\x22\x54\x48\xaa\xb3\x9a\x43\x27\xdf\xa9\x68\x5d\x73\xf2\xf2\x71\x40\x87\x55\x8a\x32\x04\x84\x74\x3a\x3b\x3a\x75\xdc\x34\x6f\x7e\x8a\xec\x22\x04\x62\x85\x5e\x29\x46\xe5\xb0\x95\x89\xc7\x96\xe3\xfe\xca\x36\xaf\x0c\x0d\x1b\x2b\x1c\xf4\x66\xac\xd3\x0f\xd3\x45\x06\x5e\x02\xf5\x30\x60\xe6\x2e\xc5\xd7\x3b\xc9\x09\x0a\xc9\x0d\x4e\x62\x27\x91\x1c\xb7\x1c\x43\xfc\x39\xaa\x8c\x2f\xcc\xea\x7f\x90\xbf\x12\xe6\x18\xbd\xcb\x2a\x89\x94\xb0\xa4\x8d\x5e\xf2\x34\x71\xab\x48\xbc\xc2\x8b\x96\x55\x55\x14\xcb\x75\x10\x49\x68\xa0\xf0\x8f\x3f\x11\xde\xcf\x5c\xab\x0e\xc2\x01\xab\x1a\x88\x7f\xeb\xa5\x7f\x7a\xee\x22\xa2\x92\x36\xbe\x8f\x68\x63\xda\xc4\x90\x3b\x14\x08\xbf\xbb\xdc\x0e\xfa\x49\xa3\xdf\xb8\xd6\xac\x01\x76\xcc\xd7\x82\xc4\x70\x16\x13\xb1\xe0\x94\x5d\x10\xba\x6c\xca\x1a\x0d\x4f\xde\xe4\x9d\xa9\xbc\xd3\x68\x99\x7d\x87\xa7\xe9\xf1\x48\x9b\x9a\x97\x0d\xee\x23\xda\x2b\x26\xdb\xae\xf9\xb8\x47\x5f\x1d\xd6\x1e\x1c\x39\xe1\x05\x16\x27\x01\xf3\x38\x57\xf8\x1b\xfe\x85\x39\x95\x25\x86\x28\x9d\xf0\x70\x1b\x23\xd0\x3a\xe7\xe4\x68\xef\xfc\x03\x29\x1e\x17\xed\x00\x38\x33\x57\x15\x29\x9a\xe9\x7a\x44\x27\x2f\x76\xc1\xb1\x19\x97\xba\x3b\xf1\xd5\xfb\xaf\x07\x16\x66\xf0\x02\xc8\xf9\x02\x65\x7a\x49\xaa\x94\x33\x6a\xb5\x32\x45\x53\xff\xfd\x6f\xbe\x95\xff\xfe\xeb\xa1\x03\x22\xfa\x11\xf0\x19\x87\x32\xbc\xef\x48\x39\x6b\xea\x79\x2f\xeb\x1f\x01\x99\xca\x07\x35\x97\xe2\xfd\xd7\x75\xa5\xf2\x99\xcf\x7d\xf8\xbc\x18\x93\xad\x83\xb8\x15\xb6\xe2\x74\x5f\xf7\x72\xd7\x44\x29\x3c\xd3\x1e\xb4\x55\x7c\x8d\x6a\x42\x26\xd0\x0a\xc9\xea\x89\x0a\x05\x7c\x8b\x81\xa3\x08\x00\x4d\xcb\x70\xe7\x54\x28\x21\xcb\xbf\x82\x8f\xdf\x9b\x11\x35\x24\x5f\x1e\xb5\x4e\xfe\x5b\xdb\x83\x9f\x7e\x26\x30\x0c\x32\x6f\x8e\xf8\x86\xcc\x57\xcd\x1f\xa0\x67\xdd\x32\x16\x3e\xfa\xe9\xe7\xaf\x1b\x57\x4e\x7f\xfa\x0e\x4d\x72\x5c\x2f\xfa\x22\x5d\x75\xa4\xaf\xb7\x7e\xb6\xc6\x86\x9b\x8e\xc9\x87\x57\x68\x1c\x56\x57\x6d\xe5\x18\x13\xdf\x43\x63\xa3\xed\x80\x60\x29\xad\xa0\x62\x39\x13\xe4\x25\x8a\x1a\xa1\xba\xa4\x6a\xce\x0a\xa5\x26\x6b\xfa\x17\x5f\xf6\xde\x80\x7b\xaa\x89\x46\x18\x9a\xe7\xfe\x8f\xe0\x5c\x6b\x0d\x27\x83\xdb\x99\x57\x83\x53\xb4\x19\x04\xcb\x02\x24\x7e\x36\x81\x33\xf0\xa1\xfa\xf2\x45\xdb\x7a\x98\x2b\xc5\xbc\x34\x7d\x1c\xd7\xbf\x32\x2e\xeb\x41\xaa\xd5\xb6\x94\xae\x2d\x63\x09\x39\xe9\xcb\x97\xaa\x70\x78\xd3\x6d\x47\x34\x2a\x21\x09\x0c\xa8\xba\x50\xb4\x8b\xc2\x7c\xd5\xe8\x8e\x33\x47\x06\x3a\x07\xdb\x28\xff\xbb\x35\x85\x1b\x6f\x5d\x2b\xff\x9b\x95\x83\x37\xdd\xa6\xf9\xdf\xa4\x0e\x28\x88\xee\x42\xb1\xaa\x2a\xf0\x30\x7a\xac\x8a\x40\xe7\xf9\x16\x36\x93\x24\xcd\x4a\x93\x72\xdf\x6a\x50\xea\xb7\x4f\x16\xf2\xe4\xba\x41\xea\x0b\x8b\xc9\x5d\xa4\x77\x06\x55\x50\x56\xe5\x5b\x75\xbc\xcd\xb0\x8e\x79\x87\xe5\x08\x4d\xa1\xa5\x03\x89\x8e\xa5\x19\x66\x2c\xe0\x6d\x7c\x46\x34\x9e\x2a\xc7\x1e\x46\x7b\xf5\xa3\x3d\xcb\x20\x8b\xd6\x37\x7d\xab\x4f\xeb\xf6\xae\xff\x46\xcb\x51\x48\x0f\xfb\x4b\xdb\xb5\x7d\x0d\x30\xcd\xea\xcf\x16\xd8\x67\x0b\x6c\xe7\x2c\x30\x47\x78\x3f\x9b\x60\x7f\x44\x13\x6c\x13\x02\xf0\xd9\x06\xdb\x45\x1b\x6c\xcd\x92\xf0\xd9\x08\xdb\xa2\x11\xe6\xf1\xae\xf1\x10\x93\x12\x3c\x6a\xa4\xc5\xf4\xb4\x1a\xe7\xea\x47\xc5\xad\xcc\xc2\x67\xce\x92\xb2\x47\xc2\x7a\xb9\xf8\x57\x30\x6b\x00\xf8\x84\x27\x9e\xdc\x9b\xb8\x60\xd7\x59\xe2\x26\x11\xae\x1c\xe4\xce\x3d\xc3\x3d\x91\xff\xce\xc1\xd5\xa4\x63\xd9\x8a\x5a\x0d\x07\xb6\x6b\x27\xa7\x7b\x40\x2b\x34\x5d\x99\xc0\xef\x14\x67\xdb\xd5\x28\x49\xe5\x26\x90\xfa\x98\xd6\xee\xe9\xa9\x0d\x4a\x95\x37\x4f\xf5\xac\x0c\xc1\x5a\x5c\xa2\xd6\x8f\xef\x7a\x84\xca\x9f\xa2\xa7\x40\xb9\x47\x19\xf5\x83\xff\xa5\xa9\xba\x19\xc1\x22\x13\x6a\x1e\xa5\x3d\xa3\x6e\x11\xc9\xe2\xeb\xaa\xdf\xc6\x79\x51\xda\xa4\x16\x8b\xb7\x37\x6e\xf7\xe2\x2c\x66\x57\x05\x26\x66\xa6\xe5\x7c\x52\x36\x0e\x6b\x52\xe6\x10\xe1\xce\xb3\x90\x2d\xd1\x6d\x3d\x12\xea\x4f\xb1\x51\x09\x9d\x4f\xd6\x0e\x11\x5d\x9a\xd0\x74\xed\xd9\xd2\xf9\x69\x61\xd2\x4d\x2b\x08\x56\x10\x2d\x61\x2e\x55\xea\x22\x6d\x59\xea\xdd\xc2\x90\x33\x1f\x53\xd9\x9a\xb2\x99\x24\xc3\xae\x2c\xa9\x88\x70\xd5\x44\xc1\xf7\x07\x3c\xe8\x8b\xa3\xc6\x88\xc7\xee\x46\x64\x24\x7b\x4d\x02\x32\xa6\xc4\x86\xfe\x1d\x6b\x6b\x72\x55\x9f\xc6\xd4\xf7\x6f\xc2\x42\xf1\xa7\x74\xf7\x4e\x28\xae\x43\x33\xf4\x9b\x04\x62\x4c\xe2\x2e\x6b\xfc\x48\x25\x0a\xaf\x17\x5c\x12\x55\x8f\x82\x53\xce\x06\xe6\x87\x71\x21\xb9\xd1\x6f\xb9\x16\x44\x25\xcf\x86\x5f\x39\x9b\x4c\x54\x14\xc3\x10\x6f\xe5\xaa\x02\x40\x8d\xf5\x84\xa6\x8d\x6f\xf7\x78\x09\x2f\xbd\x14\x53\xc0\xca\x8f\xf1\x64\x79\x7c\x1d\xc3\x6a\x21\x64\x8e\x18\xa7\xe7\x22\x19\x04\x9d\xc0\x3a\x70\xd3\xcb\xa5\x32\x67\x23\x76\x7c\xc3\xd5\x79\xb9\x00\x80\x9a\xb0\x19\x78\x29\xde\xf8\x56\xeb\xc3\xb2\x69\x22\xbc\x8b\xfc\xa3\x7f\x45\x0c\x7f\xfa\xa7\xff\x13\xad\x0c\xff\x27\x58\x1a\xe1\xdf\xf1\x86\x84\xa1\x4f\xc3\xe9\xf0\x59\x3a\x9d\x95\x4d\x5c\x6f\x96\x89\x5f\x25\x62\x53\xfa\x03\xe3\x8f\xa3\x32\x4f\xea\xbf\xd6\x81\x20\x2a\xdc\xc4\xe3\x72\x2e\x6c\xaf\xb3\x59\xa1\x9a\x60\x6b\x01\x9d\x81\xbb\x9a\x95\x25\x9e\xde\xbb\xa4\x18\x25\x31\xbc\xf6\x63\xd3\x8f\x15\x3a\x66\xe3\x71\xa1\xaa\x6f\xf2\x8f\xff\xac\x33\x61\x3e\x5f\x8a\x51\xae\x54\xfa\x63\xd3\x8f\xce\x9b\x0d\xc8\x03\x75\x16\x46\x1d\x6f\xb4\x3b\x12\x89\xff\xc4\xeb\xcf\xfe\xe4\x74\x69\xc6\xbc\x03\xff\xf2\x5f\x69\x00\xa5\xb7\x78\x0c\x5b\xc0\x1b\xb6\x30\x74\xd8\x88\xeb\xaf\xac\xe1\x08\xbc\x13\x2f\xcd\x4c\xee\x37\xc5\xca\xd4\xf8\xd6\xf1\x5f\xb9\xf1\xf7\x04\x1b\x8f\x54\xc1\xbf\x90\xb6\x11\x22\xbb\xbf\x84\x1f\xab\xd7\x1d\xaf\xb2\x8f\xaf\x81\x08\xb5\x6b\x90\x5c\x8f\xea\x9b\xd9\xd5\x55\xa2\x8a\xfa\x43\x35\xfa\x70\x92\x80\xfe\x6f\x7c\x72\x5e\xab\x9d\x3a\xca\xf2\xfa\x20\xa0\xfd\x93\x2c\x2c\xab\xbf\xdf\xe4\x6a\xfc\x06\x2f\x83\x63\x81\xd1\x5a\x6d\xa8\x9b\x72\x92\x5c\xe8\xf2\xa3\xd5\x87\xf0\x17\xde\x1b\xff\xe1\x26\x2e\x59\x11\x56\x5f\x48\x33\x82\xfa\x04\xa1\xac\x8f\x2d\x4f\x89\x1f\xd5\x67\xa0\xb6\x46\x71\x79\x5f\xff\xb9\x94\x8c\xf3\xda\x68\xf0\xe8\x42\x25\x14\xe3\xa9\x3e\xe2\x6b\xb4\xa7\x60\x5e\xbc\x08\x6a\x5a\x9c\x6e\xb1\xd6\xbe\x98\x5d\x4d\xe2\xb2\x85\x1d\xe5\x55\x16\x79\x90\x35\xa5\xc2\x90\x5d\x51\x3b\x52\x38\xc1\xcb\x8f\x68\x0a\x9a\x92\xae\x91\xad\xab\x1c\x6a\xe1\xb3\x77\xdc\x73\x53\xd5\xb1\x98\xc5\x65\xa8\xaf\x4e\xcf\x0a\x29\xfa\x84\x57\x46\xff\xe5\xd6\x66\x82\x87\x74\xb3\xbd\x72\x53\xb3\x6a\xf0\xc0\xa8\x9c\x77\xec\xcd\xc2\xc9\xb8\x02\x98\x6f\xb4\x0d\xe0\x0d\x6d\xc9\xe8\xcd\xee\x13\x40\xce\x18\x80\xce\xb5\xe6\xe3\xe0\x1b\x66\x2c\x40\x11\x51\x14\x0a\x4b\xf8\xd9\x7a\x88\xa0\x17\xb0\x78\x02\xde\xd5\x76\xbe\xda\x2b\x6e\x42\xcc\xe1\xdc\xeb\xba\x07\x6d\xa8\x38\x74\xbf\x35\x92\xe4\xd0\xd6\x5a\x5e\x98\x2d\x6d\xa5\xcb\xa9\x6c\x08\xaf\xce\x46\xa6\x7e\x92\xd4\xc0\x1a\x48\x51\x00\x5a\x54\xfb\x52\x75\x09\x87\xa1\x76\x85\x58\xf0\x4e\x21\xc6\x58\x34\xde\xad\xe7\x14\xa7\x09\xa5\x35\xa7\x5a\x91\x95\x54\xc1\x18\xef\xa9\x20\x52\x38\x80\xdc\x96\xd3\x17\x92\x0c\x00\x74\x65\xd6\x16\x5e\xc0\x72\xc4\xba\x57\x14\x23\x43\xd3\xe7\xa6\x43\x89\x79\xea\x5a\x89\xe8\x22\x34\x1c\xdf\x11\x16\x27\x7a\x26\x60\xa5\xe4\x92\xa1\xe5\xe5\x5c\xb9\xc2\xb7\xde\x1a\x85\x5d\xb1\xb8\x1d\x75\x2f\x6a\x47\xdd\xad\x30\xc2\x3c\xc6\xe8\x3a\x52\xa3\x8c\x8a\x6a\x60\x60\xb3\x19\xb7\x13\xfb\x82\xa0\x95\xa8\x71\xe9\x6f\xa0\x60\xc1\x79\xdb\xa5\xcc\x2c\x46\x9b\xc9\xfe\x67\x49\x37\xb5\x3e\xae\x9c\x8a\xd1\x14\xc3\x1c\xec\x37\x42\x70\xe1\xbd\x24\x83\x0a\x2c\x2e\x7d\x18\x16\xb9\x75\xe8\x08\x68\xad\x4d\x56\x1a\x73\x9d\xb4\x73\x69\x14\xf4\x6b\x50\x8b\x55\x3b\x4b\x99\xf1\x32\xed\x1d\xf0\x57\x6c\xf0\x40\x15\x33\x09\x2b\x3d\x9c\xa9\x7f\x50\x39\xbc\x99\x71\x3b\x26\xb9\xcd\xd6\x3e\x97\xb7\x8c\xd1\xab\xc3\x1a\x62\x95\x2a\xd3\xb3\xc2\x9e\x35\x53\x7d\xa1\xb8\xbe\x7a\xf9\x33\x7b\xcd\xbd\x61\x46\x77\x48\xf2\xec\x33\x5d\x5e\xd2\x62\x43\xb5\xca\xb9\x95\x46\x4b\x83\x0d\x9b\x35\x3e\x6f\x0e\x1b\x58\xa7\xbb\xbb\x58\x04\x85\x27\x52\x91\xbd\xa2\x8d\x95\x84\xbd\x27\x8a\x59\x2d\xb5\x46\xcc\x78\x72\x31\x9e\x2b\x58\x91\x21\x33\x4b\xf1\x06\xa8\x7f\x13\xf8\xf2\x0e\x6f\x38\x58\x9d\xea\xf4\x31\xf0\x2a\x8e\x9b\xe9\x2b\x3d\x92\x6a\xc7\xe4\x0a\xeb\xd7\x0d\xd2\xec\x4e\x8b\x3a\x28\x47\x9c\xc3\x73\x50\xfb\x13\x82\x0b\x62\x10\xc2\x38\xb6\x06\xc7\xd0\x7f\xc8\x45\x41\x89\x31\x53\x2a\xec\xed\x53\xa5\xa1\xa3\x91\x48\x2a\x6d\x5e\x3e\x71\x63\x6c\x64\x51\xbf\x4d\xfe\x97\xfd\x6a\x44\x80\xbc\x6f\xc4\xd3\xc0\xd1\xe4\x71\x5b\x47\xdd\xd2\x22\x57\x13\xbe\x07\xfa\xda\xfc\xd8\x97\x28\x24\x81\xe6\xc4\xc5\x4a\xe0\x95\x02\x07\xb5\x0f\xe0\x54\x3a\x66\x2e\xd4\x8b\xf3\xa8\x01\x26\x2d\xfc\x05\xde\xfd\xae\xc6\x6d\xdc\x13\xdc\xfd\x1e\x70\x47\x6c\x2a\xcf\x23\xf6\x2f\xb3\x09\xf8\xf5\x97\xd9\x69\x1a\xd9\x3d\x78\x1d\xc8\x50\xe9\x70\xde\xa6\xa5\x5f\x4f\x2b\x52\x7c\x2a\xd9\x07\x29\x1c\xf4\x21\x91\xb2\x1c\xa2\x8b\x00\xd9\x94\xa3\x94\x58\x72\x46\x1e\xd1\x0d\xf0\x66\x44\x3b\xf2\x56\xfa\xe0\xce\x39\x16\x1b\xc0\x7e\x8e\xa9\x97\x84\x75\xf5\xcd\x74\x51\xe3\x31\xb5\x6a\x03\x4b\x14\x4b\x5b\x9f\x8d\x75\xf5\xce\x86\xad\x8b\xd6\x5b\x10\xeb\x88\x4d\x72\x5f\xab\x98\xf0\xdf\xfc\x1d\x0d\xa6\x2b\xe8\x99\x9a\x34\xba\xf2\x95\xed\x66\x51\x2b\x0b\xe9\xed\x2e\xde\xbd\x5f\x1e\xd2\x98\xe1\x4a\x8a\x07\x63\xeb\x42\x69\x81\xc1\x35\xdb\x75\x9f\x3a\x7e\x9f\xcb\xca\x4a\x75\x3d\x7f\x02\x53\xc1\xd7\xaf\xf9\x49\xaa\xc2\x69\x2a\x48\xba\xe7\x30\x52\x34\xde\x60\x8f\xfe\x83\xa3\xee\xed\x93\x95\x44\x45\xbd\xe3\xca\x5e\x40\x2f\xb5\x6f\xe7\x93\x90\xb4\x39\x55\xc5\xcb\xe9\x36\xb1\x56\xd0\x27\x17\x17\xae\xc7\xae\x6d\x5d\x29\x93\xec\x3c\x31\xe7\x0a\x52\xbd\x2a\xce\x2b\x25\xec\x2a\xa6\x41\xa3\x92\xfc\xaf\x8a\x92\x44\x8b\x2f\x4c\x4e\xb5\x75\x50\xb7\x14\xc5\x9a\xd6\x35\xa4\x2c\xe3\x07\xb0\x7c\x0a\xaa\xf1\xf7\x27\x82\x48\x7e\x06\xc0\x26\x85\x82\x75\x52\xb4\x18\x6e\x3c\xde\xaf\x35\x0f\xec\xad\x76\x4d\x52\xaf\xdf\x26\x97\xf4\x19\xa0\xef\xb4\x5f\x75\x9e\x2a\x8e\x90\x69\xcb\x73\xcc\x35\x68\xc6\xf5\xd2\xe6\xd4\x40\xd1\x6f\xa0\xea\x3a\x65\xd4\x3c\xd8\x0c\x83\x27\x03\xfa\xf8\x00\x1e\xd9\x02\x95\xba\xb8\x57\xc9\xb5\xc0\xb0\xd2\xd6\xd4\xba\x10\x7e\x55\x33\x5f\x15\x60\x23\xa8\x39\x7d\x02\x4d\x8d\x86\x7a\x7d\x85\x95\x29\x84\xcd\x61\x56\xad\xe0\xb4\x63\xd4\x06\x94\xad\xaf\xa4\x27\x7b\x31\x9f\xf6\x55\xe2\x7f\xcf\xdd\x61\x44\xd3\x10\x1e\xba\xa7\x28\x2d\x68\xb2\x31\xd5\x47\x6c\x67\x8f\x2e\x82\x3c\x12\xfb\x91\x2c\xba\x0a\x3d\xa5\x0c\xdc\x98\x4b\x06\x49\x9d\x2e\x5b\x99\x14\xd6\xbf\x6e\x1c\xd6\xc2\x4c\x5d\xea\xd0\x3f\xe6\xaa\x33\xd7\xd5\x39\x14\xe9\x3a\xd0\x7e\xb4\xed\x26\x5b\x54\xc6\xd6\xcd\x20\x8e\xcd\x5f\x52\x9b\x29\x72\xeb\xb8\x70\xf3\x84\xf1\xac\x44\xf6\xba\xac\x2d\xea\x8c\x78\x9b\x2b\xee\x91\x33\x30\x73\x5a\xbe\xc8\x24\xb0\x45\x02\x1e\x85\x44\x19\xf4\x59\xc4\x39\xfd\x54\xe7\x57\x4b\x01\x14\xf6\x7e\x1b\xab\xc5\x3c\x3e\x1e\x6e\x92\xce\x9b\x22\xaa\x99\xea\xa2\x43\x91\xc9\x6b\x96\xfa\x01\xd7\xe9\xeb\x8b\x57\x70\x46\xdd\x26\x4c\x79\x59\xa7\x8c\xfd\xa1\x1e\xd0\x0c\xac\x63\x67\xc2\xb0\x45\x14\x92\x86\xa7\xae\x98\xf4\x68\x9e\x5e\xd2\x53\x3e\x73\x89\x00\x9a\x47\x5e\x6e\x51\x2b\x0e\xdd\xbc\x0b\xff\x21\x2f\xc0\x5a\xbf\x26\x2e\x0c\x16\xb2\x62\x77\xaa\x72\x6f\x43\xab\x4b\xf5\xd2\xe3\xb6\xf6\xc3\x68\x0f\x4b\x0f\xd3\xd6\x6a\xaf\x2d\x8a\xaa\xde\x27\x8a\x7b\x43\xd5\x4b\xbc\x9a\x7a\x51\x47\x74\x78\x9b\x24\xf1\x35\xae\xb6\xef\x66\x08\xda\xe0\xe3\x24\xe1\x42\xf3\x43\xd3\x76\x09\xcb\xa3\x97\x93\xa4\xb2\x01\x5c\xab\xb2\xa2\xff\xa5\x40\xea\x92\xb5\x95\xe8\xed\x5a\x8f\xa6\xce\x3d\xfb\x51\x32\x99\xe0\x39\x46\x0f\x21\xb6\x65\xfd\x72\xd3\x60\x40\xd8\xdc\xd0\x9b\xd2\x64\x76\x54\xa3\xd8\x7f\x08\xe9\x91\xa6\x72\x6c\x23\xff\xf6\xc0\x32\x85\xb5\xb0\x0e\xa4\x04\x7a\xb7\x80\xa1\x6c\xb9\x15\x45\x77\x4c\x8b\x18\x66\x20\xc6\xeb\x5e\xce\x3b\x4e\xe7\x9d\x58\xc8\x1d\x0c\xdc\xd4\x8a\x9a\xcf\x56\xaf\xc7\x1f\xf6\xdc\xe9\xcd\x56\x69\xe3\xab\x9b\xff\xc5\x3b\xbb\x9e\x18\xf9\xd6\x15\xc5\xca\xd1\x3e\x5a\x9e\xfe\x55\x06\x3c\xd4\x59\xab\xee\x9a\x01\x14\x3d\x72\x8f\xba\x97\x36\xcd\xa8\x23\xfd\x8e\x69\xd5\xe0\x1d\x97\x95\xa5\x37\xcc\xde\x4a\xdd\x6d\xe8\x04\x45\x7a\xb0\x89\xd7\x8d\xdd\x14\x39\x6a\x18\x72\xef\xeb\x07\xd8\x9d\x51\xf0\x86\x4d\x1b\xf4\x34\x2b\x76\xc5\xbe\xdb\xb2\xa4\x3c\xee\x7d\xe1\x93\x16\xc1\x07\x33\x12\x1b\x62\xce\xd8\x6f\xf9\x60\x3a\xcb\xa7\x18\xa8\x35\x97\x8d\xa5\xd2\xa2\xd3\x1d\xdd\x1e\x9e\x02\x42\x77\x2a\xc7\xee\x83\x77\xe1\xbd\xd3\xa8\xca\x70\x1b\xbf\x2d\x5a\x24\x18\x6b\x5e\xfb\xc1\x28\x5d\xd3\xb1\x1a\x76\xe2\x37\x99\xa3\x7c\x04\x7b\xa3\x5b\xf7\xb9\x13\x01\xfb\x31\x61\xb9\xb2\x75\x99\xd4\xec\x01\x0d\x53\x27\x87\x7e\xa1\x21\x88\x97\x25\x51\xc1\xe7\x37\x58\xbb\x51\x6a\x06\xb3\xc0\xca\xb6\xc3\x61\xec\xa7\x54\xb2\x3b\x92\xd4\x94\xb6\xe0\x0d\x8c\x06\x02\x44\x87\x2f\xdc\xec\x87\xcf\x5e\x48\xe6\xf1\x63\x7a\x21\x2e\xa4\xdf\x67\xae\x5b\x61\x3a\x00\xf8\xd9\xd7\xf8\xfe\x3b\xfc\x72\x80\x7f\xb9\xa9\x35\xcd\x11\x84\x63\x69\x0a\x1d\x36\xa8\x8d\x90\x0e\x16\x0a\xca\x2a\x83\xf9\x58\x75\xc4\x05\x1b\x2f\x3a\xe1\x63\x42\xad\x17\x43\x1d\x2f\x91\x53\xe4\x36\xfe\x9a\xc1\x9a\xd4\x54\x68\x1f\xc3\xb2\x93\xe2\x50\x95\x01\x6c\x71\xca\x97\xe7\xaf\x75\x26\xc8\x30\xf0\xba\x34\xe9\x63\x04\xe9\x30\x56\xe8\x8f\x3c\x42\x0d\xf4\x5c\x76\xdd\xd8\x52\x91\x32\xae\xdc\x70\x33\x52\xf1\xe0\xe4\xd3\x67\xf4\x8c\xbd\xfe\x17\xaa\xf5\x3c\x9c\x4a\x1f\x44\x46\xbe\xe9\x4a\xfe\x40\x3e\x30\xf8\x3d\x3a\xc4\x28\x13\xc7\x26\xaf\x55\x64\x83\x06\x72\x10\x2f\x16\xc6\x9c\xc6\x37\xe8\x3b\x17\x2b\xea\x04\xf8\x26\xc6\xe4\xdb\xb0\x7a\x3e\x6c\x76\x26\x7b\x93\x13\x00\xc2\xca\x97\x63\x00\xb4\xb8\x81\x27\x49\x46\x69\xa1\x2d\x98\x1a\xed\xe4\x1f\x3d\x6b\x5f\xc0\xf6\x33\xc1\x71\x63\xd1\x21\x15\x6c\xf4\x18\x58\x95\x9b\x83\x85\x49\x1c\xda\x13\x09\x3e\x1f\xab\x19\xd2\x0f\xce\x64\xd9\x2f\x2a\x46\x45\x6f\x1e\xf2\x8f\x47\xc1\xaf\xbf\x3f\x3e\x94\x52\x1b\xf3\xf7\x50\xa0\x24\x08\xcc\xf2\x6d\xc1\x65\xae\x82\xd1\x4d\x2c\xc3\x46\x69\xf1\x84\x90\x72\x99\xf0\x2c\x1a\x05\xb0\x7a\xd3\x7b\xd0\x31\x07\x3b\x53\x85\xbf\xb4\xa4\xfd\xc6\x38\xb9\xb7\xa6\x8f\x36\xae\x8c\x93\x34\x0e\xf2\xf0\x0e\xcc\xd3\xd7\xaf\xda\xf6\x37\xb0\x77\x9c\xac\xb7\x31\xbd\x4b\x44\x61\x07\xce\xce\xc2\xed\x6b\x78\x43\xa7\x3b\x59\x54\xf2\xbd\xa0\x0f\x86\x14\xbf\xff\xd1\xce\x62\xc8\x7f\x97\xaa\x5c\xeb\x7e\x3c\xf0\xd3\x7f\x7a\x05\x8a\x31\xe3\xd1\xe0\x65\x7a\x63\x11\x00\x55\x2a\x21\xbc\x76\x43\xf0\x86\x87\xe5\xa5\xff\x7c\x0c\xb4\xa4\x43\x7e\xd1\x8c\xf0\x1f\x6c\x59\x51\x94\x61\x1a\x61\xcb\x6d\xf8\x9b\xe8\xac\x37\x08\xee\x4d\xfc\x55\x14\xdf\x3e\xfb\x1a\x37\x48\xfc\xeb\xeb\xaf\x9e\xe1\xff\xef\xd7\x2e\xbd\xe9\x56\x7f\x45\xa5\xe9\xb7\xf9\x5d\xf2\x45\x0b\xee\x2a\xac\xaf\x85\xd9\x8c\x3f\x4d\xf3\xe4\xfe\x40\x88\x6c\x32\xee\xba\x88\x6d\x27\xd0\xa6\x6f\x07\x99\xdf\xa9\x24\x4e\xc1\x03\x28\x6e\xac\xb5\xa5\xbb\x9d\x4b\x52\xc4\x9f\xa8\xed\x39\xba\xfa\x2d\xf4\xe4\x62\xb5\x78\x4e\x33\x2f\x0f\x26\xb7\x85\xd1\x65\x75\xeb\xa1\x0b\xcb\x50\xe9\x50\x56\x8c\xb2\xa9\x72\x3b\xf0\xc9\x17\x71\x09\x8a\x67\xbc\x5f\xbd\x06\x7d\x92\xa5\xe3\x24\x1e\x95\x03\x03\xcd\x0b\xd7\x68\xd3\xc9\x14\x55\xfc\xdf\x5a\x73\x5b\xac\x6c\xad\x12\x6a\x4e\x15\x16\x3f\x47\xdd\x86\xb6\xa9\x9b\x3a\xc2\x89\xc7\x43\x50\x7c\x33\xca\x60\xa9\xdc\xce\x14\xdb\xda\x04\x55\xfc\x7c\x01\x75\xdb\xa1\x14\x75\x95\xa2\x22\x38\x77\x26\xac\x8e\x4f\xa6\x1a\xef\x04\x4e\x1c\xcd\xe6\x43\x3b\x64\x42\x35\xf7\xd5\xe5\xd7\x58\x36\xd4\x8c\xad\xeb\x13\x5c\xfe\x56\xbd\x59\xf8\xec\x0b\xb4\xf9\xea\x05\x90\xbe\x78\xd6\x55\x19\xca\xb5\xf0\xb3\x0f\x01\x77\x4c\xa4\x2c\x71\x20\xae\xb5\x28\x4d\x53\x3a\xf4\x36\xb0\x08\x53\x3c\x9a\x25\x61\x5e\x4d\xc1\xc1\x13\xbf\x5c\x81\x40\x2b\xc9\xf6\x82\xed\x04\xb5\x98\xdc\x33\x71\x5f\xbf\xc7\x6c\x23\x56\x37\xb9\x56\x8b\x72\xbc\xec\x64\x59\x7a\xf4\x18\x15\x05\x02\x59\xcc\x69\xb6\x08\xaf\xbd\xa1\x84\x49\xb9\x85\x54\xdb\x5b\x4a\xe4\x4b\x98\x5f\xc5\x65\x1e\x62\x75\x29\x74\x78\xc3\xa2\xc8\x46\x31\xad\x5a\xe3\xc9\xdb\xce\xeb\x26\x75\x96\x2f\x9b\x16\x4e\xde\x2b\x89\x0b\x36\xa2\x71\x72\x5c\x5b\xcc\xd7\x4b\xd9\xb1\x1c\x03\xd6\x4c\x6b\x67\x75\x7b\xb8\xeb\x11\x00\x59\xab\x02\x99\x6e\xac\x4d\x63\x35\xb2\x4e\x3b\x1f\x80\x57\xbf\x65\x30\x2f\x65\x43\xa0\x17\xe9\xa7\x4a\x5a\x35\xfc\x8e\xb2\x56\xb5\x95\x87\x81\x43\xe8\xa1\x4e\x07\xbf\x04\x89\xba\x6c\xb8\x93\xcf\xc4\xe1\x19\x81\x2c\x98\xf9\x25\x31\x9e\x82\x88\xae\x73\xad\x95\x1e\x9c\xe9\xe6\x34\x8c\xc6\x97\x07\xe6\x31\x0e\x20\x93\xee\x93\xa0\xd0\x7e\x82\x61\x8d\xf6\x41\x1f\x15\x13\x2c\x71\xbb\x29\xdb\xd2\x73\xe8\x13\xa5\x68\x07\x55\xf6\x5b\x16\xed\xa9\xe8\x79\xde\x64\x3f\xda\xc6\xd6\x7a\xe7\xe5\x0c\x46\x0d\x39\x99\xb3\xf5\x1d\xb8\x97\x5f\x49\x5b\x9b\x98\x51\x76\x13\xc4\x66\xe2\xda\x59\xe1\xc9\xa2\x5a\x73\x6d\x3d\x2e\x3d\xc6\x2e\x6f\xad\x61\x49\xca\xb4\xb4\x5d\xf6\x31\x97\xd4\xed\x7e\x37\xfe\x68\x7a\xe6\x82\x69\x93\x47\x95\xbc\x53\x9f\x8c\x92\x6c\x59\x97\x2f\x03\x46\xbd\x19\x54\x95\xbc\x0d\xed\x1e\x52\x43\x90\x1b\x6a\x6f\xad\x05\xaa\x59\x5f\xb6\x1e\xe6\xb4\xfa\xee\x68\x8c\xf2\x0d\x41\xe2\x5a\x5d\x3e\x60\xda\x97\x2d\x22\xd2\xda\x4b\xe1\x42\x47\xc3\x24\xa7\x76\x5c\x6b\x6e\x6c\x3c\x59\x91\x9b\x55\x24\x85\xea\xf4\xe3\x2e\xa1\x13\xec\x4c\x69\x00\x9f\x51\x0f\x22\x17\x0b\x49\x05\xd5\x5b\xa8\xa9\x9f\xd7\xa6\x4f\xd7\xf6\x68\x7a\x87\x3d\x38\x39\xf9\x58\x97\x9d\xa8\xac\x36\xee\xe5\x2b\x84\x7e\x20\x12\xeb\xe9\x60\x4b\xfd\x5f\xa2\xca\x71\x53\x83\x62\xd6\x1f\x36\x9d\x5c\x5f\x26\x66\x42\x4a\x4f\xbd\x62\x41\xb6\xd9\xcd\x58\x4f\xde\xd8\x6e\xe2\x51\x30\x33\x4b\xad\x22\x0d\xa9\x53\xd6\xe3\xd0\x9c\x8d\xcd\x69\xd0\x3c\x72\xa3\x0d\x08\xb0\x9b\x4e\xbf\x34\x9f\x6c\xdc\xaa\xd6\x15\xa5\xa3\x1b\x0c\x96\x8d\x88\xc1\xe9\x00\x7f\x92\x76\xe5\xc8\x37\x34\x56\xdf\xd2\x9a\x6c\x9c\xd4\x23\x7d\x97\x91\xc3\x83\x54\x6b\xbc\xe0\x6f\x8d\x4a\x9b\x2d\x8f\xfa\x89\x43\xd3\xe9\xcb\xc8\xb9\xfa\xe9\x9f\x91\xe5\x62\x0f\x85\x78\xf8\x11\xa7\x74\xa0\x3d\x2b\x63\xee\x58\xe8\x54\x0e\x73\xbc\xf3\x5c\x5d\xc7\x05\x06\x17\xe9\x4c\x67\x9a\xf8\x6d\x94\xc4\x7d\x27\x19\x20\xce\x15\x78\xcf\xe2\x36\xfb\xa0\xea\xbf\xa3\x09\x80\x05\x3b\xf8\x7a\x81\x3e\xcf\x43\x18\xc3\x38\xc1\xac\x48\x5b\x23\x16\x36\x4b\xd7\x6d\xc4\xbd\xc1\xfd\x77\x55\xfa\x2b\x4c\x90\x86\x9d\x74\x59\xa2\xbd\x8d\xc6\x2f\xb3\xa2\x74\x32\x68\x3d\xaa\x09\x9d\x7c\xee\x38\x4e\xe1\xc0\x99\x82\x4e\xd6\xe4\x51\x43\xc1\x9d\x5a\x3c\xb5\xb3\x18\xcf\x29\xaf\x36\x6f\xde\xf1\xc7\x23\xb9\x5e\x8a\xff\x03\xcf\x11\x03\xb8\xa6\xa1\xc6\x73\xf3\xc4\x26\xbc\xd2\x50\xb8\x24\xf1\xcc\xab\xa1\x7b\x3a\x7a\x5c\x24\xcc\xe6\x7e\x4a\x41\x9d\xaf\x0e\x9d\xef\x9f\x99\xbf\xe9\x1e\xc5\x2d\x5e\xb8\x76\x2f\xd9\xe2\xff\x0a\xba\x69\xdb\x04\x0b\x6c\xea\xe4\x6c\xff\x1a\x14\x89\xbd\xa2\xf8\x1c\x58\x5d\xd8\xcb\xba\xda\xe1\x6c\x00\xfe\x3b\x8a\x8a\x80\x1f\x1d\xe9\x4e\x79\x54\xef\x49\x43\xdb\x0c\x68\x36\x1e\x57\x6a\x0e\x30\x90\x6a\xea\x78\x07\xbf\xd7\x89\x7e\x19\x7e\x50\x5e\xcc\x9e\x25\x55\x2f\x15\xd4\x6b\x59\xaa\x3d\xd5\x98\xda\xa7\xe1\xbd\x2a\x69\xd0\xe6\xba\xf3\x72\x14\xd4\x76\x4a\x29\xc3\x5f\xde\x28\xe7\xee\x37\xdd\x65\xd1\xe7\x53\x26\xcc\x48\x67\x93\xb5\xdd\x59\xbf\x86\x23\x38\x71\x70\xdb\x53\x4d\x9e\x0f\x30\x14\xba\xaf\xd5\xbc\x99\xcb\x36\x57\x6b\xf0\x73\x6d\xf5\xd0\x63\xa7\xc9\xda\xbd\x7b\x8d\xd3\xed\x8f\x77\x55\xab\xae\xa6\x67\x31\xed\xdf\x4c\x07\x5d\x4b\x58\x19\xa1\x72\x94\x9d\x67\x1f\xef\x07\x42\x1d\x6e\xf3\xe2\x56\xb1\x32\xc7\xd0\xa6\xec\x95\x2e\x4e\x82\x2f\xd6\xa1\xb6\xd5\xaf\x9a\x5c\xc2\x6d\x31\x7b\x93\xac\xa2\x5d\xe6\xb2\xb2\x99\xf7\x93\xa8\x60\x60\x47\x0e\xbd\xcb\xce\x2e\x50\x0c\x70\x3d\xc8\xbb\x2e\x11\x61\x37\x3c\x4e\xad\x45\xd2\x25\x19\x35\xbe\xfb\x65\x08\x7a\x49\x01\x0d\x27\xb5\xa5\x9a\xab\x24\xb4\xeb\x05\xd9\xcd\xf9\xf2\x1b\xd6\xb1\x21\xe7\xee\x23\x9e\x18\xf1\x0d\x4f\x63\x60\xb5\x7a\x71\x13\xd8\xea\x30\x9b\x01\x99\xa6\xff\xa6\x48\x07\x8c\x99\xcd\xaa\xbd\x31\xb1\x19\xee\x40\x5e\x3b\x6a\x3a\x8c\xc3\x73\x6e\x47\xbc\xc7\xa9\x44\xf0\x82\x67\xcf\x2e\xcf\x5f\x9e\x1f\xc1\x5e\x35\xd2\xd1\xc6\x3b\xf0\x49\x43\x49\xb7\xc1\x14\x15\x94\x37\x1e\x25\x2e\xe8\xc8\xbf\xe6\x0e\x3e\x0b\x6c\x51\x07\xfa\x45\xfa\xf7\x1f\xf9\xf5\x7a\x1a\x4e\x31\xd0\x1f\x65\xbc\xa8\xd9\x5f\xe8\x19\x51\xe8\x75\x80\xb7\x5d\x8c\x00\x69\x04\x88\x36\x7a\xea\x36\xef\xbe\xd6\x55\xa3\x0f\xa8\x0c\x2f\xd7\xe2\x25\xb8\x54\x27\xf6\xdc\x97\x84\x8a\xc7\xad\x8e\x59\x19\x2b\x6a\x1f\xeb\x4a\x39\x6f\x5d\xdd\x07\x83\x0a\xe8\xfb\xed\xb3\xe8\xb2\x04\xdc\xb2\x7b\x60\x00\x77\x6c\x39\x33\x74\x2f\xa7\xfc\x98\xab\xfd\xc6\x23\x90\x2f\xee\x11\xe5\x94\x0f\xd6\x57\x5a\x53\xd3\xb6\x9c\x7b\x43\x4e\xf0\x2a\x3e\x06\xa2\xe9\x13\xee\x1a\x0e\x53\x80\x71\xa7\x03\xf5\x5c\x15\x11\x2b\x43\x1f\x72\x50\xdc\xf9\xe9\x20\x89\x3f\x98\x60\x3f\xdb\x84\x61\x90\xa8\xf4\x1a\xfe\x30\x4a\x63\x00\x36\xdc\x0d\x06\xcc\xac\x36\x7d\x5a\x38\x2a\x40\xb4\x08\x45\xb5\x05\x0c\xa2\x25\xa8\x0b\xc6\x26\x8d\x14\xb8\x1b\x64\x5c\xff\x19\xc1\xe6\x09\x0e\xbe\x3c\x0c\xce\x89\xb0\x06\x52\x77\x80\xdb\x38\x44\xda\xc7\xb9\x68\x91\x7a\xb4\xbb\x2e\x3a\xa6\x46\x95\xa3\x8d\x4d\xdd\x65\x8c\x42\x38\x44\xea\xf4\x71\x7c\x63\x52\xeb\x56\xd7\xe5\x53\xb7\x6d\x27\xd1\x78\x8d\x0b\x6d\x47\x63\x99\x58\xb8\x8e\x82\xcb\x9f\x7e\x1e\xda\x07\xf6\xa0\x9e\x68\x74\x96\x4a\x06\x82\xae\x6e\x40\xf1\xc7\xf3\xf1\xa9\x76\x12\x2e\xf5\x26\x69\x86\x68\x8b\x03\x7e\x96\xa5\x4f\x46\x96\x9a\x05\x09\x2d\xa5\xf9\x82\x64\x0b\x87\x3a\x52\xe4\x14\x0e\x99\x2b\x47\xaf\x55\x7e\xad\xac\xcd\x40\x2c\x02\x1b\xe2\x2e\xab\x9e\x14\x02\x49\xae\x39\x22\x4a\xde\x22\x99\x01\x54\xac\xd6\x47\xab\x42\x28\x29\x2d\x6a\x8f\x92\x2d\x8d\x72\x70\xa4\xe3\x5b\x65\x8e\xe8\x9d\xe3\x33\xdc\x72\x6c\x0d\x7c\x97\xe3\x62\x87\x60\xfa\x48\xee\x8c\xc5\xc5\xf2\x68\x28\x09\xce\x9a\xea\x94\x38\x18\x17\x5f\x21\x6f\x35\x4b\xea\x36\x8a\x9f\xcd\xf1\xa5\x03\xad\x9b\x3d\x62\x01\x72\x20\xc5\x8c\x11\xa2\x60\x5c\x0b\xe1\xf0\x10\x6f\xb0\x40\x7d\x15\x13\x67\xd8\xee\xb1\x44\x48\x08\xbb\x81\x2e\x5a\xc9\xb7\x30\x19\x56\xa7\xa2\xb1\xcc\xd7\x6d\x35\x6f\x98\xdd\x91\x52\x53\x2c\x06\x01\xa6\x98\xd4\x82\x60\x8c\xae\xf0\xee\xa5\xc2\x6c\xa6\xd1\x2c\x2f\x90\xeb\x83\xf0\x43\x78\xc8\xef\x8f\xb2\xe9\x7d\xcd\x44\x15\xc1\xf1\xad\x6e\x26\x04\x95\xf5\x9a\x23\x42\x3b\xc6\x5a\xa4\x83\x31\x1c\x86\xc1\x52\x9c\xae\x85\x20\xe4\x94\xa6\x00\xca\xbb\x47\xec\x78\x0f\x49\xb2\x15\x92\xfb\x56\xa7\x27\x62\x1b\xb7\xfa\x9d\xcd\x34\xa8\x5c\x06\xa1\xf1\xb0\xc6\xe0\x60\x44\x55\x2e\xfd\xe3\xbc\x2a\x6c\xdf\x52\x76\x9d\x73\xb4\x56\x78\xf7\x35\x78\xff\x2a\xc2\x32\x2e\x38\xf7\x89\x1b\x9f\x9a\x70\x11\x8b\x85\xdc\x43\x96\x6f\xe4\x96\x6f\x48\x81\x17\xeb\x71\x57\x3d\x1f\x7a\xf7\xd2\x44\xd5\x6d\xff\x6d\xf4\x08\x66\xd7\x37\x55\x56\xe3\x9c\x15\x2d\x9f\xe9\xfb\xd9\x7c\xa1\x1b\xf6\x09\x18\xf7\x1a\x6d\xc4\x92\x21\x1b\xfb\x45\xbc\xab\x4e\x93\xa8\x22\xfc\x6e\xa8\x2b\x71\x04\x1c\xd3\xb1\x1f\xe9\x97\x50\xdb\x1f\xfa\x00\x88\xe3\x97\xeb\x7a\xcf\x3a\x79\x85\x4f\xb3\x03\x4e\x9f\xd2\xdb\x90\x93\x9a\x72\x07\x83\x81\x1f\xd1\x5c\xec\x3a\x4e\x61\x8f\x2a\x71\xed\xee\xf1\x9f\x7b\x94\x50\xc6\x45\x5d\xb0\x5c\x59\x56\x3a\xc9\xf5\xa5\x4e\x3c\x73\x82\x05\xe2\x79\x3b\xc9\x9b\x85\xbe\x06\x3f\xa6\xb0\x8f\x61\xf5\xd8\x64\xdf\xed\xe9\x8d\x6d\xcf\x0c\x80\xaa\xe3\xb0\x0a\x87\xd1\x27\x9b\x9a\x95\x10\xad\x88\x74\xae\xa6\x68\xe6\x85\xbc\xd3\xa2\x61\x47\x13\x1f\x99\x74\xd2\xf3\xb1\xec\xc2\x97\xc3\xa0\xc9\xbe\xa3\x4d\xd8\x2c\x6a\x46\xc7\x4b\xef\xb9\xc4\xb3\xa6\xea\xda\xb8\x30\xfd\xe0\xd1\x65\x35\xa9\x17\x7c\xf4\x8d\x56\x17\x66\x4a\x6a\x7c\x6d\xd0\x83\xba\xbc\x13\x14\xc1\x00\x3e\x3d\xf8\x12\x37\x3e\xe4\xda\x38\x9b\xa5\x51\x5b\xf5\x00\x9b\x14\x21\x59\x1c\x4d\xfd\xe8\xfd\xc5\x63\x4e\x78\x64\xc5\xd8\x78\x3a\x7f\x59\x5b\x41\x60\xca\x9d\x11\x5c\x5a\x9e\x4d\x51\x32\x46\xa1\xb4\x23\x70\xa9\x20\x5e\x0f\x34\x16\x81\xa6\x6f\xd8\x83\x20\xfc\x59\x1b\xb7\x24\xdf\x66\xe9\xe2\x71\x2d\xef\xec\x30\xa2\xcf\xc6\x38\x95\x44\xa1\xaf\x07\x3a\x69\x63\x18\x78\x3c\xd5\xf0\xbd\x30\x7c\xb3\x11\xd2\x2a\x73\xea\xe7\xc3\x8c\x88\x5d\xb5\x9a\x35\xed\x19\xa3\xba\xd0\x3a\xea\x05\xbc\xd5\xa2\x47\x92\x55\x16\x37\x0e\x23\xc8\x14\x5c\xd1\xd0\x29\x47\xea\xc5\x49\xbb\x7c\xf8\xd4\xad\x47\x35\x99\xa2\xad\xae\x7d\x5b\x2c\xb8\xae\xc8\x02\xa7\x18\xad\xdd\xb8\xda\xc4\x06\xb1\x70\xb7\x66\xd7\xf0\xd5\x87\xd9\x76\xea\xb8\x7c\x2a\x53\x56\xb1\x39\xc5\x1f\x99\x1c\x7d\x70\xb2\xd4\x8f\xc7\x3e\xe1\xb5\x5d\x58\xc8\xb5\xcc\x42\xae\x65\x9a\xe4\x88\x2e\xab\xa5\x37\x4f\x6a\x07\x16\x1a\x0f\x7d\x9e\xb5\x10\x12\xf6\xbe\x47\x5c\x16\xbe\x0c\x89\xfc\xcd\xa1\xbe\x59\xb2\xa8\xe7\xe9\x5e\x48\x15\xae\x37\xec\x55\x69\xc9\x5f\x41\x62\x42\x3f\x6b\x7b\xa0\x53\x3b\xf9\x8e\xda\xde\xaf\xbf\xef\x21\xad\xf6\xd0\x0a\x63\x52\xee\xad\x51\x76\xfc\xc9\xab\x48\xbe\xc5\x67\xcb\x08\x51\xeb\x12\x96\xad\x72\x65\x71\xf1\x87\xd1\xf0\xfe\x40\xbf\x2e\xb5\x86\x29\xc6\x95\xa2\x21\x16\x17\xce\x5e\xf0\xe3\xeb\x57\x36\xf7\x19\xb5\x3f\x2b\x10\xf7\xe7\x36\x6e\xd0\x60\x12\x3c\xa3\xbf\xfb\xf0\xa3\x3e\x6b\x15\x47\x78\xf6\x32\x1b\x0d\x52\xb2\x05\xdf\xc0\xff\x77\xc5\xc5\x4e\x32\x36\x3e\xb4\xce\x73\x03\x0d\xec\x7e\x84\x64\x01\xb8\xd6\xa8\xa7\x1c\x9b\x4b\x20\xbb\x49\xf8\xbc\x43\xf2\x50\x29\xd8\x95\xe0\x34\x1c\xd7\xd5\xeb\x24\xfc\xa0\x6a\x0a\x56\x52\x42\x6a\x41\x65\x2c\x93\x4a\x59\x04\x68\x65\xa0\x31\xa7\xe9\xd2\x50\x79\x19\x97\x85\x49\x8b\xa0\x77\xdb\x40\xb7\x06\xea\xb1\x36\x50\x4b\x3d\x53\xcf\x28\xc4\x9a\xec\x53\x31\xab\xc9\x4a\x9d\x67\xa1\x12\xe6\x06\x72\x33\x12\x46\xa0\xb4\x99\x9a\xde\x6b\x03\xf5\x07\x96\x5b\x77\xce\x21\x1b\xad\x74\xe2\x54\x68\x80\xc4\x6c\x1d\xf0\x2a\xda\x6f\x5c\xfd\x93\x70\xca\x7d\xf6\x3d\x33\xcd\x09\x97\x2c\x62\xaa\xbd\x07\x6e\xbf\x6f\x48\xff\xd9\x24\xab\xcf\x73\x51\x25\x96\xe5\x30\x9c\xa3\x5e\x1e\x86\xf9\xc4\xaa\xe7\xf3\xf9\x0e\xb0\x62\x3a\xa8\x67\xd0\x59\x72\xe8\xa8\xe0\xe1\x7c\xb1\xa8\x24\x9a\xf0\xf2\x0e\x8e\x6d\x59\x67\xf1\x0c\x45\x31\x8d\x81\x24\xe0\x39\x53\x28\x48\x3e\xe1\x3e\x21\xe4\xcf\xf3\xc7\x6b\x96\xb3\x81\xc7\x2f\xf1\xc6\x1d\x49\xb3\x7b\xac\x88\xd8\x79\xfe\x77\xe9\x00\xe1\xe4\x0e\x2c\x18\x84\x93\x8e\x8f\x6d\xc1\x98\x4e\x2d\xc8\xaf\x5c\xfa\x2f\x9b\x50\xc4\xb0\xe6\x7e\x6b\x46\x47\x51\xfd\xc0\x5a\x9e\x5d\xba\xf2\xe0\x8e\x56\x01\x6c\x18\xcc\xc0\x33\x87\x7d\xb6\x6a\x92\xd0\xcb\x68\x8b\xd3\x6b\xb2\x5c\x79\x44\xfa\x47\x9b\x53\x84\x37\xac\xc8\x66\x6d\xb6\xc0\xd2\x2c\x9b\x0e\xda\xa8\x6b\x1a\x23\xc9\xf1\xa6\xb9\xd3\xa0\x73\x7a\x74\x3a\x5a\x19\x4f\x54\x75\xdc\xbb\x41\x87\x37\xa0\x0f\x16\xef\x54\x92\x1c\x60\x61\x45\xc5\xd5\x5e\xdc\x93\xc6\xdc\xc9\x94\xb7\x22\x5a\xbb\xf2\xd0\xc6\x44\xbc\x45\xce\x91\x18\x67\x5c\x5c\xe5\x78\x3d\xaa\x72\xc8\x8a\x3f\x51\x85\x14\xfc\x68\x5e\x08\xe6\x2d\xdf\xaf\x0a\x6d\x99\x70\x5c\x81\xcd\xbb\x7a\x35\xca\x47\x89\xaf\x1e\xd6\xf8\x95\x05\x8e\x0e\x8c\xf3\xea\xdd\x64\xfa\x09\x5e\x94\xfb\xeb\x06\x3c\xb6\x15\x66\xdc\x88\xa7\xce\x3c\xca\xd1\x62\x17\x4f\x37\xda\xb0\xb7\x6e\xc8\x61\x4c\x35\xad\xe9\x14\x76\x6c\x70\x6a\xa3\x29\x3c\x5d\xcb\xb8\x8c\x16\xfc\x34\x19\xc0\x03\x07\xa3\xb6\x16\x11\x7e\x4b\x6d\xca\xc7\xc1\x00\x96\x23\x0c\x3f\xfd\x74\x92\x80\x2b\xf3\xf3\xcf\x12\x0f\xeb\x16\x0e\xdf\x12\xc5\x78\x69\x9f\x71\x2b\xe0\xdf\x4f\x55\x9f\xf6\x16\x17\x59\x5e\x3a\x81\x96\xca\x55\x5c\xaa\xca\x4b\x09\x9e\x43\x27\xd5\x7d\x36\x4d\xe4\x66\x3b\x67\xc4\x45\xb5\x5b\x7e\x54\x8c\xfc\x2e\xcb\xa5\xff\xa5\xe9\x6f\xeb\x8f\x8d\x36\xb5\x74\x53\xb0\xa5\xf3\x7b\x9b\x50\x95\xe1\x7c\xf4\x67\x69\xfc\xaf\x99\xd2\xd6\x83\x7b\x33\xd8\xfc\xdd\x7f\xed\x78\xa4\x41\xdb\xb7\xf5\x8a\x14\xae\x20\xba\xa3\xd7\xbe\x68\xaa\x09\x28\x95\x84\x6b\xaa\x43\xa1\xbb\xd8\xe9\x77\xbc\x7b\x8f\x34\xfe\x38\x0f\xaf\x39\x9f\xd8\xbf\xf8\x58\x99\xe4\x83\x52\x53\x16\x95\x62\xee\x75\x38\xbe\xdb\xa6\xa4\xb4\x45\xe1\x9c\xc9\x98\x59\x19\xab\xfa\xea\xc7\x87\xde\xf2\x77\x6f\xdd\xe3\x43\xe7\x4e\x88\x01\xc8\x0b\x99\xb5\x58\xe3\x9f\x39\xb2\x09\x8e\xd8\xb2\x0a\x73\xd8\xe1\xb7\x05\xd1\x57\x1e\x53\x4c\x3e\x1e\x29\x5d\xf9\xb9\xb1\x98\x73\xbd\x49\xd0\x3b\x9d\xa8\x1a\xba\x15\x4d\x2b\xb5\xd9\xbd\x52\x9f\xb6\xa1\x04\xb7\x74\x60\xef\x17\x5f\x39\xed\xaa\xbd\x21\x83\x57\xed\xe7\x2b\x25\x99\xaf\xd5\xee\xf9\x30\xde\x89\x4c\xe4\x54\x46\x55\xb5\x5c\x24\x9d\xdd\x04\xfb\xda\xf7\x65\x39\x7d\xc7\x50\x1e\x55\xfe\x3d\xa4\x01\xcf\x75\xd5\xcf\xa6\x6e\x84\x0d\xd7\xa0\x96\x26\x8d\x9c\xd7\xa7\x9c\x94\x54\x23\x54\xb0\x6e\x4a\x9d\x52\xee\x53\x1f\x32\x55\xcb\xd5\x0c\xe7\x56\x86\x1d\x72\xfa\x56\x4a\x73\xf4\x24\xdd\x31\xdd\x93\xe8\x28\xe8\x20\x19\xc4\xa1\x4f\x40\x53\x1e\x69\xe3\x04\xbb\xc0\x73\xc0\xe5\xe9\x75\xde\x51\x3e\x76\x3d\x72\x65\xbd\x0e\x8f\x40\xba\x9b\xc6\xc6\xe9\x83\x39\xda\x0e\x81\xd6\x84\x15\x7a\xf4\xfe\x8a\xa1\x04\x51\xbd\x6c\xa2\x6d\x20\x06\xbe\xcb\x22\x78\xcd\x15\x65\x44\x0c\x53\x4e\x6a\xc2\x6c\x7b\x58\x48\xd6\x3e\x15\x8c\xd8\x02\x8a\x3c\xdb\xfa\xb5\x66\x2f\x61\xaf\xd2\xaf\xbd\xe0\x1a\xda\xfa\xf6\x96\x92\x09\x3d\xd0\x06\x6a\x1c\xdc\x7e\xf7\x80\x76\xa2\x16\x9b\xd9\x1c\x7a\x15\x63\x33\x5a\xa0\x26\x4e\x3e\xc7\xb1\xfe\x48\x63\x45\x33\xfe\xe7\x6f\x9a\xd3\x4e\xc3\xa7\x01\xf7\xa0\x28\xd4\x25\xe5\x07\x77\x15\x8c\xec\x96\x8f\x1e\xec\x3f\xa5\x4a\xac\xb6\xc4\x0b\x35\x44\x30\x71\x90\xd0\x31\x22\xf1\x08\x96\x5a\x21\x52\x25\x2a\x1f\x49\x53\x78\x72\xb0\xef\x37\x0a\x5b\x68\x26\xc7\x40\xa5\x84\x25\x92\x40\x2e\x6c\xde\x32\x9d\x74\x34\x3b\xea\x6a\x62\xd6\x18\x40\x89\x24\xe1\xc2\x9e\x28\x8f\xd0\x23\x1c\xa8\x82\x5a\x92\x50\xb4\x50\xc2\x78\x02\x6e\x45\xd0\xdb\x2c\x67\x1a\x86\xae\xaa\x9d\x77\xb4\x09\xa0\xb7\x94\x4e\x27\xf7\x7a\xb4\xd0\x23\x5b\xff\xc3\x34\xec\x6a\x59\x68\xa2\x56\xa2\x88\x3c\xda\x81\x99\xbe\xe1\x4a\xd5\xd6\x68\x60\x16\xcd\x71\x35\x37\x21\x9e\xd3\x3e\x81\x91\x67\xe6\x37\xd0\xc6\x94\x15\xb2\xef\x0d\x8a\x7d\xac\xbf\x40\x99\x4f\x6e\x28\x76\x9a\x71\xd7\x36\x8d\x81\x49\xd7\x4e\x0d\x42\x3a\xd9\xa4\x79\x54\x92\x48\x9d\xa8\xd9\x3f\x7c\xaa\xa3\x67\xf5\xf9\x5a\x38\x26\x49\x14\x04\xb5\x4d\x85\xad\xf3\x11\x97\xf2\xfc\x5b\x72\x11\xa3\xa4\x6f\x09\x56\x0b\x37\xe9\xdb\x9b\xe0\x8a\xf0\x51\x9a\x0b\x32\x55\xe5\xd0\xa5\x06\xb1\x3a\x4f\xcc\x31\x4b\x4c\x48\xb5\xd5\xe8\x6a\x68\x7c\x03\x43\x99\xfa\x71\x7d\xae\xf2\x7d\x27\x91\x19\xd3\x21\x8e\x6f\x48\x8b\xbc\xeb\xbb\xfa\x6c\x5c\x35\xb0\xad\xbf\x1c\x9a\x41\xdf\x34\xdd\x2c\xb1\x53\x72\xb4\xa8\x82\x18\x3c\x1d\x78\x03\x34\x44\xb4\x2a\x88\x61\x3f\x06\x57\xba\x9d\xea\x41\x1a\xab\x8d\x21\xd0\x5a\xe2\xe3\xd8\xcd\x65\x29\x0d\x20\xe6\xe3\xbe\x68\x0f\xfd\xa6\x8f\xbf\x99\xe4\x90\x16\xf5\xf2\xc8\x88\x41\x99\x6b\x8d\xfa\xa8\xf4\xd3\x7d\xc0\xb9\x29\xc5\x00\x6c\x58\xcf\xab\xea\x1a\x2c\x60\x69\x41\x95\x02\x1e\xae\xa2\xe9\xcd\x8d\x66\xbd\x81\x2f\x37\xa8\x8c\x07\xe4\x56\x5b\xe5\xac\x03\xaf\x91\x48\x43\x79\x14\x1f\xf9\xa6\x3a\x58\xf8\x56\x7b\x50\xd9\x96\xac\x30\x27\x72\x55\xd8\x29\x89\x1a\x14\x6d\x7c\x9d\x4a\x6b\xb3\x6b\x60\x6d\xca\xda\x77\xee\x06\x7f\x69\x76\x6b\x12\xc4\xc6\x64\x31\x53\xb3\xa2\x7d\x7b\x6e\x4d\x04\xd0\x7a\x92\x0c\x6e\xef\x28\x6c\x49\xf5\x28\xc0\x94\x93\xa4\xc3\x4c\xbb\x68\x9b\x95\xec\x81\x95\xf4\x31\xf5\x0f\x67\x63\xb2\xa9\x0a\x1e\xad\x93\xc2\x3d\xf8\xeb\x67\xfc\x10\x42\x76\xec\xf9\x96\xcf\x06\x51\xec\x56\x33\xee\x84\x46\xdb\xac\xae\x50\x68\xd8\x06\x5d\x62\xda\x41\x4f\xa6\x9c\x77\xed\x0c\x25\x01\x1e\x74\x74\x34\x74\x63\xd3\x67\x76\x26\x9d\x04\x61\x70\xaa\xb3\xe7\x9e\x8f\x9b\x7b\xb0\xbe\xa1\x21\x58\xad\xdf\x50\x22\xee\x36\x2b\x3b\x01\xaf\xdb\x44\xfa\xcc\xfb\xdd\xe4\xfd\x7c\xab\xd1\x5e\xb3\x5a\xa3\xcd\xa8\xc7\x6c\x34\x32\xcc\x84\x4d\x16\x23\x3e\x1c\xb8\x9f\xcf\xa9\xe2\x55\xdd\x72\x9d\x0b\x12\xcb\x6d\xb9\xbd\x41\x5f\xd4\x56\x34\x89\x2b\xfd\xf0\x6d\xb6\x14\x7f\xb3\xc7\x24\x3d\x6d\x90\x75\x11\x24\xae\xda\x20\x1a\xe8\xb9\x26\x88\x8b\x62\xdc\x6a\x82\x3c\x56\x9e\x2e\x62\xf2\xae\xae\x88\x0c\x30\x4d\xca\xa8\x45\x31\x28\x4c\x97\xba\xcb\xf2\xa8\x87\x92\xe8\x2d\x7c\xad\x7b\x85\x5c\xff\xbe\xff\x87\x4d\xff\x9d\x1f\x1f\xd3\x85\x77\x3c\x17\x15\x03\xa5\xab\xef\x17\xbe\x43\x73\x9c\xfa\x3e\x0c\xe7\x08\x3c\x47\x42\xc2\x90\xba\xef\x2c\x75\x07\x8e\x4d\x2f\x87\xb0\x16\x41\xd1\x1d\x02\xac\xe1\xec\x13\x4e\x2a\xab\x76\x79\xb7\x73\x6b\x10\x71\x89\x5d\xb6\x7d\x87\x4e\x05\x1d\x0e\x6a\xd1\x05\x19\x3c\x48\xd0\x41\xae\x35\x91\x6b\x99\xc8\x9a\x24\x5a\xd8\xd0\xf6\x52\xd1\x35\x1e\xa5\x62\xc1\x37\x45\x3a\x1e\x17\xc1\xd6\x19\x86\x33\x19\x2b\xab\x2b\x0a\x1e\x7c\x9e\xeb\xeb\xd2\x7c\xad\x21\x32\xa7\x92\x56\xc5\x7a\xd8\x90\x66\x6e\x2f\x89\xf5\xb6\xc3\x62\xe8\x8a\xf0\x51\x29\x27\xc2\xc2\x65\xe2\xb2\xd2\x33\x0c\x22\x35\x55\xdc\xf1\x1a\x6f\x67\x73\x73\x76\xb3\x58\x9e\x62\x1b\x19\x4c\x10\x1c\x29\x5d\x18\xd4\x98\x60\x34\xea\x5d\x4c\x35\xe2\x2b\xb7\x88\x7b\x2d\x5e\x57\xce\x06\x56\xfc\xae\xee\x59\x22\x39\x0e\x8d\xd7\x39\xb2\xeb\xeb\x44\x2a\x42\x36\x61\xa6\x51\x6a\xd8\x04\x8b\x3b\x84\xce\xa6\x8c\x0c\x30\x7b\x8a\x8a\x64\x95\xf9\xac\xbc\xb9\x7f\x86\x77\xdd\x60\x23\x30\xdb\x61\xd4\x78\x21\x82\x21\x75\x8a\xcc\x50\x58\xda\x30\xa2\x72\xca\xc7\xf0\xb6\xb8\xfc\x43\x86\xc9\x4b\x1c\x69\x0f\xd1\xef\x22\xb3\x35\xcd\xaf\xdc\xab\x98\x9b\xa0\xed\xa7\x4e\xc8\xaa\x05\xe7\x55\xbb\xab\x2b\x69\xbd\x4c\x04\xf2\xb6\xbd\xae\x63\xf1\x2c\xa7\xde\x87\x4d\xba\xdd\xb9\xcc\x2b\xb8\x36\xe8\xfa\xad\x4b\x4c\xcf\xad\x44\xd6\xa8\x95\x2c\xbb\xb5\x74\x2d\xdf\x36\x9f\x55\x9b\xb2\x9e\x08\x2c\x1f\xc1\xc3\x7b\xe5\x1d\x4e\xa5\x27\x6c\xab\x9b\x11\xda\x35\xb4\x01\x3b\x2e\xa6\x95\x7b\x07\xb6\x3a\x21\x75\x94\xe5\x7c\x7a\x1d\x49\xda\x60\x1d\x9a\xca\xbc\x4e\xe8\x8f\x4f\x91\x54\xf4\x4c\x6e\x5a\xd5\xd1\xf6\x3d\x4b\xfe\x4f\x57\x79\xd3\x0d\xd0\xe3\x11\x9d\x24\xcc\x33\xa2\x90\x62\xcd\x12\xef\xd1\xb1\xc5\x70\x9a\x1b\x81\x29\xca\xfb\xa4\xd1\xc7\x5d\x77\x1c\xe6\xd8\x6b\x11\xe0\xe3\x38\x82\x55\xdd\x62\x43\xf5\x3c\xa6\xab\x74\x2b\x58\x83\x39\x78\x5c\x6b\x69\x50\xbb\xb0\xb4\x44\xc0\xa5\x0d\xd3\x55\x4f\xe6\x1e\x14\xff\x5d\x58\x46\x73\x09\xdf\x77\x75\x3d\x28\x6b\x96\x0f\x83\x39\xf8\x37\x47\xc1\xe6\xed\x7b\x98\xdb\x44\x49\x53\x37\x2a\xbe\xbe\x29\x57\xd2\x13\x72\x2a\x40\x03\xb9\xb7\x91\x5a\x14\x3f\x52\x50\x66\x45\xed\x4f\xa5\xa7\xfa\xe5\xac\x89\x84\xd2\x45\x59\x75\xdd\x74\x53\xca\x16\x88\x9c\xc6\x1f\x55\x22\x8e\xbc\xfd\x40\x27\x19\x9b\xf6\x8d\xb3\x34\x66\xdc\x54\x58\x60\x69\xe0\x70\x8a\x26\x24\x96\xaf\x74\x12\xad\xf6\x1b\x31\x15\x91\x92\x58\x6a\xdf\x53\x8e\xe5\xb1\xef\xde\xe5\x64\xcc\xf5\x45\x0f\x65\xc0\xcd\xe6\xdc\x08\x29\x9b\x77\x44\x7e\xe8\xdd\x80\x6d\x23\xf6\x36\xc4\x7d\x18\xd8\xa6\x49\x53\x2c\xc9\x04\xff\xc5\x26\xae\xe8\xbe\x5e\x65\x79\xa4\xf2\x6a\x61\x8f\x54\xe5\xdf\xd7\x56\x45\x83\x60\x68\x2e\x61\xd1\x49\x2d\x1b\xa9\x3d\x12\x5f\x17\x58\x6b\x5f\x4d\xd8\xcb\xeb\x7a\x3d\x6b\xca\x25\x96\xcf\xf7\xe6\x95\xd5\x9b\xe1\x77\x71\x54\xde\x6c\x8f\xdf\x3f\xe0\x74\x0b\xb0\x9b\xc1\xfb\x43\x72\x9b\x49\x45\x04\x58\x95\xd7\x80\x78\x9c\xd2\x3d\xbe\x25\x3c\xb9\x21\x15\x8b\xa7\x92\x0b\xa2\xbd\x9a\x8b\x46\x64\xe3\x31\x8c\x60\x53\x5b\x4f\xec\xb4\xf5\xe8\x46\x53\x19\x37\xc7\x8e\xe4\x9a\x6b\x53\x52\xb8\x89\x1a\x97\xba\x6a\x10\x15\x8d\x64\x7a\x17\xee\x5d\x2a\xe2\x8f\xba\xf3\xbe\xf1\xf0\xae\x74\x02\x6a\x8d\xd8\x3b\x9f\x3c\x1a\x18\x3d\xf2\x3a\x1f\x34\x10\xba\x23\x9e\xf4\x58\xb0\x99\x17\x30\xca\x74\x69\x01\x12\x61\x67\xc0\x8e\xad\xbb\x79\xc7\x76\x4a\x84\x4a\x92\x4e\xa5\x76\x82\xde\xce\x9b\x16\x8a\x7c\x51\x29\x9e\xd0\x5d\xc9\x2d\xf5\x7a\x37\x34\x52\xa8\xad\x25\x9c\x70\xb7\x25\xd8\x83\x70\x35\xb2\x1b\xf7\xfc\x2e\x21\x78\xa0\x7d\x7f\x28\xba\x96\x23\x6a\x4e\x82\xee\x04\x08\x19\xa7\xb6\xfd\x9c\xa3\x3e\x07\x48\xb4\x0c\x54\xf5\xde\xf4\xe3\xde\xbe\x55\xbf\xa1\x6b\x93\x89\x23\x9f\x4b\x4b\xf8\xb1\xbe\x0a\x44\xe5\xe3\xa5\xc2\x40\xbf\xce\xaf\x72\xe5\xf2\x35\x01\xd4\xfb\x82\xa6\x23\x65\x4f\x0b\xc1\xc6\x88\x5b\x98\x60\x3d\xfa\x7a\x71\x03\x40\xca\xec\xdd\xde\xb4\x5e\x44\x6e\xee\x86\x48\xc3\xac\xc7\xfe\x41\xae\xec\xce\x6e\xe8\xd2\x6f\x9e\xed\xf3\x40\x76\xcf\x5c\x82\x6e\x5b\xdc\xd8\x78\x58\x59\xda\xd6\x61\x7e\xed\xa0\xb0\xf5\x32\xbd\xb6\x6e\x76\xf1\x1e\x81\xd7\xbe\xeb\xc9\x25\xe2\xbb\xb6\x58\x5f\xf3\x40\xbd\xc9\xf2\xf8\xdf\x68\x16\x24\x35\x2f\xb8\x18\xe5\x19\x5e\x73\x0f\xf3\xa5\x16\x8b\xf4\x4e\x65\x17\xbc\xf7\x2c\x9d\x6e\xbf\x5c\xa8\xa2\x2f\x5e\xc1\x9e\xda\x23\xa4\xb2\x38\x9e\xcb\x5f\x25\xaa\x49\x73\x83\xd1\x64\x26\x97\x28\x6a\x05\x80\x32\x6b\xc5\xd5\x0b\xaa\x2c\x72\x8e\x83\x46\xc7\x68\xb3\xfc\xed\x3b\x47\x6f\xee\x5e\x72\x51\xa0\x9e\xcc\xed\x3d\xfd\xe3\x63\x2d\x22\xba\x2c\x67\xd7\xb0\xa3\xf9\x20\xdd\x55\x5d\xf4\x16\xba\x63\xa4\x4e\xf6\x87\x35\x1e\xda\x3d\x8e\x5d\x80\x69\xb0\x7c\x04\x73\x8d\x74\xe9\x0e\x6b\xf2\x44\xeb\x8b\x6a\xf2\x78\x9b\x0d\x6a\x32\x71\x9b\x5d\x1d\x6f\xcf\x5d\x28\xa4\x29\x59\x52\x26\x6f\x8e\xfb\x42\xda\x82\x7f\x94\x89\x40\xb5\x01\x30\x16\x74\x8f\xad\x85\x95\x02\x72\xce\xda\xba\xd7\x6d\xb5\xc9\xe9\x08\xec\xb2\x9c\x9a\x60\x0e\x1a\xfb\x9a\xb6\x61\xdd\xbb\x07\x78\x4f\x69\xdb\x44\x83\xee\xe7\x6e\xfa\x67\x7a\xef\xd6\xf7\xa5\x46\x48\xd6\x64\xac\xd4\x4f\xf4\x49\x44\x6d\x96\x9b\x9a\x78\x77\x16\x5b\x58\x37\x81\xb8\x34\xa9\x73\x26\x05\x10\x79\xc7\x51\x0e\x8d\x66\xd3\x28\xac\x5e\x57\x24\x2c\xa8\x5c\x57\x4b\xef\xf7\xae\xe4\x4c\x13\x17\x31\x7d\xb4\xb5\x18\x36\xf6\xd2\x6e\xdc\x03\xe4\x96\x85\x0d\x8e\xb8\xad\xb6\x09\x3a\xb7\xb5\x36\x32\x03\x2f\xd3\xa6\x74\x6d\xe3\xff\xd2\x0b\x07\x5f\xd4\xef\x62\x36\x88\xd1\x1b\x67\x75\x58\xe0\xa2\x6e\xa6\x76\xf6\x0f\x7f\x9c\xa8\x3b\x88\x6c\xa6\xe9\x77\x9b\x28\x6e\x55\x41\xe9\xee\xdc\x0b\x69\xa7\x15\x7b\xc0\xf6\x6f\xe2\x1a\x29\x2a\x83\x81\xc6\x68\x25\x31\xb8\xe5\xe3\xa2\xfe\x75\x53\xbe\xeb\x4b\x2d\x14\x0b\xa4\x4e\x2f\x87\x2b\x65\xc1\x1f\x37\xa4\x27\xad\x02\x39\x0e\xaa\x21\xf7\x72\x8e\x5a\xd6\x57\x88\x0d\xe7\x26\x71\xe1\xf6\x6c\xc9\xae\xb8\x2e\x9a\xa9\xb6\x13\x4a\x97\x65\xba\xd0\x34\x02\xa3\x9b\x5a\xbd\xa1\x22\xbf\xc2\x4e\x05\xc6\x1a\x70\x56\x99\x34\x4b\xe6\xea\xda\x43\xde\x85\xc7\x20\xa6\xc5\x4d\x6b\xa3\x0f\x1a\x10\xf7\x12\xfa\x23\x93\xe6\xd9\xbc\x8b\xa7\xd8\xd3\x54\x32\x08\x05\xbc\xe8\x90\x9a\xbf\xa2\x68\x1f\x81\x5c\xef\x57\x47\xe3\x6e\x34\x52\x6b\x31\x4b\xbd\xea\x2d\x53\xc1\x59\x37\xdb\x25\xf0\xa4\x96\x83\x74\xe7\xf6\x9d\x6d\x7e\x7f\x80\x90\xbd\x70\x8a\x9d\xd0\x1c\x2f\x6a\xc9\x06\x42\xd2\xaf\x40\x33\x34\x34\x9a\x7d\xab\x72\x2a\x2b\x02\xa4\x9c\x81\xb8\xc0\x1f\xba\xb9\x2a\x13\x58\x8c\x45\x3f\xad\x62\xc1\xb4\x89\x4a\x4e\x86\xad\x51\x12\x48\x21\x47\xe5\xcc\x4a\x55\xed\xb8\xb6\x66\x76\x07\x4a\xa1\x56\xcc\x66\x96\x87\x92\xa3\xaf\xf3\xeb\x74\x45\x47\x93\xfb\x88\xbf\x62\xcb\x43\x32\xc8\x1b\x86\x77\x8c\xae\x86\x52\x36\xee\x59\x00\xc6\x77\x81\x5f\x72\x7f\xcf\x0e\x13\x3b\x45\xe3\x3c\xe6\xf0\x2b\xaa\x21\xfb\x63\x68\x40\x7f\x51\x49\x3c\xf2\x4a\xd9\x34\xb4\xb6\xfe\xcc\xb2\x46\x96\x81\x3f\xe5\x5d\x8c\xf6\x62\x99\xb8\xb8\xe4\x05\x97\x9f\x78\x57\x53\x6f\x73\x54\x1a\x3b\xe6\x86\x40\x76\xf1\x16\x77\xa8\x66\x1f\x95\x74\x30\x1e\x2f\xdc\x0a\x8b\x9f\xb2\xb8\xb0\xe7\x8c\x55\x2b\x27\xe1\x94\x60\x74\xda\x64\xc9\x33\xaa\x60\x5c\x18\xd7\x8f\x55\x67\x7f\x5a\x67\x95\x02\x60\x1a\x36\x29\x0c\xd6\xe5\xf0\xa0\xc3\x4a\x95\x9e\x73\xd9\x00\x61\xbb\xe4\x12\x57\x42\xd1\x62\x06\x5b\x02\xec\x16\x68\xf7\xe9\x52\xef\xd6\x00\x6a\xa6\xab\x5d\x21\xed\xc1\x1d\x13\x7d\x70\x7b\x78\xb7\xc0\x60\x0c\x3d\xaa\xdf\xde\x04\xc0\x03\x19\x71\x00\xe9\x40\x23\x6b\xbd\xee\x85\x8c\xba\x97\x71\x31\xd5\xcd\xe3\x6b\xe1\x40\x30\x98\xc7\x61\x24\xa0\x4f\xc8\x7e\x98\x86\xff\xea\x41\xf7\x47\xb9\x99\x00\x2a\xea\x2c\x1d\x38\x9a\xc1\x8b\x46\x2c\xa8\x08\x76\x80\x70\x6b\x54\xe9\x0f\xc5\x92\xd5\x94\xf5\x3a\x79\xb4\x26\x3d\x2a\x18\x2f\xaf\x32\xbf\x8f\xe5\x28\xb1\x07\x42\xc4\x40\xff\x84\x69\xf7\x96\xec\xf9\xac\x5c\xd7\x9a\xdd\x09\xda\xed\xc6\xaa\xed\xe6\xca\x6a\xcb\x76\xbd\x6c\x5a\xe3\xc2\x45\xa4\x97\x5f\xb9\xc7\x11\xdf\xfb\xc4\xe0\xfc\x34\x1c\xc5\x65\x6b\x5d\xa8\xed\x0a\x9c\x06\xe6\x58\x8f\x75\xa5\xca\x3b\x8c\xa6\xff\x99\x4c\xcf\x2f\x61\x6c\x70\xf4\xb5\x01\x23\xce\xb7\x7c\xb4\x49\x11\xbb\xcc\x1c\xe3\xa6\x62\xc4\xcb\xf4\x6e\x56\xd5\x02\x02\xf6\x47\xe0\xc4\x6e\xa8\x91\x85\x78\xbc\xa0\x56\x69\xb3\x06\x00\xc1\x9b\x2e\x0d\x23\xa0\x33\x95\xe3\xbc\x4a\xe0\xdd\xdb\x41\x2f\xe9\x02\xea\xba\x0d\xdf\x9d\x20\xe3\xae\xac\x82\x39\x0c\x5a\x8f\x19\xbc\x5e\x8e\xad\x71\x5f\x15\xfc\x57\x88\x23\x60\x5a\xae\x73\x6a\x9d\xdc\x1f\x80\x30\x48\xc7\x20\x19\x65\xa8\xaf\xdf\x23\x87\x24\x86\x6d\x1e\x16\x9c\xdc\x6a\x98\x4a\xa1\x71\xf3\x70\xa9\xb3\x9c\x5a\x51\x0e\xfe\xd5\xb6\x20\xc9\xf0\x94\x6b\xea\x4c\x53\x21\x0c\x85\xd4\xf9\x88\xa6\x8f\x27\xdf\x6a\x35\xed\xa6\xe2\x42\x49\xdd\xb8\xdd\xff\x59\x19\x2d\x44\xf4\x0d\x99\xf5\x9b\x55\x30\x84\xd3\xf2\xaa\xa5\x2b\x86\xb0\x9b\x2b\xab\x80\x79\xb7\x11\x05\xfb\xbc\xb8\x16\xa2\xfb\xe6\x42\x5d\x9b\x5d\x5f\x84\xd6\x66\xd6\x97\xa4\xff\x05\x45\x12\x93\xd3\x3f\xc9\x5c\xfe\xec\xd8\xaa\x03\x1c\xd4\xcb\xec\x6e\x3b\x01\xe8\x47\x40\xb8\x1d\x58\x90\x3d\x58\xb2\xc1\x00\xf4\x22\x3c\x5a\xd7\x5a\x35\x18\xaf\xbe\x60\x3b\xbd\x89\x47\x20\x7f\x6b\x95\x92\x07\x70\xa1\x1f\x01\x09\x77\x64\x09\x3f\x06\xf7\xf9\xa1\x16\xf3\xca\xae\x73\x7b\xb0\xfd\x11\x08\xe0\x5a\xc5\xe4\xfd\x74\xf3\xe7\x48\x8f\x80\x66\x3b\xb2\x68\x3b\xb9\xb1\xa9\xf3\xa3\x87\x5a\xa5\x80\xec\x66\x83\x5b\x3a\xf5\xb8\xa7\xe9\x6f\x2f\x28\xcc\xbd\xbd\x2a\x41\xb3\x6a\xc0\x0c\x73\xad\xb1\xe5\x78\x25\x7d\x25\x4c\x8a\x5a\x52\xcc\x2f\xb3\xc9\xf4\x32\x3b\x4d\xa3\xb9\x73\x19\x01\x73\xb0\x75\x05\x6a\x32\x51\x11\x26\xfa\x63\x97\xc4\xd6\x69\x85\xec\xd8\xc7\xd1\xa2\x69\xaf\xcb\x0e\x2d\x3c\x7d\x2a\x77\x6e\x80\xf8\x2b\x46\x07\xff\x60\x3c\xf4\xe3\x9f\xc3\x60\x19\x9e\x2e\xb3\xa3\xef\xe6\x46\x57\x6e\xdd\x4e\xfd\xbc\xb9\x2d\xc8\x81\xcd\x1b\xa3\x9b\xdd\xd0\xca\x45\x2d\xce\xf5\x61\x80\xa1\xa6\xf3\x9c\xb6\xf7\x79\x6a\x08\x5f\xf5\xa6\x68\xbe\x1e\x2b\xc8\xd8\x81\xfb\xa8\x0f\xd3\xf2\xd7\x69\x64\x8c\x05\x4b\xb0\x71\x6e\x6b\xa5\x9c\xa0\x2a\xc9\xf8\xf6\x25\x5e\x87\x68\x4a\x15\x75\x8b\x30\x52\x63\x7b\x1a\x1b\xef\x28\x14\x43\x6c\x17\x4c\xb7\x3a\xf7\x46\x49\x3c\xfa\xb0\x87\x2f\xee\x51\x67\xd4\x72\x48\xff\x90\xcc\x64\xfe\x86\x0a\x34\xd7\x96\x11\x3e\x7a\x49\x8d\x6c\x9b\x2a\x09\xf1\x85\x14\xcc\x35\xd6\x5d\xf1\xa5\x87\xbd\x88\x05\x8f\x2c\xd8\x57\xc7\xd6\x44\xf1\xd7\x91\xf4\xad\xe5\x2b\xb4\x98\xf0\xeb\x0c\x84\x95\x35\xf3\xf8\xfa\x5a\xd5\x2e\x94\x5d\x01\x73\x07\x86\x52\x76\xc9\x18\xf8\xe9\x8a\xd6\x30\xa8\xb4\x32\xe6\xc4\xe4\x86\x86\xc6\x0b\xb4\x73\xde\x59\xde\x6e\x83\xfe\x9f\xe9\xbd\x9d\xb5\x84\xb7\xcf\xe0\xf1\x37\xb3\xab\xab\x44\x61\xb6\xbc\x4d\xfe\xb9\x89\xf3\xc8\x6b\x8e\x45\x06\x14\x4f\x12\xd6\x7b\x92\x23\x00\x32\x1a\x5f\x28\x97\x2b\x1a\x72\x01\x8c\x6f\x5a\x67\x23\x34\xd8\xd8\xb6\x8d\xc8\xfc\x2a\x1c\x18\xe9\x95\x2b\x04\x05\xde\xe0\xda\x59\x7a\x10\x92\xa0\x6a\x7e\x7a\xdf\xc5\xeb\x21\xd9\xa7\x98\xfe\xce\x8b\xcc\x27\xc9\xd6\x87\x63\x63\x4b\x75\xbf\x0e\x26\x12\x21\x34\x15\x0b\x57\x3f\xca\xc4\x93\x36\x9c\x8b\xea\x0d\xf5\x2a\x5a\x97\xac\x49\x09\xfa\xbd\xab\x64\x96\xef\xc9\xc4\x19\x57\x35\x63\x84\xfc\xd1\xe1\xad\x41\x3b\xa1\xbe\x89\xb1\x66\x5d\xea\x6b\x0a\xad\x3e\x64\x0a\xbc\x85\x7f\xc1\xb7\xf0\xe9\xb5\x66\xfb\x69\xad\x5b\x03\x02\xbd\xbe\x7d\x60\x7d\x48\xee\x8c\x6d\x83\x04\x34\xc0\xbe\xf0\x2d\x99\x17\xcb\x90\xb4\x53\x14\x47\x30\xf2\xb5\x6a\x14\x46\x1f\x2e\x7e\x71\x69\x79\xd4\xf3\x6c\x5f\x22\x05\xf0\x6d\xc9\xe4\x62\x88\xee\x8a\x54\x0a\x11\xb7\x28\x97\xbc\x89\xce\x17\x4b\x7c\x6f\x79\xa9\xe4\x59\x1e\x8e\x57\x2e\x12\x5b\x93\xd0\x87\x46\x7a\x23\x02\x4a\x24\xdc\x9e\x7c\x46\x57\x49\x5f\x11\xd5\xaf\x2e\x2d\xa5\x76\xae\xed\x6b\x4f\x03\xfc\xb6\xa4\x73\x51\x64\x77\x45\x40\x0d\x21\xd7\x2f\xa3\x58\x20\xe4\x1a\x6f\x61\x73\xa3\xa2\x2c\x97\x81\xd7\xef\xa1\x2f\x30\xd3\x1a\x63\x31\x9d\x0b\x71\x9c\x81\x63\xd5\x63\x15\xd2\x7b\x4b\x2f\x41\x99\x65\xfb\xeb\x8f\xc1\xde\xd6\xe2\x5b\x08\xcd\x5d\x59\x79\x4c\xc2\x8d\x6e\x0d\x3d\xa8\x1a\xa7\x0f\x26\x3e\x71\xba\x5d\x01\xea\x8f\xea\x4e\x89\x10\x90\xd1\x51\x6a\xba\xca\xc5\x1a\xf5\x5a\x0f\xd2\x66\xb3\xf2\xc1\xc4\x08\xe6\xde\xae\x1c\x2d\x80\xec\x4e\x09\x12\x12\x72\x0b\x92\x54\xde\x65\x7a\x4c\x7b\x72\x57\x2b\x40\xcd\x35\xb0\x04\x9b\x88\x2b\x80\xd1\x9b\x19\x1e\x90\x4e\x33\xac\x94\x92\x07\x0a\xff\x9f\xe3\x63\x89\x0a\x75\xf5\xd1\x39\xe7\x72\x32\xf9\x59\xda\x42\xba\xee\xb9\x9c\x09\x5a\x38\x72\x3e\x2b\x17\x1b\xb9\x0e\x7a\xe5\x4e\x48\x76\xab\x4c\xf4\xea\x2c\xed\xcd\x89\xa1\x03\xd1\xda\x96\x86\x6e\xcf\x5d\x59\x1a\x2b\x72\x30\x6b\xa2\xc2\x5c\x06\x2e\x4c\xe9\xae\xd9\x3a\x69\xbe\x24\x05\x3b\x4d\xc4\x0f\xea\x3e\xca\xee\xd2\x1e\x46\xa2\xbc\xb9\xb4\x99\x68\x66\xda\xbe\x8a\xd6\xa0\x77\x6a\x91\xbf\xab\x75\x2a\xe9\x05\xb1\xdd\x15\x1d\xad\x29\xb9\xa0\xc5\x38\x97\xb6\xf3\x64\x14\x2b\x61\xf7\xf1\x64\xf4\xab\xab\x48\xa9\xcc\xf5\x20\x62\xca\xc0\x6f\x57\x4e\x17\xc2\x77\x87\x04\x95\x69\xb9\x6d\x49\x9d\x4d\xfb\x89\xe9\x6c\xba\x8a\x8c\xe2\x2c\x0f\x22\xa0\x00\xf6\x76\xa5\xb3\x3f\xa6\x3b\x24\x9a\x40\xc5\x4d\xcb\x65\x37\x61\x93\x2c\x8c\xea\x74\xed\x36\x75\xe6\x59\x39\xf3\xf0\xc6\x39\xb7\xe6\x24\x2d\x84\xe0\xc3\x49\xce\x62\xc4\xdb\x5e\x08\x9f\x2c\xd6\x9e\x86\xa1\x79\x77\x69\x85\xe6\xcc\xb6\x5d\x91\xb4\xa0\x77\xca\xe5\x6b\x7c\x6d\x8d\xc2\xb9\x38\xbe\x3b\x20\xa1\x96\x96\x8b\xfa\xef\x3d\xc8\x3b\x5f\x58\xc9\xab\xea\x2b\xad\xf4\xf2\x32\xe2\x7a\x45\x95\xf5\xeb\x9e\xa4\x89\x01\xcc\xe9\xd1\xbc\x4e\x5a\x33\x12\xdb\x12\xdc\x55\x31\xdf\x15\x09\x66\xaa\x3e\x88\x08\x53\x38\xa0\xaf\x08\xd3\xcb\xeb\x14\x61\x09\x46\x6c\x55\x84\x19\x89\x87\x16\xe1\xbe\x98\xef\x8a\x08\x33\x55\x1f\x44\x84\xf1\xd2\x54\x5f\x09\xc6\x77\x57\x33\x19\x78\xb6\x07\x30\x19\x08\xf4\xed\x9b\x0c\x0b\xe1\xbb\x2b\xd2\x4a\xb4\x7c\x10\x61\xa5\x33\x94\x7e\xb2\x8a\xc7\x12\x2b\xb1\xae\xf1\xbc\x66\x0b\x92\x3a\xf7\x60\x6a\x23\x82\xba\x08\xb6\xbb\x22\xa7\xcb\x9c\x4c\xad\x47\x4c\x6f\xfb\x1b\xb6\x74\x60\xb0\x1a\xeb\x68\xb6\x87\x90\xd4\xdb\x2d\x5a\xb3\x4b\xe2\xbb\x33\xb2\x7a\xfb\x50\x36\x6c\xaf\xf0\xa7\xbc\xb9\x9a\xa0\x36\x05\x06\xb7\x20\xa6\xf3\x02\xa0\x1b\x11\xd2\x05\x70\xdd\x15\x11\x75\x43\xa0\x9b\x13\x50\xdd\x94\x2c\x6d\x46\x4c\x5a\x5e\x8f\xc7\x1d\xa2\x38\x67\x88\x26\xf2\x17\xc1\xb9\x73\x91\xa6\xda\x91\x8d\x87\xb1\x97\x6a\x4c\xa3\x56\xba\xf8\x84\x2f\x73\x67\x57\x2a\xb8\xed\xfe\x56\xb9\x45\x35\x34\xa7\x8c\x87\x93\xfb\xb7\xc9\xec\x3a\x4e\xf7\xe8\xc3\x3d\xfb\xef\x2a\x07\x75\x6e\x22\x5e\xe1\xd2\x7f\xf2\x2d\xf0\xe2\x26\x9b\x25\x11\x1f\xa1\x13\x17\xf9\x2e\x50\x0c\xa3\x84\x49\x72\xef\x88\xc9\x21\xb6\xd9\x96\x76\x68\x74\x21\x09\xe5\xca\xa3\x4d\xc7\x05\x4b\xfd\x97\x11\x20\xdb\x2d\xce\x34\x1b\xb3\x57\x99\x70\xd0\x41\xb1\x4f\x58\xe1\x0f\xc5\x54\x8d\x62\xa0\x14\xf7\x40\x6c\xa8\x7f\x80\xac\x64\x16\xd8\x6c\x4b\x8d\xe8\x8b\x5a\xaa\xe7\x52\x71\xd3\x4f\x59\x3c\x1e\x94\x4f\xeb\x3b\x1a\x58\x8a\x27\x56\x5d\x82\x68\xe7\x7c\x94\x23\xd7\x1c\x81\x8e\x85\x6d\xc7\xec\xdd\x92\x5b\x8a\x7b\xa1\x34\x1c\x96\x16\x55\x76\xe4\x2a\xd5\x8b\x5e\x64\x7f\xe0\x45\x5e\xe7\x68\x4b\x67\xd7\x86\xa5\xd8\xa3\x64\x40\x75\x63\x34\x12\x89\x64\x70\x59\x21\x7c\x94\x8d\x8c\xa7\x9a\x5f\x20\x61\x5d\x2b\xb2\xe9\x8a\x6b\x6d\xfd\xad\x6f\x43\xa5\x4b\xa7\xce\xf2\xc2\xa7\xf0\xdf\x0c\xcb\x70\x67\x77\x58\xb2\x86\x7a\x7b\xdf\x64\x79\x89\x93\x10\xb1\xaa\xb7\x60\x8b\x78\x32\x05\xa6\x47\x19\xc9\x20\x35\xc0\xe4\xa5\x0a\x0b\x08\x74\x0b\x81\x88\x75\x47\xf0\x72\x6d\x81\x13\x10\xc5\x35\xf2\xe6\x71\xe1\x88\xcd\x2f\xc4\xcc\x43\x81\x73\xb0\x7f\x18\xbc\xc9\x4a\xe9\x5a\x89\x98\x84\xa3\x72\xe6\x7f\x9b\xa5\x75\xbb\xc3\xc2\x39\x41\x25\x77\x85\x99\x5d\xf9\x07\x46\xca\xcc\x3f\x78\x11\x14\xf7\x60\xd7\x7c\xac\xb4\x2e\xcf\xd2\xa5\x35\xcb\x30\x38\x3c\x3c\x44\x64\x49\x62\x7f\xfa\xb9\xff\x5d\xfc\x4f\x59\x48\xc9\x64\x7c\x29\x0d\x57\x6b\x06\xa3\xc6\x38\x16\x12\x1c\xd2\xeb\xac\x38\xd2\x0e\x53\xf0\x91\x2f\x81\x27\xdd\x12\x45\x48\x2e\x78\x7b\xe3\xb3\x74\xf5\xb5\x48\x65\xdb\xc5\xab\xfc\x71\x52\x8a\x7f\x19\xa9\x62\xa4\xd2\x28\x44\x50\xa5\x00\x58\x0d\x41\x51\x34\x8e\x57\xca\x32\x19\x9c\xb9\x1f\xc0\x0c\x20\x2a\xe9\x0c\xcb\x14\x01\xfd\x26\x71\x09\x63\x0c\x7d\x31\x0b\x93\xbb\xf0\xde\x91\x36\x96\xc4\xb8\x04\x29\xc1\x4d\xb8\x68\x9c\x7f\x97\x64\xbb\x43\xb8\xed\x05\xa6\xa5\x14\xa8\xe3\xd6\x7d\x96\xf3\x3f\x84\x9c\xff\x71\x77\x88\x85\x56\x51\xb4\xf8\x8d\xbf\x9d\x58\x50\xd6\x73\xb2\xb5\x18\x1f\xc0\x79\x0a\xeb\x68\xb2\x38\x62\x41\xba\x25\xdd\xa6\x15\x57\x28\xc5\xd8\xa8\x1e\x9e\xb3\x10\xfa\xaf\x52\xb3\x72\xcc\x3a\x15\x54\x1e\x66\x91\x52\x51\x9c\xaa\xdb\x97\x2e\xe1\xf5\xf1\x52\x78\x51\xad\x0b\xf3\x59\x88\x57\x17\xe2\x87\xe3\x72\x23\x4b\xdb\x78\xea\x86\xb9\xdb\x2b\x18\x91\xfe\x76\x16\x81\xb9\xc7\x03\x4b\x6b\x92\x15\x25\x57\x99\x9c\xe2\x9d\x1a\xfe\x84\xff\x36\x0c\x98\xc3\xf1\x39\x55\xac\xaa\x01\xf7\x6d\xd5\x9b\x13\x57\xb9\x77\x3e\x31\xc0\xbc\xc1\x58\xda\x67\x8e\x99\x65\xb5\xed\x03\x95\x75\x08\x42\xb4\xa9\x6b\x94\x8f\x49\x2e\x3e\x5b\xf4\x7f\x4c\xcf\xb5\x2e\xee\xcb\xbb\xae\xbb\xa5\x09\x3f\x4b\xfc\x67\x1f\xf6\x61\xd6\xd3\x12\x4e\xec\x8e\xed\x26\x9f\x88\x27\xf0\xd9\x9d\x5d\xca\xd1\x51\xeb\xf3\x67\x3f\x0b\xf9\xce\xba\xbb\x3d\xa4\xa0\x99\xe5\x55\x9e\x5f\x60\x26\xc4\xf8\xde\x53\xc9\x0d\x8a\x1f\x8b\xed\xe2\x01\xeb\x0c\x4f\xe1\xf1\xae\x9f\xdd\x42\x16\x73\x19\xc6\x7a\x55\xcb\x88\xb0\xa4\xa2\x7b\x1f\x3b\xfa\xc9\x49\x62\xe3\x33\xdb\xe3\x24\x0e\x8b\x17\x1a\x93\x8b\x32\x2c\xe3\xd1\xa2\x19\x80\xc0\xd4\xf8\xdf\x7d\xf2\xff\xf9\xc5\xa5\xf3\xff\xf4\x3c\x6b\x49\xff\x5b\xec\xf2\xae\x40\xbe\xad\x6b\xac\x0b\x62\x6a\x22\xc5\x8f\xfc\x0a\xb4\x50\xd1\x09\x6c\x6f\xc0\x43\xf5\x44\xb3\x18\xe5\x59\x92\xf4\x10\x4d\x7e\x71\x69\xd1\xd4\xf3\x3c\x80\x68\x0a\xe4\xdb\x12\xcd\x05\x31\xdd\x15\xd1\x14\x2a\x6e\x53\x34\xc9\x9c\xe8\x23\x9a\xf4\xe2\xf2\xa2\x29\xf3\x3c\x84\x68\x32\xe4\x5b\x13\xcd\xc5\x30\xdd\x19\xd1\x64\x2a\x6e\x53\x34\x29\x48\xda\x47\x34\xe9\xc5\xe5\x45\x53\xe6\xd9\x7e\x49\x13\x01\x7c\x6b\x92\xb9\x10\xa2\x3b\x23\x98\x4c\x44\x03\xee\x26\xca\x53\x9c\x6a\x0b\x17\x30\xd5\x19\xa8\xe4\x57\x5c\xa9\x9b\xf0\x36\xce\xf0\x5f\x3a\x41\xb6\xa5\x1c\x9c\xf1\x26\xae\x63\x98\xba\xc1\x55\x5a\xac\xe3\x49\xd8\x7c\xde\x60\x63\x6b\x14\x5a\x43\xc7\x89\xe9\x53\xe5\x80\xfa\x58\xe6\xe1\x5b\x9b\x09\x79\x6c\x7b\x8b\x39\xf9\x91\xa5\xb4\x17\x0b\xb9\xe5\xdb\xdc\x7a\xe9\x3a\xf5\xd2\xc0\xee\x94\x1d\xf6\x27\x7c\x21\xe9\x04\xbf\x09\x0f\x5a\x45\xfa\xc1\x48\x0f\x64\x97\x84\xd2\x53\x56\x40\x04\xe8\x03\xd0\xb1\x31\x33\xa3\x37\x39\xfb\xd1\xd3\xa1\xa0\xd5\xb2\x1c\xce\x4b\xfd\xed\xeb\x81\xc5\x14\x76\x81\x3c\xc7\x6e\x74\x5e\x3b\xbc\xd5\x49\xfd\x3d\x3f\x6b\x92\x5c\x4c\x82\xf1\xc1\xd0\xa9\x30\x7a\x0f\x6c\xbf\xfa\xe3\xa4\xd0\x1f\x18\x22\xfb\xda\x99\xfa\xf9\x78\xc1\x97\x07\xa1\xb4\x06\x07\x03\x3f\x7e\x00\x37\x2e\x24\xbe\x91\x66\xd4\xfa\x11\x03\x3d\x12\x0e\xf2\x49\x39\x4b\xfd\x5e\x43\x9b\xbd\xf3\xb2\x3b\xa4\x1d\x27\x45\xf0\x9e\x68\xc3\xd1\xc5\x51\x96\x83\x0f\x3a\xcd\x52\x6a\x6a\xfc\xd4\x0d\x8a\x3f\xad\xd0\xfe\x0e\x46\xbf\xca\x66\xa0\xee\x66\xd4\x27\xf3\x90\x28\x6c\xe1\x1d\x4a\x5c\x7e\xbf\x9b\x13\x96\x11\x00\x4b\x8f\x5e\x4f\x9b\xa1\x31\xaa\xd4\x1a\x25\xc5\xb2\x08\xdd\x44\xfe\xee\x1b\x73\x06\xb9\x72\x5e\xcc\xd3\xa0\x51\x07\xd6\x84\x3d\x51\x0f\x9a\x8d\x82\x63\x91\xf6\x86\x8a\xee\x87\xab\x83\xae\xc3\xe0\x2a\x44\x18\x67\x53\x34\x47\xf9\xa6\xd1\x38\x1e\xc1\xf3\x12\x35\x52\x9e\x65\x65\x4b\xe3\x4a\x60\xa1\x2e\xd1\xdf\x83\xec\x0f\x09\x6f\x95\x6f\xed\x17\x7a\xb4\xe1\x37\x13\xb6\x39\x61\x7d\x86\x17\xa4\x1c\xdb\x05\xd7\x94\xfa\x6a\xab\xad\xe1\xd4\x70\x6f\xb1\x38\xe5\x82\xa9\x0d\x0e\xef\xea\x47\x52\x0d\x6b\x6c\x13\xca\xee\x0f\x20\x11\xee\xb9\x00\x80\x52\x4b\xae\x73\xe2\xfc\xce\xc5\x34\xd6\x8e\x5e\x6f\x38\x56\x10\x86\x54\x93\x45\xb9\x59\xe8\x7d\x7d\xc7\xf8\x62\x0e\x3d\x5a\xd6\x95\x7d\x6e\x89\x44\x40\x32\xf5\x11\x85\x56\x52\x99\x6f\x7b\x5c\x9e\xeb\xf6\x42\x67\x69\x4b\x79\xc4\x60\xf0\xf2\xf4\xed\xbb\xd3\x93\xe3\xcb\xd3\x97\x4c\xcf\xdb\x2f\x0f\xff\xb2\xdf\x82\xec\x9a\xae\x83\x33\x34\x5b\x73\xc1\xd7\x84\xbc\xe3\x9b\x07\xd3\x04\x18\xec\xac\x9b\xc7\x70\xc9\x5e\xa8\xba\x51\x9f\xfc\x52\xce\x99\xd2\x2c\x52\x24\xe7\x60\xa4\x37\x5f\x27\x65\x37\x6e\xb0\xff\x3c\x88\xc7\xf0\x3a\xe8\x95\x3b\xc7\xdc\x40\x9c\xf4\xe7\x44\xb1\x24\xfe\xa0\x50\xb1\xf0\xe6\x10\x65\x23\xea\xed\xd9\xcc\xa1\x2f\xff\xbc\xef\x21\x2e\x03\x1d\x05\xa7\xbc\x56\x05\xec\x5f\xfe\x85\x10\xe8\xa5\xb3\xe8\x8a\x51\x79\x9e\x35\x95\x09\x79\x90\x05\x43\xc0\x6c\x6d\xbd\xac\x07\xf5\xc7\xbe\x5c\x98\xa6\x4e\x68\x75\xed\x19\x2e\x11\xf6\x2d\x18\x65\x09\x6e\x36\x08\x25\x20\x4e\x2d\x56\xf5\xf6\x04\x62\xcb\xe8\xf2\x5a\x01\x41\x0d\x47\x1f\x5a\x2d\x79\xfd\x95\xeb\x8d\xdb\x64\x0d\x70\xc0\x67\xc5\x8d\x1d\x92\xc6\xa2\x6d\x7b\x12\x7e\x50\x41\x8c\xbf\xc3\x66\xa4\xee\xf4\x64\x7e\x64\x85\x49\x82\x43\x5c\xe0\x87\x03\x3d\xb0\x75\xba\xdb\x52\xe4\x76\x08\x49\x77\xcb\x26\x4d\x46\x7f\x60\x50\x43\xbf\xcf\xad\xfc\x59\x32\xaf\x55\xaa\x38\xe1\x01\xa7\xaa\x41\x53\x1d\x54\xb7\x23\x2e\x68\x64\xfb\x2f\x96\x72\x2c\x2f\x20\x22\x1e\xa7\x81\x4f\x11\x99\x74\x80\xe6\x4b\xa1\xf2\x38\x4c\xe2\x7f\x87\x48\xcb\xfd\x9e\xdc\x19\x12\x22\xd6\x9e\x32\x93\xd7\xb9\x57\x65\xdf\x59\x0a\x33\x72\x88\x19\x3e\x18\x6a\x13\x08\xc0\xbc\xba\x27\x18\x4d\x90\x67\x28\x99\x06\x14\x27\xd6\xb1\xaa\x38\x95\xcc\x1d\x5a\xd5\xd5\x10\x60\x8d\xcb\x4c\x29\x99\xec\xcb\xe0\xfb\xcb\xd7\xaf\x0c\xd0\x8e\xd0\x0c\xeb\xd4\xe6\xfa\x17\x2e\x53\x91\x88\x31\x43\xbf\x3c\x60\x1e\x40\xff\xe1\xe5\x58\x3a\x81\x2e\x57\x9e\x05\xb6\xc2\x07\xce\xc1\xa4\x01\xd4\x62\x1d\xb0\xb2\x0c\xd0\xe7\x03\x4d\x41\xcd\xd7\xdf\x38\x0c\x29\xdb\xdf\x6f\x97\xb0\x19\xfe\xe6\x04\xd2\x34\x7e\x73\x17\xf3\x43\x48\x03\xea\x70\x4f\x95\xe3\x7a\xe1\xe8\x0c\x15\xe8\x6c\x13\x12\x5d\x7c\x64\x7d\x42\x01\xfe\xc5\x48\xc5\xba\x3d\x0b\xec\x90\xea\x63\x30\xcd\x8a\x58\xab\x35\x27\xde\xe2\x0e\x15\x12\x98\x7a\xcd\x1d\x06\x3f\xc4\xe5\x8d\x3c\xd6\x48\x61\x32\x1c\x65\xe6\x8c\x9d\xe6\x43\xda\x19\xa9\x0f\xd9\xc4\x72\x1c\x0a\x36\x25\x82\xea\x28\x48\x67\x93\x2b\x64\xc2\x4d\x39\x49\x8c\x6f\x80\x3b\x12\xff\x69\x24\x81\xf9\xbc\xa6\xf5\xaf\xf7\x66\x4c\xf9\x1a\xaf\x53\x0f\xcc\x5b\xfa\x9e\x08\x74\xb1\xbc\x5c\x15\xc0\x07\xd0\x07\xab\xc2\x2c\x42\x32\x9d\xc2\x10\x8f\x42\x31\xac\x5b\x4c\x36\xa6\x20\x96\xa6\xfc\xb2\x8a\x42\x52\x22\xb3\x24\x62\xa0\x39\xc7\xbb\xf2\x01\xaa\x13\xbd\x7f\x6f\x40\x99\xb0\x9c\x6c\x56\x9b\x80\xe5\x0c\x04\xef\x47\xcc\x8a\xb8\x50\x88\x10\xf0\x57\xad\x47\x5f\xfc\xd4\x89\x82\x0d\xad\xee\xf0\x44\xa1\x87\x0d\xf1\xdc\x3b\xb9\x14\x08\x6d\xf4\x48\x5c\x13\x96\x17\x4e\xc3\xad\x80\x6a\x45\xad\xba\x24\xe2\xc2\xae\x89\x26\x16\x5c\x66\x03\xc6\xa4\x65\xa9\xce\x8d\xf7\x2c\xb2\x24\xaf\xd4\x98\x02\x7a\x8f\xcf\x74\x5b\x01\xb2\xed\xeb\xea\xe5\x81\x65\xce\xf3\xf7\x8f\x42\x49\xaf\x4d\x22\x36\xa5\x9d\x97\x00\xf0\x91\xda\x6f\xc2\xf5\x0d\xa9\xdc\x93\x5c\x85\x78\xba\x12\x44\x4a\x4d\x81\xf7\xd3\x7b\x7b\xa3\x63\x11\x3e\xde\x01\xd6\x18\x06\x39\x4e\xa3\x53\x39\x17\x08\xbe\xe1\x13\x4b\x24\x65\x3c\x02\x8f\x34\xbd\xc6\xe8\x0a\x8c\x9d\xfb\x01\x1a\x3e\x1e\xa0\x98\x8e\x94\x9b\xc3\x74\xfe\x6c\x8a\xa2\xc7\x19\x01\x38\xba\x7f\x5e\x49\x5e\x72\xa4\xc6\xe1\x2c\x29\x65\x23\xc4\x6c\x78\xf7\x8e\x92\x40\x86\x88\xfd\xb0\x1e\xe8\xf4\x01\xc1\xe8\x26\x4e\x22\x60\x9e\x26\xd5\x08\x80\xb4\x24\xaa\x21\x71\x18\x7c\x73\x6f\x60\x8d\x61\x72\x86\x97\x29\xcb\xd2\x36\x8e\xf3\xa2\x34\x42\xf4\x54\xbf\x32\xe0\x13\x08\xf9\x96\x44\x87\x50\xac\x78\xf6\x34\xff\xa0\xc6\x82\x17\xe6\xd0\x78\xd8\x4c\x85\x17\x4d\xa7\xca\x2d\xa7\x26\x5d\x7b\xb0\x39\x47\x81\x05\xda\x22\x1f\x4d\xc7\x4f\xea\x23\x35\x5c\x33\xcb\x9e\x0f\x9e\x8a\x79\xdb\x3d\xd0\x35\x27\x98\xaa\x3d\xe1\x15\x9e\x75\x0f\x16\xa9\x18\xa8\x4f\x84\x34\x4f\x29\x2e\x5d\xcc\x59\x01\x8d\xe8\x4a\x4c\x70\x32\x2d\xef\x07\x6b\xb6\x70\xec\x0d\x8d\x16\xcb\x66\xbe\x61\xb3\xa8\x53\xb4\xa8\x61\x63\x20\x5c\xc6\xa0\xe1\x61\x8e\xc9\x4d\xed\xb4\x69\x9c\x9d\x6d\xcd\x24\x96\xdd\xe2\x31\xd3\xd8\x01\x71\x79\x22\x7f\xc3\x7b\xc9\xfa\xa8\xbc\x88\x47\x77\xa5\xae\xe3\x94\x2b\x30\x3c\x66\xf7\x7f\x65\x30\x1f\x2c\x08\xb0\x2a\xe4\x12\x26\xce\xd5\x63\x8b\x05\xac\x59\x72\x36\x1c\x11\x58\x1a\xda\x1d\x8e\x0b\x68\xa1\x79\x7c\x81\x01\x8f\x1b\xbb\x10\x1e\xa8\x01\xbc\x8c\xba\x17\x7e\xac\x1c\x25\x58\xd5\xf8\xeb\x48\x3e\x5a\xb3\xf5\xc7\x3f\x2e\x68\xfd\x4d\x13\x4c\xac\xe1\xab\x0b\xcc\x78\x2d\x5c\xc6\xe3\xe8\xab\x5a\xda\xe4\xc7\x08\x8c\x27\x1a\x95\xa0\x07\xfa\x15\xb5\xe3\x4a\xcf\x31\x89\xad\x1a\x41\x41\x00\x42\xe4\x0c\x7d\x95\x0a\xf4\xe3\x71\x92\xac\xcc\x78\x87\x36\x3d\x57\x9c\xa1\xd9\x34\xcf\x6e\xe3\x08\x1e\xe1\x51\xaa\x28\x7a\x52\x53\x92\x35\xeb\x0c\x62\x59\xab\x33\x67\x2b\xdc\xad\xe8\x6e\x18\xf1\x44\x06\x44\x0f\x50\x0f\x6e\x94\xf0\x61\xf0\x3a\xa4\x34\x90\x0e\x3d\xee\x2c\x5e\x7f\x17\xae\x2e\xe0\x46\xda\xa2\xea\x1c\x58\x30\x16\xb2\xa2\x76\x84\xc8\x9d\x1b\xa4\x9e\x8a\x00\x91\x3a\x00\x46\x1a\xfb\x9b\x19\x2e\x35\x65\xd7\xa0\xad\xa1\xf7\x9e\xf0\x9d\x62\x7d\x39\xca\x26\x57\x31\xba\xdf\x94\x0c\x24\xd0\x15\x0b\xee\xbd\x43\x78\x3e\x4a\x66\x94\xdb\x0d\xaf\xc5\xb9\x5b\xe3\xa2\x72\xf7\x00\xa6\x41\x17\x4f\xa7\x05\x55\xc0\xba\x30\x60\x31\x99\x16\x83\xc3\x94\x22\x34\x8a\x1e\xa7\x6b\x55\x36\x88\x31\x2e\x03\xfa\x03\x3e\x95\x78\x54\xd3\xfc\x95\x99\xc0\x04\xc0\x44\x97\x37\xb4\x43\xa3\xe0\x9b\x70\x48\x11\x14\xb3\xe9\x34\x89\xb1\x06\x47\x6c\x13\x6c\x60\xbc\x5b\xde\xa7\x28\x49\xe2\x82\x53\x15\x4d\x5d\x06\x4a\x38\x68\x20\x14\x27\x56\xc9\x7e\xcf\xf6\xc0\x6f\x73\x33\xd9\xb7\x49\xc3\xaa\xac\xb3\x98\x8b\x1c\x78\x32\x25\x04\x5e\x87\x99\x46\xc3\xb2\x99\xe6\xd9\x65\x75\xfa\x35\x1b\x54\x2e\x55\x1d\x83\xaa\x53\x9f\xc3\x1b\x4a\x62\x1d\x6e\x24\x4d\x67\x9b\x4a\x66\x89\x4d\x2b\x01\x98\x87\x26\xb8\x09\xea\xb2\x02\x5c\x76\x8c\x3f\xe2\x42\x20\xc5\xd7\x69\x3a\x00\xa5\x95\x57\x2b\x66\xbe\x25\x31\xa4\x1e\x9b\x9a\x0d\xb5\x57\x19\x54\x58\xa6\x0d\x7b\xe0\x2c\xbd\xcb\xc3\x69\x57\x14\xe6\x07\x78\xee\x6e\x10\xb3\x11\xf0\x1c\x93\x6e\x28\x2d\x79\x15\x07\x43\x84\x0a\x01\x98\x02\xf0\xa2\xcc\x7a\x98\x93\x35\xb7\x82\xa5\xf7\x5e\x53\xc0\x42\x09\x52\x78\x47\xf0\x33\xb4\x4d\xe4\xf1\xe9\x41\xd4\xa8\x40\x64\x76\xad\x56\x83\x60\xdb\x24\x93\x75\x88\x55\x5c\xae\x30\x2b\xab\x65\x41\xd2\xfc\x46\x2f\x34\xf8\x62\x73\x69\xf3\x48\xc3\xfc\xc4\xa5\xa6\xd5\xee\x3a\x4c\x73\x37\xc5\x6e\x36\x79\xc9\xed\x9f\x88\x64\xa3\xa9\xbb\x94\x70\xeb\x8f\xe7\xd0\x7c\x69\x62\x2f\xbf\x81\xf5\xa6\xbd\x9e\x3a\x8d\xa7\x53\xd4\xd6\x0d\xbe\x55\xcd\xef\x80\xa7\x8e\xd1\xbb\x10\x33\x1c\x6c\xfa\xf1\xe6\x2c\x4d\x55\xbe\x61\xd5\xb3\x7e\x32\xb7\x6a\x22\x36\x76\x75\x5e\x27\x15\xd1\x5b\x85\x5c\x8f\x58\x11\x31\xe3\x96\x5f\x19\x67\x25\x91\x28\xc0\xae\x92\x36\x3b\x36\x33\xd7\xa0\x31\xd5\x9a\xaf\xb7\x78\xa5\xb9\x1b\x0d\xd5\x9e\x76\x9b\x93\xc2\x3d\x6f\x28\x39\xab\xc1\xc3\xa2\x66\xf3\x0a\xdf\x37\xb7\x01\x7a\xf5\x0c\x14\xe3\x8a\xae\x3f\x8d\x7d\xfb\x4a\x03\x21\xd1\xcd\xe6\xcc\xe2\x0a\x72\x2c\x0c\xc7\xc1\xbf\x55\x9e\x1d\xf0\x1d\xa3\x18\x84\xe9\x9a\x2a\x93\x35\x47\x05\xd8\x09\x63\x38\x7c\x44\xaf\x55\x59\xe1\xe1\x11\xad\x25\xc1\xaf\xc1\x2b\x15\x6c\x16\x46\xc3\xce\xd7\x6e\x16\x5e\xa8\x30\x07\xa8\xb9\xe8\xa4\xdc\xed\x17\x0c\xc8\xfe\x0b\x27\x59\x8b\xd1\x57\x3d\xd0\x00\x8c\x70\x1e\xc6\xa9\xc1\x87\x58\x75\x9e\x3e\x41\x2c\xe3\xff\xb0\x34\x0b\x55\x9c\x74\x76\x5b\x2b\x0f\xef\x61\x67\x1f\xcc\xf5\xfc\x26\x91\x64\x9c\xaa\x17\xdc\x7e\xf3\xf5\xa5\x83\x72\x15\x67\x74\x05\x53\xf1\xe8\xc6\xb5\x9d\xbe\x83\x65\x89\x4a\xaf\xcb\x9b\x56\x5a\xb6\x21\x6c\x7e\xad\x5f\xdb\x19\xe2\xb5\x1d\xba\x11\x41\x17\x2a\x46\x98\x66\xa0\x37\x19\x7d\xdf\xc7\xd5\x3d\x01\x68\x0a\x8a\x05\x46\x38\xc1\x08\xf3\xe6\x8f\x82\x2f\x0f\xff\x7b\xa8\x43\x15\xf8\xaf\xff\xf1\x80\xae\xd2\x89\xc1\xfe\x49\x44\xdd\xab\xbe\xe7\x3d\x61\x24\x7f\xae\x2c\x82\x1a\xce\x51\x83\x47\xb9\xd8\x46\xe2\x0a\x4c\xc5\x5d\x66\x71\x69\x8c\x85\xe2\x05\x4c\xb4\xd5\xec\x51\x91\x0b\x06\xfc\xdc\x17\x9a\xff\xe7\x1c\x44\x49\x9c\x60\x9a\xc5\x56\xf3\xeb\x4b\x52\x18\x78\x76\xea\x39\x9a\xb8\xa5\xce\x62\x00\x5e\xf1\x24\x48\x63\xac\x0c\x1b\x27\xa1\xb9\xec\xa3\x47\xd7\xfb\x91\x56\x7f\x7f\x1a\x58\xbb\x50\xde\xd9\x97\x9b\x0a\x95\x74\xb6\x28\x6a\xb8\xd2\x29\x9f\xbc\xb0\x5a\xb8\xf3\x06\xc9\x8a\x8c\x32\x9f\xbb\x67\x75\xcb\x51\xdd\x22\x85\x15\x28\xe4\xa1\xc1\x62\xde\x4d\x98\x15\xf1\xc0\x73\x16\x63\x15\x8e\xf3\xf0\x5a\x6f\x0c\xcb\xc0\xef\x1d\xda\x6c\x12\x6a\x50\x48\x08\xb4\xfa\x18\x17\xb4\x2e\x6a\x2e\xdd\x32\xd0\xc3\xd7\x1a\xe6\x3e\x31\x44\x27\xa1\x67\xa1\xa8\xa1\xae\x5d\x9a\xdc\xcb\xf9\x05\xef\x90\x76\x69\xf7\xd7\x0d\xde\xad\xdf\x16\xcd\xc0\x57\x91\x0d\xbd\xc3\x6b\xf8\xa0\xa8\xe8\x72\x8d\xcb\x42\x47\x21\xdf\x66\xad\x77\x1d\x86\xb8\xa1\xb3\x79\x49\x49\x4a\xc6\xde\xc0\xa0\xb0\x9b\xc3\x64\x60\x46\x13\x41\x15\x46\xdd\x9b\x21\x4b\x78\x63\xcc\x71\xb0\x3c\x24\x7d\x0f\x6f\xcc\xa6\xf0\x12\x18\xcd\xd7\x37\x94\x1a\x15\xa6\x23\xf8\x14\x0b\x04\xc5\xb6\xce\x69\x99\xab\xd6\xb2\x3f\x1b\x24\x64\x92\x15\x00\x4b\x4d\x3b\xb5\x2f\x86\xcf\x54\x74\xa9\x58\xdd\x80\x8e\x3d\xc7\xf3\x8e\xdd\x16\xde\x78\x42\xb3\xc1\x98\xe7\x13\x3e\xc6\x19\xa3\x3b\x45\x05\xa3\xd3\xcc\x8c\x14\x17\xee\x65\x38\x7d\x61\xd3\x5c\x27\x1e\x57\xc2\x98\x7e\x85\x03\x04\x51\x85\x51\x3f\x5e\x2f\xb4\x13\xed\x2e\xfb\x49\x05\xd7\x15\xef\x22\xab\xa4\x59\xe1\x7e\x32\x14\x52\x36\xe6\xe2\x38\x5c\x8b\x10\x48\xe9\xf0\x47\x5d\x8e\x9a\xb6\xa5\xd0\x2d\x9a\x55\x8d\xd9\x23\x72\x9a\x0e\xd6\x35\x93\xe9\x1b\xbd\x7d\x07\xff\x45\xf4\x81\x7b\x93\x36\x5f\x5d\x35\x04\x83\x11\xe2\x85\xcd\x08\xf0\x88\xd6\x97\xb8\x5a\xa9\xee\x5d\x54\x1c\x85\xdc\x03\x6f\x52\x1b\x2d\x1e\xf1\xca\x46\x88\x73\x74\x49\xa6\x38\x08\xc7\x28\x9b\xd0\xa7\x94\xcf\x5a\x81\x58\x4e\x48\xbb\x0e\x48\x4e\x75\xf8\x15\xab\xc6\x83\x3b\x46\x5e\x33\xd9\x37\x94\x97\x32\xc5\xe8\x8e\x78\xb7\xae\xb0\x8d\x6e\xf0\x9a\x7e\xf3\x19\x74\xd3\x29\x1d\xae\x44\x5d\x15\x06\x2f\x63\x97\x95\xc8\x05\x66\x14\x75\x86\x5d\xa2\x59\xf7\x91\xb3\x36\x1b\x31\x2e\x23\xe9\x35\xf6\x54\x90\xdc\xc1\x39\x11\x98\xb4\x29\xee\x82\xc3\xfc\x59\xc2\x32\x2d\x01\xbb\xc3\xe0\xfc\x5d\xc7\xd7\x2d\x5f\xa1\xd8\xcc\xd8\x39\xc4\xc8\xe3\x5d\x98\x47\xce\xa9\x58\x12\x16\x5d\xd1\xbb\x20\xf0\x69\xf7\xaf\x5a\xd0\x67\x55\x3a\x82\xa4\x3b\xea\xd8\x57\xc6\x12\x04\xf0\xc2\x90\x4f\x0b\x52\xd0\x9b\xb0\x39\x5c\xa9\xab\x26\x39\x34\x6a\x61\x96\xde\x05\x6c\xb9\x07\x22\x4a\x35\xac\x49\x9a\x87\x1a\xb6\xe0\x57\x36\xb4\xd9\x20\x07\x1c\xf4\x8d\x0b\x8f\x38\x8e\xe6\x6c\x24\x48\x7b\x00\xd4\xdb\xab\x7a\xd4\xbc\x7a\x10\x72\x75\x6d\xcb\xcb\xca\x48\xc7\x46\xfd\x38\x90\x9e\xeb\x30\xaf\x86\xff\x62\xae\x73\xa5\x17\x4c\x93\x70\x56\x80\xa8\x6f\x60\xcd\xae\x73\xd3\xd1\xd5\x9c\x43\x81\xcd\x39\x83\x18\x93\x5b\x40\x7b\x3c\x4a\xea\x2c\x6f\xc3\x12\xf6\xfd\xd7\xc5\xa3\xc4\x7e\x05\x1f\x87\xd0\xef\xb7\x2c\xfa\xdb\x24\xec\xe6\xb4\x9d\xc2\xd1\xd3\x75\x18\x3f\x46\xf7\xdc\x84\xb7\x7c\xcf\x4f\xf3\xa4\xc3\xb5\xf2\x0f\x89\xb7\xbf\xda\x6e\xc2\x62\x93\x5b\xf5\xfa\x49\x61\x93\xa8\x7c\x67\x65\x01\x7c\xcd\x10\x7d\x3c\xc4\x93\x1b\x35\xfa\xe0\x2d\xa0\xb6\x34\x73\xed\x79\x85\x4d\x89\x1a\xb5\xdc\x0c\xd7\x76\xcf\xf1\x4e\xe5\x18\xed\xe6\x44\x85\x45\xe9\x1c\x6e\x16\xb5\x73\x41\x26\x1a\x1f\xb3\xd5\xd2\xd9\xb6\x27\x37\x71\xa3\xd8\x48\xbe\x61\x4d\x6e\x76\x9a\x88\x3d\x0c\x45\x67\x41\x98\x40\x79\x70\x06\xf0\x8d\x46\x6a\x4a\xa5\xb5\x6c\xa1\xa9\x21\x7b\x3c\x43\xf1\xab\xc5\x8a\x94\xcf\x9e\x16\xe2\x0f\xf9\x27\x89\xf6\x98\xf3\x70\xd1\x24\x84\x56\xb3\x14\x38\xb8\x80\x49\x6a\x33\x49\x3f\x49\x1e\x6f\xca\xd0\x03\x22\xfb\xbb\xd9\x27\x49\x3d\x35\xef\x54\x6f\x79\xea\x29\x73\xb0\xc7\x4e\x91\xa1\xdf\x2a\xe6\x00\x1e\xf5\x22\xf2\x6d\x26\x01\xfa\xff\x5d\x16\xc1\x5b\x74\x23\xba\x6c\x2c\x97\x77\x3a\x18\x18\x3a\xeb\x75\x9a\x67\x00\x2d\x2b\xe1\x5a\x11\x3c\x57\x47\xe3\xa0\xc2\x3e\xee\xcf\xd7\xba\x2d\xea\x1c\x2a\x47\x51\x69\xe9\x75\xab\x37\xc6\xe9\x6d\xf6\x41\x45\xad\xee\xad\xc3\x1f\x9f\x26\x93\x70\x3a\xd0\x93\xd4\x75\x46\x94\x4d\x4e\xe7\x7b\xb2\x6d\xd6\x6b\x3c\x99\xa8\x28\x0e\x4b\xac\x2b\x3a\xce\xb0\x77\x2a\xe5\x3c\xc4\x57\xc9\x32\x77\xfb\xce\xc6\xee\xd6\x86\x81\x48\xb9\xbf\x31\xe4\x3e\x96\x9c\x73\xc3\x02\x9e\x62\x18\xcf\x4c\x94\xc2\xfc\xb0\x40\x62\xd7\x40\x09\xcb\x07\x3c\x61\x44\xf0\x16\x3a\x5d\xa4\x78\x36\x70\xba\x46\xc5\xc5\xaf\x69\x3c\xc2\x03\x57\x24\x07\x26\x92\x6e\x88\x22\x18\xb9\xcf\x82\xab\x19\x06\x73\x4b\xff\x9a\x8a\x13\xf3\xf6\x92\xb3\xac\x0a\xd6\xb5\x76\x1b\x74\x30\x07\xc2\xd7\x4b\x2e\x09\x73\x52\x15\x55\x4e\x8a\x2c\xca\x6c\x6a\x63\xf4\xf5\x65\xa4\xaa\xc9\x01\xda\xbc\xe1\x22\xe4\x1b\x61\xd6\xfb\xb4\x8c\x1b\xd8\xa5\x7d\xcd\x26\xfe\xed\x1a\xfb\x8c\xab\x6f\xab\x2d\xd7\x46\xf0\x0b\x9f\x3c\x76\x76\xc9\x7b\xf6\x40\xe5\x53\x62\x17\xc7\x26\x3e\x15\x56\x01\xd0\xa6\x2d\x6c\x17\x97\xea\xc6\x12\xdd\x18\x32\xd3\x98\x93\x8f\x95\xf3\xee\xd6\x86\x63\xb6\x48\x3a\xc8\xba\xf0\xd9\xda\x99\x00\xa2\xb7\x94\xf7\xb5\x61\x02\x34\x5a\xf2\x5e\x95\x68\x4a\x7e\xa6\xc9\xcc\x1c\x8e\xb5\x5b\xc7\x72\xd1\xe4\xbc\x75\x61\xb2\x29\x8f\x0e\x71\x5a\x30\xe5\x8d\x0f\xae\x4d\x26\x84\x9f\x70\x81\xf6\xa9\x9c\x51\x56\x2f\xda\x67\xe3\x31\x80\xf4\x96\xae\xf4\x75\xb9\x23\x7a\x22\xbe\xfc\xb7\x74\xfc\xf7\x11\x1a\x7c\x8c\xd1\xc2\xf6\x1e\xa2\x6b\xf3\x4e\x3e\x39\x7a\x14\x0f\x44\x90\x0d\xed\xd8\xdb\x35\x8c\xab\xab\x70\x6b\xbb\xb6\xf0\x6e\x3d\x26\xf1\x4e\x32\x74\x3d\xa6\xf2\xe3\x60\xe0\xaa\x46\xf2\x4e\x32\x70\x75\xe3\xf9\x71\x30\x6f\x59\xb3\xb9\x29\x5e\x85\x77\x68\x54\xb4\x7c\xbc\xea\x71\xee\x33\xb9\xba\x5d\x2a\xca\x52\xa3\xc6\x27\x11\x77\x42\x72\x2c\x1b\x77\xea\x41\x91\x4f\x62\x5f\xad\xaf\x83\xad\x2f\x71\xe0\xd2\xfa\x02\x4e\x8f\x8f\x6f\xeb\xd9\x3e\x1f\x13\x9f\xd6\x11\x69\x7a\x7c\x7c\x5a\x7d\x97\x7c\x4c\x3c\x5a\x75\xaf\xfc\x94\xf6\x01\x8d\xcb\x82\xb5\xef\xfa\x1c\x4c\x86\xd8\x1c\x19\x9f\x7b\x85\x07\xc3\x20\x0f\xd3\x6b\x3a\xa5\x25\xa9\x69\x3f\xff\x2b\xca\x30\x2f\x17\xc9\xa2\xf6\xae\xa2\x1a\x48\xf8\x0e\x2a\x17\xff\x63\x24\x95\xa4\xf6\x63\x9f\xcb\xf8\x56\xd1\x19\x9a\xde\x0b\xa8\x3e\x02\x47\x29\x9c\x0e\x9f\xb6\xe9\x82\x9b\x33\xad\x95\x18\x3c\x5d\x19\x4a\x5a\x2d\x57\x8a\x16\xc8\x5a\x80\xc4\x8f\xb3\x49\x5c\x96\x78\x48\x48\x67\xae\x44\x76\x94\x9b\x38\x9d\xc1\x10\x98\x2b\x9e\x74\xa0\x27\xf2\x91\x00\x8b\x06\xc4\x0a\x27\xa0\x97\x46\x2f\x7a\xa4\x86\x5f\xdc\x64\x77\x34\xea\xbf\x66\x8a\x6b\x8a\x7a\x4d\x5b\x81\x1f\xba\xab\x78\x90\xa5\x5e\xd8\x6d\x5e\x24\x8c\x06\x7c\x83\x0d\xd4\x9a\x16\x04\x9d\x82\x4a\x77\x35\x33\xfd\x61\xf0\xd2\x2d\x84\xfe\x91\x89\x02\x88\xa5\x51\x98\xc3\x8c\xe3\xb1\xc2\xba\xb8\xfc\xae\x47\x02\xfa\x69\x60\xa6\x74\x17\x88\x5c\xca\xa8\xe0\xfd\x3a\x4c\xe3\xe9\x2c\x41\xcb\xa2\x17\xf6\xa0\x18\xc0\x87\x58\xb8\x88\x45\xaa\xee\xfe\x97\x86\x76\xfb\xd5\x79\x73\xb8\x75\xf5\xb4\xe3\xc5\xd0\xe8\x7b\x1c\x4d\x98\xea\x71\x8f\x82\x6f\x65\xb0\xae\xe0\xe6\x96\x90\x35\xc9\x00\x97\x74\xc4\x7d\xe7\xd5\xee\x70\xee\xf8\xd2\xfc\x43\xae\x2f\x18\x7a\x2f\x8d\xf8\x22\x94\x4e\x1c\x88\x14\x83\x6a\x8e\xcc\xe3\xb2\xda\x37\x98\xc9\x61\x33\x04\x34\x39\x1e\x9c\x18\x5b\x12\xff\x4d\x0b\x9a\x41\xc3\xda\xb4\x8f\x52\xf6\xb6\x4c\xee\x87\x13\xf5\x06\x86\x74\x4a\xff\xef\x4f\x22\x35\x4a\xc2\x1c\xef\x7a\x45\xb3\x44\x05\x7b\xdc\xf6\x76\x2f\xf8\x95\x46\x05\x73\x24\x83\x2d\xfc\xaf\xc1\x9f\xdc\x77\x6f\x43\x6d\x3e\xea\x91\x2e\xb0\x02\xe4\xe8\xb9\xf7\xc6\x9f\xaa\x0f\xff\xff\x00\x00\x00\xff\xff\xa3\x3d\x8d\x7a\x4a\x45\x02\x00") func uiTsTypingsJqueryJqueryDTsBytes() ([]byte, error) { return bindataRead( _uiTsTypingsJqueryJqueryDTs, "ui/ts/typings/jquery/jquery.d.ts", ) } func uiTsTypingsJqueryJqueryDTs() (*asset, error) { bytes, err := uiTsTypingsJqueryJqueryDTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/typings/jquery/jquery.d.ts", size: 148810, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } var _uiTsTypingsMithriljsMithrilDTs = []byte("\x1f\x8b\x08\x00\x00\x09\x6e\x88\x00\xff\xb4\x58\x5b\x4f\xdb\xc8\x17\x7f\x0e\x9f\x62\xd4\x27\x47\x8a\x42\xf5\x7f\x74\xda\x44\x55\xa1\xe2\xbf\x2a\xd0\x25\x09\x5b\x09\xa1\xd5\xc4\x3e\x49\xbc\xd8\x1e\xef\xcc\x38\x21\x5b\xf8\xee\x7b\xe6\xe6\x4b\x6c\x07\xc2\x0a\x04\xd8\x9e\x99\x73\xbf\xfd\xec\xd3\xd3\xcb\x48\xae\x79\x14\x93\x8f\xc3\xff\x0d\x3f\x12\xb9\xcb\x80\x84\xb0\x8c\xd2\x48\x46\x2c\x15\x64\xc9\x38\x99\xe1\xa2\x08\x78\x94\xc9\x93\x10\x82\x98\x72\x20\x09\x0b\xf3\x18\xc8\x9f\x89\xa5\xfe\x75\xd2\x8b\x52\x09\x7c\x49\x03\x20\x96\xe5\x54\x52\x19\x05\xb8\x75\xd2\xeb\x7d\x9a\x11\x78\x94\x90\x86\xc2\xed\x7e\x65\xa9\xe4\x2c\x8e\x81\x8f\x3d\x01\x31\x04\x92\x71\x9f\x08\xc9\xa3\x74\x35\x20\x54\xe2\xcd\x22\x97\x20\x7c\x47\xf0\xa5\x58\x1a\x90\xe1\x70\x18\xac\xa3\x38\xe4\x90\xfa\xe4\x0b\xe7\x74\xf7\xc9\x50\x3e\xd9\xc3\xb7\x11\x97\x39\x8d\xcf\x63\x48\x20\x95\x4f\x85\xcc\x24\x63\x29\x2e\x7c\x9a\x8d\xc7\xfd\x82\x73\xfd\xf0\xe8\x0d\xea\xbe\xaf\x3e\xa8\x50\xc6\x59\x86\x87\x3c\xbc\x26\x91\x80\xe2\xe8\x0f\xf3\x8c\x5b\x7d\xb2\xbf\x88\x97\x0c\xb8\xdc\xe1\xe6\xa8\xc2\x62\x43\xe3\x1c\x19\xcc\xfa\xd5\xf3\xfb\x07\xbd\x96\xdd\xeb\xc5\x5f\x68\xf6\x78\x44\x4e\x4f\x49\x12\xad\xd6\x92\x2c\x80\xc8\x35\x95\xf8\x2f\x12\x44\xac\x59\x1e\x87\x6a\xad\xa0\xa0\xe9\x6e\xac\xb4\xdf\x22\x27\x15\x3e\xa5\xbe\xde\x29\x3d\x17\xd0\x38\x5e\xd0\xe0\xc1\x27\x4e\x31\x24\xea\x93\xcf\x63\xb2\x61\x51\x88\x5a\x78\xa5\xb1\xe7\x1b\x74\x87\xde\xc3\x33\xda\x2d\x26\x0d\x0f\x47\x8b\x33\x26\xad\x2b\x7d\x72\xc5\x42\x40\xa1\xce\xef\x3e\x69\x89\x04\x0a\x9d\x8d\xde\xca\xbc\x24\xce\x15\xb3\x77\x52\xec\x78\xde\x86\x16\x89\x83\x92\x61\x37\x83\x01\x99\x51\xbe\x1a\x7b\x15\x7d\x7e\x50\x4e\x13\xc0\x12\x8f\xfe\x81\xb0\xa9\x9c\xa5\x18\x90\xc7\x89\xaf\xee\xfa\xad\x16\xa0\x7c\xfc\x95\x3c\x17\xd2\x5b\xcb\x24\x76\x79\xd0\x77\x37\x5a\x45\xac\xa2\x10\x78\xdd\x06\x57\x39\x17\xb3\xcb\xef\x67\x2c\xc8\xd5\x03\x52\xa9\x24\x19\x1d\x41\x82\x2e\x2e\xea\xb4\xb5\xda\x06\xaa\xe3\x05\x70\x03\x01\x07\xaa\x5a\xe0\xc4\x27\x0b\xc6\x62\xa0\xe9\x7b\x88\xbb\xbb\x7f\x8d\x40\x2d\x31\xe4\x74\xeb\xab\x46\xdb\xeb\x79\x9a\xa4\x55\xb3\x1e\xfa\x91\x4a\x58\xed\x9a\xf5\x6b\x3c\xac\x4b\xfc\x59\xb3\x64\xd8\x4c\x2d\xc7\x23\xb2\xa9\x6e\x1f\xce\x0a\x9a\xc7\xf2\xc6\xf0\x72\x55\xad\x59\x97\xad\x5b\xef\x0a\x93\xc1\x85\xa2\x47\x88\x2c\x62\xf3\x46\x69\xda\x67\xd0\xe0\x16\x89\xff\xab\x31\x47\x63\x95\xd2\x85\x33\x55\x15\xe2\x28\x7b\xc4\x93\xa6\xe3\x0d\xc8\x26\x64\x89\x7b\xaa\x9a\xe0\x65\x54\xae\x4b\x3d\x32\x55\x22\x62\xa2\x5b\xd8\xc0\xf6\xc3\x1b\xc8\x62\x9c\x89\x17\x91\xc0\x81\xb1\x6b\x0f\x99\x57\x4f\xff\x9e\xe6\xe3\x3d\xc0\xae\xa5\x3c\x7a\xba\x2f\x41\x6d\x61\x91\x63\x8e\xfd\x9e\x03\xdf\x4d\xf5\xa2\x17\x52\x49\x2b\xfa\x9a\x55\xcb\x59\x40\xf3\xe4\xd4\x49\x31\x24\x45\x82\xc0\xdf\x39\x08\x55\xb7\x1e\xcb\x34\x1c\x28\x7c\xfc\xf3\xe2\xe6\xda\x2c\xf5\x5b\x66\x91\x36\x03\x63\x05\x9c\x2b\xc7\xea\x0c\xc3\x16\xc0\x39\xe3\xaa\x9d\x9f\xab\x9b\x7a\x2a\x8c\x2b\x03\xe7\xcc\x12\xda\x71\xa4\x55\x11\xbb\x34\xa8\xcc\x3f\xd1\x22\xf4\xee\xbe\x45\x95\xbb\x7b\xa3\x8c\x90\x94\x4b\xd5\x89\x72\xa9\x8b\xcc\xab\x88\xc7\x14\x6c\xdd\xc1\x2d\x9c\x74\xdf\x10\x00\x61\x3a\x49\x22\xf2\x48\x82\xb6\x2b\x13\xae\x0e\x13\x16\x3c\xfc\x11\xa5\x21\xc3\xca\x34\xd7\xbe\xbb\xd1\x86\x21\x1c\x52\x61\x77\x8e\x75\xe6\xa8\xbf\x06\x5c\xaa\x37\x06\x2d\x00\x53\x00\x33\x26\xcd\x93\x05\x70\x45\x2b\xe9\x6a\x52\x8d\xbc\x42\x49\x2a\xdf\x1a\x08\x49\x6d\xba\xce\x63\xf2\xf1\xee\x7e\x64\xe4\xa2\x49\x58\x67\xcb\x68\x95\x73\x6d\x2f\x59\xe6\x69\x60\x6e\xd0\x52\x9a\x12\x5b\x27\x2d\x1a\x5a\xd5\x0c\xb9\x56\xf0\xf8\xa2\x72\xd5\xa1\x4a\x6a\xd2\xd1\x14\xcb\xd8\x58\x85\x4b\xc3\x08\xea\x49\xc9\xc6\x1c\x3f\xa0\x6a\x85\x42\xe9\x29\x23\x19\x43\xcd\x75\x08\x63\x85\xb8\xc2\x89\xd6\x5c\xad\xaf\x68\x63\x4b\x4d\x6b\x3e\x28\x35\x3c\x53\x90\x19\x85\xc9\x35\x60\xa2\x2c\x04\x48\xc2\x96\x44\x03\x16\x03\x91\x1c\xcc\x4e\x01\x42\xd1\xe6\xdb\x8d\x0b\x7a\x90\x63\xf2\xa7\x52\x0d\x51\x28\x1d\x3b\xea\xc8\x9a\xb2\x67\x6a\x62\x96\xe6\x69\xcc\x68\x38\xf1\x60\xa3\x88\x37\xc6\x9d\x1a\x2f\xbd\xc4\xe0\x9b\x4b\x84\xce\xb6\x6c\x62\x7e\x98\xdf\x6d\x04\xdb\x83\xad\xdd\x30\x09\x24\x8f\x0d\x08\x3d\x04\x94\xbb\x95\x7e\x05\x88\x31\x92\x82\xe2\xd9\xef\x36\xf9\xe9\x17\x06\x66\xab\x2c\x9b\x91\x67\x15\xf6\x0d\x5a\xe1\xd7\x4d\x1a\x37\x94\x79\x01\x12\xbd\x08\xaf\x50\x3f\x62\x7f\xaa\x5a\x7a\x0e\x42\x7d\x1e\xcf\x5e\xab\x4a\x13\xc9\x17\xb1\xd2\x90\xb1\x8a\xfa\xf5\x82\x64\xbf\x4d\xaf\xaf\xdc\x7e\x17\xb3\xbd\xd7\x88\x7d\x8b\xca\xe6\xfb\xdf\xa5\xb9\xa9\xfd\x52\x3c\xef\x2a\x73\xf1\xbe\x15\x64\x1a\x09\x2d\x22\x2a\x83\x45\xb3\xe2\x20\x58\xbc\x01\xa3\xed\xc4\xa8\x5b\x22\x3c\xd5\xb0\x8b\x2d\xf5\x52\x52\x6e\x76\xbf\x85\x75\x59\x37\xcd\x83\x00\x84\xf8\x6a\xdf\x76\x14\x5e\x9e\x5b\xa7\x55\x7c\x35\xdf\x77\xde\x1e\xff\x79\x27\x7f\x3d\x52\x0b\xee\x7b\xac\xdd\xbc\xad\xb1\x2f\x90\xc5\xfc\x85\xf8\xbf\x22\xba\x6b\x48\x51\xa6\x27\x8c\x91\xe5\xab\xdc\x4c\xbf\xac\xcd\x3b\x0c\x79\x2f\xba\x06\xcd\x41\x3e\xb7\x25\x1f\x15\xde\x01\xd1\x30\xa5\xe4\x69\x9c\xa7\xf8\xde\xb6\x43\x1d\xa7\xcf\xe0\xb6\xdb\x92\xe3\xb8\xce\x5f\xc7\xb5\x41\xf5\x06\x29\xcf\x2d\x71\x2f\xb1\x9d\x8e\x3b\x76\xb8\x35\x0b\x6b\x43\x31\xe7\x71\xed\x51\x00\xaf\xed\x67\x38\x45\xb7\x8c\xd7\x89\x14\xd4\x9c\xb8\xd1\xd1\x53\x79\xba\x42\xe0\x9e\x86\x25\x26\xd6\xbc\xd2\x2d\xa7\x99\x2d\x97\x89\xc5\xa7\xa6\xfa\x2c\xa5\x39\xa1\x4d\x6b\xdd\x47\x65\x0c\xfa\x30\xbb\x33\x36\x75\x0b\xee\x60\x45\x27\x68\x9c\x3e\x2b\x97\x2a\x45\x62\x79\x63\x6f\xe2\x08\xe9\x26\xde\xe3\x1a\xdd\xfc\xf3\xf2\xfb\x85\x94\xd9\x8d\x81\xc9\x03\x72\x10\x24\x97\x42\xd5\x37\xb6\xc9\x3e\x46\x77\xad\xc5\xe2\x8d\x37\x08\xa8\x1f\x76\x1e\x57\xdf\xee\xaa\x61\x78\x3e\xc1\x5a\x77\x5f\xf1\x36\x94\x3b\x56\x7e\xf1\x2d\x6f\x58\xfb\x7c\x37\xaa\x1d\x4e\xba\x8f\xed\x7f\x1a\xfc\x60\xcf\x7d\xb0\x53\x0e\x1e\x33\xc6\x25\xf9\x4c\x92\x11\xaa\xf0\x6f\x00\x00\x00\xff\xff\x3a\xb5\x30\x94\x78\x14\x00\x00") func uiTsTypingsMithriljsMithrilDTsBytes() ([]byte, error) { return bindataRead( _uiTsTypingsMithriljsMithrilDTs, "ui/ts/typings/mithriljs/mithril.d.ts", ) } func uiTsTypingsMithriljsMithrilDTs() (*asset, error) { bytes, err := uiTsTypingsMithriljsMithrilDTsBytes() if err != nil { return nil, err } info := bindataFileInfo{name: "ui/ts/typings/mithriljs/mithril.d.ts", size: 5240, mode: os.FileMode(420), modTime: time.Unix(1400000000, 0)} a := &asset{bytes: bytes, info: info} return a, nil } // Asset loads and returns the asset for the given name. // It returns an error if the asset could not be found or // could not be loaded. func Asset(name string) ([]byte, error) { cannonicalName := strings.Replace(name, "\\", "/", -1) if f, ok := _bindata[cannonicalName]; ok { a, err := f() if err != nil { return nil, fmt.Errorf("Asset %s can't read by error: %v", name, err) } return a.bytes, nil } return nil, fmt.Errorf("Asset %s not found", name) } // MustAsset is like Asset but panics when Asset would return an error. // It simplifies safe initialization of global variables. func MustAsset(name string) []byte { a, err := Asset(name) if err != nil { panic("asset: Asset(" + name + "): " + err.Error()) } return a } // AssetInfo loads and returns the asset info for the given name. // It returns an error if the asset could not be found or // could not be loaded. func AssetInfo(name string) (os.FileInfo, error) { cannonicalName := strings.Replace(name, "\\", "/", -1) if f, ok := _bindata[cannonicalName]; ok { a, err := f() if err != nil { return nil, fmt.Errorf("AssetInfo %s can't read by error: %v", name, err) } return a.info, nil } return nil, fmt.Errorf("AssetInfo %s not found", name) } // AssetNames returns the names of the assets. func AssetNames() []string { names := make([]string, 0, len(_bindata)) for name := range _bindata { names = append(names, name) } return names } // _bindata is a table, holding each asset generator, mapped to its name. var _bindata = map[string]func() (*asset, error){ "ui/css/app.css": uiCssAppCss, "ui/css/graph.css": uiCssGraphCss, "ui/css/libs/nvd3/1.7.1/nv.d3.min.css": uiCssLibsNvd3171NvD3MinCss, "ui/css/rest_explorer.css": uiCssRest_explorerCss, "ui/index.html": uiIndexHtml, "ui/js/app.js": uiJsAppJs, "ui/js/libs/d3/3.3.5/d3.min.js": uiJsLibsD3335D3MinJs, "ui/js/libs/mithriljs/0.2.0/mithril.min.js": uiJsLibsMithriljs020MithrilMinJs, "ui/js/libs/mithriljs/0.2.0/mithril.min.js.map": uiJsLibsMithriljs020MithrilMinJsMap, "ui/js/libs/nvd3/1.7.1/nv.d3.min.js": uiJsLibsNvd3171NvD3MinJs, "ui/ts/app.ts": uiTsAppTs, "ui/ts/components/metrics.ts": uiTsComponentsMetricsTs, "ui/ts/header.ts": uiTsHeaderTs, "ui/ts/models/node_status.ts": uiTsModelsNode_statusTs, "ui/ts/models/stats.ts": uiTsModelsStatsTs, "ui/ts/models/store_status.ts": uiTsModelsStore_statusTs, "ui/ts/models/timeseries.ts": uiTsModelsTimeseriesTs, "ui/ts/pages/graph.ts": uiTsPagesGraphTs, "ui/ts/pages/monitor.ts": uiTsPagesMonitorTs, "ui/ts/pages/nodes.ts": uiTsPagesNodesTs, "ui/ts/pages/rest_explorer.ts": uiTsPagesRest_explorerTs, "ui/ts/pages/stores.ts": uiTsPagesStoresTs, "ui/ts/tsconfig.json": uiTsTsconfigJson, "ui/ts/typings/d3/d3.d.ts": uiTsTypingsD3D3DTs, "ui/ts/typings/jquery/jquery.d.ts": uiTsTypingsJqueryJqueryDTs, "ui/ts/typings/mithriljs/mithril.d.ts": uiTsTypingsMithriljsMithrilDTs, } // AssetDir returns the file names below a certain // directory embedded in the file by go-bindata. // For example if you run go-bindata on data/... and data contains the // following hierarchy: // data/ // foo.txt // img/ // a.png // b.png // then AssetDir("data") would return []string{"foo.txt", "img"} // AssetDir("data/img") would return []string{"a.png", "b.png"} // AssetDir("foo.txt") and AssetDir("notexist") would return an error // AssetDir("") will return []string{"data"}. func AssetDir(name string) ([]string, error) { node := _bintree if len(name) != 0 { cannonicalName := strings.Replace(name, "\\", "/", -1) pathList := strings.Split(cannonicalName, "/") for _, p := range pathList { node = node.Children[p] if node == nil { return nil, fmt.Errorf("Asset %s not found", name) } } } if node.Func != nil { return nil, fmt.Errorf("Asset %s not found", name) } rv := make([]string, 0, len(node.Children)) for childName := range node.Children { rv = append(rv, childName) } return rv, nil } type bintree struct { Func func() (*asset, error) Children map[string]*bintree } var _bintree = &bintree{nil, map[string]*bintree{ "ui": {nil, map[string]*bintree{ "css": {nil, map[string]*bintree{ "app.css": {uiCssAppCss, map[string]*bintree{}}, "graph.css": {uiCssGraphCss, map[string]*bintree{}}, "libs": {nil, map[string]*bintree{ "nvd3": {nil, map[string]*bintree{ "1.7.1": {nil, map[string]*bintree{ "nv.d3.min.css": {uiCssLibsNvd3171NvD3MinCss, map[string]*bintree{}}, }}, }}, }}, "rest_explorer.css": {uiCssRest_explorerCss, map[string]*bintree{}}, }}, "index.html": {uiIndexHtml, map[string]*bintree{}}, "js": {nil, map[string]*bintree{ "app.js": {uiJsAppJs, map[string]*bintree{}}, "libs": {nil, map[string]*bintree{ "d3": {nil, map[string]*bintree{ "3.3.5": {nil, map[string]*bintree{ "d3.min.js": {uiJsLibsD3335D3MinJs, map[string]*bintree{}}, }}, }}, "mithriljs": {nil, map[string]*bintree{ "0.2.0": {nil, map[string]*bintree{ "mithril.min.js": {uiJsLibsMithriljs020MithrilMinJs, map[string]*bintree{}}, "mithril.min.js.map": {uiJsLibsMithriljs020MithrilMinJsMap, map[string]*bintree{}}, }}, }}, "nvd3": {nil, map[string]*bintree{ "1.7.1": {nil, map[string]*bintree{ "nv.d3.min.js": {uiJsLibsNvd3171NvD3MinJs, map[string]*bintree{}}, }}, }}, }}, }}, "ts": {nil, map[string]*bintree{ "app.ts": {uiTsAppTs, map[string]*bintree{}}, "components": {nil, map[string]*bintree{ "metrics.ts": {uiTsComponentsMetricsTs, map[string]*bintree{}}, }}, "header.ts": {uiTsHeaderTs, map[string]*bintree{}}, "models": {nil, map[string]*bintree{ "node_status.ts": {uiTsModelsNode_statusTs, map[string]*bintree{}}, "stats.ts": {uiTsModelsStatsTs, map[string]*bintree{}}, "store_status.ts": {uiTsModelsStore_statusTs, map[string]*bintree{}}, "timeseries.ts": {uiTsModelsTimeseriesTs, map[string]*bintree{}}, }}, "pages": {nil, map[string]*bintree{ "graph.ts": {uiTsPagesGraphTs, map[string]*bintree{}}, "monitor.ts": {uiTsPagesMonitorTs, map[string]*bintree{}}, "nodes.ts": {uiTsPagesNodesTs, map[string]*bintree{}}, "rest_explorer.ts": {uiTsPagesRest_explorerTs, map[string]*bintree{}}, "stores.ts": {uiTsPagesStoresTs, map[string]*bintree{}}, }}, "tsconfig.json": {uiTsTsconfigJson, map[string]*bintree{}}, "typings": {nil, map[string]*bintree{ "d3": {nil, map[string]*bintree{ "d3.d.ts": {uiTsTypingsD3D3DTs, map[string]*bintree{}}, }}, "jquery": {nil, map[string]*bintree{ "jquery.d.ts": {uiTsTypingsJqueryJqueryDTs, map[string]*bintree{}}, }}, "mithriljs": {nil, map[string]*bintree{ "mithril.d.ts": {uiTsTypingsMithriljsMithrilDTs, map[string]*bintree{}}, }}, }}, }}, }}, }} // RestoreAsset restores an asset under the given directory func RestoreAsset(dir, name string) error { data, err := Asset(name) if err != nil { return err } info, err := AssetInfo(name) if err != nil { return err } err = os.MkdirAll(_filePath(dir, path.Dir(name)), os.FileMode(0755)) if err != nil { return err } err = ioutil.WriteFile(_filePath(dir, name), data, info.Mode()) if err != nil { return err } err = os.Chtimes(_filePath(dir, name), info.ModTime(), info.ModTime()) if err != nil { return err } return nil } // RestoreAssets restores an asset under the given directory recursively func RestoreAssets(dir, name string) error { children, err := AssetDir(name) // File if err != nil { return RestoreAsset(dir, name) } // Dir for _, child := range children { err = RestoreAssets(dir, path.Join(name, child)) if err != nil { return err } } return nil } func _filePath(dir, name string) string { cannonicalName := strings.Replace(name, "\\", "/", -1) return filepath.Join(append([]string{dir}, strings.Split(cannonicalName, "/")...)...) } ================================================ FILE: samples/Go/gen-go-linguist-thrift.go ================================================ // Autogenerated by Thrift Compiler (1.0.0-dev) // DO NOT EDIT UNLESS YOU ARE SURE THAT YOU KNOW WHAT YOU ARE DOING package linguist import ( "bytes" "fmt" "git.apache.org/thrift.git/lib/go/thrift" ) // (needed to ensure safety because of naive import list construction.) var _ = thrift.ZERO var _ = fmt.Printf var _ = bytes.Equal func init() { } ================================================ FILE: samples/Go/oapi-codegen.go ================================================ // Package api provides primitives to interact the openapi HTTP API. // // Code generated by github.com/deepmap/oapi-codegen DO NOT EDIT. package api // Error defines model for Error. type Error struct { // Error code Code int32 `json:"code"` // Error message Message string `json:"message"` } // NewPet defines model for NewPet. type NewPet struct { // Name of the pet Name string `json:"name"` // Type of the pet Tag *string `json:"tag,omitempty"` } // Pet defines model for Pet. type Pet struct { // Embedded struct due to allOf(#/components/schemas/NewPet) NewPet // Embedded fields due to inline allOf schema // Unique id of the pet Id int64 `json:"id"` } // FindPetsParams defines parameters for FindPets. type FindPetsParams struct { // tags to filter by Tags *[]string `json:"tags,omitempty"` // maximum number of results to return Limit *int32 `json:"limit,omitempty"` } // AddPetJSONBody defines parameters for AddPet. type AddPetJSONBody NewPet // AddPetRequestBody defines body for AddPet for application/json ContentType. type AddPetJSONRequestBody AddPetJSONBody ================================================ FILE: samples/Go Checksums/filenames/go.sum ================================================ cloud.google.com/go v0.34.0 h1:eOI3/cP2VTU6uZLDYAoic+eyzzB9YyGmJ7eIjl8rOPg= cloud.google.com/go v0.34.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/golang/protobuf v1.2.0 h1:P3YflyNX/ehuJFLhxviNdFxQPkGK5cDcApsge1SqnvM= github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= golang.org/x/net v0.0.0-20180724234803-3673e40ba225/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e h1:bRhVy7zSSasaqNksaRZiA5EEI+Ei4I1nO5Jh72wfHlg= golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e/go.mod h1:mL1N/T3taQHkDXs73rZJwtUhF3w3ftmwwsq0BUmARs4= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 h1:YUO/7uOKsKeq9UokNS62b8FYywz3ker1l1vDZRCRefw= golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= google.golang.org/appengine v1.4.0 h1:/wp5JvzpHIxhs/dumFmF7BXTf3Z+dd4uXta4kVyO508= google.golang.org/appengine v1.4.0/go.mod h1:xpcJRLb0r/rnEns0DIKYYv+WjYCduHsrkT7/EB5XEv4= ================================================ FILE: samples/Go Checksums/filenames/go.work.sum ================================================ github.com/PuerkitoBio/purell v1.1.1 h1:WEQqlqaGbrPkxLJWfBwQmfEAE1Z7ONdDLqrN38tNFfI= github.com/PuerkitoBio/urlesc v0.0.0-20170810143723-de5bf2ad4578 h1:d+Bc7a5rLufV/sSk/8dngufqelfh6jnri85riMAaF/M= ================================================ FILE: samples/Go Module/filenames/go.mod ================================================ module golang.org/x/oauth2 go 1.11 require ( cloud.google.com/go v0.34.0 golang.org/x/net v0.0.0-20190108225652-1e06a53dbb7e golang.org/x/sync v0.0.0-20181221193216-37e7f081c4d4 // indirect google.golang.org/appengine v1.4.0 ) ================================================ FILE: samples/Go Template/_helpers.tpl ================================================ {{- /* Generate basic labels */ -}} {{- define "mychart.labels" }} labels: generator: helm date: {{ now | htmlDate }} chart: {{ .Chart.Name }} version: {{ .Chart.Version }} {{- end }} ================================================ FILE: samples/Go Template/_templates.gotmpl ================================================ {{- /* https://github.com/redhat-cop/helm-charts/blob/main/_templates.gotmpl */ -}} {{ define "doc.header" -}} {{ template "chart.header" . }} [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0) {{ template "chart.versionBadge" . }} {{ template "chart.deprecationWarning" . }} ## Description {{ template "chart.description" . }} {{- end }} {{ define "doc.maintainer_and_sources" -}} {{ template "chart.maintainersSection" . }} ## Sources Source: {{ template "chart.sourcesList" . }} Source code: {{ template "chart.homepage" . }} {{- end }} {{ define "doc.deps" -}} ## Dependencies This chart has the following dependencies: {{ template "chart.requirementsTable" . }} {{- end }} {{ define "doc.values" -}} {{ template "chart.valuesSection" . }} {{- end }} {{ define "doc.footer" -}} ## Installing the Chart To install the chart with the release name `my-release`: ```console helm install my-release repo/> ``` The command deploys the chart on the Kubernetes cluster in the default configuration. ## Uninstalling the Chart To uninstall/delete the my-release deployment: ```console helm delete my-release ``` The command removes all the Kubernetes components associated with the chart and deletes the release. {{ template "helm-docs.versionFooter" . }} {{- end }} ================================================ FILE: samples/Go Template/base.tpl ================================================ {{ /* Example from https://github.com/go-echarts/go-echarts/blob/master/templates/base.tpl */ }} {{- define "base_element" -}}

    {{- end -}} {{- define "base_script" -}} {{- end -}} {{- define "base_option" }} {{- .JSONNotEscaped | safeJS }} {{- end }}; {{- define "base" }} {{- template "base_element" . }} {{- template "base_script" . }} {{- end }} ================================================ FILE: samples/Go Template/batch.gohtml ================================================ {{- /* https://github.com/ncruces/RethinkRAW/blob/master/assets/batch.gohtml */ -}} RethinkRAW: Batch processing {{len .Photos}} photos {{- template "raw-editor.gohtml" "hidden"}} Lorem ipsum
    ================================================ FILE: samples/Go Template/crd.tmpl ================================================ {{- /* https://github.com/grafana/k6-operator/blob/main/docs/crd.tmpl */ -}} --- title: {{or .Metadata.Title "API Reference"}} weight: {{or .Metadata.Weight 1 }} {{- if .Metadata.Description}} description: {{.Metadata.Description}} {{- end}} --- Packages: {{range .Groups}} - [{{.Group}}/{{.Version}}](#{{ anchorize (printf "%s/%s" .Group .Version) }}) {{- end -}}{{/* range .Groups */}} {{- range .Groups }} {{- $group := . }} # {{.Group}}/{{.Version}} Resource Types: {{range .Kinds}} - [{{.Name}}](#{{ anchorize .Name }}) {{end}}{{/* range .Kinds */}} {{range .Kinds}} {{$kind := .}} ## {{.Name}} [↩ Parent](#{{ anchorize (printf "%s/%s" $group.Group $group.Version) }} ) {{range .Types}} {{if not .IsTopLevel}} ### {{.Name}} {{if .ParentKey}}[↩ Parent](#{{.ParentKey}}){{end}} {{end}} {{.Description}} {{- if .IsTopLevel -}} {{- end -}} {{- range .Fields -}} {{- end -}}
    Name Type Description Required
    apiVersion string {{$group.Group}}/{{$group.Version}} true
    kind string {{$kind.Name}} true
    metadata object Refer to the Kubernetes API documentation for the fields of the `metadata` field. true
    {{if .TypeKey}}{{.Name}}{{else}}{{.Name}}{{end}} {{.Type}} {{.Description}}
    {{- if or .Schema.XValidations .Schema.Format .Schema.Enum .Schema.Default .Schema.Minimum .Schema.Maximum }}
    {{- end}} {{- if .Schema.XValidations }} Validations: {{- range .Schema.XValidations -}}
  • {{ .Rule }}: {{ .Message }}
  • {{- end -}} {{- end }} {{- if .Schema.Format }} Format: {{ .Schema.Format }}
    {{- end }} {{- if .Schema.Enum }} Enum: {{ .Schema.Enum | toStrings | join ", " }}
    {{- end }} {{- if .Schema.Default }} Default: {{ .Schema.Default }}
    {{- end }} {{- if .Schema.Minimum }} Minimum: {{ .Schema.Minimum }}
    {{- end }} {{- if .Schema.Maximum }} Maximum: {{ .Schema.Maximum }}
    {{- end }}
    {{.Required}}
    {{- end}}{{/* range .Types */}} {{- end}}{{/* range .Kinds */}} {{- end}}{{/* range .Groups */}} ================================================ FILE: samples/Go Template/letter.tmpl ================================================ Dear {{.Name}}, {{if .Attended}} It was a pleasure to see you at the wedding. {{- else}} It is a shame you couldn't make it to the wedding. {{- end}} {{with .Gift -}} Thank you for the lovely {{.}}. {{end}} Best wishes, Josie ================================================ FILE: samples/Go Template/prettier.html.tmpl ================================================ {{ if or .Prev .Next -}} {{ $p := where site.Pages }}
    {{ with $p.Next . -}}
    {{ .Title }}
    {{ end -}}
    {{ end -}} ================================================ FILE: samples/Go Workspace/filenames/go.work ================================================ go 1.19 use ( ./api ./pkg/featureflags ./pkg/libhelm ./third_party/digest ) ================================================ FILE: samples/Godot Resource/Main.tscn ================================================ [gd_scene load_steps=20 format=2] [ext_resource path="res://assets/themes/dark/theme.tres" type="Theme" id=1] [ext_resource path="res://src/Main.gd" type="Script" id=2] [ext_resource path="res://src/UI/TopMenuContainer.tscn" type="PackedScene" id=3] [ext_resource path="res://src/UI/UI.tscn" type="PackedScene" id=4] [ext_resource path="res://src/UI/PatternsPopup.tscn" type="PackedScene" id=5] [ext_resource path="res://src/UI/BrushesPopup.tscn" type="PackedScene" id=6] [ext_resource path="res://src/UI/Dialogs/ImageEffects/ImageEffects.tscn" type="PackedScene" id=7] [ext_resource path="res://src/UI/Dialogs/SaveSpriteHTML5.tscn" type="PackedScene" id=8] [ext_resource path="res://src/UI/Timeline/FrameProperties.tscn" type="PackedScene" id=9] [ext_resource path="res://src/UI/Dialogs/WindowOpacityDialog.tscn" type="PackedScene" id=10] [ext_resource path="res://src/UI/Dialogs/SaveSprite.tscn" type="PackedScene" id=11] [ext_resource path="res://src/UI/Dialogs/OpenSprite.tscn" type="PackedScene" id=12] [ext_resource path="res://src/UI/Dialogs/ManageLayouts.tscn" type="PackedScene" id=13] [ext_resource path="res://src/UI/Dialogs/TileModeOffsetsDialog.tscn" type="PackedScene" id=14] [ext_resource path="res://src/UI/Dialogs/SplashDialog.tscn" type="PackedScene" id=27] [ext_resource path="res://src/UI/Dialogs/CreateNewImage.tscn" type="PackedScene" id=28] [ext_resource path="res://src/Preferences/PreferencesDialog.tscn" type="PackedScene" id=32] [ext_resource path="res://src/UI/Dialogs/AboutDialog.tscn" type="PackedScene" id=34] [ext_resource path="res://src/UI/Dialogs/ExportDialog.tscn" type="PackedScene" id=39] [node name="Control" type="Control"] anchor_right = 1.0 anchor_bottom = 1.0 theme = ExtResource( 1 ) script = ExtResource( 2 ) __meta__ = { "_edit_horizontal_guides_": [ ], "_edit_vertical_guides_": [ ] } [node name="MenuAndUI" type="VBoxContainer" parent="."] anchor_right = 1.0 anchor_bottom = 1.0 custom_constants/separation = 0 __meta__ = { "_edit_use_anchors_": false } [node name="TopMenuContainer" parent="MenuAndUI" instance=ExtResource( 3 )] [node name="UI" parent="MenuAndUI" instance=ExtResource( 4 )] anchor_right = 0.0 anchor_bottom = 0.0 margin_top = 28.0 margin_right = 1280.0 margin_bottom = 720.0 [node name="Dialogs" type="Control" parent="."] mouse_filter = 2 __meta__ = { "_edit_use_anchors_": false } [node name="ImageEffects" parent="Dialogs" instance=ExtResource( 7 )] [node name="BrushesPopup" parent="Dialogs" instance=ExtResource( 6 )] [node name="PatternsPopup" parent="Dialogs" instance=ExtResource( 5 )] [node name="SplashDialog" parent="Dialogs" instance=ExtResource( 27 )] [node name="CreateNewImage" parent="Dialogs" instance=ExtResource( 28 )] [node name="OpenSprite" parent="Dialogs" instance=ExtResource( 12 )] window_title = "Open File(s)" mode = 1 [node name="SaveSprite" parent="Dialogs" instance=ExtResource( 11 )] margin_left = 108.0 margin_top = 40.0 margin_right = 623.0 margin_bottom = 388.0 [node name="SaveSpriteHTML5" parent="Dialogs" instance=ExtResource( 8 )] [node name="ExportDialog" parent="Dialogs" instance=ExtResource( 39 )] [node name="PreferencesDialog" parent="Dialogs" instance=ExtResource( 32 )] [node name="ManageLayouts" parent="Dialogs" instance=ExtResource( 13 )] [node name="AboutDialog" parent="Dialogs" instance=ExtResource( 34 )] [node name="UnsavedCanvasDialog" type="ConfirmationDialog" parent="Dialogs"] margin_right = 467.0 margin_bottom = 70.0 window_title = "Unsaved Image" dialog_text = "You have unsaved changes. If you proceed, the progress you have made will be lost." [node name="QuitDialog" type="ConfirmationDialog" parent="Dialogs"] margin_right = 243.0 margin_bottom = 70.0 resizable = true dialog_text = "Are you sure you want to exit Pixelorama?" [node name="QuitAndSaveDialog" type="ConfirmationDialog" parent="Dialogs"] margin_right = 330.0 margin_bottom = 70.0 window_title = "Save before exiting?" resizable = true dialog_text = "You have unsaved progress. How do you wish to proceed?" __meta__ = { "_edit_use_anchors_": false } [node name="ErrorDialog" type="AcceptDialog" parent="Dialogs"] margin_right = 151.0 margin_bottom = 60.0 window_title = "Error" dialog_text = "This is an error message!" [node name="BackupConfirmation" type="ConfirmationDialog" parent="Dialogs"] margin_right = 200.0 margin_bottom = 88.0 popup_exclusive = true resizable = true dialog_text = "Autosaved project(s) from a crashed session were found. Do you want to recover the data?" dialog_autowrap = true [node name="FrameProperties" parent="Dialogs" instance=ExtResource( 9 )] [node name="WindowOpacityDialog" parent="Dialogs" instance=ExtResource( 10 )] [node name="TileModeOffsetsDialog" parent="Dialogs" instance=ExtResource( 14 )] [node name="Extensions" type="Control" parent="."] __meta__ = { "_edit_use_anchors_": false } [node name="LeftCursor" type="Sprite" parent="."] visible = false [node name="RightCursor" type="Sprite" parent="."] visible = false [connection signal="popup_hide" from="Dialogs/SplashDialog" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/CreateNewImage" to="." method="_can_draw_true"] [connection signal="files_selected" from="Dialogs/OpenSprite" to="." method="_on_OpenSprite_files_selected"] [connection signal="popup_hide" from="Dialogs/OpenSprite" to="." method="_on_OpenSprite_popup_hide"] [connection signal="file_selected" from="Dialogs/SaveSprite" to="." method="_on_SaveSprite_file_selected"] [connection signal="popup_hide" from="Dialogs/SaveSprite" to="." method="_can_draw_true"] [connection signal="confirmed" from="Dialogs/SaveSpriteHTML5" to="." method="_on_SaveSpriteHTML5_confirmed"] [connection signal="popup_hide" from="Dialogs/SaveSpriteHTML5" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/ExportDialog" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/PreferencesDialog" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/AboutDialog" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/UnsavedCanvasDialog" to="." method="_can_draw_true"] [connection signal="confirmed" from="Dialogs/QuitDialog" to="." method="_on_QuitDialog_confirmed"] [connection signal="popup_hide" from="Dialogs/QuitDialog" to="." method="_can_draw_true"] [connection signal="confirmed" from="Dialogs/QuitAndSaveDialog" to="." method="_on_QuitAndSaveDialog_confirmed"] [connection signal="custom_action" from="Dialogs/QuitAndSaveDialog" to="." method="_on_QuitAndSaveDialog_custom_action"] [connection signal="popup_hide" from="Dialogs/QuitAndSaveDialog" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/ErrorDialog" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/BackupConfirmation" to="." method="_can_draw_true"] [connection signal="popup_hide" from="Dialogs/BackupConfirmation" to="." method="_on_BackupConfirmation_popup_hide"] ================================================ FILE: samples/Godot Resource/Server.gdns ================================================ [gd_resource type="NativeScript" load_steps=2 format=2] [ext_resource path="res://client_server_library.gdnlib" type="GDNativeLibrary" id=1] [resource] resource_name = "Server" class_name = "Server" library = ExtResource( 1 ) ================================================ FILE: samples/Godot Resource/default.tres ================================================ [gd_resource type="Resource" load_steps=23 format=2] [ext_resource path="res://addons/dockable_container/layout.gd" type="Script" id=1] [ext_resource path="res://addons/dockable_container/layout_panel.gd" type="Script" id=2] [ext_resource path="res://addons/dockable_container/layout_split.gd" type="Script" id=3] [sub_resource type="Resource" id=1] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Tools" ) current_tab = 0 [sub_resource type="Resource" id=2] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Main Canvas" ) current_tab = 0 [sub_resource type="Resource" id=3] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Second Canvas" ) current_tab = 0 [sub_resource type="Resource" id=4] resource_name = "Split" script = ExtResource( 3 ) direction = 0 percent = 0.980952 first = SubResource( 2 ) second = SubResource( 3 ) [sub_resource type="Resource" id=5] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Animation Timeline" ) current_tab = 0 [sub_resource type="Resource" id=6] resource_name = "Split" script = ExtResource( 3 ) direction = 1 percent = 0.90625 first = SubResource( 4 ) second = SubResource( 5 ) [sub_resource type="Resource" id=7] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Canvas Preview" ) current_tab = 0 [sub_resource type="Resource" id=8] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Color Pickers" ) current_tab = 0 [sub_resource type="Resource" id=9] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Global Tool Options" ) current_tab = 0 [sub_resource type="Resource" id=10] resource_name = "Split" script = ExtResource( 3 ) direction = 1 percent = 0.5 first = SubResource( 8 ) second = SubResource( 9 ) [sub_resource type="Resource" id=11] resource_name = "Split" script = ExtResource( 3 ) direction = 1 percent = 0.85514 first = SubResource( 7 ) second = SubResource( 10 ) [sub_resource type="Resource" id=12] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Left Tool Options" ) current_tab = 0 [sub_resource type="Resource" id=13] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Right Tool Options" ) current_tab = 0 [sub_resource type="Resource" id=14] resource_name = "Split" script = ExtResource( 3 ) direction = 0 percent = 0.5 first = SubResource( 12 ) second = SubResource( 13 ) [sub_resource type="Resource" id=15] resource_name = "Tabs" script = ExtResource( 2 ) names = PoolStringArray( "Palettes" ) current_tab = 0 [sub_resource type="Resource" id=16] resource_name = "Split" script = ExtResource( 3 ) direction = 1 percent = 0.697987 first = SubResource( 14 ) second = SubResource( 15 ) [sub_resource type="Resource" id=17] resource_name = "Split" script = ExtResource( 3 ) direction = 1 percent = 0.348266 first = SubResource( 11 ) second = SubResource( 16 ) [sub_resource type="Resource" id=18] resource_name = "Split" script = ExtResource( 3 ) direction = 0 percent = 0.73 first = SubResource( 6 ) second = SubResource( 17 ) [sub_resource type="Resource" id=19] resource_name = "Split" script = ExtResource( 3 ) direction = 0 percent = 0.0 first = SubResource( 1 ) second = SubResource( 18 ) [resource] resource_name = "Layout" script = ExtResource( 1 ) root = SubResource( 19 ) hidden_tabs = { "Second Canvas": true } ================================================ FILE: samples/Godot Resource/filenames/project.godot ================================================ ; Engine configuration file. ; It's best edited using the editor UI and not directly, ; since the parameters that go here are not all obvious. ; ; Format: ; [section] ; section goes between [] ; param=value ; assign values to parameters config_version=4 [application] config/name="Game Pad Client" run/main_scene="res://JoinServer/JoinServerControl.tscn" boot_splash/image="res://Images/Background.png" boot_splash/bg_color=Color( 0.101961, 0.101961, 0.12549, 1 ) config/icon="res://Icons/1024Icon.png" [autoload] Client="*res://Client/Client.gd" UdpBroadcast="*res://UDP_Broadcast.gd" [debug] gdscript/completion/autocomplete_setters_and_getters=true [display] window/size/width=1920 window/size/height=1080 window/size/test_width=960 window/size/test_height=540 window/stretch/mode="2d" window/stretch/aspect="expand" [global] delay=false simulate=false [input_devices] pointing/ios/touch_delay=0.0 pointing/emulate_touch_from_mouse=true [rendering] environment/default_clear_color=Color( 0.101961, 0.101961, 0.12549, 1 ) environment/default_environment="res://default_env.tres" ================================================ FILE: samples/Godot Resource/signals_library.gdnlib ================================================ [entry] X11.64="../../target/debug/libsignals.so" OSX.64="../../target/debug/libsignals.dylib" Windows.64="res://../../target/debug/signals.dll" [dependencies] Windows.64=[ ] X11.64=[ ] OSX.64=[ ] [general] singleton=false load_once=true symbol_prefix="godot_" reloadable=true ================================================ FILE: samples/Golo/adapters.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.Adapters local function list_sample = |fabric| { println(">>> list_sample()") let carbonCopy = list[] let conf = map[ ["extends", "java.util.ArrayList"], ["overrides", map[ ["*", |super, name, args| { if name == "add" { if args: length() == 2 { carbonCopy: add(args: get(1)) } else { carbonCopy: add(args: get(1), args: get(2)) } } return super: invokeWithArguments(args) } ]] ]] let list = fabric: maker(conf): newInstance() list: add("bar") list: add(0, "foo") list: add("baz") println(" list: " + list + " " + list: getClass()) println("carbonCopy: " + carbonCopy + " " + carbonCopy: getClass()) } local function runnable_sample = |fabric| { println(">>> runnable_sample") let result = array[1, 2, 3] let conf = map[ ["interfaces", ["java.io.Serializable", "java.lang.Runnable"]], ["implements", map[ ["run", |this| { for (var i = 0, i < result: length(), i = i + 1) { result: set(i, result: get(i) + 10) } }] ]] ] let runner = fabric: maker(conf): newInstance() runner: run() println(" result: " + result: toString()) println("serializable? " + (runner oftype java.io.Serializable.class)) println(" runnable? " + (runner oftype java.lang.Runnable.class)) } function main = |args| { let fabric = AdapterFabric() list_sample(fabric) runnable_sample(fabric) } ================================================ FILE: samples/Golo/async.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.AsyncHelpers import gololang.Async import java.util.concurrent.TimeUnit import java.util.concurrent.Executors local function fib = |n| { if n <= 1 { return n } else { return fib(n - 1) + fib(n - 2) } } function main = |args| { let executor = newCachedThreadPool() println("Let's do some useless asynchronous operations...") var f = executor: enqueue({ Thread.sleep(1000_L) return 666 }) f: onSet(|v| -> println(">>> #slow -> " + v)): onFail(|e| -> println(">>> #fail -> " + e)) f: cancel(true) f = executor: enqueue({ Thread.sleep(1000_L) return 666 }) f: onSet(|v| -> println(">>> #ok -> " + v)): onFail(|e| -> println(">>> #wtf? -> " + e)) let fib_10 = promise() let fib_20 = promise() let fib_30 = promise() let fib_40 = promise() let futures = [ fib_10: future(), fib_20: future(), fib_30: future(), fib_40: future() ] executor: submit(-> fib_10: set(fib(10))) executor: submit(-> fib_20: set(fib(20))) executor: submit(-> fib_30: set(fib(30))) executor: submit(-> fib_40: set(fib(40))) all(futures): onSet(|results| -> println(">>> Fibs: " + results)) let truth = promise() truth: future(): map(|v| -> "truth=" + v): onSet(|v| -> executor: submit(-> println(">>> (another thread) " + v))): onSet(|v| -> println(">>> (same thread) " + v)) executor: submit({ Thread.sleep(500_L) truth: set(42) }) Thread.sleep(1000_L) executor: shutdown() executor: awaitTermination(2_L, SECONDS()) println("Bye!") } ================================================ FILE: samples/Golo/augmentations.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.Augmentations import java.util.LinkedList augment java.util.List { function with = |this, value| { this: add(value) return this } } augment java.util.Collection { function doToEach = |this, func| { foreach (element in this) { func(element) } } } function main = |args| { let list = LinkedList(): with("foo"): with("bar"): with("baz") list: doToEach(|value| -> println(">>> " + value)) } ================================================ FILE: samples/Golo/closures.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module Closures local function sayHello = |who| -> "Hello " + who + "!" function main = |args| { let adder = |a, b| -> a + b println(adder: invokeWithArguments(1, 2)) println(adder(1, 2)) let addToTen = adder: bindTo(10) println(addToTen: invokeWithArguments(2)) println(addToTen(2)) let adding = |x| -> |y| -> adder(x, y) let addingTen = adding(10) println(addingTen(4)) println(adding(2)(4)) println(sayHello("Julien")) let list = java.util.LinkedList() let pump_it = { list: add("I heard you say") list: add("Hey!") list: add("Hey!") } pump_it() println(list) } ================================================ FILE: samples/Golo/coin-change.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module CoinChange import java.util.LinkedList function change = |money, coins| -> match { when money == 0 then 1 when (money < 0) or (coins: isEmpty()) then 0 otherwise change(money - coins: head(), coins) + change(money, coins: tail()) } function main = |args| { let coins = LinkedList(): append(1, 2, 5, 10, 20) println("Coins: " + coins) println("0: " + change(0, coins)) println("1: " + change(1, coins)) println("2: " + change(2, coins)) println("10: " + change(10, coins)) println("12: " + change(12, coins)) println("6: " + change(6, coins)) } ================================================ FILE: samples/Golo/collection-literals.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.CollectionLiterals local function play_with_tuples = { let hello = ["Hello", "world", "!"] foreach str in hello { print(str + " ") } println("") println(hello: get(0) + "-" + hello: get(1) + "-" + hello: get(2)) println(hello: join("/")) } local function play_with_literals = { let data = [ [1, 2, 3], tuple[1, 2, 3], array[1, 2, 3], set[1, 2, 3, 3, 1], map[ ["a", 10], ["b", 20] ], vector[1, 2, 3], list[1, 2, 3] ] data: each(|element| { println(element: toString()) println(" type: " + element: getClass()) }) } function main = |args| { println(">>> Literals") play_with_literals() println("\n>>> Tuples") play_with_tuples() } ================================================ FILE: samples/Golo/context-decorator.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.ContextDecorator import gololang.Decorators let myContext = defaultContext(): count(0): define("entry", |this, args| { this: count(this: count() + 1) println("hello:" + this: count()) return args }): define("exit", |this, result| { require(result >= 3, "wrong value") println("goobye") return result }): define("catcher", |this, e| { println("Caught " + e) throw e }): define("finallizer", |this| {println("do some cleanup")}) @withContext(myContext) function foo = |a, b| { println("Hard computation") return a + b } function main = |args| { println(foo(1,2)) println("====") println(withContext(myContext)(|a| -> 2*a)(3)) println("====") try { println(foo(1, 1)) } catch (e) { } } ================================================ FILE: samples/Golo/decorators.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.Decorators import java.util.LinkedList function simple_decorator = |func| { return |a,b| -> func(a+1,b+1) } @simple_decorator function simple_adder = |x,y| -> x + y function decorator_with_params = |param1, param2|{ return |func| { return |a,b| -> func(a+param1,b+param2) } } @decorator_with_params(10,2) function parametrized_adder = |x,y| -> x + y function generic_decorator = |func| { return |args...| { println("number of params : "+args: length()) return func: invokeWithArguments(args) } } @generic_decorator function generic_adder0 = -> 42 @generic_decorator function generic_adder1 = |x| -> x @generic_decorator function generic_adder2 = |x,y| -> x + y @generic_decorator function generic_adder3 = |x,y,z| -> x + y + z function list_sum_decorator = |func| { return |this| -> func(this) - 8 } augment java.util.List { @list_sum_decorator function sum = |this| { var acc = 0 foreach elem in this { acc = acc + elem } return acc } } function main = |args| { println(simple_adder(10,30)) println(parametrized_adder(10,20)) println(generic_adder0()) println(generic_adder1(42)) println(generic_adder2(20,22)) println(generic_adder3(10,12,20)) let list = LinkedList() list: add(5) list: add(10) list: add(15) list: add(20) println(list: sum()) } ================================================ FILE: samples/Golo/dynamic-evaluation.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.DynamicEvaluation import gololang.EvaluationEnvironment local function test_asModule = |env| { let code = """ module foo function a = -> "a!" function b = -> "b!" """ let mod = env: asModule(code) let a = fun("a", mod) let b = fun("b", mod) println(">>> asModule()") println(a()) println(b()) } local function test_anonymousModule = |env| { let code = """ function a = -> "a." function b = -> "b." """ let mod = env: anonymousModule(code) let a = fun("a", mod) let b = fun("b", mod) println(">>> anonymousModule()") println(a()) println(b()) } local function test_asFunction = |env| { let code = "return (a + b) * 2" let f = env: asFunction(code, "a", "b") println(">>> asFunction") println(f(10, 20)) } local function test_def = |env| { let code = "|a, b| -> (a + b) * 2" let f = env: def(code) println(">>> def") println(f(10, 20)) } local function test_run = |env| { let code = """println(">>> run") foreach (i in range(0, 3)) { println("w00t") }""" env: run(code) } local function test_run_map = |env| { let code = """println(">>> run_map") println(a) println(b) """ let values = java.util.TreeMap(): add("a", 1): add("b", 2) env: run(code, values) } function main = |args| { let env = EvaluationEnvironment() test_asModule(env) test_anonymousModule(env) test_asFunction(env) test_def(env) test_run(env) test_run_map(env) } ================================================ FILE: samples/Golo/dynamic-object-person.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.DynamicObjectPerson local function mrbean = -> DynamicObject(): name("Mr Bean"): email("mrbean@gmail.com"): define("toString", |this| -> this: name() + " <" + this: email() + ">") function main = |args| { let bean = mrbean() println(bean: toString()) bean: email("mrbean@outlook.com") println(bean: toString()) } ================================================ FILE: samples/Golo/echo-args.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module EchoArgs function main = |args| { println("With a for loop and an index:") for (var i = 0, i < args: length(), i = i + 1) { println(" #" + i + " -> " + args: get(i)) } println("With a foreach loop:") foreach arg in args { println(" " + arg) } println("With a foreach over a range:") foreach i in range(0, args: length()) { println(" #" + i + " -> " + args: get(i)) } } ================================================ FILE: samples/Golo/enums-thread-state.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module sample.EnumsThreadState import java.lang.Thread$State function main = |args| { # Call the enum entry like a function let new = Thread$State.NEW() println("name=" + new: name() + ", ordinal=" + new: ordinal()) println("-----------") # Walk through all enum entries foreach element in Thread$State.values() { println("name=" + element: name() + ", ordinal=" + element: ordinal()) } } ================================================ FILE: samples/Golo/fibonacci.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.Fibonacci import java.lang.System function fib = |n| { if n <= 1 { return n } else { return fib(n - 1) + fib(n - 2) } } local function run = { let start = System.currentTimeMillis() let result = fib(40) let duration = System.currentTimeMillis() - start println(">>> " + result + " (took " + duration + "ms)") } function main = |args| { while true { run() } } ================================================ FILE: samples/Golo/helloworld.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module hello.World function main = |args| { println("Hello world!") } ================================================ FILE: samples/Golo/http-server.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.WebServer import java.lang import java.net.InetSocketAddress import com.sun.net.httpserver import com.sun.net.httpserver.HttpServer function main = |args| { let server = HttpServer.create(InetSocketAddress("localhost", 8081), 0) server: createContext("/", |exchange| { let headers = exchange: getResponseHeaders() let response = StringBuilder(): append("Requested URI: "): append(exchange: getRequestURI()): append("\n"): append("Current time: "): append(java.util.Date()): append("\n"): toString() headers: set("Content-Type", "text/plain") exchange: sendResponseHeaders(200, response: length()) exchange: getResponseBody(): write(response: getBytes()) exchange: close() }) server: createContext("/shutdown", |exchange| { let response = "Ok, thanks, bye!" exchange: getResponseHeaders(): set("Content-Type", "text/plain") exchange: sendResponseHeaders(200, response: length()) exchange: getResponseBody(): write(response: getBytes()) exchange: close() server: stop(5) }) server: start() println(">>> http://localhost:8081/") } ================================================ FILE: samples/Golo/logdeco.golo ================================================ module samples.LogDeco function log1 = |msg| { return |fun| { return |args...| { println(msg) return fun: invokeWithArguments(args) } } } @log1("calling foo") function foo = |a| { println("foo got a " + a) } @log1("I'am a bar") function bar = |a| -> 2*a let sayHello = log1("Hello") @sayHello function baz = -> "Goodbye" function log2 = |msgBefore| -> |msgAfter| -> |func| -> |args...| { println(msgBefore) let res = func: invokeWithArguments(args) println(msgAfter) return res } @log2("enter foo")("exit foo") function spam = |a| { println("foo: " + a) } function logEnterExit = |name| -> log2("# enter " + name)("# exit " + name) @logEnterExit("bar") function egg = { println("doing something...") } function main = |args| { foo("bar") println("---") println(bar(21)) println("---") println(baz()) println("---") spam("bar") println("---") egg() println("---") let strange_use = log2("hello")("goodbye")({println(":p")}) strange_use() println("---") log2("another")("use")(|a|{println(a)})("strange") } ================================================ FILE: samples/Golo/matching-operator.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module Matching import java.util.LinkedList local function data = { let list = LinkedList() list: add("foo@bar.com") list: add("+33.6.11.22.33") list: add("http://golo-lang.org/") list: add("def foo = bar(_._) with :> T") return list } local function what_it_could_be = |item| -> match { when item: contains("@") then "an email?" when item: startsWith("+33") then "a French phone number?" when item: startsWith("http://") then "a website URL?" otherwise "I have no clue, mate!" } function main = |args| { foreach item in data() { println(item + " => " + what_it_could_be(item)) } } ================================================ FILE: samples/Golo/max-int.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.MaxInt local function max_int = { return java.lang.Integer.MAX_VALUE() } function main = |args| { println(max_int()) } ================================================ FILE: samples/Golo/memoize.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.MemoizeDecorator import gololang.Decorators import java.lang.System let memo = memoizer() @memo function fib = |n| { if n <= 1 { return n } else { return fib(n - 1) + fib(n - 2) } } @memo function foo = |n| -> n local function run = { let start = System.currentTimeMillis() let result = fib(40) let duration = System.currentTimeMillis() - start println(">>> fib(40) = " + result + " (took " + duration + "ms)") } local function run2 = { let start = System.currentTimeMillis() let result = foo(40) let duration = System.currentTimeMillis() - start println(">>> foo(40) = " + result + " (took " + duration + "ms)") } function main = |args| { foreach i in range(0, 5) { println("run " + i) run() run2() } } ================================================ FILE: samples/Golo/null-safety.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module DealingWithNull import java.util function main = |args| { # Data model let contacts = map[ ["mrbean", map[ ["email", "bean@gmail.com"], ["url", "http://mrbean.com"] ]], ["larry", map[ ["email", "larry@iamricherthanyou.com"] ]] ] # MrBean and Larry let mrbean = contacts: get("mrbean") let larry = contacts: get("larry") # Illustrates orIfNull println(mrbean: get("url") orIfNull "n/a") println(larry: get("url") orIfNull "n/a") # Querying a non-existent data model because there is no 'address' entry println(mrbean: get("address")?: street()?: number() orIfNull "n/a") } ================================================ FILE: samples/Golo/prepost-decorators.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.PrepostDecorator import gololang.Decorators let isInteger = isOfType(Integer.class) @checkResult(isString(): andThen(lengthIs(2))) @checkArguments(isInteger: andThen(isPositive()), isString()) function foo = |a, b| { return b + a } let myCheck = checkArguments(isInteger: andThen(isPositive())) @myCheck function inv = |v| -> 1.0 / v let isPositiveInt = isInteger: andThen(isPositive()) @checkArguments(isPositiveInt) function mul = |v| -> 10 * v @checkArguments(isNumber()) function num = |v| -> "ok" @checkArguments(isNotNull()) function notnull = |v| -> "ok" function main = |args| { try { println(foo(1, "b")) } catch (e) { println(e) } try { println(foo(-1, "b")) } catch (e) { println(e) } try { println(foo("a", 2)) } catch (e) { println(e) } try { println(foo(1, 2)) } catch (e) { println(e) } try { println(foo(10, "ab")) } catch (e) { println(e) } try { println(inv(10)) } catch (e) { println(e) } try { println(inv(0)) } catch (e) { println(e) } try { println(mul(5)) } catch (e) { println(e) } try { println(mul(0)) } catch (e) { println(e) } try { println(num(1)) } catch (e) { println(e) } try { println(num(1_L)) } catch (e) { println(e) } try { println(num(1.5)) } catch (e) { println(e) } try { println(num(1.5_F)) } catch (e) { println(e) } try { println(num("a")) } catch (e) { println(e) } try { println(num('a')) } catch (e) { println(e) } try { println(notnull('1')) } catch (e) { println(e) } try { println(notnull(null)) } catch (e) { println(e) } } ================================================ FILE: samples/Golo/structs.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module StructDemo struct Point = { x, y } augment StructDemo.types.Point { function move = |this, offsetX, offsetY| { this: x(this: x() + offsetX) this: y(this: y() + offsetY) return this } function relative = |this, offsetX, offsetY| -> Point(this: x() + offsetX, this: y() + offsetY) } function main = |args| { let p1 = Point(1, 2) let p2 = Point(): x(1): y(2) let p3 = p1: frozenCopy() let p4 = p1: frozenCopy() println(p1) println("x = " + p1: x()) println("y = " + p1: y()) println("p1 == p2 " + (p1 == p2)) println("p1 == p3 " + (p1 == p3)) println("p3 == p4 " + (p3 == p4)) println("#p1 " + p1: hashCode()) println("#p2 " + p2: hashCode()) println("#p3 " + p3: hashCode()) println("#p4 " + p4: hashCode()) println("p1: members() " + p1: members()) println("p1: values() " + p1: values()) foreach item in p1 { println(item: get(0) + " -> " + item: get(1)) } println("p1: set(\"x\", 10) " + p1: set("x", 10)) println("p1: move(10, 5) " + p1: move(10, 5)) println("p1: relative(11, 6) " + p1: relative(11, 6)) let p5 = ImmutablePoint(10, 20) println("p5: " + p5) try { p5: x(100) } catch (expected) { println("p5 is immutable, so... " + expected: getMessage()) } } ================================================ FILE: samples/Golo/swing-actionlistener.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.SwingActionListener import java.awt.event import javax.swing import javax.swing.WindowConstants local function listener = |handler| -> asInterfaceInstance(ActionListener.class, handler) function main = |args| { let frame = JFrame("Action listeners") frame: setDefaultCloseOperation(EXIT_ON_CLOSE()) let button = JButton("Click me!") button: setFont(button: getFont(): deriveFont(96.0_F)) # Using a helper function button: addActionListener(listener(|event| -> println("Clicked!"))) # Using a standard augmentation: MethodHandle::to(Class) button: addActionListener((|event| -> println("[click]")): to(ActionListener.class)) # Straight closure passing button: addActionListener(|event| -> println("( )")) frame: getContentPane(): add(button) frame: pack() frame: setVisible(true) } ================================================ FILE: samples/Golo/swing-helloworld.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.SwingHelloWorld import javax.swing import javax.swing.WindowConstants function main = |args| { let frame = JFrame("Hello world") frame: setDefaultCloseOperation(EXIT_ON_CLOSE()) let label = JLabel("Hello world") label: setFont(label: getFont(): deriveFont(128.0_F)) frame: getContentPane(): add(label) frame: pack() frame: setVisible(true) } ================================================ FILE: samples/Golo/templates-chat-webapp.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module samples.TemplatesChatWebapp import java.lang import java.io import java.net.InetSocketAddress import com.sun.net.httpserver import com.sun.net.httpserver.HttpServer local function redirect = |exchange, to| { exchange: getResponseHeaders(): set("Location", to) exchange: sendResponseHeaders(303, 0) exchange: close() } local function respond = |exchange, body| { exchange: getResponseHeaders(): set("Content-Type", "text/html") exchange: sendResponseHeaders(200, body: length()) exchange: getResponseBody(): write(body: getBytes()) exchange: close() } # This is leaky and works with just 1 POST parameter... local function extract_post = |exchange, posts| { let reader = BufferedReader(InputStreamReader(exchange: getRequestBody())) var line = reader: readLine() while line isnt null { if line: startsWith("msg=") { posts: add(java.net.URLDecoder.decode(line: substring(4), "UTF-8")) } line = reader: readLine() } reader: close() } local function index = |posts, template, exchange| { if exchange: getRequestMethod() == "POST" { extract_post(exchange, posts) redirect(exchange, "/") } else { respond(exchange, template(posts)) } } local function index_template = -> """ <%@params posts %> Golo Chat

    Last posts

    <% foreach post in posts { %>
    <%= post %>
    <% } %>
    """ function main = |args| { let index_tpl = gololang.TemplateEngine(): compile(index_template()) let posts = java.util.concurrent.ConcurrentLinkedDeque() let server = HttpServer.create(InetSocketAddress("localhost", 8081), 0) server: createContext("/", ^index: bindTo(posts): bindTo(index_tpl)) server: start() println(">>> http://localhost:8081/") } ================================================ FILE: samples/Golo/util-containers.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module MoreCoolContainers function main = |args| { println(">>> DynamicVariable") let dyn = DynamicVariable("Foo") println(dyn: value()) let t1 = Thread({ dyn: withValue(666, { println(dyn: value()) }) }) let t2 = Thread({ dyn: withValue(69, { println(dyn: value()) }) }) t1: start() t2: start() t1: join() t2: join() println(dyn: value()) println(">>> Observable") let foo = Observable("Foo") foo: onChange(|v| -> println("foo = " + v)) let mapped = foo: map(|v| -> v + "!") mapped: onChange(|v| -> println("mapped = " + v)) foo: set("69") } ================================================ FILE: samples/Golo/workers.golo ================================================ # Copyright 2012-2014 Institut National des Sciences Appliquées de Lyon (INSA-Lyon) # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. module Workers import java.lang.Thread import java.util.concurrent import gololang.concurrent.workers.WorkerEnvironment local function pusher = |queue, message| -> queue: offer(message) local function generator = |port, message| { foreach i in range(0, 100) { port: send(message) } } function main = |args| { let env = WorkerEnvironment.builder(): withFixedThreadPool() let queue = ConcurrentLinkedQueue() let pusherPort = env: spawn(^pusher: bindTo(queue)) let generatorPort = env: spawn(^generator: bindTo(pusherPort)) let finishPort = env: spawn(|any| -> env: shutdown()) foreach i in range(0, 10) { generatorPort: send("[" + i + "]") } Thread.sleep(2000_L) finishPort: send("Die!") env: awaitTermination(2000) println(queue: reduce("", |acc, next| -> acc + " " + next)) } ================================================ FILE: samples/Gosu/Hello.gst ================================================ <%!-- defined in Hello.gst --%> <%@ params( users : Collection ) %> <% for( user in users ) { %> ${user.LastName}, ${user.FirstName}, ${user.Department} <% } %> ================================================ FILE: samples/Gosu/Hello.gsx ================================================ package example enhancement Hello : String { function toPerson() : Person { var vals = this.split(",") return new Person( vals[0], vals[1] as int, Relationship.valueOf( vals[2] ) ) ) } } ================================================ FILE: samples/Gosu/Person.gs ================================================ package example uses java.util.* uses java.io.File class Person extends Contact implements IEmailable { var _name : String var _age : Integer as Age var _relationship : Relationship as readonly RelationshipOfPerson delegate _emailHelper represents IEmailable enum Relationship { FRIEND, FAMILY, BUSINESS_CONTACT } // Map of names to people static var ALL_PEOPLE = new HashMap() /* Constructs a new Person */ construct( name : String, age : Integer, relationship : Relationship ) { _name = name _age = age _relationship = relationship _emailHelper = new EmailHelper( this ) } property get Name():String{ return _name } property set Name(name : String){ _name = name } /* Implement IEmailable#getEmailName() */ override function getEmailName():String{ return Name } function incrementAge() { _age++ } @Deprecated function printPersonInfo() { print( "Person { Name : ${Name}, Age : ${Age}, Relationship : ${RelationshipOfPerson} }" ) } static function addPerson(p : Person){ if(ALL_PEOPLE.containsKey(p?.Name)) { throw new IllegalArgumentException( "There is already someone named '${p.Name}'." ) } ALL_PEOPLE[p.Name] = p } static function addAllPeople( contacts : List ) { for( contact in contacts ) { if( contact typeis Person and not ALL_PEOPLE.containsKey( contact.Name )) { addPerson( contact ) } } } static function getAllPeopleOlderThanNOrderedByName( age : int ) { var allPeople = ALL_PEOPLE.Values return allPeople.where( \ p -> p.Age > age ).orderBy( \ p -> p.Name ) } static function loadPersonFromDB( id : Integer ) { using( var conn = DBConnectionManager.getConnection(), var stmt = conn.prepareStatement( "SELECT name, age, relationship FROM PEOPLE WHERE ID=?") ){ stmt.setInt( 0, 0 ) var result = stmt.executeQuery() if( result.next() ) { addPerson( new Person( result.getString( "name" ), result.getInt( "age" ), Relationship.valueOf( result.getString( "relationship" ) ) ) ) } } } /* Loads in people from a CSV */ static function loadFromFile( file : File ) { file.eachLine( \ line -> { if( line.HasContent ) { addPerson( line.toPerson() ) } }) } /* Save people to a CSV */ static function saveToFile( file : File ) { using( var writer = new FileWriter( file ) ) { print( PersonCSVTemplate.renderToString( ALL_PEOPLE.Values ) ) PersonCSVTemplate.render( writer, ALL_PEOPLE.Values ) } } } ================================================ FILE: samples/Gosu/Ronin.gs ================================================ /** * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. */ package ronin uses gw.util.concurrent.LockingLazyVar uses gw.lang.reflect.* uses java.lang.* uses java.io.* uses ronin.config.* uses org.slf4j.* /** * The central location for Ronin utility methods. Controllers and templates should generally access the * methods and properties they inherit from {@link ronin.IRoninUtils} instead of using the methods and * properties here. */ class Ronin { // One static field to rule the all... static var _CONFIG : IRoninConfig as Config // And one thread local to bind them static var _CURRENT_REQUEST = new ThreadLocal(); // That's inconstructable private construct() {} internal static function init(servlet : RoninServlet, m : ApplicationMode, src : File) { if(_CONFIG != null) { throw "Cannot initialize a Ronin application multiple times!" } var cfg = TypeSystem.getByFullNameIfValid("config.RoninConfig") var defaultWarning = false if(cfg != null) { var ctor = cfg.TypeInfo.getConstructor({ronin.config.ApplicationMode, ronin.RoninServlet}) if(ctor == null) { throw "config.RoninConfig must have a constructor with the same signature as ronin.config.RoninConfig" } _CONFIG = ctor.Constructor.newInstance({m, servlet}) as IRoninConfig } else { _CONFIG = new DefaultRoninConfig(m, servlet) defaultWarning = true } var roninLogger = TypeSystem.getByFullNameIfValid("ronin.RoninLoggerFactory") if(roninLogger != null) { roninLogger.TypeInfo.getMethod("init", {ronin.config.LogLevel}).CallHandler.handleCall(null, {LogLevel}) } if(defaultWarning) { log("No configuration was found at config.RoninConfig, using the default configuration...", :level=WARN) } Quartz.maybeStart() ReloadManager.setSourceRoot(src) } internal static property set CurrentRequest(req : RoninRequest) { _CURRENT_REQUEST.set(req) } //============================================ // Public API //============================================ /** * The trace handler for the current request. */ static property get CurrentTrace() : Trace { return CurrentRequest?.Trace } /** * Ronin's representation of the current request. */ static property get CurrentRequest() : RoninRequest { return _CURRENT_REQUEST.get() } /** * The mode in which this application is running. */ static property get Mode() : ApplicationMode { return _CONFIG?.Mode ?: TESTING } /** * The log level at and above which log messages should be displayed. */ static property get LogLevel() : LogLevel { return _CONFIG?.LogLevel ?: DEBUG } /** * Whether or not to display detailed trace information on each request. */ static property get TraceEnabled() : boolean { return _CONFIG != null ? _CONFIG.TraceEnabled : true } /** * The default controller method to call when no method name is present in the request URL. */ static property get DefaultAction() : String { return _CONFIG?.DefaultAction } /** * The default controller to call when no controller name is present in the request URL. */ static property get DefaultController() : Type { return _CONFIG?.DefaultController } /** * The servlet responsible for handling Ronin requests. */ static property get RoninServlet() : RoninServlet { return _CONFIG?.RoninServlet } /** * The handler for request processing errors. */ static property get ErrorHandler() : IErrorHandler { return _CONFIG?.ErrorHandler } /** * The custom handler for logging messages. */ static property get LogHandler() : ILogHandler { return _CONFIG?.LogHandler } /** * Logs a message using the configured log handler. * @param msg The text of the message to log, or a block which returns said text. * @param level (Optional) The level at which to log the message. * @param component (Optional) The logical component from whence the message originated. * @param exception (Optional) An exception to associate with the message. */ static function log(msg : Object, level : LogLevel = null, component : String = null, exception : java.lang.Throwable = null) { if(level == null) { level = INFO } if(LogLevel <= level) { var msgStr : String if(msg typeis block():String) { msgStr = (msg as block():String)() } else { msgStr = msg as String } if(_CONFIG?.LogHandler != null) { _CONFIG.LogHandler.log(msgStr, level, component, exception) } else { switch(level) { case TRACE: LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).trace(msgStr, exception) break case DEBUG: LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).debug(msgStr, exception) break case INFO: LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).info(msgStr, exception) break case WARN: LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).warn(msgStr, exception) break case ERROR: case FATAL: LoggerFactory.getLogger(component?:Logger.ROOT_LOGGER_NAME).error(msgStr, exception) break } } } } /** * The caches known to Ronin. */ static enum CacheStore { REQUEST, SESSION, APPLICATION } /** * Retrieves a value from a cache, or computes and stores it if it is not in the cache. * @param value A block which will compute the desired value. * @param name (Optional) A unique identifier for the value. Default is null, which means one will be * generated from the type of the value. * @param store (Optional) The cache store used to retrieve or store the value. Default is the request cache. * @return The retrieved or computed value. */ static function cache(value : block():T, name : String = null, store : CacheStore = null) : T { if(store == null or store == REQUEST) { return _CONFIG.RequestCache.getValue(value, name) } else if (store == SESSION) { return _CONFIG.SessionCache.getValue(value, name) } else if (store == APPLICATION) { return _CONFIG.ApplicationCache.getValue(value, name) } else { throw "Don't know about CacheStore ${store}" } } /** * Invalidates a cached value in a cache. * @param name The unique identifier for the value. * @param store The cache store in which to invalidate the value. */ static function invalidate(name : String, store : CacheStore) { if(store == null or store == REQUEST) { _CONFIG.RequestCache.invalidate(name) } else if (store == SESSION) { _CONFIG.SessionCache.invalidate(name) } else if (store == APPLICATION) { _CONFIG.ApplicationCache.invalidate(name) } else { throw "Don't know about CacheStore ${store}" } } /** * Detects changes made to resources in the Ronin application and * reloads them. This function should only be called when Ronin is * in development mode. */ static function loadChanges() { ReloadManager.detectAndReloadChangedResources() } } ================================================ FILE: samples/Gosu/hello.vark ================================================ function hello() { print("hello") } ================================================ FILE: samples/Grace/ackerman_function.grace ================================================ method ack (m : Number, n : Number) -> Number { print "ack {m} {n}" if (m < = 0) then {n + 1} elseif {n <= 0} then {ack((m -1), 1)} else {ack(m -1, ack(m, n-1))} } ================================================ FILE: samples/Grace/grace_IDE.grace ================================================ import "gtk" as gtk import "io" as io import "mgcollections" as collections import "button_factory" as button_factory import "dialog_factory" as dialog_factory import "syntax_highlighter" as highlighter import "auto_completer" as aComp //TODO // Autocomplete typing // FileChooser // Themes // Details for the Top Level Window def window = gtk.window(gtk.GTK_WINDOW_TOPLEVEL) window.title := "Grace" window.set_default_size(700, 700) // ------------- // Placeholder for the console window that can be popped out // of the main window var popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL) // Initialise the Boxes def mBox = gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) def buttonBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 2) var consoleButtons := gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 3) var consoleBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) var editorBox := gtk.box(gtk.GTK_ORIENTATION_VERTICAL, 2) var splitPane := gtk.paned(gtk.GTK_ORIENTATION_VERTICAL, 2) def menuBox = gtk.box(gtk.GTK_ORIENTATION_HORIZONTAL, 4) // ------------- // Initialise the buttons def runButton = button_factory.make("run") var clearButton := button_factory.make("clear") var outButton := button_factory.make("out") var errorButton := button_factory.make("error") var popButton := button_factory.make("pop") def newButton = button_factory.make("new") def openButton = button_factory.make("open") def saveButton = button_factory.make("save") def saveAsButton = button_factory.make("saveAs") def closeButton = button_factory.make("close") // ------------- // Details for the default text editor and scrolled window var tEdit := gtk.text_view tEdit.set_size_request(700, 400) var scrolled_main := gtk.scrolled_window scrolled_main.set_size_request(700, 400) scrolled_main.add(tEdit) // ------------- // Widget that allows multiple files to be edited (tabs) var notebook := gtk.notebook notebook.scrollable := true // ------------- // Maps for holding the text_views and scrolled_windows var editor_map := collections.map.new editor_map.put(0, tEdit) var scrolled_map := collections.map.new scrolled_map.put(0, scrolled_main) // ------------- // Class that manages the syntax highlighting (This needs to be passed around otherwise // the text_tag table gets confused, ie there can only be one) def lighter = highlighter.Syntax_Highlighter.new(notebook, editor_map) tEdit.buffer.on "changed" do { lighter.highlightLine } // Class that manages any auto completion that is required def completer = aComp.Auto_Completer.new(window, notebook, editor_map) // Utility methods // ------------- method deleteCompileFiles(page_num : Number) { def cur_scrolled = scrolled_map.get(page_num) var filename := notebook.get_tab_label_text(cur_scrolled) filename := filename.substringFrom(0)to(filename.size - 7) //Removes .grace extension io.system("rm -f files/" ++ filename) io.system("rm -f files/" ++ filename ++ ".c") io.system("rm -f files/" ++ filename ++ ".gcn") io.system("rm -f files/" ++ filename ++ ".gct") } // ------------- var currentConsole := "output" // Which console is being shown var out := false var outText := "" var errorText := "" // Give actions to the buttons // ------------- runButton.on "clicked" do { clearConsoles() // Get the details for the current page selected def cur_page_num = notebook.current_page def cur_page = editor_map.get(cur_page_num) def cur_scrolled = scrolled_map.get(cur_page_num) def cur_page_label = notebook.get_tab_label_text(cur_scrolled) // Initialise text iterators def sIter = gtk.text_iter def eIter = gtk.text_iter // Set one at the beggining and one at the end of the text cur_page.buffer.get_iter_at_offset(sIter, 0) cur_page.buffer.get_iter_at_offset(eIter, -1) // Get the text between the text iterators def text = cur_page.buffer.get_text(sIter, eIter, true) // Save the text to the file (in case the user hasn't already saved it) def file = io.open("files/" ++ cur_page_label, "w") file.write(text) file.close // Run the program and pipe the output and errors into files to be read io.system("../minigrace/minigrace " ++ "files/" ++ cur_page_label ++ " > output.txt 2> error.txt") def outputFile = io.open("output.txt", "r") def errorFile = io.open("error.txt", "r") outText := outputFile.read errorText := errorFile.read io.system("rm -f output.txt error.txt") var switched := false // Change the console to output if there is output text if((outText.size > 0) && (currentConsole != "output")) then { switch_to_output() switched := true } // Change the console to errors if there were errors if((errorText.size > 0) && (currentConsole != "errors")) then { switch_to_errors() switched := true } // Remember to populate the console if it wasn't switched if(!switched) then { populateConsoles } } clearButton.on "clicked" do { clearConsoles() } outButton.on "clicked" do { switch_to_output() } errorButton.on "clicked" do { switch_to_errors() } popButton.on "clicked" do { if(out) then { popIn() } else { popOut() } } // Gives a dialog to let the user create a new file to edit newButton.on "clicked" do { def new_window_class = dialog_factory.new.new(notebook, editor_map, scrolled_map, lighter) def new_window = new_window_class.window() new_window.show_all } // Gives a dialog that lets the user open a file to edit openButton.on "clicked" do { def open_window_class = dialog_factory.open.new(notebook, editor_map, scrolled_map, lighter) def open_window = open_window_class.window() open_window.show_all } // Saves the current file (if the name is Untitled.grace it will ask for a new name) saveButton.on "clicked" do { def cur_page_num = notebook.current_page def cur_page = editor_map.get(cur_page_num) def cur_scrolled = scrolled_map.get(cur_page_num) def cur_page_label = notebook.get_tab_label_text(cur_scrolled) if(cur_page_label == "Untitled.grace") then { def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, true) def saveAs_window = saveAs_window_class.window() saveAs_window.show_all } else { // Initialise text iterators def sIter = gtk.text_iter def eIter = gtk.text_iter // Set one at the beggining and one at the end of the text cur_page.buffer.get_iter_at_offset(sIter, 0) cur_page.buffer.get_iter_at_offset(eIter, -1) // Get the text between the text iterators def text = cur_page.buffer.get_text(sIter, eIter, true) // Save the file def file = io.open("files/" ++ cur_page_label, "w") file.write(text) file.close } } // Gives a dialog that lets the user save the file with a new name saveAsButton.on "clicked" do { def saveAs_window_class = dialog_factory.save.new(notebook, editor_map, scrolled_map, false) def saveAs_window = saveAs_window_class.window() saveAs_window.show_all } // This will close a tab on the notebook // It also "removes" the page from the map, // by creating a new temporary map and putting all but // the removed page in. closeButton.on "clicked" do { def page_num = notebook.current_page def num_pages = notebook.n_pages if(num_pages > 1) then { deleteCompileFiles(page_num) def e_map = collections.map.new def s_map = collections.map.new // Copy every page up to the current page into the new maps var x := 0 while {x < page_num} do { var eValue := editor_map.get(x) var sValue := scrolled_map.get(x) e_map.put(x, eValue) s_map.put(x, sValue) x := x + 1 } // Copy every page after the current page into the new map (shifted one down) x := page_num + 1 while {x < num_pages} do { var eValue := editor_map.get(x) var sValue := scrolled_map.get(x) e_map.put((x - 1), eValue) s_map.put((x - 1), sValue) x := x + 1 } editor_map := e_map scrolled_map := s_map notebook.remove_page(page_num) notebook.show_all } } // ------------- // Consoles: // ------------- var outConsole := gtk.text_view var outScroll := gtk.scrolled_window var errorConsole := gtk.text_view var errorScroll := gtk.scrolled_window var errorTag := errorConsole.buffer.create_tag("fixed", "foreground", "red") // Creates a new output console method createOut { outConsole := gtk.text_view outScroll := gtk.scrolled_window outScroll.add(outConsole) if(out) then { outConsole.set_size_request(400, 400) outScroll.set_size_request(400, 400) } else { outConsole.set_size_request(700, 200) outScroll.set_size_request(700, 200) } outConsole.editable := false outConsole.buffer.set_text("[Output]:", -1) } createOut() // Creates a new error console method createError { errorConsole := gtk.text_view errorScroll := gtk.scrolled_window errorScroll.add(errorConsole) if(out) then { errorConsole.set_size_request(400, 400) errorScroll.set_size_request(400, 400) } else { errorConsole.set_size_request(700, 200) errorScroll.set_size_request(700, 200) } errorConsole.editable := false errorConsole.buffer.set_text("[Errors]:", -1) errorTag := errorConsole.buffer.create_tag("fixed", "foreground", "red") } createError() // Switches the console being shown to be output. This requires // the output console to be remade as it would have been destroyed when // it was switched previously method switch_to_output { if(currentConsole != "output") then { currentConsole := "output" consoleBox.remove(errorScroll) // This destroys the errorConsole createOut() consoleBox.add(outScroll) populateConsoles() if(out) then { popped.show_all } else { window.show_all } } } // Switches the console being shown to be errors. This requires // the error console to be remade as it would have been destroyed when // it was switched previously method switch_to_errors { if(currentConsole != "errors") then { currentConsole := "errors" consoleBox.remove(outScroll) // This destroys the outConsole createError() consoleBox.add(errorScroll) populateConsoles() if(out) then { popped.show_all } else { window.show_all } } } // If there is text to be put into the consoles this will add it method populateConsoles { if((outText.size > 0) && (currentConsole == "output")) then { outConsole.buffer.set_text(outText, -1) } if((errorText.size > 0) && (currentConsole == "errors")) then { def sIter = gtk.text_iter def eIter = gtk.text_iter errorConsole.buffer.set_text(errorText, -1) errorConsole.buffer.get_iter_at_offset(sIter, 0) errorConsole.buffer.get_iter_at_offset(eIter, -1) errorConsole.buffer.apply_tag(errorTag, sIter, eIter) } } method clearConsoles { if(currentConsole == "output") then { outConsole.buffer.set_text("[Output]:", -1) outText := "" } if(currentConsole == "errors") then { errorConsole.buffer.set_text("[Errors]:", -1) errorText := "" } } // Identical as the popIn method, but can be connected to the window's destroy button def popInBlock = { consoleBox.reparent(splitPane) popButton.label := "Pop Out" if(currentConsole == "output") then { outConsole.set_size_request(700, 200) outScroll.set_size_request(700, 200) } if(currentConsole == "errors") then { errorConsole.set_size_request(700, 200) errorScroll.set_size_request(700, 200) } def cur_page_num = notebook.current_page def cur_scrolled = scrolled_map.get(cur_page_num) def cur_page = editor_map.get(cur_page_num) cur_page.set_size_request(700, 400) cur_scrolled.set_size_request(700, 400) out := false popped.visible := false } // This pops the console out into a separate window method popOut { popped := gtk.window(gtk.GTK_WINDOW_TOPLEVEL) consoleBox.reparent(popped) popButton.label := "Pop In" if(currentConsole == "output") then { outConsole.set_size_request(400, 400) outScroll.set_size_request(400, 400) } if(currentConsole == "errors") then { errorConsole.set_size_request(400, 400) errorScroll.set_size_request(400, 400) } def cur_page_num = notebook.current_page def cur_scrolled = scrolled_map.get(cur_page_num) def cur_page = editor_map.get(cur_page_num) cur_page.set_size_request(700, 580) cur_scrolled.set_size_request(700, 580) out := true popped.visible := true popped.connect("destroy", popInBlock) popped.show_all } // Puts the console back into the main window method popIn { consoleBox.reparent(splitPane) popButton.label := "Pop Out" if(currentConsole == "output") then { outConsole.set_size_request(700, 200) outScroll.set_size_request(700, 200) } if(currentConsole == "errors") then { errorConsole.set_size_request(700, 200) errorScroll.set_size_request(700, 200) } def cur_page_num = notebook.current_page def cur_scrolled = scrolled_map.get(cur_page_num) def cur_page = editor_map.get(cur_page_num) cur_page.set_size_request(700, 400) cur_scrolled.set_size_request(700, 400) out := false popped.visible := false } clearConsoles() // ------------- // Patch everything together var hSeparator1 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL) var hSeparator2 := gtk.separator(gtk.GTK_ORIENTATION_HORIZONTAL) menuBox.add(newButton) menuBox.add(openButton) menuBox.add(saveButton) menuBox.add(saveAsButton) buttonBox.add(runButton) buttonBox.add(closeButton) consoleButtons.add(outButton) consoleButtons.add(errorButton) consoleButtons.add(clearButton) consoleButtons.add(popButton) consoleBox.add(hSeparator1) consoleBox.add(consoleButtons) consoleBox.add(outScroll) editorBox.add(hSeparator2) notebook.add(scrolled_main) notebook.set_tab_label_text(scrolled_main, "Untitled.grace") editorBox.add(notebook) splitPane.add1(editorBox) splitPane.add2(consoleBox) mBox.add(menuBox) mBox.add(buttonBox) mBox.add(splitPane) window.add(mBox) def exit = { var x := 0 while {x < notebook.n_pages} do { deleteCompileFiles(x) x := x + 1 } // Delete the compile files of the IDE io.system("rm -f Grace_IDE.gct Grace_IDE.c Grace_IDE.gcn") io.system("rm -f scanner.gct scanner.c scanner.gcn") io.system("rm -f syntax_highlighter.gct syntax_highlighter.c syntax_highlighter.gcn") io.system("rm -f syntax_colors.gct syntax_colors.c syntax_colors.gcn") io.system("rm -f button_factory.gct button_factory.c button_factory.gcn") io.system("rm -f dialog_factory.gct dialog_factory.c dialog_factory.gcn") io.system("rm -f auto_completer.gct auto_completer.c auto_completer.gcn") print "Grace IDE Closed Successfully" gtk.main_quit } window.connect("destroy", exit) window.show_all gtk.main ================================================ FILE: samples/Gradle/build.gradle ================================================ apply plugin: GreetingPlugin greeting.message = 'Hi from Gradle' class GreetingPlugin implements Plugin { void apply(Project project) { // Add the 'greeting' extension object project.extensions.create("greeting", GreetingPluginExtension) // Add a task that uses the configuration project.task('hello') << { println project.greeting.message } } } class GreetingPluginExtension { def String message = 'Hello from GreetingPlugin' } ================================================ FILE: samples/Gradle/builder.gradle ================================================ apply plugin: GreetingPlugin greeting { message = 'Hi' greeter = 'Gradle' } class GreetingPlugin implements Plugin { void apply(Project project) { project.extensions.create("greeting", GreetingPluginExtension) project.task('hello') << { println "${project.greeting.message} from ${project.greeting.greeter}" } } } class GreetingPluginExtension { String message String greeter } ================================================ FILE: samples/Gradle Kotlin DSL/build.gradle.kts ================================================ /* * Copyright (c) Meta Platforms, Inc. and affiliates. * * This source code is licensed under the MIT license found in the * LICENSE file in the root directory of this source tree. */ plugins { alias(libs.plugins.nexus.publish) alias(libs.plugins.android.library) apply false alias(libs.plugins.android.application) apply false alias(libs.plugins.download) apply false alias(libs.plugins.kotlin.android) apply false } val reactAndroidProperties = java.util.Properties() File("$rootDir/packages/react-native/ReactAndroid/gradle.properties").inputStream().use { reactAndroidProperties.load(it) } version = if (project.hasProperty("isNightly") && (project.property("isNightly") as? String).toBoolean()) { "${reactAndroidProperties.getProperty("VERSION_NAME")}-SNAPSHOT" } else { reactAndroidProperties.getProperty("VERSION_NAME") } group = "com.facebook.react" val ndkPath by extra(System.getenv("ANDROID_NDK")) val ndkVersion by extra(System.getenv("ANDROID_NDK_VERSION") ?: "25.1.8937393") val sonatypeUsername = findProperty("SONATYPE_USERNAME")?.toString() val sonatypePassword = findProperty("SONATYPE_PASSWORD")?.toString() nexusPublishing { repositories { sonatype { username.set(sonatypeUsername) password.set(sonatypePassword) } } } tasks.register("clean", Delete::class.java) { description = "Remove all the build files and intermediate build outputs" dependsOn(gradle.includedBuild("react-native-gradle-plugin").task(":clean")) subprojects.forEach { if (it.project.plugins.hasPlugin("com.android.library") || it.project.plugins.hasPlugin("com.android.application")) { dependsOn(it.tasks.named("clean")) } } delete(allprojects.map { it.layout.buildDirectory.asFile }) delete(rootProject.file("./packages/react-native/ReactAndroid/.cxx")) delete(rootProject.file("./packages/react-native/ReactAndroid/hermes-engine/.cxx")) delete(rootProject.file("./packages/react-native/sdks/download/")) delete(rootProject.file("./packages/react-native/sdks/hermes/")) delete( rootProject.file("./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/arm64-v8a/")) delete( rootProject.file( "./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/armeabi-v7a/")) delete(rootProject.file("./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/x86/")) delete(rootProject.file("./packages/react-native/ReactAndroid/src/main/jni/prebuilt/lib/x86_64/")) delete(rootProject.file("./packages/react-native-codegen/lib")) delete(rootProject.file("./node_modules/@react-native/codegen/lib")) delete(rootProject.file("./packages/rn-tester/android/app/.cxx")) } tasks.register("build") { description = "Build and test all the React Native relevant projects." dependsOn(gradle.includedBuild("react-native-gradle-plugin").task(":build")) } tasks.register("downloadAll") { description = "Download all the depedencies needed locally so they can be cached on CI." dependsOn(gradle.includedBuild("react-native-gradle-plugin").task(":dependencies")) dependsOn(":packages:react-native:ReactAndroid:downloadNdkBuildDependencies") dependsOn(":packages:react-native:ReactAndroid:dependencies") dependsOn(":packages:react-native:ReactAndroid:androidDependencies") dependsOn(":packages:react-native:ReactAndroid:hermes-engine:dependencies") dependsOn(":packages:react-native:ReactAndroid:hermes-engine:androidDependencies") dependsOn(":packages:rn-tester:android:app:dependencies") dependsOn(":packages:rn-tester:android:app:androidDependencies") } tasks.register("publishAllInsideNpmPackage") { description = "Publish all the artifacts to be available inside the NPM package in the `android` folder." // Due to size constraints of NPM, we publish only react-native and hermes-engine inside // the NPM package. dependsOn(":packages:react-native:ReactAndroid:installArchives") dependsOn(":packages:react-native:ReactAndroid:hermes-engine:installArchives") } tasks.register("publishAllToMavenTempLocal") { description = "Publish all the artifacts to be available inside a Maven Local repository on /tmp." dependsOn(":packages:react-native:ReactAndroid:publishAllPublicationsToMavenTempLocalRepository") // We don't publish the external-artifacts to Maven Local as CircleCI is using it via workspace. dependsOn( ":packages:react-native:ReactAndroid:flipper-integration:publishAllPublicationsToMavenTempLocalRepository") dependsOn( ":packages:react-native:ReactAndroid:hermes-engine:publishAllPublicationsToMavenTempLocalRepository") } tasks.register("publishAllToSonatype") { description = "Publish all the artifacts to Sonatype (Maven Central or Snapshot repository)" dependsOn(":packages:react-native:ReactAndroid:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:external-artifacts:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:flipper-integration:publishToSonatype") dependsOn(":packages:react-native:ReactAndroid:hermes-engine:publishToSonatype") } if (project.findProperty("react.internal.useHermesNightly")?.toString()?.toBoolean() == true) { logger.warn( """ ******************************************************************************** INFO: You're using Hermes from nightly as you set react.internal.useHermesNightly=true in the ./gradle.properties file. That's fine for local development, but you should not commit this change. ******************************************************************************** """ .trimIndent()) allprojects { configurations.all { resolutionStrategy.dependencySubstitution { substitute(project(":packages:react-native:ReactAndroid:hermes-engine")) .using(module("com.facebook.react:hermes-android:0.0.0-+")) .because("Users opted to use hermes from nightly") } } } } ================================================ FILE: samples/Grammatical Framework/Foods.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL abstract Foods = { flags startcat = Comment ; cat Comment ; Item ; Kind ; Quality ; fun Pred : Item -> Quality -> Comment ; This, That, These, Those : Kind -> Item ; Mod : Quality -> Kind -> Kind ; Wine, Cheese, Fish, Pizza : Kind ; Very : Quality -> Quality ; Fresh, Warm, Italian, Expensive, Delicious, Boring : Quality ; } ================================================ FILE: samples/Grammatical Framework/FoodsAfr.gf ================================================ -- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL concrete FoodsAfr of Foods = open Prelude, Predef in{ flags coding=utf8; lincat Comment = {s: Str} ; Kind = {s: Number => Str} ; Item = {s: Str ; n: Number} ; Quality = {s: AdjAP => Str} ; lin Pred item quality = {s = item.s ++ "is" ++ (quality.s ! Predic)}; This kind = {s = "hierdie" ++ (kind.s ! Sg); n = Sg}; That kind = {s = "daardie" ++ (kind.s ! Sg); n = Sg}; These kind = {s = "hierdie" ++ (kind.s ! Pl); n = Pl}; Those kind = {s = "daardie" ++ (kind.s ! Pl); n = Pl}; Mod quality kind = {s = table{n => (quality.s ! Attr) ++ (kind.s!n)}}; Wine = declNoun_e "wyn"; Cheese = declNoun_aa "kaas"; Fish = declNoun_ss "vis"; Pizza = declNoun_s "pizza"; Very quality = veryAdj quality; Fresh = regAdj "vars"; Warm = regAdj "warm"; Italian = smartAdj_e "Italiaans"; Expensive = regAdj "duur"; Delicious = smartAdj_e "heerlik"; Boring = smartAdj_e "vervelig"; param AdjAP = Attr | Predic ; Number = Sg | Pl ; oper --Noun operations (wyn, kaas, vis, pizza) declNoun_aa: Str -> {s: Number => Str} = \x -> let v = tk 2 x in {s = table{Sg => x ; Pl => v + (last x) +"e"}}; declNoun_e: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "e"}} ; declNoun_s: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + "s"}} ; declNoun_ss: Str -> {s: Number => Str} = \x -> {s = table{Sg => x ; Pl => x + (last x) + "e"}} ; --Adjective operations mkAdj : Str -> Str -> {s: AdjAP => Str} = \x,y -> {s = table{Attr => x; Predic => y}}; declAdj_e : Str -> {s : AdjAP=> Str} = \x -> mkAdj (x + "e") x; declAdj_g : Str -> {s : AdjAP=> Str} = \w -> let v = init w in mkAdj (v + "ë") w ; declAdj_oog : Str -> {s : AdjAP=> Str} = \w -> let v = init w in let i = init v in mkAdj (i + "ë") w ; regAdj : Str -> {s : AdjAP=> Str} = \x -> mkAdj x x; veryAdj : {s: AdjAP => Str} -> {s : AdjAP=> Str} = \x -> {s = table{a => "baie" ++ (x.s!a)}}; smartAdj_e : Str -> {s : AdjAP=> Str} = \a -> case a of { _ + "oog" => declAdj_oog a ; _ + ("e" | "ie" | "o" | "oe") + "g" => declAdj_g a ; _ => declAdj_e a }; } ================================================ FILE: samples/Grammatical Framework/FoodsAmh.gf ================================================ concrete FoodsAmh of Foods ={ flags coding = utf8; lincat Comment,Item,Kind,Quality = Str; lin Pred item quality = item ++ quality++ "ነው::" ; This kind = "ይህ" ++ kind; That kind = "ያ" ++ kind; Mod quality kind = quality ++ kind; Wine = "ወይን"; Cheese = "አይብ"; Fish = "ዓሳ"; Very quality = "በጣም" ++ quality; Fresh = "አዲስ"; Warm = "ትኩስ"; Italian = "የጥልያን"; Expensive = "ውድ"; Delicious = "ጣፋጭ"; Boring = "አስቀያሚ"; } ================================================ FILE: samples/Grammatical Framework/FoodsBul.gf ================================================ -- (c) 2009 Krasimir Angelov under LGPL concrete FoodsBul of Foods = { flags coding = utf8; param Gender = Masc | Fem | Neutr; Number = Sg | Pl; Agr = ASg Gender | APl ; lincat Comment = Str ; Quality = {s : Agr => Str} ; Item = {s : Str; a : Agr} ; Kind = {s : Number => Str; g : Gender} ; lin Pred item qual = item.s ++ case item.a of {ASg _ => "е"; APl => "са"} ++ qual.s ! item.a ; This kind = {s=case kind.g of {Masc=>"този"; Fem=>"тази"; Neutr=>"това" } ++ kind.s ! Sg; a=ASg kind.g} ; That kind = {s=case kind.g of {Masc=>"онзи"; Fem=>"онази"; Neutr=>"онова"} ++ kind.s ! Sg; a=ASg kind.g} ; These kind = {s="тези" ++ kind.s ! Pl; a=APl} ; Those kind = {s="онези" ++ kind.s ! Pl; a=APl} ; Mod qual kind = {s=\\n => qual.s ! (case n of {Sg => ASg kind.g; Pl => APl}) ++ kind.s ! n; g=kind.g} ; Wine = {s = table {Sg => "вино"; Pl => "вина"}; g = Neutr}; Cheese = {s = table {Sg => "сирене"; Pl => "сирена"}; g = Neutr}; Fish = {s = table {Sg => "риба"; Pl => "риби"}; g = Fem}; Pizza = {s = table {Sg => "пица"; Pl => "пици"}; g = Fem}; Very qual = {s = \\g => "много" ++ qual.s ! g}; Fresh = {s = table {ASg Masc => "свеж"; ASg Fem => "свежа"; ASg Neutr => "свежо"; APl => "свежи"}}; Warm = {s = table {ASg Masc => "горещ"; ASg Fem => "гореща"; ASg Neutr => "горещо"; APl => "горещи"}}; Italian = {s = table {ASg Masc => "италиански"; ASg Fem => "италианска"; ASg Neutr => "италианско"; APl => "италиански"}}; Expensive = {s = table {ASg Masc => "скъп"; ASg Fem => "скъпа"; ASg Neutr => "скъпо"; APl => "скъпи"}}; Delicious = {s = table {ASg Masc => "превъзходен"; ASg Fem => "превъзходна"; ASg Neutr => "превъзходно"; APl => "превъзходни"}}; Boring = {s = table {ASg Masc => "еднообразен"; ASg Fem => "еднообразна"; ASg Neutr => "еднообразно"; APl => "еднообразни"}}; } ================================================ FILE: samples/Grammatical Framework/FoodsCat.gf ================================================ --# -path=.:present -- (c) 2009 Jordi Saludes under LGPL concrete FoodsCat of Foods = FoodsI with (Syntax = SyntaxCat), (LexFoods = LexFoodsCat) ; ================================================ FILE: samples/Grammatical Framework/FoodsChi.gf ================================================ concrete FoodsChi of Foods = { flags coding = utf8 ; lincat Comment, Item = Str ; Kind = {s,c : Str} ; Quality = {s,p : Str} ; lin Pred item quality = item ++ "是" ++ quality.s ++ quality.p ; This kind = "这" ++ kind.c ++ kind.s ; That kind = "那" ++ kind.c ++ kind.s ; These kind = "这" ++ "些" ++ kind.s ; Those kind = "那" ++ "些" ++ kind.s ; Mod quality kind = { s = quality.s ++ quality.p ++ kind.s ; c = kind.c } ; Wine = geKind "酒" ; Pizza = geKind "比 萨 饼" ; Cheese = geKind "奶 酪" ; Fish = geKind "鱼" ; Very quality = longQuality ("非 常" ++ quality.s) ; Fresh = longQuality "新 鲜" ; Warm = longQuality "温 热" ; Italian = longQuality "意 大 利 式" ; Expensive = longQuality "昂 贵" ; Delicious = longQuality "美 味" ; Boring = longQuality "难 吃" ; oper mkKind : Str -> Str -> {s,c : Str} = \s,c -> {s = s ; c = c} ; geKind : Str -> {s,c : Str} = \s -> mkKind s "个" ; longQuality : Str -> {s,p : Str} = \s -> {s = s ; p = "的"} ; } ================================================ FILE: samples/Grammatical Framework/FoodsCze.gf ================================================ -- (c) 2011 Katerina Bohmova under LGPL concrete FoodsCze of Foods = open ResCze in { flags coding = utf8 ; lincat Comment = {s : Str} ; Quality = Adjective ; Kind = Noun ; Item = NounPhrase ; lin Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n} ; This = det Sg "tento" "tato" "toto" ; That = det Sg "tamten" "tamta" "tamto" ; These = det Pl "tyto" "tyto" "tato" ; Those = det Pl "tamty" "tamty" "tamta" ; Mod quality kind = { s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g } ; Wine = noun "víno" "vína" Neutr ; Cheese = noun "sýr" "sýry" Masc ; Fish = noun "ryba" "ryby" Fem ; Pizza = noun "pizza" "pizzy" Fem ; Very qual = {s = \\g,n => "velmi" ++ qual.s ! g ! n} ; Fresh = regAdj "čerstv" ; Warm = regAdj "tepl" ; Italian = regAdj "italsk" ; Expensive = regAdj "drah" ; Delicious = regnfAdj "vynikající" ; Boring = regAdj "nudn" ; } ================================================ FILE: samples/Grammatical Framework/FoodsDut.gf ================================================ -- (c) 2009 Femke Johansson under LGPL concrete FoodsDut of Foods = { lincat Comment = {s : Str}; Quality = {s : AForm => Str}; Kind = { s : Number => Str}; Item = {s : Str ; n : Number}; lin Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! APred}; This = det Sg "deze"; These = det Pl "deze"; That = det Sg "die"; Those = det Pl "die"; Mod quality kind = {s = \\n => quality.s ! AAttr ++ kind.s ! n}; Wine = regNoun "wijn"; Cheese = noun "kaas" "kazen"; Fish = noun "vis" "vissen"; Pizza = noun "pizza" "pizza's"; Very a = {s = \\f => "erg" ++ a.s ! f}; Fresh = regadj "vers"; Warm = regadj "warm"; Italian = regadj "Italiaans"; Expensive = adj "duur" "dure"; Delicious = regadj "lekker"; Boring = regadj "saai"; param Number = Sg | Pl; AForm = APred | AAttr; oper det : Number -> Str -> {s : Number => Str} -> {s : Str ; n: Number} = \n,det,noun -> {s = det ++ noun.s ! n ; n=n}; noun : Str -> Str -> {s : Number => Str} = \man,men -> {s = table {Sg => man; Pl => men}}; regNoun : Str -> {s : Number => Str} = \wijn -> noun wijn (wijn + "en"); regadj : Str -> {s : AForm => Str} = \koud -> adj koud (koud+"e"); adj : Str -> Str -> {s : AForm => Str} = \duur, dure -> {s = table {APred => duur; AAttr => dure}}; copula : Number => Str = table {Sg => "is" ; Pl => "zijn"}; } ================================================ FILE: samples/Grammatical Framework/FoodsEng.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL concrete FoodsEng of Foods = { flags language = en_US; lincat Comment, Quality = {s : Str} ; Kind = {s : Number => Str} ; Item = {s : Str ; n : Number} ; lin Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s} ; This = det Sg "this" ; That = det Sg "that" ; These = det Pl "these" ; Those = det Pl "those" ; Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ; Wine = regNoun "wine" ; Cheese = regNoun "cheese" ; Fish = noun "fish" "fish" ; Pizza = regNoun "pizza" ; Very a = {s = "very" ++ a.s} ; Fresh = adj "fresh" ; Warm = adj "warm" ; Italian = adj "Italian" ; Expensive = adj "expensive" ; Delicious = adj "delicious" ; Boring = adj "boring" ; param Number = Sg | Pl ; oper det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n,det,noun -> {s = det ++ noun.s ! n ; n = n} ; noun : Str -> Str -> {s : Number => Str} = \man,men -> {s = table {Sg => man ; Pl => men}} ; regNoun : Str -> {s : Number => Str} = \car -> noun car (car + "s") ; adj : Str -> {s : Str} = \cold -> {s = cold} ; copula : Number => Str = table {Sg => "is" ; Pl => "are"} ; } ================================================ FILE: samples/Grammatical Framework/FoodsEpo.gf ================================================ -- (c) 2009 Julia Hammar under LGPL concrete FoodsEpo of Foods = open Prelude in { flags coding =utf8 ; lincat Comment = SS ; Kind, Quality = {s : Number => Str} ; Item = {s : Str ; n : Number} ; lin Pred item quality = ss (item.s ++ copula ! item.n ++ quality.s ! item.n) ; This = det Sg "ĉi tiu" ; That = det Sg "tiu" ; These = det Pl "ĉi tiuj" ; Those = det Pl "tiuj" ; Mod quality kind = {s = \\n => quality.s ! n ++ kind.s ! n} ; Wine = regNoun "vino" ; Cheese = regNoun "fromaĝo" ; Fish = regNoun "fiŝo" ; Pizza = regNoun "pico" ; Very quality = {s = \\n => "tre" ++ quality.s ! n} ; Fresh = regAdj "freŝa" ; Warm = regAdj "varma" ; Italian = regAdj "itala" ; Expensive = regAdj "altekosta" ; Delicious = regAdj "bongusta" ; Boring = regAdj "enuiga" ; param Number = Sg | Pl ; oper det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n,d,cn -> { s = d ++ cn.s ! n ; n = n } ; regNoun : Str -> {s : Number => Str} = \vino -> {s = table {Sg => vino ; Pl => vino + "j"} } ; regAdj : Str -> {s : Number => Str} = \nova -> {s = table {Sg => nova ; Pl => nova + "j"} } ; copula : Number => Str = \\_ => "estas" ; } ================================================ FILE: samples/Grammatical Framework/FoodsFin.gf ================================================ --# -path=.:present -- (c) 2009 Aarne Ranta under LGPL concrete FoodsFin of Foods = FoodsI with (Syntax = SyntaxFin), (LexFoods = LexFoodsFin) ; ================================================ FILE: samples/Grammatical Framework/FoodsFre.gf ================================================ --# -path=.:../foods:present concrete FoodsFre of Foods = open SyntaxFre, ParadigmsFre in { flags coding = utf8 ; lincat Comment = Utt ; Item = NP ; Kind = CN ; Quality = AP ; lin Pred item quality = mkUtt (mkCl item quality) ; This kind = mkNP this_QuantSg kind ; That kind = mkNP that_QuantSg kind ; These kind = mkNP these_QuantPl kind ; Those kind = mkNP those_QuantPl kind ; Mod quality kind = mkCN quality kind ; Very quality = mkAP very_AdA quality ; Wine = mkCN (mkN "vin" masculine) ; Pizza = mkCN (mkN "pizza" feminine) ; Cheese = mkCN (mkN "fromage" masculine) ; Fish = mkCN (mkN "poisson" masculine) ; Fresh = mkAP (mkA "frais" "fraîche" "frais" "fraîchement") ; Warm = mkAP (mkA "chaud") ; Italian = mkAP (mkA "italien") ; Expensive = mkAP (mkA "cher") ; Delicious = mkAP (mkA "délicieux") ; Boring = mkAP (mkA "ennuyeux") ; } ================================================ FILE: samples/Grammatical Framework/FoodsGer.gf ================================================ --# -path=.:present -- (c) 2009 Aarne Ranta under LGPL concrete FoodsGer of Foods = FoodsI with (Syntax = SyntaxGer), (LexFoods = LexFoodsGer) ; ================================================ FILE: samples/Grammatical Framework/FoodsHeb.gf ================================================ --# -path=alltenses --(c) 2009 Dana Dannells -- Licensed under LGPL concrete FoodsHeb of Foods = open Prelude in { flags coding=utf8 ; lincat Comment = SS ; Quality = {s: Number => Species => Gender => Str} ; Kind = {s : Number => Species => Str ; g : Gender ; mod : Modified} ; Item = {s : Str ; g : Gender ; n : Number ; sp : Species ; mod : Modified} ; lin Pred item quality = ss (item.s ++ quality.s ! item.n ! Indef ! item.g ) ; This = det Sg Def "הזה" "הזאת"; That = det Sg Def "ההוא" "ההיא" ; These = det Pl Def "האלה" "האלה" ; Those = det Pl Def "ההם" "ההן" ; Mod quality kind = { s = \\n,sp => kind.s ! n ! sp ++ quality.s ! n ! sp ! kind.g; g = kind.g ; mod = T } ; Wine = regNoun "יין" "יינות" Masc ; Cheese = regNoun "גבינה" "גבינות" Fem ; Fish = regNoun "דג" "דגים" Masc ; Pizza = regNoun "פיצה" "פיצות" Fem ; Very qual = {s = \\g,n,sp => "מאוד" ++ qual.s ! g ! n ! sp} ; Fresh = regAdj "טרי" ; Warm = regAdj "חם" ; Italian = regAdj2 "איטלקי" ; Expensive = regAdj "יקר" ; Delicious = regAdj "טעים" ; Boring = regAdj2 "משעמם"; param Number = Sg | Pl ; Gender = Masc | Fem ; Species = Def | Indef ; Modified = T | F ; oper Noun : Type = {s : Number => Species => Str ; g : Gender ; mod : Modified } ; Adj : Type = {s : Number => Species => Gender => Str} ; det : Number -> Species -> Str -> Str -> Noun -> {s : Str ; g :Gender ; n : Number ; sp : Species ; mod : Modified} = \n,sp,m,f,cn -> { s = case cn.mod of { _ => cn.s ! n ! sp ++ case cn.g of {Masc => m ; Fem => f} }; g = cn.g ; n = n ; sp = sp ; mod = cn.mod } ; noun : (gvina,hagvina,gvinot,hagvinot : Str) -> Gender -> Noun = \gvina,hagvina,gvinot,hagvinot,g -> { s = table { Sg => table { Indef => gvina ; Def => hagvina } ; Pl => table { Indef => gvinot ; Def => hagvinot } } ; g = g ; mod = F } ; regNoun : Str -> Str -> Gender -> Noun = \gvina,gvinot, g -> noun gvina (defH gvina) gvinot (defH gvinot) g ; defH : Str -> Str = \cn -> case cn of {_ => "ה" + cn}; replaceLastLetter : Str -> Str = \c -> case c of {"ף" => "פ" ; "ם" => "מ" ; "ן" => "נ" ; "ץ" => "צ" ; "ך" => "כ"; _ => c} ; adjective : (_,_,_,_ : Str) -> Adj = \tov,tova,tovim,tovot -> { s = table { Sg => table { Indef => table { Masc => tov ; Fem => tova } ; Def => table { Masc => defH tov ; Fem => defH tova } } ; Pl => table { Indef => table {Masc => tovim ; Fem => tovot } ; Def => table { Masc => defH tovim ; Fem => defH tovot } } } } ; regAdj : Str -> Adj = \tov -> case tov of { to + c@? => adjective tov (to + replaceLastLetter (c) + "ה" ) (to + replaceLastLetter (c) +"ים" ) (to + replaceLastLetter (c) + "ות" )}; regAdj2 : Str -> Adj = \italki -> case italki of { italk+ c@? => adjective italki (italk + replaceLastLetter (c) +"ת" ) (italk + replaceLastLetter (c)+ "ים" ) (italk + replaceLastLetter (c) + "ות" )}; } -- FoodsHeb ================================================ FILE: samples/Grammatical Framework/FoodsHin.gf ================================================ -- (c) 2010 Vikash Rauniyar under LGPL concrete FoodsHin of Foods = { flags coding=utf8 ; param Gender = Masc | Fem ; Number = Sg | Pl ; lincat Comment = {s : Str} ; Item = {s : Str ; g : Gender ; n : Number} ; Kind = {s : Number => Str ; g : Gender} ; Quality = {s : Gender => Number => Str} ; lin Pred item quality = { s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n } ; This kind = {s = "यह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; That kind = {s = "वह" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; These kind = {s = "ये" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; Those kind = {s = "वे" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; Mod quality kind = { s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g } ; Wine = regN "मदिरा" ; Cheese = regN "पनीर" ; Fish = regN "मछली" ; Pizza = regN "पिज़्ज़ा" ; Very quality = {s = \\g,n => "अति" ++ quality.s ! g ! n} ; Fresh = regAdj "ताज़ा" ; Warm = regAdj "गरम" ; Italian = regAdj "इटली" ; Expensive = regAdj "बहुमूल्य" ; Delicious = regAdj "स्वादिष्ट" ; Boring = regAdj "अरुचिकर" ; oper mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \s,p,g -> { s = table { Sg => s ; Pl => p } ; g = g } ; regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of { lark + "ा" => mkN s (lark + "े") Masc ; lark + "ी" => mkN s (lark + "ीयँा") Fem ; _ => mkN s s Masc } ; mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> { s = table { Masc => table { Sg => ms ; Pl => mp } ; Fem => \\_ => f } } ; regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of { acch + "ा" => mkAdj a (acch + "े") (acch + "ी") ; _ => mkAdj a a a } ; copula : Number -> Str = \n -> case n of { Sg => "है" ; Pl => "हैं" } ; } ================================================ FILE: samples/Grammatical Framework/FoodsI.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL incomplete concrete FoodsI of Foods = open Syntax, LexFoods in { lincat Comment = Utt ; Item = NP ; Kind = CN ; Quality = AP ; lin Pred item quality = mkUtt (mkCl item quality) ; This kind = mkNP this_Det kind ; That kind = mkNP that_Det kind ; These kind = mkNP these_Det kind ; Those kind = mkNP those_Det kind ; Mod quality kind = mkCN quality kind ; Very quality = mkAP very_AdA quality ; Wine = mkCN wine_N ; Pizza = mkCN pizza_N ; Cheese = mkCN cheese_N ; Fish = mkCN fish_N ; Fresh = mkAP fresh_A ; Warm = mkAP warm_A ; Italian = mkAP italian_A ; Expensive = mkAP expensive_A ; Delicious = mkAP delicious_A ; Boring = mkAP boring_A ; } ================================================ FILE: samples/Grammatical Framework/FoodsIce.gf ================================================ --# -path=.:prelude -- (c) 2009 Martha Dis Brandt under LGPL concrete FoodsIce of Foods = open Prelude in { flags coding=utf8; lincat Comment = SS ; Quality = {s : Gender => Number => Defin => Str} ; Kind = {s : Number => Str ; g : Gender} ; Item = {s : Str ; g : Gender ; n : Number} ; lin Pred item quality = ss (item.s ++ copula item.n ++ quality.s ! item.g ! item.n ! Ind) ; This, That = det Sg "þessi" "þessi" "þetta" ; These, Those = det Pl "þessir" "þessar" "þessi" ; Mod quality kind = { s = \\n => quality.s ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ; Wine = noun "vín" "vín" Neutr ; Cheese = noun "ostur" "ostar" Masc ; Fish = noun "fiskur" "fiskar" Masc ; -- the word "pizza" is more commonly used in Iceland, but "flatbaka" is the Icelandic word for it Pizza = noun "flatbaka" "flatbökur" Fem ; Very qual = {s = \\g,n,defOrInd => "mjög" ++ qual.s ! g ! n ! defOrInd } ; Fresh = regAdj "ferskur" ; Warm = regAdj "heitur" ; Boring = regAdj "leiðinlegur" ; -- the order of the given adj forms is: mSg fSg nSg mPl fPl nPl mSgDef f/nSgDef _PlDef Italian = adjective "ítalskur" "ítölsk" "ítalskt" "ítalskir" "ítalskar" "ítölsk" "ítalski" "ítalska" "ítalsku" ; Expensive = adjective "dýr" "dýr" "dýrt" "dýrir" "dýrar" "dýr" "dýri" "dýra" "dýru" ; Delicious = adjective "ljúffengur" "ljúffeng" "ljúffengt" "ljúffengir" "ljúffengar" "ljúffeng" "ljúffengi" "ljúffenga" "ljúffengu" ; param Number = Sg | Pl ; Gender = Masc | Fem | Neutr ; Defin = Ind | Def ; oper det : Number -> Str -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,masc,fem,neutr,cn -> { s = case cn.g of {Masc => masc ; Fem => fem; Neutr => neutr } ++ cn.s ! n ; g = cn.g ; n = n } ; noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \man,men,g -> { s = table { Sg => man ; Pl => men } ; g = g } ; adjective : (x1,_,_,_,_,_,_,_,x9 : Str) -> {s : Gender => Number => Defin => Str} = \ferskur,fersk,ferskt,ferskir,ferskar,fersk_pl,ferski,ferska,fersku -> { s = \\g,n,t => case of { < Masc, Sg, Ind > => ferskur ; < Masc, Pl, Ind > => ferskir ; < Fem, Sg, Ind > => fersk ; < Fem, Pl, Ind > => ferskar ; < Neutr, Sg, Ind > => ferskt ; < Neutr, Pl, Ind > => fersk_pl; < Masc, Sg, Def > => ferski ; < Fem, Sg, Def > | < Neutr, Sg, Def > => ferska ; < _ , Pl, Def > => fersku } } ; regAdj : Str -> {s : Gender => Number => Defin => Str} = \ferskur -> let fersk = Predef.tk 2 ferskur in adjective ferskur fersk (fersk + "t") (fersk + "ir") (fersk + "ar") fersk (fersk + "i") (fersk + "a") (fersk + "u") ; copula : Number -> Str = \n -> case n of { Sg => "er" ; Pl => "eru" } ; } ================================================ FILE: samples/Grammatical Framework/FoodsIta.gf ================================================ --# -path=.:present -- (c) 2009 Aarne Ranta under LGPL concrete FoodsIta of Foods = FoodsI with (Syntax = SyntaxIta), (LexFoods = LexFoodsIta) ; ================================================ FILE: samples/Grammatical Framework/FoodsJpn.gf ================================================ --# -path=.:../lib/src/prelude -- (c) 2009 Zofia Stankiewicz under LGPL concrete FoodsJpn of Foods = open Prelude in { flags coding=utf8 ; lincat Comment = {s: Style => Str}; Quality = {s: AdjUse => Str ; t: AdjType} ; Kind = {s : Number => Str} ; Item = {s : Str ; n : Number} ; lin Pred item quality = {s = case quality.t of { IAdj => table {Plain => item.s ++ quality.s ! APred ; Polite => item.s ++ quality.s ! APred ++ copula ! Polite ! item.n } ; NaAdj => \\p => item.s ++ quality.s ! APred ++ copula ! p ! item.n } } ; This = det Sg "この" ; That = det Sg "その" ; These = det Pl "この" ; Those = det Pl "その" ; Mod quality kind = {s = \\n => quality.s ! Attr ++ kind.s ! n} ; Wine = regNoun "ワインは" ; Cheese = regNoun "チーズは" ; Fish = regNoun "魚は" ; Pizza = regNoun "ピザは" ; Very quality = {s = \\a => "とても" ++ quality.s ! a ; t = quality.t } ; Fresh = adj "新鮮な" "新鮮"; Warm = regAdj "あたたかい" ; Italian = adj "イタリアの" "イタリアのもの"; Expensive = regAdj "たかい" ; Delicious = regAdj "おいしい" ; Boring = regAdj "つまらない" ; param Number = Sg | Pl ; AdjUse = Attr | APred ; -- na-adjectives have different forms as noun attributes and predicates Style = Plain | Polite ; -- for phrase types AdjType = IAdj | NaAdj ; -- IAdj can form predicates without the copula, NaAdj cannot oper det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n,d,cn -> { s = d ++ cn.s ! n ; n = n } ; noun : Str -> Str -> {s : Number => Str} = \sakana,sakana -> {s = \\_ => sakana } ; regNoun : Str -> {s : Number => Str} = \sakana -> noun sakana sakana ; adj : Str -> Str -> {s : AdjUse => Str ; t : AdjType} = \chosenna, chosen -> { s = table { Attr => chosenna ; APred => chosen } ; t = NaAdj } ; regAdj : Str -> {s: AdjUse => Str ; t : AdjType} =\akai -> { s = \\_ => akai ; t = IAdj} ; copula : Style => Number => Str = table { Plain => \\_ => "だ" ; Polite => \\_ => "です" } ; } ================================================ FILE: samples/Grammatical Framework/FoodsLav.gf ================================================ --# -path=.:prelude -- (c) 2009 Inese Bernsone under LGPL concrete FoodsLav of Foods = open Prelude in { flags coding=utf8 ; lincat Comment = SS ; Quality = {s : Q => Gender => Number => Defin => Str } ; Kind = {s : Number => Str ; g : Gender} ; Item = {s : Str ; g : Gender ; n : Number } ; lin Pred item quality = ss (item.s ++ {- copula item.n -} "ir" ++ quality.s ! Q1 ! item.g ! item.n ! Ind ) ; This = det Sg "šis" "šī" ; That = det Sg "tas" "tā" ; These = det Pl "šie" "šīs" ; Those = det Pl "tie" "tās" ; Mod quality kind = {s = \\n => quality.s ! Q1 ! kind.g ! n ! Def ++ kind.s ! n ; g = kind.g } ; Wine = noun "vīns" "vīni" Masc ; Cheese = noun "siers" "sieri" Masc ; Fish = noun "zivs" "zivis" Fem ; Pizza = noun "pica" "picas" Fem ; Very qual = {s = \\q,g,n,spec => "ļoti" ++ qual.s ! Q2 ! g ! n ! spec }; Fresh = adjective "svaigs" "svaiga" "svaigi" "svaigas" "svaigais" "svaigā" "svaigie" "svaigās" ; Warm = regAdj "silts" ; Italian = specAdj "itāļu" (regAdj "itālisks") ; Expensive = regAdj "dārgs" ; Delicious = regAdj "garšīgs" ; Boring = regAdj "garlaicīgs" ; param Number = Sg | Pl ; Gender = Masc | Fem ; Defin = Ind | Def ; Q = Q1 | Q2 ; oper det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,m,f,cn -> { s = case cn.g of {Masc => m ; Fem => f} ++ cn.s ! n ; g = cn.g ; n = n } ; noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \man,men,g -> { s = table { Sg => man ; Pl => men } ; g = g } ; adjective : (_,_,_,_,_,_,_,_ : Str) -> {s : Q => Gender => Number => Defin => Str} = \skaists,skaista,skaisti,skaistas,skaistais,skaistaa,skaistie,skaistaas -> { s = table { _ => table { Masc => table { Sg => table {Ind => skaists ; Def => skaistais} ; Pl => table {Ind => skaisti ; Def => skaistie} } ; Fem => table { Sg => table {Ind => skaista ; Def => skaistaa} ; Pl => table {Ind => skaistas ; Def => skaistaas} } } } } ; {- irregAdj : Str -> {s : Gender => Number => Defin => Str} = \itaalju -> let itaalju = itaalju in adjective itaalju (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) (itaalju) ; -} regAdj : Str -> {s : Q => Gender => Number => Defin => Str} = \skaists -> let skaist = init skaists in adjective skaists (skaist + "a") (skaist + "i") (skaist + "as") (skaist + "ais") (skaist + "ā") (skaist + "ie") (skaist + "ās"); Adjective : Type = {s : Q => Gender => Number => Defin => Str} ; specAdj : Str -> Adjective -> Adjective = \s,a -> { s = table { Q2 => a.s ! Q1 ; Q1 => \\_,_,_ => s } } ; } ================================================ FILE: samples/Grammatical Framework/FoodsMlt.gf ================================================ -- (c) 2013 John J. Camilleri under LGPL concrete FoodsMlt of Foods = open Prelude in { flags coding=utf8 ; lincat Comment = SS ; Quality = {s : Gender => Number => Str} ; Kind = {s : Number => Str ; g : Gender} ; Item = {s : Str ; g : Gender ; n : Number} ; lin -- Pred item quality = ss (item.s ++ copula item.n item.g ++ quality.s ! item.g ! item.n) ; Pred item quality = ss (item.s ++ quality.s ! item.g ! item.n) ; This kind = det Sg "dan" "din" kind ; That kind = det Sg "dak" "dik" kind ; These kind = det Pl "dawn" "" kind ; Those kind = det Pl "dawk" "" kind ; Mod quality kind = { s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ; Wine = noun "inbid" "inbejjed" Masc ; Cheese = noun "ġobon" "ġobniet" Masc ; Fish = noun "ħuta" "ħut" Fem ; Pizza = noun "pizza" "pizzez" Fem ; Very qual = {s = \\g,n => qual.s ! g ! n ++ "ħafna"} ; Warm = adjective "sħun" "sħuna" "sħan" ; Expensive = adjective "għali" "għalja" "għaljin" ; Delicious = adjective "tajjeb" "tajba" "tajbin" ; Boring = uniAdj "tad-dwejjaq" ; Fresh = regAdj "frisk" ; Italian = regAdj "Taljan" ; param Number = Sg | Pl ; Gender = Masc | Fem ; oper --Create an adjective (full function) --Params: Sing Masc, Sing Fem, Plural adjective : (_,_,_ : Str) -> {s : Gender => Number => Str} = \iswed,sewda,suwed -> { s = table { Masc => table { Sg => iswed ; Pl => suwed } ; Fem => table { Sg => sewda ; Pl => suwed } } } ; --Create a regular adjective --Param: Sing Masc regAdj : Str -> {s : Gender => Number => Str} = \frisk -> adjective frisk (frisk + "a") (frisk + "i") ; --Create a "uni-adjective" eg tal-buzz --Param: Sing Masc uniAdj : Str -> {s : Gender => Number => Str} = \uni -> adjective uni uni uni ; --Create a noun --Params: Singular, Plural, Gender (inherent) noun : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \ktieb,kotba,g -> { s = table { Sg => ktieb ; Pl => kotba } ; g = g } ; --Copula is a linking verb --Params: Number, Gender -- copula : Number -> Gender -> Str = \n,g -> case n of { -- Sg => case g of { Masc => "huwa" ; Fem => "hija" } ; -- Pl => "huma" -- } ; --Create an article, taking into account first letter of next word article = pre { "a"|"e"|"i"|"o"|"u" => "l-" ; --cons@("ċ"|"d"|"n"|"r"|"s"|"t"|"x"|"ż") => "i" + cons + "-" ; _ => "il-" } ; --Create a determinant --Params: Sg/Pl, Masc, Fem det : Number -> Str -> Str -> {s : Number => Str ; g : Gender} -> {s : Str ; g : Gender ; n : Number} = \n,m,f,cn -> { s = case n of { Sg => case cn.g of {Masc => m ; Fem => f}; --string Pl => m --default to masc } ++ article ++ cn.s ! n ; g = cn.g ; --gender n = n --number } ; } ================================================ FILE: samples/Grammatical Framework/FoodsMon.gf ================================================ --# -path=.:/GF/lib/src/prelude -- (c) 2009 Nyamsuren Erdenebadrakh under LGPL concrete FoodsMon of Foods = open Prelude in { flags coding=utf8; lincat Comment, Quality = SS ; Kind = {s : Number => Str} ; Item = {s : Str ; n : Number} ; lin Pred item quality = ss (item.s ++ "бол" ++ quality.s) ; This = det Sg "энэ" ; That = det Sg "тэр" ; These = det Pl "эдгээр" ; Those = det Pl "тэдгээр" ; Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ; Wine = regNoun "дарс" ; Cheese = regNoun "бяслаг" ; Fish = regNoun "загас" ; Pizza = regNoun "пицца" ; Very = prefixSS "маш" ; Fresh = ss "шинэ" ; Warm = ss "халуун" ; Italian = ss "итали" ; Expensive = ss "үнэтэй" ; Delicious = ss "амттай" ; Boring = ss "амтгүй" ; param Number = Sg | Pl ; oper det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n,d,cn -> { s = d ++ cn.s ! n ; n = n } ; regNoun : Str -> {s : Number => Str} = \x -> {s = table { Sg => x ; Pl => x + "нууд"} } ; } ================================================ FILE: samples/Grammatical Framework/FoodsNep.gf ================================================ -- (c) 2011 Dinesh Simkhada under LGPL concrete FoodsNep of Foods = { flags coding = utf8 ; lincat Comment, Quality = {s : Str} ; Kind = {s : Number => Str} ; Item = {s : Str ; n : Number} ; lin Pred item quality = {s = item.s ++ quality.s ++ copula ! item.n} ; This = det Sg "यो" ; That = det Sg "त्यो" ; These = det Pl "यी" ; Those = det Pl "ती" ; Mod quality kind = {s = \\n => quality.s ++ kind.s ! n} ; Wine = regNoun "रक्सी" ; Cheese = regNoun "चिज" ; Fish = regNoun "माछा" ; Pizza = regNoun "पिज्जा" ; Very a = {s = "धेरै" ++ a.s} ; Fresh = adj "ताजा" ; Warm = adj "तातो" ; Italian = adj "इटालियन" ; Expensive = adj "महँगो" | adj "बहुमूल्य" ; Delicious = adj "स्वादिष्ट" | adj "मीठो" ; Boring = adjPl "नमिठो" ; param Number = Sg | Pl ; oper det : Number -> Str -> {s : Number => Str} -> {s : Str ; n : Number} = \n,det,noun -> {s = det ++ noun.s ! n ; n = n} ; noun : Str -> Str -> {s : Number => Str} = \man,men -> {s = table {Sg => man ; Pl => men}} ; regNoun : Str -> {s : Number => Str} = \car -> noun car (car + "हरु") ; adjPl : Str -> {s : Str} = \a -> case a of { bor + "ठो" => adj (bor + "ठा") ; _ => adj a } ; adj : Str -> {s : Str} = \cold -> {s = cold} ; copula : Number => Str = table {Sg => "छ" ; Pl => "छन्"} ; } ================================================ FILE: samples/Grammatical Framework/FoodsOri.gf ================================================ concrete FoodsOri of Foods = { flags coding = utf8 ; lincat Comment = Str; Item = Str; Kind = Str; Quality = Str; lin Pred item quality = item ++ quality ++ "ଅଟେ"; This kind = "ଏଇ" ++ kind; That kind = "ସେଇ" ++ kind; These kind = "ଏଇ" ++ kind ++ "ଗୁଡିକ" ; Those kind = "ସେଇ" ++ kind ++ "ଗୁଡିକ" ; Mod quality kind = quality ++ kind; Wine = "ମଦ"; Cheese = "ଛେନା"; Fish = "ମାଛ"; Pizza = "ପିଜଜ଼ା" ; Very quality = "ଅତି" ++ quality; Fresh = "ତାଜା"; Warm = "ଗରମ"; Italian = "ଇଟାଲି"; Expensive = "ମୁଲ୍ୟବାନ୍"; Delicious = "ସ୍ଵାଦିସ୍ଟ "; Boring = "ଅରୁଚିକର"; } ================================================ FILE: samples/Grammatical Framework/FoodsPes.gf ================================================ concrete FoodsPes of Foods = { flags optimize=noexpand ; coding=utf8 ; lincat Comment = {s : Str} ; Quality = {s : Add => Str; prep : Str} ; Kind = {s : Add => Number => Str ; prep : Str}; Item = {s : Str ; n : Number}; lin Pred item quality = {s = item.s ++ quality.s ! Indep ++ copula ! item.n} ; This = det Sg "این" ; That = det Sg "آن" ; These = det Pl "این" ; Those = det Pl "آن" ; Mod quality kind = {s = \\a,n => kind.s ! Attr ! n ++ kind.prep ++ quality.s ! a ; prep = quality.prep }; Wine = regN "شراب" ; Cheese = regN "پنیر" ; Fish = regN "ماهى" ; Pizza = regN "پیتزا" ; Very a = {s = \\at => "خیلی" ++ a.s ! at ; prep = a.prep} ; Fresh = adj "تازه" ; Warm = adj "گرم" ; Italian = adj "ایتالیایی" ; Expensive = adj "گران" ; Delicious = adj "لذىذ" ; Boring = adj "ملال آور" ; -- it must be written as ملال آور. param Number = Sg | Pl ; Add = Indep | Attr ; oper det : Number -> Str -> {s: Add => Number => Str ; prep : Str} -> {s : Str ; n: Number} = \n,det,noun -> {s = det ++ noun.s ! Indep ! n ; n = n }; noun : (x1,_,_,x4 : Str) -> {s : Add => Number => Str ; prep : Str} = \pytzA, pytzAy, pytzAhA,pr -> {s = \\a,n => case of { => pytzA ; => pytzAhA ; =>pytzA ; => pytzAhA + "ى" }; prep = pr }; regN : Str -> {s: Add => Number => Str ; prep : Str} = \mrd -> case mrd of { _ + ("ا"|"ه"|"ى"|"و"|"") => noun mrd (mrd+"ى") (mrd + "ها") ""; _ => noun mrd mrd (mrd + "ها") "e" }; adj : Str -> {s : Add => Str; prep : Str} = \tAzh -> case tAzh of { _ + ("ا"|"ه"|"ى"|"و"|"") => mkAdj tAzh (tAzh ++ "ى") "" ; _ => mkAdj tAzh tAzh "ه" }; mkAdj : Str -> Str -> Str -> {s : Add => Str; prep : Str} = \tAzh, tAzhy, pr -> {s = table {Indep => tAzh; Attr => tAzhy}; prep = pr }; copula : Number => Str = table {Sg => "است"; Pl => "هستند"}; } ================================================ FILE: samples/Grammatical Framework/FoodsPor.gf ================================================ -- (c) 2009 Rami Shashati under LGPL concrete FoodsPor of Foods = open Prelude in { flags coding=utf8; lincat Comment = {s : Str} ; Quality = {s : Gender => Number => Str} ; Kind = {s : Number => Str ; g : Gender} ; Item = {s : Str ; n : Number ; g : Gender } ; lin Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.g ! item.n } ; This = det Sg (table {Masc => "este" ; Fem => "esta"}) ; That = det Sg (table {Masc => "esse" ; Fem => "essa"}) ; These = det Pl (table {Masc => "estes" ; Fem => "estas"}) ; Those = det Pl (table {Masc => "esses" ; Fem => "essas"}) ; Mod quality kind = { s = \\n => kind.s ! n ++ quality.s ! kind.g ! n ; g = kind.g } ; Wine = regNoun "vinho" Masc ; Cheese = regNoun "queijo" Masc ; Fish = regNoun "peixe" Masc ; Pizza = regNoun "pizza" Fem ; Very a = { s = \\g,n => "muito" ++ a.s ! g ! n } ; Fresh = mkAdjReg "fresco" ; Warm = mkAdjReg "quente" ; Italian = mkAdjReg "Italiano" ; Expensive = mkAdjReg "caro" ; Delicious = mkAdjReg "delicioso" ; Boring = mkAdjReg "chato" ; param Number = Sg | Pl ; Gender = Masc | Fem ; oper QualityT : Type = {s : Gender => Number => Str} ; mkAdj : (_,_,_,_ : Str) -> QualityT = \bonito,bonita,bonitos,bonitas -> { s = table { Masc => table { Sg => bonito ; Pl => bonitos } ; Fem => table { Sg => bonita ; Pl => bonitas } } ; } ; -- regular pattern adjSozinho : Str -> QualityT = \sozinho -> let sozinh = Predef.tk 1 sozinho in mkAdj sozinho (sozinh + "a") (sozinh + "os") (sozinh + "as") ; -- for gender-independent adjectives adjUtil : Str -> Str -> QualityT = \util,uteis -> mkAdj util util uteis uteis ; -- smart paradigm for adjcetives mkAdjReg : Str -> QualityT = \a -> case last a of { "o" => adjSozinho a ; "e" => adjUtil a (a + "s") } ; ItemT : Type = {s : Str ; n : Number ; g : Gender } ; det : Number -> (Gender => Str) -> KindT -> ItemT = \num,det,noun -> {s = det ! noun.g ++ noun.s ! num ; n = num ; g = noun.g } ; KindT : Type = {s : Number => Str ; g : Gender} ; noun : Str -> Str -> Gender -> KindT = \animal,animais,gen -> {s = table {Sg => animal ; Pl => animais} ; g = gen } ; regNoun : Str -> Gender -> KindT = \carro,gen -> noun carro (carro + "s") gen ; copula : Number => Str = table {Sg => "é" ; Pl => "são"} ; } ================================================ FILE: samples/Grammatical Framework/FoodsRon.gf ================================================ -- (c) 2009 Ramona Enache under LGPL concrete FoodsRon of Foods = { flags coding=utf8 ; param Number = Sg | Pl ; Gender = Masc | Fem ; NGender = NMasc | NFem | NNeut ; lincat Comment = {s : Str}; Quality = {s : Number => Gender => Str}; Kind = {s : Number => Str; g : NGender}; Item = {s : Str ; n : Number; g : Gender}; lin This = det Sg (mkTab "acest" "această"); That = det Sg (mkTab "acel" "acea"); These = det Pl (mkTab "acești" "aceste"); Those = det Pl (mkTab "acei" "acele"); Wine = mkNoun "vin" "vinuri" NNeut ; Cheese = mkNoun "brânză" "brânzeturi" NFem ; Fish = mkNoun "peşte" "peşti" NMasc ; Pizza = mkNoun "pizza" "pizze" NFem; Very a = {s = \\n,g => "foarte" ++ a.s ! n ! g}; Fresh = mkAdj "proaspăt" "proaspătă" "proaspeţi" "proaspete" ; Warm = mkAdj "cald" "caldă" "calzi" "calde" ; Italian = mkAdj "italian" "italiană" "italieni" "italiene" ; Expensive = mkAdj "scump" "scumpă" "scumpi" "scumpe" ; Delicious = mkAdj "delicios" "delcioasă" "delicioşi" "delicioase" ; Boring = mkAdj "plictisitor" "plictisitoare" "plictisitori" "plictisitoare" ; Pred item quality = {s = item.s ++ copula ! item.n ++ quality.s ! item.n ! item.g} ; Mod quality kind = {s = \\n => kind.s ! n ++ quality.s ! n ! (getAgrGender kind.g n) ; g = kind.g}; oper mkTab : Str -> Str -> {s : Gender => Str} = \acesta, aceasta -> {s = table{Masc => acesta; Fem => aceasta}}; det : Number -> {s : Gender => Str} -> {s : Number => Str ; g : NGender} -> {s : Str; n : Number; g : Gender} = \n,det,noun -> let gg = getAgrGender noun.g n in {s = det.s ! gg ++ noun.s ! n ; n = n ; g = gg}; mkNoun : Str -> Str -> NGender -> {s : Number => Str; g : NGender} = \peste, pesti,g -> {s = table {Sg => peste; Pl => pesti}; g = g }; oper mkAdj : (x1,_,_,x4 : Str) -> {s : Number => Gender => Str} = \scump, scumpa, scumpi, scumpe -> {s = \\n,g => case of { => scump ; => scumpa; => scumpi ; => scumpe }}; copula : Number => Str = table {Sg => "este" ; Pl => "sunt"}; getAgrGender : NGender -> Number -> Gender = \ng,n -> case of { => Masc ; => Fem; => Masc ; => Fem }; } ================================================ FILE: samples/Grammatical Framework/FoodsSpa.gf ================================================ --# -path=.:present concrete FoodsSpa of Foods = open SyntaxSpa, StructuralSpa, ParadigmsSpa in { lincat Comment = Utt ; Item = NP ; Kind = CN ; Quality = AP ; lin Pred item quality = mkUtt (mkCl item quality) ; This kind = mkNP this_QuantSg kind ; That kind = mkNP that_QuantSg kind ; These kind = mkNP these_QuantPl kind ; Those kind = mkNP those_QuantPl kind ; Mod quality kind = mkCN quality kind ; Very quality = mkAP very_AdA quality ; Wine = mkCN (mkN "vino") ; Pizza = mkCN (mkN "pizza") ; Cheese = mkCN (mkN "queso") ; Fish = mkCN (mkN "pescado") ; Fresh = mkAP (mkA "fresco") ; Warm = mkAP (mkA "caliente") ; Italian = mkAP (mkA "italiano") ; Expensive = mkAP (mkA "caro") ; Delicious = mkAP (mkA "delicioso") ; Boring = mkAP (mkA "aburrido") ; } ================================================ FILE: samples/Grammatical Framework/FoodsSwe.gf ================================================ --# -path=.:present -- (c) 2009 Aarne Ranta under LGPL concrete FoodsSwe of Foods = FoodsI with (Syntax = SyntaxSwe), (LexFoods = LexFoodsSwe) ** {flags language = sv_SE;} ; ================================================ FILE: samples/Grammatical Framework/FoodsTha.gf ================================================ --# -path=.:alltenses concrete FoodsTha of Foods = open SyntaxTha, LexiconTha, ParadigmsTha, (R=ResTha) in { flags coding = utf8 ; lincat Comment = Utt ; Item = NP ; Kind = CN ; Quality = AP ; lin Pred item quality = mkUtt (mkCl item quality) ; This kind = mkNP this_Det kind ; That kind = mkNP that_Det kind ; These kind = mkNP these_Det kind ; Those kind = mkNP those_Det kind ; Mod quality kind = mkCN quality kind ; Very quality = mkAP very_AdA quality ; Wine = mkCN (mkN (R.thword "เหล้าอ" "งุ่น") "ขวด") ; Pizza = mkCN (mkN (R.thword "พิซ" "ซา") "ถาด") ; Cheese = mkCN (mkN (R.thword "เนย" "แข็ง") "ก้อน") ; Fish = mkCN fish_N ; Fresh = mkAP (mkA "สด") ; Warm = mkAP warm_A ; Italian = mkAP (mkA " อิตาลี") ; Expensive = mkAP (mkA "แพง") ; Delicious = mkAP (mkA "อร่อย") ; Boring = mkAP (mkA (R.thword "น่า" "เบิ่อ")) ; } ================================================ FILE: samples/Grammatical Framework/FoodsTsn.gf ================================================ --# -path=alltenses -- (c) 2009 Laurette Pretorius Sr & Jr and Ansu Berg under LGPL concrete FoodsTsn of Foods = open Prelude, Predef in { flags coding = utf8; lincat Comment = {s:Str}; Item = {s:Str; c:NounClass; n:Number}; Kind = {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool}; Quality = {s: NounClass => Number => Str; p_form: Str; t: TType}; lin Pred item quality = {s = item.s ++ ((mkPredDescrCop quality.t) ! item.c ! item.n) ++ quality.p_form}; This kind = {s = (kind.w ! Sg) ++ (mkDemPron1 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg}; That kind = {s = (kind.w ! Sg) ++ (mkDemPron2 ! kind.c ! Sg) ++ (kind.q ! Sg); c = kind.c; n = Sg}; These kind = {s = (kind.w ! Pl) ++ (mkDemPron1 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl}; Those kind = {s = (kind.w ! Pl) ++ (mkDemPron2 ! kind.c ! Pl) ++ (kind.q ! Pl); c = kind.c; n = Pl}; Mod quality kind = mkMod quality kind; -- Lexicon Wine = mkNounNC14_6 "jalwa"; Cheese = mkNounNC9_10 "kase"; Fish = mkNounNC9_10 "thlapi"; Pizza = mkNounNC9_10 "pizza"; Very quality = smartVery quality; Fresh = mkVarAdj "ntsha"; Warm = mkOrdAdj "bothitho"; Italian = mkPerAdj "Itali"; Expensive = mkVerbRel "tura"; Delicious = mkOrdAdj "monate"; Boring = mkOrdAdj "bosula"; param NounClass = NC9_10 | NC14_6; Number = Sg | Pl; TType = P | V | ModV | R ; oper mkMod : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x,y -> case y.b of { True => {w = y.w; r = y.r; c = y.c; q = table { Sg => ((y.q ! Sg) ++ "le" ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg)); Pl => ((y.q ! Pl) ++ "le" ++ ((smartQualRelPart (x.t))! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl)) }; b = True }; False => {w = y.w; r = y.r; c = y.c; q = table { Sg => ((y.q ! Sg) ++ ((smartQualRelPart (x.t)) ! y.c ! Sg) ++ ((smartDescrCop (x.t)) ! y.c ! Sg) ++ (x.s ! y.c ! Sg)); Pl => ((y.q ! Pl) ++ ((smartQualRelPart (x.t)) ! y.c ! Pl) ++ ((smartDescrCop (x.t)) ! y.c ! Pl) ++(x.s ! y.c ! Pl)) }; b = True } }; mkNounNC14_6 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "bo" + x; Pl => "ma" + x}; r = x; c = NC14_6; q = table {Sg => ""; Pl => ""}; b = False}; mkNounNC9_10 : Str -> {w: Number => Str; r: Str; c: NounClass; q: Number => Str; b: Bool} = \x -> {w = table {Sg => "" + x; Pl => "di" + x}; r = x; c = NC9_10; q = table {Sg => ""; Pl => ""}; b = False}; mkVarAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> { s = table { NC9_10 => table {Sg => "" + x; Pl => "di" + x}; NC14_6 => table {Sg => "bo" + x; Pl => "ma" + x} }; p_form = x; t = R; }; mkOrdAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> { s = table { NC9_10 => table {Sg => "" + x; Pl => "" + x}; NC14_6 => table {Sg => "" + x; Pl => "" + x} }; p_form = x; t = R; }; mkVerbRel : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> { s = table { NC9_10 => table {Sg => x + "ng"; Pl => x + "ng"}; NC14_6 => table {Sg => x + "ng"; Pl => x + "ng"} }; p_form = x; t = V; }; mkPerAdj : Str -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> { s = table { NC9_10 => table {Sg => "" + x; Pl => "" + x}; NC14_6 => table {Sg => "" + x; Pl => "" + x} }; p_form = "mo" ++ x; t = P; }; mkVeryAdj : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> { s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = x.t }; mkVeryVerb : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> { s = table{c => table{n => (x.s!c!n) ++ "thata"}}; p_form = x.p_form ++ "thata"; t = ModV }; smartVery : {s: NounClass => Number => Str; p_form: Str; t: TType} -> {s: NounClass => Number => Str; p_form: Str; t: TType} = \x -> case x.t of --(x.s!c!n) { (V | ModV) => mkVeryVerb x; --ModV => mkVeryVerb x; _ => mkVeryAdj x }; mkDemPron1 : NounClass => Number => Str = table { NC9_10 => table {Sg => "e"; Pl => "tse"}; NC14_6 => table {Sg => "bo"; Pl => "a"} }; mkDemPron2 : NounClass => Number => Str = table { NC9_10 => table {Sg => "eo"; Pl => "tseo"}; NC14_6 => table {Sg => "boo"; Pl => "ao"} }; smartQualRelPart : TType -> (NounClass => Number => Str) = \x -> case x of { P => mkQualRelPart_PName; _ => mkQualRelPart }; mkQualRelPart : NounClass => Number => Str = table { NC9_10 => table {Sg => "e"; Pl => "tse"}; NC14_6 => table {Sg => "bo"; Pl => "a"} }; mkQualRelPart_PName : NounClass => Number => Str = table { NC9_10 => table {Sg => "ya"; Pl => "tsa"}; NC14_6 => table {Sg => "ba"; Pl => "a"} }; smartDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of { P => mkDescrCop_PName; _ => mkDescrCop }; mkDescrCop : NounClass => Number => Str = table { NC9_10 => table {Sg => "e"; Pl => "di"}; NC14_6 => table {Sg => "bo"; Pl => "a"} }; mkDescrCop_PName : NounClass => Number => Str = table { NC9_10 => table {Sg => "ga"; Pl => "ga"}; NC14_6 => table {Sg => "ga"; Pl => "ga"} }; mkPredDescrCop : TType -> (NounClass => Number => Str) = \x -> case x of { V => table {NC9_10 => table {Sg => "e" ++ "a"; Pl => "di" ++ "a"}; NC14_6 => table {Sg => "bo" ++ "a"; Pl => "a" ++ "a"}}; _ => table {NC9_10 => table {Sg => "e"; Pl => "di"}; NC14_6 => table {Sg => "bo"; Pl => "a"}} }; } ================================================ FILE: samples/Grammatical Framework/FoodsTur.gf ================================================ {- File : FoodsTur.gf Author : Server Çimen Version : 1.0 Created on: August 26, 2009 This file contains concrete grammar of Foods abstract grammar for Turkish Language. This grammar is to be used for Fridge demo and developed in the scope of GF Resource Grammar Summer School. -} concrete FoodsTur of Foods = open Predef in { flags coding=utf8 ; lincat Comment = {s : Str} ; Quality = {s : Str ; c : Case; softness : Softness; h : Harmony} ; Kind = {s : Case => Number => Str} ; Item = {s : Str; n : Number} ; lin This = det Sg "bu" ; That = det Sg "şu" ; These = det Pl "bu" ; Those = det Pl "şu" ; -- Reason for excluding plural form of copula: In Turkish if subject is not a human being, -- then singular form of copula is used regardless of the number of subject. Since all -- possible subjects are non human, copula do not need to have plural form. Pred item quality = {s = item.s ++ quality.s ++ "&+" ++ copula ! quality.softness ! quality.h} ;--! item.n} ; Mod quality kind = {s = case quality.c of { Nom => \\t,n => quality.s ++ kind.s ! t ! n ; Gen => \\t,n => quality.s ++ kind.s ! Gen ! n } } ; Wine = mkN "şarap" "şaraplar" "şarabı" "şarapları" ; Cheese = mkN "peynir" "peynirler" "peyniri" "peynirleri" ; Fish = mkN "balık" "balıklar" "balığı" "balıkları" ; Pizza = mkN "pizza" "pizzalar" "pizzası" "pizzaları" ; Very a = {s = "çok" ++ a.s ; c = a.c; softness = a.softness; h = a.h} ; Fresh = adj "taze" Nom; Warm = adj "ılık" Nom; Italian = adj "İtalyan" Gen ; Expensive = adj "pahalı" Nom; Delicious = adj "lezzetli" Nom; Boring = adj "sıkıcı" Nom; param Number = Sg | Pl ; Case = Nom | Gen ; Harmony = I_Har | Ih_Har | U_Har | Uh_Har ; --Ih = İ; Uh = Ü Softness = Soft | Hard ; oper det : Number -> Str -> {s : Case => Number => Str} -> {s : Str; n : Number} = \num,det,noun -> {s = det ++ noun.s ! Nom ! num; n = num} ; mkN = overload { mkN : Str -> Str -> {s : Case => Number => Str} = regNoun ; mkn : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = noun ; } ; regNoun : Str -> Str -> {s : Case => Number => Str} = \peynir,peynirler -> noun peynir peynirler [] [] ; noun : Str -> Str -> Str -> Str-> {s : Case => Number => Str} = \sarap,saraplar,sarabi,saraplari -> { s = table { Nom => table { Sg => sarap ; Pl => saraplar } ; Gen => table { Sg => sarabi ; Pl => saraplari } } }; {- Since there is a bug in overloading, this overload is useless. mkA = overload { mkA : Str -> {s : Str; c : Case; softness : Softness; h : Harmony} = \base -> adj base Nom ; mkA : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = adj ; } ; -} adj : Str -> Case -> {s : Str; c : Case; softness : Softness; h : Harmony} = \italyan,ca -> {s = italyan ; c = ca; softness = (getSoftness italyan); h = (getHarmony italyan)} ; -- See the comment at lines 26 and 27 for excluded plural form of copula. copula : Softness => Harmony {-=> Number-} => Str = table { Soft => table { I_Har => "dır" ;--table { -- Sg => "dır" ; -- Pl => "dırlar" --} ; Ih_Har => "dir" ;--table { --Sg => "dir" ; --Pl => "dirler" --} ; U_Har => "dur" ;--table { -- Sg => "dur" ; -- Pl => "durlar" --} ; Uh_Har => "dür" --table { --Sg => "dür" ; --Pl => "dürler" --} } ; Hard => table { I_Har => "tır" ;--table { --Sg => "tır" ; --Pl => "tırlar" --} ; Ih_Har => "tir" ;--table { --Sg => "tir" ; --Pl => "tirler" --} ; U_Har => "tur" ;--table { -- Sg => "tur" ; -- Pl => "turlar" --} ; Uh_Har => "tür"--table { --Sg => "tür" ; --Pl => "türler" --} } } ; getHarmony : Str -> Harmony = \base -> case base of { _+c@("ı"|"a"|"i"|"e"|"u"|"o"|"ü"|"ö")+ ("b"|"v"|"d"|"z"|"j"|"c"|"g"|"ğ"|"l"|"r"|"m"|"n"|"y"|"p"|"f"|"t"|"s"|"ş"|"ç"|"k"|"h")* => case c of { ("ı"|"a") => I_Har ; ("i"|"e") => Ih_Har ; ("u"|"o") => U_Har ; ("ü"|"ö") => Uh_Har } } ; getSoftness : Str -> Softness = \base -> case base of { _+("f"|"s"|"t"|"k"|"ç"|"ş"|"h"|"p") => Hard ; _ => Soft } ; } ================================================ FILE: samples/Grammatical Framework/FoodsUrd.gf ================================================ -- (c) 2009 Shafqat Virk under LGPL concrete FoodsUrd of Foods = { flags coding=utf8 ; param Number = Sg | Pl ; param Gender = Masc | Fem; oper coupla : Number -> Str =\n -> case n of {Sg => "ہے" ; Pl => "ہیں"}; lincat Comment = {s : Str} ; Item = {s: Str ; n: Number ; g:Gender}; Kind = {s: Number => Str ; g:Gender}; Quality = {s: Gender => Number => Str}; lin Pred item quality = {s = item.s ++ quality.s ! item.g ! item.n ++ coupla item.n} ; This kind = {s = "یھ" ++ kind.s ! Sg; n= Sg ; g = kind.g } ; These kind = {s = "یھ" ++ kind.s ! Pl; n = Pl ; g = kind.g} ; That kind = {s = "وہ" ++ kind.s ! Sg; n= Sg ; g = kind.g} ; Those kind = {s = "وہ" ++ kind.s ! Pl; n=Pl ; g = kind.g} ; Mod quality kind = {s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g}; Wine = {s = table { Sg => "شراب" ; Pl => "شرابیں"} ; g = Fem}; Cheese = {s = table { Sg => "پنیر" ; Pl => "پنیریں"} ; g = Fem}; Fish = {s = table { Sg => "مچھلی" ; Pl => "مچھلیاں"} ; g = Fem}; Pizza = {s = table { Sg => "پیزہ" ; Pl => "پیزے"} ; g = Masc}; Very quality = {s = \\g,n => "بہت" ++ quality.s ! g ! n} ; Fresh = regAdj "تازہ" ; Warm = regAdj "گرم" ; Italian = regAdj "اٹا لوی" ; Expensive = regAdj "مہنگا" ; Delicious = regAdj "مزیدار" ; Boring = regAdj "فضول" ; oper regAdj : Str -> {s: Gender => Number => Str} = \a -> case a of { x + "ا" => mkAdj a (x+"ے") (x+"ی"); _ => mkAdj a a a }; mkAdj : Str -> Str -> Str -> {s: Gender => Number => Str} = \s,p,f -> { s = table { Masc => table { Sg => s; Pl => p }; Fem => \\_ => f } }; } ================================================ FILE: samples/Grammatical Framework/LexFoods.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL interface LexFoods = open Syntax in { oper wine_N : N ; pizza_N : N ; cheese_N : N ; fish_N : N ; fresh_A : A ; warm_A : A ; italian_A : A ; expensive_A : A ; delicious_A : A ; boring_A : A ; } ================================================ FILE: samples/Grammatical Framework/LexFoodsCat.gf ================================================ -- (c) 2009 Jordi Saludes under LGPL instance LexFoodsCat of LexFoods = open SyntaxCat, ParadigmsCat, (M = MorphoCat) in { flags coding = utf8 ; oper wine_N = mkN "vi" "vins" M.Masc ; pizza_N = mkN "pizza" ; cheese_N = mkN "formatge" ; fish_N = mkN "peix" "peixos" M.Masc; fresh_A = mkA "fresc" "fresca" "frescos" "fresques" "frescament"; warm_A = mkA "calent" ; italian_A = mkA "italià" "italiana" "italians" "italianes" "italianament" ; expensive_A = mkA "car" ; delicious_A = mkA "deliciós" "deliciosa" "deliciosos" "delicioses" "deliciosament"; boring_A = mkA "aburrit" "aburrida" "aburrits" "aburrides" "aburridament" ; } ================================================ FILE: samples/Grammatical Framework/LexFoodsFin.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL instance LexFoodsFin of LexFoods = open SyntaxFin, ParadigmsFin in { flags coding=utf8; oper wine_N = mkN "viini" ; pizza_N = mkN "pizza" ; cheese_N = mkN "juusto" ; fish_N = mkN "kala" ; fresh_A = mkA "tuore" ; warm_A = mkA (mkN "lämmin" "lämpimän" "lämmintä" "lämpimänä" "lämpimään" "lämpiminä" "lämpimiä" "lämpimien" "lämpimissä" "lämpimiin" ) "lämpimämpi" "lämpimin" ; italian_A = mkA "italialainen" ; expensive_A = mkA "kallis" ; delicious_A = mkA "herkullinen" ; boring_A = mkA "tylsä" ; } ================================================ FILE: samples/Grammatical Framework/LexFoodsGer.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL instance LexFoodsGer of LexFoods = open SyntaxGer, ParadigmsGer in { flags coding=utf8; oper wine_N = mkN "Wein" ; pizza_N = mkN "Pizza" "Pizzen" feminine ; cheese_N = mkN "Käse" "Käse" masculine ; fish_N = mkN "Fisch" ; fresh_A = mkA "frisch" ; warm_A = mkA "warm" "wärmer" "wärmste" ; italian_A = mkA "italienisch" ; expensive_A = mkA "teuer" ; delicious_A = mkA "köstlich" ; boring_A = mkA "langweilig" ; } ================================================ FILE: samples/Grammatical Framework/LexFoodsIta.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL instance LexFoodsIta of LexFoods = open SyntaxIta, ParadigmsIta in { oper wine_N = mkN "vino" ; pizza_N = mkN "pizza" ; cheese_N = mkN "formaggio" ; fish_N = mkN "pesce" ; fresh_A = mkA "fresco" ; warm_A = mkA "caldo" ; italian_A = mkA "italiano" ; expensive_A = mkA "caro" ; delicious_A = mkA "delizioso" ; boring_A = mkA "noioso" ; } ================================================ FILE: samples/Grammatical Framework/LexFoodsSwe.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL instance LexFoodsSwe of LexFoods = open SyntaxSwe, ParadigmsSwe in { flags coding=utf8; oper wine_N = mkN "vin" "vinet" "viner" "vinerna" ; pizza_N = mkN "pizza" ; cheese_N = mkN "ost" ; fish_N = mkN "fisk" ; fresh_A = mkA "färsk" ; warm_A = mkA "varm" ; italian_A = mkA "italiensk" ; expensive_A = mkA "dyr" ; delicious_A = mkA "läcker" ; boring_A = mkA "tråkig" ; } ================================================ FILE: samples/Grammatical Framework/ResCze.gf ================================================ -- (c) 2011 Katerina Bohmova under LGPL resource ResCze = open Prelude in { flags coding = utf8 ; param Number = Sg | Pl ; Gender = Masc | Fem | Neutr; oper NounPhrase : Type = {s : Str ; g : Gender ; n : Number} ; Noun : Type = {s : Number => Str ; g : Gender} ; Adjective : Type = {s : Gender => Number => Str} ; det : Number -> Str -> Str -> Str -> Noun -> NounPhrase = \n,m,f,ne,cn -> { s = table {Masc => m ; Fem => f; Neutr => ne} ! cn.g ++ cn.s ! n ; g = cn.g ; n = n } ; noun : Str -> Str -> Gender -> Noun = \muz,muzi,g -> { s = table {Sg => muz ; Pl => muzi} ; g = g } ; adjective : (msg,fsg,nsg,mpl,fpl,npl : Str) -> Adjective = \msg,fsg,nsg,mpl,fpl,npl -> { s = table { Masc => table {Sg => msg ; Pl => mpl} ; Fem => table {Sg => fsg ; Pl => fpl} ; Neutr => table {Sg => nsg ; Pl => npl} } } ; regAdj : Str -> Adjective = \mlad -> adjective (mlad+"ý") (mlad+"á") (mlad+"é") (mlad+"é") (mlad+"é") (mlad+"á") ; regnfAdj : Str -> Adjective = \vynikajici -> adjective vynikajici vynikajici vynikajici vynikajici vynikajici vynikajici; copula : Number => Str = table {Sg => "je" ; Pl => "jsou"} ; } ================================================ FILE: samples/Grammatical Framework/transFoodsHin.gf ================================================ -- (c) 2009 Aarne Ranta under LGPL concrete FoodsHin of Foods = { flags coding=utf8 ; param Gender = Masc | Fem ; Number = Sg | Pl ; lincat Comment = {s : Str} ; Item = {s : Str ; g : Gender ; n : Number} ; Kind = {s : Number => Str ; g : Gender} ; Quality = {s : Gender => Number => Str} ; lin Pred item quality = { s = item.s ++ quality.s ! item.g ! item.n ++ copula item.n } ; This kind = {s = "yah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; That kind = {s = "vah" ++ kind.s ! Sg ; g = kind.g ; n = Sg} ; These kind = {s = "ye" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; Those kind = {s = "ve" ++ kind.s ! Pl ; g = kind.g ; n = Pl} ; Mod quality kind = { s = \\n => quality.s ! kind.g ! n ++ kind.s ! n ; g = kind.g } ; Wine = regN "madirA" ; Cheese = regN "panIr" ; Fish = regN "maClI" ; Pizza = regN "pijjA" ; Very quality = {s = \\g,n => "bahut" ++ quality.s ! g ! n} ; Fresh = regAdj "tAzA" ; Warm = regAdj "garam" ; Italian = regAdj "i-t.alI" ; Expensive = regAdj "mahaNgA" ; Delicious = regAdj "rucikar" ; Boring = regAdj "pEriyA" ; oper mkN : Str -> Str -> Gender -> {s : Number => Str ; g : Gender} = \s,p,g -> { s = table { Sg => s ; Pl => p } ; g = g } ; regN : Str -> {s : Number => Str ; g : Gender} = \s -> case s of { lark + "A" => mkN s (lark + "e") Masc ; lark + "I" => mkN s (lark + "iyaM") Fem ; _ => mkN s s Masc } ; mkAdj : Str -> Str -> Str -> {s : Gender => Number => Str} = \ms,mp,f -> { s = table { Masc => table { Sg => ms ; Pl => mp } ; Fem => \\_ => f } } ; regAdj : Str -> {s : Gender => Number => Str} = \a -> case a of { acch + "A" => mkAdj a (acch + "e") (acch + "I") ; _ => mkAdj a a a } ; copula : Number -> Str = \n -> case n of { Sg => "hE" ; Pl => "hEN" } ; } ================================================ FILE: samples/Graph Modeling Language/sample.gml ================================================ graph [ directed 0 node [ id 0 label "Node 1" value 100 ] node [ id 1 label "Node 2" value 200 ] edge [ source 1 target 0 ] ] ================================================ FILE: samples/Graph Modeling Language/sample2.gml ================================================ graph [ comment "Example graph with other formatting" directed 1 id 42 label "Graph label" node [ id 1 label "Node 1" extraAttribute 42 ] node [ id 2 label "node 2" extraAttribute 43 ] node [ id 3 label "node 3" extraAttribute 44 ] edge [ source 1 target 2 label "Edge from 1 to 2" ] edge [ source 2 target 3 label "Edge from 2 to 3" ] edge [ source 3 target 1 label "Edge from 3 to 1" ] ] ================================================ FILE: samples/Graph Modeling Language/sample3.gml ================================================ graph [ comment "Example graph with more newline formatting" directed 1 id 42 label "Graph label" node [ id 1 label "Node 1" extraAttribute 42 ] node [ id 2 label "node 2" extraAttribute 43 ] node [ id 3 label "node 3" extraAttribute 44 ] edge [ source 1 target 2 label "Edge from 1 to 2" ] edge [ source 2 target 3 label "Edge from 2 to 3" ] edge [ source 3 target 1 label "Edge from 3 to 1" ] ] ================================================ FILE: samples/GraphQL/kitchen-sink.graphql ================================================ # Copyright (c) 2015, Facebook, Inc. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. query queryName($foo: ComplexType, $site: Site = MOBILE) { whoever123is: node(id: [123, 456]) { id , ... on User @defer { field2 { id , alias: field1(first:10, after:$foo,) @include(if: $foo) { id, ...frag } } } ... @skip(unless: $foo) { id } ... { id } } } mutation likeStory { like(story: 123) @defer { story { id } } } subscription StoryLikeSubscription($input: StoryLikeSubscribeInput) { storyLikeSubscribe(input: $input) { story { likers { count } likeSentence { text } } } } fragment frag on Friend { foo(size: $size, bar: $b, obj: {key: "value"}) } { unnamed(truthy: true, falsey: false), query } ================================================ FILE: samples/GraphQL/schema-kitchen-sink.graphql ================================================ # Copyright (c) 2015, Facebook, Inc. # All rights reserved. # # This source code is licensed under the BSD-style license found in the # LICENSE file in the root directory of this source tree. An additional grant # of patent rights can be found in the PATENTS file in the same directory. schema { query: QueryType mutation: MutationType } type Foo implements Bar { one: Type two(argument: InputType!): Type three(argument: InputType, other: String): Int four(argument: String = "string"): String five(argument: [String] = ["string", "string"]): String six(argument: InputType = {key: "value"}): Type } interface Bar { one: Type four(argument: String = "string"): String } union Feed = Story | Article | Advert scalar CustomScalar enum Site { DESKTOP MOBILE } input InputType { key: String! answer: Int = 42 } extend type Foo { seven(argument: [String]): Type } directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT ================================================ FILE: samples/GraphQL/schema-kitchen-sink.graphqls ================================================ schema { query: QueryType mutation: MutationType } """ This is a description of the `Foo` type. """ type Foo implements Bar & Baz { one: Type two(argument: InputType!): Type three(argument: InputType, other: String): Int four(argument: String = "string"): String five(argument: [String] = ["string", "string"]): String six(argument: InputType = {key: "value"}): Type seven(argument: Int = null): Type } type AnnotatedObject @onObject(arg: "value") { annotatedField(arg: Type = "default" @onArg): Type @onField } type UndefinedType extend type Foo { seven(argument: [String]): Type } extend type Foo @onType interface Bar { one: Type four(argument: String = "string"): String } interface AnnotatedInterface @onInterface { annotatedField(arg: Type @onArg): Type @onField } interface UndefinedInterface extend interface Bar { two(argument: InputType!): Type } extend interface Bar @onInterface union Feed = Story | Article | Advert union AnnotatedUnion @onUnion = A | B union AnnotatedUnionTwo @onUnion = | A | B union UndefinedUnion extend union Feed = Photo | Video extend union Feed @onUnion scalar CustomScalar scalar AnnotatedScalar @onScalar extend scalar CustomScalar @onScalar enum Site { DESKTOP MOBILE } enum AnnotatedEnum @onEnum { ANNOTATED_VALUE @onEnumValue OTHER_VALUE } enum UndefinedEnum extend enum Site { VR } extend enum Site @onEnum input InputType { key: String! answer: Int = 42 } input AnnotatedInput @onInputObject { annotatedField: Type @onField } input UndefinedInput extend input InputType { other: Float = 1.23e4 } extend input InputType @onInputObject directive @skip(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT directive @include(if: Boolean!) on FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT directive @include2(if: Boolean!) on | FIELD | FRAGMENT_SPREAD | INLINE_FRAGMENT ================================================ FILE: samples/GraphQL/schema.graphqls ================================================ # Copyright © Magento, Inc. All rights reserved. # See COPYING.txt for license details. type Query { products ( search: String @doc(description: "Performs a full-text search using the specified key words."), filter: ProductFilterInput @doc(description: "Identifies which product attributes to search for and return."), pageSize: Int = 20 @doc(description: "Specifies the maximum number of results to return at once. This attribute is optional."), currentPage: Int = 1 @doc(description: "Specifies which page of results to return. The default value is 1."), sort: ProductSortInput @doc(description: "Specifies which attribute to sort on, and whether to return the results in ascending or descending order.") ): Products @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Products") @doc(description: "The products query searches for products that match the criteria specified in the search and filter attributes") @cache(cacheTag: "cat_p", cacheIdentity: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Identity") category ( id: Int @doc(description: "Id of the category") ): CategoryTree @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\CategoryTree") @doc(description: "The category query searches for categories that match the criteria specified in the search and filter attributes") @cache(cacheTag: "cat_c", cacheIdentity: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\CategoryTreeIdentity") } type Price @doc(description: "The Price object defines the price of a product as well as any tax-related adjustments.") { amount: Money @doc(description: "The price of a product plus a three-letter currency code") adjustments: [PriceAdjustment] @doc(description: "An array that provides information about tax, weee, or weee_tax adjustments") } type PriceAdjustment @doc(description: "The PricedAdjustment object defines the amount of money to apply as an adjustment, the type of adjustment to apply, and whether the item is included or excluded from the adjustment.") { amount: Money @doc(description: "The amount of the price adjustment and its currency code") code: PriceAdjustmentCodesEnum @doc(description: "Indicates whether the adjustment involves tax, weee, or weee_tax") description: PriceAdjustmentDescriptionEnum @doc(description: "Indicates whether the entity described by the code attribute is included or excluded from the adjustment") } enum PriceAdjustmentCodesEnum @doc(description: "Note: This enumeration contains values defined in modules other than the Catalog module.") { } enum PriceAdjustmentDescriptionEnum @doc(description: "This enumeration states whether a price adjustment is included or excluded.") { INCLUDED EXCLUDED } enum PriceTypeEnum @doc(description: "This enumeration the price type.") { FIXED PERCENT DYNAMIC } type ProductPrices @doc(description: "The ProductPrices object contains the regular price of an item, as well as its minimum and maximum prices. Only composite products, which include bundle, configurable, and grouped products, can contain a minimum and maximum price.") { minimalPrice: Price @doc(description: "The lowest possible final price for all the options defined within a composite product. If you are specifying a price range, this would be the from value.") maximalPrice: Price @doc(description: "The highest possible final price for all the options defined within a composite product. If you are specifying a price range, this would be the to value.") regularPrice: Price @doc(description: "The base price of a product.") } type ProductLinks implements ProductLinksInterface @doc(description: "ProductLinks is an implementation of ProductLinksInterface.") { } interface ProductLinksInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\ProductLinkTypeResolverComposite") @doc(description:"ProductLinks contains information about linked products, including the link type and product type of each item.") { sku: String @doc(description: "The identifier of the linked product") link_type: String @doc(description: "One of related, associated, upsell, or crosssell") linked_product_sku: String @doc(description: "The SKU of the linked product") linked_product_type: String @doc(description: "The type of linked product (simple, virtual, bundle, downloadable, grouped, configurable)") position: Int @doc(description: "The position within the list of product links") } type ProductTierPrices @doc(description: "The ProductTierPrices object defines a tier price, which is a quantity discount offered to a specific customer group.") { customer_group_id: String @doc(description: "The ID of the customer group") qty: Float @doc(description: "The number of items that must be purchased to qualify for tier pricing") value: Float @doc(description: "The price of the fixed price item") percentage_value: Float @doc(description: "The percentage discount of the item") website_id: Float @doc(description: "The ID assigned to the website") } interface ProductInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\ProductInterfaceTypeResolverComposite") @doc(description: "The ProductInterface contains attributes that are common to all types of products. Note that descriptions may not be available for custom and EAV attributes.") { id: Int @doc(description: "The ID number assigned to the product") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\EntityIdToId") name: String @doc(description: "The product name. Customers use this name to identify the product.") sku: String @doc(description: "A number or code assigned to a product to identify the product, options, price, and manufacturer") description: ComplexTextValue @doc(description: "Detailed information about the product. The value can include simple HTML tags.") @resolver(class: "\\Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductComplexTextAttribute") short_description: ComplexTextValue @doc(description: "A short description of the product. Its use depends on the theme.") @resolver(class: "\\Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductComplexTextAttribute") special_price: Float @doc(description: "The discounted price of the product") special_from_date: String @doc(description: "The beginning date that a product has a special price") special_to_date: String @doc(description: "The end date that a product has a special price") attribute_set_id: Int @doc(description: "The attribute set assigned to the product") meta_title: String @doc(description: "A string that is displayed in the title bar and tab of the browser and in search results lists") meta_keyword: String @doc(description: "A comma-separated list of keywords that are visible only to search engines") meta_description: String @doc(description: "A brief overview of the product for search results listings, maximum 255 characters") image: ProductImage @doc(description: "The relative path to the main image on the product page") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductImage") small_image: ProductImage @doc(description: "The relative path to the small image, which is used on catalog pages") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductImage") thumbnail: ProductImage @doc(description: "The relative path to the product's thumbnail image") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductImage") new_from_date: String @doc(description: "The beginning date for new product listings, and determines if the product is featured as a new product") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\NewFromTo") new_to_date: String @doc(description: "The end date for new product listings") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\NewFromTo") tier_price: Float @doc(description: "The price when tier pricing is in effect and the items purchased threshold has been reached") options_container: String @doc(description: "If the product has multiple options, determines where they appear on the product page") created_at: String @doc(description: "Timestamp indicating when the product was created") updated_at: String @doc(description: "Timestamp indicating when the product was updated") country_of_manufacture: String @doc(description: "The product's country of origin") type_id: String @doc(description: "One of simple, virtual, bundle, downloadable, grouped, or configurable") websites: [Website] @doc(description: "An array of websites in which the product is available") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Websites") product_links: [ProductLinksInterface] @doc(description: "An array of ProductLinks objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductLinks") media_gallery_entries: [MediaGalleryEntry] @doc(description: "An array of MediaGalleryEntry objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\MediaGalleryEntries") tier_prices: [ProductTierPrices] @doc(description: "An array of ProductTierPrices objects") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\TierPrices") price: ProductPrices @doc(description: "A ProductPrices object, indicating the price of an item") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Price") gift_message_available: String @doc(description: "Indicates whether a gift message is available") manufacturer: Int @doc(description: "A number representing the product's manufacturer") categories: [CategoryInterface] @doc(description: "The categories assigned to a product") @cache(cacheTag: "cat_c", cacheIdentity: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\CategoriesIdentity") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Categories") canonical_url: String @doc(description: "Canonical URL") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\CanonicalUrl") } interface PhysicalProductInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\ProductInterfaceTypeResolverComposite") @doc(description: "PhysicalProductInterface contains attributes specific to tangible products") { weight: Float @doc(description: "The weight of the item, in units defined by the store") } type CustomizableAreaOption implements CustomizableOptionInterface @doc(description: "CustomizableAreaOption contains information about a text area that is defined as part of a customizable option") { value: CustomizableAreaValue @doc(description: "An object that defines a text area") product_sku: String @doc(description: "The Stock Keeping Unit of the base product") } type CustomizableAreaValue @doc(description: "CustomizableAreaValue defines the price and sku of a product whose page contains a customized text area") { price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") max_characters: Int @doc(description: "The maximum number of characters that can be entered for this customizable option") } type CategoryTree implements CategoryInterface @doc(description: "Category Tree implementation") { children: [CategoryTree] @doc(description: "Child categories tree") @resolve(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\CategoryTree") } type CustomizableDateOption implements CustomizableOptionInterface @doc(description: "CustomizableDateOption contains information about a date picker that is defined as part of a customizable option") { value: CustomizableDateValue @doc(description: "An object that defines a date field in a customizable option.") product_sku: String @doc(description: "The Stock Keeping Unit of the base product") } type CustomizableDateValue @doc(description: "CustomizableDateValue defines the price and sku of a product whose page contains a customized date picker") { price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") } type CustomizableDropDownOption implements CustomizableOptionInterface @doc(description: "CustomizableDropDownOption contains information about a drop down menu that is defined as part of a customizable option") { value: [CustomizableDropDownValue] @doc(description: "An array that defines the set of options for a drop down menu") } type CustomizableDropDownValue @doc(description: "CustomizableDropDownValue defines the price and sku of a product whose page contains a customized drop down menu") { option_type_id: Int @doc(description: "The ID assigned to the value") price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") title: String @doc(description: "The display name for this option") sort_order: Int @doc(description: "The order in which the option is displayed") } type CustomizableMultipleOption implements CustomizableOptionInterface @doc(description: "CustomizableMultipleOption contains information about a multiselect that is defined as part of a customizable option") { value: [CustomizableMultipleValue] @doc(description: "An array that defines the set of options for a multiselect") } type CustomizableMultipleValue @doc(description: "CustomizableMultipleValue defines the price and sku of a product whose page contains a customized multiselect") { option_type_id: Int @doc(description: "The ID assigned to the value") price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") title: String @doc(description: "The display name for this option") sort_order: Int @doc(description: "The order in which the option is displayed") } type CustomizableFieldOption implements CustomizableOptionInterface @doc(description: "CustomizableFieldOption contains information about a text field that is defined as part of a customizable option") { value: CustomizableFieldValue @doc(description: "An object that defines a text field") product_sku: String @doc(description: "The Stock Keeping Unit of the base product") } type CustomizableFieldValue @doc(description: "CustomizableFieldValue defines the price and sku of a product whose page contains a customized text field") { price: Float @doc(description: "The price of the custom value") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") max_characters: Int @doc(description: "The maximum number of characters that can be entered for this customizable option") } type CustomizableFileOption implements CustomizableOptionInterface @doc(description: "CustomizableFileOption contains information about a file picker that is defined as part of a customizable option") { value: CustomizableFileValue @doc(description: "An object that defines a file value") product_sku: String @doc(description: "The Stock Keeping Unit of the base product") } type CustomizableFileValue @doc(description: "CustomizableFileValue defines the price and sku of a product whose page contains a customized file picker") { price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") file_extension: String @doc(description: "The file extension to accept") image_size_x: Int @doc(description: "The maximum width of an image") image_size_y: Int @doc(description: "The maximum height of an image") } type ProductImage @doc(description: "Product image information. Contains image relative path, URL and label") { url: String @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductImage\\Url") label: String @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\ProductImage\\Label") } interface CustomizableOptionInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\CustomizableOptionTypeResolver") @doc(description: "The CustomizableOptionInterface contains basic information about a customizable option. It can be implemented by several types of configurable options.") { title: String @doc(description: "The display name for this option") required: Boolean @doc(description: "Indicates whether the option is required") sort_order: Int @doc(description: "The order in which the option is displayed") option_id: Int @doc(description: "Option ID") } interface CustomizableProductInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\ProductInterfaceTypeResolverComposite") @doc(description: "CustomizableProductInterface contains information about customizable product options.") { options: [CustomizableOptionInterface] @doc(description: "An array of options for a customizable product") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Options") } interface CategoryInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\CategoryInterfaceTypeResolver") @doc(description: "CategoryInterface contains the full set of attributes that can be returned in a category search") { id: Int @doc(description: "An ID that uniquely identifies the category") description: String @doc(description: "An optional description of the category") @resolver(class: "\\Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\CategoryHtmlAttribute") name: String @doc(description: "The display name of the category") path: String @doc(description: "Category Path") path_in_store: String @doc(description: "Category path in store") url_key: String @doc(description: "The url key assigned to the category") url_path: String @doc(description: "The url path assigned to the category") position: Int @doc(description: "The position of the category relative to other categories at the same level in tree") level: Int @doc(description: "Indicates the depth of the category within the tree") created_at: String @doc(description: "Timestamp indicating when the category was created") updated_at: String @doc(description: "Timestamp indicating when the category was updated") product_count: Int @doc(description: "The number of products in the category") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\ProductsCount") default_sort_by: String @doc(description: "The attribute to use for sorting") products( pageSize: Int = 20 @doc(description: "Specifies the maximum number of results to return at once. This attribute is optional."), currentPage: Int = 1 @doc(description: "Specifies which page of results to return. The default value is 1."), sort: ProductSortInput @doc(description: "Specifies which attribute to sort on, and whether to return the results in ascending or descending order.") ): CategoryProducts @doc(description: "The list of products assigned to the category") @cache(cacheTag: "cat_p", cacheIdentity: "Magento\\CatalogGraphQl\\Model\\Resolver\\Product\\Identity") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\Products") breadcrumbs: [Breadcrumb] @doc(description: "Breadcrumbs, parent categories info") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\Breadcrumbs") } type Breadcrumb @doc(description: "Breadcrumb item"){ category_id: Int @doc(description: "Category ID") category_name: String @doc(description: "Category name") category_level: Int @doc(description: "Category level") category_url_key: String @doc(description: "Category URL key") } type CustomizableRadioOption implements CustomizableOptionInterface @doc(description: "CustomizableRadioOption contains information about a set of radio buttons that are defined as part of a customizable option") { value: [CustomizableRadioValue] @doc(description: "An array that defines a set of radio buttons") } type CustomizableRadioValue @doc(description: "CustomizableRadioValue defines the price and sku of a product whose page contains a customized set of radio buttons") { option_type_id: Int @doc(description: "The ID assigned to the value") price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") title: String @doc(description: "The display name for this option") sort_order: Int @doc(description: "The order in which the radio button is displayed") } type CustomizableCheckboxOption implements CustomizableOptionInterface @doc(description: "CustomizableCheckbbixOption contains information about a set of checkbox values that are defined as part of a customizable option") { value: [CustomizableCheckboxValue] @doc(description: "An array that defines a set of checkbox values") } type CustomizableCheckboxValue @doc(description: "CustomizableCheckboxValue defines the price and sku of a product whose page contains a customized set of checkbox values") { option_type_id: Int @doc(description: "The ID assigned to the value") price: Float @doc(description: "The price assigned to this option") price_type: PriceTypeEnum @doc(description: "FIXED, PERCENT, or DYNAMIC") sku: String @doc(description: "The Stock Keeping Unit for this option") title: String @doc(description: "The display name for this option") sort_order: Int @doc(description: "The order in which the checkbox value is displayed") } type VirtualProduct implements ProductInterface, CustomizableProductInterface @doc(description: "A virtual product is non-tangible product that does not require shipping and is not kept in inventory") { } type SimpleProduct implements ProductInterface, PhysicalProductInterface, CustomizableProductInterface @doc(description: "A simple product is tangible and are usually sold as single units or in fixed quantities") { } type Products @doc(description: "The Products object is the top-level object returned in a product search") { items: [ProductInterface] @doc(description: "An array of products that match the specified search criteria") page_info: SearchResultPageInfo @doc(description: "An object that includes the page_info and currentPage values specified in the query") total_count: Int @doc(description: "The number of products returned") filters: [LayerFilter] @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\LayerFilters") @doc(description: "Layered navigation filters array") sort_fields: SortFields @doc(description: "An object that includes the default sort field and all available sort fields") @resolver(class: "Magento\\CatalogGraphQl\\Model\\Resolver\\Category\\SortFields") } type CategoryProducts @doc(description: "The category products object returned in the Category query") { items: [ProductInterface] @doc(description: "An array of products that are assigned to the category") page_info: SearchResultPageInfo @doc(description: "An object that includes the page_info and currentPage values specified in the query") total_count: Int @doc(description: "The number of products returned") } input ProductFilterInput @doc(description: "ProductFilterInput defines the filters to be used in the search. A filter contains at least one attribute, a comparison operator, and the value that is being searched for.") { name: FilterTypeInput @doc(description: "The product name. Customers use this name to identify the product.") sku: FilterTypeInput @doc(description: "A number or code assigned to a product to identify the product, options, price, and manufacturer") description: FilterTypeInput @doc(description: "Detailed information about the product. The value can include simple HTML tags.") short_description: FilterTypeInput @doc(description: "A short description of the product. Its use depends on the theme.") price: FilterTypeInput @doc(description: "The price of an item") special_price: FilterTypeInput @doc(description: "The discounted price of the product. Do not include the currency code.") special_from_date: FilterTypeInput @doc(description: "The beginning date that a product has a special price") special_to_date: FilterTypeInput @doc(description: "The end date that a product has a special price") weight: FilterTypeInput @doc(description: "The weight of the item, in units defined by the store") manufacturer: FilterTypeInput @doc(description: "A number representing the product's manufacturer") meta_title: FilterTypeInput @doc(description: "A string that is displayed in the title bar and tab of the browser and in search results lists") meta_keyword: FilterTypeInput @doc(description: "A comma-separated list of keywords that are visible only to search engines") meta_description: FilterTypeInput @doc(description: "A brief overview of the product for search results listings, maximum 255 characters") image: FilterTypeInput @doc(description: "The relative path to the main image on the product page") small_image: FilterTypeInput @doc(description: "The relative path to the small image, which is used on catalog pages") thumbnail: FilterTypeInput @doc(description: "The relative path to the product's thumbnail image") tier_price: FilterTypeInput @doc(description: "The price when tier pricing is in effect and the items purchased threshold has been reached") news_from_date: FilterTypeInput @doc(description: "The beginning date for new product listings, and determines if the product is featured as a new product") news_to_date: FilterTypeInput @doc(description: "The end date for new product listings") custom_layout_update: FilterTypeInput @doc(description: "XML code that is applied as a layout update to the product page") min_price: FilterTypeInput @doc(description:"The numeric minimal price of the product. Do not include the currency code.") max_price: FilterTypeInput @doc(description:"The numeric maximal price of the product. Do not include the currency code.") category_id: FilterTypeInput @doc(description: "Category ID the product belongs to") options_container: FilterTypeInput @doc(description: "If the product has multiple options, determines where they appear on the product page") required_options: FilterTypeInput @doc(description: "Indicates whether the product has required options") has_options: FilterTypeInput @doc(description: "Indicates whether additional attributes have been created for the product") image_label: FilterTypeInput @doc(description: "The label assigned to a product image") small_image_label: FilterTypeInput @doc(description: "The label assigned to a product's small image") thumbnail_label: FilterTypeInput @doc(description: "The label assigned to a product's thumbnail image") created_at: FilterTypeInput @doc(description: "Timestamp indicating when the product was created") updated_at: FilterTypeInput @doc(description: "Timestamp indicating when the product was updated") country_of_manufacture: FilterTypeInput @doc(description: "The product's country of origin") custom_layout: FilterTypeInput @doc(description: "The name of a custom layout") gift_message_available: FilterTypeInput @doc(description: "Indicates whether a gift message is available") or: ProductFilterInput @doc(description: "The keyword required to perform a logical OR comparison") } type ProductMediaGalleryEntriesContent @doc(description: "ProductMediaGalleryEntriesContent contains an image in base64 format and basic information about the image") { base64_encoded_data: String @doc(description: "The image in base64 format") type: String @doc(description: "The MIME type of the file, such as image/png") name: String @doc(description: "The file name of the image") } type ProductMediaGalleryEntriesVideoContent @doc(description: "ProductMediaGalleryEntriesVideoContent contains a link to a video file and basic information about the video") { media_type: String @doc(description: "Must be external-video") video_provider: String @doc(description: "Describes the video source") video_url: String @doc(description: "The URL to the video") video_title: String @doc(description: "The title of the video") video_description: String @doc(description: "A description of the video") video_metadata: String @doc(description: "Optional data about the video") } input ProductSortInput @doc(description: "ProductSortInput specifies the attribute to use for sorting search results and indicates whether the results are sorted in ascending or descending order") { name: SortEnum @doc(description: "The product name. Customers use this name to identify the product.") sku: SortEnum @doc(description: "A number or code assigned to a product to identify the product, options, price, and manufacturer") description: SortEnum @doc(description: "Detailed information about the product. The value can include simple HTML tags.") short_description: SortEnum @doc(description: "A short description of the product. Its use depends on the theme.") price: SortEnum @doc(description: "The price of the item") special_price: SortEnum @doc(description: "The discounted price of the product") special_from_date: SortEnum @doc(description: "The beginning date that a product has a special price") special_to_date: SortEnum @doc(description: "The end date that a product has a special price") weight: SortEnum @doc(description: "The weight of the item, in units defined by the store") manufacturer: SortEnum @doc(description: "A number representing the product's manufacturer") meta_title: SortEnum @doc(description: "A string that is displayed in the title bar and tab of the browser and in search results lists") meta_keyword: SortEnum @doc(description: "A comma-separated list of keywords that are visible only to search engines") meta_description: SortEnum @doc(description: "A brief overview of the product for search results listings, maximum 255 characters") image: SortEnum @doc(description: "The relative path to the main image on the product page") small_image: SortEnum @doc(description: "The relative path to the small image, which is used on catalog pages") thumbnail: SortEnum @doc(description: "The relative path to the product's thumbnail image") tier_price: SortEnum @doc(description: "The price when tier pricing is in effect and the items purchased threshold has been reached") news_from_date: SortEnum @doc(description: "The beginning date for new product listings, and determines if the product is featured as a new product") news_to_date: SortEnum @doc(description: "The end date for new product listings") custom_layout_update: SortEnum @doc(description: "XML code that is applied as a layout update to the product page") options_container: SortEnum @doc(description: "If the product has multiple options, determines where they appear on the product page") required_options: SortEnum @doc(description: "Indicates whether the product has required options") has_options: SortEnum @doc(description: "Indicates whether additional attributes have been created for the product") image_label: SortEnum @doc(description: "The label assigned to a product image") small_image_label: SortEnum @doc(description: "The label assigned to a product's small image") thumbnail_label: SortEnum @doc(description: "The label assigned to a product's thumbnail image") created_at: SortEnum @doc(description: "Timestamp indicating when the product was created") updated_at: SortEnum @doc(description: "Timestamp indicating when the product was updated") country_of_manufacture: SortEnum @doc(description: "The product's country of origin") custom_layout: SortEnum @doc(description: "The name of a custom layout") gift_message_available: SortEnum @doc(description: "Indicates whether a gift message is available") } type MediaGalleryEntry @doc(description: "MediaGalleryEntry defines characteristics about images and videos associated with a specific product") { id: Int @doc(description: "The identifier assigned to the object") media_type: String @doc(description: "image or video") label: String @doc(description: "The alt text displayed on the UI when the user points to the image") position: Int @doc(description: "The media item's position after it has been sorted") disabled: Boolean @doc(description: "Whether the image is hidden from vie") types: [String] @doc(description: "Array of image types. It can have the following values: image, small_image, thumbnail") file: String @doc(description: "The path of the image on the server") content: ProductMediaGalleryEntriesContent @doc(description: "Contains a ProductMediaGalleryEntriesContent object") video_content: ProductMediaGalleryEntriesVideoContent @doc(description: "Contains a ProductMediaGalleryEntriesVideoContent object") } type LayerFilter { name: String @doc(description: "Layered navigation filter name") request_var: String @doc(description: "Request variable name for filter query") filter_items_count: Int @doc(description: "Count of filter items in filter group") filter_items: [LayerFilterItemInterface] @doc(description: "Array of filter items") } interface LayerFilterItemInterface @typeResolver(class: "Magento\\CatalogGraphQl\\Model\\LayerFilterItemTypeResolverComposite") { label: String @doc(description: "Filter label") value_string: String @doc(description: "Value for filter request variable to be used in query") items_count: Int @doc(description: "Count of items by filter") } type LayerFilterItem implements LayerFilterItemInterface { } type SortField { value: String @doc(description: "Attribute code of sort field") label: String @doc(description: "Label of sort field") } type SortFields @doc(description: "SortFields contains a default value for sort fields and all available sort fields") { default: String @doc(description: "Default value of sort fields") options: [SortField] @doc(description: "Available sort fields") } ================================================ FILE: samples/Graphviz (DOT)/annoying.DOT ================================================ /* Huffman Tree DOT graph. DOT Reference : http://www.graphviz.org/doc/info/lang.html http://en.wikipedia.org/wiki/DOT_language Timestamp : 1415989074 Phrase : 'OH GOD WHY IS LINGUIST SO ANAL ABOUT THIS STUFF' Generated on http://huffman.ooz.ie/ */ digraph G { edge [label=0]; graph [ranksep=0]; T [shape=record, label="{{T|4}|000}"]; S [shape=record, label="{{S|5}|001}"]; SPACE [shape=record, label="{{SPACE|9}|01}"]; A [shape=record, label="{{A|3}|1000}"]; H [shape=record, label="{{H|3}|1001}"]; U [shape=record, label="{{U|3}|1010}"]; L [shape=record, label="{{L|2}|10110}"]; N [shape=record, label="{{N|2}|10111}"]; I [shape=record, label="{{I|4}|1100}"]; O [shape=record, label="{{O|4}|1101}"]; G [shape=record, label="{{G|2}|11100}"]; F [shape=record, label="{{F|2}|11101}"]; GF [label=4]; W [shape=record, label="{{W|1}|111100}"]; Y [shape=record, label="{{Y|1}|111101}"]; B [shape=record, label="{{B|1}|111110}"]; D [shape=record, label="{{D|1}|111111}"]; BD [label=2]; WYBD [label=4]; GFWYBD [label=8]; 47 -> 18 -> 9 -> T; 29 -> 13 -> 6 -> A; 7 -> U; 4 -> L; 16 -> 8 -> I; GFWYBD -> GF -> G; WYBD -> 2 -> W; BD -> B;9 -> S [label=1]; 18 -> SPACE [label=1]; 6 -> H [label=1]; 13 -> 7 -> 4 -> N [label=1]; 8 -> O [label=1]; GF -> F [label=1]; 2 -> Y [label=1]; 47 -> 29 -> 16 -> GFWYBD -> WYBD -> BD -> D [label=1]; } ================================================ FILE: samples/Graphviz (DOT)/sample.dot ================================================ /* Huffman Tree DOT graph. DOT Reference : http://www.graphviz.org/doc/info/lang.html http://en.wikipedia.org/wiki/DOT_language Timestamp : 1415988139 Phrase : 'SERIAL KILLER AND SEX OFFENDER ANGUS SINCLAIR IS JAILED FOR A MINIMUM OF 37 YEARS FOR THE 1977 WORLDS END MURDERS OF HELEN SCOTT AND CHRISTINE EADIE.' Generated on http://huffman.ooz.ie/ */ digraph G { edge [label=0]; graph [ranksep=0]; node [shape=record]; U [label="{{U|3}|00000}"]; G [label="{{G|1}|0000100}"]; K [label="{{K|1}|0000101}"]; _3 [label="{{3|1}|0000110}"]; _9 [label="{{9|1}|0000111}"]; _39 [label=2]; L [label="{{L|7}|0001}"]; O [label="{{O|7}|0010}"]; Y [label="{{Y|1}|0011000}"]; X [label="{{X|1}|0011001}"]; YX [label=2]; J [label="{{J|1}|0011010}"]; W [label="{{W|1}|0011011}"]; JW [label=2]; YXJW [label=4]; M [label="{{M|4}|00111}"]; E [label="{{E|15}|010}"]; D [label="{{D|8}|0110}"]; T [label="{{T|4}|01110}"]; DOT [label="{{DOT|1}|0111100}"]; _1 [label="{{1|1}|0111101}"]; DOT1 [label=2]; _7 [label="{{7|3}|011111}"]; A [label="{{A|9}|1000}"]; N [label="{{N|9}|1001}"]; S [label="{{S|10}|1010}"]; I [label="{{I|11}|1011}"]; R [label="{{R|11}|1100}"]; C [label="{{C|3}|110100}"]; H [label="{{H|3}|110101}"]; F [label="{{F|6}|11011}"]; SPACE [label="{{SPACE|26}|111}"]; 149 -> 61 -> 29 -> 14 -> 7 -> U; 4 -> 2 -> G; _39 -> _3; 15 -> O; 8 -> YXJW -> YX -> Y; JW -> J; 32 -> E; 17 -> D; 9 -> T; 5 -> DOT1 -> DOT; 88 -> 39 -> 18 -> A; 21 -> S; 49 -> 23 -> R; 12 -> 6 -> C;2 -> K [label=1]; 7 -> 4 -> _39 -> _9 [label=1]; 14 -> L [label=1]; YX -> X [label=1]; YXJW -> JW -> W [label=1]; 29 -> 15 -> 8 -> M [label=1]; DOT1 -> _1 [label=1]; 61 -> 32 -> 17 -> 9 -> 5 -> _7 [label=1]; 18 -> N [label=1]; 39 -> 21 -> I [label=1]; 6 -> H [label=1]; 23 -> 12 -> F [label=1]; 149 -> 88 -> 49 -> SPACE [label=1]; } ================================================ FILE: samples/Groovy/build.gvy ================================================ task echoDirListViaAntBuilder() { description = 'Uses the built-in AntBuilder instance to echo and list files' //Docs: http://ant.apache.org/manual/Types/fileset.html //Echo the Gradle project name via the ant echo plugin ant.echo(message: project.name) ant.echo(path) ant.echo("${projectDir}/samples") //Gather list of files in a subdirectory ant.fileScanner{ fileset(dir:"samples") }.each{ //Print each file to screen with the CWD (projectDir) path removed. println it.toString() - "${projectDir}" } } ================================================ FILE: samples/Groovy/filenames/Jenkinsfile ================================================ jettyUrl = 'http://localhost:8081/' def servers stage 'Dev' node { checkout scm servers = load 'servers.groovy' mvn '-o clean package' dir('target') {stash name: 'war', includes: 'x.war'} } stage 'QA' parallel(longerTests: { runTests(servers, 30) }, quickerTests: { runTests(servers, 20) }) stage name: 'Staging', concurrency: 1 node { servers.deploy 'staging' } input message: "Does ${jettyUrl}staging/ look good?" stage name: 'Production', concurrency: 1 node { sh "wget -O - -S ${jettyUrl}staging/" echo 'Production server looks to be alive' servers.deploy 'production' echo "Deployed to ${jettyUrl}production/" } def mvn(args) { sh "${tool 'Maven 3.x'}/bin/mvn ${args}" } def runTests(servers, duration) { node { checkout scm servers.runWithServer {id -> mvn "-o -f sometests test -Durl=${jettyUrl}${id}/ -Dduration=${duration}" } } } ================================================ FILE: samples/Groovy/groovy ================================================ #!/usr/bin/env groovy println "Groovy!" ================================================ FILE: samples/Groovy/script.gvy ================================================ #!/usr/bin/env groovy println "Hello World" ================================================ FILE: samples/Groovy/template.grt ================================================ html { head { component "bootstrap" title "Bootstrap Template" } html { } } ================================================ FILE: samples/Groovy/template.gtpl ================================================ html { head { title "Example Template" } body { p "This is a quick template example" } } ================================================ FILE: samples/Groovy Server Pages/bar.gsp ================================================ Testing with SiteMesh and Resources ================================================ FILE: samples/Groovy Server Pages/hello-pagedirective.gsp ================================================ <%@ page contentType="text/html;charset=UTF-8" %> Using page directive tag ================================================ FILE: samples/Groovy Server Pages/hello-resources.gsp ================================================ Testing with Resources ================================================ FILE: samples/Groovy Server Pages/hello-var.gsp ================================================ Testing with SiteMesh and ${example} ================================================ FILE: samples/HAProxy/haproxy.cfg ================================================ # HAProxy configuration showing choosing a different backend for static files global maxconn 50000 log /dev/log local0 log /dev/log local1 notice user haproxy group haproxy stats socket /run/haproxy/admin.sock user haproxy group haproxy mode 660 level admin nbproc 1 nbthread 4 cpu-map auto:1/1-4 0-3 ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults timeout connect 5s timeout client 5s timeout server 5s log global mode http option httplog option dontlognull errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend public bind 10.0.0.3:80 bind 10.0.0.3:443 ssl crt /etc/ssl/certs/mysite.pem redirect scheme https if !{ ssl_fc } acl static_files path_end .gif .png .jpg .css .js .svg .ttf .woff .woff2 use_backend nginx if static_files default_backend nodejs backend nodejs balance roundrobin cookie PHPSESSID prefix nocache option httpchk HEAD / default-server check maxconn 20 server server1 10.0.1.3:80 cookie server1 server server2 10.0.1.4:80 cookie server2 backend nginx balance roundrobin option httpchk HEAD / server server1 10.0.1.5:80 check server server2 10.0.1.6:80 check listen admin bind 0.0.0.0:8404 stats enable stats uri /monitor stats refresh 5 ================================================ FILE: samples/HAProxy/haproxy2.cfg ================================================ # HAProxy configuration showing using Basic Auth on Stats page global log /dev/log local0 log /dev/log local1 notice chroot /var/lib/haproxy stats socket /run/haproxy/admin.sock mode 660 level admin stats timeout 30s user haproxy group haproxy ca-base /etc/ssl/certs crt-base /etc/ssl/private ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 ssl-default-bind-options no-sslv3 description HAProxy Statistics Page defaults log global timeout connect 5000 timeout client 50000 timeout server 50000 mode http option httplog option dontlognull balance roundrobin errorfile 400 /etc/haproxy/errors/400.http errorfile 403 /etc/haproxy/errors/403.http errorfile 408 /etc/haproxy/errors/408.http errorfile 500 /etc/haproxy/errors/500.http errorfile 502 /etc/haproxy/errors/502.http errorfile 503 /etc/haproxy/errors/503.http errorfile 504 /etc/haproxy/errors/504.http frontend fe_main bind :80 bind :443 ssl crt mysite.pem http-request redirect scheme https unless ssl_fc default_backend webservers backend webservers server web1 192.168.0.3:80 check maxconn 20 server web2 192.168.0.4:80 check maxconn 20 server web3 192.168.0.5:80 check maxconn 20 server web4 192.168.0.6:80 check maxconn 20 listen stats bind :9999 ssl crt mycert.pem stats enable stats uri /report stats refresh 30s stats auth admin:password stats show-desc http-request deny unless { src 192.168.50.0/24 } ================================================ FILE: samples/HAProxy/haproxy3.cfg ================================================ # HAProxy configuration showing load balancing TCP global log 192.168.50.2:514 local0 info chroot /var/lib/haproxy user haproxy group haproxy defaults log global mode tcp balance leastconn option tcplog timeout connect 5s timeout client 5m timeout server 5m frontend fe_mysql bind *:3306 default_backend be_mysql backend be_mysql stick-table type ip size 1m expire 1h stick match src stick store-request src log-tag mysql server db1 192.168.50.10:3306 check slowstart 60s weight 1 server db2 192.168.50.11:3306 check slowstart 60s weight 3 server db3 192.168.50.12:3306 check slowstart 60s backup server db4 192.168.50.13:3306 check slowstart 60s backup listen stats bind :9999 ssl crt /etc/ssl/certs/mycert.pem stats enable stats uri /report stats refresh 30s http-request deny unless { src 192.168.50.0/24 } ================================================ FILE: samples/HAProxy/haproxy4.cfg ================================================ # HAProxy configuration showing redirecting to different backends global log 192.168.50.2:514 local0 chroot /var/lib/haproxy user haproxy group haproxy ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256 ssl-default-bind-options ssl-min-ver TLSv1.2 no-tls-tickets defaults log global option httplog timeout connect 5s timeout client 1m timeout server 1m frontend mywebsite bind :80 balance roundrobin mode http acl apipath path_beg /api/ acl apihost req.hdr(Host) -i -m dom api.mywebsite.com redirect prefix http://api.mywebsite.com if apipath use_backend apiservers if apihost default_backend webservers backend webservers option httpchk HEAD /health server web1 192.168.0.3:80 check maxconn 20 server web2 192.168.0.4:80 check maxconn 20 backend apiservers option httpchk HEAD /health server api1 192.168.0.10:80 check maxconn 20 server api2 192.168.0.11:80 check maxconn 20 ================================================ FILE: samples/HCL/example.hcl ================================================ consul = "1.2.3.4" // This is a comment template "foo" { bar = "zip" } ================================================ FILE: samples/HCL/example.nomad ================================================ # There can only be a single job definition per file. This job is named # "example" so it will create a job with the ID and Name "example". # The "job" stanza is the top-most configuration option in the job # specification. A job is a declarative specification of tasks that Nomad # should run. Jobs have a globally unique name, one or many task groups, which # are themselves collections of one or many tasks. # # For more information and examples on the "job" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/job.html # job "example" { # The "region" parameter specifies the region in which to execute the job. If # omitted, this inherits the default region name of "global". # region = "global" # The "datacenters" parameter specifies the list of datacenters which should # be considered when placing this task. This must be provided. datacenters = ["dc1"] # The "type" parameter controls the type of job, which impacts the scheduler's # decision on placement. This configuration is optional and defaults to # "service". For a full list of job types and their differences, please see # the online documentation. # # For more information, please see the online documentation at: # # https://www.nomadproject.io/docs/jobspec/schedulers.html # type = "service" # The "constraint" stanza defines additional constraints for placing this job, # in addition to any resource or driver constraints. This stanza may be placed # at the "job", "group", or "task" level, and supports variable interpolation. # # For more information and examples on the "constraint" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/constraint.html # # constraint { # attribute = "${attr.kernel.name}" # value = "linux" # } # The "update" stanza specifies the update strategy of task groups. The update # strategy is used to control things like rolling upgrades, canaries, and # blue/green deployments. If omitted, no update strategy is enforced. The # "update" stanza may be placed at the job or task group. When placed at the # job, it applies to all groups within the job. When placed at both the job and # group level, the stanzas are merged with the group's taking precedence. # # For more information and examples on the "update" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/update.html # update { # The "max_parallel" parameter specifies the maximum number of updates to # perform in parallel. In this case, this specifies to update a single task # at a time. max_parallel = 1 # The "min_healthy_time" parameter specifies the minimum time the allocation # must be in the healthy state before it is marked as healthy and unblocks # further allocations from being updated. min_healthy_time = "10s" # The "healthy_deadline" parameter specifies the deadline in which the # allocation must be marked as healthy after which the allocation is # automatically transitioned to unhealthy. Transitioning to unhealthy will # fail the deployment and potentially roll back the job if "auto_revert" is # set to true. healthy_deadline = "3m" # The "auto_revert" parameter specifies if the job should auto-revert to the # last stable job on deployment failure. A job is marked as stable if all the # allocations as part of its deployment were marked healthy. auto_revert = false # The "canary" parameter specifies that changes to the job that would result # in destructive updates should create the specified number of canaries # without stopping any previous allocations. Once the operator determines the # canaries are healthy, they can be promoted which unblocks a rolling update # of the remaining allocations at a rate of "max_parallel". # # Further, setting "canary" equal to the count of the task group allows # blue/green deployments. When the job is updated, a full set of the new # version is deployed and upon promotion the old version is stopped. canary = 0 } # The "group" stanza defines a series of tasks that should be co-located on # the same Nomad client. Any task within a group will be placed on the same # client. # # For more information and examples on the "group" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/group.html # group "cache" { # The "count" parameter specifies the number of the task groups that should # be running under this group. This value must be non-negative and defaults # to 1. count = 3 # The "restart" stanza configures a group's behavior on task failure. If # left unspecified, a default restart policy is used based on the job type. # # For more information and examples on the "restart" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/restart.html # restart { # The number of attempts to run the job within the specified interval. attempts = 10 interval = "5m" # The "delay" parameter specifies the duration to wait before restarting # a task after it has failed. delay = "25s" # The "mode" parameter controls what happens when a task has restarted # "attempts" times within the interval. "delay" mode delays the next # restart until the next interval. "fail" mode does not restart the task # if "attempts" has been hit within the interval. mode = "delay" } # The "ephemeral_disk" stanza instructs Nomad to utilize an ephemeral disk # instead of a hard disk requirement. Clients using this stanza should # not specify disk requirements in the resources stanza of the task. All # tasks in this group will share the same ephemeral disk. # # For more information and examples on the "ephemeral_disk" stanza, please # see the online documentation at: # # https://www.nomadproject.io/docs/job-specification/ephemeral_disk.html # ephemeral_disk { # When sticky is true and the task group is updated, the scheduler # will prefer to place the updated allocation on the same node and # will migrate the data. This is useful for tasks that store data # that should persist across allocation updates. # sticky = true # # Setting migrate to true results in the allocation directory of a # sticky allocation directory to be migrated. # migrate = true # The "size" parameter specifies the size in MB of shared ephemeral disk # between tasks in the group. size = 300 } # The "task" stanza creates an individual unit of work, such as a Docker # container, web application, or batch processing. # # For more information and examples on the "task" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/task.html # task "redis" { # The "driver" parameter specifies the task driver that should be used to # run the task. driver = "docker" # The "config" stanza specifies the driver configuration, which is passed # directly to the driver to start the task. The details of configurations # are specific to each driver, so please see specific driver # documentation for more information. config { image = "redis:4.0" port_map { db = 6379 } } # The "artifact" stanza instructs Nomad to download an artifact from a # remote source prior to starting the task. This provides a convenient # mechanism for downloading configuration files or data needed to run the # task. It is possible to specify the "artifact" stanza multiple times to # download multiple artifacts. # # For more information and examples on the "artifact" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/artifact.html # # artifact { # source = "http://foo.com/artifact.tar.gz" # options { # checksum = "md5:c4aa853ad2215426eb7d70a21922e794" # } # } # The "logs" stanza instructs the Nomad client on how many log files and # the maximum size of those logs files to retain. Logging is enabled by # default, but the "logs" stanza allows for finer-grained control over # the log rotation and storage configuration. # # For more information and examples on the "logs" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/logs.html # # logs { # max_files = 10 # max_file_size = 15 # } # The "resources" stanza describes the requirements a task needs to # execute. Resource requirements include memory, network, cpu, and more. # This ensures the task will execute on a machine that contains enough # resource capacity. # # For more information and examples on the "resources" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/resources.html # resources { cpu = 500 # 500 MHz memory = 256 # 256MB network { mbits = 10 port "db" {} } } # The "service" stanza instructs Nomad to register this task as a service # in the service discovery engine, which is currently Consul. This will # make the service addressable after Nomad has placed it on a host and # port. # # For more information and examples on the "service" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/service.html # service { name = "global-redis-check" tags = ["global", "cache"] port = "db" check { name = "alive" type = "tcp" interval = "10s" timeout = "2s" } } # The "template" stanza instructs Nomad to manage a template, such as # a configuration file or script. This template can optionally pull data # from Consul or Vault to populate runtime configuration data. # # For more information and examples on the "template" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/template.html # # template { # data = "---\nkey: {{ key \"service/my-key\" }}" # destination = "local/file.yml" # change_mode = "signal" # change_signal = "SIGHUP" # } # The "template" stanza can also be used to create environment variables # for tasks that prefer those to config files. The task will be restarted # when data pulled from Consul or Vault changes. # # template { # data = "KEY={{ key \"service/my-key\" }}" # destination = "local/file.env" # env = true # } # The "vault" stanza instructs the Nomad client to acquire a token from # a HashiCorp Vault server. The Nomad servers must be configured and # authorized to communicate with Vault. By default, Nomad will inject # The token into the job via an environment variable and make the token # available to the "template" stanza. The Nomad client handles the renewal # and revocation of the Vault token. # # For more information and examples on the "vault" stanza, please see # the online documentation at: # # https://www.nomadproject.io/docs/job-specification/vault.html # # vault { # policies = ["cdn", "frontend"] # change_mode = "signal" # change_signal = "SIGHUP" # } # Controls the timeout between signalling a task it will be killed # and killing the task. If not set a default is used. # kill_timeout = "20s" } } } ================================================ FILE: samples/HCL/example.tf ================================================ resource "aws_instance" "web" { // Copies the myapp.conf file to /etc/myapp.conf provisioner "file" { source = "conf/myapp.conf" destination = "/etc/myapp.conf" } // Copies the configs.d folder to /etc/configs.d provisioner "file" { source = "conf/configs.d" destination = "/etc" } } ================================================ FILE: samples/HCL/example.tofu ================================================ # Sample OpenTofu file (.tofu) - This is a hypothetical example for use by # Linguist to detect HCL in use by OpenTofu with the .tofu extension. # -------------------------------------------------------------------------- # OpenTofu configuration block # -------------------------------------------------------------------------- terraform { required_version = ">= 1.0.0" required_providers { # This is just an example comment aws = { source = "hashicorp/aws" version = "~> 3.0" } random = { source = "hashicorp/random" version = "~> 3.0" } } # Backend configuration backend "s3" { bucket = "my-tofu-backend-bucket" key = "path/to/statefile.tfstate" region = "us-west-2" } } # -------------------------------------------------------------------------- # Provider configurations # -------------------------------------------------------------------------- provider "aws" { region = var.aws_region } provider "random" { # random provider typically doesn't require complicated config } # -------------------------------------------------------------------------- # Variable definitions # -------------------------------------------------------------------------- variable "aws_region" { type = string description = "AWS region to deploy resources into." default = "us-west-2" } variable "instance_count" { type = number description = "Number of instances to launch." default = 2 } variable "tags_map" { type = map(string) description = "Map of tags to apply to resources." default = { Environment = "Development" Application = "DemoApp" } } # -------------------------------------------------------------------------- # Local values # -------------------------------------------------------------------------- locals { full_tag_map = merge( var.tags_map, { CreatedBy = "OpenTofuSample" Timestamp = formatdate("YYYY-MM-DD", timestamp()) } ) } # -------------------------------------------------------------------------- # Dummy resource blocks # -------------------------------------------------------------------------- resource "aws_instance" "example" { # Demo AMI, not real ami = "ami-00000000000000000" instance_type = "t2.micro" count = var.instance_count tags = merge( local.full_tag_map, { Name = "ExampleInstance-${count.index}" } ) } resource "random_pet" "pet_name" { length = 3 } resource "aws_s3_bucket" "example_bucket" { bucket = "my-example-bucket-${random_pet.pet_name.id}" acl = "private" tags = local.full_tag_map } # -------------------------------------------------------------------------- # Module blocks # -------------------------------------------------------------------------- module "fake_module" { source = "./modules/fake_module" # local path or remote module version = "0.0.1" # dummy version # Pass in some variables example_var = "HelloTofu" another_var = var.instance_count inherited_tag_map = local.full_tag_map } # -------------------------------------------------------------------------- # Outputs # -------------------------------------------------------------------------- output "instance_ids" { description = "List of created instance IDs." value = aws_instance.example[*].id } output "random_pet_name" { description = "The randomly generated pet name." value = random_pet.pet_name.id } output "example_bucket_name" { description = "The created S3 bucket name." value = aws_s3_bucket.example_bucket.bucket } ================================================ FILE: samples/HCL/main.tf ================================================ resource "aws_security_group" "elb_sec_group" { description = "Allow traffic from the internet to ELB port 80" vpc_id = "${var.vpc_id}" ingress { from_port = 80 to_port = 80 protocol = "tcp" cidr_blocks = ["${split(",", var.allowed_cidr_blocks)}"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_security_group" "dokku_allow_ssh_from_internal" { description = "Allow git access over ssh from the private subnet" vpc_id = "${var.vpc_id}" ingress { from_port = 22 to_port = 22 protocol = "tcp" cidr_blocks = ["${var.private_subnet_cidr}"] } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_security_group" "allow_from_elb_to_instance" { description = "Allow traffic from the ELB to the private instance" vpc_id = "${var.vpc_id}" ingress { security_groups = ["${aws_security_group.elb_sec_group.id}"] from_port = 80 to_port = 80 protocol = "tcp" } egress { from_port = 0 to_port = 0 protocol = "-1" cidr_blocks = ["0.0.0.0/0"] } } resource "aws_instance" "dokku" { ami = "ami-47a23a30" instance_type = "${var.instance_type}" associate_public_ip_address = false key_name = "${var.key_name}" subnet_id = "${var.private_subnet_id}" vpc_security_group_ids = [ "${var.bastion_sec_group_id}", "${aws_security_group.allow_from_elb_to_instance.id}", "${aws_security_group.dokku_allow_ssh_from_internal.id}" ] tags { Name = "${var.name}" } connection { user = "ubuntu" private_key = "${var.private_key}" bastion_host = "${var.bastion_host}" bastion_port = "${var.bastion_port}" bastion_user = "${var.bastion_user}" bastion_private_key = "${var.bastion_private_key}" } provisioner "file" { source = "${path.module}/../scripts/install-dokku.sh" destination = "/home/ubuntu/install-dokku.sh" } provisioner "remote-exec" { inline = [ "chmod +x /home/ubuntu/install-dokku.sh", "HOSTNAME=${var.hostname} /home/ubuntu/install-dokku.sh" ] } } resource "aws_elb" "elb_dokku" { name = "elb-dokku-${var.name}" subnets = ["${var.public_subnet_id}"] security_groups = ["${aws_security_group.elb_sec_group.id}"] listener { instance_port = 80 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } health_check { healthy_threshold = 2 unhealthy_threshold = 2 timeout = 3 target = "HTTP:80/" interval = 30 } instances = ["${aws_instance.dokku.id}"] cross_zone_load_balancing = false idle_timeout = 400 tags { Name = "elb-dokku-${var.name}" } } resource "aws_route53_record" "dokku-deploy" { zone_id = "${var.zone_id}" name = "deploy.${var.hostname}" type = "A" ttl = "300" records = ["${aws_instance.dokku.private_ip}"] } resource "aws_route53_record" "dokku-wildcard" { zone_id = "${var.zone_id}" name = "*.${var.hostname}" type = "CNAME" ttl = "300" records = ["${aws_elb.elb_dokku.dns_name}"] } ================================================ FILE: samples/HCL/main.workflow ================================================ workflow "Build and Publish" { on = "push" resolves = "Docker Publish" } action "Shell Lint" { uses = "actions/bin/shellcheck@master" args = "entrypoint.sh" } action "Test" { uses = "actions/bin/bats@master" args = "test/*.bats" } action "Docker Lint" { uses = "docker://replicated/dockerfilelint" args = ["Dockerfile"] } action "Build" { needs = ["Shell Lint", "Test", "Docker Lint"] uses = "actions/docker/cli@master" args = "build -t heroku ." } action "Docker Tag" { needs = ["Build"] uses = "actions/docker/tag@master" args = "heroku github/heroku --no-latest" } action "Publish Filter" { needs = ["Build"] uses = "actions/bin/filter@master" args = "branch master" } action "Docker Login" { needs = ["Publish Filter"] uses = "actions/docker/login@master" secrets = ["DOCKER_USERNAME", "DOCKER_PASSWORD"] } action "Docker Publish" { needs = ["Docker Tag", "Docker Login"] uses = "actions/docker/cli@master" args = "push github/heroku" } ================================================ FILE: samples/HCL/terraform.tfvars ================================================ # Terragrunt is a thin wrapper for Terraform that provides extra tools for working with multiple Terraform modules, # remote state, and locking: https://github.com/gruntwork-io/terragrunt terragrunt = { # Configure Terragrunt to automatically store tfstate files in an S3 bucket remote_state { backend = "s3" config { encrypt = true bucket = "acme-main-terraform-state" key = "${path_relative_to_include()}/terraform.tfstate" region = "us-east-1" dynamodb_table = "terraform-locks" } } # Configure Terragrunt to use common var files to help you keep often-repeated variables (e.g., account ID) DRY. # Note that even though Terraform automatically pulls in terraform.tfvars, we include it explicitly at the end of the # list to make sure its variables override anything in the common var files. terraform { extra_arguments "common_vars" { commands = ["${get_terraform_commands_that_need_vars()}"] optional_var_files = [ "${get_tfvars_dir()}/${find_in_parent_folders("account.tfvars", "skip-account-if-does-not-exist")}", "${get_tfvars_dir()}/${find_in_parent_folders("region.tfvars", "skip-region-if-does-not-exist")}", "${get_tfvars_dir()}/${find_in_parent_folders("env.tfvars", "skip-env-if-does-not-exist")}", "${get_tfvars_dir()}/terraform.tfvars" ] } } } key1 = "val1" key2 = 0 key3 = 1 key4 = true # Sample comments key5 = false key6 = ["hello", "from", "gruntwork.io"] key7 = { key1 = "hello" key2 = "from" key3 = "gruntwork.io" } key8 = [ { keyA = "hello" keyB = "there" }, { keyA = "hello" keyB = "there" } ] ================================================ FILE: samples/HIP/MatrixMultiplication.hip ================================================ // MIT License // // Original source: // https://github.com/ROCm/rocm-examples // Copyright (c) 2022-2023 Advanced Micro Devices, Inc. // // Modified and reduced for Linguist sample use by Young-TW // // Permission is hereby granted, free of charge, to any person obtaining a copy // of this software and associated documentation files (the "Software"), to deal // in the Software without restriction, including without limitation the rights // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell // copies of the Software, and to permit persons to whom the Software is // furnished to do so, subject to the following conditions: // // The above copyright notice and this permission notice shall be included in all // copies or substantial portions of the Software. // // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE // SOFTWARE. #include #include #include #include #include constexpr unsigned int BlockSize = 16; __global__ void matrix_multiplication_kernel(const float* A, const float* B, float* C, const unsigned int a_cols) { unsigned int tx = threadIdx.x; unsigned int ty = threadIdx.y; unsigned int bx = blockIdx.x; unsigned int by = blockIdx.y; unsigned int b_cols = blockDim.x * gridDim.x; unsigned int steps = a_cols / BlockSize; float thread_result = 0.0F; for (unsigned int step = 0; step < steps; ++step) { __shared__ float a_values[BlockSize][BlockSize]; __shared__ float b_values[BlockSize][BlockSize]; unsigned int a_idx = BlockSize * (a_cols * by + step); unsigned int b_idx = BlockSize * (b_cols * step + bx); a_values[ty][tx] = A[a_idx + a_cols * ty + tx]; b_values[ty][tx] = B[b_idx + b_cols * ty + tx]; __syncthreads(); for (unsigned int i = 0; i < BlockSize; ++i) { thread_result += a_values[ty][i] * b_values[i][tx]; } __syncthreads(); } unsigned int block_offset = b_cols * BlockSize * by + BlockSize * bx; C[block_offset + b_cols * ty + tx] = thread_result; } int main() { constexpr unsigned int a_rows = 256, a_cols = 128, b_cols = 128; constexpr unsigned int b_rows = a_cols; constexpr unsigned int c_rows = a_rows, c_cols = b_cols; const size_t a_bytes = sizeof(float) * a_rows * a_cols; const size_t b_bytes = sizeof(float) * b_rows * b_cols; const size_t c_bytes = sizeof(float) * c_rows * c_cols; std::vector A(a_rows * a_cols, 1.0f); std::vector B(b_rows * b_cols, 0.5f); std::vector C(c_rows * c_cols); float *d_A, *d_B, *d_C; hipMalloc(&d_A, a_bytes); hipMalloc(&d_B, b_bytes); hipMalloc(&d_C, c_bytes); hipMemcpy(d_A, A.data(), a_bytes, hipMemcpyHostToDevice); hipMemcpy(d_B, B.data(), b_bytes, hipMemcpyHostToDevice); dim3 block_dim(BlockSize, BlockSize); dim3 grid_dim(c_cols / BlockSize, c_rows / BlockSize); matrix_multiplication_kernel<<>>(d_A, d_B, d_C, a_cols); hipDeviceSynchronize(); hipMemcpy(C.data(), d_C, c_bytes, hipMemcpyDeviceToHost); hipFree(d_A); hipFree(d_B); hipFree(d_C); if (std::abs(C[0] - a_cols * 0.5f) < 1e-3f) { std::cout << "Validation passed.\n"; } else { std::cout << "Validation failed.\n"; } } ================================================ FILE: samples/HLSL/accelerated_surface_win.hlsl ================================================ // Copyright (c) 2012 The Chromium Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // To compile these two shaders: // fxc /E pixelMain /T ps_2_0 accelerated_surface_win.hlsl // fxc /E vertexMain /T vs_2_0 accelerated_surface_win.hlsl // // fxc is in the DirectX SDK. struct Vertex { float4 position : POSITION; float2 texCoord : TEXCOORD0; }; texture t; sampler s; // Passes a position and texture coordinate to the pixel shader. Vertex vertexMain(Vertex input) { return input; }; // Samples a texture at the given texture coordinate and returns the result. float4 pixelMain(float2 texCoord : TEXCOORD0) : COLOR0 { return tex2D(s, texCoord); }; ================================================ FILE: samples/HLSL/bloom.cginc ================================================ // From https://github.com/Unity-Technologies/PostProcessing/blob/master/PostProcessing/Resources/Shaders/Bloom.cginc // Licensed under the MIT license #ifndef __BLOOM__ #define __BLOOM__ #include "Common.cginc" // Brightness function half Brightness(half3 c) { return Max3(c); } // 3-tap median filter half3 Median(half3 a, half3 b, half3 c) { return a + b + c - min(min(a, b), c) - max(max(a, b), c); } // Downsample with a 4x4 box filter half3 DownsampleFilter(sampler2D tex, float2 uv, float2 texelSize) { float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0); half3 s; s = DecodeHDR(tex2D(tex, uv + d.xy)); s += DecodeHDR(tex2D(tex, uv + d.zy)); s += DecodeHDR(tex2D(tex, uv + d.xw)); s += DecodeHDR(tex2D(tex, uv + d.zw)); return s * (1.0 / 4.0); } // Downsample with a 4x4 box filter + anti-flicker filter half3 DownsampleAntiFlickerFilter(sampler2D tex, float2 uv, float2 texelSize) { float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0); half3 s1 = DecodeHDR(tex2D(tex, uv + d.xy)); half3 s2 = DecodeHDR(tex2D(tex, uv + d.zy)); half3 s3 = DecodeHDR(tex2D(tex, uv + d.xw)); half3 s4 = DecodeHDR(tex2D(tex, uv + d.zw)); // Karis's luma weighted average (using brightness instead of luma) half s1w = 1.0 / (Brightness(s1) + 1.0); half s2w = 1.0 / (Brightness(s2) + 1.0); half s3w = 1.0 / (Brightness(s3) + 1.0); half s4w = 1.0 / (Brightness(s4) + 1.0); half one_div_wsum = 1.0 / (s1w + s2w + s3w + s4w); return (s1 * s1w + s2 * s2w + s3 * s3w + s4 * s4w) * one_div_wsum; } half3 UpsampleFilter(sampler2D tex, float2 uv, float2 texelSize, float sampleScale) { #if MOBILE_OR_CONSOLE // 4-tap bilinear upsampler float4 d = texelSize.xyxy * float4(-1.0, -1.0, 1.0, 1.0) * (sampleScale * 0.5); half3 s; s = DecodeHDR(tex2D(tex, uv + d.xy)); s += DecodeHDR(tex2D(tex, uv + d.zy)); s += DecodeHDR(tex2D(tex, uv + d.xw)); s += DecodeHDR(tex2D(tex, uv + d.zw)); return s * (1.0 / 4.0); #else // 9-tap bilinear upsampler (tent filter) float4 d = texelSize.xyxy * float4(1.0, 1.0, -1.0, 0.0) * sampleScale; half3 s; s = DecodeHDR(tex2D(tex, uv - d.xy)); s += DecodeHDR(tex2D(tex, uv - d.wy)) * 2.0; s += DecodeHDR(tex2D(tex, uv - d.zy)); s += DecodeHDR(tex2D(tex, uv + d.zw)) * 2.0; s += DecodeHDR(tex2D(tex, uv)) * 4.0; s += DecodeHDR(tex2D(tex, uv + d.xw)) * 2.0; s += DecodeHDR(tex2D(tex, uv + d.zy)); s += DecodeHDR(tex2D(tex, uv + d.wy)) * 2.0; s += DecodeHDR(tex2D(tex, uv + d.xy)); return s * (1.0 / 16.0); #endif } #endif // __BLOOM__ ================================================ FILE: samples/HLSL/corridor.fx ================================================ float4x4 matWorldView : WORLDVIEW; float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; struct VS_INPUT { float4 Position : POSITION0; float3 Normal : NORMAL; float3 Tangent : TANGENT; float3 Binormal : BINORMAL; float2 TexCoord0 : TEXCOORD0; float2 TexCoord1 : TEXCOORD1; }; struct VS_OUTPUT { float4 Position : POSITION0; float2 TexCoord0 : TEXCOORD0; float2 TexCoord1 : TEXCOORD1; float3x3 TangentToView : TEXCOORD2; }; VS_OUTPUT vs_main(VS_INPUT input) { VS_OUTPUT output; output.Position = mul(input.Position, matWorldViewProjection); output.TexCoord0 = input.TexCoord0 * 5; output.TexCoord1 = input.TexCoord1; output.TangentToView[0] = mul(float4(input.Tangent, 0), matWorldView).xyz; output.TangentToView[1] = mul(float4(input.Binormal, 0), matWorldView).xyz; output.TangentToView[2] = mul(float4(input.Normal, 0), matWorldView).xyz; return output; } struct PS_OUTPUT { float4 gbuffer0 : COLOR0; float4 gbuffer1 : COLOR1; }; texture albedo_tex; sampler albedo_samp = sampler_state { Texture = (albedo_tex); MipFilter = Linear; MinFilter = Linear; MagFilter = Linear; AddressU = Wrap; AddressV = Wrap; sRGBTexture = True; }; texture normal_tex; sampler normal_samp = sampler_state { Texture = (normal_tex); MipFilter = Linear; MinFilter = Linear; MagFilter = Linear; AddressU = Wrap; AddressV = Wrap; sRGBTexture = False; }; texture specular_tex; sampler specular_samp = sampler_state { Texture = (specular_tex); MipFilter = Linear; MinFilter = Linear; MagFilter = Linear; AddressU = Wrap; AddressV = Wrap; sRGBTexture = True; }; texture ao_tex; sampler ao_samp = sampler_state { Texture = (ao_tex); MipFilter = Linear; MinFilter = Linear; MagFilter = Linear; AddressU = Wrap; AddressV = Wrap; sRGBTexture = True; }; PS_OUTPUT ps_main(VS_OUTPUT Input) { PS_OUTPUT o; float3 tangentNormal = normalize(tex2D(normal_samp, Input.TexCoord0).xyz * 2 - 1); float3 eyeNormal = normalize(mul(tangentNormal, Input.TangentToView)); float3 albedo = tex2D(albedo_samp, Input.TexCoord0).rgb; float ao = tex2D(ao_samp, Input.TexCoord1).r * 0.75; float spec = tex2D(specular_samp, Input.TexCoord0).r; o.gbuffer0 = float4(eyeNormal, spec * ao); o.gbuffer1 = float4(albedo, 1 - ao); return o; } technique mesh { pass Geometry { VertexShader = compile vs_3_0 vs_main(); PixelShader = compile ps_3_0 ps_main(); AlphaBlendEnable = False; ZWriteEnable = True; } } ================================================ FILE: samples/HLSL/jellyfish.fx ================================================ float4x4 matWorldViewProjection : WORLDVIEWPROJECTION; float4x4 matWorldView : WORLDVIEW; float4x4 matWorld : WORLD; float4x4 matView : VIEW; uniform float4 vViewPosition; struct VS_INPUT { float3 Pos: POSITION; float3 Normal: NORMAL; float3 Tangent: TANGENT; float3 Binormal: BINORMAL; }; struct VS_OUTPUT { float4 Pos : POSITION; float3 reflection : TEXCOORD1; float3 refraction : TEXCOORD2; float fresnel : TEXCOORD3; }; uniform float3 amt; uniform float3 scale; uniform float3 phase; float3 deform(float3 p) { float s = 3; float3 p2 = p * scale + phase; s += sin(p2.x) * amt.x; s += sin(p2.y) * amt.y; s += sin(p2.z) * amt.z; return p * s / 3; } VS_OUTPUT vs_main( VS_INPUT In ) { VS_OUTPUT Out; float3 pos = In.Pos; float3 norm = In.Normal; float3 p1 = pos + In.Tangent * 0.05; float3 p2 = pos + In.Binormal * 0.05; pos = deform(pos); p1 = deform(p1); p2 = deform(p2); p1 -= pos; p2 -= pos; norm = normalize(cross(p1, p2)); float3 view = normalize(pos - vViewPosition.xyz); Out.Pos = mul(float4(pos, 1.0), matWorldViewProjection); Out.reflection = reflect(view, norm); Out.refraction = reflect(view, norm * 0.4f); /* fake, but who cares? */ Out.fresnel = dot(view, norm); norm = mul(float4(norm, 0.0), matWorldViewProjection); return Out; } #define PS_INPUT VS_OUTPUT #if 0 textureCUBE reflectionMap; samplerCUBE reflectionMapSampler = sampler_state { Texture = (reflectionMap); MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; }; #else // textures texture reflectionMap < string type = "CUBE"; string name = "test_cube.dds"; >; samplerCUBE reflectionMapSampler = sampler_state { Texture = (reflectionMap); MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; }; #endif struct PS_OUTPUT { float4 color : COLOR0; }; PS_OUTPUT ps_main( PS_INPUT In ) { PS_OUTPUT Out; float4 reflection = texCUBE(reflectionMapSampler, normalize(In.reflection)) * 1.5; float4 refraction = texCUBE(reflectionMapSampler, normalize(In.refraction)); float fresnel = In.fresnel; // float fresnel = abs(normalize(In.normal).z); Out.color = lerp(reflection, refraction, fresnel) * pow(1.0 - fresnel * 0.75, 1.0); return Out; } technique blur_ps_vs_2_0 { pass P0 { VertexShader = compile vs_2_0 vs_main(); PixelShader = compile ps_2_0 ps_main(); } } ================================================ FILE: samples/HLSL/noise.fx ================================================ float alpha = 1.f; texture tex; sampler tex_sampler = sampler_state { Texture = (tex); MipFilter = LINEAR; MinFilter = LINEAR; MagFilter = LINEAR; AddressU = WRAP; AddressV = WRAP; }; struct VS_OUTPUT { float4 pos : POSITION; float2 tex : TEXCOORD1; }; VS_OUTPUT vertex(float4 ipos : POSITION, float2 tex : TEXCOORD0) { VS_OUTPUT Out; Out.pos = ipos; Out.tex = tex * 2; return Out; } float4 pixel(VS_OUTPUT In) : COLOR { return tex2D(tex_sampler, In.tex) * alpha; } technique blur_ps_vs_2_0 { pass P0 { VertexShader = compile vs_2_0 vertex(); PixelShader = compile ps_2_0 pixel(); } } ================================================ FILE: samples/HOCON/application.hocon ================================================ # Copyright 2022 HM Revenue & Customs # # Licensed under the Apache License, Version 2.0 (the "License"); # you may not use this file except in compliance with the License. # You may obtain a copy of the License at # # http://www.apache.org/licenses/LICENSE-2.0 # # Unless required by applicable law or agreed to in writing, software # distributed under the License is distributed on an "AS IS" BASIS, # WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. # See the License for the specific language governing permissions and # limitations under the License. include "frontend.conf" appName = "penalties-frontend" play.http.router = prod.Routes # An ApplicationLoader that uses Guice to bootstrap the application. play.application.loader = "uk.gov.hmrc.play.bootstrap.ApplicationLoader" # Primary entry point for all HTTP requests on Play applications play.http.requestHandler = "uk.gov.hmrc.play.bootstrap.http.RequestHandler" # Provides an implementation of AuditConnector. Use `uk.gov.hmrc.play.bootstrap.AuditModule` or create your own. # An audit connector must be provided. play.modules.enabled += "uk.gov.hmrc.play.audit.AuditModule" # Provides an implementation of MetricsFilter. Use `uk.gov.hmrc.play.bootstrap.graphite.GraphiteMetricsModule` or create your own. # A metric filter must be provided play.modules.enabled += "uk.gov.hmrc.play.bootstrap.graphite.GraphiteMetricsModule" # Provides an implementation and configures all filters required by a Platform frontend microservice. play.modules.enabled += "uk.gov.hmrc.play.bootstrap.frontend.FrontendModule" # Default http client play.modules.enabled += "uk.gov.hmrc.play.bootstrap.HttpClientModule" # Auth client module play.modules.enabled += "uk.gov.hmrc.play.bootstrap.AuthModule" # Custom error handler play.http.errorHandler = "config.ErrorHandler" play.filters.headers.contentSecurityPolicy = "default-src 'self' 'unsafe-inline' localhost:9000 localhost:9032 localhost:12345 www.google-analytics.com https://www.googletagmanager.com data:" # Play Modules # ~~~~ # Additional play modules can be added here microservice { metrics { graphite { host = localhost port = 2003 prefix = play.${appName}. enabled = true } } services { contact-frontend { protocol = http host = localhost port = 9250 } auth { host = localhost port = 8500 } penalties { protocol = http host = localhost port = 9182 } vat-agent-client-lookup-frontend { host = "http://localhost:9152" startUrl = "/vat-through-software/test-only/vaclf-stub" } } } feature { switch { call-api-1812-etmp = false time-machine-now = "" } } urls { vatOverview = "http://localhost:9152/vat-through-software/vat-overview" btaHomepage = "http://localhost:9020/business-account" vatAgentClientLookUp = "http://localhost:9149/vat-through-software/representative/client-vat-account" penaltiesAppealsBaseurl = "http://localhost:9181" } metrics { name = ${appName} rateUnit = SECONDS durationUnit = SECONDS showSamples = true jvm = true enabled = false } auditing { enabled = true traceRequests = true consumer { baseUri { host = localhost port = 8100 } } } controllers { controllers.Assets = { needsAuditing = false } uk.gov.hmrc.govukfrontend.controllers.Assets = { needsAuditing = false } uk.gov.hmrc.hmrcfrontend.controllers.Assets = { needsAuditing = false } } tracking-consent-frontend { gtm.container = "b" } signIn { url = "http://localhost:9949/auth-login-stub/gg-sign-in" continueBaseUrl = "http://localhost:9180" } signOut { url = "http://localhost:9553/bas-gateway/sign-out-without-state?continue=" } play.i18n.langs = ["en", "cy"] # Change this value to true to enable Welsh translations to be loaded from messages.cy, and to display the language toggle features.welsh-language-support = true timeout { period = 900 countDown = 120 } feedback { url = "#" } contact-frontend.serviceId = "vat-penalties" host = "http://localhost:9180" ================================================ FILE: samples/HOCON/filenames/.scalafix.conf ================================================ rules = [ ExplicitResultTypes, OrganizeImports ] ExplicitResultTypes { unsafeShortenNames = true } OrganizeImports { groupedImports = Explode expandRelative = true removeUnused = true # done already by RemoveUnused rule groups = [ "re:javax?\\." "scala." "scala.meta." "*" ] } ================================================ FILE: samples/HOCON/filenames/.scalafmt.conf ================================================ version=3.7.3 runner.dialect = scala213 project.git = true project.excludeFilters = [ scalafmt-benchmarks/src/resources, sbt-test bin/issue ] align.preset = none # Disabled in default since this operation is potentially # dangerous if you define your own stripMargin with different # semantics from the stdlib stripMargin. assumeStandardLibraryStripMargin = true onTestFailure = "To fix this, run ./scalafmt from the project root directory" ================================================ FILE: samples/HOCON/stream-collector.hocon ================================================ collector { interface = "0.0.0.0" port = 8080 p3p { policyRef = "/w3c/p3p.xml" CP = "NOI DSP COR NID PSA OUR IND COM NAV STA" } crossDomain { enabled = false domains = [ "*" ] secure = false } cookie { enabled = false expiration = "365 days" name = collectorCookieName domain = cookieDomain } doNotTrackCookie { enabled = false name = doNotTrackCookieName value = doNotTrackCookieValue } cookieBounce { enabled = false name = "n3pc" fallbackNetworkUserId = "00000000-0000-4000-A000-000000000000" forwardedProtocolHeader = "X-Forwarded-Proto" } redirectMacro { enabled = false placeholder = "[TOKEN]" } rootResponse { enabled = false statusCode = 302 headers = { Location = "https://127.0.0.1/", X-Custom = "something" } body = "302, redirecting" } streams { good = raw bad = bad useIpAddressAsPartitionKey = false sink { enabled = nsq host = nsqd port = 4150 } buffer { byteLimit = 100 recordLimit = 1 # emit every record for testing purposes - NOT suitable for prod timeLimit = 100 } } } akka { loglevel = DEBUG loggers = ["akka.event.slf4j.Slf4jLogger"] http.server { remote-address-header = on raw-request-uri-header = on parsing { max-uri-length = 32768 uri-parsing-mode = relaxed } } } ================================================ FILE: samples/HTML/Crear_logo.hta ================================================ Logo para Switch -.- v

     PNG To IPS Logo Creator 1.0.0-.-12.x.x
       "PNG" "308x350" "RGBA"

    none

    By D3fau4 & Kronos2308

    ================================================ FILE: samples/HTML/example.xht ================================================ This is a XHTML sample file
    Just a simple XHTML test page.
    ================================================ FILE: samples/HTML/index.html.hl ================================================

    Example 1

    ~{x}

    Example 2

    ~{x}

    Example 3

    ~{x}

    Example 4

    Example 5

    Example 6

    ~{x}

    Example 7

    ~{x}

    Example 8

    ~{x}

    Example 9

    Example 10

    ================================================ FILE: samples/HTML/pages.html ================================================ Related Pages
    Related Pages
    Here is a list of all related documentation pages:
    ================================================ FILE: samples/HTML/pkgdown.html ================================================ Make Static HTML Documentation for a Package • pkgdown

    pkgdown is designed to make it quick and easy to build a website for your package. You can see pkgdown in action at https://pkgdown.r-lib.org: this is the output of pkgdown applied to the latest version of pkgdown. Learn more in vignette("pkgdown") or ?build_site.

    Usage

    Run pkgdown from the package directory each time you release your package:

    This will generate a docs/ directory. The home page will be generated from your package’s README.md, and a function reference will be generated from the documentation in the man/ directory. If you are using GitHub, the easiest way to make this your package website is to check into git, then go to settings for your repo and make sure that the GitHub pages source is set to “master branch /docs folder”. Be sure to update the URL on your github repository homepage so others can easily navigate to your new site.

    To customise your site, create _pkgdown.yml and modify it as described in the documentation. You can also use pkgdown/_pkgdown.yml if you need other files to customise your site.

    The package includes an RStudio add-in that you can bind to a keyboard shortcut. I recommend Cmd + Shift + W: it uses Cmd + Shift, like all other package development worksheets, it replaces a rarely used command (close all tabs), and the W is a mnemonic for website.

    In the wild

    As at last count, pkgdown is used by over 2000 packages.

    Here are a few examples created by people contributors to pkgdown:

    • bayesplot [source]: plotting functions for posterior analysis, model checking, and MCMC diagnostics.

    • valr [source]: read and manipulate genome intervals and signals.

    • mkin [source]: calculation routines based on the FOCUS Kinetics Report

    • NMF [source]: a framework to perform non-negative matrix factorization (NMF).

    Comparing the source and output of these sites is a great way to learn new pkgdown techniques.

    Code of conduct

    Please note that this project is released with a Contributor Code of Conduct. By participating in this project you agree to abide by its terms.

    ================================================ FILE: samples/HTML/rpanel.inc ================================================

    Поддержка:

    Москва:

    +7-902-7-800-807

    Регионы:

    +7-902-7-800-807

    ================================================ FILE: samples/HTML/tailDel.inc ================================================

    Supported Targets

    ================================================ FILE: samples/HTML/wehaveoddjobs.hta ================================================ NEUTRONSTAR ================================================ FILE: samples/HTML+ECR/greeting.ecr ================================================ <% if @name %> Greeting, <%= @name %>! <% else %> Greeting! <% end %> ================================================ FILE: samples/HTML+EEX/index.html.eex ================================================

    Listing Books

    <%= for book <- @books do %> <%# comment %> <% end %>
    Title Summary
    <%= book.title %> <%= book.content %> <%= link "Show", to: book_path(@conn, :show, book) %> <%= link "Edit", to: book_path(@conn, :edit, book) %> <%= link "Delete", to: book_path(@conn, :delete, book), method: :delete, data: [confirm: "Are you sure?"] %>

    <%= link "New book", to: book_path(@conn, :new) %> ================================================ FILE: samples/HTML+EEX/live_component.html.heex ================================================

    <%%= @title %>

    <.form let={f} for={@changeset} id="<%= schema.singular %>-form" phx-target={@myself} phx-change="validate" phx-submit="save"> <%= for {label, input, error} <- inputs, input do %> <%= label %> <%= input %> <%= error %> <% end %>
    <%%= submit "Save", phx_disable_with: "Saving..." %>
    ================================================ FILE: samples/HTML+EEX/live_component.html.leex ================================================

    <%= @title %>

    <%= f = form_for @changeset, "#", id: "form", phx_target: @myself, phx_change: "validate", phx_submit: "save" %> <%= for {label, input, error} <- inputs, input do %> <%= label %> <%= input %> <%= error %> <% end %> <%= submit "Save", phx_disable_with: "Saving..." %> ================================================ FILE: samples/HTML+ERB/fishbowl.html.erb.deface ================================================ <% if Spree::Config[:enable_fishbowl] %>
    <%= t(:fishbowl_settings)%> <% @fishbowl_options.each do |key| %>
    <%= label_tag(key, t(key.to_s.gsub('fishbowl_', '').to_sym) + ': ') + tag(:br) %> <%= text_field_tag('preferences[' + key.to_s + ']', Spree::Config[key], { :size => 10, :class => 'fullwidth' }) %>
    <% end %>
    <%= hidden_field_tag 'preferences[fishbowl_always_fetch_current_inventory]', '0' %> <%= check_box_tag('preferences[fishbowl_always_fetch_current_inventory]', "1", Spree::Config[:fishbowl_always_fetch_current_inventory]) %> <%= t(:always_fetch_current_inventory) %>
    <% if !@location_groups.empty? %>
    <%= label_tag(:fishbowl_location_group, t(:location_group) + ': ') + tag(:br) %> <%= select('preferences', 'fishbowl_location_group', @location_groups, { :selected => Spree::Config[:fishbowl_location_group]}, { :class => ['select2', 'fullwidth'] }) %>
    <% end %>
    <% end %> ================================================ FILE: samples/HTML+ERB/index.html.erb ================================================ <% provide(:title, @header) %> <% present @users do |user_presenter| %>

    <%= @header %>

    <%= will_paginate %>
    Name
    Email
    Chords
    Keys
    Tunings
    Credits
    Prem?
    Since?
    <% if @users == [] %>
    No Users
    <% else %> <%= render @users %> <% end %>
    <%= will_paginate %>
    <% end %> ================================================ FILE: samples/HTML+ERB/index.rhtml ================================================ <%= render :partial => 'header' %> <%4.times do%> <%end%> <% counter = 0 @diagnoses.each{|diagnosis| #raise diagnosis.to_yaml and return count_male_under_five = 0 count_female_under_five = 0 count_male_in_between = 0 count_female_in_between = 0 count_male_above_fourteen = 0 count_female_above_fourteen = 0 @patient_record.each{|patient| if patient['value_coded'].to_s == diagnosis.value_coded if (patient['age'].to_i < 5 ) if (patient['sex'].to_s == 'Male') count_male_under_five += 1 else count_female_under_five += 1 end elsif (patient['age'].to_i >= 5 and patient['age'].to_i <= 14) if (patient['sex'].to_s == 'Male') count_male_in_between += 1 else count_female_in_between += 1 end elsif (patient['age'].to_i > 14 ) if (patient['sex'].to_s == 'Male') count_male_above_fourteen += 1 else count_female_above_fourteen += 1 end end end } counter += 1 %> <% }%>
    Age group U5 5-14 >14 Total
    Diagnosis
    MF
    <%= diagnosis.name%>
    <%= count_male_under_five %><%= count_female_under_five %>
    <%= count_male_in_between%><%= count_female_in_between%>
    <%= count_male_above_fourteen %><%= count_female_above_fourteen%>
    <%= count_male_under_five + count_male_in_between + count_male_above_fourteen %> <%= count_female_under_five + count_female_in_between + count_female_above_fourteen%>
    ================================================ FILE: samples/HTML+Razor/Index.cshtml ================================================ @{ ViewBag.Title = "Home Page"; } @section featured { }

    We suggest the following:

    1. Getting Started
      ASP.NET MVC gives you a powerful, patterns-based way to build dynamic websites that enables a clean separation of concerns and that gives you full control over markup for enjoyable, agile development. ASP.NET MVC includes many features that enable fast, TDD-friendly development for creating sophisticated applications that use the latest web standards. Learn more…
    2. Add NuGet packages and jump-start your coding
      NuGet makes it easy to install and update free libraries and tools. Learn more…
    3. Find Web Hosting
      You can easily find a web hosting company that offers the right mix of features and price for your applications. Learn more…
    ================================================ FILE: samples/HTML+Razor/Index.razor ================================================ @page "/" @using Microsoft.AspNetCore.Components.Forms

    Components's team manager

    People management made easy
    @if (people.Count > 0) { @foreach (var person in people) { } } else { }
    Name Salary Areas Actions
    @person.Name @person.Salary @(string.Join(", ", person.Areas.Select(a => $"{a.Name}: {(a.Percent.ToString("g") + "%")}"))) Fire Edit
    Noone here (so sad)...
    @if (showEditorForCreate || showEditorForEdit) { }
    @functions { List people = new List(); Person person; int? editIndex; bool showEditorForCreate; bool showEditorForEdit; void Hire() { person = new Person() { Areas = { new FeatureArea(), }, }; showEditorForCreate = true; } void Fire(Person person) { people.Remove(person); } void Edit(Person person) { // Don't edit this object directly - we don't want to propagate edits // when the user cancels this.person = new Person(person); editIndex = people.IndexOf(person); showEditorForEdit = true; } void CloseEditor() { showEditorForCreate = false; showEditorForEdit = false; editIndex = null; person = null; StateHasChanged(); } void OnConfirm() { if (showEditorForCreate) { people.Add(person); } else { people[editIndex.Value] = person; } CloseEditor(); StateHasChanged(); } } ================================================ FILE: samples/HXML/checkstyle.hxml ================================================ buildGlobal.hxml -lib mcover:2.1.1 -D unittest -x TestMain --macro mcover.MCover.coverage(['checkstyle'], ['src'], ['checkstyle.reporter', 'checkstyle.Main']) --next -cmd neko run -s src -s test -p resources/static-analysis.txt -cmd neko run --default-config resources/default-config.json -cmd neko run -c resources/default-config.json ================================================ FILE: samples/HXML/vshaxe.hxml ================================================ # This file is generated with vshaxe-build - DO NOT EDIT MANUALLY! -cp vscode-extern/src -cp src-api -cp src -cp server/src -cp server/protocol/src -cp server/formatter/src -cp server/test -cp server/formatter/test -cp syntaxes/src -D analyzer-optimize -D js_unflatten -D hxnodejs-no-version-warning -D JSTACK_MAIN=vshaxe.Main.main -D JSTACK_ASYNC_ENTRY -D JSTACK_FORMAT=vscode -lib hxnodejs -lib jstack -lib haxe-hxparser -lib compiletime -lib mockatoo -lib mconsole -lib hx3compat -lib hxargs -lib json2object -lib yaml -lib plist -debug -js bin/build.js --no-inline -main Build ================================================ FILE: samples/Hack/Assert.hh ================================================ ( (function(mixed): T) $fn, mixed $x, ): array { if (is_array($x)) { return array_map($fn, $x); } throw new AssertException('Expected an array'); } } ================================================ FILE: samples/Hack/AssertRecipe.hh ================================================ > protected function getDescription(): ?string { return 'When you have values with unknown types, it is useful to make '. 'some runtime assertions and have the type checker understand. This '. 'recipe demonstrates one approach.'; } protected function getFilenames(): Vector { return Vector { 'Assert.php', }; } protected function getDocs(): Vector<(string, string)> { return Vector{ tuple ('Mixed Types', 'hack.annotations.mixedtypes'), tuple ('Type Inference', 'hack.otherrulesandfeatures.typeinference'), }; } public function getDemoFilename(): string { return 'demo.php'; } public function getDemoResult(): string { return assert_main(); } public function getDemoXHP(): ?:xhp { return null; } } ================================================ FILE: samples/Hack/Controller.hh ================================================ ; abstract protected function getJS(): Set; abstract protected function getTitle(): string; abstract protected function render(): :xhp; final protected function getHead(): :xhp { $css = $this->getCSS()->toVector()->map( ($css) ==> ); $js = $this->getJS()->toVector()->map( ($js) ==> " ], "description": "Create " ], "description": "Create @for(var resource : assetHelper().bundle("sentry").getAssets().getJs()) @endfor @for(var resource : assetHelper().bundle("globals").getAssets().getJs()) @endfor $unsafe{renderedBody} @for(var file : getScriptFiles()) @endfor @for(var file : getDeferScriptFiles()) <%-- Defer to ensure it runs *after* globals have loaded --%> @endfor @for(var script : getInlineScripts()) ${script} @endfor @for(var file : getBundleFiles()) @for(var resource : assetHelper().bundle(file).getAssets().getJs()) @endfor @endfor ================================================ FILE: samples/JavaScript/axios.es ================================================ import axios from "axios"; export default { async getIndex(prefix) { const {data} = await axios.get((prefix || "") + "/index.json"); return data; }, async getContent(path, prefix) { const {data} = await axios.get((prefix || "") + "/" + path + ".json"); return data; } } ================================================ FILE: samples/JavaScript/bootstrap-modal.js ================================================ /* ========================================================= * bootstrap-modal.js v2.0.4 * http://twitter.github.com/bootstrap/javascript.html#modals * ========================================================= * Copyright 2012 Twitter, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * ========================================================= */ !function ($) { "use strict"; // jshint ;_; /* MODAL CLASS DEFINITION * ====================== */ var Modal = function (content, options) { this.options = options this.$element = $(content) .delegate('[data-dismiss="modal"]', 'click.dismiss.modal', $.proxy(this.hide, this)) } Modal.prototype = { constructor: Modal , toggle: function () { return this[!this.isShown ? 'show' : 'hide']() } , show: function () { var that = this , e = $.Event('show') this.$element.trigger(e) if (this.isShown || e.isDefaultPrevented()) return $('body').addClass('modal-open') this.isShown = true escape.call(this) backdrop.call(this, function () { var transition = $.support.transition && that.$element.hasClass('fade') if (!that.$element.parent().length) { that.$element.appendTo(document.body) //don't move modals dom position } that.$element .show() if (transition) { that.$element[0].offsetWidth // force reflow } that.$element.addClass('in') transition ? that.$element.one($.support.transition.end, function () { that.$element.trigger('shown') }) : that.$element.trigger('shown') }) } , hide: function (e) { e && e.preventDefault() var that = this e = $.Event('hide') this.$element.trigger(e) if (!this.isShown || e.isDefaultPrevented()) return this.isShown = false $('body').removeClass('modal-open') escape.call(this) this.$element.removeClass('in') $.support.transition && this.$element.hasClass('fade') ? hideWithTransition.call(this) : hideModal.call(this) } } /* MODAL PRIVATE METHODS * ===================== */ function hideWithTransition() { var that = this , timeout = setTimeout(function () { that.$element.off($.support.transition.end) hideModal.call(that) }, 500) this.$element.one($.support.transition.end, function () { clearTimeout(timeout) hideModal.call(that) }) } function hideModal(that) { this.$element .hide() .trigger('hidden') backdrop.call(this) } function backdrop(callback) { var that = this , animate = this.$element.hasClass('fade') ? 'fade' : '' if (this.isShown && this.options.backdrop) { var doAnimate = $.support.transition && animate this.$backdrop = $('