diff --git a/.github/FUNDING.yml b/.github/FUNDING.yml deleted file mode 100644 index 8a800e1..0000000 --- a/.github/FUNDING.yml +++ /dev/null @@ -1,2 +0,0 @@ -github: niwinz -patreon: niwinz diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 4dec440..0000000 --- a/.gitignore +++ /dev/null @@ -1,26 +0,0 @@ -!.yarn/patches -!.yarn/plugins -!.yarn/releases -!.yarn/sdks -!.yarn/versions -*.class -*.jar -.pnp.* -.shadow-cljs -.yarn/* -/*-init.clj -/*-init.clj -/.cpcache -/.lein-* -/.nrepl-port -/.rebel_readline_history -/.shadow-cljs -/checkouts -/classes -/doc/dist -/nashorn_code_cache -/node_modules -/out -/repl -/target -pom.xml.asc \ No newline at end of file diff --git a/.yarnrc.yml b/.yarnrc.yml deleted file mode 100644 index 896c0ee..0000000 --- a/.yarnrc.yml +++ /dev/null @@ -1,9 +0,0 @@ -enableGlobalCache: true - -enableImmutableCache: false - -enableImmutableInstalls: false - -enableTelemetry: false - -nodeLinker: node-modules diff --git a/CHANGES.md b/CHANGES.md deleted file mode 100644 index 93b3207..0000000 --- a/CHANGES.md +++ /dev/null @@ -1,301 +0,0 @@ -# Changelog # - -## Version v2.10 - -- Add the `::rumext.v2/memo` metadata for simplify the common case for memoization -- Add the `::rumext.v2.props/expect` metadata for props checking; it - accepts a set of props for simple existence checkong or map with - predicates for simple type checking -- Add native js destructuring support on props - - -## Version v2.9.3 - -- bugfixes - -## Version v2.9.2 - -- bugfixes - -## Version v2.9.1 - -- bugfixes - - -## Version v2.9 - -- Make the library more lightweight removing unnecesary and duplicated code -- Add the ability to define more react friendly components (for use - outside cljs codebases). -- Add the ability to define lazy loading components -- Make `rumext.v2.compiler/compile-concat` public -- Improve documentation - - -## Version v2.8 - -- Export `React.lazy` as `lazy` helper -- Add `lazy-component` macro that joins react lazy with shadow-cljs - lazy loading - -## Version v2.7 - -- Update to react>=18 - - -## Version v2.6 - -- Bugfixes - - -## Version v2.5 - -- Bugfixes - - -## Version v2.4 - -- Add improve performance of internal css handling - - -## Version v2.3 - -- Minor updates -- Add with-fn macro - -## Version v2.2 - -- Add the ability to destructure js props - -## Version v2.1 - -- Make `use-id` available for react < 18. -- Add `use-equal-memo` hook. -- Add `use-debouce` hook. -- Add experimental `use-ssr-effect`. - -## Version v2.0 - -- Change version numbering: simplified. -- Add v2 namespace that compatible with React18 (still some warnings that will be addressed in next versions) - - -## Version 2022.04.19-148 - -- Fix htmlFor attr handling - - -## Version 2022.04.19-147 - -- Fix empty props handling on `[:&` handler -- Minor optimizations with type hints -- Remove unused code - -## Version 2022.04.19-146 - -- Fix throttle higher-order component - - -## Version 2022.04.19-145 - -- Refactor jsx compiler to extract key before call jsx functions. -- Fix race condition on `rumext.alpha/deref` hook. - - -## Version 2022.04.18-142 - -- Minor fix on throttle and deferred higher-order components - - -## Version 2022.04.18-141 - -- Fix `nil` props handling. - - -## Version 2022.04.18-140 - -- More fixes related to jsx entry point changes. - - -## Version 2022.04.18-139 - -- Fix void elements type `
` (bug introduced in prev version). - -## Version 2022.04.18-138 - -- Revert all react-18 changes (will be released as separated package). -- Bundle simplified hicada compiler with simplier defaults. -- Start using public api of JSX runtime instead of require the private production API. - - -## Version 2022.04.10-141 - -- Fix key warnings. - -## Version 2022.04.08-137 - -- Use proper jsx runtime import - - -## Version 2022.04.08-135 - -- Upgrade to react-18 - -## Version 2022.03.31-133 - -- Avoid call internal deref on the deref hook. - -## Version 2022.03.28-131 - -- Make the state return value stable if the state value does not changes. -- Allow use use-var return value on VDOM ref attrs. - - -## Version 2022.01.20.128 - -- Dependencies updates -- Add with-effect hook/macro. -- Add with-memo hook/macro. - -## Version 2021.05.12-1 - -- Fix incompatibilities with hicada 0.1.9 - -## Version 2021.05.12-0 - -- Fix bug in `adapt` with keywords. -- Update hicada to 0.1.9 - -## Version 2021.01.26-0 - -- Add `check-props` helper. - - -## Version 2020.11.27-0 - -- Add `::mf/forward-ref` metadata and support for multiple arguments for components. - - -## Version 2020.10.14-1 - -- Fix issues in previous release. - - -## Version 2020.10.14-0 - -- Fix minor issues on previous version related - to the optimized `create-element` function. - - -## Version 2020.10.06-0 - -- Add highly optimized version of create-element. -- Properly memoize result of use-var. -- Update deps. - - -## Version 2020.08.21-0 - -- Add `:rumext.alpha/register` and `:rumext.alpha/register-as` component metadata for automatically - register the component on some atom. - - -## Version 2020.05.22-1 - -- Bugfixes. - -## Version 2020.05.22-0 - -- Add context api. -- Fix a memory leak warning on throttle higher-order component. - - -## Version 2020.05.04-0 - -- Do not reverse wrappers. -- Minor performance optimizations. -- Add throttle higher-order component. -- Add deferred higher-order component. -- Update documentation. -- Change license to MPL 2.0. - - -## Version 2020.04.14-1 - -- Revert microtask changes. - - -## Version 2020.04.14-0 - -- Schedule a microtask for adding watcher in `deref` hook. -- Properly return value on use-var hook impl functions. - - -## Version 2020.04.11-0 - -- Use `Symbol` instead of `gensym` on `deref` (faster and more - compatible with `funcool/okulary`). -- Expose `Profiler`. -- Remove hydrante function. - - -## Version 2020.04.08-1 - -- Fix component naming issues when wrap is used. - - -## Version 2020.04.02-3 - -- Fix bugs with Fragments. - - -## Version 2020.04.02-2 - -- Fix bugs on catch higher-order component. - - -## Version 2020.04.02-1 - -- Fix bugs on use-memo and use-callback. -- Fix bugs on catch higher-order component. - - -## Version 2020.04.01-3 - -- Simplify `defc` and `fnc` macros. -- Add `catch` higher-order error boundary component. -- Rename `memo` to `memo'`. -- Rename `wrap-memo` to `memo`. -- Keep `wrap-memo` as backward compatible alias. - - - -## Version 2020.04.01-2 - -- Add `rumext.alpha/memo` as a raw variant of `wrap-memo`. - - -## Version 2020.04.01-1 - -- Add `fnc` macro for define anonymous components (useful for define - higher-order components). -- Depend directrly from react and react-dom from npm. No more cljsjs packages. -- Add printability for Symbol. - - -## Version 2020.03.24 - -- Refactor hooks (make they almost 0 runtime cost). -- Remove all old obsolete code. -- Remove macros for define class based components. -- Many performance improvements and code simplification. - - -## Version 2020.03.23 - -- Complete rewrite. - - -## Version 1.0.0 - -- Initial release. diff --git a/LICENSE b/LICENSE deleted file mode 100644 index a612ad9..0000000 --- a/LICENSE +++ /dev/null @@ -1,373 +0,0 @@ -Mozilla Public License Version 2.0 -================================== - -1. Definitions --------------- - -1.1. "Contributor" - means each individual or legal entity that creates, contributes to - the creation of, or owns Covered Software. - -1.2. "Contributor Version" - means the combination of the Contributions of others (if any) used - by a Contributor and that particular Contributor's Contribution. - -1.3. "Contribution" - means Covered Software of a particular Contributor. - -1.4. "Covered Software" - means Source Code Form to which the initial Contributor has attached - the notice in Exhibit A, the Executable Form of such Source Code - Form, and Modifications of such Source Code Form, in each case - including portions thereof. - -1.5. "Incompatible With Secondary Licenses" - means - - (a) that the initial Contributor has attached the notice described - in Exhibit B to the Covered Software; or - - (b) that the Covered Software was made available under the terms of - version 1.1 or earlier of the License, but not also under the - terms of a Secondary License. - -1.6. "Executable Form" - means any form of the work other than Source Code Form. - -1.7. "Larger Work" - means a work that combines Covered Software with other material, in - a separate file or files, that is not Covered Software. - -1.8. "License" - means this document. - -1.9. "Licensable" - means having the right to grant, to the maximum extent possible, - whether at the time of the initial grant or subsequently, any and - all of the rights conveyed by this License. - -1.10. "Modifications" - means any of the following: - - (a) any file in Source Code Form that results from an addition to, - deletion from, or modification of the contents of Covered - Software; or - - (b) any new file in Source Code Form that contains any Covered - Software. - -1.11. "Patent Claims" of a Contributor - means any patent claim(s), including without limitation, method, - process, and apparatus claims, in any patent Licensable by such - Contributor that would be infringed, but for the grant of the - License, by the making, using, selling, offering for sale, having - made, import, or transfer of either its Contributions or its - Contributor Version. - -1.12. "Secondary License" - means either the GNU General Public License, Version 2.0, the GNU - Lesser General Public License, Version 2.1, the GNU Affero General - Public License, Version 3.0, or any later versions of those - licenses. - -1.13. "Source Code Form" - means the form of the work preferred for making modifications. - -1.14. "You" (or "Your") - means an individual or a legal entity exercising rights under this - License. For legal entities, "You" includes any entity that - controls, is controlled by, or is under common control with You. For - purposes of this definition, "control" means (a) the power, direct - or indirect, to cause the direction or management of such entity, - whether by contract or otherwise, or (b) ownership of more than - fifty percent (50%) of the outstanding shares or beneficial - ownership of such entity. - -2. License Grants and Conditions --------------------------------- - -2.1. Grants - -Each Contributor hereby grants You a world-wide, royalty-free, -non-exclusive license: - -(a) under intellectual property rights (other than patent or trademark) - Licensable by such Contributor to use, reproduce, make available, - modify, display, perform, distribute, and otherwise exploit its - Contributions, either on an unmodified basis, with Modifications, or - as part of a Larger Work; and - -(b) under Patent Claims of such Contributor to make, use, sell, offer - for sale, have made, import, and otherwise transfer either its - Contributions or its Contributor Version. - -2.2. Effective Date - -The licenses granted in Section 2.1 with respect to any Contribution -become effective for each Contribution on the date the Contributor first -distributes such Contribution. - -2.3. Limitations on Grant Scope - -The licenses granted in this Section 2 are the only rights granted under -this License. No additional rights or licenses will be implied from the -distribution or licensing of Covered Software under this License. -Notwithstanding Section 2.1(b) above, no patent license is granted by a -Contributor: - -(a) for any code that a Contributor has removed from Covered Software; - or - -(b) for infringements caused by: (i) Your and any other third party's - modifications of Covered Software, or (ii) the combination of its - Contributions with other software (except as part of its Contributor - Version); or - -(c) under Patent Claims infringed by Covered Software in the absence of - its Contributions. - -This License does not grant any rights in the trademarks, service marks, -or logos of any Contributor (except as may be necessary to comply with -the notice requirements in Section 3.4). - -2.4. Subsequent Licenses - -No Contributor makes additional grants as a result of Your choice to -distribute the Covered Software under a subsequent version of this -License (see Section 10.2) or under the terms of a Secondary License (if -permitted under the terms of Section 3.3). - -2.5. Representation - -Each Contributor represents that the Contributor believes its -Contributions are its original creation(s) or it has sufficient rights -to grant the rights to its Contributions conveyed by this License. - -2.6. Fair Use - -This License is not intended to limit any rights You have under -applicable copyright doctrines of fair use, fair dealing, or other -equivalents. - -2.7. Conditions - -Sections 3.1, 3.2, 3.3, and 3.4 are conditions of the licenses granted -in Section 2.1. - -3. Responsibilities -------------------- - -3.1. Distribution of Source Form - -All distribution of Covered Software in Source Code Form, including any -Modifications that You create or to which You contribute, must be under -the terms of this License. You must inform recipients that the Source -Code Form of the Covered Software is governed by the terms of this -License, and how they can obtain a copy of this License. You may not -attempt to alter or restrict the recipients' rights in the Source Code -Form. - -3.2. Distribution of Executable Form - -If You distribute Covered Software in Executable Form then: - -(a) such Covered Software must also be made available in Source Code - Form, as described in Section 3.1, and You must inform recipients of - the Executable Form how they can obtain a copy of such Source Code - Form by reasonable means in a timely manner, at a charge no more - than the cost of distribution to the recipient; and - -(b) You may distribute such Executable Form under the terms of this - License, or sublicense it under different terms, provided that the - license for the Executable Form does not attempt to limit or alter - the recipients' rights in the Source Code Form under this License. - -3.3. Distribution of a Larger Work - -You may create and distribute a Larger Work under terms of Your choice, -provided that You also comply with the requirements of this License for -the Covered Software. If the Larger Work is a combination of Covered -Software with a work governed by one or more Secondary Licenses, and the -Covered Software is not Incompatible With Secondary Licenses, this -License permits You to additionally distribute such Covered Software -under the terms of such Secondary License(s), so that the recipient of -the Larger Work may, at their option, further distribute the Covered -Software under the terms of either this License or such Secondary -License(s). - -3.4. Notices - -You may not remove or alter the substance of any license notices -(including copyright notices, patent notices, disclaimers of warranty, -or limitations of liability) contained within the Source Code Form of -the Covered Software, except that You may alter any license notices to -the extent required to remedy known factual inaccuracies. - -3.5. Application of Additional Terms - -You may choose to offer, and to charge a fee for, warranty, support, -indemnity or liability obligations to one or more recipients of Covered -Software. However, You may do so only on Your own behalf, and not on -behalf of any Contributor. You must make it absolutely clear that any -such warranty, support, indemnity, or liability obligation is offered by -You alone, and You hereby agree to indemnify every Contributor for any -liability incurred by such Contributor as a result of warranty, support, -indemnity or liability terms You offer. You may include additional -disclaimers of warranty and limitations of liability specific to any -jurisdiction. - -4. Inability to Comply Due to Statute or Regulation ---------------------------------------------------- - -If it is impossible for You to comply with any of the terms of this -License with respect to some or all of the Covered Software due to -statute, judicial order, or regulation then You must: (a) comply with -the terms of this License to the maximum extent possible; and (b) -describe the limitations and the code they affect. Such description must -be placed in a text file included with all distributions of the Covered -Software under this License. Except to the extent prohibited by statute -or regulation, such description must be sufficiently detailed for a -recipient of ordinary skill to be able to understand it. - -5. Termination --------------- - -5.1. The rights granted under this License will terminate automatically -if You fail to comply with any of its terms. However, if You become -compliant, then the rights granted under this License from a particular -Contributor are reinstated (a) provisionally, unless and until such -Contributor explicitly and finally terminates Your grants, and (b) on an -ongoing basis, if such Contributor fails to notify You of the -non-compliance by some reasonable means prior to 60 days after You have -come back into compliance. Moreover, Your grants from a particular -Contributor are reinstated on an ongoing basis if such Contributor -notifies You of the non-compliance by some reasonable means, this is the -first time You have received notice of non-compliance with this License -from such Contributor, and You become compliant prior to 30 days after -Your receipt of the notice. - -5.2. If You initiate litigation against any entity by asserting a patent -infringement claim (excluding declaratory judgment actions, -counter-claims, and cross-claims) alleging that a Contributor Version -directly or indirectly infringes any patent, then the rights granted to -You by any and all Contributors for the Covered Software under Section -2.1 of this License shall terminate. - -5.3. In the event of termination under Sections 5.1 or 5.2 above, all -end user license agreements (excluding distributors and resellers) which -have been validly granted by You or Your distributors under this License -prior to termination shall survive termination. - -************************************************************************ -* * -* 6. Disclaimer of Warranty * -* ------------------------- * -* * -* Covered Software is provided under this License on an "as is" * -* basis, without warranty of any kind, either expressed, implied, or * -* statutory, including, without limitation, warranties that the * -* Covered Software is free of defects, merchantable, fit for a * -* particular purpose or non-infringing. The entire risk as to the * -* quality and performance of the Covered Software is with You. * -* Should any Covered Software prove defective in any respect, You * -* (not any Contributor) assume the cost of any necessary servicing, * -* repair, or correction. This disclaimer of warranty constitutes an * -* essential part of this License. No use of any Covered Software is * -* authorized under this License except under this disclaimer. * -* * -************************************************************************ - -************************************************************************ -* * -* 7. Limitation of Liability * -* -------------------------- * -* * -* Under no circumstances and under no legal theory, whether tort * -* (including negligence), contract, or otherwise, shall any * -* Contributor, or anyone who distributes Covered Software as * -* permitted above, be liable to You for any direct, indirect, * -* special, incidental, or consequential damages of any character * -* including, without limitation, damages for lost profits, loss of * -* goodwill, work stoppage, computer failure or malfunction, or any * -* and all other commercial damages or losses, even if such party * -* shall have been informed of the possibility of such damages. This * -* limitation of liability shall not apply to liability for death or * -* personal injury resulting from such party's negligence to the * -* extent applicable law prohibits such limitation. Some * -* jurisdictions do not allow the exclusion or limitation of * -* incidental or consequential damages, so this exclusion and * -* limitation may not apply to You. * -* * -************************************************************************ - -8. Litigation -------------- - -Any litigation relating to this License may be brought only in the -courts of a jurisdiction where the defendant maintains its principal -place of business and such litigation shall be governed by laws of that -jurisdiction, without reference to its conflict-of-law provisions. -Nothing in this Section shall prevent a party's ability to bring -cross-claims or counter-claims. - -9. Miscellaneous ----------------- - -This License represents the complete agreement concerning the subject -matter hereof. If any provision of this License is held to be -unenforceable, such provision shall be reformed only to the extent -necessary to make it enforceable. Any law or regulation which provides -that the language of a contract shall be construed against the drafter -shall not be used to construe this License against a Contributor. - -10. Versions of the License ---------------------------- - -10.1. New Versions - -Mozilla Foundation is the license steward. Except as provided in Section -10.3, no one other than the license steward has the right to modify or -publish new versions of this License. Each version will be given a -distinguishing version number. - -10.2. Effect of New Versions - -You may distribute the Covered Software under the terms of the version -of the License under which You originally received the Covered Software, -or under the terms of any subsequent version published by the license -steward. - -10.3. Modified Versions - -If you create software not governed by this License, and you want to -create a new license for such software, you may create and use a -modified version of this License if you rename the license and remove -any references to the name of the license steward (except to note that -such modified license differs from this License). - -10.4. Distributing Source Code Form that is Incompatible With Secondary -Licenses - -If You choose to distribute Source Code Form that is Incompatible With -Secondary Licenses under the terms of this version of the License, the -notice described in Exhibit B of this License must be attached. - -Exhibit A - Source Code Form License Notice -------------------------------------------- - - 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/. - -If it is not possible or desirable to put the notice in a particular -file, then You may include the notice in a location (such as a LICENSE -file in a relevant directory) where a recipient would be likely to look -for such a notice. - -You may add additional accurate notices of copyright ownership. - -Exhibit B - "Incompatible With Secondary Licenses" Notice ---------------------------------------------------------- - - This Source Code Form is "Incompatible With Secondary Licenses", as - defined by the Mozilla Public License, v. 2.0. diff --git a/README.md b/README.md deleted file mode 100644 index 885cece..0000000 --- a/README.md +++ /dev/null @@ -1,738 +0,0 @@ -# rumext - -Simple and Decomplected UI library based on React >= 18 focused on performance. - -## Installation - -Add to `deps.edn`: - -```clojure -funcool/rumext -{:git/tag "v2.21" - :git/sha "072d671" - :git/url "https://github.com/funcool/rumext.git"} -``` - -## User Guide - -Rumext is a tool to build a web UI in ClojureScript. - -It's a thin wrapper on [React](https://react.dev/) >= 18, focused on -performance and offering a Clojure-idiomatic interface. - -**API Reference**: http://funcool.github.io/rumext/latest/ - - -It uses Clojure macros to achieve the same goal as [JSX -format](https://react.dev/learn/writing-markup-with-jsx) without using anything -but the plain Clojure syntax. The HTML is expressed in a format inspired -in [hiccup library](https://github.com/weavejester/hiccup), but with its own -implementation. - -HTML code is represented as nested arrays with keywords for tags and -attributes. Example: - -```clojure -[:div {:class "foobar" - :style {:background-color "red"} - :on-click some-on-click-fn} - "Hello World"] -``` - -Macros are smart enough to transform attribute names from `lisp-case` -to `camelCase` and renaming `:class` to `className`. So the compiled javacript -code for this fragment could be something like: - -```js -React.createElement("div", - {className: "foobar", - style: {"backgroundColor": "red"}, - onClick: someOnClickFn}, - "Hello World"); -``` - -And this is what will be rendered when the app is loaded in a browser: - -```html -
- Hello World -
-``` - -**WARNING**: it is mainly implemented to be used in -[Penpot](https://github.com/penpot/penpot) and released as separated project -for conveniendce. Don't expect compromise for backwards compatibility beyond -what the penpot project needs. - -### Instantiating elements and custom components - -#### Passing props - -As seen above, when using the [Hiccup-like](https://github.com/weavejester/hiccup) -syntax, you can create a HTML element with a keyword like `:div`, `:span` or -`:p`. You can also specify a map of attributes, that are converted at compile -time into a Javascript object. - -**IMPORTANT**: a Javascript plain object is different from a Clojure plain map. -In ClojureScript you can handle mutable JS objects with a specific API, and -convert forth and back to Clojure maps. You can learn more about it in -[ClojureScript Unraveled](https://funcool.github.io/clojurescript-unraveled/#javascript-objects) -book. - -Rumext macros have some features to pass properties in a more convenient and -Clojure idiomatic way. For example, when using the `[:div {...}]` syntax, you -do not need to add the `#js` prefix, it's added automatically. There are also -some automatic transformations of property names: - - * Names in `lisp-case` are transformed to `camelCase`. - * Reserved names like `class` are transformed to React convention, like - `className`. - * Names already in `camelCase` are passed directly without transform. - * Properties that begin with `data-` and `aria-` are also passed directly. - * Transforms are applied only to `:keyword` properties. You can also send - string properties, that are not processed anyway. - -It's important to notice that this transformations are performed at compile time, -having no impact in runtime performance. - - -#### Dynamic element names and attributes - -There are times when we'll need the element name to be chosen dynamically or -constructed at runtime; the props to be built dynamically or created as an -element from a user-defined component. - -For this purpose, Rumext exposes a special macro: `:>`, a general-purpose -handler for passing dynamically defined props to DOM native elements or -creating elements from user-defined components. - -To define the element dynamically, just pass a variable with the name as a -first parameter of `:>`. - -```clojure -(let [element (if something "div" "span")] - [:> element {:class "foobar" - :style {:background-color "red"} - :on-click some-on-click-fn} - "Hello World"]) -``` - -To give a dynamic map of properties, you may also give a variable as a -second parameter: - -```clojure -(let [props #js {:className "fooBar" - :style #js {:backgroundColor "red"} - :onClick some-on-click}] - [:> "div" props - "Hello World"]) -``` - -**IMPORTANT** if you define the attributes dynamically, outside the `:>` macro, -there are no automatic transformations. So you need to define the map as a -plain Javascript object with the `#js` prefix or any other way. You also need -to use `camelCase` names and remember to use `className` instead of `class`, -for example. - -There are a couple of utilities for managing dynamic attributes in a more -convenient way. - - -##### `mf/spread-props` - -Or shorter alias: `mf/spread` - -A macro that allows performing a merge between two props data structures using -the JS spread operator (`{...props1, ...props2}`). This macro also performs -name transformations if you pass a literal map as a second parameter. - -It is commonly used this way: - -```clojure -(mf/defc my-label* - [{:keys [name class on-click] :rest props}] - (let [class (or class "my-label") - props (mf/spread-props props {:class class})] - [:span {:on-click on-click} - [:> :label props name]])) -``` - -Very similar to `mf/spread-props` but without react flavored props -transformations you have the `mf/spread-object`. - -In both cases, if both arguments are symbols, no transformation -can be applied because is unknown the structure at compile time. - - -##### `mf/props` - -A helper macro to create a Javascript props object from a Clojure map, -applying name transformations. - -An example of how it can be used and combined with `mf/spread-props`: - -```clojure -(mf/defc my-label* - [{:keys [name class on-click] :rest props}] - (let [class (or class "my-label") - new-props (mf/props {:class class}) - all-props (mf/spread-props props new-props)] - [:span {:on-click on-click} - [:> :label props name]])) -``` - - -##### `mf/object` - -A helper macro for create javascript objects from clojure literals. It works recursiverlly. - -```clojure -(mf/object {:a [1 2 3]}) - -;; Is analogous to -#js {:a #js [1 2 3]} -``` - - -##### `mfu/map->props` - -In some cases you will need to make props from a dynamic Clojure -object. You can use `mf/map->props` function for it, but be aware that -it makes the conversion to Javascript and the names transformations in -runtime, so it adds some overhead in each render. Consider not using -it if performance is important. - -```clojure -(require '[rumext.v2.utils :as mfu]) - -(let [clj-props {:class "my-label"} - props (mfu/map->props clj-props)] - [:> :label props name]) -``` - -##### `mfu/bean` - -A helper that allows create a proxy object from javascript object that -has the same semantics as clojure map and clojure vectors. Allows -handle clojure and javascript parameters in a transparent way. - -```clojure -(require '[rumext.v2.utils :as mfu]) - -(mf/defc my-select* - [{:keys [options] :rest props}] - (let [options (mfu/bean options) - ;; from here, options looks like a clojure vector - ;; independently if it passed as clojure vector - ;; or js array. - ] - [:select ...])) -``` - -#### Instantiating a custom component - -You can pass to `:>` macro the name of a custom component (see [below](#creating-a-react-custom-component)) -to create an instance of it: - -```clojure -(mf/defc my-label* - [{:keys [name class on-click] :rest props}] - [:span {:on-click on-click} - [:> :label props name]]) - -(mf/defc other-component* - [] - [:> my-label* {:name "foobar" :on-click some-fn}]) -``` - -### Creating a React custom component - -The `defc` macro is the basic block of a Rumext UI. It's a lightweight utility -that generates a React **function component** and adds some adaptations for it -to be more convenient to ClojureScript code, like `camelCase` conversions and -reserved name changes as explained [above](#passing-props). - -For example, this defines a React component: - -```clojure -(require '[rumext.v2 :as mf]) - -(mf/defc title* - [{:keys [label-text] :as props}] - [:div {:class "title"} label-text]) -``` - -The compiled javascript for this block will be similar to what would be -obtained for this JSX block: - -```js -function title({labelText}) { - return ( -
- {labelText} -
- ); -} -``` - -**NOTE**: the `*` in the component name is a mandatory convention for proper -visual distinction of React components and Clojure functions. It also enables -the current defaults on how props are handled. If you don't use the `*` suffix, -the component will behave in legacy mode (see the [FAQs](#faq) below). - -The component created this way can be mounted onto the DOM: - -```clojure -(ns myname.space - (:require - [goog.dom :as dom] - [rumext.v2 :as mf])) - -(def root (mf/create-root (dom/getElement "app"))) -(mf/render! root (mf/html [:> title* {:label-text "hello world"}])) -``` - -Or you can use `mf/element`, but in this case you need to give the -attributes in the raw Javascript form, because this macro does not have -automatic conversions: - -```clojure -(ns myname.space - (:require - [goog.dom :as dom] - [rumext.v2 :as mf])) - -(def root (mf/create-root (dom/getElement "app"))) -(mf/render! root (mf/element title* #js {:labelText "hello world"})) -``` - -### Reading component props & destructuring - -When React instantiates a function component, it passes a `props` parameter -that is a map of the names and values of the attributes defined in the calling -point. - -Normally, Javascript objects cannot be destructured. But the `defc` macro -implements a destructuring functionality, that is similar to what you can do -with Clojure maps, but with small differences and convenient enhancements for -making working with React props and idioms easy, like `camelCase` conversions -as explained [above](#passing-props). - -```clojure -(mf/defc title* - [{:keys [title-name] :as props}] - (assert (object? props) "expected object") - (assert (string? title-name) "expected string") - [:label {:class "label"} title-name]) -``` - -If the component is called via the `[:>` macro (explained [above](#dynamic-element-names-and-attributes)), -there will be two compile-time conversion, one when calling and another one when -destructuring. In the Clojure code all names will be `lisp-case`, but if you -inspect the generated Javascript code, you will see names in `camelCase`. - -#### Default values - -Also like usual destructuring, you can give default values to properties by -using the `:or` construct: - -```clojure -(mf/defc color-input* - [{:keys [value select-on-focus] :or {select-on-focus true} :as props}] - ...) -``` - -#### Rest props - -An additional idiom (specific to the Rumext component macro and not available -in standard Clojure destructuring) is the ability to obtain an object with all -non-destructured props with the `:rest` construct. This allows to extract the -props that the component has control of and leave the rest in an object that -can be passed as-is to the next element. - -```clojure -(mf/defc title* - [{:keys [name] :rest props}] - (assert (object? props) "expected object") - (assert (nil? (unchecked-get props "name")) "no name in props") - - ;; See below for the meaning of `:>` - [:> :label props name]) -``` - -#### Reading props without destructuring - -Of course the destructure is optional. You can receive the complete `props` -argument and read the properties later. But in this case you will not have -the automatic conversions: - -```clojure -(mf/defc color-input* - [props] - (let [value (unchecked-get props "value") - on-change (unchecked-get props "onChange") - on-blur (unchecked-get props "onBlur") - on-focus (unchecked-get props "onFocus") - select-on-focus? (or (unchecked-get props "selectOnFocus") true) - class (or (unchecked-get props "className") "color-input") -``` - -The recommended way of reading `props` javascript objects is by using the -Clojurescript core function `unchecked-get`. This is directly translated to -Javascript `props["propName"]`. As Rumext is performance oriented, this is the -most efficient way of reading props for the general case. Other methods like -`obj/get` in Google Closure Library add extra safety checks, but in this case -it's not necessary since the `props` attribute is guaranteed by React to have a -value, although it can be an empty object. - -#### Forwarding references - -In React there is a mechanism to set a reference to the rendered DOM element, if -you need to manipulate it later. Also it's possible that a component may receive -this reference and gives it to a inner element. This is called "forward referencing" -and to do it in Rumext, you need to add the `forward-ref` metadata. Then, the -reference will come in a second argument to the `defc` macro: - -```clojure -(mf/defc wrapped-input* - {::mf/forward-ref true} - [props ref] - (let [...] - [:input {:style {...} - :ref ref - ...}])) -``` - -In React 19 this will not be necessary, since you will be able to pass the ref -directly inside `props`. But Rumext currently only support React 18. - -### Props Checking - -The Rumext library comes with two approaches for checking props: -**simple** and **malli**. - -Let's start with the **simple**, which consists of simple existence checks or -plain predicate checking. For this, we have the `mf/expect` macro that receives -a Clojure set and throws an exception if any of the props in the set has not -been given to the component: - -```clojure -(mf/defc button* - {::mf/expect #{:name :on-click}} - [{:keys [name on-click]}] - [:button {:on-click on-click} name]) -``` - -The prop names obey the same rules as the destructuring so you should use the -same names. - -Sometimes a simple existence check is not enough; for those cases, you can give -`mf/expect` a map where keys are props and values are predicates: - -```clojure -(mf/defc button* - {::mf/expect {:name string? - :on-click fn?}} - [{:keys [name on-click]}] - [:button {:on-click on-click} name]) -``` - -If that is not enough, you can use `mf/schema` macro that supports -**[malli](https://github.com/metosin/malli)** schemas as a validation -mechanism for props: - -```clojure -(def ^:private schema:props - [:map {:title "button:props"} - [:name string?] - [:class {:optional true} string?] - [:on-click fn?]]) - -(mf/defc button* - {::mf/schema schema:props} - [{:keys [name on-click]}] - [:button {:on-click on-click} name]) -``` - -**IMPORTANT**: The props checking obeys the `:elide-asserts` compiler -option and by default, they will be removed in production builds if -the configuration value is not changed explicitly. - -### Hooks - -You can use React hooks as is, as they are exposed by Rumext as -`mf/xxx` wrapper functions. Additionaly, Rumext offers several -specific hooks that adapt React ones to have a more Clojure idiomatic -interface. - -You can use both one and the other interchangeably, depending on which -type of API you feel most comfortable with. The React hooks are exposed -as they are in React, with the function name in `camelCase`, and the -Rumext hooks use the `lisp-case` syntax. - -Only a subset of available hooks is documented here; please refer to -the [React API reference -documentation](https://react.dev/reference/react/hooks) for detailed -information about available hooks. - -#### `use-state` - -This is analogous to the `React.useState`. It offers the same -functionality but uses the ClojureScript atom interface. - -Calling `mf/use-state` returns an atom-like object that will deref to -the current value, and you can call `swap!` and `reset!` on it to -modify its state. The returned object always has a stable reference -(no changes between rerenders). - -Any mutation will schedule the component to be rerendered. - -```clojure -(require '[rumext.v2 as mf]) - -(mf/defc local-state* - [props] - (let [clicks (mf/use-state 0)] - [:div {:on-click #(swap! clicks inc)} - [:span "Clicks: " @clicks]])) -``` - -This is functionally equivalent to using the React hook directly: - -```clojure -(mf/defc local-state* - [props] - (let [[counter update-counter] (mf/useState 0)] - [:div {:on-click (partial update-counter #(inc %))} - [:span "Clicks: " counter]])) -``` - -#### `use-var` - -In the same way as `use-state` returns an atom-like object. The unique -difference is that updating the ref value does not schedule the -component to rerender. Under the hood, it uses the `useRef` hook. - -**DEPRECATED:** should not be used - -#### `use-effect` - -Analogous to the `React.useEffect` hook with a minimal call convention -change (the order of arguments is inverted). - -This is a primitive that allows incorporating probably effectful code -into a functional component: - -```clojure -(mf/defc local-timer* - [props] - (let [local (mf/use-state 0)] - (mf/use-effect - (fn [] - (let [sem (js/setInterval #(swap! local inc) 1000)] - #(js/clearInterval sem)))) - [:div "Counter: " @local])) -``` - -The `use-effect` is a two-arity function. If you pass a single -callback function, it acts as though there are no dependencies, so the -callback will be executed once per component (analogous to `didMount` -and `willUnmount`). - -If you want to pass dependencies, you have two ways: - -- passing a JS array as a first argument (like in React but with - inverted order). -- using the `rumext.v2/deps` helper: - -```clojure -(mf/use-effect - (mf/deps x y) - (fn [] (do-stuff x y))) -``` - -And finally, if you want to execute it on each render, pass `nil` as -deps (much in the same way as raw `useEffect` works). - -For convenience, there is an `mf/with-effect` macro that drops one -level of indentation: - -```clojure -(mf/defc local-timer* - [props] - (let [local (mf/use-state 0)] - (mf/with-effect [] - (let [sem (js/setInterval #(swap! local inc) 1000)] - #(js/clearInterval sem))) - [:div "Counter: " @local])) -``` - -Here, the deps must be passed as elements within the vector (the first -argument). - -Obviously, you can also use the React hook directly via `mf/useEffect`. - -#### `use-memo` - -In the same line as the `use-effect`, this hook is analogous to the -React `useMemo` hook with the order of arguments inverted. - -The purpose of this hook is to return a memoized value. - -Example: - -```clojure -(mf/defc sample-component* - [{:keys [x]}] - (let [v (mf/use-memo (mf/deps x) #(pow x 10))] - [:span "Value is: " v])) -``` - -On each render, while `x` has the same value, the `v` only will be -calculated once. - -This also can be expressed with the `rumext.v2/with-memo` macro that -removes a level of indentation: - -```clojure -(mf/defc sample-component* - [{:keys [x]}] - (let [v (mf/with-memo [x] - (pow x 10))] - [:span "Value is: " v])) -``` - -#### `use-fn` - -Is a special case of `use-memo`in that the memoized value is a -function definition. - -An alias for `use-callback`, that is a wrapper on `React.useCallback`. - -#### `deref` - -A Rumext custom hook that adds reactivity to atom changes to the -component. Calling `mf/deref` returns the same value as the Clojure -`deref`, but also sets a component rerender when the value changes. - -Example: - -```clojure -(def clock (atom (.getTime (js/Date.)))) -(js/setInterval #(reset! clock (.getTime (js/Date.))) 160) - -(mf/defc timer* - [props] - (let [ts (mf/deref clock)] - [:div "Timer (deref): " - [:span ts]])) -``` - -Internally, it uses the `react.useSyncExternalStore` API together with -the ability of atom to watch it. - -### Higher-Order Components - -React allows to create a component that adapts or wraps another component -to extend it and add additional functionality. Rumext includes a convenient -mechanism for doing it: the `::mf/wrap` metadata. - -Currently Rumext exposes one such component: - -- `mf/memo`: analogous to `React.memo`, adds memoization to the - component based on props comparison. This allows to completely - avoid execution to the component function if props have not changed. - -```clojure -(mf/defc title* - {::mf/wrap [mf/memo]} - [{:keys [name]}] - [:div {:class "label"} name]) -``` - -By default, the `identical?` predicate is used to compare props; you -can pass a custom comparator function as a second argument: - -```clojure -(mf/defc title* - {::mf/wrap [#(mf/memo % =)]} - [{:keys [name]}] - [:div {:class "label"} name]) -``` - -For more convenience, Rumext has a special metadata `::mf/memo` that -facilitates the general case for component props memoization. If you -pass `true`, it will behave the same way as `::mf/wrap [mf/memo]` or -`React.memo(Component)`. You also can pass a set of fields; in this -case, it will create a specific function for testing the equality of -that set of props. - -If you want to create your own higher-order component, you can use the -`mf/fnc` macro: - -```clojure -(defn some-factory - [component param] - (mf/fnc my-high-order-component* - [props] - [:section - [:> component props]])) -``` - -### FAQ - -#### Differences with RUM - -This project was originated as a friendly fork of -[rum](https://github.com/tonsky/rum) for a personal use but it later -evolved to be a completly independent library that right now does not -depend on it and probably no longer preserves any of the original -code. In any case, many thanks to Tonksy for creating rum. - -This is the list of the main differences: - -- use function based components instead of class based components. -- a clojurescript friendly abstractions for React Hooks. -- the component body is compiled statically (never interprets at - runtime thanks to **hicada**). -- performance focused, with a goal to offer almost 0 runtime - overhead on top of React. - - -#### Why the import alias is `mf` in the examples? - -The usual convention of importing RUM project was to use `rum/defc` or -`m/defc`. For Rumext the most straightforward abbreviation would have been -`mx/defc`. But that preffix was already use for something else. So finally we -choose `mf/defc`. But this is not mandatory, it's only a convention we follow -in this manual and in Penpot. - - -#### What is the legacy mode? - -In earlier versions of Rumext, components had a default behavior of -automatically converting the `props` Javascript object coming from -React to a Clojure object, so it could be read by normal destructuring -or any other way of reading objects. - -Additionally you could use `:&` handler instead of `:>` to give a -Clojure object that was converted into Javascript for passing it to -React. - -But both kind of transformations were done in runtime, thus adding -the conversion overhead to each render of the compoennt. Since Rumex -is optimized for performance, this behavior is now deprecated. With -the macro destructuring and other utilities explained above, you can -do argument passing almost so conveniently, but with all changes done -in compile time. - -Currently, components whose name does not use `*` as a suffix behave -in legacy mode. You can activate the new behavior by adding the -`::mf/props :obj` metadata, but all this is considered deprecated now. -All new components should use `*` in the name. - -## License - -Licensed under MPL-2.0 (see [LICENSE](LICENSE) file on the root of the repository) diff --git a/build.clj b/build.clj deleted file mode 100644 index 49c9b1a..0000000 --- a/build.clj +++ /dev/null @@ -1,37 +0,0 @@ -(ns build - (:refer-clojure :exclude [compile]) - (:require [clojure.tools.build.api :as b])) - -(def lib 'funcool/rumext) -(def version (format "v2-%s" (b/git-count-revs nil))) -(def class-dir "target/classes") -(def basis (b/create-basis {:project "deps.edn"})) -(def jar-file (format "target/%s-%s.jar" (name lib) version)) - -(defn clean [_] - (b/delete {:path "target"})) - -(defn jar [_] - (b/write-pom - {:class-dir class-dir - :lib lib - :version version - :basis basis - :src-dirs ["src"]}) - - (b/copy-dir - {:src-dirs ["src" "resources"] - :target-dir class-dir}) - - (b/jar - {:class-dir class-dir - :jar-file jar-file})) - -(defn clojars [_] - (b/process - {:command-args ["mvn" - "deploy:deploy-file" - (str "-Dfile=" jar-file) - "-DpomFile=target/classes/META-INF/maven/funcool/rumext/pom.xml" - "-DrepositoryId=clojars" - "-Durl=https://clojars.org/repo/"]})) diff --git a/deps.edn b/deps.edn deleted file mode 100644 index 840f4f0..0000000 --- a/deps.edn +++ /dev/null @@ -1,37 +0,0 @@ -{:deps {metosin/malli {:mvn/version "0.16.0"} - funcool/cuerdas {:mvn/version "2023.11.09-407"} - cljs-bean/cljs-bean {:mvn/version "1.9.0"}} - :paths ["src"] - :aliases - {:dev - {:extra-paths ["examples" "target" "test"] - :extra-deps - {com.bhauman/rebel-readline {:mvn/version "RELEASE"} - funcool/okulary {:mvn/version "RELEASE"} - thheller/shadow-cljs {:mvn/version "RELEASE"} - org.clojure/tools.namespace {:mvn/version "RELEASE"} - org.clojure/test.check {:mvn/version "RELEASE"} - org.clojure/clojure {:mvn/version "RELEASE"} - }} - - :codox - {:extra-deps - {codox/codox {:mvn/version "RELEASE"} - org.clojure/tools.reader {:mvn/version "RELEASE"} - codox-theme-rdash/codox-theme-rdash {:mvn/version "RELEASE"}}} - - :shadow-cljs - {:main-opts ["-m" "shadow.cljs.devtools.cli"] - :jvm-opts ["--sun-misc-unsafe-memory-access=allow"]} - - :repl - {:main-opts ["-m" "rebel-readline.main"]} - - :outdated - {:extra-deps {com.github.liquidz/antq {:mvn/version "RELEASE"} - org.slf4j/slf4j-nop {:mvn/version "RELEASE"}} - :main-opts ["-m" "antq.core"]} - - :build - {:extra-deps {io.github.clojure/tools.build {:git/tag "v0.10.3" :git/sha "15ead66"}} - :ns-default build}}} diff --git a/doc.clj b/doc.clj deleted file mode 100644 index 4a22bcd..0000000 --- a/doc.clj +++ /dev/null @@ -1,11 +0,0 @@ -(require '[codox.main :as codox]) - -(codox/generate-docs - {:output-path "doc/dist/latest" - :metadata {:doc/format :markdown} - :language :clojurescript - :name "funcool/rumext" - :themes [:rdash] - :source-paths ["src"] - :namespaces [#"^rumext\."] - :source-uri "https://github.com/funcool/rumext/blob/v2/{filepath}#L{line}"}) diff --git a/doc/Makefile b/doc/Makefile deleted file mode 100644 index e476300..0000000 --- a/doc/Makefile +++ /dev/null @@ -1,9 +0,0 @@ -all: doc - -doc: - mkdir -p dist/latest/ - cd ..; clojure -A:dev:codox -M doc.clj; - -github: doc - ghp-import -m "Generate documentation" -b gh-pages dist/ - git push origin gh-pages diff --git a/doc/notes.txt b/doc/notes.txt deleted file mode 100644 index e1a645d..0000000 --- a/doc/notes.txt +++ /dev/null @@ -1,5 +0,0 @@ -Build browserified bundle: -./node_modules/browserify/bin/cmd.js -s Rx -e dist/cjs/Rx.js -o rx.js - -Minified bundle: -./node_modules/uglify-js/bin/uglifyjs rx.js -m -o rx.min.js diff --git a/examples/public/index.html b/examples/public/index.html deleted file mode 100644 index 6639026..0000000 --- a/examples/public/index.html +++ /dev/null @@ -1,121 +0,0 @@ - - - - - Rum test page - - - - - -
-
Local state
-
-
-
-
-
- -
-
Timers
-
-
-
-
- -
-
Controls
-
-
- -
-
Reactive binary clock
-
-
- -
-
Reactive artboard
-
-
- -
-
Inputs
-
-
- -
-
Refs
-
-
- -
-
Keys
-
-
- -
-
BMI Calculator
-
-
- -
-
Form validation
-
-
- -
-
Self-reference
-
-
- -
-
Contexts
-
-
- -
-
Custom Methods and Data
-
-
- -
-
Multiple Return
-
-
- -
-
Portals
-
-
-
- -
-
Error boundaries
-

Server:

-
- - - diff --git a/examples/rumext/examples/binary_clock.cljs b/examples/rumext/examples/binary_clock.cljs deleted file mode 100644 index dc3cf26..0000000 --- a/examples/rumext/examples/binary_clock.cljs +++ /dev/null @@ -1,100 +0,0 @@ -(ns rumext.examples.binary-clock - (:require - [goog.dom :as dom] - [rumext.v2 :as mf] - [rumext.examples.util :as util])) - -(def *bclock-renders (atom 0)) - -(mf/defc render-count* - [props] - (let [renders (mf/deref *bclock-renders)] - [:div.stats "Renders: " renders])) - -(mf/defc bit* - [{:keys [n b]}] - (mf/with-effect [n b] - (swap! *bclock-renders inc)) - - (let [color (mf/deref util/*color)] - (if (bit-test n b) - [:td.bclock-bit {:style {:background-color color}}] - [:td.bclock-bit {}]))) - -(mf/defc binary-clock* - [] - (let [ts (mf/deref util/*clock) - msec (mod ts 1000) - sec (mod (quot ts 1000) 60) - min (mod (quot ts 60000) 60) - hour (mod (quot ts 3600000) 24) - hh (quot hour 10) - hl (mod hour 10) - mh (quot min 10) - ml (mod min 10) - sh (quot sec 10) - sl (mod sec 10) - msh (quot msec 100) - msm (-> msec (quot 10) (mod 10)) - msl (mod msec 10)] - [:table.bclock - [:tbody - [:tr - [:td] [:> bit* {:n hl :b 3}] [:th] - [:td] [:> bit* {:n ml :b 3}] [:th] - [:td] [:> bit* {:n sl :b 3}] [:th] - [:> bit* {:n msh :b 3}] - [:> bit* {:n msm :b 3}] - [:> bit* {:n msl :b 3}]] - [:tr - [:td] [:> bit* {:n hl :b 2}] [:th] - [:> bit* {:n mh :b 2}] - [:> bit* {:n ml :b 2}] [:th] - [:> bit* {:n sh :b 2}] - [:> bit* {:n sl :b 2}] [:th] - [:> bit* {:n msh :b 2}] - [:> bit* {:n msm :b 2}] - [:> bit* {:n msl :b 2}]] - [:tr - [:> bit* {:n hh :b 1}] - [:> bit* {:n hl :b 1}] [:th] - [:> bit* {:n mh :b 1}] - [:> bit* {:n ml :b 1}] [:th] - [:> bit* {:n sh :b 1}] - [:> bit* {:n sl :b 1}] [:th] - [:> bit* {:n msh :b 1}] - [:> bit* {:n msm :b 1}] - [:> bit* {:n msl :b 1}]] - [:tr - [:> bit* {:n hh :b 0}] - [:> bit* {:n hl :b 0}] [:th] - [:> bit* {:n mh :b 0}] - [:> bit* {:n ml :b 0}] [:th] - [:> bit* {:n sh :b 0}] - [:> bit* {:n sl :b 0}] [:th] - [:> bit* {:n msh :b 0}] - [:> bit* {:n msm :b 0}] - [:> bit* {:n msl :b 0}]] - [:tr - [:th hh] - [:th hl] - [:th] - [:th mh] - [:th ml] - [:th] - [:th sh] - [:th sl] - [:th] - [:th msh] - [:th msm] - [:th msl]] - [:tr - [:th {:col-span 8} - [:> render-count* {}]]]]])) - -(defonce root - (mf/create-root (dom/getElement "binary-clock"))) - -(defn ^:after-load mount! [] - (mf/render! root (mf/element binary-clock*))) - diff --git a/examples/rumext/examples/board.cljs b/examples/rumext/examples/board.cljs deleted file mode 100644 index 5b06651..0000000 --- a/examples/rumext/examples/board.cljs +++ /dev/null @@ -1,41 +0,0 @@ -(ns rumext.examples.board - (:require - [goog.dom :as dom] - [rumext.v2 :as mf] - [rumext.examples.util :as util] - [okulary.core :as l])) - -;; Reactive drawing board - -(def board (atom (util/initial-board))) -(def board-renders (atom 0)) - -(mf/defc cell - [{:keys [x y] :as props}] - (let [ref (mf/with-memo [x y] - (l/derived (l/in [y x]) board)) - cell (mf/deref ref) - color (mf/deref util/*color)] - [:div - {:class "art-cell" - :style {:background-color (when cell color)} - :on-mouse-over (fn [_] (swap! board update-in [y x] not) nil)}])) - -(mf/defc board-reactive - [] - [:div.artboard - (for [y (range 0 util/board-height)] - [:div.art-row {:key y} - (for [x (range 0 util/board-width)] - (let [props #js {:key x :x x :y y}] - ;; this is how one can specify React key for component - [:& cell ^js props]))])]) - -(defonce root - (mf/create-root (dom/getElement "board"))) - -(defn ^:after-load mount! [] - (mf/render! root (mf/element board-reactive)) - (js/setTimeout (fn [] - (mf/render! root (mf/element board-reactive))) - 2000)) diff --git a/examples/rumext/examples/controls.cljs b/examples/rumext/examples/controls.cljs deleted file mode 100644 index 050af9f..0000000 --- a/examples/rumext/examples/controls.cljs +++ /dev/null @@ -1,40 +0,0 @@ -(ns rumext.examples.controls - (:require - [goog.dom :as dom] - [rumext.v2 :as mf] - [rumext.examples.util :as util])) - -(mf/defc input* - [{:keys [color] :as props}] - (let [value (mf/deref color)] - [:input {:type "text" - :value value - :style {:width 100} - :on-change #(reset! color (.. % -target -value))}])) - -;; Raw top-level component, everything interesting is happening inside -(mf/defc controls* - [props] - [:dl - [:dt "Color: "] - [:dd - [:> input* {:color util/*color}]] - ;; Binding another component to the same atom will keep 2 input boxes in sync - [:dt "Clone: "] - [:dd - (mf/jsx input* #js {:color util/*color})] - [:dt "Color: "] - [:dd {} (util/watches-count {:iref util/*color}) " watches"] - - [:dt "Tick: "] - [:dd [:> input* {:color util/*speed}] " ms"] - [:dt "Time:"] - [:dd {} (util/watches-count {:iref util/*clock}) " watches"] - ]) - -(defonce root - (mf/create-root (dom/getElement "controls"))) - -(defn ^:after-load mount! [] - (mf/render! root (mf/element controls*))) - diff --git a/examples/rumext/examples/core.cljs b/examples/rumext/examples/core.cljs deleted file mode 100644 index cb4ed71..0000000 --- a/examples/rumext/examples/core.cljs +++ /dev/null @@ -1,25 +0,0 @@ -(ns rumext.examples.core - (:require - [rumext.examples.binary-clock :as binary-clock] - [rumext.examples.timer-reactive :as timer-reactive] - [rumext.examples.local-state :as local-state] - [rumext.examples.refs :as refs] - [rumext.examples.controls :as controls] - [rumext.examples.portals :as portals] - [rumext.examples.board :as board] - ;; [rumext.examples.errors :as errors] - )) - -(enable-console-print!) - -(local-state/mount!) -(binary-clock/mount!) -(timer-reactive/mount!) -(refs/mount!) -(controls/mount!) -(board/mount!) -(portals/mount!) - -(defn main - [& args] - (js/console.log "main" args)) diff --git a/examples/rumext/examples/errors.cljs b/examples/rumext/examples/errors.cljs deleted file mode 100644 index 7f9d707..0000000 --- a/examples/rumext/examples/errors.cljs +++ /dev/null @@ -1,34 +0,0 @@ -(ns rumext.examples.errors - #_(:require [rumext.core :as mx])) - -;; (mx/defc faulty-render -;; [msg] -;; (throw (ex-info msg {}))) - - -;; (mx/defc faulty-mount -;; {:did-mount -;; (fn [state] -;; (let [[msg] (::mx/args state)] -;; (throw (ex-info msg {}))))} -;; [msg] -;; "Some test you’ll never see") - - -;; (mx/defcs child-error -;; {:did-catch -;; (fn [state error info] -;; (assoc state ::error error))} -;; [{error ::error, c ::mx/react-component} comp msg] -;; (if (some? error) -;; [:span "CAUGHT: " (str error)] -;; [:span "No error: " (comp msg)])) - -;; (mx/defc errors -;; [] -;; [:span -;; (child-error faulty-render "render error") -;; #_(child-error faulty-mount "mount error")]) - -;; (defn mount! [el] -;; (mx/mount (errors) el)) diff --git a/examples/rumext/examples/local_state.cljs b/examples/rumext/examples/local_state.cljs deleted file mode 100644 index ebd7fa2..0000000 --- a/examples/rumext/examples/local_state.cljs +++ /dev/null @@ -1,53 +0,0 @@ -(ns rumext.examples.local-state - (:require - [goog.dom :as dom] - [malli.core :as m] - [rumext.v2 :as mf] - [rumext.v2.util :as mfu] - [rumext.examples.util :as util])) - -(def schema:label - [:map {:title "label:props"} - [:on-click {:optional true} fn?] - [:my-id {:optional true} :keyword] - [:title :string] - [:n number?]]) - -(mf/defc label* - {::mf/memo true - ::mf/schema schema:label} - [{:keys [class title n my-id] :as props :rest others}] - (let [ref (mf/use-var nil) - props (mf/spread-props others {:class (or class "my-label")})] - - (mf/with-effect [] - (reset! ref 1)) - - [:> :div props - [:span title ": " n]])) - -(mf/defc local-state - "test docstring" - {::mf/memo true - ::mf/props :obj} - [{:keys [title]}] - (let [local (mf/use-state - #(-> {:counter1 {:title "Counter 1" - :n 0} - :counter2 {:title "Counter 2" - :n 0}}))] - - [:section {:class "counters" :style {:-webkit-border-radius "10px"}} - [:hr] - (let [{:keys [title n]} (:counter1 @local)] - [:> label* {:n n :my-id "should-be-keyword" :title title :data-foobar 1 :on-click identity :id "foobar"}]) - (let [{:keys [title n]} (:counter2 @local)] - [:> label* {:title title :n n :on-click identity}]) - [:button {:on-click #(swap! local update-in [:counter1 :n] inc)} "Increment Counter 1"] - [:button {:on-click #(swap! local update-in [:counter2 :n] inc)} "Increment Counter 2"]])) - -(defonce root - (mf/create-root (dom/getElement "local-state-1"))) - -(defn ^:after-load mount! [] - (mf/render! root (mf/element local-state #js {:title "Clicks count"}))) diff --git a/examples/rumext/examples/portals.cljs b/examples/rumext/examples/portals.cljs deleted file mode 100644 index 814c555..0000000 --- a/examples/rumext/examples/portals.cljs +++ /dev/null @@ -1,26 +0,0 @@ -(ns rumext.examples.portals - (:require - [rumext.v2 :as mf] - [goog.dom :as dom])) - -(mf/defc portal* - [{:keys [state]}] - [:div {:on-click (fn [_] (swap! state inc)) - :style { :user-select "none", :cursor "pointer" }} - "[ PORTAL Clicks: " @state " ]"]) - -(mf/defc portals* - [] - (let [state (mf/use-state 0)] - [:div {:on-click (fn [_] (swap! state inc)) - :style { :user-select "none", :cursor "pointer" }} - "[ ROOT Clicks: " @state " ]" - (mf/portal - (mf/html [:> portal* {:state state}]) - (dom/getElement "portal-off-root"))])) - -(defonce root - (mf/create-root (dom/getElement "portals"))) - -(defn ^:after-load mount! [] - (mf/render! root (mf/element portals*))) diff --git a/examples/rumext/examples/refs.cljs b/examples/rumext/examples/refs.cljs deleted file mode 100644 index 8275f00..0000000 --- a/examples/rumext/examples/refs.cljs +++ /dev/null @@ -1,37 +0,0 @@ -(ns rumext.examples.refs - (:require - [goog.dom :as dom] - [rumext.v2 :as mf])) - -(mf/defc textarea - [props] - (let [ref (mf/use-var) - state (mf/use-state 0)] - (mf/use-layout-effect - nil - (fn [] - (let [node @ref] - (set! (.-height (.-style node)) "0") - (set! (.-height (.-style node)) (str (+ 2 (.-scrollHeight node)) "px"))))) - - [:textarea - {:ref ref - :style {:width "100%" - :padding "10px" - :font "inherit" - :outline "none" - :resize "none"} - :default-value "Auto-resizing\ntextarea" - :placeholder "Auto-resizing textarea" - :on-change (fn [_] (swap! state inc))}])) - -(mf/defc refs - [] - [:div - [:& textarea]]) - -(defonce root - (mf/create-root (dom/getElement "refs"))) - -(defn ^:after-load mount! [] - (mf/render! root (mf/element refs))) diff --git a/examples/rumext/examples/timer_reactive.cljs b/examples/rumext/examples/timer_reactive.cljs deleted file mode 100644 index ea0c2e8..0000000 --- a/examples/rumext/examples/timer_reactive.cljs +++ /dev/null @@ -1,36 +0,0 @@ -(ns rumext.examples.timer-reactive - (:require - [goog.dom :as dom] - [rumext.v2 :as mf] - [rumext.examples.util :as util])) - -(defonce components (atom {})) - -(mf/defc timer1 - {::mf/register-on components - ::mf/forward-ref true} - [props ref] - (let [ts (mf/deref util/*clock)] - [:div "Timer (deref)" ": " - [:span {:style {:color @util/*color}} - (util/format-time ts)]])) - -(mf/defc timer2 - {::mf/wrap [#(mf/throttle % 1000)]} - [{:keys [ts] :as props}] - [:div "Timer (props)" ": " - [:span {:style {:color @util/*color}} - (util/format-time ts)]]) - -(defonce root1 - (mf/create-root (dom/getElement "timer1"))) - -(defonce root2 - (mf/create-root (dom/getElement "timer2"))) - -(defn ^:after-load mount! [] - (mf/render! root1 (mf/jsx timer1 {})) - (mf/render! root2 (mf/jsx timer2 #js {:ts @util/*clock})) - (add-watch util/*clock :timer-static - (fn [_ _ _ ts] - (mf/render! root2 (mf/jsx timer2 #js {:ts ts}))))) diff --git a/examples/rumext/examples/util.cljs b/examples/rumext/examples/util.cljs deleted file mode 100644 index 8245ea0..0000000 --- a/examples/rumext/examples/util.cljs +++ /dev/null @@ -1,58 +0,0 @@ -(ns rumext.examples.util - (:require - [rumext.v2 :as mf] - [goog.dom :as dom] - [okulary.core :as l])) - -(defonce *clock (l/atom (.getTime (js/Date.)))) -(defonce *color (l/atom "#FA8D97")) -(defonce *speed (l/atom 160)) - -;; Start clock ticking -(defn tick [] - (reset! *clock (.getTime (js/Date.)))) - -(defonce sem (js/setInterval tick @*speed)) - -(defn format-time [ts] - (-> ts (js/Date.) (.toISOString) (subs 11 23))) - -(defn el [id] - (dom/getElement id)) - -(mf/defc watches-count - [{:keys [iref] :as props}] - (let [state (mf/use-state 0)] - (mf/with-effect [iref] - (let [sem (js/setInterval #(swap! state inc) 1000)] - #(do - (js/clearInterval sem)))) - - [:span (.-size (.-watches ^js iref))])) - -;; Generic board utils - -(def ^:const board-width 19) -(def ^:const board-height 10) - -(defn prime? - [i] - (and (>= i 2) - (empty? (filter #(= 0 (mod i %)) (range 2 i))))) - -(defn initial-board - [] - (->> (map prime? (range 0 (* board-width board-height))) - (partition board-width) - (mapv vec))) - -;; (mf/def board-stats -;; :mixins [mf/reactive] -;; :render -;; (fn [own [*board *renders]] -;; [:div.stats -;; "Renders: " (mf/react *renders) -;; [:br] -;; "Board watches: " (watches-count *board) -;; [:br] -;; "Color watches: " (watches-count *color) ])) diff --git a/latest/css/default.css b/latest/css/default.css new file mode 100644 index 0000000..c78d040 --- /dev/null +++ b/latest/css/default.css @@ -0,0 +1,649 @@ +@import url('https://fonts.googleapis.com/css?family=PT+Sans'); + +body { + font-family: 'PT Sans', Helvetica, sans-serif; + font-size: 14px; +} + +a { + color: #337ab7; + text-decoration: none; +} + +a:hover { + color: #30426a; + text-decoration: underline; +} + +pre, code { + font-family: Monaco, DejaVu Sans Mono, Consolas, monospace; + font-size: 9pt; + margin: 15px 0; +} + +h1 { + font-weight: normal; + font-size: 29px; + margin: 10px 0 2px 0; + padding: 0; +} + +h2 { + font-weight: normal; + font-size: 25px; +} + +h3 > a:hover { + text-decoration: none; +} + +.document h1, .namespace-index h1 { + font-size: 32px; + margin-top: 12px; +} + +#header, #content, .sidebar { + position: fixed; +} + +#header { + top: 0; + left: 0; + right: 0; + height: 22px; + color: #f5f5f5; + padding: 5px 7px; +} + +#content { + top: 32px; + right: 0; + bottom: 0; + overflow: auto; + background: #fff; + color: #333; + padding: 0 18px; +} + +.sidebar { + position: fixed; + top: 32px; + bottom: 0; + overflow: auto; +} + +.sidebar.primary { + background: #30426a; + border-right: solid 1px #cccccc; + left: 0; + width: 250px; + color: white; + font-size: 110%; +} + +.sidebar.secondary { + background: #f2f2f2; + border-right: solid 1px #d7d7d7; + left: 251px; + width: 200px; + font-size: 110%; +} + +#content.namespace-index, #content.document { + left: 251px; +} + +#content.namespace-docs { + left: 452px; +} + +#content.document { + padding-bottom: 10%; +} + +#header { + background: #2d3e63; + box-shadow: 0 0 8px rgba(0, 0, 0, 0.4); + z-index: 100; +} + +#header h1 { + margin: 0; + padding: 0; + font-size: 18px; + font-weight: lighter; + text-shadow: -1px -1px 0px #333; +} + +#header h1 .project-version { + font-weight: normal; +} + +.project-version { + padding-left: 0.15em; +} + +#header a, .sidebar a { + display: block; + text-decoration: none; +} + +#header a { + color: #f5f5f5; +} + +.sidebar.primary, .sidebar.primary a { + color: #b2bfdc; +} + +.sidebar.primary a:hover { + color: white; +} + +.sidebar.secondary, .sidebar.secondary a { + color: #738bc0; +} + +.sidebar.secondary a:hover { + color: #2d3e63; +} + +#header h2 { + float: right; + font-size: 9pt; + font-weight: normal; + margin: 4px 3px; + padding: 0; + color: #bbb; +} + +#header h2 a { + display: inline; +} + +.sidebar h3 { + margin: 0; + padding: 10px 13px 0 13px; + font-size: 19px; + font-weight: lighter; +} + +.sidebar.primary h3.no-link { + text-transform: uppercase; + font-size: 12px; + color: #738bc0; +} + +.sidebar.secondary h3 a { + text-transform: uppercase; + font-size: 12px; + color: #2d3e63; +} + +.sidebar ul { + padding: 7px 0 6px 0; + margin: 0; +} + +.sidebar ul.index-link { + padding-bottom: 4px; +} + +.sidebar li { + display: block; + vertical-align: middle; +} + +.sidebar li a, .sidebar li .no-link { + border-left: 3px solid transparent; + padding: 0 10px; + white-space: nowrap; +} + +.sidebar li .inner { + display: inline-block; + padding-top: 7px; + height: 24px; +} + +.sidebar li a, .sidebar li .tree { + height: 31px; +} + +.depth-1 .inner { padding-left: 2px; } +.depth-2 .inner { padding-left: 6px; } +.depth-3 .inner { padding-left: 20px; } +.depth-4 .inner { padding-left: 34px; } +.depth-5 .inner { padding-left: 48px; } +.depth-6 .inner { padding-left: 62px; } + +.sidebar li .tree { + display: block; + float: left; + position: relative; + top: -10px; + margin: 0 4px 0 0; + padding: 0; +} + +.sidebar li.depth-1 .tree { + display: none; +} + +.sidebar li .tree .top, .sidebar li .tree .bottom { + display: block; + margin: 0; + padding: 0; + width: 7px; +} + +.sidebar li .tree .top { + border-left: 1px solid #aaa; + border-bottom: 1px solid #aaa; + height: 19px; +} + +.sidebar li .tree .bottom { + height: 22px; +} + +.sidebar li.branch .tree .bottom { + border-left: 1px solid #aaa; +} + +.sidebar.primary li.current a { + border-left: 3px solid #e99d1a; + color: white; +} + +.sidebar.secondary li.current a { + border-left: 3px solid #2d3e63; + color: #33a; +} + +.namespace-index h2 { + margin: 30px 0 0 0; +} + +.namespace-index h3 { + font-size: 16px; + font-weight: bold; + margin-bottom: 0; + letter-spacing: 0.05em; + border-bottom: solid 1px #ddd; + max-width: 680px; + background-color: #fafafa; + padding: 0.5em; +} + +.namespace-index .topics { + padding-left: 30px; + margin: 11px 0 0 0; +} + +.namespace-index .topics li { + padding: 5px 0; +} + +.namespace-docs h3 { + font-size: 18px; + font-weight: bold; +} + +.public h3 { + margin: 0; + float: left; +} + +.usage { + clear: both; +} + +.public { + margin: 0; + border-top: 1px solid #e0e0e0; + padding-top: 14px; + padding-bottom: 6px; +} + +.public:last-child { + margin-bottom: 20%; +} + +.members .public:last-child { + margin-bottom: 0; +} + +.members { + margin: 15px 0; +} + +.members h4 { + color: #555; + font-weight: normal; + font-variant: small-caps; + margin: 0 0 5px 0; +} + +.members .inner { + padding-top: 5px; + padding-left: 12px; + margin-top: 2px; + margin-left: 7px; + border-left: 1px solid #bbb; +} + +#content .members .inner h3 { + font-size: 12pt; +} + +.members .public { + border-top: none; + margin-top: 0; + padding-top: 6px; + padding-bottom: 0; +} + +.members .public:first-child { + padding-top: 0; +} + +h4.type, +h4.dynamic, +h4.added, +h4.deprecated { + float: left; + margin: 3px 10px 15px 0; + font-size: 15px; + font-weight: bold; + font-variant: small-caps; +} + +.public h4.type, +.public h4.dynamic, +.public h4.added, +.public h4.deprecated { + font-size: 13px; + font-weight: bold; + margin: 3px 0 0 10px; +} + +.members h4.type, +.members h4.added, +.members h4.deprecated { + margin-top: 1px; +} + +h4.type { + color: #717171; +} + +h4.dynamic { + color: #9933aa; +} + +h4.added { + color: #508820; +} + +h4.deprecated { + color: #880000; +} + +.namespace { + margin-bottom: 30px; +} + +.namespace:last-child { + margin-bottom: 10%; +} + +.index { + padding: 0; + font-size: 80%; + margin: 15px 0; + line-height: 1.6em; +} + +.index * { + display: inline; +} + +.index p { + padding-right: 3px; +} + +.index li { + padding-right: 5px; +} + +.index ul { + padding-left: 0; +} + +.type-sig { + clear: both; + color: #088; +} + +.type-sig pre { + padding-top: 10px; + margin: 0; +} + +.usage code { + display: block; + color: #008; + margin: 2px 0; +} + +.usage code:first-child { + padding-top: 10px; +} + +p { + margin: 15px 0; +} + +.public p:first-child, .public pre.plaintext { + margin-top: 12px; +} + +.doc { + margin: 0 0 26px 0; + clear: both; +} + +.public .doc { + margin: 0; +} + +.namespace-index { + font-size: 120%; +} + +.namespace-index .doc { + margin-bottom: 20px; +} + +.namespace-index .namespace .doc { + margin-bottom: 10px; +} + +.markdown p, .markdown li, .markdown dt, .markdown dd, .markdown td { + line-height: 1.6em; +} + +.markdown h2 { + font-weight: normal; + font-size: 25px; +} + +#content .markdown h3 { + font-size: 20px; +} + +.markdown h4 { + font-size: 15px; +} + +.doc, .public, .namespace .index { + max-width: 680px; + overflow-x: visible; +} + +.markdown pre > code { + display: block; + padding: 10px; +} + +.markdown pre > code, .src-link a { + border: 1px solid #e4e4e4; + border-radius: 2px; +} + +.src-link a { + background: #f6f6f6; +} + +.markdown code:not(.hljs) { + color: #c7254e; + background-color: #f9f2f4; + border-radius: 4px; + font-size: 90%; + padding: 2px 4px; +} + +pre.deps { + display: inline-block; + margin: 0 10px; + border: 1px solid #e4e4e4; + border-radius: 2px; + padding: 10px; + background-color: #f6f6f6; +} + +.markdown hr { + border-style: solid; + border-top: none; + color: #ccc; +} + +.doc ul, .doc ol { + padding-left: 30px; +} + +.doc table { + border-collapse: collapse; + margin: 0 10px; +} + +.doc table td, .doc table th { + border: 1px solid #dddddd; + padding: 4px 6px; +} + +.doc table th { + background: #f2f2f2; +} + +.doc dl { + margin: 0 10px 20px 10px; +} + +.doc dl dt { + font-weight: bold; + margin: 0; + padding: 3px 0; + border-bottom: 1px solid #ddd; +} + +.doc dl dd { + padding: 5px 0; + margin: 0 0 5px 10px; +} + +.doc abbr { + border-bottom: 1px dotted #333; + font-variant: none; + cursor: help; +} + +.src-link { + margin-bottom: 15px; +} + +.src-link a { + font-size: 70%; + padding: 1px 4px; + text-decoration: none; + color: #5555bb; + background-color: #f6f6f6; +} + +blockquote { + opacity: 0.6; + border-left: solid 2px #ddd; + margin-left: 0; + padding-left: 1em; +} + +/* Responsiveness Theme */ + +@media (max-device-width: 480px) { + .sidebar { + display:none; + } + + #content { + position: relative; + left: initial !important; + top: 110px; + padding: 0 1em; + } + + #header { + display: flex; + flex-direction: column-reverse; + height: 100px; + } + + #header > h1 { + font-size: 52px; + } + + #header h2 { + float: none; + font-size: 20px; + } + + .namespace-index > h1 { + display: none; + } + + .public, .doc, .namespace > .index, .namespace > .doc, .namespace > h3 { + max-width: initial; + } + + .doc { + text-align: justify; + } + + .public { + padding-top: 2em; + padding-bottom: 2em; + } + + .public > h3 { + font-size: 300%; + } + + .public > h4.type, .public > h4.added, .public > h4.deprecated { + font-size: 150%; + margin-top: 1em; + } + + pre > code { + font-size: 200%; + } +} diff --git a/latest/highlight/highlight.min.js b/latest/highlight/highlight.min.js new file mode 100644 index 0000000..6486ffd --- /dev/null +++ b/latest/highlight/highlight.min.js @@ -0,0 +1,2 @@ +/*! highlight.js v9.6.0 | BSD3 License | git.io/hljslicense */ +!function(e){var n="object"==typeof window&&window||"object"==typeof self&&self;"undefined"!=typeof exports?e(exports):n&&(n.hljs=e({}),"function"==typeof define&&define.amd&&define([],function(){return n.hljs}))}(function(e){function n(e){return e.replace(/[&<>]/gm,function(e){return I[e]})}function t(e){return e.nodeName.toLowerCase()}function r(e,n){var t=e&&e.exec(n);return t&&0===t.index}function a(e){return k.test(e)}function i(e){var n,t,r,i,o=e.className+" ";if(o+=e.parentNode?e.parentNode.className:"",t=B.exec(o))return R(t[1])?t[1]:"no-highlight";for(o=o.split(/\s+/),n=0,r=o.length;r>n;n++)if(i=o[n],a(i)||R(i))return i}function o(e,n){var t,r={};for(t in e)r[t]=e[t];if(n)for(t in n)r[t]=n[t];return r}function u(e){var n=[];return function r(e,a){for(var i=e.firstChild;i;i=i.nextSibling)3===i.nodeType?a+=i.nodeValue.length:1===i.nodeType&&(n.push({event:"start",offset:a,node:i}),a=r(i,a),t(i).match(/br|hr|img|input/)||n.push({event:"stop",offset:a,node:i}));return a}(e,0),n}function c(e,r,a){function i(){return e.length&&r.length?e[0].offset!==r[0].offset?e[0].offset"}function u(e){l+=""}function c(e){("start"===e.event?o:u)(e.node)}for(var s=0,l="",f=[];e.length||r.length;){var g=i();if(l+=n(a.substr(s,g[0].offset-s)),s=g[0].offset,g===e){f.reverse().forEach(u);do c(g.splice(0,1)[0]),g=i();while(g===e&&g.length&&g[0].offset===s);f.reverse().forEach(o)}else"start"===g[0].event?f.push(g[0].node):f.pop(),c(g.splice(0,1)[0])}return l+n(a.substr(s))}function s(e){function n(e){return e&&e.source||e}function t(t,r){return new RegExp(n(t),"m"+(e.cI?"i":"")+(r?"g":""))}function r(a,i){if(!a.compiled){if(a.compiled=!0,a.k=a.k||a.bK,a.k){var u={},c=function(n,t){e.cI&&(t=t.toLowerCase()),t.split(" ").forEach(function(e){var t=e.split("|");u[t[0]]=[n,t[1]?Number(t[1]):1]})};"string"==typeof a.k?c("keyword",a.k):E(a.k).forEach(function(e){c(e,a.k[e])}),a.k=u}a.lR=t(a.l||/\w+/,!0),i&&(a.bK&&(a.b="\\b("+a.bK.split(" ").join("|")+")\\b"),a.b||(a.b=/\B|\b/),a.bR=t(a.b),a.e||a.eW||(a.e=/\B|\b/),a.e&&(a.eR=t(a.e)),a.tE=n(a.e)||"",a.eW&&i.tE&&(a.tE+=(a.e?"|":"")+i.tE)),a.i&&(a.iR=t(a.i)),null==a.r&&(a.r=1),a.c||(a.c=[]);var s=[];a.c.forEach(function(e){e.v?e.v.forEach(function(n){s.push(o(e,n))}):s.push("self"===e?a:e)}),a.c=s,a.c.forEach(function(e){r(e,a)}),a.starts&&r(a.starts,i);var l=a.c.map(function(e){return e.bK?"\\.?("+e.b+")\\.?":e.b}).concat([a.tE,a.i]).map(n).filter(Boolean);a.t=l.length?t(l.join("|"),!0):{exec:function(){return null}}}}r(e)}function l(e,t,a,i){function o(e,n){var t,a;for(t=0,a=n.c.length;a>t;t++)if(r(n.c[t].bR,e))return n.c[t]}function u(e,n){if(r(e.eR,n)){for(;e.endsParent&&e.parent;)e=e.parent;return e}return e.eW?u(e.parent,n):void 0}function c(e,n){return!a&&r(n.iR,e)}function g(e,n){var t=N.cI?n[0].toLowerCase():n[0];return e.k.hasOwnProperty(t)&&e.k[t]}function h(e,n,t,r){var a=r?"":y.classPrefix,i='',i+n+o}function p(){var e,t,r,a;if(!E.k)return n(B);for(a="",t=0,E.lR.lastIndex=0,r=E.lR.exec(B);r;)a+=n(B.substr(t,r.index-t)),e=g(E,r),e?(M+=e[1],a+=h(e[0],n(r[0]))):a+=n(r[0]),t=E.lR.lastIndex,r=E.lR.exec(B);return a+n(B.substr(t))}function d(){var e="string"==typeof E.sL;if(e&&!x[E.sL])return n(B);var t=e?l(E.sL,B,!0,L[E.sL]):f(B,E.sL.length?E.sL:void 0);return E.r>0&&(M+=t.r),e&&(L[E.sL]=t.top),h(t.language,t.value,!1,!0)}function b(){k+=null!=E.sL?d():p(),B=""}function v(e){k+=e.cN?h(e.cN,"",!0):"",E=Object.create(e,{parent:{value:E}})}function m(e,n){if(B+=e,null==n)return b(),0;var t=o(n,E);if(t)return t.skip?B+=n:(t.eB&&(B+=n),b(),t.rB||t.eB||(B=n)),v(t,n),t.rB?0:n.length;var r=u(E,n);if(r){var a=E;a.skip?B+=n:(a.rE||a.eE||(B+=n),b(),a.eE&&(B=n));do E.cN&&(k+=C),E.skip||(M+=E.r),E=E.parent;while(E!==r.parent);return r.starts&&v(r.starts,""),a.rE?0:n.length}if(c(n,E))throw new Error('Illegal lexeme "'+n+'" for mode "'+(E.cN||"")+'"');return B+=n,n.length||1}var N=R(e);if(!N)throw new Error('Unknown language: "'+e+'"');s(N);var w,E=i||N,L={},k="";for(w=E;w!==N;w=w.parent)w.cN&&(k=h(w.cN,"",!0)+k);var B="",M=0;try{for(var I,j,O=0;;){if(E.t.lastIndex=O,I=E.t.exec(t),!I)break;j=m(t.substr(O,I.index-O),I[0]),O=I.index+j}for(m(t.substr(O)),w=E;w.parent;w=w.parent)w.cN&&(k+=C);return{r:M,value:k,language:e,top:E}}catch(T){if(T.message&&-1!==T.message.indexOf("Illegal"))return{r:0,value:n(t)};throw T}}function f(e,t){t=t||y.languages||E(x);var r={r:0,value:n(e)},a=r;return t.filter(R).forEach(function(n){var t=l(n,e,!1);t.language=n,t.r>a.r&&(a=t),t.r>r.r&&(a=r,r=t)}),a.language&&(r.second_best=a),r}function g(e){return y.tabReplace||y.useBR?e.replace(M,function(e,n){return y.useBR&&"\n"===e?"
":y.tabReplace?n.replace(/\t/g,y.tabReplace):void 0}):e}function h(e,n,t){var r=n?L[n]:t,a=[e.trim()];return e.match(/\bhljs\b/)||a.push("hljs"),-1===e.indexOf(r)&&a.push(r),a.join(" ").trim()}function p(e){var n,t,r,o,s,p=i(e);a(p)||(y.useBR?(n=document.createElementNS("http://www.w3.org/1999/xhtml","div"),n.innerHTML=e.innerHTML.replace(/\n/g,"").replace(//g,"\n")):n=e,s=n.textContent,r=p?l(p,s,!0):f(s),t=u(n),t.length&&(o=document.createElementNS("http://www.w3.org/1999/xhtml","div"),o.innerHTML=r.value,r.value=c(t,u(o),s)),r.value=g(r.value),e.innerHTML=r.value,e.className=h(e.className,p,r.language),e.result={language:r.language,re:r.r},r.second_best&&(e.second_best={language:r.second_best.language,re:r.second_best.r}))}function d(e){y=o(y,e)}function b(){if(!b.called){b.called=!0;var e=document.querySelectorAll("pre code");w.forEach.call(e,p)}}function v(){addEventListener("DOMContentLoaded",b,!1),addEventListener("load",b,!1)}function m(n,t){var r=x[n]=t(e);r.aliases&&r.aliases.forEach(function(e){L[e]=n})}function N(){return E(x)}function R(e){return e=(e||"").toLowerCase(),x[e]||x[L[e]]}var w=[],E=Object.keys,x={},L={},k=/^(no-?highlight|plain|text)$/i,B=/\blang(?:uage)?-([\w-]+)\b/i,M=/((^(<[^>]+>|\t|)+|(?:\n)))/gm,C="
",y={classPrefix:"hljs-",tabReplace:null,useBR:!1,languages:void 0},I={"&":"&","<":"<",">":">"};return e.highlight=l,e.highlightAuto=f,e.fixMarkup=g,e.highlightBlock=p,e.configure=d,e.initHighlighting=b,e.initHighlightingOnLoad=v,e.registerLanguage=m,e.listLanguages=N,e.getLanguage=R,e.inherit=o,e.IR="[a-zA-Z]\\w*",e.UIR="[a-zA-Z_]\\w*",e.NR="\\b\\d+(\\.\\d+)?",e.CNR="(-?)(\\b0[xX][a-fA-F0-9]+|(\\b\\d+(\\.\\d*)?|\\.\\d+)([eE][-+]?\\d+)?)",e.BNR="\\b(0b[01]+)",e.RSR="!|!=|!==|%|%=|&|&&|&=|\\*|\\*=|\\+|\\+=|,|-|-=|/=|/|:|;|<<|<<=|<=|<|===|==|=|>>>=|>>=|>=|>>>|>>|>|\\?|\\[|\\{|\\(|\\^|\\^=|\\||\\|=|\\|\\||~",e.BE={b:"\\\\[\\s\\S]",r:0},e.ASM={cN:"string",b:"'",e:"'",i:"\\n",c:[e.BE]},e.QSM={cN:"string",b:'"',e:'"',i:"\\n",c:[e.BE]},e.PWM={b:/\b(a|an|the|are|I'm|isn't|don't|doesn't|won't|but|just|should|pretty|simply|enough|gonna|going|wtf|so|such|will|you|your|like)\b/},e.C=function(n,t,r){var a=e.inherit({cN:"comment",b:n,e:t,c:[]},r||{});return a.c.push(e.PWM),a.c.push({cN:"doctag",b:"(?:TODO|FIXME|NOTE|BUG|XXX):",r:0}),a},e.CLCM=e.C("//","$"),e.CBCM=e.C("/\\*","\\*/"),e.HCM=e.C("#","$"),e.NM={cN:"number",b:e.NR,r:0},e.CNM={cN:"number",b:e.CNR,r:0},e.BNM={cN:"number",b:e.BNR,r:0},e.CSSNM={cN:"number",b:e.NR+"(%|em|ex|ch|rem|vw|vh|vmin|vmax|cm|mm|in|pt|pc|px|deg|grad|rad|turn|s|ms|Hz|kHz|dpi|dpcm|dppx)?",r:0},e.RM={cN:"regexp",b:/\//,e:/\/[gimuy]*/,i:/\n/,c:[e.BE,{b:/\[/,e:/\]/,r:0,c:[e.BE]}]},e.TM={cN:"title",b:e.IR,r:0},e.UTM={cN:"title",b:e.UIR,r:0},e.METHOD_GUARD={b:"\\.\\s*"+e.UIR,r:0},e});hljs.registerLanguage("clojure",function(e){var t={"builtin-name":"def defonce cond apply if-not if-let if not not= = < > <= >= == + / * - rem quot neg? pos? delay? symbol? keyword? true? false? integer? empty? coll? list? set? ifn? fn? associative? sequential? sorted? counted? reversible? number? decimal? class? distinct? isa? float? rational? reduced? ratio? odd? even? char? seq? vector? string? map? nil? contains? zero? instance? not-every? not-any? libspec? -> ->> .. . inc compare do dotimes mapcat take remove take-while drop letfn drop-last take-last drop-while while intern condp case reduced cycle split-at split-with repeat replicate iterate range merge zipmap declare line-seq sort comparator sort-by dorun doall nthnext nthrest partition eval doseq await await-for let agent atom send send-off release-pending-sends add-watch mapv filterv remove-watch agent-error restart-agent set-error-handler error-handler set-error-mode! error-mode shutdown-agents quote var fn loop recur throw try monitor-enter monitor-exit defmacro defn defn- macroexpand macroexpand-1 for dosync and or when when-not when-let comp juxt partial sequence memoize constantly complement identity assert peek pop doto proxy defstruct first rest cons defprotocol cast coll deftype defrecord last butlast sigs reify second ffirst fnext nfirst nnext defmulti defmethod meta with-meta ns in-ns create-ns import refer keys select-keys vals key val rseq name namespace promise into transient persistent! conj! assoc! dissoc! pop! disj! use class type num float double short byte boolean bigint biginteger bigdec print-method print-dup throw-if printf format load compile get-in update-in pr pr-on newline flush read slurp read-line subvec with-open memfn time re-find re-groups rand-int rand mod locking assert-valid-fdecl alias resolve ref deref refset swap! reset! set-validator! compare-and-set! alter-meta! reset-meta! commute get-validator alter ref-set ref-history-count ref-min-history ref-max-history ensure sync io! new next conj set! to-array future future-call into-array aset gen-class reduce map filter find empty hash-map hash-set sorted-map sorted-map-by sorted-set sorted-set-by vec vector seq flatten reverse assoc dissoc list disj get union difference intersection extend extend-type extend-protocol int nth delay count concat chunk chunk-buffer chunk-append chunk-first chunk-rest max min dec unchecked-inc-int unchecked-inc unchecked-dec-inc unchecked-dec unchecked-negate unchecked-add-int unchecked-add unchecked-subtract-int unchecked-subtract chunk-next chunk-cons chunked-seq? prn vary-meta lazy-seq spread list* str find-keyword keyword symbol gensym force rationalize"},r="a-zA-Z_\\-!.?+*=<>&#'",n="["+r+"]["+r+"0-9/;:]*",a="[-+]?\\d+(\\.\\d+)?",o={b:n,r:0},s={cN:"number",b:a,r:0},i=e.inherit(e.QSM,{i:null}),c=e.C(";","$",{r:0}),d={cN:"literal",b:/\b(true|false|nil)\b/},l={b:"[\\[\\{]",e:"[\\]\\}]"},m={cN:"comment",b:"\\^"+n},p=e.C("\\^\\{","\\}"),u={cN:"symbol",b:"[:]{1,2}"+n},f={b:"\\(",e:"\\)"},h={eW:!0,r:0},y={k:t,l:n,cN:"name",b:n,starts:h},b=[f,i,m,p,c,u,l,s,d,o];return f.c=[e.C("comment",""),y,h],h.c=b,l.c=b,{aliases:["clj"],i:/\S/,c:[f,i,m,p,c,u,l,s,d]}});hljs.registerLanguage("clojure-repl",function(e){return{c:[{cN:"meta",b:/^([\w.-]+|\s*#_)=>/,starts:{e:/$/,sL:"clojure"}}]}}); \ No newline at end of file diff --git a/latest/highlight/solarized-light.css b/latest/highlight/solarized-light.css new file mode 100644 index 0000000..fdcfcc7 --- /dev/null +++ b/latest/highlight/solarized-light.css @@ -0,0 +1,84 @@ +/* + +Orginal Style from ethanschoonover.com/solarized (c) Jeremy Hull + +*/ + +.hljs { + display: block; + overflow-x: auto; + padding: 0.5em; + background: #fdf6e3; + color: #657b83; +} + +.hljs-comment, +.hljs-quote { + color: #93a1a1; +} + +/* Solarized Green */ +.hljs-keyword, +.hljs-selector-tag, +.hljs-addition { + color: #859900; +} + +/* Solarized Cyan */ +.hljs-number, +.hljs-string, +.hljs-meta .hljs-meta-string, +.hljs-literal, +.hljs-doctag, +.hljs-regexp { + color: #2aa198; +} + +/* Solarized Blue */ +.hljs-title, +.hljs-section, +.hljs-name, +.hljs-selector-id, +.hljs-selector-class { + color: #268bd2; +} + +/* Solarized Yellow */ +.hljs-attribute, +.hljs-attr, +.hljs-variable, +.hljs-template-variable, +.hljs-class .hljs-title, +.hljs-type { + color: #b58900; +} + +/* Solarized Orange */ +.hljs-symbol, +.hljs-bullet, +.hljs-subst, +.hljs-meta, +.hljs-meta .hljs-keyword, +.hljs-selector-attr, +.hljs-selector-pseudo, +.hljs-link { + color: #cb4b16; +} + +/* Solarized Red */ +.hljs-built_in, +.hljs-deletion { + color: #dc322f; +} + +.hljs-formula { + background: #eee8d5; +} + +.hljs-emphasis { + font-style: italic; +} + +.hljs-strong { + font-weight: bold; +} diff --git a/latest/index.html b/latest/index.html new file mode 100644 index 0000000..5706c79 --- /dev/null +++ b/latest/index.html @@ -0,0 +1,3 @@ + +funcool/rumext \ No newline at end of file diff --git a/latest/js/jquery.min.js b/latest/js/jquery.min.js new file mode 100644 index 0000000..73f33fb --- /dev/null +++ b/latest/js/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v1.11.0 | (c) 2005, 2014 jQuery Foundation, Inc. | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=c.slice,e=c.concat,f=c.push,g=c.indexOf,h={},i=h.toString,j=h.hasOwnProperty,k="".trim,l={},m="1.11.0",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return d.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:d.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a,b){return n.each(this,a,b)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(d.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor(null)},push:f,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(e=arguments[h]))for(d in e)a=g[d],c=e[d],g!==c&&(j&&c&&(n.isPlainObject(c)||(b=n.isArray(c)))?(b?(b=!1,f=a&&n.isArray(a)?a:[]):f=a&&n.isPlainObject(a)?a:{},g[d]=n.extend(j,f,c)):void 0!==c&&(g[d]=c));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray||function(a){return"array"===n.type(a)},isWindow:function(a){return null!=a&&a==a.window},isNumeric:function(a){return a-parseFloat(a)>=0},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},isPlainObject:function(a){var b;if(!a||"object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;try{if(a.constructor&&!j.call(a,"constructor")&&!j.call(a.constructor.prototype,"isPrototypeOf"))return!1}catch(c){return!1}if(l.ownLast)for(b in a)return j.call(a,b);for(b in a);return void 0===b||j.call(a,b)},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?h[i.call(a)]||"object":typeof a},globalEval:function(b){b&&n.trim(b)&&(a.execScript||function(b){a.eval.call(a,b)})(b)},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b,c){var d,e=0,f=a.length,g=s(a);if(c){if(g){for(;f>e;e++)if(d=b.apply(a[e],c),d===!1)break}else for(e in a)if(d=b.apply(a[e],c),d===!1)break}else if(g){for(;f>e;e++)if(d=b.call(a[e],e,a[e]),d===!1)break}else for(e in a)if(d=b.call(a[e],e,a[e]),d===!1)break;return a},trim:k&&!k.call("\ufeff\xa0")?function(a){return null==a?"":k.call(a)}:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):f.call(c,a)),c},inArray:function(a,b,c){var d;if(b){if(g)return g.call(b,a,c);for(d=b.length,c=c?0>c?Math.max(0,d+c):c:0;d>c;c++)if(c in b&&b[c]===a)return c}return-1},merge:function(a,b){var c=+b.length,d=0,e=a.length;while(c>d)a[e++]=b[d++];if(c!==c)while(void 0!==b[d])a[e++]=b[d++];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,f=0,g=a.length,h=s(a),i=[];if(h)for(;g>f;f++)d=b(a[f],f,c),null!=d&&i.push(d);else for(f in a)d=b(a[f],f,c),null!=d&&i.push(d);return e.apply([],i)},guid:1,proxy:function(a,b){var c,e,f;return"string"==typeof b&&(f=a[b],b=a,a=f),n.isFunction(a)?(c=d.call(arguments,2),e=function(){return a.apply(b||this,c.concat(d.call(arguments)))},e.guid=a.guid=a.guid||n.guid++,e):void 0},now:function(){return+new Date},support:l}),n.each("Boolean Number String Function Array Date RegExp Object Error".split(" "),function(a,b){h["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:1===a.nodeType&&b?!0:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s="sizzle"+-new Date,t=a.document,u=0,v=0,w=eb(),x=eb(),y=eb(),z=function(a,b){return a===b&&(j=!0),0},A="undefined",B=1<<31,C={}.hasOwnProperty,D=[],E=D.pop,F=D.push,G=D.push,H=D.slice,I=D.indexOf||function(a){for(var b=0,c=this.length;c>b;b++)if(this[b]===a)return b;return-1},J="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",K="[\\x20\\t\\r\\n\\f]",L="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",M=L.replace("w","w#"),N="\\["+K+"*("+L+")"+K+"*(?:([*^$|!~]?=)"+K+"*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|("+M+")|)|)"+K+"*\\]",O=":("+L+")(?:\\(((['\"])((?:\\\\.|[^\\\\])*?)\\3|((?:\\\\.|[^\\\\()[\\]]|"+N.replace(3,8)+")*)|.*)\\)|)",P=new RegExp("^"+K+"+|((?:^|[^\\\\])(?:\\\\.)*)"+K+"+$","g"),Q=new RegExp("^"+K+"*,"+K+"*"),R=new RegExp("^"+K+"*([>+~]|"+K+")"+K+"*"),S=new RegExp("="+K+"*([^\\]'\"]*?)"+K+"*\\]","g"),T=new RegExp(O),U=new RegExp("^"+M+"$"),V={ID:new RegExp("^#("+L+")"),CLASS:new RegExp("^\\.("+L+")"),TAG:new RegExp("^("+L.replace("w","w*")+")"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+K+"*(even|odd|(([+-]|)(\\d*)n|)"+K+"*(?:([+-]|)"+K+"*(\\d+)|))"+K+"*\\)|)","i"),bool:new RegExp("^(?:"+J+")$","i"),needsContext:new RegExp("^"+K+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+K+"*((?:-\\d)?\\d*)"+K+"*\\)|)(?=[^-]|$)","i")},W=/^(?:input|select|textarea|button)$/i,X=/^h\d$/i,Y=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,$=/[+~]/,_=/'|\\/g,ab=new RegExp("\\\\([\\da-f]{1,6}"+K+"?|("+K+")|.)","ig"),bb=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)};try{G.apply(D=H.call(t.childNodes),t.childNodes),D[t.childNodes.length].nodeType}catch(cb){G={apply:D.length?function(a,b){F.apply(a,H.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function db(a,b,d,e){var f,g,h,i,j,m,p,q,u,v;if((b?b.ownerDocument||b:t)!==l&&k(b),b=b||l,d=d||[],!a||"string"!=typeof a)return d;if(1!==(i=b.nodeType)&&9!==i)return[];if(n&&!e){if(f=Z.exec(a))if(h=f[1]){if(9===i){if(g=b.getElementById(h),!g||!g.parentNode)return d;if(g.id===h)return d.push(g),d}else if(b.ownerDocument&&(g=b.ownerDocument.getElementById(h))&&r(b,g)&&g.id===h)return d.push(g),d}else{if(f[2])return G.apply(d,b.getElementsByTagName(a)),d;if((h=f[3])&&c.getElementsByClassName&&b.getElementsByClassName)return G.apply(d,b.getElementsByClassName(h)),d}if(c.qsa&&(!o||!o.test(a))){if(q=p=s,u=b,v=9===i&&a,1===i&&"object"!==b.nodeName.toLowerCase()){m=ob(a),(p=b.getAttribute("id"))?q=p.replace(_,"\\$&"):b.setAttribute("id",q),q="[id='"+q+"'] ",j=m.length;while(j--)m[j]=q+pb(m[j]);u=$.test(a)&&mb(b.parentNode)||b,v=m.join(",")}if(v)try{return G.apply(d,u.querySelectorAll(v)),d}catch(w){}finally{p||b.removeAttribute("id")}}}return xb(a.replace(P,"$1"),b,d,e)}function eb(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function fb(a){return a[s]=!0,a}function gb(a){var b=l.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function hb(a,b){var c=a.split("|"),e=a.length;while(e--)d.attrHandle[c[e]]=b}function ib(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||B)-(~a.sourceIndex||B);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function jb(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function kb(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function lb(a){return fb(function(b){return b=+b,fb(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function mb(a){return a&&typeof a.getElementsByTagName!==A&&a}c=db.support={},f=db.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},k=db.setDocument=function(a){var b,e=a?a.ownerDocument||a:t,g=e.defaultView;return e!==l&&9===e.nodeType&&e.documentElement?(l=e,m=e.documentElement,n=!f(e),g&&g!==g.top&&(g.addEventListener?g.addEventListener("unload",function(){k()},!1):g.attachEvent&&g.attachEvent("onunload",function(){k()})),c.attributes=gb(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=gb(function(a){return a.appendChild(e.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Y.test(e.getElementsByClassName)&&gb(function(a){return a.innerHTML="
",a.firstChild.className="i",2===a.getElementsByClassName("i").length}),c.getById=gb(function(a){return m.appendChild(a).id=s,!e.getElementsByName||!e.getElementsByName(s).length}),c.getById?(d.find.ID=function(a,b){if(typeof b.getElementById!==A&&n){var c=b.getElementById(a);return c&&c.parentNode?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ab,bb);return function(a){var c=typeof a.getAttributeNode!==A&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return typeof b.getElementsByTagName!==A?b.getElementsByTagName(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return typeof b.getElementsByClassName!==A&&n?b.getElementsByClassName(a):void 0},p=[],o=[],(c.qsa=Y.test(e.querySelectorAll))&&(gb(function(a){a.innerHTML="",a.querySelectorAll("[t^='']").length&&o.push("[*^$]="+K+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||o.push("\\["+K+"*(?:value|"+J+")"),a.querySelectorAll(":checked").length||o.push(":checked")}),gb(function(a){var b=e.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&o.push("name"+K+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||o.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),o.push(",.*:")})),(c.matchesSelector=Y.test(q=m.webkitMatchesSelector||m.mozMatchesSelector||m.oMatchesSelector||m.msMatchesSelector))&&gb(function(a){c.disconnectedMatch=q.call(a,"div"),q.call(a,"[s!='']:x"),p.push("!=",O)}),o=o.length&&new RegExp(o.join("|")),p=p.length&&new RegExp(p.join("|")),b=Y.test(m.compareDocumentPosition),r=b||Y.test(m.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},z=b?function(a,b){if(a===b)return j=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===e||a.ownerDocument===t&&r(t,a)?-1:b===e||b.ownerDocument===t&&r(t,b)?1:i?I.call(i,a)-I.call(i,b):0:4&d?-1:1)}:function(a,b){if(a===b)return j=!0,0;var c,d=0,f=a.parentNode,g=b.parentNode,h=[a],k=[b];if(!f||!g)return a===e?-1:b===e?1:f?-1:g?1:i?I.call(i,a)-I.call(i,b):0;if(f===g)return ib(a,b);c=a;while(c=c.parentNode)h.unshift(c);c=b;while(c=c.parentNode)k.unshift(c);while(h[d]===k[d])d++;return d?ib(h[d],k[d]):h[d]===t?-1:k[d]===t?1:0},e):l},db.matches=function(a,b){return db(a,null,null,b)},db.matchesSelector=function(a,b){if((a.ownerDocument||a)!==l&&k(a),b=b.replace(S,"='$1']"),!(!c.matchesSelector||!n||p&&p.test(b)||o&&o.test(b)))try{var d=q.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return db(b,l,null,[a]).length>0},db.contains=function(a,b){return(a.ownerDocument||a)!==l&&k(a),r(a,b)},db.attr=function(a,b){(a.ownerDocument||a)!==l&&k(a);var e=d.attrHandle[b.toLowerCase()],f=e&&C.call(d.attrHandle,b.toLowerCase())?e(a,b,!n):void 0;return void 0!==f?f:c.attributes||!n?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},db.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},db.uniqueSort=function(a){var b,d=[],e=0,f=0;if(j=!c.detectDuplicates,i=!c.sortStable&&a.slice(0),a.sort(z),j){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return i=null,a},e=db.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=db.selectors={cacheLength:50,createPseudo:fb,match:V,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ab,bb),a[3]=(a[4]||a[5]||"").replace(ab,bb),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||db.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&db.error(a[0]),a},PSEUDO:function(a){var b,c=!a[5]&&a[2];return V.CHILD.test(a[0])?null:(a[3]&&void 0!==a[4]?a[2]=a[4]:c&&T.test(c)&&(b=ob(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ab,bb).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=w[a+" "];return b||(b=new RegExp("(^|"+K+")"+a+"("+K+"|$)"))&&w(a,function(a){return b.test("string"==typeof a.className&&a.className||typeof a.getAttribute!==A&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=db.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),t=!i&&!h;if(q){if(f){while(p){l=b;while(l=l[p])if(h?l.nodeName.toLowerCase()===r:1===l.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&t){k=q[s]||(q[s]={}),j=k[a]||[],n=j[0]===u&&j[1],m=j[0]===u&&j[2],l=n&&q.childNodes[n];while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if(1===l.nodeType&&++m&&l===b){k[a]=[u,n,m];break}}else if(t&&(j=(b[s]||(b[s]={}))[a])&&j[0]===u)m=j[1];else while(l=++n&&l&&l[p]||(m=n=0)||o.pop())if((h?l.nodeName.toLowerCase()===r:1===l.nodeType)&&++m&&(t&&((l[s]||(l[s]={}))[a]=[u,m]),l===b))break;return m-=e,m===d||m%d===0&&m/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||db.error("unsupported pseudo: "+a);return e[s]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?fb(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=I.call(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:fb(function(a){var b=[],c=[],d=g(a.replace(P,"$1"));return d[s]?fb(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),!c.pop()}}),has:fb(function(a){return function(b){return db(a,b).length>0}}),contains:fb(function(a){return function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:fb(function(a){return U.test(a||"")||db.error("unsupported lang: "+a),a=a.replace(ab,bb).toLowerCase(),function(b){var c;do if(c=n?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===m},focus:function(a){return a===l.activeElement&&(!l.hasFocus||l.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return X.test(a.nodeName)},input:function(a){return W.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:lb(function(){return[0]}),last:lb(function(a,b){return[b-1]}),eq:lb(function(a,b,c){return[0>c?c+b:c]}),even:lb(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:lb(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:lb(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:lb(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function qb(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=v++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j=[u,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(i=b[s]||(b[s]={}),(h=i[d])&&h[0]===u&&h[1]===f)return j[2]=h[2];if(i[d]=j,j[2]=a(b,c,g))return!0}}}function rb(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function sb(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(!c||c(f,d,e))&&(g.push(f),j&&b.push(h));return g}function tb(a,b,c,d,e,f){return d&&!d[s]&&(d=tb(d)),e&&!e[s]&&(e=tb(e,f)),fb(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||wb(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:sb(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=sb(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?I.call(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=sb(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):G.apply(g,r)})}function ub(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],i=g||d.relative[" "],j=g?1:0,k=qb(function(a){return a===b},i,!0),l=qb(function(a){return I.call(b,a)>-1},i,!0),m=[function(a,c,d){return!g&&(d||c!==h)||((b=c).nodeType?k(a,c,d):l(a,c,d))}];f>j;j++)if(c=d.relative[a[j].type])m=[qb(rb(m),c)];else{if(c=d.filter[a[j].type].apply(null,a[j].matches),c[s]){for(e=++j;f>e;e++)if(d.relative[a[e].type])break;return tb(j>1&&rb(m),j>1&&pb(a.slice(0,j-1).concat({value:" "===a[j-2].type?"*":""})).replace(P,"$1"),c,e>j&&ub(a.slice(j,e)),f>e&&ub(a=a.slice(e)),f>e&&pb(a))}m.push(c)}return rb(m)}function vb(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,i,j,k){var m,n,o,p=0,q="0",r=f&&[],s=[],t=h,v=f||e&&d.find.TAG("*",k),w=u+=null==t?1:Math.random()||.1,x=v.length;for(k&&(h=g!==l&&g);q!==x&&null!=(m=v[q]);q++){if(e&&m){n=0;while(o=a[n++])if(o(m,g,i)){j.push(m);break}k&&(u=w)}c&&((m=!o&&m)&&p--,f&&r.push(m))}if(p+=q,c&&q!==p){n=0;while(o=b[n++])o(r,s,g,i);if(f){if(p>0)while(q--)r[q]||s[q]||(s[q]=E.call(j));s=sb(s)}G.apply(j,s),k&&!f&&s.length>0&&p+b.length>1&&db.uniqueSort(j)}return k&&(u=w,h=t),r};return c?fb(f):f}g=db.compile=function(a,b){var c,d=[],e=[],f=y[a+" "];if(!f){b||(b=ob(a)),c=b.length;while(c--)f=ub(b[c]),f[s]?d.push(f):e.push(f);f=y(a,vb(e,d))}return f};function wb(a,b,c){for(var d=0,e=b.length;e>d;d++)db(a,b[d],c);return c}function xb(a,b,e,f){var h,i,j,k,l,m=ob(a);if(!f&&1===m.length){if(i=m[0]=m[0].slice(0),i.length>2&&"ID"===(j=i[0]).type&&c.getById&&9===b.nodeType&&n&&d.relative[i[1].type]){if(b=(d.find.ID(j.matches[0].replace(ab,bb),b)||[])[0],!b)return e;a=a.slice(i.shift().value.length)}h=V.needsContext.test(a)?0:i.length;while(h--){if(j=i[h],d.relative[k=j.type])break;if((l=d.find[k])&&(f=l(j.matches[0].replace(ab,bb),$.test(i[0].type)&&mb(b.parentNode)||b))){if(i.splice(h,1),a=f.length&&pb(i),!a)return G.apply(e,f),e;break}}}return g(a,m)(f,b,!n,e,$.test(a)&&mb(b.parentNode)||b),e}return c.sortStable=s.split("").sort(z).join("")===s,c.detectDuplicates=!!j,k(),c.sortDetached=gb(function(a){return 1&a.compareDocumentPosition(l.createElement("div"))}),gb(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||hb("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&gb(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||hb("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),gb(function(a){return null==a.getAttribute("disabled")})||hb(J,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),db}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=n.expr.match.needsContext,v=/^<(\w+)\s*\/?>(?:<\/\1>|)$/,w=/^.[^:#\[\.,]*$/;function x(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(w.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return n.inArray(a,b)>=0!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=[],d=this,e=d.length;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;e>b;b++)if(n.contains(d[b],this))return!0}));for(b=0;e>b;b++)n.find(a,d[b],c);return c=this.pushStack(e>1?n.unique(c):c),c.selector=this.selector?this.selector+" "+a:a,c},filter:function(a){return this.pushStack(x(this,a||[],!1))},not:function(a){return this.pushStack(x(this,a||[],!0))},is:function(a){return!!x(this,"string"==typeof a&&u.test(a)?n(a):a||[],!1).length}});var y,z=a.document,A=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,B=n.fn.init=function(a,b){var c,d;if(!a)return this;if("string"==typeof a){if(c="<"===a.charAt(0)&&">"===a.charAt(a.length-1)&&a.length>=3?[null,a,null]:A.exec(a),!c||!c[1]&&b)return!b||b.jquery?(b||y).find(a):this.constructor(b).find(a);if(c[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(c[1],b&&b.nodeType?b.ownerDocument||b:z,!0)),v.test(c[1])&&n.isPlainObject(b))for(c in b)n.isFunction(this[c])?this[c](b[c]):this.attr(c,b[c]);return this}if(d=z.getElementById(c[2]),d&&d.parentNode){if(d.id!==c[2])return y.find(a);this.length=1,this[0]=d}return this.context=z,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?"undefined"!=typeof y.ready?y.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};B.prototype=n.fn,y=n(z);var C=/^(?:parents|prev(?:Until|All))/,D={children:!0,contents:!0,next:!0,prev:!0};n.extend({dir:function(a,b,c){var d=[],e=a[b];while(e&&9!==e.nodeType&&(void 0===c||1!==e.nodeType||!n(e).is(c)))1===e.nodeType&&d.push(e),e=e[b];return d},sibling:function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c}}),n.fn.extend({has:function(a){var b,c=n(a,this),d=c.length;return this.filter(function(){for(b=0;d>b;b++)if(n.contains(this,c[b]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=u.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.unique(f):f)},index:function(a){return a?"string"==typeof a?n.inArray(this[0],n(a)):n.inArray(a.jquery?a[0]:a,this):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.unique(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function E(a,b){do a=a[b];while(a&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return n.dir(a,"parentNode")},parentsUntil:function(a,b,c){return n.dir(a,"parentNode",c)},next:function(a){return E(a,"nextSibling")},prev:function(a){return E(a,"previousSibling")},nextAll:function(a){return n.dir(a,"nextSibling")},prevAll:function(a){return n.dir(a,"previousSibling")},nextUntil:function(a,b,c){return n.dir(a,"nextSibling",c)},prevUntil:function(a,b,c){return n.dir(a,"previousSibling",c)},siblings:function(a){return n.sibling((a.parentNode||{}).firstChild,a)},children:function(a){return n.sibling(a.firstChild)},contents:function(a){return n.nodeName(a,"iframe")?a.contentDocument||a.contentWindow.document:n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(D[a]||(e=n.unique(e)),C.test(a)&&(e=e.reverse())),this.pushStack(e)}});var F=/\S+/g,G={};function H(a){var b=G[a]={};return n.each(a.match(F)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?G[a]||H(a):n.extend({},a);var b,c,d,e,f,g,h=[],i=!a.once&&[],j=function(l){for(c=a.memory&&l,d=!0,f=g||0,g=0,e=h.length,b=!0;h&&e>f;f++)if(h[f].apply(l[0],l[1])===!1&&a.stopOnFalse){c=!1;break}b=!1,h&&(i?i.length&&j(i.shift()):c?h=[]:k.disable())},k={add:function(){if(h){var d=h.length;!function f(b){n.each(b,function(b,c){var d=n.type(c);"function"===d?a.unique&&k.has(c)||h.push(c):c&&c.length&&"string"!==d&&f(c)})}(arguments),b?e=h.length:c&&(g=d,j(c))}return this},remove:function(){return h&&n.each(arguments,function(a,c){var d;while((d=n.inArray(c,h,d))>-1)h.splice(d,1),b&&(e>=d&&e--,f>=d&&f--)}),this},has:function(a){return a?n.inArray(a,h)>-1:!(!h||!h.length)},empty:function(){return h=[],e=0,this},disable:function(){return h=i=c=void 0,this},disabled:function(){return!h},lock:function(){return i=void 0,c||k.disable(),this},locked:function(){return!i},fireWith:function(a,c){return!h||d&&!i||(c=c||[],c=[a,c.slice?c.slice():c],b?i.push(c):j(c)),this},fire:function(){return k.fireWith(this,arguments),this},fired:function(){return!!d}};return k},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().done(c.resolve).fail(c.reject).progress(c.notify):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=d.call(arguments),e=c.length,f=1!==e||a&&n.isFunction(a.promise)?e:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(e){b[a]=this,c[a]=arguments.length>1?d.call(arguments):e,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(e>1)for(i=new Array(e),j=new Array(e),k=new Array(e);e>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().done(h(b,k,c)).fail(g.reject).progress(h(b,j,i)):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){if(a===!0?!--n.readyWait:!n.isReady){if(!z.body)return setTimeout(n.ready);n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(z,[n]),n.fn.trigger&&n(z).trigger("ready").off("ready"))}}});function J(){z.addEventListener?(z.removeEventListener("DOMContentLoaded",K,!1),a.removeEventListener("load",K,!1)):(z.detachEvent("onreadystatechange",K),a.detachEvent("onload",K))}function K(){(z.addEventListener||"load"===event.type||"complete"===z.readyState)&&(J(),n.ready())}n.ready.promise=function(b){if(!I)if(I=n.Deferred(),"complete"===z.readyState)setTimeout(n.ready);else if(z.addEventListener)z.addEventListener("DOMContentLoaded",K,!1),a.addEventListener("load",K,!1);else{z.attachEvent("onreadystatechange",K),a.attachEvent("onload",K);var c=!1;try{c=null==a.frameElement&&z.documentElement}catch(d){}c&&c.doScroll&&!function e(){if(!n.isReady){try{c.doScroll("left")}catch(a){return setTimeout(e,50)}J(),n.ready()}}()}return I.promise(b)};var L="undefined",M;for(M in n(l))break;l.ownLast="0"!==M,l.inlineBlockNeedsLayout=!1,n(function(){var a,b,c=z.getElementsByTagName("body")[0];c&&(a=z.createElement("div"),a.style.cssText="border:0;width:0;height:0;position:absolute;top:0;left:-9999px;margin-top:1px",b=z.createElement("div"),c.appendChild(a).appendChild(b),typeof b.style.zoom!==L&&(b.style.cssText="border:0;margin:0;width:1px;padding:1px;display:inline;zoom:1",(l.inlineBlockNeedsLayout=3===b.offsetWidth)&&(c.style.zoom=1)),c.removeChild(a),a=b=null)}),function(){var a=z.createElement("div");if(null==l.deleteExpando){l.deleteExpando=!0;try{delete a.test}catch(b){l.deleteExpando=!1}}a=null}(),n.acceptData=function(a){var b=n.noData[(a.nodeName+" ").toLowerCase()],c=+a.nodeType||1;return 1!==c&&9!==c?!1:!b||b!==!0&&a.getAttribute("classid")===b};var N=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,O=/([A-Z])/g;function P(a,b,c){if(void 0===c&&1===a.nodeType){var d="data-"+b.replace(O,"-$1").toLowerCase();if(c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:N.test(c)?n.parseJSON(c):c}catch(e){}n.data(a,b,c)}else c=void 0}return c}function Q(a){var b;for(b in a)if(("data"!==b||!n.isEmptyObject(a[b]))&&"toJSON"!==b)return!1;return!0}function R(a,b,d,e){if(n.acceptData(a)){var f,g,h=n.expando,i=a.nodeType,j=i?n.cache:a,k=i?a[h]:a[h]&&h;if(k&&j[k]&&(e||j[k].data)||void 0!==d||"string"!=typeof b)return k||(k=i?a[h]=c.pop()||n.guid++:h),j[k]||(j[k]=i?{}:{toJSON:n.noop}),("object"==typeof b||"function"==typeof b)&&(e?j[k]=n.extend(j[k],b):j[k].data=n.extend(j[k].data,b)),g=j[k],e||(g.data||(g.data={}),g=g.data),void 0!==d&&(g[n.camelCase(b)]=d),"string"==typeof b?(f=g[b],null==f&&(f=g[n.camelCase(b)])):f=g,f +}}function S(a,b,c){if(n.acceptData(a)){var d,e,f=a.nodeType,g=f?n.cache:a,h=f?a[n.expando]:n.expando;if(g[h]){if(b&&(d=c?g[h]:g[h].data)){n.isArray(b)?b=b.concat(n.map(b,n.camelCase)):b in d?b=[b]:(b=n.camelCase(b),b=b in d?[b]:b.split(" ")),e=b.length;while(e--)delete d[b[e]];if(c?!Q(d):!n.isEmptyObject(d))return}(c||(delete g[h].data,Q(g[h])))&&(f?n.cleanData([a],!0):l.deleteExpando||g!=g.window?delete g[h]:g[h]=null)}}}n.extend({cache:{},noData:{"applet ":!0,"embed ":!0,"object ":"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"},hasData:function(a){return a=a.nodeType?n.cache[a[n.expando]]:a[n.expando],!!a&&!Q(a)},data:function(a,b,c){return R(a,b,c)},removeData:function(a,b){return S(a,b)},_data:function(a,b,c){return R(a,b,c,!0)},_removeData:function(a,b){return S(a,b,!0)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=n.data(f),1===f.nodeType&&!n._data(f,"parsedAttrs"))){c=g.length;while(c--)d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),P(f,d,e[d]));n._data(f,"parsedAttrs",!0)}return e}return"object"==typeof a?this.each(function(){n.data(this,a)}):arguments.length>1?this.each(function(){n.data(this,a,b)}):f?P(f,a,n.data(f,a)):void 0},removeData:function(a){return this.each(function(){n.removeData(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=n._data(a,b),c&&(!d||n.isArray(c)?d=n._data(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return n._data(a,c)||n._data(a,c,{empty:n.Callbacks("once memory").add(function(){n._removeData(a,b+"queue"),n._removeData(a,c)})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.lengthh;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},X=/^(?:checkbox|radio)$/i;!function(){var a=z.createDocumentFragment(),b=z.createElement("div"),c=z.createElement("input");if(b.setAttribute("className","t"),b.innerHTML="
a",l.leadingWhitespace=3===b.firstChild.nodeType,l.tbody=!b.getElementsByTagName("tbody").length,l.htmlSerialize=!!b.getElementsByTagName("link").length,l.html5Clone="<:nav>"!==z.createElement("nav").cloneNode(!0).outerHTML,c.type="checkbox",c.checked=!0,a.appendChild(c),l.appendChecked=c.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue,a.appendChild(b),b.innerHTML="",l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,l.noCloneEvent=!0,b.attachEvent&&(b.attachEvent("onclick",function(){l.noCloneEvent=!1}),b.cloneNode(!0).click()),null==l.deleteExpando){l.deleteExpando=!0;try{delete b.test}catch(d){l.deleteExpando=!1}}a=b=c=null}(),function(){var b,c,d=z.createElement("div");for(b in{submit:!0,change:!0,focusin:!0})c="on"+b,(l[b+"Bubbles"]=c in a)||(d.setAttribute(c,"t"),l[b+"Bubbles"]=d.attributes[c].expando===!1);d=null}();var Y=/^(?:input|select|textarea)$/i,Z=/^key/,$=/^(?:mouse|contextmenu)|click/,_=/^(?:focusinfocus|focusoutblur)$/,ab=/^([^.]*)(?:\.(.+)|)$/;function bb(){return!0}function cb(){return!1}function db(){try{return z.activeElement}catch(a){}}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n._data(a);if(r){c.handler&&(i=c,c=i.handler,e=i.selector),c.guid||(c.guid=n.guid++),(g=r.events)||(g=r.events={}),(k=r.handle)||(k=r.handle=function(a){return typeof n===L||a&&n.event.triggered===a.type?void 0:n.event.dispatch.apply(k.elem,arguments)},k.elem=a),b=(b||"").match(F)||[""],h=b.length;while(h--)f=ab.exec(b[h])||[],o=q=f[1],p=(f[2]||"").split(".").sort(),o&&(j=n.event.special[o]||{},o=(e?j.delegateType:j.bindType)||o,j=n.event.special[o]||{},l=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},i),(m=g[o])||(m=g[o]=[],m.delegateCount=0,j.setup&&j.setup.call(a,d,p,k)!==!1||(a.addEventListener?a.addEventListener(o,k,!1):a.attachEvent&&a.attachEvent("on"+o,k))),j.add&&(j.add.call(a,l),l.handler.guid||(l.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,l):m.push(l),n.event.global[o]=!0);a=null}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=n.hasData(a)&&n._data(a);if(r&&(k=r.events)){b=(b||"").match(F)||[""],j=b.length;while(j--)if(h=ab.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=k[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),i=f=m.length;while(f--)g=m[f],!e&&q!==g.origType||c&&c.guid!==g.guid||h&&!h.test(g.namespace)||d&&d!==g.selector&&("**"!==d||!g.selector)||(m.splice(f,1),g.selector&&m.delegateCount--,l.remove&&l.remove.call(a,g));i&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete k[o])}else for(o in k)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(k)&&(delete r.handle,n._removeData(a,"events"))}},trigger:function(b,c,d,e){var f,g,h,i,k,l,m,o=[d||z],p=j.call(b,"type")?b.type:b,q=j.call(b,"namespace")?b.namespace.split("."):[];if(h=l=d=d||z,3!==d.nodeType&&8!==d.nodeType&&!_.test(p+n.event.triggered)&&(p.indexOf(".")>=0&&(q=p.split("."),p=q.shift(),q.sort()),g=p.indexOf(":")<0&&"on"+p,b=b[n.expando]?b:new n.Event(p,"object"==typeof b&&b),b.isTrigger=e?2:3,b.namespace=q.join("."),b.namespace_re=b.namespace?new RegExp("(^|\\.)"+q.join("\\.(?:.*\\.|)")+"(\\.|$)"):null,b.result=void 0,b.target||(b.target=d),c=null==c?[b]:n.makeArray(c,[b]),k=n.event.special[p]||{},e||!k.trigger||k.trigger.apply(d,c)!==!1)){if(!e&&!k.noBubble&&!n.isWindow(d)){for(i=k.delegateType||p,_.test(i+p)||(h=h.parentNode);h;h=h.parentNode)o.push(h),l=h;l===(d.ownerDocument||z)&&o.push(l.defaultView||l.parentWindow||a)}m=0;while((h=o[m++])&&!b.isPropagationStopped())b.type=m>1?i:k.bindType||p,f=(n._data(h,"events")||{})[b.type]&&n._data(h,"handle"),f&&f.apply(h,c),f=g&&h[g],f&&f.apply&&n.acceptData(h)&&(b.result=f.apply(h,c),b.result===!1&&b.preventDefault());if(b.type=p,!e&&!b.isDefaultPrevented()&&(!k._default||k._default.apply(o.pop(),c)===!1)&&n.acceptData(d)&&g&&d[p]&&!n.isWindow(d)){l=d[g],l&&(d[g]=null),n.event.triggered=p;try{d[p]()}catch(r){}n.event.triggered=void 0,l&&(d[g]=l)}return b.result}},dispatch:function(a){a=n.event.fix(a);var b,c,e,f,g,h=[],i=d.call(arguments),j=(n._data(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,g=0;while((e=f.handlers[g++])&&!a.isImmediatePropagationStopped())(!a.namespace_re||a.namespace_re.test(e.namespace))&&(a.handleObj=e,a.data=e.data,c=((n.event.special[e.origType]||{}).handle||e.handler).apply(f.elem,i),void 0!==c&&(a.result=c)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&(!a.button||"click"!==a.type))for(;i!=this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(e=[],f=0;h>f;f++)d=b[f],c=d.selector+" ",void 0===e[c]&&(e[c]=d.needsContext?n(c,this).index(i)>=0:n.find(c,this,null,[i]).length),e[c]&&e.push(d);e.length&&g.push({elem:i,handlers:e})}return h]","i"),ib=/^\s+/,jb=/<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,kb=/<([\w:]+)/,lb=/\s*$/g,sb={option:[1,""],legend:[1,"
","
"],area:[1,"",""],param:[1,"",""],thead:[1,"","
"],tr:[2,"","
"],col:[2,"","
"],td:[3,"","
"],_default:l.htmlSerialize?[0,"",""]:[1,"X
","
"]},tb=eb(z),ub=tb.appendChild(z.createElement("div"));sb.optgroup=sb.option,sb.tbody=sb.tfoot=sb.colgroup=sb.caption=sb.thead,sb.th=sb.td;function vb(a,b){var c,d,e=0,f=typeof a.getElementsByTagName!==L?a.getElementsByTagName(b||"*"):typeof a.querySelectorAll!==L?a.querySelectorAll(b||"*"):void 0;if(!f)for(f=[],c=a.childNodes||a;null!=(d=c[e]);e++)!b||n.nodeName(d,b)?f.push(d):n.merge(f,vb(d,b));return void 0===b||b&&n.nodeName(a,b)?n.merge([a],f):f}function wb(a){X.test(a.type)&&(a.defaultChecked=a.checked)}function xb(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function yb(a){return a.type=(null!==n.find.attr(a,"type"))+"/"+a.type,a}function zb(a){var b=qb.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function Ab(a,b){for(var c,d=0;null!=(c=a[d]);d++)n._data(c,"globalEval",!b||n._data(b[d],"globalEval"))}function Bb(a,b){if(1===b.nodeType&&n.hasData(a)){var c,d,e,f=n._data(a),g=n._data(b,f),h=f.events;if(h){delete g.handle,g.events={};for(c in h)for(d=0,e=h[c].length;e>d;d++)n.event.add(b,c,h[c][d])}g.data&&(g.data=n.extend({},g.data))}}function Cb(a,b){var c,d,e;if(1===b.nodeType){if(c=b.nodeName.toLowerCase(),!l.noCloneEvent&&b[n.expando]){e=n._data(b);for(d in e.events)n.removeEvent(b,d,e.handle);b.removeAttribute(n.expando)}"script"===c&&b.text!==a.text?(yb(b).text=a.text,zb(b)):"object"===c?(b.parentNode&&(b.outerHTML=a.outerHTML),l.html5Clone&&a.innerHTML&&!n.trim(b.innerHTML)&&(b.innerHTML=a.innerHTML)):"input"===c&&X.test(a.type)?(b.defaultChecked=b.checked=a.checked,b.value!==a.value&&(b.value=a.value)):"option"===c?b.defaultSelected=b.selected=a.defaultSelected:("input"===c||"textarea"===c)&&(b.defaultValue=a.defaultValue)}}n.extend({clone:function(a,b,c){var d,e,f,g,h,i=n.contains(a.ownerDocument,a);if(l.html5Clone||n.isXMLDoc(a)||!hb.test("<"+a.nodeName+">")?f=a.cloneNode(!0):(ub.innerHTML=a.outerHTML,ub.removeChild(f=ub.firstChild)),!(l.noCloneEvent&&l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(d=vb(f),h=vb(a),g=0;null!=(e=h[g]);++g)d[g]&&Cb(e,d[g]);if(b)if(c)for(h=h||vb(a),d=d||vb(f),g=0;null!=(e=h[g]);g++)Bb(e,d[g]);else Bb(a,f);return d=vb(f,"script"),d.length>0&&Ab(d,!i&&vb(a,"script")),d=h=e=null,f},buildFragment:function(a,b,c,d){for(var e,f,g,h,i,j,k,m=a.length,o=eb(b),p=[],q=0;m>q;q++)if(f=a[q],f||0===f)if("object"===n.type(f))n.merge(p,f.nodeType?[f]:f);else if(mb.test(f)){h=h||o.appendChild(b.createElement("div")),i=(kb.exec(f)||["",""])[1].toLowerCase(),k=sb[i]||sb._default,h.innerHTML=k[1]+f.replace(jb,"<$1>")+k[2],e=k[0];while(e--)h=h.lastChild;if(!l.leadingWhitespace&&ib.test(f)&&p.push(b.createTextNode(ib.exec(f)[0])),!l.tbody){f="table"!==i||lb.test(f)?""!==k[1]||lb.test(f)?0:h:h.firstChild,e=f&&f.childNodes.length;while(e--)n.nodeName(j=f.childNodes[e],"tbody")&&!j.childNodes.length&&f.removeChild(j)}n.merge(p,h.childNodes),h.textContent="";while(h.firstChild)h.removeChild(h.firstChild);h=o.lastChild}else p.push(b.createTextNode(f));h&&o.removeChild(h),l.appendChecked||n.grep(vb(p,"input"),wb),q=0;while(f=p[q++])if((!d||-1===n.inArray(f,d))&&(g=n.contains(f.ownerDocument,f),h=vb(o.appendChild(f),"script"),g&&Ab(h),c)){e=0;while(f=h[e++])pb.test(f.type||"")&&c.push(f)}return h=null,o},cleanData:function(a,b){for(var d,e,f,g,h=0,i=n.expando,j=n.cache,k=l.deleteExpando,m=n.event.special;null!=(d=a[h]);h++)if((b||n.acceptData(d))&&(f=d[i],g=f&&j[f])){if(g.events)for(e in g.events)m[e]?n.event.remove(d,e):n.removeEvent(d,e,g.handle);j[f]&&(delete j[f],k?delete d[i]:typeof d.removeAttribute!==L?d.removeAttribute(i):d[i]=null,c.push(f))}}}),n.fn.extend({text:function(a){return W(this,function(a){return void 0===a?n.text(this):this.empty().append((this[0]&&this[0].ownerDocument||z).createTextNode(a))},null,a,arguments.length)},append:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.appendChild(a)}})},prepend:function(){return this.domManip(arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=xb(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return this.domManip(arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},remove:function(a,b){for(var c,d=a?n.filter(a,this):this,e=0;null!=(c=d[e]);e++)b||1!==c.nodeType||n.cleanData(vb(c)),c.parentNode&&(b&&n.contains(c.ownerDocument,c)&&Ab(vb(c,"script")),c.parentNode.removeChild(c));return this},empty:function(){for(var a,b=0;null!=(a=this[b]);b++){1===a.nodeType&&n.cleanData(vb(a,!1));while(a.firstChild)a.removeChild(a.firstChild);a.options&&n.nodeName(a,"select")&&(a.options.length=0)}return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return W(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a)return 1===b.nodeType?b.innerHTML.replace(gb,""):void 0;if(!("string"!=typeof a||nb.test(a)||!l.htmlSerialize&&hb.test(a)||!l.leadingWhitespace&&ib.test(a)||sb[(kb.exec(a)||["",""])[1].toLowerCase()])){a=a.replace(jb,"<$1>");try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(vb(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=arguments[0];return this.domManip(arguments,function(b){a=this.parentNode,n.cleanData(vb(this)),a&&a.replaceChild(b,this)}),a&&(a.length||a.nodeType)?this:this.remove()},detach:function(a){return this.remove(a,!0)},domManip:function(a,b){a=e.apply([],a);var c,d,f,g,h,i,j=0,k=this.length,m=this,o=k-1,p=a[0],q=n.isFunction(p);if(q||k>1&&"string"==typeof p&&!l.checkClone&&ob.test(p))return this.each(function(c){var d=m.eq(c);q&&(a[0]=p.call(this,c,d.html())),d.domManip(a,b)});if(k&&(i=n.buildFragment(a,this[0].ownerDocument,!1,this),c=i.firstChild,1===i.childNodes.length&&(i=c),c)){for(g=n.map(vb(i,"script"),yb),f=g.length;k>j;j++)d=i,j!==o&&(d=n.clone(d,!0,!0),f&&n.merge(g,vb(d,"script"))),b.call(this[j],d,j);if(f)for(h=g[g.length-1].ownerDocument,n.map(g,zb),j=0;f>j;j++)d=g[j],pb.test(d.type||"")&&!n._data(d,"globalEval")&&n.contains(h,d)&&(d.src?n._evalUrl&&n._evalUrl(d.src):n.globalEval((d.text||d.textContent||d.innerHTML||"").replace(rb,"")));i=c=null}return this}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=0,e=[],g=n(a),h=g.length-1;h>=d;d++)c=d===h?this:this.clone(!0),n(g[d])[b](c),f.apply(e,c.get());return this.pushStack(e)}});var Db,Eb={};function Fb(b,c){var d=n(c.createElement(b)).appendTo(c.body),e=a.getDefaultComputedStyle?a.getDefaultComputedStyle(d[0]).display:n.css(d[0],"display");return d.detach(),e}function Gb(a){var b=z,c=Eb[a];return c||(c=Fb(a,b),"none"!==c&&c||(Db=(Db||n("